mirror of
https://github.com/mpv-player/mpv
synced 2025-01-12 18:02:36 +00:00
YVU9 support
fixing framesize & alignment setting colorkey at a more correct place git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@4873 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
2c863bf5fd
commit
6e5c07d4ef
@ -181,7 +181,7 @@ static void mach64_wait_for_idle( void )
|
||||
static vidix_capability_t mach64_cap =
|
||||
{
|
||||
"BES driver for Mach64/3DRage cards",
|
||||
"Nick Kurshev",
|
||||
"Nick Kurshev and Michael Niedermayer",
|
||||
TYPE_OUTPUT,
|
||||
{ 0, 0, 0, 0 },
|
||||
2048,
|
||||
@ -270,13 +270,24 @@ static int mach64_get_vert_stretch(void)
|
||||
|
||||
OUTREG(LCD_INDEX, lcd_index);
|
||||
|
||||
if(__verbose>VERBOSE_LEVEL) printf("[mach64] vertical stretching factor= %d\n", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void mach64_vid_make_default()
|
||||
{
|
||||
mach64_fifo_wait(2);
|
||||
mach64_fifo_wait(5);
|
||||
OUTREG(SCALER_COLOUR_CNTL,0x00101000);
|
||||
|
||||
besr.ckey_on=0;
|
||||
besr.graphics_key_msk=0;
|
||||
besr.graphics_key_clr=0;
|
||||
|
||||
OUTREG(OVERLAY_GRAPHICS_KEY_MSK, besr.graphics_key_msk);
|
||||
OUTREG(OVERLAY_GRAPHICS_KEY_CLR, besr.graphics_key_clr);
|
||||
OUTREG(OVERLAY_KEY_CNTL,VIDEO_KEY_FN_TRUE|GRAPHIC_KEY_FN_EQ|CMP_MIX_AND);
|
||||
|
||||
}
|
||||
|
||||
static void mach64_vid_dump_regs( void )
|
||||
@ -490,6 +501,10 @@ static unsigned mach64_query_pitch(unsigned fourcc,const vidix_yuv_t *spitch)
|
||||
if(spy > 16 && spu == spy/2 && spv == spy/2) pitch = spy;
|
||||
else pitch = 32;
|
||||
break;
|
||||
case IMGFMT_YVU9:
|
||||
if(spy > 32 && spu == spy/4 && spv == spy/4) pitch = spy;
|
||||
else pitch = 64;
|
||||
break;
|
||||
default:
|
||||
if(spy >= 16) pitch = spy;
|
||||
else pitch = 16;
|
||||
@ -510,7 +525,11 @@ static void mach64_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_RGB32:
|
||||
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);
|
||||
info->frame_size = (awidth*info->src.h);
|
||||
@ -521,6 +540,8 @@ static void mach64_compute_framesize(vidix_playback_t *info)
|
||||
info->frame_size = (awidth*info->src.h);
|
||||
break;
|
||||
}
|
||||
info->frame_size+=256; // so we have some space for alignment & such
|
||||
info->frame_size&=~16;
|
||||
}
|
||||
|
||||
static void mach64_vid_stop_video( void )
|
||||
@ -535,9 +556,6 @@ static void mach64_vid_stop_video( void )
|
||||
OUTREG(SCALER_H_COEFF3, 0x0C0E1A0C);
|
||||
OUTREG(SCALER_H_COEFF4, 0x0C14140C);
|
||||
OUTREG(VIDEO_FORMAT, 0xB000B);
|
||||
OUTREG(OVERLAY_GRAPHICS_KEY_MSK, 0);
|
||||
OUTREG(OVERLAY_GRAPHICS_KEY_CLR, 0);
|
||||
OUTREG(OVERLAY_KEY_CNTL, 0x50);
|
||||
OUTREG(OVERLAY_TEST, 0x0);
|
||||
}
|
||||
|
||||
@ -569,16 +587,6 @@ static void mach64_vid_display_video( void )
|
||||
// bit 8-27 no effect
|
||||
// bit 28-31 nothing interresting just crashed my system when i played with them :(
|
||||
|
||||
mach64_fifo_wait(3);
|
||||
OUTREG(OVERLAY_GRAPHICS_KEY_MSK, besr.graphics_key_msk);
|
||||
OUTREG(OVERLAY_GRAPHICS_KEY_CLR, besr.graphics_key_clr);
|
||||
// OUTREG(OVERLAY_VIDEO_KEY_MSK, 0x80);
|
||||
// OUTREG(OVERLAY_VIDEO_KEY_CLR, 0x80);
|
||||
if(besr.ckey_on)
|
||||
OUTREG(OVERLAY_KEY_CNTL,VIDEO_KEY_FN_TRUE|GRAPHIC_KEY_FN_EQ|CMP_MIX_AND);
|
||||
else
|
||||
OUTREG(OVERLAY_KEY_CNTL,VIDEO_KEY_FN_TRUE|GRAPHIC_KEY_FN_TRUE|CMP_MIX_AND);
|
||||
|
||||
mach64_wait_for_idle();
|
||||
vf = INREG(VIDEO_FORMAT);
|
||||
|
||||
@ -613,6 +621,8 @@ static void mach64_vid_display_video( void )
|
||||
case IMGFMT_IYUV:
|
||||
case IMGFMT_I420:
|
||||
case IMGFMT_YV12: OUTREG(VIDEO_FORMAT, 0x000A0000); break;
|
||||
|
||||
case IMGFMT_YVU9: OUTREG(VIDEO_FORMAT, 0x00090000); break;
|
||||
/* 4:2:2 */
|
||||
case IMGFMT_YVYU:
|
||||
case IMGFMT_UYVY: OUTREG(VIDEO_FORMAT, 0x000C0000); break;
|
||||
@ -628,7 +638,7 @@ static int mach64_vid_init_video( vidix_playback_t *config )
|
||||
int is_420,best_pitch,mpitch;
|
||||
int src_offset_y, src_offset_u, src_offset_v;
|
||||
unsigned int i;
|
||||
|
||||
|
||||
mach64_vid_stop_video();
|
||||
/* warning, if left or top are != 0 this will fail, as the framesize is too small then */
|
||||
left = config->src.x;
|
||||
@ -643,6 +653,7 @@ static int mach64_vid_init_video( vidix_playback_t *config )
|
||||
mpitch = best_pitch-1;
|
||||
switch(config->fourcc)
|
||||
{
|
||||
case IMGFMT_YVU9:
|
||||
/* 4:2:0 */
|
||||
case IMGFMT_IYUV:
|
||||
case IMGFMT_YV12:
|
||||
@ -686,17 +697,23 @@ static int mach64_vid_init_video( vidix_playback_t *config )
|
||||
for(i=1; i<config->num_frames; i++)
|
||||
config->offsets[i] = config->offsets[i-1] + config->frame_size;
|
||||
|
||||
/*FIXME the left / top stuff is broken (= zoom a src rectangle from a larger one)
|
||||
1. the framesize isnt known as the outer src rectangle dimensions arent known
|
||||
2. the mach64 needs aligned addresses so it cant work anyway
|
||||
-> so we could shift the outer buffer to compensate that but that would mean
|
||||
alignment problems for the code which writes into it
|
||||
*/
|
||||
|
||||
if(is_420)
|
||||
{
|
||||
config->offset.y= 0;
|
||||
config->offset.u= pitch*src_h; // FIXME wrong?
|
||||
config->offset.v= config->offset.u + (pitch*src_h>>2); // FIXME wrong?
|
||||
//FIXME align & fix framesize
|
||||
|
||||
config->offset.u= (pitch*src_h + 15)&~15;
|
||||
config->offset.v= (config->offset.u + (pitch*src_h>>2) + 15)&~15;
|
||||
|
||||
src_offset_y= config->offset.y + top*pitch + left;
|
||||
src_offset_u= config->offset.u + (top*pitch>>2) + (left>>1);
|
||||
src_offset_v= config->offset.v + (top*pitch>>2) + (left>>1);
|
||||
|
||||
|
||||
if(besr.fourcc == IMGFMT_I420 || besr.fourcc == IMGFMT_IYUV)
|
||||
{
|
||||
uint32_t tmp;
|
||||
@ -705,15 +722,25 @@ static int mach64_vid_init_video( vidix_playback_t *config )
|
||||
config->offset.v = tmp;
|
||||
}
|
||||
}
|
||||
else if(besr.fourcc == IMGFMT_YVU9)
|
||||
{
|
||||
config->offset.y= 0;
|
||||
config->offset.u= (pitch*src_h + 15)&~15;
|
||||
config->offset.v= (config->offset.u + (pitch*src_h>>4) + 15)&~15;
|
||||
|
||||
src_offset_y= config->offset.y + top*pitch + left;
|
||||
src_offset_u= config->offset.u + (top*pitch>>4) + (left>>1);
|
||||
src_offset_v= config->offset.v + (top*pitch>>4) + (left>>1);
|
||||
}
|
||||
else if(besr.fourcc == IMGFMT_BGR32)
|
||||
{
|
||||
config->offset.y = config->offset.u = config->offset.v = 0;
|
||||
src_offset_y= src_offset_u= src_offset_v= (left << 2)&~15;
|
||||
src_offset_y= src_offset_u= src_offset_v= top*pitch + (left << 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
config->offset.y = config->offset.u = config->offset.v = 0;
|
||||
src_offset_y= src_offset_u= src_offset_v= (left << 1)&~15;
|
||||
src_offset_y= src_offset_u= src_offset_v= top*pitch + (left << 1);
|
||||
}
|
||||
|
||||
num_mach64_buffers= config->num_frames;
|
||||
@ -739,53 +766,6 @@ static int mach64_vid_init_video( vidix_playback_t *config )
|
||||
besr.y_x_end = y_pos | ((config->dest.x + dest_w) << 16);
|
||||
besr.height_width = ((src_w - left)<<16) | (src_h - top);
|
||||
|
||||
if(mach64_grkey.ckey.op == CKEY_TRUE)
|
||||
{
|
||||
besr.ckey_on=1;
|
||||
|
||||
switch(mach64_vid_get_dbpp())
|
||||
{
|
||||
case 15:
|
||||
besr.graphics_key_msk=0x7FFF;
|
||||
besr.graphics_key_clr=
|
||||
((mach64_grkey.ckey.blue &0xF8)>>3)
|
||||
| ((mach64_grkey.ckey.green&0xF8)<<2)
|
||||
| ((mach64_grkey.ckey.red &0xF8)<<7);
|
||||
break;
|
||||
case 16:
|
||||
besr.graphics_key_msk=0xFFFF;
|
||||
besr.graphics_key_clr=
|
||||
((mach64_grkey.ckey.blue &0xF8)>>3)
|
||||
| ((mach64_grkey.ckey.green&0xFC)<<3)
|
||||
| ((mach64_grkey.ckey.red &0xF8)<<8);
|
||||
break;
|
||||
case 24:
|
||||
besr.graphics_key_msk=0xFFFFFF;
|
||||
besr.graphics_key_clr=
|
||||
((mach64_grkey.ckey.blue &0xFF))
|
||||
| ((mach64_grkey.ckey.green&0xFF)<<8)
|
||||
| ((mach64_grkey.ckey.red &0xFF)<<16);
|
||||
break;
|
||||
case 32:
|
||||
besr.graphics_key_msk=0xFFFFFF;
|
||||
besr.graphics_key_clr=
|
||||
((mach64_grkey.ckey.blue &0xFF))
|
||||
| ((mach64_grkey.ckey.green&0xFF)<<8)
|
||||
| ((mach64_grkey.ckey.red &0xFF)<<16);
|
||||
break;
|
||||
default:
|
||||
besr.ckey_on=0;
|
||||
besr.graphics_key_msk=0;
|
||||
besr.graphics_key_clr=0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
besr.ckey_on=0;
|
||||
besr.graphics_key_msk=0;
|
||||
besr.graphics_key_clr=0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -793,7 +773,8 @@ static int mach64_vid_init_video( vidix_playback_t *config )
|
||||
uint32_t supported_fourcc[] =
|
||||
{
|
||||
IMGFMT_YV12, IMGFMT_I420, IMGFMT_IYUV,
|
||||
IMGFMT_UYVY, IMGFMT_YUY2, IMGFMT_YVYU,
|
||||
IMGFMT_YVU9,
|
||||
IMGFMT_UYVY, IMGFMT_YUY2,
|
||||
IMGFMT_BGR15,IMGFMT_BGR16,IMGFMT_BGR32
|
||||
};
|
||||
|
||||
@ -943,5 +924,63 @@ int vixGetGrKeys(vidix_grkey_t *grkey)
|
||||
int vixSetGrKeys(const vidix_grkey_t *grkey)
|
||||
{
|
||||
memcpy(&mach64_grkey, grkey, sizeof(vidix_grkey_t));
|
||||
|
||||
if(mach64_grkey.ckey.op == CKEY_TRUE)
|
||||
{
|
||||
besr.ckey_on=1;
|
||||
|
||||
switch(mach64_vid_get_dbpp())
|
||||
{
|
||||
case 15:
|
||||
besr.graphics_key_msk=0x7FFF;
|
||||
besr.graphics_key_clr=
|
||||
((mach64_grkey.ckey.blue &0xF8)>>3)
|
||||
| ((mach64_grkey.ckey.green&0xF8)<<2)
|
||||
| ((mach64_grkey.ckey.red &0xF8)<<7);
|
||||
break;
|
||||
case 16:
|
||||
besr.graphics_key_msk=0xFFFF;
|
||||
besr.graphics_key_clr=
|
||||
((mach64_grkey.ckey.blue &0xF8)>>3)
|
||||
| ((mach64_grkey.ckey.green&0xFC)<<3)
|
||||
| ((mach64_grkey.ckey.red &0xF8)<<8);
|
||||
break;
|
||||
case 24:
|
||||
besr.graphics_key_msk=0xFFFFFF;
|
||||
besr.graphics_key_clr=
|
||||
((mach64_grkey.ckey.blue &0xFF))
|
||||
| ((mach64_grkey.ckey.green&0xFF)<<8)
|
||||
| ((mach64_grkey.ckey.red &0xFF)<<16);
|
||||
break;
|
||||
case 32:
|
||||
besr.graphics_key_msk=0xFFFFFF;
|
||||
besr.graphics_key_clr=
|
||||
((mach64_grkey.ckey.blue &0xFF))
|
||||
| ((mach64_grkey.ckey.green&0xFF)<<8)
|
||||
| ((mach64_grkey.ckey.red &0xFF)<<16);
|
||||
break;
|
||||
default:
|
||||
besr.ckey_on=0;
|
||||
besr.graphics_key_msk=0;
|
||||
besr.graphics_key_clr=0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
besr.ckey_on=0;
|
||||
besr.graphics_key_msk=0;
|
||||
besr.graphics_key_clr=0;
|
||||
}
|
||||
|
||||
mach64_fifo_wait(4);
|
||||
OUTREG(OVERLAY_GRAPHICS_KEY_MSK, besr.graphics_key_msk);
|
||||
OUTREG(OVERLAY_GRAPHICS_KEY_CLR, besr.graphics_key_clr);
|
||||
// OUTREG(OVERLAY_VIDEO_KEY_MSK, 0);
|
||||
// OUTREG(OVERLAY_VIDEO_KEY_CLR, 0);
|
||||
if(besr.ckey_on)
|
||||
OUTREG(OVERLAY_KEY_CNTL,VIDEO_KEY_FN_TRUE|GRAPHIC_KEY_FN_EQ|CMP_MIX_AND);
|
||||
else
|
||||
OUTREG(OVERLAY_KEY_CNTL,VIDEO_KEY_FN_TRUE|GRAPHIC_KEY_FN_TRUE|CMP_MIX_AND);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user