Blame src/liboggz/oggz_private.h

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
#ifndef __OGGZ_PRIVATE_H__
Packit a38265
#define __OGGZ_PRIVATE_H__
Packit a38265
Packit a38265
#include <stdio.h>
Packit a38265
#include <sys/types.h>
Packit a38265
Packit a38265
#include <ogg/ogg.h>
Packit a38265
#include <oggz/oggz_constants.h>
Packit a38265
#include <oggz/oggz_off_t.h>
Packit a38265
Packit a38265
#include "oggz/oggz_packet.h"
Packit a38265
Packit a38265
#include "oggz_macros.h"
Packit a38265
#include "oggz_vector.h"
Packit a38265
#include "oggz_dlist.h"
Packit a38265
Packit a38265
#define OGGZ_AUTO_MULT 1000Ull
Packit a38265
Packit a38265
typedef struct _OGGZ OGGZ;
Packit a38265
typedef struct _OggzComment OggzComment;
Packit a38265
typedef struct _OggzIO OggzIO;
Packit a38265
typedef struct _OggzReader OggzReader;
Packit a38265
typedef struct _OggzWriter OggzWriter;
Packit a38265
Packit a38265
Packit a38265
typedef int (*OggzReadPacket) (OGGZ * oggz, oggz_packet * op, long serialno,
Packit a38265
			       void * user_data);
Packit a38265
typedef int (*OggzReadPage) (OGGZ * oggz, const ogg_page * og, long serialno,
Packit a38265
			     void * user_data);
Packit a38265
Packit a38265
/* oggz_stream */
Packit a38265
#include "oggz_stream_private.h"
Packit a38265
Packit a38265
typedef ogg_int64_t (*OggzMetric) (OGGZ * oggz, long serialno,
Packit a38265
				   ogg_int64_t granulepos,
Packit a38265
				   void * user_data);
Packit a38265
Packit a38265
typedef int (*OggzOrder) (OGGZ * oggz, ogg_packet * op, void * target,
Packit a38265
			  void * user_data);
Packit a38265
Packit a38265
typedef int (*OggzWriteHungry) (OGGZ * oggz, int empty, void * user_data);
Packit a38265
Packit a38265
/* oggz_io */
Packit a38265
typedef size_t (*OggzIORead) (void * user_handle, void * buf, size_t n);
Packit a38265
typedef size_t (*OggzIOWrite) (void * user_handle, void * buf, size_t n);
Packit a38265
typedef int (*OggzIOSeek) (void * user_handle, long offset, int whence);
Packit a38265
typedef long (*OggzIOTell) (void * user_handle);
Packit a38265
typedef int (*OggzIOFlush) (void * user_handle);
Packit a38265
Packit a38265
struct _oggz_stream_t {
Packit a38265
  ogg_stream_state ogg_stream;
Packit a38265
Packit a38265
  /** STATIC INFO */
Packit a38265
  int content;
Packit a38265
  int numheaders;
Packit a38265
  int preroll;
Packit a38265
  ogg_int64_t granulerate_n;
Packit a38265
  ogg_int64_t granulerate_d;
Packit a38265
  ogg_int64_t first_granule;
Packit a38265
  ogg_int64_t basegranule;
Packit a38265
  int granuleshift;
Packit a38265
Packit a38265
  /* The comments */
Packit a38265
  char * vendor;
Packit a38265
  OggzVector * comments;
Packit a38265
Packit a38265
  /** CURRENT STATE **/
Packit a38265
  /* non b_o_s packet has been written (not just queued) */
Packit a38265
  int delivered_non_b_o_s;
Packit a38265
Packit a38265
  int b_o_s; /* beginning of stream */
Packit a38265
  int e_o_s; /* end of stream */
Packit a38265
  ogg_int64_t granulepos;
Packit a38265
  ogg_int64_t packetno;
Packit a38265
Packit a38265
  /** CALLBACKS **/
Packit a38265
  OggzMetric metric;
Packit a38265
  void * metric_user_data;
Packit a38265
  int metric_internal;
Packit a38265
Packit a38265
  OggzOrder order;
Packit a38265
  void * order_user_data;
Packit a38265
Packit a38265
  OggzReadPacket read_packet;
Packit a38265
  void * read_user_data;
Packit a38265
Packit a38265
  OggzReadPage read_page;
Packit a38265
  void * read_page_user_data;
Packit a38265
Packit a38265
  /* calculated granulepos values, not extracted values */
Packit a38265
  ogg_int64_t last_granulepos;
Packit a38265
  ogg_int64_t page_granulepos;
Packit a38265
  void * calculate_data;
Packit a38265
  ogg_packet * last_packet;
Packit a38265
};
Packit a38265
Packit a38265
struct _OggzReader {
Packit a38265
  ogg_sync_state ogg_sync;
Packit a38265
Packit a38265
  /* XXX: these two can prolly be removed again :) */
Packit a38265
  ogg_stream_state ogg_stream;
Packit a38265
  long current_serialno;
Packit a38265
Packit a38265
  OggzReadPacket read_packet;
Packit a38265
  void * read_user_data;
Packit a38265
Packit a38265
  OggzReadPage read_page;
Packit a38265
  void * read_page_user_data;
Packit a38265
Packit a38265
  ogg_int64_t current_unit;
Packit a38265
  ogg_int64_t current_granulepos;
Packit a38265
Packit a38265
  /* Read positioning */
Packit a38265
  long current_page_bytes;
Packit a38265
Packit a38265
  /* Calculation of position */
Packit a38265
  oggz_off_t current_packet_begin_page_offset;
Packit a38265
  int current_packet_pages;
Packit a38265
  int current_packet_begin_segment_index;
Packit a38265
Packit a38265
#if 0
Packit a38265
  oggz_off_t offset_page_end; /* offset of end of current page */
Packit a38265
#endif
Packit a38265
};
Packit a38265
Packit a38265
/**
Packit a38265
 * Bundle a packet with the stream it is being queued for; used in
Packit a38265
 * the packet_queue vector
Packit a38265
 */
Packit a38265
typedef struct {
Packit a38265
  ogg_packet op;
Packit a38265
  oggz_stream_t * stream;
Packit a38265
  int flush;
Packit a38265
  int * guard;
Packit a38265
} oggz_writer_packet_t;
Packit a38265
Packit a38265
enum oggz_writer_state {
Packit a38265
  OGGZ_MAKING_PACKETS = 0,
Packit a38265
  OGGZ_WRITING_PAGES = 1
Packit a38265
};
Packit a38265
Packit a38265
struct _OggzWriter {
Packit a38265
  oggz_writer_packet_t * next_zpacket; /* stashed in case of FLUSH_BEFORE */
Packit a38265
  OggzVector * packet_queue;
Packit a38265
Packit a38265
  OggzWriteHungry hungry;
Packit a38265
  void * hungry_user_data;
Packit a38265
  int hungry_only_when_empty;
Packit a38265
Packit a38265
  int writing; /* already mid-write; check for recursive writes */
Packit a38265
  int state; /* OGGZ_MAKING_PACKETS or OGGZ_WRITING_PAGES */
Packit a38265
Packit a38265
  int flushing; /* whether current packet is being flushed or just paged out */
Packit a38265
Packit a38265
#if 0
Packit a38265
  int eog; /* end of page */
Packit a38265
  int eop; /* end of packet */
Packit a38265
#endif
Packit a38265
  int eos; /* end of stream */
Packit a38265
Packit a38265
  oggz_writer_packet_t * current_zpacket;
Packit a38265
Packit a38265
  int packet_offset; /* n bytes already copied out of current packet */
Packit a38265
  int page_offset; /* n bytes already copied out of current page */
Packit a38265
Packit a38265
  ogg_stream_state * current_stream;
Packit a38265
Packit a38265
  int no_more_packets; /* used only in the local oggz_write loop to indicate
Packit a38265
                          end of stream */
Packit a38265
Packit a38265
};
Packit a38265
Packit a38265
struct _OggzIO {
Packit a38265
  OggzIORead read;
Packit a38265
  void * read_user_handle;
Packit a38265
Packit a38265
  OggzIOWrite write;
Packit a38265
  void * write_user_handle;
Packit a38265
Packit a38265
  OggzIOSeek seek;
Packit a38265
  void * seek_user_handle;
Packit a38265
Packit a38265
  OggzIOTell tell;
Packit a38265
  void * tell_user_handle;
Packit a38265
Packit a38265
  OggzIOFlush flush;
Packit a38265
  void * flush_user_handle;
Packit a38265
};
Packit a38265
Packit a38265
struct _OggzComment {
Packit a38265
  /** The name of the comment, eg. "AUTHOR" */
Packit a38265
  char * name;
Packit a38265
Packit a38265
  /** The value of the comment, as UTF-8 */
Packit a38265
  char * value;
Packit a38265
};
Packit a38265
Packit a38265
struct _OGGZ {
Packit a38265
  int flags;
Packit a38265
  FILE * file;
Packit a38265
  OggzIO * io;
Packit a38265
Packit a38265
  ogg_packet current_packet;
Packit a38265
  ogg_page current_page;
Packit a38265
Packit a38265
  oggz_off_t offset; /* offset of current page start */
Packit a38265
  oggz_off_t offset_data_begin; /* offset of unit 0 page start */
Packit a38265
Packit a38265
  long run_blocksize; /* blocksize to use for oggz_run() */
Packit a38265
  int cb_next;
Packit a38265
Packit a38265
  OggzVector * streams;
Packit a38265
  int all_at_eos; /* all streams are at eos */
Packit a38265
Packit a38265
  OggzMetric metric;
Packit a38265
  void * metric_user_data;
Packit a38265
  int metric_internal;
Packit a38265
Packit a38265
  OggzOrder order;
Packit a38265
  void * order_user_data;
Packit a38265
Packit a38265
  union {
Packit a38265
    OggzReader reader;
Packit a38265
    OggzWriter writer;
Packit a38265
  } x;
Packit a38265
Packit a38265
  OggzDList * packet_buffer;
Packit a38265
};
Packit a38265
Packit a38265
OGGZ * oggz_read_init (OGGZ * oggz);
Packit a38265
OGGZ * oggz_read_close (OGGZ * oggz);
Packit a38265
Packit a38265
OGGZ * oggz_write_init (OGGZ * oggz);
Packit a38265
int oggz_write_flush (OGGZ * oggz);
Packit a38265
OGGZ * oggz_write_close (OGGZ * oggz);
Packit a38265
Packit a38265
int oggz_map_return_value_to_error (int cb_ret);
Packit a38265
Packit a38265
int oggz_get_bos (OGGZ * oggz, long serialno);
Packit a38265
ogg_int64_t oggz_get_unit (OGGZ * oggz, long serialno, ogg_int64_t granulepos);
Packit a38265
Packit a38265
int oggz_set_metric_internal (OGGZ * oggz, long serialno, OggzMetric metric,
Packit a38265
			      void * user_data, int internal);
Packit a38265
int oggz_has_metrics (OGGZ * oggz);
Packit a38265
Packit a38265
int oggz_purge (OGGZ * oggz);
Packit a38265
Packit a38265
/* metric_internal */
Packit a38265
Packit a38265
int
Packit a38265
oggz_set_granulerate (OGGZ * oggz, long serialno, 
Packit a38265
                                    ogg_int64_t granule_rate_numerator,
Packit a38265
                                    ogg_int64_t granule_rate_denominator);
Packit a38265
Packit a38265
int
Packit a38265
oggz_get_granulerate (OGGZ * oggz, long serialno,
Packit a38265
                                    ogg_int64_t * granulerate_n,
Packit a38265
                                    ogg_int64_t * granulerate_d);
Packit a38265
Packit a38265
int oggz_set_granuleshift (OGGZ * oggz, long serialno, int granuleshift);
Packit a38265
int oggz_get_granuleshift (OGGZ * oggz, long serialno);
Packit a38265
Packit a38265
int oggz_set_first_granule (OGGZ * oggz, long serialno, ogg_int64_t first_granule);
Packit a38265
Packit a38265
int oggz_set_preroll (OGGZ * oggz, long serialno, int preroll);
Packit a38265
int oggz_get_preroll (OGGZ * oggz, long serialno);
Packit a38265
Packit a38265
/* oggz_auto */
Packit a38265
 
Packit a38265
int
Packit a38265
oggz_auto_read_bos_page (OGGZ * oggz, ogg_page * og, long serialno,
Packit a38265
                         void * user_data);
Packit a38265
int
Packit a38265
oggz_auto_read_bos_packet (OGGZ * oggz, ogg_packet * op, long serialno, 
Packit a38265
                           void * user_data);
Packit a38265
Packit a38265
int
Packit a38265
oggz_auto_read_comments (OGGZ * oggz, oggz_stream_t * stream, long serialno,
Packit a38265
                         ogg_packet * op);
Packit a38265
Packit a38265
int oggz_auto_identify_page (OGGZ *oggz, ogg_page *og, long serialno);
Packit a38265
int oggz_auto_identify_packet (OGGZ * oggz, ogg_packet * op, long serialno);
Packit a38265
Packit a38265
/* comments */
Packit a38265
int oggz_comments_init (oggz_stream_t * stream);
Packit a38265
int oggz_comments_free (oggz_stream_t * stream);
Packit a38265
int oggz_comments_decode (OGGZ * oggz, long serialno,
Packit a38265
                          unsigned char * comments, long length);
Packit a38265
long oggz_comments_encode (OGGZ * oggz, long serialno,
Packit a38265
                           unsigned char * buf, long length);
Packit a38265
Packit a38265
/* oggz_io */
Packit a38265
size_t oggz_io_read (OGGZ * oggz, void * buf, size_t n);
Packit a38265
size_t oggz_io_write (OGGZ * oggz, void * buf, size_t n);
Packit a38265
int oggz_io_seek (OGGZ * oggz, long offset, int whence);
Packit a38265
long oggz_io_tell (OGGZ * oggz);
Packit a38265
int oggz_io_flush (OGGZ * oggz);
Packit a38265
Packit a38265
/* oggz_read */
Packit a38265
OggzDListIterResponse oggz_read_free_pbuffers(void *elem);
Packit a38265
Packit a38265
#endif /* __OGGZ_PRIVATE_H__ */