tp2.c 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include "tp2.h"
  5. #include "helper/tiempo.h"
  6. #include "helper/libbmp.h"
  7. #include "helper/utils.h"
  8. #include "helper/imagenes.h"
  9. #define N_ENTRADAS_diff 2
  10. #define N_ENTRADAS_blur 1
  11. DECLARAR_FILTRO(diff)
  12. DECLARAR_FILTRO(blur)
  13. filtro_t filtros[] = {
  14. DEFINIR_FILTRO(diff) ,
  15. DEFINIR_FILTRO(blur) ,
  16. {0,0,0,0,0}
  17. };
  18. int main( int argc, char** argv ) {
  19. configuracion_t config;
  20. procesar_opciones(argc, argv, &config);
  21. // Imprimo info
  22. if (!config.nombre)
  23. {
  24. printf ( "Procesando...\n");
  25. printf ( " Filtro : %s\n", config.nombre_filtro);
  26. printf ( " Implementación : %s\n", C_ASM( (&config) ) );
  27. printf ( " Archivo de entrada : %s\n", config.archivo_entrada);
  28. }
  29. filtro_t *filtro = detectar_filtro(&config);
  30. if (filtro != NULL) {
  31. filtro->leer_params(&config, argc, argv);
  32. correr_filtro_imagen(&config, filtro->aplicador);
  33. }
  34. return 0;
  35. }
  36. filtro_t* detectar_filtro(configuracion_t *config)
  37. {
  38. for (int i = 0; filtros[i].nombre != 0; i++)
  39. {
  40. if (strcmp(config->nombre_filtro, filtros[i].nombre) == 0)
  41. return &filtros[i];
  42. }
  43. fprintf(stderr, "Filtro desconocido\n");
  44. return NULL; // avoid C warning
  45. }
  46. void imprimir_tiempos_ejecucion(unsigned long long int start, unsigned long long int end, int cant_iteraciones) {
  47. unsigned long long int cant_ciclos = end-start;
  48. printf("Tiempo de ejecución:\n");
  49. printf(" Comienzo : %llu\n", start);
  50. printf(" Fin : %llu\n", end);
  51. printf(" # iteraciones : %d\n", cant_iteraciones);
  52. printf(" # de ciclos insumidos totales : %llu\n", cant_ciclos);
  53. printf(" # de ciclos insumidos por llamada : %.3f\n", (float)cant_ciclos/(float)cant_iteraciones);
  54. }
  55. void correr_filtro_imagen(configuracion_t *config, aplicador_fn_t aplicador)
  56. {
  57. snprintf(config->archivo_salida, sizeof (config->archivo_salida), "%s/%s.%s.%s%s.bmp",
  58. config->carpeta_salida, basename(config->archivo_entrada),
  59. config->nombre_filtro, C_ASM(config), config->extra_archivo_salida );
  60. if (config->nombre)
  61. {
  62. printf("%s\n", basename(config->archivo_salida));
  63. }
  64. else
  65. {
  66. imagenes_abrir(config);
  67. unsigned long long start, end;
  68. MEDIR_TIEMPO_START(start)
  69. for (int i = 0; i < config->cant_iteraciones; i++) {
  70. aplicador(config);
  71. }
  72. MEDIR_TIEMPO_STOP(end)
  73. imagenes_guardar(config);
  74. imagenes_liberar(config);
  75. imprimir_tiempos_ejecucion(start, end, config->cant_iteraciones);
  76. }
  77. }