# Writing by force feeding Oggz

Force feeding involves synchronously:

- Creating an ogg_packet structure
- Adding it to the packet queue with oggz_write_feed()
- Calling oggz_write() or oggz_write_output(), repeatedly as necessary, to generate the Ogg bitstream.

More...

Force feeding involves synchronously:

- Creating an ogg_packet structure
- Adding it to the packet queue with oggz_write_feed()
- Calling oggz_write() or oggz_write_output(), repeatedly as necessary, to generate the Ogg bitstream.

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> /* exit */
    #include "oggz/oggz.h"

    static long serialno;
    static ogg_int64_t granulepos = 0;
    static ogg_int64_t packetno = 0;

    int
    main (int argc, char * argv[])
    {
      char * progname, * filename = NULL;
      OGGZ * oggz;
      ogg_packet op;
      unsigned char buf[1];
      long n;

      progname = argv[0];
      if (argc > 1) filename = argv[1];

      if (filename) {
        oggz = oggz_open (filename, OGGZ_WRITE);
      } else {
        oggz = oggz_open_stdio (stdout, OGGZ_WRITE);
      }

      if (oggz == NULL) {
        fprintf (stderr, "%s: Error creating oggz\n", progname);
        exit (1);
      }

      serialno = oggz_serialno_new (oggz);

      for (packetno = 0; packetno < 10; packetno++) {

        /* Create a packet */

        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;

        /* Feed it to the Oggz packet queue */

        oggz_write_feed (oggz, &op, serialno, OGGZ_FLUSH_AFTER, NULL);

        granulepos += 100;

        /* Write bytes from packetized bitstream to the output file */

        while ((n = oggz_write (oggz, 32)) > 0);
      }

      oggz_close (oggz);

      exit (0);
    }