Mercurial > mplayer.hg
diff drivers/mga_vid_test.c @ 1:3b5f5d1c5041
Initial revision
author | arpi_esp |
---|---|
date | Sat, 24 Feb 2001 20:28:24 +0000 |
parents | |
children | d95acdc18f38 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/drivers/mga_vid_test.c Sat Feb 24 20:28:24 2001 +0000 @@ -0,0 +1,221 @@ +/* + * + * mga_vid_test.c + * + * Aaron Holtzman <aholtzma@ess.engr.uvic.ca> + * Sept 1999 + * + * This software has been released under the terms of the GNU Public + * license. See http://www.gnu.org/copyleft/gpl.html for details. + */ + +//#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/ioctl.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/mman.h> +#include "mga_vid.h" + +mga_vid_config_t config; +uint8_t *mga_vid_base; +uint32_t is_g400; + +#define SRC_IMAGE_WIDTH 256 +#define SRC_IMAGE_HEIGHT 256 + +uint8_t y_image[SRC_IMAGE_WIDTH * SRC_IMAGE_HEIGHT]; +uint8_t cr_image[SRC_IMAGE_WIDTH * SRC_IMAGE_HEIGHT]; +uint8_t cb_image[SRC_IMAGE_WIDTH * SRC_IMAGE_HEIGHT]; + + +void +write_frame_g200(uint8_t *y,uint8_t *cr, uint8_t *cb) +{ + uint8_t *dest; + uint32_t bespitch,h,w; + + dest = mga_vid_base; + bespitch = (config.src_width + 31) & ~31; + + for(h=0; h < config.src_height; h++) + { + memcpy(dest, y, config.src_width); + y += config.src_width; + dest += bespitch; + } + + for(h=0; h < config.src_height/2; h++) + { + for(w=0; w < config.src_width/2; w++) + { + *dest++ = *cb++; + *dest++ = *cr++; + } + dest += bespitch - config.src_width; + } +} + +void +write_frame_g400(uint8_t *y,uint8_t *cr, uint8_t *cb) +{ + uint8_t *dest; + uint32_t bespitch,h; + + dest = mga_vid_base; + bespitch = (config.src_width + 31) & ~31; + + for(h=0; h < config.src_height; h++) + { + memcpy(dest, y, config.src_width); + y += config.src_width; + dest += bespitch; + } + + for(h=0; h < config.src_height/2; h++) + { + memcpy(dest, cb, config.src_width/2); + cb += config.src_width/2; + dest += bespitch/2; + } + + for(h=0; h < config.src_height/2; h++) + { + memcpy(dest, cr, config.src_width/2); + cr += config.src_width/2; + dest += bespitch/2; + } +} + +void write_frame(uint8_t *y,uint8_t *cr, uint8_t *cb) +{ + if(is_g400) + write_frame_g400(y,cr,cb); + else + write_frame_g200(y,cr,cb); +} + +void +draw_cool_pattern(void) +{ + int i,x,y; + + i = 0; + for (y=0; y<config.src_height; y++) { + for (x=0; x<config.src_width; x++) { + y_image[i++] = x*x/2 + y*y/2 - 128; + } + } + + i = 0; + for (y=0; y<config.src_height/2; y++) + for (x=0; x<config.src_width/2; x++) + { + cr_image[i++] = x - 128; + } + + i = 0; + for (y=0; y<config.src_height/2; y++) + for (x=0; x<config.src_width/2; x++) + { + cb_image[i++] = y - 128; + } +} + +void +draw_color_blend(void) +{ + int i,x,y; + + i = 0; + for (y=0; y<config.src_height; y++) { + for (x=0; x<config.src_width; x++) { + y_image[i++] = 0; + } + } + + i = 0; + for (y=0; y<config.src_height/2; y++) + for (x=0; x<config.src_width/2; x++) + { + cr_image[i++] = x - 128; + } + + i = 0; + for (y=0; y<config.src_height/2; y++) + for (x=0; x<config.src_width/2; x++) + { + cb_image[i++] = y - 128; + } +} + + +int +main(int argc, char *argv[]) +{ + int f; + + f = open("/dev/mga_vid",O_RDWR); + + if(f == -1) + { + fprintf(stderr,"Couldn't open driver\n"); + exit(1); + } + + config.src_width = SRC_IMAGE_WIDTH; + config.src_height= SRC_IMAGE_HEIGHT; + config.dest_width = SRC_IMAGE_WIDTH; + config.dest_height = SRC_IMAGE_HEIGHT; + config.x_org= 10; + config.y_org= 10; + config.colkey_on = 0; + config.format = MGA_VID_FORMAT_YV12; + + if (ioctl(f,MGA_VID_CONFIG,&config)) + { + perror("Error in config ioctl"); + } + + if (config.card_type == MGA_G200) + { + printf("Testing MGA G200 Backend Scaler with %d MB of RAM\n", config.ram_size); + is_g400 = 0; + } + else + { + printf("Testing MGA G400 Backend Scaler with %d MB of RAM\n", config.ram_size); + is_g400 = 1; + } + + ioctl(f,MGA_VID_ON,0); + mga_vid_base = (uint8_t*)mmap(0,256 * 4096,PROT_WRITE,MAP_SHARED,f,0); + printf("mga_vid_base = %8p\n",mga_vid_base); + + + //memset(y_image,80,256 * 128); + //memset(cr_image,80,256/2 * 20); + //memset(cb_image,80,256/2 * 20); + write_frame(y_image,cr_image,cb_image); + printf("(1) There should be a green square, offset by 10 pixels from\n" + " the upper left corner displayed\n"); + sleep(3); + + + draw_cool_pattern(); + write_frame(y_image,cr_image,cb_image); + printf("(2) There should be a cool mosaic like pattern now.\n"); + sleep(3); + + draw_color_blend(); + write_frame(y_image,cr_image,cb_image); + printf("(3) There should be a color blend with black, red, purple, blue\n" + " corners (starting top left going CW)\n"); + sleep(3); + + ioctl(f,MGA_VID_OFF,0); + + close(f); + return 0; +}