test/testoverlay.c
changeset 1151 be9c9c8f6d53
parent 605 6399f4e90211
child 1439 4d3bb026cd16
equal deleted inserted replaced
1150:7d8e1925f35b 1151:be9c9c8f6d53
    18 SDL_Overlay *overlay;
    18 SDL_Overlay *overlay;
    19 int scale;
    19 int scale;
    20 int monochrome;
    20 int monochrome;
    21 int luminance;
    21 int luminance;
    22 int w, h;
    22 int w, h;
       
    23 
       
    24 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
       
    25 static void quit(int rc)
       
    26 {
       
    27 	SDL_Quit();
       
    28 	exit(rc);
       
    29 }
    23 
    30 
    24 /* NOTE: These RGB conversion functions are not intended for speed,
    31 /* NOTE: These RGB conversion functions are not intended for speed,
    25          only as examples.
    32          only as examples.
    26 */
    33 */
    27 
    34 
   345 				argv += 2;
   352 				argv += 2;
   346 				argc -= 2;
   353 				argc -= 2;
   347 			} else {
   354 			} else {
   348 				fprintf(stderr,
   355 				fprintf(stderr,
   349 				"The -delay option requires an argument\n");
   356 				"The -delay option requires an argument\n");
   350 				exit(1);
   357 				return(1);
   351 			}
   358 			}
   352 		} else
   359 		} else
   353 		if ( strcmp(argv[1], "-width") == 0 ) {
   360 		if ( strcmp(argv[1], "-width") == 0 ) {
   354 			if ( argv[2] && ((w = atoi(argv[2])) > 0) ) {
   361 			if ( argv[2] && ((w = atoi(argv[2])) > 0) ) {
   355 				argv += 2;
   362 				argv += 2;
   356 				argc -= 2;
   363 				argc -= 2;
   357 			} else {
   364 			} else {
   358 				fprintf(stderr,
   365 				fprintf(stderr,
   359 				"The -width option requires an argument\n");
   366 				"The -width option requires an argument\n");
   360 				exit(1);
   367 				return(1);
   361 			}
   368 			}
   362 		} else
   369 		} else
   363 		if ( strcmp(argv[1], "-height") == 0 ) {
   370 		if ( strcmp(argv[1], "-height") == 0 ) {
   364 			if ( argv[2] && ((h = atoi(argv[2])) > 0) ) {
   371 			if ( argv[2] && ((h = atoi(argv[2])) > 0) ) {
   365 				argv += 2;
   372 				argv += 2;
   366 				argc -= 2;
   373 				argc -= 2;
   367 			} else {
   374 			} else {
   368 				fprintf(stderr,
   375 				fprintf(stderr,
   369 				"The -height option requires an argument\n");
   376 				"The -height option requires an argument\n");
   370 				exit(1);
   377 				return(1);
   371 			}
   378 			}
   372 		} else
   379 		} else
   373 		if ( strcmp(argv[1], "-bpp") == 0 ) {
   380 		if ( strcmp(argv[1], "-bpp") == 0 ) {
   374 			if ( argv[2] ) {
   381 			if ( argv[2] ) {
   375 				desired_bpp = atoi(argv[2]);
   382 				desired_bpp = atoi(argv[2]);
   376 				argv += 2;
   383 				argv += 2;
   377 				argc -= 2;
   384 				argc -= 2;
   378 			} else {
   385 			} else {
   379 				fprintf(stderr,
   386 				fprintf(stderr,
   380 				"The -bpp option requires an argument\n");
   387 				"The -bpp option requires an argument\n");
   381 				exit(1);
   388 				return(1);
   382 			}
   389 			}
   383 		} else
   390 		} else
   384 		if ( strcmp(argv[1], "-lum") == 0 ) {
   391 		if ( strcmp(argv[1], "-lum") == 0 ) {
   385 			if ( argv[2] ) {
   392 			if ( argv[2] ) {
   386 				luminance = atoi(argv[2]);
   393 				luminance = atoi(argv[2]);
   387 				argv += 2;
   394 				argv += 2;
   388 				argc -= 2;
   395 				argc -= 2;
   389 			} else {
   396 			} else {
   390 				fprintf(stderr,
   397 				fprintf(stderr,
   391 				"The -lum option requires an argument\n");
   398 				"The -lum option requires an argument\n");
   392 				exit(1);
   399 				return(1);
   393 			}
   400 			}
   394 		} else
   401 		} else
   395 		if ( strcmp(argv[1], "-format") == 0 ) {
   402 		if ( strcmp(argv[1], "-format") == 0 ) {
   396 			if ( argv[2] ) {
   403 			if ( argv[2] ) {
   397 				if(!strcmp(argv[2],"YV12"))
   404 				if(!strcmp(argv[2],"YV12"))
   405 				else if(!strcmp(argv[2],"YVYU"))
   412 				else if(!strcmp(argv[2],"YVYU"))
   406 					overlay_format = SDL_YVYU_OVERLAY;
   413 					overlay_format = SDL_YVYU_OVERLAY;
   407 				else
   414 				else
   408 				{
   415 				{
   409 					fprintf(stderr, "The -format option %s is not recognized\n",argv[2]);
   416 					fprintf(stderr, "The -format option %s is not recognized\n",argv[2]);
   410 					exit(1);
   417 					return(1);
   411 				}
   418 				}
   412 				argv += 2;
   419 				argv += 2;
   413 				argc -= 2;
   420 				argc -= 2;
   414 			} else {
   421 			} else {
   415 				fprintf(stderr,
   422 				fprintf(stderr,
   416 				"The -format option requires an argument\n");
   423 				"The -format option requires an argument\n");
   417 				exit(1);
   424 				return(1);
   418 			}
   425 			}
   419 		} else
   426 		} else
   420 		if ( strcmp(argv[1], "-hw") == 0 ) {
   427 		if ( strcmp(argv[1], "-hw") == 0 ) {
   421 			video_flags |= SDL_HWSURFACE;
   428 			video_flags |= SDL_HWSURFACE;
   422 			argv += 1;
   429 			argv += 1;
   437 			argv += 1;
   444 			argv += 1;
   438 			argc -= 1;
   445 			argc -= 1;
   439 		} else
   446 		} else
   440 		if (( strcmp(argv[1], "-help") == 0 ) || (strcmp(argv[1], "-h") == 0)) {
   447 		if (( strcmp(argv[1], "-help") == 0 ) || (strcmp(argv[1], "-h") == 0)) {
   441                         PrintUsage(argv0);
   448                         PrintUsage(argv0);
   442                         exit(1);
   449                         return(1);
   443 		} else
   450 		} else
   444 		if ( strcmp(argv[1], "-fullscreen") == 0 ) {
   451 		if ( strcmp(argv[1], "-fullscreen") == 0 ) {
   445 			video_flags |= SDL_FULLSCREEN;
   452 			video_flags |= SDL_FULLSCREEN;
   446 			argv += 1;
   453 			argv += 1;
   447 			argc -= 1;
   454 			argc -= 1;
   449 			break;
   456 			break;
   450 	}
   457 	}
   451 	if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
   458 	if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
   452 		fprintf(stderr,
   459 		fprintf(stderr,
   453 			"Couldn't initialize SDL: %s\n", SDL_GetError());
   460 			"Couldn't initialize SDL: %s\n", SDL_GetError());
   454 		exit(1);
   461 		return(1);
   455 	}
   462 	}
   456 	atexit(SDL_Quit);			/* Clean up on exit */
       
   457 
   463 
   458 	/* Initialize the display */
   464 	/* Initialize the display */
   459 	screen = SDL_SetVideoMode(w, h, desired_bpp, video_flags);
   465 	screen = SDL_SetVideoMode(w, h, desired_bpp, video_flags);
   460 	if ( screen == NULL ) {
   466 	if ( screen == NULL ) {
   461 		fprintf(stderr, "Couldn't set %dx%dx%d video mode: %s\n",
   467 		fprintf(stderr, "Couldn't set %dx%dx%d video mode: %s\n",
   462 					w, h, desired_bpp, SDL_GetError());
   468 					w, h, desired_bpp, SDL_GetError());
   463 		exit(1);
   469 		quit(1);
   464 	}
   470 	}
   465 	printf("Set%s %dx%dx%d mode\n",
   471 	printf("Set%s %dx%dx%d mode\n",
   466 			screen->flags & SDL_FULLSCREEN ? " fullscreen" : "",
   472 			screen->flags & SDL_FULLSCREEN ? " fullscreen" : "",
   467 			screen->w, screen->h, screen->format->BitsPerPixel);
   473 			screen->w, screen->h, screen->format->BitsPerPixel);
   468 	printf("(video surface located in %s memory)\n",
   474 	printf("(video surface located in %s memory)\n",
   479 	bmpfile=(argv[1]?argv[1]:"sample.bmp");
   485 	bmpfile=(argv[1]?argv[1]:"sample.bmp");
   480 	pic = SDL_LoadBMP(bmpfile);
   486 	pic = SDL_LoadBMP(bmpfile);
   481 	if ( pic == NULL ) {
   487 	if ( pic == NULL ) {
   482 		fprintf(stderr, "Couldn't load %s: %s\n", bmpfile,
   488 		fprintf(stderr, "Couldn't load %s: %s\n", bmpfile,
   483 							SDL_GetError());
   489 							SDL_GetError());
   484 		exit(1);
   490 		quit(1);
   485 	}
   491 	}
   486 
   492 
   487 	/* Convert the picture to 32bits, for easy conversion */
   493 	/* Convert the picture to 32bits, for easy conversion */
   488 	{
   494 	{
   489 		SDL_Surface *newsurf;
   495 		SDL_Surface *newsurf;
   516 		newsurf=SDL_ConvertSurface(pic, &format, SDL_SWSURFACE);
   522 		newsurf=SDL_ConvertSurface(pic, &format, SDL_SWSURFACE);
   517 		if(!newsurf)
   523 		if(!newsurf)
   518 		{
   524 		{
   519 			fprintf(stderr, "Couldn't convert picture to 32bits RGB: %s\n",
   525 			fprintf(stderr, "Couldn't convert picture to 32bits RGB: %s\n",
   520 							SDL_GetError());
   526 							SDL_GetError());
   521 			exit(1);
   527 			quit(1);
   522 		}
   528 		}
   523 		SDL_FreeSurface(pic);
   529 		SDL_FreeSurface(pic);
   524 		pic=newsurf;
   530 		pic=newsurf;
   525 	}
   531 	}
   526 	
   532 	
   527 	/* Create the overlay */
   533 	/* Create the overlay */
   528 	overlay = SDL_CreateYUVOverlay(pic->w, pic->h, overlay_format, screen);
   534 	overlay = SDL_CreateYUVOverlay(pic->w, pic->h, overlay_format, screen);
   529 	if ( overlay == NULL ) {
   535 	if ( overlay == NULL ) {
   530 		fprintf(stderr, "Couldn't create overlay: %s\n", SDL_GetError());
   536 		fprintf(stderr, "Couldn't create overlay: %s\n", SDL_GetError());
   531 		exit(1);
   537 		quit(1);
   532 	}
   538 	}
   533 	printf("Created %dx%dx%d %s %s overlay\n",overlay->w,overlay->h,overlay->planes,
   539 	printf("Created %dx%dx%d %s %s overlay\n",overlay->w,overlay->h,overlay->planes,
   534 			overlay->hw_overlay?"hardware":"software",
   540 			overlay->hw_overlay?"hardware":"software",
   535 			overlay->format==SDL_YV12_OVERLAY?"YV12":
   541 			overlay->format==SDL_YV12_OVERLAY?"YV12":
   536 			overlay->format==SDL_IYUV_OVERLAY?"IYUV":
   542 			overlay->format==SDL_IYUV_OVERLAY?"IYUV":
   564 		case SDL_IYUV_OVERLAY:
   570 		case SDL_IYUV_OVERLAY:
   565 			ConvertRGBtoIYUV(pic,overlay,monochrome,luminance);
   571 			ConvertRGBtoIYUV(pic,overlay,monochrome,luminance);
   566 			break;
   572 			break;
   567 		default:
   573 		default:
   568 			printf("cannot convert RGB picture to obtained YUV format!\n");
   574 			printf("cannot convert RGB picture to obtained YUV format!\n");
   569 			exit(1);
   575 			quit(1);
   570 			break;
   576 			break;
   571 	}
   577 	}
   572 #ifdef BENCHMARK_SDL
   578 #ifdef BENCHMARK_SDL
   573 	now = SDL_GetTicks();
   579 	now = SDL_GetTicks();
   574 	printf("Conversion Time: %d milliseconds\n", now-then);
   580 	printf("Conversion Time: %d milliseconds\n", now-then);
   582 #ifdef BENCHMARK_SDL
   588 #ifdef BENCHMARK_SDL
   583 	now = SDL_GetTicks();
   589 	now = SDL_GetTicks();
   584 	printf("Time: %d milliseconds\n", now-then);
   590 	printf("Time: %d milliseconds\n", now-then);
   585 #endif
   591 #endif
   586 	SDL_Delay(delay*1000);
   592 	SDL_Delay(delay*1000);
       
   593 	SDL_Quit();
   587 	return(0);
   594 	return(0);
   588 }
   595 }
   589 
   596