|
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 PACKET_SIZE 3000
|
|
Packit |
a38265 |
#define READ_SIZE 9000
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
static long serialno;
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
static int
|
|
Packit |
a38265 |
hungry (OGGZ * oggz, int empty, void * user_data)
|
|
Packit |
a38265 |
{
|
|
Packit |
a38265 |
unsigned char buf[PACKET_SIZE];
|
|
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 |
memset (buf, 'a' + iter, PACKET_SIZE);
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
op.packet = buf;
|
|
Packit |
a38265 |
op.bytes = PACKET_SIZE;
|
|
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 != PACKET_SIZE)
|
|
Packit |
a38265 |
FAIL ("Packet has incorrect size");
|
|
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 |
if (iter % 3 == 0) return OGGZ_STOP_OK;
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
return OGGZ_CONTINUE;
|
|
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 buf[READ_SIZE];
|
|
Packit |
a38265 |
long n, remaining, err;
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
INFO ("Testing ability to pause while reading (OGGZ_STOP_OK)");
|
|
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_set_read_callback (reader, -1, read_packet, NULL);
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
while ((remaining = oggz_write_output (writer, buf, READ_SIZE)) > 0) {
|
|
Packit |
a38265 |
n = oggz_read_input (reader, buf, remaining);
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
if (n == OGGZ_ERR_READ_STOP_OK) {
|
|
Packit |
a38265 |
INFO ("+ Interrupted read detected");
|
|
Packit |
a38265 |
} else {
|
|
Packit |
a38265 |
remaining -= n;
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
err = oggz_read_input (reader, buf+n, remaining);
|
|
Packit |
a38265 |
if (err == OGGZ_ERR_READ_STOP_OK) {
|
|
Packit |
a38265 |
INFO ("+ Interrupted read detected");
|
|
Packit |
a38265 |
} else {
|
|
Packit |
a38265 |
FAIL ("Interrupted read not reported");
|
|
Packit |
a38265 |
}
|
|
Packit |
a38265 |
}
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
n = oggz_read_input (reader, buf+n, remaining);
|
|
Packit |
a38265 |
remaining -= n;
|
|
Packit |
a38265 |
}
|
|
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 |
}
|