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

📄 radeon_vid.c

📁 原名叫avifile
💻 C
📖 第 1 页 / 共 5 页
字号:
{  unsigned i;  for(i=0;i<sizeof(supported_fourcc)/sizeof(fourcc_desc_t);i++)  {    if(fourcc==supported_fourcc[i].fourcc &&	srcw <=supported_fourcc[i].max_srcw) return 1;  }  return 0;}int VIDIX_NAME(vixQueryFourcc)(vidix_fourcc_t *to){    if(is_supported_fourcc(to->fourcc,to->srcw))    {	to->depth = VID_DEPTH_1BPP | VID_DEPTH_2BPP |		    VID_DEPTH_4BPP | VID_DEPTH_8BPP |		    VID_DEPTH_12BPP| VID_DEPTH_15BPP|		    VID_DEPTH_16BPP| VID_DEPTH_24BPP|		    VID_DEPTH_32BPP;	to->flags = VID_CAP_EXPAND | VID_CAP_SHRINK | VID_CAP_COLORKEY;	return 0;    }    else  to->depth = to->flags = 0;    return ENOSYS;}static double H_scale_ratio;static void radeon_vid_dump_regs( void ){  size_t i;  printf(RADEON_MSG"*** Begin of DRIVER variables dump ***\n");  printf(RADEON_MSG"radeon_mmio_base=%p\n",radeon_mmio_base);  printf(RADEON_MSG"radeon_mem_base=%p\n",radeon_mem_base);  printf(RADEON_MSG"radeon_overlay_off=%08X\n",radeon_overlay_off);  printf(RADEON_MSG"radeon_ram_size=%08X\n",radeon_ram_size);  printf(RADEON_MSG"video mode: %ux%u@%u\n",radeon_get_xres(),radeon_get_yres(),radeon_vid_get_dbpp());  printf(RADEON_MSG"H_scale_ratio=%8.2f\n",H_scale_ratio);  printf(RADEON_MSG"*** Begin of OV0 registers dump ***\n");  for(i=0;i<sizeof(vregs)/sizeof(video_registers_t);i++)	printf(RADEON_MSG"%s = %08X\n",vregs[i].sname,INREG(vregs[i].name));  printf(RADEON_MSG"*** End of OV0 registers dump ***\n");}static void radeon_vid_stop_video( void ){    radeon_engine_idle();    OUTREG(OV0_SCALE_CNTL, SCALER_SOFT_RESET);    OUTREG(OV0_EXCLUSIVE_HORZ, 0);    OUTREG(OV0_AUTO_FLIP_CNTL, 0);   /* maybe */    OUTREG(OV0_FILTER_CNTL, FILTER_HARDCODED_COEF);#ifdef RAGE128        OUTREG(OV0_KEY_CNTL, GRAPHIC_KEY_FN_NE);#else    OUTREG(OV0_KEY_CNTL, GRAPHIC_KEY_FN_EQ);#endif    OUTREG(OV0_TEST, 0);}static void radeon_vid_display_video( void ){    int bes_flags;    radeon_fifo_wait(2);    OUTREG(OV0_REG_LOAD_CNTL,		REG_LD_CTL_LOCK);    radeon_engine_idle();    while(!(INREG(OV0_REG_LOAD_CNTL)&REG_LD_CTL_LOCK_READBACK));    radeon_fifo_wait(15);    /* Shutdown capturing */    OUTREG(FCP_CNTL, FCP_CNTL__GND);    OUTREG(CAP0_TRIG_CNTL, 0);    OUTREG(VID_BUFFER_CONTROL, (1<<16) | 0x01);    OUTREG(DISP_TEST_DEBUG_CNTL, 0);    OUTREG(OV0_AUTO_FLIP_CNTL,OV0_AUTO_FLIP_CNTL_SOFT_BUF_ODD);    if(besr.deinterlace_on) OUTREG(OV0_DEINTERLACE_PATTERN,besr.deinterlace_pattern);#ifdef RAGE128    OUTREG(OV0_COLOUR_CNTL, (besr.brightness & 0x7f) |			    (besr.saturation << 8) |			    (besr.saturation << 16));#endif    radeon_fifo_wait(2);    OUTREG(OV0_GRAPHICS_KEY_MSK, besr.graphics_key_msk);    OUTREG(OV0_GRAPHICS_KEY_CLR, besr.graphics_key_clr);    OUTREG(OV0_KEY_CNTL,besr.ckey_cntl);    OUTREG(OV0_H_INC,			besr.h_inc);    OUTREG(OV0_STEP_BY,			besr.step_by);    OUTREG(OV0_Y_X_START,		besr.y_x_start);    OUTREG(OV0_Y_X_END,			besr.y_x_end);    OUTREG(OV0_V_INC,			besr.v_inc);    OUTREG(OV0_P1_BLANK_LINES_AT_TOP,	besr.p1_blank_lines_at_top);    OUTREG(OV0_P23_BLANK_LINES_AT_TOP,	besr.p23_blank_lines_at_top);    OUTREG(OV0_VID_BUF_PITCH0_VALUE,	besr.vid_buf_pitch0_value);    OUTREG(OV0_VID_BUF_PITCH1_VALUE,	besr.vid_buf_pitch1_value);    OUTREG(OV0_P1_X_START_END,		besr.p1_x_start_end);    OUTREG(OV0_P2_X_START_END,		besr.p2_x_start_end);    OUTREG(OV0_P3_X_START_END,		besr.p3_x_start_end);#ifdef RADEON    OUTREG(OV0_BASE_ADDR,		besr.base_addr);#endif    OUTREG(OV0_VID_BUF0_BASE_ADRS,	besr.vid_buf_base_adrs_y[0]);    OUTREG(OV0_VID_BUF1_BASE_ADRS,	besr.vid_buf_base_adrs_v[0]);    OUTREG(OV0_VID_BUF2_BASE_ADRS,	besr.vid_buf_base_adrs_u[0]);    radeon_fifo_wait(9);    OUTREG(OV0_VID_BUF3_BASE_ADRS,	besr.vid_buf_base_adrs_y[0]);    OUTREG(OV0_VID_BUF4_BASE_ADRS,	besr.vid_buf_base_adrs_v[0]);    OUTREG(OV0_VID_BUF5_BASE_ADRS,	besr.vid_buf_base_adrs_u[0]);    OUTREG(OV0_P1_V_ACCUM_INIT,		besr.p1_v_accum_init);    OUTREG(OV0_P1_H_ACCUM_INIT,		besr.p1_h_accum_init);    OUTREG(OV0_P23_H_ACCUM_INIT,	besr.p23_h_accum_init);    OUTREG(OV0_P23_V_ACCUM_INIT,	besr.p23_v_accum_init);    bes_flags = SCALER_ENABLE |		SCALER_SMART_SWITCH |		SCALER_Y2R_TEMP |		SCALER_PIX_EXPAND;    if(besr.double_buff) bes_flags |= SCALER_DOUBLE_BUFFER;    if(besr.deinterlace_on) bes_flags |= SCALER_ADAPTIVE_DEINT;    if(besr.horz_pick_nearest) bes_flags |= SCALER_HORZ_PICK_NEAREST;    if(besr.vert_pick_nearest) bes_flags |= SCALER_VERT_PICK_NEAREST;#ifdef RAGE128    bes_flags |= SCALER_BURST_PER_PLANE;#endif    bes_flags |= (besr.surf_id << 8) & SCALER_SURFAC_FORMAT;    if(besr.load_prg_start) bes_flags |= SCALER_PRG_LOAD_START;    OUTREG(OV0_SCALE_CNTL,		bes_flags);#ifndef RAGE128    if(rinfo.hasCRTC2 &&        (rinfo.dviDispType == MT_CTV || rinfo.dviDispType == MT_STV))    {	/* TODO: suppress scaler output to CRTC here and enable TVO only */    }#endif    radeon_fifo_wait(6);    OUTREG(OV0_FILTER_CNTL,besr.filter_cntl);    OUTREG(OV0_FOUR_TAP_COEF_0,besr.four_tap_coeff[0]);    OUTREG(OV0_FOUR_TAP_COEF_1,besr.four_tap_coeff[1]);    OUTREG(OV0_FOUR_TAP_COEF_2,besr.four_tap_coeff[2]);    OUTREG(OV0_FOUR_TAP_COEF_3,besr.four_tap_coeff[3]);    OUTREG(OV0_FOUR_TAP_COEF_4,besr.four_tap_coeff[4]);    if(besr.swap_uv) OUTREG(OV0_TEST,INREG(OV0_TEST)|OV0_SWAP_UV);    OUTREG(OV0_REG_LOAD_CNTL,		0);    if(__verbose > VERBOSE_LEVEL) printf(RADEON_MSG"we wanted: scaler=%08X\n",bes_flags);    if(__verbose > VERBOSE_LEVEL) radeon_vid_dump_regs();}/* Goal of this function: hide RGB background and provide black screen around movie.   Useful in '-vo fbdev:vidix -fs -zoom' mode.   Reverse effect to colorkey */#ifdef RAGE128static void radeon_vid_exclusive( void ){/* this function works only with Rage128.   Radeon should has something the same */    unsigned screenw,screenh;    screenw = radeon_get_xres();    screenh = radeon_get_yres();    radeon_fifo_wait(2);    OUTREG(OV0_EXCLUSIVE_VERT,(((screenh-1)<<16)&EXCL_VERT_END_MASK));    OUTREG(OV0_EXCLUSIVE_HORZ,(((screenw/8+1)<<8)&EXCL_HORZ_END_MASK)|EXCL_HORZ_EXCLUSIVE_EN);}static void radeon_vid_non_exclusive( void ){    OUTREG(OV0_EXCLUSIVE_HORZ,0);}#endifstatic unsigned radeon_query_pitch(unsigned fourcc,const vidix_yuv_t *spitch){  unsigned pitch,spy,spv,spu;  spy = spv = spu = 0;  switch(spitch->y)  {    case 16:    case 32:    case 64:    case 128:    case 256: spy = spitch->y; break;    default: break;  }  switch(spitch->u)  {    case 16:    case 32:    case 64:    case 128:    case 256: spu = spitch->u; break;    default: break;  }  switch(spitch->v)  {    case 16:    case 32:    case 64:    case 128:    case 256: spv = spitch->v; break;    default: break;  }  switch(fourcc)  {	/* 4:2:0 */	case IMGFMT_IYUV:	case IMGFMT_YV12:	case IMGFMT_I420:		if(spy > 16 && spu == spy/2 && spv == spy/2)	pitch = spy;		else						pitch = 32;		break;	case IMGFMT_IF09:	case IMGFMT_YVU9:		if(spy >= 64 && spu == spy/4 && spv == spy/4)	pitch = spy;		else						pitch = 64;		break;	default:		if(spy >= 16)	pitch = spy;		else		pitch = 16;		break;  }  return pitch;}static void Calc_H_INC_STEP_BY (	int fieldvalue_OV0_SURFACE_FORMAT,	double H_scale_ratio,	int DisallowFourTapVertFiltering,	int DisallowFourTapUVVertFiltering,	uint32_t *val_OV0_P1_H_INC,	uint32_t *val_OV0_P1_H_STEP_BY,	uint32_t *val_OV0_P23_H_INC,	uint32_t *val_OV0_P23_H_STEP_BY,	int *P1GroupSize,	int *P1StepSize,	int *P23StepSize ){    double ClocksNeededFor16Pixels;    switch (fieldvalue_OV0_SURFACE_FORMAT)    {	case 3:	case 4: /*16BPP (ARGB1555 and RGB565) */	    /* All colour components are fetched in pairs */	    *P1GroupSize = 2;	    /* We don't support four tap in this mode because G's are split between two bytes. In theory we could support it if */	    /* we saved part of the G when fetching the R, and then filter the G, followed by the B in the following cycles. */	    if (H_scale_ratio>=.5)	    {		/* We are actually generating two pixels (but 3 colour components) per tick. Thus we don't have to skip */		/* until we reach .5. P1 and P23 are the same. */		*val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5);		*val_OV0_P1_H_STEP_BY = 1;		*val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5);		*val_OV0_P23_H_STEP_BY = 1;		*P1StepSize = 1;		*P23StepSize = 1;	    }	    else if (H_scale_ratio>=.25)	    {		/* Step by two */		*val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*2)) * (1<<0xc) + 0.5);		*val_OV0_P1_H_STEP_BY = 2;		*val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*2)) * (1<<0xc) + 0.5);		*val_OV0_P23_H_STEP_BY = 2;		*P1StepSize = 2;		*P23StepSize = 2;	    }	    else if (H_scale_ratio>=.125)	    {		/* Step by four */		*val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5);		*val_OV0_P1_H_STEP_BY = 3;		*val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5);		*val_OV0_P23_H_STEP_BY = 3;		*P1StepSize = 4;		*P23StepSize = 4;	    }	    else if (H_scale_ratio>=.0625)	    {		/* Step by eight */		*val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*8)) * (1<<0xc) + 0.5);		*val_OV0_P1_H_STEP_BY = 4;		*val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*8)) * (1<<0xc) + 0.5);		*val_OV0_P23_H_STEP_BY = 4;		*P1StepSize = 8;		*P23StepSize = 8;	    }	    else if (H_scale_ratio>=0.03125)	    {		/* Step by sixteen */		*val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5);		*val_OV0_P1_H_STEP_BY = 5;		*val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5);		*val_OV0_P23_H_STEP_BY = 5;		*P1StepSize = 16;		*P23StepSize = 16;	    }	    else	    {		H_scale_ratio=0.03125;		*val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5);		*val_OV0_P1_H_STEP_BY = 5;		*val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5);		*val_OV0_P23_H_STEP_BY = 5;		*P1StepSize = 16;		*P23StepSize = 16;	    }	    break;	case 6: /*32BPP RGB */	    if (H_scale_ratio>=1.5 && !DisallowFourTapVertFiltering)	    {		/* All colour components are fetched in pairs */		*P1GroupSize = 2;		/* With four tap filtering, we can generate two colour components every clock, or two pixels every three */		/* clocks. This means that we will have four tap filtering when scaling 1.5 or more. */		*val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5);		*val_OV0_P1_H_STEP_BY = 0;		*val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5);		*val_OV0_P23_H_STEP_BY = 0;		*P1StepSize = 1;		*P23StepSize = 1;	    }	    else if (H_scale_ratio>=0.75)	    {		/* Four G colour components are fetched at once */		*P1GroupSize = 4;		/* R and B colour components are fetched in pairs */		/* With two tap filtering, we can generate four colour components every clock. */		/* This means that we will have two tap filtering when scaling 1.0 or more. */		*val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5);		*val_OV0_P1_H_STEP_BY = 1;		*val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5);		*val_OV0_P23_H_STEP_BY = 1;		*P1StepSize = 1;		*P23StepSize = 1;	    }	    else if (H_scale_ratio>=0.375)	    {		/* Step by two. */		/* Four G colour components are fetched at once */		*P1GroupSize = 4;		/* R and B colour components are fetched in pairs */		*val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*2)) * (1<<0xc) + 0.5);		*val_OV0_P1_H_STEP_BY = 2;		*val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*2)) * (1<<0xc) + 0.5);		*val_OV0_P23_H_STEP_BY = 2;		*P1StepSize = 2;		*P23StepSize = 2;	    }	    else if (H_scale_ratio>=0.25)	    {		/* Step by two. */		/* Four G colour components are fetched at once */		*P1GroupSize = 4;		/* R and B colour components are fetched in pairs */		*val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*2)) * (1<<0xc) + 0.5);		*val_OV0_P1_H_STEP_BY = 2;		*val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5);		*val_OV0_P23_H_STEP_BY = 3;		*P1StepSize = 2;		*P23StepSize = 4;	    }	    else if (H_scale_ratio>=0.1875)	    {		/* Step by four */		/* Four G colour components are fetched at once */		*P1GroupSize = 4;		/* R and B colour components are fetched in pairs */		*val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5);		*val_OV0_P1_H_STEP_BY = 3;		*val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5);		*val_OV0_P23_H_STEP_BY = 3;		*P1StepSize = 4;		*P23StepSize = 4;	    }	    else if (H_scale_ratio>=0.125)	    {		/* Step by four */		/* Four G colour components are fetched at once */		*P1GroupSize = 4;		/* R and B colour components are fetched in pairs */		*val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5);		*val_OV0_P1_H_STEP_BY = 3;		*val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*8)) * (1<<0xc) + 0.5);		*val_OV0_P23_H_STEP_BY = 4;		*P1StepSize = 4;		*P23StepSize = 8;	    }	    else if (H_scale_ratio>=0.09375)	    {		/* Step by eight */		/* Four G colour components are fetched at once */		*P1GroupSize = 4;		/* R and B colour components are fetched in pairs */		*val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*8)) * (1<<0xc) + 0.5);		*val_OV0_P1_H_STEP_BY = 4;		*val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*8)) * (1<<0xc) + 0.5);		*val_OV0_P23_H_STEP_BY = 4;		*P1StepSize = 8;		*P23StepSize = 8;	    }	    else if (H_scale_ratio>=0.0625)	    {		/* Step by eight */		/* Four G colour components are fetched at once */		*P1GroupSize = 4;		/* R and B colour components are fetched in pairs */		*val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5);		*val_OV0_P1_H_STEP_BY = 5;		*val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5);		*val_OV0_P23_H_STEP_BY = 5;		*P1StepSize = 16;		*P23StepSize = 16;	    }	    else	    {		H_scale_ratio=0.0625;		*P1GroupSize = 4;		*val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5);		*val_OV0_P1_H_STEP_BY = 5;		*val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5);		*val_OV0_P23_H_STEP_BY = 5;		*P1StepSize = 16;		*P23StepSize = 16;	    }	    break;

⌨️ 快捷键说明

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