|
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__ */
|