Blame src/tests/io-run.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
/* Derived from io-seek.c; perform an oggz_run on a stream
Packit a38265
   containing a Vorbis b_o_s packet without OGGZ_AUTO enabled
Packit a38265
   to check that the oggz_auto.c functions will not cause a
Packit a38265
   problem in this mode.  Theora, Speex et al. tests to be added.
Packit a38265
*/
Packit a38265
Packit a38265
#include "config.h"
Packit a38265
Packit a38265
#include <stdio.h>
Packit a38265
#include <string.h>
Packit a38265
Packit a38265
#include "oggz/oggz.h"
Packit a38265
Packit a38265
#include "oggz_tests.h"
Packit a38265
Packit a38265
/* #define DEBUG */
Packit a38265
Packit a38265
#define DATA_BUF_LEN 1024
Packit a38265
Packit a38265
static long serialno;
Packit a38265
static int read_called = 0;
Packit a38265
Packit a38265
static int offset_end = 0;
Packit a38265
static int my_offset = 0;
Packit a38265
Packit a38265
/* A nonsensical Vorbis ident header.  For testing purposes
Packit a38265
   we may as well try to break something. */
Packit a38265
static unsigned char vorbis_bos[] = {1, 'v', 'o', 'r', 'b', 'i', 's',
Packit a38265
		     0, 0, 0, 0, /*version*/
Packit a38265
		     0, /* channels */
Packit a38265
		     0, 0, 0, 0, /* sample rate */
Packit a38265
		     0, 0, 0, 0, /* br max */
Packit a38265
		     0, 0, 0, 0, /* br nom */
Packit a38265
		     0, 0, 0, 0, /* br_min */
Packit a38265
		     0,          /* blocksize 0/1 */
Packit a38265
		     1           /* Framing bit */
Packit a38265
};
Packit a38265
		     
Packit a38265
Packit a38265
static int
Packit a38265
hungry (OGGZ * oggz, int empty, void * user_data)
Packit a38265
{
Packit a38265
  unsigned char buf[1];
Packit a38265
  ogg_packet op;
Packit a38265
  static int iter = 0;
Packit a38265
  static long b_o_s = 1;
Packit a38265
  static long e_o_s = 0;
Packit a38265
Packit a38265
  if (iter > 10) return 1;
Packit a38265
Packit a38265
  buf[0] = 'a' + iter;
Packit a38265
Packit a38265
  op.packet = buf;
Packit a38265
  op.bytes = 1;
Packit a38265
  op.b_o_s = b_o_s;
Packit a38265
  op.e_o_s = e_o_s;
Packit a38265
  op.granulepos = iter;
Packit a38265
  op.packetno = iter;
Packit a38265
Packit a38265
  if(b_o_s) {
Packit a38265
    op.packet = vorbis_bos;
Packit a38265
    op.bytes = sizeof vorbis_bos;
Packit a38265
  }
Packit a38265
Packit a38265
  /* Main check */
Packit a38265
   if (oggz_write_feed (oggz, &op, serialno, 0, NULL) != 0)
Packit a38265
    FAIL ("Oggz write failed");
Packit a38265
Packit a38265
  iter++;
Packit a38265
  b_o_s = 0;
Packit a38265
  if (iter == 10) e_o_s = 1;
Packit a38265
  
Packit a38265
  return 0;
Packit a38265
}
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
  static int iter = 0;
Packit a38265
  static long b_o_s = 1;
Packit a38265
  static long e_o_s = 0;
Packit a38265
Packit a38265
#ifdef DEBUG
Packit a38265
  printf ("%08" PRI_OGGZ_OFF_T "x: serialno %010lu, "
Packit a38265
	  "granulepos %" PRId64 ", packetno %" PRId64,
Packit a38265
	  oggz_tell (oggz), serialno, op->granulepos, op->packetno);
Packit a38265
Packit a38265
  if (op->b_o_s) {
Packit a38265
    printf (" *** bos");
Packit a38265
  }
Packit a38265
Packit a38265
  if (op->e_o_s) {
Packit a38265
    printf (" *** eos");
Packit a38265
  }
Packit a38265
Packit a38265
  printf ("\n");
Packit a38265
#endif
Packit a38265
Packit a38265
  //  if (op->bytes != 1 || op->b_o_s && op->bytes == sizeof vorbis_bos )
Packit a38265
  //  FAIL ("Packet too long");
Packit a38265
Packit a38265
  //if (op->packet[0] != 'a' + iter)
Packit a38265
  //  FAIL ("Packet contains incorrect data");
Packit a38265
Packit a38265
  if ((op->b_o_s == 0) != (b_o_s == 0))
Packit a38265
    FAIL ("Packet has incorrect b_o_s");
Packit a38265
Packit a38265
  if ((op->e_o_s == 0) != (e_o_s == 0))
Packit a38265
    FAIL ("Packet has incorrect e_o_s");
Packit a38265
Packit a38265
  if (op->granulepos != -1 && op->granulepos != iter)
Packit a38265
    FAIL ("Packet has incorrect granulepos");
Packit a38265
Packit a38265
  if (op->packetno != iter)
Packit a38265
    FAIL ("Packet has incorrect packetno");
Packit a38265
Packit a38265
  iter++;
Packit a38265
  b_o_s = 0;
Packit a38265
  if (iter == 10) {
Packit a38265
    e_o_s = 1;
Packit a38265
  } else if (iter == 11) {
Packit a38265
    iter = 0;
Packit a38265
    b_o_s = 1;
Packit a38265
    e_o_s = 0;
Packit a38265
  }
Packit a38265
Packit a38265
  return 0;
Packit a38265
}
Packit a38265
Packit a38265
static size_t
Packit a38265
my_io_read (void * user_handle, void * buf, size_t n)
Packit a38265
{
Packit a38265
  unsigned char * data_buf = (unsigned char *)user_handle;
Packit a38265
  int len;
Packit a38265
Packit a38265
  /* Mark that the read IO method was actually used */
Packit a38265
  read_called++;
Packit a38265
Packit a38265
  len = MIN ((int)n, offset_end - my_offset);
Packit a38265
  memcpy (buf, &data_buf[my_offset], len);
Packit a38265
Packit a38265
  my_offset += len;
Packit a38265
Packit a38265
  return len;
Packit a38265
}
Packit a38265
Packit a38265
static int
Packit a38265
my_io_seek (void * user_handle, long offset, int whence)
Packit a38265
{
Packit a38265
  switch (whence) {
Packit a38265
  case SEEK_SET:
Packit a38265
    my_offset = offset;
Packit a38265
    break;
Packit a38265
  case SEEK_CUR:
Packit a38265
    my_offset += offset;
Packit a38265
    break;
Packit a38265
  case SEEK_END:
Packit a38265
    my_offset = offset_end + offset;
Packit a38265
    break;
Packit a38265
  default:
Packit a38265
    return -1;
Packit a38265
  }
Packit a38265
Packit a38265
  return 0;
Packit a38265
}
Packit a38265
Packit a38265
static long
Packit a38265
my_io_tell (void * user_handle)
Packit a38265
{
Packit a38265
  return my_offset;
Packit a38265
}
Packit a38265
Packit a38265
int
Packit a38265
main (int argc, char * argv[])
Packit a38265
{
Packit a38265
  OGGZ * reader, * writer;
Packit a38265
  unsigned char data_buf[DATA_BUF_LEN];
Packit a38265
  long n;
Packit a38265
Packit a38265
  INFO ("Testing oggz_run works without OGGZ_AUTO");
Packit a38265
Packit a38265
  writer = oggz_new (OGGZ_WRITE);
Packit a38265
  if (writer == NULL)
Packit a38265
    FAIL("newly created OGGZ writer == NULL");
Packit a38265
Packit a38265
  serialno = oggz_serialno_new (writer);
Packit a38265
Packit a38265
  if (oggz_write_set_hungry_callback (writer, hungry, 1, NULL) == -1)
Packit a38265
    FAIL("Could not set hungry callback");
Packit a38265
Packit a38265
  reader = oggz_new (OGGZ_READ);
Packit a38265
  if (reader == NULL)
Packit a38265
    FAIL("newly created OGGZ reader == NULL");
Packit a38265
Packit a38265
  oggz_io_set_read (reader, my_io_read, data_buf);
Packit a38265
  oggz_io_set_seek (reader, my_io_seek, data_buf);
Packit a38265
  oggz_io_set_tell (reader, my_io_tell, data_buf);
Packit a38265
Packit a38265
  oggz_set_read_callback (reader, -1, read_packet, NULL);
Packit a38265
Packit a38265
  n = oggz_write_output (writer, data_buf, DATA_BUF_LEN);
Packit a38265
Packit a38265
  if (n >= DATA_BUF_LEN)
Packit a38265
    FAIL("Too much data generated by writer");
Packit a38265
Packit a38265
  offset_end = n;
Packit a38265
Packit a38265
  if ( oggz_run (reader) != 0 )
Packit a38265
    FAIL("oggz_run did not complete");
Packit a38265
Packit a38265
  if (read_called == 0)
Packit a38265
    FAIL("Read method ignored");
Packit a38265
Packit a38265
  if (oggz_seek (reader, 0, SEEK_SET) != 0)
Packit a38265
    FAIL("Seek failure");
Packit a38265
Packit a38265
  read_called = 0;
Packit a38265
Packit a38265
  oggz_read (reader, n);
Packit a38265
Packit a38265
  if (read_called == 0)
Packit a38265
    FAIL("Read method ignored after seeking");
Packit a38265
Packit a38265
  if (oggz_close (reader) != 0)
Packit a38265
    FAIL("Could not close OGGZ reader");
Packit a38265
Packit a38265
  if (oggz_close (writer) != 0)
Packit a38265
    FAIL("Could not close OGGZ writer");
Packit a38265
Packit a38265
  exit (0);
Packit a38265
}