You can add packets to the Oggz packet queue only when it is "hungry" by providing an OggzHungry callback.
You can add packets to the Oggz packet queue only when it is "hungry" by providing an OggzHungry callback.
An OggzHungry callback will:
Once you have set such a callback with oggz_write_set_hungry_callback(), simply call oggz_write() or oggz_write_output() repeatedly, and Oggz will call your callback to provide packets when it is hungry.
This process is illustrated in the following diagram:
The following example code generates a stream of ten packets, each containing a single byte ('A', 'B', ... , 'J'):
#include <stdlib.h>
#ifdef UNUSED
#elif defined (__GNUC__)
# define UNUSED(x) UNUSED_ ## x __attribute__ ((unused))
#elif defined (__LCLINT__)
# define UNUSED(x) x
#else
# define UNUSED(x) x
#endif
static long serialno;
static ogg_int64_t granulepos = 0;
static ogg_int64_t packetno = 0;
static int
hungry (
OGGZ * oggz,
int UNUSED(empty),
void * UNUSED(user_data))
{
ogg_packet op;
unsigned char buf[1];
buf[0] = 'A' + (int)packetno;
op.packet = buf;
op.bytes = 1;
op.granulepos = granulepos;
op.packetno = packetno;
if (packetno == 0) op.b_o_s = 1;
else op.b_o_s = 0;
if (packetno == 9) op.e_o_s = 1;
else op.e_o_s = 0;
granulepos += 100;
packetno++;
return 0;
}
int
main (int argc, char * argv[])
{
char * progname, * filename = NULL;
long n;
progname = argv[0];
if (argc > 1) filename = argv[1];
if (filename) {
} else {
}
if (oggz == NULL) {
fprintf (stderr, "%s: Error creating oggz\n", progname);
exit (1);
}
fprintf (stderr, "%s: Error setting OggzHungry callback\n", progname);
exit (1);
}
exit (0);
}
long oggz_write(OGGZ *oggz, long n)
Write n bytes from an OGGZ handle.
int oggz_write_feed(OGGZ *oggz, ogg_packet *op, long serialno, int flush, int *guard)
Add a packet to oggz's packet queue.
int oggz_write_set_hungry_callback(OGGZ *oggz, OggzWriteHungry hungry, int only_when_empty, void *user_data)
Set a callback for Oggz to call when oggz is hungry .
OGGZ * oggz_open_stdio(FILE *file, int flags)
Create an OGGZ handle associated with a stdio stream.
OGGZ * oggz_open(const char *filename, int flags)
Open an Ogg file, creating an OGGZ handle for it.
void OGGZ
An opaque handle to an Ogg file.
Definition: oggz.h:441
int oggz_close(OGGZ *oggz)
Close an OGGZ handle.
long oggz_serialno_new(OGGZ *oggz)
Request a new serialno, as required for a new stream, ensuring the serialno is not yet used for any o...
@ OGGZ_WRITE
Write only.
Definition: oggz_constants.h:51
@ OGGZ_FLUSH_AFTER
Flush after this packet.
Definition: oggz_constants.h:100