📄 radeon_vid.c
字号:
{ 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)®_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 + -