1
0
mirror of https://github.com/mpv-player/mpv synced 2025-02-05 14:42:24 +00:00

YVU9,IF09,Y800 and Y8 support - and synced with mpxp

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@6484 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
alex 2002-06-21 17:31:02 +00:00
parent 63e90b6d98
commit fd68aff8f7

View File

@ -939,8 +939,14 @@ int vixGetCapability(vidix_capability_t *to)
return 0;
}
/*
Full list of fourcc which are supported by Win2K redeon driver:
YUY2, UYVY, DDES, OGLT, OGl2, OGLS, OGLB, OGNT, OGNZ, OGNS,
IF09, YVU9, IMC4, M2IA, IYUV, VBID, DXT1, DXT2, DXT3, DXT4, DXT5
*/
uint32_t supported_fourcc[] =
{
IMGFMT_Y800, IMGFMT_Y8, IMGFMT_YVU9, IMGFMT_IF09,
IMGFMT_YV12, IMGFMT_I420, IMGFMT_IYUV,
IMGFMT_UYVY, IMGFMT_YUY2, IMGFMT_YVYU,
IMGFMT_RGB15, IMGFMT_BGR15,
@ -948,9 +954,9 @@ uint32_t supported_fourcc[] =
IMGFMT_RGB32, IMGFMT_BGR32
};
__inline__ static int is_supported_fourcc(uint32_t fourcc)
inline static int is_supported_fourcc(uint32_t fourcc)
{
unsigned i;
unsigned int i;
for(i=0;i<sizeof(supported_fourcc)/sizeof(uint32_t);i++)
{
if(fourcc==supported_fourcc[i]) return 1;
@ -1080,14 +1086,16 @@ static void radeon_vid_display_video( void )
*/
case IMGFMT_RGB32:
case IMGFMT_BGR32: bes_flags |= SCALER_SOURCE_32BPP; break;
/* 4:1:0*/
/* 4:1:0 */
case IMGFMT_IF09:
case IMGFMT_YVU9: bes_flags |= SCALER_SOURCE_YUV9; break;
/* 4:0:0 */
case IMGFMT_Y800:
case IMGFMT_Y8:
/* 4:2:0 */
case IMGFMT_IYUV:
case IMGFMT_I420:
case IMGFMT_YV12: bes_flags |= SCALER_SOURCE_YUV12;
break;
case IMGFMT_YV12: bes_flags |= SCALER_SOURCE_YUV12; break;
/* 4:2:2 */
case IMGFMT_YVYU:
case IMGFMT_UYVY: bes_flags |= SCALER_SOURCE_YVYU422; break;
@ -1140,6 +1148,8 @@ static unsigned radeon_query_pitch(unsigned fourcc,const vidix_yuv_t *spitch)
if(spy > 16 && spu == spy/2 && spv == spy/2) pitch = spy;
else pitch = 32;
break;
/* 4:1:0 */
case IMGFMT_IF09:
case IMGFMT_YVU9:
if(spy > 32 && spu == spy/4 && spv == spy/4) pitch = spy;
else pitch = 64;
@ -1155,16 +1165,20 @@ static unsigned radeon_query_pitch(unsigned fourcc,const vidix_yuv_t *spitch)
static int radeon_vid_init_video( vidix_playback_t *config )
{
uint32_t i,tmp,src_w,src_h,dest_w,dest_h,pitch,h_inc,step_by,left,leftUV,top;
int is_420,is_rgb32,is_rgb,best_pitch,mpitch;
int is_400,is_410,is_420,is_rgb32,is_rgb,best_pitch,mpitch;
radeon_vid_stop_video();
left = config->src.x << 16;
top = config->src.y << 16;
src_h = config->src.h;
src_w = config->src.w;
is_420 = is_rgb32 = is_rgb = 0;
is_400 = is_410 = is_420 = is_rgb32 = is_rgb = 0;
if(config->fourcc == IMGFMT_YV12 ||
config->fourcc == IMGFMT_I420 ||
config->fourcc == IMGFMT_IYUV) is_420 = 1;
if(config->fourcc == IMGFMT_YVU9 ||
config->fourcc == IMGFMT_IF09) is_410 = 1;
if(config->fourcc == IMGFMT_Y800 ||
config->fourcc == IMGFMT_Y8) is_400 = 1;
if(config->fourcc == IMGFMT_RGB32 ||
config->fourcc == IMGFMT_BGR32) is_rgb32 = 1;
if(config->fourcc == IMGFMT_RGB32 ||
@ -1179,7 +1193,12 @@ static int radeon_vid_init_video( vidix_playback_t *config )
mpitch = best_pitch-1;
switch(config->fourcc)
{
/* 4:0:0 */
case IMGFMT_Y800:
case IMGFMT_Y8:
/* 4:1:0 */
case IMGFMT_YVU9:
case IMGFMT_IF09:
/* 4:2:0 */
case IMGFMT_IYUV:
case IMGFMT_YV12:
@ -1222,27 +1241,74 @@ static int radeon_vid_init_video( vidix_playback_t *config )
config->offsets[0] = 0;
for(i=1;i<besr.vid_nbufs;i++)
config->offsets[i] = config->offsets[i-1]+config->frame_size;
if(is_420)
if(is_420 || is_410 || is_400)
{
uint32_t d1line,d2line,d3line;
d1line = top*pitch;
d2line = src_h*pitch+(d1line>>2);
d3line = d2line+((src_h*pitch)>>2);
if(is_420)
{
d2line = src_h*pitch+(d1line>>2);
d3line = d2line+((src_h*pitch)>>2);
}
else
if(is_410)
{
d2line = src_h*pitch+(d1line>>4);
d3line = d2line+((src_h*pitch)>>4);
}
else
{
d2line = 0;
d3line = 0;
}
d1line += (left >> 16) & ~15;
d2line += (left >> 17) & ~15;
d3line += (left >> 17) & ~15;
if(is_420)
{
d2line += (left >> 17) & ~15;
d3line += (left >> 17) & ~15;
}
else
if(is_410)
{
d2line += (left >> 18) & ~15;
d3line += (left >> 18) & ~15;
}
config->offset.y = d1line & VIF_BUF0_BASE_ADRS_MASK;
config->offset.v = d2line & VIF_BUF1_BASE_ADRS_MASK;
config->offset.u = d3line & VIF_BUF2_BASE_ADRS_MASK;
if(is_400)
{
config->offset.v = 0;
config->offset.u = 0;
}
else
{
config->offset.v = d2line & VIF_BUF1_BASE_ADRS_MASK;
config->offset.u = d3line & VIF_BUF2_BASE_ADRS_MASK;
}
for(i=0;i<besr.vid_nbufs;i++)
{
besr.vid_buf_base_adrs_y[i]=((radeon_overlay_off+config->offsets[i]+config->offset.y)&VIF_BUF0_BASE_ADRS_MASK);
besr.vid_buf_base_adrs_v[i]=((radeon_overlay_off+config->offsets[i]+config->offset.v)&VIF_BUF1_BASE_ADRS_MASK)|VIF_BUF1_PITCH_SEL;
besr.vid_buf_base_adrs_u[i]=((radeon_overlay_off+config->offsets[i]+config->offset.u)&VIF_BUF2_BASE_ADRS_MASK)|VIF_BUF2_PITCH_SEL;
if(is_400)
{
besr.vid_buf_base_adrs_v[i]=0;
besr.vid_buf_base_adrs_u[i]=0;
}
else
{
besr.vid_buf_base_adrs_v[i]=((radeon_overlay_off+config->offsets[i]+config->offset.v)&VIF_BUF1_BASE_ADRS_MASK)|VIF_BUF1_PITCH_SEL;
besr.vid_buf_base_adrs_u[i]=((radeon_overlay_off+config->offsets[i]+config->offset.u)&VIF_BUF2_BASE_ADRS_MASK)|VIF_BUF2_PITCH_SEL;
}
}
config->offset.y = ((besr.vid_buf_base_adrs_y[0])&VIF_BUF0_BASE_ADRS_MASK) - radeon_overlay_off;
config->offset.v = ((besr.vid_buf_base_adrs_v[0])&VIF_BUF1_BASE_ADRS_MASK) - radeon_overlay_off;
config->offset.u = ((besr.vid_buf_base_adrs_u[0])&VIF_BUF2_BASE_ADRS_MASK) - radeon_overlay_off;
if(is_400)
{
config->offset.v = 0;
config->offset.u = 0;
}
else
{
config->offset.v = ((besr.vid_buf_base_adrs_v[0])&VIF_BUF1_BASE_ADRS_MASK) - radeon_overlay_off;
config->offset.u = ((besr.vid_buf_base_adrs_u[0])&VIF_BUF2_BASE_ADRS_MASK) - radeon_overlay_off;
}
if(besr.fourcc == IMGFMT_I420 || besr.fourcc == IMGFMT_IYUV)
{
uint32_t tmp;
@ -1274,33 +1340,44 @@ static int radeon_vid_init_video( vidix_playback_t *config )
|(OV0_P1_MAX_LN_IN_PER_LN_OUT & 1);
tmp = ((top >> 1) & 0x0000ffff) + 0x00018000;
besr.p23_v_accum_init = is_420 ? ((tmp << 4) & OV0_P23_V_ACCUM_INIT_MASK)
besr.p23_v_accum_init = (is_420||is_410) ?
((tmp << 4) & OV0_P23_V_ACCUM_INIT_MASK)
|(OV0_P23_MAX_LN_IN_PER_LN_OUT & 1) : 0;
leftUV = (left >> 17) & 15;
leftUV = (left >> (is_410?18:17)) & 15;
left = (left >> 16) & 15;
if(is_rgb && !is_rgb32) h_inc<<=1;
if(is_rgb32)
besr.h_inc = (h_inc >> 1) | ((h_inc >> 1) << 16);
else
if(is_410)
besr.h_inc = h_inc | ((h_inc >> 2) << 16);
else
besr.h_inc = h_inc | ((h_inc >> 1) << 16);
besr.step_by = step_by | (step_by << 8);
besr.y_x_start = (config->dest.x+X_ADJUST) | (config->dest.y << 16);
besr.y_x_end = (config->dest.x + dest_w+X_ADJUST) | ((config->dest.y + dest_h) << 16);
besr.p1_blank_lines_at_top = P1_BLNK_LN_AT_TOP_M1_MASK|((src_h-1)<<16);
if(is_420)
if(is_420 || is_410)
{
src_h = (src_h + 1) >> 1;
src_h = (src_h + 1) >> (is_410?2:1);
besr.p23_blank_lines_at_top = P23_BLNK_LN_AT_TOP_M1_MASK|((src_h-1)<<16);
}
else besr.p23_blank_lines_at_top = 0;
besr.vid_buf_pitch0_value = pitch;
besr.vid_buf_pitch1_value = is_420 ? pitch>>1 : pitch;
besr.vid_buf_pitch1_value = is_410 ? pitch>>2 : is_420 ? pitch>>1 : pitch;
besr.p1_x_start_end = (src_w+left-1)|(left<<16);
src_w>>=1;
besr.p2_x_start_end = (src_w+left-1)|(leftUV<<16);
besr.p3_x_start_end = besr.p2_x_start_end;
if (is_410||is_420) src_w>>=is_410?2:1;
if(is_400)
{
besr.p2_x_start_end = 0;
besr.p3_x_start_end = 0;
}
else
{
besr.p2_x_start_end = (src_w+left-1)|(leftUV<<16);
besr.p3_x_start_end = besr.p2_x_start_end;
}
return 0;
}
@ -1318,6 +1395,16 @@ static void radeon_compute_framesize(vidix_playback_t *info)
awidth = (info->src.w + (pitch-1)) & ~(pitch-1);
info->frame_size = awidth*(info->src.h+info->src.h/2);
break;
case IMGFMT_Y800:
case IMGFMT_Y8:
awidth = (info->src.w + (pitch-1)) & ~(pitch-1);
info->frame_size = awidth*info->src.h;
break;
case IMGFMT_IF09:
case IMGFMT_YVU9:
awidth = (info->src.w + (pitch-1)) & ~(pitch-1);
info->frame_size = awidth*(info->src.h+info->src.h/8);
break;
case IMGFMT_RGB32:
case IMGFMT_BGR32:
awidth = (info->src.w*4 + (pitch-1)) & ~(pitch-1);