|
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 4096
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
static long serialno;
|
|
Packit |
a38265 |
static int read_called = 0;
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
static unsigned char packet_buf[1024];
|
|
Packit |
a38265 |
static long total_bytes_written = 0;
|
|
Packit |
a38265 |
static long total_bytes_read = 0;
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
#define MAX_ITER 10
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
static int
|
|
Packit |
a38265 |
hungry (OGGZ * oggz, int empty, void * user_data)
|
|
Packit |
a38265 |
{
|
|
Packit |
a38265 |
ogg_packet op;
|
|
Packit |
a38265 |
int err;
|
|
Packit |
a38265 |
static long packet_bytes_w = 1;
|
|
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 > MAX_ITER) return 1;
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
total_bytes_written += packet_bytes_w;
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
memset (packet_buf, 'a' + iter, 1024);
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
op.packet = packet_buf;
|
|
Packit |
a38265 |
op.bytes = packet_bytes_w;
|
|
Packit |
a38265 |
op.b_o_s = b_o_s;
|
|
Packit |
a38265 |
op.e_o_s = e_o_s;
|
|
Packit |
a38265 |
op.granulepos = total_bytes_written-1;
|
|
Packit |
a38265 |
op.packetno = iter;
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
if ((err = oggz_write_feed (oggz, &op, serialno, 0, NULL)) != 0) {
|
|
Packit |
a38265 |
#ifdef DEBUG
|
|
Packit |
a38265 |
printf ("oggz_write_feed: error %d\n", err);
|
|
Packit |
a38265 |
#endif
|
|
Packit |
a38265 |
FAIL ("Could not feed OGGZ");
|
|
Packit |
a38265 |
}
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
#ifdef DEBUG
|
|
Packit |
a38265 |
printf ("hungry: packet_bytes_w %ld, eos %d\n", packet_bytes_w, e_o_s);
|
|
Packit |
a38265 |
#endif
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
iter++;
|
|
Packit |
a38265 |
b_o_s = 0;
|
|
Packit |
a38265 |
if (iter == MAX_ITER) e_o_s = 1;
|
|
Packit |
a38265 |
packet_bytes_w *= 2;
|
|
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 long packet_bytes_r = 1;
|
|
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 > MAX_ITER) return 1;
|
|
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 |
total_bytes_read += op->bytes;
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
#ifdef DEBUG
|
|
Packit |
a38265 |
printf ("packet_bytes_r expected: %ld, ", packet_bytes_r);
|
|
Packit |
a38265 |
printf ("op->bytes got: %ld\n", op->bytes);
|
|
Packit |
a38265 |
#endif
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
if (op->bytes != packet_bytes_r)
|
|
Packit |
a38265 |
FAIL ("Read incorrect length packet");
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
if (op->packet[packet_bytes_r-1] != '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 != total_bytes_read-1)
|
|
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 == MAX_ITER) e_o_s = 1;
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
packet_bytes_r *= 2;
|
|
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 |
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, nread;
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
INFO ("Counting bytes read from packets written");
|
|
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 |
while ((n = oggz_write_output (writer, data_buf, DATA_BUF_LEN)) != 0) {
|
|
Packit |
a38265 |
#ifdef DEBUG
|
|
Packit |
a38265 |
printf ("Wrote %ld bytes ...\n", n);
|
|
Packit |
a38265 |
#endif
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
if (n > DATA_BUF_LEN)
|
|
Packit |
a38265 |
FAIL("Too much data generated by writer");
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
if (n > 0) {
|
|
Packit |
a38265 |
nread = oggz_read (reader, n);
|
|
Packit |
a38265 |
#ifdef DEBUG
|
|
Packit |
a38265 |
printf ("Read %ld bytes ...\n", n);
|
|
Packit |
a38265 |
#endif
|
|
Packit |
a38265 |
} else break;
|
|
Packit |
a38265 |
}
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
if (oggz_close (writer) != 0)
|
|
Packit |
a38265 |
FAIL("Could not close OGGZ writer");
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
while (oggz_read (reader, n) > 0);
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
if (oggz_close (reader) != 0)
|
|
Packit |
a38265 |
FAIL("Could not close OGGZ reader");
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
#ifdef DEBUG
|
|
Packit |
a38265 |
printf ("total_bytes_written: %ld\n", total_bytes_written);
|
|
Packit |
a38265 |
printf ("total_bytes_read: %ld\n", total_bytes_read);
|
|
Packit |
a38265 |
#endif
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
if (total_bytes_written < total_bytes_read)
|
|
Packit |
a38265 |
FAIL ("Read more data than was written");
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
if (total_bytes_written > total_bytes_read)
|
|
Packit |
a38265 |
FAIL ("Failed to read all data that was written");
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
|
|
Packit |
a38265 |
exit (0);
|
|
Packit |
a38265 |
}
|