/* * libmad - MPEG audio decoder library * Copyright (C) 2000-2004 Underbit Technologies, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: decoder.h,v 1.17 2004/01/23 09:41:32 rob Exp $ */ # ifndef LIBMAD_DECODER_H # define LIBMAD_DECODER_H # include "stream.h" # include "frame.h" # include "synth.h" enum mad_decoder_mode { MAD_DECODER_MODE_SYNC = 0, MAD_DECODER_MODE_ASYNC }; enum mad_flow { MAD_FLOW_CONTINUE = 0x0000, /* continue normally */ MAD_FLOW_STOP = 0x0010, /* stop decoding normally */ MAD_FLOW_BREAK = 0x0011, /* stop decoding and signal an error */ MAD_FLOW_IGNORE = 0x0020 /* ignore the current frame */ }; struct sync_t { struct mad_stream stream; // definito main_data_t un array di circa 4K struct mad_frame frame; struct mad_synth synth; }; // # define MAD_BUFFER_GUARD 8 // # define MAD_BUFFER_MDLEN (511 + 2048 + MAD_BUFFER_GUARD) // typedef unsigned char main_data_t[MAD_BUFFER_MDLEN]; 2567 // in frame.h // struct mad_frame { // struct mad_header header; /* MPEG audio header */ // // int options; /* decoding options (from stream) */ // // mad_fixed_t sbsample[2][36][32]; /* synthesis subband filter samples 9216 */ // mad_fixed_t (*overlap)[2][32][18]; /* Layer III block overlap data 4608 */ //}; // // in synth.h //struct mad_synth { // mad_fixed_t filter[2][2][2][16][8]; /* polyphase filterbank outputs 4096 */ // /* [ch][eo][peo][s][v] */ // // unsigned int phase; /* current processing phase */ // struct mad_pcm pcm; /* PCM output */ //}; struct mad_decoder { enum mad_decoder_mode mode; int options; struct { long pid; int in; int out; } async; /* struct { struct mad_stream stream; struct mad_frame frame; struct mad_synth synth; } *sync; */ struct sync_t *sync; void *cb_data; enum mad_flow (*input_func)(void *, struct mad_stream *); enum mad_flow (*header_func)(void *, struct mad_header const *); enum mad_flow (*filter_func)(void *, struct mad_stream const *, struct mad_frame *); enum mad_flow (*output_func)(void *, struct mad_header const *, struct mad_pcm *); enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *); enum mad_flow (*message_func)(void *, void *, unsigned int *); }; void mad_decoder_init(struct mad_decoder *, void *, enum mad_flow (*)(void *, struct mad_stream *), enum mad_flow (*)(void *, struct mad_header const *), enum mad_flow (*)(void *, struct mad_stream const *, struct mad_frame *), enum mad_flow (*)(void *, struct mad_header const *, struct mad_pcm *), enum mad_flow (*)(void *, struct mad_stream *, struct mad_frame *), enum mad_flow (*)(void *, void *, unsigned int *)); int mad_decoder_finish(struct mad_decoder *); # define mad_decoder_options(decoder, opts) \ ((void) ((decoder)->options = (opts))) int mad_decoder_run(struct mad_decoder *, enum mad_decoder_mode); int mad_decoder_message(struct mad_decoder *, void *, unsigned int *); # endif