|
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 <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
|
|
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 |
/* 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)
|
|
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) e_o_s = 1;
|
|
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 |
static int offset = 0;
|
|
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, DATA_BUF_LEN - offset);
|
|
Packit |
a38265 |
memcpy (buf, &data_buf[offset], len);
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
offset += len;
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
return len;
|
|
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 override of IO reading");
|
|
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 |
|
|
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 |
oggz_read (reader, n);
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
if (read_called == 0)
|
|
Packit |
a38265 |
FAIL("Read method ignored");
|
|
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 |
}
|