Blame src/tests/seek-stress.c

Packit a38265
/*
Packit a38265
   Copyright (C) 2003 Commonwealth Scientific and Industrial Research
Packit a38265
   Organisation (CSIRO) Australia
Packit a38265
Packit a38265
   Redistribution and use in source and binary forms, with or without
Packit a38265
   modification, are permitted provided that the following conditions
Packit a38265
   are met:
Packit a38265
Packit a38265
   - Redistributions of source code must retain the above copyright
Packit a38265
   notice, this list of conditions and the following disclaimer.
Packit a38265
Packit a38265
   - Redistributions in binary form must reproduce the above copyright
Packit a38265
   notice, this list of conditions and the following disclaimer in the
Packit a38265
   documentation and/or other materials provided with the distribution.
Packit a38265
Packit a38265
   - Neither the name of CSIRO Australia nor the names of its
Packit a38265
   contributors may be used to endorse or promote products derived from
Packit a38265
   this software without specific prior written permission.
Packit a38265
Packit a38265
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit a38265
   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit a38265
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
Packit a38265
   PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE ORGANISATION OR
Packit a38265
   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
Packit a38265
   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
Packit a38265
   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
Packit a38265
   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Packit a38265
   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Packit a38265
   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Packit a38265
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit a38265
*/
Packit a38265
Packit a38265
#include "config.h"
Packit a38265
Packit a38265
#include <stdio.h>
Packit a38265
#include <stdlib.h>
Packit a38265
#include <string.h>
Packit a38265
Packit a38265
#ifdef HAVE_INTTYPES_H
Packit a38265
#  include <inttypes.h>
Packit a38265
#else
Packit a38265
#  define PRId64 "I64d"
Packit a38265
#endif
Packit a38265
Packit a38265
#include "oggz/oggz.h"
Packit a38265
Packit a38265
#include "oggz_tests.h"
Packit a38265
Packit a38265
static int has_skeleton = 0;
Packit a38265
static int verbose = 0;
Packit a38265
Packit a38265
static int
Packit a38265
read_packet (OGGZ * oggz, oggz_packet * zp, long serialno, void * user_data)
Packit a38265
{
Packit a38265
  ogg_packet * op = &zp->op;
Packit a38265
  unsigned char * header = op->packet;
Packit a38265
Packit a38265
  if (op->b_o_s) {
Packit a38265
    if (op->bytes >= 8 && !strncmp ((char *)header, "fishead", 8))
Packit a38265
      has_skeleton = 1;
Packit a38265
    return OGGZ_CONTINUE;
Packit a38265
  } else if (op->e_o_s) {
Packit a38265
    return OGGZ_STOP_OK;
Packit a38265
  } else {
Packit a38265
    if (has_skeleton) return OGGZ_CONTINUE;
Packit a38265
    else return OGGZ_STOP_OK;
Packit a38265
  }
Packit a38265
  return OGGZ_CONTINUE;
Packit a38265
}
Packit a38265
Packit a38265
static ogg_int64_t
Packit a38265
try_seek_units (OGGZ * oggz, ogg_int64_t units)
Packit a38265
{
Packit a38265
  ogg_int64_t result, diff;
Packit a38265
Packit a38265
  if (verbose)
Packit a38265
    printf ("\tAttempt seek to %" PRId64 " ms:\n", units);
Packit a38265
Packit a38265
  result = oggz_seek_units (oggz, units, SEEK_SET);
Packit a38265
  diff = result - units;
Packit a38265
Packit a38265
  if (verbose)
Packit a38265
    printf ("\t%0" PRId64 "x: %" PRId64 " ms (%+" PRId64 " ms)\n",
Packit a38265
	    oggz_tell (oggz), oggz_tell_units (oggz), diff);
Packit a38265
Packit a38265
  if (result < 0) {
Packit a38265
    FAIL ("Seek failure\n");
Packit a38265
  }
Packit a38265
Packit a38265
  if (result != oggz_tell_units (oggz))
Packit a38265
    FAIL ("oggz_seek_units() result != oggz_tell_units()\n");
Packit a38265
Packit a38265
  if (units == 0 && result != 0)
Packit a38265
    FAIL ("Failed seeking to 0");
Packit a38265
Packit a38265
  if (diff > 0)
Packit a38265
    WARN ("Seek result too late");
Packit a38265
Packit a38265
  return units;
Packit a38265
}
Packit a38265
Packit a38265
int
Packit a38265
main (int argc, char * argv[])
Packit a38265
{
Packit a38265
  OGGZ * oggz;
Packit a38265
  ogg_int64_t max_units;
Packit a38265
  char * filename = NULL;
Packit a38265
  int i;
Packit a38265
  long n;
Packit a38265
Packit a38265
  for (i = 1; i < argc; i++) {
Packit a38265
    if (!strcmp (argv[i], "--verbose")) {
Packit a38265
      verbose = 1;
Packit a38265
    } else {
Packit a38265
      filename = argv[i];
Packit a38265
    }
Packit a38265
  }
Packit a38265
Packit a38265
  if (filename == NULL) {
Packit a38265
    printf ("usage: %s [--verbose] filename\n", argv[0]);
Packit a38265
    exit(1);
Packit a38265
  }
Packit a38265
Packit a38265
  if ((oggz = oggz_open (filename, OGGZ_READ | OGGZ_AUTO)) == NULL) {
Packit a38265
    printf ("%s: unable to open file %s\n", argv[0], filename);
Packit a38265
    exit (1);
Packit a38265
  }
Packit a38265
Packit a38265
  printf ("Testing %s ...\n", filename);
Packit a38265
Packit a38265
  oggz_set_read_callback (oggz, -1, read_packet, NULL);
Packit a38265
Packit a38265
  while ((n = oggz_read (oggz, 1024)) > 0);
Packit a38265
  oggz_set_data_start (oggz, oggz_tell (oggz));
Packit a38265
  
Packit a38265
  max_units = oggz_seek_units (oggz, 0, SEEK_END);
Packit a38265
  if (verbose)
Packit a38265
    printf ("\t%0" PRId64 "x: %" PRId64 " ms\n",
Packit a38265
            oggz_tell (oggz), oggz_tell_units (oggz));
Packit a38265
Packit a38265
  try_seek_units (oggz, max_units / 2);
Packit a38265
  try_seek_units (oggz, 0);
Packit a38265
  try_seek_units (oggz, max_units / 3);
Packit a38265
  try_seek_units (oggz, 3 * max_units / 4);
Packit a38265
  try_seek_units (oggz, 0);
Packit a38265
  try_seek_units (oggz, 999 * max_units / 1000);
Packit a38265
  try_seek_units (oggz, max_units / 100);
Packit a38265
Packit a38265
  oggz_close (oggz);
Packit a38265
Packit a38265
  exit (0);
Packit a38265
}