#ifndef PRIVATE_H
#define PRIVATE_H
/* ================================= structures */
#define HEADER_LENGTH 8
#define MAXTRACKS 1024
#include "sizes.h"
typedef struct
{
float values[9];
} quicktime_matrix_t;
typedef struct
{
int version;
long flags;
unsigned long creation_time;
unsigned long modification_time;
int track_id;
long reserved1;
long duration;
char reserved2[8];
int layer;
int alternate_group;
float volume;
long reserved3;
quicktime_matrix_t matrix;
float track_width;
float track_height;
int is_video;
int is_audio;
int is_hint;
} quicktime_tkhd_t;
typedef struct
{
long seed;
long flags;
long size;
short int *alpha;
short int *red;
short int *green;
short int *blue;
} quicktime_ctab_t;
/* ===================== sample table ======================== // */
/* sample description */
typedef struct
{
int motion_jpeg_quantization_table;
} quicktime_mjqt_t;
typedef struct
{
int motion_jpeg_huffman_table;
} quicktime_mjht_t;
typedef struct
{
int timeScale;
} quicktime_tims_t;
typedef struct
{
int version;
long flags;
int decoderConfigLen;
u_char* decoderConfig;
} quicktime_esds_t;
typedef struct
{
char format[4];
char reserved[6];
int data_reference;
/* common to audio and video */
int version;
int revision;
char vendor[4];
/* video description */
long temporal_quality;
long spatial_quality;
int width;
int height;
float dpi_horizontal;
float dpi_vertical;
long data_size;
int frames_per_sample;
char compressor_name[32];
int depth;
int ctab_id;
quicktime_ctab_t ctab;
float gamma;
int fields; /* 0, 1, or 2 */
int field_dominance; /* 0 - unknown 1 - top first 2 - bottom first */
quicktime_mjqt_t mjqt;
quicktime_mjht_t mjht;
/* audio description */
int channels;
int sample_size;
int compression_id;
int packet_size;
float sample_rate;
/* hint description */
int maxPktSize;
quicktime_tims_t tims;
/* MP4 elementary stream descriptor */
quicktime_esds_t esds;
} quicktime_stsd_table_t;
typedef struct
{
int version;
long flags;
long total_entries;
quicktime_stsd_table_t *table;
} quicktime_stsd_t;
/* time to sample */
typedef struct
{
long sample_count;
long sample_duration;
} quicktime_stts_table_t;
typedef struct
{
int version;
long flags;
long total_entries;
long entries_allocated;
quicktime_stts_table_t *table;
} quicktime_stts_t;
/* sync sample */
typedef struct
{
long sample;
} quicktime_stss_table_t;
typedef struct
{
int version;
long flags;
long total_entries;
long entries_allocated;
quicktime_stss_table_t *table;
} quicktime_stss_t;
/* sample to chunk */
typedef struct
{
long chunk;
long samples;
long id;
} quicktime_stsc_table_t;
typedef struct
{
int version;
long flags;
long total_entries;
long entries_allocated;
quicktime_stsc_table_t *table;
} quicktime_stsc_t;
/* sample size */
typedef struct
{
long size;
} quicktime_stsz_table_t;
typedef struct
{
int version;
long flags;
long sample_size;
long total_entries;
long entries_allocated; /* used by the library for allocating a table */
quicktime_stsz_table_t *table;
} quicktime_stsz_t;
/* chunk offset */
typedef struct
{
long offset;
} quicktime_stco_table_t;
typedef struct
{
int version;
long flags;
long total_entries;
long entries_allocated; /* used by the library for allocating a table */
quicktime_stco_table_t *table;
} quicktime_stco_t;
/* composition time to sample */
typedef struct
{
long sample_count;
long sample_offset;
} quicktime_ctts_table_t;
typedef struct
{
int version;
long flags;
long total_entries;
long entries_allocated;
quicktime_ctts_table_t *table;
} quicktime_ctts_t;
/* sample table */
typedef struct
{
int version;
long flags;
quicktime_stsd_t stsd;
quicktime_stts_t stts;
quicktime_stss_t stss;
quicktime_stsc_t stsc;
quicktime_stsz_t stsz;
quicktime_stco_t stco;
quicktime_ctts_t ctts;
} quicktime_stbl_t;
/* data reference */
typedef struct
{
long size;
char type[4];
int version;
long flags;
char *data_reference;
} quicktime_dref_table_t;
typedef struct
{
int version;
long flags;
long total_entries;
quicktime_dref_table_t *table;
} quicktime_dref_t;
/* data information */
typedef struct
{
quicktime_dref_t dref;
} quicktime_dinf_t;
/* video media header */
typedef struct
{
int version;
long flags;
int graphics_mode;
int opcolor[3];
} quicktime_vmhd_t;
/* sound media header */
typedef struct
{
int version;
long flags;
int balance;
int reserved;
} quicktime_smhd_t;
/* generic media handler */
typedef struct
{
int version;
long flags;
int graphics_mode;
int opcolor[3];
int balance;
int reserved;
} quicktime_gmin_t;
typedef struct
{
quicktime_gmin_t gmin;
} quicktime_gmhd_t;
/* hint media handler */
typedef struct
{
int version;
long flags;
int maxPDUsize;
int avgPDUsize;
long maxbitrate;
long avgbitrate;
long slidingavgbitrate;
} quicktime_hmhd_t;
/* handler reference */
typedef struct
{
int version;
long flags;
char component_type[4];
char component_subtype[4];
long component_manufacturer;
long component_flags;
long component_flag_mask;
char component_name[256];
} quicktime_hdlr_t;
/* media information */
typedef struct
{
int is_video;
int is_audio;
int is_hint;
quicktime_vmhd_t vmhd;
quicktime_smhd_t smhd;
quicktime_gmhd_t gmhd;
quicktime_hmhd_t hmhd;
quicktime_stbl_t stbl;
quicktime_hdlr_t hdlr;
quicktime_dinf_t dinf;
} quicktime_minf_t;
/* media header */
typedef struct
{
int version;
long flags;
unsigned long creation_time;
unsigned long modification_time;
long time_scale;
long duration;
int language;
int quality;
} quicktime_mdhd_t;
/* media */
typedef struct
{
quicktime_mdhd_t mdhd;
quicktime_minf_t minf;
quicktime_hdlr_t hdlr;
} quicktime_mdia_t;
/* hint */
typedef struct
{
int numTracks;
long trackIds[MAXTRACKS];
void* traks[MAXTRACKS];
} quicktime_hint_t;
/* tref */
typedef struct
{
quicktime_hint_t hint;
} quicktime_tref_t;
/* edit list */
typedef struct
{
long duration;
long time;
float rate;
} quicktime_elst_table_t;
typedef struct
{
int version;
long flags;
long total_entries;
quicktime_elst_table_t *table;
} quicktime_elst_t;
typedef struct
{
quicktime_elst_t elst;
} quicktime_edts_t;
typedef struct {
u_int64_t numBytes; /* bytes sent including 12 byte RTP hdrs */
} quicktime_trpy_t;
typedef struct {
u_int64_t numPackets; /* packets sent */
} quicktime_nump_t;
typedef struct {
u_int64_t numBytes; /* bytes sent of just payload data */
} quicktime_tpyl_t;
typedef struct {
u_int32_t granularity;
u_int32_t maxBitRate;
} quicktime_maxr_t;
typedef struct {
u_int64_t numBytes; /* bytes sent from media data */
} quicktime_dmed_t;
typedef struct {
u_int64_t numBytes; /* bytes of immediate data */
} quicktime_dimm_t;
typedef struct {
u_int64_t numBytes; /* bytes of repeated data */
} quicktime_drep_t;
typedef struct {
int32_t milliSecs; /* min relative xmit time */
} quicktime_tmin_t;
typedef struct {
int32_t milliSecs; /* max relative xmit time */
} quicktime_tmax_t;
typedef struct {
u_int32_t numBytes; /* largest packet size */
} quicktime_pmax_t;
typedef struct {
u_int32_t milliSecs; /* longest packet duration */
} quicktime_dmax_t;
typedef struct {
u_int32_t payloadNumber; /* RTP payload number */
char rtpMapString[256]; /* TBD make this dynamically sized */
} quicktime_payt_t;
typedef struct {
quicktime_trpy_t trpy;
quicktime_nump_t nump;
quicktime_tpyl_t tpyl;
quicktime_maxr_t maxr; /* TBD there can be multiple such atoms */
quicktime_dmed_t dmed;
quicktime_dimm_t dimm;
quicktime_drep_t drep;
quicktime_tmin_t tmin;
quicktime_tmax_t tmax;
quicktime_pmax_t pmax;
quicktime_dmax_t dmax;
quicktime_payt_t payt;
} quicktime_hinf_t;
typedef struct {
char* string;
} quicktime_sdp_t;
typedef struct {
char* string;
} quicktime_rtp_t;
typedef struct {
quicktime_sdp_t sdp;
} quicktime_hint_hnti_t;
typedef struct {
quicktime_rtp_t rtp;
} quicktime_hnti_t;
typedef struct {
/* TBD name */
quicktime_hinf_t hinf;
quicktime_hint_hnti_t hnti;
} quicktime_hint_udta_t;
typedef struct
{
quicktime_tkhd_t tkhd;
quicktime_mdia_t mdia;
quicktime_edts_t edts;
quicktime_tref_t tref;
quicktime_hint_udta_t hint_udta;
} quicktime_trak_t;
typedef struct
{
int version;
long flags;
int audioProfileId;
int videoProfileId;
} quicktime_iods_t;
typedef struct
{
int version;
long flags;
unsigned long creation_time;
unsigned long modification_time;
long time_scale;
long duration;
float preferred_rate;
float preferred_volume;
char reserved[10];
quicktime_matrix_t matrix;
long preview_time;
long preview_duration;
long poster_time;
long selection_time;
long selection_duration;
long current_time;
long next_track_id;
} quicktime_mvhd_t;
typedef struct
{
char *copyright;
int copyright_len;
char *name;
int name_len;
char *info;
int info_len;
quicktime_hnti_t hnti;
} quicktime_udta_t;
typedef struct
{
int total_tracks;
quicktime_mvhd_t mvhd;
quicktime_iods_t iods;
quicktime_trak_t *trak[MAXTRACKS];
quicktime_udta_t udta;
quicktime_ctab_t ctab;
} quicktime_moov_t;
typedef struct
{
long start;
long size;
} quicktime_mdat_t;
typedef struct
{
long start; /* byte start in file */
long end; /* byte endpoint in file */
long size; /* byte size for writing */
char type[4];
} quicktime_atom_t;
/* table of pointers to every track */
typedef struct
{
quicktime_trak_t *track; /* real quicktime track corresponding to this table */
int channels; /* number of audio channels in the track */
long current_position; /* current sample in output file */
long current_chunk; /* current chunk in output file */
void *codec;
/* Array of hint tracks for this audio track */
int totalHintTracks;
quicktime_trak_t *hintTracks[MAXTRACKS];
long hintPositions[MAXTRACKS];
} quicktime_audio_map_t;
typedef struct
{
quicktime_trak_t *track;
long current_position;
long current_chunk;
/* Array of pointers to frames of raw data when caching frames. */
unsigned char **frame_cache;
long frames_cached;
void *codec;
/* Array of hint tracks for this video track */
int totalHintTracks;
quicktime_trak_t *hintTracks[MAXTRACKS];
long hintPositions[MAXTRACKS];
} quicktime_video_map_t;
/* file descriptor passed to all routines */
typedef struct
{
FILE *stream;
long total_length;
quicktime_mdat_t mdat;
quicktime_moov_t moov;
int rd;
int wr;
int use_avi;
int use_mp4;
/* mapping of audio channels to movie tracks */
/* one audio map entry exists for each channel */
int total_atracks;
quicktime_audio_map_t *atracks;
/* mapping of video tracks to movie tracks */
int total_vtracks;
quicktime_video_map_t *vtracks;
int total_hint_tracks;
/* for begining and ending frame writes where the user wants to write the */
/* file descriptor directly */
long offset;
/* Number of processors at our disposal */
int cpus;
/* I/O */
long file_position; /* Current position of file descriptor */
/* Read ahead buffer */
long preload_size; /* Enables preload when nonzero. */
char *preload_buffer;
long preload_start; /* Start of preload_buffer in file */
long preload_end; /* End of preload buffer in file */
long preload_ptr; /* Offset of preload_start in preload_buffer */
/* Parameters for frame currently being decoded */
int do_scaling;
int in_x, in_y, in_w, in_h, out_w, out_h;
int color_model;
/* Cached value for quicktime_video_frame */
long last_frame;
long last_start;
int last_stts_index;
} quicktime_t;
#endif