diff options
author | 2001-02-24 20:28:24 +0000 | |
---|---|---|
committer | 2001-02-24 20:28:24 +0000 | |
commit | d34041569e71fc9bd772354e94dc9d16061072a5 (patch) | |
tree | 8f481cae1c70f32d1756fbe5f39000577b73042d /libvo/mga_common.c | |
parent | e95a95ece09bac96bdfd37322f96c6f57ef79ebc (diff) |
Initial revision
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@2 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo/mga_common.c')
-rw-r--r-- | libvo/mga_common.c | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/libvo/mga_common.c b/libvo/mga_common.c new file mode 100644 index 0000000000..6ff635d7e6 --- /dev/null +++ b/libvo/mga_common.c @@ -0,0 +1,220 @@ + +// mga_vid drawing functions + +static void +write_frame_g200(uint8_t *y,uint8_t *cr, uint8_t *cb) +{ + uint8_t *dest; + uint32_t bespitch,h,w; + + dest = vid_data; + bespitch = (mga_vid_config.src_width + 31) & ~31; + + for(h=0; h < mga_vid_config.src_height; h++) + { + memcpy(dest, y, mga_vid_config.src_width); + y += mga_vid_config.src_width; + dest += bespitch; + } + + for(h=0; h < mga_vid_config.src_height/2; h++) + { + for(w=0; w < mga_vid_config.src_width/2; w++) + { + *dest++ = *cb++; + *dest++ = *cr++; + } + dest += bespitch - mga_vid_config.src_width; + } +} + +static void +write_frame_g400(uint8_t *y,uint8_t *cr, uint8_t *cb) +{ + uint8_t *dest; + uint32_t bespitch,h; + + dest = vid_data; + bespitch = (mga_vid_config.src_width + 31) & ~31; + + for(h=0; h < mga_vid_config.src_height; h++) + { + memcpy(dest, y, mga_vid_config.src_width); + y += mga_vid_config.src_width; + dest += bespitch; + } + + for(h=0; h < mga_vid_config.src_height/2; h++) + { + memcpy(dest, cb, mga_vid_config.src_width/2); + cb += mga_vid_config.src_width/2; + dest += bespitch/2; + } + + for(h=0; h < mga_vid_config.src_height/2; h++) + { + memcpy(dest, cr, mga_vid_config.src_width/2); + cr += mga_vid_config.src_width/2; + dest += bespitch/2; + } +} + +//static void +//write_slice_g200(uint8_t *y,uint8_t *cr, uint8_t *cb,uint32_t slice_num) + +static void +draw_slice_g200(uint8_t *image[], int stride[], int width,int height,int x,int y) +{ + uint8_t *src; + uint8_t *src2; + uint8_t *dest; + uint32_t bespitch,h,w; + + bespitch = (mga_vid_config.src_width + 31) & ~31; + + dest = vid_data + bespitch * y * x; + src = image[0]; + for(h=0; h < height; h++) + { + memcpy(dest, src, width); + src += stride[0]; + dest += bespitch; + } + + width/=2;height/=2;x/=2;y/=2; + + dest = vid_data + bespitch * mga_vid_config.src_height + + bespitch * y + 2*x; + src = image[1]; + src2 = image[2]; + for(h=0; h < height; h++) + { + for(w=0; w < width; w++) + { + dest[2*w+0] = src[w]; + dest[2*w+1] = src2[w]; + } + dest += bespitch; + src += stride[1]; + src2+= stride[2]; + } +} + +static void +draw_slice_g400(uint8_t *image[], int stride[], int w,int h,int x,int y) +{ + uint8_t *src; + uint8_t *dest; + uint32_t bespitch,bespitch2; + int i; + + bespitch = (mga_vid_config.src_width + 31) & ~31; + bespitch2 = bespitch/2; + + dest = vid_data + bespitch * y + x; + src = image[0]; + for(i=0;i<h;i++){ + memcpy(dest,src,w); + src+=stride[0]; + dest += bespitch; + } + + w/=2;h/=2;x/=2;y/=2; + + dest = vid_data + bespitch*mga_vid_config.src_height + bespitch2 * y + x; + src = image[1]; + for(i=0;i<h;i++){ + memcpy(dest,src,w); + src+=stride[1]; + dest += bespitch2; + } + + dest = vid_data + bespitch*mga_vid_config.src_height + + bespitch*mga_vid_config.src_height / 4 + + bespitch2 * y + x; + src = image[2]; + for(i=0;i<h;i++){ + memcpy(dest,src,w); + src+=stride[2]; + dest += bespitch2; + } + +} + +static uint32_t +draw_slice(uint8_t *src[], int stride[], int w,int h,int x,int y) +{ + if (mga_vid_config.card_type == MGA_G200) + draw_slice_g200(src,stride,w,h,x,y); + else + draw_slice_g400(src,stride,w,h,x,y); + return 0; +} + +static void +flip_page(void) +{ +#if 0 + ioctl(f,MGA_VID_FSEL,&next_frame); + + if (next_frame) + vid_data = frame1; + else + vid_data = frame0; + + next_frame = 2 - next_frame; // switch between fields A1 and B1 + +#endif +} + + +static void +write_frame_yuy2(uint8_t *y) +{ + uint8_t *dest; + uint32_t bespitch,h; + int len=2*mga_vid_config.src_width; + + dest = vid_data; + bespitch = (mga_vid_config.src_width + 31) & ~31; + +// y+=2*mga_vid_config.src_width*mga_vid_config.src_height; + + for(h=0; h < mga_vid_config.src_height; h++) + { +// y -= 2*mga_vid_config.src_width; + memcpy(dest, y, len); + y += len; + dest += 2*bespitch; + } +} + + +static uint32_t +draw_frame(uint8_t *src[]) +{ + if (mga_vid_config.format==MGA_VID_FORMAT_YUY2) + write_frame_yuy2(src[0]); + else + if (mga_vid_config.card_type == MGA_G200) + write_frame_g200(src[0], src[2], src[1]); + else + write_frame_g400(src[0], src[2], src[1]); + + //flip_page(); + return 0; +} + +static uint32_t +query_format(uint32_t format) +{ + switch(format){ + case IMGFMT_YV12: + case IMGFMT_YUY2: +// case IMGFMT_RGB|24: +// case IMGFMT_BGR|24: + return 1; + } + return 0; +} + |