Beispiel #1
0
int loop_exit(loop_handle *hd)
{
  int i;

  hd->running = FALSE;

  if(hd->svdst != NULL) {
    if (hd->fifodst != NULL) {
      sv_fifo_free(hd->svdst, hd->fifodst);
      hd->fifodst = NULL;
    }
    if(hd->svdst != hd->svsrc) {
      sv_close(hd->svdst);
      hd->svdst = NULL;
    }
  }

  if (hd->svsrc != NULL) {
    if (hd->fifosrc != NULL) {
      sv_fifo_free(hd->svsrc, hd->fifosrc);
      hd->fifosrc = NULL;
    }
    sv_close(hd->svsrc);
    hd->svsrc = NULL;
  }

  if(hd->nobuffer_org) {
    free(hd->nobuffer_org);
  }

  if(hd->blackbuffer_org) {
    free(hd->blackbuffer_org);
  }

  for(i = 0; i < MAX_ID; i++) {
    if(hd->ancbuffer_org[i]) {
      free(hd->ancbuffer_org[i]);
    }
    if(hd->livebuffer_org[i]) {
      free(hd->livebuffer_org[i]);
    }
    if(hd->banc) {
      //If there are valid packets delete them
      if( hd->anclist[i].next ) {
        //Delete all elements in list
        delete_element( i, hd->anclist[i].next );
      }
    }
  }

  dvs_mutex_free(&hd->common.lock);
  dvs_cond_free(&hd->common.ready);

  printf("exiting dma loop through\n");

  return 0;
}
Beispiel #2
0
static void cleanup_exit(int res, sv_handle *sv)
{
    printf("cleaning up\n");
    // attempt to avoid lockup when stopping playback
    if (sv != NULL)
    {
        // sv_fifo_wait does nothing for record, only useful for playback
        //sv_fifo_wait(sv, poutput);
        sv_close(sv);
    }

    printf("done - exiting\n");
    exit(res);
}
Beispiel #3
0
int main(int argc, char ** argv)
{
  sv_handle * sv    = NULL;
  int         res   = SV_OK;
  int         bsavemode;
  int         bhosttransfer;
  int         bsetbuffersize = 0;
  int         nframes;
  sv_storageinfo     storage;
  char *      buffer;
  char *      buffer_org;
  int         buffersize;
  int         us;
  int         i, j;
#ifdef WIN32
  LARGE_INTEGER frequency;
  LARGE_INTEGER timestart;
  LARGE_INTEGER timeend;
  QueryPerformanceFrequency(&frequency);
#else
  struct timeval timestart;
  struct timeval timeend;
  struct timezone tz;
#endif


  if(argc < 2) {
    usage();
    return -1;
  }

  if(!strcmp(argv[1], "load")) {
    bsavemode     = 0;
    bhosttransfer = 1;
  } else if(!strcmp(argv[1], "save")) {
    bsavemode     = 1;
    bhosttransfer = 1;
  } else if(!strcmp(argv[1], "read")) {
    bsavemode     = 0;
    bhosttransfer = 0;
  } else if(!strcmp(argv[1], "write")) {
    bsavemode     = 1;
    bhosttransfer = 0;
  } else {
    usage();
    return -1;
  }

#ifndef WIN32
  signal(SIGINT,  signal_handler);
  signal(SIGKILL, signal_handler);
#endif

  res = sv_openex(&sv, "", SV_OPENPROGRAM_DEMOPROGRAM, SV_OPENTYPE_DEFAULT, 0, 0);
  if(res != SV_OK) {
    printf("dmaspeed: Error '%s' opening video device", sv_geterrortext(res));
    return -1;
  } 

  res = sv_storage_status(sv, 0, NULL, &storage, sizeof(storage), 0);

  if(bhosttransfer) {
    buffersize = storage.fieldsize[0] + storage.fieldsize[1];
    if(argc >= 3) {
      nframes = atoi(argv[2]);
    } else {
      nframes = 10;
    }
  } else {
    if(argc >= 3) {
      buffersize = atoi(argv[2]);
      if(buffersize == 0) {
        buffersize = strtol(argv[2], NULL, 16);
      }
      buffersize = buffersize & ~(ALIGNMENT - 1);
      bsetbuffersize = 1;
    } else {
      buffersize = 0x200000;
    }
    nframes    = 1;
  }

  buffer_org = malloc(buffersize + ALIGNMENT + alignment[0]);
  buffer = (void*)(((uintptr)buffer_org + ALIGNMENT - 1) & ~(ALIGNMENT-1));

  if(buffer == NULL) {
    fprintf(stderr, "dmaspeed: Failure to allocate video buffer\n");
    res = SV_ERROR_MALLOC;
  }

  if(res == SV_OK) {
    if(bhosttransfer) {
      if(bsavemode) {
        printf("dmaspeed: frames     %d frames, Device -> CPUMemory\n", nframes);
      } else {
        printf("dmaspeed: frames     %d frames, CPUMemory -> Device\n", nframes);
      } 
      printf("dmaspeed: framesize  %d\n", buffersize);
      printf("dmaspeed: totalsize  %d bytes total\n", nframes * buffersize);
  
#ifdef WIN32
      QueryPerformanceCounter(&timestart);
#else
      gettimeofday(&timestart, &tz);
#endif

      res = sv_transfertest(sv, bsavemode, buffer, buffersize, 0, nframes, storage.storagexsize, storage.storageysize, storage.nbits);

#ifdef WIN32
      QueryPerformanceCounter(&timeend);
#else
      gettimeofday(&timeend, &tz);
#endif

      if(res == SV_ERROR_PARAMETER) {
        printf("dmaspeed: returned SV_ERROR_PARAMTER, did you specify more frames than in memory ?\n");
      } else if(res == SV_OK) {
#ifdef WIN32
#ifdef VERBOSE
        printf("dmaspeed: frequency  %d\n", (int)frequency.QuadPart);
        printf("dmaspeed: time       %d\n", (int)(timeend.QuadPart - timestart.QuadPart));
#endif

        if(frequency.QuadPart) {
          us = (int)(((timeend.QuadPart - timestart.QuadPart) * 1000000) / frequency.QuadPart);
        } else {
          us = 0;
        }
#else
        us = (int)((timeend.tv_sec * 1000000 + timeend.tv_usec) - (timestart.tv_sec * 1000000 + timestart.tv_usec));

#ifdef VERBOSE
        printf("dmaspeed: frequency  %d\n", 1000000);
        printf("dmaspeed: time       %d\n", us);
#endif
#endif

        if(us) {
          printf("dmaspeed: %d us %d B/s %d MB/s\n", us, (int)(((int64)nframes * buffersize * 1000000) / us), (int)(((int64)nframes * buffersize) / us));
        } else {
          printf("dmaspeed: Error 0 us execution time ?\n");
        }
      }
    } else {
      sv_memory_dma(sv, bsavemode, (void*)((uintptr)buffer), 0x100000, buffersize, NULL);

      for(i = 0; (res == SV_OK) && (i < arraysize(alignment)); i++) {
#ifdef WIN32
        QueryPerformanceCounter(&timestart);
#else
        gettimeofday(&timestart, &tz);
#endif
        if(bsetbuffersize) {
          res = sv_memory_dma(sv, bsavemode, (void*)((uintptr)buffer+alignment[i]), 0x100000, buffersize, NULL);
        } else {
          res = sv_memory_dma(sv, bsavemode, (void*)((uintptr)buffer), 0x100000, buffersize, NULL);
        }

        if((res != SV_OK) && (res != SV_ERROR_BUFFER_NOTALIGNED)) {
          fprintf(stderr, "sv_memory_dma failed: "); sv_errorprint(sv, res);
        }
#ifdef WIN32
        QueryPerformanceCounter(&timeend);
        if(frequency.QuadPart) {
          us = (int)(((timeend.QuadPart - timestart.QuadPart) * 1000000) / frequency.QuadPart);
        } else {
          us = 0;
        }
#else
        gettimeofday(&timeend, &tz);

        us = (int)((timeend.tv_sec * 1000000 + timeend.tv_usec) - (timestart.tv_sec * 1000000 + timestart.tv_usec));
#endif
        resultus[i] = us;
      }

      j = i - 1;
      if(res == SV_ERROR_BUFFER_NOTALIGNED) {
        res = SV_OK;
      }

      if(bsetbuffersize) {
        for(i = 0; (i < arraysize(alignment)) && (i < j); i++) {
          if(resultus[i]) {
            printf("dmaspeed %3d e6/s  alignment:%08x/%6d time %d us\n", buffersize / resultus[i], alignment[i], alignment[i], resultus[i]);
          } else {
            printf("dmaspeed %3d e6/s  alignment:%08x/%6d time %d us ****\n", 0, alignment[i], alignment[i], 0);
          }
        } 
      } else {
        for(us = 0, i = 0; (i < arraysize(alignment)) && (i < j); i++) {
          us += resultus[i];
        }
        printf("Transferspeed: %3d e6/s %s\n", (int)(buffersize / (us / arraysize(alignment))), bsavemode?"CPUMemory->Device":"Device->CPUMemory");
      } 
    }
  } else {
    printf("dmaspeed: returned %s\n", sv_geterrortext(res));
  }
  sv_close(sv);

  free(buffer_org);

  if(res != SV_OK) {
    sv_errorprint(sv, res);
  }

  if(res == SV_OK) {
    return 0;  
  } else {
    return -1;
  }
}