diff options
Diffstat (limited to 'src')
372 files changed, 186 insertions, 168959 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 0accfab88..256e28bfa 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -11,18 +11,15 @@ SUBDIRS = \ demuxers \ libffmpeg \ libmpeg2 \ - liba52 \ libspudec \ libspucc \ libspucmml \ libspudvb \ libsputext \ - libmad \ libw32dll \ libxinevdec \ libxineadec \ libreal \ - libfaad \ post \ combined \ vdr diff --git a/src/audio_out/audio_sun_out.c b/src/audio_out/audio_sun_out.c index 5923eb658..ca91a8fe6 100644 --- a/src/audio_out/audio_sun_out.c +++ b/src/audio_out/audio_sun_out.c @@ -248,13 +248,11 @@ static int realtime_samplecounter_available(xine_t *xine, char *dev) error: if (silence != NULL) free(silence); if (fd >= 0) { -#ifdef __svr4__ /* * remove the 0 bytes from the above measurement from the * audio driver's STREAMS queue */ ioctl(fd, I_FLUSH, FLUSHW); -#endif close(fd); } @@ -334,7 +332,7 @@ find_close_samplerate_match(int dev, int sample_rate) #else int i, err; - int audiocs_rates[] = { + static const int audiocs_rates[] = { 5510, 6620, 8000, 9600, 11025, 16000, 18900, 22050, 27420, 32000, 33075, 37800, 44100, 48000, 0 }; diff --git a/src/combined/Makefile.am b/src/combined/Makefile.am index cf88795ba..c1e590fd7 100644 --- a/src/combined/Makefile.am +++ b/src/combined/Makefile.am @@ -32,3 +32,29 @@ xineplug_nsf_la_SOURCES = nsf_decoder.c nsf_demuxer.c nsf_combined.c xineplug_nsf_la_LIBADD = $(XINE_LIB) $(top_builddir)/contrib/nosefart/libnosefart.la -lm xineplug_nsf_la_CFLAGS = $(AM_CFLAGS) -fno-strict-aliasing xineplug_nsf_la_CPPFLAGS = $(AM_CPPFLAGS) -DNSF_PLAYER -I$(top_srcdir)/contrib/nosefart -I$(top_srcdir)/src/demuxers + +xineplug_xiph_la_SOURCES = xine_ogg_demuxer.c +xineplug_xiph_la_LIBADD = $(XINE_LIB) +xineplug_xiph_la_CFLAGS = $(AM_CFLAGS) +xineplug_xiph_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/src/demuxers + +if ENABLE_VORBIS +xineplug_LTLIBRARIES += xineplug_xiph.la +xineplug_xiph_la_SOURCES += xine_vorbis_decoder.c +xineplug_xiph_la_LIBADD += $(VORBIS_LIBS) +xineplug_xiph_la_CFLAGS += $(VORBIS_CFLAGS) +endif + +if ENABLE_THEORA +xineplug_LTLIBRARIES += xineplug_xiph.la +xineplug_xiph_la_SOURCES += xine_theora_decoder.c +xineplug_xiph_la_LIBADD += $(THEORA_LIBS) +xineplug_xiph_la_CFLAGS += $(THEORA_CFLAGS) +endif + +if ENABLE_SPEEX +xineplug_LTLIBRARIES += xineplug_xiph.la +xineplug_xiph_la_SOURCES += xine_speex_decoder.c +xineplug_xiph_la_LIBADD += $(SPEEX_LIBS) +xineplug_xiph_la_CFLAGS += $(SPEEX_CFLAGS) +endif diff --git a/src/demuxers/demux_ogg.c b/src/combined/xine_ogg_demuxer.c index f868018af..56234723d 100644 --- a/src/demuxers/demux_ogg.c +++ b/src/combined/xine_ogg_demuxer.c @@ -40,7 +40,10 @@ #include <inttypes.h> #include <ogg/ogg.h> + +#ifdef HAVE_VORBIS #include <vorbis/codec.h> +#endif #ifdef HAVE_SPEEX #include <speex/speex.h> @@ -416,6 +419,7 @@ static void ogg_handle_event (demux_ogg_t *this) { * to label audio and spu streams */ static void read_language_comment (demux_ogg_t *this, ogg_packet *op, int stream_num) { +#ifdef HAVE_VORBIS char **ptr; char *comment; vorbis_comment vc; @@ -439,6 +443,7 @@ static void read_language_comment (demux_ogg_t *this, ogg_packet *op, int stream } vorbis_comment_clear(&vc); vorbis_info_clear(&vi); +#endif } /* @@ -446,6 +451,7 @@ static void read_language_comment (demux_ogg_t *this, ogg_packet *op, int stream * to name parts of the videostream */ static void read_chapter_comment (demux_ogg_t *this, ogg_packet *op) { +#ifdef HAVE_VORBIS char **ptr; char *comment; vorbis_comment vc; @@ -512,6 +518,7 @@ static void read_chapter_comment (demux_ogg_t *this, ogg_packet *op) { } vorbis_comment_clear(&vc); vorbis_info_clear(&vi); +#endif } /* @@ -770,6 +777,7 @@ static void send_ogg_buf (demux_ogg_t *this, } static void decode_vorbis_header (demux_ogg_t *this, const int stream_num, ogg_packet *op) { +#ifdef HAVE_VORBIS vorbis_info vi; vorbis_comment vc; @@ -803,6 +811,7 @@ static void decode_vorbis_header (demux_ogg_t *this, const int stream_num, ogg_p } vorbis_comment_clear(&vc); vorbis_info_clear(&vi); +#endif } static void decode_speex_header (demux_ogg_t *this, const int stream_num, ogg_packet *op) { @@ -1295,7 +1304,11 @@ static void decode_anxdata_header (demux_ogg_t *this, const int stream_num, ogg_ /* what type of stream are we dealing with? */ if (!strncmp(content_type, "audio/x-vorbis", content_type_length)) { +#ifdef HAVE_VORBIS this->si[stream_num]->buf_types = BUF_AUDIO_VORBIS; +#else + this->si[stream_num]->buf_types = BUF_CONTROL_NOP; +#endif this->num_audio_streams++; } else if (!strncmp(content_type, "audio/x-speex", content_type_length)) { this->num_audio_streams++; @@ -2194,9 +2207,25 @@ static const demuxer_info_t demux_info_ogg = { 10 /* priority */ }; +extern const demuxer_info_t dec_info_vorbis; +void *vorbis_init_plugin (xine_t *xine, void *data); +extern const demuxer_info_t dec_info_speex; +void *speex_init_plugin (xine_t *xine, void *data); +extern const demuxer_info_t dec_info_theora; +void *theora_init_plugin (xine_t *xine, void *data); + const plugin_info_t xine_plugin_info[] EXPORTED = { /* type, API, "name", version, special_info, init_function */ { PLUGIN_DEMUX, 26, "ogg", XINE_VERSION_CODE, &demux_info_ogg, ogg_init_class }, { PLUGIN_DEMUX, 26, "anx", XINE_VERSION_CODE, &demux_info_anx, anx_init_class }, +#ifdef HAVE_VORBIS + { PLUGIN_AUDIO_DECODER, 15, "vorbis", XINE_VERSION_CODE, &dec_info_vorbis, vorbis_init_plugin }, +#endif +#ifdef HAVE_SPEEX + { PLUGIN_AUDIO_DECODER, 15, "speex", XINE_VERSION_CODE, &dec_info_speex, speex_init_plugin }, +#endif +#ifdef HAVE_THEORA + { PLUGIN_VIDEO_DECODER, 18, "theora", XINE_VERSION_CODE, &dec_info_theora, theora_init_plugin }, +#endif { PLUGIN_NONE, 0, "", 0, NULL, NULL } }; diff --git a/src/libxineadec/xine_speex_decoder.c b/src/combined/xine_speex_decoder.c index 034e726a6..a17de15d6 100644 --- a/src/libxineadec/xine_speex_decoder.c +++ b/src/combined/xine_speex_decoder.c @@ -389,7 +389,7 @@ static void dispose_class (audio_decoder_class_t *this) { free (this); } -static void *init_plugin (xine_t *xine, void *data) { +void *speex_init_plugin (xine_t *xine, void *data) { speex_class_t *this; @@ -407,13 +407,7 @@ static uint32_t audio_types[] = { BUF_AUDIO_SPEEX, 0 }; -static const decoder_info_t dec_info_audio = { +const decoder_info_t dec_info_speex = { audio_types, /* supported types */ 5 /* priority */ }; - -const plugin_info_t xine_plugin_info[] EXPORTED = { - /* type, API, "name", version, special_info, init_function */ - { PLUGIN_AUDIO_DECODER, 15, "speex", XINE_VERSION_CODE, &dec_info_audio, init_plugin }, - { PLUGIN_NONE, 0, "", 0, NULL, NULL } -}; diff --git a/src/libxinevdec/xine_theora_decoder.c b/src/combined/xine_theora_decoder.c index 032f8800f..8dd997692 100644 --- a/src/libxinevdec/xine_theora_decoder.c +++ b/src/combined/xine_theora_decoder.c @@ -370,7 +370,7 @@ static void theora_dispose_class (video_decoder_class_t *this) { free (this); } -static void *init_plugin (xine_t *xine, void *data) { +void *theora_init_plugin (xine_t *xine, void *data) { /*initialize our plugin*/ theora_class_t *this; @@ -390,13 +390,7 @@ static void *init_plugin (xine_t *xine, void *data) { static uint32_t supported_types[] = { BUF_VIDEO_THEORA, 0 }; -static const decoder_info_t dec_info_video = { +const decoder_info_t dec_info_theora = { supported_types, /* supported types */ 5 /* priority */ }; - -const plugin_info_t xine_plugin_info[] EXPORTED = { - /* type, API, "name", version, special_info, init_function */ - { PLUGIN_VIDEO_DECODER, 18, "theora", XINE_VERSION_CODE, &dec_info_video, init_plugin }, - { PLUGIN_NONE, 0, "", 0, NULL, NULL } -}; diff --git a/src/libxineadec/xine_vorbis_decoder.c b/src/combined/xine_vorbis_decoder.c index 7fc1b9197..259ef40b0 100644 --- a/src/libxineadec/xine_vorbis_decoder.c +++ b/src/combined/xine_vorbis_decoder.c @@ -324,7 +324,7 @@ static void dispose_class (audio_decoder_class_t *this) { free (this); } -static void *init_plugin (xine_t *xine, void *data) { +void *vorbis_init_plugin (xine_t *xine, void *data) { vorbis_class_t *this; @@ -342,13 +342,7 @@ static uint32_t audio_types[] = { BUF_AUDIO_VORBIS, 0 }; -static const decoder_info_t dec_info_audio = { +const decoder_info_t dec_info_vorbis = { audio_types, /* supported types */ 5 /* priority */ }; - -const plugin_info_t xine_plugin_info[] EXPORTED = { - /* type, API, "name", version, special_info, init_function */ - { PLUGIN_AUDIO_DECODER, 15, "vorbis", XINE_VERSION_CODE, &dec_info_audio, init_plugin }, - { PLUGIN_NONE, 0, "", 0, NULL, NULL } -}; diff --git a/src/demuxers/Makefile.am b/src/demuxers/Makefile.am index aa6bc5d5e..1dec2eabf 100644 --- a/src/demuxers/Makefile.am +++ b/src/demuxers/Makefile.am @@ -12,10 +12,6 @@ xineinclude_HEADERS = demux.h noinst_HEADERS = asfheader.h qtpalette.h group_games.h group_audio.h id3.h ebml.h matroska.h iff.h flacutils.h -if ENABLE_VORBIS -ogg_module = xineplug_dmx_ogg.la -endif - if ENABLE_ASF asf_module = xineplug_dmx_asf.la endif @@ -33,7 +29,6 @@ image_module = xineplug_dmx_image.la endif xineplug_LTLIBRARIES = \ - $(ogg_module) \ $(asf_module) \ $(mng_module) \ $(image_module) \ @@ -59,10 +54,6 @@ xineplug_LTLIBRARIES = \ xineplug_dmx_iff.la \ xineplug_dmx_flv.la -xineplug_dmx_ogg_la_SOURCES = demux_ogg.c -xineplug_dmx_ogg_la_LIBADD = $(VORBIS_LIBS) $(SPEEX_LIBS) $(THEORA_LIBS) $(OGG_LIBS) $(XINE_LIB) -xineplug_dmx_ogg_la_CFLAGS = $(AM_CFLAGS) $(VORBIS_CFLAGS) $(SPEEX_CFLAGS) $(THEORA_CFLAGS) $(OGG_CFLAGS) - xineplug_dmx_avi_la_SOURCES = demux_avi.c xineplug_dmx_avi_la_LIBADD = $(XINE_LIB) @@ -126,7 +117,7 @@ xineplug_dmx_audio_la_LIBADD = $(XINE_LIB) xineplug_dmx_modplug_la_SOURCES = demux_mod.c xineplug_dmx_modplug_la_LIBADD = $(XINE_LIB) $(LIBMODPLUG_LIBS) -xineplug_dmx_modplug_la_CFLAGS = $(LIBMODPLUG_CFLAGS) +xineplug_dmx_modplug_la_CFLAGS = $(AM_CFLAGS) $(LIBMODPLUG_CFLAGS) xineplug_dmx_yuv_frames_la_SOURCES = demux_yuv_frames.c xineplug_dmx_yuv_frames_la_LIBADD = $(XINE_LIB) diff --git a/src/demuxers/demux_qt.c b/src/demuxers/demux_qt.c index cff4c48f9..1b82a288d 100644 --- a/src/demuxers/demux_qt.c +++ b/src/demuxers/demux_qt.c @@ -121,6 +121,7 @@ typedef unsigned int qt_atom; #define WRT_ATOM QT_ATOM(0xA9, 'w', 'r', 't') #define DAY_ATOM QT_ATOM(0xA9, 'd', 'a', 'y') +#define RMRA_ATOM QT_ATOM('r', 'm', 'r', 'a') #define RMDA_ATOM QT_ATOM('r', 'm', 'd', 'a') #define RDRF_ATOM QT_ATOM('r', 'd', 'r', 'f') #define RMDR_ATOM QT_ATOM('r', 'm', 'd', 'r') @@ -1984,7 +1985,8 @@ static void parse_moov_atom(qt_info *info, unsigned char *moov_atom, strncpy(info->comment, &moov_atom[i + 8], string_size - 1); info->comment[string_size - 1] = 0; - } else if (current_atom == RMDA_ATOM) { + } else if (current_atom == RMDA_ATOM || + current_atom == RMRA_ATOM) { /* create a new reference structure */ info->reference_count++; diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c index b40c7d49f..0c8b4e974 100644 --- a/src/demuxers/demux_ts.c +++ b/src/demuxers/demux_ts.c @@ -180,6 +180,8 @@ #define MAX_PES_BUF_SIZE 2048 +#define CORRUPT_PES_THRESHOLD 10 + #define NULL_PID 0x1fff #define INVALID_PID ((unsigned int)(-1)) #define INVALID_PROGRAM ((unsigned int)(-1)) @@ -913,12 +915,17 @@ static void demux_ts_buffer_pes(demux_ts_t*this, unsigned char *ts, m->buf = m->fifo->buffer_pool_alloc(m->fifo); if (!demux_ts_parse_pes_header(this->stream->xine, m, ts, len, this->stream)) { - m->corrupted_pes = 1; m->buf->free_buffer(m->buf); m->buf = NULL; - xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG, + + if (m->corrupted_pes > CORRUPT_PES_THRESHOLD) { + if (this->videoPid == m->pid) + this->videoPid = INVALID_PID; + } else { + m->corrupted_pes++; + xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG, "demux_ts: PID 0x%.4x: corrupted pes encountered\n", m->pid); - + } } else { m->corrupted_pes = 0; @@ -1784,13 +1791,27 @@ static void demux_ts_parse_packet (demux_ts_t*this) { if ( (pes_stream_id >= VIDEO_STREAM_S) && (pes_stream_id <= VIDEO_STREAM_E) ) { if ( this->videoPid == INVALID_PID) { - - xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, - "demux_ts: auto-detected video pid 0x%.4x\n", pid); - - this->videoPid = pid; - this->videoMedia = this->media_num; - demux_ts_pes_new(this, this->media_num++, pid, this->video_fifo, pes_stream_id); + int i, found = 0; + for(i = 0; i < this->media_num; i++) { + if (this->media[i].pid == pid) { + found = 1; + break; + } + } + + if (found && (this->media[i].corrupted_pes == 0)) { + this->videoPid = pid; + this->videoMedia = i; + } else if (!found) { + this->videoPid = pid; + this->videoMedia = this->media_num; + demux_ts_pes_new(this, this->media_num++, pid, this->video_fifo, pes_stream_id); + } + + if (this->videoPid != INVALID_PID) { + xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, + "demux_ts: auto-detected video pid 0x%.4x\n", pid); + } } } else if ( (pes_stream_id >= AUDIO_STREAM_S) && (pes_stream_id <= AUDIO_STREAM_E) ) { if (this->audio_tracks_count < MAX_AUDIO_TRACKS) { diff --git a/src/demuxers/group_audio.c b/src/demuxers/group_audio.c index 8c1efdde6..449c2ad12 100644 --- a/src/demuxers/group_audio.c +++ b/src/demuxers/group_audio.c @@ -68,7 +68,7 @@ static const demuxer_info_t demux_info_mpgaudio = { }; static const demuxer_info_t demux_info_mpc = { - 0 /* priority */ + 1 /* priority */ }; static const demuxer_info_t demux_info_realaudio = { diff --git a/src/input/Makefile.am b/src/input/Makefile.am index f9f9a9fb8..c6ec10b96 100644 --- a/src/input/Makefile.am +++ b/src/input/Makefile.am @@ -11,9 +11,6 @@ AM_LDFLAGS = $(xineplug_ldflags) # SUBDIRS = libreal librtsp -if ENABLE_DVB -SUBDIRS += dvb -endif if ENABLE_VCD SUBDIRS += vcd endif diff --git a/src/input/dvb/Makefile.am b/src/input/dvb/Makefile.am deleted file mode 100644 index 229ac21bf..000000000 --- a/src/input/dvb/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -noinst_HEADERS = \ - dmx.h \ - frontend.h diff --git a/src/input/dvb/dmx.h b/src/input/dvb/dmx.h deleted file mode 100644 index 51d3c48cd..000000000 --- a/src/input/dvb/dmx.h +++ /dev/null @@ -1,178 +0,0 @@ -/* - * dmx.h - * - * Copyright (C) 2000 Marcus Metzler <marcus@convergence.de> - * & Ralph Metzler <ralph@convergence.de> - for convergence integrated media GmbH - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 - * 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 Lesser 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. - * - */ - -#ifndef _DMX_H_ -#define _DMX_H_ - -#ifdef __KERNEL__ -#include <linux/types.h> -#else -#if HAVE_INTTYPES_H -#include <inttypes.h> -#else -#if HAVE_STDINT_H -#include <stdint.h> -#endif -#endif -#endif - -#define DMX_FILTER_SIZE 16 - -typedef enum -{ - DMX_OUT_DECODER, /* Streaming directly to decoder. */ - DMX_OUT_TAP, /* Output going to a memory buffer */ - /* (to be retrieved via the read command).*/ - DMX_OUT_TS_TAP /* Output multiplexed into a new TS */ - /* (to be retrieved by reading from the */ - /* logical DVR device). */ -} dmx_output_t; - - -typedef enum -{ - DMX_IN_FRONTEND, /* Input from a front-end device. */ - DMX_IN_DVR /* Input from the logical DVR device. */ -} dmx_input_t; - - -typedef enum -{ - DMX_PES_AUDIO0, - DMX_PES_VIDEO0, - DMX_PES_TELETEXT0, - DMX_PES_SUBTITLE0, - DMX_PES_PCR0, - - DMX_PES_AUDIO1, - DMX_PES_VIDEO1, - DMX_PES_TELETEXT1, - DMX_PES_SUBTITLE1, - DMX_PES_PCR1, - - DMX_PES_AUDIO2, - DMX_PES_VIDEO2, - DMX_PES_TELETEXT2, - DMX_PES_SUBTITLE2, - DMX_PES_PCR2, - - DMX_PES_AUDIO3, - DMX_PES_VIDEO3, - DMX_PES_TELETEXT3, - DMX_PES_SUBTITLE3, - DMX_PES_PCR3, - - DMX_PES_OTHER -} dmx_pes_type_t; - -#define DMX_PES_AUDIO DMX_PES_AUDIO0 -#define DMX_PES_VIDEO DMX_PES_VIDEO0 -#define DMX_PES_TELETEXT DMX_PES_TELETEXT0 -#define DMX_PES_SUBTITLE DMX_PES_SUBTITLE0 -#define DMX_PES_PCR DMX_PES_PCR0 - - -typedef enum -{ - DMX_SCRAMBLING_EV, - DMX_FRONTEND_EV -} dmx_event_t; - - -typedef enum -{ - DMX_SCRAMBLING_OFF, - DMX_SCRAMBLING_ON -} dmx_scrambling_status_t; - - -typedef struct dmx_filter -{ - uint8_t filter[DMX_FILTER_SIZE]; - uint8_t mask[DMX_FILTER_SIZE]; - uint8_t mode[DMX_FILTER_SIZE]; -} dmx_filter_t; - - -struct dmx_sct_filter_params -{ - uint16_t pid; - dmx_filter_t filter; - uint32_t timeout; - uint32_t flags; -#define DMX_CHECK_CRC 1 -#define DMX_ONESHOT 2 -#define DMX_IMMEDIATE_START 4 -#define DMX_KERNEL_CLIENT 0x8000 -}; - - -struct dmx_pes_filter_params -{ - uint16_t pid; - dmx_input_t input; - dmx_output_t output; - dmx_pes_type_t pes_type; - uint32_t flags; -}; - - -struct dmx_event -{ - dmx_event_t event; - time_t timeStamp; - union - { - dmx_scrambling_status_t scrambling; - } u; -}; - -typedef struct dmx_caps { - uint32_t caps; - int num_decoders; -} dmx_caps_t; - -typedef enum { - DMX_SOURCE_FRONT0 = 0, - DMX_SOURCE_FRONT1, - DMX_SOURCE_FRONT2, - DMX_SOURCE_FRONT3, - DMX_SOURCE_DVR0 = 16, - DMX_SOURCE_DVR1, - DMX_SOURCE_DVR2, - DMX_SOURCE_DVR3 -} dmx_source_t; - - -#define DMX_START _IO('o',41) -#define DMX_STOP _IO('o',42) -#define DMX_SET_FILTER _IOW('o',43,struct dmx_sct_filter_params) -#define DMX_SET_PES_FILTER _IOW('o',44,struct dmx_pes_filter_params) -#define DMX_SET_BUFFER_SIZE _IO('o',45) -#define DMX_GET_EVENT _IOR('o',46,struct dmx_event) -#define DMX_GET_PES_PIDS _IOR('o',47,uint16_t[5]) -#define DMX_GET_CAPS _IOR('o',48,dmx_caps_t) -#define DMX_SET_SOURCE _IOW('o',49,dmx_source_t) - -#endif /*_DMX_H_*/ - diff --git a/src/input/dvb/frontend.h b/src/input/dvb/frontend.h deleted file mode 100644 index aa671d43d..000000000 --- a/src/input/dvb/frontend.h +++ /dev/null @@ -1,277 +0,0 @@ -/* - * frontend.h - * - * Copyright (C) 2000 Marcus Metzler <marcus@convergence.de> - * Ralph Metzler <ralph@convergence.de> - * Holger Waechtler <holger@convergence.de> - * Andre Draszik <ad@convergence.de> - * for convergence integrated media GmbH - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 2.1 - * 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 Lesser 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. - * - */ - -#ifndef _FRONTEND_H_ -#define _FRONTEND_H_ - -#ifdef __KERNEL__ -#include <linux/types.h> -#else -#if HAVE_INTTYPE_H -#include <inttypes.h> -#else -#if HAVE_STDINT_H -#include <stdint.h> -#endif -#endif -#endif - - -typedef enum { - FE_QPSK, - FE_QAM, - FE_OFDM, - FE_ATSC -} fe_type_t; - - -typedef enum { - FE_IS_STUPID = 0, - FE_CAN_INVERSION_AUTO = 0x1, - FE_CAN_FEC_1_2 = 0x2, - FE_CAN_FEC_2_3 = 0x4, - FE_CAN_FEC_3_4 = 0x8, - FE_CAN_FEC_4_5 = 0x10, - FE_CAN_FEC_5_6 = 0x20, - FE_CAN_FEC_6_7 = 0x40, - FE_CAN_FEC_7_8 = 0x80, - FE_CAN_FEC_8_9 = 0x100, - FE_CAN_FEC_AUTO = 0x200, - FE_CAN_QPSK = 0x400, - FE_CAN_QAM_16 = 0x800, - FE_CAN_QAM_32 = 0x1000, - FE_CAN_QAM_64 = 0x2000, - FE_CAN_QAM_128 = 0x4000, - FE_CAN_QAM_256 = 0x8000, - FE_CAN_QAM_AUTO = 0x10000, - FE_CAN_TRANSMISSION_MODE_AUTO = 0x20000, - FE_CAN_BANDWIDTH_AUTO = 0x40000, - FE_CAN_GUARD_INTERVAL_AUTO = 0x80000, - FE_CAN_HIERARCHY_AUTO = 0x100000, - FE_CAN_8VSB = 0x200000, - FE_CAN_16VSB = 0x400000, - FE_CAN_MUTE_TS = 0x80000000, - FE_CAN_CLEAN_SETUP = 0x40000000 -} fe_caps_t; - - -struct dvb_frontend_info { - char name[128]; - fe_type_t type; - uint32_t frequency_min; - uint32_t frequency_max; - uint32_t frequency_stepsize; - uint32_t frequency_tolerance; - uint32_t symbol_rate_min; - uint32_t symbol_rate_max; - uint32_t symbol_rate_tolerance; /* ppm */ - uint32_t notifier_delay; /* ms */ - fe_caps_t caps; -}; - - -/** - * Check out the DiSEqC bus spec available on http://www.eutelsat.org/ for - * the meaning of this struct... - */ -struct dvb_diseqc_master_cmd { - uint8_t msg [6]; /* { framing, address, command, data [3] } */ - uint8_t msg_len; /* valid values are 3...6 */ -}; - - -struct dvb_diseqc_slave_reply { - uint8_t msg [4]; /* { framing, data [3] } */ - uint8_t msg_len; /* valid values are 0...4, 0 means no msg */ - int timeout; /* return from ioctl after timeout ms with */ -}; /* errorcode when no message was received */ - - -typedef enum { - SEC_VOLTAGE_13, - SEC_VOLTAGE_18 -} fe_sec_voltage_t; - - -typedef enum { - SEC_TONE_ON, - SEC_TONE_OFF -} fe_sec_tone_mode_t; - - -typedef enum { - SEC_MINI_A, - SEC_MINI_B -} fe_sec_mini_cmd_t; - - -typedef enum { - FE_HAS_SIGNAL = 0x01, /* found something above the noise level */ - FE_HAS_CARRIER = 0x02, /* found a DVB signal */ - FE_HAS_VITERBI = 0x04, /* FEC is stable */ - FE_HAS_SYNC = 0x08, /* found sync bytes */ - FE_HAS_LOCK = 0x10, /* everything's working... */ - FE_TIMEDOUT = 0x20, /* no lock within the last ~2 seconds */ - FE_REINIT = 0x40 /* frontend was reinitialized, */ -} fe_status_t; /* application is recommned to reset */ - /* DiSEqC, tone and parameters */ - -typedef enum { - INVERSION_OFF, - INVERSION_ON, - INVERSION_AUTO -} fe_spectral_inversion_t; - - -typedef enum { - FEC_NONE = 0, - FEC_1_2, - FEC_2_3, - FEC_3_4, - FEC_4_5, - FEC_5_6, - FEC_6_7, - FEC_7_8, - FEC_8_9, - FEC_AUTO -} fe_code_rate_t; - - -typedef enum { - QPSK, - QAM_16, - QAM_32, - QAM_64, - QAM_128, - QAM_256, - QAM_AUTO, - VSB_8, - VSB_16 -} fe_modulation_t; - - -typedef enum { - TRANSMISSION_MODE_2K, - TRANSMISSION_MODE_8K, - TRANSMISSION_MODE_AUTO -} fe_transmit_mode_t; - -typedef enum { - BANDWIDTH_8_MHZ, - BANDWIDTH_7_MHZ, - BANDWIDTH_6_MHZ, - BANDWIDTH_AUTO -} fe_bandwidth_t; - - -typedef enum { - GUARD_INTERVAL_1_32, - GUARD_INTERVAL_1_16, - GUARD_INTERVAL_1_8, - GUARD_INTERVAL_1_4, - GUARD_INTERVAL_AUTO -} fe_guard_interval_t; - - -typedef enum { - HIERARCHY_NONE, - HIERARCHY_1, - HIERARCHY_2, - HIERARCHY_4, - HIERARCHY_AUTO -} fe_hierarchy_t; - - -struct dvb_qpsk_parameters { - uint32_t symbol_rate; /* symbol rate in Symbols per second */ - fe_code_rate_t fec_inner; /* forward error correction (see above) */ -}; - - -struct dvb_qam_parameters { - uint32_t symbol_rate; /* symbol rate in Symbols per second */ - fe_code_rate_t fec_inner; /* forward error correction (see above) */ - fe_modulation_t modulation; /* modulation type (see above) */ -}; - -struct dvb_vsb_parameters { - fe_modulation_t modulation; /* modulation type (see above) */ -}; - -struct dvb_ofdm_parameters { - fe_bandwidth_t bandwidth; - fe_code_rate_t code_rate_HP; /* high priority stream code rate */ - fe_code_rate_t code_rate_LP; /* low priority stream code rate */ - fe_modulation_t constellation; /* modulation type (see above) */ - fe_transmit_mode_t transmission_mode; - fe_guard_interval_t guard_interval; - fe_hierarchy_t hierarchy_information; -}; - - -struct dvb_frontend_parameters { - uint32_t frequency; /* (absolute) frequency in Hz for QAM/OFDM */ - /* intermediate frequency in kHz for QPSK */ - fe_spectral_inversion_t inversion; - union { - struct dvb_qpsk_parameters qpsk; - struct dvb_qam_parameters qam; - struct dvb_ofdm_parameters ofdm; - struct dvb_vsb_parameters vsb; - } u; -}; - - -struct dvb_frontend_event { - fe_status_t status; - struct dvb_frontend_parameters parameters; -}; - - - -#define FE_GET_INFO _IOR('o', 61, struct dvb_frontend_info) - -#define FE_DISEQC_RESET_OVERLOAD _IO('o', 62) -#define FE_DISEQC_SEND_MASTER_CMD _IOW('o', 63, struct dvb_diseqc_master_cmd) -#define FE_DISEQC_RECV_SLAVE_REPLY _IOR('o', 64, struct dvb_diseqc_slave_reply) -#define FE_DISEQC_SEND_BURST _IO('o', 65) /* fe_sec_mini_cmd_t */ - -#define FE_SET_TONE _IO('o', 66) /* fe_sec_tone_mode_t */ -#define FE_SET_VOLTAGE _IO('o', 67) /* fe_sec_voltage_t */ -#define FE_ENABLE_HIGH_LNB_VOLTAGE _IO('o', 68) /* int */ - -#define FE_READ_STATUS _IOR('o', 69, fe_status_t) -#define FE_READ_BER _IOR('o', 70, uint32_t) -#define FE_READ_SIGNAL_STRENGTH _IOR('o', 71, uint16_t) -#define FE_READ_SNR _IOR('o', 72, uint16_t) -#define FE_READ_UNCORRECTED_BLOCKS _IOR('o', 73, uint32_t) - -#define FE_SET_FRONTEND _IOW('o', 76, struct dvb_frontend_parameters) -#define FE_GET_FRONTEND _IOR('o', 77, struct dvb_frontend_parameters) -#define FE_GET_EVENT _IOR('o', 78, struct dvb_frontend_event) - - -#endif /*_FRONTEND_H_*/ - diff --git a/src/input/input_cdda.c b/src/input/input_cdda.c index 80f0bda39..b85bc534e 100644 --- a/src/input/input_cdda.c +++ b/src/input/input_cdda.c @@ -2598,7 +2598,7 @@ static input_plugin_t *cdda_class_get_instance (input_class_t *cls_gen, xine_str cdda_input_plugin_t *this; cdda_input_class_t *class = (cdda_input_class_t *) cls_gen; int track; - xine_cfg_entry_t enable_entry, server_entry, port_entry, cachedir_entry; + xine_cfg_entry_t enable_entry, server_entry, port_entry; char *cdda_device = NULL; int cddb_error = class->cddb_error; diff --git a/src/input/input_dvb.c b/src/input/input_dvb.c index efc3a88d8..50162c7db 100644 --- a/src/input/input_dvb.c +++ b/src/input/input_dvb.c @@ -103,9 +103,8 @@ /* XDG */ #include <basedir.h> -/* These will eventually be #include <linux/dvb/...> */ -#include "dvb/dmx.h" -#include "dvb/frontend.h" +#include <linux/dvb/dmx.h> +#include <linux/dvb/frontend.h> #define LOG_MODULE "input_dvb" #define LOG_VERBOSE diff --git a/src/input/input_file.c b/src/input/input_file.c index 0ec25e1f8..1dce8baad 100644 --- a/src/input/input_file.c +++ b/src/input/input_file.c @@ -359,6 +359,9 @@ static int file_plugin_open (input_plugin_t *this_gen ) { file_input_plugin_t *this = (file_input_plugin_t *) this_gen; char *filename; struct stat sbuf; +#ifdef HAVE_MMAP + size_t tmp_size; +#endif lprintf("file_plugin_open\n"); @@ -423,10 +426,14 @@ static int file_plugin_open (input_plugin_t *this_gen ) { } #ifdef HAVE_MMAP - if ( (this->mmap_base = mmap(NULL, sbuf.st_size, PROT_READ, MAP_SHARED, this->fh, 0)) != (void*)-1 ) { + tmp_size = sbuf.st_size; /* may cause truncation - if it does, DON'T mmap! */ + if ((tmp_size == sbuf.st_size) && + ( (this->mmap_base = mmap(NULL, tmp_size, PROT_READ, MAP_SHARED, this->fh, 0)) != (void*)-1 )) { this->mmap_on = 1; this->mmap_curr = this->mmap_base; this->mmap_len = sbuf.st_size; + } else { + this->mmap_base = NULL; } #endif diff --git a/src/input/vcd/Makefile.am b/src/input/vcd/Makefile.am index 3de899f7e..e08396ef7 100644 --- a/src/input/vcd/Makefile.am +++ b/src/input/vcd/Makefile.am @@ -1,17 +1,25 @@ include $(top_srcdir)/misc/Makefile.common +$(top_builddir)/contrib/libcdio/libcdio.la: + $(MAKE) -C $(top_builddir)/contrib/libcdio + +$(top_builddir)/contrib/libcdio/libiso9660.la: + $(MAKE) -C $(top_builddir)/contrib/libcdio + +$(top_builddir)/contrib/libvcd/libvcd.la: + $(MAKE) -C $(top_builddir)/contrib/libvcd + +$(top_builddir)/contrib/libvcd/libvcdinfo.la: + $(MAKE) -C $(top_builddir)/contrib/libvcd + AM_CFLAGS = $(DEFAULT_OCFLAGS) $(VISIBILITY_FLAG) AM_LDFLAGS = $(xineplug_ldflags) -SUBDIRS = -if !WITH_EXTERNAL_VCDLIBS -SUBDIRS += libcdio libvcd -endif - noinst_HEADERS = vcdio.h vcdplayer.h xine-extra.h xineplug_LTLIBRARIES = xineplug_inp_vcd.la xineplug_inp_vcd_la_SOURCES = xineplug_inp_vcd.c vcdplayer.c vcdio.c xine-extra.c xineplug_inp_vcd_la_LIBADD = $(XINE_LIB) $(LIBCDIO_LIBS) $(LIBVCD_LIBS) $(LIBVCDINFO_LIBS) $(LIBISO9660_LIBS) -lm +xineplug_inp_vcd_la_DEPENDENCIES = $(LIBCDIO_DEPS) $(LIBVCD_DEPS) $(LIBVCDINFO_DEPS) $(LIBISO9660_DEPS) xineplug_inp_vcd_la_CFLAGS = $(AM_CFLAGS) $(LIBCDIO_CFLAGS) $(LIBVCD_CFLAGS) diff --git a/src/input/vcd/libcdio/FreeBSD/freebsd.c b/src/input/vcd/libcdio/FreeBSD/freebsd.c deleted file mode 100644 index daea9b3f5..000000000 --- a/src/input/vcd/libcdio/FreeBSD/freebsd.c +++ /dev/null @@ -1,638 +0,0 @@ -/* - $Id: freebsd.c,v 1.1 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/* This file contains FreeBSD-specific code and implements low-level - control of the CD drive. Culled initially I think from xine's or - mplayer's FreeBSD code with lots of modifications. -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -static const char _rcsid[] = "$Id: freebsd.c,v 1.1 2005/01/01 02:43:57 rockyb Exp $"; - -#include "freebsd.h" - -#ifdef HAVE_FREEBSD_CDROM - -#include <cdio/sector.h> - -static access_mode_t -str_to_access_mode_freebsd(const char *psz_access_mode) -{ - const access_mode_t default_access_mode = DEFAULT_FREEBSD_AM; - - if (NULL==psz_access_mode) return default_access_mode; - - if (!strcmp(psz_access_mode, "ioctl")) - return _AM_IOCTL; - else if (!strcmp(psz_access_mode, "CAM")) - return _AM_CAM; - else { - cdio_warn ("unknown access type: %s. Default ioctl used.", - psz_access_mode); - return default_access_mode; - } -} - -static void -_free_freebsd (void *obj) -{ - _img_private_t *env = obj; - - if (NULL == env) return; - - if (NULL != env->device) free(env->device); - - if (_AM_CAM == env->access_mode) - return free_freebsd_cam(env); - else - return cdio_generic_free(obj); -} - -/* Check a drive to see if it is a CD-ROM - Return 1 if a CD-ROM. 0 if it exists but isn't a CD-ROM drive - and -1 if no device exists . -*/ -static bool -cdio_is_cdrom(char *drive, char *mnttype) -{ - return cdio_is_cdrom_freebsd_ioctl(drive, mnttype); -} - -/*! - Reads nblocks of audio sectors from cd device into data starting from lsn. - Returns 0 if no error. - */ -static int -_read_audio_sectors_freebsd (void *user_data, void *data, lsn_t lsn, - unsigned int nblocks) -{ - return read_audio_sectors_freebsd_ioctl(user_data, data, lsn, nblocks); -} - -/*! - Reads a single mode2 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ -static int -_read_mode2_sector_freebsd (void *user_data, void *data, lsn_t lsn, - bool b_form2) -{ - _img_private_t *env = user_data; - - if ( env->access_mode == _AM_CAM ) - return read_mode2_sector_freebsd_cam(env, data, lsn, b_form2); - else - return read_mode2_sector_freebsd_ioctl(env, data, lsn, b_form2); -} - -/*! - Reads nblocks of mode2 sectors from cd device into data starting - from lsn. - Returns 0 if no error. - */ -static int -_read_mode2_sectors_freebsd (void *user_data, void *data, lsn_t lsn, - bool b_form2, unsigned int nblocks) -{ - _img_private_t *env = user_data; - - if ( env->access_mode == _AM_CAM && b_form2) { - /* We have a routine that covers this case without looping. */ - return read_mode2_sectors_freebsd_cam(env, data, lsn, nblocks); - } else { - unsigned int i; - unsigned int i_blocksize = b_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE; - - /* For each frame, pick out the data part we need */ - for (i = 0; i < nblocks; i++) { - int retval = _read_mode2_sector_freebsd (env, - ((char *)data) + - (i_blocksize * i), - lsn + i, b_form2); - if (retval) return retval; - } - } - return 0; -} - -/*! - Return the size of the CD in logical block address (LBA) units. - */ -static uint32_t -_stat_size_freebsd (void *obj) -{ - _img_private_t *env = obj; - - if (NULL == env) return CDIO_INVALID_LBA; - - if (_AM_CAM == env->access_mode) - return stat_size_freebsd_cam(env); - else - return stat_size_freebsd_ioctl(env); -} - -/*! - Set the key "arg" to "value" in source device. -*/ -static int -_set_arg_freebsd (void *user_data, const char key[], const char value[]) -{ - _img_private_t *env = user_data; - - if (!strcmp (key, "source")) - { - if (!value) - return -2; - - free (env->gen.source_name); - - env->gen.source_name = strdup (value); - } - else if (!strcmp (key, "access-mode")) - { - env->access_mode = str_to_access_mode_freebsd(value); - if (env->access_mode == _AM_CAM && !env->b_cam_init) - return init_freebsd_cam(env) ? 1 : -3; - return 0; - } - else - return -1; - - return 0; -} - -/*! - Read and cache the CD's Track Table of Contents and track info. - Return false if unsuccessful; -*/ -static bool -read_toc_freebsd (void *p_user_data) -{ - _img_private_t *p_env = p_user_data; - track_t i, j; - - /* read TOC header */ - if ( ioctl(p_env->gen.fd, CDIOREADTOCHEADER, &p_env->tochdr) == -1 ) { - cdio_warn("error in ioctl(CDIOREADTOCHEADER): %s\n", strerror(errno)); - return false; - } - - p_env->gen.i_first_track = p_env->tochdr.starting_track; - p_env->gen.i_tracks = p_env->tochdr.ending_track - - p_env->gen.i_first_track + 1; - - j=0; - for (i=p_env->gen.i_first_track; i<=p_env->gen.i_tracks; i++, j++) { - p_env->tocent[j].track = i; - p_env->tocent[j].address_format = CD_LBA_FORMAT; - - if ( ioctl(p_env->gen.fd, CDIOREADTOCENTRY, &(p_env->tocent[j]) ) ) { - cdio_warn("%s %d: %s\n", - "error in ioctl CDROMREADTOCENTRY for track", - i, strerror(errno)); - return false; - } - } - - p_env->tocent[j].track = CDIO_CDROM_LEADOUT_TRACK; - p_env->tocent[j].address_format = CD_LBA_FORMAT; - if ( ioctl(p_env->gen.fd, CDIOREADTOCENTRY, &(p_env->tocent[j]) ) ){ - cdio_warn("%s: %s\n", - "error in ioctl CDROMREADTOCENTRY for leadout track", - strerror(errno)); - return false; - } - - p_env->gen.toc_init = true; - return true; -} - -/*! - Eject media. Return 1 if successful, 0 otherwise. - */ -static int -_eject_media_freebsd (void *user_data) -{ - _img_private_t *p_env = user_data; - - return (p_env->access_mode == _AM_IOCTL) - ? eject_media_freebsd_ioctl(p_env) - : eject_media_freebsd_cam(p_env); -} - -/*! - Return the value associated with the key "arg". -*/ -static const char * -_get_arg_freebsd (void *user_data, const char key[]) -{ - _img_private_t *env = user_data; - - if (!strcmp (key, "source")) { - return env->gen.source_name; - } else if (!strcmp (key, "access-mode")) { - switch (env->access_mode) { - case _AM_IOCTL: - return "ioctl"; - case _AM_CAM: - return "CAM"; - case _AM_NONE: - return "no access method"; - } - } - return NULL; -} - -/*! - Return the media catalog number MCN. - - Note: string is malloc'd so caller should free() then returned - string when done with it. - - FIXME: This is just a guess. - - */ -static char * -_get_mcn_freebsd (const void *p_user_data) { - - const _img_private_t *p_env = p_user_data; - - return (p_env->access_mode == _AM_IOCTL) - ? get_mcn_freebsd_ioctl(p_env) - : scsi_mmc_get_mcn(p_env->gen.cdio); - -} - -static void -get_drive_cap_freebsd (const void *p_user_data, - cdio_drive_read_cap_t *p_read_cap, - cdio_drive_write_cap_t *p_write_cap, - cdio_drive_misc_cap_t *p_misc_cap) -{ - const _img_private_t *p_env = p_user_data; - - if (p_env->access_mode == _AM_CAM) - scsi_mmc_get_drive_cap_generic (p_user_data, p_read_cap, p_write_cap, - p_misc_cap); - -} - -/*! - Run a SCSI MMC command. - - p_user_data internal CD structure. - i_timeout_ms time in milliseconds we will wait for the command - to complete. If this value is -1, use the default - time-out value. - i_cdb Size of p_cdb - p_cdb CDB bytes. - e_direction direction the transfer is to go. - i_buf Size of buffer - p_buf Buffer for data, both sending and receiving - - Return 0 if no error. - */ -static int -run_scsi_cmd_freebsd( const void *p_user_data, unsigned int i_timeout_ms, - unsigned int i_cdb, const scsi_mmc_cdb_t *p_cdb, - scsi_mmc_direction_t e_direction, - unsigned int i_buf, /*in/out*/ void *p_buf ) -{ - const _img_private_t *p_env = p_user_data; - - if (p_env->access_mode == _AM_CAM) - return run_scsi_cmd_freebsd_cam( p_user_data, i_timeout_ms, i_cdb, p_cdb, - e_direction, i_buf, p_buf ); - else - return 2; -} - -/*! - Get format of track. - - FIXME: We're just guessing this from the GNU/Linux code. - -*/ -static track_format_t -_get_track_format_freebsd(void *p_user_data, track_t i_track) -{ - _img_private_t *p_env = p_user_data; - - if (!p_env->gen.toc_init) read_toc_freebsd (p_user_data) ; - - if (i_track > TOTAL_TRACKS || i_track == 0) - return TRACK_FORMAT_ERROR; - - i_track -= FIRST_TRACK_NUM; - - /* This is pretty much copied from the "badly broken" cdrom_count_tracks - in linux/cdrom.c. - */ - if (p_env->tocent[i_track].entry.control & CDIO_CDROM_DATA_TRACK) { - if (p_env->tocent[i_track].address_format == CDIO_CDROM_CDI_TRACK) - return TRACK_FORMAT_CDI; - else if (p_env->tocent[i_track].address_format == CDIO_CDROM_XA_TRACK) - return TRACK_FORMAT_XA; - else - return TRACK_FORMAT_DATA; - } else - return TRACK_FORMAT_AUDIO; - -} - -/*! - Return true if we have XA data (green, mode2 form1) or - XA data (green, mode2 form2). That is track begins: - sync - header - subheader - 12 4 - 8 - - FIXME: there's gotta be a better design for this and get_track_format? -*/ -static bool -_get_track_green_freebsd(void *user_data, track_t i_track) -{ - _img_private_t *p_env = user_data; - - if (i_track == CDIO_CDROM_LEADOUT_TRACK) i_track = TOTAL_TRACKS+1; - - if (i_track > TOTAL_TRACKS+1 || i_track == 0) - return false; - - /* FIXME: Dunno if this is the right way, but it's what - I was using in cdinfo for a while. - */ - return ((p_env->tocent[i_track-FIRST_TRACK_NUM].entry.control & 2) != 0); -} - -/*! - Return the starting LSN track number - i_track in obj. Track numbers start at 1. - The "leadout" track is specified either by - using i_track LEADOUT_TRACK or the total tracks+1. - CDIO_INVALID_LBA is returned if there is no track entry. -*/ -static lba_t -_get_track_lba_freebsd(void *user_data, track_t i_track) -{ - _img_private_t *p_env = user_data; - - if (!p_env->gen.toc_init) read_toc_freebsd (p_env) ; - - if (i_track == CDIO_CDROM_LEADOUT_TRACK) i_track = TOTAL_TRACKS+1; - - if (i_track > TOTAL_TRACKS+1 || i_track == 0 || !p_env->gen.toc_init) { - return CDIO_INVALID_LBA; - } else { - return cdio_lsn_to_lba(ntohl(p_env->tocent[i_track-FIRST_TRACK_NUM].entry.addr.lba)); - } -} - -#endif /* HAVE_FREEBSD_CDROM */ - -/*! - Return an array of strings giving possible CD devices. - */ -char ** -cdio_get_devices_freebsd (void) -{ -#ifndef HAVE_FREEBSD_CDROM - return NULL; -#else - char drive[40]; - char **drives = NULL; - unsigned int num_drives=0; - bool exists=true; - char c; - - /* Scan the system for CD-ROM drives. - */ - -#ifdef USE_ETC_FSTAB - - struct fstab *fs; - setfsent(); - - /* Check what's in /etc/fstab... */ - while ( (fs = getfsent()) ) - { - if (strncmp(fs->fs_spec, "/dev/sr", 7)) - cdio_add_device_list(&drives, fs->fs_spec, &num_drives); - } - -#endif - - /* Scan the system for CD-ROM drives. - Not always 100% reliable, so use the USE_MNTENT code above first. - */ - - /* Scan SCSI and CAM devices */ - for ( c='0'; exists && c <='9'; c++ ) { - sprintf(drive, "/dev/cd%c%s", c, DEVICE_POSTFIX); - exists = cdio_is_cdrom(drive, NULL); - if ( exists ) { - cdio_add_device_list(&drives, drive, &num_drives); - } - } - - /* Scan are ATAPI devices */ - for ( c='0'; exists && c <='9'; c++ ) { - sprintf(drive, "/dev/acd%c%s", c, DEVICE_POSTFIX); - exists = cdio_is_cdrom(drive, NULL); - if ( exists ) { - cdio_add_device_list(&drives, drive, &num_drives); - } - } - cdio_add_device_list(&drives, NULL, &num_drives); - return drives; -#endif /*HAVE_FREEBSD_CDROM*/ -} - -/*! - Return a string containing the default CD device if none is specified. - */ -char * -cdio_get_default_device_freebsd() -{ -#ifndef HAVE_FREEBSD_CDROM - return NULL; -#else - char drive[40]; - bool exists=true; - char c; - - /* Scan the system for CD-ROM drives. - */ - -#ifdef USE_ETC_FSTAB - - struct fstab *fs; - setfsent(); - - /* Check what's in /etc/fstab... */ - while ( (fs = getfsent()) ) - { - if (strncmp(fs->fs_spec, "/dev/sr", 7)) - return strdup(fs->fs_spec); - } - -#endif - - /* Scan the system for CD-ROM drives. - Not always 100% reliable, so use the USE_MNTENT code above first. - */ - - /* Scan SCSI and CAM devices */ - for ( c='0'; exists && c <='9'; c++ ) { - sprintf(drive, "/dev/cd%c%s", c, DEVICE_POSTFIX); - exists = cdio_is_cdrom(drive, NULL); - if ( exists ) { - return strdup(drive); - } - } - - /* Scan are ATAPI devices */ - for ( c='0'; exists && c <='9'; c++ ) { - sprintf(drive, "/dev/acd%c%s", c, DEVICE_POSTFIX); - exists = cdio_is_cdrom(drive, NULL); - if ( exists ) { - return strdup(drive); - } - } - return NULL; -#endif /*HAVE_FREEBSD_CDROM*/ -} - -/*! - Initialization routine. This is the only thing that doesn't - get called via a function pointer. In fact *we* are the - ones to set that up. - */ -CdIo * -cdio_open_freebsd (const char *psz_source_name) -{ - return cdio_open_am_freebsd(psz_source_name, NULL); -} - - -/*! - Initialization routine. This is the only thing that doesn't - get called via a function pointer. In fact *we* are the - ones to set that up. - */ -CdIo * -cdio_open_am_freebsd (const char *psz_orig_source_name, - const char *psz_access_mode) -{ - -#ifdef HAVE_FREEBSD_CDROM - CdIo *ret; - _img_private_t *_data; - char *psz_source_name; - - cdio_funcs _funcs = { - .eject_media = _eject_media_freebsd, - .free = _free_freebsd, - .get_arg = _get_arg_freebsd, - .get_cdtext = get_cdtext_generic, - .get_default_device = cdio_get_default_device_freebsd, - .get_devices = cdio_get_devices_freebsd, - .get_discmode = get_discmode_generic, - .get_drive_cap = get_drive_cap_freebsd, - .get_first_track_num= get_first_track_num_generic, - .get_mcn = _get_mcn_freebsd, - .get_num_tracks = get_num_tracks_generic, - .get_track_format = _get_track_format_freebsd, - .get_track_green = _get_track_green_freebsd, - .get_track_lba = _get_track_lba_freebsd, - .get_track_msf = NULL, - .lseek = cdio_generic_lseek, - .read = cdio_generic_read, - .read_audio_sectors = _read_audio_sectors_freebsd, - .read_mode2_sector = _read_mode2_sector_freebsd, - .read_mode2_sectors = _read_mode2_sectors_freebsd, - .read_toc = read_toc_freebsd, - .run_scsi_mmc_cmd = run_scsi_cmd_freebsd, - .set_arg = _set_arg_freebsd, - .stat_size = _stat_size_freebsd - }; - - _data = _cdio_malloc (sizeof (_img_private_t)); - _data->access_mode = str_to_access_mode_freebsd(psz_access_mode); - _data->gen.init = false; - _data->gen.fd = -1; - _data->gen.toc_init = false; - _data->gen.b_cdtext_init = false; - _data->gen.b_cdtext_error = false; - - if (NULL == psz_orig_source_name) { - psz_source_name=cdio_get_default_device_freebsd(); - if (NULL == psz_source_name) return NULL; - _data->device = psz_source_name; - _set_arg_freebsd(_data, "source", psz_source_name); - } else { - if (cdio_is_device_generic(psz_orig_source_name)) { - _set_arg_freebsd(_data, "source", psz_orig_source_name); - _data->device = strdup(psz_orig_source_name); - } else { - /* The below would be okay if all device drivers worked this way. */ -#if 0 - cdio_info ("source %s is a not a device", psz_orig_source_name); -#endif - return NULL; - } - } - - ret = cdio_new ((void *)_data, &_funcs); - if (ret == NULL) return NULL; - - if (cdio_generic_init(_data)) - if ( _data->access_mode == _AM_IOCTL ) { - return ret; - } else { - if (init_freebsd_cam(_data)) - return ret; - else { - cdio_generic_free (_data); - return NULL; - } - } - else { - cdio_generic_free (_data); - return NULL; - } - -#else - return NULL; -#endif /* HAVE_FREEBSD_CDROM */ - -} - -bool -cdio_have_freebsd (void) -{ -#ifdef HAVE_FREEBSD_CDROM - return true; -#else - return false; -#endif /* HAVE_FREEBSD_CDROM */ -} diff --git a/src/input/vcd/libcdio/FreeBSD/freebsd.h b/src/input/vcd/libcdio/FreeBSD/freebsd.h deleted file mode 100644 index 50894c912..000000000 --- a/src/input/vcd/libcdio/FreeBSD/freebsd.h +++ /dev/null @@ -1,232 +0,0 @@ -/* - $Id: freebsd.h,v 1.1 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/* This file contains FreeBSD-specific code and implements low-level - control of the CD drive. Culled initially I think from xine's or - mplayer's FreeBSD code with lots of modifications. -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <cdio/sector.h> -#include "cdio_assert.h" -#include "cdio_private.h" - -/*! - For ioctl access /dev/acd0c is preferred over /dev/cd0c. - For cam access /dev/cd0c is preferred. DEFAULT_CDIO_DEVICE and - DEFAULT_FREEBSD_AM should be consistent. - */ - -#ifndef DEFAULT_CDIO_DEVICE -#define DEFAULT_CDIO_DEVICE "/dev/cd0c" -#endif - -#ifndef DEFUALT_FREEBSD_AM -#define DEFAULT_FREEBSD_AM _AM_CAM -#endif - -#include <string.h> - -#ifdef HAVE_FREEBSD_CDROM - -#include <stdio.h> -#include <stdlib.h> -#include <errno.h> -#include <unistd.h> -#include <fcntl.h> - -#ifdef HAVE_SYS_CDIO_H -# include <sys/cdio.h> -#endif - -#ifndef CDIOCREADAUDIO -struct ioc_read_audio -{ - u_char address_format; - union msf_lba address; - int nframes; - u_char* buffer; -}; - -#define CDIOCREADAUDIO _IOWR('c',31,struct ioc_read_audio) -#endif - -#include <sys/cdrio.h> - -#include <sys/stat.h> -#include <sys/types.h> -#include <sys/ioctl.h> -#include <sys/param.h> /* for __FreeBSD_version */ - -#if __FreeBSD_version < 500000 -#define DEVICE_POSTFIX "c" -#else -#define DEVICE_POSTFIX "" -#endif - -#define HAVE_FREEBSD_CAM -#ifdef HAVE_FREEBSD_CAM -#include <camlib.h> - -#include <cam/scsi/scsi_message.h> -#include <cam/scsi/scsi_pass.h> -#include <errno.h> -#define ERRCODE(s) ((((s)[2]&0x0F)<<16)|((s)[12]<<8)|((s)[13])) -#define EMEDIUMTYPE EINVAL -#define ENOMEDIUM ENODEV -#define CREAM_ON_ERRNO(s) do { \ - switch ((s)[12]) \ - { case 0x04: errno=EAGAIN; break; \ - case 0x20: errno=ENODEV; break; \ - case 0x21: if ((s)[13]==0) errno=ENOSPC; \ - else errno=EINVAL; \ - break; \ - case 0x30: errno=EMEDIUMTYPE; break; \ - case 0x3A: errno=ENOMEDIUM; break; \ - } \ -} while(0) -#endif /*HAVE_FREEBSD_CAM*/ - -#include <cdio/util.h> - -#define TOTAL_TRACKS ( p_env->tochdr.ending_track \ - - p_env->tochdr.starting_track + 1) -#define FIRST_TRACK_NUM (p_env->tochdr.starting_track) - -typedef enum { - _AM_NONE, - _AM_IOCTL, - _AM_CAM -} access_mode_t; - -typedef struct { - /* Things common to all drivers like this. - This must be first. */ - generic_img_private_t gen; - -#ifdef HAVE_FREEBSD_CAM - char *device; - struct cam_device *cam; - union ccb ccb; -#endif - - access_mode_t access_mode; - - bool b_ioctl_init; - bool b_cam_init; - - /* Track information */ - struct ioc_toc_header tochdr; - - /* Entry info for each track. Add 1 for leadout. */ - struct ioc_read_toc_single_entry tocent[CDIO_CD_MAX_TRACKS+1]; - -} _img_private_t; - -bool cdio_is_cdrom_freebsd_ioctl(char *drive, char *mnttype); - -track_format_t get_track_format_freebsd_ioctl(const _img_private_t *env, - track_t i_track); -bool get_track_green_freebsd_ioctl(const _img_private_t *env, - track_t i_track); - -int eject_media_freebsd_ioctl (_img_private_t *env); -int eject_media_freebsd_cam (_img_private_t *env); - -void get_drive_cap_freebsd_cam (const _img_private_t *p_env, - cdio_drive_read_cap_t *p_read_cap, - cdio_drive_write_cap_t *p_write_cap, - cdio_drive_misc_cap_t *p_misc_cap); - -char *get_mcn_freebsd_ioctl (const _img_private_t *p_env); - -void free_freebsd_cam (void *obj); - -/*! - Using the ioctl method, r nblocks of audio sectors from cd device - into data starting from lsn. Returns 0 if no error. - */ -int read_audio_sectors_freebsd_ioctl (_img_private_t *env, void *data, - lsn_t lsn, unsigned int nblocks); -/*! - Using the CAM method, reads nblocks of mode2 sectors from - cd device using into data starting from lsn. Returns 0 if no - error. -*/ -int read_mode2_sector_freebsd_cam (_img_private_t *env, void *data, - lsn_t lsn, bool b_form2); - -/*! - Using the ioctl method, reads nblocks of mode2 sectors from - cd device using into data starting from lsn. Returns 0 if no - error. -*/ -int read_mode2_sector_freebsd_ioctl (_img_private_t *env, void *data, - lsn_t lsn, bool b_form2); - -/*! - Using the CAM method, reads nblocks of mode2 form2 sectors from - cd device using into data starting from lsn. Returns 0 if no - error. - - Note: if you want form1 sectors, the caller has to pick out the - appropriate piece. -*/ -int read_mode2_sectors_freebsd_cam (_img_private_t *env, void *buf, - lsn_t lsn, unsigned int nblocks); - -bool read_toc_freebsd_ioctl (_img_private_t *env); - -/*! - Run a SCSI MMC command. - - p_user_data internal CD structure. - i_timeout time in milliseconds we will wait for the command - to complete. If this value is -1, use the default - time-out value. - i_cdb Size of p_cdb - p_cdb CDB bytes. - e_direction direction the transfer is to go. - i_buf Size of buffer - p_buf Buffer for data, both sending and receiving - - Return 0 if no error. - */ -int run_scsi_cmd_freebsd_cam( const void *p_user_data, - unsigned int i_timeout_ms, - unsigned int i_cdb, - const scsi_mmc_cdb_t *p_cdb, - scsi_mmc_direction_t e_direction, - unsigned int i_buf, - /*in/out*/ void *p_buf ); - -/*! - Return the size of the CD in logical block address (LBA) units. - */ -uint32_t stat_size_freebsd_cam (_img_private_t *env); -uint32_t stat_size_freebsd_ioctl (_img_private_t *env); - -bool init_freebsd_cam (_img_private_t *env); -void free_freebsd_cam (void *user_data); - -#endif /*HAVE_FREEBSD_CDROM*/ diff --git a/src/input/vcd/libcdio/FreeBSD/freebsd_cam.c b/src/input/vcd/libcdio/FreeBSD/freebsd_cam.c deleted file mode 100644 index 68e38ccae..000000000 --- a/src/input/vcd/libcdio/FreeBSD/freebsd_cam.c +++ /dev/null @@ -1,346 +0,0 @@ -/* - $Id: freebsd_cam.c,v 1.1 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/* This file contains FreeBSD-specific code and implements low-level - control of the CD drive via SCSI emulation. -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -static const char _rcsid[] = "$Id: freebsd_cam.c,v 1.1 2005/01/01 02:43:57 rockyb Exp $"; - -#ifdef HAVE_FREEBSD_CDROM - -#include "freebsd.h" -#include <cdio/scsi_mmc.h> - -/* Default value in seconds we will wait for a command to - complete. */ -#define DEFAULT_TIMEOUT_MSECS 10000 - -/*! - Run a SCSI MMC command. - - p_user_data internal CD structure. - i_timeout_ms time in milliseconds we will wait for the command - to complete. If this value is -1, use the default - time-out value. - i_cdb Size of p_cdb - p_cdb CDB bytes. - e_direction direction the transfer is to go. - i_buf Size of buffer - p_buf Buffer for data, both sending and receiving - - Return 0 if no error. - */ -int -run_scsi_cmd_freebsd_cam( const void *p_user_data, unsigned int i_timeout_ms, - unsigned int i_cdb, const scsi_mmc_cdb_t *p_cdb, - scsi_mmc_direction_t e_direction, - unsigned int i_buf, /*in/out*/ void *p_buf ) -{ - const _img_private_t *p_env = p_user_data; - int i_status; - int direction = CAM_DEV_QFRZDIS; - union ccb ccb; - - if (!p_env || !p_env->cam) return -2; - - memset(&ccb, 0, sizeof(ccb)); - - ccb.ccb_h.path_id = p_env->cam->path_id; - ccb.ccb_h.target_id = p_env->cam->target_id; - ccb.ccb_h.target_lun = p_env->cam->target_lun; - ccb.ccb_h.timeout = i_timeout_ms; - - if (!i_cdb) - direction |= CAM_DIR_NONE; - else - direction |= (e_direction == SCSI_MMC_DATA_READ)?CAM_DIR_IN : CAM_DIR_OUT; - cam_fill_csio (&(ccb.csio), 1, NULL, - direction | CAM_DEV_QFRZDIS, MSG_SIMPLE_Q_TAG, p_buf, i_buf, - sizeof(ccb.csio.sense_data), 0, 30*1000); - - memcpy(ccb.csio.cdb_io.cdb_bytes, p_cdb, i_cdb); - - ccb.csio.cdb_len = - scsi_mmc_get_cmd_len(ccb.csio.cdb_io.cdb_bytes[0]); - - if ((i_status = cam_send_ccb(p_env->cam, &ccb)) < 0) - { - cdio_warn ("transport failed: %d", i_status); - return -1; - } - if ((ccb.ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) - { - return 0; - } - errno = EIO; - i_status = ERRCODE(((unsigned char *)&ccb.csio.sense_data)); - if (i_status == 0) - i_status = -1; - else - CREAM_ON_ERRNO(((unsigned char *)&ccb.csio.sense_data)); - cdio_warn ("transport failed: %d", i_status); - return i_status; -} - -bool -init_freebsd_cam (_img_private_t *p_env) -{ - char pass[100]; - - p_env->cam=NULL; - memset (&p_env->ccb, 0, sizeof(p_env->ccb)); - p_env->ccb.ccb_h.func_code = XPT_GDEVLIST; - - if (-1 == p_env->gen.fd) - p_env->gen.fd = open (p_env->device, O_RDONLY, 0); - - if (p_env->gen.fd < 0) - { - cdio_warn ("open (%s): %s", p_env->device, strerror (errno)); - return false; - } - - if (ioctl (p_env->gen.fd, CAMGETPASSTHRU, &p_env->ccb) < 0) - { - cdio_warn ("open: %s", strerror (errno)); - return false; - } - sprintf (pass,"/dev/%.15s%u", - p_env->ccb.cgdl.periph_name, - p_env->ccb.cgdl.unit_number); - p_env->cam = cam_open_pass (pass,O_RDWR,NULL); - if (!p_env->cam) return false; - - p_env->gen.init = true; - p_env->b_cam_init = true; - return true; -} - -void -free_freebsd_cam (void *user_data) -{ - _img_private_t *p_env = user_data; - - if (NULL == p_env) return; - - if (p_env->gen.fd > 0) - close (p_env->gen.fd); - p_env->gen.fd = -1; - - if(p_env->cam) - cam_close_device(p_env->cam); - - free (p_env); -} - -static int -_set_bsize (_img_private_t *p_env, unsigned int bsize) -{ - scsi_mmc_cdb_t cdb = {{0, }}; - - struct - { - uint8_t reserved1; - uint8_t medium; - uint8_t reserved2; - uint8_t block_desc_length; - uint8_t density; - uint8_t number_of_blocks_hi; - uint8_t number_of_blocks_med; - uint8_t number_of_blocks_lo; - uint8_t reserved3; - uint8_t block_length_hi; - uint8_t block_length_med; - uint8_t block_length_lo; - } mh; - - memset (&mh, 0, sizeof (mh)); - mh.block_desc_length = 0x08; - mh.block_length_hi = (bsize >> 16) & 0xff; - mh.block_length_med = (bsize >> 8) & 0xff; - mh.block_length_lo = (bsize >> 0) & 0xff; - - memset (&cdb, 0, sizeof (cdb)); - - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_MODE_SELECT_6); - - cdb.field[1] = 1 << 4; - cdb.field[4] = 12; - - return run_scsi_cmd_freebsd_cam (p_env, DEFAULT_TIMEOUT_MSECS, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_WRITE, - sizeof(mh), &mh); -} - -int -read_mode2_sector_freebsd_cam (_img_private_t *p_env, void *data, lsn_t lsn, - bool b_form2) -{ - if ( b_form2 ) - return read_mode2_sectors_freebsd_cam(p_env, data, lsn, 1); - else { - /* Need to pick out the data portion from a mode2 form2 frame */ - char buf[M2RAW_SECTOR_SIZE] = { 0, }; - int retval = read_mode2_sectors_freebsd_cam(p_env, buf, lsn, 1); - if ( retval ) return retval; - memcpy (((char *)data), buf + CDIO_CD_SUBHEADER_SIZE, CDIO_CD_FRAMESIZE); - return 0; - } -} - -/*! - Reads nblocks of mode2 sectors from cd device into data starting - from lsn. - Returns 0 if no error. - */ -int -read_mode2_sectors_freebsd_cam (_img_private_t *p_env, void *p_buf, - lsn_t lsn, unsigned int nblocks) -{ - scsi_mmc_cdb_t cdb = {{0, }}; - - bool b_read_10 = false; - - CDIO_MMC_SET_READ_LBA(cdb.field, lsn); - - if (b_read_10) { - int retval; - - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_10); - CDIO_MMC_SET_READ_LENGTH16(cdb.field, nblocks); - if ((retval = _set_bsize (p_env, M2RAW_SECTOR_SIZE))) - return retval; - - if ((retval = run_scsi_cmd_freebsd_cam (p_env, 0, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, - SCSI_MMC_DATA_READ, - M2RAW_SECTOR_SIZE * nblocks, - p_buf))) - { - _set_bsize (p_env, CDIO_CD_FRAMESIZE); - return retval; - } - - if ((retval = _set_bsize (p_env, CDIO_CD_FRAMESIZE))) - return retval; - } else - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_CD); - CDIO_MMC_SET_READ_LENGTH24(cdb.field, nblocks); - cdb.field[1] = 0; /* sector size mode2 */ - cdb.field[9] = 0x58; /* 2336 mode2 */ - return run_scsi_cmd_freebsd_cam (p_env, 0, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, - SCSI_MMC_DATA_READ, - M2RAW_SECTOR_SIZE * nblocks, p_buf); - - return 0; -} - -/*! - Return the size of the CD in logical block address (LBA) units. - */ -uint32_t -stat_size_freebsd_cam (_img_private_t *p_env) -{ - scsi_mmc_cdb_t cdb = {{0, }}; - uint8_t buf[12] = { 0, }; - - uint32_t retval; - int i_status; - - /* Operation code */ - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_TOC); - - cdb.field[1] = 0; /* lba; msf: 0x2 */ - - /* Format */ - cdb.field[2] = CDIO_MMC_READTOC_FMT_TOC; - - CDIO_MMC_SET_START_TRACK(cdb.field, CDIO_CDROM_LEADOUT_TRACK); - - CDIO_MMC_SET_READ_LENGTH16(cdb.field, sizeof(buf)); - - p_env->ccb.csio.data_ptr = buf; - p_env->ccb.csio.dxfer_len = sizeof (buf); - - i_status = run_scsi_cmd_freebsd_cam(p_env, DEFAULT_TIMEOUT_MSECS, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_READ, - sizeof(buf), buf); - if (0 != i_status) - return 0; - - { - int i; - - retval = 0; - for (i = 8; i < 12; i++) - { - retval <<= 8; - retval += buf[i]; - } - } - - return retval; -} - -/*! - * Eject using SCSI MMC commands. Return 0 if successful. - */ -int -eject_media_freebsd_cam (_img_private_t *p_env) -{ - int i_status; - scsi_mmc_cdb_t cdb = {{0, }}; - uint8_t buf[1]; - - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_ALLOW_MEDIUM_REMOVAL); - - i_status = run_scsi_cmd_freebsd_cam (p_env, DEFAULT_TIMEOUT_MSECS, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_WRITE, 0, &buf); - if (0 != i_status) - return i_status; - - cdb.field[4] = 1; - i_status = run_scsi_cmd_freebsd_cam (p_env, DEFAULT_TIMEOUT_MSECS, - scsi_mmc_get_cmd_len(cdb.field[0]), &cdb, - SCSI_MMC_DATA_WRITE, 0, &buf); - if (0 != i_status) - return i_status; - - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_START_STOP); - cdb.field[4] = 2; /* eject */ - - return run_scsi_cmd_freebsd_cam (p_env, DEFAULT_TIMEOUT_MSECS, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, - SCSI_MMC_DATA_WRITE, 0, &buf); -} - -#endif /* HAVE_FREEBSD_CDROM */ diff --git a/src/input/vcd/libcdio/FreeBSD/freebsd_ioctl.c b/src/input/vcd/libcdio/FreeBSD/freebsd_ioctl.c deleted file mode 100644 index be9835c95..000000000 --- a/src/input/vcd/libcdio/FreeBSD/freebsd_ioctl.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - $Id: freebsd_ioctl.c,v 1.1 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/* This file contains FreeBSD-specific code and implements low-level - control of the CD drive. Culled initially I think from xine's or - mplayer's FreeBSD code with lots of modifications. -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -static const char _rcsid[] = "$Id: freebsd_ioctl.c,v 1.1 2005/01/01 02:43:57 rockyb Exp $"; - -#ifdef HAVE_FREEBSD_CDROM - -#include "freebsd.h" - -/* Check a drive to see if it is a CD-ROM - Return 1 if a CD-ROM. 0 if it exists but isn't a CD-ROM drive - and -1 if no device exists . -*/ -bool -cdio_is_cdrom_freebsd_ioctl(char *drive, char *mnttype) -{ - bool is_cd=false; - int cdfd; - struct ioc_toc_header tochdr; - - /* If it doesn't exist, return -1 */ - if ( !cdio_is_device_quiet_generic(drive) ) { - return(false); - } - - /* If it does exist, verify that it's an available CD-ROM */ - cdfd = open(drive, (O_RDONLY|O_EXCL|O_NONBLOCK), 0); - - /* Should we want to test the condition in more detail: - ENOENT is the error for /dev/xxxxx does not exist; - ENODEV means there's no drive present. */ - - if ( cdfd >= 0 ) { - if ( ioctl(cdfd, CDIOREADTOCHEADER, &tochdr) != -1 ) { - is_cd = true; - } - close(cdfd); - } - /* Even if we can't read it, it might be mounted */ - else if ( mnttype && (strcmp(mnttype, "iso9660") == 0) ) { - is_cd = true; - } - return(is_cd); -} - -/*! - Reads a single mode2 sector from cd device into data starting from lsn. - Returns 0 if no error. - */ -int -read_audio_sectors_freebsd_ioctl (_img_private_t *_obj, void *data, lsn_t lsn, - unsigned int nblocks) -{ - unsigned char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; - struct ioc_read_audio cdda; - - cdda.address.lba = lsn; - cdda.buffer = buf; - cdda.nframes = nblocks; - cdda.address_format = CDIO_CDROM_LBA; - - /* read a frame */ - if(ioctl(_obj->gen.fd, CDIOCREADAUDIO, &cdda) < 0) { - perror("CDIOCREADAUDIO"); - return 1; - } - memcpy (data, buf, CDIO_CD_FRAMESIZE_RAW); - - return 0; -} - -/*! - Reads a single mode2 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ -int -read_mode2_sector_freebsd_ioctl (_img_private_t *env, void *data, lsn_t lsn, - bool b_form2) -{ - char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; - int retval; - - if ( !b_form2 ) - return cdio_generic_read_form1_sector (env, buf, lsn); - - if ( (retval = read_audio_sectors_freebsd_ioctl (env, buf, lsn, 1)) ) - return retval; - - memcpy (data, buf + CDIO_CD_XA_SYNC_HEADER, M2RAW_SECTOR_SIZE); - - return 0; -} - -/*! - Return the size of the CD in logical block address (LBA) units. - */ -uint32_t -stat_size_freebsd_ioctl (_img_private_t *_obj) -{ - struct ioc_read_toc_single_entry tocent; - uint32_t size; - - tocent.track = CDIO_CDROM_LEADOUT_TRACK; - tocent.address_format = CDIO_CDROM_LBA; - if (ioctl (_obj->gen.fd, CDIOREADTOCENTRY, &tocent) == -1) - { - perror ("ioctl(CDROMREADTOCENTRY)"); - exit (EXIT_FAILURE); - } - - size = tocent.entry.addr.lba; - - return size; -} - -/*! - Eject media. Return 1 if successful, 0 otherwise. - */ -int -eject_media_freebsd_ioctl (_img_private_t *env) -{ - _img_private_t *_obj = env; - int ret=2; - int fd; - - if ((fd = open(_obj->gen.source_name, O_RDONLY|O_NONBLOCK)) > -1) { - ret = 1; - if (ioctl(fd, CDIOCALLOW) == -1) { - cdio_warn("ioctl(fd, CDIOCALLOW) failed: %s\n", strerror(errno)); - } else if (ioctl(fd, CDIOCEJECT) == -1) { - cdio_warn("ioctl(CDIOCEJECT) failed: %s\n", strerror(errno)); - } else { - ret = 0; - } - close(fd); - } - - return ret; -} - -/*! - Return the media catalog number MCN. - - Note: string is malloc'd so caller should free() then returned - string when done with it. - - FIXME: This is just a guess. - - */ -char * -get_mcn_freebsd_ioctl (const _img_private_t *env) { - - struct ioc_read_subchannel subchannel; - struct cd_sub_channel_info subchannel_info; - - subchannel.address_format = CDIO_CDROM_MSF; - subchannel.data_format = CDIO_SUBCHANNEL_MEDIA_CATALOG; - subchannel.track = 0; - subchannel.data_len = sizeof(subchannel_info); - subchannel.data = &subchannel_info; - - if(ioctl(env->gen.fd, CDIOCREADSUBCHANNEL, &subchannel) < 0) { - perror("CDIOCREADSUBCHANNEL"); - return NULL; - } - - /* Probably need a loop over tracks rather than give up if we - can't find in track 0. - */ - if (subchannel_info.what.media_catalog.mc_valid) - return strdup(subchannel_info.what.media_catalog.mc_number); - else - return NULL; -} - -/*! - Get format of track. - - FIXME: We're just guessing this from the GNU/Linux code. - -*/ -track_format_t -get_track_format_freebsd_ioctl(const _img_private_t *env, track_t i_track) -{ - struct ioc_read_subchannel subchannel; - struct cd_sub_channel_info subchannel_info; - - subchannel.address_format = CDIO_CDROM_LBA; - subchannel.data_format = CDIO_SUBCHANNEL_CURRENT_POSITION; - subchannel.track = i_track; - subchannel.data_len = 1; - subchannel.data = &subchannel_info; - - if(ioctl(env->gen.fd, CDIOCREADSUBCHANNEL, &subchannel) < 0) { - perror("CDIOCREADSUBCHANNEL"); - return 1; - } - - if (subchannel_info.what.position.control == 0x04) { - if (subchannel_info.what.position.data_format == 0x10) - return TRACK_FORMAT_CDI; - else if (subchannel_info.what.position.data_format == 0x20) - return TRACK_FORMAT_XA; - else - return TRACK_FORMAT_DATA; - } else - return TRACK_FORMAT_AUDIO; -} - -/*! - Return true if we have XA data (green, mode2 form1) or - XA data (green, mode2 form2). That is track begins: - sync - header - subheader - 12 4 - 8 - - FIXME: there's gotta be a better design for this and get_track_format? -*/ -bool -get_track_green_freebsd_ioctl(const _img_private_t *env, track_t i_track) -{ - struct ioc_read_subchannel subchannel; - struct cd_sub_channel_info subchannel_info; - - subchannel.address_format = CDIO_CDROM_LBA; - subchannel.data_format = CDIO_SUBCHANNEL_CURRENT_POSITION; - subchannel.track = i_track; - subchannel.data_len = 1; - subchannel.data = &subchannel_info; - - if(ioctl(env->gen.fd, CDIOCREADSUBCHANNEL, &subchannel) < 0) { - perror("CDIOCREADSUBCHANNEL"); - return 1; - } - - /* FIXME: Dunno if this is the right way, but it's what - I was using in cdinfo for a while. - */ - return (subchannel_info.what.position.control & 2) != 0; -} - -#endif /* HAVE_FREEBSD_CDROM */ diff --git a/src/input/vcd/libcdio/MSWindows/Makefile.am b/src/input/vcd/libcdio/MSWindows/Makefile.am deleted file mode 100644 index 61089cf69..000000000 --- a/src/input/vcd/libcdio/MSWindows/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -EXTRA_DIST = aspi32.c aspi32.h win32.c win32.h win32_ioctl.c diff --git a/src/input/vcd/libcdio/MSWindows/aspi32.c b/src/input/vcd/libcdio/MSWindows/aspi32.c deleted file mode 100644 index 238a4b4e9..000000000 --- a/src/input/vcd/libcdio/MSWindows/aspi32.c +++ /dev/null @@ -1,805 +0,0 @@ -/* - $Id: aspi32.c,v 1.2 2005/01/01 02:43:58 rockyb Exp $ - - Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/* This file contains Win32-specific code and implements low-level - control of the CD drive via the ASPI API. - Inspired by vlc's cdrom.h code -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -static const char _rcsid[] = "$Id: aspi32.c,v 1.2 2005/01/01 02:43:58 rockyb Exp $"; - -#include <cdio/cdio.h> -#include <cdio/sector.h> -#include <cdio/util.h> -#include <cdio/scsi_mmc.h> -#include "cdio_assert.h" - -#include <string.h> - -#ifdef HAVE_WIN32_CDROM - -#include <ctype.h> -#include <stdio.h> -#include <stdlib.h> -#include <errno.h> -#include <unistd.h> -#include <fcntl.h> - -#include <windows.h> -#include "win32.h" - -#include <sys/stat.h> -#include <sys/types.h> -#include "aspi32.h" -#include "cdtext_private.h" - -/* Amount of time we are willing to wait for an operation to complete. - 10 seconds? -*/ -#define OP_TIMEOUT_MS 10000 - -static const -char *aspierror(int nErrorCode) -{ - switch (nErrorCode) - { - case SS_PENDING: - return "SRB being processed"; - break; - case SS_COMP: - return "SRB completed without error"; - break; - case SS_ABORTED: - return "SRB aborted"; - break; - case SS_ABORT_FAIL: - return "Unable to abort SRB"; - break; - case SS_ERR: - return "SRB completed with error"; - break; - case SS_INVALID_CMD: - return "Invalid ASPI command"; - break; - case SS_INVALID_HA: - return "Invalid host adapter number"; - break; - case SS_NO_DEVICE: - return "SCSI device not installed"; - break; - case SS_INVALID_SRB: - return "Invalid parameter set in SRB"; - break; - case SS_OLD_MANAGER: - return "ASPI manager doesn't support"; - break; - case SS_ILLEGAL_MODE: - return "Unsupported MS Windows mode"; - break; - case SS_NO_ASPI: - return "No ASPI managers"; - break; - case SS_FAILED_INIT: - return "ASPI for windows failed init"; - break; - case SS_ASPI_IS_BUSY: - return "No resources available to execute command."; - break; - case SS_BUFFER_TOO_BIG: - return "Buffer size is too big to handle."; - break; - case SS_MISMATCHED_COMPONENTS: - return "The DLLs/EXEs of ASPI don't version check"; - break; - case SS_NO_ADAPTERS: - return "No host adapters found"; - break; - case SS_INSUFFICIENT_RESOURCES: - return "Couldn't allocate resources needed to init"; - break; - case SS_ASPI_IS_SHUTDOWN: - return "Call came to ASPI after PROCESS_DETACH"; - break; - case SS_BAD_INSTALL: - return "The DLL or other components are installed wrong."; - break; - default: - return "Unknown ASPI error."; - } -} - -/* General ioctl() CD-ROM command function */ -static bool -mciSendCommand_aspi(int id, UINT msg, DWORD flags, void *arg) -{ - MCIERROR mci_error; - - mci_error = mciSendCommand(id, msg, flags, (DWORD)arg); - if ( mci_error ) { - char error[256]; - - mciGetErrorString(mci_error, error, 256); - cdio_warn("mciSendCommand() error: %s", error); - } - return(mci_error == 0); -} - -/* - See if the ASPI DLL is loadable. If so pointers are returned - and we return true. Return false if there was a problem. - */ -static bool -have_aspi( HMODULE *hASPI, - long (**lpGetSupport)( void ), - long (**lpSendCommand)( void* ) ) -{ - /* check if aspi is available */ - *hASPI = LoadLibrary( "wnaspi32.dll" ); - - if( *hASPI == NULL ) { - cdio_debug("Unable to load ASPI DLL"); - return false; - } - - (FARPROC) *lpGetSupport = GetProcAddress( *hASPI, - "GetASPI32SupportInfo" ); - (FARPROC) *lpSendCommand = GetProcAddress( *hASPI, - "SendASPI32Command" ); - - /* make sure that we've got both function addresses */ - if( *lpGetSupport == NULL || *lpSendCommand == NULL ) { - cdio_debug("Unable to get ASPI function pointers"); - FreeLibrary( *hASPI ); - return false; - } - - return true; -} - -/*! - Get disc type associated with cd object. -*/ -discmode_t -get_discmode_aspi (_img_private_t *p_env) -{ - track_t i_track; - discmode_t discmode=CDIO_DISC_MODE_NO_INFO; - - /* See if this is a DVD. */ - cdio_dvd_struct_t dvd; /* DVD READ STRUCT for layer 0. */ - - dvd.physical.type = CDIO_DVD_STRUCT_PHYSICAL; - dvd.physical.layer_num = 0; - if (0 == scsi_mmc_get_dvd_struct_physical_private (p_env, - &run_scsi_cmd_aspi, - &dvd)) { - switch(dvd.physical.layer[0].book_type) { - case CDIO_DVD_BOOK_DVD_ROM: return CDIO_DISC_MODE_DVD_ROM; - case CDIO_DVD_BOOK_DVD_RAM: return CDIO_DISC_MODE_DVD_RAM; - case CDIO_DVD_BOOK_DVD_R: return CDIO_DISC_MODE_DVD_R; - case CDIO_DVD_BOOK_DVD_RW: return CDIO_DISC_MODE_DVD_RW; - case CDIO_DVD_BOOK_DVD_PR: return CDIO_DISC_MODE_DVD_PR; - case CDIO_DVD_BOOK_DVD_PRW: return CDIO_DISC_MODE_DVD_PRW; - default: return CDIO_DISC_MODE_DVD_OTHER; - } - } - - if (!p_env->gen.toc_init) - read_toc_aspi (p_env); - - if (!p_env->gen.toc_init) - return CDIO_DISC_MODE_NO_INFO; - - for (i_track = p_env->gen.i_first_track; - i_track < p_env->gen.i_first_track + p_env->gen.i_tracks ; - i_track ++) { - track_format_t track_fmt=get_track_format_aspi(p_env, i_track); - - switch(track_fmt) { - case TRACK_FORMAT_AUDIO: - switch(discmode) { - case CDIO_DISC_MODE_NO_INFO: - discmode = CDIO_DISC_MODE_CD_DA; - break; - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* No change*/ - break; - default: - discmode = CDIO_DISC_MODE_CD_MIXED; - } - break; - case TRACK_FORMAT_XA: - switch(discmode) { - case CDIO_DISC_MODE_NO_INFO: - discmode = CDIO_DISC_MODE_CD_XA; - break; - case CDIO_DISC_MODE_CD_XA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* No change*/ - break; - default: - discmode = CDIO_DISC_MODE_CD_MIXED; - } - break; - case TRACK_FORMAT_DATA: - switch(discmode) { - case CDIO_DISC_MODE_NO_INFO: - discmode = CDIO_DISC_MODE_CD_DATA; - break; - case CDIO_DISC_MODE_CD_DATA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* No change*/ - break; - default: - discmode = CDIO_DISC_MODE_CD_MIXED; - } - break; - case TRACK_FORMAT_ERROR: - default: - discmode = CDIO_DISC_MODE_ERROR; - } - } - return discmode; -} - -const char * -is_cdrom_aspi(const char drive_letter) -{ - static char psz_win32_drive[7]; - HMODULE hASPI = NULL; - long (*lpGetSupport)( void ) = NULL; - long (*lpSendCommand)( void* ) = NULL; - DWORD dwSupportInfo; - int i_adapter, i_hostadapters; - char c_drive; - int i_rc; - - if ( !have_aspi(&hASPI, &lpGetSupport, &lpSendCommand) ) - return NULL; - - /* ASPI support seems to be there. */ - - dwSupportInfo = lpGetSupport(); - - i_rc = HIBYTE( LOWORD ( dwSupportInfo ) ); - - if( SS_COMP != i_rc ) { - cdio_debug("ASPI: %s", aspierror(i_rc)); - FreeLibrary( hASPI ); - return NULL; - } - - i_hostadapters = LOBYTE( LOWORD( dwSupportInfo ) ); - if( i_hostadapters == 0 ) { - FreeLibrary( hASPI ); - return NULL; - } - - c_drive = toupper(drive_letter) - 'A'; - - for( i_adapter = 0; i_adapter < i_hostadapters; i_adapter++ ) { - struct SRB_GetDiskInfo srbDiskInfo; - int i_target; - SRB_HAInquiry srbInquiry; - - srbInquiry.SRB_Cmd = SC_HA_INQUIRY; - srbInquiry.SRB_HaId = i_adapter; - - lpSendCommand( (void*) &srbInquiry ); - - if( srbInquiry.SRB_Status != SS_COMP ) continue; - if( !srbInquiry.HA_Unique[3]) srbInquiry.HA_Unique[3]=8; - - for(i_target=0; i_target < srbInquiry.HA_Unique[3]; i_target++) - { - int i_lun; - for( i_lun=0; i_lun<8; i_lun++) - { - srbDiskInfo.SRB_Cmd = SC_GET_DISK_INFO; - srbDiskInfo.SRB_Flags = 0; - srbDiskInfo.SRB_Hdr_Rsvd = 0; - srbDiskInfo.SRB_HaId = i_adapter; - srbDiskInfo.SRB_Target = i_target; - srbDiskInfo.SRB_Lun = i_lun; - - lpSendCommand( (void*) &srbDiskInfo ); - - if( (srbDiskInfo.SRB_Status == SS_COMP) && - (srbDiskInfo.SRB_Int13HDriveInfo == c_drive) ) { - /* Make sure this is a CD-ROM device. */ - struct SRB_GDEVBlock srbGDEVBlock; - - memset( &srbGDEVBlock, 0, sizeof(struct SRB_GDEVBlock) ); - srbGDEVBlock.SRB_Cmd = SC_GET_DEV_TYPE; - srbDiskInfo.SRB_HaId = i_adapter; - srbGDEVBlock.SRB_Target = i_target; - srbGDEVBlock.SRB_Lun = i_lun; - - lpSendCommand( (void*) &srbGDEVBlock ); - - if( ( srbGDEVBlock.SRB_Status == SS_COMP ) && - ( srbGDEVBlock.SRB_DeviceType == DTYPE_CDROM ) ) { - sprintf( psz_win32_drive, "%c:", drive_letter ); - FreeLibrary( hASPI ); - return(psz_win32_drive); - } - } - } - } - } - FreeLibrary( hASPI ); - return NULL; -} - -/*! - Initialize CD device. - */ -bool -init_aspi (_img_private_t *env) -{ - HMODULE hASPI = NULL; - long (*lpGetSupport)( void ) = NULL; - long (*lpSendCommand)( void* ) = NULL; - DWORD dwSupportInfo; - int i_adapter, i_hostadapters; - char c_drive; - int i_rc; - - if (2 == strlen(env->gen.source_name) && isalpha(env->gen.source_name[0]) ) - { - c_drive = env->gen.source_name[0]; - } else if ( 6 == strlen(env->gen.source_name) - && isalpha(env->gen.source_name[4] )) { - c_drive = env->gen.source_name[4]; - } else { - c_drive = 'C'; - } - - if ( !have_aspi(&hASPI, &lpGetSupport, &lpSendCommand) ) - return false; - - /* ASPI support seems to be there. */ - - dwSupportInfo = lpGetSupport(); - - i_rc = HIBYTE( LOWORD ( dwSupportInfo ) ); - - if( SS_COMP != i_rc ) { - cdio_info("ASPI: %s", aspierror(i_rc)); - FreeLibrary( hASPI ); - return false; - } - - i_hostadapters = LOBYTE( LOWORD( dwSupportInfo ) ); - if( i_hostadapters == 0 ) { - FreeLibrary( hASPI ); - return false; - } - - c_drive = toupper(c_drive) - 'A'; - - for( i_adapter = 0; i_adapter < i_hostadapters; i_adapter++ ) { - struct SRB_GetDiskInfo srbDiskInfo; - int i_target; - SRB_HAInquiry srbInquiry; - - srbInquiry.SRB_Cmd = SC_HA_INQUIRY; - srbInquiry.SRB_HaId = i_adapter; - - lpSendCommand( (void*) &srbInquiry ); - - if( srbInquiry.SRB_Status != SS_COMP ) continue; - if( !srbInquiry.HA_Unique[3]) srbInquiry.HA_Unique[3]=8; - - for(i_target=0; i_target < srbInquiry.HA_Unique[3]; i_target++) - { - int i_lun; - for (i_lun = 0; i_lun < 8; i_lun++ ) { - srbDiskInfo.SRB_Cmd = SC_GET_DISK_INFO; - srbDiskInfo.SRB_Flags = 0; - srbDiskInfo.SRB_Hdr_Rsvd = 0; - srbDiskInfo.SRB_HaId = i_adapter; - srbDiskInfo.SRB_Target = i_target; - srbDiskInfo.SRB_Lun = i_lun; - - lpSendCommand( (void*) &srbDiskInfo ); - - if( (srbDiskInfo.SRB_Status == SS_COMP) ) { - - if (srbDiskInfo.SRB_Int13HDriveInfo != c_drive) - { - continue; - } else { - /* Make sure this is a CD-ROM device. */ - struct SRB_GDEVBlock srbGDEVBlock; - - memset( &srbGDEVBlock, 0, sizeof(struct SRB_GDEVBlock) ); - srbGDEVBlock.SRB_Cmd = SC_GET_DEV_TYPE; - srbGDEVBlock.SRB_HaId = i_adapter; - srbGDEVBlock.SRB_Target = i_target; - - lpSendCommand( (void*) &srbGDEVBlock ); - - if( ( srbGDEVBlock.SRB_Status == SS_COMP ) && - ( srbGDEVBlock.SRB_DeviceType == DTYPE_CDROM ) ) { - env->i_sid = MAKEWORD( i_adapter, i_target ); - env->hASPI = (long)hASPI; - env->lpSendCommand = lpSendCommand; - env->b_aspi_init = true; - env->i_lun = i_lun; - cdio_debug("Using ASPI layer"); - - return true; - } else { - FreeLibrary( hASPI ); - cdio_debug( "%c: is not a CD-ROM drive", - env->gen.source_name[0] ); - return false; - } - } - } - } - } - } - - FreeLibrary( hASPI ); - cdio_debug( "Unable to get HaId and target (ASPI)" ); - return false; -} - -/*! - Run a SCSI MMC command. - - env private CD structure - i_timeout_ms time in milliseconds we will wait for the command - to complete. If this value is -1, use the default - time-out value. - p_buf Buffer for data, both sending and receiving - i_buf Size of buffer - e_direction direction the transfer is to go. - cdb CDB bytes. All values that are needed should be set on - input. We'll figure out what the right CDB length should be. - - We return 0 if command completed successfully. - */ -int -run_scsi_cmd_aspi( const void *p_user_data, unsigned int i_timeout_ms, - unsigned int i_cdb, const scsi_mmc_cdb_t * p_cdb, - scsi_mmc_direction_t e_direction, - unsigned int i_buf, /*in/out*/ void *p_buf ) -{ - const _img_private_t *p_env = p_user_data; - HANDLE hEvent; - struct SRB_ExecSCSICmd ssc; - - /* Create the transfer completion event */ - hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); - if( hEvent == NULL ) { - cdio_info("CreateEvent failed"); - return 1; - } - - memset( &ssc, 0, sizeof( ssc ) ); - - ssc.SRB_Cmd = SC_EXEC_SCSI_CMD; - - ssc.SRB_Flags = SCSI_MMC_DATA_READ == e_direction ? - SRB_DIR_IN | SRB_EVENT_NOTIFY : SRB_DIR_OUT | SRB_EVENT_NOTIFY; - - ssc.SRB_HaId = LOBYTE( p_env->i_sid ); - ssc.SRB_Target = HIBYTE( p_env->i_sid ); - ssc.SRB_Lun = p_env->i_lun; - ssc.SRB_SenseLen = SENSE_LEN; - - ssc.SRB_PostProc = (LPVOID) hEvent; - ssc.SRB_CDBLen = i_cdb; - - /* Result buffer */ - ssc.SRB_BufPointer = p_buf; - ssc.SRB_BufLen = i_buf; - - memcpy( ssc.CDBByte, p_cdb, i_cdb ); - - ResetEvent( hEvent ); - p_env->lpSendCommand( (void*) &ssc ); - - /* If the command has still not been processed, wait until it's - * finished */ - if( ssc.SRB_Status == SS_PENDING ) { - WaitForSingleObject( hEvent, msecs2secs(i_timeout_ms) ); - } - CloseHandle( hEvent ); - - /* check that the transfer went as planned */ - if( ssc.SRB_Status != SS_COMP ) { - cdio_info("ASPI: %s", aspierror(ssc.SRB_Status)); - return 2; - } - - return 0; -} - - -/*! - Reads nblocks sectors from cd device into data starting from lsn. - Returns 0 if no error. - */ -static int -read_sectors_aspi (const _img_private_t *env, void *data, lsn_t lsn, - int sector_type, unsigned int nblocks) -{ - scsi_mmc_cdb_t cdb = {{0, }}; - unsigned int i_buf; - - int sync = 0; - int header_code = 2; - int i_user_data = 1; - int edc_ecc = 0; - int error_field = 0; - -#if 0 - sector_type = 0; /*all types */ -#endif - - /* Set up passthrough command */ - CDIO_MMC_SET_COMMAND (cdb.field, CDIO_MMC_GPCMD_READ_CD); - CDIO_MMC_SET_READ_TYPE (cdb.field, sector_type); - CDIO_MMC_SET_READ_LBA (cdb.field, lsn); - CDIO_MMC_SET_READ_LENGTH24(cdb.field, nblocks); - -#if 1 - cdb.field[ 9 ] = (sync << 7) | - (header_code << 5) | - (i_user_data << 4) | - (edc_ecc << 3) | - (error_field << 1); - /* ssc.CDBByte[ 9 ] = READ_CD_USERDATA_MODE2; */ -#else - CDIO_MMC_SET_MAIN_CHANNEL_SELECTION_BITS(cmd, - CDIO_MMC_MCSB_ALL_HEADERS); -#endif - - switch (sector_type) { - case CDIO_MMC_READ_TYPE_ANY: - case CDIO_MMC_READ_TYPE_CDDA: - i_buf = CDIO_CD_FRAMESIZE_RAW; - break; - case CDIO_MMC_READ_TYPE_M2F1: - i_buf = CDIO_CD_FRAMESIZE; - break; - case CDIO_MMC_READ_TYPE_M2F2: - i_buf = 2324; - break; - case CDIO_MMC_READ_TYPE_MODE1: - i_buf = CDIO_CD_FRAMESIZE; - break; - default: - i_buf = CDIO_CD_FRAMESIZE_RAW; - } - - return run_scsi_cmd_aspi(env, OP_TIMEOUT_MS, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_READ, i_buf*nblocks, data); -} - -/*! - Reads an audio device into data starting from lsn. - Returns 0 if no error. - */ -int -read_audio_sectors_aspi (_img_private_t *env, void *data, lsn_t lsn, - unsigned int nblocks) -{ - if (read_sectors_aspi(env, data, lsn, CDIO_MMC_READ_TYPE_CDDA, 1)) { - return read_sectors_aspi(env, data, lsn, CDIO_MMC_READ_TYPE_ANY, 1); - } - return 0; -} - -/*! - Reads a single mode2 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ -int -read_mode2_sector_aspi (const _img_private_t *env, void *data, lsn_t lsn, - bool b_form2) -{ - return read_sectors_aspi(env, data, lsn, b_form2 - ? CDIO_MMC_READ_TYPE_M2F2 - : CDIO_MMC_READ_TYPE_M2F1, - 1); -} - -/*! - Reads a single mode2 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ -int -read_mode1_sector_aspi (const _img_private_t *env, void *data, lsn_t lsn, - bool b_form2) -{ - return read_sectors_aspi(env, data, lsn, CDIO_MMC_READ_TYPE_MODE1, 1); -} - -/*! - Read and cache the CD's Track Table of Contents and track info. - Return true if successful or false if an error. -*/ -bool -read_toc_aspi (_img_private_t *p_env) -{ - scsi_mmc_cdb_t cdb = {{0, }}; - unsigned char tocheader[ 4 ]; - int i_status; - - /* Operation code */ - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_TOC); - - /* Format */ - cdb.field[ 2 ] = CDIO_MMC_READTOC_FMT_TOC; - - /* Starting track */ - CDIO_MMC_SET_START_TRACK(cdb.field, 0); - - CDIO_MMC_SET_READ_LENGTH16(cdb.field, sizeof(tocheader)); - - i_status = run_scsi_cmd_aspi (p_env, OP_TIMEOUT_MS, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_READ, - sizeof(tocheader), &tocheader); - - if (0 != i_status) return false; - - p_env->gen.i_first_track = tocheader[2]; - p_env->gen.i_tracks = tocheader[3] - tocheader[2] + 1; - - { - int i, i_toclength; - unsigned char *p_fulltoc; - - i_toclength = 4 /* header */ + tocheader[0] + - ((unsigned int) tocheader[1] << 8); - - p_fulltoc = malloc( i_toclength ); - - if( p_fulltoc == NULL ) { - cdio_error( "out of memory" ); - return false; - } - - CDIO_MMC_SET_READ_LENGTH16(cdb.field, i_toclength); - - i_status = run_scsi_cmd_aspi (p_env, OP_TIMEOUT_MS, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_READ, - i_toclength, p_fulltoc); - if( 0 != i_status ) { - p_env->gen.i_tracks = 0; - } - - for( i = 0 ; i <= p_env->gen.i_tracks ; i++ ) { - int i_index = 8 + 8 * i; - p_env->tocent[ i ].start_lsn = ((int)p_fulltoc[ i_index ] << 24) + - ((int)p_fulltoc[ i_index+1 ] << 16) + - ((int)p_fulltoc[ i_index+2 ] << 8) + - (int)p_fulltoc[ i_index+3 ]; - p_env->tocent[ i ].Control = (UCHAR)p_fulltoc[ 1 + 8 * i ]; - - cdio_debug( "p_sectors: %i %lu", - i, (unsigned long int) p_env->tocent[i].start_lsn ); - } - - free( p_fulltoc ); - } - - p_env->gen.toc_init = true; - return true; -} - -/* Eject media will eventually get removed from _cdio_win32.c */ -#if 0 -/*! - Eject media. Return 1 if successful, 0 otherwise. - */ -int -wnaspi32_eject_media (void *user_data) { - - _img_private_t *env = user_data; - - - MCI_OPEN_PARMS op; - MCI_STATUS_PARMS st; - DWORD i_flags; - char psz_drive[4]; - int ret; - - memset( &op, 0, sizeof(MCI_OPEN_PARMS) ); - op.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_CD_AUDIO; - strcpy( psz_drive, "X:" ); - psz_drive[0] = env->gen.source_name[0]; - op.lpstrElementName = psz_drive; - - /* Set the flags for the device type */ - i_flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | - MCI_OPEN_ELEMENT | MCI_OPEN_SHAREABLE; - - if( mciSendCommand_aspi( 0, MCI_OPEN, i_flags, &op ) ) { - st.dwItem = MCI_STATUS_READY; - /* Eject disc */ - ret = mciSendCommand_aspi( op.wDeviceID, MCI_SET, - MCI_SET_DOOR_OPEN, 0 ) != 0; - /* Release access to the device */ - mciSendCommand_aspi( op.wDeviceID, MCI_CLOSE, MCI_WAIT, 0 ); - } else - ret = 0; - - return ret; -} -#endif - -/*! - Get format of track. -*/ -track_format_t -get_track_format_aspi(const _img_private_t *p_env, track_t track_num) -{ - MCI_OPEN_PARMS op; - MCI_STATUS_PARMS st; - DWORD i_flags; - int ret; - - memset( &op, 0, sizeof(MCI_OPEN_PARMS) ); - op.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_CD_AUDIO; - op.lpstrElementName = p_env->gen.source_name; - - /* Set the flags for the device type */ - i_flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | - MCI_OPEN_ELEMENT | MCI_OPEN_SHAREABLE; - - if( mciSendCommand_aspi( 0, MCI_OPEN, i_flags, &op ) ) { - st.dwItem = MCI_CDA_STATUS_TYPE_TRACK; - st.dwTrack = track_num; - i_flags = MCI_TRACK | MCI_STATUS_ITEM ; - ret = mciSendCommand_aspi( op.wDeviceID, MCI_STATUS, i_flags, &st ); - - /* Release access to the device */ - mciSendCommand_aspi( op.wDeviceID, MCI_CLOSE, MCI_WAIT, 0 ); - - switch(st.dwReturn) { - case MCI_CDA_TRACK_AUDIO: - return TRACK_FORMAT_AUDIO; - case MCI_CDA_TRACK_OTHER: - return TRACK_FORMAT_DATA; - default: - return TRACK_FORMAT_XA; - } - } - return TRACK_FORMAT_ERROR; -} - -#endif /* HAVE_WIN32_CDROM */ diff --git a/src/input/vcd/libcdio/MSWindows/aspi32.h b/src/input/vcd/libcdio/MSWindows/aspi32.h deleted file mode 100644 index 8742c0794..000000000 --- a/src/input/vcd/libcdio/MSWindows/aspi32.h +++ /dev/null @@ -1,249 +0,0 @@ -/* Win32 aspi specific */ -/* - $Id: aspi32.h,v 1.2 2005/01/01 02:43:58 rockyb Exp $ - - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -#define ASPI_HAID 0 -#define ASPI_TARGET 0 -#define DTYPE_CDROM 0x05 - -#define SENSE_LEN 0x0E -#define SC_HA_INQUIRY 0x00 -#define SC_GET_DEV_TYPE 0x01 -#define SC_EXEC_SCSI_CMD 0x02 -#define SC_GET_DISK_INFO 0x06 - -//***************************************************************************** -// %%% SRB Status %%% -//***************************************************************************** - -#define SS_PENDING 0x00 // SRB being processed -#define SS_COMP 0x01 // SRB completed without error -#define SS_ABORTED 0x02 // SRB aborted -#define SS_ABORT_FAIL 0x03 // Unable to abort SRB -#define SS_ERR 0x04 // SRB completed with error - -#define SS_INVALID_CMD 0x80 // Invalid ASPI command -#define SS_INVALID_HA 0x81 // Invalid host adapter number -#define SS_NO_DEVICE 0x82 // SCSI device not installed - -#define SS_INVALID_SRB 0xE0 // Invalid parameter set in SRB -#define SS_OLD_MANAGER 0xE1 // ASPI manager doesn't support Windows -#define SS_BUFFER_ALIGN 0xE1 // Buffer not aligned (replaces - // OLD_MANAGER in Win32) -#define SS_ILLEGAL_MODE 0xE2 // Unsupported Windows mode -#define SS_NO_ASPI 0xE3 // No ASPI managers resident -#define SS_FAILED_INIT 0xE4 // ASPI for windows failed init -#define SS_ASPI_IS_BUSY 0xE5 // No resources available to execute - // cmd -#define SS_BUFFER_TOO_BIG 0xE6 // Buffer size to big to handle! -#define SS_MISMATCHED_COMPONENTS 0xE7 // The DLLs/EXEs of ASPI don't version - // check -#define SS_NO_ADAPTERS 0xE8 // No host adapters to manage -#define SS_INSUFFICIENT_RESOURCES 0xE9 // Couldn't allocate resources needed - // to init -#define SS_ASPI_IS_SHUTDOWN 0xEA // Call came to ASPI after - // PROCESS_DETACH -#define SS_BAD_INSTALL 0xEB // The DLL or other components are installed wrong - -//***************************************************************************** -// %%% Host Adapter Status %%% -//***************************************************************************** - -#define HASTAT_OK 0x00 // Host adapter did not detect an - // error -#define HASTAT_SEL_TO 0x11 // Selection Timeout -#define HASTAT_DO_DU 0x12 // Data overrun data underrun -#define HASTAT_BUS_FREE 0x13 // Unexpected bus free -#define HASTAT_PHASE_ERR 0x14 // Target bus phase sequence - // failure -#define HASTAT_TIMEOUT 0x09 // Timed out while SRB was - // waiting to beprocessed. -#define HASTAT_COMMAND_TIMEOUT 0x0B // Adapter timed out processing SRB. -#define HASTAT_MESSAGE_REJECT 0x0D // While processing SRB, the - // adapter received a MESSAGE -#define HASTAT_BUS_RESET 0x0E // A bus reset was detected. -#define HASTAT_PARITY_ERROR 0x0F // A parity error was detected. -#define HASTAT_REQUEST_SENSE_FAILED 0x10 // The adapter failed in issuing -#define SS_NO_ADAPTERS 0xE8 -#define SRB_DIR_IN 0x08 -#define SRB_DIR_OUT 0x10 -#define SRB_EVENT_NOTIFY 0x40 - -#define SECTOR_TYPE_MODE2 0x14 -#define READ_CD_USERDATA_MODE2 0x10 - -#define READ_TOC 0x43 -#define READ_TOC_FORMAT_TOC 0x0 - -#pragma pack(1) - -struct SRB_GetDiskInfo -{ - unsigned char SRB_Cmd; - unsigned char SRB_Status; - unsigned char SRB_HaId; - unsigned char SRB_Flags; - unsigned long SRB_Hdr_Rsvd; - unsigned char SRB_Target; - unsigned char SRB_Lun; - unsigned char SRB_DriveFlags; - unsigned char SRB_Int13HDriveInfo; - unsigned char SRB_Heads; - unsigned char SRB_Sectors; - unsigned char SRB_Rsvd1[22]; -}; - -struct SRB_GDEVBlock -{ - unsigned char SRB_Cmd; - unsigned char SRB_Status; - unsigned char SRB_HaId; - unsigned char SRB_Flags; - unsigned long SRB_Hdr_Rsvd; - unsigned char SRB_Target; - unsigned char SRB_Lun; - unsigned char SRB_DeviceType; - unsigned char SRB_Rsvd1; -}; - -struct SRB_ExecSCSICmd -{ - unsigned char SRB_Cmd; - unsigned char SRB_Status; - unsigned char SRB_HaId; - unsigned char SRB_Flags; - unsigned long SRB_Hdr_Rsvd; - unsigned char SRB_Target; - unsigned char SRB_Lun; - unsigned short SRB_Rsvd1; - unsigned long SRB_BufLen; - unsigned char *SRB_BufPointer; - unsigned char SRB_SenseLen; - unsigned char SRB_CDBLen; - unsigned char SRB_HaStat; - unsigned char SRB_TargStat; - unsigned long *SRB_PostProc; - unsigned char SRB_Rsvd2[20]; - unsigned char CDBByte[16]; - unsigned char SenseArea[SENSE_LEN+2]; -}; - -/***************************************************************************** - %%% SRB - HOST ADAPTER INQUIRY - SC_HA_INQUIRY (0) %%% -*****************************************************************************/ - -typedef struct // Offset -{ // HX/DEC - BYTE SRB_Cmd; // 00/000 ASPI command code = SC_HA_INQUIRY - BYTE SRB_Status; // 01/001 ASPI command status byte - BYTE SRB_HaId; // 02/002 ASPI host adapter number - BYTE SRB_Flags; // 03/003 ASPI request flags - DWORD SRB_Hdr_Rsvd; // 04/004 Reserved, MUST = 0 - BYTE HA_Count; // 08/008 Number of host adapters present - BYTE HA_SCSI_ID; // 09/009 SCSI ID of host adapter - BYTE HA_ManagerId[16]; // 0A/010 String describing the manager - BYTE HA_Identifier[16]; // 1A/026 String describing the host adapter - BYTE HA_Unique[16]; // 2A/042 Host Adapter Unique parameters - WORD HA_Rsvd1; // 3A/058 Reserved, MUST = 0 -} -SRB_HAInquiry; - -/*! - Get disc type associated with cd object. -*/ -discmode_t get_discmode_aspi (_img_private_t *p_env); - -/*! - Return the the kind of drive capabilities of device. - - Note: string is malloc'd so caller should free() then returned - string when done with it. - - */ -char * get_mcn_aspi (const _img_private_t *env); - -/*! - Get the format (XA, DATA, AUDIO) of a track. -*/ -track_format_t get_track_format_aspi(const _img_private_t *env, - track_t i_track); - -/*! - Initialize internal structures for CD device. - */ -bool init_aspi (_img_private_t *env); - -/* - Read cdtext information for a CdIo object . - - return true on success, false on error or CD-TEXT information does - not exist. -*/ -bool init_cdtext_aspi (_img_private_t *env); - -const char *is_cdrom_aspi(const char drive_letter); - -/*! - Reads an audio device using the DeviceIoControl method into data - starting from lsn. Returns 0 if no error. - */ -int read_audio_sectors_aspi (_img_private_t *obj, void *data, lsn_t lsn, - unsigned int nblocks); -/*! - Reads a single mode1 sector using the DeviceIoControl method into - data starting from lsn. Returns 0 if no error. - */ -int read_mode1_sector_aspi (const _img_private_t *env, void *data, - lsn_t lsn, bool b_form2); -/*! - Reads a single mode2 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ -int read_mode2_sector_aspi (const _img_private_t *env, void *data, lsn_t lsn, - bool b_form2); - -/*! - Read and cache the CD's Track Table of Contents and track info. - Return true if successful or false if an error. -*/ -bool read_toc_aspi (_img_private_t *env); - -/*! - Run a SCSI MMC command. - - env private CD structure - i_timeout time in milliseconds we will wait for the command - to complete. If this value is -1, use the default - time-out value. - p_buf Buffer for data, both sending and receiving - i_buf Size of buffer - e_direction direction the transfer is to go. - cdb CDB bytes. All values that are needed should be set on - input. We'll figure out what the right CDB length should be. - - Return 0 if command completed successfully. - */ -int run_scsi_cmd_aspi( const void *p_user_data, - unsigned int i_timeout, - unsigned int i_cdb, - const scsi_mmc_cdb_t * p_cdb, - scsi_mmc_direction_t e_direction, - unsigned int i_buf, /*in/out*/ void *p_buf ); - diff --git a/src/input/vcd/libcdio/MSWindows/win32.c b/src/input/vcd/libcdio/MSWindows/win32.c deleted file mode 100644 index 1c9d9b93d..000000000 --- a/src/input/vcd/libcdio/MSWindows/win32.c +++ /dev/null @@ -1,805 +0,0 @@ -/* - $Id: win32.c,v 1.3 2006/09/26 22:10:24 dgp85 Exp $ - - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/* This file contains Win32-specific code and implements low-level - control of the CD drive. Inspired by vlc's cdrom.h code -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -static const char _rcsid[] = "$Id: win32.c,v 1.3 2006/09/26 22:10:24 dgp85 Exp $"; - -#include <cdio/cdio.h> -#include <cdio/sector.h> -#include <cdio/util.h> -#include <cdio/scsi_mmc.h> -#include "cdio_assert.h" -#include "cdio_private.h" /* protoype for cdio_is_device_win32 */ - -#include <string.h> - -#ifdef HAVE_WIN32_CDROM - -#include <ctype.h> -#include <stdio.h> - -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif - -#ifdef HAVE_ERRNO_H -#include <errno.h> -#endif - -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif - -#ifdef HAVE_FCNTL_H -#include <fcntl.h> -#endif - -#include <windows.h> -#include <winioctl.h> -#include "win32.h" - -#ifdef HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif - -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif - -#if defined (MSVC) || defined (_XBOX) -#undef IN -#else -#include "aspi32.h" -#endif - -#ifdef _XBOX -#include "stdint.h" -#include <xtl.h> -#define WIN_NT 1 -#else -#define WIN_NT ( GetVersion() < 0x80000000 ) -#endif - -/* General ioctl() CD-ROM command function */ -static bool -_cdio_mciSendCommand(int id, UINT msg, DWORD flags, void *arg) -{ -#ifdef _XBOX - return false; -#else - MCIERROR mci_error; - - mci_error = mciSendCommand(id, msg, flags, (DWORD)arg); - if ( mci_error ) { - char error[256]; - - mciGetErrorString(mci_error, error, 256); - cdio_warn("mciSendCommand() error: %s", error); - } - return(mci_error == 0); -#endif -} - -static access_mode_t -str_to_access_mode_win32(const char *psz_access_mode) -{ - const access_mode_t default_access_mode = - WIN_NT ? _AM_IOCTL : _AM_ASPI; - - if (NULL==psz_access_mode) return default_access_mode; - - if (!strcmp(psz_access_mode, "ioctl")) - return _AM_IOCTL; - else if (!strcmp(psz_access_mode, "ASPI")) { -#ifdef _XBOX - return _AM_ASPI; -#else - cdio_warn ("XBOX doesn't support access type: %s. Default used instead.", - psz_access_mode); - return default_access_mode; -#endif - } else { - cdio_warn ("unknown access type: %s. Default used instead.", - psz_access_mode); - return default_access_mode; - } -} - -static discmode_t -get_discmode_win32(void *p_user_data) -{ - _img_private_t *p_env = p_user_data; - - if (p_env->hASPI) { - return get_discmode_aspi (p_env); - } else { - return get_discmode_win32ioctl (p_env); - } -} - -static const char * -is_cdrom_win32(const char drive_letter) { - if ( WIN_NT ) { - return is_cdrom_win32ioctl (drive_letter); - } else { - return is_cdrom_aspi(drive_letter); - } -} - -/*! - Run a SCSI MMC command. - - env private CD structure - i_timeout_ms time in milliseconds we will wait for the command - to complete. If this value is -1, use the default - time-out value. - p_buf Buffer for data, both sending and receiving - i_buf Size of buffer - e_direction direction the transfer is to go. - cdb CDB bytes. All values that are needed should be set on - input. We'll figure out what the right CDB length should be. - - Return 0 if command completed successfully. - */ -static int -run_scsi_cmd_win32( const void *p_user_data, unsigned int i_timeout_ms, - unsigned int i_cdb, const scsi_mmc_cdb_t *p_cdb, - scsi_mmc_direction_t e_direction, - unsigned int i_buf, /*in/out*/ void *p_buf ) -{ - const _img_private_t *p_env = p_user_data; - - if (p_env->hASPI) { - return run_scsi_cmd_aspi( p_env, i_timeout_ms, i_cdb, p_cdb, - e_direction, i_buf, p_buf ); - } else { - return run_scsi_cmd_win32ioctl( p_env, i_timeout_ms, i_cdb, p_cdb, - e_direction, i_buf, p_buf ); - } -} - -/*! - Initialize CD device. - */ -static bool -_cdio_init_win32 (void *user_data) -{ - _img_private_t *p_env = user_data; - if (p_env->gen.init) { - cdio_error ("init called more than once"); - return false; - } - - p_env->gen.init = true; - p_env->gen.toc_init = false; - p_env->gen.b_cdtext_init = false; - p_env->gen.b_cdtext_error = false; - - /* Initializations */ - p_env->h_device_handle = NULL; - p_env->i_sid = 0; - p_env->hASPI = 0; - p_env->lpSendCommand = 0; - p_env->b_aspi_init = false; - p_env->b_ioctl_init = false; - - if ( _AM_IOCTL == p_env->access_mode ) { - return init_win32ioctl(p_env); - } else { - return init_aspi(p_env); - } -} - -/*! - Release and free resources associated with cd. - */ -static void -_free_win32 (void *user_data) -{ - _img_private_t *p_env = user_data; - - if (NULL == p_env) return; - free (p_env->gen.source_name); - - if( p_env->h_device_handle ) - CloseHandle( p_env->h_device_handle ); - if( p_env->hASPI ) - FreeLibrary( (HMODULE)p_env->hASPI ); - - free (p_env); -} - -/*! - Reads an audio device into data starting from lsn. - Returns 0 if no error. - */ -static int -_cdio_read_audio_sectors (void *user_data, void *data, lsn_t lsn, - unsigned int nblocks) -{ - _img_private_t *p_env = user_data; - if ( p_env->hASPI ) { - return read_audio_sectors_aspi( p_env, data, lsn, nblocks ); - } else { - return read_audio_sectors_win32ioctl( p_env, data, lsn, nblocks ); - } -} - -/*! - Reads a single mode1 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ -static int -_cdio_read_mode1_sector (void *user_data, void *data, lsn_t lsn, - bool b_form2) -{ - _img_private_t *p_env = user_data; - - if (p_env->gen.ioctls_debugged == 75) - cdio_debug ("only displaying every 75th ioctl from now on"); - - if (p_env->gen.ioctls_debugged == 30 * 75) - cdio_debug ("only displaying every 30*75th ioctl from now on"); - - if (p_env->gen.ioctls_debugged < 75 - || (p_env->gen.ioctls_debugged < (30 * 75) - && p_env->gen.ioctls_debugged % 75 == 0) - || p_env->gen.ioctls_debugged % (30 * 75) == 0) - cdio_debug ("reading %lu", (unsigned long int) lsn); - - p_env->gen.ioctls_debugged++; - - if ( p_env->hASPI ) { - return read_mode1_sector_aspi( p_env, data, lsn, b_form2 ); - } else { - return read_mode1_sector_win32ioctl( p_env, data, lsn, b_form2 ); - } -} - -/*! - Reads nblocks of mode1 sectors from cd device into data starting - from lsn. - Returns 0 if no error. - */ -static int -_cdio_read_mode1_sectors (void *user_data, void *data, lsn_t lsn, - bool b_form2, unsigned int nblocks) -{ - _img_private_t *p_env = user_data; - int i; - int retval; - - for (i = 0; i < nblocks; i++) { - if (b_form2) { - if ( (retval = _cdio_read_mode1_sector (p_env, - ((char *)data) + (M2RAW_SECTOR_SIZE * i), - lsn + i, true)) ) - return retval; - } else { - char buf[M2RAW_SECTOR_SIZE] = { 0, }; - if ( (retval = _cdio_read_mode1_sector (p_env, buf, lsn + i, false)) ) - return retval; - - memcpy (((char *)data) + (CDIO_CD_FRAMESIZE * i), - buf, CDIO_CD_FRAMESIZE); - } - } - return 0; -} - -/*! - Reads a single mode2 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ -static int -_cdio_read_mode2_sector (void *user_data, void *data, lsn_t lsn, - bool b_form2) -{ - char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; - _img_private_t *p_env = user_data; - - if (p_env->gen.ioctls_debugged == 75) - cdio_debug ("only displaying every 75th ioctl from now on"); - - if (p_env->gen.ioctls_debugged == 30 * 75) - cdio_debug ("only displaying every 30*75th ioctl from now on"); - - if (p_env->gen.ioctls_debugged < 75 - || (p_env->gen.ioctls_debugged < (30 * 75) - && p_env->gen.ioctls_debugged % 75 == 0) - || p_env->gen.ioctls_debugged % (30 * 75) == 0) - cdio_debug ("reading %lu", (unsigned long int) lsn); - - p_env->gen.ioctls_debugged++; - - if ( p_env->hASPI ) { - int ret; - ret = read_mode2_sector_aspi(user_data, buf, lsn, 1); - if( ret != 0 ) return ret; - if (b_form2) - memcpy (data, buf, M2RAW_SECTOR_SIZE); - else - memcpy (((char *)data), buf + CDIO_CD_SUBHEADER_SIZE, CDIO_CD_FRAMESIZE); - return 0; - } else { - return read_mode2_sector_win32ioctl( p_env, data, lsn, b_form2 ); - } -} - -/*! - Reads nblocks of mode2 sectors from cd device into data starting - from lsn. - Returns 0 if no error. - */ -static int -_cdio_read_mode2_sectors (void *user_data, void *data, lsn_t lsn, - bool b_form2, unsigned int nblocks) -{ - int i; - int retval; - unsigned int blocksize = b_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE; - - for (i = 0; i < nblocks; i++) { - if ( (retval = _cdio_read_mode2_sector (user_data, - ((char *)data) + (blocksize * i), - lsn + i, b_form2)) ) - return retval; - } - return 0; -} - -/*! - Return the size of the CD in logical block address (LBA) units. - */ -static uint32_t -stat_size_win32 (void *user_data) -{ - _img_private_t *p_env = user_data; - - return p_env->tocent[p_env->gen.i_tracks].start_lsn; -} - -/*! - Set the key "arg" to "value" in source device. -*/ -static int -set_arg_win32 (void *user_data, const char key[], const char value[]) -{ - _img_private_t *p_env = user_data; - - if (!strcmp (key, "source")) - { - if (!value) - return -2; - - free (p_env->gen.source_name); - - p_env->gen.source_name = strdup (value); - } - else if (!strcmp (key, "access-mode")) - { - p_env->access_mode = str_to_access_mode_win32(value); - if (p_env->access_mode == _AM_ASPI && !p_env->b_aspi_init) - return init_aspi(p_env) ? 1 : -3; - else if (p_env->access_mode == _AM_IOCTL && !p_env->b_ioctl_init) - return init_win32ioctl(p_env) ? 1 : -3; - else - return -4; - return 0; - } - else - return -1; - - return 0; -} - -/*! - Read and cache the CD's Track Table of Contents and track info. - Return true if successful or false if an error. -*/ -static bool -read_toc_win32 (void *p_user_data) -{ - _img_private_t *p_env = p_user_data; - bool ret; - if( p_env->hASPI ) { - ret = read_toc_aspi( p_env ); - } else { - ret = read_toc_win32ioctl( p_env ); - } - if (ret) p_env->gen.toc_init = true ; - return true; -} - -/*! - Eject media. Return 1 if successful, 0 otherwise. - */ -static int -_cdio_eject_media (void *user_data) { -#ifdef _XBOX - return -1; -#else - _img_private_t *env = user_data; - - - MCI_OPEN_PARMS op; - MCI_STATUS_PARMS st; - DWORD i_flags; - char psz_drive[4]; - int ret; - - memset( &op, 0, sizeof(MCI_OPEN_PARMS) ); - op.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_CD_AUDIO; - strcpy( psz_drive, "X:" ); - psz_drive[0] = env->gen.source_name[0]; - op.lpstrElementName = psz_drive; - - /* Set the flags for the device type */ - i_flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | - MCI_OPEN_ELEMENT | MCI_OPEN_SHAREABLE; - - if( _cdio_mciSendCommand( 0, MCI_OPEN, i_flags, &op ) ) { - st.dwItem = MCI_STATUS_READY; - /* Eject disc */ - ret = _cdio_mciSendCommand( op.wDeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0 ) != 0; - /* Release access to the device */ - _cdio_mciSendCommand( op.wDeviceID, MCI_CLOSE, MCI_WAIT, 0 ); - } else - ret = 0; - - return ret; -#endif -} - -/*! - Return the value associated with the key "arg". -*/ -static const char * -_get_arg_win32 (void *user_data, const char key[]) -{ - _img_private_t *env = user_data; - - if (!strcmp (key, "source")) { - return env->gen.source_name; - } else if (!strcmp (key, "access-mode")) { - if (env->hASPI) - return "ASPI"; - else - return "ioctl"; - } - return NULL; -} - -/*! - Return the media catalog number MCN. - - Note: string is malloc'd so caller should free() then returned - string when done with it. - - */ -static char * -_cdio_get_mcn (const void *p_user_data) { - const _img_private_t *p_env = p_user_data; - - if( p_env->hASPI ) { - return scsi_mmc_get_mcn( p_env->gen.cdio ); - } else { - return get_mcn_win32ioctl(p_env); - } -} - -/*! - Get format of track. -*/ -static track_format_t -_cdio_get_track_format(void *p_obj, track_t i_track) -{ - _img_private_t *p_env = p_obj; - - if ( !p_env ) return TRACK_FORMAT_ERROR; - - if (!p_env->gen.toc_init) read_toc_win32 (p_env) ; - - if ( i_track < p_env->gen.i_first_track - || i_track >= p_env->gen.i_tracks + p_env->gen.i_first_track ) - return TRACK_FORMAT_ERROR; - - if( p_env->hASPI ) { - return get_track_format_aspi(p_env, i_track); - } else { - return get_track_format_win32ioctl(p_env, i_track); - } -} - -/*! - Return true if we have XA data (green, mode2 form1) or - XA data (green, mode2 form2). That is track begins: - sync - header - subheader - 12 4 - 8 - - FIXME: there's gotta be a better design for this and get_track_format? -*/ -static bool -_cdio_get_track_green(void *obj, track_t i_track) -{ - _img_private_t *p_env = obj; - - switch (_cdio_get_track_format(p_env, i_track)) { - case TRACK_FORMAT_XA: - return true; - case TRACK_FORMAT_ERROR: - case TRACK_FORMAT_CDI: - case TRACK_FORMAT_AUDIO: - return false; - case TRACK_FORMAT_DATA: - if (_AM_ASPI == p_env->access_mode ) - return ((p_env->tocent[i_track-p_env->gen.i_first_track].Control & 8) != 0); - default: - break; - } - - /* FIXME: Dunno if this is the right way, but it's what - I was using in cd-info for a while. - */ - return ((p_env->tocent[i_track-p_env->gen.i_first_track].Control & 2) != 0); -} - -/*! - Return the starting MSF (minutes/secs/frames) for track number - i_tracks in obj. Track numbers start at 1. - The "leadout" track is specified either by - using i_tracks LEADOUT_TRACK or the total tracks+1. - False is returned if there is no track entry. -*/ -static bool -_cdio_get_track_msf(void *p_user_data, track_t i_tracks, msf_t *msf) -{ - _img_private_t *p_env = p_user_data; - - if (NULL == msf) return false; - - if (!p_env->gen.toc_init) read_toc_win32 (p_env) ; - - if (i_tracks == CDIO_CDROM_LEADOUT_TRACK) i_tracks = p_env->gen.i_tracks+1; - - if (i_tracks > p_env->gen.i_tracks+1 || i_tracks == 0) { - return false; - } else { - cdio_lsn_to_msf(p_env->tocent[i_tracks-1].start_lsn, msf); - return true; - } -} - -#endif /* HAVE_WIN32_CDROM */ - -/*! - Return an array of strings giving possible CD devices. - */ -char ** -cdio_get_devices_win32 (void) -{ -#ifndef HAVE_WIN32_CDROM - return NULL; -#else - char **drives = NULL; - unsigned int num_drives=0; - char drive_letter; - - /* Scan the system for CD-ROM drives. - */ - -#if FINISHED - /* Now check the currently mounted CD drives */ - if (NULL != (ret_drive = cdio_check_mounts("/etc/mtab"))) { - cdio_add_device_list(&drives, drive, &num_drives); - } - - /* Finally check possible mountable drives in /etc/fstab */ - if (NULL != (ret_drive = cdio_check_mounts("/etc/fstab"))) { - cdio_add_device_list(&drives, drive, &num_drives); - } -#endif - - /* Scan the system for CD-ROM drives. - Not always 100% reliable, so use the USE_MNTENT code above first. - */ - for (drive_letter='A'; drive_letter <= 'Z'; drive_letter++) { - const char *drive_str=is_cdrom_win32(drive_letter); - if (drive_str != NULL) { - cdio_add_device_list(&drives, drive_str, &num_drives); - } - } - cdio_add_device_list(&drives, NULL, &num_drives); - return drives; -#endif /*HAVE_WIN32_CDROM*/ -} - -/*! - Return a string containing the default CD device if none is specified. - if CdIo is NULL (we haven't initialized a specific device driver), - then find a suitable one and return the default device for that. - - NULL is returned if we couldn't get a default device. -*/ -char * -cdio_get_default_device_win32(void) -{ - -#ifdef HAVE_WIN32_CDROM - char drive_letter; - - for (drive_letter='A'; drive_letter <= 'Z'; drive_letter++) { - const char *drive_str=is_cdrom_win32(drive_letter); - if (drive_str != NULL) { - return strdup(drive_str); - } - } -#endif - return NULL; -} - -/*! - Return true if source_name could be a device containing a CD-ROM. -*/ -bool -cdio_is_device_win32(const char *source_name) -{ - unsigned int len; - - if (NULL == source_name) return false; - len = strlen(source_name); - -#ifdef HAVE_WIN32_CDROM - if ((len == 2) && isalpha(source_name[0]) - && (source_name[len-1] == ':')) - return true; - - if ( ! WIN_NT ) return false; - - /* Test to see if of form: \\.\x: */ - return ( (len == 6) - && source_name[0] == '\\' && source_name[1] == '\\' - && source_name[2] == '.' && source_name[3] == '\\' - && isalpha(source_name[len-2]) - && (source_name[len-1] == ':') ); -#else - return false; -#endif -} - -/*! - Initialization routine. This is the only thing that doesn't - get called via a function pointer. In fact *we* are the - ones to set that up. - */ -CdIo * -cdio_open_win32 (const char *psz_source_name) -{ -#ifdef HAVE_WIN32_CDROM - if ( WIN_NT ) { - return cdio_open_am_win32(psz_source_name, "ioctl"); - } else { - return cdio_open_am_win32(psz_source_name, "ASPI"); - } -#else - return NULL; -#endif /* HAVE_WIN32_CDROM */ -} - -/*! - Initialization routine. This is the only thing that doesn't - get called via a function pointer. In fact *we* are the - ones to set that up. - */ -CdIo * -cdio_open_am_win32 (const char *psz_orig_source, const char *psz_access_mode) -{ - -#ifdef HAVE_WIN32_CDROM - CdIo *ret; - _img_private_t *_data; - char *psz_source; - - cdio_funcs _funcs; - - memset( &_funcs, 0, sizeof(_funcs) ); - - _funcs.eject_media = _cdio_eject_media; - _funcs.free = _free_win32; - _funcs.get_arg = _get_arg_win32; - _funcs.get_cdtext = get_cdtext_generic; - _funcs.get_default_device = cdio_get_default_device_win32; - _funcs.get_devices = cdio_get_devices_win32; - _funcs.get_discmode = get_discmode_win32; - _funcs.get_drive_cap = scsi_mmc_get_drive_cap_generic; - _funcs.get_first_track_num= get_first_track_num_generic; - _funcs.get_hwinfo = NULL; - _funcs.get_mcn = _cdio_get_mcn; - _funcs.get_num_tracks = get_num_tracks_generic; - _funcs.get_track_format = _cdio_get_track_format; - _funcs.get_track_green = _cdio_get_track_green; - _funcs.get_track_lba = NULL; /* This could be implemented if need be. */ - _funcs.get_track_msf = _cdio_get_track_msf; - _funcs.lseek = NULL; - _funcs.read = NULL; - _funcs.read_audio_sectors = _cdio_read_audio_sectors; - _funcs.read_mode1_sector = _cdio_read_mode1_sector; - _funcs.read_mode1_sectors = _cdio_read_mode1_sectors; - _funcs.read_mode2_sector = _cdio_read_mode2_sector; - _funcs.read_mode2_sectors = _cdio_read_mode2_sectors; - _funcs.read_toc = &read_toc_win32; - _funcs.run_scsi_mmc_cmd = &run_scsi_cmd_win32; - _funcs.set_arg = set_arg_win32; - _funcs.stat_size = stat_size_win32; - - _data = _cdio_malloc (sizeof (_img_private_t)); - _data->access_mode = str_to_access_mode_win32(psz_access_mode); - _data->gen.init = false; - _data->gen.fd = -1; - - if (NULL == psz_orig_source) { - psz_source=cdio_get_default_device_win32(); - if (NULL == psz_source) return NULL; - set_arg_win32(_data, "source", psz_source); - free(psz_source); - } else { - if (cdio_is_device_win32(psz_orig_source)) - set_arg_win32(_data, "source", psz_orig_source); - else { - /* The below would be okay if all device drivers worked this way. */ -#if 0 - cdio_info ("source %s is a not a device", psz_orig_source); -#endif - return NULL; - } - } - - ret = cdio_new ((void *)_data, &_funcs); - if (ret == NULL) return NULL; - - if (_cdio_init_win32(_data)) - return ret; - else { - _free_win32 (_data); - return NULL; - } - -#else - return NULL; -#endif /* HAVE_WIN32_CDROM */ - -} - -bool -cdio_have_win32 (void) -{ -#ifdef HAVE_WIN32_CDROM - return true; -#else - return false; -#endif /* HAVE_WIN32_CDROM */ -} diff --git a/src/input/vcd/libcdio/MSWindows/win32.h b/src/input/vcd/libcdio/MSWindows/win32.h deleted file mode 100644 index 84f3b67b3..000000000 --- a/src/input/vcd/libcdio/MSWindows/win32.h +++ /dev/null @@ -1,170 +0,0 @@ -/*
- $Id: win32.h,v 1.2 2005/01/01 02:43:58 rockyb Exp $
-
- Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
-
- 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
-*/
-
-#include "cdio_private.h"
-
-#pragma pack()
-
-typedef struct {
- lsn_t start_lsn;
- UCHAR Control : 4;
- UCHAR Format;
- cdtext_t cdtext; /* CD-TEXT */
-} track_info_t;
-
-typedef enum {
- _AM_NONE,
- _AM_IOCTL,
- _AM_ASPI,
-} access_mode_t;
-
-typedef struct {
- /* Things common to all drivers like this.
- This must be first. */
- generic_img_private_t gen;
-
- access_mode_t access_mode;
-
- /* Some of the more OS specific things. */
- /* Entry info for each track, add 1 for leadout. */
- track_info_t tocent[CDIO_CD_MAX_TRACKS+1];
-
- HANDLE h_device_handle; /* device descriptor */
- long hASPI;
- short i_sid;
- short i_lun;
- long (*lpSendCommand)( void* );
-
- bool b_ioctl_init;
- bool b_aspi_init;
-
-} _img_private_t;
-
-/*!
- Get disc type associated with cd object.
-*/
-discmode_t get_discmode_win32ioctl (_img_private_t *p_env);
-
-/*!
- Reads an audio device using the DeviceIoControl method into data
- starting from lsn. Returns 0 if no error.
-*/
-int read_audio_sectors_win32ioctl (_img_private_t *obj, void *data, lsn_t lsn,
- unsigned int nblocks);
-/*!
- Reads a single mode2 sector using the DeviceIoControl method into
- data starting from lsn. Returns 0 if no error.
- */
-int read_mode2_sector_win32ioctl (const _img_private_t *env, void *data,
- lsn_t lsn, bool b_form2);
-
-/*!
- Reads a single mode1 sector using the DeviceIoControl method into
- data starting from lsn. Returns 0 if no error.
- */
-int read_mode1_sector_win32ioctl (const _img_private_t *env, void *data,
- lsn_t lsn, bool b_form2);
-
-const char *is_cdrom_win32ioctl (const char drive_letter);
-
-/*!
- Run a SCSI MMC command.
-
- env private CD structure
- i_timeout_ms time in milliseconds we will wait for the command
- to complete. If this value is -1, use the default
- time-out value.
- p_buf Buffer for data, both sending and receiving
- i_buf Size of buffer
- e_direction direction the transfer is to go.
- cdb CDB bytes. All values that are needed should be set on
- input. We'll figure out what the right CDB length should be.
-
- Return 0 if command completed successfully.
- */
-int run_scsi_cmd_win32ioctl( const void *p_user_data,
- unsigned int i_timeout,
- unsigned int i_cdb,
- const scsi_mmc_cdb_t * p_cdb,
- scsi_mmc_direction_t e_direction,
- unsigned int i_buf, /*in/out*/ void *p_buf );
-
-/*!
- Initialize internal structures for CD device.
- */
-bool init_win32ioctl (_img_private_t *env);
-
-/*!
- Read and cache the CD's Track Table of Contents and track info.
- Return true if successful or false if an error.
-*/
-bool read_toc_win32ioctl (_img_private_t *env);
-
-/*!
- Return the media catalog number MCN.
-
- Note: string is malloc'd so caller should free() then returned
- string when done with it.
-
- */
-char *get_mcn_win32ioctl (const _img_private_t *env);
-
-/*
- Read cdtext information for a CdIo object .
-
- return true on success, false on error or CD-TEXT information does
- not exist.
-*/
-bool init_cdtext_win32ioctl (_img_private_t *env);
-
-/*!
- Return the the kind of drive capabilities of device.
-
- Note: string is malloc'd so caller should free() then returned
- string when done with it.
-
- */
-void get_drive_cap_aspi (const _img_private_t *env,
- cdio_drive_read_cap_t *p_read_cap,
- cdio_drive_write_cap_t *p_write_cap,
- cdio_drive_misc_cap_t *p_misc_cap);
-
-/*!
- Return the the kind of drive capabilities of device.
-
- Note: string is malloc'd so caller should free() then returned
- string when done with it.
-
- */
-void get_drive_cap_win32ioctl (const _img_private_t *env,
- cdio_drive_read_cap_t *p_read_cap,
- cdio_drive_write_cap_t *p_write_cap,
- cdio_drive_misc_cap_t *p_misc_cap);
-
-/*!
- Get the format (XA, DATA, AUDIO) of a track.
-*/
-track_format_t get_track_format_win32ioctl(const _img_private_t *env,
- track_t i_track);
-
-void set_cdtext_field_win32(void *user_data, track_t i_track,
- track_t i_first_track,
- cdtext_field_t e_field, const char *psz_value);
-
diff --git a/src/input/vcd/libcdio/MSWindows/win32_ioctl.c b/src/input/vcd/libcdio/MSWindows/win32_ioctl.c deleted file mode 100644 index dec24e785..000000000 --- a/src/input/vcd/libcdio/MSWindows/win32_ioctl.c +++ /dev/null @@ -1,739 +0,0 @@ -/* - $Id: win32_ioctl.c,v 1.1 2005/01/01 02:43:58 rockyb Exp $ - - Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/* This file contains Win32-specific code using the DeviceIoControl - access method. -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -static const char _rcsid[] = "$Id: win32_ioctl.c,v 1.1 2005/01/01 02:43:58 rockyb Exp $"; - -#ifdef HAVE_WIN32_CDROM - -#if defined (_XBOX) -#include "inttypes.h" -#include "NtScsi.h" -#include "undocumented.h" -#define FORMAT_ERROR(i_err, psz_msg) \ - psz_msg=(char *)LocalAlloc(LMEM_ZEROINIT, 255); \ - sprintf(psz_msg, "error file %s: line %d (%s) %d\n", - _FILE__, __LINE__, __PRETTY_FUNCTION__, i_err) -#else -#include <ddk/ntddstor.h> -#include <ddk/ntddscsi.h> -#include <ddk/scsi.h> -#define FORMAT_ERROR(i_err, psz_msg) \ - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, \ - NULL, i_err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), \ - (LPSTR) psz_msg, 0, NULL) -#endif - -#ifdef WIN32 -#include <windows.h> -#endif - -#include <stdio.h> -#include <stddef.h> /* offsetof() macro */ -#include <sys/stat.h> -#include <errno.h> -#include <sys/types.h> - -#include <cdio/cdio.h> -#include <cdio/sector.h> -#include "cdio_assert.h" -#include <cdio/scsi_mmc.h> -#include "cdtext_private.h" -#include "cdio/logging.h" - -/* Win32 DeviceIoControl specifics */ -/***** FIXME: #include ntddcdrm.h from Wine, but probably need to - modify it a little. -*/ - -#ifndef IOCTL_CDROM_BASE -# define IOCTL_CDROM_BASE FILE_DEVICE_CD_ROM -#endif -#ifndef IOCTL_CDROM_READ_TOC -#define IOCTL_CDROM_READ_TOC \ - CTL_CODE(IOCTL_CDROM_BASE, 0x0000, METHOD_BUFFERED, FILE_READ_ACCESS) -#endif -#ifndef IOCTL_CDROM_RAW_READ -#define IOCTL_CDROM_RAW_READ CTL_CODE(IOCTL_CDROM_BASE, 0x000F, \ - METHOD_OUT_DIRECT, FILE_READ_ACCESS) -#endif - -#ifndef IOCTL_CDROM_READ_Q_CHANNEL -#define IOCTL_CDROM_READ_Q_CHANNEL \ - CTL_CODE(IOCTL_CDROM_BASE, 0x000B, METHOD_BUFFERED, FILE_READ_ACCESS) -#endif - -typedef struct { - SCSI_PASS_THROUGH Spt; - ULONG Filler; - UCHAR SenseBuf[32]; - UCHAR DataBuf[512]; -} SCSI_PASS_THROUGH_WITH_BUFFERS; - -typedef struct _TRACK_DATA { - UCHAR Format; - UCHAR Control : 4; - UCHAR Adr : 4; - UCHAR TrackNumber; - UCHAR Reserved1; - UCHAR Address[4]; -} TRACK_DATA, *PTRACK_DATA; - -typedef struct _CDROM_TOC { - UCHAR Length[2]; - UCHAR FirstTrack; - UCHAR LastTrack; - TRACK_DATA TrackData[CDIO_CD_MAX_TRACKS+1]; -} CDROM_TOC, *PCDROM_TOC; - -typedef struct _TRACK_DATA_FULL { - UCHAR SessionNumber; - UCHAR Control : 4; - UCHAR Adr : 4; - UCHAR TNO; - UCHAR POINT; /* Tracknumber (of session?) or lead-out/in (0xA0, 0xA1, 0xA2) */ - UCHAR Min; /* Only valid if disctype is CDDA ? */ - UCHAR Sec; /* Only valid if disctype is CDDA ? */ - UCHAR Frame; /* Only valid if disctype is CDDA ? */ - UCHAR Zero; /* Always zero */ - UCHAR PMIN; /* start min, if POINT is a track; if lead-out/in 0xA0: First Track */ - UCHAR PSEC; - UCHAR PFRAME; -} TRACK_DATA_FULL, *PTRACK_DATA_FULL; - -typedef struct _CDROM_TOC_FULL { - UCHAR Length[2]; - UCHAR FirstSession; - UCHAR LastSession; - TRACK_DATA_FULL TrackData[CDIO_CD_MAX_TRACKS+3]; -} CDROM_TOC_FULL, *PCDROM_TOC_FULL; - -typedef enum _TRACK_MODE_TYPE { - YellowMode2, - XAForm2, - CDDA -} TRACK_MODE_TYPE, *PTRACK_MODE_TYPE; - -typedef struct __RAW_READ_INFO { - LARGE_INTEGER DiskOffset; - ULONG SectorCount; - TRACK_MODE_TYPE TrackMode; -} RAW_READ_INFO, *PRAW_READ_INFO; - -typedef struct _CDROM_SUB_Q_DATA_FORMAT { - UCHAR Format; - UCHAR Track; -} CDROM_SUB_Q_DATA_FORMAT, *PCDROM_SUB_Q_DATA_FORMAT; - -typedef struct _SUB_Q_HEADER { - UCHAR Reserved; - UCHAR AudioStatus; - UCHAR DataLength[2]; -} SUB_Q_HEADER, *PSUB_Q_HEADER; - -typedef struct _SUB_Q_MEDIA_CATALOG_NUMBER { - SUB_Q_HEADER Header; - UCHAR FormatCode; - UCHAR Reserved[3]; - UCHAR Reserved1 : 7; - UCHAR Mcval :1; - UCHAR MediaCatalog[15]; -} SUB_Q_MEDIA_CATALOG_NUMBER, *PSUB_Q_MEDIA_CATALOG_NUMBER; - -#include "win32.h" - -#define OP_TIMEOUT_MS 60 - -/*! - Run a SCSI MMC command. - - env private CD structure - i_timeout time in milliseconds we will wait for the command - to complete. If this value is -1, use the default - time-out value. - p_buf Buffer for data, both sending and receiving - i_buf Size of buffer - e_direction direction the transfer is to go. - cdb CDB bytes. All values that are needed should be set on - input. We'll figure out what the right CDB length should be. - - Return 0 if command completed successfully. - */ -int -run_scsi_cmd_win32ioctl( const void *p_user_data, - unsigned int i_timeout_ms, - unsigned int i_cdb, const scsi_mmc_cdb_t * p_cdb, - scsi_mmc_direction_t e_direction, - unsigned int i_buf, /*in/out*/ void *p_buf ) -{ - const _img_private_t *p_env = p_user_data; - SCSI_PASS_THROUGH_DIRECT sptd; - bool success; - DWORD dwBytesReturned; - - sptd.Length = sizeof(sptd); - sptd.PathId = 0; /* SCSI card ID will be filled in automatically */ - sptd.TargetId= 0; /* SCSI target ID will also be filled in */ - sptd.Lun=0; /* SCSI lun ID will also be filled in */ - sptd.CdbLength = i_cdb; - sptd.SenseInfoLength = 0; /* Don't return any sense data */ - sptd.DataIn = SCSI_MMC_DATA_READ == e_direction ? - SCSI_IOCTL_DATA_IN : SCSI_IOCTL_DATA_OUT; - sptd.DataTransferLength= i_buf; - sptd.TimeOutValue = msecs2secs(i_timeout_ms); - sptd.DataBuffer = (void *) p_buf; - sptd.SenseInfoOffset = 0; - - memcpy(sptd.Cdb, p_cdb, i_cdb); - - /* Send the command to drive */ - success=DeviceIoControl(p_env->h_device_handle, - IOCTL_SCSI_PASS_THROUGH_DIRECT, - (void *)&sptd, - (DWORD)sizeof(SCSI_PASS_THROUGH_DIRECT), - NULL, 0, - &dwBytesReturned, - NULL); - - if(! success) { - char *psz_msg = NULL; - long int i_err = GetLastError(); - FORMAT_ERROR(i_err, psz_msg); - cdio_info("Error: %s", psz_msg); - LocalFree(psz_msg); - return 1; - } - return 0; -} - -/*! - Get disc type associated with cd object. -*/ -discmode_t -get_discmode_win32ioctl (_img_private_t *p_env) -{ - track_t i_track; - discmode_t discmode=CDIO_DISC_MODE_NO_INFO; - - /* See if this is a DVD. */ - cdio_dvd_struct_t dvd; /* DVD READ STRUCT for layer 0. */ - - dvd.physical.type = CDIO_DVD_STRUCT_PHYSICAL; - dvd.physical.layer_num = 0; - if (0 == scsi_mmc_get_dvd_struct_physical_private (p_env, - &run_scsi_cmd_win32ioctl, - &dvd)) { - switch(dvd.physical.layer[0].book_type) { - case CDIO_DVD_BOOK_DVD_ROM: return CDIO_DISC_MODE_DVD_ROM; - case CDIO_DVD_BOOK_DVD_RAM: return CDIO_DISC_MODE_DVD_RAM; - case CDIO_DVD_BOOK_DVD_R: return CDIO_DISC_MODE_DVD_R; - case CDIO_DVD_BOOK_DVD_RW: return CDIO_DISC_MODE_DVD_RW; - case CDIO_DVD_BOOK_DVD_PR: return CDIO_DISC_MODE_DVD_PR; - case CDIO_DVD_BOOK_DVD_PRW: return CDIO_DISC_MODE_DVD_PRW; - default: return CDIO_DISC_MODE_DVD_OTHER; - } - } - - if (!p_env->gen.toc_init) - read_toc_win32ioctl (p_env); - - if (!p_env->gen.toc_init) - return CDIO_DISC_MODE_NO_INFO; - - for (i_track = p_env->gen.i_first_track; - i_track < p_env->gen.i_first_track + p_env->gen.i_tracks ; - i_track ++) { - track_format_t track_fmt=get_track_format_win32ioctl(p_env, i_track); - - switch(track_fmt) { - case TRACK_FORMAT_AUDIO: - switch(discmode) { - case CDIO_DISC_MODE_NO_INFO: - discmode = CDIO_DISC_MODE_CD_DA; - break; - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* No change*/ - break; - default: - discmode = CDIO_DISC_MODE_CD_MIXED; - } - break; - case TRACK_FORMAT_XA: - switch(discmode) { - case CDIO_DISC_MODE_NO_INFO: - discmode = CDIO_DISC_MODE_CD_XA; - break; - case CDIO_DISC_MODE_CD_XA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* No change*/ - break; - default: - discmode = CDIO_DISC_MODE_CD_MIXED; - } - break; - case TRACK_FORMAT_DATA: - switch(discmode) { - case CDIO_DISC_MODE_NO_INFO: - discmode = CDIO_DISC_MODE_CD_DATA; - break; - case CDIO_DISC_MODE_CD_DATA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* No change*/ - break; - default: - discmode = CDIO_DISC_MODE_CD_MIXED; - } - break; - case TRACK_FORMAT_ERROR: - default: - discmode = CDIO_DISC_MODE_ERROR; - } - } - return discmode; -} - -/* - Returns a string that can be used in a CreateFile call if - c_drive letter is a character. If not NULL is returned. - */ - -const char * -is_cdrom_win32ioctl(const char c_drive_letter) -{ -#ifdef _XBOX - char sz_win32_drive_full[] = "\\\\.\\X:"; - sz_win32_drive_full[4] = c_drive_letter; - return strdup(sz_win32_drive_full); -#else - UINT uDriveType; - char sz_win32_drive[4]; - - sz_win32_drive[0]= c_drive_letter; - sz_win32_drive[1]=':'; - sz_win32_drive[2]='\\'; - sz_win32_drive[3]='\0'; - - uDriveType = GetDriveType(sz_win32_drive); - - switch(uDriveType) { - case DRIVE_CDROM: { - char sz_win32_drive_full[] = "\\\\.\\X:"; - sz_win32_drive_full[4] = c_drive_letter; - return strdup(sz_win32_drive_full); - } - default: - cdio_debug("Drive %c is not a CD-ROM", c_drive_letter); - return NULL; - } -#endif -} - -/*! - Reads an audio device using the DeviceIoControl method into data - starting from lsn. Returns 0 if no error. - */ -int -read_audio_sectors_win32ioctl (_img_private_t *env, void *data, lsn_t lsn, - unsigned int nblocks) -{ - DWORD dwBytesReturned; - RAW_READ_INFO cdrom_raw; - - /* Initialize CDROM_RAW_READ structure */ - cdrom_raw.DiskOffset.QuadPart = CDIO_CD_FRAMESIZE_RAW * lsn; - cdrom_raw.SectorCount = nblocks; - cdrom_raw.TrackMode = CDDA; - - if( DeviceIoControl( env->h_device_handle, - IOCTL_CDROM_RAW_READ, &cdrom_raw, - sizeof(RAW_READ_INFO), data, - CDIO_CD_FRAMESIZE_RAW * nblocks, - &dwBytesReturned, NULL ) == 0 ) { - char *psz_msg = NULL; - long int i_err = GetLastError(); - FORMAT_ERROR(i_err, psz_msg); - cdio_info("Error reading audio-mode %lu\n%s)", - (long unsigned int) lsn, psz_msg); - LocalFree(psz_msg); - return 1; - } - return 0; -} - -/*! - Reads a single raw sector using the DeviceIoControl method into - data starting from lsn. Returns 0 if no error. - */ -static int -read_raw_sector (const _img_private_t *p_env, void *p_buf, lsn_t lsn) -{ - scsi_mmc_cdb_t cdb = {{0, }}; - - /* ReadCD CDB12 command. The values were taken from MMC1 draft paper. */ - CDIO_MMC_SET_COMMAND (cdb.field, CDIO_MMC_GPCMD_READ_CD); - CDIO_MMC_SET_READ_LBA (cdb.field, lsn); - CDIO_MMC_SET_READ_LENGTH24(cdb.field, 1); - - cdb.field[9]=0xF8; /* Raw read, 2352 bytes per sector */ - - return run_scsi_cmd_win32ioctl(p_env, OP_TIMEOUT_MS, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_READ, - CDIO_CD_FRAMESIZE_RAW, p_buf); -} - -/*! - Reads a single mode2 sector using the DeviceIoControl method into - data starting from lsn. Returns 0 if no error. - */ -int -read_mode2_sector_win32ioctl (const _img_private_t *p_env, void *p_data, - lsn_t lsn, bool b_form2) -{ - char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; - int ret = read_raw_sector (p_env, buf, lsn); - - if ( 0 != ret) return ret; - - memcpy (p_data, - buf + CDIO_CD_SYNC_SIZE + CDIO_CD_XA_HEADER, - b_form2 ? M2RAW_SECTOR_SIZE: CDIO_CD_FRAMESIZE); - - return 0; - -} - -/*! - Reads a single mode2 sector using the DeviceIoControl method into - data starting from lsn. Returns 0 if no error. - */ -int -read_mode1_sector_win32ioctl (const _img_private_t *env, void *data, - lsn_t lsn, bool b_form2) -{ - char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; - int ret = read_raw_sector (env, buf, lsn); - - if ( 0 != ret) return ret; - - memcpy (data, - buf + CDIO_CD_SYNC_SIZE+CDIO_CD_HEADER_SIZE, - b_form2 ? M2RAW_SECTOR_SIZE: CDIO_CD_FRAMESIZE); - - return 0; - -} - -/*! - Initialize internal structures for CD device. - */ -bool -init_win32ioctl (_img_private_t *env) -{ -#ifdef WIN32 - OSVERSIONINFO ov; -#endif - -#ifdef _XBOX - ANSI_STRING filename; - OBJECT_ATTRIBUTES attributes; - IO_STATUS_BLOCK status; - HANDLE hDevice; - NTSTATUS error; -#else - unsigned int len=strlen(env->gen.source_name); - char psz_win32_drive[7]; - DWORD dw_access_flags; -#endif - - cdio_debug("using winNT/2K/XP ioctl layer"); - -#ifdef WIN32 - memset(&ov,0,sizeof(OSVERSIONINFO)); - ov.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); - GetVersionEx(&ov); - - if((ov.dwPlatformId==VER_PLATFORM_WIN32_NT) && - (ov.dwMajorVersion>4)) - dw_access_flags = GENERIC_READ|GENERIC_WRITE; /* add gen write on W2k/XP */ - else dw_access_flags = GENERIC_READ; -#endif - - if (cdio_is_device_win32(env->gen.source_name)) - { -#ifdef _XBOX - // Use XBOX cdrom, no matter what drive letter is given. - RtlInitAnsiString(&filename,"\\Device\\Cdrom0"); - InitializeObjectAttributes(&attributes, &filename, OBJ_CASE_INSENSITIVE, - NULL); - error = NtCreateFile( &hDevice, - GENERIC_READ |SYNCHRONIZE | FILE_READ_ATTRIBUTES, - &attributes, - &status, - NULL, - 0, - FILE_SHARE_READ, - FILE_OPEN, - FILE_NON_DIRECTORY_FILE - | FILE_SYNCHRONOUS_IO_NONALERT ); - - if (!NT_SUCCESS(error)) - { - return false; - } - env->h_device_handle = hDevice; -#else - sprintf( psz_win32_drive, "\\\\.\\%c:", env->gen.source_name[len-2] ); - - env->h_device_handle = CreateFile( psz_win32_drive, - dw_access_flags, - FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL ); - - if( env->h_device_handle == INVALID_HANDLE_VALUE ) - { - /* No good. try toggle write. */ - dw_access_flags ^= GENERIC_WRITE; - env->h_device_handle = CreateFile( psz_win32_drive, - dw_access_flags, - FILE_SHARE_READ, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL ); - if (env->h_device_handle == NULL) - return false; - } -#endif - env->b_ioctl_init = true; - return true; - } - return false; -} - -/*! - Read and cache the CD's Track Table of Contents and track info. - via a SCSI MMC READ_TOC (FULTOC). Return true if successful or - false if an error. -*/ -static bool -read_fulltoc_win32mmc (_img_private_t *p_env) -{ - scsi_mmc_cdb_t cdb = {{0, }}; - CDROM_TOC_FULL cdrom_toc_full; - int i_status, i, i_track_format, i_seen_flag; - - /* Operation code */ - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_TOC); - - cdb.field[1] = 0x00; - - /* Format */ - cdb.field[2] = CDIO_MMC_READTOC_FMT_FULTOC; - - memset(&cdrom_toc_full, 0, sizeof(cdrom_toc_full)); - - /* Setup to read header, to get length of data */ - CDIO_MMC_SET_READ_LENGTH16(cdb.field, sizeof(cdrom_toc_full)); - - i_status = run_scsi_cmd_win32ioctl (p_env, 1000*60*3, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_READ, - sizeof(cdrom_toc_full), &cdrom_toc_full); - - if ( 0 != i_status ) { - cdio_debug ("SCSI MMC READ_TOC failed\n"); - return false; - } - - i_seen_flag=0; - for( i = 0 ; i <= CDIO_CD_MAX_TRACKS+3; i++ ) { - - if ( 0xA0 == cdrom_toc_full.TrackData[i].POINT ) { - /* First track number */ - p_env->gen.i_first_track = cdrom_toc_full.TrackData[i].PMIN; - i_track_format = cdrom_toc_full.TrackData[i].PSEC; - i_seen_flag|=0x01; - } - - if ( 0xA1 == cdrom_toc_full.TrackData[i].POINT ) { - /* Last track number */ - p_env->gen.i_tracks = - cdrom_toc_full.TrackData[i].PMIN - p_env->gen.i_first_track + 1; - i_seen_flag|=0x02; - } - - if ( 0xA2 == cdrom_toc_full.TrackData[i].POINT ) { - /* Start position of the lead out */ - p_env->tocent[ p_env->gen.i_tracks ].start_lsn = - cdio_msf3_to_lba( - cdrom_toc_full.TrackData[i].PMIN, - cdrom_toc_full.TrackData[i].PSEC, - cdrom_toc_full.TrackData[i].PFRAME ); - p_env->tocent[ p_env->gen.i_tracks ].Control - = cdrom_toc_full.TrackData[i].Control; - p_env->tocent[ p_env->gen.i_tracks ].Format = i_track_format; - i_seen_flag|=0x04; - } - - if (cdrom_toc_full.TrackData[i].POINT > 0 - && cdrom_toc_full.TrackData[i].POINT <= p_env->gen.i_tracks) { - p_env->tocent[ cdrom_toc_full.TrackData[i].POINT - 1 ].start_lsn = - cdio_msf3_to_lba( - cdrom_toc_full.TrackData[i].PMIN, - cdrom_toc_full.TrackData[i].PSEC, - cdrom_toc_full.TrackData[i].PFRAME ); - p_env->tocent[ cdrom_toc_full.TrackData[i].POINT - 1 ].Control = - cdrom_toc_full.TrackData[i].Control; - p_env->tocent[ cdrom_toc_full.TrackData[i].POINT - 1 ].Format = - i_track_format; - - cdio_debug("p_sectors: %i, %lu", i, - (unsigned long int) (p_env->tocent[i].start_lsn)); - - if (cdrom_toc_full.TrackData[i].POINT == p_env->gen.i_tracks) - i_seen_flag|=0x08; - } - - if ( 0x0F == i_seen_flag ) break; - } - if ( 0x0F == i_seen_flag ) { - p_env->gen.toc_init = true; - return true; - } - return false; -} - -/*! - Read and cache the CD's Track Table of Contents and track info. - Return true if successful or false if an error. -*/ -bool -read_toc_win32ioctl (_img_private_t *p_env) -{ - CDROM_TOC cdrom_toc; - DWORD dwBytesReturned; - unsigned int i; - - if ( ! p_env ) return false; - - if ( read_fulltoc_win32mmc(p_env) ) return true; - - /* SCSI-MMC READ_TOC (FULTOC) read failed. Try reading TOC via - DeviceIoControl instead */ - if( DeviceIoControl( p_env->h_device_handle, - IOCTL_CDROM_READ_TOC, - NULL, 0, &cdrom_toc, sizeof(CDROM_TOC), - &dwBytesReturned, NULL ) == 0 ) { - char *psz_msg = NULL; - long int i_err = GetLastError(); - FORMAT_ERROR(i_err, psz_msg); - if (psz_msg) { - cdio_warn("could not read TOC (%ld): %s", i_err, psz_msg); - LocalFree(psz_msg); - } else - cdio_warn("could not read TOC (%ld)", i_err); - return false; - } - - p_env->gen.i_first_track = cdrom_toc.FirstTrack; - p_env->gen.i_tracks = cdrom_toc.LastTrack - cdrom_toc.FirstTrack + 1; - - for( i = 0 ; i <= p_env->gen.i_tracks ; i++ ) { - p_env->tocent[ i ].start_lsn = - cdio_msf3_to_lba( cdrom_toc.TrackData[i].Address[1], - cdrom_toc.TrackData[i].Address[2], - cdrom_toc.TrackData[i].Address[3] ); - p_env->tocent[ i ].Control = cdrom_toc.TrackData[i].Control; - p_env->tocent[ i ].Format = cdrom_toc.TrackData[i].Format; - cdio_debug("p_sectors: %i, %lu", i, - (unsigned long int) (p_env->tocent[i].start_lsn)); - } - p_env->gen.toc_init = true; - return true; -} - -/*! - Return the media catalog number MCN. - - Note: string is malloc'd so caller should free() then returned - string when done with it. - - */ -char * -get_mcn_win32ioctl (const _img_private_t *env) { - - DWORD dwBytesReturned; - SUB_Q_MEDIA_CATALOG_NUMBER mcn; - CDROM_SUB_Q_DATA_FORMAT q_data_format; - - memset( &mcn, 0, sizeof(mcn) ); - - q_data_format.Format = CDIO_SUBCHANNEL_MEDIA_CATALOG; - - q_data_format.Track=1; - - if( DeviceIoControl( env->h_device_handle, - IOCTL_CDROM_READ_Q_CHANNEL, - &q_data_format, sizeof(q_data_format), - &mcn, sizeof(mcn), - &dwBytesReturned, NULL ) == 0 ) { - cdio_warn( "could not read Q Channel at track %d", 1); - } else if (mcn.Mcval) - return strdup(mcn.MediaCatalog); - return NULL; -} - -/*! - Get the format (XA, DATA, AUDIO) of a track. -*/ -track_format_t -get_track_format_win32ioctl(const _img_private_t *env, track_t i_track) -{ - /* This is pretty much copied from the "badly broken" cdrom_count_tracks - in linux/cdrom.c. - */ - - if (env->tocent[i_track - env->gen.i_first_track].Control & 0x04) { - if (env->tocent[i_track - env->gen.i_first_track].Format == 0x10) - return TRACK_FORMAT_CDI; - else if (env->tocent[i_track - env->gen.i_first_track].Format == 0x20) - return TRACK_FORMAT_XA; - else - return TRACK_FORMAT_DATA; - } else - return TRACK_FORMAT_AUDIO; -} - -#endif /*HAVE_WIN32_CDROM*/ diff --git a/src/input/vcd/libcdio/Makefile.am b/src/input/vcd/libcdio/Makefile.am deleted file mode 100644 index a79525c8f..000000000 --- a/src/input/vcd/libcdio/Makefile.am +++ /dev/null @@ -1,62 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -AM_CFLAGS = $(DEFAULT_OCFLAGS) $(VISIBILITY_FLAG) -AM_LDFLAGS = $(xineplug_ldflags) - -SUBDIRS = cdio MSWindows image - -INCLUDES = $(LIBCDIO_CFLAGS) -I$(top_srcdir)/include -I$(top_builddir)/include -I$(top_srcdir)/lib -I$(top_builddir)/lib - -noinst_HEADERS = \ - cdio_assert.h \ - _cdio_stdio.h \ - scsi_mmc.h \ - cdio_private.h \ - _cdio_stream.h \ - iso9660_private.h \ - portable.h - -noinst_LTLIBRARIES = libcdio.la libiso9660.la - -libcdio_la_SOURCES = \ - _cdio_bsdi.c \ - _cdio_generic.c \ - _cdio_linux.c \ - _cdio_osx.c \ - _cdio_stdio.c \ - _cdio_stdio.h \ - _cdio_stream.c \ - _cdio_stream.h \ - _cdio_sunos.c \ - cd_types.c \ - cdio.c \ - cdtext.c \ - cdtext_private.h \ - ds.c \ - FreeBSD/freebsd.c \ - FreeBSD/freebsd.h \ - FreeBSD/freebsd_cam.c \ - FreeBSD/freebsd_ioctl.c \ - generic.h \ - image.h \ - image/bincue.c \ - image/cdrdao.c \ - image_common.h \ - image/nrg.c \ - image/nrg.h \ - MSWindows/aspi32.c \ - MSWindows/aspi32.h \ - MSWindows/win32_ioctl.c \ - MSWindows/win32.c \ - MSWindows/win32.h \ - logging.c \ - scsi_mmc.c \ - scsi_mmc_private.h \ - sector.c \ - util.c - -libiso9660_la_SOURCES = \ - iso9660.c \ - iso9660_private.h \ - iso9660_fs.c \ - xa.c diff --git a/src/input/vcd/libcdio/_cdio_bsdi.c b/src/input/vcd/libcdio/_cdio_bsdi.c deleted file mode 100644 index aef535752..000000000 --- a/src/input/vcd/libcdio/_cdio_bsdi.c +++ /dev/null @@ -1,846 +0,0 @@ -/* - $Id: _cdio_bsdi.c,v 1.3 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/* This file contains BSDI-specific code and implements low-level - control of the CD drive. -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -static const char _rcsid[] = "$Id: _cdio_bsdi.c,v 1.3 2005/01/01 02:43:57 rockyb Exp $"; - -#include <cdio/logging.h> -#include <cdio/sector.h> -#include <cdio/util.h> -#include "cdio_assert.h" -#include "cdio_private.h" - -#define DEFAULT_CDIO_DEVICE "/dev/rsr0c" -#include <string.h> - -#ifdef HAVE_BSDI_CDROM - -#include <stdio.h> -#include <stdlib.h> -#include <errno.h> -#include <unistd.h> -#include <fcntl.h> - -/*#define USE_ETC_FSTAB*/ -#ifdef USE_ETC_FSTAB -#include <fstab.h> -#endif - -#include <dvd.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <sys/ioctl.h> -#include </sys/dev/scsi/scsi.h> -#include </sys/dev/scsi/scsi_ioctl.h> -#include "cdtext_private.h" - -typedef enum { - _AM_NONE, - _AM_IOCTL, -} access_mode_t; - -typedef struct { - /* Things common to all drivers like this. - This must be first. */ - generic_img_private_t gen; - - access_mode_t access_mode; - - /* Some of the more OS specific things. */ - /* Track information */ - struct cdrom_tochdr tochdr; - struct cdrom_tocentry tocent[CDIO_CD_MAX_TRACKS+1]; - -} _img_private_t; - -/* Define the Cdrom Generic Command structure */ -typedef struct cgc -{ - scsi_mmc_cdb_t cdb; - u_char *buf; - int buflen; - int rw; - unsigned int timeout; - scsi_user_sense_t *sus; -} cgc_t; - - -/* - This code adapted from Steven M. Schultz's libdvd -*/ -static int -run_scsi_cmd_bsdi(const void *p_user_data, unsigned int i_timeout_ms, - unsigned int i_cdb, const scsi_mmc_cdb_t *p_cdb, - scsi_mmc_direction_t e_direction, - unsigned int i_buf, /*in/out*/ void *p_buf ) -{ - const _img_private_t *p_env = p_user_data; - int i_status, i_asc; - struct scsi_user_cdb suc; - struct scsi_sense *sp; - - again: - suc.suc_flags = SCSI_MMC_DATA_READ == e_direction ? - SUC_READ : SUC_WRITE; - suc.suc_cdblen = i_cdb; - memcpy(suc.suc_cdb, p_cdb, i_cdb); - suc.suc_data = p_buf; - suc.suc_datalen = i_buf; - suc.suc_timeout = msecs2secs(i_timeout_ms); - if (ioctl(p_env->gen.fd, SCSIRAWCDB, &suc) == -1) - return(errno); - i_status = suc.suc_sus.sus_status; - -#if 0 - /* - * If the device returns a scsi sense error and debugging is enabled print - * some hopefully useful information on stderr. - */ - if (i_status && debug) - { - unsigned char *cp; - int i; - cp = suc.suc_sus.sus_sense; - fprintf(stderr,"i_status = %x cdb =", - i_status); - for (i = 0; i < cdblen; i++) - fprintf(stderr, " %x", cgc->cdb[i]); - fprintf(stderr, "\nsense ="); - for (i = 0; i < 16; i++) - fprintf(stderr, " %x", cp[i]); - fprintf(stderr, "\n"); - } -#endif - - /* - * HACK! Some drives return a silly "medium changed" on the first - * command AND a non-zero i_status which gets turned into a fatal - * (EIO) error even though the operation was a success. Retrying - * the operation clears the media changed status and gets the - * answer. */ - - sp = (struct scsi_sense *)&suc.suc_sus.sus_sense; - i_asc = XSENSE_ASC(sp); - if (i_status == STS_CHECKCOND && i_asc == 0x28) - goto again; -#if 0 - if (cgc->sus) - memcpy(cgc->sus, &suc.suc_sus, sizeof (struct scsi_user_sense)); -#endif - - return(i_status); -} - - - -/* Check a drive to see if it is a CD-ROM - Return 1 if a CD-ROM. 0 if it exists but isn't a CD-ROM drive - and -1 if no device exists . -*/ -static bool -cdio_is_cdrom(char *drive, char *mnttype) -{ - bool is_cd=false; - int cdfd; - struct cdrom_tochdr tochdr; - - /* If it doesn't exist, return -1 */ - if ( !cdio_is_device_quiet_generic(drive) ) { - return(false); - } - - /* If it does exist, verify that it's an available CD-ROM */ - cdfd = open(drive, (O_RDONLY|O_EXCL|O_NONBLOCK), 0); - - /* Should we want to test the condition in more detail: - ENOENT is the error for /dev/xxxxx does not exist; - ENODEV means there's no drive present. */ - - if ( cdfd >= 0 ) { - if ( ioctl(cdfd, CDROMREADTOCHDR, &tochdr) != -1 ) { - is_cd = true; - } - close(cdfd); - } - /* Even if we can't read it, it might be mounted */ - else if ( mnttype && (strcmp(mnttype, "cd9660") == 0) ) { - is_cd = true; - } - return(is_cd); -} - -/*! - Initialize CD device. - */ -static bool -_cdio_init (_img_private_t *p_env) -{ - if (p_env->gen.init) { - cdio_warn ("init called more than once"); - return false; - } - - p_env->gen.fd = open (p_env->gen.source_name, O_RDONLY, 0); - - if (p_env->gen.fd < 0) - { - cdio_warn ("open (%s): %s", p_env->gen.source_name, strerror (errno)); - return false; - } - - p_env->gen.init = true; - p_env->gen.toc_init = false; - return true; -} - -/* Read audio sectors -*/ -static int -_read_audio_sectors_bsdi (void *user_data, void *data, lsn_t lsn, - unsigned int nblocks) -{ - char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; - struct cdrom_msf *msf = (struct cdrom_msf *) &buf; - msf_t _msf; - - _img_private_t *p_env = user_data; - - cdio_lba_to_msf (cdio_lsn_to_lba(lsn), &_msf); - msf->cdmsf_min0 = cdio_from_bcd8(_msf.m); - msf->cdmsf_sec0 = cdio_from_bcd8(_msf.s); - msf->cdmsf_frame0 = cdio_from_bcd8(_msf.f); - - if (p_env->gen.ioctls_debugged == 75) - cdio_debug ("only displaying every 75th ioctl from now on"); - - if (p_env->gen.ioctls_debugged == 30 * 75) - cdio_debug ("only displaying every 30*75th ioctl from now on"); - - if (p_env->gen.ioctls_debugged < 75 - || (p_env->gen.ioctls_debugged < (30 * 75) - && p_env->gen.ioctls_debugged % 75 == 0) - || p_env->gen.ioctls_debugged % (30 * 75) == 0) - cdio_debug ("reading %2.2d:%2.2d:%2.2d", - msf->cdmsf_min0, msf->cdmsf_sec0, msf->cdmsf_frame0); - - p_env->gen.ioctls_debugged++; - - switch (p_env->access_mode) { - case _AM_NONE: - cdio_warn ("no way to read audio"); - return 1; - break; - - case _AM_IOCTL: { - unsigned int i; - for (i=0; i < nblocks; i++) { - if (ioctl (p_env->gen.fd, CDROMREADRAW, &buf) == -1) { - perror ("ioctl()"); - return 1; - /* exit (EXIT_FAILURE); */ - } - memcpy (((char *)data) + (CDIO_CD_FRAMESIZE_RAW * i), buf, - CDIO_CD_FRAMESIZE_RAW); - } - break; - } - } - - return 0; -} - -/*! - Reads a single mode1 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ -static int -_read_mode1_sector_bsdi (void *user_data, void *data, lsn_t lsn, - bool b_form2) -{ - -#if FIXED - char buf[M2RAW_SECTOR_SIZE] = { 0, }; - do something here. -#else - return cdio_generic_read_form1_sector(user_data, data, lsn); -#endif - return 0; -} - -/*! - Reads nblocks of mode2 sectors from cd device into data starting - from lsn. - Returns 0 if no error. - */ -static int -_read_mode1_sectors_bsdi (void *user_data, void *data, lsn_t lsn, - bool b_form2, unsigned int nblocks) -{ - _img_private_t *p_env = user_data; - unsigned int i; - int retval; - unsigned int blocksize = b_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE; - - for (i = 0; i < nblocks; i++) { - if ( (retval = _read_mode1_sector_bsdi (p_env, - ((char *)data) + (blocksize * i), - lsn + i, b_form2)) ) - return retval; - } - return 0; -} - -/*! - Reads a single mode2 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ -static int -_read_mode2_sector_bsdi (void *user_data, void *data, lsn_t lsn, - bool b_form2) -{ - char buf[M2RAW_SECTOR_SIZE] = { 0, }; - struct cdrom_msf *msf = (struct cdrom_msf *) &buf; - msf_t _msf; - - _img_private_t *p_env = user_data; - - cdio_lba_to_msf (cdio_lsn_to_lba(lsn), &_msf); - msf->cdmsf_min0 = cdio_from_bcd8(_msf.m); - msf->cdmsf_sec0 = cdio_from_bcd8(_msf.s); - msf->cdmsf_frame0 = cdio_from_bcd8(_msf.f); - - if (p_env->gen.ioctls_debugged == 75) - cdio_debug ("only displaying every 75th ioctl from now on"); - - if (p_env->gen.ioctls_debugged == 30 * 75) - cdio_debug ("only displaying every 30*75th ioctl from now on"); - - if (p_env->gen.ioctls_debugged < 75 - || (p_env->gen.ioctls_debugged < (30 * 75) - && p_env->gen.ioctls_debugged % 75 == 0) - || p_env->gen.ioctls_debugged % (30 * 75) == 0) - cdio_debug ("reading %2.2d:%2.2d:%2.2d", - msf->cdmsf_min0, msf->cdmsf_sec0, msf->cdmsf_frame0); - - p_env->gen.ioctls_debugged++; - - switch (p_env->access_mode) - { - case _AM_NONE: - cdio_warn ("no way to read mode2"); - return 1; - break; - - case _AM_IOCTL: - if (ioctl (p_env->gen.fd, CDROMREADMODE2, &buf) == -1) - { - perror ("ioctl()"); - return 1; - /* exit (EXIT_FAILURE); */ - } - break; - } - - if (b_form2) - memcpy (data, buf, M2RAW_SECTOR_SIZE); - else - memcpy (((char *)data), buf + CDIO_CD_SUBHEADER_SIZE, CDIO_CD_FRAMESIZE); - - return 0; -} - -/*! - Reads nblocks of mode2 sectors from cd device into data starting - from lsn. - Returns 0 if no error. - */ -static int -_read_mode2_sectors_bsdi (void *user_data, void *data, lsn_t lsn, - bool b_form2, unsigned int nblocks) -{ - _img_private_t *p_env = user_data; - unsigned int i; - unsigned int i_blocksize = b_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE; - - /* For each frame, pick out the data part we need */ - for (i = 0; i < nblocks; i++) { - int retval = _read_mode2_sector_bsdi(p_env, - ((char *)data) + - (i_blocksize * i), - lsn + i, b_form2); - if (retval) return retval; - } - return 0; -} - -/*! - Return the size of the CD in logical block address (LBA) units. - */ -static uint32_t -_stat_size_bsdi (void *user_data) -{ - _img_private_t *p_env = user_data; - - struct cdrom_tocentry tocent; - uint32_t size; - - tocent.cdte_track = CDIO_CDROM_LEADOUT_TRACK; - tocent.cdte_format = CDROM_LBA; - if (ioctl (p_env->gen.fd, CDROMREADTOCENTRY, &tocent) == -1) - { - perror ("ioctl(CDROMREADTOCENTRY)"); - exit (EXIT_FAILURE); - } - - size = tocent.cdte_addr.lba; - - return size; -} - -/*! - Set the key "arg" to "value" in source device. -*/ -static int -_set_arg_bsdi (void *user_data, const char key[], const char value[]) -{ - _img_private_t *p_env = user_data; - - if (!strcmp (key, "source")) - { - if (!value) - return -2; - - free (p_env->gen.source_name); - - p_env->gen.source_name = strdup (value); - } - else if (!strcmp (key, "access-mode")) - { - if (!strcmp(value, "IOCTL")) - p_env->access_mode = _AM_IOCTL; - else - cdio_warn ("unknown access type: %s. ignored.", value); - } - else - return -1; - - return 0; -} - -/*! - Read and cache the CD's Track Table of Contents and track info. - Return false if successful or true if an error. -*/ -static bool -read_toc_bsdi (void *p_user_data) -{ - _img_private_t *p_env = p_user_data; - int i; - - /* read TOC header */ - if ( ioctl(p_env->gen.fd, CDROMREADTOCHDR, &p_env->tochdr) == -1 ) { - cdio_warn("%s: %s\n", - "error in ioctl CDROMREADTOCHDR", strerror(errno)); - return false; - } - - p_env->gen.i_first_track = p_env->tochdr.cdth_trk0; - p_env->gen.i_tracks = p_env->tochdr.cdth_trk1; - - /* read individual tracks */ - for (i= p_env->gen.i_first_track; i<=p_env->gen.i_tracks; i++) { - p_env->tocent[i-1].cdte_track = i; - p_env->tocent[i-1].cdte_format = CDROM_MSF; - if (ioctl(p_env->gen.fd, CDROMREADTOCENTRY, &p_env->tocent[i-1]) == -1) { - cdio_warn("%s %d: %s\n", - "error in ioctl CDROMREADTOCENTRY for track", - i, strerror(errno)); - return false; - } - /**** - struct cdrom_msf0 *msf= &p_env->tocent[i-1].cdte_addr.msf; - - fprintf (stdout, "--- track# %d (msf %2.2x:%2.2x:%2.2x)\n", - i, msf->minute, msf->second, msf->frame); - ****/ - - } - - /* read the lead-out track */ - p_env->tocent[p_env->gen.i_tracks].cdte_track = CDIO_CDROM_LEADOUT_TRACK; - p_env->tocent[p_env->gen.i_tracks].cdte_format = CDROM_MSF; - - if (ioctl(p_env->gen.fd, CDROMREADTOCENTRY, - &p_env->tocent[p_env->gen.i_tracks]) == -1 ) { - cdio_warn("%s: %s\n", - "error in ioctl CDROMREADTOCENTRY for lead-out", - strerror(errno)); - return false; - } - - /* - struct cdrom_msf0 *msf= &p_env->tocent[p_env->gen.i_tracks].cdte_addr.msf; - - fprintf (stdout, "--- track# %d (msf %2.2x:%2.2x:%2.2x)\n", - i, msf->minute, msf->second, msf->frame); - */ - - p_env->gen.toc_init = true; - return true; -} - -/*! - Eject media in CD drive. If successful, as a side effect we - also free obj. - */ -static int -_eject_media_bsdi (void *user_data) { - - _img_private_t *p_env = user_data; - int ret=2; - int status; - int fd; - - close(p_env->gen.fd); - p_env->gen.fd = -1; - if ((fd = open (p_env->gen.source_name, O_RDONLY|O_NONBLOCK)) > -1) { - if((status = ioctl(fd, CDROM_DRIVE_STATUS, (void *) CDSL_CURRENT)) > 0) { - switch(status) { - case CDS_TRAY_OPEN: - if((ret = ioctl(fd, CDROMCLOSETRAY, 0)) != 0) { - cdio_warn ("ioctl CDROMCLOSETRAY failed: %s\n", strerror(errno)); - } - break; - case CDS_DISC_OK: - if((ret = ioctl(fd, CDROMEJECT, 0)) != 0) { - cdio_warn("ioctl CDROMEJECT failed: %s\n", strerror(errno)); - } - break; - } - ret=0; - } else { - cdio_warn ("CDROM_DRIVE_STATUS failed: %s\n", strerror(errno)); - ret=1; - } - close(fd); - } - return 2; -} - -/*! - Return the value associated with the key "arg". -*/ -static const char * -_get_arg_bsdi (void *user_data, const char key[]) -{ - _img_private_t *p_env = user_data; - - if (!strcmp (key, "source")) { - return p_env->gen.source_name; - } else if (!strcmp (key, "access-mode")) { - switch (p_env->access_mode) { - case _AM_IOCTL: - return "ioctl"; - case _AM_NONE: - return "no access method"; - } - } - return NULL; -} - -/*! - Return the media catalog number MCN. - Note: string is malloc'd so caller should free() then returned - string when done with it. - */ -static char * -_get_mcn_bsdi (const void *user_data) { - - struct cdrom_mcn mcn; - const _img_private_t *p_env = user_data; - if (ioctl(p_env->gen.fd, CDROM_GET_MCN, &mcn) != 0) - return NULL; - return strdup(mcn.medium_catalog_number); -} - -/*! - Get format of track. -*/ -static track_format_t -get_track_format_bsdi(void *user_data, track_t i_track) -{ - _img_private_t *p_env = user_data; - - if (!p_env->gen.toc_init) read_toc_bsdi (p_env) ; - - if (i_track > p_env->gen.i_tracks || i_track == 0) - return TRACK_FORMAT_ERROR; - - i_track -= p_env->gen.i_first_track; - - /* This is pretty much copied from the "badly broken" cdrom_count_tracks - in linux/cdrom.c. - */ - if (p_env->tocent[i_track].cdte_ctrl & CDROM_DATA_TRACK) { - if (p_env->tocent[i_track].cdte_format == CDIO_CDROM_CDI_TRACK) - return TRACK_FORMAT_CDI; - else if (p_env->tocent[i_track].cdte_format == CDIO_CDROM_XA_TRACK) - return TRACK_FORMAT_XA; - else - return TRACK_FORMAT_DATA; - } else - return TRACK_FORMAT_AUDIO; - -} - -/*! - Return true if we have XA data (green, mode2 form1) or - XA data (green, mode2 form2). That is track begins: - sync - header - subheader - 12 4 - 8 - - FIXME: there's gotta be a better design for this and get_track_format? -*/ -static bool -_get_track_green_bsdi(void *user_data, track_t i_track) -{ - _img_private_t *p_env = user_data; - - if (!p_env->gen.toc_init) read_toc_bsdi (p_env) ; - - if (i_track == CDIO_CDROM_LEADOUT_TRACK) i_track = p_env->gen.i_tracks+1; - - if (i_track > p_env->gen.i_tracks+1 || i_track == 0) - return false; - - /* FIXME: Dunno if this is the right way, but it's what - I was using in cdinfo for a while. - */ - return ((p_env->tocent[i_track-1].cdte_ctrl & 2) != 0); -} - -/*! - Return the starting MSF (minutes/secs/frames) for track number - i_track in obj. Track numbers start at 1. - The "leadout" track is specified either by - using i_track LEADOUT_TRACK or the total tracks+1. - False is returned if there is no track entry. -*/ -static bool -_get_track_msf_bsdi(void *user_data, track_t i_track, msf_t *msf) -{ - _img_private_t *p_env = user_data; - - if (NULL == msf) return false; - - if (!p_env->gen.toc_init) read_toc_bsdi (p_env) ; - - if (i_track == CDIO_CDROM_LEADOUT_TRACK) i_track = p_env->gen.i_tracks+1; - - if (i_track > p_env->gen.i_tracks+1 || i_track == 0) { - return false; - } - - i_track -= p_env->gen.i_first_track; - - { - struct cdrom_msf0 *msf0= &p_env->tocent[i_track].cdte_addr.msf; - msf->m = cdio_to_bcd8(msf0->minute); - msf->s = cdio_to_bcd8(msf0->second); - msf->f = cdio_to_bcd8(msf0->frame); - return true; - } -} - -#endif /* HAVE_BSDI_CDROM */ - -/*! - Return an array of strings giving possible CD devices. - */ -char ** -cdio_get_devices_bsdi (void) -{ -#ifndef HAVE_BSDI_CDROM - return NULL; -#else - char drive[40]; - char **drives = NULL; - unsigned int num_drives=0; - bool exists=true; - char c; - - /* Scan the system for CD-ROM drives. - */ - -#ifdef USE_ETC_FSTAB - - struct fstab *fs; - setfsent(); - - /* Check what's in /etc/fstab... */ - while ( (fs = getfsent()) ) - { - if (strncmp(fs->fs_spec, "/dev/sr", 7)) - cdio_add_device_list(&drives, fs->fs_spec, &num_drives); - } - -#endif - - /* Scan the system for CD-ROM drives. - Not always 100% reliable, so use the USE_MNTENT code above first. - */ - for ( c='0'; exists && c <='9'; c++ ) { - sprintf(drive, "/dev/rsr%cc", c); - exists = cdio_is_cdrom(drive, NULL); - if ( exists ) { - cdio_add_device_list(&drives, drive, &num_drives); - } - } - cdio_add_device_list(&drives, NULL, &num_drives); - return drives; -#endif /*HAVE_BSDI_CDROM*/ -} - -/*! - Return a string containing the default CD device if none is specified. - */ -char * -cdio_get_default_device_bsdi(void) -{ - return strdup(DEFAULT_CDIO_DEVICE); -} - -/*! - Initialization routine. This is the only thing that doesn't - get called via a function pointer. In fact *we* are the - ones to set that up. - */ -CdIo * -cdio_open_am_bsdi (const char *psz_source_name, const char *psz_access_mode) -{ - if (psz_access_mode != NULL) - cdio_warn ("there is only one access mode for bsdi. Arg %s ignored", - psz_access_mode); - return cdio_open_bsdi(psz_source_name); -} - - -/*! - Initialization routine. This is the only thing that doesn't - get called via a function pointer. In fact *we* are the - ones to set that up. - */ -CdIo * -cdio_open_bsdi (const char *psz_orig_source) -{ - -#ifdef HAVE_BSDI_CDROM - CdIo *ret; - _img_private_t *_data; - char *psz_source; - - cdio_funcs _funcs = { - .eject_media = _eject_media_bsdi, - .free = cdio_generic_free, - .get_arg = _get_arg_bsdi, - .get_cdtext = get_cdtext_generic, - .get_default_device = cdio_get_default_device_bsdi, - .get_devices = cdio_get_devices_bsdi, - .get_drive_cap = scsi_mmc_get_drive_cap_generic, - .get_discmode = get_discmode_generic, - .get_first_track_num= get_first_track_num_generic, - .get_hwinfo = NULL, - .get_mcn = _get_mcn_bsdi, - .get_num_tracks = get_num_tracks_generic, - .get_track_format = get_track_format_bsdi, - .get_track_green = _get_track_green_bsdi, - .get_track_lba = NULL, /* This could be implemented if need be. */ - .get_track_msf = _get_track_msf_bsdi, - .lseek = cdio_generic_lseek, - .read = cdio_generic_read, - .read_audio_sectors = _read_audio_sectors_bsdi, - .read_mode1_sector = _read_mode1_sector_bsdi, - .read_mode1_sectors = _read_mode1_sectors_bsdi, - .read_mode2_sector = _read_mode2_sector_bsdi, - .read_mode2_sectors = _read_mode2_sectors_bsdi, - .read_toc = &read_toc_bsdi, - .run_scsi_mmc_cmd = &run_scsi_cmd_bsdi, - .set_arg = _set_arg_bsdi, - .stat_size = _stat_size_bsdi - }; - - _data = _cdio_malloc (sizeof (_img_private_t)); - _data->access_mode = _AM_IOCTL; - _data->gen.init = false; - _data->gen.fd = -1; - _data->gen.toc_init = false; - _data->gen.b_cdtext_init = false; - _data->gen.b_cdtext_error = false; - - if (NULL == psz_orig_source) { - psz_source=cdio_get_default_device_linux(); - if (NULL == psz_source) return NULL; - _set_arg_bsdi(_data, "source", psz_source); - free(psz_source); - } else { - if (cdio_is_device_generic(psz_orig_source)) - _set_arg_bsdi(_data, "source", psz_orig_source); - else { - /* The below would be okay if all device drivers worked this way. */ -#if 0 - cdio_info ("source %s is not a device", psz_orig_source); -#endif - return NULL; - } - } - - ret = cdio_new ( (void *) _data, &_funcs); - if (ret == NULL) return NULL; - - if (_cdio_init(_data)) - return ret; - else { - cdio_generic_free (_data); - return NULL; - } - -#else - return NULL; -#endif /* HAVE_BSDI_CDROM */ - -} - -bool -cdio_have_bsdi (void) -{ -#ifdef HAVE_BSDI_CDROM - return true; -#else - return false; -#endif /* HAVE_BSDI_CDROM */ -} diff --git a/src/input/vcd/libcdio/_cdio_generic.c b/src/input/vcd/libcdio/_cdio_generic.c deleted file mode 100644 index fb3ed5a9c..000000000 --- a/src/input/vcd/libcdio/_cdio_generic.c +++ /dev/null @@ -1,426 +0,0 @@ -/* - $Id: _cdio_generic.c,v 1.3 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/* This file contains generic implementations of device-dirver routines. -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -static const char _rcsid[] = "$Id: _cdio_generic.c,v 1.3 2005/01/01 02:43:57 rockyb Exp $"; - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> - -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif /*HAVE_UNISTD_H*/ - -#include <fcntl.h> - -#include <sys/stat.h> -#include <sys/types.h> - -#include <cdio/sector.h> -#include <cdio/util.h> -#include <cdio/logging.h> -#include "cdio_assert.h" -#include "cdio_private.h" -#include "_cdio_stdio.h" -#include "portable.h" - -/*! - Eject media -- there's nothing to do here. We always return 2. - Should we also free resources? - */ -int -cdio_generic_bogus_eject_media (void *user_data) { - /* Sort of a stub here. Perhaps log a message? */ - return 2; -} - - -/*! - Release and free resources associated with cd. - */ -void -cdio_generic_free (void *p_user_data) -{ - generic_img_private_t *p_env = p_user_data; - track_t i_track; - - if (NULL == p_env) return; - free (p_env->source_name); - - for (i_track=0; i_track < p_env->i_tracks; i_track++) { - cdtext_destroy(&(p_env->cdtext_track[i_track])); - } - - if (p_env->fd >= 0) - close (p_env->fd); - - free (p_env); -} - -/*! - Initialize CD device. - */ -bool -cdio_generic_init (void *user_data) -{ - generic_img_private_t *p_env = user_data; - if (p_env->init) { - cdio_warn ("init called more than once"); - return false; - } - - p_env->fd = open (p_env->source_name, O_RDONLY, 0); - - if (p_env->fd < 0) - { - cdio_warn ("open (%s): %s", p_env->source_name, strerror (errno)); - return false; - } - - p_env->init = true; - p_env->toc_init = false; - p_env->b_cdtext_init = false; - p_env->b_cdtext_error = false; - p_env->i_joliet_level = 0; /* Assume no Joliet extensions initally */ - return true; -} - -/*! - Reads a single form1 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ -int -cdio_generic_read_form1_sector (void * user_data, void *data, lsn_t lsn) -{ - if (0 > cdio_generic_lseek(user_data, CDIO_CD_FRAMESIZE*lsn, SEEK_SET)) - return -1; - if (0 > cdio_generic_read(user_data, data, CDIO_CD_FRAMESIZE)) - return -1; - return 0; -} - -/*! - Reads into buf the next size bytes. - Returns -1 on error. - Is in fact libc's lseek(). -*/ -off_t -cdio_generic_lseek (void *user_data, off_t offset, int whence) -{ - generic_img_private_t *p_env = user_data; - return lseek(p_env->fd, offset, whence); -} - -/*! - Reads into buf the next size bytes. - Returns -1 on error. - Is in fact libc's read(). -*/ -ssize_t -cdio_generic_read (void *user_data, void *buf, size_t size) -{ - generic_img_private_t *p_env = user_data; - return read(p_env->fd, buf, size); -} - -/*! - Release and free resources associated with stream or disk image. -*/ -void -cdio_generic_stdio_free (void *user_data) -{ - generic_img_private_t *p_env = user_data; - - if (NULL == p_env) return; - if (NULL != p_env->source_name) - free (p_env->source_name); - - if (p_env->data_source) - cdio_stdio_destroy (p_env->data_source); -} - - -/*! - Return true if source_name could be a device containing a CD-ROM. -*/ -bool -cdio_is_device_generic(const char *source_name) -{ - struct stat buf; - if (0 != stat(source_name, &buf)) { - cdio_warn ("Can't get file status for %s:\n%s", source_name, - strerror(errno)); - return false; - } - return (S_ISBLK(buf.st_mode) || S_ISCHR(buf.st_mode)); -} - -/*! - Like above, but don't give a warning device doesn't exist. -*/ -bool -cdio_is_device_quiet_generic(const char *source_name) -{ - struct stat buf; - if (0 != stat(source_name, &buf)) { - return false; - } - return (S_ISBLK(buf.st_mode) || S_ISCHR(buf.st_mode)); -} - -/*! - Add/allocate a drive to the end of drives. - Use cdio_free_device_list() to free this device_list. -*/ -void -cdio_add_device_list(char **device_list[], const char *drive, - unsigned int *num_drives) -{ - if (NULL != drive) { - unsigned int j; - - /* Check if drive is already in list. */ - for (j=0; j<*num_drives; j++) { - if (strcmp((*device_list)[j], drive) == 0) break; - } - - if (j==*num_drives) { - /* Drive not in list. Add it. */ - (*num_drives)++; - if (*device_list) { - *device_list = realloc(*device_list, (*num_drives) * sizeof(char *)); - } else { - /* num_drives should be 0. Add assert? */ - *device_list = malloc((*num_drives) * sizeof(char *)); - } - - (*device_list)[*num_drives-1] = strdup(drive); - } - } else { - (*num_drives)++; - if (*device_list) { - *device_list = realloc(*device_list, (*num_drives) * sizeof(char *)); - } else { - *device_list = malloc((*num_drives) * sizeof(char *)); - } - (*device_list)[*num_drives-1] = NULL; - } -} - - -/*! - Get cdtext information for a CdIo object . - - @param obj the CD object that may contain CD-TEXT information. - @return the CD-TEXT object or NULL if obj is NULL - or CD-TEXT information does not exist. -*/ -const cdtext_t * -get_cdtext_generic (void *p_user_data, track_t i_track) -{ - generic_img_private_t *p_env = p_user_data; - - if ( NULL == p_env || - (0 != i_track - && i_track >= p_env->i_tracks+p_env->i_first_track ) ) - return NULL; - - if (!p_env->b_cdtext_init) - init_cdtext_generic(p_env); - if (!p_env->b_cdtext_init) return NULL; - - if (0 == i_track) - return &(p_env->cdtext); - else - return &(p_env->cdtext_track[i_track-p_env->i_first_track]); - -} - -/*! - Get disc type associated with cd object. -*/ -discmode_t -get_discmode_generic (void *p_user_data ) -{ - generic_img_private_t *p_env = p_user_data; - - /* See if this is a DVD. */ - cdio_dvd_struct_t dvd; /* DVD READ STRUCT for layer 0. */ - - dvd.physical.type = CDIO_DVD_STRUCT_PHYSICAL; - dvd.physical.layer_num = 0; - if (0 == scsi_mmc_get_dvd_struct_physical (p_env->cdio, &dvd)) { - switch(dvd.physical.layer[0].book_type) { - case CDIO_DVD_BOOK_DVD_ROM: return CDIO_DISC_MODE_DVD_ROM; - case CDIO_DVD_BOOK_DVD_RAM: return CDIO_DISC_MODE_DVD_RAM; - case CDIO_DVD_BOOK_DVD_R: return CDIO_DISC_MODE_DVD_R; - case CDIO_DVD_BOOK_DVD_RW: return CDIO_DISC_MODE_DVD_RW; - case CDIO_DVD_BOOK_DVD_PR: return CDIO_DISC_MODE_DVD_PR; - case CDIO_DVD_BOOK_DVD_PRW: return CDIO_DISC_MODE_DVD_PRW; - default: return CDIO_DISC_MODE_DVD_OTHER; - } - } - - return get_discmode_cd_generic(p_user_data); -} - -/*! - Get disc type associated with cd object. -*/ -discmode_t -get_discmode_cd_generic (void *p_user_data ) -{ - generic_img_private_t *p_env = p_user_data; - track_t i_track; - discmode_t discmode=CDIO_DISC_MODE_NO_INFO; - - if (!p_env->toc_init) - p_env->cdio->op.read_toc (p_user_data); - - if (!p_env->toc_init) - return CDIO_DISC_MODE_NO_INFO; - - for (i_track = p_env->i_first_track; - i_track < p_env->i_first_track + p_env->i_tracks ; - i_track ++) { - track_format_t track_fmt = - p_env->cdio->op.get_track_format(p_env, i_track); - - switch(track_fmt) { - case TRACK_FORMAT_AUDIO: - switch(discmode) { - case CDIO_DISC_MODE_NO_INFO: - discmode = CDIO_DISC_MODE_CD_DA; - break; - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* No change*/ - break; - default: - discmode = CDIO_DISC_MODE_CD_MIXED; - } - break; - case TRACK_FORMAT_XA: - switch(discmode) { - case CDIO_DISC_MODE_NO_INFO: - discmode = CDIO_DISC_MODE_CD_XA; - break; - case CDIO_DISC_MODE_CD_XA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* No change*/ - break; - default: - discmode = CDIO_DISC_MODE_CD_MIXED; - } - break; - case TRACK_FORMAT_DATA: - switch(discmode) { - case CDIO_DISC_MODE_NO_INFO: - discmode = CDIO_DISC_MODE_CD_DATA; - break; - case CDIO_DISC_MODE_CD_DATA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* No change*/ - break; - default: - discmode = CDIO_DISC_MODE_CD_MIXED; - } - break; - case TRACK_FORMAT_ERROR: - default: - discmode = CDIO_DISC_MODE_ERROR; - } - } - return discmode; -} - -/*! - Return the number of of the first track. - CDIO_INVALID_TRACK is returned on error. -*/ -track_t -get_first_track_num_generic(void *p_user_data) -{ - generic_img_private_t *p_env = p_user_data; - - if (!p_env->toc_init) - p_env->cdio->op.read_toc (p_user_data); - - return p_env->toc_init ? p_env->i_first_track : CDIO_INVALID_TRACK; -} - - -/*! - Return the number of tracks in the current medium. -*/ - track_t -get_num_tracks_generic(void *p_user_data) -{ - generic_img_private_t *p_env = p_user_data; - - if (!p_env->toc_init) - p_env->cdio->op.read_toc (p_user_data); - - return p_env->toc_init ? p_env->i_tracks : CDIO_INVALID_TRACK; -} - -void -set_cdtext_field_generic(void *user_data, track_t i_track, - track_t i_first_track, - cdtext_field_t e_field, const char *psz_value) -{ - char **pp_field; - generic_img_private_t *env = user_data; - - if( i_track == 0 ) - pp_field = &(env->cdtext.field[e_field]); - - else - pp_field = &(env->cdtext_track[i_track-i_first_track].field[e_field]); - - *pp_field = strdup(psz_value); -} - -/*! - Read CD-Text information for a CdIo object . - - return true on success, false on error or CD-TEXT information does - not exist. -*/ -bool -init_cdtext_generic (generic_img_private_t *p_env) -{ - return scsi_mmc_init_cdtext_private( p_env, - p_env->cdio->op.run_scsi_mmc_cmd, - set_cdtext_field_generic - ); -} - diff --git a/src/input/vcd/libcdio/_cdio_linux.c b/src/input/vcd/libcdio/_cdio_linux.c deleted file mode 100644 index ea70d262c..000000000 --- a/src/input/vcd/libcdio/_cdio_linux.c +++ /dev/null @@ -1,1197 +0,0 @@ -/* - $Id: _cdio_linux.c,v 1.4 2006/09/26 22:18:44 dgp85 Exp $ - - Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/* This file contains Linux-specific code and implements low-level - control of the CD drive. -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.4 2006/09/26 22:18:44 dgp85 Exp $"; - -#include <string.h> - -#include <cdio/sector.h> -#include <cdio/util.h> -#include <cdio/types.h> -#include <cdio/scsi_mmc.h> -#include <cdio/cdtext.h> -#include "cdtext_private.h" -#include "cdio_assert.h" -#include "cdio_private.h" - -#ifdef HAVE_LINUX_CDROM - -#if defined(HAVE_LINUX_VERSION_H) -# include <linux/version.h> -# if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,16) -# define __CDIO_LINUXCD_BUILD -# else -# error "You need a kernel greater than 2.2.16 to have CDROM support" -# endif -#else -# error "You need <linux/version.h> to have CDROM support" -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <errno.h> -#include <unistd.h> -#include <fcntl.h> -#include <mntent.h> - -#include <linux/cdrom.h> -#include <scsi/scsi.h> -#include <scsi/sg.h> -#include <scsi/scsi_ioctl.h> -#include <sys/mount.h> - -#include <sys/stat.h> -#include <sys/types.h> -#include <sys/ioctl.h> - -typedef enum { - _AM_NONE, - _AM_IOCTL, - _AM_READ_CD, - _AM_READ_10 -} access_mode_t; - -typedef struct { - /* Things common to all drivers like this. - This must be first. */ - generic_img_private_t gen; - - access_mode_t access_mode; - - /* Some of the more OS specific things. */ - /* Entry info for each track, add 1 for leadout. */ - struct cdrom_tocentry tocent[CDIO_CD_MAX_TRACKS+1]; - - struct cdrom_tochdr tochdr; - -} _img_private_t; - -/* Some ioctl() errno values which occur when the tray is empty */ -#define ERRNO_TRAYEMPTY(errno) \ - ((errno == EIO) || (errno == ENOENT) || (errno == EINVAL)) - -/**** prototypes for static functions ****/ -static bool is_cdrom_linux(const char *drive, char *mnttype); -static bool read_toc_linux (void *p_user_data); -static int run_scsi_cmd_linux( const void *p_user_data, - unsigned int i_timeout, - unsigned int i_cdb, - const scsi_mmc_cdb_t *p_cdb, - scsi_mmc_direction_t e_direction, - unsigned int i_buf, - /*in/out*/ void *p_buf ); -static access_mode_t - -str_to_access_mode_linux(const char *psz_access_mode) -{ - const access_mode_t default_access_mode = _AM_IOCTL; - - if (NULL==psz_access_mode) return default_access_mode; - - if (!strcmp(psz_access_mode, "IOCTL")) - return _AM_IOCTL; - else if (!strcmp(psz_access_mode, "READ_CD")) - return _AM_READ_CD; - else if (!strcmp(psz_access_mode, "READ_10")) - return _AM_READ_10; - else { - cdio_warn ("unknown access type: %s. Default IOCTL used.", - psz_access_mode); - return default_access_mode; - } -} - -static char * -check_mounts_linux(const char *mtab) -{ - FILE *mntfp; - struct mntent *mntent; - - mntfp = setmntent(mtab, "r"); - if ( mntfp != NULL ) { - char *tmp; - char *mnt_type; - char *mnt_dev; - - while ( (mntent=getmntent(mntfp)) != NULL ) { - mnt_type = malloc(strlen(mntent->mnt_type) + 1); - if (mnt_type == NULL) - continue; /* maybe you'll get lucky next time. */ - - mnt_dev = malloc(strlen(mntent->mnt_fsname) + 1); - if (mnt_dev == NULL) { - free(mnt_type); - continue; - } - - strcpy(mnt_type, mntent->mnt_type); - strcpy(mnt_dev, mntent->mnt_fsname); - - /* Handle "supermount" filesystem mounts */ - if ( strcmp(mnt_type, "supermount") == 0 ) { - tmp = strstr(mntent->mnt_opts, "fs="); - if ( tmp ) { - free(mnt_type); - mnt_type = strdup(tmp + strlen("fs=")); - if ( mnt_type ) { - tmp = strchr(mnt_type, ','); - if ( tmp ) { - *tmp = '\0'; - } - } - } - tmp = strstr(mntent->mnt_opts, "dev="); - if ( tmp ) { - free(mnt_dev); - mnt_dev = strdup(tmp + strlen("dev=")); - if ( mnt_dev ) { - tmp = strchr(mnt_dev, ','); - if ( tmp ) { - *tmp = '\0'; - } - } - } - } - if ( strcmp(mnt_type, "iso9660") == 0 ) { - if (is_cdrom_linux(mnt_dev, mnt_type) > 0) { - free(mnt_type); - endmntent(mntfp); - return mnt_dev; - } - } - free(mnt_dev); - free(mnt_type); - } - endmntent(mntfp); - } - return NULL; -} - -/*! - Return the value associated with the key "arg". -*/ -static const char * -get_arg_linux (void *env, const char key[]) -{ - _img_private_t *_obj = env; - - if (!strcmp (key, "source")) { - return _obj->gen.source_name; - } else if (!strcmp (key, "access-mode")) { - switch (_obj->access_mode) { - case _AM_IOCTL: - return "ioctl"; - case _AM_READ_CD: - return "READ_CD"; - case _AM_READ_10: - return "READ_10"; - case _AM_NONE: - return "no access method"; - } - } - return NULL; -} - -#undef USE_LINUX_CAP -#ifdef USE_LINUX_CAP -/*! - Return the the kind of drive capabilities of device. - - Note: string is malloc'd so caller should free() then returned - string when done with it. - - */ -static void -get_drive_cap_linux (const void *p_user_data, - /*out*/ cdio_drive_read_cap_t *p_read_cap, - /*out*/ cdio_drive_write_cap_t *p_write_cap, - /*out*/ cdio_drive_misc_cap_t *p_misc_cap) -{ - const _img_private_t *p_env = p_user_data; - int32_t i_drivetype; - - i_drivetype = ioctl (p_env->gen.fd, CDROM_GET_CAPABILITY, CDSL_CURRENT); - - if (i_drivetype < 0) { - *p_read_cap = CDIO_DRIVE_CAP_ERROR; - *p_write_cap = CDIO_DRIVE_CAP_ERROR; - *p_misc_cap = CDIO_DRIVE_CAP_ERROR; - return; - } - - *p_read_cap = 0; - *p_write_cap = 0; - *p_misc_cap = 0; - - /* Reader */ - if (i_drivetype & CDC_PLAY_AUDIO) - *p_read_cap |= CDIO_DRIVE_CAP_READ_AUDIO; - if (i_drivetype & CDC_CD_R) - *p_read_cap |= CDIO_DRIVE_CAP_READ_CD_R; - if (i_drivetype & CDC_CD_RW) - *p_read_cap |= CDIO_DRIVE_CAP_READ_CD_RW; - if (i_drivetype & CDC_DVD) - *p_read_cap |= CDIO_DRIVE_CAP_READ_DVD_ROM; - - /* Writer */ - if (i_drivetype & CDC_CD_RW) - *p_read_cap |= CDIO_DRIVE_CAP_WRITE_CD_RW; - if (i_drivetype & CDC_DVD_R) - *p_read_cap |= CDIO_DRIVE_CAP_WRITE_DVD_R; - if (i_drivetype & CDC_DVD_RAM) - *p_read_cap |= CDIO_DRIVE_CAP_WRITE_DVD_RAM; - - /* Misc */ - if (i_drivetype & CDC_CLOSE_TRAY) - *p_misc_cap |= CDIO_DRIVE_CAP_MISC_CLOSE_TRAY; - if (i_drivetype & CDC_OPEN_TRAY) - *p_misc_cap |= CDIO_DRIVE_CAP_MISC_EJECT; - if (i_drivetype & CDC_LOCK) - *p_misc_cap |= CDIO_DRIVE_CAP_MISC_LOCK; - if (i_drivetype & CDC_SELECT_SPEED) - *p_misc_cap |= CDIO_DRIVE_CAP_MISC_SELECT_SPEED; - if (i_drivetype & CDC_SELECT_DISC) - *p_misc_cap |= CDIO_DRIVE_CAP_MISC_SELECT_DISC; - if (i_drivetype & CDC_MULTI_SESSION) - *p_misc_cap |= CDIO_DRIVE_CAP_MISC_MULTI_SESSION; - if (i_drivetype & CDC_MEDIA_CHANGED) - *p_misc_cap |= CDIO_DRIVE_CAP_MISC_MEDIA_CHANGED; - if (i_drivetype & CDC_RESET) - *p_misc_cap |= CDIO_DRIVE_CAP_MISC_RESET; -} -#endif - -/*! - Return the media catalog number MCN. - - Note: string is malloc'd so caller should free() then returned - string when done with it. - - */ -static char * -get_mcn_linux (const void *p_user_data) { - - struct cdrom_mcn mcn; - const _img_private_t *p_env = p_user_data; - memset(&mcn, 0, sizeof(mcn)); - if (ioctl(p_env->gen.fd, CDROM_GET_MCN, &mcn) != 0) - return NULL; - return strdup(mcn.medium_catalog_number); -} - -/*! - Get format of track. -*/ -static track_format_t -get_track_format_linux(void *p_user_data, track_t i_track) -{ - _img_private_t *p_env = p_user_data; - - if ( !p_env ) return TRACK_FORMAT_ERROR; - - if (!p_env->gen.toc_init) read_toc_linux (p_user_data) ; - - if (i_track > (p_env->gen.i_tracks+p_env->gen.i_first_track) - || i_track < p_env->gen.i_first_track) - return TRACK_FORMAT_ERROR; - - i_track -= p_env->gen.i_first_track; - - /* This is pretty much copied from the "badly broken" cdrom_count_tracks - in linux/cdrom.c. - */ - if (p_env->tocent[i_track].cdte_ctrl & CDIO_CDROM_DATA_TRACK) { - if (p_env->tocent[i_track].cdte_format == CDIO_CDROM_CDI_TRACK) - return TRACK_FORMAT_CDI; - else if (p_env->tocent[i_track].cdte_format == CDIO_CDROM_XA_TRACK) - return TRACK_FORMAT_XA; - else - return TRACK_FORMAT_DATA; - } else - return TRACK_FORMAT_AUDIO; - -} - -/*! - Return true if we have XA data (green, mode2 form1) or - XA data (green, mode2 form2). That is track begins: - sync - header - subheader - 12 4 - 8 - - FIXME: there's gotta be a better design for this and get_track_format? -*/ -static bool -get_track_green_linux(void *p_user_data, track_t i_track) -{ - _img_private_t *p_env = p_user_data; - - if (!p_env->gen.toc_init) read_toc_linux (p_user_data) ; - - if (i_track >= (p_env->gen.i_tracks+p_env->gen.i_first_track) - || i_track < p_env->gen.i_first_track) - return false; - - i_track -= p_env->gen.i_first_track; - - /* FIXME: Dunno if this is the right way, but it's what - I was using in cd-info for a while. - */ - return ((p_env->tocent[i_track].cdte_ctrl & 2) != 0); -} - -/*! - Return the starting MSF (minutes/secs/frames) for track number - track_num in obj. Track numbers usually start at something - greater than 0, usually 1. - - The "leadout" track is specified either by - using i_track LEADOUT_TRACK or the total tracks+1. - False is returned if there is no track entry. -*/ -static bool -get_track_msf_linux(void *p_user_data, track_t i_track, msf_t *msf) -{ - _img_private_t *p_env = p_user_data; - - if (NULL == msf) return false; - - if (!p_env->gen.toc_init) read_toc_linux (p_user_data) ; - - if (i_track == CDIO_CDROM_LEADOUT_TRACK) - i_track = p_env->gen.i_tracks + p_env->gen.i_first_track; - - if (i_track > (p_env->gen.i_tracks+p_env->gen.i_first_track) - || i_track < p_env->gen.i_first_track) { - return false; - } else { - struct cdrom_msf0 *msf0= - &p_env->tocent[i_track-p_env->gen.i_first_track].cdte_addr.msf; - msf->m = cdio_to_bcd8(msf0->minute); - msf->s = cdio_to_bcd8(msf0->second); - msf->f = cdio_to_bcd8(msf0->frame); - return true; - } -} - -/*! - Eject media in CD drive. - Return 0 if success and 1 for failure, and 2 if no routine. - */ -static int -eject_media_linux (void *p_user_data) { - - _img_private_t *p_env = p_user_data; - int ret=2; - int status; - int fd; - - if ((fd = open (p_env->gen.source_name, O_RDONLY|O_NONBLOCK)) > -1) { - if((status = ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT)) > 0) { - switch(status) { - case CDS_TRAY_OPEN: - if((ret = ioctl(fd, CDROMCLOSETRAY)) != 0) { - cdio_warn ("ioctl CDROMCLOSETRAY failed: %s\n", strerror(errno)); - ret = 1; - } - break; - case CDS_DISC_OK: - if((ret = ioctl(fd, CDROMEJECT)) != 0) { - int eject_error = errno; - /* Try ejecting the MMC way... */ - ret = scsi_mmc_eject_media(p_env->gen.cdio); - if (0 != ret) { - cdio_warn("ioctl CDROMEJECT failed: %s\n", - strerror(eject_error)); - ret = 1; - } - } - /* force kernel to reread partition table when new disc inserted */ - ret = ioctl(p_env->gen.fd, BLKRRPART); - break; - default: - cdio_warn ("Unknown CD-ROM (%d)\n", status); - ret = 1; - } - } else { - cdio_warn ("CDROM_DRIVE_STATUS failed: %s\n", strerror(errno)); - ret=1; - } - close(fd); - } else - ret = 2; - close(p_env->gen.fd); - p_env->gen.fd = -1; - return ret; -} - -/*! - Get disc type associated with the cd object. -*/ -static discmode_t -get_discmode_linux (void *p_user_data) -{ - _img_private_t *p_env = p_user_data; - - int32_t i_discmode; - - /* See if this is a DVD. */ - cdio_dvd_struct_t dvd; /* DVD READ STRUCT for layer 0. */ - - dvd.physical.type = CDIO_DVD_STRUCT_PHYSICAL; - dvd.physical.layer_num = 0; - if (0 == ioctl (p_env->gen.fd, DVD_READ_STRUCT, &dvd)) { - switch(dvd.physical.layer[0].book_type) { - case CDIO_DVD_BOOK_DVD_ROM: return CDIO_DISC_MODE_DVD_ROM; - case CDIO_DVD_BOOK_DVD_RAM: return CDIO_DISC_MODE_DVD_RAM; - case CDIO_DVD_BOOK_DVD_R: return CDIO_DISC_MODE_DVD_R; - case CDIO_DVD_BOOK_DVD_RW: return CDIO_DISC_MODE_DVD_RW; - case CDIO_DVD_BOOK_DVD_PR: return CDIO_DISC_MODE_DVD_PR; - case CDIO_DVD_BOOK_DVD_PRW: return CDIO_DISC_MODE_DVD_PRW; - default: return CDIO_DISC_MODE_DVD_OTHER; - } - } - - i_discmode = ioctl (p_env->gen.fd, CDROM_DISC_STATUS); - - if (i_discmode < 0) return CDIO_DISC_MODE_ERROR; - - /* FIXME Need to add getting DVD types. */ - switch(i_discmode) { - case CDS_AUDIO: - return CDIO_DISC_MODE_CD_DA; - case CDS_DATA_1: - case CDS_DATA_2: - return CDIO_DISC_MODE_CD_DATA; - case CDS_MIXED: - return CDIO_DISC_MODE_CD_MIXED; - case CDS_XA_2_1: - case CDS_XA_2_2: - return CDIO_DISC_MODE_CD_XA; - case CDS_NO_INFO: - return CDIO_DISC_MODE_NO_INFO; - default: - return CDIO_DISC_MODE_ERROR; - } -} - -/* Check a drive to see if it is a CD-ROM - Return 1 if a CD-ROM. 0 if it exists but isn't a CD-ROM drive - and -1 if no device exists . -*/ -static bool -is_cdrom_linux(const char *drive, char *mnttype) -{ - bool is_cd=false; - int cdfd; - struct cdrom_tochdr tochdr; - - /* If it doesn't exist, return -1 */ - if ( !cdio_is_device_quiet_generic(drive) ) { - return(false); - } - - /* If it does exist, verify that it's an available CD-ROM */ - cdfd = open(drive, (O_RDONLY|O_NONBLOCK), 0); - if ( cdfd >= 0 ) { - if ( ioctl(cdfd, CDROMREADTOCHDR, &tochdr) != -1 ) { - is_cd = true; - } - close(cdfd); - } - /* Even if we can't read it, it might be mounted */ - else if ( mnttype && (strcmp(mnttype, "iso9660") == 0) ) { - is_cd = true; - } - return(is_cd); -} - -/* MMC driver to read audio sectors. - Can read only up to 25 blocks. -*/ -static int -_read_audio_sectors_linux (void *p_user_data, void *buf, lsn_t lsn, - unsigned int nblocks) -{ - _img_private_t *p_env = p_user_data; - return scsi_mmc_read_sectors( p_env->gen.cdio, buf, lsn, - CDIO_MMC_READ_TYPE_CDDA, nblocks); -} - -/* Packet driver to read mode2 sectors. - Can read only up to 25 blocks. -*/ -static int -_read_mode2_sectors_mmc (_img_private_t *p_env, void *p_buf, lba_t lba, - unsigned int nblocks, bool b_read_10) -{ - scsi_mmc_cdb_t cdb = {{0, }}; - - CDIO_MMC_SET_READ_LBA(cdb.field, lba); - - if (b_read_10) { - int retval; - - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_10); - CDIO_MMC_SET_READ_LENGTH16(cdb.field, nblocks); - - if ((retval = scsi_mmc_set_blocksize (p_env->gen.cdio, M2RAW_SECTOR_SIZE))) - return retval; - - if ((retval = run_scsi_cmd_linux (p_env, 0, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, - SCSI_MMC_DATA_READ, - M2RAW_SECTOR_SIZE * nblocks, - p_buf))) - { - scsi_mmc_set_blocksize (p_env->gen.cdio, CDIO_CD_FRAMESIZE); - return retval; - } - - if ((retval = scsi_mmc_set_blocksize (p_env->gen.cdio, CDIO_CD_FRAMESIZE))) - return retval; - } else - - cdb.field[1] = 0; /* sector size mode2 */ - cdb.field[9] = 0x58; /* 2336 mode2 */ - - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_CD); - CDIO_MMC_SET_READ_LENGTH24(cdb.field, nblocks); - - return run_scsi_cmd_linux (p_env, 0, - scsi_mmc_get_cmd_len(cdb.field[0]), &cdb, - SCSI_MMC_DATA_READ, - M2RAW_SECTOR_SIZE * nblocks, p_buf); - - return 0; -} - -static int -_read_mode2_sectors (_img_private_t *p_env, void *p_buf, lba_t lba, - unsigned int nblocks, bool b_read_10) -{ - unsigned int l = 0; - int retval = 0; - - while (nblocks > 0) - { - const unsigned nblocks2 = (nblocks > 25) ? 25 : nblocks; - void *p_buf2 = ((char *)p_buf ) + (l * M2RAW_SECTOR_SIZE); - - retval |= _read_mode2_sectors_mmc (p_env, p_buf2, lba + l, - nblocks2, b_read_10); - - if (retval) - break; - - nblocks -= nblocks2; - l += nblocks2; - } - - return retval; -} - -/*! - Reads a single mode1 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ -static int -_read_mode1_sector_linux (void *p_user_data, void *p_data, lsn_t lsn, - bool b_form2) -{ - -#if FIXED - char buf[M2RAW_SECTOR_SIZE] = { 0, }; - struct cdrom_msf *p_msf = (struct cdrom_msf *) &buf; - msf_t _msf; - - _img_private_t *p_env = p_user_data; - - cdio_lba_to_msf (cdio_lsn_to_lba(lsn), &_msf); - msf->cdmsf_min0 = cdio_from_bcd8(_msf.m); - msf->cdmsf_sec0 = cdio_from_bcd8(_msf.s); - msf->cdmsf_frame0 = cdio_from_bcd8(_msf.f); - - retry: - switch (p_env->access_mode) - { - case _AM_NONE: - cdio_warn ("no way to read mode1"); - return 1; - break; - - case _AM_IOCTL: - if (ioctl (p_env->gen.fd, CDROMREADMODE1, &buf) == -1) - { - perror ("ioctl()"); - return 1; - /* exit (EXIT_FAILURE); */ - } - break; - - case _AM_READ_CD: - case _AM_READ_10: - if (_read_mode2_sectors (p_env->gen.fd, buf, lsn, 1, - (p_env->access_mode == _AM_READ_10))) - { - perror ("ioctl()"); - if (p_env->access_mode == _AM_READ_CD) - { - cdio_info ("READ_CD failed; switching to READ_10 mode..."); - p_env->access_mode = _AM_READ_10; - goto retry; - } - else - { - cdio_info ("READ_10 failed; switching to ioctl(CDROMREADMODE2) mode..."); - p_env->access_mode = _AM_IOCTL; - goto retry; - } - return 1; - } - break; - } - - memcpy (data, buf + CDIO_CD_SYNC_SIZE + CDIO_CD_HEADER_SIZE, - b_form2 ? M2RAW_SECTOR_SIZE: CDIO_CD_FRAMESIZE); - -#else - return cdio_generic_read_form1_sector(p_user_data, p_data, lsn); -#endif - return 0; -} - -/*! - Reads nblocks of mode2 sectors from cd device into data starting - from lsn. - Returns 0 if no error. - */ -static int -_read_mode1_sectors_linux (void *p_user_data, void *p_data, lsn_t lsn, - bool b_form2, unsigned int nblocks) -{ - _img_private_t *p_env = p_user_data; - unsigned int i; - int retval; - unsigned int blocksize = b_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE; - - for (i = 0; i < nblocks; i++) { - if ( (retval = _read_mode1_sector_linux (p_env, - ((char *)p_data) + (blocksize*i), - lsn + i, b_form2)) ) - return retval; - } - return 0; -} - -/*! - Reads a single mode2 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ -static int -_read_mode2_sector_linux (void *p_user_data, void *p_data, lsn_t lsn, - bool b_form2) -{ - char buf[M2RAW_SECTOR_SIZE] = { 0, }; - struct cdrom_msf *msf = (struct cdrom_msf *) &buf; - msf_t _msf; - - _img_private_t *p_env = p_user_data; - - cdio_lba_to_msf (cdio_lsn_to_lba(lsn), &_msf); - msf->cdmsf_min0 = cdio_from_bcd8(_msf.m); - msf->cdmsf_sec0 = cdio_from_bcd8(_msf.s); - msf->cdmsf_frame0 = cdio_from_bcd8(_msf.f); - - retry: - switch (p_env->access_mode) - { - case _AM_NONE: - cdio_warn ("no way to read mode2"); - return 1; - break; - - case _AM_IOCTL: - if (ioctl (p_env->gen.fd, CDROMREADMODE2, &buf) == -1) - { - perror ("ioctl()"); - return 1; - /* exit (EXIT_FAILURE); */ - } - break; - - case _AM_READ_CD: - case _AM_READ_10: - if (_read_mode2_sectors (p_env, buf, lsn, 1, - (p_env->access_mode == _AM_READ_10))) - { - perror ("ioctl()"); - if (p_env->access_mode == _AM_READ_CD) - { - cdio_info ("READ_CD failed; switching to READ_10 mode..."); - p_env->access_mode = _AM_READ_10; - goto retry; - } - else - { - cdio_info ("READ_10 failed; switching to ioctl(CDROMREADMODE2) mode..."); - p_env->access_mode = _AM_IOCTL; - goto retry; - } - return 1; - } - break; - } - - if (b_form2) - memcpy (p_data, buf, M2RAW_SECTOR_SIZE); - else - memcpy (((char *)p_data), buf + CDIO_CD_SUBHEADER_SIZE, CDIO_CD_FRAMESIZE); - - return 0; -} - -/*! - Reads nblocks of mode2 sectors from cd device into data starting - from lsn. - Returns 0 if no error. - */ -static int -_read_mode2_sectors_linux (void *p_user_data, void *data, lsn_t lsn, - bool b_form2, unsigned int nblocks) -{ - _img_private_t *p_env = p_user_data; - unsigned int i; - unsigned int i_blocksize = b_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE; - - /* For each frame, pick out the data part we need */ - for (i = 0; i < nblocks; i++) { - int retval; - if ( (retval = _read_mode2_sector_linux (p_env, - ((char *)data) + (i_blocksize*i), - lsn + i, b_form2)) ) - return retval; - } - return 0; -} - -/*! - Read and cache the CD's Track Table of Contents and track info. - Return false if successful or true if an error. -*/ -static bool -read_toc_linux (void *p_user_data) -{ - _img_private_t *p_env = p_user_data; - int i; - - /* read TOC header */ - if ( ioctl(p_env->gen.fd, CDROMREADTOCHDR, &p_env->tochdr) == -1 ) { - cdio_warn("%s: %s\n", - "error in ioctl CDROMREADTOCHDR", strerror(errno)); - return false; - } - - p_env->gen.i_first_track = p_env->tochdr.cdth_trk0; - p_env->gen.i_tracks = p_env->tochdr.cdth_trk1; - - /* read individual tracks */ - for (i= p_env->gen.i_first_track; i<=p_env->gen.i_tracks; i++) { - p_env->tocent[i-p_env->gen.i_first_track].cdte_track = i; - p_env->tocent[i-p_env->gen.i_first_track].cdte_format = CDROM_MSF; - if ( ioctl(p_env->gen.fd, CDROMREADTOCENTRY, - &p_env->tocent[i-p_env->gen.i_first_track]) == -1 ) { - cdio_warn("%s %d: %s\n", - "error in ioctl CDROMREADTOCENTRY for track", - i, strerror(errno)); - return false; - } - /**** - struct cdrom_msf0 *msf= &env->tocent[i-1].cdte_addr.msf; - - fprintf (stdout, "--- track# %d (msf %2.2x:%2.2x:%2.2x)\n", - i, msf->minute, msf->second, msf->frame); - ****/ - - } - - /* read the lead-out track */ - p_env->tocent[p_env->gen.i_tracks].cdte_track = CDIO_CDROM_LEADOUT_TRACK; - p_env->tocent[p_env->gen.i_tracks].cdte_format = CDROM_MSF; - - if (ioctl(p_env->gen.fd, CDROMREADTOCENTRY, - &p_env->tocent[p_env->gen.i_tracks]) == -1 ) { - cdio_warn("%s: %s\n", - "error in ioctl CDROMREADTOCENTRY for lead-out", - strerror(errno)); - return false; - } - - /* - struct cdrom_msf0 *msf= &env->tocent[p_env->gen.i_tracks].cdte_addr.msf; - - fprintf (stdout, "--- track# %d (msf %2.2x:%2.2x:%2.2x)\n", - i, msf->minute, msf->second, msf->frame); - */ - - p_env->gen.toc_init = true; - return true; -} - -/*! - Run a SCSI MMC command. - - cdio CD structure set by cdio_open(). - i_timeout time in milliseconds we will wait for the command - to complete. If this value is -1, use the default - time-out value. - p_buf Buffer for data, both sending and receiving - i_buf Size of buffer - e_direction direction the transfer is to go. - cdb CDB bytes. All values that are needed should be set on - input. We'll figure out what the right CDB length should be. - - We return true if command completed successfully and false if not. - */ -static int -run_scsi_cmd_linux( const void *p_user_data, - unsigned int i_timeout_ms, - unsigned int i_cdb, const scsi_mmc_cdb_t *p_cdb, - scsi_mmc_direction_t e_direction, - unsigned int i_buf, /*in/out*/ void *p_buf ) -{ - const _img_private_t *p_env = p_user_data; - struct cdrom_generic_command cgc; - memset (&cgc, 0, sizeof (struct cdrom_generic_command)); - memcpy(&cgc.cmd, p_cdb, i_cdb); - cgc.buflen = i_buf; - cgc.buffer = p_buf; - cgc.data_direction = (SCSI_MMC_DATA_READ == cgc.data_direction) - ? CGC_DATA_READ : CGC_DATA_WRITE; - -#ifdef HAVE_LINUX_CDROM_TIMEOUT - cgc.timeout = i_timeout_ms; -#endif - - return ioctl (p_env->gen.fd, CDROM_SEND_PACKET, &cgc); -} - -/*! - Return the size of the CD in logical block address (LBA) units. - */ -static uint32_t -stat_size_linux (void *p_user_data) -{ - _img_private_t *p_env = p_user_data; - - struct cdrom_tocentry tocent; - uint32_t size; - - tocent.cdte_track = CDIO_CDROM_LEADOUT_TRACK; - tocent.cdte_format = CDROM_LBA; - if (ioctl (p_env->gen.fd, CDROMREADTOCENTRY, &tocent) == -1) - { - perror ("ioctl(CDROMREADTOCENTRY)"); - exit (EXIT_FAILURE); - } - - size = tocent.cdte_addr.lba; - - return size; -} - -/*! - Set the arg "key" with "value" in the source device. - Currently "source" and "access-mode" are valid keys. - "source" sets the source device in I/O operations - "access-mode" sets the the method of CD access - - 0 is returned if no error was found, and nonzero if there as an error. -*/ -static int -set_arg_linux (void *p_user_data, const char key[], const char value[]) -{ - _img_private_t *p_env = p_user_data; - - if (!strcmp (key, "source")) - { - if (!value) - return -2; - - free (p_env->gen.source_name); - - p_env->gen.source_name = strdup (value); - } - else if (!strcmp (key, "access-mode")) - { - return str_to_access_mode_linux(value); - } - else - return -1; - - return 0; -} - -/* checklist: /dev/cdrom, /dev/dvd /dev/hd?, /dev/scd? /dev/sr? */ -static char checklist1[][40] = { - {"cdrom"}, {"dvd"}, {""} -}; -static char checklist2[][40] = { - {"?a hd?"}, {"?0 scd?"}, {"?0 sr?"}, {""} -}; - -#endif /* HAVE_LINUX_CDROM */ - -/*! - Return an array of strings giving possible CD devices. - */ -char ** -cdio_get_devices_linux (void) -{ -#ifndef HAVE_LINUX_CDROM - return NULL; -#else - unsigned int i; - char drive[40]; - char *ret_drive; - bool exists; - char **drives = NULL; - unsigned int num_drives=0; - - /* Scan the system for CD-ROM drives. - */ - for ( i=0; strlen(checklist1[i]) > 0; ++i ) { - sprintf(drive, "/dev/%s", checklist1[i]); - if ( (exists=is_cdrom_linux(drive, NULL)) > 0 ) { - cdio_add_device_list(&drives, drive, &num_drives); - } - } - - /* Now check the currently mounted CD drives */ - if (NULL != (ret_drive = check_mounts_linux("/etc/mtab"))) { - cdio_add_device_list(&drives, ret_drive, &num_drives); - free(ret_drive); - } - - /* Finally check possible mountable drives in /etc/fstab */ - if (NULL != (ret_drive = check_mounts_linux("/etc/fstab"))) { - cdio_add_device_list(&drives, ret_drive, &num_drives); - free(ret_drive); - } - - /* Scan the system for CD-ROM drives. - Not always 100% reliable, so use the USE_MNTENT code above first. - */ - for ( i=0; strlen(checklist2[i]) > 0; ++i ) { - unsigned int j; - char *insert; - exists = true; - for ( j=checklist2[i][1]; exists; ++j ) { - sprintf(drive, "/dev/%s", &checklist2[i][3]); - insert = strchr(drive, '?'); - if ( insert != NULL ) { - *insert = j; - } - if ( (exists=is_cdrom_linux(drive, NULL)) > 0 ) { - cdio_add_device_list(&drives, drive, &num_drives); - } - } - } - cdio_add_device_list(&drives, NULL, &num_drives); - return drives; -#endif /*HAVE_LINUX_CDROM*/ -} - -/*! - Return a string containing the default CD device. - */ -char * -cdio_get_default_device_linux(void) -{ -#ifndef HAVE_LINUX_CDROM - return NULL; - -#else - unsigned int i; - char drive[40]; - bool exists; - char *ret_drive; - - /* Scan the system for CD-ROM drives. - */ - for ( i=0; strlen(checklist1[i]) > 0; ++i ) { - sprintf(drive, "/dev/%s", checklist1[i]); - if ( (exists=is_cdrom_linux(drive, NULL)) > 0 ) { - return strdup(drive); - } - } - - /* Now check the currently mounted CD drives */ - if (NULL != (ret_drive = check_mounts_linux("/etc/mtab"))) - return ret_drive; - - /* Finally check possible mountable drives in /etc/fstab */ - if (NULL != (ret_drive = check_mounts_linux("/etc/fstab"))) - return ret_drive; - - /* Scan the system for CD-ROM drives. - Not always 100% reliable, so use the USE_MNTENT code above first. - */ - for ( i=0; strlen(checklist2[i]) > 0; ++i ) { - unsigned int j; - char *insert; - exists = true; - for ( j=checklist2[i][1]; exists; ++j ) { - sprintf(drive, "/dev/%s", &checklist2[i][3]); - insert = strchr(drive, '?'); - if ( insert != NULL ) { - *insert = j; - } - if ( (exists=is_cdrom_linux(drive, NULL)) > 0 ) { - return(strdup(drive)); - } - } - } - return NULL; -#endif /*HAVE_LINUX_CDROM*/ -} -/*! - Initialization routine. This is the only thing that doesn't - get called via a function pointer. In fact *we* are the - ones to set that up. - */ -CdIo * -cdio_open_linux (const char *psz_source_name) -{ - return cdio_open_am_linux(psz_source_name, NULL); -} - -/*! - Initialization routine. This is the only thing that doesn't - get called via a function pointer. In fact *we* are the - ones to set that up. - */ -CdIo * -cdio_open_am_linux (const char *psz_orig_source, const char *access_mode) -{ - -#ifdef HAVE_LINUX_CDROM - CdIo *ret; - _img_private_t *_data; - char *psz_source; - - cdio_funcs _funcs = { - .eject_media = eject_media_linux, - .free = cdio_generic_free, - .get_arg = get_arg_linux, - .get_cdtext = get_cdtext_generic, - .get_default_device = cdio_get_default_device_linux, - .get_devices = cdio_get_devices_linux, - .get_discmode = get_discmode_linux, -#if USE_LINUX_CAP - .get_drive_cap = get_drive_cap_linux, -#else - .get_drive_cap = scsi_mmc_get_drive_cap_generic, -#endif - .get_first_track_num= get_first_track_num_generic, - .get_hwinfo = NULL, - .get_mcn = get_mcn_linux, - .get_num_tracks = get_num_tracks_generic, - .get_track_format = get_track_format_linux, - .get_track_green = get_track_green_linux, - .get_track_lba = NULL, /* This could be implemented if need be. */ - .get_track_msf = get_track_msf_linux, - .lseek = cdio_generic_lseek, - .read = cdio_generic_read, - .read_audio_sectors = _read_audio_sectors_linux, - .read_mode1_sector = _read_mode1_sector_linux, - .read_mode1_sectors = _read_mode1_sectors_linux, - .read_mode2_sector = _read_mode2_sector_linux, - .read_mode2_sectors = _read_mode2_sectors_linux, - .read_toc = read_toc_linux, - .run_scsi_mmc_cmd = run_scsi_cmd_linux, - .set_arg = set_arg_linux, - .stat_size = stat_size_linux - }; - - _data = _cdio_malloc (sizeof (_img_private_t)); - - _data->access_mode = str_to_access_mode_linux(access_mode); - _data->gen.init = false; - _data->gen.toc_init = false; - _data->gen.fd = -1; - _data->gen.b_cdtext_init = false; - _data->gen.b_cdtext_error = false; - - if (NULL == psz_orig_source) { - psz_source=cdio_get_default_device_linux(); - if (NULL == psz_source) { - free(_data); - return NULL; - } - set_arg_linux(_data, "source", psz_source); - free(psz_source); - } else { - if (cdio_is_device_generic(psz_orig_source)) - set_arg_linux(_data, "source", psz_orig_source); - else { - /* The below would be okay if all device drivers worked this way. */ -#if 0 - cdio_info ("source %s is not a device", psz_orig_source); -#endif - free(_data); - return NULL; - } - } - - ret = cdio_new ((void *)_data, &_funcs); - if (ret == NULL) return NULL; - - if (cdio_generic_init(_data)) { - return ret; - } else { - cdio_generic_free (_data); - return NULL; - } - -#else - return NULL; -#endif /* HAVE_LINUX_CDROM */ - -} - -bool -cdio_have_linux (void) -{ -#ifdef HAVE_LINUX_CDROM - return true; -#else - return false; -#endif /* HAVE_LINUX_CDROM */ -} diff --git a/src/input/vcd/libcdio/_cdio_osx.c b/src/input/vcd/libcdio/_cdio_osx.c deleted file mode 100644 index f754933c6..000000000 --- a/src/input/vcd/libcdio/_cdio_osx.c +++ /dev/null @@ -1,1470 +0,0 @@ -/* - $Id: _cdio_osx.c,v 1.4 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - from vcdimager code: - Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> - and VideoLAN code Copyright (C) 1998-2001 VideoLAN - Authors: Johan Bilien <jobi@via.ecp.fr> - Gildas Bazin <gbazin@netcourrier.com> - Jon Lech Johansen <jon-vl@nanocrew.net> - Derk-Jan Hartman <hartman at videolan.org> - Justin F. Hallett <thesin@southofheaven.org> - - 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 -*/ - -/* This file contains OSX-specific code and implements low-level - control of the CD drive. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -static const char _rcsid[] = "$Id: _cdio_osx.c,v 1.4 2005/01/01 02:43:57 rockyb Exp $"; - -#include <cdio/logging.h> -#include <cdio/sector.h> -#include <cdio/util.h> -#include "cdio_assert.h" -#include "cdio_private.h" - -#include <string.h> - -#ifdef HAVE_DARWIN_CDROM -#undef VERSION - -#include <CoreFoundation/CoreFoundation.h> -#include <IOKit/IOKitLib.h> -#include <IOKit/storage/IOStorageDeviceCharacteristics.h> - -#include <mach/mach.h> -#include <Carbon/Carbon.h> -#include <IOKit/scsi-commands/SCSITaskLib.h> -#include <IOKit/IOCFPlugIn.h> -#include <mach/mach_error.h> - -#include <stdio.h> -#include <stdlib.h> -#include <errno.h> -#include <unistd.h> -#include <fcntl.h> - -#include <sys/stat.h> -#include <sys/types.h> -#include <sys/ioctl.h> - - -#include <paths.h> -#include <CoreFoundation/CoreFoundation.h> -#include <IOKit/IOKitLib.h> -#include <IOKit/IOBSD.h> -#include <IOKit/scsi-commands/IOSCSIMultimediaCommandsDevice.h> -#include <IOKit/storage/IOCDTypes.h> -#include <IOKit/storage/IODVDTypes.h> -#include <IOKit/storage/IOMedia.h> -#include <IOKit/storage/IOCDMedia.h> -#include <IOKit/storage/IODVDMedia.h> -#include <IOKit/storage/IOCDMediaBSDClient.h> -#include <IOKit/storage/IODVDMediaBSDClient.h> -#include <IOKit/storage/IOStorageDeviceCharacteristics.h> - -#define kIOCDBlockStorageDeviceClassString "IOCDBlockStorageDevice" - -/* Note leadout is normally defined 0xAA, But on OSX 0xA0 is "lead in" while - 0xA2 is "lead out". Don't ask me why. */ -#define OSX_CDROM_LEADOUT_TRACK 0xA2 - -#define TOTAL_TRACKS (p_env->i_last_track - p_env->gen.i_first_track + 1) - -#define CDROM_CDI_TRACK 0x1 -#define CDROM_XA_TRACK 0x2 - -typedef enum { - _AM_NONE, - _AM_OSX, -} access_mode_t; - -#define MAX_SERVICE_NAME 1000 -typedef struct { - /* Things common to all drivers like this. - This must be first. */ - generic_img_private_t gen; - - access_mode_t access_mode; - - /* Track information */ - CDTOC *pTOC; - int i_descriptors; - track_t i_last_track; /* highest track number */ - track_t i_last_session; /* highest session number */ - track_t i_first_session; /* first session number */ - lsn_t *pp_lba; - io_service_t MediaClass_service; - char psz_MediaClass_service[MAX_SERVICE_NAME]; - SCSITaskDeviceInterface **pp_scsiTaskDeviceInterface; - -} _img_private_t; - -static bool read_toc_osx (void *p_user_data); - -/**** - * GetRegistryEntryProperties - Gets the registry entry properties for - * an io_service_t. - *****/ - -static CFMutableDictionaryRef -GetRegistryEntryProperties ( io_service_t service ) -{ - IOReturn err = kIOReturnSuccess; - CFMutableDictionaryRef dict = 0; - - err = IORegistryEntryCreateCFProperties (service, &dict, kCFAllocatorDefault, 0); - if ( err != kIOReturnSuccess ) - cdio_warn( "IORegistryEntryCreateCFProperties: 0x%08x", err ); - - return dict; -} - - -static bool -init_osx(_img_private_t *p_env) { - mach_port_t port; - char *psz_devname; - kern_return_t ret; - io_iterator_t iterator; - - p_env->gen.fd = open( p_env->gen.source_name, O_RDONLY | O_NONBLOCK ); - if (-1 == p_env->gen.fd) { - cdio_warn("Failed to open %s: %s", p_env->gen.source_name, - strerror(errno)); - return false; - } - - /* get the device name */ - psz_devname = strrchr( p_env->gen.source_name, '/'); - if( NULL != psz_devname ) - ++psz_devname; - else - psz_devname = p_env->gen.source_name; - - /* unraw the device name */ - if( *psz_devname == 'r' ) - ++psz_devname; - - /* get port for IOKit communication */ - ret = IOMasterPort( MACH_PORT_NULL, &port ); - - if( ret != KERN_SUCCESS ) - { - cdio_warn( "IOMasterPort: 0x%08x", ret ); - return false; - } - - ret = IOServiceGetMatchingServices( port, - IOBSDNameMatching(port, 0, psz_devname), - &iterator ); - - /* get service iterator for the device */ - if( ret != KERN_SUCCESS ) - { - cdio_warn( "IOServiceGetMatchingServices: 0x%08x", ret ); - return false; - } - - /* first service */ - p_env->MediaClass_service = IOIteratorNext( iterator ); - IOObjectRelease( iterator ); - - /* search for kIOCDMediaClass or kIOCDVDMediaClass */ - while( p_env->MediaClass_service && - (!IOObjectConformsTo(p_env->MediaClass_service, kIOCDMediaClass)) && - (!IOObjectConformsTo(p_env->MediaClass_service, kIODVDMediaClass)) ) - { - - ret = IORegistryEntryGetParentIterator( p_env->MediaClass_service, - kIOServicePlane, - &iterator ); - if( ret != KERN_SUCCESS ) - { - cdio_warn( "IORegistryEntryGetParentIterator: 0x%08x", ret ); - IOObjectRelease( p_env->MediaClass_service ); - return false; - } - - IOObjectRelease( p_env->MediaClass_service ); - p_env->MediaClass_service = IOIteratorNext( iterator ); - IOObjectRelease( iterator ); - } - - if ( 0 == p_env->MediaClass_service ) { - cdio_warn( "search for kIOCDMediaClass/kIODVDMediaClass came up empty" ); - return false; - } - - /* Save the name so we can compare against this in case we have to do - another scan. FIXME: this is hoaky and there's got to be a better - variable to test or way to do. - */ - IORegistryEntryGetPath(p_env->MediaClass_service, kIOServicePlane, - p_env->psz_MediaClass_service); - return true; -} - -/*! - Run a SCSI MMC command. - - cdio CD structure set by cdio_open(). - i_timeout time in milliseconds we will wait for the command - to complete. If this value is -1, use the default - time-out value. - p_buf Buffer for data, both sending and receiving - i_buf Size of buffer - e_direction direction the transfer is to go. - cdb CDB bytes. All values that are needed should be set on - input. We'll figure out what the right CDB length should be. - - We return true if command completed successfully and false if not. - */ -static int -run_scsi_cmd_osx( const void *p_user_data, - unsigned int i_timeout_ms, - unsigned int i_cdb, const scsi_mmc_cdb_t *p_cdb, - scsi_mmc_direction_t e_direction, - unsigned int i_buf, /*in/out*/ void *p_buf ) -{ - -#ifndef SCSI_MMC_FIXED - return 2; -#else - const _img_private_t *p_env = p_user_data; - SCSITaskDeviceInterface **sc; - SCSITaskInterface **cmd = NULL; - IOVirtualRange iov; - SCSI_Sense_Data senseData; - SCSITaskStatus status; - UInt64 bytesTransferred; - IOReturn ioReturnValue; - int ret = 0; - - if (NULL == p_user_data) return 2; - - /* Make sure pp_scsiTaskDeviceInterface is initialized. FIXME: The code - should probably be reorganized better for this. */ - if (!p_env->gen.toc_init) read_toc_osx (p_user_data) ; - - sc = p_env->pp_scsiTaskDeviceInterface; - - if (NULL == sc) return 3; - - cmd = (*sc)->CreateSCSITask(sc); - if (cmd == NULL) { - cdio_warn("Failed to create SCSI task"); - return -1; - } - - iov.address = (IOVirtualAddress) p_buf; - iov.length = i_buf; - - ioReturnValue = (*cmd)->SetCommandDescriptorBlock(cmd, (UInt8 *) p_cdb, - i_cdb); - if (ioReturnValue != kIOReturnSuccess) { - cdio_warn("SetCommandDescriptorBlock failed with status %x", - ioReturnValue); - return -1; - } - - ioReturnValue = (*cmd)->SetScatterGatherEntries(cmd, &iov, 1, i_buf, - (SCSI_MMC_DATA_READ == e_direction ) ? - kSCSIDataTransfer_FromTargetToInitiator : - kSCSIDataTransfer_FromInitiatorToTarget); - if (ioReturnValue != kIOReturnSuccess) { - cdio_warn("SetScatterGatherEntries failed with status %x", ioReturnValue); - return -1; - } - - ioReturnValue = (*cmd)->SetTimeoutDuration(cmd, i_timeout_ms ); - if (ioReturnValue != kIOReturnSuccess) { - cdio_warn("SetTimeoutDuration failed with status %x", ioReturnValue); - return -1; - } - - memset(&senseData, 0, sizeof(senseData)); - - ioReturnValue = (*cmd)->ExecuteTaskSync(cmd,&senseData, &status, & - bytesTransferred); - - if (ioReturnValue != kIOReturnSuccess) { - cdio_warn("Command execution failed with status %x", ioReturnValue); - return -1; - } - - if (cmd != NULL) { - (*cmd)->Release(cmd); - } - - return (ret); -#endif -} - -/*************************************************************************** - * GetDeviceIterator - Gets an io_iterator_t for our class type - ***************************************************************************/ - -static io_iterator_t -GetDeviceIterator ( const char * deviceClass ) -{ - - IOReturn err = kIOReturnSuccess; - io_iterator_t iterator = MACH_PORT_NULL; - - err = IOServiceGetMatchingServices ( kIOMasterPortDefault, - IOServiceMatching ( deviceClass ), - &iterator ); - check ( err == kIOReturnSuccess ); - - return iterator; - -} - -/*************************************************************************** - * GetFeaturesFlagsForDrive -Gets the bitfield which represents the - * features flags. - ***************************************************************************/ - -static bool -GetFeaturesFlagsForDrive ( CFDictionaryRef dict, - uint32_t *i_cdFlags, - uint32_t *i_dvdFlags ) -{ - CFDictionaryRef propertiesDict = 0; - CFNumberRef flagsNumberRef = 0; - - *i_cdFlags = 0; - *i_dvdFlags= 0; - - propertiesDict = ( CFDictionaryRef ) - CFDictionaryGetValue ( dict, - CFSTR ( kIOPropertyDeviceCharacteristicsKey ) ); - - if ( propertiesDict == 0 ) return false; - - /* Get the CD features */ - flagsNumberRef = ( CFNumberRef ) - CFDictionaryGetValue ( propertiesDict, - CFSTR ( kIOPropertySupportedCDFeatures ) ); - if ( flagsNumberRef != 0 ) { - CFNumberGetValue ( flagsNumberRef, kCFNumberLongType, i_cdFlags ); - } - - /* Get the DVD features */ - flagsNumberRef = ( CFNumberRef ) - CFDictionaryGetValue ( propertiesDict, - CFSTR ( kIOPropertySupportedDVDFeatures ) ); - if ( flagsNumberRef != 0 ) { - CFNumberGetValue ( flagsNumberRef, kCFNumberLongType, i_dvdFlags ); - } - - return true; -} - -/*! - Get disc type associated with the cd object. -*/ -static discmode_t -get_discmode_osx (void *p_user_data) -{ - _img_private_t *p_env = p_user_data; - char str[10]; - int32_t i_discmode = CDIO_DISC_MODE_ERROR; - CFDictionaryRef propertiesDict = 0; - CFStringRef data; - - propertiesDict = GetRegistryEntryProperties ( p_env->MediaClass_service ); - - if ( propertiesDict == 0 ) return i_discmode; - - data = ( CFStringRef ) - CFDictionaryGetValue ( propertiesDict, CFSTR ( kIODVDMediaTypeKey ) ); - - if( CFStringGetCString( data, str, sizeof(str), - kCFStringEncodingASCII ) ) { - if (0 == strncmp(str, "DVD+R", strlen(str)) ) - i_discmode = CDIO_DISC_MODE_DVD_PR; - else if (0 == strncmp(str, "DVD+RW", strlen(str)) ) - i_discmode = CDIO_DISC_MODE_DVD_PRW; - else if (0 == strncmp(str, "DVD-R", strlen(str)) ) - i_discmode = CDIO_DISC_MODE_DVD_R; - else if (0 == strncmp(str, "DVD-RW", strlen(str)) ) - i_discmode = CDIO_DISC_MODE_DVD_RW; - else if (0 == strncmp(str, "DVD-ROM", strlen(str)) ) - i_discmode = CDIO_DISC_MODE_DVD_ROM; - else if (0 == strncmp(str, "DVD-RAM", strlen(str)) ) - i_discmode = CDIO_DISC_MODE_DVD_RAM; - else if (0 == strncmp(str, "CD-ROM", strlen(str)) ) - i_discmode = CDIO_DISC_MODE_CD_DATA; - else if (0 == strncmp(str, "CDR", strlen(str)) ) - i_discmode = CDIO_DISC_MODE_CD_DATA; - else if (0 == strncmp(str, "CDRW", strlen(str)) ) - i_discmode = CDIO_DISC_MODE_CD_DATA; - //?? Handled by below? CFRelease( data ); - } - CFRelease( propertiesDict ); - if (CDIO_DISC_MODE_CD_DATA == i_discmode) { - /* Need to do more classification */ - return get_discmode_cd_generic(p_user_data); - } - return i_discmode; - -} - -static io_service_t -get_drive_service_osx(const _img_private_t *p_env) -{ - io_service_t service; - io_iterator_t service_iterator; - - service_iterator = GetDeviceIterator ( kIOCDBlockStorageDeviceClassString ); - - if( service_iterator == MACH_PORT_NULL ) return 0; - - service = IOIteratorNext( service_iterator ); - if( service == 0 ) return 0; - - do - { - char psz_service[MAX_SERVICE_NAME]; - IORegistryEntryGetPath(service, kIOServicePlane, psz_service); - psz_service[MAX_SERVICE_NAME-1] = '\0'; - - /* FIXME: This is all hoaky. Here we need info from a parent class, - psz_service of what we opened above. We are relying on the - fact that the name will be a substring of the name we - openned with. - */ - if (0 == strncmp(psz_service, p_env->psz_MediaClass_service, - strlen(psz_service))) { - /* Found our device */ - IOObjectRelease( service_iterator ); - return service; - } - - IOObjectRelease( service ); - - } while( ( service = IOIteratorNext( service_iterator ) ) != 0 ); - - IOObjectRelease( service_iterator ); - return service; -} - -static void -get_drive_cap_osx(const void *p_user_data, - /*out*/ cdio_drive_read_cap_t *p_read_cap, - /*out*/ cdio_drive_write_cap_t *p_write_cap, - /*out*/ cdio_drive_misc_cap_t *p_misc_cap) -{ - const _img_private_t *p_env = p_user_data; - uint32_t i_cdFlags; - uint32_t i_dvdFlags; - - io_service_t service = get_drive_service_osx(p_env); - - if( service == 0 ) goto err_exit; - - /* Found our device */ - { - CFDictionaryRef properties = GetRegistryEntryProperties ( service ); - - if (! GetFeaturesFlagsForDrive ( properties, &i_cdFlags, - &i_dvdFlags ) ) { - IOObjectRelease( service ); - goto err_exit; - } - - /* Reader */ - - if ( 0 != (i_cdFlags & kCDFeaturesAnalogAudioMask) ) - *p_read_cap |= CDIO_DRIVE_CAP_READ_AUDIO; - - if ( 0 != (i_cdFlags & kCDFeaturesWriteOnceMask) ) - *p_write_cap |= CDIO_DRIVE_CAP_WRITE_CD_R; - - if ( 0 != (i_cdFlags & kCDFeaturesCDDAStreamAccurateMask) ) - *p_read_cap |= CDIO_DRIVE_CAP_READ_CD_DA; - - if ( 0 != (i_dvdFlags & kDVDFeaturesReadStructuresMask) ) - *p_read_cap |= CDIO_DRIVE_CAP_READ_DVD_ROM; - - if ( 0 != (i_cdFlags & kCDFeaturesReWriteableMask) ) - *p_write_cap |= CDIO_DRIVE_CAP_WRITE_CD_RW; - - if ( 0 != (i_dvdFlags & kDVDFeaturesWriteOnceMask) ) - *p_write_cap |= CDIO_DRIVE_CAP_WRITE_DVD_R; - - if ( 0 != (i_dvdFlags & kDVDFeaturesRandomWriteableMask) ) - *p_write_cap |= CDIO_DRIVE_CAP_WRITE_DVD_RAM; - - if ( 0 != (i_dvdFlags & kDVDFeaturesReWriteableMask) ) - *p_write_cap |= CDIO_DRIVE_CAP_WRITE_DVD_RW; - - /*** - if ( 0 != (i_dvdFlags & kDVDFeaturesPlusRMask) ) - *p_write_cap |= CDIO_DRIVE_CAP_WRITE_DVD_PR; - - if ( 0 != (i_dvdFlags & kDVDFeaturesPlusRWMask ) - *p_write_cap |= CDIO_DRIVE_CAP_WRITE_DVD_PRW; - ***/ - - /* FIXME: fill out. For now assume CD-ROM is relatively modern. */ - *p_misc_cap = ( - CDIO_DRIVE_CAP_MISC_CLOSE_TRAY - | CDIO_DRIVE_CAP_MISC_EJECT - | CDIO_DRIVE_CAP_MISC_LOCK - | CDIO_DRIVE_CAP_MISC_SELECT_SPEED - | CDIO_DRIVE_CAP_MISC_MULTI_SESSION - | CDIO_DRIVE_CAP_MISC_MEDIA_CHANGED - | CDIO_DRIVE_CAP_MISC_RESET - | CDIO_DRIVE_CAP_MCN - | CDIO_DRIVE_CAP_ISRC - ); - - IOObjectRelease( service ); - } - - return; - - err_exit: - *p_misc_cap = *p_write_cap = *p_read_cap = CDIO_DRIVE_CAP_UNKNOWN; - return; -} - -#if 1 -/**************************************************************************** - * GetDriveDescription - Gets drive description. - ****************************************************************************/ - -static bool -get_hwinfo_osx ( const CdIo *p_cdio, /*out*/ cdio_hwinfo_t *hw_info) -{ - _img_private_t *p_env = (_img_private_t *) p_cdio->env; - io_service_t service = get_drive_service_osx(p_env); - - if ( service == 0 ) return false; - - /* Found our device */ - { - CFStringRef vendor = NULL; - CFStringRef product = NULL; - CFStringRef revision = NULL; - - CFDictionaryRef properties = GetRegistryEntryProperties ( service ); - CFDictionaryRef deviceDict = ( CFDictionaryRef ) - CFDictionaryGetValue ( properties, - CFSTR ( kIOPropertyDeviceCharacteristicsKey ) ); - - if ( deviceDict == 0 ) return false; - - vendor = ( CFStringRef ) - CFDictionaryGetValue ( deviceDict, CFSTR ( kIOPropertyVendorNameKey ) ); - - if ( CFStringGetCString( vendor, - (char *) &(hw_info->psz_vendor), - sizeof(hw_info->psz_vendor), - kCFStringEncodingASCII ) ) - CFRelease( vendor ); - - product = ( CFStringRef ) - CFDictionaryGetValue ( deviceDict, CFSTR ( kIOPropertyProductNameKey ) ); - - if ( CFStringGetCString( product, - (char *) &(hw_info->psz_model), - sizeof(hw_info->psz_model), - kCFStringEncodingASCII ) ) - CFRelease( product ); - - revision = ( CFStringRef ) - CFDictionaryGetValue ( deviceDict, - CFSTR ( kIOPropertyProductRevisionLevelKey ) ); - - if ( CFStringGetCString( product, - (char *) &(hw_info->psz_revision), - sizeof(hw_info->psz_revision), - kCFStringEncodingASCII ) ) - CFRelease( revision ); - } - return true; - -} -#endif - -/*! - Return the media catalog number MCN. - - Note: string is malloc'd so caller should free() then returned - string when done with it. - - */ -static const cdtext_t * -get_cdtext_osx (void *p_user_data, track_t i_track) -{ - return NULL; -} - -static void -_free_osx (void *p_user_data) { - _img_private_t *p_env = p_user_data; - if (NULL == p_env) return; - cdio_generic_free(p_env); - if (NULL != p_env->pp_lba) free((void *) p_env->pp_lba); - if (NULL != p_env->pTOC) free((void *) p_env->pTOC); - IOObjectRelease( p_env->MediaClass_service ); - - if (NULL != p_env->pp_scsiTaskDeviceInterface) - ( *(p_env->pp_scsiTaskDeviceInterface) )-> - Release ( (p_env->pp_scsiTaskDeviceInterface) ); - -} - -/*! - Reads nblocks of mode2 form2 sectors from cd device into data starting - from lsn. - Returns 0 if no error. - */ -static int -_get_read_mode1_sectors_osx (void *user_data, void *data, lsn_t lsn, - bool b_form2, unsigned int nblocks) -{ - _img_private_t *env = user_data; - dk_cd_read_t cd_read; - - memset( &cd_read, 0, sizeof(cd_read) ); - - cd_read.sectorArea = kCDSectorAreaUser; - cd_read.buffer = data; - cd_read.sectorType = kCDSectorTypeMode1; - - if (b_form2) { - cd_read.offset = lsn * kCDSectorSizeMode2; - cd_read.bufferLength = kCDSectorSizeMode2 * nblocks; - } else { - cd_read.offset = lsn * kCDSectorSizeMode1; - cd_read.bufferLength = kCDSectorSizeMode1 * nblocks; - } - - if( ioctl( env->gen.fd, DKIOCCDREAD, &cd_read ) == -1 ) - { - cdio_info( "could not read block %d, %s", lsn, strerror(errno) ); - return -1; - } - return 0; -} - - -/*! - Reads nblocks of mode2 form2 sectors from cd device into data starting - from lsn. - Returns 0 if no error. - */ -static int -_get_read_mode2_sectors_osx (void *user_data, void *data, lsn_t lsn, - bool b_form2, unsigned int nblocks) -{ - _img_private_t *env = user_data; - dk_cd_read_t cd_read; - - memset( &cd_read, 0, sizeof(cd_read) ); - - cd_read.sectorArea = kCDSectorAreaUser; - cd_read.buffer = data; - - if (b_form2) { - cd_read.offset = lsn * kCDSectorSizeMode2Form2; - cd_read.sectorType = kCDSectorTypeMode2Form2; - cd_read.bufferLength = kCDSectorSizeMode2Form2 * nblocks; - } else { - cd_read.offset = lsn * kCDSectorSizeMode2Form1; - cd_read.sectorType = kCDSectorTypeMode2Form1; - cd_read.bufferLength = kCDSectorSizeMode2Form1 * nblocks; - } - - if( ioctl( env->gen.fd, DKIOCCDREAD, &cd_read ) == -1 ) - { - cdio_info( "could not read block %d, %s", lsn, strerror(errno) ); - return -1; - } - return 0; -} - - -/*! - Reads a single audio sector from CD device into data starting from lsn. - Returns 0 if no error. - */ -static int -_get_read_audio_sectors_osx (void *user_data, void *data, lsn_t lsn, - unsigned int nblocks) -{ - _img_private_t *env = user_data; - dk_cd_read_t cd_read; - - memset( &cd_read, 0, sizeof(cd_read) ); - - cd_read.offset = lsn * kCDSectorSizeCDDA; - cd_read.sectorArea = kCDSectorAreaUser; - cd_read.sectorType = kCDSectorTypeCDDA; - - cd_read.buffer = data; - cd_read.bufferLength = kCDSectorSizeCDDA * nblocks; - - if( ioctl( env->gen.fd, DKIOCCDREAD, &cd_read ) == -1 ) - { - cdio_info( "could not read block %d", lsn ); - return -1; - } - return 0; -} - -/*! - Reads a single mode2 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ -static int -_get_read_mode1_sector_osx (void *user_data, void *data, lsn_t lsn, - bool b_form2) -{ - return _get_read_mode1_sectors_osx(user_data, data, lsn, b_form2, 1); -} - -/*! - Reads a single mode2 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ -static int -_get_read_mode2_sector_osx (void *user_data, void *data, lsn_t lsn, - bool b_form2) -{ - return _get_read_mode2_sectors_osx(user_data, data, lsn, b_form2, 1); -} - -/*! - Set the key "arg" to "value" in source device. -*/ -static int -_set_arg_osx (void *user_data, const char key[], const char value[]) -{ - _img_private_t *env = user_data; - - if (!strcmp (key, "source")) - { - if (!value) - return -2; - - free (env->gen.source_name); - - env->gen.source_name = strdup (value); - } - else if (!strcmp (key, "access-mode")) - { - if (!strcmp(value, "OSX")) - env->access_mode = _AM_OSX; - else - cdio_warn ("unknown access type: %s. ignored.", value); - } - else - return -1; - - return 0; -} - -#if 0 -static void TestDevice(_img_private_t *p_env, io_service_t service) -{ - SInt32 score; - HRESULT herr; - kern_return_t err; - IOCFPlugInInterface **plugInInterface = NULL; - MMCDeviceInterface **mmcInterface = NULL; - - /* Create the IOCFPlugIn interface so we can query it. */ - - err = IOCreatePlugInInterfaceForService ( service, - kIOMMCDeviceUserClientTypeID, - kIOCFPlugInInterfaceID, - &plugInInterface, - &score ); - if ( err != noErr ) { - printf("IOCreatePlugInInterfaceForService returned %d\n", err); - return; - } - - /* Query the interface for the MMCDeviceInterface. */ - - herr = ( *plugInInterface )->QueryInterface ( plugInInterface, - CFUUIDGetUUIDBytes ( kIOMMCDeviceInterfaceID ), - ( LPVOID ) &mmcInterface ); - - if ( herr != S_OK ) { - printf("QueryInterface returned %ld\n", herr); - return; - } - - p_env->pp_scsiTaskDeviceInterface = - ( *mmcInterface )->GetSCSITaskDeviceInterface ( mmcInterface ); - - if ( NULL == p_env->pp_scsiTaskDeviceInterface ) { - printf("GetSCSITaskDeviceInterface returned NULL\n"); - return; - } - - ( *mmcInterface )->Release ( mmcInterface ); - IODestroyPlugInInterface ( plugInInterface ); -} -#endif - -/*! - Read and cache the CD's Track Table of Contents and track info. - Return false if successful or true if an error. -*/ -static bool -read_toc_osx (void *p_user_data) -{ - _img_private_t *p_env = p_user_data; - CFDictionaryRef propertiesDict = 0; - CFDataRef data; - - /* create a CF dictionary containing the TOC */ - propertiesDict = GetRegistryEntryProperties( p_env->MediaClass_service ); - - if ( 0 == propertiesDict ) { - return false; - } - - /* get the TOC from the dictionary */ - data = (CFDataRef) CFDictionaryGetValue( propertiesDict, - CFSTR(kIOCDMediaTOCKey) ); - if ( data != NULL ) { - CFRange range; - CFIndex buf_len; - - buf_len = CFDataGetLength( data ) + 1; - range = CFRangeMake( 0, buf_len ); - - if( ( p_env->pTOC = (CDTOC *)malloc( buf_len ) ) != NULL ) { - CFDataGetBytes( data, range, (u_char *) p_env->pTOC ); - } else { - cdio_warn( "Trouble allocating CDROM TOC" ); - return false; - } - } else { - cdio_warn( "Trouble reading TOC" ); - return false; - } - - /* TestDevice(p_env, service); */ - CFRelease( propertiesDict ); - - p_env->i_descriptors = CDTOCGetDescriptorCount ( p_env->pTOC ); - - /* Read in starting sectors. There may be non-tracks mixed in with - the real tracks. So find the first and last track number by - scanning. Also find the lead-out track position. - */ - { - int i, i_leadout = -1; - - CDTOCDescriptor *pTrackDescriptors; - - p_env->pp_lba = malloc( p_env->i_descriptors * sizeof(int) ); - if( p_env->pp_lba == NULL ) - { - cdio_warn("Out of memory in allocating track starting LSNs" ); - free( p_env->pTOC ); - return false; - } - - pTrackDescriptors = p_env->pTOC->descriptors; - - p_env->gen.i_first_track = CDIO_CD_MAX_TRACKS+1; - p_env->i_last_track = CDIO_CD_MIN_TRACK_NO; - p_env->i_first_session = CDIO_CD_MAX_TRACKS+1; - p_env->i_last_session = CDIO_CD_MIN_TRACK_NO; - - for( i = 0; i <= p_env->i_descriptors; i++ ) - { - track_t i_track = pTrackDescriptors[i].point; - session_t i_session = pTrackDescriptors[i].session; - - cdio_debug( "point: %d, tno: %d, session: %d, adr: %d, control:%d, " - "address: %d:%d:%d, p: %d:%d:%d", - i_track, - pTrackDescriptors[i].tno, i_session, - pTrackDescriptors[i].adr, pTrackDescriptors[i].control, - pTrackDescriptors[i].address.minute, - pTrackDescriptors[i].address.second, - pTrackDescriptors[i].address.frame, - pTrackDescriptors[i].p.minute, - pTrackDescriptors[i].p.second, - pTrackDescriptors[i].p.frame ); - - /* track information has adr = 1 */ - if ( 0x01 != pTrackDescriptors[i].adr ) - continue; - - if( i_track == OSX_CDROM_LEADOUT_TRACK ) - i_leadout = i; - - if( i_track > CDIO_CD_MAX_TRACKS || i_track < CDIO_CD_MIN_TRACK_NO ) - continue; - - if (p_env->gen.i_first_track > i_track) - p_env->gen.i_first_track = i_track; - - if (p_env->i_last_track < i_track) - p_env->i_last_track = i_track; - - if (p_env->i_first_session > i_session) - p_env->i_first_session = i_session; - - if (p_env->i_last_session < i_session) - p_env->i_last_session = i_session; - } - - /* Now that we know what the first track number is, we can make sure - index positions are ordered starting at 0. - */ - for( i = 0; i <= p_env->i_descriptors; i++ ) - { - track_t i_track = pTrackDescriptors[i].point; - - if( i_track > CDIO_CD_MAX_TRACKS || i_track < CDIO_CD_MIN_TRACK_NO ) - continue; - - /* Note what OSX calls a LBA we call an LSN. So below re we - really have have MSF -> LSN -> LBA. - */ - p_env->pp_lba[i_track - p_env->gen.i_first_track] = - cdio_lsn_to_lba(CDConvertMSFToLBA( pTrackDescriptors[i].p )); - } - - if( i_leadout == -1 ) - { - cdio_warn( "CD leadout not found" ); - free( p_env->pp_lba ); - free( (void *) p_env->pTOC ); - return false; - } - - /* Set leadout sector. - Note what OSX calls a LBA we call an LSN. So below re we - really have have MSF -> LSN -> LBA. - */ - p_env->pp_lba[TOTAL_TRACKS] = - cdio_lsn_to_lba(CDConvertMSFToLBA( pTrackDescriptors[i_leadout].p )); - p_env->gen.i_tracks = TOTAL_TRACKS; - } - - p_env->gen.toc_init = true; - - return( true ); - -} - -/*! - Return the starting LSN track number - i_track in obj. Track numbers start at 1. - The "leadout" track is specified either by - using i_track LEADOUT_TRACK or the total tracks+1. - False is returned if there is no track entry. -*/ -static lsn_t -get_track_lba_osx(void *p_user_data, track_t i_track) -{ - _img_private_t *p_env = p_user_data; - - if (!p_env->gen.toc_init) read_toc_osx (p_env) ; - if (!p_env->gen.toc_init) return CDIO_INVALID_LSN; - - if (i_track == CDIO_CDROM_LEADOUT_TRACK) i_track = p_env->i_last_track+1; - - if (i_track > p_env->i_last_track + 1 || i_track < p_env->gen.i_first_track) { - return CDIO_INVALID_LSN; - } else { - return p_env->pp_lba[i_track - p_env->gen.i_first_track]; - } -} - -/*! - Eject media . Return 1 if successful, 0 otherwise. - - The only way to cleanly unmount the disc under MacOS X is to use the - 'disktool' command line utility. It uses the non-public Disk - Arbitration API, which can not be used by Cocoa or Carbon - applications. - - */ - -static int -_eject_media_osx (void *user_data) { - - _img_private_t *p_env = user_data; - - FILE *p_eject; - char *psz_disk; - char sz_cmd[32]; - - if( ( psz_disk = (char *)strstr( p_env->gen.source_name, "disk" ) ) != NULL && - strlen( psz_disk ) > 4 ) - { -#define EJECT_CMD "/usr/sbin/hdiutil eject %s" - snprintf( sz_cmd, sizeof(sz_cmd), EJECT_CMD, psz_disk ); -#undef EJECT_CMD - - if( ( p_eject = popen( sz_cmd, "r" ) ) != NULL ) - { - char psz_result[0x200]; - int i_ret = fread( psz_result, 1, sizeof(psz_result) - 1, p_eject ); - - if( i_ret == 0 && ferror( p_eject ) != 0 ) - { - pclose( p_eject ); - return 0; - } - - pclose( p_eject ); - - psz_result[ i_ret ] = 0; - - if( strstr( psz_result, "Disk Ejected" ) != NULL ) - { - return 1; - } - } - } - - return 0; -} - -/*! - Return the size of the CD in logical block address (LBA) units. - */ -static uint32_t -_stat_size_osx (void *user_data) -{ - return get_track_lba_osx(user_data, CDIO_CDROM_LEADOUT_TRACK); -} - -/*! - Return the value associated with the key "arg". -*/ -static const char * -_get_arg_osx (void *user_data, const char key[]) -{ - _img_private_t *p_env = user_data; - - if (!strcmp (key, "source")) { - return p_env->gen.source_name; - } else if (!strcmp (key, "access-mode")) { - switch (p_env->access_mode) { - case _AM_OSX: - return "OS X"; - case _AM_NONE: - return "no access method"; - } - } - return NULL; -} - -/*! - Return the media catalog number MCN. - */ -static char * -get_mcn_osx (const void *user_data) { - const _img_private_t *p_env = user_data; - dk_cd_read_mcn_t cd_read; - - memset( &cd_read, 0, sizeof(cd_read) ); - - if( ioctl( p_env->gen.fd, DKIOCCDREADMCN, &cd_read ) < 0 ) - { - cdio_debug( "could not read MCN, %s", strerror(errno) ); - return NULL; - } - return strdup((char*)cd_read.mcn); -} - - -/*! - Get format of track. -*/ -static track_format_t -get_track_format_osx(void *user_data, track_t i_track) -{ - _img_private_t *p_env = user_data; - dk_cd_read_track_info_t cd_read; - CDTrackInfo a_track; - - if (!p_env->gen.toc_init) read_toc_osx (p_env) ; - - if (i_track > p_env->i_last_track || i_track < p_env->gen.i_first_track) - return TRACK_FORMAT_ERROR; - - memset( &cd_read, 0, sizeof(cd_read) ); - - cd_read.address = i_track; - cd_read.addressType = kCDTrackInfoAddressTypeTrackNumber; - - cd_read.buffer = &a_track; - cd_read.bufferLength = sizeof(CDTrackInfo); - - if( ioctl( p_env->gen.fd, DKIOCCDREADTRACKINFO, &cd_read ) == -1 ) - { - cdio_warn( "could not read trackinfo for track %d", i_track ); - return TRACK_FORMAT_ERROR; - } - - cdio_debug( "%d: trackinfo trackMode: %x dataMode: %x", i_track, a_track.trackMode, a_track.dataMode ); - - if (a_track.trackMode == CDIO_CDROM_DATA_TRACK) { - if (a_track.dataMode == CDROM_CDI_TRACK) { - return TRACK_FORMAT_CDI; - } else if (a_track.dataMode == CDROM_XA_TRACK) { - return TRACK_FORMAT_XA; - } else { - return TRACK_FORMAT_DATA; - } - } else { - return TRACK_FORMAT_AUDIO; - } - -} - -/*! - Return true if we have XA data (green, mode2 form1) or - XA data (green, mode2 form2). That is track begins: - sync - header - subheader - 12 4 - 8 - - FIXME: there's gotta be a better design for this and get_track_format? -*/ -static bool -get_track_green_osx(void *user_data, track_t i_track) -{ - _img_private_t *p_env = user_data; - CDTrackInfo a_track; - - if (!p_env->gen.toc_init) read_toc_osx (p_env) ; - - if ( i_track > p_env->i_last_track || i_track < p_env->gen.i_first_track ) - return false; - - else { - - dk_cd_read_track_info_t cd_read; - - memset( &cd_read, 0, sizeof(cd_read) ); - - cd_read.address = i_track; - cd_read.addressType = kCDTrackInfoAddressTypeTrackNumber; - - cd_read.buffer = &a_track; - cd_read.bufferLength = sizeof(CDTrackInfo); - - if( ioctl( p_env->gen.fd, DKIOCCDREADTRACKINFO, &cd_read ) == -1 ) { - cdio_warn( "could not read trackinfo for track %d", i_track ); - return false; - } - return ((a_track.trackMode & CDIO_CDROM_DATA_TRACK) != 0); - } -} - -#endif /* HAVE_DARWIN_CDROM */ - -/*! - Return a string containing the default CD device if none is specified. - */ -char ** -cdio_get_devices_osx(void) -{ -#ifndef HAVE_DARWIN_CDROM - return NULL; -#else - io_object_t next_media; - mach_port_t master_port; - kern_return_t kern_result; - io_iterator_t media_iterator; - CFMutableDictionaryRef classes_to_match; - char **drives = NULL; - unsigned int num_drives=0; - - kern_result = IOMasterPort( MACH_PORT_NULL, &master_port ); - if( kern_result != KERN_SUCCESS ) - { - return( NULL ); - } - - classes_to_match = IOServiceMatching( kIOCDMediaClass ); - if( classes_to_match == NULL ) - { - return( NULL ); - } - - CFDictionarySetValue( classes_to_match, CFSTR(kIOMediaEjectableKey), - kCFBooleanTrue ); - - kern_result = IOServiceGetMatchingServices( master_port, - classes_to_match, - &media_iterator ); - if( kern_result != KERN_SUCCESS ) - { - return( NULL ); - } - - next_media = IOIteratorNext( media_iterator ); - if( next_media != 0 ) - { - char psz_buf[0x32]; - size_t dev_path_length; - CFTypeRef str_bsd_path; - - do - { - str_bsd_path = IORegistryEntryCreateCFProperty( next_media, - CFSTR( kIOBSDNameKey ), - kCFAllocatorDefault, - 0 ); - if( str_bsd_path == NULL ) - { - IOObjectRelease( next_media ); - continue; - } - - snprintf( psz_buf, sizeof(psz_buf), "%s%c", _PATH_DEV, 'r' ); - dev_path_length = strlen( psz_buf ); - - if( CFStringGetCString( str_bsd_path, - (char*)&psz_buf + dev_path_length, - sizeof(psz_buf) - dev_path_length, - kCFStringEncodingASCII ) ) - { - CFRelease( str_bsd_path ); - IOObjectRelease( next_media ); - IOObjectRelease( media_iterator ); - cdio_add_device_list(&drives, strdup(psz_buf), &num_drives); - } - - CFRelease( str_bsd_path ); - IOObjectRelease( next_media ); - - } while( ( next_media = IOIteratorNext( media_iterator ) ) != 0 ); - } - IOObjectRelease( media_iterator ); - cdio_add_device_list(&drives, NULL, &num_drives); - return drives; -#endif /* HAVE_DARWIN_CDROM */ -} - -/*! - Return a string containing the default CD device if none is specified. - */ -char * -cdio_get_default_device_osx(void) -{ -#ifndef HAVE_DARWIN_CDROM - return NULL; -#else - io_object_t next_media; - mach_port_t master_port; - kern_return_t kern_result; - io_iterator_t media_iterator; - CFMutableDictionaryRef classes_to_match; - - kern_result = IOMasterPort( MACH_PORT_NULL, &master_port ); - if( kern_result != KERN_SUCCESS ) - { - return( NULL ); - } - - classes_to_match = IOServiceMatching( kIOCDMediaClass ); - if( classes_to_match == NULL ) - { - return( NULL ); - } - - CFDictionarySetValue( classes_to_match, CFSTR(kIOMediaEjectableKey), - kCFBooleanTrue ); - - kern_result = IOServiceGetMatchingServices( master_port, - classes_to_match, - &media_iterator ); - if( kern_result != KERN_SUCCESS ) - { - return( NULL ); - } - - next_media = IOIteratorNext( media_iterator ); - if( next_media != 0 ) - { - char psz_buf[0x32]; - size_t dev_path_length; - CFTypeRef str_bsd_path; - - do - { - str_bsd_path = IORegistryEntryCreateCFProperty( next_media, - CFSTR( kIOBSDNameKey ), - kCFAllocatorDefault, - 0 ); - if( str_bsd_path == NULL ) - { - IOObjectRelease( next_media ); - continue; - } - - snprintf( psz_buf, sizeof(psz_buf), "%s%c", _PATH_DEV, 'r' ); - dev_path_length = strlen( psz_buf ); - - if( CFStringGetCString( str_bsd_path, - (char*)&psz_buf + dev_path_length, - sizeof(psz_buf) - dev_path_length, - kCFStringEncodingASCII ) ) - { - CFRelease( str_bsd_path ); - IOObjectRelease( next_media ); - IOObjectRelease( media_iterator ); - return strdup( psz_buf ); - } - - CFRelease( str_bsd_path ); - IOObjectRelease( next_media ); - - } while( ( next_media = IOIteratorNext( media_iterator ) ) != 0 ); - } - IOObjectRelease( media_iterator ); - return NULL; -#endif /* HAVE_DARWIN_CDROM */ -} - -/*! - Initialization routine. This is the only thing that doesn't - get called via a function pointer. In fact *we* are the - ones to set that up. - */ -CdIo * -cdio_open_am_osx (const char *psz_source_name, const char *psz_access_mode) -{ - - if (psz_access_mode != NULL) - cdio_warn ("there is only one access mode for OS X. Arg %s ignored", - psz_access_mode); - return cdio_open_osx(psz_source_name); -} - - -/*! - Initialization routine. This is the only thing that doesn't - get called via a function pointer. In fact *we* are the - ones to set that up. - */ -CdIo * -cdio_open_osx (const char *psz_orig_source) -{ - -#ifdef HAVE_DARWIN_CDROM - CdIo *ret; - _img_private_t *_data; - char *psz_source; - - cdio_funcs _funcs = { - .eject_media = _eject_media_osx, - .free = _free_osx, - .get_arg = _get_arg_osx, - .get_cdtext = get_cdtext_osx, - .get_default_device = cdio_get_default_device_osx, - .get_devices = cdio_get_devices_osx, - .get_discmode = get_discmode_osx, - .get_drive_cap = get_drive_cap_osx, - .get_first_track_num= get_first_track_num_generic, - .get_hwinfo = get_hwinfo_osx, - .get_mcn = get_mcn_osx, - .get_num_tracks = get_num_tracks_generic, - .get_track_format = get_track_format_osx, - .get_track_green = get_track_green_osx, - .get_track_lba = get_track_lba_osx, - .get_track_msf = NULL, - .lseek = cdio_generic_lseek, - .read = cdio_generic_read, - .read_audio_sectors = _get_read_audio_sectors_osx, - .read_mode1_sector = _get_read_mode1_sector_osx, - .read_mode1_sectors = _get_read_mode1_sectors_osx, - .read_mode2_sector = _get_read_mode2_sector_osx, - .read_mode2_sectors = _get_read_mode2_sectors_osx, - .read_toc = read_toc_osx, - .run_scsi_mmc_cmd = run_scsi_cmd_osx, - .set_arg = _set_arg_osx, - .stat_size = _stat_size_osx - }; - - _data = _cdio_malloc (sizeof (_img_private_t)); - _data->access_mode = _AM_OSX; - _data->MediaClass_service = 0; - _data->gen.init = false; - _data->gen.fd = -1; - _data->gen.toc_init = false; - _data->gen.b_cdtext_init = false; - _data->gen.b_cdtext_error = false; - - if (NULL == psz_orig_source) { - psz_source=cdio_get_default_device_osx(); - if (NULL == psz_source) return NULL; - _set_arg_osx(_data, "source", psz_source); - free(psz_source); - } else { - if (cdio_is_device_generic(psz_orig_source)) - _set_arg_osx(_data, "source", psz_orig_source); - else { - /* The below would be okay if all device drivers worked this way. */ -#if 0 - cdio_info ("source %s is a not a device", psz_orig_source); -#endif - return NULL; - } - } - - ret = cdio_new ((void *)_data, &_funcs); - if (ret == NULL) return NULL; - - if (cdio_generic_init(_data) && init_osx(_data)) - return ret; - else { - cdio_generic_free (_data); - return NULL; - } - -#else - return NULL; -#endif /* HAVE_DARWIN_CDROM */ - -} - -bool -cdio_have_osx (void) -{ -#ifdef HAVE_DARWIN_CDROM - return true; -#else - return false; -#endif /* HAVE_DARWIN_CDROM */ -} diff --git a/src/input/vcd/libcdio/_cdio_stdio.c b/src/input/vcd/libcdio/_cdio_stdio.c deleted file mode 100644 index 0083b2194..000000000 --- a/src/input/vcd/libcdio/_cdio_stdio.c +++ /dev/null @@ -1,222 +0,0 @@ -/* - $Id: _cdio_stdio.c,v 1.2 2004/04/11 12:20:31 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/stat.h> -#include <errno.h> - -#include <cdio/logging.h> -#include <cdio/util.h> -#include "_cdio_stream.h" -#include "_cdio_stdio.h" - -static const char _rcsid[] = "$Id: _cdio_stdio.c,v 1.2 2004/04/11 12:20:31 miguelfreitas Exp $"; - -#define CDIO_STDIO_BUFSIZE (128*1024) - -typedef struct { - char *pathname; - FILE *fd; - char *fd_buf; - off_t st_size; /* used only for source */ -} _UserData; - -static int -_stdio_open (void *user_data) -{ - _UserData *const ud = user_data; - - if ((ud->fd = fopen (ud->pathname, "rb"))) - { - ud->fd_buf = _cdio_malloc (CDIO_STDIO_BUFSIZE); - setvbuf (ud->fd, ud->fd_buf, _IOFBF, CDIO_STDIO_BUFSIZE); - } - - return (ud->fd == NULL); -} - -static int -_stdio_close(void *user_data) -{ - _UserData *const ud = user_data; - - if (fclose (ud->fd)) - cdio_error ("fclose (): %s", strerror (errno)); - - ud->fd = NULL; - - free (ud->fd_buf); - ud->fd_buf = NULL; - - return 0; -} - -static void -_stdio_free(void *user_data) -{ - _UserData *const ud = user_data; - - if (ud->pathname) - free(ud->pathname); - - if (ud->fd) /* should be NULL anyway... */ - _stdio_close(user_data); - - free(ud); -} - -/*! - Like fseek(3) and in fact may be the same. - - This function sets the file position indicator for the stream - pointed to by stream. The new position, measured in bytes, is obtained - by adding offset bytes to the position specified by whence. If whence - is set to SEEK_SET, SEEK_CUR, or SEEK_END, the offset is relative to - the start of the file, the current position indicator, or end-of-file, - respectively. A successful call to the fseek function clears the end- - of-file indicator for the stream and undoes any effects of the - ungetc(3) function on the same stream. - - RETURN VALUE - Upon successful completion, return 0, - Otherwise, -1 is returned and the global variable errno is set to indi- - cate the error. -*/ -static long -_stdio_seek(void *user_data, long offset, int whence) -{ - _UserData *const ud = user_data; - - if ( (offset=fseek (ud->fd, offset, whence)) ) { - cdio_error ("fseek (): %s", strerror (errno)); - } - - return offset; -} - -static long int -_stdio_stat(void *user_data) -{ - const _UserData *const ud = user_data; - - return ud->st_size; -} - -/*! - Like fread(3) and in fact is about the same. - - DESCRIPTION: - The function fread reads nmemb elements of data, each size bytes long, - from the stream pointed to by stream, storing them at the location - given by ptr. - - RETURN VALUE: - return the number of items successfully read or written (i.e., - not the number of characters). If an error occurs, or the - end-of-file is reached, the return value is a short item count - (or zero). - - We do not distinguish between end-of-file and error, and callers - must use feof(3) and ferror(3) to determine which occurred. - */ -static long -_stdio_read(void *user_data, void *buf, long int count) -{ - _UserData *const ud = user_data; - long read; - - read = fread(buf, 1, count, ud->fd); - - if (read != count) - { /* fixme -- ferror/feof */ - if (feof (ud->fd)) - { - cdio_debug ("fread (): EOF encountered"); - clearerr (ud->fd); - } - else if (ferror (ud->fd)) - { - cdio_error ("fread (): %s", strerror (errno)); - clearerr (ud->fd); - } - else - cdio_debug ("fread (): short read and no EOF?!?"); - } - - return read; -} - -/*! - Deallocate resources assocaited with obj. After this obj is unusable. -*/ -void -cdio_stdio_destroy(CdioDataSource *obj) -{ - cdio_stream_destroy(obj); -} - -CdioDataSource* -cdio_stdio_new(const char pathname[]) -{ - CdioDataSource *new_obj = NULL; - cdio_stream_io_functions funcs = { 0, }; - _UserData *ud = NULL; - struct stat statbuf; - - if (stat (pathname, &statbuf) == -1) - { - cdio_warn ("could not retrieve file info for `%s': %s", - pathname, strerror (errno)); - return NULL; - } - - ud = _cdio_malloc (sizeof (_UserData)); - - ud->pathname = strdup(pathname); - ud->st_size = statbuf.st_size; /* let's hope it doesn't change... */ - - funcs.open = _stdio_open; - funcs.seek = _stdio_seek; - funcs.stat = _stdio_stat; - funcs.read = _stdio_read; - funcs.close = _stdio_close; - funcs.free = _stdio_free; - - new_obj = cdio_stream_new(ud, &funcs); - - return new_obj; -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/_cdio_stdio.h b/src/input/vcd/libcdio/_cdio_stdio.h deleted file mode 100644 index f5e79c41c..000000000 --- a/src/input/vcd/libcdio/_cdio_stdio.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - $Id: _cdio_stdio.h,v 1.2 2004/04/11 12:20:31 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2003 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - - -#ifndef __CDIO_STDIO_H__ -#define __CDIO_STDIO_H__ - -#include "_cdio_stream.h" - -/*! - Initialize a new stdio stream reading from pathname. - A pointer to the stream is returned or NULL if there was an error. - - cdio_stream_free should be called on the returned value when you - don't need the stream any more. No other finalization is needed. - */ -CdioDataSource* cdio_stdio_new(const char pathname[]); - -/*! - Deallocate resources assocaited with obj. After this obj is unusable. -*/ -void cdio_stdio_destroy(CdioDataSource *obj); - - -#endif /* __CDIO_STREAM_STDIO_H__ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/_cdio_stream.c b/src/input/vcd/libcdio/_cdio_stream.c deleted file mode 100644 index fc1f7fce7..000000000 --- a/src/input/vcd/libcdio/_cdio_stream.c +++ /dev/null @@ -1,200 +0,0 @@ -/* - $Id: _cdio_stream.c,v 1.2 2004/04/11 12:20:31 miguelfreitas Exp $ - - Copyright (C) 2000, 2004 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <stdarg.h> -#include "cdio_assert.h" - -/* #define STREAM_DEBUG */ - -#include <cdio/logging.h> -#include <cdio/util.h> -#include "_cdio_stream.h" - -static const char _rcsid[] = "$Id: _cdio_stream.c,v 1.2 2004/04/11 12:20:31 miguelfreitas Exp $"; - -/* - * DataSource implementations - */ - -struct _CdioDataSource { - void* user_data; - cdio_stream_io_functions op; - int is_open; - long position; -}; - -/* - Open if not already open. - Return false if we hit an error. Errno should be set for that error. -*/ -static bool -_cdio_stream_open_if_necessary(CdioDataSource *obj) -{ - cdio_assert (obj != NULL); - - if (!obj->is_open) { - if (obj->op.open(obj->user_data)) { - cdio_warn ("could not open input stream..."); - return false; - } else { - cdio_debug ("opened source..."); - obj->is_open = 1; - obj->position = 0; - } - } - return true; -} - -/*! - Like 3 fseek and in fact may be the same. - - This function sets the file position indicator for the stream - pointed to by stream. The new position, measured in bytes, is obtained - by adding offset bytes to the position specified by whence. If whence - is set to SEEK_SET, SEEK_CUR, or SEEK_END, the offset is relative to - the start of the file, the current position indicator, or end-of-file, - respectively. A successful call to the fseek function clears the end- - of-file indicator for the stream and undoes any effects of the - ungetc(3) function on the same stream. - - RETURN VALUE - Upon successful completion, return 0, - Otherwise, -1 is returned and the global variable errno is set to indi- - cate the error. -*/ -long -cdio_stream_seek(CdioDataSource* obj, long offset, int whence) -{ - cdio_assert (obj != NULL); - - if (!_cdio_stream_open_if_necessary(obj)) - /* errno is set by _cdio_stream_open_if necessary. */ - return -1; - - if (obj->position != offset) { -#ifdef STREAM_DEBUG - cdio_warn("had to reposition DataSource from %ld to %ld!", obj->position, offset); -#endif - obj->position = offset; - return obj->op.seek(obj->user_data, offset, whence); - } - - return 0; -} - -CdioDataSource* -cdio_stream_new(void *user_data, const cdio_stream_io_functions *funcs) -{ - CdioDataSource *new_obj; - - new_obj = _cdio_malloc (sizeof (CdioDataSource)); - - new_obj->user_data = user_data; - memcpy(&(new_obj->op), funcs, sizeof(cdio_stream_io_functions)); - - return new_obj; -} - -/*! - Like fread(3) and in fact may be the same. - - DESCRIPTION: - The function fread reads nmemb elements of data, each size bytes long, - from the stream pointed to by stream, storing them at the location - given by ptr. - - RETURN VALUE: - return the number of items successfully read or written (i.e., - not the number of characters). If an error occurs, or the - end-of-file is reached, the return value is a short item count - (or zero). - - We do not distinguish between end-of-file and error, and callers - must use feof(3) and ferror(3) to determine which occurred. -*/ -long -cdio_stream_read(CdioDataSource* obj, void *ptr, long size, long nmemb) -{ - long read_bytes; - - cdio_assert (obj != NULL); - - if (!_cdio_stream_open_if_necessary(obj)) return 0; - - read_bytes = obj->op.read(obj->user_data, ptr, size*nmemb); - obj->position += read_bytes; - - return read_bytes; -} - -/*! - Return whatever size of stream reports, I guess unit size is bytes. - On error return -1; - */ -long int -cdio_stream_stat(CdioDataSource* obj) -{ - cdio_assert (obj != NULL); - - if (!_cdio_stream_open_if_necessary(obj)) return -1; - - return obj->op.stat(obj->user_data); -} - -void -cdio_stream_close(CdioDataSource* obj) -{ - cdio_assert (obj != NULL); - - if (obj->is_open) { - cdio_debug ("closed source..."); - obj->op.close(obj->user_data); - obj->is_open = 0; - obj->position = 0; - } -} - -void -cdio_stream_destroy(CdioDataSource* obj) -{ - cdio_assert (obj != NULL); - - cdio_stream_close(obj); - - obj->op.free(obj->user_data); - - free(obj); -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/_cdio_stream.h b/src/input/vcd/libcdio/_cdio_stream.h deleted file mode 100644 index ffbb4098e..000000000 --- a/src/input/vcd/libcdio/_cdio_stream.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - $Id: _cdio_stream.h,v 1.2 2004/04/11 12:20:31 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - - -#ifndef __CDIO_STREAM_H__ -#define __CDIO_STREAM_H__ - -#include <cdio/types.h> -#include "cdio_private.h" - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - /* typedef'ed IO functions prototypes */ - - typedef int(*cdio_data_open_t)(void *user_data); - - typedef long(*cdio_data_read_t)(void *user_data, void *buf, long count); - - typedef long(*cdio_data_seek_t)(void *user_data, long offset, int whence); - - typedef long(*cdio_data_stat_t)(void *user_data); - - typedef int(*cdio_data_close_t)(void *user_data); - - typedef void(*cdio_data_free_t)(void *user_data); - - - /* abstract data source */ - - typedef struct { - cdio_data_open_t open; - cdio_data_seek_t seek; - cdio_data_stat_t stat; - cdio_data_read_t read; - cdio_data_close_t close; - cdio_data_free_t free; - } cdio_stream_io_functions; - - CdioDataSource* - cdio_stream_new(void *user_data, const cdio_stream_io_functions *funcs); - - /*! - Like fread(3) and in fact may be the same. - - DESCRIPTION: - The function fread reads nmemb elements of data, each size bytes long, - from the stream pointed to by stream, storing them at the location - given by ptr. - - RETURN VALUE: - return the number of items successfully read or written (i.e., - not the number of characters). If an error occurs, or the - end-of-file is reached, the return value is a short item count - (or zero). - - We do not distinguish between end-of-file and error, and callers - must use feof(3) and ferror(3) to determine which occurred. - */ - long - cdio_stream_read(CdioDataSource* obj, void *ptr, long size, long nmemb); - - /*! - Like fseek(3) and in fact may be the same. - - This function sets the file position indicator for the stream - pointed to by stream. The new position, measured in bytes, is obtained - by adding offset bytes to the position specified by whence. If whence - is set to SEEK_SET, SEEK_CUR, or SEEK_END, the offset is relative to - the start of the file, the current position indicator, or end-of-file, - respectively. A successful call to the fseek function clears the end- - of-file indicator for the stream and undoes any effects of the - ungetc(3) function on the same stream. - - RETURN VALUE - Upon successful completion, return 0, - Otherwise, -1 is returned and the global variable errno is set to indi- - cate the error. - */ - long int cdio_stream_seek(CdioDataSource* obj, long offset, int whence); - - /*! - Return whatever size of stream reports, I guess unit size is bytes. - On error return -1; - */ - long int cdio_stream_stat(CdioDataSource* obj); - - /*! - Deallocate resources assocaited with obj. After this obj is unusable. - */ - void cdio_stream_destroy(CdioDataSource* obj); - - void cdio_stream_close(CdioDataSource* obj); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __CDIO_STREAM_H__ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/_cdio_sunos.c b/src/input/vcd/libcdio/_cdio_sunos.c deleted file mode 100644 index 245d1e319..000000000 --- a/src/input/vcd/libcdio/_cdio_sunos.c +++ /dev/null @@ -1,917 +0,0 @@ -/* - $Id: _cdio_sunos.c,v 1.3 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#ifdef HAVE_STRING_H -#include <string.h> -#endif - -#include <cdio/logging.h> -#include <cdio/sector.h> -#include <cdio/util.h> -#include <cdio/scsi_mmc.h> -#include "cdio_assert.h" -#include "cdio_private.h" - -#define DEFAULT_CDIO_DEVICE "/vol/dev/aliases/cdrom0" - -#ifdef HAVE_SOLARIS_CDROM - -static const char _rcsid[] = "$Id: _cdio_sunos.c,v 1.3 2005/01/01 02:43:57 rockyb Exp $"; - -#ifdef HAVE_GLOB_H -#include <glob.h> -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <errno.h> -#include <unistd.h> -#include <fcntl.h> - -#ifdef HAVE_SYS_CDIO_H -# include <sys/cdio.h> /* CDIOCALLOW etc... */ -#else -#error "You need <sys/cdio.h> to have CDROM support" -#endif - -#include <sys/dkio.h> -#include <sys/scsi/generic/commands.h> -#include <sys/scsi/impl/uscsi.h> - -#include <sys/stat.h> -#include <sys/types.h> -#include <sys/ioctl.h> -#include "cdtext_private.h" - -/* not defined in dkio.h yet */ -#define DK_DVDRW 0x13 - -/* reader */ - -typedef enum { - _AM_NONE, - _AM_SUN_CTRL_ATAPI, - _AM_SUN_CTRL_SCSI -#if FINISHED - _AM_READ_CD, - _AM_READ_10 -#endif -} access_mode_t; - - -typedef struct { - /* Things common to all drivers like this. - This must be first. */ - generic_img_private_t gen; - - access_mode_t access_mode; - - /* Some of the more OS specific things. */ - /* Entry info for each track, add 1 for leadout. */ - struct cdrom_tocentry tocent[CDIO_CD_MAX_TRACKS+1]; - - /* Track information */ - struct cdrom_tochdr tochdr; -} _img_private_t; - -static track_format_t get_track_format_solaris(void *p_user_data, - track_t i_track); - -static access_mode_t -str_to_access_mode_sunos(const char *psz_access_mode) -{ - const access_mode_t default_access_mode = _AM_SUN_CTRL_SCSI; - - if (NULL==psz_access_mode) return default_access_mode; - - if (!strcmp(psz_access_mode, "ATAPI")) - return _AM_SUN_CTRL_SCSI; /* force ATAPI to be SCSI */ - else if (!strcmp(psz_access_mode, "SCSI")) - return _AM_SUN_CTRL_SCSI; - else { - cdio_warn ("unknown access type: %s. Default SCSI used.", - psz_access_mode); - return default_access_mode; - } -} - - -/*! - Initialize CD device. - */ -static bool -init_solaris (_img_private_t *p_env) -{ - - if (!cdio_generic_init(p_env)) return false; - - p_env->access_mode = _AM_SUN_CTRL_SCSI; - - return true; -} - -/*! - Run a SCSI MMC command. - - p_user_data internal CD structure. - i_timeout_ms time in milliseconds we will wait for the command - to complete. - i_cdb Size of p_cdb - p_cdb CDB bytes. - e_direction direction the transfer is to go. - i_buf Size of buffer - p_buf Buffer for data, both sending and receiving - - Return 0 if no error. - */ -static int -run_scsi_cmd_solaris( const void *p_user_data, unsigned int i_timeout_ms, - unsigned int i_cdb, const scsi_mmc_cdb_t *p_cdb, - scsi_mmc_direction_t e_direction, - unsigned int i_buf, /*in/out*/ void *p_buf ) -{ - const _img_private_t *p_env = p_user_data; - struct uscsi_cmd cgc; - - memset (&cgc, 0, sizeof (struct uscsi_cmd)); - cgc.uscsi_cdb = (caddr_t) p_cdb; - - cgc.uscsi_flags = SCSI_MMC_DATA_READ == e_direction ? - USCSI_READ : USCSI_WRITE; - - cgc.uscsi_timeout = msecs2secs(i_timeout_ms); - cgc.uscsi_bufaddr = p_buf; - cgc.uscsi_buflen = i_buf; - cgc.uscsi_cdblen = i_cdb; - - return ioctl(p_env->gen.fd, USCSICMD, &cgc); -} - -/*! - Reads audio sectors from CD device into data starting from lsn. - Returns 0 if no error. - - May have to check size of nblocks. There may be a limit that - can be read in one go, e.g. 25 blocks. -*/ - -static int -_read_audio_sectors_solaris (void *p_user_data, void *data, lsn_t lsn, - unsigned int nblocks) -{ - struct cdrom_msf solaris_msf; - msf_t _msf; - struct cdrom_cdda cdda; - - _img_private_t *p_env = p_user_data; - - cdio_lba_to_msf (cdio_lsn_to_lba(lsn), &_msf); - solaris_msf.cdmsf_min0 = cdio_from_bcd8(_msf.m); - solaris_msf.cdmsf_sec0 = cdio_from_bcd8(_msf.s); - solaris_msf.cdmsf_frame0 = cdio_from_bcd8(_msf.f); - - if (p_env->gen.ioctls_debugged == 75) - cdio_debug ("only displaying every 75th ioctl from now on"); - - if (p_env->gen.ioctls_debugged == 30 * 75) - cdio_debug ("only displaying every 30*75th ioctl from now on"); - - if (p_env->gen.ioctls_debugged < 75 - || (p_env->gen.ioctls_debugged < (30 * 75) - && p_env->gen.ioctls_debugged % 75 == 0) - || p_env->gen.ioctls_debugged % (30 * 75) == 0) - cdio_debug ("reading %d", lsn); - - p_env->gen.ioctls_debugged++; - - cdda.cdda_addr = lsn; - cdda.cdda_length = nblocks; - cdda.cdda_data = (caddr_t) data; - cdda.cdda_subcode = CDROM_DA_NO_SUBCODE; - - if (ioctl (p_env->gen.fd, CDROMCDDA, &cdda) == -1) { - perror ("ioctl(..,CDROMCDDA,..)"); - return 1; - /* exit (EXIT_FAILURE); */ - } - - return 0; -} - -/*! - Reads a single mode1 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ -static int -_read_mode1_sector_solaris (void *env, void *data, lsn_t lsn, - bool b_form2) -{ - -#if FIXED - do something here. -#else - return cdio_generic_read_form1_sector(env, data, lsn); -#endif -} - -/*! - Reads nblocks of mode2 sectors from cd device into data starting - from lsn. - Returns 0 if no error. - */ -static int -_read_mode1_sectors_solaris (void *p_user_data, void *p_data, lsn_t lsn, - bool b_form2, unsigned int nblocks) -{ - _img_private_t *p_env = p_user_data; - unsigned int i; - int retval; - unsigned int blocksize = b_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE; - - for (i = 0; i < nblocks; i++) { - if ( (retval = _read_mode1_sector_solaris (p_env, - ((char *)p_data) + (blocksize * i), - lsn + i, b_form2)) ) - return retval; - } - return 0; -} - -/*! - Reads a single mode2 sector from cd device into data starting from lsn. - Returns 0 if no error. - */ -static int -_read_mode2_sector_solaris (void *p_user_data, void *p_data, lsn_t lsn, - bool b_form2) -{ - char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; - struct cdrom_msf solaris_msf; - msf_t _msf; - int offset = 0; - struct cdrom_cdxa cd_read; - - _img_private_t *p_env = p_user_data; - - cdio_lba_to_msf (cdio_lsn_to_lba(lsn), &_msf); - solaris_msf.cdmsf_min0 = cdio_from_bcd8(_msf.m); - solaris_msf.cdmsf_sec0 = cdio_from_bcd8(_msf.s); - solaris_msf.cdmsf_frame0 = cdio_from_bcd8(_msf.f); - - if (p_env->gen.ioctls_debugged == 75) - cdio_debug ("only displaying every 75th ioctl from now on"); - - if (p_env->gen.ioctls_debugged == 30 * 75) - cdio_debug ("only displaying every 30*75th ioctl from now on"); - - if (p_env->gen.ioctls_debugged < 75 - || (p_env->gen.ioctls_debugged < (30 * 75) - && p_env->gen.ioctls_debugged % 75 == 0) - || p_env->gen.ioctls_debugged % (30 * 75) == 0) - cdio_debug ("reading %2.2d:%2.2d:%2.2d", - solaris_msf.cdmsf_min0, solaris_msf.cdmsf_sec0, - solaris_msf.cdmsf_frame0); - - p_env->gen.ioctls_debugged++; - - /* Using CDROMXA ioctl will actually use the same uscsi command - * as ATAPI, except we don't need to be root - */ - offset = CDIO_CD_XA_SYNC_HEADER; - cd_read.cdxa_addr = lsn; - cd_read.cdxa_data = buf; - cd_read.cdxa_length = 1; - cd_read.cdxa_format = CDROM_XA_SECTOR_DATA; - if (ioctl (p_env->gen.fd, CDROMCDXA, &cd_read) == -1) { - perror ("ioctl(..,CDROMCDXA,..)"); - return 1; - /* exit (EXIT_FAILURE); */ - } - - if (b_form2) - memcpy (p_data, buf + (offset-CDIO_CD_SUBHEADER_SIZE), M2RAW_SECTOR_SIZE); - else - memcpy (((char *)p_data), buf + offset, CDIO_CD_FRAMESIZE); - - return 0; -} - -/*! - Reads nblocks of mode2 sectors from cd device into data starting - from lsn. - Returns 0 if no error. - */ -static int -_read_mode2_sectors_solaris (void *p_user_data, void *data, lsn_t lsn, - bool b_form2, unsigned int nblocks) -{ - _img_private_t *env = p_user_data; - unsigned int i; - int retval; - unsigned int blocksize = b_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE; - - for (i = 0; i < nblocks; i++) { - if ( (retval = _read_mode2_sector_solaris (env, - ((char *)data) + (blocksize * i), - lsn + i, b_form2)) ) - return retval; - } - return 0; -} - - -/*! - Return the size of the CD in logical block address (LBA) units. - */ -static uint32_t -_cdio_stat_size (void *p_user_data) -{ - _img_private_t *env = p_user_data; - - struct cdrom_tocentry tocent; - uint32_t size; - - tocent.cdte_track = CDIO_CDROM_LEADOUT_TRACK; - tocent.cdte_format = CDIO_CDROM_LBA; - if (ioctl (env->gen.fd, CDROMREADTOCENTRY, &tocent) == -1) - { - perror ("ioctl(CDROMREADTOCENTRY)"); - exit (EXIT_FAILURE); - } - - size = tocent.cdte_addr.lba; - - return size; -} - -/*! - Set the arg "key" with "value" in the source device. - Currently "source" and "access-mode" are valid keys. - "source" sets the source device in I/O operations - "access-mode" sets the the method of CD access - - 0 is returned if no error was found, and nonzero if there as an error. -*/ -static int -_set_arg_solaris (void *p_user_data, const char key[], const char value[]) -{ - _img_private_t *env = p_user_data; - - if (!strcmp (key, "source")) - { - if (!value) - return -2; - - free (env->gen.source_name); - - env->gen.source_name = strdup (value); - } - else if (!strcmp (key, "access-mode")) - { - env->access_mode = str_to_access_mode_sunos(key); - } - else - return -1; - - return 0; -} - -/*! - Read and cache the CD's Track Table of Contents and track info. - Return true if successful or false if an error. -*/ -static bool -read_toc_solaris (void *p_user_data) -{ - _img_private_t *p_env = p_user_data; - int i; - - /* read TOC header */ - if ( ioctl(p_env->gen.fd, CDROMREADTOCHDR, &p_env->tochdr) == -1 ) { - cdio_warn("%s: %s\n", - "error in ioctl CDROMREADTOCHDR", strerror(errno)); - return false; - } - - p_env->gen.i_first_track = p_env->tochdr.cdth_trk0; - p_env->gen.i_tracks = p_env->tochdr.cdth_trk1; - - /* read individual tracks */ - for (i=p_env->gen.i_first_track; i<=p_env->gen.i_tracks; i++) { - p_env->tocent[i-1].cdte_track = i; - p_env->tocent[i-1].cdte_format = CDIO_CDROM_MSF; - if ( ioctl(p_env->gen.fd, CDROMREADTOCENTRY, &p_env->tocent[i-1]) == -1 ) { - cdio_warn("%s %d: %s\n", - "error in ioctl CDROMREADTOCENTRY for track", - i, strerror(errno)); - return false; - } - } - - /* read the lead-out track */ - p_env->tocent[p_env->tochdr.cdth_trk1].cdte_track = CDIO_CDROM_LEADOUT_TRACK; - p_env->tocent[p_env->tochdr.cdth_trk1].cdte_format = CDIO_CDROM_MSF; - - if (ioctl(p_env->gen.fd, CDROMREADTOCENTRY, - &p_env->tocent[p_env->tochdr.cdth_trk1]) == -1 ) { - cdio_warn("%s: %s\n", - "error in ioctl CDROMREADTOCENTRY for lead-out", - strerror(errno)); - return false; - } - - p_env->gen.toc_init = true; - return true; -} - -/*! - Eject media in CD drive. If successful, as a side effect we - also free obj. - */ -static int -eject_media_solaris (void *p_user_data) { - - _img_private_t *env = p_user_data; - int ret; - - close(env->gen.fd); - env->gen.fd = -1; - if (env->gen.fd > -1) { - if ((ret = ioctl(env->gen.fd, CDROMEJECT)) != 0) { - cdio_generic_free((void *) env); - cdio_warn ("CDROMEJECT failed: %s\n", strerror(errno)); - return 1; - } else { - return 0; - } - } - return 2; -} - - -static void * -_cdio_malloc_and_zero(size_t size) { - void *ptr; - - if( !size ) size++; - - if((ptr = malloc(size)) == NULL) { - cdio_warn("malloc() failed: %s", strerror(errno)); - return NULL; - } - - memset(ptr, 0, size); - return ptr; -} - -/*! - Return the value associated with the key "arg". -*/ -static const char * -get_arg_solaris (void *p_user_data, const char key[]) -{ - _img_private_t *env = p_user_data; - - if (!strcmp (key, "source")) { - return env->gen.source_name; - } else if (!strcmp (key, "access-mode")) { - switch (env->access_mode) { - case _AM_SUN_CTRL_ATAPI: - return "ATAPI"; - case _AM_SUN_CTRL_SCSI: - return "SCSI"; - case _AM_NONE: - return "no access method"; - } - } - return NULL; -} - -/*! - Return a string containing the default CD device if none is specified. - */ -char * -cdio_get_default_device_solaris(void) -{ - char *volume_device; - char *volume_name; - char *volume_action; - char *device; - struct stat stb; - - if ((volume_device = getenv("VOLUME_DEVICE")) != NULL && - (volume_name = getenv("VOLUME_NAME")) != NULL && - (volume_action = getenv("VOLUME_ACTION")) != NULL && - strcmp(volume_action, "insert") == 0) { - - device = _cdio_malloc_and_zero(strlen(volume_device) - + strlen(volume_name) + 2); - if (device == NULL) - return strdup(DEFAULT_CDIO_DEVICE); - sprintf(device, "%s/%s", volume_device, volume_name); - if (stat(device, &stb) != 0 || !S_ISCHR(stb.st_mode)) { - free(device); - return strdup(DEFAULT_CDIO_DEVICE); - } - return device; - } - /* Check if it could be a Solaris media*/ - if((stat(DEFAULT_CDIO_DEVICE, &stb) == 0) && S_ISDIR(stb.st_mode)) { - device = _cdio_malloc_and_zero(strlen(DEFAULT_CDIO_DEVICE) + 4); - sprintf(device, "%s/s0", DEFAULT_CDIO_DEVICE); - return device; - } - return strdup(DEFAULT_CDIO_DEVICE); -} - -/*! - Get disc type associated with cd object. -*/ - -static discmode_t -get_discmode_solaris (void *p_user_data) -{ - _img_private_t *p_env = p_user_data; - track_t i_track; - discmode_t discmode=CDIO_DISC_MODE_NO_INFO; - struct dk_minfo media; - int ret; - - /* Get the media info */ - if((ret = ioctl(p_env->gen.fd, DKIOCGMEDIAINFO, &media)) != 0) { - cdio_warn ("DKIOCGMEDIAINFO failed: %s\n", strerror(errno)); - return CDIO_DISC_MODE_NO_INFO; - } - switch(media.dki_media_type) { - case DK_CDROM: - case DK_CDR: - case DK_CDRW: - /* Do cdrom detection */ - break; - case DK_DVDROM: return CDIO_DISC_MODE_DVD_ROM; - case DK_DVDR: discmode = CDIO_DISC_MODE_DVD_R; - break; - case DK_DVDRAM: discmode = CDIO_DISC_MODE_DVD_RAM; - break; - case DK_DVDRW: - case DK_DVDRW+1: discmode = CDIO_DISC_MODE_DVD_RW; - break; - default: /* no valid match */ - return CDIO_DISC_MODE_NO_INFO; - } - - if((discmode == CDIO_DISC_MODE_DVD_RAM || - discmode == CDIO_DISC_MODE_DVD_RW || - discmode == CDIO_DISC_MODE_DVD_R)) { - /* Fallback to uscsi if we can */ - if(geteuid() == 0) - return get_discmode_solaris(p_user_data); - return discmode; - } - - if (!p_env->gen.toc_init) - read_toc_solaris (p_env); - - if (!p_env->gen.toc_init) - return CDIO_DISC_MODE_NO_INFO; - - for (i_track = p_env->gen.i_first_track; - i_track < p_env->gen.i_first_track + p_env->tochdr.cdth_trk1 ; - i_track ++) { - track_format_t track_fmt=get_track_format_solaris(p_env, i_track); - - switch(track_fmt) { - case TRACK_FORMAT_AUDIO: - switch(discmode) { - case CDIO_DISC_MODE_NO_INFO: - discmode = CDIO_DISC_MODE_CD_DA; - break; - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* No change*/ - break; - default: - discmode = CDIO_DISC_MODE_CD_MIXED; - } - break; - case TRACK_FORMAT_XA: - switch(discmode) { - case CDIO_DISC_MODE_NO_INFO: - discmode = CDIO_DISC_MODE_CD_XA; - break; - case CDIO_DISC_MODE_CD_XA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* No change*/ - break; - default: - discmode = CDIO_DISC_MODE_CD_MIXED; - } - break; - case TRACK_FORMAT_DATA: - switch(discmode) { - case CDIO_DISC_MODE_NO_INFO: - discmode = CDIO_DISC_MODE_CD_DATA; - break; - case CDIO_DISC_MODE_CD_DATA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* No change*/ - break; - default: - discmode = CDIO_DISC_MODE_CD_MIXED; - } - break; - case TRACK_FORMAT_ERROR: - default: - discmode = CDIO_DISC_MODE_ERROR; - } - } - return discmode; -} - -/*! - Get format of track. -*/ -static track_format_t -get_track_format_solaris(void *p_user_data, track_t i_track) -{ - _img_private_t *p_env = p_user_data; - - if ( !p_env ) return TRACK_FORMAT_ERROR; - if (!p_env->gen.init) init_solaris(p_env); - if (!p_env->gen.toc_init) read_toc_solaris (p_user_data) ; - - if ( (i_track > p_env->gen.i_tracks+p_env->gen.i_first_track) - || i_track < p_env->gen.i_first_track) - return TRACK_FORMAT_ERROR; - - i_track -= p_env->gen.i_first_track; - - /* This is pretty much copied from the "badly broken" cdrom_count_tracks - in linux/cdrom.c. - */ - if (p_env->tocent[i_track].cdte_ctrl & CDROM_DATA_TRACK) { - if (p_env->tocent[i_track].cdte_format == CDIO_CDROM_CDI_TRACK) - return TRACK_FORMAT_CDI; - else if (p_env->tocent[i_track].cdte_format == CDIO_CDROM_XA_TRACK) - return TRACK_FORMAT_XA; - else - return TRACK_FORMAT_DATA; - } else - return TRACK_FORMAT_AUDIO; - -} - -/*! - Return true if we have XA data (green, mode2 form1) or - XA data (green, mode2 form2). That is track begins: - sync - header - subheader - 12 4 - 8 - - FIXME: there's gotta be a better design for this and get_track_format? -*/ -static bool -_cdio_get_track_green(void *p_user_data, track_t i_track) -{ - _img_private_t *p_env = p_user_data; - - if ( !p_env ) return false; - if (!p_env->gen.init) init_solaris(p_env); - if (!p_env->gen.toc_init) read_toc_solaris (p_env) ; - - if (i_track >= p_env->gen.i_tracks+p_env->gen.i_first_track - || i_track < p_env->gen.i_first_track) - return false; - - i_track -= p_env->gen.i_first_track; - - /* FIXME: Dunno if this is the right way, but it's what - I was using in cd-info for a while. - */ - return ((p_env->tocent[i_track].cdte_ctrl & 2) != 0); -} - -/*! - Return the starting MSF (minutes/secs/frames) for track number - track_num in obj. Track numbers usually start at something - greater than 0, usually 1. - - The "leadout" track is specified either by - using track_num LEADOUT_TRACK or the total tracks+1. - False is returned if there is no entry. -*/ -static bool -_cdio_get_track_msf(void *p_user_data, track_t i_track, msf_t *msf) -{ - _img_private_t *p_env = p_user_data; - - if (NULL == msf) return false; - - if (!p_env->gen.init) init_solaris(p_env); - if (!p_env->gen.toc_init) read_toc_solaris (p_env) ; - - if (i_track == CDIO_CDROM_LEADOUT_TRACK) - i_track = p_env->gen.i_tracks + p_env->gen.i_first_track; - - if (i_track > (p_env->gen.i_tracks+p_env->gen.i_first_track) - || i_track < p_env->gen.i_first_track) { - return false; - } else { - struct cdrom_tocentry *msf0 = &p_env->tocent[i_track-1]; - msf->m = cdio_to_bcd8(msf0->cdte_addr.msf.minute); - msf->s = cdio_to_bcd8(msf0->cdte_addr.msf.second); - msf->f = cdio_to_bcd8(msf0->cdte_addr.msf.frame); - return true; - } -} - -#else -/*! - Return a string containing the default VCD device if none is specified. - */ -char * -cdio_get_default_device_solaris(void) -{ - return strdup(DEFAULT_CDIO_DEVICE); -} - -#endif /* HAVE_SOLARIS_CDROM */ - -/*! - Return an array of strings giving possible CD devices. - */ -char ** -cdio_get_devices_solaris (void) -{ -#ifndef HAVE_SOLARIS_CDROM - return NULL; -#else - char volpath[256]; - struct stat st; - char **drives = NULL; - unsigned int i_files=0; -#ifdef HAVE_GLOB_H - unsigned int i; - glob_t globbuf; - - globbuf.gl_offs = 0; - glob("/vol/dev/aliases/cdrom*", GLOB_DOOFFS, NULL, &globbuf); - for (i=0; i<globbuf.gl_pathc; i++) { - if(stat(globbuf.gl_pathv[i], &st) < 0) - continue; - - /* Check if this is a directory, if so it's probably Solaris media */ - if(S_ISDIR(st.st_mode)) { - sprintf(volpath, "%s/s0", globbuf.gl_pathv[i]); - if(stat(volpath, &st) == 0) - cdio_add_device_list(&drives, volpath, &i_files); - }else - cdio_add_device_list(&drives, globbuf.gl_pathv[i], &i_files); - } - globfree(&globbuf); -#else - if(stat(DEFAULT_CDIO_DEVICE, &st) == 0) { - /* Check if this is a directory, if so it's probably Solaris media */ - if(S_ISDIR(st.st_mode)) { - sprintf(volpath, "%s/s0", DEFAULT_CDIO_DEVICE); - if(stat(volpath, &st) == 0) - cdio_add_device_list(&drives, volpath, &i_files); - }else - cdio_add_device_list(&drives, DEFAULT_CDIO_DEVICE, &i_files); - } -#endif /*HAVE_GLOB_H*/ - cdio_add_device_list(&drives, NULL, &i_files); - return drives; -#endif /*HAVE_SOLARIS_CDROM*/ -} - -/*! - Initialization routine. This is the only thing that doesn't - get called via a function pointer. In fact *we* are the - ones to set that up. - */ -CdIo * -cdio_open_solaris (const char *psz_source_name) -{ - return cdio_open_am_solaris(psz_source_name, NULL); -} - -/*! - Initialization routine. This is the only thing that doesn't - get called via a function pointer. In fact *we* are the - ones to set that up. - */ -CdIo * -cdio_open_am_solaris (const char *psz_orig_source, const char *access_mode) -{ - -#ifdef HAVE_SOLARIS_CDROM - CdIo *ret; - _img_private_t *_data; - char *psz_source; - - cdio_funcs _funcs; - - _funcs.eject_media = eject_media_solaris; - _funcs.free = cdio_generic_free; - _funcs.get_arg = get_arg_solaris; - _funcs.get_cdtext = get_cdtext_generic; - _funcs.get_default_device = cdio_get_default_device_solaris; - _funcs.get_devices = cdio_get_devices_solaris; - _funcs.get_discmode = get_discmode_solaris; - _funcs.get_drive_cap = scsi_mmc_get_drive_cap_generic; - _funcs.get_first_track_num= get_first_track_num_generic; - _funcs.get_hwinfo = NULL; - _funcs.get_mcn = scsi_mmc_get_mcn_generic, - _funcs.get_num_tracks = get_num_tracks_generic; - _funcs.get_track_format = get_track_format_solaris; - _funcs.get_track_green = _cdio_get_track_green; - _funcs.get_track_lba = NULL; /* This could be implemented if need be. */ - _funcs.get_track_msf = _cdio_get_track_msf; - _funcs.lseek = cdio_generic_lseek; - _funcs.read = cdio_generic_read; - _funcs.read_audio_sectors = _read_audio_sectors_solaris; - _funcs.read_mode1_sector = _read_mode1_sector_solaris; - _funcs.read_mode1_sectors = _read_mode1_sectors_solaris; - _funcs.read_mode2_sector = _read_mode2_sector_solaris; - _funcs.read_mode2_sectors = _read_mode2_sectors_solaris; - _funcs.read_toc = read_toc_solaris; - _funcs.run_scsi_mmc_cmd = run_scsi_cmd_solaris; - _funcs.stat_size = _cdio_stat_size; - _funcs.set_arg = _set_arg_solaris; - - _data = _cdio_malloc (sizeof (_img_private_t)); - - _data->access_mode = _AM_SUN_CTRL_SCSI; - _data->gen.init = false; - _data->gen.fd = -1; - _data->gen.toc_init = false; - _data->gen.b_cdtext_init = false; - _data->gen.b_cdtext_error = false; - - if (NULL == psz_orig_source) { - psz_source = cdio_get_default_device_solaris(); - if (NULL == psz_source) return NULL; - _set_arg_solaris(_data, "source", psz_source); - free(psz_source); - } else { - if (cdio_is_device_generic(psz_orig_source)) - _set_arg_solaris(_data, "source", psz_orig_source); - else { - /* The below would be okay if all device drivers worked this way. */ -#if 0 - cdio_info ("source %s is not a device", psz_orig_source); -#endif - return NULL; - } - } - - ret = cdio_new ( (void *) _data, &_funcs ); - if (ret == NULL) return NULL; - - if (init_solaris(_data)) - return ret; - else { - cdio_generic_free (_data); - return NULL; - } - -#else - return NULL; -#endif /* HAVE_SOLARIS_CDROM */ - -} - -bool -cdio_have_solaris (void) -{ -#ifdef HAVE_SOLARIS_CDROM - return true; -#else - return false; -#endif /* HAVE_SOLARIS_CDROM */ -} diff --git a/src/input/vcd/libcdio/cd_types.c b/src/input/vcd/libcdio/cd_types.c deleted file mode 100644 index b983f9899..000000000 --- a/src/input/vcd/libcdio/cd_types.c +++ /dev/null @@ -1,358 +0,0 @@ -/* - $Id: cd_types.c,v 1.4 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ -/* - This tries to determine what kind of CD-image or filesystems on a - track we've got. -*/ -#include "config.h" - -#ifdef HAVE_STDIO_H -#include <stdio.h> -#endif - -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif - -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif - -#ifdef HAVE_STRING_H -#include <string.h> -#endif - -#include <cdio/cdio.h> -#include <cdio/iso9660.h> -#include <cdio/logging.h> -#include <cdio/util.h> -#include <cdio/cd_types.h> - -/* -Subject: -65- How can I read an IRIX (EFS) CD-ROM on a machine which - doesn't use EFS? -Date: 18 Jun 1995 00:00:01 EST - - You want 'efslook', at - ftp://viz.tamu.edu/pub/sgi/software/efslook.tar.gz. - -and -! Robert E. Seastrom <rs@access4.digex.net>'s software (with source -! code) for using an SGI CD-ROM on a Macintosh is at -! ftp://bifrost.seastrom.com/pub/mac/CDROM-Jumpstart.sit151.hqx. - -*/ - -static char buffer[6][CDIO_CD_FRAMESIZE_RAW]; /* for CD-Data */ - -/* Some interesting sector numbers stored in the above buffer. */ -#define ISO_SUPERBLOCK_SECTOR 16 /* buffer[0] */ -#define UFS_SUPERBLOCK_SECTOR 4 /* buffer[2] */ -#define BOOT_SECTOR 17 /* buffer[3] */ -#define VCD_INFO_SECTOR 150 /* buffer[4] */ -#define XISO_SECTOR 32 /* buffer[4] */ -#define UDFX_SECTOR 32 /* buffer[4] */ -#define UDF_ANCHOR_SECTOR 256 /* buffer[5] */ - - -typedef struct signature -{ - unsigned int buf_num; - unsigned int offset; - const char *sig_str; - const char *description; -} signature_t; - -static signature_t sigs[] = - { -/*buffer[x] off look for description */ - {0, 0, "MICROSOFT*XBOX*MEDIA", "XBOX CD"}, - {0, 1, "BEA01", "UDF"}, - {0, 1, ISO_STANDARD_ID, "ISO 9660"}, - {0, 1, "CD-I", "CD-I"}, - {0, 8, "CDTV", "CDTV"}, - {0, 8, "CD-RTOS", "CD-RTOS"}, - {0, 9, "CDROM", "HIGH SIERRA"}, - {0, 16, "CD-BRIDGE", "BRIDGE"}, - {0, ISO_XA_MARKER_OFFSET, ISO_XA_MARKER_STRING, "XA"}, - {1, 64, "PPPPHHHHOOOOTTTTOOOO____CCCCDDDD", "PHOTO CD"}, - {1, 0x438, "\x53\xef", "EXT2 FS"}, - {2, 1372, "\x54\x19\x01\x0", "UFS"}, - {3, 7, "EL TORITO", "BOOTABLE"}, - {4, 0, "VIDEO_CD", "VIDEO CD"}, - {4, 0, "SUPERVCD", "SVCD or Chaoji VCD"}, - { 0 } - }; - - -/* The below index into the above sigs array. Make sure things match. */ -#define INDEX_XISO 0 /* Microsoft X-BOX filesystem */ -#define INDEX_UDF 1 -#define INDEX_ISOFS 2 -#define INDEX_CD_I 3 -#define INDEX_CDTV 4 -#define INDEX_CD_RTOS 5 -#define INDEX_HS 6 -#define INDEX_BRIDGE 7 -#define INDEX_XA 8 -#define INDEX_PHOTO_CD 9 -#define INDEX_EXT2 10 -#define INDEX_UFS 11 -#define INDEX_BOOTABLE 12 -#define INDEX_VIDEO_CD 13 /* Video CD */ -#define INDEX_SVCD 14 /* CVD *or* SVCD */ - - -/* - Read a particular block into the global array to be used for further - analysis later. -*/ -static int -_cdio_read_block(const CdIo *cdio, int superblock, uint32_t offset, - uint8_t bufnum, track_t i_track) -{ - unsigned int track_sec_count = cdio_get_track_sec_count(cdio, i_track); - memset(buffer[bufnum], 0, CDIO_CD_FRAMESIZE); - - if ( track_sec_count < superblock) { - cdio_debug("reading block %u skipped track %d has only %u sectors\n", - superblock, i_track, track_sec_count); - return -1; - } - - cdio_debug("about to read sector %lu\n", - (long unsigned int) offset+superblock); - - if (cdio_get_track_green(cdio, i_track)) { - if (0 > cdio_read_mode2_sector(cdio, buffer[bufnum], - offset+superblock, false)) - return -1; - } else { - if (0 > cdio_read_mode1_sector(cdio, buffer[bufnum], - offset+superblock, false)) - return -1; - } - - return 0; -} - -/* - Return true if the previously read-in buffer contains a "signature" that - matches index "num". - */ -static bool -_cdio_is_it(int num) -{ - signature_t *sigp=&sigs[num]; - int len=strlen(sigp->sig_str); - - /* TODO: check that num < largest sig. */ - return 0 == memcmp(&buffer[sigp->buf_num][sigp->offset], sigp->sig_str, len); -} - -static int -_cdio_is_hfs(void) -{ - return (0 == memcmp(&buffer[1][512],"PM",2)) || - (0 == memcmp(&buffer[1][512],"TS",2)) || - (0 == memcmp(&buffer[1][1024], "BD",2)); -} - -static int -_cdio_is_3do(void) -{ - return (0 == memcmp(&buffer[1][0],"\x01\x5a\x5a\x5a\x5a\x5a\x01", 7)) && - (0 == memcmp(&buffer[1][40], "CD-ROM", 6)); -} - -static int -_cdio_is_joliet(void) -{ - return 2 == buffer[3][0] && buffer[3][88] == 0x25 && buffer[3][89] == 0x2f; -} - -static int -_cdio_is_UDF(void) -{ - return 2 == ((uint16_t)buffer[5][0] | ((uint16_t)buffer[5][1] << 8)); -} - -/* ISO 9660 volume space in M2F1_SECTOR_SIZE byte units */ -static int -_cdio_get_iso9660_fs_sec_count(void) -{ - return ((buffer[0][80] & 0xff) | - ((buffer[0][81] & 0xff) << 8) | - ((buffer[0][82] & 0xff) << 16) | - ((buffer[0][83] & 0xff) << 24)); -} - -static int -_cdio_get_joliet_level( void ) -{ - switch (buffer[3][90]) { - case 0x40: return 1; - case 0x43: return 2; - case 0x45: return 3; - } - return 0; -} - -/* - Try to determine what kind of CD-image and/or filesystem we - have at track i_track. Return information about the CD image - is returned in cdio_analysis and the return value. -*/ -cdio_fs_anal_t -cdio_guess_cd_type(const CdIo *cdio, int start_session, track_t i_track, - /*out*/ cdio_iso_analysis_t *iso_analysis) -{ - int ret = CDIO_FS_UNKNOWN; - bool sector0_read_ok; - - if (TRACK_FORMAT_AUDIO == cdio_get_track_format(cdio, i_track)) - return CDIO_FS_AUDIO; - - if ( _cdio_read_block(cdio, ISO_PVD_SECTOR, start_session, - 0, i_track) < 0 ) - return CDIO_FS_UNKNOWN; - - if ( _cdio_is_it(INDEX_XISO) ) - return CDIO_FS_ANAL_XISO; - - if (_cdio_read_block(cdio, ISO_SUPERBLOCK_SECTOR, start_session, 0, - i_track) < 0) - return ret; - - if ( _cdio_is_it(INDEX_UDF) ) { - /* Detect UDF version - Test if we have a valid version of UDF the xbox can read natively */ - if (_cdio_read_block(cdio, 35, start_session, 5, i_track) < 0) - return CDIO_FS_UNKNOWN; - - iso_analysis->UDFVerMinor=(unsigned int)buffer[5][240]; - iso_analysis->UDFVerMajor=(unsigned int)buffer[5][241]; - /* Read disc label */ - if (_cdio_read_block(cdio, 32, start_session, 5, i_track) < 0) - return CDIO_FS_UDF; - - strncpy(iso_analysis->iso_label, buffer[5]+25, 33); - iso_analysis->iso_label[32] = '\0'; - return CDIO_FS_UDF; - } - - /* We have something that smells of a filesystem. */ - if (_cdio_is_it(INDEX_CD_I) && _cdio_is_it(INDEX_CD_RTOS) - && !_cdio_is_it(INDEX_BRIDGE) && !_cdio_is_it(INDEX_XA)) { - return CDIO_FS_INTERACTIVE; - } else { - /* read sector 0 ONLY, when NO greenbook CD-I !!!! */ - - sector0_read_ok = - _cdio_read_block(cdio, 0, start_session, 1, i_track) == 0; - - if (_cdio_is_it(INDEX_HS)) - ret |= CDIO_FS_HIGH_SIERRA; - else if (_cdio_is_it(INDEX_ISOFS)) { - if (_cdio_is_it(INDEX_CD_RTOS) && _cdio_is_it(INDEX_BRIDGE)) - ret = CDIO_FS_ISO_9660_INTERACTIVE; - else if (_cdio_is_hfs()) - ret = CDIO_FS_ISO_HFS; - else - ret = CDIO_FS_ISO_9660; - iso_analysis->isofs_size = _cdio_get_iso9660_fs_sec_count(); - strncpy(iso_analysis->iso_label, buffer[0]+40,33); - iso_analysis->iso_label[32] = '\0'; - - if ( _cdio_read_block(cdio, UDF_ANCHOR_SECTOR, start_session, 5, - i_track) < 0) - return ret; - - /* Maybe there is an UDF anchor in IOS session - so its ISO/UDF session and we prefere UDF */ - if ( _cdio_is_UDF() ) { - /* Detect UDF version. - Test if we have a valid version of UDF the xbox can read natively */ - if ( _cdio_read_block(cdio, 35, start_session, 5, i_track) < 0) - return ret; - - iso_analysis->UDFVerMinor=(unsigned int)buffer[5][240]; - iso_analysis->UDFVerMajor=(unsigned int)buffer[5][241]; -#if 0 - /* We are using ISO/UDF cd's as iso, - no need to get UDF disc label */ - if (_cdio_read_block(cdio, 32, start_session, 5, i_track) < 0) - return ret; - stnrcpy(iso_analysis->iso_label, buffer[5]+25, 33); - iso_analysis->iso_label[32] = '\0'; -#endif - ret=CDIO_FS_ISO_UDF; - } - -#if 0 - if (_cdio_is_rockridge()) - ret |= CDIO_FS_ANAL_ROCKRIDGE; -#endif - - if (_cdio_read_block(cdio, BOOT_SECTOR, start_session, 3, i_track) < 0) - return ret; - - if (_cdio_is_joliet()) { - iso_analysis->joliet_level = _cdio_get_joliet_level(); - ret |= CDIO_FS_ANAL_JOLIET; - } - if (_cdio_is_it(INDEX_BOOTABLE)) - ret |= CDIO_FS_ANAL_BOOTABLE; - - if ( _cdio_is_it(INDEX_XA) && _cdio_is_it(INDEX_ISOFS) - && !(sector0_read_ok && _cdio_is_it(INDEX_PHOTO_CD)) ) { - - if ( _cdio_read_block(cdio, VCD_INFO_SECTOR, start_session, 4, - i_track) < 0 ) - return ret; - - if (_cdio_is_it(INDEX_BRIDGE) && _cdio_is_it(INDEX_CD_RTOS)) { - if (_cdio_is_it(INDEX_VIDEO_CD)) ret |= CDIO_FS_ANAL_VIDEOCD; - else if (_cdio_is_it(INDEX_SVCD)) ret |= CDIO_FS_ANAL_SVCD; - } else if (_cdio_is_it(INDEX_SVCD)) ret |= CDIO_FS_ANAL_CVD; - - } - } - else if (_cdio_is_hfs()) ret |= CDIO_FS_HFS; - else if (sector0_read_ok && _cdio_is_it(INDEX_EXT2)) ret |= CDIO_FS_EXT2; - else if (_cdio_is_3do()) ret |= CDIO_FS_3DO; - else { - if ( _cdio_read_block(cdio, UFS_SUPERBLOCK_SECTOR, start_session, 2, - i_track) < 0 ) - return ret; - - if (sector0_read_ok && _cdio_is_it(INDEX_UFS)) - ret |= CDIO_FS_UFS; - else - ret |= CDIO_FS_UNKNOWN; - } - } - - /* other checks */ - if (_cdio_is_it(INDEX_XA)) ret |= CDIO_FS_ANAL_XA; - if (_cdio_is_it(INDEX_PHOTO_CD)) ret |= CDIO_FS_ANAL_PHOTO_CD; - if (_cdio_is_it(INDEX_CDTV)) ret |= CDIO_FS_ANAL_CDTV; - return ret; -} diff --git a/src/input/vcd/libcdio/cdio.c b/src/input/vcd/libcdio/cdio.c deleted file mode 100644 index fc18add91..000000000 --- a/src/input/vcd/libcdio/cdio.c +++ /dev/null @@ -1,1125 +0,0 @@ -/* - $Id: cdio.c,v 1.3 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <sys/types.h> -#include <sys/stat.h> -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -#include <errno.h> -#include <string.h> - -#include "cdio_assert.h" -#include <cdio/cdio.h> -#include <cdio/cd_types.h> -#include <cdio/util.h> -#include <cdio/logging.h> -#include "cdio_private.h" - -static const char _rcsid[] = "$Id: cdio.c,v 1.3 2005/01/01 02:43:57 rockyb Exp $"; - - -const char *track_format2str[6] = - { - "audio", "CD-i", "XA", "data", "PSX", "error" - }; - -/* Must match discmode enumeration */ -const char *discmode2str[] = { - "CD-DA", - "CD-DATA Form 1", - "CD DATA Form 2", - "CD-ROM Mixed", - "DVD-ROM", - "DVD-RAM", - "DVD-R", - "DVD-RW", - "DVD+R", - "DVD+RW", - "Unknown/unclassified DVD", - "No information", - "Error in getting information" -}; - - -/* The below array gives of the drivers that are currently available for - on a particular host. */ - -CdIo_driver_t CdIo_driver[CDIO_MAX_DRIVER] = { {0} }; - -/* The last valid entry of Cdio_driver. - -1 or (CDIO_DRIVER_UNINIT) means uninitialzed. - -2 means some sort of error. -*/ - -#define CDIO_DRIVER_UNINIT -1 -int CdIo_last_driver = CDIO_DRIVER_UNINIT; - -#ifdef HAVE_BSDI_CDROM -const driver_id_t cdio_os_driver = DRIVER_BSDI; -#elif HAVE_FREEBSD_CDROM -const driver_id_t cdio_os_driver = DRIVER_FREEBSD; -#elif HAVE_LINUX_CDROM -const driver_id_t cdio_os_driver = DRIVER_LINUX; -#elif HAVE_DARWIN_CDROM -const driver_id_t cdio_os_driver = DRIVER_OSX; -#elif HAVE_DARWIN_SOLARIS -const driver_id_t cdio_os_driver = DRIVER_SOLARIS; -#elif HAVE_DARWIN_WIN32 -const driver_id_t cdio_os_driver = DRIVER_WIN32; -#else -const driver_id_t cdio_os_driver = DRIVER_UNKNOWN; -#endif - -static bool -cdio_have_false(void) -{ - return false; -} - -/* The below array gives all drivers that can possibly appear. - on a particular host. */ - -CdIo_driver_t CdIo_all_drivers[CDIO_MAX_DRIVER+1] = { - {DRIVER_UNKNOWN, - 0, - "Unknown", - "No driver", - &cdio_have_false, - NULL, - NULL, - NULL, - NULL, - NULL - }, - - {DRIVER_BSDI, - CDIO_SRC_IS_DEVICE_MASK|CDIO_SRC_IS_NATIVE_MASK|CDIO_SRC_IS_SCSI_MASK, - "BSDI", - "BSDI ATAPI and SCSI driver", - &cdio_have_bsdi, - &cdio_open_bsdi, - &cdio_open_am_bsdi, - &cdio_get_default_device_bsdi, - &cdio_is_device_generic, - &cdio_get_devices_bsdi - }, - - {DRIVER_FREEBSD, - CDIO_SRC_IS_DEVICE_MASK|CDIO_SRC_IS_NATIVE_MASK|CDIO_SRC_IS_SCSI_MASK, - "FreeBSD", - "FreeBSD driver", - &cdio_have_freebsd, - &cdio_open_freebsd, - &cdio_open_am_freebsd, - &cdio_get_default_device_freebsd, - &cdio_is_device_generic, - NULL - }, - - {DRIVER_LINUX, - CDIO_SRC_IS_DEVICE_MASK|CDIO_SRC_IS_NATIVE_MASK, - "GNU/Linux", - "GNU/Linux ioctl and MMC driver", - &cdio_have_linux, - &cdio_open_linux, - &cdio_open_am_linux, - &cdio_get_default_device_linux, - &cdio_is_device_generic, - &cdio_get_devices_linux - }, - - {DRIVER_SOLARIS, - CDIO_SRC_IS_DEVICE_MASK|CDIO_SRC_IS_NATIVE_MASK|CDIO_SRC_IS_SCSI_MASK, - "Solaris", - "Solaris ATAPI and SCSI driver", - &cdio_have_solaris, - &cdio_open_solaris, - &cdio_open_am_solaris, - &cdio_get_default_device_solaris, - &cdio_is_device_generic, - &cdio_get_devices_solaris - }, - - {DRIVER_OSX, - CDIO_SRC_IS_DEVICE_MASK|CDIO_SRC_IS_NATIVE_MASK|CDIO_SRC_IS_SCSI_MASK, - "OS X", - "Apple Darwin OS X driver", - &cdio_have_osx, - &cdio_open_osx, - &cdio_open_am_osx, - &cdio_get_default_device_osx, - &cdio_is_device_generic, - &cdio_get_devices_osx - }, - - {DRIVER_WIN32, - CDIO_SRC_IS_DEVICE_MASK|CDIO_SRC_IS_NATIVE_MASK|CDIO_SRC_IS_SCSI_MASK, - "WIN32", - "MS Windows ASPI and ioctl driver", - &cdio_have_win32, - &cdio_open_win32, - &cdio_open_am_win32, - &cdio_get_default_device_win32, - &cdio_is_device_win32, - &cdio_get_devices_win32 - }, - - {DRIVER_CDRDAO, - CDIO_SRC_IS_DISK_IMAGE_MASK, - "CDRDAO", - "cdrdao (TOC) disk image driver", - &cdio_have_cdrdao, - &cdio_open_cdrdao, - &cdio_open_am_cdrdao, - &cdio_get_default_device_cdrdao, - NULL, - &cdio_get_devices_cdrdao - }, - - {DRIVER_BINCUE, - CDIO_SRC_IS_DISK_IMAGE_MASK, - "BIN/CUE", - "bin/cuesheet disk image driver", - &cdio_have_bincue, - &cdio_open_bincue, - &cdio_open_am_bincue, - &cdio_get_default_device_bincue, - NULL, - &cdio_get_devices_bincue - }, - - {DRIVER_NRG, - CDIO_SRC_IS_DISK_IMAGE_MASK, - "NRG", - "Nero NRG disk image driver", - &cdio_have_nrg, - &cdio_open_nrg, - &cdio_open_am_nrg, - &cdio_get_default_device_nrg, - NULL, - &cdio_get_devices_nrg - } - -}; - -static CdIo * -scan_for_driver(driver_id_t start, driver_id_t end, - const char *psz_source, const char *access_mode) -{ - driver_id_t driver_id; - - for (driver_id=start; driver_id<=end; driver_id++) { - if ((*CdIo_all_drivers[driver_id].have_driver)()) { - CdIo *ret= - (*CdIo_all_drivers[driver_id].driver_open_am)(psz_source, access_mode); - if (ret != NULL) { - ret->driver_id = driver_id; - return ret; - } - } - } - return NULL; -} - -const char * -cdio_driver_describe(driver_id_t driver_id) -{ - return CdIo_all_drivers[driver_id].describe; -} - -/*! - Eject media in CD drive if there is a routine to do so. - Return 0 if success and 1 for failure, and 2 if no routine. - If the CD is ejected *obj is freed and obj set to NULL. - */ -int -cdio_eject_media (CdIo **obj) -{ - - if ((obj == NULL) || (*obj == NULL)) return 1; - - if ((*obj)->op.eject_media) { - int ret = (*obj)->op.eject_media ((*obj)->env); - if (0 == ret) { - cdio_destroy(*obj); - *obj = NULL; - } - return ret; - } else { - cdio_destroy(*obj); - *obj = NULL; - return 2; - } -} - -/*! - Free device list returned by cdio_get_devices or - cdio_get_devices_with_cap. -*/ -void cdio_free_device_list (char * device_list[]) -{ - if (NULL == device_list) return; - for ( ; *device_list != NULL ; device_list++ ) - free(*device_list); -} - - -/*! - Return the value associatied with key. NULL is returned if obj is NULL - or "key" does not exist. - */ -const char * -cdio_get_arg (const CdIo *obj, const char key[]) -{ - if (obj == NULL) return NULL; - - if (obj->op.get_arg) { - return obj->op.get_arg (obj->env, key); - } else { - return NULL; - } -} - -/*! - Get cdtext information for a CdIo object . - - @param obj the CD object that may contain CD-TEXT information. - @return the CD-TEXT object or NULL if obj is NULL - or CD-TEXT information does not exist. -*/ -const cdtext_t * -cdio_get_cdtext (CdIo *obj, track_t i_track) -{ - if (obj == NULL) return NULL; - - if (obj->op.get_cdtext) { - return obj->op.get_cdtext (obj->env, i_track); - } else { - return NULL; - } -} - -/*! - Return a string containing the default CD device if none is specified. - if CdIo is NULL (we haven't initialized a specific device driver), - then find a suitable one and return the default device for that. - - NULL is returned if we couldn't get a default device. - */ -char * -cdio_get_default_device (const CdIo *obj) -{ - if (obj == NULL) { - driver_id_t driver_id; - /* Scan for driver */ - for (driver_id=DRIVER_UNKNOWN; driver_id<=CDIO_MAX_DRIVER; driver_id++) { - if ( (*CdIo_all_drivers[driver_id].have_driver)() && - *CdIo_all_drivers[driver_id].get_default_device ) { - return (*CdIo_all_drivers[driver_id].get_default_device)(); - } - } - return NULL; - } - - if (obj->op.get_default_device) { - return obj->op.get_default_device (); - } else { - return NULL; - } -} - -/*!Return an array of device names. If you want a specific - devices, dor a driver give that device, if you want hardware - devices, give DRIVER_DEVICE and if you want all possible devices, - image drivers and hardware drivers give DRIVER_UNKNOWN. - - NULL is returned if we couldn't return a list of devices. -*/ -char ** -cdio_get_devices (driver_id_t driver_id) -{ - /* Probably could get away with &driver_id below. */ - driver_id_t driver_id_temp = driver_id; - return cdio_get_devices_ret (&driver_id_temp); -} - -char ** -cdio_get_devices_ret (/*in/out*/ driver_id_t *p_driver_id) -{ - CdIo *p_cdio; - - switch (*p_driver_id) { - /* FIXME: spit out unknown to give image drivers as well. */ - case DRIVER_UNKNOWN: - case DRIVER_DEVICE: - p_cdio = scan_for_driver(DRIVER_UNKNOWN, CDIO_MAX_DRIVER, NULL, NULL); - *p_driver_id = cdio_get_driver_id(p_cdio); - break; - default: - return (*CdIo_all_drivers[*p_driver_id].get_devices)(); - } - - if (p_cdio == NULL) return NULL; - if (p_cdio->op.get_devices) { - char **devices = p_cdio->op.get_devices (); - cdio_destroy(p_cdio); - return devices; - } else { - return NULL; - } -} - -/*! - Return an array of device names in search_devices that have at - least the capabilities listed by cap. If search_devices is NULL, - then we'll search all possible CD drives. - - If "any" is set false then every capability listed in the extended - portion of capabilities (i.e. not the basic filesystem) must be - satisified. If "any" is set true, then if any of the capabilities - matches, we call that a success. - - To find a CD-drive of any type, use the mask CDIO_FS_MATCH_ALL. - - NULL is returned if we couldn't get a default device. - It is also possible to return a non NULL but after dereferencing the - the value is NULL. This also means nothing was found. -*/ -char ** -cdio_get_devices_with_cap (/*out*/ char* search_devices[], - cdio_fs_anal_t capabilities, bool any) -{ - driver_id_t p_driver_id; - return cdio_get_devices_with_cap_ret (search_devices, capabilities, any, - &p_driver_id); -} - -char ** -cdio_get_devices_with_cap_ret (/*out*/ char* search_devices[], - cdio_fs_anal_t capabilities, bool any, - /*out*/ driver_id_t *p_driver_id) -{ - char **drives=search_devices; - char **drives_ret=NULL; - unsigned int i_drives=0; - - *p_driver_id = DRIVER_DEVICE; - - if (NULL == drives) drives=cdio_get_devices_ret(p_driver_id); - if (NULL == drives) return NULL; - - if (capabilities == CDIO_FS_MATCH_ALL) { - /* Duplicate drives into drives_ret. */ - char **d = drives; - - for( ; *d != NULL; d++ ) { - cdio_add_device_list(&drives_ret, *d, &i_drives); - } - } else { - cdio_fs_anal_t got_fs=0; - cdio_fs_anal_t need_fs = CDIO_FSTYPE(capabilities); - cdio_fs_anal_t need_fs_ext; - char **d = drives; - need_fs_ext = capabilities & ~CDIO_FS_MASK; - - for( ; *d != NULL; d++ ) { - CdIo *cdio = cdio_open(*d, *p_driver_id); - - if (NULL != cdio) { - track_t first_track = cdio_get_first_track_num(cdio); - cdio_iso_analysis_t cdio_iso_analysis; - got_fs = cdio_guess_cd_type(cdio, 0, first_track, - &cdio_iso_analysis); - /* Match on fs and add */ - if ( (CDIO_FS_UNKNOWN == need_fs || CDIO_FSTYPE(got_fs) == need_fs) ) - { - bool doit = any - ? (got_fs & need_fs_ext) != 0 - : (got_fs | ~need_fs_ext) == -1; - if (doit) - cdio_add_device_list(&drives_ret, *d, &i_drives); - } - - cdio_destroy(cdio); - } - } - } - cdio_add_device_list(&drives_ret, NULL, &i_drives); - cdio_free_device_list(drives); - free(drives); - return drives_ret; -} - -/*! - Get medium associated with cd_obj. -*/ -discmode_t -cdio_get_discmode (CdIo *cd_obj) -{ - if (cd_obj == NULL) return CDIO_DISC_MODE_ERROR; - - if (cd_obj->op.get_discmode) { - return cd_obj->op.get_discmode (cd_obj->env); - } else { - return CDIO_DISC_MODE_NO_INFO; - } -} - -/*! - Return the the kind of drive capabilities of device. - - Note: string is malloc'd so caller should free() then returned - string when done with it. - - */ -void -cdio_get_drive_cap (const CdIo *p_cdio, - cdio_drive_read_cap_t *p_read_cap, - cdio_drive_write_cap_t *p_write_cap, - cdio_drive_misc_cap_t *p_misc_cap) -{ - /* This seems like a safe bet. */ - *p_read_cap = CDIO_DRIVE_CAP_UNKNOWN; - *p_write_cap = CDIO_DRIVE_CAP_UNKNOWN; - *p_misc_cap = CDIO_DRIVE_CAP_UNKNOWN; - - if (p_cdio && p_cdio->op.get_drive_cap) { - p_cdio->op.get_drive_cap(p_cdio->env, p_read_cap, p_write_cap, p_misc_cap); - } -} - -/*! - Return the the kind of drive capabilities of device. - - Note: string is malloc'd so caller should free() then returned - string when done with it. - - */ -void -cdio_get_drive_cap_dev (const char *device, - cdio_drive_read_cap_t *p_read_cap, - cdio_drive_write_cap_t *p_write_cap, - cdio_drive_misc_cap_t *p_misc_cap) -{ - /* This seems like a safe bet. */ - CdIo *cdio=scan_for_driver(CDIO_MIN_DRIVER, CDIO_MAX_DRIVER, - device, NULL); - if (cdio) { - cdio_get_drive_cap(cdio, p_read_cap, p_write_cap, p_misc_cap); - cdio_destroy(cdio); - } else { - *p_read_cap = CDIO_DRIVE_CAP_UNKNOWN; - *p_write_cap = CDIO_DRIVE_CAP_UNKNOWN; - *p_misc_cap = CDIO_DRIVE_CAP_UNKNOWN; - } -} - - -/*! - Return a string containing the name of the driver in use. - if CdIo is NULL (we haven't initialized a specific device driver), - then return NULL. -*/ -const char * -cdio_get_driver_name (const CdIo *cdio) -{ - if (NULL==cdio) return NULL; - return CdIo_all_drivers[cdio->driver_id].name; -} - - /*! - Return the driver id. - if CdIo is NULL (we haven't initialized a specific device driver), - then return DRIVER_UNKNOWN. - */ -driver_id_t -cdio_get_driver_id (const CdIo *cdio) -{ - if (NULL==cdio) return DRIVER_UNKNOWN; - return cdio->driver_id; -} - - -/*! - Return the number of the first track. - CDIO_INVALID_TRACK is returned on error. -*/ -track_t -cdio_get_first_track_num (const CdIo *p_cdio) -{ - if (NULL == p_cdio) return CDIO_INVALID_TRACK; - - if (p_cdio->op.get_first_track_num) { - return p_cdio->op.get_first_track_num (p_cdio->env); - } else { - return CDIO_INVALID_TRACK; - } -} - -/*! - Return a string containing the name of the driver in use. - if CdIo is NULL (we haven't initialized a specific device driver), - then return NULL. -*/ -bool -cdio_get_hwinfo (const CdIo *p_cdio, cdio_hwinfo_t *hw_info) -{ - if (!p_cdio) return false; - if (p_cdio->op.get_hwinfo) { - return p_cdio->op.get_hwinfo (p_cdio, hw_info); - } else { - /* Perhaps driver forgot to initialize. We are no worse off Using - scsi_mmc than returning false here. */ - return scsi_mmc_get_hwinfo(p_cdio, hw_info); - } -} - -/*! - Return a string containing the name of the driver in use. - if CdIo is NULL (we haven't initialized a specific device driver), - then return NULL. -*/ -char * -cdio_get_mcn (const CdIo *p_cdio) -{ - if (p_cdio->op.get_mcn) { - return p_cdio->op.get_mcn (p_cdio->env); - } else { - return NULL; - } -} - -/*! - Return the number of tracks in the current medium. - CDIO_INVALID_TRACK is returned on error. -*/ -track_t -cdio_get_num_tracks (const CdIo *p_cdio) -{ - if (p_cdio == NULL) return CDIO_INVALID_TRACK; - - if (p_cdio->op.get_num_tracks) { - return p_cdio->op.get_num_tracks (p_cdio->env); - } else { - return CDIO_INVALID_TRACK; - } -} - -/*! - Get format of track. -*/ -track_format_t -cdio_get_track_format(const CdIo *p_cdio, track_t i_track) -{ - cdio_assert (p_cdio != NULL); - - if (p_cdio->op.get_track_format) { - return p_cdio->op.get_track_format (p_cdio->env, i_track); - } else { - return TRACK_FORMAT_ERROR; - } -} - -/*! - Return true if we have XA data (green, mode2 form1) or - XA data (green, mode2 form2). That is track begins: - sync - header - subheader - 12 4 - 8 - - FIXME: there's gotta be a better design for this and get_track_format? -*/ -bool -cdio_get_track_green(const CdIo *cdio, track_t track_num) -{ - cdio_assert (cdio != NULL); - - if (cdio->op.get_track_green) { - return cdio->op.get_track_green (cdio->env, track_num); - } else { - return false; - } -} - -/*! - Return the starting LBA for track number - track_num in cdio. Tracks numbers start at 1. - The "leadout" track is specified either by - using track_num LEADOUT_TRACK or the total tracks+1. - CDIO_INVALID_LBA is returned on error. -*/ -lba_t -cdio_get_track_lba(const CdIo *cdio, track_t track_num) -{ - if (cdio == NULL) return CDIO_INVALID_LBA; - - if (cdio->op.get_track_lba) { - return cdio->op.get_track_lba (cdio->env, track_num); - } else { - msf_t msf; - if (cdio->op.get_track_msf) - if (cdio_get_track_msf(cdio, track_num, &msf)) - return cdio_msf_to_lba(&msf); - return CDIO_INVALID_LBA; - } -} - -/*! - Return the starting LSN for track number - track_num in cdio. Tracks numbers start at 1. - The "leadout" track is specified either by - using track_num LEADOUT_TRACK or the total tracks+1. - CDIO_INVALID_LBA is returned on error. -*/ -lsn_t -cdio_get_track_lsn(const CdIo *cdio, track_t track_num) -{ - if (cdio == NULL) return CDIO_INVALID_LBA; - - if (cdio->op.get_track_lba) { - return cdio_lba_to_lsn(cdio->op.get_track_lba (cdio->env, track_num)); - } else { - msf_t msf; - if (cdio_get_track_msf(cdio, track_num, &msf)) - return cdio_msf_to_lsn(&msf); - return CDIO_INVALID_LSN; - } -} - -/*! - Return the starting MSF (minutes/secs/frames) for track number - track_num in cdio. Track numbers start at 1. - The "leadout" track is specified either by - using track_num LEADOUT_TRACK or the total tracks+1. - False is returned if there is no track entry. -*/ -bool -cdio_get_track_msf(const CdIo *cdio, track_t track_num, /*out*/ msf_t *msf) -{ - cdio_assert (cdio != NULL); - - if (cdio->op.get_track_msf) { - return cdio->op.get_track_msf (cdio->env, track_num, msf); - } else if (cdio->op.get_track_lba) { - lba_t lba = cdio->op.get_track_lba (cdio->env, track_num); - if (lba == CDIO_INVALID_LBA) return false; - cdio_lba_to_msf(lba, msf); - return true; - } else { - return false; - } -} - -/*! - Return the number of sectors between this track an the next. This - includes any pregap sectors before the start of the next track. - Tracks start at 1. - 0 is returned if there is an error. -*/ -unsigned int -cdio_get_track_sec_count(const CdIo *cdio, track_t track_num) -{ - track_t num_tracks = cdio_get_num_tracks(cdio); - - if (track_num >=1 && track_num <= num_tracks) - return ( cdio_get_track_lba(cdio, track_num+1) - - cdio_get_track_lba(cdio, track_num) ); - return 0; -} - -bool -cdio_have_driver(driver_id_t driver_id) -{ - return (*CdIo_all_drivers[driver_id].have_driver)(); -} - -/*! - Return the Joliet level recognized for p_cdio. -*/ -uint8_t -cdio_get_joliet_level(const CdIo *p_cdio) -{ - if (!p_cdio) return 0; - { - const generic_img_private_t *p_env - = (generic_img_private_t *) (p_cdio->env); - return p_env->i_joliet_level; - } -} - -bool -cdio_is_device(const char *psz_source, driver_id_t driver_id) -{ - if (CdIo_all_drivers[driver_id].is_device == NULL) return false; - return (*CdIo_all_drivers[driver_id].is_device)(psz_source); -} - - -/*! - Initialize CD Reading and control routines. Should be called first. - May be implicitly called by other routines if not called first. -*/ -bool -cdio_init(void) -{ - - CdIo_driver_t *all_dp; - CdIo_driver_t *dp = CdIo_driver; - driver_id_t driver_id; - - if (CdIo_last_driver != CDIO_DRIVER_UNINIT) { - cdio_warn ("Init routine called more than once."); - return false; - } - - for (driver_id=DRIVER_UNKNOWN; driver_id<=CDIO_MAX_DRIVER; driver_id++) { - all_dp = &CdIo_all_drivers[driver_id]; - if ((*CdIo_all_drivers[driver_id].have_driver)()) { - *dp++ = *all_dp; - CdIo_last_driver++; - } - } - - return true; -} - -CdIo * -cdio_new (generic_img_private_t *p_env, cdio_funcs *p_funcs) -{ - CdIo *p_new_cdio = _cdio_malloc (sizeof (CdIo)); - - if (NULL == p_new_cdio) return NULL; - - p_new_cdio->env = p_env; /* This is the private "environment" that - driver-dependent routines use. */ - p_new_cdio->op = *p_funcs; - p_env->cdio = p_new_cdio; /* A way for the driver-dependent routines - to access the higher-level general cdio - object. */ - return p_new_cdio; -} - -/*! - Free any resources associated with cdio. -*/ -void -cdio_destroy (CdIo *cdio) -{ - CdIo_last_driver = CDIO_DRIVER_UNINIT; - if (cdio == NULL) return; - - if (cdio->op.free != NULL) - cdio->op.free (cdio->env); - free (cdio); -} - -/*! - lseek - reposition read/write file offset - Returns (off_t) -1 on error. - Similar to (if not the same as) libc's lseek() -*/ -off_t -cdio_lseek (const CdIo *cdio, off_t offset, int whence) -{ - if (cdio == NULL) return -1; - - if (cdio->op.lseek) - return cdio->op.lseek (cdio->env, offset, whence); - return -1; -} - -/*! - Reads into buf the next size bytes. - Returns -1 on error. - Similar to (if not the same as) libc's read() -*/ -ssize_t -cdio_read (const CdIo *p_cdio, void *buf, size_t size) -{ - if (p_cdio == NULL) return -1; - - if (p_cdio->op.read) - return p_cdio->op.read (p_cdio->env, buf, size); - return -1; -} - -/*! - Reads an audio sector from cd device into data starting - from lsn. Returns 0 if no error. -*/ -int -cdio_read_audio_sector (const CdIo *p_cdio, void *buf, lsn_t lsn) -{ - - if (NULL == p_cdio || NULL == buf || CDIO_INVALID_LSN == lsn ) - return 0; - - if (p_cdio->op.read_audio_sectors != NULL) - return p_cdio->op.read_audio_sectors (p_cdio->env, buf, lsn, 1); - return -1; -} - -/*! - Reads audio sectors from cd device into data starting - from lsn. Returns 0 if no error. -*/ -int -cdio_read_audio_sectors (const CdIo *p_cdio, void *buf, lsn_t lsn, - unsigned int nblocks) -{ - if ( NULL == p_cdio || NULL == buf || CDIO_INVALID_LSN == lsn ) - return 0; - - if (p_cdio->op.read_audio_sectors != NULL) - return p_cdio->op.read_audio_sectors (p_cdio->env, buf, lsn, nblocks); - return -1; -} - -#ifndef SEEK_SET -#define SEEK_SET 0 -#endif - -/*! - Reads a single mode1 form1 or form2 sector from cd device - into data starting from lsn. Returns 0 if no error. - */ -int -cdio_read_mode1_sector (const CdIo *p_cdio, void *data, lsn_t lsn, - bool b_form2) -{ - uint32_t size = b_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE ; - - if (NULL == p_cdio || NULL == data || CDIO_INVALID_LSN == lsn ) - return 0; - - if (p_cdio->op.read_mode1_sector) { - return p_cdio->op.read_mode1_sector(p_cdio->env, data, lsn, b_form2); - } else if (p_cdio->op.lseek && p_cdio->op.read) { - char buf[CDIO_CD_FRAMESIZE] = { 0, }; - if (0 > cdio_lseek(p_cdio, CDIO_CD_FRAMESIZE*lsn, SEEK_SET)) - return -1; - if (0 > cdio_read(p_cdio, buf, CDIO_CD_FRAMESIZE)) - return -1; - memcpy (data, buf, size); - return 0; - } - - return 1; - -} - -int -cdio_read_mode1_sectors (const CdIo *cdio, void *buf, lsn_t lsn, - bool b_form2, unsigned int num_sectors) -{ - - if (NULL == cdio || NULL == buf || CDIO_INVALID_LSN == lsn ) - return 0; - - cdio_assert (cdio->op.read_mode1_sectors != NULL); - - return cdio->op.read_mode1_sectors (cdio->env, buf, lsn, b_form2, - num_sectors); -} - -/*! - Reads a single mode2 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ -int -cdio_read_mode2_sector (const CdIo *cdio, void *buf, lsn_t lsn, - bool b_form2) -{ - if (NULL == cdio || NULL == buf || CDIO_INVALID_LSN == lsn ) - return 0; - - cdio_assert (cdio->op.read_mode2_sector != NULL - || cdio->op.read_mode2_sectors != NULL); - - if (cdio->op.read_mode2_sector) - return cdio->op.read_mode2_sector (cdio->env, buf, lsn, b_form2); - - /* fallback */ - if (cdio->op.read_mode2_sectors != NULL) - return cdio_read_mode2_sectors (cdio, buf, lsn, b_form2, 1); - return 1; -} - -int -cdio_read_mode2_sectors (const CdIo *cdio, void *buf, lsn_t lsn, - bool b_form2, unsigned int num_sectors) -{ - - if (NULL == cdio || NULL == buf || CDIO_INVALID_LSN == lsn ) - return 0; - - cdio_assert (cdio->op.read_mode2_sectors != NULL); - - return cdio->op.read_mode2_sectors (cdio->env, buf, lsn, - b_form2, num_sectors); -} - -uint32_t -cdio_stat_size (const CdIo *cdio) -{ - cdio_assert (cdio != NULL); - - return cdio->op.stat_size (cdio->env); -} - -/*! - Set the arg "key" with "value" in the source device. -*/ -int -cdio_set_arg (CdIo *cdio, const char key[], const char value[]) -{ - cdio_assert (cdio != NULL); - cdio_assert (cdio->op.set_arg != NULL); - cdio_assert (key != NULL); - - return cdio->op.set_arg (cdio->env, key, value); -} - -/*! Sets up to read from place specified by source_name and - driver_id. This should be called before using any other routine, - except cdio_init. This will call cdio_init, if that hasn't been - done previously. - - NULL is returned on error. -*/ -CdIo * -cdio_open (const char *orig_source_name, driver_id_t driver_id) -{ - return cdio_open_am(orig_source_name, driver_id, NULL); -} - -/*! Sets up to read from place specified by source_name and - driver_id. This should be called before using any other routine, - except cdio_init. This will call cdio_init, if that hasn't been - done previously. - - NULL is returned on error. -*/ -CdIo * -cdio_open_am (const char *psz_orig_source, driver_id_t driver_id, - const char *psz_access_mode) -{ - char *psz_source; - - if (CdIo_last_driver == -1) cdio_init(); - - if (NULL == psz_orig_source || strlen(psz_orig_source)==0) - psz_source = cdio_get_default_device(NULL); - else - psz_source = strdup(psz_orig_source); - - switch (driver_id) { - case DRIVER_UNKNOWN: - { - CdIo *cdio=scan_for_driver(CDIO_MIN_DRIVER, CDIO_MAX_DRIVER, - psz_source, psz_access_mode); - free(psz_source); - return cdio; - } - case DRIVER_DEVICE: - { - /* Scan for a driver. */ - CdIo *ret = cdio_open_am_cd(psz_source, psz_access_mode); - free(psz_source); - return ret; - } - break; - case DRIVER_BSDI: - case DRIVER_FREEBSD: - case DRIVER_LINUX: - case DRIVER_SOLARIS: - case DRIVER_WIN32: - case DRIVER_OSX: - case DRIVER_NRG: - case DRIVER_BINCUE: - case DRIVER_CDRDAO: - if ((*CdIo_all_drivers[driver_id].have_driver)()) { - CdIo *ret = - (*CdIo_all_drivers[driver_id].driver_open_am)(psz_source, - psz_access_mode); - if (ret) ret->driver_id = driver_id; - free(psz_source); - return ret; - } - } - - free(psz_source); - return NULL; -} - - -/*! - Set up CD-ROM for reading. The device_name is - the some sort of device name. - - @return the cdio object for subsequent operations. - NULL on error or there is no driver for a some sort of hardware CD-ROM. -*/ -CdIo * -cdio_open_cd (const char *psz_source) -{ - return cdio_open_am_cd(psz_source, NULL); -} - -/*! - Set up CD-ROM for reading. The device_name is - the some sort of device name. - - @return the cdio object for subsequent operations. - NULL on error or there is no driver for a some sort of hardware CD-ROM. -*/ -/* In the future we'll have more complicated code to allow selection - of an I/O routine as well as code to find an appropriate default - routine among the "registered" routines. Possibly classes too - disk-based, SCSI-based, native-based, vendor (e.g. Sony, or - Plextor) based - - For now though, we'll start more simply... -*/ -CdIo * -cdio_open_am_cd (const char *psz_source, const char *psz_access_mode) -{ - if (CdIo_last_driver == -1) cdio_init(); - - /* Scan for a driver. */ - return scan_for_driver(CDIO_MIN_DEVICE_DRIVER, CDIO_MAX_DEVICE_DRIVER, - psz_source, psz_access_mode); -} - - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/cdio/Makefile.am b/src/input/vcd/libcdio/cdio/Makefile.am deleted file mode 100644 index 0910d60e5..000000000 --- a/src/input/vcd/libcdio/cdio/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -noinst_HEADERS = \ - bytesex.h \ - bytesex_asm.h \ - cdio.h \ - cdtext.h \ - cdtext.h \ - cd_types.h \ - ds.h \ - dvd.h \ - iso9660.h \ - logging.h \ - sector.h \ - scsi_mmc.h \ - types.h \ - util.h \ - version.h \ - xa.h diff --git a/src/input/vcd/libcdio/cdio/bytesex.h b/src/input/vcd/libcdio/cdio/bytesex.h deleted file mode 100644 index c40e44729..000000000 --- a/src/input/vcd/libcdio/cdio/bytesex.h +++ /dev/null @@ -1,196 +0,0 @@ -/* - $Id: bytesex.h,v 1.1 2005/01/02 00:51:38 rockyb Exp $ - - Copyright (C) 2000, 2004 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifndef __CDIO_BYTESEX_H__ -#define __CDIO_BYTESEX_H__ - -#include <cdio/types.h> -#include <cdio/bytesex_asm.h> -#include <cdio/logging.h> - -/* generic byteswap routines */ - -#define UINT16_SWAP_LE_BE_C(val) ((uint16_t) ( \ - (((uint16_t) (val) & (uint16_t) 0x00ffU) << 8) | \ - (((uint16_t) (val) & (uint16_t) 0xff00U) >> 8))) - -#define UINT32_SWAP_LE_BE_C(val) ((uint32_t) ( \ - (((uint32_t) (val) & (uint32_t) 0x000000ffU) << 24) | \ - (((uint32_t) (val) & (uint32_t) 0x0000ff00U) << 8) | \ - (((uint32_t) (val) & (uint32_t) 0x00ff0000U) >> 8) | \ - (((uint32_t) (val) & (uint32_t) 0xff000000U) >> 24))) - -#define UINT64_SWAP_LE_BE_C(val) ((uint64_t) ( \ - (((uint64_t) (val) & (uint64_t) UINT64_C(0x00000000000000ff)) << 56) | \ - (((uint64_t) (val) & (uint64_t) UINT64_C(0x000000000000ff00)) << 40) | \ - (((uint64_t) (val) & (uint64_t) UINT64_C(0x0000000000ff0000)) << 24) | \ - (((uint64_t) (val) & (uint64_t) UINT64_C(0x00000000ff000000)) << 8) | \ - (((uint64_t) (val) & (uint64_t) UINT64_C(0x000000ff00000000)) >> 8) | \ - (((uint64_t) (val) & (uint64_t) UINT64_C(0x0000ff0000000000)) >> 24) | \ - (((uint64_t) (val) & (uint64_t) UINT64_C(0x00ff000000000000)) >> 40) | \ - (((uint64_t) (val) & (uint64_t) UINT64_C(0xff00000000000000)) >> 56))) - -#ifndef UINT16_SWAP_LE_BE -# define UINT16_SWAP_LE_BE UINT16_SWAP_LE_BE_C -#endif - -#ifndef UINT32_SWAP_LE_BE -# define UINT32_SWAP_LE_BE UINT32_SWAP_LE_BE_C -#endif - -#ifndef UINT64_SWAP_LE_BE -# define UINT64_SWAP_LE_BE UINT64_SWAP_LE_BE_C -#endif - -inline static -uint16_t uint16_swap_le_be (const uint16_t val) -{ - return UINT16_SWAP_LE_BE (val); -} - -inline static -uint32_t uint32_swap_le_be (const uint32_t val) -{ - return UINT32_SWAP_LE_BE (val); -} - -inline static -uint64_t uint64_swap_le_be (const uint64_t val) -{ - return UINT64_SWAP_LE_BE (val); -} - -# define UINT8_TO_BE(val) ((uint8_t) (val)) -# define UINT8_TO_LE(val) ((uint8_t) (val)) -#ifdef WORDS_BIGENDIAN -# define UINT16_TO_BE(val) ((uint16_t) (val)) -# define UINT16_TO_LE(val) ((uint16_t) UINT16_SWAP_LE_BE(val)) - -# define UINT32_TO_BE(val) ((uint32_t) (val)) -# define UINT32_TO_LE(val) ((uint32_t) UINT32_SWAP_LE_BE(val)) - -# define UINT64_TO_BE(val) ((uint64_t) (val)) -# define UINT64_TO_LE(val) ((uint64_t) UINT64_SWAP_LE_BE(val)) -#else -# define UINT16_TO_BE(val) ((uint16_t) UINT16_SWAP_LE_BE(val)) -# define UINT16_TO_LE(val) ((uint16_t) (val)) - -# define UINT32_TO_BE(val) ((uint32_t) UINT32_SWAP_LE_BE(val)) -# define UINT32_TO_LE(val) ((uint32_t) (val)) - -# define UINT64_TO_BE(val) ((uint64_t) UINT64_SWAP_LE_BE(val)) -# define UINT64_TO_LE(val) ((uint64_t) (val)) -#endif - -/* symmetric conversions */ -#define UINT8_FROM_BE(val) (UINT8_TO_BE (val)) -#define UINT8_FROM_LE(val) (UINT8_TO_LE (val)) -#define UINT16_FROM_BE(val) (UINT16_TO_BE (val)) -#define UINT16_FROM_LE(val) (UINT16_TO_LE (val)) -#define UINT32_FROM_BE(val) (UINT32_TO_BE (val)) -#define UINT32_FROM_LE(val) (UINT32_TO_LE (val)) -#define UINT64_FROM_BE(val) (UINT64_TO_BE (val)) -#define UINT64_FROM_LE(val) (UINT64_TO_LE (val)) - -/* converter function template */ -#define CVT_TO_FUNC(bits) \ - static inline uint ## bits ## _t \ - uint ## bits ## _to_be (uint ## bits ## _t val) \ - { return UINT ## bits ## _TO_BE (val); } \ - static inline uint ## bits ## _t \ - uint ## bits ## _to_le (uint ## bits ## _t val) \ - { return UINT ## bits ## _TO_LE (val); } \ - -CVT_TO_FUNC(8) -CVT_TO_FUNC(16) -CVT_TO_FUNC(32) -CVT_TO_FUNC(64) - -#undef CVT_TO_FUNC - -#define uint8_from_be(val) (uint8_to_be (val)) -#define uint8_from_le(val) (uint8_to_le (val)) -#define uint16_from_be(val) (uint16_to_be (val)) -#define uint16_from_le(val) (uint16_to_le (val)) -#define uint32_from_be(val) (uint32_to_be (val)) -#define uint32_from_le(val) (uint32_to_le (val)) -#define uint64_from_be(val) (uint64_to_be (val)) -#define uint64_from_le(val) (uint64_to_le (val)) - -/* ISO9660 related stuff */ - -#define to_711(i) uint8_to_le(i) -#define from_711(i) uint8_from_le(i) - -#define to_721(i) uint16_to_le(i) -#define from_721(i) uint16_from_le(i) - -#define to_721(i) uint16_to_le(i) -#define from_721(i) uint16_from_le(i) - -#define to_722(i) uint16_to_be(i) -#define from_722(i) uint16_from_be(i) - -static inline uint32_t -to_723(uint16_t i) -{ - return uint32_swap_le_be(i) | i; -} - -static inline uint16_t -from_723 (uint32_t p) -{ - if (uint32_swap_le_be (p) != p) - cdio_warn ("from_723: broken byte order"); - - return (0xFFFF & p); -} - -#define to_731(i) uint32_to_le(i) -#define from_731(i) uint32_from_le(i) - -#define to_732(i) uint32_to_be(i) -#define from_732(i) uint32_from_be(i) - -static inline uint64_t -to_733(uint32_t i) -{ - return uint64_swap_le_be(i) | i; -} - -static inline uint32_t -from_733 (uint64_t p) -{ - if (uint64_swap_le_be (p) != p) - cdio_warn ("from_733: broken byte order"); - - return (UINT32_C(0xFFFFFFFF) & p); -} - -#endif /* __CDIO_BYTESEX_H__ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/cdio/bytesex_asm.h b/src/input/vcd/libcdio/cdio/bytesex_asm.h deleted file mode 100644 index 4291563ec..000000000 --- a/src/input/vcd/libcdio/cdio/bytesex_asm.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - $Id: bytesex_asm.h,v 1.1 2005/01/02 00:51:38 rockyb Exp $ - - Copyright (C) 2001 Sven Ottemann <ac-logic@freenet.de> - 2001, 2004 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifndef __CDIO_BYTESEX_ASM_H__ -#define __CDIO_BYTESEX_ASM_H__ -#if !defined(DISABLE_ASM_OPTIMIZE) - -#include <cdio/types.h> - -#if defined(__powerpc__) && defined(__GNUC__) - -inline static -uint32_t uint32_swap_le_be_asm(const uint32_t a) -{ - uint32_t b; - - __asm__ ("lwbrx %0,0,%1" - :"=r"(b) - :"r"(&a), "m"(a)); - - return b; -} - -inline static -uint16_t uint16_swap_le_be_asm(const uint16_t a) -{ - uint32_t b; - - __asm__ ("lhbrx %0,0,%1" - :"=r"(b) - :"r"(&a), "m"(a)); - - return b; -} - -#define UINT16_SWAP_LE_BE uint16_swap_le_be_asm -#define UINT32_SWAP_LE_BE uint32_swap_le_be_asm - -#elif defined(__mc68000__) && defined(__STORMGCC__) - -inline static -uint32_t uint32_swap_le_be_asm(uint32_t a __asm__("d0")) -{ - /* __asm__("rolw #8,%0; swap %0; rolw #8,%0" : "=d" (val) : "0" (val)); */ - - __asm__("move.l %1,d0;rol.w #8,d0;swap d0;rol.w #8,d0;move.l d0,%0" - :"=r"(a) - :"r"(a)); - - return(a); -} - -inline static -uint16_t uint16_swap_le_be_asm(uint16_t a __asm__("d0")) -{ - __asm__("move.l %1,d0;rol.w #8,d0;move.l d0,%0" - :"=r"(a) - :"r"(a)); - - return(a); -} - -#define UINT16_SWAP_LE_BE uint16_swap_le_be_asm -#define UINT32_SWAP_LE_BE uint32_swap_le_be_asm - -#elif 0 && defined(__i386__) && defined(__GNUC__) - -inline static -uint32_t uint32_swap_le_be_asm(uint32_t a) -{ - __asm__("xchgb %b0,%h0\n\t" /* swap lower bytes */ - "rorl $16,%0\n\t" /* swap words */ - "xchgb %b0,%h0" /* swap higher bytes */ - :"=q" (a) - : "0" (a)); - - return(a); -} - -inline static -uint16_t uint16_swap_le_be_asm(uint16_t a) -{ - __asm__("xchgb %b0,%h0" /* swap bytes */ - : "=q" (a) - : "0" (a)); - - return(a); -} - -#define UINT16_SWAP_LE_BE uint16_swap_le_be_asm -#define UINT32_SWAP_LE_BE uint32_swap_le_be_asm - -#endif - -#endif /* !defined(DISABLE_ASM_OPTIMIZE) */ -#endif /* __CDIO_BYTESEX_ASM_H__ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/cdio/cd_types.h b/src/input/vcd/libcdio/cdio/cd_types.h deleted file mode 100644 index 9f4a73f67..000000000 --- a/src/input/vcd/libcdio/cdio/cd_types.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - $Id: cd_types.h,v 1.3 2005/01/01 02:43:58 rockyb Exp $ - - Copyright (C) 2003 Rocky Bernstein <rocky@panix.com> - Copyright (C) 1996,1997,1998 Gerd Knorr <kraxel@bytesex.org> - and Heiko Eißfeldt <heiko@hexco.de> - - 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 -*/ - -/** \file cd_types.h - * \brief Header for routines which automatically determine the Compact Disc - * format and possibly filesystem on the CD. - * - */ - -#ifndef __CDIO_CD_TYPES_H__ -#define __CDIO_CD_TYPES_H__ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/** - * Filesystem types we understand. The highest-numbered fs type should - * be less than CDIO_FS_MASK defined below. - */ -#define CDIO_FS_AUDIO 1 /**< audio only - not really a - filesystem */ -#define CDIO_FS_HIGH_SIERRA 2 -#define CDIO_FS_ISO_9660 3 /**< ISO 9660 filesystem */ -#define CDIO_FS_INTERACTIVE 4 -#define CDIO_FS_HFS 5 /**< file system used on the Macintosh - system in MacOS 6 through MacOS 9 - and depricated in OSX. */ -#define CDIO_FS_UFS 6 /**< Generic Unix file system derived - from the Berkeley fast file - system. */ - -/** - * EXT2 was the GNU/Linux native filesystem for early kernels. Newer - * GNU/Linux OS's may use EXT3 which EXT2 with a journal. - */ -#define CDIO_FS_EXT2 7 - -#define CDIO_FS_ISO_HFS 8 /**< both HFS & ISO-9660 filesystem */ -#define CDIO_FS_ISO_9660_INTERACTIVE 9 /**< both CD-RTOS and ISO filesystem */ - - -/** - * The 3DO is, technically, a set of specifications created by the 3DO - * company. These specs are for making a 3DO Interactive Multiplayer - * which uses a CD-player. Panasonic in the early 90's was the first - * company to manufacture and market a 3DO player. - */ -#define CDIO_FS_3DO 10 - -/** - Microsoft X-BOX CD. - */ -#define CDIO_FS_XISO 11 -#define CDIO_FS_UDFX 12 -#define CDIO_FS_UDF 13 -#define CDIO_FS_ISO_UDF 14 - - -#define CDIO_FS_MASK 15 /**< Note: this should be 2**n-1 and - and greater than the highest - CDIO_FS number above */ -#define CDIO_FS_UNKNOWN CDIO_FS_MASK - -/** - * Macro to extract just the FS type portion defined above -*/ -#define CDIO_FSTYPE(fs) (fs & CDIO_FS_MASK) - -/** - * Bit masks for the classes of CD-images. These are generally - * higher-level than the fs-type information above and may be determined - * based of the fs type information. - */ -#define CDIO_FS_ANAL_XA 0x0010 /**< eXtended Architecture format */ -#define CDIO_FS_ANAL_MULTISESSION 0x0020 /**< CD has multisesion */ -#define CDIO_FS_ANAL_PHOTO_CD 0x0040 /**< Is a Kodak Photo CD */ -#define CDIO_FS_ANAL_HIDDEN_TRACK 0x0080 /**< Hidden track at the - beginning of the CD */ -#define CDIO_FS_ANAL_CDTV 0x0100 -#define CDIO_FS_ANAL_BOOTABLE 0x0200 /**< CD is bootable */ -#define CDIO_FS_ANAL_VIDEOCD 0x0400 /**< VCD 1.1 */ -#define CDIO_FS_ANAL_ROCKRIDGE 0x0800 /**< Has Rock Ridge Extensions to - ISO 9660 */ -#define CDIO_FS_ANAL_JOLIET 0x1000 /**< Microsoft Joliet extensions - to ISO 9660 */ -#define CDIO_FS_ANAL_SVCD 0x2000 /**< Super VCD or Choiji Video CD */ -#define CDIO_FS_ANAL_CVD 0x4000 /**< Choiji Video CD */ -#define CDIO_FS_ANAL_XISO 0x8000 /**< XBOX CD */ - -/** - * Pattern which can be used by cdio_get_devices to specify matching - * any sort of CD. - */ -#define CDIO_FS_MATCH_ALL (cdio_fs_anal_t) (~CDIO_FS_MASK) - - -/*! - \brief The type used to return analysis information from - cdio_guess_cd_type. - - These fields make sense only for when an ISO-9660 filesystem is used. - */ -typedef struct -{ - unsigned int joliet_level; /**< If has Joliet extensions, this is the - associated level number (i.e. 1, 2, or 3). */ - char iso_label[33]; /**< This is 32 + 1 for null byte at the end in - formatting the string */ - unsigned int isofs_size; - uint8_t UDFVerMinor; /**< For UDF filesystems only */ - uint8_t UDFVerMajor; /**< For UDF filesystems only */ -} cdio_iso_analysis_t; - -/** - * Try to determine what kind of CD-image and/or filesystem we - * have at track track_num. Return information about the CD image - * is returned in iso_analysis and the return value. - */ -cdio_fs_anal_t cdio_guess_cd_type(const CdIo *cdio, int start_session, - track_t track_num, - /*out*/ cdio_iso_analysis_t *iso_analysis); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __CDIO_CD_TYPES_H__ */ - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/cdio/cdio.h b/src/input/vcd/libcdio/cdio/cdio.h deleted file mode 100644 index f9e2a38e3..000000000 --- a/src/input/vcd/libcdio/cdio/cdio.h +++ /dev/null @@ -1,980 +0,0 @@ -/* -*- c -*- - $Id: cdio.h,v 1.4 2005/04/27 23:28:42 rockyb Exp $ - - Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/** \file cdio.h - * - * \brief The top-level header for libcdio: the CD Input and Control - * library. Applications include this for anything regarding libcdio. - */ - - -#ifndef __CDIO_H__ -#define __CDIO_H__ - -/** Application Interface or Protocol version number. If the public - * interface changes, we increase this number. - */ -#define CDIO_API_VERSION 2 - -#include <cdio/version.h> - -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif - -#include <cdio/types.h> -#include <cdio/sector.h> - -/**! Flags specifying the category of device to open or is opened. */ - -#define CDIO_SRC_IS_DISK_IMAGE_MASK 0x0001 /**< Read source is a CD image. */ -#define CDIO_SRC_IS_DEVICE_MASK 0x0002 /**< Read source is a CD device. */ -#define CDIO_SRC_IS_SCSI_MASK 0x0004 /**< Read source SCSI device. */ -#define CDIO_SRC_IS_NATIVE_MASK 0x0008 - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/*! Size of fields returned by an INQUIRY command */ -#define CDIO_MMC_HW_VENDOR_LEN 8 /**< length of vendor field */ -#define CDIO_MMC_HW_MODEL_LEN 16 /**< length of model field */ -#define CDIO_MMC_HW_REVISION_LEN 4 /**< length of revision field */ - - /*! \brief Structure to return CD vendor, model, and revision-level - strings obtained via the INQUIRY command */ - typedef struct cdio_hwinfo - { - char psz_vendor [CDIO_MMC_HW_VENDOR_LEN+1]; - char psz_model [CDIO_MMC_HW_MODEL_LEN+1]; - char psz_revision[CDIO_MMC_HW_REVISION_LEN+1]; - } cdio_hwinfo_t; - -/* For compatability. */ -#define CdIo CdIo_t - - /** This is an opaque structure for the CD object. */ - typedef struct _CdIo CdIo_t; - - /** This is an opaque structure for the CD-Text object. */ - typedef struct cdtext cdtext_t; - - /** The driver_id_t enumerations may be used to tag a specific driver - * that is opened or is desired to be opened. Note that this is - * different than what is available on a given host. - * - * Order is a little significant since the order is used in scans. - * We have to start with DRIVER_UNKNOWN and devices should come before - * disk-image readers. By putting something towards the top (a lower - * enumeration number), in an iterative scan we prefer that to - * something with a higher enumeration number. - * - * NOTE: IF YOU MODIFY ENUM MAKE SURE INITIALIZATION IN CDIO.C AGREES. - * - */ - typedef enum { - DRIVER_UNKNOWN, /**< Used as input when we don't care what kind - of driver to use. */ - DRIVER_BSDI, /**< BSDI driver */ - DRIVER_FREEBSD, /**< FreeBSD driver - includes CAM and ioctl access */ - DRIVER_LINUX, /**< GNU/Linux Driver */ - DRIVER_SOLARIS, /**< Sun Solaris Driver */ - DRIVER_OSX, /**< Apple OSX Driver */ - DRIVER_WIN32, /**< Microsoft Windows Driver. Includes ASPI and - ioctl acces. */ - DRIVER_CDRDAO, /**< cdrdao format CD image. This is listed - before BIN/CUE, to make the code prefer cdrdao - over BIN/CUE when both exist. */ - DRIVER_BINCUE, /**< CDRWIN BIN/CUE format CD image. This is - listed before NRG, to make the code prefer - BIN/CUE over NRG when both exist. */ - DRIVER_NRG, /**< Nero NRG format CD image. */ - DRIVER_DEVICE /**< Is really a set of the above; should come last */ - } driver_id_t; - - /** There will generally be only one hardware for a given - build/platform from the list above. You can use the variable - below to determine which you've got. If the build doesn't make an - hardware driver, then the value will be DRIVER_UNKNOWN. - */ - extern const driver_id_t cdio_os_driver; - - -/** Make sure what's listed for CDIO_MIN_DRIVER is the last - enumeration in driver_id_t. Since we have a bogus (but useful) 0th - entry above we don't have to add one. -*/ -#define CDIO_MIN_DRIVER DRIVER_BSDI -#define CDIO_MIN_DEVICE_DRIVER CDIO_MIN_DRIVER -#define CDIO_MAX_DRIVER DRIVER_NRG -#define CDIO_MAX_DEVICE_DRIVER DRIVER_WIN32 - - typedef enum { - TRACK_FORMAT_AUDIO, /**< Audio track, e.g. CD-DA */ - TRACK_FORMAT_CDI, /**< CD-i. How this is different from DATA below? */ - TRACK_FORMAT_XA, /**< Mode2 of some sort */ - TRACK_FORMAT_DATA, /**< Mode1 of some sort */ - TRACK_FORMAT_PSX, /**< Playstation CD. Like audio but only 2336 bytes - * of user data. - */ - TRACK_FORMAT_ERROR /**< Dunno what is, or some other error. */ - } track_format_t; - - extern const char *discmode2str[]; - - /*! Printable tags for track_format_t enumeration. */ - extern const char *track_format2str[6]; - - /*! - Eject media in CD drive if there is a routine to do so. - - @param p_cdio the CD object to be acted upon. - @return 0 if success and 1 for failure, and 2 if no routine. - If the CD is ejected *p_cdio is freed and p_cdio set to NULL. - */ - int cdio_eject_media (CdIo_t **p_cdio); - - /*! - Free any resources associated with p_cdio. Call this when done using p_cdio - and using CD reading/control operations. - - @param p_cdio the CD object to eliminated. - */ - void cdio_destroy (CdIo_t *p_cdio); - - /*! - Free device list returned by cdio_get_devices or - cdio_get_devices_with_cap. - - @param device_list list returned by cdio_get_devices or - cdio_get_devices_with_cap - - @see cdio_get_devices, cdio_get_devices_with_cap - - */ - void cdio_free_device_list (char * device_list[]); - - /*! - Get the value associatied with key. - - @param p_cdio the CD object queried - @param key the key to retrieve - @return the value associatd with "key" or NULL if p_cdio is NULL - or "key" does not exist. - */ - const char * cdio_get_arg (const CdIo_t *p_cdio, const char key[]); - - /*! - Get CD-Text information for a CdIo object. - - @param p_cdio the CD object that may contain CD-Text information. - @param i_track track for which we are requesting CD-Text information. - @return the CD-Text object or NULL if obj is NULL - or CD-Text information does not exist. - - If i_track is 0 or CDIO_CDROM_LEADOUT_TRACK the track returned - is the information assocated with the CD. - */ - const cdtext_t *cdio_get_cdtext (CdIo_t *p_cdio, track_t i_track); - - /*! - Get the default CD device. - if p_cdio is NULL (we haven't initialized a specific device driver), - then find a suitable one and return the default device for that. - - @param p_cdio the CD object queried - @return a string containing the default CD device or NULL is - if we couldn't get a default device. - - In some situations of drivers or OS's we can't find a CD device if - there is no media in it and it is possible for this routine to return - NULL even though there may be a hardware CD-ROM. - */ - char * cdio_get_default_device (const CdIo_t *p_cdio); - - /*! Return an array of device names. If you want a specific - devices for a driver, give that device. If you want hardware - devices, give DRIVER_DEVICE and if you want all possible devices, - image drivers and hardware drivers give DRIVER_UNKNOWN. - - NULL is returned if we couldn't return a list of devices. - - In some situations of drivers or OS's we can't find a CD device if - there is no media in it and it is possible for this routine to return - NULL even though there may be a hardware CD-ROM. - */ - char ** cdio_get_devices (driver_id_t driver_id); - - /*! - Get an array of device names in search_devices that have at least - the capabilities listed by the capabities parameter. If - search_devices is NULL, then we'll search all possible CD drives. - - If "b_any" is set false then every capability listed in the - extended portion of capabilities (i.e. not the basic filesystem) - must be satisified. If "any" is set true, then if any of the - capabilities matches, we call that a success. - - To find a CD-drive of any type, use the mask CDIO_FS_MATCH_ALL. - - @return the array of device names or NULL if we couldn't get a - default device. It is also possible to return a non NULL but - after dereferencing the the value is NULL. This also means nothing - was found. - */ - char ** cdio_get_devices_with_cap (char* ppsz_search_devices[], - cdio_fs_anal_t capabilities, bool b_any); - - /*! - Like cdio_get_devices_with_cap but we return the driver we found - as well. This is because often one wants to search for kind of drive - and then *open* it afterwards. Giving the driver back facilitates this, - and speeds things up for libcdio as well. - */ - char ** cdio_get_devices_with_cap_ret (/*out*/ char* ppsz_search_devices[], - cdio_fs_anal_t capabilities, - bool b_any, - /*out*/ driver_id_t *p_driver_id); - - /*! Like cdio_get_devices, but we may change the p_driver_id if we - were given DRIVER_DEVICE or DRIVER_UNKNOWN. This is because - often one wants to get a drive name and then *open* it - afterwards. Giving the driver back facilitates this, and speeds - things up for libcdio as well. - */ - - char ** cdio_get_devices_ret (/*in/out*/ driver_id_t *p_driver_id); - - /*! - Get disc mode - the kind of CD (CD-DA, CD-ROM mode 1, CD-MIXED, etc. - that we've got. The notion of "CD" is extended a little to include - DVD's. - */ - discmode_t cdio_get_discmode (CdIo_t *p_cdio); - - /*! - Get the what kind of device we've got. - - @param p_cdio the CD object queried - @param p_read_cap pointer to return read capabilities - @param p_write_cap pointer to return write capabilities - @param p_misc_cap pointer to return miscellaneous other capabilities - - In some situations of drivers or OS's we can't find a CD device if - there is no media in it and it is possible for this routine to return - NULL even though there may be a hardware CD-ROM. - */ - void cdio_get_drive_cap (const CdIo_t *p_cdio, - cdio_drive_read_cap_t *p_read_cap, - cdio_drive_write_cap_t *p_write_cap, - cdio_drive_misc_cap_t *p_misc_cap); - - /*! - Get the drive capabilities for a specified device. - - @return a list of device capabilities. - - In some situations of drivers or OS's we can't find a CD device if - there is no media in it and it is possible for this routine to return - NULL even though there may be a hardware CD-ROM. - */ - void cdio_get_drive_cap_dev (const char *device, - cdio_drive_read_cap_t *p_read_cap, - cdio_drive_write_cap_t *p_write_cap, - cdio_drive_misc_cap_t *p_misc_cap); - - /*! - Get a string containing the name of the driver in use. - - @return a string with driver name or NULL if CdIo is NULL (we - haven't initialized a specific device. - */ - const char * cdio_get_driver_name (const CdIo_t *p_cdio); - - /*! - Get the driver id. - if CdIo is NULL (we haven't initialized a specific device driver), - then return DRIVER_UNKNOWN. - - @return the driver id.. - */ - driver_id_t cdio_get_driver_id (const CdIo_t *p_cdio); - - /*! - Get the number of the first track. - - @return the track number or CDIO_INVALID_TRACK - on error. - */ - track_t cdio_get_first_track_num(const CdIo_t *p_cdio); - - /*! - Get the CD-ROM hardware info via a SCSI MMC INQUIRY command. - False is returned if we had an error getting the information. - */ - bool cdio_get_hwinfo ( const CdIo_t *p_cdio, - /* out*/ cdio_hwinfo_t *p_hw_info ); - - - /*! - Return the Joliet level recognized for p_cdio. - */ - uint8_t cdio_get_joliet_level(const CdIo_t *p_cdio); - - /*! - Get the media catalog number (MCN) from the CD. - - @return the media catalog number r NULL if there is none or we - don't have the ability to get it. - - Note: string is malloc'd so caller has to free() the returned - string when done with it. - - */ - char * cdio_get_mcn (const CdIo_t *p_cdio); - - /*! - Get the number of tracks on the CD. - - @return the number of tracks, or CDIO_INVALID_TRACK if there is - an error. - */ - track_t cdio_get_num_tracks (const CdIo_t *p_cdio); - - /*! - Get the format (audio, mode2, mode1) of track. - */ - track_format_t cdio_get_track_format(const CdIo_t *p_cdio, track_t i_track); - - /*! - Return true if we have XA data (green, mode2 form1) or - XA data (green, mode2 form2). That is track begins: - sync - header - subheader - 12 4 - 8 - - FIXME: there's gotta be a better design for this and get_track_format? - */ - bool cdio_get_track_green(const CdIo_t *p_cdio, track_t i_track); - - /*! - Get the starting LBA for track number - i_track in p_cdio. Track numbers usually start at something - greater than 0, usually 1. - - The "leadout" track is specified either by - using i_track CDIO_CDROM_LEADOUT_TRACK or the total tracks+1. - - @param p_cdio object to get information from - @param i_track the track number we want the LSN for - @return the starting LBA or CDIO_INVALID_LBA on error. - */ - lba_t cdio_get_track_lba(const CdIo_t *p_cdio, track_t i_track); - - /*! - Return the starting MSF (minutes/secs/frames) for track number - i_track in p_cdio. Track numbers usually start at something - greater than 0, usually 1. - - The "leadout" track is specified either by - using i_track CDIO_CDROM_LEADOUT_TRACK or the total tracks+1. - - @param p_cdio object to get information from - @param i_track the track number we want the LSN for - @return the starting LSN or CDIO_INVALID_LSN on error. - */ - lsn_t cdio_get_track_lsn(const CdIo_t *p_cdio, track_t i_track); - - /*! - Return the starting MSF (minutes/secs/frames) for track number - i_track in p_cdio. Track numbers usually start at something - greater than 0, usually 1. - - The "leadout" track is specified either by - using i_track CDIO_CDROM_LEADOUT_TRACK or the total tracks+1. - - @return true if things worked or false if there is no track entry. - */ - bool cdio_get_track_msf(const CdIo_t *p_cdio, track_t i_track, - /*out*/ msf_t *msf); - - /*! - Get the number of sectors between this track an the next. This - includes any pregap sectors before the start of the next track. - Track numbers usually start at something - greater than 0, usually 1. - - @return the number of sectors or 0 if there is an error. - */ - unsigned int cdio_get_track_sec_count(const CdIo_t *p_cdio, track_t i_track); - - /*! - Reposition read offset - Similar to (if not the same as) libc's lseek() - - @param p_cdio object to get information from - @param offset amount to seek - @param whence like corresponding parameter in libc's lseek, e.g. - SEEK_SET or SEEK_END. - @return (off_t) -1 on error. - */ - off_t cdio_lseek(const CdIo_t *p_cdio, off_t offset, int whence); - - /*! - Reads into buf the next size bytes. - Similar to (if not the same as) libc's read() - - @return (ssize_t) -1 on error. - */ - ssize_t cdio_read(const CdIo_t *p_cdio, void *buf, size_t size); - - /*! - Read an audio sector - - @param p_cdio object to read from - @param buf place to read data into - @param lsn sector to read - - @return 0 if no error, nonzero otherwise. - */ - int cdio_read_audio_sector (const CdIo_t *p_cdio, void *buf, lsn_t lsn); - - /*! - Reads audio sectors - - @param p_cdio object to read from - @param buf place to read data into - @param lsn sector to read - @param i_sectors number of sectors to read - - @return 0 if no error, nonzero otherwise. - */ - int cdio_read_audio_sectors (const CdIo_t *p_cdio, void *buf, lsn_t lsn, - unsigned int i_sectors); - - /*! - Reads a mode1 sector - - @param p_cdio object to read from - @param buf place to read data into - @param lsn sector to read - @param b_form2 true for reading mode1 form2 sectors or false for - mode1 form1 sectors. - - @return 0 if no error, nonzero otherwise. - */ - int cdio_read_mode1_sector (const CdIo_t *p_cdio, void *buf, lsn_t lsn, - bool b_form2); - - /*! - Reads mode1 sectors - - @param p_cdio object to read from - @param buf place to read data into - @param lsn sector to read - @param b_form2 true for reading mode1 form2 sectors or false for - mode1 form1 sectors. - @param i_sectors number of sectors to read - - @return 0 if no error, nonzero otherwise. - */ - int cdio_read_mode1_sectors (const CdIo_t *p_cdio, void *buf, lsn_t lsn, - bool b_form2, unsigned int i_sectors); - - /*! - Reads a mode1 sector - - @param p_cdio object to read from - @param buf place to read data into - @param lsn sector to read - @param b_form2 true for reading mode1 form2 sectors or false for - mode1 form1 sectors. - - @return 0 if no error, nonzero otherwise. - */ - int cdio_read_mode2_sector (const CdIo_t *p_cdio, void *buf, lsn_t lsn, - bool b_form2); - - /*! - Reads mode2 sectors - - @param p_cdio object to read from - @param buf place to read data into - @param lsn sector to read - @param b_form2 true for reading mode1 form2 sectors or false for - mode1 form1 sectors. - @param i_sectors number of sectors to read - - @return 0 if no error, nonzero otherwise. - */ - int cdio_read_mode2_sectors (const CdIo_t *p_cdio, void *buf, lsn_t lsn, - bool b_form2, unsigned int i_sectors); - - /*! - Set the arg "key" with "value" in "obj". - - @param p_cdio the CD object to set - @param key the key to set - @param value the value to assocaiate with key - @return 0 if no error was found, and nonzero otherwise. - */ - int cdio_set_arg (CdIo_t *p_cdio, const char key[], const char value[]); - - /*! - Get the size of the CD in logical block address (LBA) units. - - @param p_cdio the CD object queried - @return the size - */ - uint32_t cdio_stat_size (const CdIo_t *p_cdio); - - /*! - Initialize CD Reading and control routines. Should be called first. - */ - bool cdio_init(void); - - /* True if xxx driver is available. where xxx=linux, solaris, nrg, ... - */ - - /*! True if BSDI driver is available. */ - bool cdio_have_bsdi (void); - - /*! True if FreeBSD driver is available. */ - bool cdio_have_freebsd (void); - - /*! True if GNU/Linux driver is available. */ - bool cdio_have_linux (void); - - /*! True if Sun Solaris driver is available. */ - bool cdio_have_solaris (void); - - /*! True if Apple OSX driver is available. */ - bool cdio_have_osx (void); - - /*! True if Microsoft Windows driver is available. */ - bool cdio_have_win32 (void); - - /*! True if Nero driver is available. */ - bool cdio_have_nrg (void); - - /*! True if BIN/CUE driver is available. */ - bool cdio_have_bincue (void); - - /*! True if cdrdao CDRDAO driver is available. */ - bool cdio_have_cdrdao (void); - - /*! Like cdio_have_xxx but uses an enumeration instead. */ - bool cdio_have_driver (driver_id_t driver_id); - - /*! - Get a string decribing driver_id. - - @param driver_id the driver you want the description for - @return a sring of driver description - */ - const char *cdio_driver_describe (driver_id_t driver_id); - - /*! Sets up to read from place specified by source_name and - driver_id. This or cdio_open_* should be called before using any - other routine, except cdio_init. This will call cdio_init, if - that hasn't been done previously. to call one of the specific - cdio_open_xxx routines. - - @return the cdio object or NULL on error or no device. - */ - CdIo_t * cdio_open (const char *source_name, driver_id_t driver_id); - - /*! Sets up to read from place specified by source_name, driver_id - and access mode. This or cdio_open should be called before using - any other routine, except cdio_init. This will call cdio_init, if - that hasn't been done previously. to call one of the specific - cdio_open_xxx routines. - - @return the cdio object or NULL on error or no device. - */ - CdIo_t * cdio_open_am (const char *psz_source_name, - driver_id_t driver_id, const char *psz_access_mode); - - /*! Set up BIN/CUE CD disk-image for reading. Source is the .bin or - .cue file - - @return the cdio object or NULL on error or no device. - */ - CdIo_t * cdio_open_bincue (const char *psz_cue_name); - - /*! Set up BIN/CUE CD disk-image for reading. Source is the .bin or - .cue file - - @return the cdio object or NULL on error or no device.. - */ - CdIo_t * cdio_open_am_bincue (const char *psz_cue_name, - const char *psz_access_mode); - - /*! Set up cdrdao CD disk-image for reading. Source is the .toc file - - @return the cdio object or NULL on error or no device. - */ - CdIo_t * cdio_open_cdrdao (const char *psz_toc_name); - - /*! Set up cdrdao CD disk-image for reading. Source is the .toc file - - @return the cdio object or NULL on error or no device.. - */ - CdIo_t * cdio_open_am_cdrdao (const char *psz_toc_name, - const char *psz_access_mode); - - /*! Return a string containing the default CUE file that would - be used when none is specified. - - @return the cdio object or NULL on error or no device. - */ - char * cdio_get_default_device_bincue(void); - - char **cdio_get_devices_bincue(void); - - /*! Return a string containing the default CUE file that would - be used when none is specified. - - NULL is returned on error or there is no device. - */ - char * cdio_get_default_device_cdrdao(void); - - char **cdio_get_devices_cdrdao(void); - - /*! Set up CD-ROM for reading. The device_name is - the some sort of device name. - - @return the cdio object for subsequent operations. - NULL on error or there is no driver for a some sort of hardware CD-ROM. - */ - CdIo_t * cdio_open_cd (const char *device_name); - - /*! Set up CD-ROM for reading. The device_name is - the some sort of device name. - - @return the cdio object for subsequent operations. - NULL on error or there is no driver for a some sort of hardware CD-ROM. - */ - CdIo_t * cdio_open_am_cd (const char *psz_device, - const char *psz_access_mode); - - /*! CDRWIN BIN/CUE CD disc-image routines. Source is the .cue file - - @return the cdio object for subsequent operations. - NULL on error. - */ - CdIo_t * cdio_open_cue (const char *cue_name); - - /*! Set up CD-ROM for reading using the BSDI driver. The device_name is - the some sort of device name. - - @return the cdio object for subsequent operations. - NULL on error or there is no BSDI driver. - - @see cdio_open - */ - CdIo_t * cdio_open_bsdi (const char *psz_source_name); - - /*! Set up CD-ROM for reading using the BSDI driver. The device_name is - the some sort of device name. - - @return the cdio object for subsequent operations. - NULL on error or there is no BSDI driver. - - @see cdio_open - */ - CdIo_t * cdio_open_am_bsdi (const char *psz_source_name, - const char *psz_access_mode); - - /*! Return a string containing the default device name that the - BSDI driver would use when none is specified. - - @return the cdio object for subsequent operations. - NULL on error or there is no BSDI driver. - - @see cdio_open_cd, cdio_open - */ - char * cdio_get_default_device_bsdi(void); - - /*! Return a list of all of the CD-ROM devices that the BSDI driver - can find. - - In some situations of drivers or OS's we can't find a CD device if - there is no media in it and it is possible for this routine to return - NULL even though there may be a hardware CD-ROM. - */ - char **cdio_get_devices_bsdi(void); - - /*! Set up CD-ROM for reading using the FreeBSD driver. The device_name is - the some sort of device name. - - NULL is returned on error or there is no FreeBSD driver. - - @see cdio_open_cd, cdio_open - */ - CdIo_t * cdio_open_freebsd (const char *paz_source_name); - - /*! Set up CD-ROM for reading using the FreeBSD driver. The device_name is - the some sort of device name. - - NULL is returned on error or there is no FreeBSD driver. - - @see cdio_open_cd, cdio_open - */ - CdIo_t * cdio_open_am_freebsd (const char *psz_source_name, - const char *psz_access_mode); - - /*! Return a string containing the default device name that the - FreeBSD driver would use when none is specified. - - NULL is returned on error or there is no CD-ROM device. - */ - char * cdio_get_default_device_freebsd(void); - - /*! Return a list of all of the CD-ROM devices that the FreeBSD driver - can find. - */ - char **cdio_get_devices_freebsd(void); - - /*! Set up CD-ROM for reading using the GNU/Linux driver. The device_name is - the some sort of device name. - - @return the cdio object for subsequent operations. - NULL on error or there is no GNU/Linux driver. - - In some situations of drivers or OS's we can't find a CD device if - there is no media in it and it is possible for this routine to return - NULL even though there may be a hardware CD-ROM. - */ - CdIo_t * cdio_open_linux (const char *source_name); - - /*! Set up CD-ROM for reading using the GNU/Linux driver. The - device_name is the some sort of device name. - - @return the cdio object for subsequent operations. - NULL on error or there is no GNU/Linux driver. - */ - CdIo_t * cdio_open_am_linux (const char *source_name, - const char *access_mode); - - /*! Return a string containing the default device name that the - GNU/Linux driver would use when none is specified. A scan is made - for CD-ROM drives with CDs in them. - - NULL is returned on error or there is no CD-ROM device. - - In some situations of drivers or OS's we can't find a CD device if - there is no media in it and it is possible for this routine to return - NULL even though there may be a hardware CD-ROM. - - @see cdio_open_cd, cdio_open - */ - char * cdio_get_default_device_linux(void); - - /*! Return a list of all of the CD-ROM devices that the GNU/Linux driver - can find. - */ - char **cdio_get_devices_linux(void); - - /*! Set up CD-ROM for reading using the Sun Solaris driver. The - device_name is the some sort of device name. - - @return the cdio object for subsequent operations. - NULL on error or there is no Solaris driver. - */ - CdIo_t * cdio_open_solaris (const char *source_name); - - /*! Set up CD-ROM for reading using the Sun Solaris driver. The - device_name is the some sort of device name. - - @return the cdio object for subsequent operations. - NULL on error or there is no Solaris driver. - */ - CdIo_t * cdio_open_am_solaris (const char *psz_source_name, - const char *psz_access_mode); - - /*! Return a string containing the default device name that the - Solaris driver would use when none is specified. A scan is made - for CD-ROM drives with CDs in them. - - NULL is returned on error or there is no CD-ROM device. - - In some situations of drivers or OS's we can't find a CD device if - there is no media in it and it is possible for this routine to return - NULL even though there may be a hardware CD-ROM. - - @see cdio_open_cd, cdio_open - */ - char * cdio_get_default_device_solaris(void); - - /*! Return a list of all of the CD-ROM devices that the Solaris driver - can find. - */ - char **cdio_get_devices_solaris(void); - - /*! Set up CD-ROM for reading using the Apple OSX driver. The - device_name is the some sort of device name. - - NULL is returned on error or there is no OSX driver. - - In some situations of drivers or OS's we can't find a CD device if - there is no media in it and it is possible for this routine to return - NULL even though there may be a hardware CD-ROM. - - @see cdio_open_cd, cdio_open - */ - CdIo_t * cdio_open_osx (const char *psz_source_name); - - /*! Set up CD-ROM for reading using the Apple OSX driver. The - device_name is the some sort of device name. - - NULL is returned on error or there is no OSX driver. - - @see cdio_open_cd, cdio_open - */ - CdIo_t * cdio_open_am_osx (const char *psz_source_name, - const char *psz_access_mode); - - /*! Return a string containing the default device name that the - OSX driver would use when none is specified. A scan is made - for CD-ROM drives with CDs in them. - - In some situations of drivers or OS's we can't find a CD device if - there is no media in it and it is possible for this routine to return - NULL even though there may be a hardware CD-ROM. - */ - char * cdio_get_default_device_osx(void); - - /*! Return a list of all of the CD-ROM devices that the OSX driver - can find. - */ - char **cdio_get_devices_osx(void); - - /*! Set up CD-ROM for reading using the Microsoft Windows driver. The - device_name is the some sort of device name. - - In some situations of drivers or OS's we can't find a CD device if - there is no media in it and it is possible for this routine to return - NULL even though there may be a hardware CD-ROM. - */ - CdIo_t * cdio_open_win32 (const char *source_name); - - /*! Set up CD-ROM for reading using the Microsoft Windows driver. The - device_name is the some sort of device name. - - NULL is returned on error or there is no Microsof Windows driver. - */ - CdIo_t * cdio_open_am_win32 (const char *psz_source_name, - const char *psz_access_mode); - - /*! Return a string containing the default device name that the - Win32 driver would use when none is specified. A scan is made - for CD-ROM drives with CDs in them. - - In some situations of drivers or OS's we can't find a CD device if - there is no media in it and it is possible for this routine to return - NULL even though there may be a hardware CD-ROM. - - @see cdio_open_cd, cdio_open - */ - char * cdio_get_default_device_win32(void); - - char **cdio_get_devices_win32(void); - - /*! Set up CD-ROM for reading using the Nero driver. The - device_name is the some sort of device name. - - @return true on success; NULL on error or there is no Nero driver. - */ - CdIo_t * cdio_open_nrg (const char *source_name); - - /*! Set up CD-ROM for reading using the Nero driver. The - device_name is the some sort of device name. - - @return true on success; NULL on error or there is no Nero driver. - */ - CdIo_t * cdio_open_am_nrg (const char *psz_source_name, - const char *psz_access_mode); - - /*! Return a string containing the default device name that the - NRG driver would use when none is specified. A scan is made - for NRG disk images in the current directory.. - - NULL is returned on error or there is no CD-ROM device. - */ - char * cdio_get_default_device_nrg(void); - - char **cdio_get_devices_nrg(void); - - /*! - - Determine if bin_name is the bin file part of a CDRWIN CD disk image. - - @param bin_name location of presumed CDRWIN bin image file. - @return the corresponding CUE file if bin_name is a BIN file or - NULL if not a BIN file. - */ - char *cdio_is_binfile(const char *bin_name); - - /*! - Determine if cue_name is the cue sheet for a CDRWIN CD disk image. - - @return corresponding BIN file if cue_name is a CDRWIN cue file or - NULL if not a CUE file. - */ - char *cdio_is_cuefile(const char *cue_name); - - /*! - Determine if psg_nrg is a Nero CD disk image. - - @param psz_nrg location of presumed NRG image file. - @return true if psz_nrg is a Nero NRG image or false - if not a NRG image. - */ - bool cdio_is_nrg(const char *psz_nrg); - - /*! - Determine if psg_toc is a TOC file for a cdrdao CD disk image. - - @param psz_toc location of presumed TOC image file. - @return true if toc_name is a cdrdao TOC file or false - if not a TOC file. - */ - bool cdio_is_tocfile(const char *psz_toc); - - /*! - Determine if source_name refers to a real hardware CD-ROM. - - @param source_name location name of object - @param driver_id driver for reading object. Use DRIVER_UNKNOWN if you - don't know what driver to use. - @return true if source_name is a device; If false is returned we - could have a CD disk image. - */ - bool cdio_is_device(const char *source_name, driver_id_t driver_id); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __CDIO_H__ */ diff --git a/src/input/vcd/libcdio/cdio/cdtext.h b/src/input/vcd/libcdio/cdio/cdtext.h deleted file mode 100644 index 4b397a3ff..000000000 --- a/src/input/vcd/libcdio/cdio/cdtext.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - $Id: cdtext.h,v 1.1 2005/01/01 02:43:58 rockyb Exp $ - - Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> - adapted from cuetools - Copyright (C) 2003 Svend Sanjay Sorensen <ssorensen@fastmail.fm> - - 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 -*/ -/*! - * \file cdtext.h - * \brief Header CD-Text information -*/ - - -#ifndef __CDIO_CDTEXT_H__ -#define __CDIO_CDTEXT_H__ - -#include <cdio/cdio.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define MAX_CDTEXT_FIELDS 13 - - /*! \brief structure for holding CD-Text information - - @see cdtext_init, cdtext_destroy, cdtext_get, and cdtext_set. - */ - struct cdtext { - char *field[MAX_CDTEXT_FIELDS]; - }; - - /*! \brief A list of all of the CD-Text fields */ - typedef enum { - CDTEXT_ARRANGER = 0, /**< name(s) of the arranger(s) */ - CDTEXT_COMPOSER = 1, /**< name(s) of the composer(s) */ - CDTEXT_DISCID = 2, /**< disc identification information */ - CDTEXT_GENRE = 3, /**< genre identification and genre information */ - CDTEXT_MESSAGE = 4, /**< ISRC code of each track */ - CDTEXT_ISRC = 5, /**< message(s) from the content provider or artist */ - CDTEXT_PERFORMER = 6, /**< name(s) of the performer(s) */ - CDTEXT_SIZE_INFO = 7, /**< size information of the block */ - CDTEXT_SONGWRITER = 8, /**< name(s) of the songwriter(s) */ - CDTEXT_TITLE = 9, /**< title of album name or track titles */ - CDTEXT_TOC_INFO = 10, /**< table of contents information */ - CDTEXT_TOC_INFO2 = 11, /**< second table of contents information */ - CDTEXT_UPC_EAN = 12, - CDTEXT_INVALID = MAX_CDTEXT_FIELDS - } cdtext_field_t; - - /*! Return string representation of the enum values above */ - const char *cdtext_field2str (cdtext_field_t i); - - /*! Initialize a new cdtext structure. - When the structure is no longer needed, release the - resources using cdtext_delete. - */ - void cdtext_init (cdtext_t *cdtext); - - /*! Free memory assocated with cdtext*/ - void cdtext_destroy (cdtext_t *cdtext); - - /*! returns the string associated with the given field. NULL is - returned if key is CDTEXT_INVALID or the field is not set. - - @see cdio_get_cdtext to retrieve the cdtext structure used as - input here. - */ - const char *cdtext_get (cdtext_field_t key, const cdtext_t *cdtext); - - /*! - returns enum of keyword if key is a CD-Text keyword, - returns MAX_CDTEXT_FIELDS non-zero otherwise. - */ - cdtext_field_t cdtext_is_keyword (const char *key); - - /*! - sets cdtext's keyword entry to field - */ - void cdtext_set (cdtext_field_t key, const char *value, cdtext_t *cdtext); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __CDIO_CDTEXT_H__ */ - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/cdio/ds.h b/src/input/vcd/libcdio/cdio/ds.h deleted file mode 100644 index c811cadd4..000000000 --- a/src/input/vcd/libcdio/cdio/ds.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - $Id: ds.h,v 1.1 2005/01/01 02:43:58 rockyb Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifndef __CDIO_DS_H__ -#define __CDIO_DS_H__ - -#include <cdio/types.h> - -/* opaque... */ -typedef struct _CdioList CdioList; -typedef struct _CdioListNode CdioListNode; - -typedef int (*_cdio_list_cmp_func) (void *data1, void *data2); - -typedef int (*_cdio_list_iterfunc) (void *data, void *user_data); - -/* methods */ -CdioList *_cdio_list_new (void); - -void _cdio_list_free (CdioList *list, int free_data); - -unsigned _cdio_list_length (const CdioList *list); - -void _cdio_list_prepend (CdioList *list, void *data); - -void _cdio_list_append (CdioList *list, void *data); - -void _cdio_list_foreach (CdioList *list, _cdio_list_iterfunc func, void *user_data); - -CdioListNode *_cdio_list_find (CdioList *list, _cdio_list_iterfunc cmp_func, void *user_data); - -#define _CDIO_LIST_FOREACH(node, list) \ - for (node = _cdio_list_begin (list); node; node = _cdio_list_node_next (node)) - -/* node ops */ - -CdioListNode *_cdio_list_begin (const CdioList *list); - -CdioListNode *_cdio_list_end (CdioList *list); - -CdioListNode *_cdio_list_node_next (CdioListNode *node); - -void _cdio_list_node_free (CdioListNode *node, int free_data); - -void *_cdio_list_node_data (CdioListNode *node); - -#endif /* __CDIO_DS_H__ */ - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ - diff --git a/src/input/vcd/libcdio/cdio/dvd.h b/src/input/vcd/libcdio/cdio/dvd.h deleted file mode 100644 index df58c4322..000000000 --- a/src/input/vcd/libcdio/cdio/dvd.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - $Id: dvd.h,v 1.1 2005/01/01 02:43:58 rockyb Exp $ - - Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> - Modeled after GNU/Linux definitions in linux/cdrom.h - - 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 -*/ - -/*! - \file dvd.h - \brief Definitions for DVD access. -*/ - -#ifndef __CDIO_DVD_H__ -#define __CDIO_DVD_H__ - -#include <cdio/types.h> - -/*! Values used in a READ DVD STRUCTURE */ - -#define CDIO_DVD_STRUCT_PHYSICAL 0x00 -#define CDIO_DVD_STRUCT_COPYRIGHT 0x01 -#define CDIO_DVD_STRUCT_DISCKEY 0x02 -#define CDIO_DVD_STRUCT_BCA 0x03 -#define CDIO_DVD_STRUCT_MANUFACT 0x04 - -/*! Media definitions for "Book Type" */ -#define CDIO_DVD_BOOK_DVD_ROM 0 -#define CDIO_DVD_BOOK_DVD_RAM 1 -#define CDIO_DVD_BOOK_DVD_R 2 /**< DVD-R */ -#define CDIO_DVD_BOOK_DVD_RW 3 /**< DVD-RW */ -#define CDIO_DVD_BOOK_DVD_PR 8 /**< DVD+R */ -#define CDIO_DVD_BOOK_DVD_PRW 9 /**< DVD+RW */ - -typedef struct cdio_dvd_layer { - uint8_t book_version : 4; - uint8_t book_type : 4; - uint8_t min_rate : 4; - uint8_t disc_size : 4; - uint8_t layer_type : 4; - uint8_t track_path : 1; - uint8_t nlayers : 2; - uint8_t track_density : 4; - uint8_t linear_density: 4; - uint8_t bca : 1; - uint32_t start_sector; - uint32_t end_sector; - uint32_t end_sector_l0; -} cdio_dvd_layer_t; - -/*! Maximum number of layers in a DVD. */ -#define CDIO_DVD_MAX_LAYERS 4 - -typedef struct cdio_dvd_physical { - uint8_t type; - uint8_t layer_num; - cdio_dvd_layer_t layer[CDIO_DVD_MAX_LAYERS]; -} cdio_dvd_physical_t; - -typedef struct cdio_dvd_copyright { - uint8_t type; - - uint8_t layer_num; - uint8_t cpst; - uint8_t rmi; -} cdio_dvd_copyright_t; - -typedef struct cdio_dvd_disckey { - uint8_t type; - - unsigned agid : 2; - uint8_t value[2048]; -} cdio_dvd_disckey_t; - -typedef struct cdio_dvd_bca { - uint8_t type; - - int len; - uint8_t value[188]; -} cdio_dvd_bca_t; - -typedef struct cdio_dvd_manufact { - uint8_t type; - - uint8_t layer_num; - int len; - uint8_t value[2048]; -} cdio_dvd_manufact_t; - -typedef union { - uint8_t type; - - cdio_dvd_physical_t physical; - cdio_dvd_copyright_t copyright; - cdio_dvd_disckey_t disckey; - cdio_dvd_bca_t bca; - cdio_dvd_manufact_t manufact; -} cdio_dvd_struct_t; - -#endif /* __SCSI_MMC_H__ */ diff --git a/src/input/vcd/libcdio/cdio/iso9660.h b/src/input/vcd/libcdio/cdio/iso9660.h deleted file mode 100644 index 104b6ba62..000000000 --- a/src/input/vcd/libcdio/cdio/iso9660.h +++ /dev/null @@ -1,786 +0,0 @@ -/* - $Id: iso9660.h,v 1.3 2005/01/01 02:43:58 rockyb Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - - See also iso9660.h by Eric Youngdale (1993). - - Copyright 1993 Yggdrasil Computing, Incorporated - Copyright (c) 1999,2000 J. Schilling - - 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 -*/ -/*! - * \file iso9660.h - * \brief Header for libiso9660: the ISO-9660 filesystem library. -*/ - - -#ifndef __CDIO_ISO9660_H__ -#define __CDIO_ISO9660_H__ - -#include <cdio/cdio.h> -#include <cdio/ds.h> -#include <cdio/xa.h> - -#include <time.h> - -#define _delta(from, to) ((to) - (from) + 1) - -#define MIN_TRACK_SIZE 4*75 -#define MIN_ISO_SIZE MIN_TRACK_SIZE - -/*! - An ISO filename is: "abcde.eee;1" -> <filename> '.' <ext> ';' <version #> - - For ISO-9660 Level 1, the maximum needed string length is: - -\verbatim - 30 chars (filename + ext) - + 2 chars ('.' + ';') - + 5 chars (strlen("32767")) - + 1 null byte - ================================ - = 38 chars -\endverbatim -*/ - -/*! size in bytes of the filename portion + null byte */ -#define LEN_ISONAME 31 - -/*! Max # characters in the entire ISO 9660 filename. */ -#define MAX_ISONAME 37 - -/*! Max # characters in the entire ISO 9660 filename. */ -#define MAX_ISOPATHNAME 255 - -/*! Max # characters in an perparer id. */ -#define ISO_MAX_PREPARER_ID 128 - -/*! Max # characters in an publisher id. */ -#define ISO_MAX_PUBLISHER_ID 128 - -/*! Max # characters in an application id. */ -#define ISO_MAX_APPLICATION_ID 128 - -/*! Max # characters in an system id. */ -#define ISO_MAX_SYSTEM_ID 32 - -/*! Max # characters in an volume id. */ -#define ISO_MAX_VOLUME_ID 32 - -/*! Max # characters in an volume-set id. */ -#define ISO_MAX_VOLUMESET_ID 128 - -/**! ISO 9660 directory flags. */ -#define ISO_FILE 0 /**< Not really a flag... */ -#define ISO_EXISTENCE 1 /**< Do not make existence known (hidden) */ -#define ISO_DIRECTORY 2 /**< This file is a directory */ -#define ISO_ASSOCIATED 4 /**< This file is an associated file */ -#define ISO_RECORD 8 /**< Record format in extended attr. != 0 */ -#define ISO_PROTECTION 16 /**< No read/execute perm. in ext. attr. */ -#define ISO_DRESERVED1 32 /**< Reserved bit 5 */ -#define ISO_DRESERVED2 64 /**< Reserved bit 6 */ -#define ISO_MULTIEXTENT 128 /**< Not final entry of a mult. ext. file */ - -/**! Volume descriptor types */ -#define ISO_VD_PRIMARY 1 -#define ISO_VD_SUPPLEMENTARY 2 /**< Used by Joliet */ -#define ISO_VD_END 255 - -/*! Sector of Primary Volume Descriptor */ -#define ISO_PVD_SECTOR 16 - -/*! Sector of End Volume Descriptor */ -#define ISO_EVD_SECTOR 17 - -/*! String inside track identifying an ISO 9660 filesystem. */ -#define ISO_STANDARD_ID "CD001" - - -/*! Number of bytes in an ISO 9660 block */ -#define ISO_BLOCKSIZE 2048 - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -enum strncpy_pad_check { - ISO9660_NOCHECK = 0, - ISO9660_7BIT, - ISO9660_ACHARS, - ISO9660_DCHARS -}; - -#ifndef EMPTY_ARRAY_SIZE -#define EMPTY_ARRAY_SIZE 0 -#endif - -PRAGMA_BEGIN_PACKED - -/*! - \brief ISO-9660 shorter-format time structure. - - @see iso9660_dtime - */ -struct iso9660_dtime { - uint8_t dt_year; - uint8_t dt_month; /**< Has value in range 1..12. Note starts - at 1, not 0 like a tm struct. */ - uint8_t dt_day; - uint8_t dt_hour; - uint8_t dt_minute; - uint8_t dt_second; - int8_t dt_gmtoff; /**< GMT values -48 .. + 52 in 15 minute - intervals */ -} GNUC_PACKED; - -typedef struct iso9660_dtime iso9660_dtime_t; - -/*! - \brief ISO-9660 longer-format time structure. - - @see iso9660_ltime - */ -struct iso9660_ltime { - char lt_year [_delta( 1, 4)]; /**< Add 1900 to value - for the Julian - year */ - char lt_month [_delta( 5, 6)]; /**< Has value in range - 1..12. Note starts - at 1, not 0 like a - tm struct. */ - char lt_day [_delta( 7, 8)]; - char lt_hour [_delta( 9, 10)]; - char lt_minute [_delta( 11, 12)]; - char lt_second [_delta( 13, 14)]; - char lt_hsecond [_delta( 15, 16)]; /**<! The value is in - units of 1/100's of - a second */ - int8_t lt_gmtoff [_delta( 17, 17)]; -} GNUC_PACKED; - -typedef struct iso9660_ltime iso9660_ltime_t; - -/*! \brief Format of an ISO-9660 directory record - - This structure may have an odd length depending on how many - characters there are in the filename! Some compilers (e.g. on - Sun3/mc68020) pad the structures to an even length. For this reason, - we cannot use sizeof (struct iso_path_table) or sizeof (struct - iso_directory_record) to compute on disk sizes. Instead, we use - offsetof(..., name) and add the name size. See mkisofs.h of the - cdrtools package. - - @see iso9660_stat -*/ -struct iso9660_dir { - uint8_t length; /*! 711 encoded */ - uint8_t xa_length; /*! 711 encoded */ - uint64_t extent; /*! 733 encoded */ - uint64_t size; /*! 733 encoded */ - iso9660_dtime_t recording_time; /*! 7 711-encoded units */ - uint8_t file_flags; - uint8_t file_unit_size; /*! 711 encoded */ - uint8_t interleave_gap; /*! 711 encoded */ - uint32_t volume_sequence_number; /*! 723 encoded */ - uint8_t filename_len; /*! 711 encoded */ - char filename[EMPTY_ARRAY_SIZE]; -} GNUC_PACKED; - -typedef struct iso9660_dir iso9660_dir_t; - -/*! - \brief ISO-9660 Primary Volume Descriptor. - */ -struct iso9660_pvd { - uint8_t type; /**< 711 encoded */ - char id[5]; - uint8_t version; /**< 711 encoded */ - char unused1[1]; - char system_id[ISO_MAX_SYSTEM_ID]; /**< each char is an achar */ - char volume_id[ISO_MAX_VOLUME_ID]; /**< each char is a dchar */ - char unused2[8]; - uint64_t volume_space_size; /**< 733 encoded */ - char unused3[32]; - uint32_t volume_set_size; /**< 723 encoded */ - uint32_t volume_sequence_number; /**< 723 encoded */ - uint32_t logical_block_size; /**< 723 encoded */ - uint64_t path_table_size; /**< 733 encoded */ - uint32_t type_l_path_table; /**< 731 encoded */ - uint32_t opt_type_l_path_table; /**< 731 encoded */ - uint32_t type_m_path_table; /**< 732 encoded */ - uint32_t opt_type_m_path_table; /**< 732 encoded */ - iso9660_dir_t root_directory_record; /**< See section 9.1 of - ISO 9660 spec. */ - char root_directory_filename; /**< Is \0 */ - char volume_set_id[ISO_MAX_VOLUMESET_ID]; /**< dchars */ - char publisher_id[ISO_MAX_PUBLISHER_ID]; /**< achars */ - char preparer_id[ISO_MAX_PREPARER_ID]; /**< achars */ - char application_id[ISO_MAX_APPLICATION_ID]; /**< achars */ - char copyright_file_id[37]; /**< See section 7.5 of - ISO 9660 spec. Each char is - a dchar */ - char abstract_file_id[37]; /**< See section 7.5 of - ISO 9660 spec. Each char is - a dchar */ - char bibliographic_file_id[37]; /**< See section 7.5 of - ISO 9660 spec. Each char is - a dchar. */ - iso9660_ltime_t creation_date; /**< See section 8.4.26.1 of - ISO 9660 spec. */ - iso9660_ltime_t modification_date; /**< See section 8.4.26.1 of - ISO 9660 spec. */ - iso9660_ltime_t expiration_date; /**< See section 8.4.26.1 of - ISO 9660 spec. */ - iso9660_ltime_t effective_date; /**< See section 8.4.26.1 of - ISO 9660 spec. */ - uint8_t file_structure_version; /**< 711 encoded */ - char unused4[1]; - char application_data[512]; - char unused5[653]; -} GNUC_PACKED; - -typedef struct iso9660_pvd iso9660_pvd_t; - -/*! - \brief ISO-9660 Supplementary Volume Descriptor. - - This is used for Joliet Extentions and is almost the same as the - the primary descriptor but two unused fields, "unused1" and "unused3 - become "flags and "escape_sequences" respectively. -*/ -struct iso9660_svd { - uint8_t type; /**< 711 encoded */ - char id[5]; - uint8_t version; /**< 711 encoded */ - char flags; /**< 853 */ - char system_id[ISO_MAX_SYSTEM_ID]; /**< each char is an achar */ - char volume_id[ISO_MAX_VOLUME_ID]; /**< each char is a dchar */ - char unused2[8]; - uint64_t volume_space_size; /**< 733 encoded */ - char escape_sequences[32]; /**< 856 */ - uint32_t volume_set_size; /**< 723 encoded */ - uint32_t volume_sequence_number; /**< 723 encoded */ - uint32_t logical_block_size; /**< 723 encoded */ - uint64_t path_table_size; /**< 733 encoded */ - uint32_t type_l_path_table; /**< 731 encoded */ - uint32_t opt_type_l_path_table; /**< 731 encoded */ - uint32_t type_m_path_table; /**< 732 encoded */ - uint32_t opt_type_m_path_table; /**< 732 encoded */ - iso9660_dir_t root_directory_record; /**< See section 9.1 of - ISO 9660 spec. */ - char volume_set_id[ISO_MAX_VOLUMESET_ID]; /**< dchars */ - char publisher_id[ISO_MAX_PUBLISHER_ID]; /**< achars */ - char preparer_id[ISO_MAX_PREPARER_ID]; /**< achars */ - char application_id[ISO_MAX_APPLICATION_ID]; /**< achars */ - char copyright_file_id[37]; /**< See section 7.5 of - ISO 9660 spec. Each char is - a dchar */ - char abstract_file_id[37]; /**< See section 7.5 of - ISO 9660 spec. Each char is - a dchar */ - char bibliographic_file_id[37]; /**< See section 7.5 of - ISO 9660 spec. Each char is - a dchar. */ - iso9660_ltime_t creation_date; /**< See section 8.4.26.1 of - ISO 9660 spec. */ - iso9660_ltime_t modification_date; /**< See section 8.4.26.1 of - ISO 9660 spec. */ - iso9660_ltime_t expiration_date; /**< See section 8.4.26.1 of - ISO 9660 spec. */ - iso9660_ltime_t effective_date; /**< See section 8.4.26.1 of - ISO 9660 spec. */ - uint8_t file_structure_version; /**< 711 encoded */ - char unused4[1]; - char application_data[512]; - char unused5[653]; -} GNUC_PACKED; - -typedef struct iso9660_svd iso9660_svd_t; - -PRAGMA_END_PACKED - -/*! \brief Unix stat-like version of iso9660_dir - - The iso9660_stat structure is not part of the ISO-9660 - specification. We use it for our to communicate information - in a C-library friendly way, e.g struct tm time structures and - a C-style filename string. - - @see iso9660_dir -*/ -struct iso9660_stat { /* big endian!! */ - struct tm tm; /**< time on entry */ - lsn_t lsn; /**< start logical sector number */ - uint32_t size; /**< total size in bytes */ - uint32_t secsize; /**< number of sectors allocated */ - iso9660_xa_t xa; /**< XA attributes */ - enum { _STAT_FILE = 1, _STAT_DIR = 2 } type; - char filename[EMPTY_ARRAY_SIZE]; /**< filename */ -}; - -typedef struct iso9660_stat iso9660_stat_t; - - -/** A mask used in iso9660_ifs_read_vd which allows what kinds - of extensions we allow, eg. Joliet, Rock Ridge, etc. */ -typedef uint8_t iso_extension_mask_t; - -#define ISO_EXTENSION_JOLIET_LEVEL1 0x01 -#define ISO_EXTENSION_JOLIET_LEVEL2 0x02 -#define ISO_EXTENSION_JOLIET_LEVEL3 0x04 -#define ISO_EXTENSION_ROCK_RIDGE 0x08 -#define ISO_EXTENSION_HIGH_SIERRA 0x10 - -#define ISO_EXTENSION_ALL 0xFF -#define ISO_EXTENSION_NONE 0x00 -#define ISO_EXTENSION_JOLIET \ - (ISO_EXTENSION_JOLIET_LEVEL1 | \ - ISO_EXTENSION_JOLIET_LEVEL2 | \ - ISO_EXTENSION_JOLIET_LEVEL3 ) - - -/** This is an opaque structure. */ -typedef struct _iso9660 iso9660_t; - -/*! - Open an ISO 9660 image for reading. Maybe in the future we will have - a mode. NULL is returned on error. -*/ - iso9660_t *iso9660_open (const char *psz_pathname /*flags, mode */); - -/*! - Open an ISO 9660 image for reading allowing various ISO 9660 - extensions. Maybe in the future we will have a mode. NULL is - returned on error. -*/ - iso9660_t *iso9660_open_ext (const char *psz_pathname, - iso_extension_mask_t iso_extension_mask); - -/*! - Close previously opened ISO 9660 image. - True is unconditionally returned. If there was an error false would - be returned. -*/ - bool iso9660_close (iso9660_t * p_iso); - - -/*! - Seek to a position and then read n bytes. Size read is returned. -*/ - long int iso9660_iso_seek_read (const iso9660_t *p_iso, void *ptr, - lsn_t start, long int i_size); - -/*! - Read the Primary Volume Descriptor for a CD. - True is returned if read, and false if there was an error. -*/ - bool iso9660_fs_read_pvd ( const CdIo *p_cdio, - /*out*/ iso9660_pvd_t *p_pvd ); - -/*! - Read the Primary Volume Descriptor for an ISO 9660 image. - True is returned if read, and false if there was an error. -*/ - bool iso9660_ifs_read_pvd (const iso9660_t *p_iso, - /*out*/ iso9660_pvd_t *p_pvd); - -/*! - Read the Super block of an ISO 9660 image. This is the - Primary Volume Descriptor (PVD) and perhaps a Supplemental Volume - Descriptor if (Joliet) extensions are acceptable. -*/ - bool iso9660_fs_read_superblock (CdIo *p_cdio, - iso_extension_mask_t iso_extension_mask); - -/*! - Read the Supper block of an ISO 9660 image. This is the - Primary Volume Descriptor (PVD) and perhaps a Supplemental Volume - Descriptor if (Joliet) extensions are acceptable. -*/ - bool iso9660_ifs_read_superblock (iso9660_t *p_iso, - iso_extension_mask_t iso_extension_mask); - - -/*==================================================== - Time conversion - ====================================================*/ -/*! - Set time in format used in ISO 9660 directory index record - from a Unix time structure. */ - void iso9660_set_dtime (const struct tm *tm, - /*out*/ iso9660_dtime_t *idr_date); - - -/*! - Set "long" time in format used in ISO 9660 primary volume descriptor - from a Unix time structure. */ - void iso9660_set_ltime (const struct tm *_tm, - /*out*/ iso9660_ltime_t *p_pvd_date); - -/*! - Get Unix time structure from format use in an ISO 9660 directory index - record. Even though tm_wday and tm_yday fields are not explicitly in - idr_date, they are calculated from the other fields. - - If tm is to reflect the localtime, set "use_localtime" true, otherwise - tm will reported in GMT. -*/ - void iso9660_get_dtime (const iso9660_dtime_t *idr_date, bool use_localtime, - /*out*/ struct tm *tm); - - -/*==================================================== - Characters used in file and directory and manipulation - ====================================================*/ -/*! - Return true if c is a DCHAR - a character that can appear in an an - ISO-9600 level 1 directory name. These are the ASCII capital - letters A-Z, the digits 0-9 and an underscore. -*/ -bool iso9660_isdchar (int c); - -/*! - Return true if c is an ACHAR - - These are the DCHAR's plus some ASCII symbols including the space - symbol. -*/ -bool iso9660_isachar (int c); - -/*! - Convert ISO-9660 file name that stored in a directory entry into - what's usually listed as the file name in a listing. - Lowercase name, and remove trailing ;1's or .;1's and - turn the other ;'s into version numbers. - - The length of the translated string is returned. -*/ -int iso9660_name_translate(const char *psz_oldname, char *psz_newname); - -/*! - Convert ISO-9660 file name that stored in a directory entry into - what's usually listed as the file name in a listing. Lowercase - name if not using Joliet extension. Remove trailing ;1's or .;1's and - turn the other ;'s into version numbers. - - The length of the translated string is returned. -*/ -int iso9660_name_translate_ext(const char *old, char *new, - uint8_t i_joliet_level); - -/*! - Pad string src with spaces to size len and copy this to dst. If - len is less than the length of src, dst will be truncated to the - first len characters of src. - - src can also be scanned to see if it contains only ACHARs, DCHARs, - 7-bit ASCII chars depending on the enumeration _check. - - In addition to getting changed, dst is the return value. - Note: this string might not be NULL terminated. - */ -char *iso9660_strncpy_pad(char dst[], const char src[], size_t len, - enum strncpy_pad_check _check); - -/*===================================================================== - file/dirname's -======================================================================*/ - -/*! - Check that pathname is a valid ISO-9660 directory name. - - A valid directory name should not start out with a slash (/), - dot (.) or null byte, should be less than 37 characters long, - have no more than 8 characters in a directory component - which is separated by a /, and consist of only DCHARs. - - True is returned if pathname is valid. - */ -bool iso9660_dirname_valid_p (const char pathname[]); - -/*! - Take pathname and a version number and turn that into a ISO-9660 - pathname. (That's just the pathname followd by ";" and the version - number. For example, mydir/file.ext -> MYDIR/FILE.EXT;1 for version - 1. The resulting ISO-9660 pathname is returned. -*/ -char *iso9660_pathname_isofy (const char pathname[], uint16_t i_version); - -/*! - Check that pathname is a valid ISO-9660 pathname. - - A valid pathname contains a valid directory name, if one appears and - the filename portion should be no more than 8 characters for the - file prefix and 3 characters in the extension (or portion after a - dot). There should be exactly one dot somewhere in the filename - portion and the filename should be composed of only DCHARs. - - True is returned if pathname is valid. - */ -bool iso9660_pathname_valid_p (const char pathname[]); - -/*===================================================================== - directory tree -======================================================================*/ - -void -iso9660_dir_init_new (void *dir, uint32_t self, uint32_t ssize, - uint32_t parent, uint32_t psize, - const time_t *dir_time); - -void -iso9660_dir_init_new_su (void *dir, uint32_t self, uint32_t ssize, - const void *ssu_data, unsigned int ssu_size, - uint32_t parent, uint32_t psize, - const void *psu_data, unsigned int psu_size, - const time_t *dir_time); - -void -iso9660_dir_add_entry_su (void *dir, const char filename[], uint32_t extent, - uint32_t size, uint8_t file_flags, - const void *su_data, - unsigned int su_size, const time_t *entry_time); - -unsigned int -iso9660_dir_calc_record_size (unsigned int namelen, unsigned int su_len); - -/*! - Given a directory pointer, find the filesystem entry that contains - lsn and return information about it. - - Returns stat_t of entry if we found lsn, or NULL otherwise. - */ -iso9660_stat_t *iso9660_find_fs_lsn(CdIo *p_cdio, lsn_t i_lsn); - - -/*! - Given a directory pointer, find the filesystem entry that contains - lsn and return information about it. - - Returns stat_t of entry if we found lsn, or NULL otherwise. - */ -iso9660_stat_t *iso9660_find_ifs_lsn(const iso9660_t *p_iso, lsn_t i_lsn); - - -/*! - Get file status for pathname into stat. NULL is returned on error. - */ -iso9660_stat_t *iso9660_fs_stat (CdIo *p_cdio, const char pathname[]); - - -/*! - Get file status for pathname into stat. NULL is returned on error. - pathname version numbers in the ISO 9660 - name are dropped, i.e. ;1 is removed and if level 1 ISO-9660 names - are lowercased. - */ -iso9660_stat_t *iso9660_fs_stat_translate (CdIo *p_cdio, - const char pathname[], - bool b_mode2); - -/*! - Get file status for pathname into stat. NULL is returned on error. - */ -iso9660_stat_t *iso9660_ifs_stat (iso9660_t *p_iso, const char pathname[]); - - -/*! - Get file status for pathname into stat. NULL is returned on error. - pathname version numbers in the ISO 9660 - name are dropped, i.e. ;1 is removed and if level 1 ISO-9660 names - are lowercased. - */ -iso9660_stat_t *iso9660_ifs_stat_translate (iso9660_t *p_iso, - const char pathname[]); - -/*! - Read pathname (a directory) and return a list of iso9660_stat_t - of the files inside that. The caller must free the returned result. -*/ -CdioList * iso9660_fs_readdir (CdIo *p_cdio, const char pathname[], - bool b_mode2); - -/*! - Read pathname (a directory) and return a list of iso9660_stat_t - of the files inside that. The caller must free the returned result. -*/ -CdioList * iso9660_ifs_readdir (iso9660_t *p_iso, const char pathname[]); - -/*! - Return the PVD's application ID. - NULL is returned if there is some problem in getting this. -*/ -char * iso9660_get_application_id(iso9660_pvd_t *p_pvd); - -/*! - Get the application ID. psz_app_id is set to NULL if there - is some problem in getting this and false is returned. -*/ -bool iso9660_ifs_get_application_id(iso9660_t *p_iso, - /*out*/ char **p_psz_app_id); - -/*! - Return the Joliet level recognized for p_iso. -*/ -uint8_t iso9660_ifs_get_joliet_level(iso9660_t *p_iso); - -uint8_t iso9660_get_dir_len(const iso9660_dir_t *p_idr); - -#if FIXME -uint8_t iso9660_get_dir_size(const iso9660_dir_t *p_idr); - -lsn_t iso9660_get_dir_extent(const iso9660_dir_t *p_idr); -#endif - -/*! - Return the directory name stored in the iso9660_dir_t - - A string is allocated: the caller must deallocate. -*/ -char * iso9660_dir_to_name (const iso9660_dir_t *p_iso9660_dir); - -/*! - Return a string containing the preparer id with trailing - blanks removed. -*/ -char *iso9660_get_preparer_id(const iso9660_pvd_t *p_pvd); - -/*! - Get the preparer ID. psz_preparer_id is set to NULL if there - is some problem in getting this and false is returned. -*/ -bool iso9660_ifs_get_preparer_id(iso9660_t *p_iso, - /*out*/ char **p_psz_preparer_id); - -/*! - Return a string containing the PVD's publisher id with trailing - blanks removed. -*/ -char *iso9660_get_publisher_id(const iso9660_pvd_t *p_pvd); - -/*! - Get the publisher ID. psz_publisher_id is set to NULL if there - is some problem in getting this and false is returned. -*/ -bool iso9660_ifs_get_publisher_id(iso9660_t *p_iso, - /*out*/ char **p_psz_publisher_id); - -uint8_t iso9660_get_pvd_type(const iso9660_pvd_t *p_pvd); - -const char * iso9660_get_pvd_id(const iso9660_pvd_t *p_pvd); - -int iso9660_get_pvd_space_size(const iso9660_pvd_t *p_pvd); - -int iso9660_get_pvd_block_size(const iso9660_pvd_t *p_pvd) ; - -/*! Return the primary volume id version number (of pvd). - If there is an error 0 is returned. - */ -int iso9660_get_pvd_version(const iso9660_pvd_t *pvd) ; - -/*! - Return a string containing the PVD's system id with trailing - blanks removed. -*/ -char *iso9660_get_system_id(const iso9660_pvd_t *p_pvd); - -/*! - Get the system ID. psz_system_id is set to NULL if there - is some problem in getting this and false is returned. -*/ -bool iso9660_ifs_get_system_id(iso9660_t *p_iso, - /*out*/ char **p_psz_system_id); - - -/*! Return the LSN of the root directory for pvd. - If there is an error CDIO_INVALID_LSN is returned. - */ -lsn_t iso9660_get_root_lsn(const iso9660_pvd_t *p_pvd); - -/*! - Return the PVD's volume ID. -*/ -char *iso9660_get_volume_id(const iso9660_pvd_t *p_pvd); - -/*! - Get the system ID. psz_system_id is set to NULL if there - is some problem in getting this and false is returned. -*/ -bool iso9660_ifs_get_volume_id(iso9660_t *p_iso, - /*out*/ char **p_psz_volume_id); - -/*! - Return the PVD's volumeset ID. - NULL is returned if there is some problem in getting this. -*/ -char *iso9660_get_volumeset_id(const iso9660_pvd_t *p_pvd); - -/*! - Get the systemset ID. psz_systemset_id is set to NULL if there - is some problem in getting this and false is returned. -*/ -bool iso9660_ifs_get_volumeset_id(iso9660_t *p_iso, - /*out*/ char **p_psz_volumeset_id); - -/* pathtable */ - -/*! Zero's out pathable. Do this first. */ -void iso9660_pathtable_init (void *pt); - -unsigned int iso9660_pathtable_get_size (const void *pt); - -uint16_t -iso9660_pathtable_l_add_entry (void *pt, const char name[], uint32_t extent, - uint16_t parent); - -uint16_t -iso9660_pathtable_m_add_entry (void *pt, const char name[], uint32_t extent, - uint16_t parent); - -/*===================================================================== - Volume Descriptors -======================================================================*/ - -void -iso9660_set_pvd (void *pd, const char volume_id[], const char application_id[], - const char publisher_id[], const char preparer_id[], - uint32_t iso_size, const void *root_dir, - uint32_t path_table_l_extent, uint32_t path_table_m_extent, - uint32_t path_table_size, const time_t *pvd_time); - -void -iso9660_set_evd (void *pd); - -/*! - Return true if ISO 9660 image has extended attrributes (XA). -*/ -bool iso9660_ifs_is_xa (const iso9660_t * p_iso); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __CDIO_ISO9660_H__ */ - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/cdio/logging.h b/src/input/vcd/libcdio/cdio/logging.h deleted file mode 100644 index 8c78259ea..000000000 --- a/src/input/vcd/libcdio/cdio/logging.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - $Id: logging.h,v 1.3 2005/01/01 02:43:58 rockyb Exp $ - - Copyright (C) 2000, Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/** \file logging.h - * \brief Header to control logging and level of detail of output. - * - */ - -#ifndef __LOGGING_H__ -#define __LOGGING_H__ - -#include <cdio/types.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * The different log levels supported. - */ -typedef enum { - CDIO_LOG_DEBUG = 1, /**< Debug-level messages - helps debug what's up. */ - CDIO_LOG_INFO, /**< Informational - indicates perhaps something of - interest. */ - CDIO_LOG_WARN, /**< Warning conditions - something that looks funny. */ - CDIO_LOG_ERROR, /**< Error conditions - may terminate program. */ - CDIO_LOG_ASSERT /**< Critical conditions - may abort program. */ -} cdio_log_level_t; - -/** - * The place to save the preference concerning how much verbosity - * is desired. This is used by the internal default log handler, but - * it could be use by applications which provide their own log handler. - */ -extern cdio_log_level_t cdio_loglevel_default; - -/** - * This type defines the signature of a log handler. For every - * message being logged, the handler will receive the log level and - * the message string. - * - * @see cdio_log_set_handler - * @see cdio_log_level_t - * - * @param level The log level. - * @param message The log message. - */ -typedef void (*cdio_log_handler_t) (cdio_log_level_t level, - const char message[]); - -/** - * Set a custom log handler for libcdio. The return value is the log - * handler being replaced. If the provided parameter is NULL, then - * the handler will be reset to the default handler. - * - * @see cdio_log_handler_t - * - * @param new_handler The new log handler. - * @return The previous log handler. - */ -cdio_log_handler_t cdio_log_set_handler (cdio_log_handler_t new_handler); - -/** - * Handle an message with the given log level. - * - * @see cdio_debug - * @see cdio_info - * @see cdio_warn - * @see cdio_error - - * @param level The log level. - * @param format printf-style format string - * @param ... remaining arguments needed by format string - */ -void cdio_log (cdio_log_level_t level, - const char format[], ...) GNUC_PRINTF(2, 3); - -/** - * Handle a debugging message. - * - * @see cdio_log for a more generic routine - */ -void cdio_debug (const char format[], ...) GNUC_PRINTF(1,2); - -/** - * Handle an informative message. - * - * @see cdio_log for a more generic routine - */ -void cdio_info (const char format[], ...) GNUC_PRINTF(1,2); - -/** - * Handle a warning message. - * - * @see cdio_log for a more generic routine - */ -void cdio_warn (const char format[], ...) GNUC_PRINTF(1,2); - -/** - * Handle an error message. Execution is terminated. - * - * @see cdio_log for a more generic routine. - */ -void cdio_error (const char format[], ...) GNUC_PRINTF(1,2); - -#ifdef __cplusplus -} -#endif - -#endif /* __LOGGING_H__ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/cdio/scsi_mmc.h b/src/input/vcd/libcdio/cdio/scsi_mmc.h deleted file mode 100644 index 12860247e..000000000 --- a/src/input/vcd/libcdio/cdio/scsi_mmc.h +++ /dev/null @@ -1,415 +0,0 @@ -/* - $Id: scsi_mmc.h,v 1.1 2005/01/01 02:43:58 rockyb Exp $ - - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/*! - \file scsi_mmc.h - \brief Common definitions for SCSI MMC (Multi-Media Commands). -*/ - -#ifndef __SCSI_MMC_H__ -#define __SCSI_MMC_H__ - -#include <cdio/cdio.h> -#include <cdio/types.h> -#include <cdio/dvd.h> - -/*! The generic packet command opcodes for CD/DVD Logical Units. */ - -#define CDIO_MMC_GPCMD_INQUIRY 0x12 -#define CDIO_MMC_GPCMD_MODE_SELECT_6 0x15 -#define CDIO_MMC_GPCMD_MODE_SENSE 0x1a -#define CDIO_MMC_GPCMD_START_STOP 0x1b -#define CDIO_MMC_GPCMD_ALLOW_MEDIUM_REMOVAL 0x1e -#define CDIO_MMC_GPCMD_READ_10 0x28 - -/*! - Group 2 Commands - */ -#define CDIO_MMC_GPCMD_READ_SUBCHANNEL 0x42 -#define CDIO_MMC_GPCMD_READ_TOC 0x43 -#define CDIO_MMC_GPCMD_READ_HEADER 0x44 -#define CDIO_MMC_GPCMD_PLAY_AUDIO_10 0x45 -#define CDIO_MMC_GPCMD_GET_CONFIGURATION 0x46 -#define CDIO_MMC_GPCMD_PLAY_AUDIO_MSF 0x47 -#define CDIO_MMC_GPCMD_PLAY_AUDIO_TI 0x48 -#define CDIO_MMC_GPCMD_PLAY_TRACK_REL_10 0x49 -#define CDIO_MMC_GPCMD_PAUSE_RESUME 0x4b - -#define CDIO_MMC_GPCMD_READ_DISC_INFO 0x51 -#define CDIO_MMC_GPCMD_MODE_SELECT 0x55 -#define CDIO_MMC_GPCMD_MODE_SENSE_10 0x5a - -/*! - Group 5 Commands - */ -#define CDIO_MMC_GPCMD_PLAY_AUDIO_12 0xa5 -#define CDIO_MMC_GPCMD_READ_12 0xa8 -#define CDIO_MMC_GPCMD_PLAY_TRACK_REL_12 0xa9 -#define CDIO_MMC_GPCMD_READ_DVD_STRUCTURE 0xad -#define CDIO_MMC_GPCMD_READ_CD 0xbe -#define CDIO_MMC_GPCMD_READ_MSF 0xb9 - -/*! - Group 6 Commands - */ - -#define CDIO_MMC_GPCMD_CD_PLAYBACK_STATUS 0xc4 /**< SONY unique command */ -#define CDIO_MMC_GPCMD_PLAYBACK_CONTROL 0xc9 /**< SONY unique command */ -#define CDIO_MMC_GPCMD_READ_CDDA 0xd8 /**< Vendor unique command */ -#define CDIO_MMC_GPCMD_READ_CDXA 0xdb /**< Vendor unique command */ -#define CDIO_MMC_GPCMD_READ_ALL_SUBCODES 0xdf /**< Vendor unique command */ - - - -/*! Level values that can go into READ_CD */ -#define CDIO_MMC_READ_TYPE_ANY 0 /**< All types */ -#define CDIO_MMC_READ_TYPE_CDDA 1 /**< Only CD-DA sectors */ -#define CDIO_MMC_READ_TYPE_MODE1 2 /**< mode1 sectors (user data = 2048) */ -#define CDIO_MMC_READ_TYPE_MODE2 3 /**< mode2 sectors form1 or form2 */ -#define CDIO_MMC_READ_TYPE_M2F1 4 /**< mode2 sectors form1 */ -#define CDIO_MMC_READ_TYPE_M2F2 5 /**< mode2 sectors form2 */ - -/*! Format values for READ_TOC */ -#define CDIO_MMC_READTOC_FMT_TOC 0 -#define CDIO_MMC_READTOC_FMT_SESSION 1 -#define CDIO_MMC_READTOC_FMT_FULTOC 2 -#define CDIO_MMC_READTOC_FMT_PMA 3 /**< Q subcode data */ -#define CDIO_MMC_READTOC_FMT_ATIP 4 /**< includes media type */ -#define CDIO_MMC_READTOC_FMT_CDTEXT 5 /**< CD-TEXT info */ - -/*! Page codes for MODE SENSE and MODE SET. */ -#define CDIO_MMC_R_W_ERROR_PAGE 0x01 -#define CDIO_MMC_WRITE_PARMS_PAGE 0x05 -#define CDIO_MMC_AUDIO_CTL_PAGE 0x0e -#define CDIO_MMC_CDR_PARMS_PAGE 0x0d -#define CDIO_MMC_POWER_PAGE 0x1a -#define CDIO_MMC_FAULT_FAIL_PAGE 0x1c -#define CDIO_MMC_TO_PROTECT_PAGE 0x1d -#define CDIO_MMC_CAPABILITIES_PAGE 0x2a -#define CDIO_MMC_ALL_PAGES 0x3f - -/*! Return type codes for GET_CONFIGURATION. */ -#define CDIO_MMC_GET_CONF_ALL_FEATURES 0 /**< all features without regard - to currency. */ -#define CDIO_MMC_GET_CONF_CURRENT_FEATURES 1 /**< features which are currently - in effect (e.g. based on - medium inserted). */ -#define CDIO_MMC_GET_CONF_NAMED_FEATURE 2 /**< just the feature named in - the GET_CONFIGURATION - cdb. */ - -/*! FEATURE codes used in GET CONFIGURATION. */ - -#define CDIO_MMC_FEATURE_PROFILE_LIST 0x000 /**< Profile List Feature */ -#define CDIO_MMC_FEATURE_CORE 0x001 -#define CDIO_MMC_FEATURE_REMOVABLE_MEDIUM 0x002 /**< Removable Medium - Feature */ -#define CDIO_MMC_FEATURE_WRITE_PROTECT 0x003 /**< Write Protect - Feature */ -#define CDIO_MMC_FEATURE_RANDOM_READABLE 0x010 /**< Random Readable - Feature */ -#define CDIO_MMC_FEATURE_MULTI_READ 0x01D /**< Multi-Read - Feature */ -#define CDIO_MMC_FEATURE_CD_READ 0x01E /**< CD Read - Feature */ -#define CDIO_MMC_FEATURE_DVD_READ 0x01F /**< DVD Read - Feature */ -#define CDIO_MMC_FEATURE_RANDOM_WRITABLE 0x020 /**< Random Writable - Feature */ -#define CDIO_MMC_FEATURE_INCR_WRITE 0x021 /**< Incremental - Streaming Writable - Feature */ -#define CDIO_MMC_FEATURE_SECTOR_ERASE 0x022 /**< Sector Erasable - Feature */ -#define CDIO_MMC_FEATURE_FORMATABLE 0x023 /**< Formattable - Feature */ -#define CDIO_MMC_FEATURE_DEFECT_MGMT 0x024 /**< Management - Ability of the - Logical Unit/media - system to provide - an apparently - defect-free - space.*/ -#define CDIO_MMC_FEATURE_WRITE_ONCE 0x025 /**< Write Once - Feature */ -#define CDIO_MMC_FEATURE_RESTRICT_OVERW 0x026 /**< Restricted - Overwrite - Feature */ -#define CDIO_MMC_FEATURE_CD_RW_CAV 0x027 /**< CD-RW CAV Write - Feature */ -#define CDIO_MMC_FEATURE_MRW 0x028 /**< MRW Feature */ -#define CDIO_MMC_FEATURE_DVD_PRW 0x02A /**< DVD+RW Feature */ -#define CDIO_MMC_FEATURE_DVD_PR 0x02B /**< DVD+R Feature */ -#define CDIO_MMC_FEATURE_CD_TAO 0x02D -#define CDIO_MMC_FEATURE_CD_SAO 0x02E -#define CDIO_MMC_FEATURE_POWER_MGMT 0x100 /**< Initiator and - device directed - power management */ -#define CDIO_MMC_FEATURE_CDDA_EXT_PLAY 0x103 /**< Ability to play - audio CDs via the - Logical Unit s own - analog output */ -#define CDIO_MMC_FEATURE_MCODE_UPGRADE 0x104 /* Ability for the - device to accept - new microcode via - the interface */ -#define CDIO_MMC_FEATURE_TIME_OUT 0x105 /**< Ability to - respond to all - commands within a - specific time */ -#define CDIO_MMC_FEATURE_DVD_CSS 0x106 /**< Ability to - perform DVD - CSS/CPPM - authentication and - RPC */ -#define CDIO_MMC_FEATURE_RT_STREAMING 0x107 /**< Ability to read - and write using - Initiator requested - performance - parameters - */ -#define CDIO_MMC_FEATURE_LU_SN 0x108 /**< The Logical Unit - has a unique - identifier. */ -#define CDIO_MMC_FEATURE_FIRMWARE_DATE 0x1FF /**< Firmware creation - date report */ - -/*! Profile codes used in GET_CONFIGURATION - PROFILE LIST. */ -#define CDIO_MMC_FEATURE_PROF_NON_REMOVABLE 0x0001 /**< Re-writable - disk, capable of - changing - behavior */ -#define CDIO_MMC_FEATURE_PROF_REMOVABLE 0x0002 /**< disk - Re-writable; - with removable - media */ -#define CDIO_MMC_FEATURE_PROF_MO_ERASABLE 0x0003 /**< Erasable - Magneto-Optical - disk with sector - erase - capability */ -#define CDIO_MMC_FEATURE_PROF_MO_WRITE_ONCE 0x0004 /**< Write Once - Magneto-Optical - write once */ -#define CDIO_MMC_FEATURE_PROF_AS_MO 0x0005 /**< Advance - Storage - Magneto-Optical */ -#define CDIO_MMC_FEATURE_PROF_CD_ROM 0x0008 /**< Read only - Compact Disc - capable */ -#define CDIO_MMC_FEATURE_PROF_CD_R 0x0009 /**< Write once - Compact Disc - capable */ -#define CDIO_MMC_FEATURE_PROF_CD_RW 0x000A /**< CD-RW - Re-writable - Compact Disc - capable */ -#define CDIO_MMC_FEATURE_PROF_DVD_ROM 0x0010 /**< Read only - DVD */ -#define CDIO_MMC_FEATURE_PROF_DVD_R_SEQ 0x0011 /**< Re-recordable - DVD using - Sequential - recording */ -#define CDIO_MMC_FEATURE_PROF_DVD_RAM 0x0012 /**< Re-writable - DVD */ -#define CDIO_MMC_FEATURE_PROF_DVD_RW_RO 0x0013 /**< Re-recordable - DVD using - Restricted - Overwrite */ -#define CDIO_MMC_FEATURE_PROF_DVD_RW_SEQ 0x0014 /**< Re-recordable - DVD using - Sequential - recording */ -#define CDIO_MMC_FEATURE_PROF_DVD_PRW 0x001A /**< DVD+RW - DVD - ReWritable */ -#define CDIO_MMC_FEATURE_PROF_DVD_PR 0x001B /**< DVD+R - DVD - Recordable */ -#define CDIO_MMC_FEATURE_PROF_DDCD_ROM 0x0020 /**< Read only - DDCD */ -#define CDIO_MMC_FEATURE_PROF_DDCD_R 0x0021 /**< DDCD-R Write - only DDCD */ -#define CDIO_MMC_FEATURE_PROF_DDCD_RW 0x0022 /**< Re-Write only - DDCD */ -#define CDIO_MMC_FEATURE_PROF_NON_CONFORM 0xFFFF /**< The Logical - Unit does not - conform to any - Profile. */ - -/*! This is listed as optional in ATAPI 2.6, but is (curiously) - missing from Mt. Fuji, Table 57. It _is_ mentioned in Mt. Fuji - Table 377 as an MMC command for SCSi devices though... Most ATAPI - drives support it. */ -#define CDIO_MMC_GPCMD_SET_SPEED 0xbb - - -/*! The largest Command Descriptor Buffer (CDB) size. - The possible sizes are 6, 10, and 12 bytes. - */ -#define MAX_CDB_LEN 12 - -/*! \brief A Command Descriptor Buffer (CDB) used in sending SCSI MMC - commands. - */ -typedef struct scsi_mmc_cdb { - uint8_t field[MAX_CDB_LEN]; -} scsi_mmc_cdb_t; - -/*! \brief Format of header block in data returned from a SCSI-MMC - GET_CONFIGURATION command. - */ -typedef struct scsi_mmc_feature_list_header { - unsigned char length_msb; - unsigned char length_1sb; - unsigned char length_2sb; - unsigned char length_lsb; - unsigned char reserved1; - unsigned char reserved2; - unsigned char profile_msb; - unsigned char profile_lsb; -} scs_mmc_feature_list_header_t; - -/*! An enumeration indicating whether a SCSI MMC command is sending - data or getting data. - */ -typedef enum scsi_mmc_direction { - SCSI_MMC_DATA_READ, - SCSI_MMC_DATA_WRITE -} scsi_mmc_direction_t; - -#define CDIO_MMC_SET_COMMAND(cdb, command) \ - cdb[0] = command - -#define CDIO_MMC_SET_READ_TYPE(cdb, sector_type) \ - cdb[1] = (sector_type << 2) - -#define CDIO_MMC_GET_LEN16(p) \ - (p[0]<<8) + p[1] - -#define CDIO_MMC_GET_LEN32(p) \ - (p[0] << 24) + (p[1] << 16) + (p[2] << 8) + p[3]; - -#define CDIO_MMC_SET_LEN16(cdb, pos, len) \ - cdb[pos ] = (len >> 8) & 0xff; \ - cdb[pos+1] = (len ) & 0xff - -#define CDIO_MMC_SET_READ_LBA(cdb, lba) \ - cdb[2] = (lba >> 24) & 0xff; \ - cdb[3] = (lba >> 16) & 0xff; \ - cdb[4] = (lba >> 8) & 0xff; \ - cdb[5] = (lba ) & 0xff - -#define CDIO_MMC_SET_START_TRACK(cdb, command) \ - cdb[6] = command - -#define CDIO_MMC_SET_READ_LENGTH24(cdb, len) \ - cdb[6] = (len >> 16) & 0xff; \ - cdb[7] = (len >> 8) & 0xff; \ - cdb[8] = (len ) & 0xff - -#define CDIO_MMC_SET_READ_LENGTH16(cdb, len) \ - CDIO_MMC_SET_LEN16(cdb, 7, len) - -#define CDIO_MMC_SET_READ_LENGTH8(cdb, len) \ - cdb[8] = (len ) & 0xff - -#define CDIO_MMC_MCSB_ALL_HEADERS 0x78 - -#define CDIO_MMC_SET_MAIN_CHANNEL_SELECTION_BITS(cdb, val) \ - cdb[9] = val; - -/*! - Return the number of length in bytes of the Command Descriptor - buffer (CDB) for a given SCSI MMC command. The length will be - either 6, 10, or 12. -*/ -uint8_t scsi_mmc_get_cmd_len(uint8_t scsi_cmd); - - -/*! - Run a SCSI MMC command. - - cdio CD structure set by cdio_open(). - i_timeout_ms time in milliseconds we will wait for the command - to complete. - p_cdb CDB bytes. All values that are needed should be set on - input. We'll figure out what the right CDB length should be. - e_direction direction the transfer is to go. - i_buf Size of buffer - p_buf Buffer for data, both sending and receiving. - - Returns 0 if command completed successfully. - */ -int scsi_mmc_run_cmd( const CdIo *p_cdio, unsigned int i_timeout_ms, - const scsi_mmc_cdb_t *p_cdb, - scsi_mmc_direction_t e_direction, unsigned int i_buf, - /*in/out*/ void *p_buf ); - -/*! - * Eject using SCSI MMC commands. Return 0 if successful. - */ -int scsi_mmc_eject_media( const CdIo *p_cdio); - -/*! Packet driver to read mode2 sectors. - Can read only up to 25 blocks. -*/ -int scsi_mmc_read_sectors ( const CdIo *p_cdio, void *p_buf, lba_t lba, - int sector_type, unsigned int nblocks); - -/*! - Set the block size for subsequest read requests, via a SCSI MMC - MODE_SELECT 6 command. - */ -int scsi_mmc_set_blocksize ( const CdIo *p_cdio, unsigned int bsize); - -/*! - Return the the kind of drive capabilities of device. - */ -void scsi_mmc_get_drive_cap (const CdIo *p_cdio, - /*out*/ cdio_drive_read_cap_t *p_read_cap, - /*out*/ cdio_drive_write_cap_t *p_write_cap, - /*out*/ cdio_drive_misc_cap_t *p_misc_cap); - -/*! - Get the DVD type associated with cd object. -*/ -discmode_t scsi_mmc_get_dvd_struct_physical ( const CdIo *p_cdio, - cdio_dvd_struct_t *s); - -/*! - Get the CD-ROM hardware info via a SCSI MMC INQUIRY command. - False is returned if we had an error getting the information. -*/ -bool scsi_mmc_get_hwinfo ( const CdIo *p_cdio, - /* out*/ cdio_hwinfo_t *p_hw_info ); - - -/*! - Get the media catalog number (MCN) from the CD via MMC. - - @return the media catalog number r NULL if there is none or we - don't have the ability to get it. - - Note: string is malloc'd so caller has to free() the returned - string when done with it. - -*/ -char *scsi_mmc_get_mcn ( const CdIo *p_cdio ); - -#endif /* __SCSI_MMC_H__ */ diff --git a/src/input/vcd/libcdio/cdio/sector.h b/src/input/vcd/libcdio/cdio/sector.h deleted file mode 100644 index 826883aea..000000000 --- a/src/input/vcd/libcdio/cdio/sector.h +++ /dev/null @@ -1,326 +0,0 @@ -/* - $Id: sector.h,v 1.3 2005/01/01 02:43:58 rockyb Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ -/*! - \file sector.h - \brief Things related to CD-ROM layout: tracks, sector sizes, MSFs, LBAs. - - A CD-ROM physical sector size is 2048, 2052, 2056, 2324, 2332, 2336, - 2340, or 2352 bytes long. - - Sector types of the standard CD-ROM data formats: - -\verbatim - format sector type user data size (bytes) - ----------------------------------------------------------------------------- - 1 (Red Book) CD-DA 2352 (CDIO_CD_FRAMESIZE_RAW) - 2 (Yellow Book) Mode1 Form1 2048 (CDIO_CD_FRAMESIZE) - 3 (Yellow Book) Mode1 Form2 2336 (M2RAW_SECTOR_SIZE) - 4 (Green Book) Mode2 Form1 2048 (CDIO_CD_FRAMESIZE) - 5 (Green Book) Mode2 Form2 2328 (2324+4 spare bytes) - - - The layout of the standard CD-ROM data formats: - ----------------------------------------------------------------------------- - - audio (red): | audio_sample_bytes | - | 2352 | - - - data (yellow, mode1): | sync - head - data - EDC - zero - ECC | - | 12 - 4 - 2048 - 4 - 8 - 276 | - - - data (yellow, mode2): | sync - head - data | - | 12 - 4 - 2336 | - - - XA data (green, mode2 form1): | sync - head - sub - data - EDC - ECC | - | 12 - 4 - 8 - 2048 - 4 - 276 | - - - XA data (green, mode2 form2): | sync - head - sub - data - Spare | - | 12 - 4 - 8 - 2324 - 4 | -\endverbatim - - -*/ - -#ifndef _CDIO_SECTOR_H_ -#define _CDIO_SECTOR_H_ - -#ifdef __cplusplus - extern "C" { -#endif - -#include <cdio/types.h> - -/*! track modes (Table 350) - reference: MMC-3 draft revsion - 10g -*/ -typedef enum { - AUDIO, /**< 2352 byte block length */ - MODE1, /**< 2048 byte block length */ - MODE1_RAW, /**< 2352 byte block length */ - MODE2, /**< 2336 byte block length */ - MODE2_FORM1, /**< 2048 byte block length */ - MODE2_FORM2, /**< 2324 byte block length */ - MODE2_FORM_MIX, /**< 2336 byte block length */ - MODE2_RAW /**< 2352 byte block length */ -} trackmode_t; - -/*! disc modes. The first combined from MMC-3 5.29.2.8 (Send CUESHEET) - and GNU/Linux /usr/include/linux/cdrom.h and we've added DVD. - */ -typedef enum { - CDIO_DISC_MODE_CD_DA, /**< CD-DA */ - CDIO_DISC_MODE_CD_DATA, /**< CD-ROM form 1 */ - CDIO_DISC_MODE_CD_XA, /**< CD-ROM XA form2 */ - CDIO_DISC_MODE_CD_MIXED, /**< Some combo of above. */ - CDIO_DISC_MODE_DVD_ROM, /**< DVD ROM (e.g. movies) */ - CDIO_DISC_MODE_DVD_RAM, /**< DVD-RAM */ - CDIO_DISC_MODE_DVD_R, /**< DVD-R */ - CDIO_DISC_MODE_DVD_RW, /**< DVD-RW */ - CDIO_DISC_MODE_DVD_PR, /**< DVD+R */ - CDIO_DISC_MODE_DVD_PRW, /**< DVD+RW */ - CDIO_DISC_MODE_DVD_OTHER, /**< Unknown/unclassified DVD type */ - CDIO_DISC_MODE_NO_INFO, - CDIO_DISC_MODE_ERROR -} discmode_t; - -/*! Information that can be obtained through a Read Subchannel - command. - */ -#define CDIO_SUBCHANNEL_SUBQ_DATA 0 -#define CDIO_SUBCHANNEL_CURRENT_POSITION 1 -#define CDIO_SUBCHANNEL_MEDIA_CATALOG 2 -#define CDIO_SUBCHANNEL_TRACK_ISRC 3 - -/*! track flags - * Q Sub-channel Control Field (4.2.3.3) - */ -typedef enum { - NONE = 0x00, /* no flags set */ - PRE_EMPHASIS = 0x01, /* audio track recorded with pre-emphasis */ - COPY_PERMITTED = 0x02, /* digital copy permitted */ - DATA = 0x04, /* data track */ - FOUR_CHANNEL_AUDIO = 0x08, /* 4 audio channels */ - SCMS = 0x10 /* SCMS (5.29.2.7) */ -} flag_t; - -#define CDIO_PREGAP_SECTORS 150 -#define CDIO_POSTGAP_SECTORS 150 - -/* - Some generally useful CD-ROM information -- mostly based on the above. - This is from linux.h - not to slight other OS's. This was the first - place I came across such useful stuff. -*/ -#define CDIO_CD_MINS 74 /**< max. minutes per CD, not really - a limit */ -#define CDIO_CD_SECS_PER_MIN 60 /**< seconds per minute */ -#define CDIO_CD_FRAMES_PER_SEC 75 /**< frames per second */ -#define CDIO_CD_SYNC_SIZE 12 /**< 12 sync bytes per raw data frame */ -#define CDIO_CD_CHUNK_SIZE 24 /**< lowest-level "data bytes piece" */ -#define CDIO_CD_NUM_OF_CHUNKS 98 /**< chunks per frame */ -#define CDIO_CD_FRAMESIZE_SUB 96 /**< subchannel data "frame" size */ -#define CDIO_CD_HEADER_SIZE 4 /**< header (address) bytes per raw - data frame */ -#define CDIO_CD_SUBHEADER_SIZE 8 /**< subheader bytes per raw XA data - frame */ -#define CDIO_CD_EDC_SIZE 4 /**< bytes EDC per most raw data - frame types */ -#define CDIO_CD_M1F1_ZERO_SIZE 8 /**< bytes zero per yellow book mode - 1 frame */ -#define CDIO_CD_ECC_SIZE 276 /**< bytes ECC per most raw data frame - types */ -#define CDIO_CD_FRAMESIZE 2048 /**< bytes per frame, "cooked" mode */ -#define CDIO_CD_FRAMESIZE_RAW 2352 /**< bytes per frame, "raw" mode */ -#define CDIO_CD_FRAMESIZE_RAWER 2646 /**< The maximum possible returned - bytes */ -#define CDIO_CD_FRAMESIZE_RAW1 (CDIO_CD_CD_FRAMESIZE_RAW-CDIO_CD_SYNC_SIZE) /*2340*/ -#define CDIO_CD_FRAMESIZE_RAW0 (CDIO_CD_FRAMESIZE_RAW-CDIO_CD_SYNC_SIZE-CDIO_CD__HEAD_SIZE) /*2336*/ - -/*! "before data" part of raw XA (green, mode2) frame */ -#define CDIO_CD_XA_HEADER (CDIO_CD_HEADER_SIZE+CDIO_CD_SUBHEADER_SIZE) - -/*! "after data" part of raw XA (green, mode2 form1) frame */ -#define CDIO_CD_XA_TAIL (CDIO_CD_EDC_SIZE+CDIO_CD_ECC_SIZE) - -/*! "before data" sync bytes + header of XA (green, mode2) frame */ -#define CDIO_CD_XA_SYNC_HEADER (CDIO_CD_SYNC_SIZE+CDIO_CD_XA_HEADER) - -/*! CD-ROM address types (GNU/Linux e.g. cdrom_tocentry.cdte_format) */ -#define CDIO_CDROM_LBA 0x01 /**< "logical block": first frame is #0 */ -#define CDIO_CDROM_MSF 0x02 /**< "minute-second-frame": binary, not - BCD here! */ - -/*! CD-ROM track format types (GNU/Linux cdte_ctrl) */ -#define CDIO_CDROM_DATA_TRACK 0x04 -#define CDIO_CDROM_CDI_TRACK 0x10 -#define CDIO_CDROM_XA_TRACK 0x20 - -/*! The leadout track is always 0xAA, regardless of # of tracks on - disc, or what value may be used internally. For example although - OS X uses a different value for the lead-out track internally than - given below, programmers should use CDIO_CDROM_LEADOUT_TRACK and - not worry about this. - */ -#define CDIO_CDROM_LEADOUT_TRACK 0xAA - -#define M2F2_SECTOR_SIZE 2324 -#define M2SUB_SECTOR_SIZE 2332 -#define M2RAW_SECTOR_SIZE 2336 - -/*! Largest CD track number */ -#define CDIO_CD_MAX_TRACKS 99 -/*! Smallest CD track number */ -#define CDIO_CD_MIN_TRACK_NO 1 - -/*! Largest CD session number */ -#define CDIO_CD_MAX_SESSIONS 99 -/*! Smallest CD session number */ -#define CDIO_CD_MIN_SESSION_NO 1 - -/*! Largest LSN in a CD */ -#define CDIO_CD_MAX_LSN 450150 -/*! Smallest LSN in a CD */ -#define CDIO_CD_MIN_LSN -450150 - - -#define CDIO_CD_FRAMES_PER_MIN \ - (CDIO_CD_FRAMES_PER_SEC*CDIO_CD_SECS_PER_MIN) - -#define CDIO_CD_74MIN_SECTORS (UINT32_C(74)*CDIO_CD_FRAMES_PER_MIN) -#define CDIO_CD_80MIN_SECTORS (UINT32_C(80)*CDIO_CD_FRAMES_PER_MIN) -#define CDIO_CD_90MIN_SECTORS (UINT32_C(90)*CDIO_CD_FRAMES_PER_MIN) - -#define CDIO_CD_MAX_SECTORS \ - (UINT32_C(100)*CDIO_CD_FRAMES_PER_MIN-CDIO_PREGAP_SECTORS) - -#define msf_t_SIZEOF 3 - -/*! - Convert an LBA into a string representation of the MSF. - \warning cdio_lba_to_msf_str returns new allocated string */ -char *cdio_lba_to_msf_str (lba_t lba); - -/*! - Convert an MSF into a string representation of the MSF. - \warning cdio_msf_to_msf_str returns new allocated string */ -char *cdio_msf_to_str (const msf_t *msf); - -/*! - Convert an LBA into the corresponding LSN. -*/ -lba_t cdio_lba_to_lsn (lba_t lba); - -/*! - Convert an LBA into the corresponding MSF. -*/ -void cdio_lba_to_msf(lba_t lba, msf_t *msf); - -/*! - Convert an LSN into the corresponding LBA. - CDIO_INVALID_LBA is returned if there is an error. -*/ -lba_t cdio_lsn_to_lba (lsn_t lsn); - -/*! - Convert an LSN into the corresponding MSF. -*/ -void cdio_lsn_to_msf (lsn_t lsn, msf_t *msf); - -/*! - Convert a MSF into the corresponding LBA. - CDIO_INVALID_LBA is returned if there is an error. -*/ -lba_t cdio_msf_to_lba (const msf_t *msf); - -/*! - Convert a MSF into the corresponding LSN. - CDIO_INVALID_LSN is returned if there is an error. -*/ -lsn_t cdio_msf_to_lsn (const msf_t *msf); - -/*! - Convert a MSF - broken out as 3 integer components into the - corresponding LBA. - CDIO_INVALID_LBA is returned if there is an error. -*/ -lba_t cdio_msf3_to_lba (unsigned int minutes, unsigned int seconds, - unsigned int frames); - -/*! - Convert a string of the form MM:SS:FF into the corresponding LBA. - CDIO_INVALID_LBA is returned if there is an error. -*/ -lba_t cdio_mmssff_to_lba (const char *psz_mmssff); - -/*! - Return true if discmode is some sort of CD. -*/ -bool cdio_is_discmode_cdrom (discmode_t discmode); - -/*! - Return true if discmode is some sort of DVD. -*/ -bool cdio_is_discmode_dvd (discmode_t discmode); - - -#ifdef __cplusplus - } -#endif - -static inline bool discmode_is_cd(discmode_t discmode) -{ - switch (discmode) { - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_DATA: - case CDIO_DISC_MODE_CD_XA: - case CDIO_DISC_MODE_CD_MIXED: - return true; - default: - return false; - } -} - -static inline bool discmode_is_dvd(discmode_t discmode) -{ - switch (discmode) { - case CDIO_DISC_MODE_DVD_ROM: - case CDIO_DISC_MODE_DVD_RAM: - case CDIO_DISC_MODE_DVD_R: - case CDIO_DISC_MODE_DVD_RW: - case CDIO_DISC_MODE_DVD_PR: - case CDIO_DISC_MODE_DVD_PRW: - case CDIO_DISC_MODE_DVD_OTHER: - return true; - default: - return false; - } -} - - -#endif /* _CDIO_SECTOR_H_ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/cdio/types.h b/src/input/vcd/libcdio/cdio/types.h deleted file mode 100644 index ec84a142b..000000000 --- a/src/input/vcd/libcdio/cdio/types.h +++ /dev/null @@ -1,379 +0,0 @@ -/* - $Id: types.h,v 1.3 2005/01/01 02:43:58 rockyb Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/** \file types.h - * \brief Common type definitions used pervasively in libcdio. - */ - - -#ifndef __CDIO_TYPES_H__ -#define __CDIO_TYPES_H__ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - /* provide some C99 definitions */ - -#if defined(HAVE_SYS_TYPES_H) -#include <sys/types.h> -#endif - -#if defined(HAVE_STDINT_H) -# include <stdint.h> -#elif defined(HAVE_INTTYPES_H) -# include <inttypes.h> -#elif defined(AMIGA) || defined(__linux__) - typedef u_int8_t uint8_t; - typedef u_int16_t uint16_t; - typedef u_int32_t uint32_t; - typedef u_int64_t uint64_t; -#else - /* warning ISO/IEC 9899:1999 <stdint.h> was missing and even <inttypes.h> */ - /* fixme */ -#endif /* HAVE_STDINT_H */ - - /* default HP/UX macros are broken */ -#if defined(__hpux__) -# undef UINT16_C -# undef UINT32_C -# undef UINT64_C -# undef INT64_C -#endif - - /* if it's still not defined, take a good guess... should work for - most 32bit and 64bit archs */ - -#ifndef UINT16_C -# define UINT16_C(c) c ## U -#endif - -#ifndef UINT32_C -# if defined (SIZEOF_INT) && SIZEOF_INT == 4 -# define UINT32_C(c) c ## U -# elif defined (SIZEOF_LONG) && SIZEOF_LONG == 4 -# define UINT32_C(c) c ## UL -# else -# define UINT32_C(c) c ## U -# endif -#endif - -#ifndef UINT64_C -# if defined (SIZEOF_LONG) && SIZEOF_LONG == 8 -# define UINT64_C(c) c ## UL -# elif defined (SIZEOF_INT) && SIZEOF_INT == 8 -# define UINT64_C(c) c ## U -# else -# define UINT64_C(c) c ## ULL -# endif -#endif - -#ifndef INT64_C -# if defined (SIZEOF_LONG) && SIZEOF_LONG == 8 -# define INT64_C(c) c ## L -# elif defined (SIZEOF_INT) && SIZEOF_INT == 8 -# define INT64_C(c) c -# else -# define INT64_C(c) c ## LL -# endif -#endif - -#if defined(HAVE_STDBOOL_H) -#include <stdbool.h> -#else - /* ISO/IEC 9899:1999 <stdbool.h> missing -- enabling workaround */ - -# ifndef __cplusplus - typedef enum - { - false = 0, - true = 1 - } _cdio_Bool; - -# define false false -# define true true -# define bool _cdio_Bool -# endif -#endif - - /* some GCC optimizations -- gcc 2.5+ */ - -#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) -#define GNUC_PRINTF( format_idx, arg_idx ) \ - __attribute__((format (printf, format_idx, arg_idx))) -#define GNUC_SCANF( format_idx, arg_idx ) \ - __attribute__((format (scanf, format_idx, arg_idx))) -#define GNUC_FORMAT( arg_idx ) \ - __attribute__((format_arg (arg_idx))) -#define GNUC_NORETURN \ - __attribute__((noreturn)) -#define GNUC_CONST \ - __attribute__((const)) -#define GNUC_UNUSED \ - __attribute__((unused)) -#define GNUC_PACKED \ - __attribute__((packed)) -#else /* !__GNUC__ */ -#define GNUC_PRINTF( format_idx, arg_idx ) -#define GNUC_SCANF( format_idx, arg_idx ) -#define GNUC_FORMAT( arg_idx ) -#define GNUC_NORETURN -#define GNUC_CONST -#define GNUC_UNUSED -#define GNUC_PACKED -#endif /* !__GNUC__ */ - -#if defined(__GNUC__) - /* for GCC we try to use GNUC_PACKED */ -# define PRAGMA_BEGIN_PACKED -# define PRAGMA_END_PACKED -#elif defined(HAVE_ISOC99_PRAGMA) - /* should work with most EDG-frontend based compilers */ -# define PRAGMA_BEGIN_PACKED _Pragma("pack(1)") -# define PRAGMA_END_PACKED _Pragma("pack()") -#else /* neither gcc nor _Pragma() available... */ - /* ...so let's be naive and hope the regression testsuite is run... */ -# define PRAGMA_BEGIN_PACKED -# define PRAGMA_END_PACKED -#endif - - /* - * user directed static branch prediction gcc 2.96+ - */ -#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 95) -# define GNUC_LIKELY(x) __builtin_expect((x),true) -# define GNUC_UNLIKELY(x) __builtin_expect((x),false) -#else -# define GNUC_LIKELY(x) (x) -# define GNUC_UNLIKELY(x) (x) -#endif - -#ifndef NULL -# define NULL ((void*) 0) -#endif - - /* our own offsetof()-like macro */ -#define __cd_offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) - - /*! - \brief MSF (minute/second/frame) structure - - One CD-ROMs addressing scheme especially used in audio formats - (Red Book) is an address by minute, sector and frame which - BCD-encoded in three bytes. An alternative format is an lba_t. - - @see lba_t - */ - PRAGMA_BEGIN_PACKED - struct msf_rec { - uint8_t m, s, f; - } GNUC_PACKED; - PRAGMA_END_PACKED - - typedef struct msf_rec msf_t; - -#define msf_t_SIZEOF 3 - - /* type used for bit-fields in structs (1 <= bits <= 8) */ -#if defined(__GNUC__) - /* this is strict ISO C99 which allows only 'unsigned int', 'signed - int' and '_Bool' explicitly as bit-field type */ - typedef unsigned int bitfield_t; -#else - /* other compilers might increase alignment requirements to match the - 'unsigned int' type -- fixme: find out how unalignment accesses can - be pragma'ed on non-gcc compilers */ - typedef uint8_t bitfield_t; -#endif - - /*! The type of a Logical Block Address. We allow for an lba to be - negative to be consistent with an lba, although I'm not sure this - this is possible. - - */ - typedef int32_t lba_t; - - /*! The type of a Logical Sector Number. Note that an lba lsn be negative - and the MMC3 specs allow for a conversion of a negative lba - - @see msf_t - */ - typedef int32_t lsn_t; - - /*! The type of a track number 0..99. */ - typedef uint8_t track_t; - - /*! - Constant for invalid track number - */ -#define CDIO_INVALID_TRACK 0xFF - - /*! The type of a session number 0..99. */ - typedef uint8_t session_t; - - /*! - Constant for invalid session number - */ -#define CDIO_INVALID_SESSION 0xFF - - /*! - Constant for invalid LBA. It is 151 less than the most negative - LBA -45150. This provide slack for the 150-frame offset in - LBA to LSN 150 conversions - */ -#define CDIO_INVALID_LBA -45301 - - /*! - Constant for invalid LSN - */ -#define CDIO_INVALID_LSN CDIO_INVALID_LBA - - /*! - Number of ASCII bytes in a media catalog number (MCN). - */ -#define CDIO_MCN_SIZE 13 - - /*! - Type to hold ASCII bytes in a media catalog number (MCN). - We include an extra 0 byte so these can be used as C strings. - */ - typedef char cdio_mcn_t[CDIO_MCN_SIZE+1]; - - - /*! - Number of ASCII bytes in International Standard Recording Codes (ISRC) - */ -#define CDIO_ISRC_SIZE 12 - - /*! - Type to hold ASCII bytes in a media catalog number (MCN). - We include an extra 0 byte so these can be used as C strings. - */ - typedef char cdio_isrc_t[CDIO_ISRC_SIZE+1]; - - typedef int cdio_fs_anal_t; - - /*! The type of an drive capability bit mask. See below for values*/ - typedef uint32_t cdio_drive_read_cap_t; - typedef uint32_t cdio_drive_write_cap_t; - typedef uint32_t cdio_drive_misc_cap_t; - - /*! - \brief Drive types returned by cdio_get_drive_cap() - - NOTE: Setting a bit here means the presence of a capability. - */ - -#define CDIO_DRIVE_CAP_ERROR 0x40000 /**< Error */ -#define CDIO_DRIVE_CAP_UNKNOWN 0x80000 /**< Dunno. It can be on if we - have only partial information - or are not completely certain - */ - -#define CDIO_DRIVE_CAP_MISC_CLOSE_TRAY 0x00001 /**< caddy systems can't - close... */ -#define CDIO_DRIVE_CAP_MISC_EJECT 0x00002 /**< but can eject. */ -#define CDIO_DRIVE_CAP_MISC_LOCK 0x00004 /**< disable manual eject */ -#define CDIO_DRIVE_CAP_MISC_SELECT_SPEED 0x00008 /**< programmable speed */ -#define CDIO_DRIVE_CAP_MISC_SELECT_DISC 0x00010 /**< select disc from - juke-box */ -#define CDIO_DRIVE_CAP_MISC_MULTI_SESSION 0x00020 /**< read sessions>1 */ -#define CDIO_DRIVE_CAP_MISC_MEDIA_CHANGED 0x00080 /**< media changed */ -#define CDIO_DRIVE_CAP_MISC_RESET 0x00100 /**< hard reset device */ -#define CDIO_DRIVE_CAP_MCN 0x00200 /**< can read MCN */ -#define CDIO_DRIVE_CAP_ISRC 0x00200 /**< can read ISRC */ -#define CDIO_DRIVE_CAP_MISC_FILE 0x20000 /**< drive is really a file, - i.e a CD file image */ - - /*! Reading masks.. */ -#define CDIO_DRIVE_CAP_READ_AUDIO 0x00001 /**< drive can play CD audio */ -#define CDIO_DRIVE_CAP_READ_CD_DA 0x00002 /**< drive can read CD-DA */ -#define CDIO_DRIVE_CAP_READ_CD_G 0x00004 /**< drive can read CD+G */ -#define CDIO_DRIVE_CAP_READ_CD_R 0x00008 /**< drive can read CD-R */ -#define CDIO_DRIVE_CAP_READ_CD_RW 0x00010 /**< drive can read CD-RW */ -#define CDIO_DRIVE_CAP_READ_DVD_R 0x00020 /**< drive can read DVD-R */ -#define CDIO_DRIVE_CAP_READ_DVD_PR 0x00040 /**< drive can read DVD+R */ -#define CDIO_DRIVE_CAP_READ_DVD_RAM 0x00080 /**< drive can read DVD-RAM */ -#define CDIO_DRIVE_CAP_READ_DVD_ROM 0x00100 /**< drive can read DVD-ROM */ -#define CDIO_DRIVE_CAP_READ_DVD_RW 0x00200 /**< drive can read DVD-RW */ -#define CDIO_DRIVE_CAP_READ_DVD_RPW 0x00400 /**< drive can read DVD+RW */ -#define CDIO_DRIVE_CAP_READ_C2_ERRS 0x00800 /**< has C2 error correction */ - - /*! Writing masks.. */ -#define CDIO_DRIVE_CAP_WRITE_CD_R 0x00001 /**< drive can write CD-R */ -#define CDIO_DRIVE_CAP_WRITE_CD_RW 0x00002 /**< drive can write CD-R */ -#define CDIO_DRIVE_CAP_WRITE_DVD_R 0x00004 /**< drive can write DVD-R */ -#define CDIO_DRIVE_CAP_WRITE_DVD_PR 0x00008 /**< drive can write DVD+R */ -#define CDIO_DRIVE_CAP_WRITE_DVD_RAM 0x00010 /**< drive can write DVD-RAM */ -#define CDIO_DRIVE_CAP_WRITE_DVD_RW 0x00020 /**< drive can write DVD-RW */ -#define CDIO_DRIVE_CAP_WRITE_DVD_RPW 0x00040 /**< drive can write DVD+RW */ -#define CDIO_DRIVE_CAP_WRITE_MT_RAINIER 0x00080 /**< Mount Rainier */ -#define CDIO_DRIVE_CAP_WRITE_BURN_PROOF 0x00100 /**< burn proof */ - -/**< Masks derived from above... */ -#define CDIO_DRIVE_CAP_WRITE_CD ( \ - CDIO_DRIVE_CAP_WRITE_CD_R \ - | CDIO_DRIVE_CAP_WRITE_CD_RW \ - ) -/**< Has some sort of CD writer ability */ - -/**< Masks derived from above... */ -#define CDIO_DRIVE_CAP_WRITE_DVD ( \ - | CDIO_DRIVE_CAP_WRITE_DVD_R \ - | CDIO_DRIVE_CAP_WRITE_DVD_PR \ - | CDIO_DRIVE_CAP_WRITE_DVD_RAM \ - | CDIO_DRIVE_CAP_WRITE_DVD_RW \ - | CDIO_DRIVE_CAP_WRITE_DVD_RPW \ - ) -/**< Has some sort of DVD writer ability */ - -#define CDIO_DRIVE_CAP_WRITE \ - (CDIO_DRIVE_CAP_WRITE_CD | CDIO_DRIVE_CAP_WRITE_DVD) -/**< Has some sort of DVD or CD writing ability */ - - /*! - track flags - Q Sub-channel Control Field (4.2.3.3) - */ - typedef enum { - CDIO_TRACK_FLAG_NONE = 0x00, /**< no flags set */ - CDIO_TRACK_FLAG_PRE_EMPHASIS = 0x01, /**< audio track recorded with - pre-emphasis */ - CDIO_TRACK_FLAG_COPY_PERMITTED = 0x02, /**< digital copy permitted */ - CDIO_TRACK_FLAG_DATA = 0x04, /**< data track */ - CDIO_TRACK_FLAG_FOUR_CHANNEL_AUDIO = 0x08, /**< 4 audio channels */ - CDIO_TRACK_FLAG_SCMS = 0x10 /**< SCMS (5.29.2.7) */ -} cdio_track_flag; - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __CDIO_TYPES_H__ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/cdio/util.h b/src/input/vcd/libcdio/cdio/util.h deleted file mode 100644 index 3cea313b4..000000000 --- a/src/input/vcd/libcdio/cdio/util.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - $Id: util.h,v 1.3 2005/01/01 02:43:58 rockyb Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -#ifndef __CDIO_UTIL_H__ -#define __CDIO_UTIL_H__ - -/*! - \file util.h - \brief Miscellaneous utility functions. - - Warning: this will probably get removed/replaced by using glib.h -*/ -#include <stdlib.h> - -#undef MAX -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) - -#undef MIN -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) - -#undef IN -#define IN(x, low, high) ((x) >= (low) && (x) <= (high)) - -#undef CLAMP -#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) - -static inline unsigned -_cdio_len2blocks (unsigned len, int blocksize) -{ - unsigned blocks; - - blocks = len / blocksize; - if (len % blocksize) - blocks++; - - return blocks; -} - -/* round up to next block boundary */ -static inline unsigned -_cdio_ceil2block (unsigned offset, int blocksize) -{ - return _cdio_len2blocks (offset, blocksize) * blocksize; -} - -static inline unsigned -_cdio_ofs_add (unsigned offset, unsigned length, int blocksize) -{ - if (blocksize - (offset % blocksize) < length) - offset = _cdio_ceil2block (offset, blocksize); - - offset += length; - - return offset; -} - -static inline const char * -_cdio_bool_str (bool b) -{ - return b ? "yes" : "no"; -} - -#ifdef __cplusplus -extern "C" { -#endif - -void * -_cdio_malloc (size_t size); - -void * -_cdio_memdup (const void *mem, size_t count); - -char * -_cdio_strdup_upper (const char str[]); - -void -_cdio_strfreev(char **strv); - -char * -_cdio_strjoin (char *strv[], unsigned count, const char delim[]); - -size_t -_cdio_strlenv(char **str_array); - -char ** -_cdio_strsplit(const char str[], char delim); - -uint8_t cdio_to_bcd8(uint8_t n); -uint8_t cdio_from_bcd8(uint8_t p); - -#if defined(__GNUC__) && __GNUC__ >= 3 -static inline __attribute__((deprecated)) -uint8_t to_bcd8(uint8_t n) { - return cdio_to_bcd8(n); -} -static inline __attribute__((deprecated)) -uint8_t from_bcd8(uint8_t p) { - return cdio_from_bcd8(p); -} -#else -#define to_bcd8 cdio_to_bcd8 -#define from_bcd8 cdio_from_bcd8 -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* __CDIO_UTIL_H__ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/cdio/version.h b/src/input/vcd/libcdio/cdio/version.h deleted file mode 100644 index 345924cab..000000000 --- a/src/input/vcd/libcdio/cdio/version.h +++ /dev/null @@ -1,10 +0,0 @@ -/* $Id: version.h,v 1.2 2004/04/11 12:20:31 miguelfreitas Exp $ */ -/** \file version.h - * \brief A file simply containing the library version number. - */ - -/*! CDIO_VERSION can as a string in programs to show what version is used. */ -#define CDIO_VERSION "0.68" - -/*! LIBCDIO_VERSION_NUM can be used for testing in the C preprocessor */ -#define LIBCDIO_VERSION_NUM 68 diff --git a/src/input/vcd/libcdio/cdio/xa.h b/src/input/vcd/libcdio/cdio/xa.h deleted file mode 100644 index 3af27eab5..000000000 --- a/src/input/vcd/libcdio/cdio/xa.h +++ /dev/null @@ -1,151 +0,0 @@ -/* - $Id: xa.h,v 1.3 2005/01/01 02:43:58 rockyb Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - - See also iso9660.h by Eric Youngdale (1993) and in cdrtools. These - are - - Copyright 1993 Yggdrasil Computing, Incorporated - Copyright (c) 1999,2000 J. Schilling - - 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 -*/ -/*! - \file xa.h - \brief Things related to the ISO-9660 XA (Extended Attributes) format -*/ - - -#ifndef __CDIO_XA_H__ -#define __CDIO_XA_H__ - -#include <cdio/types.h> - -#define ISO_XA_MARKER_STRING "CD-XA001" -#define ISO_XA_MARKER_OFFSET 1024 - -/* XA attribute definitions */ -#define XA_PERM_RSYS 0x0001 /**< System Group Read */ -#define XA_PERM_XSYS 0x0004 /**< System Group Execute */ - -#define XA_PERM_RUSR 0x0010 /**< User (owner) Read */ -#define XA_PERM_XUSR 0x0040 /**< User (owner) Execute */ - -#define XA_PERM_RGRP 0x0100 /**< Group Read */ -#define XA_PERM_XGRP 0x0400 /**< Group Execute */ - -#define XA_PERM_ROTH 0x1000 /**< Other (world) Read */ -#define XA_PERM_XOTH 0x4000 /**< Other (world) Execute */ - -#define XA_ATTR_MODE2FORM1 (1 << 11) -#define XA_ATTR_MODE2FORM2 (1 << 12) -#define XA_ATTR_INTERLEAVED (1 << 13) -#define XA_ATTR_CDDA (1 << 14) -#define XA_ATTR_DIRECTORY (1 << 15) - -/* some aggregations */ -#define XA_PERM_ALL_READ (XA_PERM_RUSR | XA_PERM_RSYS | XA_PERM_RGRP) -#define XA_PERM_ALL_EXEC (XA_PERM_XUSR | XA_PERM_XSYS | XA_PERM_XGRP) -#define XA_PERM_ALL_ALL (XA_PERM_ALL_READ | XA_PERM_ALL_EXEC) - -#define XA_FORM1_DIR (XA_ATTR_DIRECTORY | XA_ATTR_MODE2FORM1 | XA_PERM_ALL_ALL) -#define XA_FORM1_FILE (XA_ATTR_MODE2FORM1 | XA_PERM_ALL_ALL) -#define XA_FORM2_FILE (XA_ATTR_MODE2FORM2 | XA_PERM_ALL_ALL) - -/*! \brief "Extended Architecture according to the Philips Yellow Book. - -CD-ROM EXtended Architecture is a modification to the CD-ROM -specification that defines two new types of sectors. CD-ROM XA was -developed jointly by Sony, Philips, and Microsoft, and announced in -August 1988. Its specifications were published in an extension to the -Yellow Book. CD-i, Photo CD, Video CD and CD-EXTRA have all -subsequently been based on CD-ROM XA. - -CD-XA defines another way of formatting sectors on a CD-ROM, including -headers in the sectors that describe the type (audio, video, data) and -some additional info (markers, resolution in case of a video or audio -sector, file numbers, etc). - -The data written on a CD-XA is consistent with and can be in ISO-9660 -file system format and therefore be readable by ISO-9660 file system -translators. But also a CD-I player can also read CD-XA discs even if -its own `Green Book' file system only resembles ISO 9660 and isn't -fully compatible. - - Note structure is big-endian. -*/ -typedef struct iso9660_xa -{ - uint16_t group_id; /**< 0 */ - uint16_t user_id; /**< 0 */ - uint16_t attributes; /**< XA_ATTR_ */ - uint8_t signature[2]; /**< { 'X', 'A' } */ - uint8_t filenum; /**< file number, see also XA subheader */ - uint8_t reserved[5]; /**< zero */ -} GNUC_PACKED iso9660_xa_t; - - -/*! - Returns a string which interpreting the extended attribute xa_attr. - For example: - \verbatim - d---1xrxrxr - ---2--r-r-r - -a--1xrxrxr - \endverbatim - - A description of the characters in the string follows - The 1st character is either "d" if the entry is a directory, or "-" if not - The 2nd character is either "a" if the entry is CDDA (audio), or "-" if not - The 3rd character is either "i" if the entry is interleaved, or "-" if not - The 4th character is either "2" if the entry is mode2 form2 or "-" if not - The 5th character is either "1" if the entry is mode2 form1 or "-" if not - Note that an entry will either be in mode2 form1 or mode form2. That - is you will either see "2-" or "-1" in the 4th & 5th positions. - - The 6th and 7th characters refer to permissions for a user while the - the 8th and 9th characters refer to permissions for a group while, and - the 10th and 11th characters refer to permissions for everyone. - - In each of these pairs the first character (6, 8, 10) is "x" if the - entry is executable. For a directory this means the directory is - allowed to be listed or "searched". - The second character of a pair (7, 9, 11) is "r" if the entry is allowed - to be read. -*/ -const char * -iso9660_get_xa_attr_str (uint16_t xa_attr); - -/*! - Allocates and initalizes a new iso9600_xa_t variable and returns - it. The caller should free the returned result. - - @see iso9660_xa -*/ -iso9660_xa_t * -iso9660_xa_init (iso9660_xa_t *_xa, uint16_t uid, uint16_t gid, uint16_t attr, - uint8_t filenum); - -#endif /* __CDIO_XA_H__ */ - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/cdio_assert.h b/src/input/vcd/libcdio/cdio_assert.h deleted file mode 100644 index 2433bf0c7..000000000 --- a/src/input/vcd/libcdio/cdio_assert.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - $Id: cdio_assert.h,v 1.2 2004/04/11 12:20:31 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifndef __CDIO_ASSERT_H__ -#define __CDIO_ASSERT_H__ - -#if defined(__GNUC__) - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <cdio/types.h> -#include <cdio/logging.h> - -#define cdio_assert(expr) \ - { \ - if (GNUC_UNLIKELY (!(expr))) cdio_log (CDIO_LOG_ASSERT, \ - "file %s: line %d (%s): assertion failed: (%s)", \ - __FILE__, __LINE__, __PRETTY_FUNCTION__, #expr); \ - } - -#define cdio_assert_not_reached() \ - { \ - cdio_log (CDIO_LOG_ASSERT, \ - "file %s: line %d (%s): should not be reached", \ - __FILE__, __LINE__, __PRETTY_FUNCTION__); \ - } - -#else /* non GNU C */ - -#include <assert.h> - -#define cdio_assert(expr) \ - assert(expr) - -#define cdio_assert_not_reached() \ - assert(0) - -#endif - -#endif /* __CDIO_ASSERT_H__ */ diff --git a/src/input/vcd/libcdio/cdio_private.h b/src/input/vcd/libcdio/cdio_private.h deleted file mode 100644 index b1e2777ed..000000000 --- a/src/input/vcd/libcdio/cdio_private.h +++ /dev/null @@ -1,315 +0,0 @@ -/* - $Id: cdio_private.h,v 1.3 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/* Internal routines for CD I/O drivers. */ - - -#ifndef __CDIO_PRIVATE_H__ -#define __CDIO_PRIVATE_H__ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <cdio/cdio.h> -#include <cdio/cdtext.h> -#include "scsi_mmc_private.h" - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - /* Opaque type */ - typedef struct _CdioDataSource CdioDataSource; - -#ifdef __cplusplus -} - -#endif /* __cplusplus */ - -#include "generic.h" - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - - typedef struct { - - /*! - Eject media in CD drive. If successful, as a side effect we - also free obj. Return 0 if success and 1 for failure. - */ - int (*eject_media) (void *env); - - /*! - Release and free resources associated with cd. - */ - void (*free) (void *env); - - /*! - Return the value associated with the key "arg". - */ - const char * (*get_arg) (void *env, const char key[]); - - /*! - Get cdtext information for a CdIo object. - - @param obj the CD object that may contain CD-TEXT information. - @return the CD-TEXT object or NULL if obj is NULL - or CD-TEXT information does not exist. - - If i_track is 0 or CDIO_CDROM_LEADOUT_TRACK the track returned - is the information assocated with the CD. - */ - const cdtext_t * (*get_cdtext) (void *env, track_t i_track); - - /*! - Return an array of device names. if CdIo is NULL (we haven't - initialized a specific device driver), then find a suitable device - driver. - - NULL is returned if we couldn't return a list of devices. - */ - char ** (*get_devices) (void); - - /*! - Return a string containing the default CD device if none is specified. - */ - char * (*get_default_device)(void); - - /*! - Get disc mode associated with cd_obj. - */ - discmode_t (*get_discmode) (void *p_env); - - /*! - Return the what kind of device we've got. - - See cd_types.h for a list of bitmasks for the drive type; - */ - void (*get_drive_cap) (const void *env, - cdio_drive_read_cap_t *p_read_cap, - cdio_drive_write_cap_t *p_write_cap, - cdio_drive_misc_cap_t *p_misc_cap); - /*! - Return the number of of the first track. - CDIO_INVALID_TRACK is returned on error. - */ - track_t (*get_first_track_num) (void *p_env); - - /*! - Get the CD-ROM hardware info via a SCSI MMC INQUIRY command. - False is returned if we had an error getting the information. - */ - bool (*get_hwinfo) ( const CdIo *p_cdio, - /* out*/ cdio_hwinfo_t *p_hw_info ); - - /*! - Return the media catalog number MCN from the CD or NULL if - there is none or we don't have the ability to get it. - */ - char * (*get_mcn) (const void *env); - - /*! - Return the number of tracks in the current medium. - CDIO_INVALID_TRACK is returned on error. - */ - track_t (*get_num_tracks) (void *env); - - /*! - Return the starting LBA for track number - track_num in obj. Tracks numbers start at 1. - The "leadout" track is specified either by - using track_num LEADOUT_TRACK or the total tracks+1. - CDIO_INVALID_LBA is returned on error. - */ - lba_t (*get_track_lba) (void *env, track_t track_num); - - /*! - Get format of track. - */ - track_format_t (*get_track_format) (void *env, track_t track_num); - - /*! - Return true if we have XA data (green, mode2 form1) or - XA data (green, mode2 form2). That is track begins: - sync - header - subheader - 12 4 - 8 - - FIXME: there's gotta be a better design for this and get_track_format? - */ - bool (*get_track_green) (void *env, track_t track_num); - - /*! - Return the starting MSF (minutes/secs/frames) for track number - track_num in obj. Tracks numbers start at 1. - The "leadout" track is specified either by - using track_num LEADOUT_TRACK or the total tracks+1. - False is returned on error. - */ - bool (*get_track_msf) (void *env, track_t track_num, msf_t *msf); - - /*! - lseek - reposition read/write file offset - Returns (off_t) -1 on error. - Similar to libc's lseek() - */ - off_t (*lseek) (void *env, off_t offset, int whence); - - /*! - Reads into buf the next size bytes. - Returns -1 on error. - Similar to libc's read() - */ - ssize_t (*read) (void *env, void *buf, size_t size); - - /*! - Reads a single mode2 sector from cd device into buf starting - from lsn. Returns 0 if no error. - */ - int (*read_audio_sectors) (void *env, void *buf, lsn_t lsn, - unsigned int nblocks); - - /*! - Reads a single mode2 sector from cd device into buf starting - from lsn. Returns 0 if no error. - */ - int (*read_mode2_sector) (void *env, void *buf, lsn_t lsn, - bool mode2_form2); - - /*! - Reads nblocks of mode2 sectors from cd device into data starting - from lsn. - Returns 0 if no error. - */ - int (*read_mode2_sectors) (void *p_env, void *p_buf, lsn_t lsn, - bool mode2_form2, unsigned int nblocks); - - /*! - Reads a single mode1 sector from cd device into buf starting - from lsn. Returns 0 if no error. - */ - int (*read_mode1_sector) (void *p_env, void *p_buf, lsn_t lsn, - bool mode1_form2); - - /*! - Reads nblocks of mode1 sectors from cd device into data starting - from lsn. - Returns 0 if no error. - */ - int (*read_mode1_sectors) (void *p_env, void *p_buf, lsn_t lsn, - bool mode1_form2, unsigned int nblocks); - - bool (*read_toc) ( void *p_env ) ; - - /*! - Run a SCSI MMC command. - - cdio CD structure set by cdio_open(). - i_timeout_ms time in milliseconds we will wait for the command - to complete. - cdb_len number of bytes in cdb (6, 10, or 12). - cdb CDB bytes. All values that are needed should be set on - input. - b_return_data TRUE if the command expects data to be returned in - the buffer - len Size of buffer - buf Buffer for data, both sending and receiving - - Returns 0 if command completed successfully. - */ - scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd; - - /*! - Set the arg "key" with "value" in the source device. - */ - int (*set_arg) (void *env, const char key[], const char value[]); - - /*! - Return the size of the CD in logical block address (LBA) units. - */ - uint32_t (*stat_size) (void *env); - - } cdio_funcs; - - - /*! Implementation of CdIo type */ - struct _CdIo { - driver_id_t driver_id; /**< Particular driver opened. */ - cdio_funcs op; /**< driver-specific routines handling - implementation*/ - void *env; /**< environment. Passed to routine above. */ - }; - - /* This is used in drivers that must keep their own internal - position pointer for doing seeks. Stream-based drivers (like bincue, - nrg, toc, network) would use this. - */ - typedef struct - { - off_t buff_offset; /* buffer offset in disk-image seeks. */ - track_t index; /* Current track index in tocent. */ - lba_t lba; /* Current LBA */ - } internal_position_t; - - CdIo * cdio_new (generic_img_private_t *p_env, cdio_funcs *funcs); - - /* The below structure describes a specific CD Input driver */ - typedef struct - { - driver_id_t id; - unsigned int flags; - const char *name; - const char *describe; - bool (*have_driver) (void); - CdIo *(*driver_open) (const char *psz_source_name); - CdIo *(*driver_open_am) (const char *psz_source_name, - const char *psz_access_mode); - char *(*get_default_device) (void); - bool (*is_device) (const char *psz_source_name); - char **(*get_devices) (void); - } CdIo_driver_t; - - /* The below array gives of the drivers that are currently available for - on a particular host. */ - extern CdIo_driver_t CdIo_driver[CDIO_MAX_DRIVER]; - - /* The last valid entry of Cdio_driver. -1 means uninitialzed. -2 - means some sort of error. - */ - extern int CdIo_last_driver; - - /* The below array gives all drivers that can possibly appear. - on a particular host. */ - extern CdIo_driver_t CdIo_all_drivers[CDIO_MAX_DRIVER+1]; - - /*! - Add/allocate a drive to the end of drives. - Use cdio_free_device_list() to free this device_list. - */ - void cdio_add_device_list(char **device_list[], const char *drive, - unsigned int *i_drives); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __CDIO_PRIVATE_H__ */ diff --git a/src/input/vcd/libcdio/cdtext.c b/src/input/vcd/libcdio/cdtext.c deleted file mode 100644 index 5842641f7..000000000 --- a/src/input/vcd/libcdio/cdtext.c +++ /dev/null @@ -1,228 +0,0 @@ -/* - $Id: cdtext.c,v 1.1 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> - toc reading routine adapted from cuetools - Copyright (C) 2003 Svend Sanjay Sorensen <ssorensen@fastmail.fm> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <cdio/cdtext.h> -#include <cdio/logging.h> -#include "cdtext_private.h" - -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif - -#ifdef HAVE_STRING_H -#include <string.h> -#endif - -/*! Note: the order and number items (except CDTEXT_INVALID) should - match the cdtext_field_t enumeration. */ -const char *cdtext_keywords[] = - { - "ARRANGER", - "COMPOSER", - "DISC_ID", - "GENRE", - "ISRC", - "MESSAGE", - "PERFORMER", - "SIZE_INFO", - "SONGWRITER", - "TITLE", - "TOC_INFO", - "TOC_INFO2", - "UPC_EAN", - }; - - -/*! Return string representation of the enum values above */ -const char * -cdtext_field2str (cdtext_field_t i) -{ - if (i >= MAX_CDTEXT_FIELDS) - return "Invalid CDTEXT field index"; - else - return cdtext_keywords[i]; -} - - -/*! Free memory assocated with cdtext*/ -void -cdtext_destroy (cdtext_t *cdtext) -{ - cdtext_field_t i; - - for (i=0; i < MAX_CDTEXT_FIELDS; i++) { - if (cdtext->field[i]) free(cdtext->field[i]); - } -} - -/*! - returns the CDTEXT value associated with key. NULL is returned - if key is CDTEXT_INVALID or the field is not set. - */ -const char * -cdtext_get (cdtext_field_t key, const cdtext_t *cdtext) -{ - if (key == CDTEXT_INVALID) return NULL; - return cdtext->field[key]; -} - -/*! Initialize a new cdtext structure. - When the structure is no longer needed, release the - resources using cdtext_delete. -*/ -void -cdtext_init (cdtext_t *cdtext) -{ - cdtext_field_t i; - - for (i=0; i < MAX_CDTEXT_FIELDS; i++) { - cdtext->field[i] = NULL; - } -} - -/*! - returns 0 if field is a CD-TEXT keyword, returns non-zero otherwise -*/ -cdtext_field_t -cdtext_is_keyword (const char *key) -{ -#if 0 - char *item; - - item = bsearch(key, - cdtext_keywords, 12, - sizeof (char *), - (int (*)(const void *, const void *)) - strcmp); - return (NULL != item) ? 0 : 1; -#else - unsigned int i; - - for (i = 0; i < 13 ; i++) - if (0 == strcmp (cdtext_keywords[i], key)) { - return i; - } - return CDTEXT_INVALID; -#endif -} - -/*! sets cdtext's keyword entry to field. - */ -void -cdtext_set (cdtext_field_t key, const char *value, cdtext_t *cdtext) -{ - if (NULL == value || key == CDTEXT_INVALID) return; - - if (cdtext->field[key]) free (cdtext->field[key]); - cdtext->field[key] = strdup (value); - -} - -#define SET_CDTEXT_FIELD(FIELD) \ - (*set_cdtext_field_fn)(user_data, i_track, i_first_track, FIELD, buffer); - -/* - parse all CD-TEXT data retrieved. -*/ -bool -cdtext_data_init(void *user_data, track_t i_first_track, - unsigned char *wdata, - set_cdtext_field_fn_t set_cdtext_field_fn) -{ - CDText_data_t *pdata; - int i; - int j; - char buffer[256]; - int idx; - int i_track; - bool b_ret = false; - - memset( buffer, 0x00, sizeof(buffer) ); - idx = 0; - - pdata = (CDText_data_t *) (&wdata[4]); - for( i=0; i < CDIO_CDTEXT_MAX_PACK_DATA; i++ ) { - -#if TESTED - if ( pdata->bDBC ) { - cdio_warn("Double-byte characters not supported"); - return false; - } -#endif - - if( pdata->seq != i ) - break; - - if( (pdata->type >= 0x80) - && (pdata->type <= 0x85) && (pdata->block == 0) ) { - i_track = pdata->i_track; - - for( j=0; j < CDIO_CDTEXT_MAX_TEXT_DATA; j++ ) { - if( pdata->text[j] == 0x00 ) { - bool b_field_set=true; - switch( pdata->type) { - case CDIO_CDTEXT_TITLE: - SET_CDTEXT_FIELD(CDTEXT_TITLE); - break; - case CDIO_CDTEXT_PERFORMER: - SET_CDTEXT_FIELD(CDTEXT_PERFORMER); - break; - case CDIO_CDTEXT_SONGWRITER: - SET_CDTEXT_FIELD(CDTEXT_SONGWRITER); - break; - case CDIO_CDTEXT_COMPOSER: - SET_CDTEXT_FIELD(CDTEXT_COMPOSER); - break; - case CDIO_CDTEXT_ARRANGER: - SET_CDTEXT_FIELD(CDTEXT_ARRANGER); - break; - case CDIO_CDTEXT_MESSAGE: - SET_CDTEXT_FIELD(CDTEXT_MESSAGE); - break; - case CDIO_CDTEXT_DISCID: - SET_CDTEXT_FIELD(CDTEXT_DISCID); - break; - case CDIO_CDTEXT_GENRE: - SET_CDTEXT_FIELD(CDTEXT_GENRE); - break; - default : b_field_set = false; - } - if (b_field_set) { - b_ret = true; - i_track++; - idx = 0; - } - } else { - buffer[idx++] = pdata->text[j]; - } - buffer[idx] = 0x00; - } - } - pdata++; - } - return b_ret; -} - diff --git a/src/input/vcd/libcdio/cdtext_private.h b/src/input/vcd/libcdio/cdtext_private.h deleted file mode 100644 index 03a9c4945..000000000 --- a/src/input/vcd/libcdio/cdtext_private.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - $Id: cdtext_private.h,v 1.1 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -#ifndef __CDIO_CDTEXT_PRIVATE_H__ -#define __CDIO_CDTEXT_PRIVATE_H__ - -#include <cdio/cdio.h> -#include <cdio/cdtext.h> - -#define CDIO_CDTEXT_MAX_PACK_DATA 255 -#define CDIO_CDTEXT_MAX_TEXT_DATA 12 - -/* From table J.2 - Pack Type Indicator Definitions from - Working Draft NCITS XXX T10/1364-D Revision 10G. November 12, 2001. -*/ -/* Title of Alubm name (ID=0) or Track Titles (ID != 0) */ -#define CDIO_CDTEXT_TITLE 0x80 - -/* Name(s) of the performer(s) in ASCII */ -#define CDIO_CDTEXT_PERFORMER 0x81 - -/* Name(s) of the songwriter(s) in ASCII */ -#define CDIO_CDTEXT_SONGWRITER 0x82 - -/* Name(s) of the Composers in ASCII */ -#define CDIO_CDTEXT_COMPOSER 0x83 - -/* Name(s) of the Arrangers in ASCII */ -#define CDIO_CDTEXT_ARRANGER 0x84 - -/* Message(s) from content provider and/or artist in ASCII */ -#define CDIO_CDTEXT_MESSAGE 0x85 - -/* Disc Identificatin information */ -#define CDIO_CDTEXT_DISCID 0x86 - -/* Genre Identification and Genre Information */ -#define CDIO_CDTEXT_GENRE 0x87 - -/* Table of Content Information */ -#define CDIO_CDTEXT_TOC 0x88 - -/* Second Table of Content Information */ -#define CDIO_CDTEXT_TOC2 0x89 - -/* 0x8A, 0x8B, 0x8C are reserved - 0x8D Reserved for content provider only. - */ - -/* UPC/EAN code of the album and ISRC code of each track */ -#define CDIO_CDTEXT_UPC 0x8E - -/* Size information of the Block */ -#define CDIO_CDTEXT_BLOCKSIZE 0x8F - - -PRAGMA_BEGIN_PACKED - -struct CDText_data -{ - uint8_t type; - track_t i_track; - uint8_t seq; -#ifdef WORDS_BIGENDIAN - uint8_t bDBC: 1; /* double byte character */ - uint8_t block: 3; /* block number 0..7 */ - uint8_t characterPosition:4; /* character position */ -#else - uint8_t characterPosition:4; /* character position */ - uint8_t block :3; /* block number 0..7 */ - uint8_t bDBC :1; /* double byte character */ -#endif - char text[CDIO_CDTEXT_MAX_TEXT_DATA]; - uint8_t crc[2]; -} GNUC_PACKED; - -PRAGMA_END_PACKED - -typedef struct CDText_data CDText_data_t; - -typedef void (*set_cdtext_field_fn_t) (void *user_data, track_t i_track, - track_t i_first_track, - cdtext_field_t field, - const char *buffer); - -/* - Internal routine to parse all CD-TEXT data retrieved. -*/ -bool cdtext_data_init(void *user_data, track_t i_first_track, - unsigned char *wdata, - set_cdtext_field_fn_t set_cdtext_field_fn); - - -#endif /* __CDIO_CDTEXT_PRIVATE_H__ */ - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/ds.c b/src/input/vcd/libcdio/ds.c deleted file mode 100644 index 381c0f00c..000000000 --- a/src/input/vcd/libcdio/ds.c +++ /dev/null @@ -1,249 +0,0 @@ -/* - $Id: ds.c,v 1.3 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdlib.h> -#include <string.h> - -#include <cdio/ds.h> -#include <cdio/util.h> -#include <cdio/types.h> -#include "cdio_assert.h" - -static const char _rcsid[] = "$Id: ds.c,v 1.3 2005/01/01 02:43:57 rockyb Exp $"; - -struct _CdioList -{ - unsigned length; - - CdioListNode *begin; - CdioListNode *end; -}; - -struct _CdioListNode -{ - CdioList *list; - - CdioListNode *next; - - void *data; -}; - -/* impl */ - -CdioList * -_cdio_list_new (void) -{ - CdioList *new_obj = _cdio_malloc (sizeof (CdioList)); - - return new_obj; -} - -void -_cdio_list_free (CdioList *list, int free_data) -{ - while (_cdio_list_length (list)) - _cdio_list_node_free (_cdio_list_begin (list), free_data); - - free (list); -} - -unsigned -_cdio_list_length (const CdioList *list) -{ - cdio_assert (list != NULL); - - return list->length; -} - -void -_cdio_list_prepend (CdioList *list, void *data) -{ - CdioListNode *new_node; - - cdio_assert (list != NULL); - - new_node = _cdio_malloc (sizeof (CdioListNode)); - - new_node->list = list; - new_node->next = list->begin; - new_node->data = data; - - list->begin = new_node; - if (list->length == 0) - list->end = new_node; - - list->length++; -} - -void -_cdio_list_append (CdioList *list, void *data) -{ - cdio_assert (list != NULL); - - if (list->length == 0) - { - _cdio_list_prepend (list, data); - } - else - { - CdioListNode *new_node = _cdio_malloc (sizeof (CdioListNode)); - - new_node->list = list; - new_node->next = NULL; - new_node->data = data; - - list->end->next = new_node; - list->end = new_node; - - list->length++; - } -} - -void -_cdio_list_foreach (CdioList *list, _cdio_list_iterfunc func, void *user_data) -{ - CdioListNode *node; - - cdio_assert (list != NULL); - cdio_assert (func != 0); - - for (node = _cdio_list_begin (list); - node != NULL; - node = _cdio_list_node_next (node)) - func (_cdio_list_node_data (node), user_data); -} - -CdioListNode * -_cdio_list_find (CdioList *list, _cdio_list_iterfunc cmp_func, void *user_data) -{ - CdioListNode *node; - - cdio_assert (list != NULL); - cdio_assert (cmp_func != 0); - - for (node = _cdio_list_begin (list); - node != NULL; - node = _cdio_list_node_next (node)) - if (cmp_func (_cdio_list_node_data (node), user_data)) - break; - - return node; -} - -CdioListNode * -_cdio_list_begin (const CdioList *list) -{ - cdio_assert (list != NULL); - - return list->begin; -} - -CdioListNode * -_cdio_list_end (CdioList *list) -{ - cdio_assert (list != NULL); - - return list->end; -} - -CdioListNode * -_cdio_list_node_next (CdioListNode *node) -{ - if (node) - return node->next; - - return NULL; -} - -void -_cdio_list_node_free (CdioListNode *node, int free_data) -{ - CdioList *list; - CdioListNode *prev_node; - - cdio_assert (node != NULL); - - list = node->list; - - cdio_assert (_cdio_list_length (list) > 0); - - if (free_data) - free (_cdio_list_node_data (node)); - - if (_cdio_list_length (list) == 1) - { - cdio_assert (list->begin == list->end); - - list->end = list->begin = NULL; - list->length = 0; - free (node); - return; - } - - cdio_assert (list->begin != list->end); - - if (list->begin == node) - { - list->begin = node->next; - free (node); - list->length--; - return; - } - - for (prev_node = list->begin; prev_node->next; prev_node = prev_node->next) - if (prev_node->next == node) - break; - - cdio_assert (prev_node->next != NULL); - - if (list->end == node) - list->end = prev_node; - - prev_node->next = node->next; - - list->length--; - - free (node); -} - -void * -_cdio_list_node_data (CdioListNode *node) -{ - if (node) - return node->data; - - return NULL; -} - -/* eof */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ - diff --git a/src/input/vcd/libcdio/generic.h b/src/input/vcd/libcdio/generic.h deleted file mode 100644 index 9deb77254..000000000 --- a/src/input/vcd/libcdio/generic.h +++ /dev/null @@ -1,179 +0,0 @@ -/* - $Id: generic.h,v 1.1 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/* Internal routines for CD I/O drivers. */ - - -#ifndef __CDIO_GENERIC_H__ -#define __CDIO_GENERIC_H__ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <cdio/cdio.h> -#include <cdio/cdtext.h> -#include <cdio/iso9660.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - /*! - Things common to private device structures. Even though not all - devices may have some of these fields, by listing common ones - we facilitate writing generic routines and even cut-and-paste - code. - */ - typedef struct { - char *source_name; /**< Name used in open. */ - bool init; /**< True if structure has been initialized */ - bool toc_init; /**< True if TOC read in */ - bool b_cdtext_init; /**< True if CD-Text read in */ - bool b_cdtext_error; /**< True if trouble reading CD-Text */ - - int ioctls_debugged; /**< for debugging */ - - /* Only one of data_source or fd is used; fd is for CD-ROM - devices and the data_source for stream reading (bincue, nrg, toc, - network). - */ - CdioDataSource *data_source; - int fd; /**< File descriptor of device */ - track_t i_first_track; /**< The starting track number. */ - track_t i_tracks; /**< The number of tracks. */ - - uint8_t i_joliet_level; /**< 0 = no Joliet extensions. - 1-3: Joliet level. */ - iso9660_pvd_t pvd; - iso9660_svd_t svd; - CdIo *cdio; /**< a way to call general cdio routines. */ - cdtext_t cdtext; /**< CD-Text for disc. */ - cdtext_t cdtext_track[CDIO_CD_MAX_TRACKS+1]; /*CD-TEXT for each track*/ - - } generic_img_private_t; - - /*! - Bogus eject media when there is no ejectable media, e.g. a disk image - We always return 2. Should we also free resources? - */ - int cdio_generic_bogus_eject_media (void *env); - - /*! - Release and free resources associated with cd. - */ - void cdio_generic_free (void *env); - - /*! - Initialize CD device. - */ - bool cdio_generic_init (void *env); - - /*! - Reads into buf the next size bytes. - Returns -1 on error. - Is in fact libc's read(). - */ - off_t cdio_generic_lseek (void *env, off_t offset, int whence); - - /*! - Reads into buf the next size bytes. - Returns -1 on error. - Is in fact libc's read(). - */ - ssize_t cdio_generic_read (void *env, void *buf, size_t size); - - /*! - Reads a single form1 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ - int cdio_generic_read_form1_sector (void * user_data, void *data, - lsn_t lsn); - - /*! - Release and free resources associated with stream or disk image. - */ - void cdio_generic_stdio_free (void *env); - - /*! - Return true if source_name could be a device containing a CD-ROM on - Win32 - */ - bool cdio_is_device_win32(const char *source_name); - - - /*! - Return true if source_name could be a device containing a CD-ROM on - most Unix servers with block and character devices. - */ - bool cdio_is_device_generic(const char *source_name); - - - /*! - Like above, but don't give a warning device doesn't exist. - */ - bool cdio_is_device_quiet_generic(const char *source_name); - - /*! - Get cdtext information for a CdIo object . - - @param obj the CD object that may contain CD-TEXT information. - @return the CD-TEXT object or NULL if obj is NULL - or CD-TEXT information does not exist. - */ - const cdtext_t *get_cdtext_generic (void *p_user_data, track_t i_track); - - /*! - Return the number of of the first track. - CDIO_INVALID_TRACK is returned on error. - */ - track_t get_first_track_num_generic(void *p_user_data); - - /*! - Return the number of tracks in the current medium. - */ - track_t get_num_tracks_generic(void *p_user_data); - - /*! - Get disc type associated with cd object. - */ - discmode_t get_discmode_generic (void *p_user_data ); - - /*! - Same as above but only handles CD cases - */ - discmode_t get_discmode_cd_generic (void *p_user_data ); - - void set_cdtext_field_generic(void *user_data, track_t i_track, - track_t i_first_track, - cdtext_field_t e_field, const char *psz_value); - /*! - Read cdtext information for a CdIo object . - - return true on success, false on error or CD-Text information does - not exist. - */ - bool init_cdtext_generic (generic_img_private_t *p_env); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __CDIO_GENERIC_H__ */ diff --git a/src/input/vcd/libcdio/image.h b/src/input/vcd/libcdio/image.h deleted file mode 100644 index 79c836d32..000000000 --- a/src/input/vcd/libcdio/image.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - $Id: image.h,v 1.1 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/*! - Header for image drivers. In contrast to image_common.h which contains - routines, this header like most C headers does not depend on anything - defined before it is included. -*/ - -#ifndef __CDIO_IMAGE_H__ -#define __CDIO_IMAGE_H__ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <cdio/types.h> -#include <cdio/cdtext.h> -#include "cdio_private.h" -#include <cdio/sector.h> - -/*! - The universal format for information about a track for CD image readers - It may be that some fields can be derived from other fields. - Over time this structure may get cleaned up. Possibly this can be - expanded/reused for real CD formats. -*/ - -typedef struct { - track_t track_num; /**< Probably is index+1 */ - msf_t start_msf; - lba_t start_lba; - int start_index; - lba_t length; - lba_t pregap; /**< pre-gap with zero audio data */ - int sec_count; /**< Number of sectors in this track. Does not - include pregap */ - int num_indices; - flag_t flags; /**< "[NO] COPY", "4CH", "[NO] PREMPAHSIS" */ - char *isrc; /**< IRSC Code (5.22.4) exactly 12 bytes */ - char *filename; - CdioDataSource *data_source; - track_format_t track_format; - bool track_green; - cdtext_t cdtext; /**< CD-TEXT */ - - trackmode_t mode; - uint16_t datasize; /**< How much is in the portion we return - back? */ - uint16_t datastart; /**< Offset from begining that data starts */ - uint16_t endsize; /**< How much stuff at the end to skip over. - This stuff may have error correction - (EDC, or ECC).*/ - uint16_t blocksize; /**< total block size = start + size + end */ -} track_info_t; - - -#endif /* __CDIO_IMAGE_H__ */ diff --git a/src/input/vcd/libcdio/image/Makefile.am b/src/input/vcd/libcdio/image/Makefile.am deleted file mode 100644 index e7a09e980..000000000 --- a/src/input/vcd/libcdio/image/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -EXTRA_DIST = bincue.c nrg.c diff --git a/src/input/vcd/libcdio/image/bincue.c b/src/input/vcd/libcdio/image/bincue.c deleted file mode 100644 index 56f0e151c..000000000 --- a/src/input/vcd/libcdio/image/bincue.c +++ /dev/null @@ -1,1214 +0,0 @@ -/* - $Id: bincue.c,v 1.2 2005/01/01 02:43:58 rockyb Exp $ - - Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com> - Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> - cue parsing routine adapted from cuetools - Copyright (C) 2003 Svend Sanjay Sorensen <ssorensen@fastmail.fm> - - 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 -*/ - -/* This code implements low-level access functions for a CD images - residing inside a disk file (*.bin) and its associated cue sheet. - (*.cue). -*/ - -static const char _rcsid[] = "$Id: bincue.c,v 1.2 2005/01/01 02:43:58 rockyb Exp $"; - -#include "image.h" -#include "cdio_assert.h" -#include "cdio_private.h" -#include "_cdio_stdio.h" - -#include <cdio/logging.h> -#include <cdio/util.h> -#include <cdio/version.h> - -#ifdef HAVE_STDIO_H -#include <stdio.h> -#endif -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_STRING_H -#include <string.h> -#endif -#ifdef HAVE_STRINGS_H -#include <strings.h> -#endif -#ifdef HAVE_ERRNO_H -#include <errno.h> -#endif -#ifdef HAVE_GLOB_H -#include <glob.h> -#endif -#include <ctype.h> - -#include "portable.h" -/* reader */ - -#define DEFAULT_CDIO_DEVICE "videocd.bin" -#define DEFAULT_CDIO_CUE "videocd.cue" - -typedef struct { - /* Things common to all drivers like this. - This must be first. */ - generic_img_private_t gen; - internal_position_t pos; - - char *psz_cue_name; - char *psz_mcn; /* Media Catalog Number (5.22.3) - exactly 13 bytes */ - track_info_t tocent[CDIO_CD_MAX_TRACKS+1]; /* entry info for each track - add 1 for leadout. */ - discmode_t disc_mode; -} _img_private_t; - -static uint32_t _stat_size_bincue (void *user_data); -static bool parse_cuefile (_img_private_t *cd, const char *toc_name); - -#define NEED_MEDIA_EJECT_IMAGE -#include "image_common.h" - -/*! - Initialize image structures. - */ -static bool -_init_bincue (_img_private_t *env) -{ - lsn_t lead_lsn; - - if (env->gen.init) - return false; - - if (!(env->gen.data_source = cdio_stdio_new (env->gen.source_name))) { - cdio_warn ("init failed"); - return false; - } - - /* Have to set init before calling _stat_size_bincue() or we will - get into infinite recursion calling passing right here. - */ - env->gen.init = true; - env->gen.i_first_track = 1; - env->psz_mcn = NULL; - env->disc_mode = CDIO_DISC_MODE_NO_INFO; - - cdtext_init (&(env->gen.cdtext)); - - lead_lsn = _stat_size_bincue( (_img_private_t *) env); - - if (-1 == lead_lsn) return false; - - if ((env->psz_cue_name == NULL)) return false; - - /* Read in CUE sheet. */ - if ( !parse_cuefile(env, env->psz_cue_name) ) return false; - - /* Fake out leadout track and sector count for last track*/ - cdio_lsn_to_msf (lead_lsn, &env->tocent[env->gen.i_tracks].start_msf); - env->tocent[env->gen.i_tracks].start_lba = cdio_lsn_to_lba(lead_lsn); - env->tocent[env->gen.i_tracks - env->gen.i_first_track].sec_count = - cdio_lsn_to_lba(lead_lsn - - env->tocent[env->gen.i_tracks - env->gen.i_first_track].start_lba); - - return true; -} - -/*! - Reads into buf the next size bytes. - Returns -1 on error. - Would be libc's seek() but we have to adjust for the extra track header - information in each sector. -*/ -static off_t -_lseek_bincue (void *user_data, off_t offset, int whence) -{ - _img_private_t *env = user_data; - - /* real_offset is the real byte offset inside the disk image - The number below was determined empirically. I'm guessing - the 1st 24 bytes of a bin file are used for something. - */ - off_t real_offset=0; - - unsigned int i; - - env->pos.lba = 0; - for (i=0; i<env->gen.i_tracks; i++) { - track_info_t *this_track=&(env->tocent[i]); - env->pos.index = i; - if ( (this_track->sec_count*this_track->datasize) >= offset) { - int blocks = offset / this_track->datasize; - int rem = offset % this_track->datasize; - int block_offset = blocks * this_track->blocksize; - real_offset += block_offset + rem; - env->pos.buff_offset = rem; - env->pos.lba += blocks; - break; - } - real_offset += this_track->sec_count*this_track->blocksize; - offset -= this_track->sec_count*this_track->datasize; - env->pos.lba += this_track->sec_count; - } - - if (i==env->gen.i_tracks) { - cdio_warn ("seeking outside range of disk image"); - return -1; - } else { - real_offset += env->tocent[i].datastart; - return cdio_stream_seek(env->gen.data_source, real_offset, whence); - } -} - -/*! - Reads into buf the next size bytes. - Returns -1 on error. - FIXME: - At present we assume a read doesn't cross sector or track - boundaries. -*/ -static ssize_t -_read_bincue (void *user_data, void *data, size_t size) -{ - _img_private_t *env = user_data; - char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; - char *p = data; - ssize_t final_size=0; - ssize_t this_size; - track_info_t *this_track=&(env->tocent[env->pos.index]); - ssize_t skip_size = this_track->datastart + this_track->endsize; - - while (size > 0) { - long int rem = this_track->datasize - env->pos.buff_offset; - if ((long int) size <= rem) { - this_size = cdio_stream_read(env->gen.data_source, buf, size, 1); - final_size += this_size; - memcpy (p, buf, this_size); - break; - } - - /* Finish off reading this sector. */ - cdio_warn ("Reading across block boundaries not finished"); - - size -= rem; - this_size = cdio_stream_read(env->gen.data_source, buf, rem, 1); - final_size += this_size; - memcpy (p, buf, this_size); - p += this_size; - this_size = cdio_stream_read(env->gen.data_source, buf, rem, 1); - - /* Skip over stuff at end of this sector and the beginning of the next. - */ - cdio_stream_read(env->gen.data_source, buf, skip_size, 1); - - /* Get ready to read another sector. */ - env->pos.buff_offset=0; - env->pos.lba++; - - /* Have gone into next track. */ - if (env->pos.lba >= env->tocent[env->pos.index+1].start_lba) { - env->pos.index++; - this_track=&(env->tocent[env->pos.index]); - skip_size = this_track->datastart + this_track->endsize; - } - } - return final_size; -} - -/*! - Return the size of the CD in logical block address (LBA) units. - */ -static uint32_t -_stat_size_bincue (void *user_data) -{ - _img_private_t *env = user_data; - long size; - - size = cdio_stream_stat (env->gen.data_source); - - if (size % CDIO_CD_FRAMESIZE_RAW) - { - cdio_warn ("image %s size (%ld) not multiple of blocksize (%d)", - env->gen.source_name, size, CDIO_CD_FRAMESIZE_RAW); - if (size % M2RAW_SECTOR_SIZE == 0) - cdio_warn ("this may be a 2336-type disc image"); - else if (size % CDIO_CD_FRAMESIZE_RAW == 0) - cdio_warn ("this may be a 2352-type disc image"); - /* exit (EXIT_FAILURE); */ - } - - size /= CDIO_CD_FRAMESIZE_RAW; - - return size; -} - -#define MAXLINE 4096 /* maximum line length + 1 */ - -static bool -parse_cuefile (_img_private_t *cd, const char *psz_cue_name) -{ - /* The below declarations may be common in other image-parse routines. */ - FILE *fp; - char psz_line[MAXLINE]; /* text of current line read in file fp. */ - unsigned int i_line=0; /* line number in file of psz_line. */ - int i = -1; /* Position in tocent. Same as - cd->gen.i_tracks - 1 */ - char *psz_keyword, *psz_field; - cdio_log_level_t log_level = (NULL == cd) ? CDIO_LOG_INFO : CDIO_LOG_WARN; - cdtext_field_t cdtext_key; - - /* The below declarations may be unique to this image-parse routine. */ - int start_index; - bool b_first_index_for_track=false; - - if (NULL == psz_cue_name) - return false; - - fp = fopen (psz_cue_name, "r"); - if (fp == NULL) { - cdio_log(log_level, "error opening %s for reading: %s", - psz_cue_name, strerror(errno)); - return false; - } - - if (cd) { - cd->gen.i_tracks=0; - cd->gen.i_first_track=1; - cd->gen.b_cdtext_init = true; - cd->gen.b_cdtext_error = false; - cd->psz_mcn=NULL; - } - - while ((fgets(psz_line, MAXLINE, fp)) != NULL) { - - i_line++; - - if (NULL != (psz_keyword = strtok (psz_line, " \t\n\r"))) { - /* REM remarks ... */ - if (0 == strcmp ("REM", psz_keyword)) { - ; - - /* global section */ - /* CATALOG ddddddddddddd */ - } else if (0 == strcmp ("CATALOG", psz_keyword)) { - if (-1 == i) { - if (NULL == (psz_field = strtok (NULL, " \t\n\r"))) { - cdio_log(log_level, - "%s line %d after word CATALOG: ", - psz_cue_name, i_line); - cdio_log(log_level, - "expecting 13-digit media catalog number, got nothing."); - goto err_exit; - } - if (strlen(psz_field) != 13) { - cdio_log(log_level, - "%s line %d after word CATALOG: ", - psz_cue_name, i_line); - cdio_log(log_level, - "Token %s has length %ld. Should be 13 digits.", - psz_field, (long int) strlen(psz_field)); - goto err_exit; - } else { - /* Check that we have all digits*/ - unsigned int i; - for (i=0; i<13; i++) { - if (!isdigit(psz_field[i])) { - cdio_log(log_level, - "%s line %d after word CATALOG:", - psz_cue_name, i_line); - cdio_log(log_level, - "Character \"%c\" at postition %i of token \"%s\" " - "is not all digits.", - psz_field[i], i+1, psz_field); - goto err_exit; - } - } - } - - if (cd) cd->psz_mcn = strdup (psz_field); - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - goto format_error; - } - } else { - goto not_in_global_section; - } - - /* FILE "<filename>" <BINARY|WAVE|other?> */ - } else if (0 == strcmp ("FILE", psz_keyword)) { - if (NULL != (psz_field = strtok (NULL, "\"\t\n\r"))) { - if (cd) cd->tocent[i + 1].filename = strdup (psz_field); - } else { - goto format_error; - } - - /* TRACK N <mode> */ - } else if (0 == strcmp ("TRACK", psz_keyword)) { - int i_track; - - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - if (1!=sscanf(psz_field, "%d", &i_track)) { - cdio_log(log_level, - "%s line %d after word TRACK:", - psz_cue_name, i_line); - cdio_log(log_level, - "Expecting a track number, got %s", psz_field); - goto err_exit; - } - } - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - track_info_t *this_track=NULL; - - if (cd) { - this_track = &(cd->tocent[cd->gen.i_tracks]); - this_track->track_num = cd->gen.i_tracks; - this_track->num_indices = 0; - b_first_index_for_track = false; - cdtext_init (&(cd->gen.cdtext_track[cd->gen.i_tracks])); - cd->gen.i_tracks++; - } - i++; - - if (0 == strcmp ("AUDIO", psz_field)) { - if (cd) { - this_track->mode = AUDIO; - this_track->blocksize = CDIO_CD_FRAMESIZE_RAW; - this_track->datasize = CDIO_CD_FRAMESIZE_RAW; - this_track->datastart = 0; - this_track->endsize = 0; - this_track->track_format = TRACK_FORMAT_AUDIO; - this_track->track_green = false; - switch(cd->disc_mode) { - case CDIO_DISC_MODE_NO_INFO: - cd->disc_mode = CDIO_DISC_MODE_CD_DA; - break; - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* Disc type stays the same. */ - break; - case CDIO_DISC_MODE_CD_DATA: - case CDIO_DISC_MODE_CD_XA: - cd->disc_mode = CDIO_DISC_MODE_CD_MIXED; - break; - default: - cd->disc_mode = CDIO_DISC_MODE_ERROR; - } - } - } else if (0 == strcmp ("MODE1/2048", psz_field)) { - if (cd) { - this_track->mode = MODE1; - this_track->blocksize = 2048; - this_track->track_format= TRACK_FORMAT_DATA; - this_track->track_green = false; - /* Is the below correct? */ - this_track->datastart = 0; - this_track->datasize = CDIO_CD_FRAMESIZE; - this_track->endsize = 0; - switch(cd->disc_mode) { - case CDIO_DISC_MODE_NO_INFO: - cd->disc_mode = CDIO_DISC_MODE_CD_DATA; - break; - case CDIO_DISC_MODE_CD_DATA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* Disc type stays the same. */ - break; - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_XA: - cd->disc_mode = CDIO_DISC_MODE_CD_MIXED; - break; - default: - cd->disc_mode = CDIO_DISC_MODE_ERROR; - } - } - } else if (0 == strcmp ("MODE1/2352", psz_field)) { - if (cd) { - this_track->blocksize = 2352; - this_track->track_format= TRACK_FORMAT_DATA; - this_track->track_green = false; - this_track->datastart = CDIO_CD_SYNC_SIZE - + CDIO_CD_HEADER_SIZE; - this_track->datasize = CDIO_CD_FRAMESIZE; - this_track->endsize = CDIO_CD_EDC_SIZE - + CDIO_CD_M1F1_ZERO_SIZE + CDIO_CD_ECC_SIZE; - this_track->mode = MODE1_RAW; - switch(cd->disc_mode) { - case CDIO_DISC_MODE_NO_INFO: - cd->disc_mode = CDIO_DISC_MODE_CD_DATA; - break; - case CDIO_DISC_MODE_CD_DATA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* Disc type stays the same. */ - break; - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_XA: - cd->disc_mode = CDIO_DISC_MODE_CD_MIXED; - break; - default: - cd->disc_mode = CDIO_DISC_MODE_ERROR; - } - } - } else if (0 == strcmp ("MODE2/2336", psz_field)) { - if (cd) { - this_track->blocksize = 2336; - this_track->track_format= TRACK_FORMAT_XA; - this_track->track_green = true; - this_track->mode = MODE2; - this_track->datastart = CDIO_CD_SYNC_SIZE - + CDIO_CD_HEADER_SIZE; - this_track->datasize = M2RAW_SECTOR_SIZE; - this_track->endsize = 0; - switch(cd->disc_mode) { - case CDIO_DISC_MODE_NO_INFO: - cd->disc_mode = CDIO_DISC_MODE_CD_DATA; - break; - case CDIO_DISC_MODE_CD_DATA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* Disc type stays the same. */ - break; - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_XA: - cd->disc_mode = CDIO_DISC_MODE_CD_MIXED; - break; - default: - cd->disc_mode = CDIO_DISC_MODE_ERROR; - } - } - } else if (0 == strcmp ("MODE2/2048", psz_field)) { - if (cd) { - this_track->blocksize = 2048; - this_track->track_format= TRACK_FORMAT_XA; - this_track->track_green = true; - this_track->mode = MODE2_FORM1; - switch(cd->disc_mode) { - case CDIO_DISC_MODE_NO_INFO: - cd->disc_mode = CDIO_DISC_MODE_CD_XA; - break; - case CDIO_DISC_MODE_CD_XA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* Disc type stays the same. */ - break; - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_DATA: - cd->disc_mode = CDIO_DISC_MODE_CD_MIXED; - break; - default: - cd->disc_mode = CDIO_DISC_MODE_ERROR; - } - } - } else if (0 == strcmp ("MODE2/2324", psz_field)) { - if (cd) { - this_track->blocksize = 2324; - this_track->track_format= TRACK_FORMAT_XA; - this_track->track_green = true; - this_track->mode = MODE2_FORM2; - switch(cd->disc_mode) { - case CDIO_DISC_MODE_NO_INFO: - cd->disc_mode = CDIO_DISC_MODE_CD_XA; - break; - case CDIO_DISC_MODE_CD_XA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* Disc type stays the same. */ - break; - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_DATA: - cd->disc_mode = CDIO_DISC_MODE_CD_MIXED; - break; - default: - cd->disc_mode = CDIO_DISC_MODE_ERROR; - } - } - } else if (0 == strcmp ("MODE2/2336", psz_field)) { - if (cd) { - this_track->blocksize = 2336; - this_track->track_format= TRACK_FORMAT_XA; - this_track->track_green = true; - this_track->mode = MODE2_FORM_MIX; - this_track->datastart = CDIO_CD_SYNC_SIZE - + CDIO_CD_HEADER_SIZE; - this_track->datasize = M2RAW_SECTOR_SIZE; - this_track->endsize = 0; - switch(cd->disc_mode) { - case CDIO_DISC_MODE_NO_INFO: - cd->disc_mode = CDIO_DISC_MODE_CD_XA; - break; - case CDIO_DISC_MODE_CD_XA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* Disc type stays the same. */ - break; - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_DATA: - cd->disc_mode = CDIO_DISC_MODE_CD_MIXED; - break; - default: - cd->disc_mode = CDIO_DISC_MODE_ERROR; - } - } - } else if (0 == strcmp ("MODE2/2352", psz_field)) { - if (cd) { - this_track->blocksize = 2352; - this_track->track_format= TRACK_FORMAT_XA; - this_track->track_green = true; - this_track->mode = MODE2_RAW; - this_track->datastart = CDIO_CD_SYNC_SIZE - + CDIO_CD_HEADER_SIZE + CDIO_CD_SUBHEADER_SIZE; - this_track->datasize = CDIO_CD_FRAMESIZE; - this_track->endsize = CDIO_CD_SYNC_SIZE + CDIO_CD_ECC_SIZE; - switch(cd->disc_mode) { - case CDIO_DISC_MODE_NO_INFO: - cd->disc_mode = CDIO_DISC_MODE_CD_XA; - break; - case CDIO_DISC_MODE_CD_XA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* Disc type stays the same. */ - break; - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_DATA: - cd->disc_mode = CDIO_DISC_MODE_CD_MIXED; - break; - default: - cd->disc_mode = CDIO_DISC_MODE_ERROR; - } - } - } else { - cdio_log(log_level, - "%s line %d after word TRACK:", - psz_cue_name, i_line); - cdio_log(log_level, - "Unknown track mode %s", psz_field); - goto err_exit; - } - } else { - goto format_error; - } - - /* FLAGS flag1 flag2 ... */ - } else if (0 == strcmp ("FLAGS", psz_keyword)) { - if (0 <= i) { - while (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - if (0 == strcmp ("PRE", psz_field)) { - if (cd) cd->tocent[i].flags |= PRE_EMPHASIS; - } else if (0 == strcmp ("DCP", psz_field)) { - if (cd) cd->tocent[i].flags |= COPY_PERMITTED; - } else if (0 == strcmp ("4CH", psz_field)) { - if (cd) cd->tocent[i].flags |= FOUR_CHANNEL_AUDIO; - } else if (0 == strcmp ("SCMS", psz_field)) { - if (cd) cd->tocent[i].flags |= SCMS; - } else { - goto format_error; - } - } - } else { - goto format_error; - } - - /* ISRC CCOOOYYSSSSS */ - } else if (0 == strcmp ("ISRC", psz_keyword)) { - if (0 <= i) { - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - if (cd) cd->tocent[i].isrc = strdup (psz_field); - } else { - goto format_error; - } - } else { - goto in_global_section; - } - - /* PREGAP MM:SS:FF */ - } else if (0 == strcmp ("PREGAP", psz_keyword)) { - if (0 <= i) { - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - lba_t lba = cdio_lsn_to_lba(cdio_mmssff_to_lba (psz_field)); - if (CDIO_INVALID_LBA == lba) { - cdio_log(log_level, "%s line %d: after word PREGAP:", - psz_cue_name, i_line); - cdio_log(log_level, "Invalid MSF string %s", - psz_field); - goto err_exit; - } - if (cd) { - cd->tocent[i].pregap = lba; - } - } else { - goto format_error; - } if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - goto format_error; - } - } else { - goto in_global_section; - } - - /* INDEX [##] MM:SS:FF */ - } else if (0 == strcmp ("INDEX", psz_keyword)) { - if (0 <= i) { - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) - if (1!=sscanf(psz_field, "%d", &start_index)) { - cdio_log(log_level, - "%s line %d after word INDEX:", - psz_cue_name, i_line); - cdio_log(log_level, - "expecting an index number, got %s", - psz_field); - goto err_exit; - } - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - lba_t lba = cdio_mmssff_to_lba (psz_field); - if (CDIO_INVALID_LBA == lba) { - cdio_log(log_level, "%s line %d: after word INDEX:", - psz_cue_name, i_line); - cdio_log(log_level, "Invalid MSF string %s", - psz_field); - goto err_exit; - } - if (cd) { -#if FIXED_ME - cd->tocent[i].indexes[cd->tocent[i].nindex++] = lba; -#else - track_info_t *this_track= - &(cd->tocent[cd->gen.i_tracks - cd->gen.i_first_track]); - - if (start_index != 0) { - if (!b_first_index_for_track) { - lba += CDIO_PREGAP_SECTORS; - cdio_lba_to_msf(lba, &(this_track->start_msf)); - b_first_index_for_track = true; - this_track->start_lba = lba; - } - - if (cd->gen.i_tracks > 1) { - /* Figure out number of sectors for previous track */ - track_info_t *prev_track=&(cd->tocent[cd->gen.i_tracks-2]); - if ( this_track->start_lba < prev_track->start_lba ) { - cdio_log (log_level, - "track %d at LBA %lu starts before track %d at LBA %lu", - cd->gen.i_tracks, - (unsigned long int) this_track->start_lba, - cd->gen.i_tracks, - (unsigned long int) prev_track->start_lba); - prev_track->sec_count = 0; - } else if ( this_track->start_lba >= prev_track->start_lba - + CDIO_PREGAP_SECTORS ) { - prev_track->sec_count = this_track->start_lba - - prev_track->start_lba - CDIO_PREGAP_SECTORS ; - } else { - cdio_log (log_level, - "%lu fewer than pregap (%d) sectors in track %d", - (long unsigned int) - this_track->start_lba - prev_track->start_lba, - CDIO_PREGAP_SECTORS, - cd->gen.i_tracks); - /* Include pregap portion in sec_count. Maybe the pregap - was omitted. */ - prev_track->sec_count = this_track->start_lba - - prev_track->start_lba; - } - } - this_track->num_indices++; - } - } -#endif - } else { - goto format_error; - } - } else { - goto in_global_section; - } - - /* CD-TEXT */ - } else if ( CDTEXT_INVALID != - (cdtext_key = cdtext_is_keyword (psz_keyword)) ) { - if (-1 == i) { - if (cd) { - cdtext_set (cdtext_key, - strtok (NULL, "\"\t\n\r"), - &(cd->gen.cdtext)); - } - } else { - if (cd) { - cdtext_set (cdtext_key, strtok (NULL, "\"\t\n\r"), - &(cd->gen.cdtext_track[i])); - } - } - - /* unrecognized line */ - } else { - cdio_log(log_level, "%s line %d: warning: unrecognized keyword: %s", - psz_cue_name, i_line, psz_keyword); - goto err_exit; - } - } - } - - if (NULL != cd) { - cd->gen.toc_init = true; - } - - fclose (fp); - return true; - - format_error: - cdio_log(log_level, "%s line %d after word %s", - psz_cue_name, i_line, psz_keyword); - goto err_exit; - - in_global_section: - cdio_log(log_level, "%s line %d: word %s not allowed in global section", - psz_cue_name, i_line, psz_keyword); - goto err_exit; - - not_in_global_section: - cdio_log(log_level, "%s line %d: word %s only allowed in global section", - psz_cue_name, i_line, psz_keyword); - - err_exit: - fclose (fp); - return false; - -} - -/*! - Reads a single audio sector from CD device into data starting - from lsn. Returns 0 if no error. - */ -static int -_read_audio_sectors_bincue (void *user_data, void *data, lsn_t lsn, - unsigned int nblocks) -{ - _img_private_t *env = user_data; - int ret; - - /* Why the adjustment of 272, I don't know. It seems to work though */ - if (lsn != 0) { - ret = cdio_stream_seek (env->gen.data_source, - (lsn * CDIO_CD_FRAMESIZE_RAW) - 272, SEEK_SET); - if (ret!=0) return ret; - - ret = cdio_stream_read (env->gen.data_source, data, - CDIO_CD_FRAMESIZE_RAW, nblocks); - } else { - /* We need to pad out the first 272 bytes with 0's */ - BZERO(data, 272); - - ret = cdio_stream_seek (env->gen.data_source, 0, SEEK_SET); - - if (ret!=0) return ret; - - ret = cdio_stream_read (env->gen.data_source, (uint8_t *) data+272, - CDIO_CD_FRAMESIZE_RAW - 272, nblocks); - } - - /* ret is number of bytes if okay, but we need to return 0 okay. */ - return ret == 0; -} - -/*! - Reads a single mode2 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ -static int -_read_mode1_sector_bincue (void *user_data, void *data, lsn_t lsn, - bool b_form2) -{ - _img_private_t *p_env = user_data; - int ret; - char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; - int blocksize = CDIO_CD_FRAMESIZE_RAW; - - ret = cdio_stream_seek (p_env->gen.data_source, lsn * blocksize, SEEK_SET); - if (ret!=0) return ret; - - /* FIXME: Not completely sure the below is correct. */ - ret = cdio_stream_read (p_env->gen.data_source, buf, CDIO_CD_FRAMESIZE_RAW, 1); - if (ret==0) return ret; - - memcpy (data, buf + CDIO_CD_SYNC_SIZE + CDIO_CD_HEADER_SIZE, - b_form2 ? M2RAW_SECTOR_SIZE: CDIO_CD_FRAMESIZE); - - return 0; -} - -/*! - Reads nblocks of mode1 sectors from cd device into data starting - from lsn. - Returns 0 if no error. - */ -static int -_read_mode1_sectors_bincue (void *user_data, void *data, lsn_t lsn, - bool b_form2, unsigned int nblocks) -{ - _img_private_t *p_env = user_data; - int i; - int retval; - unsigned int blocksize = b_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE; - - for (i = 0; i < nblocks; i++) { - if ( (retval = _read_mode1_sector_bincue (p_env, - ((char *)data) + (blocksize * i), - lsn + i, b_form2)) ) - return retval; - } - return 0; -} - -/*! - Reads a single mode1 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ -static int -_read_mode2_sector_bincue (void *user_data, void *data, lsn_t lsn, - bool b_form2) -{ - _img_private_t *p_env = user_data; - int ret; - char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; - - /* NOTE: The logic below seems a bit wrong and convoluted - to me, but passes the regression tests. (Perhaps it is why we get - valgrind errors in vcdxrip). Leave it the way it was for now. - Review this sector 2336 stuff later. - */ - - int blocksize = CDIO_CD_FRAMESIZE_RAW; - - ret = cdio_stream_seek (p_env->gen.data_source, lsn * blocksize, SEEK_SET); - if (ret!=0) return ret; - - ret = cdio_stream_read (p_env->gen.data_source, buf, CDIO_CD_FRAMESIZE_RAW, 1); - if (ret==0) return ret; - - - /* See NOTE above. */ - if (b_form2) - memcpy (data, buf + CDIO_CD_SYNC_SIZE + CDIO_CD_HEADER_SIZE, - M2RAW_SECTOR_SIZE); - else - memcpy (data, buf + CDIO_CD_XA_SYNC_HEADER, CDIO_CD_FRAMESIZE); - - return 0; -} - -/*! - Reads nblocks of mode2 sectors from cd device into data starting - from lsn. - Returns 0 if no error. - */ -static int -_read_mode2_sectors_bincue (void *user_data, void *data, lsn_t lsn, - bool b_form2, unsigned int nblocks) -{ - _img_private_t *p_env = user_data; - int i; - int retval; - unsigned int blocksize = b_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE; - - for (i = 0; i < nblocks; i++) { - if ( (retval = _read_mode2_sector_bincue (p_env, - ((char *)data) + (blocksize * i), - lsn + i, b_form2)) ) - return retval; - } - return 0; -} - -/*! - Return an array of strings giving possible BIN/CUE disk images. - */ -char ** -cdio_get_devices_bincue (void) -{ - char **drives = NULL; - unsigned int num_files=0; -#ifdef HAVE_GLOB_H - unsigned int i; - glob_t globbuf; - globbuf.gl_offs = 0; - glob("*.cue", GLOB_DOOFFS, NULL, &globbuf); - for (i=0; i<globbuf.gl_pathc; i++) { - cdio_add_device_list(&drives, globbuf.gl_pathv[i], &num_files); - } - globfree(&globbuf); -#else - cdio_add_device_list(&drives, DEFAULT_CDIO_DEVICE, &num_files); -#endif /*HAVE_GLOB_H*/ - cdio_add_device_list(&drives, NULL, &num_files); - return drives; -} - -/*! - Return a string containing the default CD device. - */ -char * -cdio_get_default_device_bincue(void) -{ - char **drives = cdio_get_devices_nrg(); - char *drive = (drives[0] == NULL) ? NULL : strdup(drives[0]); - cdio_free_device_list(drives); - return drive; -} - -static bool -get_hwinfo_bincue ( const CdIo *p_cdio, /*out*/ cdio_hwinfo_t *hw_info) -{ - strcpy(hw_info->psz_vendor, "libcdio"); - strcpy(hw_info->psz_model, "CDRWIN"); - strcpy(hw_info->psz_revision, CDIO_VERSION); - return true; - -} - -/*! - Return the number of tracks in the current medium. - CDIO_INVALID_TRACK is returned on error. -*/ -static track_format_t -_get_track_format_bincue(void *user_data, track_t i_track) -{ - _img_private_t *p_env = user_data; - - if (i_track > p_env->gen.i_tracks || i_track == 0) - return TRACK_FORMAT_ERROR; - - return p_env->tocent[i_track-p_env->gen.i_first_track].track_format; -} - -/*! - Return true if we have XA data (green, mode2 form1) or - XA data (green, mode2 form2). That is track begins: - sync - header - subheader - 12 4 - 8 - - FIXME: there's gotta be a better design for this and get_track_format? -*/ -static bool -_get_track_green_bincue(void *user_data, track_t i_track) -{ - _img_private_t *p_env = user_data; - - if ( NULL == p_env || - ( i_track < p_env->gen.i_first_track - || i_track >= p_env->gen.i_tracks + p_env->gen.i_first_track ) ) - return false; - - return p_env->tocent[i_track-p_env->gen.i_first_track].track_green; -} - -/*! - Return the starting LSN track number - i_track in obj. Track numbers start at 1. - The "leadout" track is specified either by - using i_track LEADOUT_TRACK or the total tracks+1. - False is returned if there is no track entry. -*/ -static lba_t -_get_lba_track_bincue(void *user_data, track_t i_track) -{ - _img_private_t *p_env = user_data; - - if (i_track == CDIO_CDROM_LEADOUT_TRACK) i_track = p_env->gen.i_tracks+1; - - if (i_track <= p_env->gen.i_tracks + p_env->gen.i_first_track && i_track != 0) { - return p_env->tocent[i_track-p_env->gen.i_first_track].start_lba; - } else - return CDIO_INVALID_LBA; -} - -/*! - Return corresponding BIN file if psz_cue_name is a cue file or NULL - if not a CUE file. -*/ -char * -cdio_is_cuefile(const char *psz_cue_name) -{ - int i; - char *psz_bin_name; - - if (psz_cue_name == NULL) return NULL; - - /* FIXME? Now that we have cue parsing, should we really force - the filename extension requirement or is it enough just to - parse the cuefile? - */ - - psz_bin_name=strdup(psz_cue_name); - i=strlen(psz_bin_name)-strlen("cue"); - - if (i>0) { - if (psz_cue_name[i]=='c' && psz_cue_name[i+1]=='u' && psz_cue_name[i+2]=='e') { - psz_bin_name[i++]='b'; psz_bin_name[i++]='i'; psz_bin_name[i++]='n'; - if (parse_cuefile(NULL, psz_cue_name)) - return psz_bin_name; - else - goto error; - } - else if (psz_cue_name[i]=='C' && psz_cue_name[i+1]=='U' && psz_cue_name[i+2]=='E') { - psz_bin_name[i++]='B'; psz_bin_name[i++]='I'; psz_bin_name[i++]='N'; - if (parse_cuefile(NULL, psz_cue_name)) - return psz_bin_name; - else - goto error; - } - } - error: - free(psz_bin_name); - return NULL; -} - -/*! - Return corresponding CUE file if psz_bin_name is a bin file or NULL - if not a BIN file. -*/ -char * -cdio_is_binfile(const char *psz_bin_name) -{ - int i; - char *psz_cue_name; - - if (psz_bin_name == NULL) return NULL; - - psz_cue_name=strdup(psz_bin_name); - i=strlen(psz_bin_name)-strlen("bin"); - - if (i>0) { - if (psz_bin_name[i]=='b' && psz_bin_name[i+1]=='i' && psz_bin_name[i+2]=='n') { - psz_cue_name[i++]='c'; psz_cue_name[i++]='u'; psz_cue_name[i++]='e'; - return psz_cue_name; - } - else if (psz_bin_name[i]=='B' && psz_bin_name[i+1]=='I' && psz_bin_name[i+2]=='N') { - psz_cue_name[i++]='C'; psz_cue_name[i++]='U'; psz_cue_name[i++]='E'; - return psz_cue_name; - } - } - free(psz_cue_name); - return NULL; -} - -/*! - Initialization routine. This is the only thing that doesn't - get called via a function pointer. In fact *we* are the - ones to set that up. - */ -CdIo * -cdio_open_am_bincue (const char *psz_source_name, const char *psz_access_mode) -{ - if (psz_access_mode != NULL) - cdio_warn ("there is only one access mode for bincue. Arg %s ignored", - psz_access_mode); - return cdio_open_bincue(psz_source_name); -} - -/*! - Initialization routine. This is the only thing that doesn't - get called via a function pointer. In fact *we* are the - ones to set that up. - */ -CdIo * -cdio_open_bincue (const char *source_name) -{ - char *psz_bin_name = cdio_is_cuefile(source_name); - - if (NULL != psz_bin_name) { - free(psz_bin_name); - return cdio_open_cue(source_name); - } else { - char *psz_cue_name = cdio_is_binfile(source_name); - CdIo *cdio = cdio_open_cue(psz_cue_name); - free(psz_cue_name); - return cdio; - } -} - -CdIo * -cdio_open_cue (const char *psz_cue_name) -{ - CdIo *ret; - _img_private_t *_data; - char *psz_bin_name; - - cdio_funcs _funcs; - - memset( &_funcs, 0, sizeof(_funcs) ); - - _funcs.eject_media = _eject_media_image; - _funcs.free = _free_image; - _funcs.get_arg = _get_arg_image; - _funcs.get_cdtext = get_cdtext_generic; - _funcs.get_devices = cdio_get_devices_bincue; - _funcs.get_default_device = cdio_get_default_device_bincue; - _funcs.get_discmode = _get_discmode_image; - _funcs.get_drive_cap = _get_drive_cap_image; - _funcs.get_first_track_num= _get_first_track_num_image; - _funcs.get_hwinfo = get_hwinfo_bincue; - _funcs.get_mcn = _get_mcn_image; - _funcs.get_num_tracks = _get_num_tracks_image; - _funcs.get_track_format = _get_track_format_bincue; - _funcs.get_track_green = _get_track_green_bincue; - _funcs.get_track_lba = _get_lba_track_bincue; - _funcs.get_track_msf = _get_track_msf_image; - _funcs.lseek = _lseek_bincue; - _funcs.read = _read_bincue; - _funcs.read_audio_sectors = _read_audio_sectors_bincue; - _funcs.read_mode1_sector = _read_mode1_sector_bincue; - _funcs.read_mode1_sectors = _read_mode1_sectors_bincue; - _funcs.read_mode2_sector = _read_mode2_sector_bincue; - _funcs.read_mode2_sectors = _read_mode2_sectors_bincue; - _funcs.set_arg = _set_arg_image; - _funcs.stat_size = _stat_size_bincue; - - if (NULL == psz_cue_name) return NULL; - - _data = _cdio_malloc (sizeof (_img_private_t)); - _data->gen.init = false; - _data->psz_cue_name = NULL; - - ret = cdio_new ((void *)_data, &_funcs); - - if (ret == NULL) { - free(_data); - return NULL; - } - - psz_bin_name = cdio_is_cuefile(psz_cue_name); - - if (NULL == psz_bin_name) { - cdio_error ("source name %s is not recognized as a CUE file", - psz_cue_name); - } - - _set_arg_image (_data, "cue", psz_cue_name); - _set_arg_image (_data, "source", psz_bin_name); - free(psz_bin_name); - - if (_init_bincue(_data)) { - return ret; - } else { - _free_image(_data); - free(ret); - return NULL; - } -} - -bool -cdio_have_bincue (void) -{ - return true; -} diff --git a/src/input/vcd/libcdio/image/cdrdao.c b/src/input/vcd/libcdio/image/cdrdao.c deleted file mode 100644 index 828172721..000000000 --- a/src/input/vcd/libcdio/image/cdrdao.c +++ /dev/null @@ -1,1198 +0,0 @@ -/* - $Id: cdrdao.c,v 1.1 2005/01/01 02:43:58 rockyb Exp $ - - Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> - toc reading routine adapted from cuetools - Copyright (C) 2003 Svend Sanjay Sorensen <ssorensen@fastmail.fm> - - 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 -*/ - -/* This code implements low-level access functions for a CD images - residing inside a disk file (*.bin) and its associated cue sheet. - (*.cue). -*/ - -static const char _rcsid[] = "$Id: cdrdao.c,v 1.1 2005/01/01 02:43:58 rockyb Exp $"; - -#include "image.h" -#include "cdio_assert.h" -#include "_cdio_stdio.h" - -#include <cdio/logging.h> -#include <cdio/sector.h> -#include <cdio/util.h> -#include <cdio/version.h> - -#ifdef HAVE_STDIO_H -#include <stdio.h> -#endif -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_STRING_H -#include <string.h> -#endif -#ifdef HAVE_STRINGS_H -#include <strings.h> -#endif -#ifdef HAVE_GLOB_H -#include <glob.h> -#endif -#ifdef HAVE_ERRNO_H -#include <errno.h> -#endif - -#include <ctype.h> - -#include "portable.h" - -/* reader */ - -#define DEFAULT_CDIO_DEVICE "videocd.bin" -#define DEFAULT_CDIO_CDRDAO "videocd.toc" - -typedef struct { - /* Things common to all drivers like this. - This must be first. */ - generic_img_private_t gen; - internal_position_t pos; - - char *psz_cue_name; - char *psz_mcn; /* Media Catalog Number (5.22.3) - exactly 13 bytes */ - track_info_t tocent[CDIO_CD_MAX_TRACKS+1]; /* entry info for each track - add 1 for leadout. */ - discmode_t disc_mode; -} _img_private_t; - -static uint32_t _stat_size_cdrdao (void *user_data); -static bool parse_tocfile (_img_private_t *cd, const char *toc_name); - -#define NEED_MEDIA_EJECT_IMAGE -#include "image_common.h" - -/*! - Initialize image structures. - */ -static bool -_init_cdrdao (_img_private_t *env) -{ - lsn_t lead_lsn; - - if (env->gen.init) - return false; - - /* Have to set init before calling _stat_size_cdrdao() or we will - get into infinite recursion calling passing right here. - */ - env->gen.init = true; - env->gen.i_first_track = 1; - env->psz_mcn = NULL; - env->disc_mode = CDIO_DISC_MODE_NO_INFO; - - cdtext_init (&(env->gen.cdtext)); - - /* Read in TOC sheet. */ - if ( !parse_tocfile(env, env->psz_cue_name) ) return false; - - lead_lsn = _stat_size_cdrdao( (_img_private_t *) env); - - if (-1 == lead_lsn) - return false; - - /* Fake out leadout track and sector count for last track*/ - cdio_lsn_to_msf (lead_lsn, &env->tocent[env->gen.i_tracks].start_msf); - env->tocent[env->gen.i_tracks].start_lba = cdio_lsn_to_lba(lead_lsn); - env->tocent[env->gen.i_tracks-env->gen.i_first_track].sec_count = - cdio_lsn_to_lba(lead_lsn - env->tocent[env->gen.i_tracks-1].start_lba); - - return true; -} - -/*! - Reads into buf the next size bytes. - Returns -1 on error. - Would be libc's seek() but we have to adjust for the extra track header - information in each sector. -*/ -static off_t -_lseek_cdrdao (void *user_data, off_t offset, int whence) -{ - _img_private_t *env = user_data; - - /* real_offset is the real byte offset inside the disk image - The number below was determined empirically. I'm guessing - the 1st 24 bytes of a bin file are used for something. - */ - off_t real_offset=0; - - unsigned int i; - - env->pos.lba = 0; - for (i=0; i<env->gen.i_tracks; i++) { - track_info_t *this_track=&(env->tocent[i]); - env->pos.index = i; - if ( (this_track->sec_count*this_track->datasize) >= offset) { - int blocks = offset / this_track->datasize; - int rem = offset % this_track->datasize; - int block_offset = blocks * this_track->blocksize; - real_offset += block_offset + rem; - env->pos.buff_offset = rem; - env->pos.lba += blocks; - break; - } - real_offset += this_track->sec_count*this_track->blocksize; - offset -= this_track->sec_count*this_track->datasize; - env->pos.lba += this_track->sec_count; - } - - if (i==env->gen.i_tracks) { - cdio_warn ("seeking outside range of disk image"); - return -1; - } else { - real_offset += env->tocent[i].datastart; - return cdio_stream_seek(env->tocent[i].data_source, real_offset, whence); - } -} - -/*! - Reads into buf the next size bytes. - Returns -1 on error. - FIXME: - At present we assume a read doesn't cross sector or track - boundaries. -*/ -static ssize_t -_read_cdrdao (void *user_data, void *data, size_t size) -{ - _img_private_t *env = user_data; - char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; - char *p = data; - ssize_t final_size=0; - ssize_t this_size; - track_info_t *this_track=&(env->tocent[env->pos.index]); - ssize_t skip_size = this_track->datastart + this_track->endsize; - - while (size > 0) { - int rem = this_track->datasize - env->pos.buff_offset; - if (size <= rem) { - this_size = cdio_stream_read(this_track->data_source, buf, size, 1); - final_size += this_size; - memcpy (p, buf, this_size); - break; - } - - /* Finish off reading this sector. */ - cdio_warn ("Reading across block boundaries not finished"); - - size -= rem; - this_size = cdio_stream_read(this_track->data_source, buf, rem, 1); - final_size += this_size; - memcpy (p, buf, this_size); - p += this_size; - this_size = cdio_stream_read(this_track->data_source, buf, rem, 1); - - /* Skip over stuff at end of this sector and the beginning of the next. - */ - cdio_stream_read(this_track->data_source, buf, skip_size, 1); - - /* Get ready to read another sector. */ - env->pos.buff_offset=0; - env->pos.lba++; - - /* Have gone into next track. */ - if (env->pos.lba >= env->tocent[env->pos.index+1].start_lba) { - env->pos.index++; - this_track=&(env->tocent[env->pos.index]); - skip_size = this_track->datastart + this_track->endsize; - } - } - return final_size; -} - -/*! - Return the size of the CD in logical block address (LBA) units. - */ -static uint32_t -_stat_size_cdrdao (void *user_data) -{ - _img_private_t *env = user_data; - long size; - - size = cdio_stream_stat (env->tocent[0].data_source); - - if (size % CDIO_CD_FRAMESIZE_RAW) - { - cdio_warn ("image %s size (%ld) not multiple of blocksize (%d)", - env->tocent[0].filename, size, CDIO_CD_FRAMESIZE_RAW); - if (size % M2RAW_SECTOR_SIZE == 0) - cdio_warn ("this may be a 2336-type disc image"); - else if (size % CDIO_CD_FRAMESIZE_RAW == 0) - cdio_warn ("this may be a 2352-type disc image"); - /* exit (EXIT_FAILURE); */ - } - - size /= CDIO_CD_FRAMESIZE_RAW; - - return size; -} - -#define MAXLINE 512 -#define UNIMPLIMENTED_MSG \ - cdio_log(log_level, "%s line %d: unimplimented keyword: %s", \ - psz_cue_name, i_line, psz_keyword) - - -static bool -parse_tocfile (_img_private_t *cd, const char *psz_cue_name) -{ - /* The below declarations may be common in other image-parse routines. */ - FILE *fp; - char psz_line[MAXLINE]; /* text of current line read in file fp. */ - unsigned int i_line=0; /* line number in file of psz_line. */ - int i = -1; /* Position in tocent. Same as - cd->gen.i_tracks - 1 */ - char *psz_keyword, *psz_field; - cdio_log_level_t log_level = (NULL == cd) ? CDIO_LOG_INFO : CDIO_LOG_WARN; - cdtext_field_t cdtext_key; - - /* The below declaration(s) may be unique to this image-parse routine. */ - unsigned int i_cdtext_nest = 0; - - if (NULL == psz_cue_name) - return false; - - fp = fopen (psz_cue_name, "r"); - if (fp == NULL) { - cdio_log(log_level, "error opening %s for reading: %s", - psz_cue_name, strerror(errno)); - return false; - } - - if (cd) { - cd->gen.b_cdtext_init = true; - cd->gen.b_cdtext_error = false; - } - - while ((fgets(psz_line, MAXLINE, fp)) != NULL) { - - i_line++; - - /* strip comment from line */ - /* todo: // in quoted strings? */ - /* //comment */ - if (NULL != (psz_field = strstr (psz_line, "//"))) - *psz_field = '\0'; - - if (NULL != (psz_keyword = strtok (psz_line, " \t\n\r"))) { - /* CATALOG "ddddddddddddd" */ - if (0 == strcmp ("CATALOG", psz_keyword)) { - if (-1 == i) { - if (NULL != (psz_field = strtok (NULL, "\"\t\n\r"))) { - if (13 != strlen(psz_field)) { - cdio_log(log_level, - "%s line %d after word CATALOG:", - psz_cue_name, i_line); - cdio_log(log_level, - "Token %s has length %ld. Should be 13 digits.", - psz_field, (long int) strlen(psz_field)); - - goto err_exit; - } else { - /* Check that we have all digits*/ - unsigned int i; - for (i=0; i<13; i++) { - if (!isdigit(psz_field[i])) { - cdio_log(log_level, - "%s line %d after word CATALOG:", - psz_cue_name, i_line); - cdio_log(log_level, - "Character \"%c\" at postition %i of token \"%s\"" - " is not all digits.", - psz_field[i], i+1, psz_field); - goto err_exit; - } - } - if (NULL != cd) cd->psz_mcn = strdup (psz_field); - } - } else { - cdio_log(log_level, - "%s line %d after word CATALOG:", - psz_cue_name, i_line); - cdio_log(log_level, "Expecting 13 digits; nothing seen."); - goto err_exit; - } - } else { - goto err_exit; - } - - /* CD_DA | CD_ROM | CD_ROM_XA */ - } else if (0 == strcmp ("CD_DA", psz_keyword)) { - if (-1 == i) { - if (NULL != cd) - cd->disc_mode = CDIO_DISC_MODE_CD_DA; - } else { - goto not_in_global_section; - } - } else if (0 == strcmp ("CD_ROM", psz_keyword)) { - if (-1 == i) { - if (NULL != cd) - cd->disc_mode = CDIO_DISC_MODE_CD_DATA; - } else { - goto not_in_global_section; - } - - } else if (0 == strcmp ("CD_ROM_XA", psz_keyword)) { - if (-1 == i) { - if (NULL != cd) - cd->disc_mode = CDIO_DISC_MODE_CD_XA; - } else { - goto not_in_global_section; - } - - /* TRACK <track-mode> [<sub-channel-mode>] */ - } else if (0 == strcmp ("TRACK", psz_keyword)) { - i++; - if (NULL != cd) cdtext_init (&(cd->gen.cdtext_track[i])); - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - if (0 == strcmp ("AUDIO", psz_field)) { - if (NULL != cd) { - cd->tocent[i].track_format = TRACK_FORMAT_AUDIO; - cd->tocent[i].blocksize = CDIO_CD_FRAMESIZE_RAW; - cd->tocent[i].datasize = CDIO_CD_FRAMESIZE_RAW; - cd->tocent[i].datastart = 0; - cd->tocent[i].endsize = 0; - switch(cd->disc_mode) { - case CDIO_DISC_MODE_NO_INFO: - cd->disc_mode = CDIO_DISC_MODE_CD_DA; - break; - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* Disc type stays the same. */ - break; - case CDIO_DISC_MODE_CD_DATA: - case CDIO_DISC_MODE_CD_XA: - cd->disc_mode = CDIO_DISC_MODE_CD_MIXED; - break; - default: - cd->disc_mode = CDIO_DISC_MODE_ERROR; - } - - } - } else if (0 == strcmp ("MODE1", psz_field)) { - if (NULL != cd) { - cd->tocent[i].track_format = TRACK_FORMAT_DATA; - cd->tocent[i].blocksize = CDIO_CD_FRAMESIZE_RAW; - cd->tocent[i].datastart = CDIO_CD_SYNC_SIZE - + CDIO_CD_HEADER_SIZE; - cd->tocent[i].datasize = CDIO_CD_FRAMESIZE; - cd->tocent[i].endsize = CDIO_CD_EDC_SIZE - + CDIO_CD_M1F1_ZERO_SIZE + CDIO_CD_ECC_SIZE; - switch(cd->disc_mode) { - case CDIO_DISC_MODE_NO_INFO: - cd->disc_mode = CDIO_DISC_MODE_CD_DATA; - break; - case CDIO_DISC_MODE_CD_DATA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* Disc type stays the same. */ - break; - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_XA: - cd->disc_mode = CDIO_DISC_MODE_CD_MIXED; - break; - default: - cd->disc_mode = CDIO_DISC_MODE_ERROR; - } - } - } else if (0 == strcmp ("MODE1_RAW", psz_field)) { - if (NULL != cd) { - cd->tocent[i].track_format = TRACK_FORMAT_DATA; - cd->tocent[i].blocksize = CDIO_CD_FRAMESIZE_RAW; - cd->tocent[i].datastart = CDIO_CD_SYNC_SIZE - + CDIO_CD_HEADER_SIZE; - cd->tocent[i].datasize = CDIO_CD_FRAMESIZE; - cd->tocent[i].endsize = CDIO_CD_EDC_SIZE - + CDIO_CD_M1F1_ZERO_SIZE + CDIO_CD_ECC_SIZE; - switch(cd->disc_mode) { - case CDIO_DISC_MODE_NO_INFO: - cd->disc_mode = CDIO_DISC_MODE_CD_DATA; - break; - case CDIO_DISC_MODE_CD_DATA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* Disc type stays the same. */ - break; - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_XA: - cd->disc_mode = CDIO_DISC_MODE_CD_MIXED; - break; - default: - cd->disc_mode = CDIO_DISC_MODE_ERROR; - } - } - } else if (0 == strcmp ("MODE2", psz_field)) { - if (NULL != cd) { - cd->tocent[i].track_format = TRACK_FORMAT_XA; - cd->tocent[i].datastart = CDIO_CD_SYNC_SIZE - + CDIO_CD_HEADER_SIZE; - cd->tocent[i].datasize = M2RAW_SECTOR_SIZE; - cd->tocent[i].endsize = 0; - switch(cd->disc_mode) { - case CDIO_DISC_MODE_NO_INFO: - cd->disc_mode = CDIO_DISC_MODE_CD_XA; - break; - case CDIO_DISC_MODE_CD_XA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* Disc type stays the same. */ - break; - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_DATA: - cd->disc_mode = CDIO_DISC_MODE_CD_MIXED; - break; - default: - cd->disc_mode = CDIO_DISC_MODE_ERROR; - } - } - } else if (0 == strcmp ("MODE2_FORM1", psz_field)) { - if (NULL != cd) { - cd->tocent[i].track_format = TRACK_FORMAT_XA; - cd->tocent[i].datastart = CDIO_CD_SYNC_SIZE - + CDIO_CD_HEADER_SIZE; - cd->tocent[i].datasize = CDIO_CD_FRAMESIZE_RAW; - cd->tocent[i].endsize = 0; - switch(cd->disc_mode) { - case CDIO_DISC_MODE_NO_INFO: - cd->disc_mode = CDIO_DISC_MODE_CD_XA; - break; - case CDIO_DISC_MODE_CD_XA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* Disc type stays the same. */ - break; - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_DATA: - cd->disc_mode = CDIO_DISC_MODE_CD_MIXED; - break; - default: - cd->disc_mode = CDIO_DISC_MODE_ERROR; - } - } - } else if (0 == strcmp ("MODE2_FORM2", psz_field)) { - if (NULL != cd) { - cd->tocent[i].track_format = TRACK_FORMAT_XA; - cd->tocent[i].datastart = CDIO_CD_SYNC_SIZE - + CDIO_CD_HEADER_SIZE + CDIO_CD_SUBHEADER_SIZE; - cd->tocent[i].datasize = CDIO_CD_FRAMESIZE; - cd->tocent[i].endsize = CDIO_CD_SYNC_SIZE - + CDIO_CD_ECC_SIZE; - switch(cd->disc_mode) { - case CDIO_DISC_MODE_NO_INFO: - cd->disc_mode = CDIO_DISC_MODE_CD_XA; - break; - case CDIO_DISC_MODE_CD_XA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* Disc type stays the same. */ - break; - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_DATA: - cd->disc_mode = CDIO_DISC_MODE_CD_MIXED; - break; - default: - cd->disc_mode = CDIO_DISC_MODE_ERROR; - } - } - } else if (0 == strcmp ("MODE2_FORM_MIX", psz_field)) { - if (NULL != cd) { - cd->tocent[i].track_format = TRACK_FORMAT_XA; - cd->tocent[i].datasize = M2RAW_SECTOR_SIZE; - cd->tocent[i].blocksize = CDIO_CD_FRAMESIZE_RAW; - cd->tocent[i].datastart = CDIO_CD_SYNC_SIZE + - CDIO_CD_HEADER_SIZE + CDIO_CD_SUBHEADER_SIZE; - cd->tocent[i].track_green = true; - cd->tocent[i].endsize = 0; - switch(cd->disc_mode) { - case CDIO_DISC_MODE_NO_INFO: - cd->disc_mode = CDIO_DISC_MODE_CD_XA; - break; - case CDIO_DISC_MODE_CD_XA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* Disc type stays the same. */ - break; - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_DATA: - cd->disc_mode = CDIO_DISC_MODE_CD_MIXED; - break; - default: - cd->disc_mode = CDIO_DISC_MODE_ERROR; - } - } - } else if (0 == strcmp ("MODE2_RAW", psz_field)) { - if (NULL != cd) { - cd->tocent[i].track_format = TRACK_FORMAT_XA; - cd->tocent[i].blocksize = CDIO_CD_FRAMESIZE_RAW; - cd->tocent[i].datastart = CDIO_CD_SYNC_SIZE + - CDIO_CD_HEADER_SIZE + CDIO_CD_SUBHEADER_SIZE; - cd->tocent[i].datasize = CDIO_CD_FRAMESIZE; - cd->tocent[i].track_green = true; - cd->tocent[i].endsize = 0; - switch(cd->disc_mode) { - case CDIO_DISC_MODE_NO_INFO: - cd->disc_mode = CDIO_DISC_MODE_CD_XA; - break; - case CDIO_DISC_MODE_CD_XA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_ERROR: - /* Disc type stays the same. */ - break; - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_DATA: - cd->disc_mode = CDIO_DISC_MODE_CD_MIXED; - break; - default: - cd->disc_mode = CDIO_DISC_MODE_ERROR; - } - } - } else { - cdio_log(log_level, "%s line %d after TRACK:", - psz_cue_name, i_line); - cdio_log(log_level, "'%s' not a valid mode.", psz_field); - goto err_exit; - } - } - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - /* todo: set sub-channel-mode */ - if (0 == strcmp ("RW", psz_field)) - ; - else if (0 == strcmp ("RW_RAW", psz_field)) - ; - } - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - goto format_error; - } - - /* track flags */ - /* [NO] COPY | [NO] PRE_EMPHASIS */ - } else if (0 == strcmp ("NO", psz_keyword)) { - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - if (0 == strcmp ("COPY", psz_field)) { - if (NULL != cd) - cd->tocent[i].flags &= ~CDIO_TRACK_FLAG_COPY_PERMITTED; - - } else if (0 == strcmp ("PRE_EMPHASIS", psz_field)) - if (NULL != cd) { - cd->tocent[i].flags &= ~CDIO_TRACK_FLAG_PRE_EMPHASIS; - goto err_exit; - } - } else { - goto format_error; - } - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - goto format_error; - } - } else if (0 == strcmp ("COPY", psz_keyword)) { - if (NULL != cd) - cd->tocent[i].flags |= CDIO_TRACK_FLAG_COPY_PERMITTED; - } else if (0 == strcmp ("PRE_EMPHASIS", psz_keyword)) { - if (NULL != cd) - cd->tocent[i].flags |= CDIO_TRACK_FLAG_PRE_EMPHASIS; - /* TWO_CHANNEL_AUDIO */ - } else if (0 == strcmp ("TWO_CHANNEL_AUDIO", psz_keyword)) { - if (NULL != cd) - cd->tocent[i].flags &= ~CDIO_TRACK_FLAG_FOUR_CHANNEL_AUDIO; - /* FOUR_CHANNEL_AUDIO */ - } else if (0 == strcmp ("FOUR_CHANNEL_AUDIO", psz_keyword)) { - if (NULL != cd) - cd->tocent[i].flags |= CDIO_TRACK_FLAG_FOUR_CHANNEL_AUDIO; - - /* ISRC "CCOOOYYSSSSS" */ - } else if (0 == strcmp ("ISRC", psz_keyword)) { - if (NULL != (psz_field = strtok (NULL, "\"\t\n\r"))) { - if (NULL != cd) - cd->tocent[i].isrc = strdup(psz_field); - } else { - goto format_error; - } - - /* SILENCE <length> */ - } else if (0 == strcmp ("SILENCE", psz_keyword)) { - UNIMPLIMENTED_MSG; - - /* ZERO <length> */ - } else if (0 == strcmp ("ZERO", psz_keyword)) { - UNIMPLIMENTED_MSG; - - /* [FILE|AUDIOFILE] "<filename>" <start> [<length>] */ - } else if (0 == strcmp ("FILE", psz_keyword) - || 0 == strcmp ("AUDIOFILE", psz_keyword)) { - if (0 <= i) { - if (NULL != (psz_field = strtok (NULL, "\"\t\n\r"))) { - if (NULL != cd) { - cd->tocent[i].filename = strdup (psz_field); - /* Todo: do something about reusing existing files. */ - if (!(cd->tocent[i].data_source = cdio_stdio_new (psz_field))) { - cdio_log (log_level, - "%s line %d: can't open file `%s' for reading", - psz_cue_name, i_line, psz_field); - goto err_exit; - } - } - } - - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - lba_t lba = cdio_lsn_to_lba(cdio_mmssff_to_lba (psz_field)); - if (CDIO_INVALID_LBA == lba) { - cdio_log(log_level, "%s line %d: invalid MSF string %s", - psz_cue_name, i_line, psz_field); - goto err_exit; - } - - if (NULL != cd) { - cd->tocent[i].start_lba = lba; - cdio_lba_to_msf(lba, &(cd->tocent[i].start_msf)); - } - } - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) - if (NULL != cd) - cd->tocent[i].length = cdio_mmssff_to_lba (psz_field); - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - goto format_error; - } - } else { - goto not_in_global_section; - } - - /* DATAFILE "<filename>" <start> [<length>] */ - } else if (0 == strcmp ("DATAFILE", psz_keyword)) { - goto unimplimented_error; - - /* FIFO "<fifo path>" [<length>] */ - } else if (0 == strcmp ("FIFO", psz_keyword)) { - goto unimplimented_error; - - /* START MM:SS:FF */ - } else if (0 == strcmp ("START", psz_keyword)) { - if (0 <= i) { - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - /* todo: line is too long! */ - if (NULL != cd) { - cd->tocent[i].start_lba += cdio_mmssff_to_lba (psz_field); - cdio_lba_to_msf(cd->tocent[i].start_lba, - &(cd->tocent[i].start_msf)); - } - } - - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - goto format_error; - } - } else { - goto not_in_global_section; - } - - /* PREGAP MM:SS:FF */ - } else if (0 == strcmp ("PREGAP", psz_keyword)) { - if (0 <= i) { - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - if (NULL != cd) - cd->tocent[i].pregap = cdio_mmssff_to_lba (psz_field); - } else { - goto format_error; - } - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - goto format_error; - } - } else { - goto not_in_global_section; - } - - /* INDEX MM:SS:FF */ - } else if (0 == strcmp ("INDEX", psz_keyword)) { - if (0 <= i) { - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - if (NULL != cd) { -#if 0 - if (1 == cd->tocent[i].nindex) { - cd->tocent[i].indexes[1] = cd->tocent[i].indexes[0]; - cd->tocent[i].nindex++; - } - cd->tocent[i].indexes[cd->tocent[i].nindex++] = - cdio_mmssff_to_lba (psz_field) + cd->tocent[i].indexes[0]; -#else - ; - -#endif - } - } else { - goto format_error; - } - if (NULL != (psz_field = strtok (NULL, " \t\n\r"))) { - goto format_error; - } - } else { - goto not_in_global_section; - } - - /* CD_TEXT { ... } */ - /* todo: opening { must be on same line as CD_TEXT */ - } else if (0 == strcmp ("CD_TEXT", psz_keyword)) { - if (NULL == (psz_field = strtok (NULL, " \t\n\r"))) { - goto format_error; - } - if ( 0 == strcmp( "{", psz_field ) ) { - i_cdtext_nest++; - } else { - cdio_log (log_level, - "%s line %d: expecting '{'", psz_cue_name, i_line); - goto err_exit; - } - - } else if (0 == strcmp ("LANGUAGE_MAP", psz_keyword)) { - /* LANGUAGE d { ... } */ - } else if (0 == strcmp ("LANGUAGE", psz_keyword)) { - if (NULL == (psz_field = strtok (NULL, " \t\n\r"))) { - goto format_error; - } - /* Language number */ - if (NULL == (psz_field = strtok (NULL, " \t\n\r"))) { - goto format_error; - } - if ( 0 == strcmp( "{", psz_field ) ) { - i_cdtext_nest++; - } - } else if (0 == strcmp ("{", psz_keyword)) { - i_cdtext_nest++; - } else if (0 == strcmp ("}", psz_keyword)) { - if (i_cdtext_nest > 0) i_cdtext_nest--; - } else if ( CDTEXT_INVALID != - (cdtext_key = cdtext_is_keyword (psz_keyword)) ) { - if (-1 == i) { - if (NULL != cd) { - cdtext_set (cdtext_key, - strtok (NULL, "\"\t\n\r"), - &(cd->gen.cdtext)); - } - } else { - if (NULL != cd) { - cdtext_set (cdtext_key, - strtok (NULL, "\"\t\n\r"), - &(cd->gen.cdtext_track[i])); - } - } - - /* unrecognized line */ - } else { - cdio_log(log_level, "%s line %d: warning: unrecognized word: %s", - psz_cue_name, i_line, psz_keyword); - goto err_exit; - } - } - } - - if (NULL != cd) { - cd->gen.i_tracks = i+1; - cd->gen.toc_init = true; - } - - fclose (fp); - return true; - - unimplimented_error: - UNIMPLIMENTED_MSG; - goto err_exit; - - format_error: - cdio_log(log_level, "%s line %d after word %s", - psz_cue_name, i_line, psz_keyword); - goto err_exit; - - not_in_global_section: - cdio_log(log_level, "%s line %d: word %s only allowed in global section", - psz_cue_name, i_line, psz_keyword); - - err_exit: - fclose (fp); - return false; -} - -/*! - Reads a single audio sector from CD device into data starting - from lsn. Returns 0 if no error. - */ -static int -_read_audio_sectors_cdrdao (void *user_data, void *data, lsn_t lsn, - unsigned int nblocks) -{ - _img_private_t *env = user_data; - int ret; - - /* Why the adjustment of 272, I don't know. It seems to work though */ - if (lsn != 0) { - ret = cdio_stream_seek (env->tocent[0].data_source, - (lsn * CDIO_CD_FRAMESIZE_RAW) - 272, SEEK_SET); - if (ret!=0) return ret; - - ret = cdio_stream_read (env->tocent[0].data_source, data, - CDIO_CD_FRAMESIZE_RAW, nblocks); - } else { - /* We need to pad out the first 272 bytes with 0's */ - BZERO(data, 272); - - ret = cdio_stream_seek (env->tocent[0].data_source, 0, SEEK_SET); - - if (ret!=0) return ret; - - ret = cdio_stream_read (env->tocent[0].data_source, (uint8_t *) data+272, - CDIO_CD_FRAMESIZE_RAW - 272, nblocks); - } - - /* ret is number of bytes if okay, but we need to return 0 okay. */ - return ret == 0; -} - -/*! - Reads a single mode2 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ -static int -_read_mode1_sector_cdrdao (void *user_data, void *data, lsn_t lsn, - bool b_form2) -{ - _img_private_t *env = user_data; - int ret; - char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; - - ret = cdio_stream_seek (env->tocent[0].data_source, - lsn * CDIO_CD_FRAMESIZE_RAW, SEEK_SET); - if (ret!=0) return ret; - - /* FIXME: Not completely sure the below is correct. */ - ret = cdio_stream_read (env->tocent[0].data_source, buf, - CDIO_CD_FRAMESIZE_RAW, 1); - if (ret==0) return ret; - - memcpy (data, buf + CDIO_CD_SYNC_SIZE + CDIO_CD_HEADER_SIZE, - b_form2 ? M2RAW_SECTOR_SIZE: CDIO_CD_FRAMESIZE); - - return 0; -} - -/*! - Reads nblocks of mode1 sectors from cd device into data starting - from lsn. - Returns 0 if no error. - */ -static int -_read_mode1_sectors_cdrdao (void *user_data, void *data, lsn_t lsn, - bool b_form2, unsigned int nblocks) -{ - _img_private_t *env = user_data; - int i; - int retval; - unsigned int blocksize = b_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE; - - for (i = 0; i < nblocks; i++) { - if ( (retval = _read_mode1_sector_cdrdao (env, - ((char *)data) + (blocksize * i), - lsn + i, b_form2)) ) - return retval; - } - return 0; -} - -/*! - Reads a single mode1 sector from cd device into data starting - from lsn. Returns 0 if no error. - */ -static int -_read_mode2_sector_cdrdao (void *user_data, void *data, lsn_t lsn, - bool b_form2) -{ - _img_private_t *env = user_data; - int ret; - char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; - - /* NOTE: The logic below seems a bit wrong and convoluted - to me, but passes the regression tests. (Perhaps it is why we get - valgrind errors in vcdxrip). Leave it the way it was for now. - Review this sector 2336 stuff later. - */ - - ret = cdio_stream_seek (env->tocent[0].data_source, - lsn * CDIO_CD_FRAMESIZE_RAW, SEEK_SET); - if (ret!=0) return ret; - - ret = cdio_stream_read (env->tocent[0].data_source, buf, - CDIO_CD_FRAMESIZE_RAW, 1); - if (ret==0) return ret; - - - /* See NOTE above. */ - if (b_form2) - memcpy (data, buf + CDIO_CD_SYNC_SIZE + CDIO_CD_HEADER_SIZE, - M2RAW_SECTOR_SIZE); - else - memcpy (data, buf + CDIO_CD_XA_SYNC_HEADER, CDIO_CD_FRAMESIZE); - - return 0; -} - -/*! - Reads nblocks of mode2 sectors from cd device into data starting - from lsn. - Returns 0 if no error. - */ -static int -_read_mode2_sectors_cdrdao (void *user_data, void *data, lsn_t lsn, - bool b_form2, unsigned int nblocks) -{ - _img_private_t *env = user_data; - int i; - int retval; - - for (i = 0; i < nblocks; i++) { - if ( (retval = _read_mode2_sector_cdrdao (env, - ((char *)data) + (CDIO_CD_FRAMESIZE * i), - lsn + i, b_form2)) ) - return retval; - } - return 0; -} - -/*! - Return an array of strings giving possible TOC disk images. - */ -char ** -cdio_get_devices_cdrdao (void) -{ - char **drives = NULL; - unsigned int num_files=0; -#ifdef HAVE_GLOB_H - unsigned int i; - glob_t globbuf; - globbuf.gl_offs = 0; - glob("*.toc", GLOB_DOOFFS, NULL, &globbuf); - for (i=0; i<globbuf.gl_pathc; i++) { - cdio_add_device_list(&drives, globbuf.gl_pathv[i], &num_files); - } - globfree(&globbuf); -#else - cdio_add_device_list(&drives, DEFAULT_CDIO_DEVICE, &num_files); -#endif /*HAVE_GLOB_H*/ - cdio_add_device_list(&drives, NULL, &num_files); - return drives; -} - -/*! - Return a string containing the default CD device. - */ -char * -cdio_get_default_device_cdrdao(void) -{ - char **drives = cdio_get_devices_nrg(); - char *drive = (drives[0] == NULL) ? NULL : strdup(drives[0]); - cdio_free_device_list(drives); - return drive; -} - -static bool -get_hwinfo_cdrdao ( const CdIo *p_cdio, /*out*/ cdio_hwinfo_t *hw_info) -{ - strcpy(hw_info->psz_vendor, "libcdio"); - strcpy(hw_info->psz_model, "cdrdao"); - strcpy(hw_info->psz_revision, CDIO_VERSION); - return true; - -} - -/*! - Return the number of tracks in the current medium. - CDIO_INVALID_TRACK is returned on error. -*/ -static track_format_t -_get_track_format_cdrdao(void *user_data, track_t i_track) -{ - _img_private_t *env = user_data; - - if (!env->gen.init) _init_cdrdao(env); - - if (i_track > env->gen.i_tracks || i_track == 0) - return TRACK_FORMAT_ERROR; - - return env->tocent[i_track-env->gen.i_first_track].track_format; -} - -/*! - Return true if we have XA data (green, mode2 form1) or - XA data (green, mode2 form2). That is track begins: - sync - header - subheader - 12 4 - 8 - - FIXME: there's gotta be a better design for this and get_track_format? -*/ -static bool -_get_track_green_cdrdao(void *user_data, track_t i_track) -{ - _img_private_t *env = user_data; - - if (!env->gen.init) _init_cdrdao(env); - - if (i_track > env->gen.i_tracks || i_track == 0) - return false; - - return env->tocent[i_track-env->gen.i_first_track].track_green; -} - -/*! - Return the starting LSN track number - i_track in obj. Track numbers start at 1. - The "leadout" track is specified either by - using i_track LEADOUT_TRACK or the total tracks+1. - False is returned if there is no track entry. -*/ -static lba_t -_get_lba_track_cdrdao(void *user_data, track_t i_track) -{ - _img_private_t *env = user_data; - _init_cdrdao (env); - - if (i_track == CDIO_CDROM_LEADOUT_TRACK) - i_track = env->gen.i_tracks+1; - - if (i_track <= env->gen.i_tracks+1 && i_track != 0) { - return env->tocent[i_track-1].start_lba; - } else - return CDIO_INVALID_LBA; -} - -/*! - Check that a TOC file is valid. We parse the entire file. - -*/ -bool -cdio_is_tocfile(const char *psz_cue_name) -{ - int i; - - if (psz_cue_name == NULL) return false; - - i=strlen(psz_cue_name)-strlen("toc"); - - if (i>0) { - if ( (psz_cue_name[i]=='t' && psz_cue_name[i+1]=='o' && psz_cue_name[i+2]=='c') - || (psz_cue_name[i]=='T' && psz_cue_name[i+1]=='O' && psz_cue_name[i+2]=='C') ) { - return parse_tocfile(NULL, psz_cue_name); - } - } - return false; -} - -/*! - Initialization routine. This is the only thing that doesn't - get called via a function pointer. In fact *we* are the - ones to set that up. - */ -CdIo * -cdio_open_am_cdrdao (const char *psz_source_name, const char *psz_access_mode) -{ - if (psz_access_mode != NULL && strcmp(psz_access_mode, "image")) - cdio_warn ("there is only one access mode, 'image' for cdrdao. Arg %s ignored", - psz_access_mode); - return cdio_open_cdrdao(psz_source_name); -} - -/*! - Initialization routine. This is the only thing that doesn't - get called via a function pointer. In fact *we* are the - ones to set that up. - */ -CdIo * -cdio_open_cdrdao (const char *psz_cue_name) -{ - CdIo *ret; - _img_private_t *_data; - - cdio_funcs _funcs; - - memset( &_funcs, 0, sizeof(_funcs) ); - - _funcs.eject_media = _eject_media_image; - _funcs.free = _free_image; - _funcs.get_arg = _get_arg_image; - _funcs.get_cdtext = get_cdtext_generic; - _funcs.get_devices = cdio_get_devices_cdrdao; - _funcs.get_default_device = cdio_get_default_device_cdrdao; - _funcs.get_discmode = _get_discmode_image; - _funcs.get_drive_cap = _get_drive_cap_image; - _funcs.get_first_track_num= _get_first_track_num_image; - _funcs.get_hwinfo = get_hwinfo_cdrdao; - _funcs.get_mcn = _get_mcn_image; - _funcs.get_num_tracks = _get_num_tracks_image; - _funcs.get_track_format = _get_track_format_cdrdao; - _funcs.get_track_green = _get_track_green_cdrdao; - _funcs.get_track_lba = _get_lba_track_cdrdao; - _funcs.get_track_msf = _get_track_msf_image; - _funcs.lseek = _lseek_cdrdao; - _funcs.read = _read_cdrdao; - _funcs.read_audio_sectors = _read_audio_sectors_cdrdao; - _funcs.read_mode1_sector = _read_mode1_sector_cdrdao; - _funcs.read_mode1_sectors = _read_mode1_sectors_cdrdao; - _funcs.read_mode2_sector = _read_mode2_sector_cdrdao; - _funcs.read_mode2_sectors = _read_mode2_sectors_cdrdao; - _funcs.set_arg = _set_arg_image; - _funcs.stat_size = _stat_size_cdrdao; - - if (NULL == psz_cue_name) return NULL; - - _data = _cdio_malloc (sizeof (_img_private_t)); - _data->gen.init = false; - _data->psz_cue_name = NULL; - _data->gen.data_source = NULL; - _data->gen.source_name = NULL; - - ret = cdio_new ((void *)_data, &_funcs); - - if (ret == NULL) { - free(_data); - return NULL; - } - - if (!cdio_is_tocfile(psz_cue_name)) { - cdio_debug ("source name %s is not recognized as a TOC file", - psz_cue_name); - return NULL; - } - - _set_arg_image (_data, "cue", psz_cue_name); - _set_arg_image (_data, "source", psz_cue_name); - - if (_init_cdrdao(_data)) { - return ret; - } else { - _free_image(_data); - free(ret); - return NULL; - } -} - -bool -cdio_have_cdrdao (void) -{ - return true; -} diff --git a/src/input/vcd/libcdio/image/nrg.c b/src/input/vcd/libcdio/image/nrg.c deleted file mode 100644 index 40e5bbbf7..000000000 --- a/src/input/vcd/libcdio/image/nrg.c +++ /dev/null @@ -1,1274 +0,0 @@ -/* - $Id: nrg.c,v 1.3 2005/05/07 22:07:27 rockyb Exp $ - - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - Copyright (C) 2001, 2003 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ -/*! This code implements low-level access functions for the Nero native - CD-image format residing inside a disk file (*.nrg). -*/ - -#include "image.h" - -#ifdef HAVE_STDIO_H -#include <stdio.h> -#endif -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_STRING_H -#include <string.h> -#endif -#ifdef HAVE_GLOB_H -#include <glob.h> -#endif - -#include <cdio/bytesex.h> -#include <cdio/ds.h> -#include <cdio/logging.h> -#include <cdio/util.h> -#include <cdio/version.h> -#include "cdio_assert.h" -#include "_cdio_stdio.h" -#include "nrg.h" - -static const char _rcsid[] = "$Id: nrg.c,v 1.3 2005/05/07 22:07:27 rockyb Exp $"; - - -/* reader */ - -#define DEFAULT_CDIO_DEVICE "image.nrg" - -/* - Link element of track structure as a linked list. - Possibly redundant with above track_info_t */ -typedef struct { - uint32_t start_lsn; - uint32_t sec_count; /* Number of sectors in track. Does not - include pregap before next entry. */ - uint64_t img_offset; /* Bytes offset from beginning of disk image file.*/ - uint32_t blocksize; /* Number of bytes in a block */ - int flags; /* don't copy, 4 channel, pre-emphasis */ -} _mapping_t; - - -typedef struct { - /* Things common to all drivers like this. - This must be first. */ - generic_img_private_t gen; - internal_position_t pos; - - /* This is common to all image drivers... */ - char *psz_cue_name; - char *psz_mcn; /* Media Catalog Number (5.22.3) */ - - track_info_t tocent[CDIO_CD_MAX_TRACKS+1]; /* entry info for each track - add 1 for leadout. */ - discmode_t disc_mode; - - /* Nero Specific stuff. Note: for the image_free to work, this *must* - be last. */ - bool is_dao; /* True if some of disk at once. False - if some sort of track at once. */ - uint32_t mtyp; /* Value of MTYP (media type?) tag */ - uint8_t dtyp; /* Value of DAOX media type tag */ - - /* This is a hack because I don't really understnad NERO better. */ - bool is_cues; - - CdioList *mapping; /* List of track information */ - uint32_t size; -} _img_private_t; - -static bool parse_nrg (_img_private_t *env, const char *psz_cue_name); -static uint32_t _stat_size_nrg (void *user_data); - -#include "image_common.h" - -/* Updates internal track TOC, so we can later - simulate ioctl(CDROMREADTOCENTRY). - */ -static void -_register_mapping (_img_private_t *env, lsn_t start_lsn, uint32_t sec_count, - uint64_t img_offset, uint32_t blocksize, - track_format_t track_format, bool track_green, - int flags) -{ - const int track_num=env->gen.i_tracks; - track_info_t *this_track=&(env->tocent[env->gen.i_tracks]); - _mapping_t *_map = _cdio_malloc (sizeof (_mapping_t)); - - _map->start_lsn = start_lsn; - _map->sec_count = sec_count; - _map->img_offset = img_offset; - _map->blocksize = blocksize; - _map->flags = flags; - - if (!env->mapping) env->mapping = _cdio_list_new (); - _cdio_list_append (env->mapping, _map); - - env->size = MAX (env->size, (start_lsn + sec_count)); - - /* Update *this_track and track_num. These structures are - in a sense redundant witht the obj->mapping list. Perhaps one - or the other can be eliminated. - */ - - cdio_lba_to_msf (cdio_lsn_to_lba(start_lsn), &(this_track->start_msf)); - this_track->start_lba = cdio_msf_to_lba(&this_track->start_msf); - this_track->track_num = track_num+1; - this_track->blocksize = blocksize; - if (env->is_cues) - this_track->datastart = img_offset; - else - this_track->datastart = 0; - - if (track_green) - this_track->datastart += CDIO_CD_SUBHEADER_SIZE; - - this_track->sec_count = sec_count; - - this_track->track_format= track_format; - this_track->track_green = track_green; - - switch (this_track->track_format) { - case TRACK_FORMAT_AUDIO: - this_track->blocksize = CDIO_CD_FRAMESIZE_RAW; - this_track->datasize = CDIO_CD_FRAMESIZE_RAW; - /*this_track->datastart = 0;*/ - this_track->endsize = 0; - break; - case TRACK_FORMAT_CDI: - this_track->datasize=CDIO_CD_FRAMESIZE; - break; - case TRACK_FORMAT_XA: - if (track_green) { - this_track->blocksize = CDIO_CD_FRAMESIZE; - /*this_track->datastart = CDIO_CD_SYNC_SIZE + CDIO_CD_HEADER_SIZE;*/ - this_track->datasize = M2RAW_SECTOR_SIZE; - this_track->endsize = 0; - } else { - /*this_track->datastart = CDIO_CD_SYNC_SIZE + CDIO_CD_HEADER_SIZE + - CDIO_CD_SUBHEADER_SIZE;*/ - this_track->datasize = CDIO_CD_FRAMESIZE; - this_track->endsize = CDIO_CD_SYNC_SIZE + CDIO_CD_ECC_SIZE; - } - break; - case TRACK_FORMAT_DATA: - if (track_green) { - /*this_track->datastart = CDIO_CD_SYNC_SIZE + CDIO_CD_HEADER_SIZE;*/ - this_track->datasize = CDIO_CD_FRAMESIZE; - this_track->endsize = CDIO_CD_EDC_SIZE + CDIO_CD_M1F1_ZERO_SIZE - + CDIO_CD_ECC_SIZE; - } else { - /* Is the below correct? */ - /*this_track->datastart = 0;*/ - this_track->datasize = CDIO_CD_FRAMESIZE; - this_track->endsize = 0; - } - break; - default: - /*this_track->datasize=CDIO_CD_FRAMESIZE_RAW;*/ - cdio_warn ("track %d has unknown format %d", - env->gen.i_tracks, this_track->track_format); - } - - env->gen.i_tracks++; - - cdio_debug ("start lsn: %lu sector count: %0lu -> %8ld (%08lx)", - (long unsigned int) start_lsn, - (long unsigned int) sec_count, - (long unsigned int) img_offset, - (long unsigned int) img_offset); -} - - -/* - Disk and track information for a Nero file are located at the end - of the file. This routine extracts that information. - - FIXME: right now psz_nrg_name is not used. It will be in the future. - */ -static bool -parse_nrg (_img_private_t *env, const char *psz_nrg_name) -{ - long unsigned int footer_start; - long unsigned int size; - char *footer_buf = NULL; - cdio_log_level_t log_level = (NULL == env) ? CDIO_LOG_INFO : CDIO_LOG_WARN; - - size = cdio_stream_stat (env->gen.data_source); - if (-1 == size) return false; - - { - _footer_t buf; - cdio_assert (sizeof (buf) == 12); - - cdio_stream_seek (env->gen.data_source, size - sizeof (buf), SEEK_SET); - cdio_stream_read (env->gen.data_source, (void *) &buf, sizeof (buf), 1); - - if (buf.v50.ID == UINT32_TO_BE (NERO_ID)) { - cdio_info ("detected Nero version 5.0 (32-bit offsets) NRG magic"); - footer_start = uint32_to_be (buf.v50.footer_ofs); - } else if (buf.v55.ID == UINT32_TO_BE (NER5_ID)) { - cdio_info ("detected Nero version 5.5.x (64-bit offsets) NRG magic"); - footer_start = uint64_from_be (buf.v55.footer_ofs); - } else { - cdio_log (log_level, "Image not recognized as either version 5.0 or " - "version 5.5.x-6.x type NRG"); - return false; - } - - cdio_debug (".NRG footer start = %ld, length = %ld", - (long) footer_start, (long) (size - footer_start)); - - cdio_assert (IN ((size - footer_start), 0, 4096)); - - footer_buf = _cdio_malloc (size - footer_start); - - cdio_stream_seek (env->gen.data_source, footer_start, SEEK_SET); - cdio_stream_read (env->gen.data_source, footer_buf, - size - footer_start, 1); - } - { - int pos = 0; - - while (pos < size - footer_start) { - _chunk_t *chunk = (void *) (footer_buf + pos); - uint32_t opcode = UINT32_FROM_BE (chunk->id); - - bool break_out = false; - - switch (opcode) { - - case CUES_ID: /* "CUES" Seems to have sector size 2336 and 150 sector - pregap seems to be included at beginning of image. - */ - case CUEX_ID: /* "CUEX" */ - { - unsigned entries = UINT32_FROM_BE (chunk->len); - _cuex_array_t *_entries = (void *) chunk->data; - - cdio_assert (env->mapping == NULL); - - cdio_assert ( sizeof (_cuex_array_t) == 8 ); - cdio_assert ( UINT32_FROM_BE (chunk->len) % sizeof(_cuex_array_t) - == 0 ); - - entries /= sizeof (_cuex_array_t); - - if (CUES_ID == opcode) { - lsn_t lsn = UINT32_FROM_BE (_entries[0].lsn); - int idx; - - cdio_info ("CUES type image detected" ); - - /* CUES LSN has 150 pregap include at beginning? -/ - cdio_assert (lsn == 0?); - */ - - env->is_cues = true; /* HACK alert. */ - env->gen.i_tracks = 0; - env->gen.i_first_track = 1; - for (idx = 1; idx < entries-1; idx += 2) { - lsn_t sec_count; - int addrtype = _entries[idx].addr_ctrl / 16; - int control = _entries[idx].addr_ctrl % 16; - int flags = 0; - if ( 1 == control ) - flags &= ~CDIO_TRACK_FLAG_COPY_PERMITTED; - - cdio_assert (_entries[idx].track == _entries[idx + 1].track); - - /* lsn and sec_count*2 aren't correct, but it comes closer on the - single example I have: svcdgs.nrg - We are picking up the wrong fields and/or not interpreting - them correctly. - */ - - switch (addrtype) { - case 0: - lsn = UINT32_FROM_BE (_entries[idx].lsn); - break; - case 1: - { -#if 0 - msf_t msf = (msf_t) _entries[idx].lsn; - lsn = cdio_msf_to_lsn(&msf); -#else - lsn = CDIO_INVALID_LSN; -#endif - cdio_warn ("untested (i.e. probably wrong) CUE MSF code"); - break; - } - default: - lsn = CDIO_INVALID_LSN; - cdio_warn("unknown addrtype %d", addrtype); - } - - sec_count = UINT32_FROM_BE (_entries[idx + 1].lsn); - - _register_mapping (env, lsn, sec_count*2, - (lsn+CDIO_PREGAP_SECTORS) * M2RAW_SECTOR_SIZE, - M2RAW_SECTOR_SIZE, TRACK_FORMAT_XA, true, - flags); - } - } else { - lsn_t lsn = UINT32_FROM_BE (_entries[0].lsn); - int idx; - - cdio_info ("CUEX type image detected"); - - /* LSN must start at -150 (LBA 0)? */ - cdio_assert (lsn == -150); - - for (idx = 2; idx < entries; idx += 2) { - lsn_t sec_count; - int addrtype = _entries[idx].addr_ctrl >> 4; - int control = _entries[idx].addr_ctrl & 0xf; - int flags = 0; - if ( 1 == control ) - flags &= ~CDIO_TRACK_FLAG_COPY_PERMITTED; - - /* extractnrg.pl has addrtype for LBA's 0, and - for MSF 1. ??? - - FIXME: Should decode as appropriate for addrtype. - */ - cdio_assert ( addrtype == 0 || addrtype == 1 ); - - cdio_assert (_entries[idx].track != _entries[idx + 1].track); - - lsn = UINT32_FROM_BE (_entries[idx].lsn); - sec_count = UINT32_FROM_BE (_entries[idx + 1].lsn); - - _register_mapping (env, lsn, sec_count - lsn, - (lsn + CDIO_PREGAP_SECTORS)*M2RAW_SECTOR_SIZE, - M2RAW_SECTOR_SIZE, TRACK_FORMAT_XA, true, - flags); - } - } - break; - } - - case DAOX_ID: /* "DAOX" */ - case DAOI_ID: /* "DAOI" */ - { - track_format_t track_format; - int form2; - - /* We include an extra 0 byte so these can be used as C strings.*/ - env->psz_mcn = _cdio_malloc (CDIO_MCN_SIZE+1); - - if (DAOX_ID == opcode) { - _daox_array_t *_entries = (void *) chunk->data; - form2 = _entries->_unknown[1]; - env->dtyp = _entries->_unknown[19]; - memcpy(env->psz_mcn, &(_entries->psz_mcn), CDIO_MCN_SIZE); - env->psz_mcn[CDIO_MCN_SIZE] = '\0'; - } else { - _daoi_array_t *_entries = (void *) chunk->data; - form2 = _entries->_unknown[1]; - env->dtyp = _entries->_unknown[19]; - memcpy(env->psz_mcn, &(_entries->psz_mcn), CDIO_MCN_SIZE); - env->psz_mcn[CDIO_MCN_SIZE] = '\0'; - } - - env->is_dao = true; - cdio_debug ("DAO%c tag detected, track format %d, form %x\n", - opcode==DAOX_ID ? 'X': 'I', env->dtyp, form2); - switch (env->dtyp) { - case 0: - /* Mode 1 */ - track_format = TRACK_FORMAT_DATA; - env->disc_mode = CDIO_DISC_MODE_CD_DATA; - break; - case 2: - /* Mode 2 form 1 */ - form2 = 0; - track_format = TRACK_FORMAT_XA; - env->disc_mode = CDIO_DISC_MODE_CD_XA; - break; - case 3: - /* Mode 2 */ - track_format = TRACK_FORMAT_XA; - env->disc_mode = CDIO_DISC_MODE_CD_XA; /* ?? */ - break; - case 0x6: - /* Mode2 form mix */ - track_format = TRACK_FORMAT_XA; - env->disc_mode = CDIO_DISC_MODE_CD_MIXED; - break; - case 0x20: /* ??? Mode2 form 2, Mode2 raw?? */ - track_format = TRACK_FORMAT_XA; - env->disc_mode = CDIO_DISC_MODE_CD_XA; /* ??. */ - break; - case 0x7: - track_format = TRACK_FORMAT_AUDIO; - env->disc_mode = CDIO_DISC_MODE_CD_DA; - break; - default: - cdio_log (log_level, "Unknown track format %x\n", - env->dtyp); - track_format = TRACK_FORMAT_AUDIO; - } - if (0 == form2) { - int i; - for (i=0; i<env->gen.i_tracks; i++) { - cdtext_init (&(env->gen.cdtext_track[i])); - env->tocent[i].track_format= track_format; - env->tocent[i].datastart = 0; - env->tocent[i].track_green = false; - if (TRACK_FORMAT_AUDIO == track_format) { - env->tocent[i].blocksize = CDIO_CD_FRAMESIZE_RAW; - env->tocent[i].datasize = CDIO_CD_FRAMESIZE_RAW; - env->tocent[i].endsize = 0; - } else { - env->tocent[i].datasize = CDIO_CD_FRAMESIZE; - env->tocent[i].datastart = 0; - } - } - } else if (2 == form2) { - int i; - for (i=0; i<env->gen.i_tracks; i++) { - cdtext_init (&(env->gen.cdtext_track[i])); - env->tocent[i].track_green = true; - env->tocent[i].track_format= track_format; - env->tocent[i].datasize = CDIO_CD_FRAMESIZE; - if (TRACK_FORMAT_XA == track_format) { - env->tocent[i].datastart = CDIO_CD_SYNC_SIZE - + CDIO_CD_HEADER_SIZE + CDIO_CD_SUBHEADER_SIZE; - env->tocent[i].endsize = CDIO_CD_SYNC_SIZE - + CDIO_CD_ECC_SIZE; - } else { - env->tocent[i].datastart = CDIO_CD_SYNC_SIZE - + CDIO_CD_HEADER_SIZE; - env->tocent[i].endsize = CDIO_CD_EDC_SIZE - + CDIO_CD_M1F1_ZERO_SIZE + CDIO_CD_ECC_SIZE; - - } - } - } else { - cdio_log (log_level, "Don't know if form1 or form2 form2: %x\n", - form2); - } - break; - } - case NERO_ID: - case NER5_ID: - cdio_error ("unexpected nrg magic ID NER%c detected", - opcode==NERO_ID ? 'O': '5'); - free(footer_buf); - return false; - break; - - case END1_ID: /* "END!" */ - cdio_debug ("nrg end tag detected"); - break_out = true; - break; - - case ETNF_ID: /* "ETNF" */ { - unsigned entries = UINT32_FROM_BE (chunk->len); - _etnf_array_t *_entries = (void *) chunk->data; - - cdio_assert (env->mapping == NULL); - - cdio_assert ( sizeof (_etnf_array_t) == 20 ); - cdio_assert ( UINT32_FROM_BE(chunk->len) % sizeof(_etnf_array_t) - == 0 ); - - entries /= sizeof (_etnf_array_t); - - cdio_info ("SAO type image (ETNF) detected"); - - { - int idx; - for (idx = 0; idx < entries; idx++) { - uint32_t _len = UINT32_FROM_BE (_entries[idx].length); - uint32_t _start = UINT32_FROM_BE (_entries[idx].start_lsn); - uint32_t _start2 = UINT32_FROM_BE (_entries[idx].start); - uint32_t track_mode= uint32_from_be (_entries[idx].type); - bool track_green = true; - track_format_t track_format = TRACK_FORMAT_XA; - uint16_t blocksize; - - switch (track_mode) { - case 0: - /* Mode 1 */ - track_format = TRACK_FORMAT_DATA; - track_green = false; /* ?? */ - blocksize = CDIO_CD_FRAMESIZE; - env->disc_mode = CDIO_DISC_MODE_CD_DATA; - break; - case 2: - /* Mode 2 form 1 */ - track_format = TRACK_FORMAT_XA; - track_green = false; /* ?? */ - blocksize = CDIO_CD_FRAMESIZE; - env->disc_mode = CDIO_DISC_MODE_CD_XA; - break; - case 3: - /* Mode 2 */ - track_format = TRACK_FORMAT_XA; - track_green = true; - blocksize = M2RAW_SECTOR_SIZE; - env->disc_mode = CDIO_DISC_MODE_CD_XA; /* ?? */ - break; - case 06: - /* Mode2 form mix */ - track_format = TRACK_FORMAT_XA; - track_green = true; - blocksize = M2RAW_SECTOR_SIZE; - env->disc_mode = CDIO_DISC_MODE_CD_MIXED; - break; - case 0x20: /* ??? Mode2 form 2, Mode2 raw?? */ - track_format = TRACK_FORMAT_XA; - track_green = true; - blocksize = M2RAW_SECTOR_SIZE; - env->disc_mode = CDIO_DISC_MODE_CD_XA; /* ??. */ - break; - case 7: - track_format = TRACK_FORMAT_AUDIO; - track_green = false; - blocksize = CDIO_CD_FRAMESIZE_RAW; - env->disc_mode = CDIO_DISC_MODE_CD_DA; - break; - default: - cdio_log (log_level, - "Don't know how to handle track mode (%lu)?", - (long unsigned int) track_mode); - free(footer_buf); - return false; - } - - cdio_assert (_len % blocksize == 0); - - _len /= blocksize; - - cdio_assert (_start * blocksize == _start2); - - _start += idx * CDIO_PREGAP_SECTORS; - _register_mapping (env, _start, _len, _start2, blocksize, - track_format, track_green, 0); - - } - } - break; - } - - case ETN2_ID: { /* "ETN2", same as above, but with 64bit stuff instead */ - unsigned entries = uint32_from_be (chunk->len); - _etn2_array_t *_entries = (void *) chunk->data; - - cdio_assert (env->mapping == NULL); - - cdio_assert (sizeof (_etn2_array_t) == 32); - cdio_assert (uint32_from_be (chunk->len) % sizeof (_etn2_array_t) == 0); - - entries /= sizeof (_etn2_array_t); - - cdio_info ("SAO type image (ETN2) detected"); - - { - int idx; - for (idx = 0; idx < entries; idx++) { - uint32_t _len = uint64_from_be (_entries[idx].length); - uint32_t _start = uint32_from_be (_entries[idx].start_lsn); - uint32_t _start2 = uint64_from_be (_entries[idx].start); - uint32_t track_mode= uint32_from_be (_entries[idx].type); - bool track_green = true; - track_format_t track_format = TRACK_FORMAT_XA; - uint16_t blocksize; - - - switch (track_mode) { - case 0: - track_format = TRACK_FORMAT_DATA; - track_green = false; /* ?? */ - blocksize = CDIO_CD_FRAMESIZE; - break; - case 2: - track_format = TRACK_FORMAT_XA; - track_green = false; /* ?? */ - blocksize = CDIO_CD_FRAMESIZE; - break; - case 3: - track_format = TRACK_FORMAT_XA; - track_green = true; - blocksize = M2RAW_SECTOR_SIZE; - break; - case 7: - track_format = TRACK_FORMAT_AUDIO; - track_green = false; - blocksize = CDIO_CD_FRAMESIZE_RAW; - break; - default: - cdio_log (log_level, - "Don't know how to handle track mode (%lu)?", - (long unsigned int) track_mode); - free(footer_buf); - return false; - } - - if (_len % blocksize != 0) { - cdio_log (log_level, - "length is not a multiple of blocksize " - "len %lu, size %d, rem %lu", - (long unsigned int) _len, blocksize, - (long unsigned int) _len % blocksize); - if (0 == _len % CDIO_CD_FRAMESIZE) { - cdio_log(log_level, "Adjusting blocksize to %d", - CDIO_CD_FRAMESIZE); - blocksize = CDIO_CD_FRAMESIZE; - } else if (0 == _len % M2RAW_SECTOR_SIZE) { - cdio_log(log_level, - "Adjusting blocksize to %d", M2RAW_SECTOR_SIZE); - blocksize = M2RAW_SECTOR_SIZE; - } else if (0 == _len % CDIO_CD_FRAMESIZE_RAW) { - cdio_log(log_level, - "Adjusting blocksize to %d", CDIO_CD_FRAMESIZE_RAW); - blocksize = CDIO_CD_FRAMESIZE_RAW; - } - } - - _len /= blocksize; - - if (_start * blocksize != _start2) { - cdio_log (log_level, - "%lu * %d != %lu", - (long unsigned int) _start, blocksize, - (long unsigned int) _start2); - if (_start * CDIO_CD_FRAMESIZE == _start2) { - cdio_log(log_level, - "Adjusting blocksize to %d", CDIO_CD_FRAMESIZE); - blocksize = CDIO_CD_FRAMESIZE; - } else if (_start * M2RAW_SECTOR_SIZE == _start2) { - cdio_log(log_level, - "Adjusting blocksize to %d", M2RAW_SECTOR_SIZE); - blocksize = M2RAW_SECTOR_SIZE; - } else if (_start * CDIO_CD_FRAMESIZE_RAW == _start2) { - cdio_log(log_level, - "Adjusting blocksize to %d", CDIO_CD_FRAMESIZE_RAW); - blocksize = CDIO_CD_FRAMESIZE_RAW; - } - } - - _start += idx * CDIO_PREGAP_SECTORS; - _register_mapping (env, _start, _len, _start2, blocksize, - track_format, track_green, 0); - } - } - break; - } - - case SINF_ID: { /* "SINF" */ - - uint32_t *_sessions = (void *) chunk->data; - - cdio_assert (UINT32_FROM_BE (chunk->len) == 4); - - cdio_debug ("SINF: %lu sessions", - (long unsigned int) UINT32_FROM_BE (*_sessions)); - } - break; - - case MTYP_ID: { /* "MTYP" */ - uint32_t *mtyp_p = (void *) chunk->data; - uint32_t mtyp = UINT32_FROM_BE (*mtyp_p); - - cdio_assert (UINT32_FROM_BE (chunk->len) == 4); - - cdio_debug ("MTYP: %lu", - (long unsigned int) UINT32_FROM_BE (*mtyp_p)); - - if (mtyp != MTYP_AUDIO_CD) { - cdio_log (log_level, - "Unknown MTYP value: %u", (unsigned int) mtyp); - } - env->mtyp = mtyp; - } - break; - - case CDTX_ID: { /* "CD TEXT" */ - - cdio_log (log_level, - "Don't know how to handle CD TEXT yet" ); - break; - } - - default: - cdio_log (log_level, - "unknown tag %8.8x seen", - (unsigned int) UINT32_FROM_BE (chunk->id)); - break; - } - - if (break_out) - break; - - pos += 8; - pos += UINT32_FROM_BE (chunk->len); - } - } - - /* Fake out leadout track. */ - /* Don't use _stat_size_nrg since that will lead to recursion since - we haven't fully initialized things yet. - */ - cdio_lsn_to_msf (env->size, &env->tocent[env->gen.i_tracks].start_msf); - env->tocent[env->gen.i_tracks].start_lba = cdio_lsn_to_lba(env->size); - env->tocent[env->gen.i_tracks-1].sec_count = - cdio_lsn_to_lba(env->size - env->tocent[env->gen.i_tracks-1].start_lba); - - env->gen.b_cdtext_init = true; - env->gen.b_cdtext_error = false; - env->gen.toc_init = true; - free(footer_buf); - return true; -} - -/*! - Initialize image structures. - */ -static bool -_init_nrg (_img_private_t *env) -{ - if (env->gen.init) { - cdio_error ("init called more than once"); - return false; - } - - if (!(env->gen.data_source = cdio_stdio_new (env->gen.source_name))) { - cdio_warn ("can't open nrg image file %s for reading", - env->gen.source_name); - return false; - } - - env->psz_mcn = NULL; - env->disc_mode = CDIO_DISC_MODE_NO_INFO; - - cdtext_init (&(env->gen.cdtext)); - - if ( !parse_nrg (env, env->gen.source_name) ) { - cdio_warn ("image file %s is not a Nero image", - env->gen.source_name); - return false; - } - - env->gen.init = true; - return true; - -} - -/*! - Reads into buf the next size bytes. - Returns -1 on error. - Would be libc's seek() but we have to adjust for the extra track header - information in each sector. -*/ -static off_t -_lseek_nrg (void *user_data, off_t offset, int whence) -{ - _img_private_t *env = user_data; - - /* real_offset is the real byte offset inside the disk image - The number below was determined empirically. - */ - off_t real_offset= env->is_dao ? 0x4b000 : 0; - - unsigned int i; - - for (i=0; i<env->gen.i_tracks; i++) { - track_info_t *this_track=&(env->tocent[i]); - env->pos.index = i; - if ( (this_track->sec_count*this_track->datasize) >= offset) { - int blocks = offset / this_track->datasize; - int rem = offset % this_track->datasize; - int block_offset = blocks * this_track->blocksize; - real_offset += block_offset + rem; - env->pos.buff_offset = rem; - env->pos.lba += blocks; - break; - } - real_offset += this_track->sec_count*this_track->blocksize; - offset -= this_track->sec_count*this_track->datasize; - env->pos.lba += this_track->sec_count; - } - - if (i==env->gen.i_tracks) { - cdio_warn ("seeking outside range of disk image"); - return -1; - } else - real_offset += env->tocent[i].datastart; - return cdio_stream_seek(env->gen.data_source, real_offset, whence); -} - -/*! - Reads into buf the next size bytes. - Returns -1 on error. - FIXME: - At present we assume a read doesn't cross sector or track - boundaries. -*/ -static ssize_t -_read_nrg (void *user_data, void *buf, size_t size) -{ - _img_private_t *env = user_data; - return cdio_stream_read(env->gen.data_source, buf, size, 1); -} - -static uint32_t -_stat_size_nrg (void *user_data) -{ - _img_private_t *env = user_data; - - return env->size; -} - -/*! - Reads a single audio sector from CD device into data starting - from LSN. Returns 0 if no error. - */ -static int -_read_audio_sectors_nrg (void *user_data, void *data, lsn_t lsn, - unsigned int nblocks) -{ - _img_private_t *env = user_data; - - CdioListNode *node; - - if (lsn >= env->size) - { - cdio_warn ("trying to read beyond image size (%lu >= %lu)", - (long unsigned int) lsn, (long unsigned int) env->size); - return -1; - } - - _CDIO_LIST_FOREACH (node, env->mapping) { - _mapping_t *_map = _cdio_list_node_data (node); - - if (IN (lsn, _map->start_lsn, (_map->start_lsn + _map->sec_count - 1))) { - int ret; - long int img_offset = _map->img_offset; - - img_offset += (lsn - _map->start_lsn) * CDIO_CD_FRAMESIZE_RAW; - - ret = cdio_stream_seek (env->gen.data_source, img_offset, - SEEK_SET); - if (ret!=0) return ret; - ret = cdio_stream_read (env->gen.data_source, data, - CDIO_CD_FRAMESIZE_RAW, nblocks); - if (ret==0) return ret; - break; - } - } - - if (!node) cdio_warn ("reading into pre gap (lsn %lu)", - (long unsigned int) lsn); - - return 0; -} - -static int -_read_mode1_sector_nrg (void *user_data, void *data, lsn_t lsn, - bool b_form2) -{ - _img_private_t *env = user_data; - char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; - - CdioListNode *node; - - if (lsn >= env->size) - { - cdio_warn ("trying to read beyond image size (%lu >= %lu)", - (long unsigned int) lsn, (long unsigned int) env->size); - return -1; - } - - _CDIO_LIST_FOREACH (node, env->mapping) { - _mapping_t *_map = _cdio_list_node_data (node); - - if (IN (lsn, _map->start_lsn, (_map->start_lsn + _map->sec_count - 1))) { - int ret; - long int img_offset = _map->img_offset; - - img_offset += (lsn - _map->start_lsn) * _map->blocksize; - - ret = cdio_stream_seek (env->gen.data_source, img_offset, - SEEK_SET); - if (ret!=0) return ret; - - /* FIXME: Not completely sure the below is correct. */ - ret = cdio_stream_read (env->gen.data_source, - (M2RAW_SECTOR_SIZE == _map->blocksize) - ? (buf + CDIO_CD_SYNC_SIZE + CDIO_CD_HEADER_SIZE) - : buf, - _map->blocksize, 1); - if (ret==0) return ret; - break; - } - } - - if (!node) - cdio_warn ("reading into pre gap (lsn %lu)", (long unsigned int) lsn); - - memcpy (data, buf + CDIO_CD_SYNC_SIZE + CDIO_CD_HEADER_SIZE, - b_form2 ? M2RAW_SECTOR_SIZE: CDIO_CD_FRAMESIZE); - - return 0; -} - -/*! - Reads nblocks of mode2 sectors from cd device into data starting - from lsn. - Returns 0 if no error. - */ -static int -_read_mode1_sectors_nrg (void *user_data, void *data, lsn_t lsn, - bool b_form2, unsigned nblocks) -{ - _img_private_t *env = user_data; - int i; - int retval; - unsigned int blocksize = b_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE; - - for (i = 0; i < nblocks; i++) { - if ( (retval = _read_mode1_sector_nrg (env, - ((char *)data) + (blocksize * i), - lsn + i, b_form2)) ) - return retval; - } - return 0; -} - -static int -_read_mode2_sector_nrg (void *user_data, void *data, lsn_t lsn, - bool b_form2) -{ - _img_private_t *env = user_data; - char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; - - CdioListNode *node; - - if (lsn >= env->size) - { - cdio_warn ("trying to read beyond image size (%lu >= %lu)", - (long unsigned int) lsn, (long unsigned int) env->size); - return -1; - } - - _CDIO_LIST_FOREACH (node, env->mapping) { - _mapping_t *_map = _cdio_list_node_data (node); - - if (IN (lsn, _map->start_lsn, (_map->start_lsn + _map->sec_count - 1))) { - int ret; - long int img_offset = _map->img_offset; - - img_offset += (lsn - _map->start_lsn) * _map->blocksize; - - ret = cdio_stream_seek (env->gen.data_source, img_offset, - SEEK_SET); - if (ret!=0) return ret; - ret = cdio_stream_read (env->gen.data_source, - (M2RAW_SECTOR_SIZE == _map->blocksize) - ? (buf + CDIO_CD_SYNC_SIZE + CDIO_CD_HEADER_SIZE) - : buf, - _map->blocksize, 1); - if (ret==0) return ret; - break; - } - } - - if (!node) - cdio_warn ("reading into pre gap (lsn %lu)", (long unsigned int) lsn); - - if (b_form2) - memcpy (data, buf + CDIO_CD_SYNC_SIZE + CDIO_CD_HEADER_SIZE, - M2RAW_SECTOR_SIZE); - else - memcpy (data, buf + CDIO_CD_XA_SYNC_HEADER, CDIO_CD_FRAMESIZE); - - return 0; -} - -/*! - Reads nblocks of mode2 sectors from cd device into data starting - from lsn. - Returns 0 if no error. - */ -static int -_read_mode2_sectors_nrg (void *user_data, void *data, lsn_t lsn, - bool b_form2, unsigned nblocks) -{ - _img_private_t *env = user_data; - int i; - int retval; - unsigned int blocksize = b_form2 ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE; - - for (i = 0; i < nblocks; i++) { - if ( (retval = _read_mode2_sector_nrg (env, - ((char *)data) + (blocksize * i), - lsn + i, b_form2)) ) - return retval; - } - return 0; -} - -/* - Free memory resources associated with NRG object. -*/ -static void -_free_nrg (void *user_data) -{ - _img_private_t *env = user_data; - - if (NULL == env) return; - if (NULL != env->mapping) - _cdio_list_free (env->mapping, true); - - /* The remaining part of the image is like the other image drivers, - so free that in the same way. */ - _free_image(user_data); -} - -/*! - Eject media -- there's nothing to do here except free resources. - We always return 2. - */ -static int -_eject_media_nrg(void *obj) -{ - _free_nrg (obj); - return 2; -} - -/*! - Return an array of strings giving possible NRG disk images. - */ -char ** -cdio_get_devices_nrg (void) -{ - char **drives = NULL; - unsigned int num_files=0; -#ifdef HAVE_GLOB_H - unsigned int i; - glob_t globbuf; - globbuf.gl_offs = 0; - glob("*.nrg", GLOB_DOOFFS, NULL, &globbuf); - for (i=0; i<globbuf.gl_pathc; i++) { - cdio_add_device_list(&drives, globbuf.gl_pathv[i], &num_files); - } - globfree(&globbuf); -#else - cdio_add_device_list(&drives, DEFAULT_CDIO_DEVICE, &num_files); -#endif /*HAVE_GLOB_H*/ - cdio_add_device_list(&drives, NULL, &num_files); - return drives; -} - -/*! - Return a string containing the default CD device. - */ -char * -cdio_get_default_device_nrg(void) -{ - char **drives = cdio_get_devices_nrg(); - char *drive = (drives[0] == NULL) ? NULL : strdup(drives[0]); - cdio_free_device_list(drives); - return drive; -} - -static bool -get_hwinfo_nrg ( const CdIo *p_cdio, /*out*/ cdio_hwinfo_t *hw_info) -{ - strcpy(hw_info->psz_vendor, "libcdio"); - strcpy(hw_info->psz_model, "Nero"); - strcpy(hw_info->psz_revision, CDIO_VERSION); - return true; - -} - -/*! - Return the number of tracks in the current medium. - CDIO_INVALID_TRACK is returned on error. -*/ -static track_format_t -get_track_format_nrg(void *user_data, track_t track_num) -{ - _img_private_t *env = user_data; - - if (track_num > env->gen.i_tracks || track_num == 0) - return TRACK_FORMAT_ERROR; - - if ( env->dtyp != DTYP_INVALID) { - switch (env->dtyp) { - case DTYP_MODE2_XA: - return TRACK_FORMAT_XA; - case DTYP_MODE1: - return TRACK_FORMAT_DATA; - default: ; - } - } - - /*if ( MTYP_AUDIO_CD == env->mtyp) return TRACK_FORMAT_AUDIO; */ - return env->tocent[track_num-1].track_format; -} - -/*! - Return true if we have XA data (green, mode2 form1) or - XA data (green, mode2 form2). That is track begins: - sync - header - subheader - 12 4 - 8 - - FIXME: there's gotta be a better design for this and get_track_format? -*/ -static bool -_get_track_green_nrg(void *user_data, track_t track_num) -{ - _img_private_t *env = user_data; - - if (track_num > env->gen.i_tracks || track_num == 0) - return false; - - if ( MTYP_AUDIO_CD == env->mtyp) return false; - return env->tocent[track_num-1].track_green; -} - -/*! - Check that a NRG file is valid. - -*/ -/* Later we'll probably do better. For now though, this gets us - started for now. -*/ -bool -cdio_is_nrg(const char *psz_nrg) -{ - unsigned int i; - - if (psz_nrg == NULL) return false; - - i=strlen(psz_nrg)-strlen("nrg"); - - if (i>0) { - if (psz_nrg[i]=='n' && psz_nrg[i+1]=='r' && psz_nrg[i+2]=='g') { - return true; - } - else if (psz_nrg[i]=='N' && psz_nrg[i+1]=='R' && psz_nrg[i+2]=='G') { - return true; - } - } - return false; -} - -/*! - Initialization routine. This is the only thing that doesn't - get called via a function pointer. In fact *we* are the - ones to set that up. - */ -CdIo * -cdio_open_am_nrg (const char *psz_source_name, const char *psz_access_mode) -{ - if (psz_access_mode != NULL && strcmp(psz_access_mode, "image")) - cdio_warn ("there is only one access mode for nrg. Arg %s ignored", - psz_access_mode); - return cdio_open_nrg(psz_source_name); -} - - -CdIo * -cdio_open_nrg (const char *psz_source) -{ - CdIo *ret; - _img_private_t *_data; - - cdio_funcs _funcs; - - memset( &_funcs, 0, sizeof(_funcs) ); - - _funcs.eject_media = _eject_media_nrg; - _funcs.free = _free_nrg; - _funcs.get_arg = _get_arg_image; - _funcs.get_cdtext = get_cdtext_generic; - _funcs.get_devices = cdio_get_devices_nrg; - _funcs.get_default_device = cdio_get_default_device_nrg; - _funcs.get_discmode = _get_discmode_image; - _funcs.get_drive_cap = _get_drive_cap_image; - _funcs.get_first_track_num= _get_first_track_num_image; - _funcs.get_hwinfo = get_hwinfo_nrg; - _funcs.get_mcn = _get_mcn_image; - _funcs.get_num_tracks = _get_num_tracks_image; - _funcs.get_track_format = get_track_format_nrg; - _funcs.get_track_green = _get_track_green_nrg; - _funcs.get_track_lba = NULL; /* Will use generic routine via msf */ - _funcs.get_track_msf = _get_track_msf_image; - _funcs.lseek = _lseek_nrg; - _funcs.read = _read_nrg; - _funcs.read_audio_sectors = _read_audio_sectors_nrg; - _funcs.read_mode1_sector = _read_mode1_sector_nrg; - _funcs.read_mode1_sectors = _read_mode1_sectors_nrg; - _funcs.read_mode2_sector = _read_mode2_sector_nrg; - _funcs.read_mode2_sectors = _read_mode2_sectors_nrg; - _funcs.set_arg = _set_arg_image; - _funcs.stat_size = _stat_size_nrg; - - _data = _cdio_malloc (sizeof (_img_private_t)); - _data->gen.init = false; - - _data->gen.i_tracks = 0; - _data->mtyp = 0; - _data->dtyp = DTYP_INVALID; - _data->gen.i_first_track= 1; - _data->is_dao = false; - _data->is_cues = false; /* FIXME: remove is_cues. */ - - ret = cdio_new ((void *)_data, &_funcs); - - if (ret == NULL) { - free(_data); - return NULL; - } - - _set_arg_image(_data, "source", (NULL == psz_source) - ? DEFAULT_CDIO_DEVICE: psz_source); - - _data->psz_cue_name = strdup(_get_arg_image(_data, "source")); - - if (!cdio_is_nrg(_data->psz_cue_name)) { - cdio_debug ("source name %s is not recognized as a NRG image", - _data->psz_cue_name); - _free_nrg(_data); - return NULL; - } - - _set_arg_image (_data, "cue", _data->psz_cue_name); - - if (_init_nrg(_data)) - return ret; - else { - _free_nrg(_data); - free(ret); - return NULL; - } - -} - -bool -cdio_have_nrg (void) -{ - return true; -} diff --git a/src/input/vcd/libcdio/image/nrg.h b/src/input/vcd/libcdio/image/nrg.h deleted file mode 100644 index 2923c78f1..000000000 --- a/src/input/vcd/libcdio/image/nrg.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - $Id: nrg.h,v 1.1 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> - Copyright (C) 2001, 2003 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -/* NERO (NRG) file format structures. */ - -/* this ugly image format is typical for lazy win32 programmers... at - least structure were set big endian, so at reverse - engineering wasn't such a big headache... */ - -PRAGMA_BEGIN_PACKED -typedef union { - struct { - uint32_t __x GNUC_PACKED; - uint32_t ID GNUC_PACKED; - uint32_t footer_ofs GNUC_PACKED; - } v50; - struct { - uint32_t ID GNUC_PACKED; - uint64_t footer_ofs GNUC_PACKED; - } v55; -} _footer_t; - -typedef struct { - uint32_t start GNUC_PACKED; - uint32_t length GNUC_PACKED; - uint32_t type GNUC_PACKED; /* 0x0 -> MODE1, 0x2 -> MODE2 form1, - 0x3 -> MIXED_MODE2 2336 blocksize - */ - uint32_t start_lsn GNUC_PACKED; /* does not include any pre-gaps! */ - uint32_t _unknown GNUC_PACKED; /* wtf is this for? -- always zero... */ -} _etnf_array_t; - -/* Finally they realized that 32-bit offsets are a bit outdated for - IA64 *eg* */ -typedef struct { - uint64_t start GNUC_PACKED; - uint64_t length GNUC_PACKED; - uint32_t type GNUC_PACKED; /* 0x0 -> MODE1, 0x2 -> MODE2 form1, - 0x3 -> MIXED_MODE2 2336 blocksize - */ - uint32_t start_lsn GNUC_PACKED; - uint64_t _unknown GNUC_PACKED; /* wtf is this for? -- always zero... */ -} _etn2_array_t; - -typedef struct { - uint8_t type GNUC_PACKED; /* has track copy bit and whether audiofile - or datafile. Is often 0x41 == 'A' */ - uint8_t track GNUC_PACKED; /* binary or BCD?? */ - uint8_t addr_ctrl GNUC_PACKED; /* addresstype: MSF or LBA in lower 4 bits - control in upper 4 bits. - makes 0->1 transitions */ - uint8_t res GNUC_PACKED; /* ?? */ - uint32_t lsn GNUC_PACKED; -} _cuex_array_t; - -typedef struct { - uint32_t _unknown1 GNUC_PACKED; - char psz_mcn[CDIO_MCN_SIZE] GNUC_PACKED; - uint8_t _unknown[64-CDIO_MCN_SIZE-sizeof(uint32_t)] GNUC_PACKED; -} _daox_array_t; - -typedef struct { - uint32_t _unknown1 GNUC_PACKED; - char psz_mcn[CDIO_MCN_SIZE] GNUC_PACKED; - uint8_t _unknown[64-CDIO_MCN_SIZE-sizeof(uint32_t)] GNUC_PACKED; -} _daoi_array_t; - -typedef struct { - uint32_t id GNUC_PACKED; - uint32_t len GNUC_PACKED; - char data[EMPTY_ARRAY_SIZE] GNUC_PACKED; -} _chunk_t; - -PRAGMA_END_PACKED - -/* Nero images are Big Endian. */ -#define CDTX_ID 0x43445458 /* CD TEXT */ -#define CUEX_ID 0x43554558 /* Nero version 5.5.x-6.x */ -#define CUES_ID 0x43554553 /* Nero pre version 5.5.x-6.x */ -#define DAOX_ID 0x44414f58 /* Nero version 5.5.x-6.x */ -#define DAOI_ID 0x44414f49 -#define END1_ID 0x454e4421 -#define ETN2_ID 0x45544e32 -#define ETNF_ID 0x45544e46 -#define NER5_ID 0x4e455235 /* Nero version 5.5.x */ -#define NERO_ID 0x4e45524f /* Nero pre 5.5.x */ -#define SINF_ID 0x53494e46 /* Session information */ -#define MTYP_ID 0x4d545950 /* Disc Media type? */ - -#define MTYP_AUDIO_CD 1 /* This isn't correct. But I don't know the - the right thing is and it sometimes works (and - sometimes is wrong). */ - -/* Disk track type Values gleaned from DAOX */ -#define DTYP_MODE1 0 -#define DTYP_MODE2_XA 2 -#define DTYP_INVALID 255 diff --git a/src/input/vcd/libcdio/image_common.h b/src/input/vcd/libcdio/image_common.h deleted file mode 100644 index 30699c15c..000000000 --- a/src/input/vcd/libcdio/image_common.h +++ /dev/null @@ -1,225 +0,0 @@ -/* - $Id: image_common.h,v 1.1 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/*! Common image routines. - - Because _img_private_t may vary over image formats, the routines are - included into the image drivers after _img_private_t is defined. In - order for the below routines to work, there is a large part of - _img_private_t that is common among image drivers. For example, see - image.h -*/ - -#ifndef __CDIO_IMAGE_COMMON_H__ -#define __CDIO_IMAGE_COMMON_H__ - -#define free_if_notnull(obj) \ - if (NULL != obj) { free(obj); obj=NULL; }; - -/*! - We don't need the image any more. Free all memory associated with - it. - */ -static void -_free_image (void *user_data) -{ - _img_private_t *p_env = user_data; - track_t i_track; - - if (NULL == p_env) return; - - for (i_track=0; i_track < p_env->gen.i_tracks; i_track++) { - free_if_notnull(p_env->tocent[i_track].filename); - free_if_notnull(p_env->tocent[i_track].isrc); - cdtext_destroy(&(p_env->tocent[i_track].cdtext)); - } - - free_if_notnull(p_env->psz_mcn); - free_if_notnull(p_env->psz_cue_name); - cdtext_destroy(&(p_env->gen.cdtext)); - cdio_generic_stdio_free(p_env); - free(p_env); -} - -#ifdef NEED_MEDIA_EJECT_IMAGE -/*! - Eject media -- there's nothing to do here except free resources. - We always return 2. - */ -static int -_eject_media_image(void *user_data) -{ - _free_image (user_data); - return 2; -} -#endif - -/*! - Return the value associated with the key "arg". -*/ -static const char * -_get_arg_image (void *user_data, const char key[]) -{ - _img_private_t *p_env = user_data; - - if (!strcmp (key, "source")) { - return p_env->gen.source_name; - } else if (!strcmp (key, "cue")) { - return p_env->psz_cue_name; - } else if (!strcmp(key, "access-mode")) { - return "image"; - } - return NULL; -} - -/*! - Get disc type associated with cd_obj. -*/ -static discmode_t -_get_discmode_image (void *p_user_data) -{ - _img_private_t *p_env = p_user_data; - return p_env->disc_mode; -} - -/*! - Return the media catalog number (MCN) from the CD or NULL if there - is none or we don't have the ability to get it. - - Note: string is malloc'd so caller has to free() the returned - string when done with it. - */ -static char * -_get_mcn_image(const void *user_data) -{ - const _img_private_t *env = user_data; - - if (NULL == env || NULL == env->psz_mcn) return NULL; - return strdup(env->psz_mcn); -} - -/*! - Return the starting MSF (minutes/secs/frames) for the track number - track_num in obj. Tracks numbers start at 1. - The "leadout" track is specified either by - using track_num LEADOUT_TRACK or the total tracks+1. - -*/ -static bool -_get_track_msf_image(void *user_data, track_t track_num, msf_t *msf) -{ - _img_private_t *env = user_data; - - if (NULL == msf) return false; - - if (track_num == CDIO_CDROM_LEADOUT_TRACK) track_num = env->gen.i_tracks+1; - - if (track_num <= env->gen.i_tracks+1 && track_num != 0) { - *msf = env->tocent[track_num-env->gen.i_first_track].start_msf; - return true; - } else - return false; -} - -/*! - Return the number of of the first track. - CDIO_INVALID_TRACK is returned on error. -*/ -static track_t -_get_first_track_num_image(void *user_data) -{ - _img_private_t *env = user_data; - - return env->gen.i_first_track; -} - -/*! - Return the number of tracks. -*/ -static track_t -_get_num_tracks_image(void *user_data) -{ - _img_private_t *env = user_data; - - return env->gen.i_tracks; -} - -/*! - Set the arg "key" with "value" in the source device. - Currently "source" to set the source device in I/O operations - is the only valid key. - - 0 is returned if no error was found, and nonzero if there as an error. -*/ -static int -_set_arg_image (void *user_data, const char key[], const char value[]) -{ - _img_private_t *env = user_data; - - if (!strcmp (key, "source")) - { - free_if_notnull (env->gen.source_name); - - if (!value) - return -2; - - env->gen.source_name = strdup (value); - } - else if (!strcmp (key, "cue")) - { - free_if_notnull (env->psz_cue_name); - - if (!value) - return -2; - - env->psz_cue_name = strdup (value); - } - else - return -1; - - return 0; -} - -/*! - Return the the kind of drive capabilities of device. - - */ -static void -_get_drive_cap_image (const void *user_data, - cdio_drive_read_cap_t *p_read_cap, - cdio_drive_write_cap_t *p_write_cap, - cdio_drive_misc_cap_t *p_misc_cap) -{ - - *p_read_cap = CDIO_DRIVE_CAP_READ_AUDIO - | CDIO_DRIVE_CAP_READ_CD_G - | CDIO_DRIVE_CAP_READ_CD_R - | CDIO_DRIVE_CAP_READ_CD_RW - ; - - *p_write_cap = 0; - - /* In the future we may want to simulate - LOCK, OPEN_TRAY, CLOSE_TRAY, SELECT_SPEED, etc. - */ - *p_misc_cap = CDIO_DRIVE_CAP_MISC_FILE; -} - -#endif /* __CDIO_IMAGE_COMMON_H__ */ diff --git a/src/input/vcd/libcdio/iso9660.c b/src/input/vcd/libcdio/iso9660.c deleted file mode 100644 index 91b89d516..000000000 --- a/src/input/vcd/libcdio/iso9660.c +++ /dev/null @@ -1,1007 +0,0 @@ -/* - $Id: iso9660.c,v 1.4 2006/09/26 18:13:11 dgp85 Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/* Private headers */ -#include "iso9660_private.h" -#include "cdio_assert.h" - -/* Public headers */ -#include <cdio/bytesex.h> -#include <cdio/iso9660.h> -#include <cdio/util.h> - -#include <time.h> -#include <ctype.h> -#ifdef HAVE_STRING_H -#include <string.h> -#endif -#ifdef HAVE_STDIO_H -#include <stdio.h> -#endif - -static const char _rcsid[] = "$Id: iso9660.c,v 1.4 2006/09/26 18:13:11 dgp85 Exp $"; - -/* some parameters... */ -#define SYSTEM_ID "CD-RTOS CD-BRIDGE" -#define VOLUME_SET_ID "" - -/*! - Change trailing blanks in str to nulls. Str has a maximum size of - n characters. -*/ -static char * -strip_trail (const char str[], size_t n) -{ - static char buf[1025]; - int j; - - cdio_assert (n < 1024); - - strncpy (buf, str, n); - buf[n] = '\0'; - - for (j = strlen (buf) - 1; j >= 0; j--) - { - if (buf[j] != ' ') - break; - - buf[j] = '\0'; - } - - return buf; -} - -static void -pathtable_get_size_and_entries(const void *pt, unsigned int *size, - unsigned int *entries); - -/*! - Get time structure from structure in an ISO 9660 directory index - record. Even though tm_wday and tm_yday fields are not explicitly in - idr_date, the are calculated from the other fields. - - If tm is to reflect the localtime set b_localtime true, otherwise - tm will reported in GMT. -*/ -void -iso9660_get_dtime (const iso9660_dtime_t *idr_date, bool b_localtime, - /*out*/ struct tm *p_tm) -{ - time_t t; - struct tm *p_temp_tm; - - if (!idr_date) return; - - memset(p_tm, 0, sizeof(struct tm)); - p_tm->tm_year = idr_date->dt_year; - p_tm->tm_mon = idr_date->dt_month - 1; - p_tm->tm_mday = idr_date->dt_day; - p_tm->tm_hour = idr_date->dt_hour; - p_tm->tm_min = idr_date->dt_minute; - p_tm->tm_sec = idr_date->dt_second; - -#if defined(HAVE_TM_GMTOFF) && defined(HAVE_TZSET) - if (b_localtime) { - tzset(); -#if defined(HAVE_TZNAME) - p_tm->tm_zone = (char *) tzname; -#endif -#if defined(HAVE_DAYLIGHT) - p_tm->tm_isdst = daylight; - p_tm->tm_gmtoff = timezone; -#endif - } -#endif - - /* Recompute tm_wday and tm_yday via mktime. */ - t = mktime(p_tm); - - if (b_localtime) - p_temp_tm = localtime(&t); - else - p_temp_tm = gmtime(&t); - - memcpy(p_tm, p_temp_tm, sizeof(struct tm)); -} - -/*! - Set time in format used in ISO 9660 directory index record - from a Unix time structure. */ -void -iso9660_set_dtime (const struct tm *p_tm, /*out*/ iso9660_dtime_t *p_idr_date) -{ - memset (p_idr_date, 0, 7); - - if (!p_tm) return; - - p_idr_date->dt_year = p_tm->tm_year; - p_idr_date->dt_month = p_tm->tm_mon + 1; - p_idr_date->dt_day = p_tm->tm_mday; - p_idr_date->dt_hour = p_tm->tm_hour; - p_idr_date->dt_minute = p_tm->tm_min; - p_idr_date->dt_second = p_tm->tm_sec; - -#ifdef HAVE_TM_GMTOFF - /* The ISO 9660 timezone is in the range -48..+52 and each unit - represents a 15-minute interval. */ - p_idr_date->dt_gmtoff = p_tm->tm_gmtoff / (15 * 60); - - if (p_tm->tm_isdst) p_idr_date->dt_gmtoff -= 4; - - if (p_idr_date->dt_gmtoff < -48 ) { - - cdio_warn ("Converted ISO 9660 timezone %d is less than -48. Adjusted", - p_idr_date->dt_gmtoff); - p_idr_date->dt_gmtoff = -48; - } else if (p_idr_date->dt_gmtoff > 52) { - cdio_warn ("Converted ISO 9660 timezone %d is over 52. Adjusted", - p_idr_date->dt_gmtoff); - p_idr_date->dt_gmtoff = 52; - } -#else - p_idr_date->dt_gmtoff = 0; -#endif -} - -/*! - Set "long" time in format used in ISO 9660 primary volume descriptor - from a Unix time structure. */ -void -iso9660_set_ltime (const struct tm *_tm, /*out*/ iso9660_ltime_t *pvd_date) -{ - char *_pvd_date = (char *) pvd_date; - - memset (_pvd_date, '0', 16); - _pvd_date[16] = (int8_t) 0; /* tz */ - - if (!_tm) return; - - snprintf(_pvd_date, 17, - "%4.4d%2.2d%2.2d" "%2.2d%2.2d%2.2d" "%2.2d", - _tm->tm_year + 1900, _tm->tm_mon + 1, _tm->tm_mday, - _tm->tm_hour, _tm->tm_min, _tm->tm_sec, - 0 /* 1/100 secs */ ); - - _pvd_date[16] = (int8_t) 0; /* tz */ -} - -/*! - Convert ISO-9660 file name that stored in a directory entry into - what's usually listed as the file name in a listing. - Lowercase name, and remove trailing ;1's or .;1's and - turn the other ;'s into version numbers. - - The length of the translated string is returned. -*/ -int -iso9660_name_translate(const char *old, char *new) -{ - return iso9660_name_translate_ext(old, new, 0); -} - -/*! - Convert ISO-9660 file name that stored in a directory entry into - what's usually listed as the file name in a listing. Lowercase - name if not using Joliet extension. Remove trailing ;1's or .;1's and - turn the other ;'s into version numbers. - - The length of the translated string is returned. -*/ -int -iso9660_name_translate_ext(const char *old, char *new, uint8_t i_joliet_level) -{ - int len = strlen(old); - int i; - - for (i = 0; i < len; i++) { - unsigned char c = old[i]; - if (!c) - break; - - /* Lower case, unless we have Joliet extensions. */ - if (!i_joliet_level && isupper(c)) c = tolower(c); - - /* Drop trailing '.;1' (ISO 9660:1988 7.5.1 requires period) */ - if (c == '.' && i == len - 3 && old[i + 1] == ';' && old[i + 2] == '1') - break; - - /* Drop trailing ';1' */ - if (c == ';' && i == len - 2 && old[i + 1] == '1') - break; - - /* Convert remaining ';' to '.' */ - if (c == ';') - c = '.'; - - new[i] = c; - } - new[i] = '\0'; - return i; -} - -/*! - Pad string src with spaces to size len and copy this to dst. If - len is less than the length of src, dst will be truncated to the - first len characters of src. - - src can also be scanned to see if it contains only ACHARs, DCHARs, - 7-bit ASCII chars depending on the enumeration _check. - - In addition to getting changed, dst is the return value. - Note: this string might not be NULL terminated. - */ -char * -iso9660_strncpy_pad(char dst[], const char src[], size_t len, - enum strncpy_pad_check _check) -{ - size_t rlen; - - cdio_assert (dst != NULL); - cdio_assert (src != NULL); - cdio_assert (len > 0); - - switch (_check) - { - int idx; - case ISO9660_NOCHECK: - break; - - case ISO9660_7BIT: - for (idx = 0; src[idx]; idx++) - if ((int8_t) src[idx] < 0) - { - cdio_warn ("string '%s' fails 7bit constraint (pos = %d)", - src, idx); - break; - } - break; - - case ISO9660_ACHARS: - for (idx = 0; src[idx]; idx++) - if (!iso9660_isachar (src[idx])) - { - cdio_warn ("string '%s' fails a-character constraint (pos = %d)", - src, idx); - break; - } - break; - - case ISO9660_DCHARS: - for (idx = 0; src[idx]; idx++) - if (!iso9660_isdchar (src[idx])) - { - cdio_warn ("string '%s' fails d-character constraint (pos = %d)", - src, idx); - break; - } - break; - - default: - cdio_assert_not_reached (); - break; - } - - rlen = strlen (src); - - if (rlen > len) - cdio_warn ("string '%s' is getting truncated to %d characters", - src, (unsigned int) len); - - strncpy (dst, src, len); - if (rlen < len) - memset(dst+rlen, ' ', len-rlen); - return dst; -} - -/*! - Return true if c is a DCHAR - a valid ISO-9660 level 1 character. - These are the ASCSII capital letters A-Z, the digits 0-9 and an - underscore. -*/ -bool -iso9660_isdchar (int c) -{ - if (!IN (c, 0x30, 0x5f) - || IN (c, 0x3a, 0x40) - || IN (c, 0x5b, 0x5e)) - return false; - - return true; -} - - -/*! - Return true if c is an ACHAR - - These are the DCHAR's plus some ASCII symbols including the space - symbol. -*/ -bool -iso9660_isachar (int c) -{ - if (!IN (c, 0x20, 0x5f) - || IN (c, 0x23, 0x24) - || c == 0x40 - || IN (c, 0x5b, 0x5e)) - return false; - - return true; -} - -void -iso9660_set_evd(void *pd) -{ - struct iso_volume_descriptor ied; - - cdio_assert (sizeof(struct iso_volume_descriptor) == ISO_BLOCKSIZE); - - cdio_assert (pd != NULL); - - memset(&ied, 0, sizeof(ied)); - - ied.type = to_711(ISO_VD_END); - iso9660_strncpy_pad (ied.id, ISO_STANDARD_ID, sizeof(ied.id), ISO9660_DCHARS); - ied.version = to_711(ISO_VERSION); - - memcpy(pd, &ied, sizeof(ied)); -} - -void -iso9660_set_pvd(void *pd, - const char volume_id[], - const char publisher_id[], - const char preparer_id[], - const char application_id[], - uint32_t iso_size, - const void *root_dir, - uint32_t path_table_l_extent, - uint32_t path_table_m_extent, - uint32_t path_table_size, - const time_t *pvd_time - ) -{ - iso9660_pvd_t ipd; - - cdio_assert (sizeof(iso9660_pvd_t) == ISO_BLOCKSIZE); - - cdio_assert (pd != NULL); - cdio_assert (volume_id != NULL); - cdio_assert (application_id != NULL); - - memset(&ipd,0,sizeof(ipd)); /* paranoia? */ - - /* magic stuff ... thatis CD XA marker... */ - strcpy(((char*)&ipd)+ISO_XA_MARKER_OFFSET, ISO_XA_MARKER_STRING); - - ipd.type = to_711(ISO_VD_PRIMARY); - iso9660_strncpy_pad (ipd.id, ISO_STANDARD_ID, 5, ISO9660_DCHARS); - ipd.version = to_711(ISO_VERSION); - - iso9660_strncpy_pad (ipd.system_id, SYSTEM_ID, 32, ISO9660_ACHARS); - iso9660_strncpy_pad (ipd.volume_id, volume_id, 32, ISO9660_DCHARS); - - ipd.volume_space_size = to_733(iso_size); - - ipd.volume_set_size = to_723(1); - ipd.volume_sequence_number = to_723(1); - ipd.logical_block_size = to_723(ISO_BLOCKSIZE); - - ipd.path_table_size = to_733(path_table_size); - ipd.type_l_path_table = to_731(path_table_l_extent); - ipd.type_m_path_table = to_732(path_table_m_extent); - - /* root_directory_record doesn't contain the 1-byte filename, - so we add one for that. */ - cdio_assert (sizeof(ipd.root_directory_record) == 33); - memcpy(&(ipd.root_directory_record), root_dir, - sizeof(ipd.root_directory_record)); - ipd.root_directory_filename='\0'; - ipd.root_directory_record.length = 33+1; - iso9660_strncpy_pad (ipd.volume_set_id, VOLUME_SET_ID, 128, ISO9660_DCHARS); - - iso9660_strncpy_pad (ipd.publisher_id, publisher_id, 128, ISO9660_ACHARS); - iso9660_strncpy_pad (ipd.preparer_id, preparer_id, 128, ISO9660_ACHARS); - iso9660_strncpy_pad (ipd.application_id, application_id, 128, ISO9660_ACHARS); - - iso9660_strncpy_pad (ipd.copyright_file_id , "", 37, ISO9660_DCHARS); - iso9660_strncpy_pad (ipd.abstract_file_id , "", 37, ISO9660_DCHARS); - iso9660_strncpy_pad (ipd.bibliographic_file_id, "", 37, ISO9660_DCHARS); - - iso9660_set_ltime (gmtime (pvd_time), &(ipd.creation_date)); - iso9660_set_ltime (gmtime (pvd_time), &(ipd.modification_date)); - iso9660_set_ltime (NULL, &(ipd.expiration_date)); - iso9660_set_ltime (NULL, &(ipd.effective_date)); - - ipd.file_structure_version = to_711(1); - - /* we leave ipd.application_data = 0 */ - - memcpy(pd, &ipd, sizeof(ipd)); /* copy stuff to arg ptr */ -} - -unsigned int -iso9660_dir_calc_record_size(unsigned int namelen, unsigned int su_len) -{ - unsigned int length; - - length = sizeof(iso9660_dir_t); - length += namelen; - if (length % 2) /* pad to word boundary */ - length++; - length += su_len; - if (length % 2) /* pad to word boundary again */ - length++; - - return length; -} - -void -iso9660_dir_add_entry_su(void *dir, - const char filename[], - uint32_t extent, - uint32_t size, - uint8_t file_flags, - const void *su_data, - unsigned int su_size, - const time_t *entry_time) -{ - iso9660_dir_t *idr = dir; - uint8_t *dir8 = dir; - unsigned int offset = 0; - uint32_t dsize = from_733(idr->size); - int length, su_offset; - cdio_assert (sizeof(iso9660_dir_t) == 33); - - if (!dsize && !idr->length) - dsize = ISO_BLOCKSIZE; /* for when dir lacks '.' entry */ - - cdio_assert (dsize > 0 && !(dsize % ISO_BLOCKSIZE)); - cdio_assert (dir != NULL); - cdio_assert (extent > 17); - cdio_assert (filename != NULL); - cdio_assert (strlen(filename) <= MAX_ISOPATHNAME); - - length = sizeof(iso9660_dir_t); - length += strlen(filename); - length = _cdio_ceil2block (length, 2); /* pad to word boundary */ - su_offset = length; - length += su_size; - length = _cdio_ceil2block (length, 2); /* pad to word boundary again */ - - /* find the last entry's end */ - { - unsigned int ofs_last_rec = 0; - - offset = 0; - while (offset < dsize) - { - if (!dir8[offset]) - { - offset++; - continue; - } - - offset += dir8[offset]; - ofs_last_rec = offset; - } - - cdio_assert (offset == dsize); - - offset = ofs_last_rec; - } - - /* be sure we don't cross sectors boundaries */ - offset = _cdio_ofs_add (offset, length, ISO_BLOCKSIZE); - offset -= length; - - cdio_assert (offset + length <= dsize); - - idr = (iso9660_dir_t *) &dir8[offset]; - - cdio_assert (offset+length < dsize); - - memset(idr, 0, length); - - idr->length = to_711(length); - idr->extent = to_733(extent); - idr->size = to_733(size); - - iso9660_set_dtime (gmtime(entry_time), &(idr->recording_time)); - - idr->file_flags = to_711(file_flags); - - idr->volume_sequence_number = to_723(1); - - idr->filename_len = to_711(strlen(filename) - ? strlen(filename) : 1); /* working hack! */ - - memcpy(idr->filename, filename, from_711(idr->filename_len)); - memcpy(&dir8[offset] + su_offset, su_data, su_size); -} - -void -iso9660_dir_init_new (void *dir, - uint32_t self, - uint32_t ssize, - uint32_t parent, - uint32_t psize, - const time_t *dir_time) -{ - iso9660_dir_init_new_su (dir, self, ssize, NULL, 0, parent, psize, NULL, - 0, dir_time); -} - -void -iso9660_dir_init_new_su (void *dir, - uint32_t self, - uint32_t ssize, - const void *ssu_data, - unsigned int ssu_size, - uint32_t parent, - uint32_t psize, - const void *psu_data, - unsigned int psu_size, - const time_t *dir_time) -{ - cdio_assert (ssize > 0 && !(ssize % ISO_BLOCKSIZE)); - cdio_assert (psize > 0 && !(psize % ISO_BLOCKSIZE)); - cdio_assert (dir != NULL); - - memset (dir, 0, ssize); - - /* "\0" -- working hack due to padding */ - iso9660_dir_add_entry_su (dir, "\0", self, ssize, ISO_DIRECTORY, ssu_data, - ssu_size, dir_time); - - iso9660_dir_add_entry_su (dir, "\1", parent, psize, ISO_DIRECTORY, psu_data, - psu_size, dir_time); -} - -/* Zero's out pathable. Do this first. */ -void -iso9660_pathtable_init (void *pt) -{ - cdio_assert (sizeof (struct iso_path_table) == 8); - - cdio_assert (pt != NULL); - - memset (pt, 0, ISO_BLOCKSIZE); /* fixme */ -} - -static const struct iso_path_table* -pathtable_get_entry (const void *pt, unsigned int entrynum) -{ - const uint8_t *tmp = pt; - unsigned int offset = 0; - unsigned int count = 0; - - cdio_assert (pt != NULL); - - while (from_711 (*tmp)) - { - if (count == entrynum) - break; - - cdio_assert (count < entrynum); - - offset += sizeof (struct iso_path_table); - offset += from_711 (*tmp); - if (offset % 2) - offset++; - tmp = (uint8_t *)pt + offset; - count++; - } - - if (!from_711 (*tmp)) - return NULL; - - return (const void *) tmp; -} - -void -pathtable_get_size_and_entries (const void *pt, - unsigned int *size, - unsigned int *entries) -{ - const uint8_t *tmp = pt; - unsigned int offset = 0; - unsigned int count = 0; - - cdio_assert (pt != NULL); - - while (from_711 (*tmp)) - { - offset += sizeof (struct iso_path_table); - offset += from_711 (*tmp); - if (offset % 2) - offset++; - tmp = (uint8_t *)pt + offset; - count++; - } - - if (size) - *size = offset; - - if (entries) - *entries = count; -} - -unsigned int -iso9660_pathtable_get_size (const void *pt) -{ - unsigned int size = 0; - pathtable_get_size_and_entries (pt, &size, NULL); - return size; -} - -uint16_t -iso9660_pathtable_l_add_entry (void *pt, - const char name[], - uint32_t extent, - uint16_t parent) -{ - struct iso_path_table *ipt = - (struct iso_path_table*)((char *)pt + iso9660_pathtable_get_size (pt)); - size_t name_len = strlen (name) ? strlen (name) : 1; - unsigned int entrynum = 0; - - cdio_assert (iso9660_pathtable_get_size (pt) < ISO_BLOCKSIZE); /*fixme */ - - memset (ipt, 0, sizeof (struct iso_path_table) + name_len); /* paranoia */ - - ipt->name_len = to_711 (name_len); - ipt->extent = to_731 (extent); - ipt->parent = to_721 (parent); - memcpy (ipt->name, name, name_len); - - pathtable_get_size_and_entries (pt, NULL, &entrynum); - - if (entrynum > 1) - { - const struct iso_path_table *ipt2 - = pathtable_get_entry (pt, entrynum - 2); - - cdio_assert (ipt2 != NULL); - - cdio_assert (from_721 (ipt2->parent) <= parent); - } - - return entrynum; -} - -uint16_t -iso9660_pathtable_m_add_entry (void *pt, - const char name[], - uint32_t extent, - uint16_t parent) -{ - struct iso_path_table *ipt = - (struct iso_path_table*)((char *)pt + iso9660_pathtable_get_size (pt)); - size_t name_len = strlen (name) ? strlen (name) : 1; - unsigned int entrynum = 0; - - cdio_assert (iso9660_pathtable_get_size(pt) < ISO_BLOCKSIZE); /* fixme */ - - memset(ipt, 0, sizeof (struct iso_path_table) + name_len); /* paranoia */ - - ipt->name_len = to_711 (name_len); - ipt->extent = to_732 (extent); - ipt->parent = to_722 (parent); - memcpy (ipt->name, name, name_len); - - pathtable_get_size_and_entries (pt, NULL, &entrynum); - - if (entrynum > 1) - { - const struct iso_path_table *ipt2 - = pathtable_get_entry (pt, entrynum - 2); - - cdio_assert (ipt2 != NULL); - - cdio_assert (from_722 (ipt2->parent) <= parent); - } - - return entrynum; -} - -/*! - Check that pathname is a valid ISO-9660 directory name. - - A valid directory name should not start out with a slash (/), - dot (.) or null byte, should be less than 37 characters long, - have no more than 8 characters in a directory component - which is separated by a /, and consist of only DCHARs. - */ -bool -iso9660_dirname_valid_p (const char pathname[]) -{ - const char *p = pathname; - int len; - - cdio_assert (pathname != NULL); - - if (*p == '/' || *p == '.' || *p == '\0') - return false; - - if (strlen (pathname) > MAX_ISOPATHNAME) - return false; - - len = 0; - for (; *p; p++) - if (iso9660_isdchar (*p)) - { - len++; - if (len > 8) - return false; - } - else if (*p == '/') - { - if (!len) - return false; - len = 0; - } - else - return false; /* unexpected char */ - - if (!len) - return false; /* last char may not be '/' */ - - return true; -} - -/*! - Check that pathname is a valid ISO-9660 pathname. - - A valid pathname contains a valid directory name, if one appears and - the filename portion should be no more than 8 characters for the - file prefix and 3 characters in the extension (or portion after a - dot). There should be exactly one dot somewhere in the filename - portion and the filename should be composed of only DCHARs. - - True is returned if pathname is valid. - */ -bool -iso9660_pathname_valid_p (const char pathname[]) -{ - const char *p = NULL; - - cdio_assert (pathname != NULL); - - if ((p = strrchr (pathname, '/'))) - { - bool rc; - char *_tmp = strdup (pathname); - - *strrchr (_tmp, '/') = '\0'; - - rc = iso9660_dirname_valid_p (_tmp); - - free (_tmp); - - if (!rc) - return false; - - p++; - } - else - p = pathname; - - if (strlen (pathname) > (MAX_ISOPATHNAME - 6)) - return false; - - { - int len = 0; - int dots = 0; - - for (; *p; p++) - if (iso9660_isdchar (*p)) - { - len++; - if (dots == 0 ? len > 8 : len > 3) - return false; - } - else if (*p == '.') - { - dots++; - if (dots > 1) - return false; - if (!len) - return false; - len = 0; - } - else - return false; - - if (dots != 1) - return false; - } - - return true; -} - -/*! - Take pathname and a version number and turn that into a ISO-9660 - pathname. (That's just the pathname followd by ";" and the version - number. For example, mydir/file.ext -> mydir/file.ext;1 for version - 1. The resulting ISO-9660 pathname is returned. -*/ -char * -iso9660_pathname_isofy (const char pathname[], uint16_t version) -{ - char tmpbuf[1024] = { 0, }; - - cdio_assert (strlen (pathname) < (sizeof (tmpbuf) - sizeof (";65535"))); - - snprintf (tmpbuf, sizeof(tmpbuf), "%s;%d", pathname, version); - - return strdup (tmpbuf); -} - -/*! - Return the PVD's application ID. - NULL is returned if there is some problem in getting this. -*/ -char * -iso9660_get_application_id(iso9660_pvd_t *p_pvd) -{ - if (NULL==p_pvd) return NULL; - return strdup(strip_trail(p_pvd->application_id, ISO_MAX_APPLICATION_ID)); -} - -#if FIXME -lsn_t -iso9660_get_dir_extent(const iso9660_dir_t *idr) -{ - if (NULL == idr) return 0; - return from_733(idr->extent); -} -#endif - -uint8_t -iso9660_get_dir_len(const iso9660_dir_t *idr) -{ - if (NULL == idr) return 0; - return idr->length; -} - -#if FIXME -uint8_t -iso9660_get_dir_size(const iso9660_dir_t *idr) -{ - if (NULL == idr) return 0; - return from_733(idr->size); -} -#endif - -uint8_t -iso9660_get_pvd_type(const iso9660_pvd_t *pvd) -{ - if (NULL == pvd) return 255; - return(pvd->type); -} - -const char * -iso9660_get_pvd_id(const iso9660_pvd_t *pvd) -{ - if (NULL == pvd) return "ERR"; - return(pvd->id); -} - -int -iso9660_get_pvd_space_size(const iso9660_pvd_t *pvd) -{ - if (NULL == pvd) return 0; - return from_733(pvd->volume_space_size); -} - -int -iso9660_get_pvd_block_size(const iso9660_pvd_t *pvd) -{ - if (NULL == pvd) return 0; - return from_723(pvd->logical_block_size); -} - -/*! Return the primary volume id version number (of pvd). - If there is an error 0 is returned. - */ -int -iso9660_get_pvd_version(const iso9660_pvd_t *pvd) -{ - if (NULL == pvd) return 0; - return pvd->version; -} - -/*! Return the LSN of the root directory for pvd. - If there is an error CDIO_INVALID_LSN is returned. - */ -lsn_t -iso9660_get_root_lsn(const iso9660_pvd_t *pvd) -{ - if (NULL == pvd) - return CDIO_INVALID_LSN; - else { - const iso9660_dir_t *idr = &(pvd->root_directory_record); - if (NULL == idr) return CDIO_INVALID_LSN; - return(from_733 (idr->extent)); - } -} - -/*! - Return a string containing the preparer id with trailing - blanks removed. -*/ -char * -iso9660_get_preparer_id(const iso9660_pvd_t *pvd) -{ - if (NULL==pvd) return NULL; - return strdup(strip_trail(pvd->preparer_id, ISO_MAX_PREPARER_ID)); -} - -/*! - Return a string containing the publisher id with trailing - blanks removed. -*/ -char * -iso9660_get_publisher_id(const iso9660_pvd_t *pvd) -{ - if (NULL==pvd) return NULL; - return strdup(strip_trail(pvd->publisher_id, ISO_MAX_PUBLISHER_ID)); -} - -/*! - Return a string containing the PVD's system id with trailing - blanks removed. -*/ -char * -iso9660_get_system_id(const iso9660_pvd_t *pvd) -{ - if (NULL==pvd) return NULL; - return strdup(strip_trail(pvd->system_id, ISO_MAX_SYSTEM_ID)); -} - -/*! - Return the PVD's volume ID. -*/ -char * -iso9660_get_volume_id(const iso9660_pvd_t *pvd) -{ - if (NULL == pvd) return NULL; - return strdup(strip_trail(pvd->volume_id, ISO_MAX_VOLUME_ID)); -} - -/*! - Return the PVD's volumeset ID. - NULL is returned if there is some problem in getting this. -*/ -char * -iso9660_get_volumeset_id(const iso9660_pvd_t *pvd) -{ - if ( NULL == pvd ) return NULL; - return strdup(strip_trail(pvd->volume_set_id, ISO_MAX_VOLUMESET_ID)); -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/iso9660_fs.c b/src/input/vcd/libcdio/iso9660_fs.c deleted file mode 100644 index fff12cd7c..000000000 --- a/src/input/vcd/libcdio/iso9660_fs.c +++ /dev/null @@ -1,1260 +0,0 @@ -/* - $Id: iso9660_fs.c,v 1.7 2006/12/08 16:26:10 mshopf Exp $ - - Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#ifdef HAVE_STRING_H -# include <string.h> -#endif - -#ifdef HAVE_ERRNO_H -# include <errno.h> -#endif - -#ifdef HAVE_ICONV -# include <iconv.h> -#endif - -#ifdef HAVE_NL_LANGINFO -#include <langinfo.h> -#endif - -#include <cdio/cdio.h> -#include <cdio/bytesex.h> -#include <cdio/iso9660.h> -#include <cdio/util.h> - -/* Private headers */ -#include "cdio_assert.h" -#include "_cdio_stdio.h" -#include "cdio_private.h" - -#include <stdio.h> - -static const char _rcsid[] = "$Id: iso9660_fs.c,v 1.7 2006/12/08 16:26:10 mshopf Exp $"; - -/* Implementation of iso9660_t type */ -struct _iso9660 { - CdioDataSource *stream; /* Stream pointer */ - bool b_xa; /* true if has XA attributes. */ - uint8_t i_joliet_level;/* 0 = no Joliet extensions. - 1-3: Joliet level. */ - iso9660_pvd_t pvd; - iso9660_svd_t svd; - iso_extension_mask_t iso_extension_mask; /* What extensions we - tolerate. */ -}; - -/*! - Open an ISO 9660 image for reading. Maybe in the future we will have - a mode. NULL is returned on error. -*/ -iso9660_t * -iso9660_open (const char *pathname /*, mode*/) -{ - return iso9660_open_ext(pathname, ISO_EXTENSION_NONE); -} - -/*! - Open an ISO 9660 image for reading. Maybe in the future we will have - a mode. NULL is returned on error. -*/ -iso9660_t * -iso9660_open_ext (const char *pathname, - iso_extension_mask_t iso_extension_mask) -{ - iso9660_t *p_iso = (iso9660_t *) _cdio_malloc(sizeof(struct _iso9660)) ; - - if (NULL == p_iso) return NULL; - - p_iso->stream = cdio_stdio_new( pathname ); - if (NULL == p_iso->stream) - goto error; - - if ( !iso9660_ifs_read_superblock(p_iso, iso_extension_mask) ) - goto error; - - /* Determine if image has XA attributes. */ - - p_iso->b_xa = !strncmp ((char *) &(p_iso->pvd) + ISO_XA_MARKER_OFFSET, - ISO_XA_MARKER_STRING, - strlen (ISO_XA_MARKER_STRING)); - p_iso->iso_extension_mask = iso_extension_mask; - return p_iso; - - error: - free(p_iso); - return NULL; -} - - - -/*! - Close previously opened ISO 9660 image. - True is unconditionally returned. If there was an error false would - be returned. -*/ -bool -iso9660_close (iso9660_t *p_iso) -{ - if (NULL != p_iso) { - cdio_stdio_destroy(p_iso->stream); - free(p_iso); - } - return true; -} - -static bool -check_pvd (const iso9660_pvd_t *p_pvd) -{ - if ( ISO_VD_PRIMARY != from_711(p_pvd->type) ) { - cdio_warn ("unexpected PVD type %d", p_pvd->type); - return false; - } - - if (strncmp (p_pvd->id, ISO_STANDARD_ID, strlen (ISO_STANDARD_ID))) - { - cdio_warn ("unexpected ID encountered (expected `" - ISO_STANDARD_ID "', got `%.5s'", p_pvd->id); - return false; - } - return true; -} - -#ifdef HAVE_JOLIET -static bool -ucs2be_to_locale(ICONV_CONST char *psz_ucs2be, size_t i_inlen, - char **p_psz_out, size_t i_outlen) -{ - - iconv_t ic = -#if defined(HAVE_NL_LANGINFO) - iconv_open(nl_langinfo(CODESET), "UCS-2BE"); -#else - iconv_open("ASCII", "UCS-2BE"); -#endif - - int rc; - char *psz_buf = NULL; - char *psz_buf2; - int i_outlen_max = i_outlen; - int i_outlen_actual; - - if (-1 == (size_t) ic) { -#if defined(HAVE_NL_LANGINFO) - cdio_info("Failed to get conversion table for locale, trying ASCII"); - ic = iconv_open("ASCII", "UCS-2BE"); - if (-1 == (size_t) ic) { - cdio_info("Failed to get conversion table for ASCII too"); - return false; - } -#else - cdio_info("Failed to get conversion table for locale"); - return false; -#endif - } - - psz_buf = (char *) realloc(psz_buf, i_outlen); - psz_buf2 = psz_buf; - if (!psz_buf) { - /* XXX: report out of memory error */ - goto error; - } - rc = iconv(ic, &psz_ucs2be, &i_inlen, &psz_buf2, &i_outlen); - iconv_close(ic); - if ((rc == -1) && (errno != E2BIG)) { - /* conversion failed */ - goto error; - } - i_outlen_actual = i_outlen_max - i_outlen; - *p_psz_out = malloc(i_outlen_actual + 1); - memcpy(*p_psz_out, psz_buf, i_outlen_actual); - *(*p_psz_out + i_outlen_actual) = '\0'; - free(psz_buf); - return true; - error: - free(psz_buf); - *p_psz_out = NULL; - return false; -} -#endif /*HAVE_JOLIET*/ - -/*! - Return the application ID. NULL is returned in psz_app_id if there - is some problem in getting this. -*/ -bool -iso9660_ifs_get_application_id(iso9660_t *p_iso, - /*out*/ char **p_psz_app_id) -{ - if (!p_iso) { - *p_psz_app_id = NULL; - return false; - } - -#ifdef HAVE_JOLIET - if (p_iso->i_joliet_level) { - /* TODO: check that we haven't reached the maximum size. - If we have, perhaps we've truncated and if we can get - longer results *and* have the same character using - the PVD, do that. - */ - if ( ucs2be_to_locale(p_iso->svd.application_id, - ISO_MAX_APPLICATION_ID, - p_psz_app_id, - ISO_MAX_APPLICATION_ID)) - return true; - } -#endif /*HAVE_JOLIET*/ - *p_psz_app_id = iso9660_get_application_id( &(p_iso->pvd) ); - return *p_psz_app_id != NULL && strlen(*p_psz_app_id); -} - -/*! - Return the Joliet level recognaized for p_iso. -*/ -uint8_t iso9660_ifs_get_joliet_level(iso9660_t *p_iso) -{ - if (!p_iso) return 0; - return p_iso->i_joliet_level; -} - -/*! - Return a string containing the preparer id with trailing - blanks removed. -*/ -bool -iso9660_ifs_get_preparer_id(iso9660_t *p_iso, - /*out*/ char **p_psz_preparer_id) -{ - if (!p_iso) { - *p_psz_preparer_id = NULL; - return false; - } - -#ifdef HAVE_JOLIET - if (p_iso->i_joliet_level) { - /* TODO: check that we haven't reached the maximum size. - If we have, perhaps we've truncated and if we can get - longer results *and* have the same character using - the PVD, do that. - */ - if ( ucs2be_to_locale(p_iso->svd.preparer_id, ISO_MAX_PREPARER_ID, - p_psz_preparer_id, ISO_MAX_PREPARER_ID) ) - return true; - } -#endif /*HAVE_JOLIET*/ - *p_psz_preparer_id = iso9660_get_preparer_id( &(p_iso->pvd) ); - return *p_psz_preparer_id != NULL && strlen(*p_psz_preparer_id); -} - -/*! - Return a string containing the PVD's publisher id with trailing - blanks removed. -*/ -bool iso9660_ifs_get_publisher_id(iso9660_t *p_iso, - /*out*/ char **p_psz_publisher_id) -{ - if (!p_iso) { - *p_psz_publisher_id = NULL; - return false; - } - -#ifdef HAVE_JOLIET - if (p_iso->i_joliet_level) { - /* TODO: check that we haven't reached the maximum size. - If we have, perhaps we've truncated and if we can get - longer results *and* have the same character using - the PVD, do that. - */ - if( ucs2be_to_locale(p_iso->svd.publisher_id, ISO_MAX_PUBLISHER_ID, - p_psz_publisher_id, ISO_MAX_PUBLISHER_ID) ) - return true; - } -#endif /*HAVE_JOLIET*/ - *p_psz_publisher_id = iso9660_get_publisher_id( &(p_iso->pvd) ); - return *p_psz_publisher_id != NULL && strlen(*p_psz_publisher_id); -} - - -/*! - Return a string containing the PVD's publisher id with trailing - blanks removed. -*/ -bool iso9660_ifs_get_system_id(iso9660_t *p_iso, - /*out*/ char **p_psz_system_id) -{ - if (!p_iso) { - *p_psz_system_id = NULL; - return false; - } - -#ifdef HAVE_JOLIET - if (p_iso->i_joliet_level) { - /* TODO: check that we haven't reached the maximum size. - If we have, perhaps we've truncated and if we can get - longer results *and* have the same character using - the PVD, do that. - */ - if ( ucs2be_to_locale(p_iso->svd.system_id, ISO_MAX_SYSTEM_ID, - p_psz_system_id, ISO_MAX_SYSTEM_ID) ) - return true; - } -#endif /*HAVE_JOLIET*/ - *p_psz_system_id = iso9660_get_system_id( &(p_iso->pvd) ); - return *p_psz_system_id != NULL && strlen(*p_psz_system_id); -} - - -/*! - Return a string containing the PVD's publisher id with trailing - blanks removed. -*/ -bool iso9660_ifs_get_volume_id(iso9660_t *p_iso, - /*out*/ char **p_psz_volume_id) -{ - if (!p_iso) { - *p_psz_volume_id = NULL; - return false; - } - -#ifdef HAVE_JOLIET - if (p_iso->i_joliet_level) { - /* TODO: check that we haven't reached the maximum size. - If we have, perhaps we've truncated and if we can get - longer results *and* have the same character using - the PVD, do that. - */ - if ( ucs2be_to_locale(p_iso->svd.volume_id, ISO_MAX_VOLUME_ID, - p_psz_volume_id, ISO_MAX_VOLUME_ID) ) - return true; - } -#endif /* HAVE_JOLIET */ - *p_psz_volume_id = iso9660_get_volume_id( &(p_iso->pvd) ); - return *p_psz_volume_id != NULL && strlen(*p_psz_volume_id); -} - - -/*! - Return a string containing the PVD's publisher id with trailing - blanks removed. -*/ -bool iso9660_ifs_get_volumeset_id(iso9660_t *p_iso, - /*out*/ char **p_psz_volumeset_id) -{ - if (!p_iso) { - *p_psz_volumeset_id = NULL; - return false; - } - -#ifdef HAVE_JOLIET - if (p_iso->i_joliet_level) { - /* TODO: check that we haven't reached the maximum size. - If we have, perhaps we've truncated and if we can get - longer results *and* have the same character using - the PVD, do that. - */ - if ( ucs2be_to_locale(p_iso->svd.volume_set_id, - ISO_MAX_VOLUMESET_ID, - p_psz_volumeset_id, - ISO_MAX_VOLUMESET_ID) ) - return true; - } -#endif /*HAVE_JOLIET*/ - *p_psz_volumeset_id = iso9660_get_volume_id( &(p_iso->pvd) ); - return *p_psz_volumeset_id != NULL && strlen(*p_psz_volumeset_id); -} - - -/*! - Read the Primary Volume Descriptor for an ISO 9660 image. - True is returned if read, and false if there was an error. -*/ -bool -iso9660_ifs_read_pvd (const iso9660_t *p_iso, /*out*/ iso9660_pvd_t *p_pvd) -{ - if (0 == iso9660_iso_seek_read (p_iso, p_pvd, ISO_PVD_SECTOR, 1)) { - cdio_warn ("error reading PVD sector (%d)", ISO_PVD_SECTOR); - return false; - } - return check_pvd(p_pvd); -} - - -/*! - Read the Super block of an ISO 9660 image. This is the - Primary Volume Descriptor (PVD) and perhaps a Supplemental Volume - Descriptor if (Joliet) extensions are acceptable. -*/ -bool -iso9660_ifs_read_superblock (iso9660_t *p_iso, - iso_extension_mask_t iso_extension_mask) -{ - iso9660_svd_t *p_svd; /* Secondary volume descriptor. */ - - if (!p_iso || !iso9660_ifs_read_pvd(p_iso, &(p_iso->pvd))) - return false; - - p_svd = &(p_iso->svd); - p_iso->i_joliet_level = 0; - - if (0 != iso9660_iso_seek_read (p_iso, p_svd, ISO_PVD_SECTOR+1, 1)) { - if ( ISO_VD_SUPPLEMENTARY == from_711(p_svd->type) ) { - if (p_svd->escape_sequences[0] == 0x25 - && p_svd->escape_sequences[1] == 0x2f) { - switch (p_svd->escape_sequences[2]) { - case 0x40: - if (iso_extension_mask & ISO_EXTENSION_JOLIET_LEVEL1) - p_iso->i_joliet_level = 1; - break; - case 0x43: - if (iso_extension_mask & ISO_EXTENSION_JOLIET_LEVEL2) - p_iso->i_joliet_level = 2; - break; - case 0x45: - if (iso_extension_mask & ISO_EXTENSION_JOLIET_LEVEL3) - p_iso->i_joliet_level = 3; - break; - default: - cdio_info("Supplementary Volume Descriptor found, but not Joliet"); - } - if (p_iso->i_joliet_level > 0) { - cdio_info("Found Extension: Joliet Level %d", p_iso->i_joliet_level); - } - } - } - } - - return true; -} - - -/*! - Read the Primary Volume Descriptor for of CD. -*/ -bool -iso9660_fs_read_pvd(const CdIo *p_cdio, /*out*/ iso9660_pvd_t *p_pvd) -{ - /* A bit of a hack, we'll assume track 1 contains ISO_PVD_SECTOR.*/ - bool b_mode2; - char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; - int i_rc; - - switch(cdio_get_track_format(p_cdio, 1)) { - case TRACK_FORMAT_CDI: - case TRACK_FORMAT_XA: - b_mode2 = true; - break; - case TRACK_FORMAT_DATA: - b_mode2 = false; - break; - case TRACK_FORMAT_AUDIO: - case TRACK_FORMAT_PSX: - case TRACK_FORMAT_ERROR: - default: - return false; - } - - i_rc = b_mode2 - ? cdio_read_mode2_sector (p_cdio, buf, ISO_PVD_SECTOR, false) - : cdio_read_mode1_sector (p_cdio, buf, ISO_PVD_SECTOR, false); - - if (i_rc) { - cdio_warn ("error reading PVD sector (%d)", ISO_PVD_SECTOR); - return false; - } - - /* The size of a PVD or SVD is smaller than a sector. So we - allocated a bigger block above (buf) and now we'll copy just - the part we need to save. - */ - cdio_assert (sizeof(buf) >= sizeof (iso9660_pvd_t)); - memcpy(p_pvd, buf, sizeof(iso9660_pvd_t)); - - return check_pvd(p_pvd); -} - - -/*! - Read the Super block of an ISO 9660 image. This is the - Primary Volume Descriptor (PVD) and perhaps a Supplemental Volume - Descriptor if (Joliet) extensions are acceptable. -*/ -bool -iso9660_fs_read_superblock (CdIo *p_cdio, - iso_extension_mask_t iso_extension_mask) -{ - if (!p_cdio) return false; - - { - generic_img_private_t *p_env = (generic_img_private_t *) p_cdio->env; - iso9660_pvd_t *p_pvd = &(p_env->pvd); - iso9660_svd_t *p_svd = &(p_env->svd); - char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; - bool b_mode2; - int i_rc; - - /* A bit of a hack, we'll assume track 1 contains ISO_PVD_SECTOR.*/ - switch(cdio_get_track_format(p_cdio, 1)) { - case TRACK_FORMAT_CDI: - case TRACK_FORMAT_XA: - b_mode2 = true; - break; - case TRACK_FORMAT_DATA: - b_mode2 = false; - break; - case TRACK_FORMAT_AUDIO: - case TRACK_FORMAT_PSX: - case TRACK_FORMAT_ERROR: - default: - return false; - } - - if ( !iso9660_fs_read_pvd(p_cdio, p_pvd) ) - return false; - - p_env->i_joliet_level = 0; - - i_rc = (b_mode2) - ? cdio_read_mode2_sector (p_cdio, buf, ISO_PVD_SECTOR+1, false) - : cdio_read_mode1_sector (p_cdio, buf, ISO_PVD_SECTOR+1, false); - - if (0 == i_rc) { - /* The size of a PVD or SVD is smaller than a sector. So we - allocated a bigger block above (buf) and now we'll copy just - the part we need to save. - */ - cdio_assert (sizeof(buf) >= sizeof (iso9660_svd_t)); - memcpy(p_svd, buf, sizeof(iso9660_svd_t)); - - if ( ISO_VD_SUPPLEMENTARY == from_711(p_svd->type) ) { - if (p_svd->escape_sequences[0] == 0x25 - && p_svd->escape_sequences[1] == 0x2f) { - switch (p_svd->escape_sequences[2]) { - case 0x40: - if (iso_extension_mask & ISO_EXTENSION_JOLIET_LEVEL1) - p_env->i_joliet_level = 1; - break; - case 0x43: - if (iso_extension_mask & ISO_EXTENSION_JOLIET_LEVEL2) - p_env->i_joliet_level = 2; - break; - case 0x45: - if (iso_extension_mask & ISO_EXTENSION_JOLIET_LEVEL3) - p_env->i_joliet_level = 3; - break; - default: - cdio_info("Supplementary Volume Descriptor found, but not Joliet"); - } - if (p_env->i_joliet_level > 0) { - cdio_info("Found Extension: Joliet Level %d", - p_env->i_joliet_level); - } - } - } - } - } - - return true; -} - -/*! - Seek to a position and then read n blocks. Size read is returned. -*/ -long int -iso9660_iso_seek_read (const iso9660_t *p_iso, void *ptr, lsn_t start, - long int size) -{ - long int ret; - if (NULL == p_iso) return 0; - ret = cdio_stream_seek (p_iso->stream, start * ISO_BLOCKSIZE, SEEK_SET); - if (ret!=0) return 0; - return cdio_stream_read (p_iso->stream, ptr, ISO_BLOCKSIZE, size); -} - - -static iso9660_stat_t * -_iso9660_dir_to_statbuf (iso9660_dir_t *p_iso9660_dir, - bool b_mode2, uint8_t i_joliet_level) -{ - iso9660_xa_t *xa_data = NULL; - uint8_t dir_len= iso9660_get_dir_len(p_iso9660_dir); - unsigned int filename_len; - unsigned int stat_len; - iso9660_stat_t *stat; - - if (!dir_len) return NULL; - - filename_len = from_711(p_iso9660_dir->filename_len); - - /* .. string in statbuf is one longer than in p_iso9660_dir's listing '\1' */ - stat_len = sizeof(iso9660_stat_t)+filename_len+2; - - stat = _cdio_malloc(stat_len); - stat->type = (p_iso9660_dir->file_flags & ISO_DIRECTORY) - ? _STAT_DIR : _STAT_FILE; - stat->lsn = from_733 (p_iso9660_dir->extent); - stat->size = from_733 (p_iso9660_dir->size); - stat->secsize = _cdio_len2blocks (stat->size, ISO_BLOCKSIZE); - - if ('\0' == p_iso9660_dir->filename[0] && 1 == filename_len) - strcpy (stat->filename, "."); - else if ('\1' == p_iso9660_dir->filename[0] && 1 == filename_len) - strcpy (stat->filename, ".."); - else { -#ifdef HAVE_JOLIET - if (i_joliet_level) { - int i_inlen = filename_len; - int i_outlen = (i_inlen / 2); - char *p_psz_out = NULL; - ucs2be_to_locale(p_iso9660_dir->filename, i_inlen, - &p_psz_out, i_outlen); - strncpy(stat->filename, p_psz_out, filename_len); - free(p_psz_out); - } else -#endif /*HAVE_JOLIET*/ - strncpy (stat->filename, p_iso9660_dir->filename, filename_len); - } - - - iso9660_get_dtime(&(p_iso9660_dir->recording_time), true, &(stat->tm)); - - cdio_assert (dir_len >= sizeof (iso9660_dir_t)); - - if (b_mode2) { - int su_length = iso9660_get_dir_len(p_iso9660_dir) - - sizeof (iso9660_dir_t); - su_length -= filename_len; - - if (su_length % 2) - su_length--; - - if (su_length < 0 || su_length < sizeof (iso9660_xa_t)) - return stat; - - xa_data = (void *) (((char *) p_iso9660_dir) - + (iso9660_get_dir_len(p_iso9660_dir) - su_length)); - - if (xa_data->signature[0] != 'X' - || xa_data->signature[1] != 'A') - { - cdio_warn ("XA signature not found in ISO9660's system use area;" - " ignoring XA attributes for this file entry."); - cdio_debug ("%d %d %d, '%c%c' (%d, %d)", - iso9660_get_dir_len(p_iso9660_dir), - filename_len, - su_length, - xa_data->signature[0], xa_data->signature[1], - xa_data->signature[0], xa_data->signature[1]); - return stat; - } - stat->xa = *xa_data; - } - return stat; - -} - -/*! - Return the directory name stored in the iso9660_dir_t - - A string is allocated: the caller must deallocate. - */ -char * -iso9660_dir_to_name (const iso9660_dir_t *iso9660_dir) -{ - char namebuf[256] = { 0, }; - uint8_t len=iso9660_get_dir_len(iso9660_dir); - - if (!len) return NULL; - - cdio_assert (len >= sizeof (iso9660_dir_t)); - - /* (iso9660_dir->file_flags & ISO_DIRECTORY) */ - - if (iso9660_dir->filename[0] == '\0') - strcpy (namebuf, "."); - else if (iso9660_dir->filename[0] == '\1') - strcpy (namebuf, ".."); - else - strncpy (namebuf, iso9660_dir->filename, iso9660_dir->filename_len); - - return strdup (namebuf); -} - -/* - Return a pointer to a ISO 9660 stat buffer or NULL if there's an error -*/ -static iso9660_stat_t * -_fs_stat_root (CdIo *p_cdio) -{ - - if (!p_cdio) return NULL; - - { - iso_extension_mask_t iso_extension_mask = ISO_EXTENSION_ALL; - generic_img_private_t *p_env = (generic_img_private_t *) p_cdio->env; - bool b_mode2 = cdio_get_track_green(p_cdio, 1); - iso9660_dir_t *p_iso9660_dir; - iso9660_stat_t *p_stat; - - if (!p_env->i_joliet_level) - iso_extension_mask &= ~ISO_EXTENSION_JOLIET; - - /* FIXME try also with Joliet.*/ - if ( !iso9660_fs_read_superblock (p_cdio, iso_extension_mask) ) { - cdio_warn("Could not read ISO-9660 Superblock."); - return NULL; - } - -#ifdef HAVE_JOLIET - p_iso9660_dir = p_env->i_joliet_level - ? &(p_env->svd.root_directory_record) - : &(p_env->pvd.root_directory_record) ; -#else - p_iso9660_dir = &(p_env->pvd.root_directory_record) ; -#endif - - p_stat = _iso9660_dir_to_statbuf (p_iso9660_dir, b_mode2, - p_env->i_joliet_level); - return p_stat; - } - -} - -static iso9660_stat_t * -_fs_stat_iso_root (iso9660_t *p_iso) -{ - iso9660_stat_t *p_stat; - iso9660_dir_t *p_iso9660_dir; - -#ifdef HAVE_JOLIET - p_iso9660_dir = p_iso->i_joliet_level - ? &(p_iso->svd.root_directory_record) - : &(p_iso->pvd.root_directory_record) ; -#else - p_iso9660_dir = &(p_iso->pvd.root_directory_record) ; -#endif - - p_stat = _iso9660_dir_to_statbuf (p_iso9660_dir, true, - p_iso->i_joliet_level); - return p_stat; -} - -static iso9660_stat_t * -_fs_stat_traverse (const CdIo *p_cdio, const iso9660_stat_t *_root, - char **splitpath, bool b_mode2, bool translate) -{ - unsigned offset = 0; - uint8_t *_dirbuf = NULL; - iso9660_stat_t *p_stat; - generic_img_private_t *p_env = (generic_img_private_t *) p_cdio->env; - - if (!splitpath[0]) - { - unsigned int len=sizeof(iso9660_stat_t) + strlen(_root->filename)+1; - p_stat = _cdio_malloc(len); - memcpy(p_stat, _root, len); - return p_stat; - } - - if (_root->type == _STAT_FILE) - return NULL; - - cdio_assert (_root->type == _STAT_DIR); - - if (_root->size != ISO_BLOCKSIZE * _root->secsize) - { - cdio_warn ("bad size for ISO9660 directory (%ud) should be (%lu)!", - (unsigned) _root->size, - (unsigned long int) ISO_BLOCKSIZE * _root->secsize); - } - - _dirbuf = _cdio_malloc (_root->secsize * ISO_BLOCKSIZE); - - if (b_mode2) { - if (cdio_read_mode2_sectors (p_cdio, _dirbuf, _root->lsn, false, - _root->secsize)) - return NULL; - } else { - if (cdio_read_mode1_sectors (p_cdio, _dirbuf, _root->lsn, false, - _root->secsize)) - return NULL; - } - - while (offset < (_root->secsize * ISO_BLOCKSIZE)) - { - iso9660_dir_t *p_iso9660_dir = (void *) &_dirbuf[offset]; - iso9660_stat_t *p_stat; - int cmp; - - if (!iso9660_get_dir_len(p_iso9660_dir)) - { - offset++; - continue; - } - - p_stat = _iso9660_dir_to_statbuf (p_iso9660_dir, b_mode2, - p_env->i_joliet_level); - - if (translate) { - char *trans_fname = malloc(strlen(p_stat->filename)); - int trans_len; - - if (trans_fname == NULL) { - cdio_warn("can't allocate %lu bytes", - (long unsigned int) strlen(p_stat->filename)); - return NULL; - } - trans_len = iso9660_name_translate_ext(p_stat->filename, trans_fname, - p_env->i_joliet_level); - cmp = strcmp(splitpath[0], trans_fname); - free(trans_fname); - } else { - cmp = strcmp(splitpath[0], p_stat->filename); - } - - if (!cmp) { - iso9660_stat_t *ret_stat - = _fs_stat_traverse (p_cdio, p_stat, &splitpath[1], b_mode2, - translate); - free(p_stat); - free (_dirbuf); - return ret_stat; - } - - free(p_stat); - - offset += iso9660_get_dir_len(p_iso9660_dir); - } - - cdio_assert (offset == (_root->secsize * ISO_BLOCKSIZE)); - - /* not found */ - free (_dirbuf); - return NULL; -} - -static iso9660_stat_t * -_fs_iso_stat_traverse (iso9660_t *p_iso, const iso9660_stat_t *_root, - char **splitpath, bool translate) -{ - unsigned offset = 0; - uint8_t *_dirbuf = NULL; - int ret; - - if (!splitpath[0]) - { - iso9660_stat_t *p_stat; - unsigned int len=sizeof(iso9660_stat_t) + strlen(_root->filename)+1; - p_stat = _cdio_malloc(len); - memcpy(p_stat, _root, len); - return p_stat; - } - - if (_root->type == _STAT_FILE) - return NULL; - - cdio_assert (_root->type == _STAT_DIR); - - if (_root->size != ISO_BLOCKSIZE * _root->secsize) - { - cdio_warn ("bad size for ISO9660 directory (%ud) should be (%lu)!", - (unsigned) _root->size, - (unsigned long int) ISO_BLOCKSIZE * _root->secsize); - } - - _dirbuf = _cdio_malloc (_root->secsize * ISO_BLOCKSIZE); - - ret = iso9660_iso_seek_read (p_iso, _dirbuf, _root->lsn, _root->secsize); - if (ret!=ISO_BLOCKSIZE*_root->secsize) return NULL; - - while (offset < (_root->secsize * ISO_BLOCKSIZE)) - { - iso9660_dir_t *p_iso9660_dir = (void *) &_dirbuf[offset]; - iso9660_stat_t *p_stat; - int cmp; - - if (!iso9660_get_dir_len(p_iso9660_dir)) - { - offset++; - continue; - } - - p_stat = _iso9660_dir_to_statbuf (p_iso9660_dir, true, - p_iso->i_joliet_level); - - if (translate) { - char *trans_fname = malloc(strlen(p_stat->filename)+1); - int trans_len; - - if (trans_fname == NULL) { - cdio_warn("can't allocate %lu bytes", - (long unsigned int) strlen(p_stat->filename)); - return NULL; - } - trans_len = iso9660_name_translate_ext(p_stat->filename, trans_fname, - p_iso->i_joliet_level); - cmp = strcmp(splitpath[0], trans_fname); - free(trans_fname); - } else { - cmp = strcmp(splitpath[0], p_stat->filename); - } - - if (!cmp) { - iso9660_stat_t *ret_stat - = _fs_iso_stat_traverse (p_iso, p_stat, &splitpath[1], translate); - free(p_stat); - free (_dirbuf); - return ret_stat; - } - - free(p_stat); - - offset += iso9660_get_dir_len(p_iso9660_dir); - } - - cdio_assert (offset == (_root->secsize * ISO_BLOCKSIZE)); - - /* not found */ - free (_dirbuf); - return NULL; -} - -/*! - Get file status for pathname into stat. NULL is returned on error. - */ -iso9660_stat_t * -iso9660_fs_stat (CdIo *p_cdio, const char pathname[]) -{ - iso9660_stat_t *p_root; - char **p_psz_splitpath; - iso9660_stat_t *p_stat; - /* A bit of a hack, we'll assume track 1 contains ISO_PVD_SECTOR.*/ - bool b_mode2; - - if (!p_cdio) return NULL; - if (!pathname) return NULL; - - p_root = _fs_stat_root (p_cdio); - if (!p_root) return NULL; - - b_mode2 = cdio_get_track_green(p_cdio, 1); - p_psz_splitpath = _cdio_strsplit (pathname, '/'); - p_stat = _fs_stat_traverse (p_cdio, p_root, p_psz_splitpath, b_mode2, false); - free(p_root); - _cdio_strfreev (p_psz_splitpath); - - return p_stat; -} - -/*! - Get file status for pathname into stat. NULL is returned on error. - pathname version numbers in the ISO 9660 - name are dropped, i.e. ;1 is removed and if level 1 ISO-9660 names - are lowercased. - */ -iso9660_stat_t * -iso9660_fs_stat_translate (CdIo *p_cdio, const char pathname[], - bool b_mode2) -{ - iso9660_stat_t *p_root; - char **p_psz_splitpath; - iso9660_stat_t *p_stat; - - if (!p_cdio) return NULL; - if (pathname) return NULL; - - p_root = _fs_stat_root (p_cdio); - if (!p_root) return NULL; - - p_psz_splitpath = _cdio_strsplit (pathname, '/'); - p_stat = _fs_stat_traverse (p_cdio, p_root, p_psz_splitpath, b_mode2, true); - free(p_root); - _cdio_strfreev (p_psz_splitpath); - - return p_stat; -} - -/*! - Get file status for pathname into stat. NULL is returned on error. - */ -iso9660_stat_t * -iso9660_ifs_stat (iso9660_t *p_iso, const char pathname[]) -{ - iso9660_stat_t *p_root; - char **splitpath; - iso9660_stat_t *stat; - - if (!p_iso) return NULL; - if (!pathname) return NULL; - - p_root = _fs_stat_iso_root (p_iso); - if (!p_root) return NULL; - - splitpath = _cdio_strsplit (pathname, '/'); - stat = _fs_iso_stat_traverse (p_iso, p_root, splitpath, false); - free(p_root); - /*** FIXME _cdio_strfreev (splitpath); ***/ - - return stat; -} - -/*! - Get file status for pathname into stat. NULL is returned on error. - pathname version numbers in the ISO 9660 - name are dropped, i.e. ;1 is removed and if level 1 ISO-9660 names - are lowercased. - */ -iso9660_stat_t * -iso9660_ifs_stat_translate (iso9660_t *p_iso, const char pathname[]) -{ - iso9660_stat_t *p_root; - char **p_psz_splitpath; - iso9660_stat_t *p_stat; - - if (!p_iso) return NULL; - if (!pathname) return NULL; - - p_root = _fs_stat_iso_root (p_iso); - if (NULL == p_root) return NULL; - - p_psz_splitpath = _cdio_strsplit (pathname, '/'); - p_stat = _fs_iso_stat_traverse (p_iso, p_root, p_psz_splitpath, true); - free(p_root); - _cdio_strfreev (p_psz_splitpath); - - return p_stat; -} - -/*! - Read pathname (a directory) and return a list of iso9660_stat_t - of the files inside that. The caller must free the returned result. -*/ -CdioList * -iso9660_fs_readdir (CdIo *p_cdio, const char pathname[], bool b_mode2) -{ - generic_img_private_t *p_env; - iso9660_stat_t *p_stat; - - if (!p_cdio) return NULL; - if (!pathname) return NULL; - - p_env = (generic_img_private_t *) p_cdio->env; - - p_stat = iso9660_fs_stat (p_cdio, pathname); - if (!p_stat) return NULL; - - if (p_stat->type != _STAT_DIR) { - free(p_stat); - return NULL; - } - - { - unsigned offset = 0; - uint8_t *_dirbuf = NULL; - CdioList *retval = _cdio_list_new (); - - if (p_stat->size != ISO_BLOCKSIZE * p_stat->secsize) - { - cdio_warn ("bad size for ISO9660 directory (%ud) should be (%lu)!", - (unsigned) p_stat->size, - (unsigned long int) ISO_BLOCKSIZE * p_stat->secsize); - } - - _dirbuf = _cdio_malloc (p_stat->secsize * ISO_BLOCKSIZE); - - if (b_mode2) { - if (cdio_read_mode2_sectors (p_cdio, _dirbuf, p_stat->lsn, false, - p_stat->secsize)) - cdio_assert_not_reached (); - } else { - if (cdio_read_mode1_sectors (p_cdio, _dirbuf, p_stat->lsn, false, - p_stat->secsize)) - cdio_assert_not_reached (); - } - - while (offset < (p_stat->secsize * ISO_BLOCKSIZE)) - { - iso9660_dir_t *p_iso9660_dir = (void *) &_dirbuf[offset]; - iso9660_stat_t *p_iso9660_stat; - - if (!iso9660_get_dir_len(p_iso9660_dir)) - { - offset++; - continue; - } - - p_iso9660_stat = _iso9660_dir_to_statbuf(p_iso9660_dir, b_mode2, - p_env->i_joliet_level); - _cdio_list_append (retval, p_iso9660_stat); - - offset += iso9660_get_dir_len(p_iso9660_dir); - } - - cdio_assert (offset == (p_stat->secsize * ISO_BLOCKSIZE)); - - free (_dirbuf); - free (p_stat); - return retval; - } -} - -/*! - Read pathname (a directory) and return a list of iso9660_stat_t - of the files inside that. The caller must free the returned result. -*/ -CdioList * -iso9660_ifs_readdir (iso9660_t *p_iso, const char pathname[]) -{ - iso9660_stat_t *p_stat; - - if (!p_iso) return NULL; - if (!pathname) return NULL; - - p_stat = iso9660_ifs_stat (p_iso, pathname); - if (!p_stat) return NULL; - - if (p_stat->type != _STAT_DIR) { - free(p_stat); - return NULL; - } - - { - long int ret; - unsigned offset = 0; - uint8_t *_dirbuf = NULL; - CdioList *retval = _cdio_list_new (); - - if (p_stat->size != ISO_BLOCKSIZE * p_stat->secsize) - { - cdio_warn ("bad size for ISO9660 directory (%ud) should be (%lu)!", - (unsigned int) p_stat->size, - (unsigned long int) ISO_BLOCKSIZE * p_stat->secsize); - } - - _dirbuf = _cdio_malloc (p_stat->secsize * ISO_BLOCKSIZE); - - ret = iso9660_iso_seek_read (p_iso, _dirbuf, p_stat->lsn, p_stat->secsize); - if (ret != ISO_BLOCKSIZE*p_stat->secsize) return NULL; - - while (offset < (p_stat->secsize * ISO_BLOCKSIZE)) - { - iso9660_dir_t *p_iso9660_dir = (void *) &_dirbuf[offset]; - iso9660_stat_t *p_iso9660_stat; - - if (!iso9660_get_dir_len(p_iso9660_dir)) - { - offset++; - continue; - } - - p_iso9660_stat = _iso9660_dir_to_statbuf(p_iso9660_dir, true, - p_iso->i_joliet_level); - _cdio_list_append (retval, p_iso9660_stat); - - offset += iso9660_get_dir_len(p_iso9660_dir); - } - - cdio_assert (offset == (p_stat->secsize * ISO_BLOCKSIZE)); - - free (_dirbuf); - free (p_stat); - return retval; - } -} - -static iso9660_stat_t * -find_fs_lsn_recurse (CdIo *p_cdio, const char pathname[], lsn_t lsn) -{ - CdioList *entlist = iso9660_fs_readdir (p_cdio, pathname, true); - CdioList *dirlist = _cdio_list_new (); - CdioListNode *entnode; - - cdio_assert (entlist != NULL); - - /* iterate over each entry in the directory */ - - _CDIO_LIST_FOREACH (entnode, entlist) - { - iso9660_stat_t *statbuf = _cdio_list_node_data (entnode); - char _fullname[4096] = { 0, }; - char *filename = (char *) statbuf->filename; - - snprintf (_fullname, sizeof (_fullname), "%s%s/", pathname, filename); - - if (statbuf->type == _STAT_DIR - && strcmp ((char *) statbuf->filename, ".") - && strcmp ((char *) statbuf->filename, "..")) - _cdio_list_append (dirlist, strdup (_fullname)); - - if (statbuf->lsn == lsn) { - unsigned int len=sizeof(iso9660_stat_t)+strlen(statbuf->filename)+1; - iso9660_stat_t *ret_stat = _cdio_malloc(len); - memcpy(ret_stat, statbuf, len); - _cdio_list_free (entlist, true); - _cdio_list_free (dirlist, true); - return ret_stat; - } - - } - - _cdio_list_free (entlist, true); - - /* now recurse/descend over directories encountered */ - - _CDIO_LIST_FOREACH (entnode, dirlist) - { - char *_fullname = _cdio_list_node_data (entnode); - iso9660_stat_t *ret_stat = find_fs_lsn_recurse (p_cdio, _fullname, lsn); - - if (NULL != ret_stat) { - _cdio_list_free (dirlist, true); - return ret_stat; - } - } - - _cdio_list_free (dirlist, true); - return NULL; -} - -/*! - Given a directory pointer, find the filesystem entry that contains - lsn and return information about it. - - Returns stat_t of entry if we found lsn, or NULL otherwise. - */ -iso9660_stat_t * -iso9660_find_fs_lsn(CdIo *p_cdio, lsn_t i_lsn) -{ - return find_fs_lsn_recurse (p_cdio, "/", i_lsn); -} - -/*! - Return true if ISO 9660 image has extended attrributes (XA). -*/ -bool -iso9660_ifs_is_xa (const iso9660_t * p_iso) -{ - if (!p_iso) return false; - return p_iso->b_xa; -} diff --git a/src/input/vcd/libcdio/iso9660_private.h b/src/input/vcd/libcdio/iso9660_private.h deleted file mode 100644 index 9a10950aa..000000000 --- a/src/input/vcd/libcdio/iso9660_private.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - $Id: iso9660_private.h,v 1.2 2004/04/11 12:20:31 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2003 Rocky Bernstein <rocky@panix.com> - - See also iso9660.h by Eric Youngdale (1993). - - Copyright 1993 Yggdrasil Computing, Incorporated - Copyright (c) 1999,2000 J. Schilling - - 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 -*/ - -#ifndef __CDIO_ISO9660_PRIVATE_H__ -#define __CDIO_ISO9660_PRIVATE_H__ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <cdio/types.h> - -#define ISO_VERSION 1 - -PRAGMA_BEGIN_PACKED - -struct iso_volume_descriptor { - uint8_t type; /* 711 */ - char id[5]; - uint8_t version; /* 711 */ - char data[2041]; -} GNUC_PACKED; - -#define struct_iso_volume_descriptor_SIZEOF ISO_BLOCKSIZE - -#define struct_iso9660_pvd_SIZEOF ISO_BLOCKSIZE - -/* - * XXX JS: The next structure has an odd length! - * Some compilers (e.g. on Sun3/mc68020) padd the structures to even length. - * For this reason, we cannot use sizeof (struct iso_path_table) or - * sizeof (struct iso_directory_record) to compute on disk sizes. - * Instead, we use offsetof(..., name) and add the name size. - * See mkisofs.h - */ - -/* We use this to help us look up the parent inode numbers. */ - -struct iso_path_table { - uint8_t name_len; /* 711 */ - uint8_t xa_len; /* 711 */ - uint32_t extent; /* 731/732 */ - uint16_t parent; /* 721/722 */ - char name[EMPTY_ARRAY_SIZE]; -} GNUC_PACKED; - -#define struct_iso_path_table_SIZEOF 8 - -#define struct_iso9660_dir_SIZEOF 33 - -PRAGMA_END_PACKED - -#endif /* __CDIO_ISO9660_PRIVATE_H__ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/logging.c b/src/input/vcd/libcdio/logging.c deleted file mode 100644 index 8d561debe..000000000 --- a/src/input/vcd/libcdio/logging.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - $Id: logging.c,v 1.2 2004/04/11 12:20:31 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdlib.h> -#include <stdarg.h> -#include <stdio.h> - -#include <cdio/logging.h> -#include "cdio_assert.h" - -static const char _rcsid[] = "$Id: logging.c,v 1.2 2004/04/11 12:20:31 miguelfreitas Exp $"; - -cdio_log_level_t cdio_loglevel_default = CDIO_LOG_WARN; - -static void -default_cdio_log_handler (cdio_log_level_t level, const char message[]) -{ - switch (level) - { - case CDIO_LOG_ERROR: - if (level >= cdio_loglevel_default) { - fprintf (stderr, "**ERROR: %s\n", message); - fflush (stderr); - } - exit (EXIT_FAILURE); - break; - case CDIO_LOG_DEBUG: - if (level >= cdio_loglevel_default) { - fprintf (stdout, "--DEBUG: %s\n", message); - } - break; - case CDIO_LOG_WARN: - if (level >= cdio_loglevel_default) { - fprintf (stdout, "++ WARN: %s\n", message); - } - break; - case CDIO_LOG_INFO: - if (level >= cdio_loglevel_default) { - fprintf (stdout, " INFO: %s\n", message); - } - break; - case CDIO_LOG_ASSERT: - if (level >= cdio_loglevel_default) { - fprintf (stderr, "!ASSERT: %s\n", message); - fflush (stderr); - } - abort (); - break; - default: - cdio_assert_not_reached (); - break; - } - - fflush (stdout); -} - -static cdio_log_handler_t _handler = default_cdio_log_handler; - -cdio_log_handler_t -cdio_log_set_handler (cdio_log_handler_t new_handler) -{ - cdio_log_handler_t old_handler = _handler; - - _handler = new_handler; - - return old_handler; -} - -static void -cdio_logv (cdio_log_level_t level, const char format[], va_list args) -{ - char buf[1024] = { 0, }; - static int in_recursion = 0; - - if (in_recursion) - cdio_assert_not_reached (); - - in_recursion = 1; - - vsnprintf(buf, sizeof(buf)-1, format, args); - - _handler(level, buf); - - in_recursion = 0; -} - -void -cdio_log (cdio_log_level_t level, const char format[], ...) -{ - va_list args; - va_start (args, format); - cdio_logv (level, format, args); - va_end (args); -} - -#define CDIO_LOG_TEMPLATE(level, LEVEL) \ -void \ -cdio_ ## level (const char format[], ...) \ -{ \ - va_list args; \ - va_start (args, format); \ - cdio_logv (CDIO_LOG_ ## LEVEL, format, args); \ - va_end (args); \ -} - -CDIO_LOG_TEMPLATE(debug, DEBUG) -CDIO_LOG_TEMPLATE(info, INFO) -CDIO_LOG_TEMPLATE(warn, WARN) -CDIO_LOG_TEMPLATE(error, ERROR) - -#undef CDIO_LOG_TEMPLATE - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/portable.h b/src/input/vcd/libcdio/portable.h deleted file mode 100644 index 3da436245..000000000 --- a/src/input/vcd/libcdio/portable.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - $Id: portable.h,v 1.1 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/* - This file contains definitions to fill in for differences or - deficiencies to OS or compiler irregularities. If this file is - included other routines can be more portable. -*/ - -#ifndef __CDIO_PORTABLE_H__ -#define __CDIO_PORTABLE_H__ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#if !defined(HAVE_FTRUNCATE) -# if defined ( WIN32 ) -# define ftruncate chsize -# endif -#endif /*HAVE_FTRUNCATE*/ - -#if !defined(HAVE_SNPRINTF) -# if defined ( MSVC ) -# define snprintf _snprintf -# endif -#endif /*HAVE_SNPRINTF*/ - -#if !defined(HAVE_VSNPRINTF) -# if defined ( MSVC ) -# define snprintf _vsnprintf -# endif -#endif /*HAVE_SNPRINTF*/ - -#ifdef MSVC -# include <io.h> - -# ifndef S_ISBLK -# define _S_IFBLK 0060000 /* Block Special */ -# define S_ISBLK(x) (x & _S_IFBLK) -# endif - -# ifndef S_ISCHR -# define _S_IFCHR 0020000 /* character special */ -# define S_ISCHR(x) (x & _S_IFCHR) -# endif -#endif /*MSVC*/ - -#ifdef HAVE_MEMSET -# define BZERO(ptr, size) memset(ptr, 0, size) -#elif HAVE_BZERO -# define BZERO(ptr, size) bzero(ptr, size) -#else - Error -- you need either memset or bzero -#endif - -#endif /* __CDIO_PORTABLE_H__ */ diff --git a/src/input/vcd/libcdio/scsi_mmc.c b/src/input/vcd/libcdio/scsi_mmc.c deleted file mode 100644 index 9b4a456a5..000000000 --- a/src/input/vcd/libcdio/scsi_mmc.c +++ /dev/null @@ -1,589 +0,0 @@ -/* Common SCSI Multimedia Command (MMC) routines. - - $Id: scsi_mmc.c,v 1.1 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <cdio/cdio.h> -#include <cdio/logging.h> -#include <cdio/scsi_mmc.h> -#include "cdio_private.h" - -#ifdef HAVE_STRING_H -#include <string.h> -#endif - -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif - -#ifdef HAVE_ERRNO_H -#include <errno.h> -#endif - -/*! - On input a MODE_SENSE command was issued and we have the results - in p. We interpret this and return a bit mask set according to the - capabilities. - */ -void -scsi_mmc_get_drive_cap_buf(const uint8_t *p, - /*out*/ cdio_drive_read_cap_t *p_read_cap, - /*out*/ cdio_drive_write_cap_t *p_write_cap, - /*out*/ cdio_drive_misc_cap_t *p_misc_cap) -{ - /* Reader */ - if (p[2] & 0x01) *p_read_cap |= CDIO_DRIVE_CAP_READ_CD_R; - if (p[2] & 0x02) *p_read_cap |= CDIO_DRIVE_CAP_READ_CD_RW; - if (p[2] & 0x08) *p_read_cap |= CDIO_DRIVE_CAP_READ_DVD_ROM; - if (p[4] & 0x01) *p_read_cap |= CDIO_DRIVE_CAP_READ_AUDIO; - if (p[5] & 0x01) *p_read_cap |= CDIO_DRIVE_CAP_READ_CD_DA; - if (p[5] & 0x10) *p_read_cap |= CDIO_DRIVE_CAP_READ_C2_ERRS; - - /* Writer */ - if (p[3] & 0x01) *p_write_cap |= CDIO_DRIVE_CAP_WRITE_CD_R; - if (p[3] & 0x02) *p_write_cap |= CDIO_DRIVE_CAP_WRITE_CD_RW; - if (p[3] & 0x10) *p_write_cap |= CDIO_DRIVE_CAP_WRITE_DVD_R; - if (p[3] & 0x20) *p_write_cap |= CDIO_DRIVE_CAP_WRITE_DVD_RAM; - if (p[4] & 0x80) *p_misc_cap |= CDIO_DRIVE_CAP_WRITE_BURN_PROOF; - - /* Misc */ - if (p[4] & 0x40) *p_misc_cap |= CDIO_DRIVE_CAP_MISC_MULTI_SESSION; - if (p[6] & 0x01) *p_misc_cap |= CDIO_DRIVE_CAP_MISC_LOCK; - if (p[6] & 0x08) *p_misc_cap |= CDIO_DRIVE_CAP_MISC_EJECT; - if (p[6] >> 5 != 0) - *p_misc_cap |= CDIO_DRIVE_CAP_MISC_CLOSE_TRAY; -} - -/*! - Return the number of length in bytes of the Command Descriptor - buffer (CDB) for a given SCSI MMC command. The length will be - either 6, 10, or 12. -*/ -uint8_t -scsi_mmc_get_cmd_len(uint8_t scsi_cmd) -{ - static const uint8_t scsi_cdblen[8] = {6, 10, 10, 12, 12, 12, 10, 10}; - return scsi_cdblen[((scsi_cmd >> 5) & 7)]; -} - -/*! - Run a SCSI MMC command. - - cdio CD structure set by cdio_open(). - i_timeout time in milliseconds we will wait for the command - to complete. If this value is -1, use the default - time-out value. - buf Buffer for data, both sending and receiving - len Size of buffer - e_direction direction the transfer is to go - cdb CDB bytes. All values that are needed should be set on - input. We'll figure out what the right CDB length should be. - - We return 0 if command completed successfully and 1 if not. - */ -int -scsi_mmc_run_cmd( const CdIo *p_cdio, unsigned int i_timeout_ms, - const scsi_mmc_cdb_t *p_cdb, - scsi_mmc_direction_t e_direction, unsigned int i_buf, - /*in/out*/ void *p_buf ) -{ - if (p_cdio && p_cdio->op.run_scsi_mmc_cmd) { - return p_cdio->op.run_scsi_mmc_cmd(p_cdio->env, i_timeout_ms, - scsi_mmc_get_cmd_len(p_cdb->field[0]), - p_cdb, e_direction, i_buf, p_buf); - } else - return 1; -} - -#define DEFAULT_TIMEOUT_MS 6000 - -/*! - * Eject using SCSI MMC commands. Return 0 if successful. - */ -int -scsi_mmc_eject_media( const CdIo *cdio ) -{ - int i_status; - scsi_mmc_cdb_t cdb = {{0, }}; - uint8_t buf[1]; - scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd; - - if ( ! cdio || ! cdio->op.run_scsi_mmc_cmd ) - return -2; - - run_scsi_mmc_cmd = cdio->op.run_scsi_mmc_cmd; - - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_ALLOW_MEDIUM_REMOVAL); - - i_status = run_scsi_mmc_cmd (cdio->env, DEFAULT_TIMEOUT_MS, - scsi_mmc_get_cmd_len(cdb.field[0]), &cdb, - SCSI_MMC_DATA_WRITE, 0, &buf); - if (0 != i_status) - return i_status; - - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_START_STOP); - cdb.field[4] = 1; - i_status = run_scsi_mmc_cmd (cdio->env, DEFAULT_TIMEOUT_MS, - scsi_mmc_get_cmd_len(cdb.field[0]), &cdb, - SCSI_MMC_DATA_WRITE, 0, &buf); - if (0 != i_status) - return i_status; - - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_START_STOP); - cdb.field[4] = 2; /* eject */ - - return run_scsi_mmc_cmd (cdio->env, DEFAULT_TIMEOUT_MS, - scsi_mmc_get_cmd_len(cdb.field[0]), &cdb, - SCSI_MMC_DATA_WRITE, 0, &buf); - -} - -/*! Packet driver to read mode2 sectors. - Can read only up to 25 blocks. -*/ -int -scsi_mmc_read_sectors ( const CdIo *cdio, void *p_buf, lba_t lba, - int sector_type, unsigned int nblocks ) -{ - scsi_mmc_cdb_t cdb = {{0, }}; - - scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd; - - if ( ! cdio || ! cdio->op.run_scsi_mmc_cmd ) - return -2; - - run_scsi_mmc_cmd = cdio->op.run_scsi_mmc_cmd; - - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_CD); - CDIO_MMC_SET_READ_TYPE (cdb.field, sector_type); - CDIO_MMC_SET_READ_LBA (cdb.field, lba); - CDIO_MMC_SET_READ_LENGTH24(cdb.field, nblocks); - CDIO_MMC_SET_MAIN_CHANNEL_SELECTION_BITS(cdb.field, - CDIO_MMC_MCSB_ALL_HEADERS); - - return run_scsi_mmc_cmd (cdio->env, DEFAULT_TIMEOUT_MS, - scsi_mmc_get_cmd_len(cdb.field[0]), &cdb, - SCSI_MMC_DATA_READ, - CDIO_CD_FRAMESIZE_RAW * nblocks, - p_buf); -} - -int -scsi_mmc_set_blocksize_private ( const void *p_env, - const scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd, - unsigned int bsize) -{ - scsi_mmc_cdb_t cdb = {{0, }}; - - struct - { - uint8_t reserved1; - uint8_t medium; - uint8_t reserved2; - uint8_t block_desc_length; - uint8_t density; - uint8_t number_of_blocks_hi; - uint8_t number_of_blocks_med; - uint8_t number_of_blocks_lo; - uint8_t reserved3; - uint8_t block_length_hi; - uint8_t block_length_med; - uint8_t block_length_lo; - } mh; - - if ( ! p_env || ! run_scsi_mmc_cmd ) - return -2; - - memset (&mh, 0, sizeof (mh)); - mh.block_desc_length = 0x08; - mh.block_length_hi = (bsize >> 16) & 0xff; - mh.block_length_med = (bsize >> 8) & 0xff; - mh.block_length_lo = (bsize >> 0) & 0xff; - - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_MODE_SELECT_6); - - cdb.field[1] = 1 << 4; - cdb.field[4] = 12; - - return run_scsi_mmc_cmd (p_env, DEFAULT_TIMEOUT_MS, - scsi_mmc_get_cmd_len(cdb.field[0]), &cdb, - SCSI_MMC_DATA_WRITE, sizeof(mh), &mh); -} - -int -scsi_mmc_set_blocksize ( const CdIo *cdio, unsigned int bsize) -{ - if ( ! cdio ) return -2; - return - scsi_mmc_set_blocksize_private (cdio->env, cdio->op.run_scsi_mmc_cmd, - bsize); -} - - -/*! - Return the the kind of drive capabilities of device. - */ -void -scsi_mmc_get_drive_cap_private (const void *p_env, - const scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd, - /*out*/ cdio_drive_read_cap_t *p_read_cap, - /*out*/ cdio_drive_write_cap_t *p_write_cap, - /*out*/ cdio_drive_misc_cap_t *p_misc_cap) -{ - /* Largest buffer size we use. */ -#define BUF_MAX 2048 - uint8_t buf[BUF_MAX] = { 0, }; - - scsi_mmc_cdb_t cdb = {{0, }}; - int i_status; - uint16_t i_data = BUF_MAX; - - if ( ! p_env || ! run_scsi_mmc_cmd ) - return; - - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_MODE_SENSE_10); - cdb.field[1] = 0x0; - cdb.field[2] = CDIO_MMC_ALL_PAGES; - - retry: - CDIO_MMC_SET_READ_LENGTH16(cdb.field, 8); - - /* In the first run we run MODE SENSE 10 we are trying to get the - length of the data features. */ - i_status = run_scsi_mmc_cmd (p_env, DEFAULT_TIMEOUT_MS, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_READ, - sizeof(buf), &buf); - if (0 == i_status) { - uint16_t i_data_try = (uint16_t) CDIO_MMC_GET_LEN16(buf); - if (i_data_try < BUF_MAX) i_data = i_data_try; - } - - /* Now try getting all features with length set above, possibly - truncated or the default length if we couldn't get the proper - length. */ - CDIO_MMC_SET_READ_LENGTH16(cdb.field, i_data); - - i_status = run_scsi_mmc_cmd (p_env, DEFAULT_TIMEOUT_MS, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_READ, - sizeof(buf), &buf); - - if (0 != i_status && CDIO_MMC_CAPABILITIES_PAGE != cdb.field[2]) { - cdb.field[2] = CDIO_MMC_CAPABILITIES_PAGE; - goto retry; - } - - if (0 == i_status) { - uint8_t *p; - uint8_t *p_max = buf + 256; - - *p_read_cap = 0; - *p_write_cap = 0; - *p_misc_cap = 0; - - /* set to first sense mask, and then walk through the masks */ - p = buf + 8; - while( (p < &(buf[2+i_data])) && (p < p_max) ) { - uint8_t which_page; - - which_page = p[0] & 0x3F; - switch( which_page ) - { - case CDIO_MMC_AUDIO_CTL_PAGE: - case CDIO_MMC_R_W_ERROR_PAGE: - case CDIO_MMC_CDR_PARMS_PAGE: - /* Don't handle these yet. */ - break; - case CDIO_MMC_CAPABILITIES_PAGE: - scsi_mmc_get_drive_cap_buf(p, p_read_cap, p_write_cap, p_misc_cap); - break; - default: ; - } - p += (p[1] + 2); - } - } else { - cdio_info("%s: %s\n", "error in MODE_SELECT", strerror(errno)); - *p_read_cap = CDIO_DRIVE_CAP_ERROR; - *p_write_cap = CDIO_DRIVE_CAP_ERROR; - *p_misc_cap = CDIO_DRIVE_CAP_ERROR; - } - return; -} - -void -scsi_mmc_get_drive_cap (const CdIo *p_cdio, - /*out*/ cdio_drive_read_cap_t *p_read_cap, - /*out*/ cdio_drive_write_cap_t *p_write_cap, - /*out*/ cdio_drive_misc_cap_t *p_misc_cap) -{ - if ( ! p_cdio ) return; - scsi_mmc_get_drive_cap_private (p_cdio->env, - p_cdio->op.run_scsi_mmc_cmd, - p_read_cap, p_write_cap, p_misc_cap); -} - -void -scsi_mmc_get_drive_cap_generic (const void *p_user_data, - /*out*/ cdio_drive_read_cap_t *p_read_cap, - /*out*/ cdio_drive_write_cap_t *p_write_cap, - /*out*/ cdio_drive_misc_cap_t *p_misc_cap) -{ - const generic_img_private_t *p_env = p_user_data; - scsi_mmc_get_drive_cap( p_env->cdio, - p_read_cap, p_write_cap, p_misc_cap ); -} - - -/*! - Get the DVD type associated with cd object. -*/ -discmode_t -scsi_mmc_get_dvd_struct_physical_private ( void *p_env, const - scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd, - cdio_dvd_struct_t *s) -{ - scsi_mmc_cdb_t cdb = {{0, }}; - unsigned char buf[4 + 4 * 20], *base; - int i_status; - uint8_t layer_num = s->physical.layer_num; - - cdio_dvd_layer_t *layer; - - if ( ! p_env || ! run_scsi_mmc_cmd ) - return -2; - - if (layer_num >= CDIO_DVD_MAX_LAYERS) - return -EINVAL; - - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_DVD_STRUCTURE); - cdb.field[6] = layer_num; - cdb.field[7] = CDIO_DVD_STRUCT_PHYSICAL; - cdb.field[9] = sizeof(buf) & 0xff; - - i_status = run_scsi_mmc_cmd(p_env, DEFAULT_TIMEOUT_MS, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_READ, - sizeof(buf), &buf); - if (0 != i_status) - return CDIO_DISC_MODE_ERROR; - - base = &buf[4]; - layer = &s->physical.layer[layer_num]; - - /* - * place the data... really ugly, but at least we won't have to - * worry about endianess in userspace. - */ - memset(layer, 0, sizeof(*layer)); - layer->book_version = base[0] & 0xf; - layer->book_type = base[0] >> 4; - layer->min_rate = base[1] & 0xf; - layer->disc_size = base[1] >> 4; - layer->layer_type = base[2] & 0xf; - layer->track_path = (base[2] >> 4) & 1; - layer->nlayers = (base[2] >> 5) & 3; - layer->track_density = base[3] & 0xf; - layer->linear_density = base[3] >> 4; - layer->start_sector = base[5] << 16 | base[6] << 8 | base[7]; - layer->end_sector = base[9] << 16 | base[10] << 8 | base[11]; - layer->end_sector_l0 = base[13] << 16 | base[14] << 8 | base[15]; - layer->bca = base[16] >> 7; - - return 0; -} - - -/*! - Get the DVD type associated with cd object. -*/ -discmode_t -scsi_mmc_get_dvd_struct_physical ( const CdIo *p_cdio, cdio_dvd_struct_t *s) -{ - if ( ! p_cdio ) return -2; - return - scsi_mmc_get_dvd_struct_physical_private (p_cdio->env, - p_cdio->op.run_scsi_mmc_cmd, - s); -} - -/*! - Get the CD-ROM hardware info via a SCSI MMC INQUIRY command. - False is returned if we had an error getting the information. -*/ -bool -scsi_mmc_get_hwinfo ( const CdIo *p_cdio, - /*out*/ cdio_hwinfo_t *hw_info ) -{ - int i_status; /* Result of SCSI MMC command */ - char buf[36] = { 0, }; /* Place to hold returned data */ - scsi_mmc_cdb_t cdb = {{0, }}; /* Command Descriptor Block */ - - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_INQUIRY); - cdb.field[4] = sizeof(buf); - - if (! p_cdio || ! hw_info ) return false; - - i_status = scsi_mmc_run_cmd(p_cdio, DEFAULT_TIMEOUT_MS, - &cdb, SCSI_MMC_DATA_READ, - sizeof(buf), &buf); - if (i_status == 0) { - - memcpy(hw_info->psz_vendor, - buf + 8, - sizeof(hw_info->psz_vendor)-1); - hw_info->psz_vendor[sizeof(hw_info->psz_vendor)-1] = '\0'; - memcpy(hw_info->psz_model, - buf + 8 + CDIO_MMC_HW_VENDOR_LEN, - sizeof(hw_info->psz_model)-1); - hw_info->psz_model[sizeof(hw_info->psz_model)-1] = '\0'; - memcpy(hw_info->psz_revision, - buf + 8 + CDIO_MMC_HW_VENDOR_LEN + CDIO_MMC_HW_MODEL_LEN, - sizeof(hw_info->psz_revision)-1); - hw_info->psz_revision[sizeof(hw_info->psz_revision)-1] = '\0'; - return true; - } - return false; -} - -/*! - Return the media catalog number MCN. - - Note: string is malloc'd so caller should free() then returned - string when done with it. - - */ -char * -scsi_mmc_get_mcn_private ( void *p_env, - const scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd - ) -{ - scsi_mmc_cdb_t cdb = {{0, }}; - char buf[28] = { 0, }; - int i_status; - - if ( ! p_env || ! run_scsi_mmc_cmd ) - return NULL; - - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_SUBCHANNEL); - cdb.field[1] = 0x0; - cdb.field[2] = 0x40; - cdb.field[3] = CDIO_SUBCHANNEL_MEDIA_CATALOG; - CDIO_MMC_SET_READ_LENGTH16(cdb.field, sizeof(buf)); - - i_status = run_scsi_mmc_cmd(p_env, DEFAULT_TIMEOUT_MS, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_READ, - sizeof(buf), buf); - if(i_status == 0) { - return strdup(&buf[9]); - } - return NULL; -} - -char * -scsi_mmc_get_mcn ( const CdIo *p_cdio ) -{ - if ( ! p_cdio ) return NULL; - return scsi_mmc_get_mcn_private (p_cdio->env, - p_cdio->op.run_scsi_mmc_cmd ); -} - -char * -scsi_mmc_get_mcn_generic (const void *p_user_data) -{ - const generic_img_private_t *p_env = p_user_data; - return scsi_mmc_get_mcn( p_env->cdio ); -} - -/* - Read cdtext information for a CdIo object . - - return true on success, false on error or CD-Text information does - not exist. -*/ -bool -scsi_mmc_init_cdtext_private ( void *p_user_data, - const scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd, - set_cdtext_field_fn_t set_cdtext_field_fn - ) -{ - - generic_img_private_t *p_env = p_user_data; - scsi_mmc_cdb_t cdb = {{0, }}; - unsigned char wdata[5000] = { 0, }; - int i_status, i_errno; - - if ( ! p_env || ! run_scsi_mmc_cmd || p_env->b_cdtext_error ) - return false; - - /* Operation code */ - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_TOC); - - cdb.field[1] = CDIO_CDROM_MSF; - /* Format */ - cdb.field[2] = CDIO_MMC_READTOC_FMT_CDTEXT; - - /* Setup to read header, to get length of data */ - CDIO_MMC_SET_READ_LENGTH16(cdb.field, 4); - - errno = 0; - -/* Set read timeout 3 minues. */ -#define READ_TIMEOUT 3*60*1000 - - /* We may need to give CD-Text a little more time to complete. */ - /* First off, just try and read the size */ - i_status = run_scsi_mmc_cmd (p_env, READ_TIMEOUT, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_READ, - 4, &wdata); - - if (i_status != 0) { - cdio_info ("CD-Text read failed for header: %s\n", strerror(errno)); - i_errno = errno; - p_env->b_cdtext_error = true; - return false; - } else { - /* Now read the CD-Text data */ - int i_cdtext = CDIO_MMC_GET_LEN16(wdata); - - if (i_cdtext > sizeof(wdata)) i_cdtext = sizeof(wdata); - - CDIO_MMC_SET_READ_LENGTH16(cdb.field, i_cdtext); - i_status = run_scsi_mmc_cmd (p_env, READ_TIMEOUT, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_READ, - i_cdtext, &wdata); - if (i_status != 0) { - cdio_info ("CD-Text read for text failed: %s\n", strerror(errno)); - i_errno = errno; - p_env->b_cdtext_error = true; - return false; - } - p_env->b_cdtext_init = true; - return cdtext_data_init(p_env, p_env->i_first_track, wdata, - set_cdtext_field_fn); - } -} - diff --git a/src/input/vcd/libcdio/scsi_mmc.h b/src/input/vcd/libcdio/scsi_mmc.h deleted file mode 100644 index b6ea05b7a..000000000 --- a/src/input/vcd/libcdio/scsi_mmc.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - $Id: scsi_mmc.h,v 1.2 2004/04/11 12:20:31 miguelfreitas Exp $ - - Copyright (C) 2003 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -/* - This file contains common definitions/routines for SCSI MMC - (Multimedia commands). -*/ - -#ifndef __SCSI_MMC_H__ -#define __SCSI_MMC_H__ - -/* Leval values that can go into READ_CD */ -#define CDIO_MMC_READ_TYPE_ANY 0 /* All types */ -#define CDIO_MMC_READ_TYPE_CDDA 1 /* Only CD-DA sectors */ -#define CDIO_MMC_READ_TYPE_MODE1 2 /* Only mode1 sectors (user data = 2048) */ -#define CDIO_MMC_READ_TYPE_MODE2 3 /* mode2 sectors form1 or form2 */ -#define CDIO_MMC_READ_TYPE_M2F1 4 /* mode2 sectors form1 */ -#define CDIO_MMC_READ_TYPE_M2F2 5 /* mode2 sectors form2 */ - -/* The generic packet command opcodes for CD/DVD Logical Units, - * From Table 57 of the SFF8090 Ver. 3 (Mt. Fuji) draft standard. */ -#define CDIO_MMC_GPCMD_READ_CD 0xbe -#define CDIO_MMC_GPCMD_READ_10 0x28 -#define CDIO_MMC_GPCMD_READ_12 0xa8 - -#define CDIO_MMC_SET_READ_TYPE(rec, sector_type) \ - rec[1] = (sector_type << 2) - - -#define CDIO_MMC_SET_READ_LBA(rec, lba) \ - rec[2] = (lba >> 24) & 0xff; \ - rec[3] = (lba >> 16) & 0xff; \ - rec[4] = (lba >> 8) & 0xff; \ - rec[5] = (lba ) & 0xff - -#define CDIO_MMC_SET_READ_LENGTH(rec, len) \ - rec[6] = (len >> 16) & 0xff; \ - rec[7] = (len >> 8) & 0xff; \ - rec[8] = (len ) & 0xff - -#define CDIO_MMC_MCSB_ALL_HEADERS 0x78 - -#define CDIO_MMC_SET_MAIN_CHANNEL_SELECTION_BITS(rec, val) \ - rec[9] = val; - -#endif /* __SCSI_MMC_H__ */ diff --git a/src/input/vcd/libcdio/scsi_mmc_private.h b/src/input/vcd/libcdio/scsi_mmc_private.h deleted file mode 100644 index b3f1e7061..000000000 --- a/src/input/vcd/libcdio/scsi_mmc_private.h +++ /dev/null @@ -1,105 +0,0 @@ -/* private MMC helper routines. - - $Id: scsi_mmc_private.h,v 1.1 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -#include <cdio/scsi_mmc.h> -#include "cdtext_private.h" - -/*! Convert milliseconds to seconds taking the ceiling value, i.e. - 1002 milliseconds gets rounded to 2 seconds. -*/ -#define SECS2MSECS 1000 -static inline unsigned int -msecs2secs(unsigned int msecs) -{ - return (msecs+(SECS2MSECS-1)) / SECS2MSECS; -} -#undef SECS2MSECS - -typedef -int (*scsi_mmc_run_cmd_fn_t) ( const void *p_user_data, - unsigned int i_timeout_ms, - unsigned int i_cdb, - const scsi_mmc_cdb_t *p_cdb, - scsi_mmc_direction_t e_direction, - unsigned int i_buf, /*in/out*/ void *p_buf ); - -int scsi_mmc_set_blocksize_mmc_private ( const void *p_env, const - scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd, - unsigned int bsize ); - -/*! - Get the DVD type associated with cd object. -*/ -discmode_t -scsi_mmc_get_dvd_struct_physical_private ( void *p_env, const - scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd, - cdio_dvd_struct_t *s ); - - -int -scsi_mmc_set_blocksize_private ( const void *p_env, - const scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd, - unsigned int bsize); - -char *scsi_mmc_get_mcn_private ( void *p_env, - const scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd - ); - -char *scsi_mmc_get_mcn_generic (const void *p_user_data); - -bool scsi_mmc_init_cdtext_private ( void *user_data, const - scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd, - set_cdtext_field_fn_t set_cdtext_field_fn - ); - -/*! - On input a MODE_SENSE command was issued and we have the results - in p. We interpret this and return a bit mask set according to the - capabilities. - */ -void scsi_mmc_get_drive_cap_buf(const uint8_t *p, - /*out*/ cdio_drive_read_cap_t *p_read_cap, - /*out*/ cdio_drive_write_cap_t *p_write_cap, - /*out*/ cdio_drive_misc_cap_t *p_misc_cap); - -/*! - Return the the kind of drive capabilities of device. - - Note: string is malloc'd so caller should free() then returned - string when done with it. - - */ -void -scsi_mmc_get_drive_cap_private (const void *p_env, - const scsi_mmc_run_cmd_fn_t run_scsi_mmc_cmd, - /*out*/ cdio_drive_read_cap_t *p_read_cap, - /*out*/ cdio_drive_write_cap_t *p_write_cap, - /*out*/ cdio_drive_misc_cap_t *p_misc_cap); -void -scsi_mmc_get_drive_cap_generic (const void *p_user_data, - /*out*/ cdio_drive_read_cap_t *p_read_cap, - /*out*/ cdio_drive_write_cap_t *p_write_cap, - /*out*/ cdio_drive_misc_cap_t *p_misc_cap); - - - - - diff --git a/src/input/vcd/libcdio/sector.c b/src/input/vcd/libcdio/sector.c deleted file mode 100644 index da49e9908..000000000 --- a/src/input/vcd/libcdio/sector.c +++ /dev/null @@ -1,289 +0,0 @@ -/* - $Id: sector.c,v 1.3 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <cdio/sector.h> -#include <cdio/util.h> -#include <cdio/logging.h> -#include "cdio_assert.h" - -#include <stdio.h> -#ifdef HAVE_STRING_H -#include <string.h> -#endif - -#include <ctype.h> - -static const char _rcsid[] = "$Id: sector.c,v 1.3 2005/01/01 02:43:57 rockyb Exp $"; - -lba_t -cdio_lba_to_lsn (lba_t lba) -{ - if (CDIO_INVALID_LBA == lba) return CDIO_INVALID_LSN; - return lba - CDIO_PREGAP_SECTORS; -} - -/* - The below is adapted from cdparanoia code which claims it is - straight from the MMC3 spec. -*/ - -void -cdio_lsn_to_msf (lsn_t lsn, msf_t *msf) -{ - int m, s, f; - - cdio_assert (msf != 0); - - if ( lsn >= -CDIO_PREGAP_SECTORS ){ - m = (lsn + CDIO_PREGAP_SECTORS) / CDIO_CD_FRAMES_PER_MIN; - lsn -= m * CDIO_CD_FRAMES_PER_MIN; - s = (lsn + CDIO_PREGAP_SECTORS) / CDIO_CD_FRAMES_PER_SEC; - lsn -= s * CDIO_CD_FRAMES_PER_SEC; - f = lsn + CDIO_PREGAP_SECTORS; - } else { - m = (lsn + CDIO_CD_MAX_LSN) / CDIO_CD_FRAMES_PER_MIN; - lsn -= m * (CDIO_CD_FRAMES_PER_MIN); - s = (lsn+CDIO_CD_MAX_LSN) / CDIO_CD_FRAMES_PER_SEC; - lsn -= s * CDIO_CD_FRAMES_PER_SEC; - f = lsn + CDIO_CD_MAX_LSN; - } - - if (m > 99) { - cdio_warn ("number of minutes (%d) truncated to 99.", m); - m = 99; - } - - msf->m = cdio_to_bcd8 (m); - msf->s = cdio_to_bcd8 (s); - msf->f = cdio_to_bcd8 (f); -} - -/*! - Convert an LBA into a string representation of the MSF. - \warning cdio_lba_to_msf_str returns new allocated string */ -char * -cdio_lba_to_msf_str (lba_t lba) -{ - - if (CDIO_INVALID_LBA == lba) { - return strdup("*INVALID"); - } else { - msf_t msf; - msf.m = msf.s = msf.f = 0; - cdio_lba_to_msf (lba, &msf); - return cdio_msf_to_str(&msf); - } -} - -/*! - Convert an LSN into the corresponding LBA. - CDIO_INVALID_LBA is returned if there is an error. -*/ -lba_t -cdio_lsn_to_lba (lsn_t lsn) -{ - if (CDIO_INVALID_LSN == lsn) return CDIO_INVALID_LBA; - return lsn + CDIO_PREGAP_SECTORS; -} - -/*! - Convert an LBA into the corresponding MSF. -*/ -void -cdio_lba_to_msf (lba_t lba, msf_t *msf) -{ - cdio_assert (msf != 0); - cdio_lsn_to_msf(cdio_lba_to_lsn(lba), msf); -} - -/*! - Convert a MSF into the corresponding LBA. - CDIO_INVALID_LBA is returned if there is an error. -*/ -lba_t -cdio_msf_to_lba (const msf_t *msf) -{ - uint32_t lba = 0; - - cdio_assert (msf != 0); - - lba = cdio_from_bcd8 (msf->m); - lba *= CDIO_CD_SECS_PER_MIN; - - lba += cdio_from_bcd8 (msf->s); - lba *= CDIO_CD_FRAMES_PER_SEC; - - lba += cdio_from_bcd8 (msf->f); - - return lba; -} - -/*! - Convert a MSF into the corresponding LSN. - CDIO_INVALID_LSN is returned if there is an error. -*/ -lba_t -cdio_msf_to_lsn (const msf_t *msf) -{ - return cdio_lba_to_lsn(cdio_msf_to_lba (msf)); -} - -/*! - Convert an LBA into a string representation of the MSF. - \warning cdio_lba_to_msf_str returns new allocated string */ -char * -cdio_msf_to_str (const msf_t *msf) -{ - char buf[16]; - - snprintf (buf, sizeof (buf), "%2.2x:%2.2x:%2.2x", msf->m, msf->s, msf->f); - return strdup (buf); -} - -/*! - Convert a MSF - broken out as 3 integer components into the - corresponding LBA. - CDIO_INVALID_LBA is returned if there is an error. -*/ -lba_t -cdio_msf3_to_lba (unsigned int minutes, unsigned int seconds, - unsigned int frames) -{ - return ((minutes * CDIO_CD_SECS_PER_MIN + seconds) * CDIO_CD_FRAMES_PER_SEC - + frames); -} - -/*! - Convert a string of the form MM:SS:FF into the corresponding LBA. - CDIO_INVALID_LBA is returned if there is an error. -*/ -lba_t -cdio_mmssff_to_lba (const char *psz_mmssff) -{ - int psz_field; - lba_t ret; - char c; - - if (0 == strcmp (psz_mmssff, "0")) - return 0; - - c = *psz_mmssff++; - if(c >= '0' && c <= '9') - psz_field = (c - '0'); - else - return CDIO_INVALID_LBA; - while(':' != (c = *psz_mmssff++)) { - if(c >= '0' && c <= '9') - psz_field = psz_field * 10 + (c - '0'); - else - return CDIO_INVALID_LBA; - } - - ret = cdio_msf3_to_lba (psz_field, 0, 0); - - c = *psz_mmssff++; - if(c >= '0' && c <= '9') - psz_field = (c - '0'); - else - return CDIO_INVALID_LBA; - if(':' != (c = *psz_mmssff++)) { - if(c >= '0' && c <= '9') { - psz_field = psz_field * 10 + (c - '0'); - c = *psz_mmssff++; - if(c != ':') - return CDIO_INVALID_LBA; - } - else - return CDIO_INVALID_LBA; - } - - if(psz_field >= CDIO_CD_SECS_PER_MIN) - return CDIO_INVALID_LBA; - - ret += cdio_msf3_to_lba (0, psz_field, 0); - - c = *psz_mmssff++; - if (isdigit(c)) - psz_field = (c - '0'); - else - return -1; - if('\0' != (c = *psz_mmssff++)) { - if (isdigit(c)) { - psz_field = psz_field * 10 + (c - '0'); - c = *psz_mmssff++; - } - else - return CDIO_INVALID_LBA; - } - - if('\0' != c) - return CDIO_INVALID_LBA; - - if(psz_field >= CDIO_CD_FRAMES_PER_SEC) - return CDIO_INVALID_LBA; - - ret += psz_field; - - return ret; -} - -bool -cdio_is_discmode_cdrom(discmode_t discmode) -{ - switch (discmode) { - case CDIO_DISC_MODE_CD_DA: - case CDIO_DISC_MODE_CD_DATA: - case CDIO_DISC_MODE_CD_XA: - case CDIO_DISC_MODE_CD_MIXED: - case CDIO_DISC_MODE_NO_INFO: - return true; - default: - return false; - } -} - -bool -cdio_is_discmode_dvd(discmode_t discmode) -{ - switch (discmode) { - case CDIO_DISC_MODE_DVD_ROM: - case CDIO_DISC_MODE_DVD_RAM: - case CDIO_DISC_MODE_DVD_R: - case CDIO_DISC_MODE_DVD_RW: - case CDIO_DISC_MODE_DVD_PR: - case CDIO_DISC_MODE_DVD_PRW: - return true; - default: - return false; - } -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/util.c b/src/input/vcd/libcdio/util.c deleted file mode 100644 index 9c646daf6..000000000 --- a/src/input/vcd/libcdio/util.c +++ /dev/null @@ -1,197 +0,0 @@ -/* - $Id: util.c,v 1.3 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2003 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <ctype.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#ifdef HAVE_INTTYPES_H -#include "inttypes.h" -#endif - -#include "cdio_assert.h" -#include <cdio/types.h> -#include <cdio/util.h> - -static const char _rcsid[] = "$Id: util.c,v 1.3 2005/01/01 02:43:57 rockyb Exp $"; - -size_t -_cdio_strlenv(char **str_array) -{ - size_t n = 0; - - cdio_assert (str_array != NULL); - - while(str_array[n]) - n++; - - return n; -} - -void -_cdio_strfreev(char **strv) -{ - int n; - - cdio_assert (strv != NULL); - - for(n = 0; strv[n]; n++) - free(strv[n]); - - free(strv); -} - -char * -_cdio_strjoin (char *strv[], unsigned count, const char delim[]) -{ - size_t len; - char *new_str; - unsigned n; - - cdio_assert (strv != NULL); - cdio_assert (delim != NULL); - - len = (count-1) * strlen (delim); - - for (n = 0;n < count;n++) - len += strlen (strv[n]); - - len++; - - new_str = _cdio_malloc (len); - new_str[0] = '\0'; - - for (n = 0;n < count;n++) - { - if (n) - strcat (new_str, delim); - strcat (new_str, strv[n]); - } - - return new_str; -} - -char ** -_cdio_strsplit(const char str[], char delim) /* fixme -- non-reentrant */ -{ - int n; - char **strv = NULL; - char *_str, *p; - char _delim[2] = { 0, 0 }; - - cdio_assert (str != NULL); - - _str = strdup(str); - _delim[0] = delim; - - cdio_assert (_str != NULL); - - n = 1; - p = _str; - while(*p) - if (*(p++) == delim) - n++; - - strv = _cdio_malloc (sizeof (char *) * (n+1)); - - n = 0; - while((p = strtok(n ? NULL : _str, _delim)) != NULL) - strv[n++] = strdup(p); - - free(_str); - - return strv; -} - -void * -_cdio_malloc (size_t size) -{ - void *new_mem = malloc (size); - - cdio_assert (new_mem != NULL); - - memset (new_mem, 0, size); - - return new_mem; -} - -void * -_cdio_memdup (const void *mem, size_t count) -{ - void *new_mem = NULL; - - if (mem) - { - new_mem = _cdio_malloc (count); - memcpy (new_mem, mem, count); - } - - return new_mem; -} - -char * -_cdio_strdup_upper (const char str[]) -{ - char *new_str = NULL; - - if (str) - { - char *p; - - p = new_str = strdup (str); - - while (*p) - { - *p = toupper (*p); - p++; - } - } - - return new_str; -} - -uint8_t -cdio_to_bcd8 (uint8_t n) -{ - /*cdio_assert (n < 100);*/ - - return ((n/10)<<4) | (n%10); -} - -uint8_t -cdio_from_bcd8(uint8_t p) -{ - return (0xf & p)+(10*(p >> 4)); -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libcdio/xa.c b/src/input/vcd/libcdio/xa.c deleted file mode 100644 index f811f7ebd..000000000 --- a/src/input/vcd/libcdio/xa.c +++ /dev/null @@ -1,136 +0,0 @@ -/* - $Id: xa.c,v 1.3 2005/01/01 02:43:57 rockyb Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2003 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#ifdef HAVE_STRING_H -#include <string.h> -#endif - -/* Public headers */ -#include <cdio/iso9660.h> -#include <cdio/util.h> -#include <cdio/bytesex.h> - -/* Private headers */ -#include "cdio_assert.h" - -#define BUF_COUNT 16 -#define BUF_SIZE 80 - -/* Return a pointer to a internal free buffer */ -static char * -_getbuf (void) -{ - static char _buf[BUF_COUNT][BUF_SIZE]; - static int _num = -1; - - _num++; - _num %= BUF_COUNT; - - memset (_buf[_num], 0, BUF_SIZE); - - return _buf[_num]; -} - -/*! - Returns a string which interpreting the extended attribute xa_attr. - For example: - \verbatim - d---1xrxrxr - ---2--r-r-r - -a--1xrxrxr - \endverbatim - - A description of the characters in the string follows - The 1st character is either "d" if the entry is a directory, or "-" if not. - The 2nd character is either "a" if the entry is CDDA (audio), or "-" if not. - The 3rd character is either "i" if the entry is interleaved, or "-" if not. - The 4th character is either "2" if the entry is mode2 form2 or "-" if not. - The 5th character is either "1" if the entry is mode2 form1 or "-" if not. - Note that an entry will either be in mode2 form1 or mode form2. That - is you will either see "2-" or "-1" in the 4th & 5th positions. - - The 6th and 7th characters refer to permissions for a user while the - the 8th and 9th characters refer to permissions for a group while, and - the 10th and 11th characters refer to permissions for a others. - - In each of these pairs the first character (6, 8, 10) is "x" if the - entry is executable. For a directory this means the directory is - allowed to be listed or "searched". - The second character of a pair (7, 9, 11) is "r" if the entry is allowed - to be read. -*/ - -const char * -iso9660_get_xa_attr_str (uint16_t xa_attr) -{ - char *result = _getbuf(); - - xa_attr = uint16_from_be (xa_attr); - - result[ 0] = (xa_attr & XA_ATTR_DIRECTORY) ? 'd' : '-'; - result[ 1] = (xa_attr & XA_ATTR_CDDA) ? 'a' : '-'; - result[ 2] = (xa_attr & XA_ATTR_INTERLEAVED) ? 'i' : '-'; - result[ 3] = (xa_attr & XA_ATTR_MODE2FORM2) ? '2' : '-'; - result[ 4] = (xa_attr & XA_ATTR_MODE2FORM1) ? '1' : '-'; - - result[ 5] = (xa_attr & XA_PERM_XUSR) ? 'x' : '-'; - result[ 6] = (xa_attr & XA_PERM_RUSR) ? 'r' : '-'; - - result[ 7] = (xa_attr & XA_PERM_XGRP) ? 'x' : '-'; - result[ 8] = (xa_attr & XA_PERM_RGRP) ? 'r' : '-'; - - /* Hack alert: wonder if this should be ROTH and XOTH? */ - result[ 9] = (xa_attr & XA_PERM_XSYS) ? 'x' : '-'; - result[10] = (xa_attr & XA_PERM_RSYS) ? 'r' : '-'; - - result[11] = '\0'; - - return result; -} - -iso9660_xa_t * -iso9660_xa_init (iso9660_xa_t *_xa, uint16_t uid, uint16_t gid, uint16_t attr, - uint8_t filenum) -{ - cdio_assert (_xa != NULL); - - _xa->user_id = uint16_to_be (uid); - _xa->group_id = uint16_to_be (gid); - _xa->attributes = uint16_to_be (attr); - - _xa->signature[0] = 'X'; - _xa->signature[1] = 'A'; - - _xa->filenum = filenum; - - _xa->reserved[0] - = _xa->reserved[1] - = _xa->reserved[2] - = _xa->reserved[3] - = _xa->reserved[4] = 0x00; - - return _xa; -} diff --git a/src/input/vcd/libvcd/Makefile.am b/src/input/vcd/libvcd/Makefile.am deleted file mode 100644 index c922685e3..000000000 --- a/src/input/vcd/libvcd/Makefile.am +++ /dev/null @@ -1,57 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -AM_CFLAGS = $(DEFAULT_OCFLAGS) $(VISIBILITY_FLAG) - -INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include -I$(top_srcdir)/lib -I$(top_builddir)/lib - -SUBDIRS = libvcd - -noinst_HEADERS = \ - vcd_assert.h \ - data_structures.h \ - info_private.h \ - pbc.h \ - stream_stdio.h \ - bitvec.h \ - dict.h \ - mpeg.h \ - salloc.h \ - util.h \ - bytesex_asm.h \ - directory.h \ - mpeg_stream.h \ - sector_private.h \ - vcd.h \ - bytesex.h \ - image_sink.h \ - obj.h \ - stream.h \ - vcd_read.h - -noinst_LTLIBRARIES = libvcd.la libvcdinfo.la -libvcd_la_SOURCES = \ - vcd.c \ - data_structures.c \ - directory.c \ - files.c \ - image.c \ - image_bincue.c \ - image_cdrdao.c \ - image_nrg.c \ - logging.c \ - mpeg.c \ - mpeg_stream.c \ - pbc.c \ - salloc.c \ - sector.c \ - stream.c \ - stream_stdio.c \ - util.c -libvcd_la_CFLAGS = $(AM_CFLAGS) $(LIBCDIO_CFLAGS) - -libvcdinfo_la_SOURCES = \ - info.c \ - inf.c \ - info_private.c \ - vcd_read.c -libvcdinfo_la_CFLAGS = $(AM_CFLAGS) $(LIBCDIO_CFLAGS) diff --git a/src/input/vcd/libvcd/bitvec.h b/src/input/vcd/libvcd/bitvec.h deleted file mode 100644 index f45059db0..000000000 --- a/src/input/vcd/libvcd/bitvec.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - $Id: bitvec.h,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifndef __VCD_BITVEC_H__ -#define __VCD_BITVEC_H__ - -#include <libvcd/types.h> - -#include "vcd_assert.h" - -static inline bool -_vcd_bit_set_p (const uint32_t n, const unsigned bit) -{ - return ((n >> bit) & 0x1) == 0x1; -} - -static inline int -vcd_bitvec_align (int value, const int boundary) -{ - if (value % boundary) - value += (boundary - (value % boundary)); - - return value; -} - -/* - * PEEK - */ - -#define vcd_bitvec_peek_bits16(bitvec, offset) \ - vcd_bitvec_peek_bits ((bitvec), (offset), 16) - -static inline uint32_t -vcd_bitvec_peek_bits (const uint8_t bitvec[], - const unsigned offset, - const unsigned bits) -{ - uint32_t result = 0; - unsigned i = offset; - - vcd_assert (bits > 0 && bits <= 32); - -#if 0 - j = 0; - while (j < bits) - if (i % 8 || (bits - j) < 8) - { - result <<= 1; - if (_vcd_bit_set_p (bitvec[i >> 3], 7 - (i % 8))) - result |= 0x1; - j++, i++; - } - else - { - result <<= 8; - result |= bitvec[i >> 3]; - j += 8, i += 8; - } -#else - if (!(offset % 8) && !(bits % 8)) /* optimization */ - for (i = offset; i < (offset + bits); i+= 8) - { - result <<= 8; - result |= bitvec[i >> 3]; - } - else /* general case */ - for (i = offset; i < (offset + bits); i++) - { - result <<= 1; - if (_vcd_bit_set_p (bitvec[i >> 3], 7 - (i % 8))) - result |= 0x1; - } -#endif - - return result; -} - -static inline uint32_t -vcd_bitvec_peek_bits32 (const uint8_t bitvec[], unsigned offset) -{ - if (offset % 8) - return vcd_bitvec_peek_bits (bitvec, offset, 32); - - offset >>= 3; - - return (bitvec[offset] << 24 - | bitvec[offset + 1] << 16 - | bitvec[offset + 2] << 8 - | bitvec[offset + 3]); -} - -/* - * READ - */ - -static inline uint32_t -vcd_bitvec_read_bits (const uint8_t bitvec[], unsigned *offset, const unsigned bits) -{ - const unsigned i = *offset; - - *offset += bits; - - return vcd_bitvec_peek_bits (bitvec, i, bits); -} - -static inline bool -vcd_bitvec_read_bit (const uint8_t bitvec[], unsigned *offset) -{ - const unsigned i = (*offset)++; - - return _vcd_bit_set_p (bitvec[i >> 3], 7 - (i % 8)); -} - -#endif /* __VCD_BITVEC_H__ */ diff --git a/src/input/vcd/libvcd/bytesex.h b/src/input/vcd/libvcd/bytesex.h deleted file mode 100644 index 9a212693d..000000000 --- a/src/input/vcd/libvcd/bytesex.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - $Id: bytesex.h,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifndef __VCD_BYTESEX_H__ -#define __VCD_BYTESEX_H__ - -#include <cdio/cdio.h> -#include <libvcd/types.h> -#include <libvcd/logging.h> - -/* Private includes */ -#include "bytesex_asm.h" - -/* generic byteswap routines */ - -#define UINT16_SWAP_LE_BE_C(val) ((uint16_t) ( \ - (((uint16_t) (val) & (uint16_t) 0x00ffU) << 8) | \ - (((uint16_t) (val) & (uint16_t) 0xff00U) >> 8))) - -#define UINT32_SWAP_LE_BE_C(val) ((uint32_t) ( \ - (((uint32_t) (val) & (uint32_t) 0x000000ffU) << 24) | \ - (((uint32_t) (val) & (uint32_t) 0x0000ff00U) << 8) | \ - (((uint32_t) (val) & (uint32_t) 0x00ff0000U) >> 8) | \ - (((uint32_t) (val) & (uint32_t) 0xff000000U) >> 24))) - -#define UINT64_SWAP_LE_BE_C(val) ((uint64_t) ( \ - (((uint64_t) (val) & (uint64_t) UINT64_C(0x00000000000000ff)) << 56) | \ - (((uint64_t) (val) & (uint64_t) UINT64_C(0x000000000000ff00)) << 40) | \ - (((uint64_t) (val) & (uint64_t) UINT64_C(0x0000000000ff0000)) << 24) | \ - (((uint64_t) (val) & (uint64_t) UINT64_C(0x00000000ff000000)) << 8) | \ - (((uint64_t) (val) & (uint64_t) UINT64_C(0x000000ff00000000)) >> 8) | \ - (((uint64_t) (val) & (uint64_t) UINT64_C(0x0000ff0000000000)) >> 24) | \ - (((uint64_t) (val) & (uint64_t) UINT64_C(0x00ff000000000000)) >> 40) | \ - (((uint64_t) (val) & (uint64_t) UINT64_C(0xff00000000000000)) >> 56))) - -#ifndef UINT16_SWAP_LE_BE -# define UINT16_SWAP_LE_BE UINT16_SWAP_LE_BE_C -#endif - -#ifndef UINT32_SWAP_LE_BE -# define UINT32_SWAP_LE_BE UINT32_SWAP_LE_BE_C -#endif - -#ifndef UINT64_SWAP_LE_BE -# define UINT64_SWAP_LE_BE UINT64_SWAP_LE_BE_C -#endif - -inline static -uint16_t uint16_swap_le_be (const uint16_t val) -{ - return UINT16_SWAP_LE_BE (val); -} - -inline static -uint32_t uint32_swap_le_be (const uint32_t val) -{ - return UINT32_SWAP_LE_BE (val); -} - -inline static -uint64_t uint64_swap_le_be (const uint64_t val) -{ - return UINT64_SWAP_LE_BE (val); -} - -# define UINT8_TO_BE(val) ((uint8_t) (val)) -# define UINT8_TO_LE(val) ((uint8_t) (val)) -#ifdef WORDS_BIGENDIAN -# define UINT16_TO_BE(val) ((uint16_t) (val)) -# define UINT16_TO_LE(val) ((uint16_t) UINT16_SWAP_LE_BE(val)) - -# define UINT32_TO_BE(val) ((uint32_t) (val)) -# define UINT32_TO_LE(val) ((uint32_t) UINT32_SWAP_LE_BE(val)) - -# define UINT64_TO_BE(val) ((uint64_t) (val)) -# define UINT64_TO_LE(val) ((uint64_t) UINT64_SWAP_LE_BE(val)) -#else -# define UINT16_TO_BE(val) ((uint16_t) UINT16_SWAP_LE_BE(val)) -# define UINT16_TO_LE(val) ((uint16_t) (val)) - -# define UINT32_TO_BE(val) ((uint32_t) UINT32_SWAP_LE_BE(val)) -# define UINT32_TO_LE(val) ((uint32_t) (val)) - -# define UINT64_TO_BE(val) ((uint64_t) UINT64_SWAP_LE_BE(val)) -# define UINT64_TO_LE(val) ((uint64_t) (val)) -#endif - -/* symmetric conversions */ -#define UINT8_FROM_BE(val) (UINT8_TO_BE (val)) -#define UINT8_FROM_LE(val) (UINT8_TO_LE (val)) -#define UINT16_FROM_BE(val) (UINT16_TO_BE (val)) -#define UINT16_FROM_LE(val) (UINT16_TO_LE (val)) -#define UINT32_FROM_BE(val) (UINT32_TO_BE (val)) -#define UINT32_FROM_LE(val) (UINT32_TO_LE (val)) -#define UINT64_FROM_BE(val) (UINT64_TO_BE (val)) -#define UINT64_FROM_LE(val) (UINT64_TO_LE (val)) - -/* converter function template */ -#define CVT_TO_FUNC(bits) \ - static inline uint ## bits ## _t \ - uint ## bits ## _to_be (uint ## bits ## _t val) \ - { return UINT ## bits ## _TO_BE (val); } \ - static inline uint ## bits ## _t \ - uint ## bits ## _to_le (uint ## bits ## _t val) \ - { return UINT ## bits ## _TO_LE (val); } \ - -CVT_TO_FUNC(8) -CVT_TO_FUNC(16) -CVT_TO_FUNC(32) -CVT_TO_FUNC(64) - -#undef CVT_TO_FUNC - -#define uint16_from_be(val) (uint16_to_be (val)) -#define uint16_from_le(val) (uint16_to_le (val)) -#define uint32_from_be(val) (uint32_to_be (val)) -#define uint32_from_le(val) (uint32_to_le (val)) - -#endif /* __VCD_BYTESEX_H__ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/bytesex_asm.h b/src/input/vcd/libvcd/bytesex_asm.h deleted file mode 100644 index 3265c592b..000000000 --- a/src/input/vcd/libvcd/bytesex_asm.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - $Id: bytesex_asm.h,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2001 Sven Ottemann <ac-logic@freenet.de> - 2001 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifndef __VCD_BYTESEX_ASM_H__ -#define __VCD_BYTESEX_ASM_H__ -#if !defined(DISABLE_ASM_OPTIMIZE) - -#include <libvcd/types.h> - -#if defined(__powerpc__) && defined(__GNUC__) - -inline static -uint32_t uint32_swap_le_be_asm(const uint32_t a) -{ - uint32_t b; - - __asm__ ("lwbrx %0,0,%1" - :"=r"(b) - :"r"(&a), "m"(a)); - - return b; -} - -inline static -uint16_t uint16_swap_le_be_asm(const uint16_t a) -{ - uint32_t b; - - __asm__ ("lhbrx %0,0,%1" - :"=r"(b) - :"r"(&a), "m"(a)); - - return b; -} - -#define UINT16_SWAP_LE_BE uint16_swap_le_be_asm -#define UINT32_SWAP_LE_BE uint32_swap_le_be_asm - -#elif defined(__mc68000__) && defined(__STORMGCC__) - -inline static -uint32_t uint32_swap_le_be_asm(uint32_t a __asm__("d0")) -{ - /* __asm__("rolw #8,%0; swap %0; rolw #8,%0" : "=d" (val) : "0" (val)); */ - - __asm__("move.l %1,d0;rol.w #8,d0;swap d0;rol.w #8,d0;move.l d0,%0" - :"=r"(a) - :"r"(a)); - - return(a); -} - -inline static -uint16_t uint16_swap_le_be_asm(uint16_t a __asm__("d0")) -{ - __asm__("move.l %1,d0;rol.w #8,d0;move.l d0,%0" - :"=r"(a) - :"r"(a)); - - return(a); -} - -#define UINT16_SWAP_LE_BE uint16_swap_le_be_asm -#define UINT32_SWAP_LE_BE uint32_swap_le_be_asm - -#elif 0 && defined(__i386__) && defined(__GNUC__) - -inline static -uint32_t uint32_swap_le_be_asm(uint32_t a) -{ - __asm__("xchgb %b0,%h0\n\t" /* swap lower bytes */ - "rorl $16,%0\n\t" /* swap words */ - "xchgb %b0,%h0" /* swap higher bytes */ - :"=q" (a) - : "0" (a)); - - return(a); -} - -inline static -uint16_t uint16_swap_le_be_asm(uint16_t a) -{ - __asm__("xchgb %b0,%h0" /* swap bytes */ - : "=q" (a) - : "0" (a)); - - return(a); -} - -#define UINT16_SWAP_LE_BE uint16_swap_le_be_asm -#define UINT32_SWAP_LE_BE uint32_swap_le_be_asm - -#endif - -#endif /* !defined(DISABLE_ASM_OPTIMIZE) */ -#endif /* __VCD_BYTESEX_ASM_H__ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/data_structures.c b/src/input/vcd/libvcd/data_structures.c deleted file mode 100644 index 1fdca95c9..000000000 --- a/src/input/vcd/libvcd/data_structures.c +++ /dev/null @@ -1,342 +0,0 @@ -/* - $Id: data_structures.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2004 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdlib.h> -#include <string.h> - -#include <cdio/cdio.h> - -/* Public headers */ -#include <libvcd/types.h> - -/* Private headers */ -#include "vcd_assert.h" -#include "data_structures.h" -#include "util.h" - -static const char _rcsid[] = "$Id: data_structures.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $"; - -struct _CdioList -{ - unsigned length; - - CdioListNode *begin; - CdioListNode *end; -}; - -struct _CdioListNode -{ - CdioList *list; - - CdioListNode *next; - - void *data; -}; - -/* impl */ - -static bool -_bubble_sort_iteration (CdioList *list, _cdio_list_cmp_func cmp_func) -{ - CdioListNode **pnode; - bool changed = false; - - for (pnode = &(list->begin); - (*pnode) != NULL && (*pnode)->next != NULL; - pnode = &((*pnode)->next)) - { - CdioListNode *node = *pnode; - - if (cmp_func (node->data, node->next->data) <= 0) - continue; /* n <= n->next */ - - /* exch n n->next */ - *pnode = node->next; - node->next = node->next->next; - (*pnode)->next = node; - - changed = true; - - if (node->next == NULL) - list->end = node; - } - - return changed; -} - -void _vcd_list_sort (CdioList *list, _cdio_list_cmp_func cmp_func) -{ - /* fixme -- this is bubble sort -- worst sorting algo... */ - - vcd_assert (list != NULL); - vcd_assert (cmp_func != 0); - - while (_bubble_sort_iteration (list, cmp_func)); -} - -/* node ops */ - -CdioListNode * -_vcd_list_at (CdioList *list, int idx) -{ - CdioListNode *node = _cdio_list_begin (list); - - if (idx < 0) - return _vcd_list_at (list, _cdio_list_length (list) + idx); - - vcd_assert (idx >= 0); - - while (node && idx) - { - node = _cdio_list_node_next (node); - idx--; - } - - return node; -} - -/* - * n-way tree based on list -- somewhat inefficent - */ - -struct _VcdTree -{ - VcdTreeNode *root; -}; - -struct _VcdTreeNode -{ - void *data; - - CdioListNode *listnode; - VcdTree *tree; - VcdTreeNode *parent; - CdioList *children; -}; - -VcdTree * -_vcd_tree_new (void *root_data) -{ - VcdTree *new_tree; - - new_tree = _vcd_malloc (sizeof (VcdTree)); - - new_tree->root = _vcd_malloc (sizeof (VcdTreeNode)); - - new_tree->root->data = root_data; - new_tree->root->tree = new_tree; - new_tree->root->parent = NULL; - new_tree->root->children = NULL; - new_tree->root->listnode = NULL; - - return new_tree; -} - -void -_vcd_tree_destroy (VcdTree *tree, bool free_data) -{ - _vcd_tree_node_destroy (tree->root, free_data); - - free (tree->root); - free (tree); -} - -void -_vcd_tree_node_destroy (VcdTreeNode *node, bool free_data) -{ - VcdTreeNode *child, *nxt_child; - - vcd_assert (node != NULL); - - child = _vcd_tree_node_first_child (node); - while(child) { - nxt_child = _vcd_tree_node_next_sibling (child); - _vcd_tree_node_destroy (child, free_data); - child = nxt_child; - } - - if (node->children) - { - vcd_assert (_cdio_list_length (node->children) == 0); - _cdio_list_free (node->children, true); - node->children = NULL; - } - - if (free_data) - free (_vcd_tree_node_set_data (node, NULL)); - - if (node->parent) - _cdio_list_node_free (node->listnode, true); - else - _vcd_tree_node_set_data (node, NULL); -} - -VcdTreeNode * -_vcd_tree_root (VcdTree *tree) -{ - return tree->root; -} - -void * -_vcd_tree_node_data (VcdTreeNode *node) -{ - return node->data; -} - -void * -_vcd_tree_node_set_data (VcdTreeNode *node, void *new_data) -{ - void *old_data = node->data; - - node->data = new_data; - - return old_data; -} - -VcdTreeNode * -_vcd_tree_node_append_child (VcdTreeNode *pnode, void *cdata) -{ - VcdTreeNode *nnode; - - vcd_assert (pnode != NULL); - - if (!pnode->children) - pnode->children = _cdio_list_new (); - - nnode = _vcd_malloc (sizeof (VcdTreeNode)); - - _cdio_list_append (pnode->children, nnode); - - nnode->data = cdata; - nnode->parent = pnode; - nnode->tree = pnode->tree; - nnode->listnode = _cdio_list_end (pnode->children); - - return nnode; -} - -VcdTreeNode * -_vcd_tree_node_first_child (VcdTreeNode *node) -{ - vcd_assert (node != NULL); - - if (!node->children) - return NULL; - - return _cdio_list_node_data (_cdio_list_begin (node->children)); -} - -VcdTreeNode * -_vcd_tree_node_next_sibling (VcdTreeNode *node) -{ - vcd_assert (node != NULL); - - return _cdio_list_node_data (_cdio_list_node_next (node->listnode)); -} - -void -_vcd_tree_node_sort_children (VcdTreeNode *node, _vcd_tree_node_cmp_func cmp_func) -{ - vcd_assert (node != NULL); - - if (node->children) - _vcd_list_sort (node->children, (_cdio_list_cmp_func) cmp_func); -} - -void -_vcd_tree_node_traverse (VcdTreeNode *node, - _vcd_tree_node_traversal_func trav_func, - void *user_data) /* pre-order */ -{ - VcdTreeNode *child; - - vcd_assert (node != NULL); - - trav_func (node, user_data); - - _VCD_CHILD_FOREACH (child, node) - { - _vcd_tree_node_traverse (child, trav_func, user_data); - } -} - -void -_vcd_tree_node_traverse_bf (VcdTreeNode *node, - _vcd_tree_node_traversal_func trav_func, - void *user_data) /* breath-first */ -{ - CdioList *queue; - - vcd_assert (node != NULL); - - queue = _cdio_list_new (); - - _cdio_list_prepend (queue, node); - - while (_cdio_list_length (queue)) - { - CdioListNode *lastnode = _cdio_list_end (queue); - VcdTreeNode *treenode = _cdio_list_node_data (lastnode); - VcdTreeNode *childnode; - - _cdio_list_node_free (lastnode, false); - - trav_func (treenode, user_data); - - _VCD_CHILD_FOREACH (childnode, treenode) - { - _cdio_list_prepend (queue, childnode); - } - } - - _cdio_list_free (queue, false); -} - -VcdTreeNode *_vcd_tree_node_parent (VcdTreeNode *node) -{ - return node->parent; -} - -VcdTreeNode *_vcd_tree_node_root (VcdTreeNode *node) -{ - return node->tree->root; -} - -bool _vcd_tree_node_is_root (VcdTreeNode *node) -{ - return (node->parent == NULL); -} - -/* eof */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ - diff --git a/src/input/vcd/libvcd/data_structures.h b/src/input/vcd/libvcd/data_structures.h deleted file mode 100644 index 70fe88045..000000000 --- a/src/input/vcd/libvcd/data_structures.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - $Id: data_structures.h,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifndef __VCD_DATA_STRUCTURES_H__ -#define __VCD_DATA_STRUCTURES_H__ - -#include <cdio/ds.h> -#include <libvcd/types.h> - -/* node ops */ - -CdioListNode *_vcd_list_at (CdioList *list, int idx); - -void _vcd_list_sort (CdioList *list, _cdio_list_cmp_func cmp_func); - -/* n-way tree */ - -typedef struct _VcdTree VcdTree; -typedef struct _VcdTreeNode VcdTreeNode; - -#define _VCD_CHILD_FOREACH(child, parent) \ - for (child = _vcd_tree_node_first_child (parent); child; child = _vcd_tree_node_next_sibling (child)) - -typedef int (*_vcd_tree_node_cmp_func) (VcdTreeNode *node1, - VcdTreeNode *node2); - -typedef void (*_vcd_tree_node_traversal_func) (VcdTreeNode *node, - void *user_data); - -VcdTree *_vcd_tree_new (void *root_data); - -void _vcd_tree_destroy (VcdTree *tree, bool free_data); - -VcdTreeNode *_vcd_tree_root (VcdTree *tree); - -void _vcd_tree_node_sort_children (VcdTreeNode *node, - _vcd_tree_node_cmp_func cmp_func); - -void *_vcd_tree_node_data (VcdTreeNode *node); - -void _vcd_tree_node_destroy (VcdTreeNode *node, bool free_data); - -void *_vcd_tree_node_set_data (VcdTreeNode *node, void *new_data); - -VcdTreeNode *_vcd_tree_node_append_child (VcdTreeNode *pnode, void *cdata); - -VcdTreeNode *_vcd_tree_node_first_child (VcdTreeNode *node); - -VcdTreeNode *_vcd_tree_node_next_sibling (VcdTreeNode *node); - -VcdTreeNode *_vcd_tree_node_parent (VcdTreeNode *node); - -VcdTreeNode *_vcd_tree_node_root (VcdTreeNode *node); - -bool _vcd_tree_node_is_root (VcdTreeNode *node); - -void _vcd_tree_node_traverse (VcdTreeNode *node, - _vcd_tree_node_traversal_func trav_func, - void *user_data); - -void -_vcd_tree_node_traverse_bf (VcdTreeNode *node, - _vcd_tree_node_traversal_func trav_func, - void *user_data); - -#endif /* __VCD_DATA_STRUCTURES_H__ */ - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ - diff --git a/src/input/vcd/libvcd/dict.h b/src/input/vcd/libvcd/dict.h deleted file mode 100644 index 229ad5706..000000000 --- a/src/input/vcd/libvcd/dict.h +++ /dev/null @@ -1,165 +0,0 @@ -/* - $Id: dict.h,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2000, 2004 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifndef __VCD_DICT_H__ -#define __VCD_DICT_H__ - -/* Public headers */ -#include <libvcd/types.h> - -/* Private headers */ -#include "vcd_assert.h" -#include "obj.h" -#include "util.h" - -struct _dict_t -{ - char *key; - uint32_t sector; - uint32_t length; - void *buf; - uint8_t flags; -}; - -static void -_dict_insert (VcdObj *obj, const char key[], uint32_t sector, uint32_t length, - uint8_t end_flags) -{ - struct _dict_t *_new_node; - - vcd_assert (key != NULL); - vcd_assert (length > 0); - - if ((sector =_vcd_salloc (obj->iso_bitmap, sector, length)) == SECTOR_NIL) - vcd_assert_not_reached (); - - _new_node = _vcd_malloc (sizeof (struct _dict_t)); - - _new_node->key = strdup (key); - _new_node->sector = sector; - _new_node->length = length; - _new_node->buf = _vcd_malloc (length * ISO_BLOCKSIZE); - _new_node->flags = end_flags; - - _cdio_list_prepend (obj->buffer_dict_list, _new_node); -} - -static -int _dict_key_cmp (struct _dict_t *a, char *b) -{ - vcd_assert (a != NULL); - vcd_assert (b != NULL); - - return !strcmp (a->key, b); -} - -static -int _dict_sector_cmp (struct _dict_t *a, uint32_t *b) -{ - vcd_assert (a != NULL); - vcd_assert (b != NULL); - - return (a->sector <= *b && (*b - a->sector) < a->length); -} - -static const struct _dict_t * -_dict_get_bykey (VcdObj *obj, const char key[]) -{ - CdioListNode *node; - - vcd_assert (obj != NULL); - vcd_assert (key != NULL); - - node = _cdio_list_find (obj->buffer_dict_list, - (_cdio_list_iterfunc) _dict_key_cmp, - (char *) key); - - if (node) - return _cdio_list_node_data (node); - - return NULL; -} - -static const struct _dict_t * -_dict_get_bysector (VcdObj *obj, uint32_t sector) -{ - CdioListNode *node; - - vcd_assert (obj != NULL); - vcd_assert (sector != SECTOR_NIL); - - node = _cdio_list_find (obj->buffer_dict_list, - (_cdio_list_iterfunc) _dict_sector_cmp, - §or); - - if (node) - return _cdio_list_node_data (node); - - return NULL; -} - -static uint8_t -_dict_get_sector_flags (VcdObj *obj, uint32_t sector) -{ - const struct _dict_t *p; - - vcd_assert (sector != SECTOR_NIL); - - p = _dict_get_bysector (obj, sector); - - if (p) - return (((sector - p->sector)+1 == p->length) - ? p->flags : 0); - - return 0; -} - -static void * -_dict_get_sector (VcdObj *obj, uint32_t sector) -{ - const struct _dict_t *p; - - vcd_assert (sector != SECTOR_NIL); - - p = _dict_get_bysector (obj, sector); - - if (p) - return ((char *)p->buf) + ((sector - p->sector) * ISO_BLOCKSIZE); - - return NULL; -} - -static void -_dict_clean (VcdObj *obj) -{ - CdioListNode *node; - - while ((node = _cdio_list_begin (obj->buffer_dict_list))) - { - struct _dict_t *p = _cdio_list_node_data (node); - - free (p->key); - free (p->buf); - - _cdio_list_node_free (node, true); - } -} - -#endif /* __VCD_DICT_H__ */ diff --git a/src/input/vcd/libvcd/directory.c b/src/input/vcd/libvcd/directory.c deleted file mode 100644 index 992d728c6..000000000 --- a/src/input/vcd/libvcd/directory.c +++ /dev/null @@ -1,507 +0,0 @@ -/* - $Id: directory.c,v 1.4 2006/09/26 19:26:57 dgp85 Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdlib.h> -#include <string.h> - -/* Public headers */ -#include <cdio/bytesex.h> -#include <cdio/iso9660.h> -#include <libvcd/logging.h> - -/* Private headers */ -#include "vcd_assert.h" -#include "directory.h" -#include "util.h" - -static const char _rcsid[] = "$Id: directory.c,v 1.4 2006/09/26 19:26:57 dgp85 Exp $"; - -/* CD-ROM XA */ - -/* tree data structure */ - -typedef struct -{ - bool is_dir; - char *name; - uint16_t version; - uint16_t xa_attributes; - uint8_t xa_filenum; - uint32_t extent; - uint32_t size; - unsigned pt_id; -} data_t; - -typedef VcdTreeNode VcdDirNode; - -#define EXTENT(anode) (DATAP(anode)->extent) -#define SIZE(anode) (DATAP(anode)->size) -#define PT_ID(anode) (DATAP(anode)->pt_id) - -#define DATAP(anode) ((data_t*) _vcd_tree_node_data (anode)) - -/* important date to celebrate (for me at least =) - -- until user customization is implemented... */ -static const time_t _vcd_time = 269222400L; - -/* implementation */ - -static void -traverse_get_dirsizes(VcdDirNode *node, void *data) -{ - data_t *d = DATAP(node); - unsigned *sum = data; - - if (d->is_dir) - { - vcd_assert (d->size % ISO_BLOCKSIZE == 0); - - *sum += (d->size / ISO_BLOCKSIZE); - } -} - -static unsigned -get_dirsizes (VcdDirNode* dirnode) -{ - unsigned result = 0; - - _vcd_tree_node_traverse (dirnode, traverse_get_dirsizes, &result); - - return result; -} - -static void -traverse_update_dirextents (VcdDirNode *dirnode, void *data) -{ - data_t *d = DATAP(dirnode); - - if (d->is_dir) - { - VcdDirNode* child; - unsigned dirextent = d->extent; - - vcd_assert (d->size % ISO_BLOCKSIZE == 0); - - dirextent += d->size / ISO_BLOCKSIZE; - - _VCD_CHILD_FOREACH (child, dirnode) - { - data_t *d = DATAP(child); - - vcd_assert (d != NULL); - - if (d->is_dir) - { - d->extent = dirextent; - dirextent += get_dirsizes (child); - } - } - } -} - -static void -update_dirextents (VcdDirectory *dir, uint32_t extent) -{ - data_t *dirdata = DATAP(_vcd_tree_root (dir)); - - dirdata->extent = extent; - _vcd_tree_node_traverse (_vcd_tree_root (dir), - traverse_update_dirextents, NULL); -} - -static void -traverse_update_sizes(VcdDirNode *node, void *data) -{ - data_t *dirdata = DATAP(node); - - if (dirdata->is_dir) - { - VcdDirNode* child; - unsigned offset = 0; - - offset += iso9660_dir_calc_record_size (1, sizeof(iso9660_xa_t)); /* '.' */ - offset += iso9660_dir_calc_record_size (1, sizeof(iso9660_xa_t)); /* '..' */ - - _VCD_CHILD_FOREACH (child, node) - { - data_t *d = DATAP(child); - unsigned reclen; - char *pathname = (d->is_dir - ? strdup (d->name) - : iso9660_pathname_isofy (d->name, d->version)); - - vcd_assert (d != NULL); - - reclen = iso9660_dir_calc_record_size (strlen (pathname), - sizeof (iso9660_xa_t)); - - free (pathname); - - offset = _vcd_ofs_add (offset, reclen, ISO_BLOCKSIZE); - } - - vcd_assert (offset > 0); - - dirdata->size = _vcd_ceil2block (offset, ISO_BLOCKSIZE); - } -} - -static void -update_sizes (VcdDirectory *dir) -{ - _vcd_tree_node_traverse (_vcd_tree_root(dir), traverse_update_sizes, NULL); -} - - -/* exported stuff: */ - -VcdDirectory * -_vcd_directory_new (void) -{ - data_t *data; - VcdDirectory *dir = NULL; - - vcd_assert (sizeof(iso9660_xa_t) == 14); - - data = _vcd_malloc (sizeof (data_t)); - dir = _vcd_tree_new (data); - - data->is_dir = true; - data->name = _vcd_memdup("\0", 2); - data->xa_attributes = XA_FORM1_DIR; - data->xa_filenum = 0x00; - - return dir; -} - -static void -traverse_vcd_directory_done (VcdDirNode *node, void *data) -{ - data_t *dirdata = DATAP (node); - - free (dirdata->name); -} - -void -_vcd_directory_destroy (VcdDirectory *dir) -{ - vcd_assert (dir != NULL); - - _vcd_tree_node_traverse (_vcd_tree_root (dir), - traverse_vcd_directory_done, NULL); - - _vcd_tree_destroy (dir, true); -} - -static VcdDirNode* -lookup_child (VcdDirNode* node, const char name[]) -{ - VcdDirNode* child; - - _VCD_CHILD_FOREACH (child, node) - { - data_t *d = DATAP(child); - - if (!strcmp (d->name, name)) - return child; - } - - return child; /* NULL */ -} - -static int -_iso_dir_cmp (VcdDirNode *node1, VcdDirNode *node2) -{ - data_t *d1 = DATAP(node1); - data_t *d2 = DATAP(node2); - int result = 0; - - result = strcmp (d1->name, d2->name); - - return result; -} - -int -_vcd_directory_mkdir (VcdDirectory *dir, const char pathname[]) -{ - char **splitpath; - unsigned level, n; - VcdDirNode* pdir = _vcd_tree_root (dir); - - vcd_assert (dir != NULL); - vcd_assert (pathname != NULL); - - splitpath = _vcd_strsplit (pathname, '/'); - - level = _vcd_strlenv (splitpath); - - for (n = 0; n < level-1; n++) - if (!(pdir = lookup_child(pdir, splitpath[n]))) - { - vcd_error("mkdir: parent dir `%s' (level=%d) for `%s' missing!", - splitpath[n], n, pathname); - vcd_assert_not_reached (); - } - - if (lookup_child (pdir, splitpath[level-1])) - { - vcd_error ("mkdir: `%s' already exists", pathname); - vcd_assert_not_reached (); - } - - { - data_t *data = _vcd_malloc (sizeof (data_t)); - - _vcd_tree_node_append_child (pdir, data); - - data->is_dir = true; - data->name = strdup(splitpath[level-1]); - data->xa_attributes = XA_FORM1_DIR; - data->xa_filenum = 0x00; - /* .. */ - } - - _vcd_tree_node_sort_children (pdir, _iso_dir_cmp); - - _vcd_strfreev (splitpath); - - return 0; -} - -int -_vcd_directory_mkfile (VcdDirectory *dir, const char pathname[], - uint32_t start, uint32_t size, - bool form2_flag, uint8_t filenum) -{ - char **splitpath; - unsigned level, n; - const int file_version = 1; - - VcdDirNode* pdir = NULL; - - vcd_assert (dir != NULL); - vcd_assert (pathname != NULL); - - splitpath = _vcd_strsplit (pathname, '/'); - - level = _vcd_strlenv (splitpath); - - while (!pdir) - { - pdir = _vcd_tree_root (dir); - - for (n = 0; n < level-1; n++) - if (!(pdir = lookup_child (pdir, splitpath[n]))) - { - char *newdir = _vcd_strjoin (splitpath, n+1, "/"); - - vcd_info ("autocreating directory `%s' for file `%s'", - newdir, pathname); - - _vcd_directory_mkdir (dir, newdir); - - free (newdir); - - vcd_assert (pdir == NULL); - - break; - } - else if (!DATAP(pdir)->is_dir) - { - char *newdir = _vcd_strjoin (splitpath, n+1, "/"); - - vcd_error ("mkfile: `%s' not a directory", newdir); - - free (newdir); - - return -1; - } - - } - - if (lookup_child (pdir, splitpath[level-1])) - { - vcd_error ("mkfile: `%s' already exists", pathname); - _vcd_strfreev(splitpath); - return -1; - } - - { - data_t *data = _vcd_malloc (sizeof (data_t)); - - _vcd_tree_node_append_child (pdir, data); - - data->is_dir = false; - data->name = strdup (splitpath[level-1]); - data->version = file_version; - data->xa_attributes = form2_flag ? XA_FORM2_FILE : XA_FORM1_FILE; - data->xa_filenum = filenum; - data->size = size; - data->extent = start; - /* .. */ - } - - _vcd_tree_node_sort_children (pdir, _iso_dir_cmp); - - _vcd_strfreev (splitpath); - - return 0; -} - -uint32_t -_vcd_directory_get_size (VcdDirectory *dir) -{ - vcd_assert (dir != NULL); - - update_sizes (dir); - return get_dirsizes (_vcd_tree_root (dir)); -} - -static void -traverse_vcd_directory_dump_entries (VcdDirNode *node, void *data) -{ - data_t *d = DATAP(node); - iso9660_xa_t xa_su; - - uint32_t root_extent = EXTENT(_vcd_tree_node_root (node)); - - uint32_t parent_extent = - (!_vcd_tree_node_is_root (node)) - ? EXTENT(_vcd_tree_node_parent (node)) - : EXTENT(node); - - uint32_t parent_size = - (!_vcd_tree_node_is_root (node)) - ? SIZE(_vcd_tree_node_parent (node)) - : SIZE(node); - - void *dirbufp = (char*) data + ISO_BLOCKSIZE * (parent_extent - root_extent); - - iso9660_xa_init (&xa_su, 0, 0, d->xa_attributes, d->xa_filenum); - - if (!_vcd_tree_node_is_root (node)) - { - char *pathname = (d->is_dir - ? strdup (d->name) - : iso9660_pathname_isofy (d->name, d->version)); - - iso9660_dir_add_entry_su (dirbufp, pathname, d->extent, d->size, - d->is_dir ? ISO_DIRECTORY : ISO_FILE, - &xa_su, sizeof (xa_su), - &_vcd_time); - - free (pathname); - } - - /* if this is a directory, create the new directory node */ - if (d->is_dir) - { - dirbufp = (char*)data + ISO_BLOCKSIZE * (d->extent - root_extent); - - iso9660_dir_init_new_su (dirbufp, - d->extent, d->size, &xa_su, sizeof (xa_su), - parent_extent, parent_size, &xa_su, - sizeof (xa_su), &_vcd_time); - } -} - -void -_vcd_directory_dump_entries (VcdDirectory *dir, void *buf, uint32_t extent) -{ - vcd_assert (dir != NULL); - - update_sizes (dir); /* better call it one time more than one less */ - update_dirextents (dir, extent); - - _vcd_tree_node_traverse (_vcd_tree_root (dir), - traverse_vcd_directory_dump_entries, buf); -} - -typedef struct -{ - void *ptl; - void *ptm; -} _vcd_directory_dump_pathtables_t; - -static void -_dump_pathtables_helper (_vcd_directory_dump_pathtables_t *args, - data_t *d, uint16_t parent_id) -{ - uint16_t id_l, id_m; - - vcd_assert (args != NULL); - vcd_assert (d != NULL); - - vcd_assert (d->is_dir); - - id_l = iso9660_pathtable_l_add_entry (args->ptl, d->name, d->extent, - parent_id); - - id_m = iso9660_pathtable_m_add_entry (args->ptm, d->name, d->extent, - parent_id); - - vcd_assert (id_l == id_m); - - d->pt_id = id_m; -} - -static void -traverse_vcd_directory_dump_pathtables (VcdDirNode *node, void *data) -{ - _vcd_directory_dump_pathtables_t *args = data; - - if (DATAP (node)->is_dir) - { - VcdDirNode* parent = _vcd_tree_node_parent (node); - uint16_t parent_id = parent ? PT_ID (parent) : 1; - - _dump_pathtables_helper (args, DATAP (node), parent_id); - } -} - -void -_vcd_directory_dump_pathtables (VcdDirectory *dir, void *ptl, void *ptm) -{ - _vcd_directory_dump_pathtables_t args; - - vcd_assert (dir != NULL); - - iso9660_pathtable_init (ptl); - iso9660_pathtable_init (ptm); - - args.ptl = ptl; - args.ptm = ptm; - - _vcd_tree_node_traverse_bf (_vcd_tree_root (dir), - traverse_vcd_directory_dump_pathtables, &args); -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/directory.h b/src/input/vcd/libvcd/directory.h deleted file mode 100644 index c4cba9efc..000000000 --- a/src/input/vcd/libvcd/directory.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - $Id: directory.h,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifndef _DIRECTORY_H_ -#define _DIRECTORY_H_ - -#include <libvcd/types.h> - -/* Private headers */ -#include "data_structures.h" - -/* opaque data structure representing the ISO directory tree */ -typedef VcdTree VcdDirectory; - -VcdDirectory * -_vcd_directory_new (void); - -void -_vcd_directory_destroy (VcdDirectory *dir); - -int -_vcd_directory_mkdir (VcdDirectory *dir, const char pathname[]); - -int -_vcd_directory_mkfile (VcdDirectory *dir, const char pathname[], - uint32_t start, uint32_t size, - bool form2_flag, uint8_t filenum); - -uint32_t -_vcd_directory_get_size (VcdDirectory *dir); - -void -_vcd_directory_dump_entries (VcdDirectory *dir, void *buf, uint32_t extent); - -void -_vcd_directory_dump_pathtables (VcdDirectory *dir, void *ptl, void *ptm); - -#endif /* _DIRECTORY_H_ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/files.c b/src/input/vcd/libvcd/files.c deleted file mode 100644 index 38780edf0..000000000 --- a/src/input/vcd/libvcd/files.c +++ /dev/null @@ -1,1020 +0,0 @@ -/* - $Id: files.c,v 1.4 2006/09/26 21:18:18 dgp85 Exp $ - - Copyright (C) 2000, 2004 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <string.h> -#include <stdlib.h> -#include <stddef.h> -#include <math.h> - -#include <cdio/cdio.h> -#include <cdio/bytesex.h> -#include <cdio/util.h> - -/* Public headers */ -#include <libvcd/files.h> -#include <libvcd/types.h> -#include <libvcd/logging.h> - -/* FIXME! Make this local */ -#include <libvcd/files_private.h> - -/* Private headers */ -#include "vcd_assert.h" -#include "mpeg_stream.h" -#include "obj.h" -#include "pbc.h" -#include "util.h" - -static const char _rcsid[] = "$Id: files.c,v 1.4 2006/09/26 21:18:18 dgp85 Exp $"; - -inline static bool -_pal_p (const struct vcd_mpeg_stream_vid_info *_info) -{ - return (_info->vsize == 288 || _info->vsize == 576); -} - -static int -_derive_vid_type (const struct vcd_mpeg_stream_info *_info, bool svcd) -{ - if (_info->shdr[0].seen) - return _pal_p (&_info->shdr[0]) ? 0x7 : 0x3; - - if (_info->shdr[2].seen) - { - if (svcd) - vcd_warn ("stream with 0xE2 still stream id not allowed for IEC62107 compliant SVCDs"); - return _pal_p (&_info->shdr[2]) ? 0x6 : 0x2; - } - - if (_info->shdr[1].seen) - return _pal_p (&_info->shdr[1]) ? 0x5 : 0x1; - - return 0; -} - -static int -_derive_ogt_type (const struct vcd_mpeg_stream_info *_info, bool svcd) -{ - - if (!svcd) - return 0; - - if ((_info->ogt[3] || _info->ogt[2]) - && _info->ogt[1] && _info->ogt[0]) - return 0x3; - - if (_info->ogt[1] && _info->ogt[0]) - return 0x2; - - if (_info->ogt[0]) - return 0x1; - - vcd_debug ("OGT streams available: %d %d %d %d", - _info->ogt[0], _info->ogt[1], - _info->ogt[2], _info->ogt[3]); - - return 0x0; -} - -static int -_derive_aud_type (const struct vcd_mpeg_stream_info *_info, bool svcd) -{ - if (!_info->ahdr[0].seen) - return 0; /* no MPEG audio */ - - if (svcd) - { - if (_info->ahdr[2].seen) - return 3; /* MC */ - - if (_info->ahdr[1].seen) - return 2; /* 2 streams */ - - return 1; /* just one stream */ - } - else - switch (_info->ahdr[0].mode) - { - case MPEG_SINGLE_CHANNEL: - return 1; - break; - - case MPEG_STEREO: - case MPEG_JOINT_STEREO: - return 2; - break; - - case MPEG_DUAL_CHANNEL: - return 3; - break; - } - - return 0; -} - -void -set_entries_vcd (VcdObj *obj, void *buf) -{ - CdioListNode *node = NULL; - int idx = 0; - int track_idx = 0; - EntriesVcd_t entries_vcd; - - vcd_assert (sizeof(EntriesVcd_t) == 2048); - - vcd_assert (_cdio_list_length (obj->mpeg_track_list) <= MAX_ENTRIES); - vcd_assert (_cdio_list_length (obj->mpeg_track_list) > 0); - - memset(&entries_vcd, 0, sizeof(entries_vcd)); /* paranoia / fixme */ - - switch (obj->type) - { - case VCD_TYPE_VCD: - strncpy(entries_vcd.ID, ENTRIES_ID_VCD, 8); - entries_vcd.version = ENTRIES_VERSION_VCD; - entries_vcd.sys_prof_tag = ENTRIES_SPTAG_VCD; - break; - - case VCD_TYPE_VCD11: - strncpy(entries_vcd.ID, ENTRIES_ID_VCD, 8); - entries_vcd.version = ENTRIES_VERSION_VCD11; - entries_vcd.sys_prof_tag = ENTRIES_SPTAG_VCD11; - break; - - case VCD_TYPE_VCD2: - strncpy(entries_vcd.ID, ENTRIES_ID_VCD, 8); - entries_vcd.version = ENTRIES_VERSION_VCD2; - entries_vcd.sys_prof_tag = ENTRIES_SPTAG_VCD2; - break; - - case VCD_TYPE_SVCD: - if (!obj->svcd_vcd3_entrysvd) - strncpy(entries_vcd.ID, ENTRIES_ID_SVCD, 8); - else - { - vcd_warn ("setting ENTRYSVD signature for *DEPRECATED* VCD 3.0 type SVCD"); - strncpy(entries_vcd.ID, ENTRIES_ID_VCD3, 8); - } - entries_vcd.version = ENTRIES_VERSION_SVCD; - entries_vcd.sys_prof_tag = ENTRIES_SPTAG_SVCD; - break; - - case VCD_TYPE_HQVCD: - strncpy(entries_vcd.ID, ENTRIES_ID_SVCD, 8); - entries_vcd.version = ENTRIES_VERSION_HQVCD; - entries_vcd.sys_prof_tag = ENTRIES_SPTAG_HQVCD; - break; - - default: - vcd_assert_not_reached (); - break; - } - - idx = 0; - track_idx = 2; - _CDIO_LIST_FOREACH (node, obj->mpeg_sequence_list) - { - mpeg_sequence_t *track = _cdio_list_node_data (node); - uint32_t lsect = track->relative_start_extent; - CdioListNode *node2; - - lsect += obj->iso_size; - - entries_vcd.entry[idx].n = cdio_to_bcd8(track_idx); - cdio_lba_to_msf(cdio_lsn_to_lba(lsect), - &(entries_vcd.entry[idx].msf)); - - idx++; - lsect += obj->track_front_margin; - - _CDIO_LIST_FOREACH (node2, track->entry_list) - { - entry_t *_entry = _cdio_list_node_data (node2); - /* additional entries */ - - vcd_assert (idx < MAX_ENTRIES); - - entries_vcd.entry[idx].n = cdio_to_bcd8(track_idx); - cdio_lba_to_msf(lsect + cdio_lsn_to_lba(_entry->aps.packet_no), - &(entries_vcd.entry[idx].msf)); - - idx++; - } - - track_idx++; - } - - entries_vcd.entry_count = uint16_to_be (idx); - - memcpy(buf, &entries_vcd, sizeof(entries_vcd)); -} - -static void -_set_bit (uint8_t bitset[], unsigned bitnum) -{ - unsigned _byte = bitnum / 8; - unsigned _bit = bitnum % 8; - - bitset[_byte] |= (1 << _bit); -} - -uint32_t -get_psd_size (VcdObj *obj, bool extended) -{ - if (extended) - vcd_assert (_vcd_obj_has_cap_p (obj, _CAP_PBC_X)); - - if (!_vcd_pbc_available (obj)) - return 0; - - if (extended) - return obj->psdx_size; - - return obj->psd_size; -} - -void -set_psd_vcd (VcdObj *obj, void *buf, bool extended) -{ - CdioListNode *node; - - if (extended) - vcd_assert (_vcd_obj_has_cap_p (obj, _CAP_PBC_X)); - - vcd_assert (_vcd_pbc_available (obj)); - - _CDIO_LIST_FOREACH (node, obj->pbc_list) - { - pbc_t *_pbc = _cdio_list_node_data (node); - char *_buf = buf; - unsigned offset = (extended ? _pbc->offset_ext : _pbc->offset); - - vcd_assert (offset % INFO_OFFSET_MULT == 0); - - _vcd_pbc_node_write (obj, _pbc, _buf + offset, extended); - } -} - -void -set_lot_vcd(VcdObj *obj, void *buf, bool extended) -{ - LotVcd_t *lot_vcd = NULL; - CdioListNode *node; - - if (extended) - vcd_assert (_vcd_obj_has_cap_p (obj, _CAP_PBC_X)); - - vcd_assert (_vcd_pbc_available (obj)); - - lot_vcd = _vcd_malloc (sizeof (LotVcd_t)); - memset(lot_vcd, 0xff, sizeof(LotVcd_t)); - - lot_vcd->reserved = 0x0000; - - _CDIO_LIST_FOREACH (node, obj->pbc_list) - { - pbc_t *_pbc = _cdio_list_node_data (node); - unsigned int offset = extended ? _pbc->offset_ext : _pbc->offset; - - vcd_assert (offset % INFO_OFFSET_MULT == 0); - - if (_pbc->rejected) - continue; - - offset /= INFO_OFFSET_MULT; - - lot_vcd->offset[_pbc->lid - 1] = uint16_to_be (offset); - } - - memcpy(buf, lot_vcd, sizeof(LotVcd_t)); - free(lot_vcd); -} - -void -set_info_vcd(VcdObj *obj, void *buf) -{ - InfoVcd_t info_vcd; - CdioListNode *node = NULL; - int n = 0; - - vcd_assert (sizeof (InfoVcd_t) == 2048); - vcd_assert (_cdio_list_length (obj->mpeg_track_list) <= 98); - - memset (&info_vcd, 0, sizeof (info_vcd)); - - switch (obj->type) - { - case VCD_TYPE_VCD: - strncpy (info_vcd.ID, INFO_ID_VCD, sizeof (info_vcd.ID)); - info_vcd.version = INFO_VERSION_VCD; - info_vcd.sys_prof_tag = INFO_SPTAG_VCD; - break; - - case VCD_TYPE_VCD11: - strncpy (info_vcd.ID, INFO_ID_VCD, sizeof (info_vcd.ID)); - info_vcd.version = INFO_VERSION_VCD11; - info_vcd.sys_prof_tag = INFO_SPTAG_VCD11; - break; - - case VCD_TYPE_VCD2: - strncpy (info_vcd.ID, INFO_ID_VCD, sizeof (info_vcd.ID)); - info_vcd.version = INFO_VERSION_VCD2; - info_vcd.sys_prof_tag = INFO_SPTAG_VCD2; - break; - - case VCD_TYPE_SVCD: - strncpy (info_vcd.ID, INFO_ID_SVCD, sizeof (info_vcd.ID)); - info_vcd.version = INFO_VERSION_SVCD; - info_vcd.sys_prof_tag = INFO_SPTAG_SVCD; - break; - - case VCD_TYPE_HQVCD: - strncpy (info_vcd.ID, INFO_ID_HQVCD, sizeof (info_vcd.ID)); - info_vcd.version = INFO_VERSION_HQVCD; - info_vcd.sys_prof_tag = INFO_SPTAG_HQVCD; - break; - - default: - vcd_assert_not_reached (); - break; - } - - iso9660_strncpy_pad (info_vcd.album_desc, - obj->info_album_id, - sizeof(info_vcd.album_desc), ISO9660_DCHARS); - /* fixme, maybe it's VCD_ACHARS? */ - - info_vcd.vol_count = uint16_to_be (obj->info_volume_count); - info_vcd.vol_id = uint16_to_be (obj->info_volume_number); - - if (_vcd_obj_has_cap_p (obj, _CAP_PAL_BITS)) - { - /* NTSC/PAL bitset */ - - n = 0; - _CDIO_LIST_FOREACH (node, obj->mpeg_track_list) - { - mpeg_track_t *track = _cdio_list_node_data (node); - - const struct vcd_mpeg_stream_vid_info *_info = &track->info->shdr[0]; - - if (vcd_mpeg_get_norm (_info) == MPEG_NORM_PAL - || vcd_mpeg_get_norm (_info) == MPEG_NORM_PAL_S) - _set_bit(info_vcd.pal_flags, n); - else if (_pal_p (_info)) - { - vcd_warn ("INFO.{VCD,SVD}: assuming PAL-type resolution for track #%d" - " -- are we creating a X(S)VCD?", n); - _set_bit(info_vcd.pal_flags, n); - } - - n++; - } - } - - if (_vcd_obj_has_cap_p (obj, _CAP_PBC)) - { - info_vcd.flags.restriction = obj->info_restriction; - info_vcd.flags.use_lid2 = obj->info_use_lid2; - info_vcd.flags.use_track3 = obj->info_use_seq2; - - if (_vcd_obj_has_cap_p (obj, _CAP_PBC_X) - &&_vcd_pbc_available (obj)) - info_vcd.flags.pbc_x = true; - - info_vcd.psd_size = uint32_to_be (get_psd_size (obj, false)); - info_vcd.offset_mult = _vcd_pbc_available (obj) ? INFO_OFFSET_MULT : 0; - info_vcd.lot_entries = uint16_to_be (_vcd_pbc_max_lid (obj)); - - if (_cdio_list_length (obj->mpeg_segment_list)) - { - unsigned segments = 0; - - if (!_vcd_pbc_available (obj)) - vcd_warn ("segment items available, but no PBC items set!" - " SPIs will be unreachable"); - - _CDIO_LIST_FOREACH (node, obj->mpeg_segment_list) - { - mpeg_segment_t *segment = _cdio_list_node_data (node); - unsigned idx; - InfoSpiContents contents = { 0, }; - - contents.video_type = - _derive_vid_type (segment->info, - _vcd_obj_has_cap_p (obj, _CAP_4C_SVCD)); - - contents.audio_type = - _derive_aud_type (segment->info, - _vcd_obj_has_cap_p (obj, _CAP_4C_SVCD)); - - contents.ogt = - _derive_ogt_type (segment->info, - _vcd_obj_has_cap_p (obj, _CAP_4C_SVCD)); - - if (!contents.video_type && !contents.audio_type) - vcd_warn ("segment item '%s' seems contains neither video nor audio", - segment->id); - - for (idx = 0; idx < segment->segment_count; idx++) - { - vcd_assert (segments + idx < MAX_SEGMENTS); - - info_vcd.spi_contents[segments + idx] = contents; - - if (!contents.item_cont) - contents.item_cont = true; - } - - segments += idx; - } - - info_vcd.item_count = uint16_to_be (segments); - - cdio_lba_to_msf (cdio_lsn_to_lba(obj->mpeg_segment_start_extent), - &info_vcd.first_seg_addr); - } - } - - memcpy(buf, &info_vcd, sizeof(info_vcd)); -} - -static void -set_tracks_svd_v30 (VcdObj *obj, void *buf) -{ - char tracks_svd_buf[ISO_BLOCKSIZE] = { 0, }; - TracksSVD_v30 *tracks_svd = (void *) tracks_svd_buf; - CdioListNode *node; - double playtime; - int n; - - strncpy (tracks_svd->file_id, TRACKS_SVD_FILE_ID, - sizeof (TRACKS_SVD_FILE_ID)-1); - tracks_svd->version = TRACKS_SVD_VERSION; - tracks_svd->tracks = _cdio_list_length (obj->mpeg_track_list); - - n = 0; - playtime = 0; - _CDIO_LIST_FOREACH (node, obj->mpeg_track_list) - { - mpeg_track_t *track = _cdio_list_node_data (node); - int i; - - playtime += track->info->playing_time; - - tracks_svd->track[n].audio_info = track->info->ahdr[0].seen ? 0x2 : 0x0; /* fixme */ - tracks_svd->track[n].audio_info |= track->info->ahdr[1].seen ? 0x20 : 0x0; /* fixme */ - - tracks_svd->track[n].ogt_info = 0x0; - for (i = 0; i < 4; i++) - if (track->info->ogt[i]) - tracks_svd->track[n].ogt_info |= 1 << (i * 2); /* fixme */ - - /* setting playtime */ - - { - double i, f; - - while (playtime >= 6000.0) - playtime -= 6000.0; - - f = modf(playtime, &i); - - cdio_lba_to_msf (i * 75, &tracks_svd->track[n].cum_playing_time); - tracks_svd->track[n].cum_playing_time.f = - cdio_to_bcd8 (floor (f * 75.0)); - } - - n++; - } - - memcpy (buf, &tracks_svd_buf, sizeof(tracks_svd_buf)); -} - -void -set_tracks_svd (VcdObj *obj, void *buf) -{ - char tracks_svd[ISO_BLOCKSIZE] = { 0, }; - TracksSVD *tracks_svd1 = (void *) tracks_svd; - TracksSVD2 *tracks_svd2; - CdioListNode *node; - int n; - - vcd_assert (_vcd_obj_has_cap_p (obj, _CAP_4C_SVCD)); - - if (obj->svcd_vcd3_tracksvd) - { - set_tracks_svd_v30 (obj, buf); - return; - } - - vcd_assert (sizeof (SVDTrackContent) == 1); - - strncpy (tracks_svd1->file_id, TRACKS_SVD_FILE_ID, sizeof (TRACKS_SVD_FILE_ID)-1); - tracks_svd1->version = TRACKS_SVD_VERSION; - - tracks_svd1->tracks = _cdio_list_length (obj->mpeg_track_list); - - tracks_svd2 = (void *) &(tracks_svd1->playing_time[tracks_svd1->tracks]); - - n = 0; - - _CDIO_LIST_FOREACH (node, obj->mpeg_track_list) - { - mpeg_track_t *track = _cdio_list_node_data (node); - const double playtime = track->info->playing_time; - - int _video; - - _video = tracks_svd2->contents[n].video = - _derive_vid_type (track->info, true); - - tracks_svd2->contents[n].audio = - _derive_aud_type (track->info, true); - - tracks_svd2->contents[n].ogt = - _derive_ogt_type (track->info, true); - - if (_video != 0x3 && _video != 0x7) - vcd_warn("SVCD/TRACKS.SVCD: No MPEG motion video for track #%d?", n); - - /* setting playtime */ - - { - double i, f; - - f = modf(playtime, &i); - - if (playtime >= 6000.0) - { - vcd_warn ("SVCD/TRACKS.SVD: playing time value (%d seconds) to great," - " clipping to 100 minutes", (int) i); - i = 5999.0; - f = 74.0 / 75.0; - } - - cdio_lba_to_msf (i * 75, &(tracks_svd1->playing_time[n])); - tracks_svd1->playing_time[n].f = cdio_to_bcd8 (floor (f * 75.0)); - } - - n++; - } - - memcpy (buf, &tracks_svd, sizeof(tracks_svd)); -} - -static double -_get_cumulative_playing_time (const VcdObj *obj, unsigned up_to_track_no) -{ - double result = 0; - CdioListNode *node; - - _CDIO_LIST_FOREACH (node, obj->mpeg_track_list) - { - mpeg_track_t *track = _cdio_list_node_data (node); - - if (!up_to_track_no) - break; - - result += track->info->playing_time; - up_to_track_no--; - } - - if (up_to_track_no) - vcd_warn ("internal error..."); - - return result; -} - -static unsigned -_get_scanpoint_count (const VcdObj *obj) -{ - double total_playing_time; - - total_playing_time = _get_cumulative_playing_time (obj, _cdio_list_length (obj->mpeg_track_list)); - - return ceil (total_playing_time * 2.0); -} - -uint32_t -get_search_dat_size (const VcdObj *obj) -{ - return sizeof (SearchDat) - + (_get_scanpoint_count (obj) * sizeof (msf_t)); -} - -static CdioList * -_make_track_scantable (const VcdObj *obj) -{ - CdioList *all_aps = _cdio_list_new (); - CdioList *scantable = _cdio_list_new (); - unsigned scanpoints = _get_scanpoint_count (obj); - unsigned track_no; - CdioListNode *node; - - track_no = 0; - _CDIO_LIST_FOREACH (node, obj->mpeg_track_list) - { - mpeg_track_t *track = _cdio_list_node_data (node); - CdioListNode *node2; - - _CDIO_LIST_FOREACH (node2, track->info->shdr[0].aps_list) - { - struct aps_data *_data = _vcd_malloc (sizeof (struct aps_data)); - - *_data = *(struct aps_data *)_cdio_list_node_data (node2); - - _data->timestamp += _get_cumulative_playing_time (obj, track_no); - _data->packet_no += obj->iso_size + track->relative_start_extent; - _data->packet_no += obj->track_front_margin; - - _cdio_list_append (all_aps, _data); - } - track_no++; - } - - { - CdioListNode *aps_node = _cdio_list_begin (all_aps); - CdioListNode *n; - struct aps_data *_data; - double aps_time; - double playing_time; - int aps_packet; - double t; - - playing_time = scanpoints; - playing_time /= 2; - - vcd_assert (aps_node != NULL); - - _data = _cdio_list_node_data (aps_node); - aps_time = _data->timestamp; - aps_packet = _data->packet_no; - - for (t = 0; t < playing_time; t += 0.5) - { - for(n = _cdio_list_node_next (aps_node); n; - n = _cdio_list_node_next (n)) - { - _data = _cdio_list_node_data (n); - - if (fabs (_data->timestamp - t) < fabs (aps_time - t)) - { - aps_node = n; - aps_time = _data->timestamp; - aps_packet = _data->packet_no; - } - else - break; - } - - { - uint32_t *lsect = _vcd_malloc (sizeof (uint32_t)); - - *lsect = aps_packet; - _cdio_list_append (scantable, lsect); - } - - } - - } - - _cdio_list_free (all_aps, true); - - vcd_assert (scanpoints == _cdio_list_length (scantable)); - - return scantable; -} - -void -set_search_dat (VcdObj *obj, void *buf) -{ - CdioList *scantable; - CdioListNode *node; - SearchDat search_dat; - unsigned n; - - vcd_assert (_vcd_obj_has_cap_p (obj, _CAP_4C_SVCD)); - /* vcd_assert (sizeof (SearchDat) == ?) */ - - memset (&search_dat, 0, sizeof (search_dat)); - - strncpy (search_dat.file_id, SEARCH_FILE_ID, sizeof (SEARCH_FILE_ID)-1); - - search_dat.version = SEARCH_VERSION; - search_dat.scan_points = uint16_to_be (_get_scanpoint_count (obj)); - search_dat.time_interval = SEARCH_TIME_INTERVAL; - - memcpy (buf, &search_dat, sizeof (search_dat)); - - scantable = _make_track_scantable (obj); - - n = 0; - _CDIO_LIST_FOREACH (node, scantable) - { - SearchDat *search_dat2 = buf; - uint32_t sect = *(uint32_t *) _cdio_list_node_data (node); - - cdio_lba_to_msf(cdio_lsn_to_lba(sect), &(search_dat2->points[n])); - n++; - } - - vcd_assert (n = _get_scanpoint_count (obj)); - - _cdio_list_free (scantable, true); -} - -static uint32_t -_get_scandata_count (const struct vcd_mpeg_stream_info *info) -{ - return ceil (info->playing_time * 2.0); -} - -static uint32_t * -_get_scandata_table (const struct vcd_mpeg_stream_info *info) -{ - CdioListNode *n, *aps_node = _cdio_list_begin (info->shdr[0].aps_list); - struct aps_data *_data; - double aps_time, t; - int aps_packet; - uint32_t *retval; - unsigned i; - - retval = _vcd_malloc (_get_scandata_count (info) * sizeof (uint32_t)); - - _data = _cdio_list_node_data (aps_node); - aps_time = _data->timestamp; - aps_packet = _data->packet_no; - - for (t = 0, i = 0; t < info->playing_time; t += 0.5, i++) - { - for(n = _cdio_list_node_next (aps_node); n; n = _cdio_list_node_next (n)) - { - _data = _cdio_list_node_data (n); - - if (fabs (_data->timestamp - t) < fabs (aps_time - t)) - { - aps_node = n; - aps_time = _data->timestamp; - aps_packet = _data->packet_no; - } - else - break; - } - - /* vcd_debug ("%f %f %d", t, aps_time, aps_packet); */ - - vcd_assert (i < _get_scandata_count (info)); - - retval[i] = aps_packet; - } - - vcd_assert (i = _get_scandata_count (info)); - - return retval; -} - -uint32_t -get_scandata_dat_size (const VcdObj *obj) -{ - uint32_t retval = 0; - - /* struct 1 */ - retval += sizeof (ScandataDat1); - retval += sizeof (msf_t) * _cdio_list_length (obj->mpeg_track_list); - - /* struct 2 */ - /* vcd_assert (sizeof (ScandataDat2) == 0); - retval += sizeof (ScandataDat2); */ - retval += sizeof (uint16_t) * 0; - - /* struct 3 */ - retval += sizeof (ScandataDat3); - retval += (sizeof (uint8_t) + sizeof (uint16_t)) * _cdio_list_length (obj->mpeg_track_list); - - /* struct 4 */ - /* vcd_assert (sizeof (ScandataDat4) == 0); - retval += sizeof (ScandataDat4); */ - { - CdioListNode *node; - _CDIO_LIST_FOREACH (node, obj->mpeg_track_list) - { - const mpeg_track_t *track = _cdio_list_node_data (node); - - retval += sizeof (msf_t) * _get_scandata_count (track->info); - } - } - - return retval; -} - -void -set_scandata_dat (VcdObj *obj, void *buf) -{ - const unsigned tracks = _cdio_list_length (obj->mpeg_track_list); - - ScandataDat1 *scandata_dat1 = (ScandataDat1 *) buf; - ScandataDat2 *scandata_dat2 = - (ScandataDat2 *) &(scandata_dat1->cum_playtimes[tracks]); - ScandataDat3 *scandata_dat3 = - (ScandataDat3 *) &(scandata_dat2->spi_indexes[0]); - ScandataDat4 *scandata_dat4 = - (ScandataDat4 *) &(scandata_dat3->mpeg_track_offsets[tracks]); - - const uint16_t _begin_offset = - __cd_offsetof (ScandataDat3, mpeg_track_offsets[tracks]) - - __cd_offsetof (ScandataDat3, mpeg_track_offsets); - - CdioListNode *node; - unsigned n; - uint16_t _tmp_offset; - - vcd_assert (_vcd_obj_has_cap_p (obj, _CAP_4C_SVCD)); - - /* memset (buf, 0, get_scandata_dat_size (obj)); */ - - /* struct 1 */ - strncpy (scandata_dat1->file_id, SCANDATA_FILE_ID, sizeof (SCANDATA_FILE_ID)-1); - - scandata_dat1->version = SCANDATA_VERSION_SVCD; - scandata_dat1->reserved = 0x00; - scandata_dat1->scandata_count = uint16_to_be (_get_scanpoint_count (obj)); - - scandata_dat1->track_count = uint16_to_be (tracks); - scandata_dat1->spi_count = uint16_to_be (0); - - for (n = 0; n < tracks; n++) - { - double playtime = _get_cumulative_playing_time (obj, n + 1); - double i = 0, f = 0; - - f = modf(playtime, &i); - - while (i >= (60 * 100)) - i -= (60 * 100); - - vcd_assert (i >= 0); - - cdio_lba_to_msf (i * 75, &(scandata_dat1->cum_playtimes[n])); - scandata_dat1->cum_playtimes[n].f = cdio_to_bcd8 (floor (f * 75.0)); - } - - /* struct 2 -- nothing yet */ - - /* struct 3/4 */ - - vcd_assert ((_begin_offset % sizeof (msf_t) == 0) - && _begin_offset > 0); - - _tmp_offset = 0; - - scandata_dat3->mpegtrack_start_index = uint16_to_be (_begin_offset); - - n = 0; - _CDIO_LIST_FOREACH (node, obj->mpeg_track_list) - { - const mpeg_track_t *track = _cdio_list_node_data (node); - uint32_t *_table; - const unsigned scanpoints = _get_scandata_count (track->info); - const unsigned _table_ofs = - (_tmp_offset * sizeof (msf_t)) + _begin_offset; - unsigned point; - - scandata_dat3->mpeg_track_offsets[n].track_num = n + 2; - scandata_dat3->mpeg_track_offsets[n].table_offset = uint16_to_be (_table_ofs); - - _table = _get_scandata_table (track->info); - - for (point = 0; point < scanpoints; point++) - { - uint32_t lsect = _table[point]; - - lsect += obj->iso_size; - lsect += track->relative_start_extent; - lsect += obj->track_front_margin; - - /* vcd_debug ("lsect %d %d", point, lsect); */ - - cdio_lba_to_msf(cdio_lsn_to_lba(lsect), - &(scandata_dat4->scandata_table[_tmp_offset + point])); - } - - free (_table); - - _tmp_offset += scanpoints; - n++; - } - - /* struct 4 */ - - -} - -vcd_type_t -vcd_files_info_detect_type (const void *info_buf) -{ - const InfoVcd_t *_info = info_buf; - vcd_type_t _type = VCD_TYPE_INVALID; - - vcd_assert (info_buf != NULL); - - if (!strncmp (_info->ID, INFO_ID_VCD, sizeof (_info->ID))) - switch (_info->version) - { - case INFO_VERSION_VCD2: - if (_info->sys_prof_tag != INFO_SPTAG_VCD2) - vcd_warn ("INFO.VCD: unexpected system profile tag %d encountered", - _info->version); - _type = VCD_TYPE_VCD2; - break; - - case INFO_VERSION_VCD: - /* case INFO_VERSION_VCD11: */ - switch (_info->sys_prof_tag) - { - case INFO_SPTAG_VCD: - _type = VCD_TYPE_VCD; - break; - case INFO_SPTAG_VCD11: - _type = VCD_TYPE_VCD11; - break; - default: - vcd_warn ("INFO.VCD: unexpected system profile tag %d " - "encountered, assuming VCD 1.1", _info->sys_prof_tag); - break; - } - break; - - default: - vcd_warn ("unexpected VCD version %d encountered -- assuming VCD 2.0", - _info->version); - break; - } - else if (!strncmp (_info->ID, INFO_ID_SVCD, sizeof (_info->ID))) - switch (_info->version) - { - case INFO_VERSION_SVCD: - if (_info->sys_prof_tag != INFO_SPTAG_SVCD) - vcd_warn ("INFO.SVD: unexpected system profile tag value %d " - "-- assuming SVCD", _info->sys_prof_tag); - _type = VCD_TYPE_SVCD; - break; - - default: - vcd_warn ("INFO.SVD: unexpected version value %d seen " - " -- still assuming SVCD", _info->version); - _type = VCD_TYPE_SVCD; - break; - } - else if (!strncmp (_info->ID, INFO_ID_HQVCD, sizeof (_info->ID))) - switch (_info->version) - { - case INFO_VERSION_HQVCD: - if (_info->sys_prof_tag != INFO_SPTAG_HQVCD) - vcd_warn ("INFO.SVD: unexpected system profile tag value -- assuming hqvcd"); - _type = VCD_TYPE_HQVCD; - break; - - default: - vcd_warn ("INFO.SVD: unexpected version value %d seen " - "-- still assuming HQVCD", _info->version); - _type = VCD_TYPE_HQVCD; - break; - } - else - vcd_warn ("INFO.SVD: signature not found"); - - return _type; -} - -/* eof */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/image.c b/src/input/vcd/libvcd/image.c deleted file mode 100644 index d26bb0910..000000000 --- a/src/input/vcd/libvcd/image.c +++ /dev/null @@ -1,108 +0,0 @@ -/* - $Id: image.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> - 2002 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <cdio/cdio.h> - -/* Public headers */ -#include <libvcd/sector.h> -#include <cdio/iso9660.h> - -/* Private headers */ -#include "vcd_assert.h" -#include "image_sink.h" -#include "util.h" - -static const char _rcsid[] = "$Id: image.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $"; - -/* - * VcdImageSink routines next. - */ - -struct _VcdImageSink { - void *user_data; - vcd_image_sink_funcs op; -}; - -VcdImageSink * -vcd_image_sink_new (void *user_data, const vcd_image_sink_funcs *funcs) -{ - VcdImageSink *new_obj; - - new_obj = _vcd_malloc (sizeof (VcdImageSink)); - - new_obj->user_data = user_data; - new_obj->op = *funcs; - - return new_obj; -} - -void -vcd_image_sink_destroy (VcdImageSink *obj) -{ - vcd_assert (obj != NULL); - - obj->op.free (obj->user_data); - free (obj); -} - -int -vcd_image_sink_set_cuesheet (VcdImageSink *obj, const CdioList *vcd_cue_list) -{ - vcd_assert (obj != NULL); - - return obj->op.set_cuesheet (obj->user_data, vcd_cue_list); -} - -int -vcd_image_sink_write (VcdImageSink *obj, void *buf, lsn_t lsn) -{ - vcd_assert (obj != NULL); - - return obj->op.write (obj->user_data, buf, lsn); -} - -/*! - Set the arg "key" with "value" in the target device. -*/ - -int -vcd_image_sink_set_arg (VcdImageSink *obj, const char key[], - const char value[]) -{ - vcd_assert (obj != NULL); - vcd_assert (obj->op.set_arg != NULL); - vcd_assert (key != NULL); - - return obj->op.set_arg (obj->user_data, key, value); -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/image_bincue.c b/src/input/vcd/libvcd/image_bincue.c deleted file mode 100644 index 9c447a42a..000000000 --- a/src/input/vcd/libvcd/image_bincue.c +++ /dev/null @@ -1,259 +0,0 @@ -/* - $Id: image_bincue.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2001, 2004 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - - -#include <stdlib.h> -#include <string.h> - -#include <cdio/cdio.h> -#include <cdio/bytesex.h> -#include <cdio/iso9660.h> - -/* Public headers */ -#include <libvcd/sector.h> -#include <libvcd/logging.h> - -/* Private headers */ -#include "vcd_assert.h" -#include "image_sink.h" -#include "stream_stdio.h" -#include "util.h" - -static const char _rcsid[] = "$Id: image_bincue.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $"; - -/* reader */ - -#define DEFAULT_VCD_DEVICE "videocd.bin" - -/**************************************************************************** - * writer - */ - -typedef struct { - bool sector_2336_flag; - VcdDataSink *bin_snk; - VcdDataSink *cue_snk; - char *bin_fname; - char *cue_fname; - - bool init; -} _img_bincue_snk_t; - -static void -_sink_init (_img_bincue_snk_t *_obj) -{ - if (_obj->init) - return; - - if (!(_obj->bin_snk = vcd_data_sink_new_stdio (_obj->bin_fname))) - vcd_error ("init failed"); - - if (!(_obj->cue_snk = vcd_data_sink_new_stdio (_obj->cue_fname))) - vcd_error ("init failed"); - - _obj->init = true; -} - -static void -_sink_free (void *user_data) -{ - _img_bincue_snk_t *_obj = user_data; - - vcd_data_sink_destroy (_obj->bin_snk); - vcd_data_sink_destroy (_obj->cue_snk); - free (_obj->bin_fname); - free (_obj->cue_fname); - free (_obj); -} - -static int -_set_cuesheet (void *user_data, const CdioList *vcd_cue_list) -{ - _img_bincue_snk_t *_obj = user_data; - CdioListNode *node; - int track_no, index_no; - const vcd_cue_t *_last_cue = 0; - - _sink_init (_obj); - - vcd_data_sink_printf (_obj->cue_snk, "FILE \"%s\" BINARY\r\n", - _obj->bin_fname); - - track_no = 0; - index_no = 0; - _CDIO_LIST_FOREACH (node, (CdioList *) vcd_cue_list) - { - const vcd_cue_t *_cue = _cdio_list_node_data (node); - char *psz_msf; - - msf_t _msf = { 0, 0, 0 }; - - switch (_cue->type) - { - case VCD_CUE_TRACK_START: - track_no++; - index_no = 0; - - vcd_data_sink_printf (_obj->cue_snk, - " TRACK %2.2d MODE2/%d\r\n" - " FLAGS DCP\r\n", - track_no, (_obj->sector_2336_flag ? 2336 : 2352)); - - if (_last_cue && _last_cue->type == VCD_CUE_PREGAP_START) - { - cdio_lba_to_msf (_last_cue->lsn, &_msf); - psz_msf = cdio_msf_to_str(&_msf); - - vcd_data_sink_printf (_obj->cue_snk, - " INDEX %2.2d %s\r\n", - index_no, psz_msf); - free(psz_msf); - } - - index_no++; - - cdio_lba_to_msf (_cue->lsn, &_msf); - psz_msf = cdio_msf_to_str(&_msf); - - vcd_data_sink_printf (_obj->cue_snk, - " INDEX %2.2d %s\r\n", - index_no, psz_msf); - free(psz_msf); - break; - - case VCD_CUE_PREGAP_START: - /* handled in next iteration */ - break; - - case VCD_CUE_SUBINDEX: - vcd_assert (_last_cue != 0); - - index_no++; - vcd_assert (index_no <= CDIO_CD_MAX_TRACKS); - - cdio_lba_to_msf (_cue->lsn, &_msf); - psz_msf = cdio_msf_to_str(&_msf); - - vcd_data_sink_printf (_obj->cue_snk, - " INDEX %2.2d %s\r\n", - index_no, psz_msf); - free(psz_msf); - break; - - case VCD_CUE_END: - vcd_data_sink_close (_obj->cue_snk); - return 0; - break; - - case VCD_CUE_LEADIN: - break; - } - - _last_cue = _cue; - } - - vcd_assert_not_reached (); - - return -1; -} - -static int -_vcd_image_bincue_write (void *user_data, const void *data, lsn_t lsn) -{ - const char *buf = data; - _img_bincue_snk_t *_obj = user_data; - long offset = lsn; - - _sink_init (_obj); - - offset *= _obj->sector_2336_flag ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE_RAW; - - vcd_data_sink_seek(_obj->bin_snk, offset); - - if (_obj->sector_2336_flag) - vcd_data_sink_write(_obj->bin_snk, buf + 12 + 4, M2RAW_SECTOR_SIZE, 1); - else - vcd_data_sink_write(_obj->bin_snk, buf, CDIO_CD_FRAMESIZE_RAW, 1); - - return 0; -} - -static int -_sink_set_arg (void *user_data, const char key[], const char value[]) -{ - _img_bincue_snk_t *_obj = user_data; - - if (!strcmp (key, "bin")) - { - free (_obj->bin_fname); - - if (!value) - return -2; - - _obj->bin_fname = strdup (value); - } - else if (!strcmp (key, "cue")) - { - free (_obj->cue_fname); - - if (!value) - return -2; - - _obj->cue_fname = strdup (value); - } - else if (!strcmp (key, "sector")) - { - if (!strcmp (value, "2336")) - _obj->sector_2336_flag = true; - else if (!strcmp (value, "2352")) - _obj->sector_2336_flag = false; - else - return -2; - } - else - return -1; - - return 0; -} - -VcdImageSink * -vcd_image_sink_new_bincue (void) -{ - _img_bincue_snk_t *_data; - - vcd_image_sink_funcs _funcs = { - .set_cuesheet = _set_cuesheet, - .write = _vcd_image_bincue_write, - .free = _sink_free, - .set_arg = _sink_set_arg - }; - - _data = _vcd_malloc (sizeof (_img_bincue_snk_t)); - - _data->bin_fname = strdup ("videocd.bin"); - _data->cue_fname = strdup ("videocd.cue"); - - return vcd_image_sink_new (_data, &_funcs); -} - diff --git a/src/input/vcd/libvcd/image_cdrdao.c b/src/input/vcd/libvcd/image_cdrdao.c deleted file mode 100644 index 5e00c14ee..000000000 --- a/src/input/vcd/libvcd/image_cdrdao.c +++ /dev/null @@ -1,313 +0,0 @@ -/* - $Id: image_cdrdao.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -/* Public headers */ -#include <cdio/iso9660.h> -#include <cdio/bytesex.h> -#include <libvcd/sector.h> -#include <libvcd/logging.h> - -/* Private headers */ -#include "vcd_assert.h" -#include "image_sink.h" -#include "stream_stdio.h" -#include "util.h" -#include "vcd.h" - -static const char _rcsid[] = "$Id: image_cdrdao.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $"; - -/* reader */ - -/**************************************************************************** - * writer - */ - -typedef struct { - bool sector_2336_flag; - char *toc_fname; - char *img_base; - - VcdDataSink *last_bin_snk; - int last_snk_idx; - bool last_pause; - - CdioList *vcd_cue_list; -} _img_cdrdao_snk_t; - -static void -_sink_free (void *user_data) -{ - _img_cdrdao_snk_t *_obj = user_data; - - /* fixme -- destroy cue list */ - - vcd_data_sink_destroy (_obj->last_bin_snk); - free (_obj->toc_fname); - free (_obj->img_base); - free (_obj); -} - -static int -_set_cuesheet (void *user_data, const CdioList *vcd_cue_list) -{ - _img_cdrdao_snk_t *_obj = user_data; - VcdDataSink *toc_snk = vcd_data_sink_new_stdio (_obj->toc_fname); - - CdioListNode *node; - - int track_no, index_no; - const vcd_cue_t *_last_cue = 0; - unsigned last_track_lsn = 0; - - vcd_data_sink_printf (toc_snk, - "// CDRDAO TOC\n" - "// generated by %s\n\n" - "CD_ROM_XA\n", vcd_version_string (false)); - - _obj->vcd_cue_list = _cdio_list_new (); - - index_no = track_no = 0; - _CDIO_LIST_FOREACH (node, (CdioList *) vcd_cue_list) - { - const vcd_cue_t *_cue = _cdio_list_node_data (node); - - /* copy cue list while traversing */ - { - vcd_cue_t *_cue2 = _vcd_malloc (sizeof (vcd_cue_t)); - *_cue2 = *_cue; - _cdio_list_append (_obj->vcd_cue_list, _cue2); - } - - switch (_cue->type) - { - case VCD_CUE_TRACK_START: - track_no++; - index_no = 0; - - last_track_lsn = _cue->lsn; - - vcd_data_sink_printf (toc_snk, - "\n// Track %d\n" - "TRACK %s\n COPY\n", - track_no, - (_obj->sector_2336_flag ? "MODE2_FORM_MIX" : "MODE2_RAW")); - - if (_last_cue && _last_cue->type == VCD_CUE_PREGAP_START) - vcd_data_sink_printf (toc_snk, - " DATAFILE \"%s_%.2d_pregap.img\"\n" - " START\n", - _obj->img_base, track_no); - - index_no++; - - vcd_data_sink_printf (toc_snk, - " DATAFILE \"%s_%.2d.img\"\n", - _obj->img_base, track_no); - break; - - case VCD_CUE_PREGAP_START: - /* handled in next iteration */ - break; - - case VCD_CUE_SUBINDEX: - index_no++; - - { - msf_t _msf = { 0, 0, 0 }; - char *psz_msf; - - cdio_lba_to_msf (_cue->lsn - last_track_lsn, &_msf); - psz_msf = cdio_msf_to_str(&_msf); - - vcd_data_sink_printf (toc_snk, " INDEX %s\n", psz_msf); - free(psz_msf); - } - break; - - case VCD_CUE_LEADIN: - break; - - case VCD_CUE_END: - vcd_data_sink_printf (toc_snk, "\n// EOF\n"); - - vcd_data_sink_close (toc_snk); - vcd_data_sink_destroy (toc_snk); - - return 0; - break; - } - - _last_cue = _cue; - } - - vcd_assert_not_reached (); - - return -1; -} - -static int -_vcd_image_cdrdao_write (void *user_data, const void *data, lsn_t lsn) -{ - const char *buf = data; - _img_cdrdao_snk_t *_obj = user_data; - long offset; - - { - CdioListNode *node; - uint32_t _last = 0; - uint32_t _ofs = 0; - bool _lpregap = false; - bool _pregap = false; - - int num = 0, in_track = 0; - _CDIO_LIST_FOREACH (node, _obj->vcd_cue_list) - { - const vcd_cue_t *_cue = _cdio_list_node_data (node); - - switch (_cue->type) - { - case VCD_CUE_PREGAP_START: - case VCD_CUE_END: - case VCD_CUE_TRACK_START: - if (_cue->lsn && IN (lsn, _last, _cue->lsn - 1)) - { - vcd_assert (in_track == 0); - in_track = num; - _ofs = _last; - _pregap = _lpregap; - } - - _last = _cue->lsn; - _lpregap = (_cue->type == VCD_CUE_PREGAP_START); - - if (_cue->type == VCD_CUE_TRACK_START) - num++; - break; - - default: - /* noop */ - break; - } - } - - vcd_assert (in_track != 0); - vcd_assert (_obj->last_snk_idx <= in_track); - - if (_obj->last_snk_idx != in_track - || _obj->last_pause != _pregap) - { - char buf[4096] = { 0, }; - - if (_obj->last_bin_snk) - vcd_data_sink_destroy (_obj->last_bin_snk); - - snprintf (buf, sizeof (buf), - "%s_%.2d%s.img", - _obj->img_base, - (_pregap ? in_track + 1 : in_track), - (_pregap ? "_pregap" : "")); - - _obj->last_bin_snk = vcd_data_sink_new_stdio (buf); - _obj->last_snk_idx = in_track; - _obj->last_pause = _pregap; - } - - vcd_assert (lsn >= _ofs); - offset = lsn - _ofs; - } - - offset *= _obj->sector_2336_flag ? M2RAW_SECTOR_SIZE : CDIO_CD_FRAMESIZE_RAW; - - vcd_data_sink_seek(_obj->last_bin_snk, offset); - - if (_obj->sector_2336_flag) - vcd_data_sink_write(_obj->last_bin_snk, buf + 12 + 4, M2RAW_SECTOR_SIZE, 1); - else - vcd_data_sink_write(_obj->last_bin_snk, buf, CDIO_CD_FRAMESIZE_RAW, 1); - - return 0; -} - -static int -_sink_set_arg (void *user_data, const char key[], const char value[]) -{ - _img_cdrdao_snk_t *_obj = user_data; - - if (!strcmp (key, "toc")) - { - free (_obj->toc_fname); - - if (!value) - return -2; - - _obj->toc_fname = strdup (value); - } - else if (!strcmp (key, "img_base")) - { - free (_obj->img_base); - - if (!value) - return -2; - - _obj->img_base = strdup (value); - } - else if (!strcmp (key, "sector")) - { - if (!strcmp (value, "2336")) - _obj->sector_2336_flag = true; - else if (!strcmp (value, "2352")) - _obj->sector_2336_flag = false; - else - return -2; - } - else - return -1; - - return 0; -} - -VcdImageSink * -vcd_image_sink_new_cdrdao (void) -{ - _img_cdrdao_snk_t *_data; - - vcd_image_sink_funcs _funcs = { - .set_cuesheet = _set_cuesheet, - .write = _vcd_image_cdrdao_write, - .free = _sink_free, - .set_arg = _sink_set_arg - }; - - _data = _vcd_malloc (sizeof (_img_cdrdao_snk_t)); - - _data->toc_fname = strdup ("videocd.toc"); - _data->img_base = strdup ("videocd"); - - return vcd_image_sink_new (_data, &_funcs); -} - diff --git a/src/input/vcd/libvcd/image_nrg.c b/src/input/vcd/libvcd/image_nrg.c deleted file mode 100644 index 1faeb98a9..000000000 --- a/src/input/vcd/libvcd/image_nrg.c +++ /dev/null @@ -1,352 +0,0 @@ -/* - $Id: image_nrg.c,v 1.4 2006/09/27 05:41:40 dgp85 Exp $ - - Copyright (C) 2001, 2003, 2004 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -/*! This code implements low-level access functions for Nero's native - CD-image format residing inside a disk file (*.nrg). -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <cdio/cdio.h> -#include <cdio/bytesex.h> -#include <cdio/iso9660.h> - -/* Public headers */ -#include <libvcd/sector.h> -#include <libvcd/logging.h> - -/* Private headers */ -#include "vcd_assert.h" -#include "image_sink.h" -#include "stream_stdio.h" -#include "util.h" - -static const char _rcsid[] = "$Id: image_nrg.c,v 1.4 2006/09/27 05:41:40 dgp85 Exp $"; - -/* structures used */ - -/* this ugly image format is typical for lazy win32 programmers... at - least structure were set big endian, so at reverse - engineering wasn't such a big headache... */ - -PRAGMA_BEGIN_PACKED -typedef struct { - uint32_t start GNUC_PACKED; - uint32_t length GNUC_PACKED; - uint32_t type GNUC_PACKED; /* only 0x3 seen so far... - -> MIXED_MODE2 2336 blocksize */ - uint32_t start_lsn GNUC_PACKED; /* does not include any pre-gaps! */ - uint32_t _unknown GNUC_PACKED; /* wtf is this for? -- always zero... */ -} _etnf_array_t; - -/* finally they realized that 32bit offsets are a bit outdated for IA64 *eg* */ -typedef struct { - uint64_t start GNUC_PACKED; - uint64_t length GNUC_PACKED; - uint32_t type GNUC_PACKED; - uint32_t start_lsn GNUC_PACKED; - uint64_t _unknown GNUC_PACKED; /* wtf is this for? -- always zero... */ -} _etn2_array_t; - -typedef struct { - uint8_t _unknown1 GNUC_PACKED; /* 0x41 == 'A' */ - uint8_t track GNUC_PACKED; /* binary or BCD?? */ - uint8_t index GNUC_PACKED; /* makes 0->1 transitions */ - uint8_t _unknown2 GNUC_PACKED; /* ?? */ - uint32_t lsn GNUC_PACKED; -} _cuex_array_t; - -typedef struct { - uint32_t id GNUC_PACKED; - uint32_t len GNUC_PACKED; - char data[EMPTY_ARRAY_SIZE] GNUC_PACKED; -} _chunk_t; - -PRAGMA_END_PACKED - -/* to be converted into BE */ -#define CUEX_ID 0x43554558 -#define CUES_ID 0x43554553 -#define DAOX_ID 0x44414f58 -#define DAOI_ID 0x44414f49 -#define END1_ID 0x454e4421 -#define ETN2_ID 0x45544e32 -#define ETNF_ID 0x45544e46 -#define NER5_ID 0x4e455235 -#define NERO_ID 0x4e45524f -#define SINF_ID 0x53494e46 - -/**************************************************************************** - * writer - */ - -typedef struct { - VcdDataSink *nrg_snk; - char *nrg_fname; - - CdioList *vcd_cue_list; - int tracks; - uint32_t cue_end_lsn; - - bool init; -} _img_nrg_snk_t; - -static void -_sink_init (_img_nrg_snk_t *_obj) -{ - if (_obj->init) - return; - - if (!(_obj->nrg_snk = vcd_data_sink_new_stdio (_obj->nrg_fname))) - vcd_error ("init failed"); - - _obj->init = true; -} - - -static void -_sink_free (void *user_data) -{ - _img_nrg_snk_t *_obj = user_data; - - free (_obj->nrg_fname); - vcd_data_sink_destroy (_obj->nrg_snk); - - free (_obj); -} - -static int -_set_cuesheet (void *user_data, const CdioList *vcd_cue_list) -{ - _img_nrg_snk_t *_obj = user_data; - CdioListNode *node; - int num; - - _sink_init (_obj); - - _obj->vcd_cue_list = _cdio_list_new (); - - num = 0; - _CDIO_LIST_FOREACH (node, (CdioList *) vcd_cue_list) - { - const vcd_cue_t *_cue = _cdio_list_node_data (node); - vcd_cue_t *_cue2 = _vcd_malloc (sizeof (vcd_cue_t)); - *_cue2 = *_cue; - _cdio_list_append (_obj->vcd_cue_list, _cue2); - - if (_cue->type == VCD_CUE_TRACK_START) - num++; - - if (_cue->type == VCD_CUE_END) - _obj->cue_end_lsn = _cue->lsn; - } - - _obj->tracks = num; - - vcd_assert (CDIO_CD_MIN_TRACK_NO >= 1 && num <= CDIO_CD_MAX_TRACKS); - - return 0; -} - -static uint32_t -_map (_img_nrg_snk_t *_obj, uint32_t lsn) -{ - CdioListNode *node; - uint32_t result = lsn; - vcd_cue_t *_cue = NULL, *_last = NULL; - - vcd_assert (_obj->cue_end_lsn > lsn); - - _CDIO_LIST_FOREACH (node, _obj->vcd_cue_list) - { - _cue = _cdio_list_node_data (node); - - if (lsn < _cue->lsn) - break; - - switch (_cue->type) - { - case VCD_CUE_TRACK_START: - result -= _cue->lsn; - break; - case VCD_CUE_PREGAP_START: - result += _cue->lsn; - break; - default: - break; - } - - _last = _cue; - } - - vcd_assert (node != NULL); - vcd_assert (_last != NULL); - - switch (_last->type) - { - case VCD_CUE_TRACK_START: - return result; - break; - - case VCD_CUE_PREGAP_START: - return -1; - break; - - default: - case VCD_CUE_END: - vcd_assert_not_reached (); - break; - } - - return -1; -} - -static int -_write_tail (_img_nrg_snk_t *_obj, uint32_t offset) -{ - CdioListNode *node; - int _size; - _chunk_t _chunk; - - vcd_data_sink_seek (_obj->nrg_snk, offset); - - _size = _obj->tracks * sizeof (_etnf_array_t); - _chunk.id = UINT32_TO_BE (ETNF_ID); - _chunk.len = uint32_to_be (_size); - - vcd_data_sink_write (_obj->nrg_snk, &_chunk, sizeof (_chunk_t), 1); - - _CDIO_LIST_FOREACH (node, _obj->vcd_cue_list) - { - vcd_cue_t *_cue = _cdio_list_node_data (node); - - if (_cue->type == VCD_CUE_TRACK_START) - { - vcd_cue_t *_cue2 = - _cdio_list_node_data (_cdio_list_node_next (node)); - - _etnf_array_t _etnf = { 0, }; - - _etnf.type = UINT32_TO_BE (0x3); - _etnf.start_lsn = uint32_to_be (_map (_obj, _cue->lsn)); - _etnf.start = uint32_to_be (_map (_obj, _cue->lsn) * M2RAW_SECTOR_SIZE); - - _etnf.length = uint32_to_be ((_cue2->lsn - _cue->lsn) * M2RAW_SECTOR_SIZE); - - vcd_data_sink_write (_obj->nrg_snk, &_etnf, sizeof (_etnf_array_t), 1); - } - - } - - { - uint32_t tracks = uint32_to_be (_obj->tracks); - - _chunk.id = UINT32_TO_BE (SINF_ID); - _chunk.len = UINT32_TO_BE (sizeof (uint32_t)); - vcd_data_sink_write (_obj->nrg_snk, &_chunk, sizeof (_chunk_t), 1); - - vcd_data_sink_write (_obj->nrg_snk, &tracks, sizeof (uint32_t), 1); - } - - _chunk.id = UINT32_TO_BE (END1_ID); - _chunk.len = UINT32_TO_BE (0); - vcd_data_sink_write (_obj->nrg_snk, &_chunk, sizeof (_chunk_t), 1); - - _chunk.id = UINT32_TO_BE (NERO_ID); - _chunk.len = uint32_to_be (offset); - vcd_data_sink_write (_obj->nrg_snk, &_chunk, sizeof (_chunk_t), 1); - - return 0; -} - -static int -_vcd_image_nrg_write (void *user_data, const void *data, lsn_t lsn) -{ - const char *buf = data; - _img_nrg_snk_t *_obj = user_data; - uint32_t _lsn = _map (_obj, lsn); - - _sink_init (_obj); - - if (_lsn == -1) - { - /* vcd_debug ("ignoring %d", lsn); */ - return 0; - } - - vcd_data_sink_seek(_obj->nrg_snk, _lsn * M2RAW_SECTOR_SIZE); - vcd_data_sink_write(_obj->nrg_snk, buf + 12 + 4, M2RAW_SECTOR_SIZE, 1); - - if (_obj->cue_end_lsn - 1 == lsn) - { - vcd_debug ("ENDLSN reached! (%lu == %lu)", - (long unsigned int) lsn, (long unsigned int) _lsn); - return _write_tail (_obj, (_lsn + 1) * M2RAW_SECTOR_SIZE); - } - - return 0; -} - -static int -_sink_set_arg (void *user_data, const char key[], const char value[]) -{ - _img_nrg_snk_t *_obj = user_data; - - if (!strcmp (key, "nrg")) - { - free (_obj->nrg_fname); - - if (!value) - return -2; - - _obj->nrg_fname = strdup (value); - } - else - return -1; - - return 0; -} - -VcdImageSink * -vcd_image_sink_new_nrg (void) -{ - _img_nrg_snk_t *_data; - - vcd_image_sink_funcs _funcs = { - .set_cuesheet = _set_cuesheet, - .write = _vcd_image_nrg_write, - .free = _sink_free, - .set_arg = _sink_set_arg - }; - - _data = _vcd_malloc (sizeof (_img_nrg_snk_t)); - _data->nrg_fname = strdup ("videocd.nrg"); - - vcd_warn ("opening TAO NRG image for writing; TAO (S)VCD are NOT 100%% compliant!"); - - return vcd_image_sink_new (_data, &_funcs); -} - diff --git a/src/input/vcd/libvcd/image_sink.h b/src/input/vcd/libvcd/image_sink.h deleted file mode 100644 index a71e30199..000000000 --- a/src/input/vcd/libvcd/image_sink.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - $Id: image_sink.h,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifndef __VCD_IMAGE_SINK_H__ -#define __VCD_IMAGE_SINK_H__ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <cdio/cdio.h> -#include <libvcd/types.h> - -/* Private includes */ -#include "data_structures.h" -#include "stream.h" - -/* VcdImageSink ( --> image writer) */ - -typedef struct _VcdImageSink VcdImageSink; - -typedef struct { - uint32_t lsn; - enum { - VCD_CUE_TRACK_START = 1, /* INDEX 0 -> 1 transition, TOC entry */ - VCD_CUE_PREGAP_START, /* INDEX = 0 start */ - VCD_CUE_SUBINDEX, /* INDEX++; sub-index */ - VCD_CUE_END, /* lead-out start */ - VCD_CUE_LEADIN, /* lead-in start */ - } type; -} vcd_cue_t; - -typedef struct { - int (*set_cuesheet) (void *user_data, const CdioList *vcd_cue_list); - int (*write) (void *user_data, const void *buf, lsn_t lsn); - void (*free) (void *user_data); - int (*set_arg) (void *user_data, const char key[], const char value[]); -} vcd_image_sink_funcs; - -VcdImageSink * -vcd_image_sink_new (void *user_data, const vcd_image_sink_funcs *funcs); - -void -vcd_image_sink_destroy (VcdImageSink *obj); - -int -vcd_image_sink_set_cuesheet (VcdImageSink *obj, const CdioList *vcd_cue_list); - -int -vcd_image_sink_write (VcdImageSink *obj, void *buf, lsn_t lsn); - -/*! - Set the arg "key" with "value" in the target device. -*/ -int -vcd_image_sink_set_arg (VcdImageSink *obj, const char key[], - const char value[]); - -VcdImageSink * vcd_image_sink_new_nrg (void); -VcdImageSink * vcd_image_sink_new_bincue (void); -VcdImageSink * vcd_image_sink_new_cdrdao (void); - -#endif /* __VCD_IMAGE_SINK_H__ */ diff --git a/src/input/vcd/libvcd/inf.c b/src/input/vcd/libvcd/inf.c deleted file mode 100644 index 588c8e5f7..000000000 --- a/src/input/vcd/libvcd/inf.c +++ /dev/null @@ -1,531 +0,0 @@ -/* - $Id: inf.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2002,2003 Rocky Bernstein <rocky@panix.com> - - 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 Foundation - Software, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -/* - Things here refer to lower-level structures using a structure other - than vcdinfo_t. For higher-level structures via the vcdinfo_t, see - info.c -*/ - - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdio.h> -#include <stddef.h> -#include <errno.h> - -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_STRING_H -#include <string.h> -#endif -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif - -#include <cdio/cdio.h> -#include <cdio/bytesex.h> -#include <cdio/util.h> - -/* Eventually move above libvcd includes but having vcdinfo including. */ -#include <libvcd/info.h> - -/* Private headers */ -#include "info_private.h" -#include "pbc.h" - -static const char _rcsid[] = "$Id: inf.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $"; - -#define BUF_COUNT 16 -#define BUF_SIZE 80 - -/* Return a pointer to a internal free buffer */ -static char * -_getbuf (void) -{ - static char _buf[BUF_COUNT][BUF_SIZE]; - static int _num = -1; - - _num++; - _num %= BUF_COUNT; - - memset (_buf[_num], 0, BUF_SIZE); - - return _buf[_num]; -} - -const char * -vcdinf_area_str (const struct psd_area_t *_area) -{ - char *buf; - - if (!_area->x1 - && !_area->y1 - && !_area->x2 - && !_area->y2) - return "disabled"; - - buf = _getbuf (); - - snprintf (buf, BUF_SIZE, "[%3d,%3d] - [%3d,%3d]", - _area->x1, _area->y1, - _area->x2, _area->y2); - - return buf; -} - -/*! - Return a string containing the VCD album id, or NULL if there is - some problem in getting this. -*/ -const char * -vcdinf_get_album_id(const InfoVcd_t *info) -{ - if (NULL==info) return NULL; - return vcdinfo_strip_trail (info->album_desc, MAX_ALBUM_LEN); -} - -/*! - Get autowait time value for PsdPlayListDescriptor *d. - Time is in seconds unless it is -1 (unlimited). -*/ -int -vcdinf_get_autowait_time (const PsdPlayListDescriptor_t *d) -{ - return vcdinfo_get_wait_time (d->atime); -} - -/*! - Return the base selection number. VCD_INVALID_BSN is returned if there - is an error. -*/ -unsigned int -vcdinf_get_bsn(const PsdSelectionListDescriptor_t *psd) -{ - if (NULL==psd) return VCDINFO_INVALID_BSN; - return(psd->bsn); -} - -/*! - Return a string giving VCD format (VCD 1.0 VCD 1.1, SVCD, ... - for this object. -*/ -const char * -vcdinf_get_format_version_str (vcd_type_t vcd_type) -{ - switch (vcd_type) - { - case VCD_TYPE_VCD: - return ("VCD 1.0"); - break; - case VCD_TYPE_VCD11: - return ("VCD 1.1"); - break; - case VCD_TYPE_VCD2: - return ("VCD 2.0"); - break; - case VCD_TYPE_SVCD: - return ("SVCD"); - break; - case VCD_TYPE_HQVCD: - return ("HQVCD"); - break; - case VCD_TYPE_INVALID: - return ("INVALID"); - break; - default: - return ( "????"); - } -} - -/*! - Return loop count. 0 is infinite loop. -*/ -uint16_t -vcdinf_get_loop_count (const PsdSelectionListDescriptor_t *psd) -{ - return 0x7f & psd->loop; -} - -/*! - Return LOT offset -*/ -uint16_t -vcdinf_get_lot_offset (const LotVcd_t *lot, unsigned int n) -{ - return uint16_from_be (lot->offset[n]); -} - -/*! - Return the number of entries in the VCD. -*/ -unsigned int -vcdinf_get_num_entries(const EntriesVcd_t *entries) -{ - if (NULL==entries) return 0; - return (uint16_from_be (entries->entry_count)); -} - -/*! - Return the number of segments in the VCD. -*/ -segnum_t -vcdinf_get_num_segments(const InfoVcd_t *info) -{ - if (NULL==info) return 0; - return (uint16_from_be (info->item_count)); -} - -/*! - Return number of LIDs. -*/ -lid_t -vcdinf_get_num_LIDs (const InfoVcd_t *info) -{ - if (NULL==info) return 0; - /* Should probably use _vcd_pbc_max_lid instead? */ - return uint16_from_be (info->lot_entries); -} - -/*! - Return the number of menu selections for selection list descriptor psd. -*/ -unsigned int -vcdinf_get_num_selections(const PsdSelectionListDescriptor_t *psd) -{ - return psd->nos; -} - -/*! - Get play time value for PsdPlayListDescriptor *d. - Time is in 1/15-second units. -*/ -uint16_t -vcdinf_get_play_time (const PsdPlayListDescriptor_t *d) -{ - if (NULL==d) return 0; - return uint16_from_be (d->ptime); -} - -/*! - Return number of bytes in PSD. -*/ -uint32_t -vcdinf_get_psd_size (const InfoVcd_t *info) -{ - if (NULL==info) return 0; - return uint32_from_be (info->psd_size); -} - -/*! - Get timeout wait time value for PsdPlayListDescriptor *d. - Return VCDINFO_INVALID_OFFSET if d is NULL; - Time is in seconds unless it is -1 (unlimited). -*/ -uint16_t -vcdinf_get_timeout_offset (const PsdSelectionListDescriptor_t *d) -{ - if (NULL == d) return VCDINFO_INVALID_OFFSET; - return uint16_from_be (d->timeout_ofs); -} - -/*! - Get timeout wait time value for PsdPlayListDescriptor *d. - Time is in seconds unless it is -1 (unlimited). -*/ -int -vcdinf_get_timeout_time (const PsdSelectionListDescriptor_t *d) -{ - return vcdinfo_get_wait_time (d->totime); -} - -/*! - Return the track number for entry n in obj. The first track starts - at 1. Note this is one less than the track number reported in vcddump. - (We don't count the header track?) -*/ -track_t -vcdinf_get_track(const EntriesVcd_t *entries, const unsigned int entry_num) -{ - const unsigned int entry_count = uint16_from_be (entries->entry_count); - /* Note entry_num is 0 origin. */ - return entry_num < entry_count ? - cdio_from_bcd8 (entries->entry[entry_num].n): - VCDINFO_INVALID_TRACK; -} - -/*! - Return the VCD volume count - the number of CD's in the collection. -*/ -unsigned int -vcdinf_get_volume_count(const InfoVcd_t *info) -{ - if (NULL==info) return 0; - return(uint16_from_be( info->vol_count)); -} - -/*! - Return the VCD volume num - the number of the CD in the collection. - This is a number between 1 and the volume count. -*/ -unsigned int -vcdinf_get_volume_num(const InfoVcd_t *info) -{ - if (NULL == info) return 0; - return uint16_from_be(info->vol_id); -} - -/*! - Get wait time value for PsdPlayListDescriptor *d. - Time is in seconds unless it is -1 (unlimited). -*/ -int -vcdinf_get_wait_time (const PsdPlayListDescriptor_t *d) -{ - return vcdinfo_get_wait_time (d->wtime); -} - -/*! - Return true if loop has a jump delay -*/ -bool -vcdinf_has_jump_delay (const PsdSelectionListDescriptor_t *psd) -{ - if (NULL==psd) return false; - return ((0x80 & psd->loop) != 0); -} - -/*! - Comparison routine used in sorting. We compare LIDs and if those are - equal, use the offset. - Note: we assume an unassigned LID is 0 and this compares as a high value. - - NOTE: Consider making static. -*/ -int -vcdinf_lid_t_cmp (vcdinfo_offset_t *a, vcdinfo_offset_t *b) -{ - if (a->lid && b->lid) - { - if (a->lid > b->lid) return +1; - if (a->lid < b->lid) return -1; - vcd_warn ("LID %d at offset %d has same nunber as LID of offset %d", - a->lid, a->offset, b->offset); - } - else if (a->lid) return -1; - else if (b->lid) return +1; - - /* Failed to sort on LID, try offset now. */ - - if (a->offset > b->offset) return +1; - if (a->offset < b->offset) return -1; - - /* LIDS and offsets are equal. */ - return 0; -} - -/* Get the LID from a given play-list descriptor. - VCDINFO_REJECTED_MASK is returned d on error or pld is NULL. -*/ -lid_t -vcdinf_pld_get_lid(const PsdPlayListDescriptor_t *pld) -{ - return (pld != NULL) - ? uint16_from_be (pld->lid) & VCDINFO_LID_MASK - : VCDINFO_REJECTED_MASK; -} - -/** - \fn vcdinfo_pld_get_next_offset(const PsdPlayListDescriptor *pld); - \brief Get next offset for a given PSD selector descriptor. - \return VCDINFO_INVALID_OFFSET is returned on error or if pld has no "next" - entry or pld is NULL. Otherwise the LID offset is returned. - */ -uint16_t -vcdinf_pld_get_next_offset(const PsdPlayListDescriptor_t *pld) -{ - if (NULL == pld) return VCDINFO_INVALID_OFFSET; - return uint16_from_be (pld->next_ofs); -} - -/*! - Return number of items in LIDs. Return 0 if error or not found. -*/ -int -vcdinf_pld_get_noi (const PsdPlayListDescriptor_t *pld) -{ - if ( NULL == pld ) return 0; - return pld->noi; -} - -/*! - Return the playlist item i in d. -*/ -uint16_t -vcdinf_pld_get_play_item(const PsdPlayListDescriptor_t *pld, unsigned int i) -{ - if (NULL==pld) return 0; - return uint16_from_be(pld->itemid[i]); -} - -/** - \fn vcdinf_pld_get_prev_offset(const PsdPlayListDescriptor *pld); - \brief Get prev offset for a given PSD selector descriptor. - \return VCDINFO_INVALID_OFFSET is returned on error or if pld has no "prev" - entry or pld is NULL. Otherwise the LID offset is returned. - */ -uint16_t -vcdinf_pld_get_prev_offset(const PsdPlayListDescriptor_t *pld) -{ - return (pld != NULL) ? - uint16_from_be (pld->prev_ofs) : VCDINFO_INVALID_OFFSET; -} - -/** - \fn vcdinf_pld_get_return_offset(const PsdPlayListDescriptor *pld); - \brief Get return offset for a given PLD selector descriptor. - \return VCDINFO_INVALID_OFFSET is returned on error or if pld has no - "return" entry or pld is NULL. Otherwise the LID offset is returned. - */ -uint16_t -vcdinf_pld_get_return_offset(const PsdPlayListDescriptor_t *pld) -{ - return (pld != NULL) ? - uint16_from_be (pld->return_ofs) : VCDINFO_INVALID_OFFSET; -} - -/** - * \fn vcdinfo_psd_get_default_offset(const PsdSelectionListDescriptor *psd); - * \brief Get next offset for a given PSD selector descriptor. - * \return VCDINFO_INVALID_OFFSET is returned on error or if psd is - * NULL. Otherwise the LID offset is returned. - */ -uint16_t -vcdinf_psd_get_default_offset(const PsdSelectionListDescriptor_t *psd) -{ - if (NULL == psd) return VCDINFO_INVALID_OFFSET; - return uint16_from_be (psd->default_ofs); -} - -/*! - Get the item id for a given selection-list descriptor. - VCDINFO_REJECTED_MASK is returned on error or if psd is NULL. -*/ -uint16_t -vcdinf_psd_get_itemid(const PsdSelectionListDescriptor_t *psd) -{ - return (psd != NULL) ? uint16_from_be(psd->itemid) : VCDINFO_REJECTED_MASK; -} - -/*! - Get the LID from a given selection-list descriptor. - VCDINFO_REJECTED_MASK is returned on error or psd is NULL. -*/ -lid_t -vcdinf_psd_get_lid(const PsdSelectionListDescriptor_t *psd) -{ - return (psd != NULL) - ? uint16_from_be (psd->lid) & VCDINFO_LID_MASK - : VCDINFO_REJECTED_MASK; -} - -/*! - Get the LID rejected status for a given PSD selector descriptor. - true is also returned d is NULL. -*/ -bool -vcdinf_psd_get_lid_rejected(const PsdSelectionListDescriptor_t *psd) -{ - return (psd != NULL) - ? vcdinfo_is_rejected(uint16_from_be(psd->lid)) - : true; -} - -/** - * \fn vcdinf_psd_get_next_offset(const PsdSelectionListDescriptor *psd); - * \brief Get "next" offset for a given PSD selector descriptor. - * \return VCDINFO_INVALID_OFFSET is returned on error or if psd is - * NULL. Otherwise the LID offset is returned. - */ -uint16_t -vcdinf_psd_get_next_offset(const PsdSelectionListDescriptor_t *psd) -{ - if (NULL == psd) return VCDINFO_INVALID_OFFSET; - return uint16_from_be (psd->next_ofs); -} - -/** - * \fn vcdinf_psd_get_offset(const PsdSelectionListDescriptor *d, - * unsigned int entry_num); - * \brief Get offset entry_num for a given PSD selector descriptor. - * \return VCDINFO_INVALID_OFFSET is returned if d on error or d is - * NULL. Otherwise the LID offset is returned. - */ -uint16_t -vcdinf_psd_get_offset(const PsdSelectionListDescriptor_t *psd, - unsigned int entry_num) -{ - return (psd != NULL && entry_num < vcdinf_get_num_selections(psd)) - ? uint16_from_be (psd->ofs[entry_num]) : VCDINFO_INVALID_OFFSET; -} - -/** - \fn vcdinf_psd_get_prev_offset(const PsdSelectionListDescriptor *psd); - \brief Get "prev" offset for a given PSD selector descriptor. - \return VCDINFO_INVALID_OFFSET is returned on error or if psd has no "prev" - entry or psd is NULL. Otherwise the LID offset is returned. - */ -uint16_t -vcdinf_psd_get_prev_offset(const PsdSelectionListDescriptor_t *psd) -{ - return (psd != NULL) ? - uint16_from_be (psd->prev_ofs) : VCDINFO_INVALID_OFFSET; -} - -/** - * \fn vcdinf_psd_get_return_offset(const PsdSelectionListDescriptor *psd); - * \brief Get return offset for a given PSD selector descriptor. - \return VCDINFO_INVALID_OFFSET is returned on error or if psd has no - "return" entry or psd is NULL. Otherwise the LID offset is returned. - */ -uint16_t -vcdinf_psd_get_return_offset(const PsdSelectionListDescriptor_t *psd) -{ - return (psd != NULL) ? - uint16_from_be (psd->return_ofs) : VCDINFO_INVALID_OFFSET; -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/info.c b/src/input/vcd/libvcd/info.c deleted file mode 100644 index b01bd6eee..000000000 --- a/src/input/vcd/libvcd/info.c +++ /dev/null @@ -1,2103 +0,0 @@ -/* - $Id: info.c,v 1.8 2007/03/23 21:47:31 dsalt Exp $ - - Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com> - - 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 Foundation - Software, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ -/* - Things here refer to higher-level structures usually accessed via - vcdinfo_t. For lower-level access which generally use - structures other than vcdinfo_t, see inf.c -*/ - - -/* Private headers */ -#include "info_private.h" -#include "vcd_assert.h" -#include "pbc.h" -#include "util.h" -#include "vcd_read.h" - -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_STRING_H -#include <string.h> -#endif -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif - -#include <cdio/cdio.h> -#include <cdio/bytesex.h> -#include <cdio/cd_types.h> -#include <cdio/util.h> - -/* Eventually move above libvcd includes but having vcdinfo including. */ -#include <libvcd/info.h> - -#include <stdio.h> -#include <stddef.h> -#include <errno.h> - -static const char _rcsid[] = "$Id: info.c,v 1.8 2007/03/23 21:47:31 dsalt Exp $"; - -#define BUF_COUNT 16 -#define BUF_SIZE 80 - -/* Return a pointer to a internal free buffer */ -static char * -_getbuf (void) -{ - static char _buf[BUF_COUNT][BUF_SIZE]; - static int _num = -1; - - _num++; - _num %= BUF_COUNT; - - memset (_buf[_num], 0, BUF_SIZE); - - return _buf[_num]; -} - -/* - Initialize/allocate segment portion of vcdinfo_obj_t. - - Getting exact segments sizes is done in a rather complicated way. - A simple approach would be to use the fixed size allocated on disk, - but players have trouble with the internal fragmentation padding. - More accurate results are obtained by consulting with ISO 9660 - information for the corresponding file entry. - - Another approach to get segment sizes is to read/scan the - MPEGs. That would be rather slow. -*/ -static void -_init_segments (vcdinfo_obj_t *obj) -{ - InfoVcd_t *info = vcdinfo_get_infoVcd(obj); - segnum_t num_segments = vcdinfo_get_num_segments(obj); - CdioListNode *entnode; - CdioList *entlist; - int i; - lsn_t last_lsn=0; - - obj->first_segment_lsn = cdio_msf_to_lsn(&info->first_seg_addr); - obj->seg_sizes = _vcd_malloc( num_segments * sizeof(uint32_t *)); - - if (NULL == obj->seg_sizes || 0 == num_segments) return; - - entlist = iso9660_fs_readdir(obj->img, "SEGMENT", true); - - i=0; - _CDIO_LIST_FOREACH (entnode, entlist) { - iso9660_stat_t *statbuf = _cdio_list_node_data (entnode); - - if (statbuf->type == _STAT_DIR) continue; - - while(info->spi_contents[i].item_cont) { - obj->seg_sizes[i] = VCDINFO_SEGMENT_SECTOR_SIZE; - i++; - } - - /* Should have an entry in the ISO 9660 filesystem. Get and save - in statbuf.secsize this size. - */ - obj->seg_sizes[i] = statbuf->secsize; - - if (last_lsn >= statbuf->lsn) - vcd_warn ("Segments if ISO 9660 directory out of order lsn %ul >= %ul", - (unsigned int) last_lsn, (unsigned int) statbuf->lsn); - last_lsn = statbuf->lsn; - - i++; - } - - while(i < num_segments && info->spi_contents[i].item_cont) { - obj->seg_sizes[i] = VCDINFO_SEGMENT_SECTOR_SIZE; - i++; - } - - if (i != num_segments) - vcd_warn ("Number of segments found %d is not number of segments %d", - i, num_segments); - - _cdio_list_free (entlist, true); - - -#if 0 - /* Figure all of the segment sector sizes */ - for (i=0; i < num_segments; i++) { - - obj->seg_sizes[i] = VCDINFO_SEGMENT_SECTOR_SIZE; - - if ( !info->spi_contents[i].item_cont ) { - /* Should have an entry in the ISO 9660 filesystem. Get and save - in statbuf.secsize this size. - */ - lsn_t lsn = vcdinfo_get_seg_lsn(obj, i); - iso9660_stat_t *statbuf =iso9660_find_fs_lsn(obj->img, lsn); - if (NULL != statbuf) { - obj->seg_sizes[i] = statbuf->secsize; - free(statbuf); - } else { - vcd_warn ("Trouble finding ISO 9660 size for segment %d.", i); - } - } - } -#endif - -} - -/*! - Return the number of audio channels implied by "audio_type". - 0 is returned on error. -*/ -unsigned int -vcdinfo_audio_type_num_channels(const vcdinfo_obj_t *obj, - unsigned int audio_type) -{ - const int audio_types[2][5] = - { - { /* VCD 2.0 */ - 0, /* no audio*/ - 1, /* single channel */ - 1, /* stereo */ - 2, /* dual channel */ - 0}, /* error */ - - { /* SVCD, HQVCD */ - 0, /* no stream */ - 1, /* 1 stream */ - 2, /* 2 streams */ - 1, /* 1 multi-channel stream (surround sound) */ - 0} /* error */ - }; - - /* We should also check that the second index is in range too. */ - if (audio_type > 4) { - return 0; - } - - /* Get first index entry into above audio_type array from vcd_type */ - switch (obj->vcd_type) { - - case VCD_TYPE_VCD: - case VCD_TYPE_VCD11: - return 1; - - case VCD_TYPE_VCD2: - return 3; - break; - - case VCD_TYPE_HQVCD: - case VCD_TYPE_SVCD: - return audio_types[1][audio_type]; - break; - - case VCD_TYPE_INVALID: - default: - /* We have an invalid entry. Set to handle below. */ - return 0; - } -} - -/*! - Return a string describing an audio type. -*/ -const char * -vcdinfo_audio_type2str(const vcdinfo_obj_t *obj, unsigned int audio_type) -{ - const char *audio_types[3][5] = - { - /* INVALID, VCD 1.0, or VCD 1.1 */ - { "unknown", "invalid", "", "", "" }, - - /*VCD 2.0 */ - { "no audio", "single channel", "stereo", "dual channel", "error" }, - - /* SVCD, HQVCD */ - { "no stream", "1 stream", "2 streams", - "1 multi-channel stream (surround sound)", "error"}, - }; - - unsigned int first_index = 0; - - /* Get first index entry into above audio_type array from vcd_type */ - switch (obj->vcd_type) { - - case VCD_TYPE_VCD: - case VCD_TYPE_VCD11: - case VCD_TYPE_VCD2: - first_index=1; - break; - - case VCD_TYPE_HQVCD: - case VCD_TYPE_SVCD: - first_index=2; - break; - - case VCD_TYPE_INVALID: - default: - /* We have an invalid entry. Set to handle below. */ - audio_type=4; - } - - /* We should also check that the second index is in range too. */ - if (audio_type > 3) { - first_index=0; - audio_type=1; - } - - return audio_types[first_index][audio_type]; -} - -/*! - Note first seg_num is 0! -*/ -const char * -vcdinfo_ogt2str(const vcdinfo_obj_t *obj, segnum_t seg_num) -{ - const InfoVcd_t *info = &obj->info; - const char *ogt_str[] = - { - "None", - "1 available", - "0 & 1 available", - "all 4 available" - }; - - return ogt_str[info->spi_contents[seg_num].ogt]; -} - - -const char * -vcdinfo_video_type2str(const vcdinfo_obj_t *obj, segnum_t seg_num) -{ - const char *video_types[] = - { - "no stream", - "NTSC still", - "NTSC still (lo+hires)", - "NTSC motion", - "reserved (0x4)", - "PAL still", - "PAL still (lo+hires)", - "PAL motion", - "INVALID ENTRY" - }; - - return video_types[vcdinfo_get_video_type(obj, seg_num)]; -} - -/*! - \brief Classify itemid_num into the kind of item it is: track #, entry #, - segment #. - \param itemid is set to contain this classification an the converted - entry number. -*/ -void -vcdinfo_classify_itemid (uint16_t itemid_num, - /*out*/ vcdinfo_itemid_t *itemid) -{ - - itemid->num = itemid_num; - if (itemid_num < 2) - itemid->type = VCDINFO_ITEM_TYPE_NOTFOUND; - else if (itemid_num < MIN_ENCODED_TRACK_NUM) { - itemid->type = VCDINFO_ITEM_TYPE_TRACK; - itemid->num--; - } else if (itemid_num < 600) { - itemid->type = VCDINFO_ITEM_TYPE_ENTRY; - itemid->num -= MIN_ENCODED_TRACK_NUM; - } else if (itemid_num < MIN_ENCODED_SEGMENT_NUM) - itemid->type = VCDINFO_ITEM_TYPE_LID; - else if (itemid_num <= MAX_ENCODED_SEGMENT_NUM) { - itemid->type = VCDINFO_ITEM_TYPE_SEGMENT; - itemid->num -= (MIN_ENCODED_SEGMENT_NUM); - } else - itemid->type = VCDINFO_ITEM_TYPE_SPAREID2; -} - -const char * -vcdinfo_pin2str (uint16_t itemid_num) -{ - char *buf = _getbuf (); - vcdinfo_itemid_t itemid; - - vcdinfo_classify_itemid(itemid_num, &itemid); - strcpy (buf, "??"); - - switch(itemid.type) { - case VCDINFO_ITEM_TYPE_NOTFOUND: - snprintf (buf, BUF_SIZE, "play nothing (0x%4.4x)", itemid.num); - break; - case VCDINFO_ITEM_TYPE_TRACK: - snprintf (buf, BUF_SIZE, "SEQUENCE[%d] (0x%4.4x)", itemid.num-1, - itemid_num); - break; - case VCDINFO_ITEM_TYPE_ENTRY: - snprintf (buf, BUF_SIZE, "ENTRY[%d] (0x%4.4x)", itemid.num, itemid_num); - break; - case VCDINFO_ITEM_TYPE_SEGMENT: - snprintf (buf, BUF_SIZE, "SEGMENT[%d] (0x%4.4x)", itemid.num, itemid_num); - break; - case VCDINFO_ITEM_TYPE_LID: - snprintf (buf, BUF_SIZE, "spare id (0x%4.4x)", itemid.num); - break; - case VCDINFO_ITEM_TYPE_SPAREID2: - snprintf (buf, BUF_SIZE, "spare id2 (0x%4.4x)", itemid.num); - break; - } - - return buf; -} - -/*! - Return a string containing the VCD album id, or NULL if there is - some problem in getting this. -*/ -const char * -vcdinfo_get_album_id(const vcdinfo_obj_t *obj) -{ - if ( NULL == obj ) return (NULL); - return vcdinf_get_album_id(&obj->info); -} - -/*! - Return the VCD ID. - NULL is returned if there is some problem in getting this. -*/ -char * -vcdinfo_get_application_id(vcdinfo_obj_t *p_obj) -{ - if ( NULL == p_obj ) return (NULL); - return iso9660_get_application_id(&p_obj->pvd); -} - -/*! - Return a pointer to the cdio structure for the CD image opened or - NULL if error. -*/ -CdIo * -vcdinfo_get_cd_image (const vcdinfo_obj_t *vcd_obj) -{ - if (NULL == vcd_obj) return NULL; - return vcd_obj->img; -} - - -/*! - \fn vcdinfo_selection_get_lid(const vcdinfo_obj_t *obj, lid_t lid, - unsigned int selection); - - \brief Get offset of a selection for a given lid. - - Return the LID offset associated with a the selection number of the - passed-in LID parameter. - - \return VCDINFO_INVALID_LID is returned if obj on error or obj - is NULL. Otherwise the LID offset is returned. -*/ -lid_t vcdinfo_selection_get_lid(const vcdinfo_obj_t *obj, lid_t lid, - unsigned int selection) -{ - unsigned int offset; - - if (NULL == obj) return VCDINFO_INVALID_LID; - - offset = vcdinfo_selection_get_offset(obj, lid, selection); - switch (offset) { - case VCDINFO_INVALID_OFFSET: - case PSD_OFS_MULTI_DEF: - case PSD_OFS_MULTI_DEF_NO_NUM: - return VCDINFO_INVALID_LID; - default: - { - vcdinfo_offset_t *ofs = vcdinfo_get_offset_t(obj, offset); - return ofs->lid; - } - } -} - -/*! - \fn vcdinfo_selection_get_offset(const vcdinfo_obj_t *obj, lid_t lid, - unsigned int selection); - - \brief Get offset of a selection for a given lid. - - Return the LID offset associated with a the selection number of the - passed-in LID parameter. - - \return VCDINFO_INVALID_OFFSET is returned if error, obj is NULL or - the lid is not some type of selection list. Otherwise the LID offset - is returned. -*/ -uint16_t vcdinfo_selection_get_offset(const vcdinfo_obj_t *obj, lid_t lid, - unsigned int selection) -{ - unsigned int bsn; - - PsdListDescriptor_t pxd; - vcdinfo_lid_get_pxd(obj, &pxd, lid); - if (pxd.descriptor_type != PSD_TYPE_SELECTION_LIST && - pxd.descriptor_type != PSD_TYPE_EXT_SELECTION_LIST) { - vcd_warn( "Requesting selection of LID %i which not a selection list -" - " type is 0x%x", - lid, pxd.descriptor_type ); - return VCDINFO_INVALID_OFFSET; - } - - bsn=vcdinf_get_bsn(pxd.psd); - - if ( (selection - bsn + 1) > 0) { - return vcdinfo_lid_get_offset(obj, lid, selection-bsn+1); - } else { - vcd_warn( "Selection number %u too small. bsn %u", selection, bsn ); - return VCDINFO_INVALID_OFFSET; - } -} - -/** - \fn vcdinfo_get_default_offset(const vcdinfo_obj_t *obj, unsinged int lid); - \brief Get return offset for a given PLD selector descriptor. - \return VCDINFO_INVALID_OFFSET is returned on error or if pld has no - "return" entry or pld is NULL. Otherwise the LID offset is returned. - */ -uint16_t -vcdinfo_get_default_offset(const vcdinfo_obj_t *obj, lid_t lid) -{ - if (NULL != obj) { - - PsdListDescriptor_t pxd; - - vcdinfo_lid_get_pxd(obj, &pxd, lid); - - switch (pxd.descriptor_type) { - case PSD_TYPE_EXT_SELECTION_LIST: - case PSD_TYPE_SELECTION_LIST: - return vcdinf_psd_get_default_offset(pxd.psd); - break; - case PSD_TYPE_PLAY_LIST: - case PSD_TYPE_END_LIST: - case PSD_TYPE_COMMAND_LIST: - break; - } - } - return VCDINFO_INVALID_OFFSET; -} - -/*! - \brief Get default or multi-default LID. - - Return the LID offset associated with a the "default" entry of the - passed-in LID parameter. Note "default" entries are associated - with PSDs that are (extended) selection lists. If the "default" - offset is a multi-default, we use entry_num to find the proper - "default" LID. Otherwise this routine is exactly like - vcdinfo_get_default_lid with the exception of requiring an - additional "entry_num" parameter. - - \return VCDINFO_INVALID_LID is returned on error, or if the LID - is not a selection list or no "default" entry. Otherwise the LID - offset is returned. -*/ -lid_t -vcdinfo_get_multi_default_lid(const vcdinfo_obj_t *obj, lid_t lid, - lsn_t lsn) -{ - unsigned int offset; - unsigned int entry_num; - - entry_num = vcdinfo_lsn_get_entry(obj, lsn); - offset = vcdinfo_get_multi_default_offset(obj, lid, entry_num); - - switch (offset) { - case VCDINFO_INVALID_OFFSET: - case PSD_OFS_MULTI_DEF: - case PSD_OFS_MULTI_DEF_NO_NUM: - return VCDINFO_INVALID_LID; - default: - { - vcdinfo_offset_t *ofs = vcdinfo_get_offset_t(obj, offset); - return ofs->lid; - } - } -} - -/*! - \brief Get default or multi-default LID offset. - - Return the LID offset associated with a the "default" entry of the - passed-in LID parameter. Note "default" entries are associated - with PSDs that are (extended) selection lists. If the "default" - offset is a multi-default, we use entry_num to find the proper - "default" offset. Otherwise this routine is exactly like - vcdinfo_get_default_offset with the exception of requiring an - additional "entry_num" parameter. - - \return VCDINFO_INVALID_OFFSET is returned on error, or if the LID - is not a selection list or no "default" entry. Otherwise the LID - offset is returned. -*/ -uint16_t -vcdinfo_get_multi_default_offset(const vcdinfo_obj_t *obj, lid_t lid, - unsigned int entry_num) -{ - uint16_t offset=vcdinfo_get_default_offset(obj, lid); - - switch (offset) { - case PSD_OFS_MULTI_DEF: - case PSD_OFS_MULTI_DEF_NO_NUM: - { - /* Have some work todo... Figure the selection number. */ - PsdListDescriptor_t pxd; - - vcdinfo_lid_get_pxd(obj, &pxd, lid); - - switch (pxd.descriptor_type) { - - case PSD_TYPE_SELECTION_LIST: - case PSD_TYPE_EXT_SELECTION_LIST: { - vcdinfo_itemid_t selection_itemid; - uint16_t selection_itemid_num; - unsigned int start_entry_num; - - if (pxd.psd == NULL) return VCDINFO_INVALID_OFFSET; - selection_itemid_num = vcdinf_psd_get_itemid(pxd.psd); - vcdinfo_classify_itemid(selection_itemid_num, &selection_itemid); - if (selection_itemid.type != VCDINFO_ITEM_TYPE_TRACK) { - return VCDINFO_INVALID_OFFSET; - } - - start_entry_num = vcdinfo_track_get_entry(obj, selection_itemid.num); - return vcdinfo_selection_get_offset(obj, lid, - entry_num-start_entry_num); - } - default: ; - } - } - default: - return VCDINFO_INVALID_OFFSET; - } -} - -/*! - Return a string containing the default VCD device if none is specified. - Return NULL we can't get this information. -*/ -char * -vcdinfo_get_default_device (const vcdinfo_obj_t *vcd_obj) -{ - - /* If device not already open, then we'll open it temporarily and - let CdIo select a driver, get the default for that and then - close/destroy the temporary we created. - */ - CdIo *cdio=NULL; - if (vcd_obj != NULL && vcd_obj->img != NULL) - cdio = vcd_obj->img; - - return cdio_get_default_device(cdio); -} - -/*! - Return number of sector units in of an entry. 0 is returned if entry_num - is out of range. - The first entry number is 0. -*/ -uint32_t -vcdinfo_get_entry_sect_count (const vcdinfo_obj_t *obj, unsigned int entry_num) -{ - const EntriesVcd_t *entries = &obj->entries; - const unsigned int entry_count = vcdinf_get_num_entries(entries); - if (entry_num > entry_count) - return 0; - else { - const lsn_t this_lsn = vcdinfo_get_entry_lsn(obj, entry_num); - lsn_t next_lsn; - if (entry_num < entry_count-1) { - track_t track=vcdinfo_get_track(obj, entry_num); - track_t next_track=vcdinfo_get_track(obj, entry_num+1); - next_lsn = vcdinfo_get_entry_lsn(obj, entry_num+1); - /* If we've changed tracks, don't include pregap sector between - tracks. - */ - if (track != next_track) next_lsn -= CDIO_PREGAP_SECTORS; - } else { - /* entry_num == entry_count -1. Or the last entry. - This is really really ugly. There's probably a better - way to do it. - Below we get the track of the current entry and then the LBA of the - beginning of the following (leadout?) track. - - Wait! It's uglier than that! Since VCD's can be created - *without* a pregap to the leadout track, we try not to use - that if we can get the entry from the ISO 9660 filesystem. - */ - track_t track = vcdinfo_get_track(obj, entry_num); - if (track != VCDINFO_INVALID_TRACK) { - iso9660_stat_t *statbuf; - const lsn_t lsn = vcdinfo_get_track_lsn(obj, track); - - /* Try to get the sector count from the ISO 9660 filesystem */ - statbuf = iso9660_find_fs_lsn(obj->img, lsn); - - if (NULL != statbuf) { - next_lsn = lsn + statbuf->secsize; - free(statbuf); - } else { - /* Failed on ISO 9660 filesystem. Use next track or - LEADOUT track. */ - next_lsn = vcdinfo_get_track_lsn(obj, track+1); - } - if (next_lsn == VCDINFO_NULL_LSN) - return 0; - } else { - /* Something went wrong. Set up size to zero. */ - return 0; - } - } - return (next_lsn - this_lsn); - } -} - -/*! Return the starting MSF (minutes/secs/frames) for sequence - entry_num in obj. NULL is returned if there is no entry. - The first entry number is 0. -*/ -const msf_t * -vcdinfo_get_entry_msf(const vcdinfo_obj_t *obj, unsigned int entry_num) -{ - const EntriesVcd_t *entries = &obj->entries; - return vcdinf_get_entry_msf(entries, entry_num); -} - -/*! Return the starting LBA (logical block address) for sequence - entry_num in obj. VCDINFO_NULL_LBA is returned if there is no entry. -*/ -lba_t -vcdinfo_get_entry_lba(const vcdinfo_obj_t *obj, unsigned int entry_num) -{ - if ( NULL == obj ) return VCDINFO_NULL_LBA; - else { - const msf_t *msf = vcdinfo_get_entry_msf(obj, entry_num); - msf = vcdinfo_get_entry_msf(obj, entry_num); - return (msf != NULL) ? cdio_msf_to_lba(msf) : VCDINFO_NULL_LBA; - } -} - -/*! Return the starting LBA (logical block address) for sequence - entry_num in obj. VCDINFO_NULL_LBA is returned if there is no entry. -*/ -lsn_t -vcdinfo_get_entry_lsn(const vcdinfo_obj_t *obj, unsigned int entry_num) -{ - if ( NULL == obj ) return VCDINFO_NULL_LBA; - else { - const msf_t *msf = vcdinfo_get_entry_msf(obj, entry_num); - return (msf != NULL) ? cdio_msf_to_lsn(msf) : VCDINFO_NULL_LSN; - } -} - -EntriesVcd_t * -vcdinfo_get_entriesVcd (vcdinfo_obj_t *obj) -{ - if (NULL == obj) return NULL; - return &obj->entries; -} - -/*! - Get the VCD format (VCD 1.0 VCD 1.1, SVCD, ... for this object. - The type is also set inside obj. -*/ -vcd_type_t -vcdinfo_get_format_version (vcdinfo_obj_t *obj) -{ - return obj->vcd_type; -} - -/*! - Return a string giving VCD format (VCD 1.0 VCD 1.1, SVCD, ... - for this object. -*/ -const char * -vcdinfo_get_format_version_str (const vcdinfo_obj_t *obj) -{ - if (NULL == obj) return "*Uninitialized*"; - return vcdinf_get_format_version_str(obj->vcd_type); -} - -InfoVcd_t * -vcdinfo_get_infoVcd (vcdinfo_obj_t *obj) -{ - if (NULL == obj) return NULL; - return &obj->info; -} - -/*! Return the entry number closest and before the given LSN. - */ -unsigned int -vcdinfo_lsn_get_entry(const vcdinfo_obj_t *obj, lsn_t lsn) -{ - - /* Do a binary search to find the entry. */ - unsigned int i = 0; - unsigned int j = vcdinfo_get_num_entries(obj); - unsigned int mid; - unsigned int mid_lsn; - do { - mid = (i+j)/2; - mid_lsn = vcdinfo_get_entry_lsn(obj, mid); - if ( lsn <= mid_lsn ) j = mid-1; - if ( lsn >= mid_lsn ) i = mid+1; - } while (i <= j); - - /* We want the entry closest but before. */ - return (lsn == mid_lsn) ? mid : mid-1; -} - - -void * -vcdinfo_get_pvd (vcdinfo_obj_t *obj) -{ - if (NULL == obj) return NULL; - return &obj->pvd; -} - -void * -vcdinfo_get_scandata (vcdinfo_obj_t *obj) -{ - if (NULL == obj) return NULL; - return obj->scandata_buf; -} - -void * -vcdinfo_get_searchDat (vcdinfo_obj_t *obj) -{ - if (NULL == obj) return NULL; - return obj->search_buf; -} - -void * -vcdinfo_get_tracksSVD (vcdinfo_obj_t *obj) -{ - if (NULL == obj) return NULL; - return obj->tracks_buf; -} - -/*! - Get the itemid for a given list ID. - VCDINFO_REJECTED_MASK is returned on error or if obj is NULL. -*/ -uint16_t -vcdinfo_lid_get_itemid(const vcdinfo_obj_t *obj, lid_t lid) -{ - PsdListDescriptor_t pxd; - - if (obj == NULL) return VCDINFO_REJECTED_MASK; - vcdinfo_lid_get_pxd(obj, &pxd, lid); - switch (pxd.descriptor_type) { - case PSD_TYPE_SELECTION_LIST: - case PSD_TYPE_EXT_SELECTION_LIST: - if (pxd.psd == NULL) return VCDINFO_REJECTED_MASK; - return vcdinf_psd_get_itemid(pxd.psd); - break; - case PSD_TYPE_PLAY_LIST: - /* FIXME: There is an array of items */ - case PSD_TYPE_END_LIST: - case PSD_TYPE_COMMAND_LIST: - return VCDINFO_REJECTED_MASK; - } - - return VCDINFO_REJECTED_MASK; - -} - -/*! - Get the LOT pointer. -*/ -LotVcd_t * -vcdinfo_get_lot(const vcdinfo_obj_t *obj) -{ - if (NULL == obj) return NULL; - return obj->lot; -} - -/*! - Get the extended LOT pointer. -*/ -LotVcd_t * -vcdinfo_get_lot_x(const vcdinfo_obj_t *obj) -{ - if (NULL == obj) return NULL; - return obj->lot_x; -} - -/*! - Return number of LIDs. -*/ -lid_t -vcdinfo_get_num_LIDs (const vcdinfo_obj_t *obj) -{ - /* Should probably use _vcd_pbc_max_lid instead? */ - if (NULL==obj) return 0; - return vcdinf_get_num_LIDs(&obj->info); -} - -/*! - Return the number of entries in the VCD. -*/ -unsigned int -vcdinfo_get_num_entries(const vcdinfo_obj_t *obj) -{ - const EntriesVcd_t *entries = &obj->entries; - return vcdinf_get_num_entries(entries); -} - -/*! - Return the number of segments in the VCD. Return 0 if there is some - problem. -*/ -segnum_t -vcdinfo_get_num_segments(const vcdinfo_obj_t *obj) -{ - if (NULL==obj) return 0; - return vcdinf_get_num_segments(&obj->info); -} - -/*! - \fn vcdinfo_get_offset_lid(const vcdinfo_obj_t *obj, unsigned int entry_num); - \brief Get offset entry_num for a given LID. - \return VCDINFO_INVALID_OFFSET is returned if obj on error or obj - is NULL. Otherwise the LID offset is returned. -*/ -uint16_t -vcdinfo_lid_get_offset(const vcdinfo_obj_t *obj, lid_t lid, - unsigned int entry_num) -{ - PsdListDescriptor_t pxd; - - if (obj == NULL) return VCDINFO_INVALID_OFFSET; - vcdinfo_lid_get_pxd(obj, &pxd, lid); - - switch (pxd.descriptor_type) { - case PSD_TYPE_SELECTION_LIST: - case PSD_TYPE_EXT_SELECTION_LIST: - if (pxd.psd == NULL) return VCDINFO_INVALID_OFFSET; - return vcdinf_psd_get_offset(pxd.psd, entry_num-1); - break; - case PSD_TYPE_PLAY_LIST: - /* FIXME: There is an array of items */ - case PSD_TYPE_END_LIST: - case PSD_TYPE_COMMAND_LIST: - return VCDINFO_INVALID_OFFSET; - } - return VCDINFO_INVALID_OFFSET; - -} - -/*! - NULL is returned on error. -*/ -static vcdinfo_offset_t * -_vcdinfo_get_offset_t (const vcdinfo_obj_t *obj, unsigned int offset, bool ext) -{ - CdioListNode *node; - CdioList *offset_list = ext ? obj->offset_x_list : obj->offset_list; - - switch (offset) { - case PSD_OFS_DISABLED: - case PSD_OFS_MULTI_DEF: - case PSD_OFS_MULTI_DEF_NO_NUM: - return NULL; - default: ; - } - - _CDIO_LIST_FOREACH (node, offset_list) - { - vcdinfo_offset_t *ofs = _cdio_list_node_data (node); - if (offset == ofs->offset) - return ofs; - } - return NULL; -} - -/*! - Get the VCD info list. -*/ -CdioList * -vcdinfo_get_offset_list(const vcdinfo_obj_t *obj) -{ - if (NULL == obj) return NULL; - return obj->offset_list; -} - - -/*! - Get the VCD info extended offset list. -*/ -CdioList * -vcdinfo_get_offset_x_list(const vcdinfo_obj_t *obj) -{ - if (NULL == obj) return NULL; - return obj->offset_x_list; -} - -/*! - Get the VCD info offset multiplier. -*/ -unsigned int vcdinfo_get_offset_mult(const vcdinfo_obj_t *obj) -{ - if (NULL == obj) return 0xFFFF; - return obj->info.offset_mult; -} - -/*! - Get entry in offset list for the item that has offset. This entry - has for example the LID. NULL is returned on error. -*/ -vcdinfo_offset_t * -vcdinfo_get_offset_t (const vcdinfo_obj_t *obj, unsigned int offset) -{ - vcdinfo_offset_t *off_p= _vcdinfo_get_offset_t (obj, offset, true); - if (NULL != off_p) - return off_p; - return _vcdinfo_get_offset_t (obj, offset, false); -} - -/*! - Return a string containing the VCD publisher id with trailing - blanks removed, or NULL if there is some problem in getting this. -*/ -const char * -vcdinfo_get_preparer_id(const vcdinfo_obj_t *obj) -{ - if ( NULL == obj ) return (NULL); - return iso9660_get_preparer_id(&obj->pvd); -} - -/*! - Get the PSD. -*/ -uint8_t * -vcdinfo_get_psd(const vcdinfo_obj_t *obj) -{ - if ( NULL == obj ) return (NULL); - return obj->psd; -} - -/*! - Get the extended PSD. -*/ -uint8_t * -vcdinfo_get_psd_x(const vcdinfo_obj_t *obj) -{ - if ( NULL == obj ) return (NULL); - return obj->psd_x; -} - -/*! - Return number of bytes in PSD. Return 0 if there's an error. -*/ -uint32_t -vcdinfo_get_psd_size (const vcdinfo_obj_t *obj) -{ - if ( NULL == obj ) return 0; - return vcdinf_get_psd_size(&obj->info); -} - -/*! - Return number of bytes in the extended PSD. Return 0 if there's an error. -*/ -uint32_t -vcdinfo_get_psd_x_size (const vcdinfo_obj_t *obj) -{ - if ( NULL == obj ) return 0; - return obj->psd_x_size; -} - -/*! - Return a string containing the VCD publisher id with trailing - blanks removed, or NULL if there is some problem in getting this. -*/ -char * -vcdinfo_get_publisher_id(const vcdinfo_obj_t *obj) -{ - if ( NULL == obj ) return (NULL); - return iso9660_get_publisher_id(&obj->pvd); -} - -/*! - Get the PSD Selection List Descriptor for a given lid. - NULL is returned if error or not found. -*/ -static bool -_vcdinfo_lid_get_pxd(const vcdinfo_obj_t *obj, PsdListDescriptor_t *pxd, - uint16_t lid, bool ext) -{ - CdioListNode *node; - unsigned mult = obj->info.offset_mult; - const uint8_t *psd = ext ? obj->psd_x : obj->psd; - CdioList *offset_list = ext ? obj->offset_x_list : obj->offset_list; - - if (offset_list == NULL) return false; - - _CDIO_LIST_FOREACH (node, offset_list) - { - vcdinfo_offset_t *ofs = _cdio_list_node_data (node); - unsigned _rofs = ofs->offset * mult; - - pxd->descriptor_type = psd[_rofs]; - - switch (pxd->descriptor_type) - { - case PSD_TYPE_PLAY_LIST: - { - pxd->pld = (PsdPlayListDescriptor_t *) (psd + _rofs); - if (vcdinf_pld_get_lid(pxd->pld) == lid) { - return true; - } - break; - } - - case PSD_TYPE_EXT_SELECTION_LIST: - case PSD_TYPE_SELECTION_LIST: - { - pxd->psd = (PsdSelectionListDescriptor_t *) (psd + _rofs); - if (vcdinf_psd_get_lid(pxd->psd) == lid) { - return true; - } - break; - } - default: ; - } - } - return false; -} - -/*! - Get the PSD Selection List Descriptor for a given lid. - False is returned if not found. -*/ -bool -vcdinfo_lid_get_pxd(const vcdinfo_obj_t *obj, PsdListDescriptor_t *pxd, - uint16_t lid) -{ - if (_vcdinfo_lid_get_pxd(obj, pxd, lid, true)) - return true; - return _vcdinfo_lid_get_pxd(obj, pxd, lid, false); -} - -/** - \fn vcdinfo_get_return_offset(const vcdinfo_obj_t *obj); - \brief Get return offset for a given LID. - \return VCDINFO_INVALID_OFFSET is returned on error or if LID has no - "return" entry. Otherwise the LID offset is returned. - */ -uint16_t -vcdinfo_get_return_offset(const vcdinfo_obj_t *obj, lid_t lid) -{ - if (NULL != obj) { - - PsdListDescriptor_t pxd; - - vcdinfo_lid_get_pxd(obj, &pxd, lid); - - switch (pxd.descriptor_type) { - case PSD_TYPE_PLAY_LIST: - return vcdinf_pld_get_return_offset(pxd.pld); - case PSD_TYPE_SELECTION_LIST: - case PSD_TYPE_EXT_SELECTION_LIST: - return vcdinf_psd_get_return_offset(pxd.psd); - break; - case PSD_TYPE_END_LIST: - case PSD_TYPE_COMMAND_LIST: - break; - } - } - - return VCDINFO_INVALID_OFFSET; -} - -/*! - Return the audio type for a given segment. - VCDINFO_INVALID_AUDIO_TYPE is returned on error. -*/ -unsigned int -vcdinfo_get_seg_audio_type(const vcdinfo_obj_t *obj, segnum_t seg_num) -{ - if ( NULL == obj || NULL == &obj->info - || seg_num >= vcdinfo_get_num_segments(obj) ) - return VCDINFO_INVALID_AUDIO_TYPE; - return(obj->info.spi_contents[seg_num].audio_type); -} - -/*! - Return true if this segment is supposed to continue to the next one, - (is part of an "item" or listing in the ISO 9660 filesystem). -*/ -bool -vcdinfo_get_seg_continue(const vcdinfo_obj_t *obj, segnum_t seg_num) -{ - if ( NULL == obj || NULL == &obj->info - || seg_num >= vcdinfo_get_num_segments(obj) ) - return false; - return(obj->info.spi_contents[seg_num].item_cont); -} - -/*! Return the starting LBA (logical block address) for segment - entry_num in obj. VCDINFO_LBA_NULL is returned if there is no entry. - - Note first seg_num is 0. -*/ -lba_t -vcdinfo_get_seg_lba(const vcdinfo_obj_t *obj, segnum_t seg_num) -{ - if (obj == NULL) return VCDINFO_NULL_LBA; - return cdio_lsn_to_lba(vcdinfo_get_seg_lba(obj, seg_num)); -} - -/*! Return the starting LBA (logical block address) for segment - entry_num in obj. VCDINFO_LSN_NULL is returned if there is no entry. - - Note first seg_num is 0. -*/ -lsn_t -vcdinfo_get_seg_lsn(const vcdinfo_obj_t *obj, segnum_t seg_num) -{ - if (obj == NULL || seg_num >= vcdinfo_get_num_segments(obj)) - return VCDINFO_NULL_LSN; - return obj->first_segment_lsn + (VCDINFO_SEGMENT_SECTOR_SIZE * seg_num); -} - -/*! Return the starting MSF (minutes/secs/frames) for segment - entry_num in obj. NULL is returned if there is no entry. - - Note first seg_num is 0! -*/ -const msf_t * -vcdinfo_get_seg_msf(const vcdinfo_obj_t *obj, segnum_t seg_num) -{ - if (obj == NULL || seg_num >= vcdinfo_get_num_segments(obj)) - return NULL; - else { - lsn_t lsn = vcdinfo_get_seg_lsn(obj, seg_num); - static msf_t msf; - cdio_lsn_to_msf(lsn, &msf); - return &msf; - } -} - -/*! Return the x-y resolution for a given segment. - Note first i_seg is 0. -*/ -void -vcdinfo_get_seg_resolution(const vcdinfo_obj_t *p_vcdinfo, segnum_t i_seg, - /*out*/ uint16_t *max_x, /*out*/ uint16_t *max_y) -{ - vcdinfo_video_segment_type_t segtype - = vcdinfo_get_video_type(p_vcdinfo, i_seg); - segnum_t i_segs = vcdinfo_get_num_segments(p_vcdinfo); - - if (i_seg >= i_segs) return; - - switch (segtype) { - case VCDINFO_FILES_VIDEO_NTSC_STILL: - *max_x = 704; - *max_y = 480; - break; - case VCDINFO_FILES_VIDEO_NTSC_STILL2: - *max_x = 352; - *max_y = 240; - break; - case VCDINFO_FILES_VIDEO_PAL_STILL: - *max_x = 704; - *max_y = 576; - break; - case VCDINFO_FILES_VIDEO_PAL_STILL2: - *max_x = 352; - *max_y = 288; - break; - default: - /* */ - switch (vcdinfo_get_format_version(p_vcdinfo)) { - case VCD_TYPE_VCD: - *max_x = 352; - *max_y = 240; - break; - case VCD_TYPE_VCD11: - case VCD_TYPE_VCD2: - *max_x = 352; - switch(segtype) { - case VCDINFO_FILES_VIDEO_NTSC_MOTION: - *max_y = 240; - break; - case VCDINFO_FILES_VIDEO_PAL_MOTION: - *max_y = 288; - default: - *max_y = 289; - } - break; - default: ; - } - } -} - - - -/*! - Return the number of sectors for segment - entry_num in obj. 0 is returned if there is no entry. - - Use this routine to figure out the actual number of bytes a physical - region of a disk or CD takes up for a segment. - - If an item has been broken up into a number of "continued" segments, - we will report the item size for the first segment and 0 for the - remaining ones. We may revisit this decision later. -*/ -uint32_t -vcdinfo_get_seg_sector_count(const vcdinfo_obj_t *obj, segnum_t seg_num) -{ - if (obj == NULL || seg_num >= vcdinfo_get_num_segments(obj)) - return 0; - return obj->seg_sizes[seg_num]; -} - -/*! - Return a string containing the VCD system id with trailing - blanks removed, or NULL if there is some problem in getting this. -*/ -const char * -vcdinfo_get_system_id(const vcdinfo_obj_t *obj) -{ - if ( NULL == obj || NULL == &obj->pvd ) return (NULL); - return(iso9660_get_system_id(&obj->pvd)); -} - -/*! - Return the track number for entry n in obj. - - In contrast to libcdio we start numbering at 0 which is the - ISO9660 and metadata information for the Video CD. Thus track - 1 is the first track the first complete MPEG track generally. -*/ -track_t -vcdinfo_get_track(const vcdinfo_obj_t *obj, const unsigned int entry_num) -{ - const EntriesVcd_t *entries = &obj->entries; - const unsigned int entry_count = vcdinf_get_num_entries(entries); - /* Note entry_num is 0 origin. */ - return entry_num < entry_count ? - vcdinf_get_track(entries, entry_num)-1: VCDINFO_INVALID_TRACK; -} - -/*! - Return the audio type for a given track. - VCDINFO_INVALID_AUDIO_TYPE is returned on error. - - Note: track 1 is usually the first track. -*/ -unsigned int -vcdinfo_get_track_audio_type(const vcdinfo_obj_t *obj, track_t track_num) -{ - TracksSVD *tracks; - TracksSVD2 *tracks2; - if ( NULL == obj || NULL == &obj->info ) return VCDINFO_INVALID_AUDIO_TYPE; - tracks = obj->tracks_buf; - - if ( NULL == tracks ) return 0; - tracks2 = (TracksSVD2 *) &(tracks->playing_time[tracks->tracks]); - return(tracks2->contents[track_num-1].audio); -} - -/*! - Return the highest track number in the current medium. - - Because we track start numbering at 0 (which is the ISO 9660 track - containing Video CD naviagion and disk information), this is one - less than the number of tracks. - - If there are no tracks, we return -1. -*/ -unsigned int -vcdinfo_get_num_tracks(const vcdinfo_obj_t *obj) -{ - if (obj == NULL || obj->img == NULL) return 0; - - return cdio_get_num_tracks(obj->img)-1; -} - - -/*! - Return the starting LBA (logical block address) for track number - track_num in obj. - - The IS0-9660 filesystem track has number 0. Tracks associated - with playable entries numbers start at 1. - - The "leadout" track is specified either by - using track_num LEADOUT_TRACK or the total tracks+1. - VCDINFO_NULL_LBA is returned on failure. -*/ -lba_t -vcdinfo_get_track_lba(const vcdinfo_obj_t *obj, track_t track_num) -{ - if (NULL == obj || NULL == obj->img) - return VCDINFO_NULL_LBA; - - - /* CdIo tracks start at 1 rather than 0. */ - return cdio_get_track_lba(obj->img, track_num+1); -} - -/*! - Return the starting LSN (logical sector number) for track number - track_num in obj. - - The IS0-9660 filesystem track has number 0. Tracks associated - with playable entries numbers start at 1. - - The "leadout" track is specified either by - using track_num LEADOUT_TRACK or the total tracks+1. - VCDINFO_NULL_LBA is returned on failure. -*/ -lsn_t -vcdinfo_get_track_lsn(const vcdinfo_obj_t *obj, track_t track_num) -{ - if (NULL == obj || NULL == obj->img) - return VCDINFO_NULL_LSN; - - /* CdIo tracks start at 1 rather than 0. */ - return cdio_get_track_lsn(obj->img, track_num+1); -} - -/*! - Return the starting MSF (minutes/secs/frames) for track number - track_num in obj. - - The IS0-9660 filesystem track has number 0. Tracks associated - with playable entries numbers start at 1. - - The "leadout" track is specified either by - using track_num LEADOUT_TRACK or the total tracks+1. - VCDINFO_NULL_LBA is returned on failure. -*/ -int -vcdinfo_get_track_msf(const vcdinfo_obj_t *obj, track_t track_num, - uint8_t *min, uint8_t *sec, uint8_t *frame) -{ - msf_t msf; - - if (NULL == obj || NULL == obj->img) - return 1; - - /* CdIo tracks start at 1 rather than 0. */ - if (cdio_get_track_msf(obj->img, track_num+1, &msf)) { - *min = cdio_from_bcd8(msf.m); - *sec = cdio_from_bcd8(msf.s); - *frame = cdio_from_bcd8(msf.f); - return 0; - } - - return 1; -} - -/*! - Return the size in sectors for track n. - - The IS0-9660 filesystem track has number 0. Tracks associated - with playable entries numbers start at 1. - - FIXME: Whether we count the track pregap sectors is a bit haphazard. - We should add a parameter to indicate whether this is wanted or not. - -*/ -unsigned int -vcdinfo_get_track_sect_count(const vcdinfo_obj_t *obj, const track_t track_num) -{ - if (NULL == obj || VCDINFO_INVALID_TRACK == track_num) - return 0; - - { - iso9660_stat_t *statbuf; - const lsn_t lsn = vcdinfo_get_track_lsn(obj, track_num); - - /* Try to get the sector count from the ISO 9660 filesystem */ - if (obj->has_xa && (statbuf = iso9660_find_fs_lsn(obj->img, lsn))) { - unsigned int secsize = statbuf->secsize; - free(statbuf); - return secsize; - } else { - const lsn_t next_lsn=vcdinfo_get_track_lsn(obj, track_num+1); - /* Failed on ISO 9660 filesystem. Use track information. */ - return next_lsn > lsn ? next_lsn - lsn : 0; - } - } - return 0; -} - -/*! - Return size in bytes for track number for entry n in obj. - - The IS0-9660 filesystem track has number 1. Tracks associated - with playable entries numbers start at 2. - - FIXME: Whether we count the track pregap sectors is a bit haphazard. - We should add a parameter to indicate whether this is wanted or not. -*/ -unsigned int -vcdinfo_get_track_size(const vcdinfo_obj_t *obj, track_t track_num) -{ - if (NULL == obj || VCDINFO_INVALID_TRACK == track_num) - return 0; - - { - iso9660_stat_t statbuf; - const lsn_t lsn = cdio_lba_to_lsn(vcdinfo_get_track_lba(obj, track_num)); - - /* Try to get the sector count from the ISO 9660 filesystem */ - if (obj->has_xa && iso9660_find_fs_lsn(obj->img, lsn)) { - return statbuf.size; - } -#if 0 - else { - /* Failed on ISO 9660 filesystem. Use track information. */ - if (obj->img != NULL) - return cdio_get_track_size(obj->img); - } -#endif - } - return 0; -} - -/*! - \brief Get the kind of video stream segment of segment seg_num in obj. - \return VCDINFO_FILES_VIDEO_INVALID is returned if on error or obj is - null. Otherwise the enumeration type. - - Note first seg_num is 0! -*/ -vcdinfo_video_segment_type_t -vcdinfo_get_video_type(const vcdinfo_obj_t *obj, segnum_t seg_num) -{ - const InfoVcd_t *info; - if (obj == NULL) return VCDINFO_FILES_VIDEO_INVALID; - info = &obj->info; - if (info == NULL) return VCDINFO_FILES_VIDEO_INVALID; - return info->spi_contents[seg_num].video_type; -} - -/*! - \brief Get the kind of VCD that obj refers to. -*/ -vcd_type_t -vcdinfo_get_VCD_type(const vcdinfo_obj_t *obj) -{ - if (NULL == obj) return VCD_TYPE_INVALID; - return obj->vcd_type; -} - - -/*! - Return the VCD volume count - the number of CD's in the collection. - O is returned if there is some problem in getting this. -*/ -unsigned int -vcdinfo_get_volume_count(const vcdinfo_obj_t *obj) -{ - if ( NULL == obj ) return 0; - return vcdinf_get_volume_count(&obj->info); -} - -/*! - Return the VCD ID. - NULL is returned if there is some problem in getting this. -*/ -const char * -vcdinfo_get_volume_id(const vcdinfo_obj_t *obj) -{ - if ( NULL == obj || NULL == &obj->pvd ) return (NULL); - return(iso9660_get_volume_id(&obj->pvd)); -} - -/*! - Return the VCD volumeset ID. - NULL is returned if there is some problem in getting this. -*/ -const char * -vcdinfo_get_volumeset_id(const vcdinfo_obj_t *obj) -{ - if ( NULL == obj || NULL == &obj->pvd ) return (NULL); - return(vcdinfo_strip_trail(obj->pvd.volume_set_id, ISO_MAX_VOLUMESET_ID)); -} - -/*! - Return the VCD volume num - the number of the CD in the collection. - This is a number between 1 and the volume count. - O is returned if there is some problem in getting this. -*/ -unsigned int -vcdinfo_get_volume_num(const vcdinfo_obj_t *obj) -{ - if ( NULL == obj ) return 0; - return(uint16_from_be( obj->info.vol_id)); -} - -int -vcdinfo_get_wait_time (uint16_t wtime) -{ - /* Note: this doesn't agree exactly with _wtime */ - if (wtime < 61) - return wtime; - else if (wtime < 255) - return (wtime - 60) * 10 + 60; - else - return -1; -} - -/*! - Return true is there is playback control. -*/ -bool -vcdinfo_has_pbc (const vcdinfo_obj_t *obj) -{ - return (obj && obj->info.psd_size!=0); -} - -/*! - Return true if VCD has "extended attributes" (XA). Extended attributes - add meta-data attributes to a entries of file describing the file. - See also cdio_get_xa_attr_str() which returns a string similar to - a string you might get on a Unix filesystem listing ("ls"). -*/ -bool -vcdinfo_has_xa(const vcdinfo_obj_t *obj) -{ - return obj->has_xa; -} - -/*! - Add one to the MSF. -*/ -void -vcdinfo_inc_msf (uint8_t *min, uint8_t *sec, int8_t *frame) -{ - (*frame)++; - if (*frame>=CDIO_CD_FRAMES_PER_SEC) { - *frame = 0; - (*sec)++; - if (*sec>=CDIO_CD_SECS_PER_MIN) { - *sec = 0; - (*min)++; - } - } -} - -/*! - Convert minutes, seconds and frame (MSF components) into a - logical block address (or LBA). - See also cdio_msf_to_lba which uses msf_t as its single parameter. -*/ -lba_t -vcdinfo_msf2lba (uint8_t min, uint8_t sec, int8_t frame) -{ - return CDIO_CD_FRAMES_PER_SEC*(CDIO_CD_SECS_PER_MIN*min + sec) + frame; -} - -/*! - Convert minutes, seconds and frame (MSF components) into a - logical block address (or LBA). - See also cdio_msf_to_lba which uses msf_t as its single parameter. -*/ -void -vcdinfo_lba2msf (lba_t lba, uint8_t *min, uint8_t *sec, uint8_t *frame) -{ - *min = lba / (60*75); - lba %= (60*75); - *sec = lba / 75; - *frame = lba % 75; -} - -/*! - Convert minutes, seconds and frame (MSF components) into a - logical sector number (or LSN). -*/ -lsn_t -vcdinfo_msf2lsn (uint8_t min, uint8_t sec, int8_t frame) -{ - lba_t lba=75*(60*min + sec) + frame; - if (lba < CDIO_PREGAP_SECTORS) { - vcd_error ("lba (%u) less than pregap sector (%u)", - (unsigned int) lba, CDIO_PREGAP_SECTORS); - return lba; - } - return lba - CDIO_PREGAP_SECTORS; -} - -const char * -vcdinfo_ofs2str (const vcdinfo_obj_t *obj, unsigned int offset, bool ext) -{ - vcdinfo_offset_t *ofs; - char *buf; - - switch (offset) { - case PSD_OFS_DISABLED: - return "disabled"; - case PSD_OFS_MULTI_DEF: - return "multi-default"; - case PSD_OFS_MULTI_DEF_NO_NUM: - return "multi_def_no_num"; - default: ; - } - - buf = _getbuf (); - ofs = _vcdinfo_get_offset_t(obj, offset, ext); - if (ofs != NULL) { - if (ofs->lid) - snprintf (buf, BUF_SIZE, "LID[%d] @0x%4.4x", - ofs->lid, ofs->offset); - else - snprintf (buf, BUF_SIZE, "PSD[?] @0x%4.4x", - ofs->offset); - } else { - snprintf (buf, BUF_SIZE, "? @0x%4.4x", offset); - } - return buf; -} - -bool -vcdinfo_read_psd (vcdinfo_obj_t *obj) -{ - unsigned psd_size = vcdinfo_get_psd_size (obj); - - if (psd_size) - { - if (psd_size > 256*1024) - { - vcd_error ("weird psd size (%u) -- aborting", psd_size); - return false; - } - - obj->lot = _vcd_malloc (ISO_BLOCKSIZE * LOT_VCD_SIZE); - obj->psd = _vcd_malloc (ISO_BLOCKSIZE * _vcd_len2blocks (psd_size, - ISO_BLOCKSIZE)); - - if (cdio_read_mode2_sectors (obj->img, (void *) obj->lot, LOT_VCD_SECTOR, - false, LOT_VCD_SIZE)) - return false; - - if (cdio_read_mode2_sectors (obj->img, (void *) obj->psd, PSD_VCD_SECTOR, - false, _vcd_len2blocks (psd_size, - ISO_BLOCKSIZE))) - return false; - - } else { - return false; - } - return true; -} - -/*! Return the entry number for the given track. */ -unsigned int -vcdinfo_track_get_entry(const vcdinfo_obj_t *obj, track_t i_track) -{ - /* FIXME: Add structure to directly map track to first entry number. - Until then... - */ - lsn_t lsn= vcdinfo_get_track_lsn(obj, i_track); - return vcdinfo_lsn_get_entry(obj, lsn); -} - -/*! - Calls recursive routine to populate obj->offset_list or obj->offset_x_list - by going through LOT. - - Returns false if there was some error. -*/ -bool -vcdinfo_visit_lot (vcdinfo_obj_t *obj, bool extended) -{ - struct _vcdinf_pbc_ctx pbc_ctx; - bool ret; - - pbc_ctx.psd_size = vcdinfo_get_psd_size (obj); - pbc_ctx.psd_x_size = obj->psd_x_size; - pbc_ctx.offset_mult = 8; - pbc_ctx.maximum_lid = vcdinfo_get_num_LIDs(obj); - pbc_ctx.offset_x_list = NULL; - pbc_ctx.offset_list = NULL; - pbc_ctx.psd = obj->psd; - pbc_ctx.psd_x = obj->psd_x; - pbc_ctx.lot = obj->lot; - pbc_ctx.lot_x = obj->lot_x; - pbc_ctx.extended = extended; - - ret = vcdinf_visit_lot(&pbc_ctx); - if (NULL != obj->offset_x_list) - _cdio_list_free(obj->offset_x_list, true); - obj->offset_x_list = pbc_ctx.offset_x_list; - if (NULL != obj->offset_list) - _cdio_list_free(obj->offset_list, true); - obj->offset_list = pbc_ctx.offset_list; - return ret; -} - -/*! - Change trailing blanks in str to nulls. Str has a maximum size of - n characters. -*/ -const char * -vcdinfo_strip_trail (const char str[], size_t n) -{ - static char buf[1025]; - int j; - - vcd_assert (n < 1024); - - strncpy (buf, str, n); - buf[n] = '\0'; - - for (j = strlen (buf) - 1; j >= 0; j--) - { - if (buf[j] != ' ') - break; - - buf[j] = '\0'; - } - - return buf; -} - -/*! - Return true if offset is "rejected". That is shouldn't be displayed - in a list of entries. -*/ -bool -vcdinfo_is_rejected(uint16_t offset) -{ - return (offset & VCDINFO_REJECTED_MASK) != 0; -} - -/*! - Nulls/zeros vcdinfo_obj_t structures; The caller should have - ensured that obj != NULL. - routines using obj are called. -*/ -static void -_vcdinfo_zero(vcdinfo_obj_t *obj) -{ - memset(obj, 0, sizeof(vcdinfo_obj_t)); - obj->vcd_type = VCD_TYPE_INVALID; - obj->img = NULL; - obj->lot = NULL; - obj->source_name = NULL; - obj->seg_sizes = NULL; -} - -/*! - Initialize the vcdinfo structure "obj". Should be done before other - routines using obj are called. -*/ -bool -vcdinfo_init(vcdinfo_obj_t *obj) -{ - if (NULL == obj) return false; - _vcdinfo_zero(obj); - return cdio_init(); -} - -/*! - Set up vcdinfo structure "obj" for reading from a particular - medium. This should be done before after initialization but before - any routines that need to retrieve data. - - source_name is the device or file to use for inspection, and - source_type indicates what driver to use or class of drivers in the - case of DRIVER_DEVICE. - access_mode gives the CD access method for reading should the driver - allow for more than one kind of access method (e.g. MMC versus ioctl - on GNU/Linux) - - If source_name is NULL we'll fill in the appropriate default device - name for the given source_type. However if in addtion source_type is - DRIVER_UNKNOWN, then we'll scan for a drive containing a VCD. - - VCDINFO_OPEN_VCD is returned if everything went okay; - VCDINFO_OPEN_ERROR if there was an error and VCDINFO_OPEN_OTHER if the - medium is something other than a VCD. - */ -vcdinfo_open_return_t -vcdinfo_open(vcdinfo_obj_t **obj_p, char *source_name[], - driver_id_t source_type, const char access_mode[]) -{ - CdIo *img; - vcdinfo_obj_t *obj = _vcd_malloc(sizeof(vcdinfo_obj_t)); - iso9660_stat_t *statbuf; - - - /* If we don't specify a driver_id or a source_name, scan the - system for a CD that contains a VCD. - */ - if (NULL == *source_name && source_type == DRIVER_UNKNOWN) { - char **cd_drives=NULL; - cd_drives = cdio_get_devices_with_cap_ret(NULL, - (CDIO_FS_ANAL_SVCD|CDIO_FS_ANAL_CVD|CDIO_FS_ANAL_VIDEOCD - |CDIO_FS_UNKNOWN), - true, &source_type); - if ( NULL == cd_drives || NULL == cd_drives[0] ) { - return VCDINFO_OPEN_ERROR; - } - *source_name = strdup(cd_drives[0]); - cdio_free_device_list(cd_drives); - } - - img = cdio_open(*source_name, source_type); - if (NULL == img) { - return VCDINFO_OPEN_ERROR; - } - - *obj_p = obj; - - if (access_mode != NULL) - cdio_set_arg (img, "access-mode", access_mode); - - if (NULL == *source_name) { - *source_name = cdio_get_default_device(img); - if (NULL == *source_name) return VCDINFO_OPEN_ERROR; - } - - memset (obj, 0, sizeof (vcdinfo_obj_t)); - obj->img = img; /* Note we do this after the above wipeout! */ - - if (!iso9660_fs_read_pvd(obj->img, &(obj->pvd))) { - return VCDINFO_OPEN_ERROR; - } - - /* Determine if VCD has XA attributes. */ - { - - iso9660_pvd_t const *pvd = &obj->pvd; - - obj->has_xa = !strncmp ((char *) pvd + ISO_XA_MARKER_OFFSET, - ISO_XA_MARKER_STRING, - strlen (ISO_XA_MARKER_STRING)); - } - - if (!read_info(obj->img, &(obj->info), &(obj->vcd_type)) || - vcdinfo_get_format_version (obj) == VCD_TYPE_INVALID || - !read_entries(obj->img, &(obj->entries))) { - free (obj); /* match 0.7.23's behaviour */ - return VCDINFO_OPEN_OTHER; - } - - { - size_t len = strlen(*source_name)+1; - obj->source_name = (char *) malloc(len * sizeof(char)); - strncpy(obj->source_name, *source_name, len); - } - - if (obj->vcd_type == VCD_TYPE_SVCD || obj->vcd_type == VCD_TYPE_HQVCD) { - statbuf = iso9660_fs_stat (obj->img, "MPEGAV"); - - if (NULL != statbuf) { - vcd_warn ("non compliant /MPEGAV folder detected!"); - free(statbuf); - } - - - statbuf = iso9660_fs_stat (obj->img, "SVCD/TRACKS.SVD;1"); - if (NULL != statbuf) { - lsn_t lsn = statbuf->lsn; - if (statbuf->size != ISO_BLOCKSIZE) - vcd_warn ("TRACKS.SVD filesize != %d!", ISO_BLOCKSIZE); - - obj->tracks_buf = _vcd_malloc (ISO_BLOCKSIZE); - - free(statbuf); - if (cdio_read_mode2_sector (obj->img, obj->tracks_buf, lsn, false)) - return VCDINFO_OPEN_ERROR; - } - } - - _init_segments (obj); - - switch (obj->vcd_type) { - case VCD_TYPE_VCD2: { - /* FIXME: Can reduce CD reads by using - iso9660_fs_readdir(img, "EXT", true) and then scanning for - the files listed below. - */ - statbuf = iso9660_fs_stat (img, "EXT/PSD_X.VCD;1"); - if (NULL != statbuf) { - lsn_t lsn = statbuf->lsn; - uint32_t secsize = statbuf->secsize; - - obj->psd_x = _vcd_malloc (ISO_BLOCKSIZE * secsize); - obj->psd_x_size = statbuf->size; - - vcd_debug ("found /EXT/PSD_X.VCD at sector %lu", - (long unsigned int) lsn); - - free(statbuf); - if (cdio_read_mode2_sectors (img, obj->psd_x, lsn, false, secsize)) - return VCDINFO_OPEN_ERROR; - } - - statbuf = iso9660_fs_stat (img, "EXT/LOT_X.VCD;1"); - if (NULL != statbuf) { - lsn_t lsn = statbuf->lsn; - uint32_t secsize = statbuf->secsize; - obj->lot_x = _vcd_malloc (ISO_BLOCKSIZE * secsize); - - vcd_debug ("found /EXT/LOT_X.VCD at sector %lu", - (unsigned long int) lsn); - - if (statbuf->size != LOT_VCD_SIZE * ISO_BLOCKSIZE) - vcd_warn ("LOT_X.VCD size != 65535"); - - free(statbuf); - if (cdio_read_mode2_sectors (img, obj->lot_x, lsn, false, secsize)) - return VCDINFO_OPEN_ERROR; - - } - break; - } - case VCD_TYPE_SVCD: - case VCD_TYPE_HQVCD: { - /* FIXME: Can reduce CD reads by using - iso9660_fs_readdir(img, "SVCD", true) and then scanning for - the files listed below. - */ - statbuf = iso9660_fs_stat (img, "MPEGAV"); - if (NULL != statbuf) { - vcd_warn ("non compliant /MPEGAV folder detected!"); - free(statbuf); - } - - statbuf = iso9660_fs_stat (img, "SVCD/TRACKS.SVD;1"); - if (NULL == statbuf) - vcd_warn ("mandatory /SVCD/TRACKS.SVD not found!"); - else { - vcd_debug ("found TRACKS.SVD signature at sector %lu", - (unsigned long int) statbuf->lsn); - free(statbuf); - } - - statbuf = iso9660_fs_stat (img, "SVCD/SEARCH.DAT;1"); - if (NULL == statbuf) - vcd_warn ("mandatory /SVCD/SEARCH.DAT not found!"); - else { - lsn_t lsn = statbuf->lsn; - uint32_t secsize = statbuf->secsize; - uint32_t stat_size = statbuf->size; - uint32_t size; - - vcd_debug ("found SEARCH.DAT at sector %lu", (unsigned long int) lsn); - - obj->search_buf = _vcd_malloc (ISO_BLOCKSIZE * secsize); - - if (cdio_read_mode2_sectors (img, obj->search_buf, lsn, false, secsize)) - return VCDINFO_OPEN_ERROR; - - size = (3 * uint16_from_be (((SearchDat *)obj->search_buf)->scan_points)) - + sizeof (SearchDat); - - free(statbuf); - if (size > stat_size) { - vcd_warn ("number of scanpoints leads to bigger size than " - "file size of SEARCH.DAT! -- rereading"); - - free (obj->search_buf); - obj->search_buf = _vcd_malloc (ISO_BLOCKSIZE - * _vcd_len2blocks(size, ISO_BLOCKSIZE)); - - if (cdio_read_mode2_sectors (img, obj->search_buf, lsn, false, - secsize)) - return VCDINFO_OPEN_ERROR; - } - } - break; - } - default: - ; - } - - statbuf = iso9660_fs_stat (img, "EXT/SCANDATA.DAT;1"); - if (statbuf != NULL) { - lsn_t lsn = statbuf->lsn; - uint32_t secsize = statbuf->secsize; - - vcd_debug ("found /EXT/SCANDATA.DAT at sector %u", (unsigned int) lsn); - - obj->scandata_buf = _vcd_malloc (ISO_BLOCKSIZE * secsize); - - free(statbuf); - if (cdio_read_mode2_sectors (img, obj->scandata_buf, lsn, false, secsize)) - return VCDINFO_OPEN_ERROR; - } - - return VCDINFO_OPEN_VCD; - -} - -/*! - Dispose of any resources associated with vcdinfo structure "obj". - Call this when "obj" it isn't needed anymore. - - True is returned is everything went okay, and false if not. -*/ -bool -vcdinfo_close(vcdinfo_obj_t *obj) -{ - if (obj != NULL) { - if (obj->offset_list != NULL) - _cdio_list_free(obj->offset_list, true); - if (obj->offset_x_list != NULL) - _cdio_list_free(obj->offset_x_list, true); - free(obj->seg_sizes); - free(obj->lot); - free(obj->lot_x); - if (obj->psd_x) free(obj->psd_x); - if (obj->psd) free(obj->psd); - if (obj->scandata_buf) free(obj->scandata_buf); - free(obj->tracks_buf); - free(obj->search_buf); - free(obj->source_name); - - if (obj->img != NULL) cdio_destroy (obj->img); - _vcdinfo_zero(obj); - } - - free(obj); - return(true); -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/info_private.c b/src/input/vcd/libvcd/info_private.c deleted file mode 100644 index 9f89a3dcb..000000000 --- a/src/input/vcd/libvcd/info_private.c +++ /dev/null @@ -1,328 +0,0 @@ -/* - $Id: info_private.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2003 Rocky Bernstein <rocky@panix.com> - - 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 Foundation - Software, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ -/* - Like vcdinfo but exposes more of the internal structure. It is probably - better to use vcdinfo, when possible. -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdio.h> -#include <stddef.h> -#include <errno.h> - -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_STRING_H -#include <string.h> -#endif -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif - -#include <cdio/cdio.h> -#include <cdio/bytesex.h> -#include <cdio/util.h> - -#include <libvcd/types.h> -#include <libvcd/files.h> - -#include <libvcd/info.h> - -/* Private headers */ -#include "vcd_assert.h" -#include "data_structures.h" -#include "info_private.h" -#include "pbc.h" - -static const char _rcsid[] = "$Id: info_private.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $"; - -/* - This fills in unassigned LIDs in the offset table. Due to - "rejected" LOT entries, some of these might not have gotten filled - in while scanning PBC (if in fact there even was a PBC). - - Note: We assume that an unassigned LID is one whose value is 0. - */ -static void -vcdinf_update_offset_list(struct _vcdinf_pbc_ctx *obj, bool extended) -{ - if (NULL==obj) return; - { - CdioListNode *node; - CdioList *unused_lids = _cdio_list_new(); - CdioListNode *next_unused_node = _cdio_list_begin(unused_lids); - - unsigned int last_lid=0; - CdioList *offset_list = extended ? obj->offset_x_list : obj->offset_list; - - lid_t max_seen_lid=0; - - _CDIO_LIST_FOREACH (node, offset_list) - { - vcdinfo_offset_t *ofs = _cdio_list_node_data (node); - if (!ofs->lid) { - /* We have a customer! Assign a LID from the free pool - or take one from the end if no skipped LIDs. - */ - CdioListNode *node=_cdio_list_node_next(next_unused_node); - if (node != NULL) { - lid_t *next_unused_lid=_cdio_list_node_data(node); - ofs->lid = *next_unused_lid; - next_unused_node=node; - } else { - max_seen_lid++; - ofs->lid = max_seen_lid; - } - } else { - /* See if we've skipped any LID numbers. */ - last_lid++; - while (last_lid != ofs->lid ) { - lid_t * lid=_vcd_malloc (sizeof(lid_t)); - *lid = last_lid; - _cdio_list_append(unused_lids, lid); - } - if (last_lid > max_seen_lid) max_seen_lid=last_lid; - } - } - _cdio_list_free(unused_lids, true); - } -} - -/*! - Calls recursive routine to populate obj->offset_list or obj->offset_x_list - by going through LOT. - - Returns false if there was some error. -*/ -bool -vcdinf_visit_lot (struct _vcdinf_pbc_ctx *obj) -{ - const LotVcd_t *lot = obj->extended ? obj->lot_x : obj->lot; - unsigned int n, tmp; - bool ret=true; - - if (obj->extended) { - if (!obj->psd_x_size) return false; - } else if (!obj->psd_size) return false; - - for (n = 0; n < LOT_VCD_OFFSETS; n++) - if ((tmp = vcdinf_get_lot_offset(lot, n)) != PSD_OFS_DISABLED) - ret &= vcdinf_visit_pbc (obj, n + 1, tmp, true); - - _vcd_list_sort (obj->extended ? obj->offset_x_list : obj->offset_list, - (_cdio_list_cmp_func) vcdinf_lid_t_cmp); - - /* Now really complete the offset table with LIDs. This routine - might obviate the need for vcdinf_visit_pbc() or some of it which is - more complex. */ - vcdinf_update_offset_list(obj, obj->extended); - return ret; -} - -/*! - Recursive routine to populate obj->offset_list or obj->offset_x_list - by reading playback control entries referred to via lid. - - Returns false if there was some error. -*/ -bool -vcdinf_visit_pbc (struct _vcdinf_pbc_ctx *obj, lid_t lid, unsigned int offset, - bool in_lot) -{ - CdioListNode *node; - vcdinfo_offset_t *ofs; - unsigned int psd_size = obj->extended ? obj->psd_x_size : obj->psd_size; - const uint8_t *psd = obj->extended ? obj->psd_x : obj->psd; - unsigned int _rofs = offset * obj->offset_mult; - CdioList *offset_list; - bool ret=true; - - vcd_assert (psd_size % 8 == 0); - - switch (offset) - { - case PSD_OFS_DISABLED: - case PSD_OFS_MULTI_DEF: - case PSD_OFS_MULTI_DEF_NO_NUM: - return true; - - default: - break; - } - - if (_rofs >= psd_size) - { - if (obj->extended) - vcd_warn ("psd offset out of range in extended PSD (%d >= %d)", - _rofs, psd_size); - else - vcd_warn ("psd offset out of range (%d >= %d)", _rofs, psd_size); - return false; - } - - if (!obj->offset_list) - obj->offset_list = _cdio_list_new (); - - if (!obj->offset_x_list) - obj->offset_x_list = _cdio_list_new (); - - if (obj->extended) { - offset_list = obj->offset_x_list; - } else - offset_list = obj->offset_list; - - _CDIO_LIST_FOREACH (node, offset_list) - { - ofs = _cdio_list_node_data (node); - - if (offset == ofs->offset) - { - if (in_lot) - ofs->in_lot = true; - - if (lid) { - /* Our caller thinks she knows what our LID is. - This should help out getting the LID for end descriptors - if not other things as well. - */ - ofs->lid = lid; - } - - ofs->ext = obj->extended; - - return true; /* already been there... */ - } - } - - ofs = _vcd_malloc (sizeof (vcdinfo_offset_t)); - - ofs->ext = obj->extended; - ofs->in_lot = in_lot; - ofs->lid = lid; - ofs->offset = offset; - ofs->type = psd[_rofs]; - - switch (ofs->type) - { - case PSD_TYPE_PLAY_LIST: - _cdio_list_append (offset_list, ofs); - { - const PsdPlayListDescriptor_t *d = (const void *) (psd + _rofs); - const lid_t lid = vcdinf_pld_get_lid(d); - - if (!ofs->lid) - ofs->lid = lid; - else - if (ofs->lid != lid) - vcd_warn ("LOT entry assigned LID %d, but descriptor has LID %d", - ofs->lid, lid); - - ret &= vcdinf_visit_pbc (obj, 0, vcdinf_pld_get_prev_offset(d), false); - ret &= vcdinf_visit_pbc (obj, 0, vcdinf_pld_get_next_offset(d), false); - ret &= vcdinf_visit_pbc (obj, 0, vcdinf_pld_get_return_offset(d), - false); - } - break; - - case PSD_TYPE_EXT_SELECTION_LIST: - case PSD_TYPE_SELECTION_LIST: - _cdio_list_append (offset_list, ofs); - { - const PsdSelectionListDescriptor_t *d = - (const void *) (psd + _rofs); - - int idx; - - if (!ofs->lid) - ofs->lid = uint16_from_be (d->lid) & 0x7fff; - else - if (ofs->lid != (uint16_from_be (d->lid) & 0x7fff)) - vcd_warn ("LOT entry assigned LID %d, but descriptor has LID %d", - ofs->lid, uint16_from_be (d->lid) & 0x7fff); - - ret &= vcdinf_visit_pbc (obj, 0, vcdinf_psd_get_prev_offset(d), false); - ret &= vcdinf_visit_pbc (obj, 0, vcdinf_psd_get_next_offset(d), false); - ret &= vcdinf_visit_pbc (obj, 0, vcdinf_psd_get_return_offset(d), - false); - ret &= vcdinf_visit_pbc (obj, 0, vcdinf_psd_get_default_offset(d), - false); - ret &= vcdinf_visit_pbc (obj, 0, uint16_from_be (d->timeout_ofs), - false); - - for (idx = 0; idx < vcdinf_get_num_selections(d); idx++) - ret &= vcdinf_visit_pbc (obj, 0, vcdinf_psd_get_offset(d, idx), - false); - } - break; - - case PSD_TYPE_END_LIST: - _cdio_list_append (offset_list, ofs); - break; - - default: - vcd_warn ("corrupt PSD???????"); - free (ofs); - return false; - break; - } - return ret; -} - -/*! Return the starting LBA (logical block address) for sequence - entry_num in obj. VCDINFO_NULL_LBA is returned if there is no entry. -*/ -lba_t -vcdinf_get_entry_lba(const EntriesVcd_t *entries, unsigned int entry_num) -{ - const msf_t *msf = vcdinf_get_entry_msf(entries, entry_num); - return (msf != NULL) ? cdio_msf_to_lba(msf) : VCDINFO_NULL_LBA; -} - -/*! Return the starting MSF (minutes/secs/frames) for sequence - entry_num in obj. NULL is returned if there is no entry. - The first entry number is 0. -*/ -const msf_t * -vcdinf_get_entry_msf(const EntriesVcd_t *entries, unsigned int entry_num) -{ - const unsigned int entry_count = uint16_from_be (entries->entry_count); - return entry_num < entry_count ? - &(entries->entry[entry_num].msf) - : NULL; -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/info_private.h b/src/input/vcd/libvcd/info_private.h deleted file mode 100644 index d17b6680b..000000000 --- a/src/input/vcd/libvcd/info_private.h +++ /dev/null @@ -1,118 +0,0 @@ -/*! - \file vcdinf.h - - Copyright (C) 2002,2003 Rocky Bernstein <rocky@panix.com> - - \verbatim - 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 Foundation - Software, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Like vcdinfo but exposes more of the internal structure. It is probably - better to use vcdinfo, when possible. - \endverbatim -*/ - -#ifndef _VCD_INFO_PRIVATE_H -#define _VCD_INFO_PRIVATE_H - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <cdio/cdio.h> -#include <cdio/ds.h> -#include <cdio/iso9660.h> -#include <libvcd/types.h> -#include <libvcd/files_private.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - struct _VcdInfo { - vcd_type_t vcd_type; - - CdIo *img; - - iso9660_pvd_t pvd; - - InfoVcd_t info; - EntriesVcd_t entries; - - CdioList *offset_list; - CdioList *offset_x_list; - uint32_t *seg_sizes; - lsn_t first_segment_lsn; - - LotVcd_t *lot; - LotVcd_t *lot_x; - uint8_t *psd; - uint8_t *psd_x; - unsigned int psd_x_size; - bool extended; - - bool has_xa; /* True if has extended attributes (XA) */ - - void *tracks_buf; - void *search_buf; - void *scandata_buf; - - char *source_name; /* VCD device or file currently open */ - - }; - - /*! Return the starting MSF (minutes/secs/frames) for sequence - entry_num in obj. NULL is returned if there is no entry. - The first entry number is 0. - */ - const msf_t * vcdinf_get_entry_msf(const EntriesVcd_t *entries, - unsigned int entry_num); - - struct _vcdinf_pbc_ctx { - unsigned int psd_size; - lid_t maximum_lid; - unsigned offset_mult; - CdioList *offset_x_list; - CdioList *offset_list; - - LotVcd_t *lot; - LotVcd_t *lot_x; - uint8_t *psd; - uint8_t *psd_x; - unsigned int psd_x_size; - bool extended; - }; - - /*! - Calls recursive routine to populate obj->offset_list or obj->offset_x_list - by going through LOT. - - Returns false if there was some error. - */ - bool vcdinf_visit_lot (struct _vcdinf_pbc_ctx *obj); - - /*! - Recursive routine to populate obj->offset_list or obj->offset_x_list - by reading playback control entries referred to via lid. - - Returns false if there was some error. - */ - bool vcdinf_visit_pbc (struct _vcdinf_pbc_ctx *obj, lid_t lid, - unsigned int offset, bool in_lot); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /*_VCD_INFO_PRIVATE_H*/ diff --git a/src/input/vcd/libvcd/libvcd/Makefile.am b/src/input/vcd/libvcd/libvcd/Makefile.am deleted file mode 100644 index ea29859f6..000000000 --- a/src/input/vcd/libvcd/libvcd/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -noinst_HEADERS = files.h inf.h logging.h types.h files_private.h info.h sector.h version.h diff --git a/src/input/vcd/libvcd/libvcd/files.h b/src/input/vcd/libvcd/libvcd/files.h deleted file mode 100644 index 91eeafad8..000000000 --- a/src/input/vcd/libvcd/libvcd/files.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - $Id: files.h,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifndef VCDFILES_H -#define VCDFILES_H - -#include <libvcd/types.h> - -#define INFO_VCD_SECTOR 150 -#define ENTRIES_VCD_SECTOR 151 -#define LOT_VCD_SECTOR 152 -#define LOT_VCD_SIZE 32 -#define PSD_VCD_SECTOR (LOT_VCD_SECTOR+LOT_VCD_SIZE) - -#define MAX_SEGMENTS 1980 -#define MAX_ENTRIES 500 -#define MAX_SEQ_ENTRIES 99 - -/* these are used for SVCDs only */ -#define TRACKS_SVD_SECTOR (PSD_VCD_SECTOR+1) -#define SEARCH_DAT_SECTOR (TRACKS_SVD_SECTOR+1) - -/* Maximum index of optional LOT.VCD (the List ID Offset Table.) */ -#define LOT_VCD_OFFSETS ((1 << 15)-1) - -typedef enum { - PSD_TYPE_PLAY_LIST = 0x10, /* Play List */ - PSD_TYPE_SELECTION_LIST = 0x18, /* Selection List (+Ext. for SVCD) */ - PSD_TYPE_EXT_SELECTION_LIST = 0x1a, /* Extended Selection List (VCD2.0) */ - PSD_TYPE_END_LIST = 0x1f, /* End List */ - PSD_TYPE_COMMAND_LIST = 0x20 /* Command List */ -} psd_descriptor_types; - -#define ENTRIES_ID_VCD "ENTRYVCD" -#define ENTRIES_ID_VCD3 "ENTRYSVD" -#define ENTRIES_ID_SVCD "ENTRYVCD" /* not ENTRYSVD! */ - -#define SCANDATA_VERSION_VCD2 0x02 -#define SCANDATA_VERSION_SVCD 0x01 - -void -set_entries_vcd(VcdObj *obj, void *buf); - -void -set_info_vcd (VcdObj *obj, void *buf); - -uint32_t -get_psd_size (VcdObj *obj, bool extended); - -void -set_lot_vcd (VcdObj *obj, void *buf, bool extended); - -void -set_psd_vcd (VcdObj *obj, void *buf, bool extended); - -void -set_tracks_svd (VcdObj *obj, void *buf); - -uint32_t -get_search_dat_size (const VcdObj *obj); - -void -set_search_dat (VcdObj *obj, void *buf); - -uint32_t -get_scandata_dat_size (const VcdObj *obj); - -void -set_scandata_dat (VcdObj *obj, void *buf); - - -vcd_type_t -vcd_files_info_detect_type (const void *info_buf); - -#endif /* VCDFILES_H */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/libvcd/files_private.h b/src/input/vcd/libvcd/libvcd/files_private.h deleted file mode 100644 index aabb6ab0c..000000000 --- a/src/input/vcd/libvcd/libvcd/files_private.h +++ /dev/null @@ -1,562 +0,0 @@ -/* - $Id: files_private.h,v 1.3 2006/09/26 21:16:59 dgp85 Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - (C) 2000 Jens B. Jorgensen <jbj1@ultraemail.net> - - 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 -*/ - -#ifndef __VCD_FILES_PRIVATE_H__ -#define __VCD_FILES_PRIVATE_H__ - -#include <libvcd/files.h> -#include <libvcd/types.h> - -/* random note: most stuff is big endian here */ - -#define ENTRIES_ID_VCD "ENTRYVCD" -#define ENTRIES_ID_VCD3 "ENTRYSVD" -#define ENTRIES_ID_SVCD "ENTRYVCD" /* not ENTRYSVD! */ - -#define ENTRIES_VERSION_VCD 0x01 -#define ENTRIES_SPTAG_VCD 0x00 - -#define ENTRIES_VERSION_VCD11 0x01 -#define ENTRIES_SPTAG_VCD11 0x00 - -#define ENTRIES_VERSION_VCD2 0x02 -#define ENTRIES_SPTAG_VCD2 0x00 - -#define ENTRIES_VERSION_SVCD 0x01 -#define ENTRIES_SPTAG_SVCD 0x00 - -#define ENTRIES_VERSION_HQVCD 0x01 -#define ENTRIES_SPTAG_HQVCD 0x00 - -PRAGMA_BEGIN_PACKED - -typedef struct _EntriesVcd_tag { - char ID[8]; /* "ENTRYVCD" */ - uint8_t version; /* 0x02 --- VCD2.0 - 0x01 --- SVCD, should be - same as version in - INFO.SVD */ - uint8_t sys_prof_tag; /* 0x01 if VCD1.1 - 0x00 else */ - uint16_t entry_count; /* 1 <= tracks <= 500 */ - struct { /* all fields are BCD */ - uint8_t n; /* cd track no 2 <= n <= 99 */ - msf_t msf; - } GNUC_PACKED entry[MAX_ENTRIES]; - uint8_t reserved2[36]; /* RESERVED, must be 0x00 */ -} GNUC_PACKED _EntriesVcd; /* sector 00:04:01 */ - -#define EntriesVcd_SIZEOF ISO_BLOCKSIZE - - -#define INFO_ID_VCD "VIDEO_CD" -#define INFO_ID_SVCD "SUPERVCD" -#define INFO_ID_HQVCD "HQ-VCD " - -#define INFO_VERSION_VCD 0x01 -#define INFO_SPTAG_VCD 0x00 - -#define INFO_VERSION_VCD11 0x01 -#define INFO_SPTAG_VCD11 0x01 - -#define INFO_VERSION_VCD2 0x02 -#define INFO_SPTAG_VCD2 0x00 - -#define INFO_VERSION_SVCD 0x01 -#define INFO_SPTAG_SVCD 0x00 - -#define INFO_VERSION_HQVCD 0x01 -#define INFO_SPTAG_HQVCD 0x01 - -#define INFO_OFFSET_MULT 0x08 - -/* This one-byte field describes certain characteristics of the disc */ -typedef struct { -#if defined(BITFIELD_LSBF) - bool reserved1 : 1; /* Reserved, must be zero */ - bitfield_t restriction : 2; /* restriction, eg. "unsuitable - for kids": - 0x0 ==> unrestricted, - 0x1 ==> restricted category 1, - 0x2 ==> restricted category 2, - 0x3 ==> restricted category 3 */ - bool special_info : 1; /* Special Information is encoded - in the pictures */ - bool user_data_cc : 1; /* MPEG User Data is used - for Closed Caption */ - bool use_lid2 : 1; /* If == 1 and the PSD is - interpreted and the next - disc has the same album - id then start the next - disc at List ID #2, - otherwise List ID #1 */ - bool use_track3 : 1; /* If == 1 and the PSD is - not interpreted and - next disc has same album - id, then start next disc - with track 3, otherwise - start with track 2 */ - bool pbc_x : 1; /* extended PBC available */ -#else - bool pbc_x : 1; - bool use_track3 : 1; - bool use_lid2 : 1; - bool user_data_cc : 1; - bool special_info : 1; - bitfield_t restriction : 2; - bool reserved1 : 1; -#endif -} GNUC_PACKED InfoStatusFlags; - -#define InfoStatusFlags_SIZEOF 1 - -enum { - VCD_FILES_VIDEO_NOSTREAM = 0, - VCD_FILES_VIDEO_NTSC_STILL = 1, - VCD_FILES_VIDEO_NTSC_STILL2 = 2, - VCD_FILES_VIDEO_NTSC_MOTION = 3, - VCD_FILES_VIDEO_PAL_STILL = 5, - VCD_FILES_VIDEO_PAL_STILL2 = 6, - VCD_FILES_VIDEO_PAL_MOTION = 7 -}; - -typedef struct -{ -#if defined(BITFIELD_LSBF) - bitfield_t audio_type : 2; /* Audio characteristics: - 0x0 - No MPEG audio stream - 0x1 - One MPEG1 or MPEG2 audio - stream without extension - 0x2 - Two MPEG1 or MPEG2 audio - streams without extension - 0x3 - One MPEG2 multi-channel - audio stream w/ extension*/ - bitfield_t video_type : 3; /* Video characteristics: - 0x0 - No MPEG video data - 0x1 - NTSC still picture - 0x2 - Reserved (NTSC hires?) - 0x3 - NTSC motion picture - 0x4 - Reserved - 0x5 - PAL still picture - 0x6 - Reserved (PAL hires?) - 0x7 - PAL motion picture */ - bool item_cont : 1; /* Indicates segment is continuation - 0x0 - 1st or only segment of item - 0x1 - 2nd or later - segment of item */ - bitfield_t ogt : 2; /* 0x0 - no OGT substream - 0x1 - sub-stream 0 available - 0x2 - sub-stream 0 & 1 available - 0x3 - all OGT sub-substreams - available */ -#else - bitfield_t ogt : 2; - bool item_cont : 1; - bitfield_t video_type : 3; - bitfield_t audio_type : 2; -#endif -} GNUC_PACKED InfoSpiContents; - -#define InfoSpiContents_SIZEOF 1 - -typedef struct _InfoVcd_tag { - char ID[8]; /* const "VIDEO_CD" for - VCD, "SUPERVCD" or - "HQ-VCD " for SVCD */ - uint8_t version; /* 0x02 -- VCD2.0, - 0x01 for SVCD and VCD1.x */ - uint8_t sys_prof_tag; /* System Profile Tag, used - to define the set of - mandatory parts to be - applied for compatibility; - 0x00 for "SUPERVCD", - 0x01 for "HQ-VCD ", - 0x0n for VCDx.n */ - char album_desc[16]; /* album identification/desc. */ - uint16_t vol_count; /* number of volumes in album */ - uint16_t vol_id; /* number id of this volume in album */ - uint8_t pal_flags[13]; /* bitset of 98 PAL(=set)/NTSC flags */ - InfoStatusFlags flags; /* status flags bit field */ - uint32_t psd_size; /* size of PSD.VCD file */ - msf_t first_seg_addr; /* first segment addresses, - coded BCD The location - of the first sector of - the Segment Play Item - Area, in the form - mm:ss:00. Must be - 00:00:00 if the PSD size - is 0. */ - uint8_t offset_mult; /* offset multiplier, must be 8 */ - uint16_t lot_entries; /* offsets in lot */ - uint16_t item_count; /* segments used for segmentitems */ - InfoSpiContents spi_contents[MAX_SEGMENTS]; /* The next 1980 bytes - contain one byte for each possible - segment play item. Each byte indicates - contents. */ - - uint16_t playing_time[5]; /* in seconds */ - char reserved[2]; /* Reserved, must be zero */ -} GNUC_PACKED _InfoVcd; - -#define InfoVcd_SIZEOF ISO_BLOCKSIZE - -/* LOT.VCD - This optional file is only necessary if the PSD size is not zero. - This List ID Offset Table allows you to start playing the PSD from - lists other than the default List ID number. This table has a fixed length - of 32 sectors and maps List ID numbers into List Offsets. It's got - an entry for each List ID Number with the 16-bit offset. Note that - List ID 1 has an offset of 0x0000. All unused or non-user-accessible - entries must be 0xffff. */ - -#define LOT_VCD_OFFSETS ((1 << 15)-1) - -typedef struct _LotVcd_tag { - uint16_t reserved; /* Reserved, must be zero */ - uint16_t offset[LOT_VCD_OFFSETS]; /* offset given in 8 byte units */ -} GNUC_PACKED _LotVcd; - -#define LotVcd_SIZEOF (32*ISO_BLOCKSIZE) - -/* PSD.VCD - The PSD controls the "user interaction" mode which can be used to make - menus, etc. The PSD contains a set of Lists. Each List defines a set of - Items which are played in sequence. An Item can be an mpeg track (in whole - or part) or a Segment Play Item which can subsequently be mpeg video - with or without audio, one more more mpeg still pictures (with or without - audio) or mpeg audio only. - - The Selection List defines the action to be taken in response to a set - of defined user actions: Next, Previous, Default Select, Numeric, Return. - - The End List terminates the control flow or switches to the next - disc volume. - - Each list has a unique list id number. The first must be 1, the others can - be anything (up to 32767). - - References to PSD list addresses are expressed as an offset into the PSD - file. The offset indicated in the file must be multiplied by the Offset - Multiplier found in the info file (although this seems to always have to - be 8). Unused areas are filled with zeros. List ID 1 starts at offset 0. -*/ - -/* ...difficult to represent as monolithic C struct... */ - -typedef struct { - uint8_t type; /* PSD_TYPE_END_LIST */ - uint8_t next_disc; /* 0x00 to stop PBC or 0xnn to switch to disc no nn */ - uint16_t change_pic; /* 0 or 1000..2979, should be still image */ - uint8_t reserved[4]; /* padded with 0x00 */ -} GNUC_PACKED PsdEndListDescriptor; - -#define PsdEndListDescriptor_SIZEOF 8 - -typedef struct { -#if defined(BITFIELD_LSBF) - bool SelectionAreaFlag : 1; - bool CommandListFlag : 1; - bitfield_t reserved : 6; -#else - bitfield_t reserved : 6; - bool CommandListFlag : 1; - bool SelectionAreaFlag : 1; -#endif -} GNUC_PACKED PsdSelectionListFlags; - -#define PsdSelectionListFlags_SIZEOF 1 - -typedef struct _PsdSelectionListDescriptor_tag { - uint8_t type; - PsdSelectionListFlags flags; - uint8_t nos; - uint8_t bsn; - uint16_t lid; - uint16_t prev_ofs; - uint16_t next_ofs; - uint16_t return_ofs; - uint16_t default_ofs; - uint16_t timeout_ofs; - uint8_t totime; - uint8_t loop; - uint16_t itemid; - uint16_t ofs[EMPTY_ARRAY_SIZE]; /* variable length */ - /* PsdSelectionListDescriptorExtended */ -} GNUC_PACKED _PsdSelectionListDescriptor; - -#define PsdSelectionListDescriptor_SIZEOF 20 - -typedef struct { - struct psd_area_t prev_area; - struct psd_area_t next_area; - struct psd_area_t return_area; - struct psd_area_t default_area; - struct psd_area_t area[EMPTY_ARRAY_SIZE]; /* variable length */ -} GNUC_PACKED PsdSelectionListDescriptorExtended; - -#define PsdSelectionListDescriptorExtended_SIZEOF 16 - -typedef struct { - uint8_t type; - uint16_t command_count; - uint16_t lid; - uint16_t command[EMPTY_ARRAY_SIZE]; /* variable length */ -} GNUC_PACKED PsdCommandListDescriptor; - -#define PsdCommandListDescriptor_SIZEOF 5 - -typedef struct _PsdPlayListDescriptor_tag { - uint8_t type; - uint8_t noi; /* number of items */ - uint16_t lid; /* list id: high-bit means this list is rejected in - the LOT (also, can't use 0) */ - uint16_t prev_ofs; /* previous list offset (0xffff disables) */ - uint16_t next_ofs; /* next list offset (0xffff disables) */ - uint16_t return_ofs; /* return list offset (0xffff disables) */ - uint16_t ptime; /* play time in 1/15 s, 0x0000 meaning full item */ - uint8_t wtime; /* delay after, in seconds, if 1 <= wtime <= 60 wait - is wtime else if 61 <= wtime <= 254 wait is - (wtime-60) * 10 + 60 else wtime == 255 wait is - infinite */ - uint8_t atime; /* auto pause wait time calculated same as wtime, - used for each item in list if the auto pause flag - in a sector is true */ - uint16_t itemid[EMPTY_ARRAY_SIZE]; /* item number - 0 <= n <= 1 - play nothing - 2 <= n <= 99 - play track n - 100 <= n <= 599 - play entry - (n - 99) from entries - table to end of track - 600 <= n <= 999 - reserved - 1000 <= n <= 2979 - play segment - play item (n - 999) - 2980 <= n <= 0xffff - reserved */ -} GNUC_PACKED _PsdPlayListDescriptor; - -#define PsdPlayListDescriptor_SIZEOF 14 - -/* TRACKS.SVD - SVCD\TRACKS.SVD is a mandatory file which describes the numbers and types - of MPEG tracks on the disc. */ - -/* SVDTrackContent indicates the audio/video content of an MPEG Track */ - -typedef struct { -#if defined(BITFIELD_LSBF) - bitfield_t audio : 2; /* Audio Content - 0x00 : No MPEG audio stream - 0x01 : One MPEG{1|2} audio stream - 0x02 : Two MPEG{1|2} streams - 0x03 : One MPEG2 multi-channel - audio stream with - extension */ - bitfield_t video : 3; /* Video Content - 0x00 : No MPEG video - 0x03 : NTSC video - 0x07 : PAL video */ - bool reserved1 : 1; /* Reserved, must be zero */ - bitfield_t ogt : 2; /* 0x0 - no OGT substream - 0x1 - sub-stream 0 available - 0x2 - sub-stream 0 & 1 available - 0x3 - all OGT sub-substreams - available */ -#else - bitfield_t ogt : 2; - bool reserved1 : 1; - bitfield_t video : 3; - bitfield_t audio : 2; -#endif -} GNUC_PACKED SVDTrackContent; - -#define SVDTrackContent_SIZEOF 1 - -/* The file contains a series of structures, one for each - track, which indicates the track's playing time (in sectors, not actually - real time) and contents. */ - -#define TRACKS_SVD_FILE_ID "TRACKSVD" -#define TRACKS_SVD_VERSION 0x01 - -typedef struct { - char file_id[sizeof(TRACKS_SVD_FILE_ID)-1]; /* == "TRACKSVD" */ - uint8_t version; /* == 0x01 */ - uint8_t reserved; /* Reserved, must be zero */ - uint8_t tracks; /* number of MPEG tracks */ - msf_t playing_time[EMPTY_ARRAY_SIZE]; /* per track, BCD coded - mm:ss:ff */ -} GNUC_PACKED TracksSVD; - -#define TracksSVD_SIZEOF 11 - -typedef struct { - /* TracksSVD tracks_svd; */ - SVDTrackContent contents[1]; /* should be [], but C99 doesn't allow it - indicates track contents */ -} GNUC_PACKED TracksSVD2; - -#define TracksSVD2_SIZEOF SVDTrackContent_SIZEOF - -/* VCD30 tracks svd */ - -typedef struct { - char file_id[sizeof(TRACKS_SVD_FILE_ID)-1]; /* == "TRACKSVD" */ - uint8_t version; /* == 0x01 */ - uint8_t reserved; /* Reserved, must be zero */ - uint8_t tracks; /* number of MPEG tracks */ - struct { - msf_t cum_playing_time; /* BCD coded mm:ss:ff */ - uint8_t ogt_info; - uint8_t audio_info; - } GNUC_PACKED track[EMPTY_ARRAY_SIZE]; -} GNUC_PACKED TracksSVD_v30; - -#define TracksSVD_v30_SIZEOF 11 - -/* SEARCH.DAT - This file defines where the scan points are. It covers all mpeg tracks - together. A scan point at time T is the nearest I-picture in the MPEG - stream to the given time T. Scan points are given at every half-second - for the entire duration of the disc. */ - -#define SEARCH_FILE_ID "SEARCHSV" -#define SEARCH_VERSION 0x01 -#define SEARCH_TIME_INTERVAL 0x01 - -typedef struct { - char file_id[sizeof(SEARCH_FILE_ID)-1]; /* = "SEARCHSV" */ - uint8_t version; /* = 0x01 */ - uint8_t reserved; /* Reserved, must be zero */ - uint16_t scan_points; /* the number of scan points */ - uint8_t time_interval; /* The interval of time in - between scan points, in units - of 0.5 seconds, must be 0x01 */ - msf_t points[EMPTY_ARRAY_SIZE]; /* The series of scan points */ -} GNUC_PACKED SearchDat; - -#define SearchDat_SIZEOF 13 - -/* SPICONTX.SVD - */ - -#define SPICONTX_FILE_ID "SPICONSV" -#define SPICONTX_VERSION 0x01 - -typedef struct { - char file_id[sizeof(SPICONTX_FILE_ID)-1]; /* = "SPICONSV" */ - uint8_t version; /* = 0x01 */ - uint8_t reserved; /* Reserved, must be zero */ - struct { - uint8_t ogt_info; - uint8_t audio_info; - } GNUC_PACKED spi[MAX_SEGMENTS]; - uint8_t reserved2[126]; /* 0x00 */ -} GNUC_PACKED SpicontxSvd; - -#define SpicontxSvd_SIZEOF (2*ISO_BLOCKSIZE) - -/* SCANDATA.DAT for VCD 2.0 */ - -#define SCANDATA_FILE_ID "SCAN_VCD" -#define SCANDATA_VERSION_VCD2 0x02 -#define SCANDATA_VERSION_SVCD 0x01 - -typedef struct { - char file_id[sizeof(SCANDATA_FILE_ID)-1]; /* = "SCAN_VCD" */ - uint8_t version; /* = 0x02 */ - uint8_t reserved; /* Reserved, must be zero */ - uint16_t scan_points; /* the number of scan points */ - msf_t points[EMPTY_ARRAY_SIZE]; /* actual scan points - points[time(iframe)/0.5] */ -} GNUC_PACKED ScandataDat_v2; - -#define ScandataDat_v2_SIZEOF 12 - -/* SCANDATA.DAT for SVCD - This file fulfills much the same purpose of the SEARCH.DAT file except - that this file is mandatory only if the System Profile Tag of the - INFO.SVD file is 0x01 (HQ-VCD) and also that it contains sector addresses - also for each video Segment Play Items in addition to the regular MPEG - tracks. */ - -typedef struct { - char file_id[sizeof(SCANDATA_FILE_ID)-1]; /* = "SCAN_VCD" */ - uint8_t version; /* = 0x01 */ - uint8_t reserved; /* Reserved, must be zero */ - uint16_t scandata_count; /* number of 3-byte entries in - the table */ - uint16_t track_count; /* number of mpeg tracks on disc */ - uint16_t spi_count; /* number of consecutively recorded - play item segments (as opposed - to the number of segment play - items). */ - msf_t cum_playtimes[EMPTY_ARRAY_SIZE]; /* cumulative playing - time up to track - N. Track time just wraps - at 99:59:74 */ -} GNUC_PACKED ScandataDat1; - -#define ScandataDat1_SIZEOF 16 - -typedef struct { - /* ScandataDat head; */ - uint16_t spi_indexes[1]; /* should be [], but C doesn't allow that; - Indexes into the following scandata - table */ -} GNUC_PACKED ScandataDat2; - -#define ScandataDat2_SIZEOF sizeof(uint16_t) - -typedef struct { - /* ScandataDat2 head; */ - uint16_t mpegtrack_start_index; /* Index into the - following scandata table - where the MPEG track - scan points start */ - - /* The scandata table starts here */ - struct { - uint8_t track_num; /* Track number as in TOC */ - uint16_t table_offset; /* Index into scandata table */ - } GNUC_PACKED mpeg_track_offsets[EMPTY_ARRAY_SIZE]; -} GNUC_PACKED ScandataDat3; - -#define ScandataDat3_SIZEOF 2 - -typedef struct { - /* ScandataDat3 head; */ - msf_t scandata_table[1]; /* should be [] but C99 doesn't allow that */ -} GNUC_PACKED ScandataDat4; - -#define ScandataDat4_SIZEOF msf_t_SIZEOF - -PRAGMA_END_PACKED - -#endif /* __VCD_FILES_PRIVATE_H__ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/libvcd/inf.h b/src/input/vcd/libvcd/libvcd/inf.h deleted file mode 100644 index fcd9098e2..000000000 --- a/src/input/vcd/libvcd/libvcd/inf.h +++ /dev/null @@ -1,260 +0,0 @@ -/*! - \file inf.h - - Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com> - - \verbatim - 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 Foundation - Software, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - \endverbatim -*/ - -/* - Things here refer to lower-level structures using a structure other - than vcdinfo_t. For higher-level structures via the vcdinfo_t, see - info.h -*/ - -#ifndef _VCD_INF_H -#define _VCD_INF_H - -#include <libvcd/info.h> - - const char * vcdinf_area_str (const struct psd_area_t *_area); - - /*! - Return a string containing the VCD album id. - */ - const char * vcdinf_get_album_id(const InfoVcd_t *info); - - /*! - Get autowait time value for PsdPlayListDescriptor *d. - Time is in seconds unless it is -1 (unlimited). - */ - int vcdinf_get_autowait_time (const PsdPlayListDescriptor_t *d); - - /*! - Return the base selection number. VCD_INVALID_BSN is returned if there - is an error. - */ - unsigned int vcdinf_get_bsn(const PsdSelectionListDescriptor_t *psd); - - /*! Return the starting LBA (logical block address) for sequence - entry_num in obj. VCDINFO_NULL_LBA is returned if there is no entry. - The first entry number is 0. - */ - lba_t vcdinf_get_entry_lba(const EntriesVcd_t *entries, - unsigned int entry_num); - - const char * vcdinf_get_format_version_str (vcd_type_t vcd_type); - - /*! - Return loop count. 0 is infinite loop. - */ - uint16_t vcdinf_get_loop_count (const PsdSelectionListDescriptor_t *psd); - - /*! - Return LOT offset - */ - uint16_t vcdinf_get_lot_offset (const LotVcd_t *lot, unsigned int n); - - /*! - Return number of bytes in PSD. - */ - uint32_t vcdinf_get_psd_size (const InfoVcd_t *info); - - /*! - Return the number of segments in the VCD. - */ - unsigned int vcdinf_get_num_entries(const EntriesVcd_t *entries); - - /*! - Return number of LIDs. - */ - lid_t vcdinf_get_num_LIDs (const InfoVcd_t *info); - - /*! - Return the number of segments in the VCD. - */ - segnum_t vcdinf_get_num_segments(const InfoVcd_t *info); - - /*! - Return the number of menu selections for selection-list descriptor d. - */ - unsigned int vcdinf_get_num_selections(const PsdSelectionListDescriptor_t *d); - - /*! - Get play-time value for PsdPlayListDescriptor *d. - Time is in 1/15-second units. - */ - uint16_t vcdinf_get_play_time (const PsdPlayListDescriptor_t *d); - - /*! - Get timeout offset for PsdPlayListDescriptor *d. Return - VCDINFO_INVALID_OFFSET if d is NULL; - Time is in seconds unless it is -1 (unlimited). - */ - uint16_t vcdinf_get_timeout_offset (const PsdSelectionListDescriptor_t *d); - - /*! - Get timeout wait value for PsdPlayListDescriptor *d. - Time is in seconds unless it is -1 (unlimited). - */ - int vcdinf_get_timeout_time (const PsdSelectionListDescriptor_t *d); - - /*! - Return the track number for entry n in obj. The first track starts - at 1. - */ - track_t vcdinf_get_track(const EntriesVcd_t *entries, - const unsigned int entry_num); - - /*! - Return the VCD volume num - the number of the CD in the collection. - This is a number between 1 and the volume count. - */ - unsigned int vcdinf_get_volume_num(const InfoVcd_t *info); - - /*! - Return the VCD volume count - the number of CD's in the collection. - */ - unsigned int vcdinf_get_volume_count(const InfoVcd_t *info); - - /*! - Get wait time value for PsdPlayListDescriptor *d. - Time is in seconds unless it is -1 (unlimited). - */ - int vcdinf_get_wait_time (const PsdPlayListDescriptor_t *d); - - /*! - Return true if loop has a jump delay - */ - bool vcdinf_has_jump_delay (const PsdSelectionListDescriptor_t *psd); - - /*! - Comparison routine used in sorting. We compare LIDs and if those are - equal, use the offset. - Note: we assume an unassigned LID is 0 and this compares as a high value. - - NOTE: Consider making static. - */ - int vcdinf_lid_t_cmp (vcdinfo_offset_t *a, vcdinfo_offset_t *b); - - /** - \fn vcdinf_pld_get_next_offset(const PsdPlayListDescriptor *pld); - \brief Get next offset for a given PSD selector descriptor. - \return VCDINFO_INVALID_OFFSET is returned on error or if pld has no - "next" entry or pld is NULL. Otherwise the LID offset is returned. - */ - uint16_t vcdinf_pld_get_next_offset(const PsdPlayListDescriptor_t *pld); - - /*! - Get the LID from a given play-list descriptor. - VCDINFO_REJECTED_MASK is returned on error or pld is NULL. - */ - uint16_t vcdinf_pld_get_lid(const PsdPlayListDescriptor_t *pld); - - /*! - Return the playlist item i in d. - */ - uint16_t vcdinf_pld_get_play_item(const PsdPlayListDescriptor_t *pld, - unsigned int i); - - /** - \fn vcdinf_pld_get_prev_offset(const PsdSelectionListDescriptor *pld); - \brief Get prev offset for a given PSD selector descriptor. - \return VCDINFO_INVALID_OFFSET is returned on error or if pld has no - "prev" entry or pld is NULL. Otherwise the LID offset is returned. - */ - uint16_t vcdinf_pld_get_prev_offset(const PsdPlayListDescriptor_t *pld); - - /** - \fn vcdinf_pld_get_return_offset(const PsdPlayListDescriptor *pld); - \brief Get return offset for a given PLD selector descriptor. - \return VCDINFO_INVALID_OFFSET is returned on error or if pld has no - "return" entry or pld is NULL. Otherwise the LID offset is returned. - */ - uint16_t vcdinf_pld_get_return_offset(const PsdPlayListDescriptor_t *pld); - - /*! - Return number of items in LIDs. Return 0 if error or not found. - */ - int vcdinf_pld_get_noi (const PsdPlayListDescriptor_t *pld); - - /** - * \fn vcdinfo_psd_get_default_offset(const PsdSelectionListDescriptor *psd); - * \brief Get next offset for a given PSD selector descriptor. - * \return VCDINFO_INVALID_OFFSET is returned on error or if psd is - * NULL. Otherwise the LID offset is returned. - */ - uint16_t vcdinf_psd_get_default_offset(const PsdSelectionListDescriptor_t *psd); - - /*! - Get the item id for a given selection-list descriptor. - VCDINFO_REJECTED_MASK is returned on error or if psd is NULL. - */ - uint16_t vcdinf_psd_get_itemid(const PsdSelectionListDescriptor_t *psd); - - /*! - Get the LID from a given selection-list descriptor. - VCDINFO_REJECTED_MASK is returned on error or psd is NULL. - */ - uint16_t vcdinf_psd_get_lid(const PsdSelectionListDescriptor_t *psd); - - /*! - Get the LID rejected status for a given selection-list descriptor. - true is also returned d is NULL. - */ - bool - vcdinf_psd_get_lid_rejected(const PsdSelectionListDescriptor_t *psd); - - /** - \fn vcdinf_psd_get_next_offset(const PsdSelectionListDescriptor *psd); - \brief Get "next" offset for a given PSD selector descriptor. - \return VCDINFO_INVALID_OFFSET is returned on error or if psd has no - "next" entry or psd is NULL. Otherwise the LID offset is returned. - */ - lid_t vcdinf_psd_get_next_offset(const PsdSelectionListDescriptor_t *psd); - - /*! - \brief Get offset entry_num for a given PSD selector descriptor. - \param d PSD selector containing the entry_num we query - \param entry_num entry number that we want the LID offset for. - \return VCDINFO_INVALID_OFFSET is returned if d on error or d is - NULL. Otherwise the LID offset is returned. - */ - uint16_t vcdinf_psd_get_offset(const PsdSelectionListDescriptor_t *d, - unsigned int entry_num); - /** - \fn vcdinf_psd_get_prev_offset(const PsdPlayListDescriptor *psd); - \brief Get "prev" offset for a given PSD selector descriptor. - \return VCDINFO_INVALID_OFFSET is returned on error or if psd has no - "prev" - entry or psd is NULL. Otherwise the LID offset is returned. - */ - uint16_t vcdinf_psd_get_prev_offset(const PsdSelectionListDescriptor_t *psd); - - /** - * \fn vcdinf_psd_get_return_offset(const PsdSelectionListDescriptor *psd); - * \brief Get "return" offset for a given PSD selector descriptor. - \return VCDINFO_INVALID_OFFSET is returned on error or if psd has no - "return" entry or psd is NULL. Otherwise the LID offset is returned. - */ - uint16_t vcdinf_psd_get_return_offset(const PsdSelectionListDescriptor_t *psd); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /*_VCD_INF_H*/ diff --git a/src/input/vcd/libvcd/libvcd/info.h b/src/input/vcd/libvcd/libvcd/info.h deleted file mode 100644 index 91b25c956..000000000 --- a/src/input/vcd/libvcd/libvcd/info.h +++ /dev/null @@ -1,860 +0,0 @@ -/*! - \file info.h - - Copyright (C) 2002, 2003, 2004 Rocky Bernstein <rocky@panix.com> - - \verbatim - 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 Foundation - Software, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - \endverbatim -*/ -/* - Things here refer to higher-level structures usually accessed via - vcdinfo_t. For lower-level access which generally use - structures other than vcdinfo_t, see inf.h -*/ - - -#ifndef _VCD_INFO_H -#define _VCD_INFO_H - -#include <libvcd/version.h> -#include <libvcd/types.h> -#include <libvcd/files.h> -#include <cdio/cdio.h> -#include <cdio/ds.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/*========== Move somewhere else? ================*/ - -/*! \def Max # characters in an album id. */ -#define MAX_ALBUM_LEN 16 - -/*! \def Max # of selections allowed in a PBC selection list. */ -#define MAX_PBC_SELECTIONS 99 - -#define MIN_ENCODED_TRACK_NUM 100 -#define MIN_ENCODED_SEGMENT_NUM 1000 -#define MAX_ENCODED_SEGMENT_NUM 2979 - -/*! - Invalid LBA, Note: VCD player uses the fact that this is a very high - value. - */ -#define VCDINFO_NULL_LBA CDIO_INVALID_LBA - -/*! - Invalid LSN, Note: VCD player uses the fact that this is a very high - value. - */ -#define VCDINFO_NULL_LSN VCDINFO_NULL_LBA - -/*========== End move somewhere else? ================*/ - -/*! - Portion of uint16_t which determines whether offset is - rejected or not. -*/ -#define VCDINFO_REJECTED_MASK (0x8000) - -/*! - Portion of uint16_t which contains the offset. -*/ -#define VCDINFO_OFFSET_MASK (VCDINFO_REJECTED_MASK-1) - -/*! - Portion of uint16_t which contains the lid. -*/ -#define VCDINFO_LID_MASK (VCDINFO_REJECTED_MASK-1) - -/*! - Constant for invalid track number -*/ -#define VCDINFO_INVALID_TRACK 0xFF - -/*! - Constant for invalid LID offset. -*/ -#define VCDINFO_INVALID_OFFSET 0xFFFF - -/*! - Constant for ending or "leadout" track. -*/ -#define VCDINFO_LEADOUT_TRACK 0xaa - -/*! - Constant for invalid sequence entry. -*/ -#define VCDINFO_INVALID_ENTRY 0xFFFF - -/*! - Constant for invalid LID. - FIXME: player needs these to be the same. - VCDimager code requres 0 for an UNINITIALIZED LID. - -*/ -#define VCDINFO_INVALID_LID VCDINFO_INVALID_ENTRY -#define VCDINFO_UNINIT_LID 0 - -/*! - Constant for invalid itemid -*/ -#define VCDINFO_INVALID_ITEMID 0xFFFF - -/*! - Constant for invalid audio type -*/ -#define VCDINFO_INVALID_AUDIO_TYPE 4 - -/*! - Constant for invalid base selection number (BSN) -*/ -#define VCDINFO_INVALID_BSN 200 - -/* The number of sectors allocated in a Video CD segment is a fixed: 150. - - NOTE: The actual number of sectors used is often less and can sometimes - be gleaned by looking at the correspoinding ISO 9660 file entry (or - by scanning the MPEG segment which may be slow). - Some media players get confused by or complain about padding at the end - a segment. -*/ -#define VCDINFO_SEGMENT_SECTOR_SIZE 150 - - /* Opaque type used in most routines below. */ - typedef struct _VcdInfo vcdinfo_obj_t; - - /* See enum in vcd_files_private.h */ - typedef enum { - VCDINFO_FILES_VIDEO_NOSTREAM = 0, - VCDINFO_FILES_VIDEO_NTSC_STILL = 1, - VCDINFO_FILES_VIDEO_NTSC_STILL2 = 2, /* lo+hires*/ - VCDINFO_FILES_VIDEO_NTSC_MOTION = 3, - VCDINFO_FILES_VIDEO_PAL_STILL = 5, - VCDINFO_FILES_VIDEO_PAL_STILL2 = 6, /* lo+hires*/ - VCDINFO_FILES_VIDEO_PAL_MOTION = 7, - VCDINFO_FILES_VIDEO_INVALID = 8 - } vcdinfo_video_segment_type_t; - - /*! - Used in working with LOT - list of offsets and lid's - */ - typedef struct { - uint8_t type; - lid_t lid; - uint16_t offset; - bool in_lot; /* Is listed in LOT. */ - bool ext; /* True if entry comes from offset_x_list. */ - } vcdinfo_offset_t; - - /*! - The kind of entry associated with an selection-item id - */ - /* See corresponding enum in vcd_pbc.h. */ - typedef enum { - VCDINFO_ITEM_TYPE_TRACK, - VCDINFO_ITEM_TYPE_ENTRY, - VCDINFO_ITEM_TYPE_SEGMENT, - VCDINFO_ITEM_TYPE_LID, - VCDINFO_ITEM_TYPE_SPAREID2, - VCDINFO_ITEM_TYPE_NOTFOUND - } vcdinfo_item_enum_t; - - typedef struct { - uint16_t num; - vcdinfo_item_enum_t type; - } vcdinfo_itemid_t; - - typedef enum { - VCDINFO_OPEN_ERROR, /* Error */ - VCDINFO_OPEN_VCD, /* Is VCD of some sort */ - VCDINFO_OPEN_OTHER /* Is not VCD but something else */ - } vcdinfo_open_return_t; - - typedef struct - { - - psd_descriptor_types descriptor_type; - /* Only one of pld or psd is used below. Not all - C compiler accept the anonymous unions commented out below. */ - /* union { */ - PsdPlayListDescriptor_t *pld; - PsdSelectionListDescriptor_t *psd; - /* }; */ - - } PsdListDescriptor_t; - - /* For backwards compatibility. Don't use PsdListDescriptor. */ -#define PsdListDescriptor PsdListDescriptor_t - - /*! - Return the number of audio channels implied by "audio_type". - 0 is returned on error. - */ - unsigned int - vcdinfo_audio_type_num_channels(const vcdinfo_obj_t *obj, - unsigned int audio_type); - - /*! - Return a string describing an audio type. - */ - const char * vcdinfo_audio_type2str(const vcdinfo_obj_t *obj, - unsigned int audio_type); - - /*! - Note first seg_num is 0! - */ - const char * - vcdinfo_ogt2str(const vcdinfo_obj_t *obj, segnum_t seg_num); - - /*! - Note first seg_num is 0! - */ - const char * - vcdinfo_video_type2str(const vcdinfo_obj_t *obj, segnum_t seg_num); - - const char * - vcdinfo_pin2str (uint16_t itemid); - - /*! - \brief Classify itemid_num into the kind of item it is: track #, entry #, - segment #. - \param itemid is set to contain this classifcation an the converted - entry number. - */ - void - vcdinfo_classify_itemid (uint16_t itemid_num, - /*out*/ vcdinfo_itemid_t *itemid); - - /*! - Return a string containing the VCD album id, or NULL if there is - some problem in getting this. - */ - const char * - vcdinfo_get_album_id(const vcdinfo_obj_t *obj); - - /*! - Return the VCD application ID. - NULL is returned if there is some problem in getting this. - */ - char * - vcdinfo_get_application_id(vcdinfo_obj_t *obj); - - /*! - Return a pointer to the cdio structure for the CD image opened or - NULL if error. - */ - CdIo * - vcdinfo_get_cd_image (const vcdinfo_obj_t *vcd_obj); - - /*! - Return a string containing the default VCD device if none is specified. - This might be something like "/dev/cdrom" on Linux or - "/vol/dev/aliases/cdrom0" on Solaris, or maybe "VIDEOCD.CUE" for - if bin/cue I/O routines are in effect. - - Return NULL we can't get this information. - */ - char * - vcdinfo_get_default_device (const vcdinfo_obj_t *vcd_obj); - - /*! - \brief Get default LID offset. - - Return the LID offset associated with a the "default" entry of the - passed-in LID parameter. Note "default" entries are associated with - PSDs that are (extended) selection lists. - - \return VCDINFO_INVALID_OFFSET is returned on error, or if the LID - is not a selection list or no "default" entry. Otherwise the LID - offset is returned. - */ - uint16_t - vcdinfo_get_default_offset(const vcdinfo_obj_t *obj, lid_t lid); - - /*! - Return number of sector units in of an entry. 0 is returned if - entry_num is invalid. - */ - uint32_t - vcdinfo_get_entry_sect_count (const vcdinfo_obj_t *obj, - unsigned int entry_num); - - /*! Return the starting LBA (logical block address) for sequence - entry_num in obj. VCDINFO_NULL_LBA is returned if there is no entry. - The first entry number is 0. - */ - lba_t - vcdinfo_get_entry_lba(const vcdinfo_obj_t *obj, unsigned int entry_num); - - /*! Return the starting LSN (logical sector number) for sequence - entry_num in obj. VCDINFO_NULL_LSN is returned if there is no entry. - The first entry number is 0. - */ - lsn_t - vcdinfo_get_entry_lsn(const vcdinfo_obj_t *obj, unsigned int entry_num); - - /*! Return the starting MSF (minutes/secs/frames) for sequence - entry_num in obj. NULL is returned if there is no entry. - The first entry number is 0. - */ - const msf_t * - vcdinfo_get_entry_msf(const vcdinfo_obj_t *obj, unsigned int entry_num); - - /*! - Get the VCD format (VCD 1.0 VCD 1.1, SVCD, ... for this object. - The type is also set inside obj. - The first entry number is 0. - */ - vcd_type_t - vcdinfo_get_format_version (vcdinfo_obj_t *obj); - - /*! - Return a string giving VCD format (VCD 1.0 VCD 1.1, SVCD, ... - for this object. - */ - const char * - vcdinfo_get_format_version_str (const vcdinfo_obj_t *obj); - - EntriesVcd_t * vcdinfo_get_entriesVcd (vcdinfo_obj_t *obj); - - InfoVcd_t * vcdinfo_get_infoVcd (vcdinfo_obj_t *obj); - - /*! - \brief Get default or multi-default LID. - - Return the LID offset associated with a the "default" entry of the - passed-in LID parameter. Note "default" entries are associated - with PSDs that are (extended) selection lists. If the "default" - is a multi-default, we use entry_num to find the proper - "default" LID. Otherwise this routine is exactly like - vcdinfo_get_default_offset with the exception of requiring an - additional "entry_num" parameter. - - \return VCDINFO_INVALID_LID is returned on error, or if the LID - is not a selection list or no "default" entry. Otherwise the LID - offset is returned. - */ - lid_t - vcdinfo_get_multi_default_lid(const vcdinfo_obj_t *obj, lid_t lid, - lsn_t lsn); - - /*! - \brief Get default or multi-default LID offset. - - Return the LID offset associated with a the "default" entry of the - passed-in LID parameter. Note "default" entries are associated - with PSDs that are (extended) selection lists. If the "default" - is a multi-default, we use entry_num to find the proper - "default" offset. Otherwise this routine is exactly like - vcdinfo_get_default_offset with the exception of requiring an - additional "entry_num" parameter. - - \return VCDINFO_INVALID_OFFSET is returned on error, or if the LID - is not a selection list or no "default" entry. Otherwise the LID - offset is returned. - */ - uint16_t - vcdinfo_get_multi_default_offset(const vcdinfo_obj_t *obj, lid_t lid, - unsigned int selection); - - void * vcdinfo_get_pvd (vcdinfo_obj_t *obj); - - void * vcdinfo_get_scandata (vcdinfo_obj_t *obj); - - void * vcdinfo_get_searchDat (vcdinfo_obj_t *obj); - - void * vcdinfo_get_tracksSVD (vcdinfo_obj_t *obj); - - /*! - Get the LOT pointer. - */ - LotVcd_t * - vcdinfo_get_lot(const vcdinfo_obj_t *obj); - - /*! - Get the extended LOT pointer. - */ - LotVcd_t * - vcdinfo_get_lot_x(const vcdinfo_obj_t *obj); - - /*! - Return Number of LIDs. - */ - lid_t - vcdinfo_get_num_LIDs (const vcdinfo_obj_t *obj); - - /*! - Return the audio type for a given track. - VCDINFO_INVALID_AUDIO_TYPE is returned on error. - */ - unsigned int - vcdinfo_get_num_audio_channels(unsigned int audio_type); - - /*! - Return the number of entries in the VCD. - */ - unsigned int - vcdinfo_get_num_entries(const vcdinfo_obj_t *obj); - - /*! - Return the number of segments in the VCD. - */ - segnum_t - vcdinfo_get_num_segments(const vcdinfo_obj_t *obj); - - /*! - Return the highest track number in the current medium. - - Because we track start numbering at 0 (which is the ISO 9660 track - containing Video CD naviagion and disk information), this is one - less than the number of tracks. - - If there are no tracks, we return -1. - */ - unsigned int - vcdinfo_get_num_tracks(const vcdinfo_obj_t *obj); - - /*! - Get the VCD info list. - */ - CdioList *vcdinfo_get_offset_list(const vcdinfo_obj_t *obj); - - /*! - Get the VCD info extended offset list. - */ - CdioList *vcdinfo_get_offset_x_list(const vcdinfo_obj_t *obj); - - /*! - Get the VCD info offset multiplier. - */ - unsigned int vcdinfo_get_offset_mult(const vcdinfo_obj_t *obj); - - /*! - Get entry in offset list for the item that has offset. This entry - has for example the LID. NULL is returned on error. - */ - vcdinfo_offset_t * - vcdinfo_get_offset_t (const vcdinfo_obj_t *obj, unsigned int offset); - - /*! - Return a string containing the VCD preparer id with trailing - blanks removed, or NULL if there is some problem in getting this. - */ - const char * - vcdinfo_get_preparer_id(const vcdinfo_obj_t *obj); - - /*! - Get the PSD. - */ - uint8_t *vcdinfo_get_psd(const vcdinfo_obj_t *obj); - - /*! - Get the extended PSD. - */ - uint8_t *vcdinfo_get_psd_x(const vcdinfo_obj_t *obj); - - /*! - Return number of bytes in PSD. - */ - uint32_t vcdinfo_get_psd_size (const vcdinfo_obj_t *obj); - - /*! - Return number of bytes in the extended PSD. - */ - uint32_t vcdinfo_get_psd_x_size (const vcdinfo_obj_t *obj); - - /*! - Return a string containing the VCD publisher id with trailing - blanks removed, or NULL if there is some problem in getting this. - */ - char * vcdinfo_get_publisher_id(const vcdinfo_obj_t *obj); - - /** - \fn vcdinfo_get_return_offset(const vcdinfo_obj_t *obj); - \brief Get return offset for a given LID. - \return VCDINFO_INVALID_OFFSET is returned on error or if LID has no - "return" entry. Otherwise the LID offset is returned. - */ - lid_t - vcdinfo_get_return_offset(const vcdinfo_obj_t *obj, lid_t lid); - - /*! - Return the audio type for a given segment. - VCDINFO_INVALID_AUDIO_TYPE is returned on error. - */ - unsigned int - vcdinfo_get_seg_audio_type(const vcdinfo_obj_t *obj, segnum_t seg_num); - - /*! - Return true if this segment is supposed to continue to the next one, - (is part of an "item" or listing in the ISO 9660 filesystem). - */ - bool vcdinfo_get_seg_continue(const vcdinfo_obj_t *obj, segnum_t seg_num); - - /*! Return the starting LBA (logical block address) for segment - entry_num in obj. VCDINFO_NULL_LBA is returned if there is no entry. - - Note first seg_num is 0. - */ - lba_t - vcdinfo_get_seg_lba(const vcdinfo_obj_t *obj, segnum_t seg_num); - - /*! Return the starting LSN (logical sector number) for segment - entry_num in obj. VCDINFO_NULL_LBA is returned if there is no entry. - - Note first seg_num is 0. - */ - lsn_t - vcdinfo_get_seg_lsn(const vcdinfo_obj_t *obj, segnum_t seg_num); - - /*! Return the starting MSF (minutes/secs/frames) for segment - entry_num in obj. NULL is returned if there is no entry. - - Note first seg_num is 0. - */ - const msf_t * - vcdinfo_get_seg_msf(const vcdinfo_obj_t *obj, segnum_t seg_num); - - /*! - Return the number of sectors for segment - entry_num in obj. 0 is returned if there is no entry. - - Use this routine to figure out the actual number of bytes a physical - region of a disk or CD takes up for a segment. - - If an item has been broken up into a number of "continued" segments, - we will report the item size for the first segment and 0 for the - remaining ones. We may revisit this decision later. - */ - uint32_t - vcdinfo_get_seg_sector_count(const vcdinfo_obj_t *obj, segnum_t seg_num); - - /*! - Return a string containing the VCD system id with trailing - blanks removed, or NULL if there is some problem in getting this. - */ - const char * - vcdinfo_get_system_id(const vcdinfo_obj_t *obj); - - /*! - Return the track number for entry n in obj. - - In contrast to libcdio we start numbering at 0 which is the - ISO9660 and metadata information for the Video CD. Thus track - 1 is the first track the first complete MPEG track generally. - */ - track_t - vcdinfo_get_track(const vcdinfo_obj_t *obj, const unsigned int entry_num); - - /*! - Return the audio type for a given track. - VCDINFO_INVALID_AUDIO_TYPE is returned on error. - - Note: track 1 is usually the first track. - */ - unsigned int - vcdinfo_get_track_audio_type(const vcdinfo_obj_t *obj, track_t track_num); - - /*! - Return the starting LBA (logical block address) for track number - track_num in obj. - - The IS0-9660 filesystem track has number 0. Tracks associated - with playable entries numbers start at 1. - - The "leadout" track is specified either by - using track_num LEADOUT_TRACK or the total tracks+1. - VCDINFO_NULL_LBA is returned on failure. - */ - lba_t - vcdinfo_get_track_lba(const vcdinfo_obj_t *obj, track_t track_num); - - /*! - Return the starting LSN (logical sector number) for track number - track_num in obj. - - The IS0-9660 filesystem track has number 0. Tracks associated - with playable entries numbers start at 1. - - The "leadout" track is specified either by - using track_num LEADOUT_TRACK or the total tracks+1. - VCDINFO_NULL_LBA is returned on failure. - */ - lsn_t - vcdinfo_get_track_lsn(const vcdinfo_obj_t *obj, track_t track_num); - - /*! - Return the starting MSF (minutes/secs/frames) for track number - track_num in obj. - - The IS0-9660 filesystem track has number 0. Tracks associated - with playable entries numbers start at 1. - - The "leadout" track is specified either by - using track_num LEADOUT_TRACK or the total tracks+1. - VCDINFO_NULL_LBA is returned on failure. - */ - int - vcdinfo_get_track_msf(const vcdinfo_obj_t *obj, track_t track_num, - uint8_t *min, uint8_t *sec, uint8_t *frame); - - /*! - Return the size in sectors for track n. - - The IS0-9660 filesystem track has number 1. Tracks associated - with playable entries numbers start at 2. - - FIXME: Whether we count the track pregap sectors is a bit haphazard. - We should add a parameter to indicate whether this is wanted or not. - */ - unsigned int - vcdinfo_get_track_sect_count(const vcdinfo_obj_t *obj, - const track_t track_num); - - /*! - Return size in bytes for track number for entry n in obj. - - The IS0-9660 filesystem track has number 0. Tracks associated - with playable entries numbers start at 1. - - FIXME: Do we count the track pregap sectors is a bit haphazard. - We should add a parameter to indicate whether this is wanted or not. - */ - unsigned int - vcdinfo_get_track_size(const vcdinfo_obj_t *obj, track_t track_num); - - /*! - \brief Get the kind of video stream segment of segment seg_num in obj. - \return VCDINFO_FILES_VIDEO_INVALID is returned if on error or obj is - null. Otherwise the enumeration type. - - Note first seg_num is 0! - */ - vcdinfo_video_segment_type_t - vcdinfo_get_video_type(const vcdinfo_obj_t *obj, segnum_t seg_num); - - /*! - \brief Get the kind of VCD that obj refers to. - */ - vcd_type_t - vcdinfo_get_VCD_type(const vcdinfo_obj_t *obj); - - /*! - Return the VCD volume count - the number of CD's in the collection. - O is returned if there is some problem in getting this. - */ - unsigned int - vcdinfo_get_volume_count(const vcdinfo_obj_t *obj); - - /*! - Return the VCD ID. - NULL is returned if there is some problem in getting this. - */ - const char * - vcdinfo_get_volume_id(const vcdinfo_obj_t *obj); - - /*! - Return the VCD volumeset ID. - NULL is returned if there is some problem in getting this. - */ - const char * - vcdinfo_get_volumeset_id(const vcdinfo_obj_t *obj); - - /*! - Return the VCD volume num - the number of the CD in the collection. - This is a number between 1 and the volume count. - O is returned if there is some problem in getting this. - */ - unsigned int - vcdinfo_get_volume_num(const vcdinfo_obj_t *obj); - - int vcdinfo_get_wait_time (uint16_t wtime); - - /*! - Return true if there is playback control. - */ - bool vcdinfo_has_pbc (const vcdinfo_obj_t *obj); - - /*! - Return true if VCD has "extended attributes" (XA). Extended attributes - add meta-data attributes to a entries of file describing the file. - See also cdio_get_xa_attr_str() which returns a string similar to - a string you might get on a Unix filesystem listing ("ls"). - */ - bool vcdinfo_has_xa(const vcdinfo_obj_t *obj); - - /*! - Add one to the MSF. - */ - void vcdinfo_inc_msf (uint8_t *min, uint8_t *sec, int8_t *frame); - - /*! - Convert minutes, seconds and frame (MSF components) into a - logical block address (or LBA). - See also msf_to_lba which uses msf_t as its single parameter. - */ - void - vcdinfo_lba2msf (lba_t lba, uint8_t *min, uint8_t *sec, uint8_t *frame); - - /*! - Get the item id for a given list ID. - VCDINFO_REJECTED_MASK is returned on error or if obj is NULL. - */ - uint16_t - vcdinfo_lid_get_itemid(const vcdinfo_obj_t *obj, lid_t lid); - - /*! - \fn vcdinfo_lid_get_offset(const vcdinfo_obj_t *obj, - unsigned int entry_num); - \brief Get offset entry_num for a given LID. - \return VCDINFO_INVALID_OFFSET is returned if obj on error or obj - is NULL. Otherwise the LID offset is returned. - */ - uint16_t vcdinfo_lid_get_offset(const vcdinfo_obj_t *obj, lid_t lid, - unsigned int entry_num); - - /*! - Get the PSD Selection List Descriptor for a given lid. - False is returned if not found. - */ - bool vcdinfo_lid_get_pxd(const vcdinfo_obj_t *obj, PsdListDescriptor_t *pxd, - uint16_t lid); - - /*! Return the entry number closest and before the given LSN. - */ - unsigned int - vcdinfo_lsn_get_entry(const vcdinfo_obj_t *obj, lsn_t lsn); - - /*! - Convert minutes, seconds and frame (MSF components) into a - logical block address (or LBA). - See also msf_to_lba which uses msf_t as its single parameter. - */ - lba_t vcdinfo_msf2lba (uint8_t min, uint8_t sec, int8_t frame); - - /*! - Convert minutes, seconds and frame (MSF components) into a - logical sector number (or LSN). - */ - lsn_t vcdinfo_msf2lsn (uint8_t min, uint8_t sec, int8_t frame); - - const char * - vcdinfo_ofs2str (const vcdinfo_obj_t *obj, unsigned int offset, bool ext); - - /*! - Calls recursive routine to populate obj->offset_list or obj->offset_x_list - by going through LOT. - - Returns false if there was some error. - */ - bool vcdinfo_visit_lot (vcdinfo_obj_t *obj, bool extended); - - bool vcdinfo_read_psd (vcdinfo_obj_t *obj); - - /*! - \fn vcdinfo_selection_get_lid(const vcdinfo_obj_t *obj, lid_t lid, - unsigned int selection); - \brief Get the "default" lid of a selection for a given lid. - - Return the LID offset associated with a the selection number of the - passed-in LID parameter. - - \return VCDINFO_INVALID_LID is returned if obj on error or obj - is NULL. Otherwise the LID offset is returned. - */ - lid_t vcdinfo_selection_get_lid(const vcdinfo_obj_t *obj, lid_t lid, - unsigned int selection); - - /*! - \fn vcdinfo_selection_get_offset(const vcdinfo_obj_t *obj, lid_t lid, - unsigned int selection); - \brief Get offset of a selection for a given LID. - - Return the LID offset associated with a the selection number of the - passed-in LID parameter. - - \return VCDINFO_INVALID_OFFSET is returned if obj on error or obj - is NULL. Otherwise the LID offset is returned. - */ - uint16_t vcdinfo_selection_get_offset(const vcdinfo_obj_t *obj, lid_t lid, - unsigned int selection); - - /*! - Change trailing blanks in str to nulls. Str has a maximum size of - n characters. - */ - const char * vcdinfo_strip_trail (const char str[], size_t n); - - /*! Return the entry number for the given track. - */ - unsigned int - vcdinfo_track_get_entry(const vcdinfo_obj_t *obj, track_t track); - - /*! - Initialize the vcdinfo structure "obj". Should be done before other - routines using obj are called. - */ - bool vcdinfo_init(vcdinfo_obj_t *obj); - - /*! - Set up vcdinfo structure "obj" for reading from a particular - medium. This should be done before after initialization but before - any routines that need to retrieve data. - - source_name is the device or file to use for inspection, and - source_type indicates what driver to use or class of drivers in the - case of DRIVER_DEVICE. - access_mode gives the CD access method for reading should the driver - allow for more than one kind of access method (e.g. MMC versus ioctl - on GNU/Linux) - - If source_name is NULL we'll fill in the appropriate default device - name for the given source_type. However if in addtion source_type is - DRIVER_UNKNOWN, then we'll scan for a drive containing a VCD. - - VCDINFO_OPEN_VCD is returned if everything went okay; - VCDINFO_OPEN_ERROR if there was an error and VCDINFO_OPEN_OTHER if the - medium is something other than a VCD. - */ - vcdinfo_open_return_t - vcdinfo_open(vcdinfo_obj_t **p_obj, char *source_name[], - driver_id_t source_type, const char access_mode[]); - - - /*! - Dispose of any resources associated with vcdinfo structure "obj". - Call this when "obj" it isn't needed anymore. - - True is returned is everything went okay, and false if not. - */ - bool vcdinfo_close(vcdinfo_obj_t *obj); - - /*! - Return true if offset is "rejected". That is shouldn't be displayed - in a list of entries. - */ - bool vcdinfo_is_rejected(uint16_t offset); - -/* Include lower-level access as well. */ -#include <libvcd/inf.h> - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /*_VCD_INFO_H*/ diff --git a/src/input/vcd/libvcd/libvcd/logging.h b/src/input/vcd/libvcd/libvcd/logging.h deleted file mode 100644 index bc088ed1c..000000000 --- a/src/input/vcd/libvcd/libvcd/logging.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - $Id: logging.h,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2003 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -#ifndef __VCD_LOGGING_H__ -#define __VCD_LOGGING_H__ - -#include <libvcd/types.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/** - * The different log levels supported. - */ -typedef enum { - VCD_LOG_DEBUG = 1, /**< Debug-level messages - helps debug what's up. */ - VCD_LOG_INFO, /**< Informational - indicates perhaps something of - interest. */ - VCD_LOG_WARN, /**< Warning conditions - something that looks funny. */ - VCD_LOG_ERROR, /**< Error conditions - may terminate program. */ - VCD_LOG_ASSERT /**< Critical conditions - may abort program. */ -} vcd_log_level_t; - -/** - * The place to save the preference concerning how much verbosity - * is desired. This is used by the internal default log handler, but - * it could be use by applications which provide their own log handler. - */ -extern vcd_log_level_t vcd_loglevel_default; - -/** - * This type defines the signature of a log handler. For every - * message being logged, the handler will receive the log level and - * the message string. - * - * @see vcd_log_set_handler - * @see vcd_log_level_t - * - * @param level The log level. - * @param message The log message. - */ -typedef void (*vcd_log_handler_t) (vcd_log_level_t level, - const char message[]); - -/** - * Set a custom log handler for libcdio. The return value is the log - * handler being replaced. If the provided parameter is NULL, then - * the handler will be reset to the default handler. - * - * @see vcd_log_handler_t - * - * @param new_handler The new log handler. - * @return The previous log handler. - */ -vcd_log_handler_t -vcd_log_set_handler (vcd_log_handler_t new_handler); - -/** - * Handle an message with the given log level - * - * @see vcd_debug - * @see vcd_info - * @see vcd_warn - * @see vcd_error - - * @param level The log level. - * @param format printf-style format string - * @param ... remaining arguments needed by format string - */ -void -vcd_log (vcd_log_level_t level, const char format[], ...) GNUC_PRINTF(2, 3); - -/** - * Handle a debugging message. - * - * @see vcd_log for a more generic routine - */ -void -vcd_debug (const char format[], ...) GNUC_PRINTF(1,2); - -/** - * Handle an informative message. - * - * @see vcd_log for a more generic routine - */ -void -vcd_info (const char format[], ...) GNUC_PRINTF(1,2); - -/** - * Handle a warning message. - * - * @see vcd_log for a more generic routine - */ -void -vcd_warn (const char format[], ...) GNUC_PRINTF(1,2); - -/** - * Handle an error message. - * - * @see vcd_log for a more generic routine. - */ -void -vcd_error (const char format[], ...) GNUC_PRINTF(1,2); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __VCD_LOGGING_H__ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/libvcd/sector.h b/src/input/vcd/libvcd/libvcd/sector.h deleted file mode 100644 index 32c2cc89a..000000000 --- a/src/input/vcd/libvcd/libvcd/sector.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - $Id: sector.h,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifndef _VCD_SECTOR_H_ -#define _VCD_SECTOR_H_ - -#include <libvcd/types.h> - -/* subheader */ - -/* - - SVCD 1.0 - ~~~~~~~~ - - empty sector: fn=0 cn=0 sm=%00100000 ci=0 - data sector: fn=0 cn=0 sm=%x0001000 ci=0 - mpeg sector: fn=1 cn=1 sm=%x11x001x ci=0x80 - - VCD 2.0 - ~~~~~~~ - - /MPEGAV/AVSEQyy.DAT - empty sector: fn=yy cn=0 sm=%x11x000x ci=0 - video sector: fn=yy cn=1 sm=%x11x001x ci=0x0f - audio sector: fn=yy cn=1 sm=%x11x010x ci=0x7f - - /SEGMENT/ITEMzzzz.DAT - empty sector: fn=1 cn=0 sm=%x11x000x ci=0 - video sector: fn=1 cn=1 sm=%x11x001x ci=0x0f - lores still: fn=1 cn=2 sm=%x11x001x ci=0x1f - hires still: fn=1 cn=3 sm=%x11x001x ci=0x3f - audio sector: fn=1 cn=1 sm=%x11x010x ci=0x7f - - /VCD/ *.VCD - data sector: fn=0 cn=0 sm=%x000100x ci=0 - - *.* - data sector: fn=1 cn=0 sm=%x0001000 ci=0 - -*/ - -/* file numbers */ - -/* dynamic */ - -/* channel numbers */ -#define CN_VIDEO 0x01 -#define CN_STILL 0x02 -#define CN_STILL2 0x03 -#define CN_AUDIO 0x01 -#define CN_AUDIO2 0x02 -#define CN_OGT 0x02 /* fixme -- is it 0x04 ?? */ -#define CN_PAD 0x00 -#define CN_EMPTY 0x00 - -/* submode byte */ -#define SM_EOF (1<<7) -#define SM_REALT (1<<6) -#define SM_FORM2 (1<<5) -#define SM_TRIG (1<<4) -#define SM_DATA (1<<3) -#define SM_AUDIO (1<<2) -#define SM_VIDEO (1<<1) -#define SM_EOR (1<<0) - -/* coding information */ -#define CI_VIDEO 0x0f -#define CI_STILL 0x1f -#define CI_STILL2 0x3f -#define CI_AUDIO 0x7f -#define CI_AUDIO2 0x7f -#define CI_OGT 0x0f -#define CI_PAD 0x1f -#define CI_MPEG2 0x80 -#define CI_EMPTY 0x00 - -/* make mode 2 form 1/2 sector - * - * data must be a buffer of size 2048 or 2324 for SM_FORM2 - * raw_sector must be a writable buffer of size 2352 - */ -void -_vcd_make_mode2 (void *raw_sector, const void *data, uint32_t extent, - uint8_t fnum, uint8_t cnum, uint8_t sm, uint8_t ci); - -/* ...data must be a buffer of size 2336 */ - -void -_vcd_make_raw_mode2 (void *raw_sector, const void *data, uint32_t extent); - -#endif /* _VCD_SECTOR_H_ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/libvcd/types.h b/src/input/vcd/libvcd/libvcd/types.h deleted file mode 100644 index 56a07d447..000000000 --- a/src/input/vcd/libvcd/libvcd/types.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - $Id: types.h,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2000, 2004 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifndef __VCD_TYPES_H__ -#define __VCD_TYPES_H__ - -#include <cdio/types.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - /* Opaque types ... */ - - /* Defined fully in data_structures.c */ - typedef struct _VcdList VcdList; - typedef struct _VcdListNode VcdListNode; - - /* Defined fully in files_private.h */ - typedef struct _InfoVcd_tag InfoVcd_t; - typedef struct _EntriesVcd_tag EntriesVcd_t; - typedef struct _LotVcd_tag LotVcd_t; - - typedef struct _PsdPlayListDescriptor_tag PsdPlayListDescriptor_t; - typedef struct _PsdSelectionListDescriptor_tag PsdSelectionListDescriptor_t; - - /* Overall data structure representing a VideoCD object. - Defined fully in info_private.h. - */ - typedef struct _VcdObj VcdObj; - - /* enum defining supported VideoCD types */ - typedef enum - { - VCD_TYPE_INVALID = 0, - VCD_TYPE_VCD, - VCD_TYPE_VCD11, - VCD_TYPE_VCD2, - VCD_TYPE_SVCD, - VCD_TYPE_HQVCD - } - vcd_type_t; - - /* The type of an playback control list ID (LID). */ - typedef uint16_t lid_t; - - /* The type of a segment number 0..1980 segment items possible. */ - typedef uint16_t segnum_t; - - /* (0,0) == upper left , (255,255) == lower right - setting all to zero disables area */ - PRAGMA_BEGIN_PACKED - struct psd_area_t - { - uint8_t x1; /* upper left */ - uint8_t y1; /* upper left */ - uint8_t x2; /* lower right */ - uint8_t y2; /* lower right */ - } GNUC_PACKED; - PRAGMA_END_PACKED - -#define struct_psd_area_t_SIZEOF 4 - -#define PSD_OFS_DISABLED 0xffff -#define PSD_OFS_MULTI_DEF 0xfffe -#define PSD_OFS_MULTI_DEF_NO_NUM 0xfffd - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __VCD_TYPES_H__ */ - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/libvcd/version.h b/src/input/vcd/libvcd/libvcd/version.h deleted file mode 100644 index 0cd2096d3..000000000 --- a/src/input/vcd/libvcd/libvcd/version.h +++ /dev/null @@ -1,11 +0,0 @@ -/* $Id: version.h,v 1.4 2005/04/27 23:28:42 rockyb Exp $ */ -/** \file version.h - * \brief A file simply containing the library version number. - */ - -/*! LIBVCD_VERSION can as a string in programs to show what version is used. */ -#define LIBVCD_VERSION "0.7.21-" - -/*! LIBCDIO_VERSION_NUM can be used for testing in the C preprocessor */ -#define LIBVCD_VERSION_NUM 21 - diff --git a/src/input/vcd/libvcd/logging.c b/src/input/vcd/libvcd/logging.c deleted file mode 100644 index 652a8090b..000000000 --- a/src/input/vcd/libvcd/logging.c +++ /dev/null @@ -1,145 +0,0 @@ -/* - $Id: logging.c,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2003 Rocky Bernstein <rocky@panix.com> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdlib.h> -#include <stdarg.h> -#include <stdio.h> - -/* Public headers */ -#include <libvcd/logging.h> - -/* Private headers */ -#include "vcd_assert.h" - -static const char _rcsid[] = "$Id: logging.c,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $"; - -vcd_log_level_t vcd_loglevel_default = VCD_LOG_WARN; - -static void -default_vcd_log_handler (vcd_log_level_t level, const char message[]) -{ - switch (level) - { - case VCD_LOG_ERROR: - if (level >= vcd_loglevel_default) { - fprintf (stderr, "**ERROR: %s\n", message); - fflush (stderr); - exit (EXIT_FAILURE); - } - break; - case VCD_LOG_DEBUG: - if (level >= vcd_loglevel_default) { - fprintf (stdout, "--DEBUG: %s\n", message); - } - break; - case VCD_LOG_WARN: - if (level >= vcd_loglevel_default) { - fprintf (stdout, "++ WARN: %s\n", message); - } - break; - case VCD_LOG_INFO: - if (level >= vcd_loglevel_default) { - fprintf (stdout, " INFO: %s\n", message); - } - break; - case VCD_LOG_ASSERT: - if (level >= vcd_loglevel_default) { - fprintf (stderr, "!ASSERT: %s\n", message); - fflush (stderr); - } - abort (); - break; - default: - vcd_assert_not_reached (); - break; - } - - fflush (stdout); -} - -static vcd_log_handler_t _handler = default_vcd_log_handler; - -vcd_log_handler_t -vcd_log_set_handler (vcd_log_handler_t new_handler) -{ - vcd_log_handler_t old_handler = _handler; - - _handler = new_handler; - - return old_handler; -} - -static void -vcd_logv (vcd_log_level_t level, const char format[], va_list args) -{ - char buf[1024] = { 0, }; - static int in_recursion = 0; - - if (in_recursion) - vcd_assert_not_reached (); - - in_recursion = 1; - - vsnprintf(buf, sizeof(buf)-1, format, args); - - _handler(level, buf); - - in_recursion = 0; -} - -void -vcd_log (vcd_log_level_t level, const char format[], ...) -{ - va_list args; - va_start (args, format); - vcd_logv (level, format, args); - va_end (args); -} - -#define VCD_LOG_TEMPLATE(level, LEVEL) \ -void \ -vcd_ ## level (const char format[], ...) \ -{ \ - va_list args; \ - va_start (args, format); \ - vcd_logv (VCD_LOG_ ## LEVEL, format, args); \ - va_end (args); \ -} - -VCD_LOG_TEMPLATE(debug, DEBUG) -VCD_LOG_TEMPLATE(info, INFO) -VCD_LOG_TEMPLATE(warn, WARN) -VCD_LOG_TEMPLATE(error, ERROR) - -#undef VCD_LOG_TEMPLATE - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/mpeg.c b/src/input/vcd/libvcd/mpeg.c deleted file mode 100644 index 545a44fbc..000000000 --- a/src/input/vcd/libvcd/mpeg.c +++ /dev/null @@ -1,1177 +0,0 @@ -/* - $Id: mpeg.c,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdio.h> - -#include <cdio/cdio.h> - -/* Private headers */ -#include "bitvec.h" -#include "mpeg.h" -#include "util.h" - -static const char _rcsid[] = "$Id: mpeg.c,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $"; - -#define MPEG_START_CODE_PATTERN ((uint32_t) 0x00000100) -#define MPEG_START_CODE_MASK ((uint32_t) 0xffffff00) - -#define MPEG_PICTURE_CODE ((uint32_t) 0x00000100) -/* [...slice codes... 0x1a7] */ - -#define MPEG_USER_CODE ((uint32_t) 0x000001b2) -#define MPEG_SEQUENCE_CODE ((uint32_t) 0x000001b3) -#define MPEG_EXT_CODE ((uint32_t) 0x000001b5) -#define MPEG_SEQ_END_CODE ((uint32_t) 0x000001b7) -#define MPEG_GOP_CODE ((uint32_t) 0x000001b8) -#define MPEG_PROGRAM_END_CODE ((uint32_t) 0x000001b9) -#define MPEG_PACK_HEADER_CODE ((uint32_t) 0x000001ba) -#define MPEG_SYSTEM_HEADER_CODE ((uint32_t) 0x000001bb) -#define MPEG_PRIVATE_1_CODE ((uint32_t) 0x000001bd) -#define MPEG_PAD_CODE ((uint32_t) 0x000001be) - -#define MPEG_AUDIO_C0_CODE ((uint32_t) 0x000001c0) /* default */ -#define MPEG_AUDIO_C1_CODE ((uint32_t) 0x000001c1) /* 2nd audio stream id (dual channel) */ -#define MPEG_AUDIO_C2_CODE ((uint32_t) 0x000001c2) /* 3rd audio stream id (surround sound) */ - -#define MPEG_VIDEO_E0_CODE ((uint32_t) 0x000001e0) /* motion */ -#define MPEG_VIDEO_E1_CODE ((uint32_t) 0x000001e1) /* lowres still */ -#define MPEG_VIDEO_E2_CODE ((uint32_t) 0x000001e2) /* hires still */ - -#define PICT_TYPE_I 1 -#define PICT_TYPE_P 2 -#define PICT_TYPE_B 3 -#define PICT_TYPE_D 4 - -static struct { - mpeg_norm_t norm; - unsigned hsize; - unsigned vsize; - int frate_idx; -} const norm_table[] = { - { MPEG_NORM_FILM, 352, 240, 1 }, - { MPEG_NORM_PAL, 352, 288, 3 }, - { MPEG_NORM_NTSC, 352, 240, 4 }, - { MPEG_NORM_PAL_S, 480, 576, 3 }, - { MPEG_NORM_NTSC_S, 480, 480, 4 }, - { MPEG_NORM_OTHER, } -}; - -static const double frame_rates[16] = { - 0.0, 24000.0/1001, 24.0, 25.0, - 30000.0/1001, 30.0, 50.0, 60000.0/1001, - 60.0, 0.0, -}; - -#ifdef DEBUG -# define MARKER(buf, offset) \ - vcd_assert (vcd_bitvec_read_bit (buf, offset) == 1) -#else -# define MARKER(buf, offset) \ - { if (GNUC_UNLIKELY (vcd_bitvec_read_bit (buf, offset) != 1)) vcd_debug ("mpeg: some marker is not set..."); } -#endif - -static inline bool -_start_code_p (uint32_t code) -{ - return (code & MPEG_START_CODE_MASK) == MPEG_START_CODE_PATTERN; -} - -static inline int -_vid_streamid_idx (uint8_t streamid) -{ - switch (streamid | MPEG_START_CODE_PATTERN) - { - case MPEG_VIDEO_E0_CODE: - return 0; - break; - - case MPEG_VIDEO_E1_CODE: - return 1; - break; - - case MPEG_VIDEO_E2_CODE: - return 2; - break; - - default: - vcd_assert_not_reached (); - break; - } - - return -1; -} - -static inline int -_aud_streamid_idx (uint8_t streamid) -{ - switch (streamid | MPEG_START_CODE_PATTERN) - { - case MPEG_AUDIO_C0_CODE: - return 0; - break; - - case MPEG_AUDIO_C1_CODE: - return 1; - break; - - case MPEG_AUDIO_C2_CODE: - return 2; - break; - - default: - vcd_assert_not_reached (); - break; - } - - return -1; -} - -/* used for SCR, PTS and DTS */ -static inline uint64_t -_parse_timecode (const uint8_t *buf, unsigned *offset) -{ - uint64_t _retval; - - _retval = vcd_bitvec_read_bits (buf, offset, 3); - - MARKER (buf, offset); - - _retval <<= 15; - _retval |= vcd_bitvec_read_bits (buf, offset, 15); - - MARKER (buf, offset); - - _retval <<= 15; - _retval |= vcd_bitvec_read_bits (buf, offset, 15); - - MARKER (buf, offset); - - return _retval; -} - -static void -_parse_sequence_header (uint8_t streamid, const uint8_t *buf, - VcdMpegStreamCtx *state) -{ - unsigned offset = 0; - unsigned hsize, vsize, aratio, frate, brate, bufsize, constr; - const uint8_t *data = buf; - const int vid_idx = _vid_streamid_idx (streamid); - - const double aspect_ratios[16] = - { - 0.0000, 1.0000, 0.6735, 0.7031, - 0.7615, 0.8055, 0.8437, 0.8935, - 0.9375, 0.9815, 1.0255, 1.0695, - 1.1250, 1.1575, 1.2015, 0.0000 - }; - - if (state->stream.shdr[vid_idx].seen) /* we have it already */ - return; - - hsize = vcd_bitvec_read_bits (data, &offset, 12); - - vsize = vcd_bitvec_read_bits (data, &offset, 12); - - aratio = vcd_bitvec_read_bits (data, &offset, 4); - - frate = vcd_bitvec_read_bits (data, &offset, 4); - - brate = vcd_bitvec_read_bits (data, &offset, 18); - - MARKER (data, &offset); - - bufsize = vcd_bitvec_read_bits (data, &offset, 10); - - constr = vcd_bitvec_read_bits (data, &offset, 1); - - /* skip intra quantizer matrix */ - - if (vcd_bitvec_read_bits (data, &offset, 1)) - offset += 64 << 3; - - /* skip non-intra quantizer matrix */ - - if (vcd_bitvec_read_bits (data, &offset, 1)) - offset += 64 << 3; - - state->stream.shdr[vid_idx].hsize = hsize; - state->stream.shdr[vid_idx].vsize = vsize; - state->stream.shdr[vid_idx].aratio = aspect_ratios[aratio]; - state->stream.shdr[vid_idx].frate = frame_rates[frate]; - state->stream.shdr[vid_idx].bitrate = 400 * brate; - state->stream.shdr[vid_idx].vbvsize = bufsize * 16 * 1024; - state->stream.shdr[vid_idx].constrained_flag = (constr != 0); - - state->stream.shdr[vid_idx].seen = true; -} - -static void -_parse_gop_header (uint8_t streamid, const uint8_t *buf, - VcdMpegStreamCtx *state) -{ - const uint8_t *data = buf; - unsigned offset = 0; - - bool drop_flag; - /* bool close_gop; */ - /* bool broken_link; */ - - unsigned hour, minute, second, frame; - - drop_flag = vcd_bitvec_read_bits(data, &offset, 1) != 0; - - hour = vcd_bitvec_read_bits(data, &offset, 5); - - minute = vcd_bitvec_read_bits(data, &offset, 6); - - MARKER (data, &offset); - - second = vcd_bitvec_read_bits(data, &offset, 6); - - frame = vcd_bitvec_read_bits(data, &offset, 6); - - /* close_gop = vcd_bitvec_read_bits(data, &offset, 1) != 0; */ - - /* broken_link = vcd_bitvec_read_bits(data, &offset, 1) != 0; */ - - state->packet.gop = true; - state->packet.gop_timecode.h = hour; - state->packet.gop_timecode.m = minute; - state->packet.gop_timecode.s = second; - state->packet.gop_timecode.f = frame; -} - -static inline void -_check_scan_data (const char str[], const msf_t *msf, - VcdMpegStreamCtx *state) -{ - char tmp[16]; - - if (state->stream.scan_data_warnings > VCD_MPEG_SCAN_DATA_WARNS) - return; - - if (state->stream.scan_data_warnings == VCD_MPEG_SCAN_DATA_WARNS) - { - vcd_warn ("mpeg user scan data: from now on, scan information " - "data errors will not be reported anymore---consider" - " enabling the 'update scan offsets' option, " - "if it is not enabled already!"); - state->stream.scan_data_warnings++; - return; - } - - if (msf->m == 0xff - && msf->s == 0xff - && msf->f == 0xff) - return; - - if ((msf->s & 0x80) == 0 - || (msf->f & 0x80) == 0) - { - snprintf (tmp, sizeof (tmp), "%.2x:%.2x.%.2x", msf->m, msf->s, msf->f); - - vcd_warn ("mpeg user scan data: msb of second or frame field " - "not set for '%s': [%s]", str, tmp); - - state->stream.scan_data_warnings++; - - return; - } - - if ((msf->m >> 4) > 9 - || ((0x80 ^ msf->s) >> 4) > 9 - || ((0x80 ^ msf->f) >> 4) > 9 - || (msf->m & 0xf) > 9 - || (msf->s & 0xf) > 9 - || (msf->f & 0xf) > 9) - { - snprintf (tmp, sizeof (tmp), "%.2x:%.2x.%.2x", - msf->m, 0x80 ^ msf->s, 0x80 ^ msf->f); - - vcd_warn ("mpeg user scan data: one or more BCD fields out of range " - "for '%s': [%s]", str, tmp); - - state->stream.scan_data_warnings++; - } -} - -static void -_parse_user_data (uint8_t streamid, const void *buf, unsigned len, - unsigned offset, - VcdMpegStreamCtx *state) -{ - unsigned pos = 0; - PRAGMA_BEGIN_PACKED - struct { - uint8_t tag; - uint8_t len; - uint8_t data[EMPTY_ARRAY_SIZE]; - } GNUC_PACKED const *udg = buf; - PRAGMA_END_PACKED - - if (udg->tag == 0x00) /* if first tag's already 0x00 */ - { - vcd_debug ("strange (possibly non-compliant) user_data seen..."); - } - else while (pos + 2 < len) - { - if (udg->tag == 0x00) - break; - - if (pos + udg->len >= len) - break; - - if (udg->len < 2) - break; - - switch (udg->tag) - { - case 0x00: - vcd_assert_not_reached (); - break; - - case 0x10: /* scan information */ - { - struct vcd_mpeg_scan_data_t *usdi = (void *) udg; - vcd_assert (sizeof (struct vcd_mpeg_scan_data_t) == 14); - - if (GNUC_UNLIKELY (usdi->len != 14)) - { - vcd_warn ("invalid user scan data length (%d != 14)", usdi->len); - break; - } - - vcd_assert (usdi->len == 14); - _check_scan_data ("previous_I_offset", &usdi->prev_ofs, state); - _check_scan_data ("next_I_offset ", &usdi->next_ofs, state); - _check_scan_data ("backward_I_offset", &usdi->back_ofs, state); - _check_scan_data ("forward_I_offset ", &usdi->forw_ofs, state); - - state->packet.scan_data_ptr = usdi; - state->stream.scan_data++; - } - break; - - case 0x11: /* closed caption data */ - vcd_debug ("closed caption data seen -- not supported yet (len = %d)", udg->len); - break; - - default: - vcd_warn ("unknown user data tag id 0x%.2x encountered", udg->tag); - return; /* since we cannot rely on udg->len anymore... */ - break; - } - - - pos += udg->len; - vcd_assert (udg->len >= 2); - udg = (void *) &udg->data[udg->len - 2]; - } - - vcd_assert (pos <= len); -} - -static int -_analyze_pes_header (const uint8_t *buf, int len, - VcdMpegStreamCtx *state) -{ - bool _has_pts = false; - bool _has_dts = false; - int64_t pts = 0; - mpeg_vers_t pes_mpeg_ver = MPEG_VERS_INVALID; - - int pos; - - if (vcd_bitvec_peek_bits (buf, 0, 2) == 2) /* %10 - ISO13818-1 */ - { - unsigned pos2 = 0; - - pes_mpeg_ver = MPEG_VERS_MPEG2; - - pos2 += 2; - - pos2 += 2; /* PES_scrambling_control */ - pos2++; /* PES_priority */ - pos2++; /* data_alignment_indicator */ - pos2++; /* copyright */ - pos2++; /* original_or_copy */ - - switch (vcd_bitvec_read_bits (buf, &pos2, 2)) /* PTS_DTS_flags */ - { - case 2: /* %10 */ - _has_pts = true; - break; - - case 3: /* %11 */ - _has_dts = _has_pts = true; - break; - - default: - /* NOOP */ - break; - } - - pos2++; /* ESCR_flag */ - - pos2++; /* */ - pos2++; /* */ - pos2++; /* */ - pos2++; /* */ - - pos2++; /* PES_extension_flag */ - - pos = vcd_bitvec_read_bits (buf, &pos2, 8); /* PES_header_data_length */ - pos += pos2 >> 3; - - if (_has_pts && _has_dts) - { - vcd_assert (vcd_bitvec_peek_bits (buf, pos2, 4) == 3); /* %0011 */ - pos2 += 4; - - pts = _parse_timecode (buf, &pos2); - - vcd_assert (vcd_bitvec_peek_bits (buf, pos2, 4) == 1); /* %0001 */ - pos2 += 4; - - /* dts = */ _parse_timecode (buf, &pos2); - } - else if (_has_pts) - { - vcd_assert (vcd_bitvec_peek_bits (buf, pos2, 4) == 2); /* %0010 */ - pos2 += 4; - - pts = _parse_timecode (buf, &pos2); - } - } - else /* ISO11172-1 */ - { - unsigned pos2 = 0; - - pes_mpeg_ver = MPEG_VERS_MPEG1; - - /* get rid of stuffing bytes */ - while (((pos2 + 8) < (len << 3)) - && vcd_bitvec_peek_bits (buf, pos2, 8) == 0xff) - pos2 += 8; - - if (vcd_bitvec_peek_bits (buf, pos2, 2) == 1) /* %01 */ - { - pos2 += 2; - - pos2++; /* STD_buffer_scale */ - pos2 += 13; /* STD_buffer_size */ - } - - switch (vcd_bitvec_peek_bits (buf, pos2, 4)) - { - case 0x2: /* %0010 */ - pos2 += 4; - _has_pts = true; - - pts = _parse_timecode (buf, &pos2); - break; - - case 0x3: /* %0011 */ - pos2 += 4; - - _has_dts = _has_pts = true; - pts = _parse_timecode (buf, &pos2); - - vcd_assert (vcd_bitvec_peek_bits (buf, pos2, 4) == 1); /* %0001 */ - pos2 += 4; - - /* dts = */ _parse_timecode (buf, &pos2); - break; - - case 0x0: /* %0000 */ - vcd_assert (vcd_bitvec_peek_bits (buf, pos2, 8) == 0x0f); - pos2 += 8; - break; - - case 0xf: /* %1111 - actually a syntax error! */ - vcd_assert (vcd_bitvec_peek_bits (buf, pos2, 8) == 0xff); - vcd_warn ("Unexpected stuffing byte noticed in ISO11172 PES header!"); - pos2 += 8; - break; - - default: - vcd_error ("Error in ISO11172 PES header"); - break; - } - - pos = pos2 >> 3; - } - - if (_has_pts) - { - double pts2; - - pts2 = (double) pts / 90000.0; - - if (!state->stream.seen_pts) - { - state->stream.max_pts = state->stream.min_pts = pts2; - state->stream.seen_pts = true; - } - else - { - state->stream.max_pts = MAX (state->stream.max_pts, pts2); - state->stream.min_pts = MIN (state->stream.min_pts, pts2); - } - - state->packet.has_pts = true; - state->packet.pts = pts2; - } - - if (state->stream.version != pes_mpeg_ver) - vcd_warn ("pack header mpeg version does not match pes header mpeg version"); - - return pos; -} - -static void -_analyze_audio_pes (uint8_t streamid, const uint8_t *buf, int len, bool only_pts, - VcdMpegStreamCtx *state) -{ - const int aud_idx = _aud_streamid_idx (streamid); - unsigned bitpos; - - vcd_assert (aud_idx != -1); - - bitpos = _analyze_pes_header (buf, len, state); - - /* if only pts extraction was needed, we are done here... */ - if (only_pts) - return; - - if (state->stream.ahdr[aud_idx].seen) - return; - - bitpos <<= 3; - - while (bitpos <= (len << 3)) - { - unsigned syncword = vcd_bitvec_peek_bits (buf, bitpos, 12); - - if (syncword != 0xfff) - { - bitpos += 8; - continue; - } - - bitpos += 12; - - if (GNUC_UNLIKELY (!vcd_bitvec_read_bits (buf, &bitpos, 1))) - { - vcd_debug ("non-MPEG1 audio stream header seen"); - break; - } - - switch (vcd_bitvec_read_bits (buf, &bitpos, 2)) /* layer */ - { - case 3: /* %11 */ - state->stream.ahdr[aud_idx].layer = 1; - break; - case 2: /* %10 */ - state->stream.ahdr[aud_idx].layer = 2; - break; - case 1: /* %01 */ - state->stream.ahdr[aud_idx].layer = 3; - break; - case 0: /* %00 */ - state->stream.ahdr[aud_idx].layer = 0; - break; - } - - bitpos++; /* protection_bit */ - - { - const int bits = vcd_bitvec_read_bits (buf, &bitpos, 4); - - const unsigned bit_rates[4][16] = { - {0, }, - {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0}, - {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0}, - {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0} - }; - - vcd_assert (IN(state->stream.ahdr[aud_idx].layer, 0, 3)); - vcd_assert (IN(bits, 0, 15)); - - state->stream.ahdr[aud_idx].bitrate = 1024 * bit_rates[state->stream.ahdr[aud_idx].layer][bits]; - } - - switch (vcd_bitvec_read_bits (buf, &bitpos, 2)) /* sampling_frequency */ - { - case 0: /* %00 */ - state->stream.ahdr[aud_idx].sampfreq = 44100; - break; - case 1: /* %01 */ - state->stream.ahdr[aud_idx].sampfreq = 48000; - break; - case 2: /* %10 */ - state->stream.ahdr[aud_idx].sampfreq = 32000; - break; - case 3: /* %11 */ - state->stream.ahdr[aud_idx].sampfreq = 0; - break; - } - - bitpos++; /* padding_bit */ - - bitpos++; /* private_bit */ - - state->stream.ahdr[aud_idx].mode = 1 + vcd_bitvec_read_bits (buf, &bitpos, 2); /* mode */ - - state->stream.ahdr[aud_idx].seen = true; - - /* we got the info, let's jump outta here */ - break; - } -} - -static void -_analyze_video_pes (uint8_t streamid, const uint8_t *buf, int len, bool only_pts, - VcdMpegStreamCtx *state) -{ - const int vid_idx = _vid_streamid_idx (streamid); - - int pos, pes_header; - int sequence_header_pos = -1; - int gop_header_pos = -1; - int ipicture_header_pos = -1; - - vcd_assert (vid_idx != -1); - - pes_header = pos = _analyze_pes_header (buf, len, state); - - /* if only pts extraction was needed, we are done here... */ - if (only_pts) - return; - - while (pos + 4 <= len) - { - uint32_t code = vcd_bitvec_peek_bits32 (buf, pos << 3); - - if (!_start_code_p (code)) - { - pos++; - continue; - } - - switch (code) - { - case MPEG_PICTURE_CODE: - pos += 4; - - if (vcd_bitvec_peek_bits (buf, (pos << 3) + 10, 3) == 1) - ipicture_header_pos = pos; - break; - - case MPEG_SEQUENCE_CODE: - pos += 4; - sequence_header_pos = pos; - _parse_sequence_header (streamid, buf + pos, state); - break; - - case MPEG_GOP_CODE: - pos += 4; - if (pos + 4 > len) - break; - gop_header_pos = pos; - _parse_gop_header (streamid, buf + pos, state); - state->packet.gop = true; - break; - - case MPEG_USER_CODE: - pos += 4; - if (pos + 4 > len) - break; - _parse_user_data (streamid, buf + pos, len - pos, pos, state); - break; - - case MPEG_EXT_CODE: - default: - pos += 4; - break; - } - } - - /* decide whether this packet qualifies as access point */ - state->packet.aps = APS_NONE; /* paranoia */ - - if (state->packet.has_pts - && ipicture_header_pos != -1) - { - enum aps_t _aps_type = APS_NONE; - - switch (state->stream.version) - { - case MPEG_VERS_MPEG1: - case MPEG_VERS_MPEG2: - if (sequence_header_pos != -1 - && sequence_header_pos < gop_header_pos - && gop_header_pos < ipicture_header_pos) - _aps_type = (sequence_header_pos - 4 == pes_header) ? APS_ASGI : APS_SGI; - else if (gop_header_pos != 1 - && gop_header_pos < ipicture_header_pos) - _aps_type = APS_GI; - else - _aps_type = APS_I; - - break; - - default: - break; - } - - if (_aps_type) - { - const double pts2 = state->packet.pts; - - if (state->stream.shdr[vid_idx].last_aps_pts > pts2) - vcd_warn ("APS' pts seems out of order (actual pts %f, last seen pts %f) " - "-- ignoring this aps", - pts2, state->stream.shdr[vid_idx].last_aps_pts); - else - { - state->packet.aps_idx = vid_idx; - state->packet.aps = _aps_type; - state->packet.aps_pts = pts2; - state->stream.shdr[vid_idx].last_aps_pts = pts2; - } - } - } -} - -static void -_register_streamid (uint8_t streamid, VcdMpegStreamCtx *state) -{ - const uint32_t code = MPEG_START_CODE_PATTERN | streamid; - - switch (code) - { - case MPEG_VIDEO_E0_CODE: - case MPEG_VIDEO_E1_CODE: - case MPEG_VIDEO_E2_CODE: - state->packet.video[_vid_streamid_idx (streamid)] = true; - break; - - case MPEG_AUDIO_C0_CODE: - case MPEG_AUDIO_C1_CODE: - case MPEG_AUDIO_C2_CODE: - state->packet.audio[_aud_streamid_idx (streamid)] = true; - break; - - case MPEG_PAD_CODE: - state->packet.padding = true; - break; - - case MPEG_SYSTEM_HEADER_CODE: - state->packet.system_header = true; - break; - } -} - -static void -_analyze_system_header (const uint8_t *buf, int len, - VcdMpegStreamCtx *state) -{ - unsigned bitpos = 0; - - MARKER (buf, &bitpos); - - bitpos += 22; /* rate_bound */ - - MARKER (buf, &bitpos); - - bitpos += 6; /* audio_bound */ - - bitpos++; /* fixed_flag */ - bitpos++; /* CSPS_flag */ - bitpos++; /* system_audio_lock_flag */ - bitpos++; /* system_video_lock_flag */ - - MARKER (buf, &bitpos); - - bitpos += 5; /* video_bound */ - - bitpos += 1; /* packet_rate_restriction_flag -- only ISO 13818-1 */ - bitpos += 7; /* reserved */ - - while (vcd_bitvec_peek_bits (buf, bitpos, 1) == 1 - && bitpos <= (len << 3)) - { - const uint8_t stream_id = vcd_bitvec_read_bits (buf, &bitpos, 8); - - bitpos += 2; /* %11 */ - - bitpos++; /* P-STD_buffer_bound_scale */ - bitpos += 13; /* P-STD_buffer_size_bound */ - - _register_streamid (stream_id, state); - } - - vcd_assert (bitpos <= (len << 3)); -} - -static void -_analyze_private_1_stream (const uint8_t *buf, int len, - VcdMpegStreamCtx *state) -{ - unsigned bitpos = _analyze_pes_header (buf, len, state); - int ogt_idx = -1; - - uint8_t private_data_id; - - bitpos <<= 3; - - private_data_id = vcd_bitvec_read_bits (buf, &bitpos, 8); - - switch (private_data_id) - { - uint8_t sub_stream_id; - - case 0x00: - case 0x01: - case 0x02: - case 0x03: - /* CVD subs */ - ogt_idx = private_data_id; - - if (!state->stream.ogt[ogt_idx]) - vcd_debug ("Assuming CVD-style subtitles for data_id 0x%.2x in private stream 1", ogt_idx); - - break; - - case 0x70: - /* SVCD OGT */ - sub_stream_id = vcd_bitvec_read_bits (buf, &bitpos, 8); - - if (sub_stream_id < 4) - { - ogt_idx = sub_stream_id; - if (!state->stream.ogt[ogt_idx]) - vcd_debug ("subtitles detect for channel 0x%.2x", ogt_idx); - } - else - vcd_warn ("sub_stream_id out of range (0x%.2x)", sub_stream_id); - break; - - default: - vcd_warn ("unknown private_data_id for private stream 1 seen (0x%.2x)", - private_data_id); - return; - break; - } - - if (ogt_idx >= 0) - state->stream.ogt[ogt_idx] = state->packet.ogt[ogt_idx] = true; -} - -int -vcd_mpeg_parse_packet (const void *_buf, unsigned buflen, bool parse_pes, - VcdMpegStreamCtx *ctx) -{ - const uint8_t *buf = _buf; - int pos; - - vcd_assert (buf != NULL); - vcd_assert (ctx != NULL); - - /* clear packet info */ - memset (&(ctx->packet), 0, sizeof (ctx->packet)); - - ctx->stream.packets++; - - for (pos = 0; pos < buflen && !buf[pos]; pos++); - - if (pos == buflen) - { - ctx->packet.zero = true; - return buflen; - } - - /* verify the packet begins with a pack header */ - if (vcd_bitvec_peek_bits32 (buf, 0) != MPEG_PACK_HEADER_CODE) - { - const uint32_t _code = vcd_bitvec_peek_bits32 (buf, 0); - - vcd_warn ("mpeg scan: pack header code (0x%8.8x) expected, " - "but 0x%8.8x found (buflen = %d)", - (unsigned int) MPEG_PACK_HEADER_CODE, - (unsigned int) _code, buflen); - - ctx->stream.packets--; - - if (!ctx->stream.packets) - { - if (_code == MPEG_SEQUENCE_CODE) - vcd_warn ("...this looks like a elementary video stream" - " but a multiplexed program stream was required."); - - if ((0xfff00000 & _code) == 0xfff00000) - vcd_warn ("...this looks like a elementary audio stream" - " but a multiplexed program stream was required."); - - if (_code == 0x52494646) - vcd_warn ("...this looks like a RIFF header" - " but a plain multiplexed program stream was required."); - } - else if (_code == MPEG_PROGRAM_END_CODE) - vcd_warn ("...PEM (program end marker) found instead of pack header;" - " should be in last 4 bytes of pack"); - - return 0; - } - - /* take a look at the pack header */ - pos = 0; - - while (pos + 4 <= buflen) - { - uint32_t code = vcd_bitvec_peek_bits32 (buf, pos << 3); - - /* skip zero bytes... */ - if (!code) - { - pos += (pos + 4 == buflen) ? 4 : 2; - continue; - } - - /* continue until start code seen */ - if (!_start_code_p (code)) - { - pos++; - continue; - } - - switch (code) - { - uint16_t size; - int bits; - unsigned bitpos; - - case MPEG_PACK_HEADER_CODE: - if (pos) - return pos; - - pos += 4; - - bitpos = pos << 3; - bits = vcd_bitvec_peek_bits (buf, bitpos, 4); - - if (bits == 0x2) /* %0010 ISO11172-1 */ - { - uint64_t _scr; - uint32_t _muxrate; - - bitpos += 4; - - if (!ctx->stream.version) - ctx->stream.version = MPEG_VERS_MPEG1; - - if (ctx->stream.version != MPEG_VERS_MPEG1) - vcd_warn ("mixed mpeg versions?"); - - _scr = _parse_timecode (buf, &bitpos); - - MARKER (buf, &bitpos); - - _muxrate = vcd_bitvec_read_bits (buf, &bitpos, 22); - - MARKER (buf, &bitpos); - - vcd_assert (bitpos % 8 == 0); - pos = bitpos >> 3; - - ctx->packet.scr = _scr; - ctx->stream.muxrate = ctx->packet.muxrate = _muxrate * 50 * 8; - } - else if (bits >> 2 == 0x1) /* %01xx ISO13818-1 */ - { - uint64_t _scr; - uint32_t _muxrate; - int tmp; - - bitpos += 2; - - if (!ctx->stream.version) - ctx->stream.version = MPEG_VERS_MPEG2; - - if (ctx->stream.version != MPEG_VERS_MPEG2) - vcd_warn ("mixed mpeg versions?"); - - _scr = _parse_timecode (buf, &bitpos); - - _scr *= 300; - _scr += vcd_bitvec_read_bits (buf, &bitpos, 9); /* SCR ext */ - - MARKER (buf, &bitpos); - - _muxrate = vcd_bitvec_read_bits (buf, &bitpos, 22); - - MARKER (buf, &bitpos); - MARKER (buf, &bitpos); - - bitpos += 5; /* reserved */ - - tmp = vcd_bitvec_read_bits (buf, &bitpos, 3) << 3; - - bitpos += tmp; - - vcd_assert (bitpos % 8 == 0); - pos = bitpos >> 3; - - ctx->packet.scr = _scr; - ctx->stream.muxrate = ctx->packet.muxrate = _muxrate * 50 * 8; - } - else - { - vcd_warn ("packet not recognized as either version 1 or 2 (%d)" - " -- assuming v1", bits); - } - - break; - - case MPEG_SYSTEM_HEADER_CODE: - case MPEG_PAD_CODE: - case MPEG_PRIVATE_1_CODE: - case MPEG_VIDEO_E0_CODE: - case MPEG_VIDEO_E1_CODE: - case MPEG_VIDEO_E2_CODE: - case MPEG_AUDIO_C0_CODE: - case MPEG_AUDIO_C1_CODE: - case MPEG_AUDIO_C2_CODE: - pos += 4; - size = vcd_bitvec_peek_bits16 (buf, pos << 3); - pos += 2; - - if (pos + size > buflen) - { - vcd_warn ("packet length beyond buffer" - " (pos = %d + size = %d > buflen = %d) " - "-- stream may be truncated or packet length > 2324 bytes!", - pos, size, buflen); - ctx->stream.packets--; - return 0; - } - - _register_streamid (code & 0xff, ctx); - - switch (code) - { - case MPEG_SYSTEM_HEADER_CODE: - _analyze_system_header (buf + pos, size, ctx); - break; - - case MPEG_VIDEO_E0_CODE: - case MPEG_VIDEO_E1_CODE: - case MPEG_VIDEO_E2_CODE: - _analyze_video_pes (code & 0xff, buf + pos, size, !parse_pes, ctx); - break; - - case MPEG_AUDIO_C0_CODE: - case MPEG_AUDIO_C1_CODE: - case MPEG_AUDIO_C2_CODE: - _analyze_audio_pes (code & 0xff, buf + pos, size, !parse_pes, ctx); - break; - - case MPEG_PRIVATE_1_CODE: - _analyze_private_1_stream (buf + pos, size, ctx); - break; - } - - pos += size; - break; - - case MPEG_PROGRAM_END_CODE: - ctx->packet.pem = true; - pos += 4; - break; - - case MPEG_PICTURE_CODE: - pos += 3; - break; - - default: - vcd_debug ("unexpected start code 0x%8.8x", (unsigned int) code); - pos += 4; - break; - } - } - - if (pos != buflen) - vcd_debug ("pos != buflen (%d != %d)", pos, buflen); /* fixme? */ - - return buflen; -} - -mpeg_norm_t -vcd_mpeg_get_norm (const struct vcd_mpeg_stream_vid_info *_info) -{ - int i; - - for (i = 0; norm_table[i].norm != MPEG_NORM_OTHER;i++) - if (norm_table[i].hsize == _info->hsize - && norm_table[i].vsize == _info->vsize - && frame_rates[norm_table[i].frate_idx] == _info->frate) - break; - - return norm_table[i].norm; -} - -enum vcd_mpeg_packet_type -vcd_mpeg_packet_get_type (const struct vcd_mpeg_packet_info *_info) -{ - if (_info->video[0] - || _info->video[1] - || _info->video[2]) - return PKT_TYPE_VIDEO; - else if (_info->audio[0] - || _info->audio[1] - || _info->audio[2]) - return PKT_TYPE_AUDIO; - else if (_info->zero) - return PKT_TYPE_ZERO; - else if (_info->ogt[0] - || _info->ogt[1] - || _info->ogt[2] - || _info->ogt[3]) - return PKT_TYPE_OGT; - else if (_info->system_header || _info->padding) - return PKT_TYPE_EMPTY; - - return PKT_TYPE_INVALID; -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/mpeg.h b/src/input/vcd/libvcd/mpeg.h deleted file mode 100644 index 2d28d2aef..000000000 --- a/src/input/vcd/libvcd/mpeg.h +++ /dev/null @@ -1,194 +0,0 @@ -/* - $Id: mpeg.h,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifndef __VCD_MPEG_H__ -#define __VCD_MPEG_H__ - -#include <string.h> - -/* Public headers */ -#include <libvcd/logging.h> -#include <libvcd/types.h> - -/* Private headers */ -#include "data_structures.h" - -typedef enum { - MPEG_VERS_INVALID = 0, - MPEG_VERS_MPEG1 = 1, - MPEG_VERS_MPEG2 = 2 -} mpeg_vers_t; - -PRAGMA_BEGIN_PACKED -struct vcd_mpeg_scan_data_t { - uint8_t tag; - uint8_t len; - msf_t prev_ofs; - msf_t next_ofs; - msf_t back_ofs; - msf_t forw_ofs; -} GNUC_PACKED; -PRAGMA_END_PACKED - -#define struct_vcd_mpeg_scan_data_t_SIZEOF 14 - -#define VCD_MPEG_SCAN_DATA_WARNS 8 - -typedef struct { - struct vcd_mpeg_packet_info { - bool video[3]; - bool audio[3]; - bool ogt[4]; - - bool padding; - bool pem; - bool zero; - bool system_header; - - struct vcd_mpeg_scan_data_t *scan_data_ptr; /* points into actual packet memory! */ - - enum aps_t { - APS_NONE = 0, - APS_I, /* iframe */ - APS_GI, /* gop + iframe */ - APS_SGI, /* sequence + gop + iframe */ - APS_ASGI /* aligned sequence + gop + iframe */ - } aps; - double aps_pts; - int aps_idx; - - bool has_pts; - double pts; - - uint64_t scr; - unsigned muxrate; - - bool gop; - struct { - uint8_t h, m, s, f; - } gop_timecode; - } packet; - - struct vcd_mpeg_stream_info { - unsigned packets; - - mpeg_vers_t version; - - bool ogt[4]; - - struct vcd_mpeg_stream_vid_info { - bool seen; - unsigned hsize; - unsigned vsize; - double aratio; - double frate; - unsigned bitrate; - unsigned vbvsize; - bool constrained_flag; - - CdioList *aps_list; /* filled up by vcd_mpeg_source */ - double last_aps_pts; /* temp, see ->packet */ - - } shdr[3]; - - struct vcd_mpeg_stream_aud_info { - bool seen; - unsigned layer; - unsigned bitrate; - unsigned sampfreq; - enum { - MPEG_STEREO = 1, - MPEG_JOINT_STEREO, - MPEG_DUAL_CHANNEL, - MPEG_SINGLE_CHANNEL - } mode; - } ahdr[3]; - - unsigned muxrate; - - bool seen_pts; - double min_pts; - double max_pts; - - double playing_time; - - unsigned scan_data; - unsigned scan_data_warnings; - } stream; -} VcdMpegStreamCtx; - -int -vcd_mpeg_parse_packet (const void *buf, unsigned buflen, bool parse_pes, - VcdMpegStreamCtx *ctx); - -typedef enum { - MPEG_NORM_OTHER, - MPEG_NORM_PAL, - MPEG_NORM_NTSC, - MPEG_NORM_FILM, - MPEG_NORM_PAL_S, - MPEG_NORM_NTSC_S -} mpeg_norm_t; - -mpeg_norm_t -vcd_mpeg_get_norm (const struct vcd_mpeg_stream_vid_info *_info); - -enum vcd_mpeg_packet_type { - PKT_TYPE_INVALID = 0, - PKT_TYPE_VIDEO, - PKT_TYPE_AUDIO, - PKT_TYPE_OGT, - PKT_TYPE_ZERO, - PKT_TYPE_EMPTY -}; - -enum vcd_mpeg_packet_type -vcd_mpeg_packet_get_type (const struct vcd_mpeg_packet_info *_info); - -struct vcd_mpeg_stream_vid_type { - enum { - VID_TYPE_NONE = 0, - VID_TYPE_MOTION, - VID_TYPE_STILL - } type; - enum { - VID_NORM_OTHER = 0, - VID_NORM_PAL, - VID_NORM_NTSC - } norm; - enum { - VID_RES_OTHER = 0, - VID_RES_SIF, - VID_RES_HALF_D1, - VID_RES_2_3_D1, - VID_RES_FULL_D2 - } resolution; -}; - -#endif /* __VCD_MPEG_H__ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/mpeg_stream.c b/src/input/vcd/libvcd/mpeg_stream.c deleted file mode 100644 index e5466766a..000000000 --- a/src/input/vcd/libvcd/mpeg_stream.c +++ /dev/null @@ -1,487 +0,0 @@ -/* - $Id: mpeg_stream.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2000, 2004 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <string.h> -#include <stdio.h> -#include <stdlib.h> - -#include <cdio/cdio.h> -#include <cdio/bytesex.h> - -#include <libvcd/logging.h> - -/* Private headers */ -#include "vcd_assert.h" -#include "mpeg_stream.h" -#include "data_structures.h" -#include "mpeg.h" -#include "util.h" - -static const char _rcsid[] = "$Id: mpeg_stream.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $"; - -struct _VcdMpegSource -{ - VcdDataSource *data_source; - - bool scanned; - - /* _get_packet cache */ - unsigned _read_pkt_pos; - unsigned _read_pkt_no; - - struct vcd_mpeg_stream_info info; -}; - -/* - * access functions - */ - -VcdMpegSource * -vcd_mpeg_source_new (VcdDataSource *mpeg_file) -{ - VcdMpegSource *new_obj; - - vcd_assert (mpeg_file != NULL); - - new_obj = _vcd_malloc (sizeof (VcdMpegSource)); - - new_obj->data_source = mpeg_file; - new_obj->scanned = false; - - return new_obj; -} - -void -vcd_mpeg_source_destroy (VcdMpegSource *obj, bool destroy_file_obj) -{ - int i; - vcd_assert (obj != NULL); - - if (destroy_file_obj) - vcd_data_source_destroy (obj->data_source); - - for (i = 0; i < 3; i++) - if (obj->info.shdr[i].aps_list) - _cdio_list_free (obj->info.shdr[i].aps_list, true); - - free (obj); -} - -const struct vcd_mpeg_stream_info * -vcd_mpeg_source_get_info (VcdMpegSource *obj) -{ - vcd_assert (obj != NULL); - - vcd_assert (obj->scanned); - - return &(obj->info); -} - -long -vcd_mpeg_source_stat (VcdMpegSource *obj) -{ - vcd_assert (obj != NULL); - vcd_assert (!obj->scanned); - - return obj->info.packets * 2324; -} - -void -vcd_mpeg_source_scan (VcdMpegSource *obj, bool strict_aps, bool fix_scan_info, - vcd_mpeg_prog_cb_t callback, void *user_data) -{ - unsigned length = 0; - unsigned pos = 0; - unsigned pno = 0; - unsigned padbytes = 0; - unsigned padpackets = 0; - VcdMpegStreamCtx state; - CdioListNode *n; - vcd_mpeg_prog_info_t _progress = { 0, }; - - vcd_assert (obj != NULL); - - if (obj->scanned) - { - vcd_debug ("already scanned... not rescanning"); - return; - } - - vcd_assert (!obj->scanned); - - memset (&state, 0, sizeof (state)); - - if (fix_scan_info) - state.stream.scan_data_warnings = VCD_MPEG_SCAN_DATA_WARNS + 1; - - vcd_data_source_seek (obj->data_source, 0); - length = vcd_data_source_stat (obj->data_source); - - if (callback) - { - _progress.length = length; - callback (&_progress, user_data); - } - - - while (pos < length) - { - char buf[2324] = { 0, }; - int read_len = MIN (sizeof (buf), (length - pos)); - int pkt_len; - - vcd_data_source_read (obj->data_source, buf, read_len, 1); - - pkt_len = vcd_mpeg_parse_packet (buf, read_len, true, &state); - - if (!pkt_len) - { - if (!pno) - vcd_error ("input mpeg stream has been deemed invalid -- aborting"); - - vcd_warn ("bad packet at packet #%d (stream byte offset %d)" - " -- remaining %d bytes of stream will be ignored", - pno, pos, length - pos); - - pos = length; /* don't fall into assert... */ - break; - } - - if (callback && (pos - _progress.current_pos) > (length / 100)) - { - _progress.current_pos = pos; - _progress.current_pack = pno; - callback (&_progress, user_data); - } - - switch (state.packet.aps) - { - case APS_NONE: - break; - - case APS_I: - case APS_GI: - if (strict_aps) - break; /* allow only if now strict aps */ - - case APS_SGI: - case APS_ASGI: - { - struct aps_data *_data = _vcd_malloc (sizeof (struct aps_data)); - - _data->packet_no = pno; - _data->timestamp = state.packet.aps_pts; - - if (!state.stream.shdr[state.packet.aps_idx].aps_list) - state.stream.shdr[state.packet.aps_idx].aps_list = _cdio_list_new (); - - _cdio_list_append (state.stream.shdr[state.packet.aps_idx].aps_list, _data); - } - break; - - default: - vcd_assert_not_reached (); - break; - } - - pos += pkt_len; - pno++; - - if (pkt_len != read_len) - { - padbytes += (2324 - pkt_len); - - if (!padpackets) - vcd_warn ("mpeg stream will be padded on the fly -- hope that's ok for you!"); - - padpackets++; - - vcd_data_source_seek (obj->data_source, pos); - } - } - - vcd_data_source_close (obj->data_source); - - if (callback) - { - _progress.current_pos = pos; - _progress.current_pack = pno; - callback (&_progress, user_data); - } - - vcd_assert (pos == length); - - obj->info = state.stream; - obj->scanned = true; - - obj->info.playing_time = obj->info.max_pts - obj->info.min_pts; - - if (obj->info.min_pts) - vcd_debug ("pts start offset %f (max pts = %f)", - obj->info.min_pts, obj->info.max_pts); - - vcd_debug ("playing time %f", obj->info.playing_time); - - if (!state.stream.scan_data && state.stream.version == MPEG_VERS_MPEG2) - vcd_warn ("mpeg stream contained no scan information (user) data"); - - { - int i; - - for (i = 0; i < 3; i++) - if (obj->info.shdr[i].aps_list) - _CDIO_LIST_FOREACH (n, obj->info.shdr[i].aps_list) - { - struct aps_data *_data = _cdio_list_node_data (n); - - _data->timestamp -= obj->info.min_pts; - } - } - - if (padpackets) - vcd_warn ("autopadding requires to insert additional %d zero bytes" - " into MPEG stream (due to %d unaligned packets of %d total)", - padbytes, padpackets, state.stream.packets); - - obj->info.version = state.stream.version; -} - -static double -_approx_pts (CdioList *aps_list, uint32_t packet_no) -{ - double retval = 0; - CdioListNode *node; - - struct aps_data *_laps = NULL; - - double last_pts_ratio = 0; - - _CDIO_LIST_FOREACH (node, aps_list) - { - struct aps_data *_aps = _cdio_list_node_data (node); - - if (_laps) - { - long p = _aps->packet_no; - double t = _aps->timestamp; - - p -= _laps->packet_no; - t -= _laps->timestamp; - - last_pts_ratio = t / p; - } - - if (_aps->packet_no >= packet_no) - break; - - _laps = _aps; - } - - retval = packet_no; - retval -= _laps->packet_no; - retval *= last_pts_ratio; - retval += _laps->timestamp; - - return retval; -} - -static void -_set_scan_msf (msf_t *_msf, long lsn) -{ - if (lsn == -1) - { - _msf->m = _msf->s = _msf->f = 0xff; - return; - } - - cdio_lba_to_msf (lsn, _msf); - _msf->s |= 0x80; - _msf->f |= 0x80; -} - -static void -_fix_scan_info (struct vcd_mpeg_scan_data_t *scan_data_ptr, - unsigned packet_no, double pts, CdioList *aps_list) -{ - CdioListNode *node; - long _next = -1, _prev = -1, _forw = -1, _back = -1; - - _CDIO_LIST_FOREACH (node, aps_list) - { - struct aps_data *_aps = _cdio_list_node_data (node); - - if (_aps->packet_no == packet_no) - continue; - else if (_aps->packet_no < packet_no) - { - _prev = _aps->packet_no; - - if (pts - _aps->timestamp < 10 && _back == -1) - _back = _aps->packet_no; - } - else if (_aps->packet_no > packet_no) - { - if (_next == -1) - _next = _aps->packet_no; - - if (_aps->timestamp - pts < 10) - _forw = _aps->packet_no; - } - } - - if (_back == -1) - _back = packet_no; - - if (_forw == -1) - _forw = packet_no; - - _set_scan_msf (&scan_data_ptr->prev_ofs, _prev); - _set_scan_msf (&scan_data_ptr->next_ofs, _next); - _set_scan_msf (&scan_data_ptr->back_ofs, _back); - _set_scan_msf (&scan_data_ptr->forw_ofs, _forw); -} - -int -vcd_mpeg_source_get_packet (VcdMpegSource *obj, unsigned long packet_no, - void *packet_buf, struct vcd_mpeg_packet_info *flags, - bool fix_scan_info) -{ - unsigned length; - unsigned pos; - unsigned pno; - VcdMpegStreamCtx state; - - vcd_assert (obj != NULL); - vcd_assert (obj->scanned); - vcd_assert (packet_buf != NULL); - - if (packet_no >= obj->info.packets) - { - vcd_error ("invalid argument"); - return -1; - } - - if (packet_no < obj->_read_pkt_no) - { - vcd_warn ("rewinding mpeg stream..."); - obj->_read_pkt_no = 0; - obj->_read_pkt_pos = 0; - } - - memset (&state, 0, sizeof (state)); - state.stream.seen_pts = true; - state.stream.min_pts = obj->info.min_pts; - state.stream.scan_data_warnings = VCD_MPEG_SCAN_DATA_WARNS + 1; - - pos = obj->_read_pkt_pos; - pno = obj->_read_pkt_no; - length = vcd_data_source_stat (obj->data_source); - - vcd_data_source_seek (obj->data_source, pos); - - while (pos < length) - { - char buf[2324] = { 0, }; - int read_len = MIN (sizeof (buf), (length - pos)); - int pkt_len; - - vcd_data_source_read (obj->data_source, buf, read_len, 1); - - pkt_len = vcd_mpeg_parse_packet (buf, read_len, - fix_scan_info, &state); - - vcd_assert (pkt_len > 0); - - if (pno == packet_no) - { - /* optimized for sequential access, - thus save pointer to next mpeg pack */ - obj->_read_pkt_pos = pos + pkt_len; - obj->_read_pkt_no = pno + 1; - - if (fix_scan_info - && state.packet.scan_data_ptr - && obj->info.version == MPEG_VERS_MPEG2) - { - int vid_idx = 0; - double _pts; - - if (state.packet.video[2]) - vid_idx = 2; - else if (state.packet.video[1]) - vid_idx = 1; - else - vid_idx = 0; - - if (state.packet.has_pts) - _pts = state.packet.pts - obj->info.min_pts; - else - _pts = _approx_pts (obj->info.shdr[vid_idx].aps_list, packet_no); - - _fix_scan_info (state.packet.scan_data_ptr, packet_no, - _pts, obj->info.shdr[vid_idx].aps_list); - } - - memset (packet_buf, 0, 2324); - memcpy (packet_buf, buf, pkt_len); - - if (flags) - { - *flags = state.packet; - flags->pts -= obj->info.min_pts; - } - - return 0; /* breaking out */ - } - - pos += pkt_len; - pno++; - - if (pkt_len != read_len) - vcd_data_source_seek (obj->data_source, pos); - } - - vcd_assert (pos == length); - - vcd_error ("shouldnt be reached..."); - - return -1; -} - -void -vcd_mpeg_source_close (VcdMpegSource *obj) -{ - vcd_assert (obj != NULL); - - vcd_data_source_close (obj->data_source); -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/mpeg_stream.h b/src/input/vcd/libvcd/mpeg_stream.h deleted file mode 100644 index 14f73d928..000000000 --- a/src/input/vcd/libvcd/mpeg_stream.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - $Id: mpeg_stream.h,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifndef __VCD_MPEG_STREAM__ -#define __VCD_MPEG_STREAM__ - -#include <libvcd/types.h> - -/* Private includes */ -#include "stream.h" -#include "data_structures.h" -#include "mpeg.h" - -#define MPEG_PACKET_SIZE 2324 - -typedef struct _VcdMpegSource VcdMpegSource; - -/* used in APS list */ - -struct aps_data -{ - uint32_t packet_no; - double timestamp; -}; - -/* enums */ - -typedef enum { - MPEG_AUDIO_NOSTREAM = 0, - MPEG_AUDIO_1STREAM = 1, - MPEG_AUDIO_2STREAM = 2, - MPEG_AUDIO_EXT_STREAM = 3 -} mpeg_audio_t; - -typedef enum { - MPEG_VIDEO_NOSTREAM = 0, - MPEG_VIDEO_NTSC_STILL = 1, - MPEG_VIDEO_NTSC_STILL2 = 2, - MPEG_VIDEO_NTSC_MOTION = 3, - - MPEG_VIDEO_PAL_STILL = 5, - MPEG_VIDEO_PAL_STILL2 = 6, - MPEG_VIDEO_PAL_MOTION = 7 -} mpeg_video_t; - -/* mpeg stream info */ - -struct vcd_mpeg_stream_info; - -/* mpeg packet info */ - -struct vcd_mpeg_packet_info; - -/* access functions */ - -VcdMpegSource * -vcd_mpeg_source_new (VcdDataSource *mpeg_file); - -/* scan the mpeg file... needed to be called only once */ -typedef struct { - long current_pack; - long current_pos; - long length; -} vcd_mpeg_prog_info_t; - -typedef int (*vcd_mpeg_prog_cb_t) (const vcd_mpeg_prog_info_t *progress_info, - void *user_data); - -void -vcd_mpeg_source_scan (VcdMpegSource *obj, bool strict_aps, bool fix_scan_info, - vcd_mpeg_prog_cb_t callback, void *user_data); - -/* gets the packet at given position */ -int -vcd_mpeg_source_get_packet (VcdMpegSource *obj, unsigned long packet_no, - void *packet_buf, struct vcd_mpeg_packet_info *flags, - bool fix_scan_info); - -void -vcd_mpeg_source_close (VcdMpegSource *obj); - -const struct vcd_mpeg_stream_info * -vcd_mpeg_source_get_info (VcdMpegSource *obj); - -long -vcd_mpeg_source_stat (VcdMpegSource *obj); - -void -vcd_mpeg_source_destroy (VcdMpegSource *obj, bool destroy_file_obj); - -#endif /* __VCD_MPEG_STREAM__ */ - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/obj.h b/src/input/vcd/libvcd/obj.h deleted file mode 100644 index d6849a3ab..000000000 --- a/src/input/vcd/libvcd/obj.h +++ /dev/null @@ -1,202 +0,0 @@ -/* - $Id: obj.h,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifndef __VCD_OBJ_H__ -#define __VCD_OBJ_H__ - -#include <cdio/iso9660.h> -#include <libvcd/files.h> - -/* Private headers */ -#include "data_structures.h" -#include "directory.h" -#include "image_sink.h" -#include "mpeg_stream.h" -#include "salloc.h" -#include "vcd.h" - -typedef struct { - double time; - struct aps_data aps; - char *id; -} entry_t; - -typedef struct { - double time; - char *id; -} pause_t; - -typedef struct { - VcdMpegSource *source; - char *id; - const struct vcd_mpeg_stream_info *info; - - CdioList *pause_list; /* pause_t */ - - char *default_entry_id; - CdioList *entry_list; /* entry_t */ - - /* pbc ref check */ - bool referenced; - - /* computed on sector allocation */ - unsigned relative_start_extent; /* relative to iso data end */ -} mpeg_sequence_t; - -/* work in progress -- fixme rename all occurences */ -#define mpeg_track_t mpeg_sequence_t -#define mpeg_track_list mpeg_sequence_list - -typedef struct { - VcdMpegSource *source; - char *id; - const struct vcd_mpeg_stream_info *info; - - CdioList *pause_list; /* pause_t */ - - /* pbc ref check */ - bool referenced; - - /* computed through info */ - unsigned segment_count; - - /* computed on sector allocation */ - unsigned start_extent; -} mpeg_segment_t; - - -typedef struct { - char *iso_pathname; - VcdDataSource *file; - bool raw_flag; - - uint32_t size; - uint32_t start_extent; - uint32_t sectors; -} custom_file_t; - -struct _VcdObj { - vcd_type_t type; - - /* VCD 3.0 chinese SVCD compat flags */ - bool svcd_vcd3_mpegav; - bool svcd_vcd3_entrysvd; - bool svcd_vcd3_tracksvd; - bool svcd_vcd3_spiconsv; - - bool update_scan_offsets; - bool relaxed_aps; - - unsigned leadout_pregap; - unsigned track_pregap; - unsigned track_front_margin; - unsigned track_rear_margin; - - /* output */ - VcdImageSink *image_sink; - - /* ... */ - unsigned iso_size; - char *iso_volume_label; - char *iso_publisher_id; - char *iso_application_id; - char *iso_preparer_id; - - char *info_album_id; - unsigned info_volume_count; - unsigned info_volume_number; - unsigned info_restriction; - bool info_use_seq2; - bool info_use_lid2; - - /* input */ - unsigned mpeg_segment_start_extent; - CdioList *mpeg_segment_list; /* mpeg_segment_t */ - - CdioList *mpeg_sequence_list; /* mpeg_sequence_t */ - - unsigned relative_end_extent; /* last mpeg sequence track end extent */ - - /* PBC */ - CdioList *pbc_list; /* pbc_t */ - unsigned psd_size; - unsigned psdx_size; - - /* custom files */ - unsigned ext_file_start_extent; - unsigned custom_file_start_extent; - CdioList *custom_file_list; /* custom_file_t */ - CdioList *custom_dir_list; /* char */ - - /* dictionary */ - CdioList *buffer_dict_list; - - /* aggregates */ - VcdSalloc *iso_bitmap; - - VcdDirectory *dir; - - /* state info */ - bool in_output; - - unsigned sectors_written; - unsigned in_track; - - long last_cb_call; - - progress_callback_t progress_callback; - void *callback_user_data; -}; - -/* private functions */ - -mpeg_sequence_t * -_vcd_obj_get_sequence_by_id (VcdObj *obj, const char sequence_id[]); - -mpeg_sequence_t * -_vcd_obj_get_sequence_by_entry_id (VcdObj *obj, const char entry_id[]); - -mpeg_segment_t * -_vcd_obj_get_segment_by_id (VcdObj *obj, const char segment_id[]); - -enum vcd_capability_t { - _CAP_VALID, - _CAP_MPEG1, - _CAP_MPEG2, - _CAP_PBC, - _CAP_PBC_X, - _CAP_TRACK_MARGINS, - _CAP_4C_SVCD, - _CAP_PAL_BITS -}; - -bool -_vcd_obj_has_cap_p (const VcdObj *obj, enum vcd_capability_t capability); - -#endif /* __VCD_OBJ_H__ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/pbc.c b/src/input/vcd/libvcd/pbc.c deleted file mode 100644 index 1b4f1a6c1..000000000 --- a/src/input/vcd/libvcd/pbc.c +++ /dev/null @@ -1,880 +0,0 @@ -/* - $Id: pbc.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2000, 2004 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <string.h> -#include <stddef.h> -#include <math.h> - -#include <cdio/cdio.h> -#include <cdio/bytesex.h> - -/* Public headers */ -#include <libvcd/logging.h> -#include <libvcd/files.h> -#include <libvcd/types.h> -#include <libvcd/info.h> - -/* FIXME! Make this really private. */ -#include <libvcd/files_private.h> - -/* Private headers */ -#include "vcd_assert.h" -#include "obj.h" -#include "pbc.h" -#include "util.h" - -static const char _rcsid[] = "$Id: pbc.c,v 1.3 2005/01/01 02:43:59 rockyb Exp $"; - -static uint8_t -_wtime (int seconds) -{ - if (seconds < 0) - return 255; - - if (seconds <= 60) - return seconds; - - if (seconds <= 2000) - { - double _tmp; - - _tmp = seconds; - _tmp -= 60; - _tmp /= 10; - _tmp += 60; - - return rint (_tmp); - } - - vcd_warn ("wait time of %ds clipped to 2000s", seconds); - - return 254; -} - -static pbc_t * -_vcd_pbc_byid(const VcdObj *obj, const char item_id[]) -{ - CdioListNode *node; - - _CDIO_LIST_FOREACH (node, obj->pbc_list) - { - pbc_t *_pbc = _cdio_list_node_data (node); - - if (_pbc->id && !strcmp (item_id, _pbc->id)) - return _pbc; - } - - /* not found */ - return NULL; -} - -unsigned -_vcd_pbc_lid_lookup (const VcdObj *obj, const char item_id[]) -{ - CdioListNode *node; - unsigned n = 1; - - _CDIO_LIST_FOREACH (node, obj->pbc_list) - { - pbc_t *_pbc = _cdio_list_node_data (node); - - vcd_assert (n < 0x8000); - - if (_pbc->id && !strcmp (item_id, _pbc->id)) - return n; - - n++; - } - - /* not found */ - return 0; -} - -static void -_set_area_helper (pbc_area_t *dest, const pbc_area_t *src, const char sel_id[]) -{ - memset (dest, 0, sizeof (pbc_area_t)); - - if (src) - { - if (src->x1 || src->x2 || src->y1 || src->y2) /* not disabled */ - { - if (src->x1 >= src->x2) - vcd_error ("selection '%s': area x1 >= x2 (%d >= %d)", - sel_id, src->x1, src->x2); - - if (src->y1 >= src->y2) - vcd_error ("selection '%s': area y1 >= y2 (%d >= %d)", - sel_id, src->y1, src->y2); - } - - *dest = *src; - } -} - -enum item_type_t -_vcd_pbc_lookup (const VcdObj *obj, const char item_id[]) -{ - unsigned id; - - vcd_assert (item_id != NULL); - - if ((id = _vcd_pbc_pin_lookup (obj, item_id))) - { - if (id < 2) - return ITEM_TYPE_NOTFOUND; - else if (id < MIN_ENCODED_TRACK_NUM) - return ITEM_TYPE_TRACK; - else if (id < 600) - return ITEM_TYPE_ENTRY; - else if (id <= MAX_ENCODED_SEGMENT_NUM) - return ITEM_TYPE_SEGMENT; - else - vcd_assert_not_reached (); - } - else if (_vcd_pbc_lid_lookup (obj, item_id)) - return ITEM_TYPE_PBC; - - return ITEM_TYPE_NOTFOUND; -} - -uint16_t -_vcd_pbc_pin_lookup (const VcdObj *obj, const char item_id[]) -{ - int n; - CdioListNode *node; - - if (!item_id) - return 0; - - /* check sequence items */ - - n = 0; - _CDIO_LIST_FOREACH (node, obj->mpeg_sequence_list) - { - mpeg_sequence_t *_sequence = _cdio_list_node_data (node); - - vcd_assert (n < 98); - - if (_sequence->id && !strcmp (item_id, _sequence->id)) - return n + 2; - - n++; - } - - /* check entry points */ - - n = 0; - _CDIO_LIST_FOREACH (node, obj->mpeg_sequence_list) - { - mpeg_sequence_t *_sequence = _cdio_list_node_data (node); - CdioListNode *node2; - - /* default entry point */ - - if (_sequence->default_entry_id - && !strcmp (item_id, _sequence->default_entry_id)) - return n + 100; - n++; - - /* additional entry points */ - - _CDIO_LIST_FOREACH (node2, _sequence->entry_list) - { - entry_t *_entry = _cdio_list_node_data (node2); - - vcd_assert (n < 500); - - if (_entry->id && !strcmp (item_id, _entry->id)) - return n + 100; - - n++; - } - } - - /* check sequence items */ - - n = 0; - _CDIO_LIST_FOREACH (node, obj->mpeg_segment_list) - { - mpeg_segment_t *_segment = _cdio_list_node_data (node); - - vcd_assert (n < 1980); - - if (_segment->id && !strcmp (item_id, _segment->id)) - return n + MIN_ENCODED_SEGMENT_NUM; - - n += _segment->segment_count; - } - - return 0; -} - -bool -_vcd_pbc_available (const VcdObj *obj) -{ - vcd_assert (obj != NULL); - vcd_assert (obj->pbc_list != NULL); - - if (!_cdio_list_length (obj->pbc_list)) - return false; - - if (!_vcd_obj_has_cap_p (obj, _CAP_PBC)) - { - vcd_warn ("PBC list not empty but VCD type not capable of PBC!"); - return false; - } - - return true; -} - -uint16_t -_vcd_pbc_max_lid (const VcdObj *obj) -{ - uint16_t retval = 0; - - if (_vcd_pbc_available (obj)) - retval = _cdio_list_length (obj->pbc_list); - - return retval; -} - -static size_t -_vcd_pbc_node_length (const VcdObj *obj, const pbc_t *_pbc, bool extended) -{ - size_t retval = 0; - - if (extended) - vcd_assert (_vcd_obj_has_cap_p (obj, _CAP_PBC_X)); - - switch (_pbc->type) - { - int n; - - case PBC_PLAYLIST: - n = _cdio_list_length (_pbc->item_id_list); - retval = __cd_offsetof (_PsdPlayListDescriptor, itemid[n]); - break; - - case PBC_SELECTION: - n = _cdio_list_length (_pbc->select_id_list); - - retval = __cd_offsetof (PsdSelectionListDescriptor_t, ofs[n]); - - if (extended || _vcd_obj_has_cap_p (obj, _CAP_4C_SVCD)) - retval += __cd_offsetof (PsdSelectionListDescriptorExtended, area[n]); - break; - - case PBC_END: - retval = sizeof (PsdEndListDescriptor); - break; - - default: - vcd_assert_not_reached (); - break; - } - - return retval; -} - -static uint16_t -_lookup_psd_offset (const VcdObj *obj, const char item_id[], bool extended) -{ - CdioListNode *node; - - if (extended) - vcd_assert (_vcd_obj_has_cap_p (obj, _CAP_PBC_X)); - - /* disable it */ - if (!item_id) - return PSD_OFS_DISABLED; - - _CDIO_LIST_FOREACH (node, obj->pbc_list) - { - pbc_t *_pbc = _cdio_list_node_data (node); - - if (!_pbc->id || strcmp (item_id, _pbc->id)) - continue; - - return (extended ? _pbc->offset_ext : _pbc->offset) / INFO_OFFSET_MULT; - } - - vcd_error ("PSD: referenced PSD '%s' not found", item_id); - - /* not found */ - return PSD_OFS_DISABLED; -} - -static void -_vcd_pin_mark_id (const VcdObj *obj, const char _id[]) -{ - mpeg_sequence_t *_seq; - mpeg_segment_t *_seg; - - vcd_assert (obj != NULL); - - if (!_id) - return; - - if ((_seq = _vcd_obj_get_sequence_by_id ((VcdObj *) obj, _id))) - _seq->referenced = true; - - if ((_seg = _vcd_obj_get_segment_by_id ((VcdObj *) obj, _id))) - _seg->referenced = true; -} - -static void -_vcd_pbc_mark_id (const VcdObj *obj, const char _id[]) -{ - pbc_t *_pbc; - - vcd_assert (obj != NULL); - - if (!_id) - return; - - _pbc = _vcd_pbc_byid (obj, _id); - - if (!_pbc) /* not found */ - return; - - if (_pbc->referenced) /* already marked */ - return; - - _pbc->referenced = true; - - switch (_pbc->type) - { - case PBC_PLAYLIST: - { - CdioListNode *node; - - _vcd_pbc_mark_id (obj, _pbc->prev_id); - _vcd_pbc_mark_id (obj, _pbc->next_id); - _vcd_pbc_mark_id (obj, _pbc->retn_id); - - _CDIO_LIST_FOREACH (node, _pbc->item_id_list) - { - const char *_id = _cdio_list_node_data (node); - - _vcd_pin_mark_id (obj, _id); - } - } - break; - - case PBC_SELECTION: - { - CdioListNode *node; - - _vcd_pbc_mark_id (obj, _pbc->prev_id); - _vcd_pbc_mark_id (obj, _pbc->next_id); - _vcd_pbc_mark_id (obj, _pbc->retn_id); - - if (_pbc->selection_type == _SEL_NORMAL) - _vcd_pbc_mark_id (obj, _pbc->default_id); - - _vcd_pbc_mark_id (obj, _pbc->timeout_id); - - _vcd_pin_mark_id (obj, _pbc->item_id); - - _CDIO_LIST_FOREACH (node, _pbc->select_id_list) - { - const char *_id = _cdio_list_node_data (node); - - _vcd_pbc_mark_id (obj, _id); - } - } - break; - - case PBC_END: - _vcd_pin_mark_id (obj, _pbc->image_id); - break; - - default: - vcd_assert_not_reached (); - break; - } -} - -void -_vcd_pbc_check_unreferenced (const VcdObj *obj) -{ - CdioListNode *node; - - /* clear all flags */ - - _CDIO_LIST_FOREACH (node, obj->pbc_list) - { - pbc_t *_pbc = _cdio_list_node_data (node); - - _pbc->referenced = false; - } - - _CDIO_LIST_FOREACH (node, obj->mpeg_sequence_list) - { - mpeg_sequence_t *_sequence = _cdio_list_node_data (node); - - _sequence->referenced = false; - } - - _CDIO_LIST_FOREACH (node, obj->mpeg_segment_list) - { - mpeg_segment_t *_segment = _cdio_list_node_data (node); - - _segment->referenced = false; - } - - /* start from non-rejected lists */ - - _CDIO_LIST_FOREACH (node, obj->pbc_list) - { - pbc_t *_pbc = _cdio_list_node_data (node); - - vcd_assert (_pbc->id != NULL); - - if (_pbc->rejected) - continue; - - _vcd_pbc_mark_id (obj, _pbc->id); - } - - /* collect flags */ - - _CDIO_LIST_FOREACH (node, obj->pbc_list) - { - pbc_t *_pbc = _cdio_list_node_data (node); - - if (!_pbc->referenced) - vcd_warn ("PSD item '%s' is unreachable", _pbc->id); - } - - _CDIO_LIST_FOREACH (node, obj->mpeg_sequence_list) - { - mpeg_sequence_t *_sequence = _cdio_list_node_data (node); - - if (!_sequence->referenced) - vcd_warn ("sequence '%s' is not reachable by PBC", _sequence->id); - } - - _CDIO_LIST_FOREACH (node, obj->mpeg_segment_list) - { - mpeg_segment_t *_segment = _cdio_list_node_data (node); - - if (!_segment->referenced) - vcd_warn ("segment item '%s' is unreachable", _segment->id); - } - -} - -void -_vcd_pbc_node_write (const VcdObj *obj, const pbc_t *_pbc, void *buf, - bool extended) -{ - vcd_assert (obj != NULL); - vcd_assert (_pbc != NULL); - vcd_assert (buf != NULL); - - if (extended) - vcd_assert (_vcd_obj_has_cap_p (obj, _CAP_PBC_X)); - - switch (_pbc->type) - { - case PBC_PLAYLIST: - { - _PsdPlayListDescriptor *_md = buf; - CdioListNode *node; - int n; - - _md->type = PSD_TYPE_PLAY_LIST; - _md->noi = _cdio_list_length (_pbc->item_id_list); - - vcd_assert (_pbc->lid < 0x8000); - _md->lid = uint16_to_be (_pbc->lid | (_pbc->rejected ? 0x8000 : 0)); - - _md->prev_ofs = - uint16_to_be (_lookup_psd_offset (obj, _pbc->prev_id, extended)); - _md->next_ofs = - uint16_to_be (_lookup_psd_offset (obj, _pbc->next_id, extended)); - _md->return_ofs = - uint16_to_be (_lookup_psd_offset (obj, _pbc->retn_id, extended)); - _md->ptime = uint16_to_be (rint (_pbc->playing_time * 15.0)); - _md->wtime = _wtime (_pbc->wait_time); - _md->atime = _wtime (_pbc->auto_pause_time); - - n = 0; - _CDIO_LIST_FOREACH (node, _pbc->item_id_list) - { - const char *_id = _cdio_list_node_data (node); - uint16_t _pin; - - if (_id) - { - _pin = _vcd_pbc_pin_lookup (obj, _id); - - if (!_pin) - vcd_error ("PSD: referenced play item '%s' not found", _id); - - _md->itemid[n] = uint16_to_be (_pin); - } - else - _md->itemid[n] = 0; /* play nothing */ - - n++; - } - } - break; - - case PBC_SELECTION: - { - PsdSelectionListDescriptor_t *_md = buf; - - const unsigned int _nos = _cdio_list_length (_pbc->select_id_list); - - if (extended) - _md->type = PSD_TYPE_EXT_SELECTION_LIST; - else - _md->type = PSD_TYPE_SELECTION_LIST; - - if (!IN (_pbc->bsn, 1, MAX_PBC_SELECTIONS)) - vcd_error ("selection '%s': BSN (%d) not in range [1..%d]", - _pbc->id, _pbc->bsn, MAX_PBC_SELECTIONS); - - if (!IN (_nos, 0, MAX_PBC_SELECTIONS)) - vcd_error ("selection '%s': too many selections (%d > %d)", - _pbc->id, _nos, MAX_PBC_SELECTIONS); - - if (_nos + _pbc->bsn > 100) - vcd_error ("selection '%s': BSN + NOS (%d + %d) > 100", - _pbc->id, _pbc->bsn, _nos); - - _md->bsn = _pbc->bsn; - _md->nos = _nos; - - vcd_assert (sizeof (PsdSelectionListFlags) == 1); - - /* selection flags */ - if (_vcd_obj_has_cap_p (obj, _CAP_4C_SVCD)) - _md->flags.SelectionAreaFlag = true; - else - _md->flags.SelectionAreaFlag = false; - - _md->flags.CommandListFlag = false; - - vcd_assert (_pbc->lid < 0x8000); - _md->lid = uint16_to_be (_pbc->lid | (_pbc->rejected ? 0x8000 : 0)); - - _md->prev_ofs = - uint16_to_be (_lookup_psd_offset (obj, _pbc->prev_id, extended)); - _md->next_ofs = - uint16_to_be (_lookup_psd_offset (obj, _pbc->next_id, extended)); - _md->return_ofs = - uint16_to_be (_lookup_psd_offset (obj, _pbc->retn_id, extended)); - - switch (_pbc->selection_type) - { - case _SEL_NORMAL: - _md->default_ofs = - uint16_to_be (_lookup_psd_offset (obj, _pbc->default_id, extended)); - break; - - case _SEL_MULTI_DEF: - _md->default_ofs = uint16_to_be (PSD_OFS_MULTI_DEF); - if (_pbc->default_id) - vcd_warn ("ignoring default target '%s' for multi default selection '%s'", - _pbc->default_id, _pbc->id); - break; - - case _SEL_MULTI_DEF_NO_NUM: - _md->default_ofs = uint16_to_be (PSD_OFS_MULTI_DEF_NO_NUM); - if (_pbc->default_id) - vcd_warn ("ignoring default target '%s' for multi default (w/o num) selection '%s'", - _pbc->default_id, _pbc->id); - break; - - default: - vcd_assert_not_reached (); - break; - } - - _md->timeout_ofs = - uint16_to_be (_lookup_psd_offset (obj, _pbc->timeout_id, extended)); - _md->totime = _wtime (_pbc->timeout_time); - - if (_pbc->loop_count > 0x7f) - vcd_warn ("loop count %d > 127", _pbc->loop_count); - - _md->loop = (_pbc->loop_count > 0x7f) ? 0x7f : _pbc->loop_count; - - if (_pbc->jump_delayed) - _md->loop |= 0x80; - - /* timeout related sanity checks */ - if (_pbc->loop_count > 0 - && _pbc->timeout_time >= 0 - && !_pbc->timeout_id - && !_nos) - vcd_warn ("PSD: selection '%s': neither timeout nor select target available, but neither loop count is infinite nor timeout wait time", _pbc->id); - - if (_pbc->timeout_id && (_pbc->timeout_time < 0 || _pbc->loop_count <= 0)) - vcd_warn ("PSD: selection '%s': timeout target '%s' is never used due to loop count or timeout wait time given", _pbc->id, _pbc->timeout_id); - - if (_pbc->item_id) - { - const uint16_t _pin = _vcd_pbc_pin_lookup (obj, _pbc->item_id); - - if (!_pin) - vcd_error ("PSD: referenced play item '%s' not found", _pbc->item_id); - - _md->itemid = uint16_to_be (_pin); - } - else - _md->itemid = 0; /* play nothing */ - - /* sanity checks */ - switch (_pbc->selection_type) - { - case _SEL_NORMAL: - break; - - case _SEL_MULTI_DEF: - case _SEL_MULTI_DEF_NO_NUM: - if (_pbc->jump_delayed) - vcd_warn ("selection '%s': jump timing shall be immediate", _pbc->id); - - if (_pbc->bsn != 1) - vcd_error ("selection '%s': BSN != 1 for multi default selection", - _pbc->id); - - /* checking NOS == NOE */ - if (!_pbc->item_id) - vcd_error ("selection '%s': play nothing play item not allowed for multidefault list", - _pbc->id); - - { - mpeg_sequence_t *_seq; - - if ((_seq = _vcd_obj_get_sequence_by_id ((VcdObj *) obj, _pbc->item_id)) - || (_seq = _vcd_obj_get_sequence_by_entry_id ((VcdObj *) obj, _pbc->item_id))) - { - const unsigned _entries = - _cdio_list_length (_seq->entry_list) + 1; - - if (_nos != _entries) - vcd_error ("selection '%s': number of entrypoints" - " (%d for sequence '%s') != number of selections (%d)", - _pbc->id, _entries, _pbc->item_id, _nos); - } - else - vcd_error ("selection '%s': play item '%s'" - " is requried to be sequence or entry point" - " item for multi default selecton", - _pbc->id, _pbc->item_id); - } - - break; - - default: - vcd_assert_not_reached (); - break; - } - - /* fill selection array */ - { - CdioListNode *node = NULL; - int idx = 0; - - idx = 0; - _CDIO_LIST_FOREACH (node, _pbc->select_id_list) - { - const char *_id = _cdio_list_node_data (node); - - _md->ofs[idx] = - uint16_to_be (_lookup_psd_offset (obj, _id, extended)); - - idx++; - } - } - - if (extended || _vcd_obj_has_cap_p (obj, _CAP_4C_SVCD)) - { - PsdSelectionListDescriptorExtended *_md2; - CdioListNode *node; - int n; - - /* append extended selection areas */ - - _md2 = (void *) &_md->ofs[_nos]; - - _set_area_helper (&_md2->next_area, _pbc->next_area, _pbc->id); - _set_area_helper (&_md2->prev_area, _pbc->prev_area, _pbc->id); - _set_area_helper (&_md2->return_area, _pbc->return_area, _pbc->id); - - _set_area_helper (&_md2->default_area, _pbc->default_area, _pbc->id); - - n = 0; - if (_pbc->select_area_list) - _CDIO_LIST_FOREACH (node, _pbc->select_area_list) - { - const pbc_area_t *_area = _cdio_list_node_data (node); - - _set_area_helper (&_md2->area[n], _area, _pbc->id); - - n++; - } - - vcd_assert (n == _nos); - } - } - break; - - case PBC_END: - { - PsdEndListDescriptor *_md = buf; - - _md->type = PSD_TYPE_END_LIST; - - if (_vcd_obj_has_cap_p (obj, _CAP_4C_SVCD)) - { - _md->next_disc = _pbc->next_disc; - - if (_pbc->image_id) - { - uint16_t _pin = _vcd_pbc_pin_lookup (obj, _pbc->image_id); - mpeg_segment_t *_segment; - - if (!_pbc->next_disc) - vcd_warn ("PSD: endlist '%s': change disc picture given," - " but next volume is 0", _pbc->id); - - if (!_pin) - vcd_error ("PSD: referenced play item '%s' not found", - _pbc->item_id); - - _md->change_pic = uint16_to_be (_pin); - - /* sanity checks */ - - _segment = _vcd_obj_get_segment_by_id ((VcdObj *) obj, - _pbc->image_id); - - if (!_segment) - vcd_warn ("PSD: endlist '%s': referenced play item '%s'" - " is not a segment play item", - _pbc->id, _pbc->image_id); - else if (_segment->info->shdr[0].seen - || !(_segment->info->shdr[1].seen || _segment->info->shdr[2].seen)) - vcd_warn ("PSD: endlist '%s': referenced play item '%s'" - " should be a still picture", - _pbc->id, _pbc->image_id); - } - } - else if (_pbc->next_disc || _pbc->image_id) - vcd_warn ("extended end list attributes ignored for non-SVCD"); - } - break; - - default: - vcd_assert_not_reached (); - break; - } -} - -pbc_t * -vcd_pbc_new (enum pbc_type_t type) -{ - pbc_t *_pbc; - - _pbc = _vcd_malloc (sizeof (pbc_t)); - _pbc->type = type; - - switch (type) - { - case PBC_PLAYLIST: - _pbc->item_id_list = _cdio_list_new (); - break; - - case PBC_SELECTION: - _pbc->select_id_list = _cdio_list_new (); - _pbc->select_area_list = _cdio_list_new (); - break; - - case PBC_END: - break; - - default: - vcd_assert_not_reached (); - break; - } - - return _pbc; -} - -/* - */ - -bool -_vcd_pbc_finalize (VcdObj *obj) -{ - CdioListNode *node; - unsigned offset = 0, offset_ext = 0; - unsigned lid; - - lid = 1; - _CDIO_LIST_FOREACH (node, obj->pbc_list) - { - pbc_t *_pbc = _cdio_list_node_data (node); - unsigned length, length_ext = 0; - - length = _vcd_pbc_node_length (obj, _pbc, false); - if (_vcd_obj_has_cap_p (obj, _CAP_PBC_X)) - length_ext = _vcd_pbc_node_length (obj, _pbc, true); - - /* round them up to... */ - length = _vcd_ceil2block (length, INFO_OFFSET_MULT); - if (_vcd_obj_has_cap_p (obj, _CAP_PBC_X)) - length_ext = _vcd_ceil2block (length_ext, INFO_OFFSET_MULT); - - /* node may not cross sector boundary! */ - offset = _vcd_ofs_add (offset, length, ISO_BLOCKSIZE); - if (_vcd_obj_has_cap_p (obj, _CAP_PBC_X)) - offset_ext = _vcd_ofs_add (offset_ext, length_ext, ISO_BLOCKSIZE); - - /* save start offsets */ - _pbc->offset = offset - length; - if (_vcd_obj_has_cap_p (obj, _CAP_PBC_X)) - _pbc->offset_ext = offset_ext - length_ext; - - _pbc->lid = lid; - - lid++; - } - - obj->psd_size = offset; - if (_vcd_obj_has_cap_p (obj, _CAP_PBC_X)) - obj->psdx_size = offset_ext; - - vcd_debug ("pbc: psd size %d (extended psd %d)", offset, offset_ext); - - return true; -} diff --git a/src/input/vcd/libvcd/pbc.h b/src/input/vcd/libvcd/pbc.h deleted file mode 100644 index 9972c3143..000000000 --- a/src/input/vcd/libvcd/pbc.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - $Id: pbc.h,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifndef __VCD_PBC_H__ -#define __VCD_PBC_H__ - -#include <libvcd/types.h> - -/* Private includes */ -#include "data_structures.h" -#include "util.h" -#include "vcd.h" - -enum pbc_type_t { - PBC_INVALID = 0, - PBC_PLAYLIST, - PBC_SELECTION, - PBC_END -}; - -typedef struct psd_area_t pbc_area_t; /* fixme */ -#define pbc_area_t_SIZEOF struct_psd_area_t_SIZEOF - -static inline pbc_area_t * -vcd_pbc_area_new (uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2) -{ - pbc_area_t *_new_area = _vcd_malloc (sizeof (pbc_area_t)); - - _new_area->x1 = x1; - _new_area->y1 = y1; - _new_area->x2 = x2; - _new_area->y2 = y2; - - return _new_area; -} - -/* typedef struct _pbc_t pbc_t; */ - -struct _pbc_t { - enum pbc_type_t type; - - char *id; - - bool rejected; - - /* pbc ref check */ - bool referenced; - - /* used for play/selection lists */ - char *prev_id; - char *next_id; - char *retn_id; - - /* used for play lists */ - double playing_time; - int wait_time; - int auto_pause_time; - CdioList *item_id_list; /* char */ - - /* used for selection lists */ - enum selection_type_t { - _SEL_NORMAL = 0, - _SEL_MULTI_DEF, - _SEL_MULTI_DEF_NO_NUM - } selection_type; - - pbc_area_t *prev_area; - pbc_area_t *next_area; - pbc_area_t *return_area; - pbc_area_t *default_area; /* depends on selection_type */ - CdioList *select_area_list; /* pbc_area_t */ - - unsigned bsn; - char *default_id; - char *timeout_id; - int timeout_time; - unsigned loop_count; - bool jump_delayed; - char *item_id; - CdioList *select_id_list; /* char */ - - /* used for end lists */ - char *image_id; - unsigned next_disc; - - /* computed values */ - unsigned lid; - unsigned offset; - unsigned offset_ext; -}; - -enum item_type_t { - ITEM_TYPE_NOTFOUND = 0, - ITEM_TYPE_NOOP, - ITEM_TYPE_TRACK, - ITEM_TYPE_ENTRY, - ITEM_TYPE_SEGMENT, - ITEM_TYPE_PBC -}; - -/* functions */ - -pbc_t * -vcd_pbc_new (enum pbc_type_t type); - -pbc_t * -_vcd_pbc_init (pbc_t *_pbc); - -void -vcd_pbc_destroy (pbc_t *obj); - -unsigned -_vcd_pbc_lid_lookup (const VcdObj *obj, const char item_id[]); - -enum item_type_t -_vcd_pbc_lookup (const VcdObj *obj, const char item_id[]); - -uint16_t -_vcd_pbc_pin_lookup (const VcdObj *obj, const char item_id[]); - -unsigned -_vcd_pbc_list_calc_size (const pbc_t *_pbc, bool extended); - -bool -_vcd_pbc_finalize (VcdObj *obj); - -bool -_vcd_pbc_available (const VcdObj *obj); - -uint16_t -_vcd_pbc_max_lid (const VcdObj *obj); - -void -_vcd_pbc_node_write (const VcdObj *obj, const pbc_t *_pbc, void *buf, - bool extended); - -void -_vcd_pbc_check_unreferenced (const VcdObj *obj); - -#endif /* __VCD_PBC_H__ */ diff --git a/src/input/vcd/libvcd/salloc.c b/src/input/vcd/libvcd/salloc.c deleted file mode 100644 index d6fc41c68..000000000 --- a/src/input/vcd/libvcd/salloc.c +++ /dev/null @@ -1,212 +0,0 @@ -/* - $Id: salloc.c,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <string.h> -#include <stdlib.h> - -#include <cdio/cdio.h> - -/* Public headers */ -#include <libvcd/types.h> -#include <libvcd/logging.h> - -/* Private headers */ -#include "vcd_assert.h" -#include "salloc.h" -#include "util.h" - -static const char _rcsid[] = "$Id: salloc.c,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $"; - -#define VCD_SALLOC_CHUNK_SIZE 16 - -struct _VcdSalloc -{ - uint8_t *data; - uint32_t len; - uint32_t alloced_chunks; -}; - -static void -_vcd_salloc_set_size (VcdSalloc *bitmap, uint32_t newlen) -{ - uint32_t new_alloced_chunks; - - vcd_assert (bitmap != NULL); - vcd_assert (newlen >= bitmap->len); - - new_alloced_chunks = newlen / VCD_SALLOC_CHUNK_SIZE; - if (newlen % VCD_SALLOC_CHUNK_SIZE) - new_alloced_chunks++; - - if (bitmap->alloced_chunks < new_alloced_chunks) - { - bitmap->data = - realloc (bitmap->data, new_alloced_chunks * VCD_SALLOC_CHUNK_SIZE); - memset (bitmap->data + (VCD_SALLOC_CHUNK_SIZE * bitmap->alloced_chunks), - 0, - VCD_SALLOC_CHUNK_SIZE * (new_alloced_chunks - - bitmap->alloced_chunks)); - bitmap->alloced_chunks = new_alloced_chunks; - } - - bitmap->len = newlen; -} - -static bool -_vcd_salloc_is_set (const VcdSalloc *bitmap, uint32_t sector) -{ - unsigned _byte = sector / 8; - unsigned _bit = sector % 8; - - if (_byte < bitmap->len) - return (bitmap->data[_byte] & (1 << _bit)) != 0; - else - return false; -} - -static void -_vcd_salloc_set (VcdSalloc *bitmap, uint32_t sector) -{ - unsigned _byte = sector / 8; - unsigned _bit = sector % 8; - - if (_byte >= bitmap->len) - { - unsigned oldlen = bitmap->len; - _vcd_salloc_set_size (bitmap, _byte + 1); - memset (bitmap->data + oldlen, 0x00, _byte + 1 - oldlen); - } - - bitmap->data[_byte] |= (1 << _bit); -} - -static void -_vcd_salloc_unset (VcdSalloc *bitmap, uint32_t sector) -{ - unsigned _byte = sector / 8; - unsigned _bit = sector % 8; - - if (_byte >= bitmap->len) - vcd_assert_not_reached (); - - bitmap->data[_byte] &= ~(1 << _bit); -} - -/* exported */ - -uint32_t _vcd_salloc (VcdSalloc *bitmap, uint32_t hint, uint32_t size) -{ - if (!size) - { - size++; - vcd_warn - ("request of 0 sectors allocment fixed up to 1 sector (this is harmless)"); - } - - vcd_assert (size > 0); - - if (hint != SECTOR_NIL) - { - uint32_t i; - for (i = 0; i < size; i++) - if (_vcd_salloc_is_set (bitmap, hint + i)) - return SECTOR_NIL; - - /* everything's ok for allocing */ - - i = size; - while (i) - _vcd_salloc_set (bitmap, hint + (--i)); - /* we begin with highest byte, in order to minimizing - realloc's in sector_set */ - - return hint; - } - - /* find the lowest possible ... */ - - hint = 0; - - while (_vcd_salloc (bitmap, hint, size) == SECTOR_NIL) - hint++; - - return hint; -} - -void -_vcd_salloc_free (VcdSalloc *bitmap, uint32_t sec, uint32_t size) -{ - uint32_t i; - - for (i = 0; i < size; i++) - { - vcd_assert (_vcd_salloc_is_set (bitmap, sec + i)); - - _vcd_salloc_unset (bitmap, sec + i); - } -} - -VcdSalloc * -_vcd_salloc_new (void) -{ - VcdSalloc *newobj = _vcd_malloc (sizeof (VcdSalloc)); - return newobj; -} - -void -_vcd_salloc_destroy (VcdSalloc *bitmap) -{ - vcd_assert (bitmap != NULL); - - free (bitmap->data); - free (bitmap); -} - -uint32_t _vcd_salloc_get_highest (const VcdSalloc *bitmap) -{ - uint8_t last; - unsigned n; - - vcd_assert (bitmap != NULL); - - last = bitmap->data[bitmap->len - 1]; - - vcd_assert (last != 0); - - n = 8; - while (n) - if ((1 << --n) & last) - break; - - return (bitmap->len - 1) * 8 + n; -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/salloc.h b/src/input/vcd/libvcd/salloc.h deleted file mode 100644 index 4676f9b45..000000000 --- a/src/input/vcd/libvcd/salloc.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - $Id: salloc.h,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -/* sector allocation management */ - -#ifndef _SALLOC_H_ -#define _SALLOC_H_ - -#include <libvcd/types.h> - -#define SECTOR_NIL ((uint32_t)(-1)) - -typedef struct _VcdSalloc VcdSalloc; - -VcdSalloc * -_vcd_salloc_new (void); - -void -_vcd_salloc_destroy (VcdSalloc *bitmap); - -uint32_t -_vcd_salloc (VcdSalloc *bitmap, uint32_t hint, uint32_t size); - -void -_vcd_salloc_free (VcdSalloc *bitmap, uint32_t sec, uint32_t size); - -uint32_t -_vcd_salloc_get_highest (const VcdSalloc *bitmap); - -#endif /* _SALLOC_H_ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/sector.c b/src/input/vcd/libvcd/sector.c deleted file mode 100644 index d072a4f17..000000000 --- a/src/input/vcd/libvcd/sector.c +++ /dev/null @@ -1,268 +0,0 @@ -/* - $Id: sector.c,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - (C) 1998 Heiko Eissfeldt <heiko@colossus.escape.de> - portions used & Chris Smith - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <string.h> - -#include <cdio/cdio.h> - -#include <libvcd/types.h> - -#include <libvcd/sector.h> - -/* Private includes */ -#include "vcd_assert.h" -#include "bytesex.h" -#include "salloc.h" -#include "sector_private.h" - -static const char _rcsid[] = "$Id: sector.c,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $"; - -static const uint8_t sync_pattern[12] = { - 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00 -}; - -static void -build_address (void *buf, sectortype_t sectortype, uint32_t address) -{ - raw_cd_sector_t *sector = buf; - - vcd_assert (sizeof(raw_cd_sector_t) == CDIO_CD_FRAMESIZE_RAW-DATA_LEN); - - cdio_lba_to_msf(address, &(sector->msf)); - - switch(sectortype) { - case MODE_0: - sector->mode = 0; - break; - case MODE_2: - case MODE_2_FORM_1: - case MODE_2_FORM_2: - sector->mode = 2; - break; - default: - vcd_assert_not_reached (); - break; - } -} - -/* From cdrtools-1.11a25 */ -static uint32_t -build_edc(const uint8_t inout[], int from, int upto) -{ - const uint8_t *p = inout+from; - uint32_t result = 0; - - upto -= from-1; - upto /= 4; - while (--upto >= 0) { - result = EDC_crctable[(result ^ *p++) & 0xffL] ^ (result >> 8); - result = EDC_crctable[(result ^ *p++) & 0xffL] ^ (result >> 8); - result = EDC_crctable[(result ^ *p++) & 0xffL] ^ (result >> 8); - result = EDC_crctable[(result ^ *p++) & 0xffL] ^ (result >> 8); - } - return (result); -} - -/* From cdrtools-1.11a40 */ -static void -encode_L2_Q(uint8_t inout[4 + L2_RAW + 4 + 8 + L2_P + L2_Q]) -{ - uint8_t *dps; - uint8_t *dp; - uint8_t *Q; - int i, j; - - Q = inout + 4 + L2_RAW + 4 + 8 + L2_P; - - dps = inout; - for (j = 0; j < 26; j++) { - uint16_t a, b; - - a = b = 0; - dp = dps; - for (i = 0; i < 43; i++) { - - /* LSB */ - a ^= L2sq[i][*dp++]; - - /* MSB */ - b ^= L2sq[i][*dp]; - - dp += 2*44-1; - if (dp >= &inout[(4 + L2_RAW + 4 + 8 + L2_P)]) { - dp -= (4 + L2_RAW + 4 + 8 + L2_P); - } - } - Q[0] = a >> 8; - Q[26*2] = a; - Q[1] = b >> 8; - Q[26*2+1] = b; - - Q += 2; - dps += 2*43; - } -} - -static void -encode_L2_P (uint8_t inout[4 + L2_RAW + 4 + 8 + L2_P]) -{ - uint8_t *dp; - unsigned char *P; - int i, j; - - P = inout + 4 + L2_RAW + 4 + 8; - - for (j = 0; j < 43; j++) { - uint16_t a; - uint16_t b; - - a = b = 0; - dp = inout; - for (i = 19; i < 43; i++) { - - /* LSB */ - a ^= L2sq[i][*dp++]; - - /* MSB */ - b ^= L2sq[i][*dp]; - - dp += 2*43 -1; - } - P[0] = a >> 8; - P[43*2] = a; - P[1] = b >> 8; - P[43*2+1] = b; - - P += 2; - inout += 2; - } -} - -/* Layer 2 Product code en/decoder */ -static void -do_encode_L2 (void *buf, sectortype_t sectortype, uint32_t address) -{ - raw_cd_sector_t *raw_sector = buf; - - vcd_assert (buf != NULL); - - vcd_assert (sizeof (sync_pattern) == SYNC_LEN); - vcd_assert (sizeof (mode2_form1_sector_t) == CDIO_CD_FRAMESIZE_RAW); - vcd_assert (sizeof (mode2_form2_sector_t) == CDIO_CD_FRAMESIZE_RAW); - vcd_assert (sizeof (mode0_sector_t) == CDIO_CD_FRAMESIZE_RAW); - vcd_assert (sizeof (raw_cd_sector_t) == SYNC_LEN+HEADER_LEN); - - memset (raw_sector, 0, SYNC_LEN+HEADER_LEN); - memcpy (raw_sector->sync, sync_pattern, sizeof (sync_pattern)); - - switch (sectortype) { - case MODE_0: - { - mode0_sector_t *sector = buf; - - memset(sector->data, 0, sizeof(sector->data)); - } - break; - case MODE_2: - break; - case MODE_2_FORM_1: - { - mode2_form1_sector_t *sector = buf; - - sector->edc = uint32_to_le(build_edc(buf, 16, 16+8+2048-1)); - - encode_L2_P((uint8_t*)buf+SYNC_LEN); - encode_L2_Q((uint8_t*)buf+SYNC_LEN); - } - break; - case MODE_2_FORM_2: - { - mode2_form2_sector_t *sector = buf; - - sector->edc = uint32_to_le(build_edc(buf, 16, 16+8+2324-1)); - } - break; - default: - vcd_assert_not_reached (); - } - - build_address (buf, sectortype, address); -} - -void -_vcd_make_mode2 (void *raw_sector, const void *data, uint32_t extent, - uint8_t fnum, uint8_t cnum, uint8_t sm, uint8_t ci) -{ - uint8_t *subhdr = (uint8_t*)raw_sector+16; - - vcd_assert (raw_sector != NULL); - vcd_assert (data != NULL); - vcd_assert (extent != SECTOR_NIL); - - memset (raw_sector, 0, CDIO_CD_FRAMESIZE_RAW); - - subhdr[0] = subhdr[4] = fnum; - subhdr[1] = subhdr[5] = cnum; - subhdr[2] = subhdr[6] = sm; - subhdr[3] = subhdr[7] = ci; - - if (sm & SM_FORM2) - { - memcpy ((char*)raw_sector+CDIO_CD_XA_SYNC_HEADER, data, - M2F2_SECTOR_SIZE); - do_encode_L2 (raw_sector, MODE_2_FORM_2, extent+CDIO_PREGAP_SECTORS); - } - else - { - memcpy ((char*)raw_sector+CDIO_CD_XA_SYNC_HEADER, data, - CDIO_CD_FRAMESIZE); - do_encode_L2 (raw_sector, MODE_2_FORM_1, extent+CDIO_PREGAP_SECTORS); - } -} - -void -_vcd_make_raw_mode2 (void *raw_sector, const void *data, uint32_t extent) -{ - vcd_assert (raw_sector != NULL); - vcd_assert (data != NULL); - vcd_assert (extent != SECTOR_NIL); - - memset (raw_sector, 0, CDIO_CD_FRAMESIZE_RAW); - - memcpy ((char*)raw_sector+12+4, data, M2RAW_SECTOR_SIZE); - do_encode_L2 (raw_sector, MODE_2, extent+CDIO_PREGAP_SECTORS); -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/sector_private.h b/src/input/vcd/libvcd/sector_private.h deleted file mode 100644 index 9411b5420..000000000 --- a/src/input/vcd/libvcd/sector_private.h +++ /dev/null @@ -1,1348 +0,0 @@ -/* - $Id: sector_private.h,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - (C) 1998 Heiko Eissfeldt <heiko@colossus.escape.de> - - 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 -*/ - -#ifndef __VCD_CD_SECTOR_PRIVATE_H__ -#define __VCD_CD_SECTOR_PRIVATE_H__ - -#define RS_L12_BITS 8 - -#define L2_RAW (1024*2) -#define L2_Q (26*2*2) -#define L2_P (43*2*2) - -typedef enum { - MODE_0, - MODE_2, - MODE_2_FORM_1, - MODE_2_FORM_2 -} sectortype_t; - -#define SYNC_LEN 12 -#define DATA_LEN 2336 -#define HEADER_LEN 4 - -typedef struct { - uint8_t sync[SYNC_LEN]; - msf_t msf; - uint8_t mode; - uint8_t user_data[EMPTY_ARRAY_SIZE]; -} raw_cd_sector_t; - -#define raw_cd_sector_t_SIZEOF (SYNC_LEN+HEADER_LEN) - -typedef struct { - uint8_t sync[SYNC_LEN]; - msf_t msf; - uint8_t mode; -} sector_header_t; - -#define sector_header_t_SIZEOF (SYNC_LEN+HEADER_LEN) - -typedef struct { - sector_header_t sector_header; - uint8_t data[M2RAW_SECTOR_SIZE]; -} mode0_sector_t; - -#define mode0_sector_t_SIZEOF CDIO_CD_FRAMESIZE_RAW - -typedef struct { - sector_header_t sector_header; - uint8_t subheader[CDIO_CD_SUBHEADER_SIZE]; - uint8_t data[CDIO_CD_FRAMESIZE]; - uint32_t edc; - uint8_t l2_p[L2_P]; - uint8_t l2_q[L2_Q]; -} mode2_form1_sector_t; - -#define mode2_form1_sector_t_SIZEOF CDIO_CD_FRAMESIZE_RAW - -typedef struct { - sector_header_t sector_header; - uint8_t subheader[CDIO_CD_SUBHEADER_SIZE]; - uint8_t data[M2F2_SECTOR_SIZE]; - uint32_t edc; -} mode2_form2_sector_t; - -#define mode2_form2_sector_t_SIZEOF CDIO_CD_FRAMESIZE_RAW - -/*****************************************************************/ -/* */ -/* CRC LOOKUP TABLE */ -/* ================ */ -/* The following CRC lookup table was generated automagically */ -/* by the Rocksoft^tm Model CRC Algorithm Table Generation */ -/* Program V1.0 using the following model parameters: */ -/* */ -/* Width : 4 bytes. */ -/* Poly : 0x8001801BL */ -/* Reverse : TRUE. */ -/* */ -/* For more information on the Rocksoft^tm Model CRC Algorithm, */ -/* see the document titled "A Painless Guide to CRC Error */ -/* Detection Algorithms" by Ross Williams */ -/* (ross@guest.adelaide.edu.au.). This document is likely to be */ -/* in the FTP archive "ftp.adelaide.edu.au/pub/rocksoft". */ -/* */ -/*****************************************************************/ - -static const uint32_t EDC_crctable[256] = -{ - 0x00000000U, 0x90910101U, 0x91210201U, 0x01B00300U, - 0x92410401U, 0x02D00500U, 0x03600600U, 0x93F10701U, - 0x94810801U, 0x04100900U, 0x05A00A00U, 0x95310B01U, - 0x06C00C00U, 0x96510D01U, 0x97E10E01U, 0x07700F00U, - 0x99011001U, 0x09901100U, 0x08201200U, 0x98B11301U, - 0x0B401400U, 0x9BD11501U, 0x9A611601U, 0x0AF01700U, - 0x0D801800U, 0x9D111901U, 0x9CA11A01U, 0x0C301B00U, - 0x9FC11C01U, 0x0F501D00U, 0x0EE01E00U, 0x9E711F01U, - 0x82012001U, 0x12902100U, 0x13202200U, 0x83B12301U, - 0x10402400U, 0x80D12501U, 0x81612601U, 0x11F02700U, - 0x16802800U, 0x86112901U, 0x87A12A01U, 0x17302B00U, - 0x84C12C01U, 0x14502D00U, 0x15E02E00U, 0x85712F01U, - 0x1B003000U, 0x8B913101U, 0x8A213201U, 0x1AB03300U, - 0x89413401U, 0x19D03500U, 0x18603600U, 0x88F13701U, - 0x8F813801U, 0x1F103900U, 0x1EA03A00U, 0x8E313B01U, - 0x1DC03C00U, 0x8D513D01U, 0x8CE13E01U, 0x1C703F00U, - 0xB4014001U, 0x24904100U, 0x25204200U, 0xB5B14301U, - 0x26404400U, 0xB6D14501U, 0xB7614601U, 0x27F04700U, - 0x20804800U, 0xB0114901U, 0xB1A14A01U, 0x21304B00U, - 0xB2C14C01U, 0x22504D00U, 0x23E04E00U, 0xB3714F01U, - 0x2D005000U, 0xBD915101U, 0xBC215201U, 0x2CB05300U, - 0xBF415401U, 0x2FD05500U, 0x2E605600U, 0xBEF15701U, - 0xB9815801U, 0x29105900U, 0x28A05A00U, 0xB8315B01U, - 0x2BC05C00U, 0xBB515D01U, 0xBAE15E01U, 0x2A705F00U, - 0x36006000U, 0xA6916101U, 0xA7216201U, 0x37B06300U, - 0xA4416401U, 0x34D06500U, 0x35606600U, 0xA5F16701U, - 0xA2816801U, 0x32106900U, 0x33A06A00U, 0xA3316B01U, - 0x30C06C00U, 0xA0516D01U, 0xA1E16E01U, 0x31706F00U, - 0xAF017001U, 0x3F907100U, 0x3E207200U, 0xAEB17301U, - 0x3D407400U, 0xADD17501U, 0xAC617601U, 0x3CF07700U, - 0x3B807800U, 0xAB117901U, 0xAAA17A01U, 0x3A307B00U, - 0xA9C17C01U, 0x39507D00U, 0x38E07E00U, 0xA8717F01U, - 0xD8018001U, 0x48908100U, 0x49208200U, 0xD9B18301U, - 0x4A408400U, 0xDAD18501U, 0xDB618601U, 0x4BF08700U, - 0x4C808800U, 0xDC118901U, 0xDDA18A01U, 0x4D308B00U, - 0xDEC18C01U, 0x4E508D00U, 0x4FE08E00U, 0xDF718F01U, - 0x41009000U, 0xD1919101U, 0xD0219201U, 0x40B09300U, - 0xD3419401U, 0x43D09500U, 0x42609600U, 0xD2F19701U, - 0xD5819801U, 0x45109900U, 0x44A09A00U, 0xD4319B01U, - 0x47C09C00U, 0xD7519D01U, 0xD6E19E01U, 0x46709F00U, - 0x5A00A000U, 0xCA91A101U, 0xCB21A201U, 0x5BB0A300U, - 0xC841A401U, 0x58D0A500U, 0x5960A600U, 0xC9F1A701U, - 0xCE81A801U, 0x5E10A900U, 0x5FA0AA00U, 0xCF31AB01U, - 0x5CC0AC00U, 0xCC51AD01U, 0xCDE1AE01U, 0x5D70AF00U, - 0xC301B001U, 0x5390B100U, 0x5220B200U, 0xC2B1B301U, - 0x5140B400U, 0xC1D1B501U, 0xC061B601U, 0x50F0B700U, - 0x5780B800U, 0xC711B901U, 0xC6A1BA01U, 0x5630BB00U, - 0xC5C1BC01U, 0x5550BD00U, 0x54E0BE00U, 0xC471BF01U, - 0x6C00C000U, 0xFC91C101U, 0xFD21C201U, 0x6DB0C300U, - 0xFE41C401U, 0x6ED0C500U, 0x6F60C600U, 0xFFF1C701U, - 0xF881C801U, 0x6810C900U, 0x69A0CA00U, 0xF931CB01U, - 0x6AC0CC00U, 0xFA51CD01U, 0xFBE1CE01U, 0x6B70CF00U, - 0xF501D001U, 0x6590D100U, 0x6420D200U, 0xF4B1D301U, - 0x6740D400U, 0xF7D1D501U, 0xF661D601U, 0x66F0D700U, - 0x6180D800U, 0xF111D901U, 0xF0A1DA01U, 0x6030DB00U, - 0xF3C1DC01U, 0x6350DD00U, 0x62E0DE00U, 0xF271DF01U, - 0xEE01E001U, 0x7E90E100U, 0x7F20E200U, 0xEFB1E301U, - 0x7C40E400U, 0xECD1E501U, 0xED61E601U, 0x7DF0E700U, - 0x7A80E800U, 0xEA11E901U, 0xEBA1EA01U, 0x7B30EB00U, - 0xE8C1EC01U, 0x7850ED00U, 0x79E0EE00U, 0xE971EF01U, - 0x7700F000U, 0xE791F101U, 0xE621F201U, 0x76B0F300U, - 0xE541F401U, 0x75D0F500U, 0x7460F600U, 0xE4F1F701U, - 0xE381F801U, 0x7310F900U, 0x72A0FA00U, 0xE231FB01U, - 0x71C0FC00U, 0xE151FD01U, 0xE0E1FE01U, 0x7070FF00U, -}; - - -static const uint16_t L2sq[43][256] = { - { 0, 44719, 16707, 61420, 33414, 11305, 50117, 28010, 6417, 47038, - 22610, 63229, 39831, 13624, 56020, 29819, 12834, 40077, 29537, 56782, - 45220, 7691, 61927, 24392, 11059, 34204, 27248, 50399, 43445, 1818, - 59638, 18009, 25668, 51947, 9479, 35752, 59074, 18541, 42881, 2350, - 32085, 54266, 15382, 37561, 65491, 20860, 48784, 4159, 22118, 63689, - 5925, 47498, 54496, 31311, 38307, 15116, 20343, 57816, 3636, 41115, - 52721, 25438, 36018, 8733, 51336, 26151, 35275, 10084, 18958, 58529, - 2893, 42466, 53657, 32566, 37082, 15989, 21279, 64944, 4700, 48371, - 64170, 21509, 48105, 5446, 30764, 54915, 14703, 38848, 58299, 19732, - 41720, 3159, 24893, 53138, 8318, 36561, 44236, 611, 60815, 17184, - 11850, 32997, 28425, 49574, 46557, 7026, 62622, 23089, 14171, 39412, - 30232, 55479, 40686, 12353, 57261, 28930, 7272, 45767, 23851, 62340, - 34815, 10576, 50876, 26643, 1401, 43990, 17466, 60053, 36109, 9122, - 52302, 25313, 3979, 41252, 20168, 57447, 37916, 15027, 54623, 31728, - 5786, 47157, 22489, 63862, 48943, 4480, 65132, 20675, 15785, 37638, - 31978, 53829, 42558, 2193, 59261, 18898, 9400, 35351, 26107, 52052, - 59721, 18406, 43018, 1701, 27599, 50528, 10892, 33827, 61528, 24311, - 45339, 8116, 29406, 56433, 13213, 40242, 56171, 30148, 39464, 13447, - 23021, 63298, 6318, 46593, 49786, 27861, 33593, 11670, 16636, 61011, - 447, 44816, 17797, 60202, 1222, 43625, 50947, 27052, 34368, 10479, - 23700, 62011, 7639, 45944, 56850, 28861, 40785, 12798, 30631, 55560, - 14052, 38987, 62753, 23438, 46178, 6861, 28342, 49177, 12277, 33114, - 60464, 17055, 44403, 988, 8641, 36718, 24706, 52781, 41799, 3560, - 57860, 19627, 14544, 38527, 31123, 55100, 47702, 5369, 64277, 21946, - 5091, 48460, 21152, 64527, 37221, 16330, 53286, 32393, 2802, 42077, - 19377, 58654, 34932, 9947, 51511, 26520, - }, - { 0, 55768, 44973, 30325, 17223, 39583, 60650, 13618, 34446, 24406, - 10531, 61691, 50633, 7185, 27236, 46012, 4353, 51417, 48812, 26484, - 21062, 35742, 65003, 9267, 38799, 20055, 14370, 57850, 54472, 3344, - 31589, 41661, 8706, 64474, 36271, 21623, 24901, 47261, 52968, 5936, - 42124, 32084, 2849, 54009, 59339, 15891, 18534, 37310, 13059, 60123, - 40110, 17782, 28740, 43420, 57321, 1585, 46477, 27733, 6688, 50168, - 63178, 12050, 22887, 32959, 17412, 40412, 60329, 12913, 1859, 56987, - 43246, 28982, 49802, 6994, 27943, 46335, 33229, 22549, 11872, 63416, - 21765, 36061, 64168, 9072, 5698, 53146, 47599, 24631, 54155, 2643, - 31782, 42494, 37068, 18708, 16225, 59065, 26118, 49118, 51627, 4211, - 9537, 64665, 35564, 21300, 57480, 14672, 20261, 38653, 41935, 31255, - 3170, 54714, 30471, 44767, 55466, 370, 13376, 60824, 39917, 16949, - 61833, 10321, 24100, 34812, 45774, 27414, 7523, 50363, 34824, 20944, - 10149, 65149, 52047, 4759, 25826, 48442, 3718, 55134, 41259, 30963, - 19905, 37913, 57964, 15284, 39177, 16593, 13988, 61308, 55886, 918, - 30179, 44091, 8071, 50783, 45098, 27122, 23744, 34072, 62317, 10933, - 43530, 29650, 1447, 56447, 59725, 12437, 18144, 40760, 11396, 62812, - 33577, 23281, 28611, 46619, 49262, 6582, 47883, 25299, 5286, 52606, - 63564, 8596, 22497, 36409, 15749, 58461, 37416, 19440, 32450, 42778, - 53615, 2231, 52236, 5588, 25505, 47737, 36683, 22163, 8422, 63806, - 19074, 37722, 58671, 15607, 2501, 53277, 42600, 32688, 56589, 1237, - 29344, 43896, 40522, 18322, 12775, 59455, 23427, 33371, 62510, 11766, - 6340, 49436, 46953, 28337, 60942, 14294, 16803, 39035, 44361, 29841, - 740, 56124, 26752, 45400, 50989, 7925, 11207, 61983, 33898, 23986, - 65295, 9943, 20642, 35194, 48200, 26000, 5093, 51773, 31105, 41049, - 54828, 4084, 15046, 58142, 38251, 19635, - }, - { 0, 27757, 55514, 46263, 44457, 49604, 30067, 6430, 18255, 11042, - 40853, 62456, 60134, 34443, 12860, 24145, 36510, 58099, 22084, 14889, - 9015, 20314, 64493, 38784, 51665, 42428, 4363, 32102, 25720, 2069, - 48290, 53455, 289, 27980, 55803, 46486, 44168, 49381, 29778, 6207, - 18030, 10755, 40628, 62169, 60359, 34730, 13085, 24432, 36799, 58322, - 22373, 15112, 8726, 20091, 64204, 38561, 51440, 42141, 4138, 31815, - 25945, 2356, 48515, 53742, 578, 28207, 55960, 46837, 45035, 50054, - 30513, 7004, 17677, 10592, 40407, 61882, 59556, 33993, 12414, 23571, - 36060, 57521, 21510, 14443, 8565, 19736, 63919, 38338, 52115, 43006, - 4937, 32548, 26170, 2647, 48864, 53901, 867, 28430, 56249, 47060, - 44746, 49831, 30224, 6781, 17452, 10305, 40182, 61595, 59781, 34280, - 12639, 23858, 36349, 57744, 21799, 14666, 8276, 19513, 63630, 38115, - 51890, 42719, 4712, 32261, 26395, 2934, 49089, 54188, 1156, 26857, - 56414, 45107, 43309, 50496, 29175, 7578, 17355, 12198, 39697, 63356, - 61026, 33295, 14008, 23253, 35354, 58999, 21184, 16045, 10163, 19422, - 65385, 37636, 52565, 41272, 5519, 31202, 24828, 3217, 47142, 54347, - 1445, 27080, 56703, 45330, 43020, 50273, 28886, 7355, 17130, 11911, - 39472, 63069, 61251, 33582, 14233, 23540, 35643, 59222, 21473, 16268, - 9874, 19199, 65096, 37413, 52340, 40985, 5294, 30915, 25053, 3504, - 47367, 54634, 1734, 27307, 56860, 45681, 43887, 50946, 29621, 8152, - 16777, 11748, 39251, 62782, 60448, 32845, 13562, 22679, 34904, 58421, - 20610, 15599, 9713, 18844, 64811, 37190, 53015, 41850, 6093, 31648, - 25278, 3795, 47716, 54793, 2023, 27530, 57149, 45904, 43598, 50723, - 29332, 7929, 16552, 11461, 39026, 62495, 60673, 33132, 13787, 22966, - 35193, 58644, 20899, 15822, 9424, 18621, 64522, 36967, 52790, 41563, - 5868, 31361, 25503, 4082, 47941, 55080, - }, - { 0, 47289, 28015, 54742, 56030, 25191, 47025, 3848, 43425, 4376, - 50382, 31863, 29567, 52166, 7696, 42665, 20319, 63462, 8752, 39561, - 38273, 11576, 63726, 16471, 59134, 24135, 35729, 13096, 15392, 33945, - 20815, 59894, 40638, 9735, 62417, 19304, 17504, 64729, 10511, 37302, - 14111, 36774, 23152, 58057, 60865, 21880, 32942, 14359, 53729, 26968, - 48270, 1079, 2879, 45958, 26192, 57065, 30784, 49401, 5423, 44438, - 41630, 6695, 53233, 30536, 8545, 39384, 19470, 62647, 64447, 17158, - 38608, 11881, 35008, 12409, 58799, 23830, 21022, 60071, 16241, 34760, - 28222, 54919, 849, 48104, 46304, 3161, 55695, 24886, 51103, 32550, - 43760, 4681, 7489, 42488, 28718, 51351, 49119, 1894, 53936, 27145, - 25857, 56760, 2158, 45271, 5758, 44743, 31505, 50088, 52384, 29721, - 41423, 6518, 61568, 18489, 40431, 9558, 10846, 37607, 18225, 65416, - 22817, 57752, 13390, 36087, 33791, 15174, 61072, 22057, 17090, 64123, - 12205, 38676, 38940, 8357, 62835, 19914, 60259, 21466, 34316, 16053, - 12733, 35076, 23762, 58475, 3485, 46372, 24818, 55371, 55107, 28666, - 47660, 661, 42044, 7301, 51539, 29162, 32482, 50779, 5005, 43828, - 56444, 25797, 45331, 2474, 1698, 48667, 27597, 54132, 30173, 52580, - 6322, 40971, 44803, 6074, 49772, 31445, 37667, 11162, 65100, 18165, - 18941, 61764, 9362, 39979, 14978, 33339, 22509, 61268, 57436, 22757, - 36147, 13706, 25507, 56090, 3788, 46709, 47485, 452, 54290, 27819, - 51714, 29371, 42861, 8148, 4316, 43109, 32179, 50442, 11516, 37957, - 16787, 63786, 63010, 20123, 39757, 9204, 34141, 15844, 59442, 20619, - 24451, 59194, 13036, 35413, 64797, 17828, 36978, 10443, 10179, 40826, - 19116, 61973, 21692, 60421, 14803, 33130, 36450, 14043, 58125, 23476, - 45634, 2811, 57133, 26516, 26780, 53285, 1523, 48458, 7139, 41818, - 30348, 52789, 49469, 31108, 44114, 5355, - }, - { 0, 53971, 47547, 27496, 28523, 48568, 54992, 1027, 57046, 3077, - 26477, 46526, 45501, 25454, 2054, 56021, 41393, 29538, 6154, 51929, - 52954, 7177, 30561, 42418, 32615, 44468, 50908, 5135, 4108, 49887, - 43447, 31588, 24447, 36268, 59076, 13335, 12308, 58055, 35247, 23420, - 33193, 21370, 14354, 60097, 61122, 15377, 22393, 34218, 65230, 11293, - 18293, 38310, 37285, 17270, 10270, 64205, 8216, 62155, 39331, 19312, - 20339, 40352, 63176, 9243, 48894, 27693, 1861, 54678, 53653, 838, - 26670, 47869, 24616, 45819, 55699, 2880, 3907, 56720, 46840, 25643, - 8015, 52636, 42740, 29735, 28708, 41719, 51615, 6988, 49561, 4938, - 30754, 43761, 44786, 31777, 5961, 50586, 57729, 13138, 22586, 35561, - 36586, 23609, 14161, 58754, 16215, 60804, 34540, 21567, 20540, 33519, - 59783, 15188, 16432, 37603, 63883, 11096, 12123, 64904, 38624, 17459, - 40678, 19509, 10077, 62862, 61837, 9054, 18486, 39653, 25057, 45874, - 55386, 2697, 3722, 56409, 46897, 26082, 48951, 28132, 1676, 54367, - 53340, 655, 27111, 47924, 49232, 4739, 31211, 43832, 44859, 32232, - 5760, 50259, 7814, 52309, 42813, 30190, 29165, 41790, 51286, 6789, - 16030, 60493, 34597, 22006, 20981, 33574, 59470, 15005, 57416, 12955, - 23027, 35616, 36643, 24048, 13976, 58443, 40751, 19964, 9876, 62535, - 61508, 8855, 18943, 39724, 16889, 37674, 63554, 10897, 11922, 64577, - 38697, 17914, 57119, 3532, 26276, 46199, 45172, 25255, 2511, 56092, - 457, 54042, 47218, 27297, 28322, 48241, 55065, 1482, 32430, 44157, - 50965, 5574, 4549, 49942, 43134, 31405, 41080, 29355, 6595, 51984, - 53011, 7616, 30376, 42107, 32864, 21171, 14811, 60168, 61195, 15832, - 22192, 33891, 24246, 35941, 59149, 13790, 12765, 58126, 34918, 23221, - 8657, 62210, 39018, 19129, 20154, 40041, 63233, 9682, 65287, 11732, - 18108, 37999, 36972, 17087, 10711, 64260, - }, - { 0, 59366, 54225, 13367, 48063, 23641, 26734, 36744, 27491, 35973, - 47282, 24404, 53468, 14138, 781, 58603, 54982, 12576, 1303, 58097, - 28025, 35487, 48808, 22862, 48549, 23107, 28276, 35218, 1562, 57852, - 54731, 12845, 45457, 22135, 25152, 34214, 2606, 60872, 55807, 15897, - 56050, 15636, 2339, 61125, 24909, 34475, 45724, 21882, 26455, 32945, - 46214, 21344, 56552, 15118, 3897, 59615, 3124, 60370, 57317, 14339, - 46987, 20589, 25690, 33724, 32575, 39129, 44270, 19208, 50304, 9062, - 5969, 61623, 5212, 62394, 51085, 8299, 45027, 18437, 31794, 39892, - 43513, 19999, 31272, 40398, 4678, 62880, 49559, 9841, 49818, 9596, - 4427, 63149, 31013, 40643, 43764, 19730, 52910, 10568, 7551, 64153, - 29969, 37623, 42688, 16678, 42445, 16939, 30236, 37370, 7794, 63892, - 52643, 10821, 6248, 65422, 52153, 11359, 41943, 17457, 28678, 38880, - 29451, 38125, 41178, 18236, 51380, 12114, 7013, 64643, 65150, 6552, - 11695, 51785, 17857, 41511, 38416, 29174, 38173, 29435, 18124, 41258, - 11938, 51524, 64883, 6805, 10424, 53086, 64361, 7311, 37639, 29921, - 16598, 42800, 17371, 42045, 36874, 30700, 63588, 8066, 11189, 52307, - 20463, 43017, 39998, 31704, 62544, 5046, 10113, 49255, 9356, 50026, - 63325, 4283, 40755, 30933, 19682, 43780, 39209, 32463, 19192, 44318, - 8854, 50544, 61767, 5793, 62026, 5548, 8603, 50813, 18933, 44563, - 39460, 32194, 33089, 26279, 21136, 46454, 15102, 56600, 59695, 3785, - 59938, 3524, 14835, 56853, 20893, 46715, 33356, 26026, 22407, 45153, - 33878, 25520, 60472, 3038, 16361, 55311, 15588, 56066, 61237, 2259, - 34651, 24765, 21642, 45932, 12496, 55094, 58113, 1255, 35695, 27785, - 22718, 48984, 23475, 48213, 34914, 28548, 57356, 2026, 13277, 54331, - 58902, 496, 13767, 53793, 23977, 47695, 36472, 27038, 36213, 27283, - 24228, 47426, 14026, 53548, 58651, 765, - }, - { 0, 29554, 59108, 38294, 53717, 41639, 14129, 17475, 49079, 52421, - 22867, 10785, 28258, 7440, 34950, 64500, 25459, 4097, 34199, 63205, - 45734, 49620, 21570, 10032, 56516, 44982, 14880, 18770, 3345, 32355, - 60405, 39047, 50918, 46484, 8194, 21360, 5939, 25665, 61911, 33445, - 31057, 2595, 40885, 60615, 43140, 56310, 20064, 15634, 42389, 55015, - 17265, 12291, 29760, 1842, 37540, 57814, 6690, 26960, 64710, 36788, - 52215, 47237, 11539, 24161, 37329, 58019, 30517, 1095, 16388, 13174, - 42720, 54674, 11878, 23828, 51330, 48112, 65459, 36033, 6487, 27173, - 62114, 33232, 5190, 26420, 9079, 20485, 50579, 46817, 19733, 15975, - 44017, 55427, 40128, 61362, 31268, 2390, 22327, 9285, 45523, 49825, - 34530, 62864, 24582, 4980, 59520, 39922, 3684, 32022, 14677, 18983, - 57265, 44227, 13380, 18230, 53920, 41426, 58769, 38627, 885, 28679, - 35827, 63617, 27927, 7781, 23078, 10580, 48322, 53168, 16319, 19661, - 55643, 43561, 61034, 40216, 2190, 31740, 32776, 62330, 26348, 5534, - 20957, 8879, 46905, 50251, 23756, 12222, 47656, 51546, 36121, 65131, - 27645, 6287, 58235, 36873, 1439, 30445, 12974, 16860, 54346, 42808, - 63833, 35371, 8125, 27855, 10380, 23550, 52840, 48410, 18158, 13724, - 40970, 54136, 38715, 58441, 29151, 685, 39466, 59736, 31950, 4028, - 19455, 14477, 44315, 56937, 9629, 22255, 50041, 45067, 62536, 34618, - 4780, 25054, 44654, 56604, 18570, 15352, 32699, 3273, 39263, 59949, - 4569, 25259, 63293, 33871, 49164, 45950, 9960, 21914, 52509, 48751, - 11257, 22667, 7368, 28602, 64044, 35166, 29354, 472, 37966, 59196, - 41855, 53261, 17819, 14057, 26760, 7162, 36460, 64798, 47453, 51759, - 24505, 11467, 55103, 42061, 12763, 17065, 1770, 30104, 57358, 37756, - 3067, 30857, 60703, 40557, 55854, 43356, 15562, 20408, 46156, 51006, - 21160, 8666, 26009, 5867, 33661, 61455, - }, - { 0, 14648, 29296, 19272, 58592, 56792, 38544, 44968, 54749, 60645, - 42925, 40597, 12605, 2053, 17229, 31349, 47015, 36511, 50647, 64751, - 21319, 27263, 8503, 6159, 25210, 23362, 4106, 10546, 34458, 49058, - 62698, 52690, 29523, 19051, 291, 14363, 38835, 44683, 58819, 56571, - 42638, 40886, 54526, 60870, 17006, 31574, 12318, 2342, 50420, 64972, - 46724, 36796, 8212, 6444, 21092, 27484, 4393, 10257, 25433, 23137, - 62921, 52465, 34745, 48769, 59046, 57246, 38102, 44526, 582, 15230, - 28726, 18702, 13179, 2627, 16651, 30771, 55195, 61091, 42475, 40147, - 20737, 26681, 9073, 6729, 46561, 36057, 51089, 65193, 34012, 48612, - 63148, 53140, 24636, 22788, 4684, 11124, 38389, 44237, 59269, 57021, - 28949, 18477, 869, 14941, 16424, 30992, 12888, 2912, 42184, 40432, - 54968, 61312, 8786, 7018, 20514, 26906, 50866, 65418, 46274, 36346, - 63375, 52919, 34303, 48327, 4975, 10839, 24863, 22567, 53585, 59497, - 41761, 39449, 13745, 3209, 18369, 32505, 1164, 15796, 30460, 20420, - 57452, 55636, 37404, 43812, 26358, 24526, 5254, 11710, 33302, 47918, - 61542, 51550, 45867, 35347, 49499, 63587, 22475, 28403, 9659, 7299, - 41474, 39738, 53362, 59722, 18146, 32730, 13458, 3498, 30687, 20199, - 1455, 15511, 37695, 43527, 57679, 55415, 5541, 11421, 26581, 24301, - 61765, 51325, 33589, 47629, 49272, 63808, 45576, 35632, 9368, 7584, - 22248, 28624, 14327, 3791, 17799, 31935, 54039, 59951, 41319, 39007, - 57898, 56082, 36954, 43362, 1738, 16370, 29882, 19842, 32848, 47464, - 61984, 51992, 25776, 23944, 5824, 12280, 21901, 27829, 10237, 7877, - 45421, 34901, 49949, 64037, 17572, 32156, 14036, 4076, 41028, 39292, - 53812, 60172, 37241, 43073, 58121, 55857, 30105, 19617, 2025, 16081, - 62211, 51771, 33139, 47179, 6115, 11995, 26003, 23723, 9950, 8166, - 21678, 28054, 49726, 64262, 45134, 35190, - }, - { 0, 7197, 14394, 9255, 28788, 27753, 18510, 21587, 57576, 64757, - 55506, 50383, 37020, 35969, 43174, 46267, 56781, 49616, 58871, 63978, - 44473, 45476, 38275, 35230, 15653, 8504, 1311, 6402, 19793, 20812, - 30059, 26998, 42887, 48026, 40893, 33696, 55283, 52206, 61385, 62420, - 18287, 23410, 32597, 25416, 14107, 11014, 3873, 4924, 31306, 26199, - 17008, 24173, 2622, 5667, 12804, 11801, 39586, 34495, 41624, 48773, - 60118, 63179, 53996, 52977, 21267, 20238, 27433, 30516, 9063, 16250, - 7005, 1856, 46075, 45030, 35777, 38876, 50063, 57234, 64437, 59304, - 36574, 37571, 46820, 43769, 65194, 58039, 50832, 55949, 28214, 29227, - 22028, 18961, 7746, 607, 9848, 14949, 62612, 59529, 52398, 53427, - 34016, 39165, 48346, 41159, 5244, 2145, 11334, 12379, 25608, 30741, - 23602, 16431, 10585, 13636, 4451, 3454, 22829, 17712, 24855, 32010, - 51633, 54700, 61835, 60822, 47557, 42456, 33279, 40418, 42534, 47675, - 40476, 33281, 54866, 51791, 61032, 62069, 18126, 23251, 32500, 25321, - 14010, 10919, 3712, 4765, 31723, 26614, 17361, 24524, 2975, 6018, - 13221, 12216, 39683, 34590, 41785, 48932, 60279, 63338, 54093, 53072, - 417, 7612, 14747, 9606, 29141, 28104, 18927, 22002, 57673, 64852, - 55667, 50542, 37181, 36128, 43271, 46362, 56428, 49265, 58454, 63563, - 44056, 45061, 37922, 34879, 15492, 8345, 1214, 6307, 19696, 20717, - 29898, 26839, 62773, 59688, 52495, 53522, 34113, 39260, 48507, 41318, - 5597, 2496, 11751, 12794, 26025, 31156, 23955, 16782, 10488, 13541, - 4290, 3295, 22668, 17553, 24758, 31915, 51216, 54285, 61482, 60471, - 47204, 42105, 32862, 40003, 21170, 20143, 27272, 30357, 8902, 16091, - 6908, 1761, 45658, 44615, 35424, 38525, 49710, 56883, 64020, 58889, - 36735, 37730, 46917, 43864, 65291, 58134, 50993, 56108, 28567, 29578, - 22445, 19376, 8163, 1022, 10201, 15300, - }, - { 0, 32897, 7455, 40350, 14910, 47807, 10017, 42912, 29820, 62717, - 26979, 59874, 20034, 52931, 21341, 54236, 59640, 26745, 62951, 30054, - 53958, 21063, 53209, 20312, 40068, 7173, 33179, 282, 42682, 9787, - 48037, 15140, 52717, 19820, 53490, 20595, 63443, 30546, 60108, 27213, - 47505, 14608, 42126, 9231, 33711, 814, 40624, 7729, 9493, 42388, - 14346, 47243, 7979, 40874, 564, 33461, 20841, 53736, 19574, 52471, - 27479, 60374, 30280, 63177, 34759, 1862, 39640, 6745, 48633, 15736, - 41190, 8295, 62395, 29498, 61092, 28197, 51589, 18692, 54426, 21531, - 28479, 61374, 29216, 62113, 21761, 54656, 18462, 51359, 6979, 39874, - 1628, 34525, 8573, 41468, 15458, 48355, 18986, 51883, 22325, 55220, - 28692, 61589, 27915, 60810, 15958, 48855, 9033, 41928, 1128, 34025, - 6519, 39414, 41682, 8787, 49101, 16204, 39148, 6253, 34291, 1394, - 54958, 22063, 52145, 19248, 60560, 27665, 61839, 28942, 5011, 37650, - 3724, 36365, 10669, 43308, 13490, 46131, 26607, 59246, 31472, 64113, - 24017, 56656, 16590, 49231, 64363, 31722, 58996, 26357, 49493, 16852, - 56394, 23755, 36631, 3990, 37384, 4745, 46377, 13736, 43062, 10423, - 56958, 24319, 50017, 17376, 58432, 25793, 63839, 31198, 43522, 10883, - 46877, 14236, 36924, 4285, 36131, 3490, 13958, 46599, 11161, 43800, - 3256, 35897, 4519, 37158, 17146, 49787, 24549, 57188, 30916, 63557, - 26075, 58714, 37972, 5333, 35147, 2506, 44650, 12011, 45941, 13300, - 57384, 24745, 64823, 32182, 55830, 23191, 50953, 18312, 31916, 64557, - 25011, 57650, 18066, 50707, 23437, 56076, 2256, 34897, 5583, 38222, - 13038, 45679, 12273, 44912, 22969, 55608, 17574, 50215, 25479, 58118, - 32408, 65049, 11717, 44356, 12506, 45147, 6139, 38778, 2788, 35429, - 45377, 12736, 44126, 11487, 35711, 3070, 38496, 5857, 50493, 17852, - 55330, 22691, 65283, 32642, 57884, 25245, - }, - { 0, 52943, 33155, 20300, 7963, 53716, 40600, 20567, 15926, 61689, - 49077, 29050, 8493, 61410, 41134, 28257, 31852, 45731, 65007, 13088, - 25463, 44472, 58100, 11323, 16986, 35989, 50137, 3350, 23873, 37774, - 56514, 4621, 63704, 13847, 31067, 46996, 59331, 10508, 26176, 43151, - 50926, 2081, 18285, 35234, 55797, 5946, 22646, 38585, 33972, 19067, - 1335, 52216, 39855, 21856, 6700, 54499, 47746, 29773, 15105, 62926, - 42393, 27478, 9242, 60117, 60845, 9058, 27694, 41697, 62134, 15481, - 29493, 48634, 54171, 7508, 21016, 40151, 52352, 591, 19715, 33740, - 37313, 24334, 4162, 56973, 36570, 16405, 3929, 49558, 45047, 24888, - 11892, 57531, 45292, 32291, 12655, 65440, 5493, 56250, 38134, 23097, - 2670, 50337, 35821, 17698, 11075, 58764, 43712, 25615, 13400, 64151, - 46555, 31508, 26905, 42966, 59546, 9813, 30210, 47309, 63361, 14670, - 22319, 39392, 54956, 6243, 18484, 34555, 51639, 1912, 51015, 2440, - 18116, 34827, 55388, 5779, 23007, 38672, 63857, 14270, 30962, 46653, - 58986, 10405, 26601, 43302, 47915, 30180, 15016, 62567, 42032, 27391, - 9651, 60284, 34077, 19410, 1182, 51793, 39430, 21705, 7045, 54602, - 16287, 61776, 48668, 28883, 8324, 61003, 41223, 28616, 425, 53094, - 32810, 20197, 7858, 53373, 40753, 20990, 17395, 36156, 49776, 3263, - 23784, 37415, 56683, 5028, 32197, 45834, 64582, 12937, 25310, 44049, - 58205, 11666, 10986, 58405, 43881, 26022, 13809, 64318, 46194, 31421, - 5340, 55827, 38239, 23440, 3015, 50440, 35396, 17547, 22150, 38985, - 55045, 6602, 18845, 34642, 51230, 1745, 26800, 42623, 59699, 10236, - 30635, 47460, 63016, 14567, 53810, 7421, 21425, 40318, 52521, 998, - 19626, 33381, 60420, 8907, 28039, 41800, 62239, 15824, 29340, 48211, - 44638, 24721, 12253, 57618, 45381, 32650, 12486, 65033, 36968, 24231, - 4587, 57124, 36723, 16828, 3824, 49215, - }, - { 0, 59880, 53197, 9765, 33671, 27247, 19530, 42402, 6931, 62203, - 54494, 15670, 39060, 29052, 22361, 48817, 13862, 57294, 63979, 4099, - 46497, 23625, 31340, 37764, 11573, 50397, 58104, 2832, 44722, 18266, - 24959, 34967, 27724, 34212, 41857, 19049, 61387, 1571, 8198, 51694, - 30559, 40631, 47250, 20858, 62680, 7472, 15125, 54013, 23146, 45954, - 38311, 31823, 55789, 12293, 5664, 65480, 16761, 43153, 36532, 26460, - 49918, 11030, 3379, 58587, 55448, 12656, 5973, 65213, 23327, 45815, - 38098, 32058, 50059, 10851, 3142, 58798, 16396, 43492, 36801, 26153, - 61118, 1878, 8563, 51355, 27961, 34001, 41716, 19228, 62893, 7237, - 14944, 54152, 30250, 40898, 47591, 20495, 46292, 23868, 31513, 37617, - 14163, 57019, 63646, 4470, 44999, 17967, 24586, 35298, 11328, 50600, - 58253, 2661, 33522, 27418, 19775, 42199, 373, 59549, 52920, 10064, - 39393, 28681, 22060, 49092, 6758, 62350, 54699, 15427, 44333, 17605, - 25312, 35592, 11946, 51010, 57703, 2191, 46654, 24534, 31219, 36891, - 13753, 56401, 64116, 5020, 39691, 29411, 21702, 48430, 6284, 61796, - 55105, 16041, 32792, 27120, 20437, 42557, 927, 60023, 52306, 9658, - 49505, 10377, 3756, 59204, 17126, 43790, 36139, 25795, 55922, 13210, - 5567, 64599, 23029, 45085, 38456, 32720, 63303, 7855, 14474, 53602, - 29888, 40232, 47885, 21221, 60500, 1468, 9113, 51825, 28627, 34363, - 40990, 18934, 30133, 40029, 47736, 21392, 63026, 8154, 14847, 53271, - 28326, 34638, 41323, 18563, 60705, 1225, 8940, 51972, 17299, 43643, - 35934, 26038, 49172, 10748, 4057, 58929, 22656, 45416, 38733, 32421, - 56071, 13039, 5322, 64802, 6649, 61457, 54836, 16348, 39550, 29590, - 21939, 48219, 746, 60162, 52519, 9423, 33133, 26757, 20128, 42824, - 12255, 50743, 57362, 2554, 44120, 17840, 25493, 35453, 13516, 56612, - 64257, 4841, 46923, 24227, 30854, 37230, - }, - { 0, 29813, 59626, 40095, 52681, 47548, 9507, 20822, 34703, 62458, - 28517, 6928, 19014, 15923, 41644, 55001, 4867, 26486, 64489, 36764, - 57034, 43711, 13856, 16981, 38028, 57593, 31846, 2067, 22853, 11568, - 45487, 50650, 9734, 21107, 52972, 47769, 60367, 40890, 805, 30544, - 41353, 54780, 18787, 15638, 27712, 6197, 33962, 61663, 13573, 16752, - 56815, 43418, 63692, 36025, 4134, 25683, 45706, 50943, 23136, 11797, - 32579, 2870, 38825, 58332, 19468, 14457, 42214, 53395, 33221, 62896, - 26927, 7514, 52099, 49142, 9065, 22300, 1610, 29247, 61088, 39637, - 24335, 11130, 47077, 50064, 37574, 59059, 31276, 3673, 55424, 44277, - 12394, 17439, 5449, 24892, 64931, 35286, 27146, 7807, 33504, 63125, - 42947, 54198, 20265, 15196, 60805, 39408, 1391, 28954, 8268, 21561, - 51366, 48339, 30985, 3452, 37347, 58774, 46272, 49333, 23594, 10335, - 65158, 35571, 5740, 25113, 13135, 18234, 56229, 45008, 38936, 60525, - 28914, 1159, 21969, 8612, 48443, 51534, 8087, 27618, 63357, 33544, - 53854, 42539, 15028, 20161, 35611, 65390, 25585, 6020, 18130, 12967, - 44600, 55885, 3220, 30945, 58494, 36875, 49501, 46376, 10679, 24002, - 48670, 51819, 22260, 8833, 29655, 1954, 39741, 61256, 14737, 19940, - 53627, 42254, 62552, 32813, 7346, 26823, 44317, 55656, 17911, 12674, - 24788, 5281, 34878, 64587, 10898, 24295, 49784, 46605, 59227, 37678, - 4017, 31684, 54292, 41057, 15614, 18571, 6621, 28072, 61751, 34114, - 21403, 10222, 47985, 52996, 40530, 59943, 30392, 717, 50967, 45922, - 12285, 23432, 2782, 32427, 57908, 38465, 16536, 13549, 43122, 56327, - 36177, 63780, 26043, 4558, 61970, 34407, 6904, 28301, 16347, 19374, - 55089, 41796, 30109, 488, 40311, 59650, 47188, 52257, 20670, 9419, - 57617, 38244, 2555, 32142, 11480, 22701, 50226, 45127, 26270, 4843, - 36468, 64001, 43863, 57122, 17341, 14280, - }, - { 0, 46261, 30071, 49602, 60142, 24155, 40857, 11052, 51649, 32116, - 48310, 2051, 9007, 38810, 22104, 58093, 36767, 15146, 64232, 20061, - 25969, 53700, 4102, 42163, 18014, 62187, 13097, 34716, 44208, 6149, - 55751, 28018, 803, 46998, 30292, 49889, 59853, 23928, 40122, 10255, - 51938, 32343, 49045, 2848, 8204, 38073, 21883, 57806, 36028, 14345, - 63947, 19838, 26194, 53991, 4901, 42896, 17789, 61896, 12298, 33983, - 44947, 6950, 56036, 28241, 1606, 45811, 29489, 51076, 60584, 22557, - 39391, 11626, 53127, 31538, 47856, 3653, 9577, 37340, 20510, 58539, - 35289, 15724, 64686, 18459, 25399, 55170, 5696, 41717, 16408, 62637, - 13679, 33242, 43766, 7747, 57217, 27444, 1381, 45520, 28690, 50343, - 61323, 23358, 39676, 11849, 52388, 30737, 47571, 3430, 9802, 37631, - 21309, 59272, 35578, 15951, 65421, 19256, 24596, 54433, 5475, 41430, - 17211, 63374, 13900, 33529, 43477, 7520, 56482, 26647, 3212, 47161, - 31227, 52558, 58978, 21207, 37653, 10144, 50509, 29176, 45114, 1167, - 12195, 39702, 23252, 61025, 33555, 14246, 63076, 17105, 27133, 56648, - 7306, 43071, 19154, 65127, 16293, 35600, 41020, 5257, 54603, 25086, - 4015, 47898, 31448, 52845, 58689, 20980, 36918, 9347, 50798, 29403, - 45849, 1964, 11392, 38965, 23031, 60738, 32816, 13445, 62791, 16882, - 27358, 56939, 8105, 43804, 18929, 64836, 15494, 34867, 41759, 6058, - 54888, 25309, 2762, 48767, 32701, 51976, 57380, 21649, 38227, 8678, - 49931, 30654, 46716, 713, 10725, 40272, 23698, 59431, 34133, 12768, - 61474, 17559, 28603, 56078, 6860, 44665, 19604, 63521, 14819, 36182, - 42618, 4815, 54029, 26552, 2537, 48476, 31902, 51243, 58119, 22450, - 38512, 8901, 49192, 29853, 46431, 490, 10950, 40563, 24497, 60164, - 34422, 12995, 62209, 18356, 27800, 55341, 6639, 44378, 20407, 64258, - 15040, 36469, 42329, 4588, 53294, 25755, - }, - { 0, 54485, 46519, 24930, 30579, 41894, 49860, 5649, 61158, 14899, - 23377, 36740, 39317, 19776, 11298, 63735, 49617, 5380, 29798, 41139, - 46754, 25207, 789, 55232, 12087, 64482, 39552, 20053, 22596, 35985, - 60915, 14630, 40895, 19306, 10760, 65245, 59596, 15385, 23931, 35246, - 29017, 42380, 50414, 4155, 1578, 54015, 45981, 26440, 24174, 35515, - 60377, 16140, 10525, 64968, 40106, 18559, 45192, 25693, 1343, 53738, - 51195, 4910, 29260, 42649, 9059, 63414, 38612, 16897, 21520, 32965, - 57767, 13682, 52613, 6480, 30770, 44263, 47862, 28195, 3905, 56212, - 58034, 13927, 22277, 33744, 38337, 16660, 8310, 62627, 3156, 55425, - 47587, 27958, 31527, 45042, 52880, 6725, 48348, 26633, 2411, 56766, - 52143, 8058, 32280, 43725, 21050, 34543, 59277, 13144, 9545, 61852, - 37118, 17451, 32013, 43480, 51386, 7279, 2686, 57003, 49097, 27420, - 37867, 18238, 9820, 62089, 58520, 12365, 20783, 34298, 18118, 37395, - 62321, 10148, 12725, 58720, 33794, 20695, 43040, 31989, 7575, 51522, - 57171, 2950, 27364, 48689, 34583, 21442, 12960, 58997, 61540, 9393, - 17875, 37126, 27121, 48420, 56390, 2195, 7810, 51799, 43829, 32736, - 55673, 3500, 27854, 47131, 44554, 31455, 7101, 53096, 14239, 58186, - 33320, 22269, 16620, 37945, 62811, 8590, 6312, 52349, 44319, 31178, - 28635, 47886, 55916, 3769, 63054, 8859, 17401, 38700, 33085, 21992, - 13450, 57439, 26021, 45424, 53266, 1223, 4822, 50691, 42849, 29620, - 35651, 24470, 16116, 59937, 64560, 10469, 18823, 40274, 42100, 28833, - 4547, 50454, 54023, 2002, 26288, 45669, 19090, 40519, 65317, 11248, - 15841, 59700, 34902, 23683, 64026, 11983, 20397, 39800, 36201, 22972, - 14558, 60427, 5372, 49193, 41291, 30110, 25487, 46938, 54840, 749, - 15307, 61214, 36476, 23209, 19640, 39021, 63759, 11738, 54573, 504, - 24730, 46159, 41566, 30347, 6121, 49980, - }, - { 0, 58597, 54743, 12594, 47027, 21334, 25188, 34433, 29563, 38814, - 42668, 16969, 50376, 8237, 4383, 62970, 59126, 531, 13089, 55236, - 20805, 46496, 33938, 24695, 38285, 29032, 16474, 42175, 8766, 50907, - 63465, 4876, 53745, 13588, 1062, 57539, 26178, 33447, 45973, 22384, - 41610, 18031, 30557, 37816, 5433, 61916, 49390, 9227, 14087, 54242, - 58064, 1589, 32948, 25681, 21859, 45446, 17532, 41113, 37291, 30030, - 62415, 5930, 9752, 49917, 49151, 23322, 27176, 36557, 2124, 60585, - 56731, 14718, 52356, 10337, 6483, 64950, 31543, 40914, 44768, 18949, - 22793, 48620, 36062, 26683, 61114, 2655, 15213, 57224, 10866, 52887, - 65445, 6976, 40385, 31012, 18454, 44275, 28174, 35563, 48089, 24380, - 55741, 15704, 3178, 59535, 7541, 63888, 51362, 11335, 43718, 20003, - 32529, 39924, 35064, 27677, 23855, 47562, 16203, 56238, 60060, 3705, - 64387, 8038, 11860, 51889, 19504, 43221, 39399, 32002, 25571, 34566, - 46644, 21201, 54352, 12469, 391, 58722, 4248, 62589, 50511, 8618, - 42795, 17358, 29436, 38425, 34069, 25072, 20674, 46119, 12966, 54851, - 59249, 916, 63086, 4747, 9145, 51036, 16861, 42296, 37898, 28911, - 45586, 22263, 26565, 33568, 1441, 57668, 53366, 13459, 49513, 9612, - 5310, 61531, 30426, 37439, 41741, 18408, 21732, 45057, 33075, 26070, - 58199, 1970, 13952, 53861, 10143, 50042, 62024, 5805, 36908, 29897, - 17915, 41246, 56348, 14585, 2507, 60718, 27567, 36682, 48760, 23197, - 44903, 19330, 31408, 40533, 6356, 64561, 52483, 10726, 15082, 56847, - 61245, 3032, 36185, 27068, 22670, 48235, 18833, 44404, 40006, 30883, - 65058, 6855, 11253, 53008, 3565, 59656, 55354, 15583, 47710, 24251, - 28553, 35692, 32406, 39539, 43841, 20388, 51493, 11712, 7410, 63511, - 60187, 4094, 16076, 55849, 23720, 47181, 35199, 28058, 39008, 31877, - 19895, 43346, 12243, 52022, 64004, 7905, - }, - { 0, 64765, 58855, 6426, 55251, 11054, 12852, 52937, 46011, 20294, - 22108, 43681, 25704, 39061, 33167, 32114, 31595, 34710, 40588, 25201, - 44216, 20549, 18783, 46498, 51408, 13357, 11575, 53706, 7939, 58366, - 64228, 1561, 63190, 2603, 4913, 61388, 8453, 56824, 50402, 14367, - 17773, 47504, 41098, 23671, 37566, 28227, 30553, 35748, 36285, 28992, - 26714, 38055, 23150, 42643, 49033, 17268, 15878, 49915, 56289, 10012, - 59861, 5416, 3122, 61647, 61873, 3404, 5206, 59563, 9826, 55967, - 50053, 16248, 16906, 48887, 42989, 23312, 38361, 26916, 28734, 36035, - 35546, 30247, 28477, 37824, 23817, 41460, 47342, 17427, 14689, 50588, - 56454, 8315, 61106, 4687, 2901, 63400, 1895, 64410, 57984, 7805, - 53428, 11337, 13651, 51630, 46300, 18465, 20795, 44486, 25359, 40946, - 34536, 31253, 31756, 33009, 39403, 25878, 43999, 22306, 20024, 45765, - 53175, 13130, 10832, 54957, 6244, 58521, 64899, 382, 65407, 898, - 6808, 58981, 10412, 54353, 52555, 12726, 19652, 45113, 43299, 21982, - 39703, 26602, 32496, 33293, 33812, 30953, 25075, 40206, 21447, 44858, - 46624, 19165, 14255, 52050, 53832, 11957, 57468, 7297, 1435, 63846, - 2473, 62804, 60494, 4275, 56954, 8839, 15261, 51040, 47634, 18159, - 24565, 41736, 28097, 37180, 34854, 29915, 29378, 36415, 38693, 27608, - 42257, 23020, 16630, 48139, 49529, 15748, 9374, 55395, 5802, 59991, - 62285, 4016, 3790, 62003, 60201, 6100, 55581, 9696, 15610, 49159, - 48501, 16776, 22674, 42095, 27302, 38491, 36673, 29628, 30117, 35160, - 36930, 27839, 41590, 24203, 18321, 47980, 50718, 15075, 9209, 57092, - 4557, 60720, 62506, 2263, 63512, 1253, 7679, 57602, 12235, 54070, - 51756, 14033, 19363, 46942, 44612, 21177, 40048, 24717, 31127, 34154, - 33651, 32654, 26260, 39529, 21664, 43101, 45383, 19898, 12488, 52277, - 54575, 10706, 59163, 7142, 764, 65025, - }, - { 0, 61681, 65023, 3342, 59363, 5906, 6684, 60141, 54235, 9002, - 11812, 57045, 13368, 50377, 51655, 14646, 48043, 19290, 18004, 46757, - 23624, 44217, 41399, 20806, 26736, 39041, 38287, 25982, 36755, 32610, - 29292, 33437, 27467, 39866, 38580, 26181, 36008, 31833, 29015, 33190, - 47248, 18529, 17775, 46494, 24435, 44930, 41612, 21117, 53472, 8209, - 11551, 56814, 14083, 51186, 51964, 14861, 827, 62410, 65220, 3637, - 58584, 5161, 6439, 59862, 54934, 9831, 11113, 56216, 12661, 49540, - 52362, 15483, 1357, 62908, 63666, 2115, 58030, 4703, 8017, 61344, - 27965, 40396, 37058, 24627, 35550, 31279, 30497, 34768, 48870, 19991, - 17177, 46056, 22789, 43508, 42234, 21515, 48605, 19756, 16418, 45267, - 23102, 43727, 42945, 22320, 28166, 40695, 37881, 25352, 35301, 30996, - 29722, 34027, 1654, 63111, 64393, 2936, 57749, 4452, 7274, 60571, - 54701, 9564, 10322, 55459, 12878, 49855, 53169, 16192, 45361, 16832, - 19662, 48191, 22226, 42531, 43821, 23516, 25322, 37403, 40725, 28644, - 34057, 30200, 30966, 34823, 2714, 64107, 63333, 1940, 60793, 7560, - 4230, 57463, 55617, 10672, 9406, 54351, 16034, 52819, 50013, 13228, - 55930, 10891, 10117, 55156, 15769, 52584, 49254, 12439, 2465, 63824, - 62558, 1199, 60994, 7859, 5053, 58188, 25041, 37152, 39982, 27871, - 34354, 30403, 31693, 35644, 45578, 17147, 20469, 48900, 21993, 42264, - 43030, 22759, 26535, 38742, 39512, 27305, 32836, 28853, 32187, 36170, - 46204, 17549, 18819, 47474, 21407, 41838, 44640, 24209, 56332, 11517, - 8691, 53506, 15343, 51998, 50704, 14049, 4055, 65318, 61992, 729, - 59444, 6341, 5579, 58682, 3308, 64541, 61715, 482, 60175, 7166, - 5872, 58881, 57143, 12230, 8904, 53817, 14548, 51237, 50475, 13786, - 46919, 18358, 19128, 47689, 20644, 41045, 44379, 23978, 25756, 37997, - 39267, 27026, 33663, 29582, 32384, 36465, - }, - { 0, 63223, 61939, 1796, 65531, 2316, 3592, 63743, 58347, 5404, - 4632, 58607, 7184, 60135, 60899, 6932, 56267, 11580, 10808, 56527, - 9264, 53959, 54723, 9012, 14368, 52951, 51667, 16164, 51163, 12588, - 13864, 49375, 43915, 23932, 23160, 44175, 21616, 41607, 42371, 21364, - 18528, 48791, 47507, 20324, 47003, 16748, 18024, 45215, 28736, 34487, - 33203, 30532, 36795, 31052, 32328, 35007, 37803, 25948, 25176, 38063, - 27728, 39591, 40355, 27476, 19211, 48636, 47864, 19471, 46320, 16903, - 17667, 46068, 43232, 24087, 22803, 45028, 22299, 41452, 42728, 20511, - 37056, 26167, 24883, 38852, 28475, 39372, 40648, 26687, 29483, 34268, - 33496, 29743, 36048, 31271, 32035, 35796, 57472, 5751, 4467, 59268, - 8059, 59788, 61064, 6271, 875, 62876, 62104, 1135, 64656, 2663, - 3427, 64404, 15179, 52668, 51896, 15439, 50352, 12871, 13635, 50100, - 55456, 11863, 10579, 57252, 10075, 53676, 54952, 8287, 38422, 24801, - 26597, 37138, 27117, 40730, 38942, 28393, 30205, 33546, 33806, 29433, - 35334, 31985, 31733, 36098, 19933, 47914, 48174, 19161, 45606, 17617, - 17365, 46370, 44598, 22721, 24517, 43314, 20941, 42810, 41022, 22217, - 15773, 52074, 52334, 15001, 49766, 13457, 13205, 50530, 56950, 10369, - 12165, 55666, 8589, 55162, 53374, 9865, 58966, 4257, 6053, 57682, - 6573, 61274, 59486, 7849, 1469, 62282, 62542, 697, 64070, 3249, - 2997, 64834, 56605, 11242, 11502, 55833, 8934, 54289, 54037, 9698, - 16118, 51201, 52997, 14834, 49421, 14330, 12542, 50697, 1750, 61473, - 63269, 466, 63789, 4058, 2270, 65065, 58685, 5066, 5326, 57913, - 6854, 60465, 60213, 7618, 30358, 32865, 34661, 29074, 35181, 32666, - 30878, 36457, 38269, 25482, 25742, 37497, 27270, 40049, 39797, 28034, - 44381, 23466, 23726, 43609, 21158, 42065, 41813, 21922, 20150, 47169, - 48965, 18866, 45389, 18362, 16574, 46665, - }, - { 0, 62964, 63477, 513, 62455, 1539, 1026, 61942, 64499, 3591, - 3078, 63986, 2052, 65008, 65521, 2565, 60411, 7695, 7182, 59898, - 6156, 60920, 61433, 6669, 4104, 58876, 59389, 4617, 58367, 5643, - 5130, 57854, 52203, 15903, 15390, 51690, 14364, 52712, 53225, 14877, - 12312, 50668, 51181, 12825, 50159, 13851, 13338, 49646, 8208, 54756, - 55269, 8721, 54247, 9747, 9234, 53734, 56291, 11799, 11286, 55778, - 10260, 56800, 57313, 10773, 35787, 32319, 31806, 35274, 30780, 36296, - 36809, 31293, 28728, 34252, 34765, 29241, 33743, 30267, 29754, 33230, - 24624, 38340, 38853, 25137, 37831, 26163, 25650, 37318, 39875, 28215, - 27702, 39362, 26676, 40384, 40897, 27189, 16416, 46548, 47061, 16929, - 46039, 17955, 17442, 45526, 48083, 20007, 19494, 47570, 18468, 48592, - 49105, 18981, 43995, 24111, 23598, 43482, 22572, 44504, 45017, 23085, - 20520, 42460, 42973, 21033, 41951, 22059, 21546, 41438, 2955, 65151, - 64638, 2442, 63612, 3464, 3977, 64125, 61560, 1420, 1933, 62073, - 911, 63099, 62586, 398, 57456, 5508, 6021, 57969, 4999, 58995, - 58482, 4486, 7043, 61047, 60534, 6530, 59508, 7552, 8065, 60021, - 49248, 13716, 14229, 49761, 13207, 50787, 50274, 12694, 15251, 52839, - 52326, 14738, 51300, 15760, 16273, 51813, 11163, 56943, 56430, 10650, - 55404, 11672, 12185, 55917, 53352, 9628, 10141, 53865, 9119, 54891, - 54378, 8606, 32832, 30132, 30645, 33345, 29623, 34371, 33858, 29110, - 31667, 36423, 35910, 31154, 34884, 32176, 32689, 35397, 27579, 40527, - 40014, 27066, 38988, 28088, 28601, 39501, 36936, 26044, 26557, 37449, - 25535, 38475, 37962, 25022, 19371, 48735, 48222, 18858, 47196, 19880, - 20393, 47709, 45144, 17836, 18349, 45657, 17327, 46683, 46170, 16814, - 41040, 21924, 22437, 41553, 21415, 42579, 42066, 20902, 23459, 44631, - 44118, 22946, 43092, 23968, 24481, 43605, - }, - { 0, 31355, 62710, 36493, 62961, 36746, 263, 31612, 63487, 36228, - 777, 31090, 526, 30837, 63224, 35971, 62435, 35224, 1813, 32110, - 1554, 31849, 62180, 34975, 1052, 32359, 61674, 35473, 61933, 35734, - 1307, 32608, 64475, 33184, 3885, 30038, 3626, 29777, 64220, 32935, - 3108, 30303, 63698, 33449, 63957, 33710, 3363, 30552, 2104, 29251, - 64718, 34485, 64969, 34738, 2367, 29508, 65479, 34236, 2865, 29002, - 2614, 28749, 65216, 33979, 60331, 37328, 8029, 25894, 7770, 25633, - 60076, 37079, 7252, 26159, 59554, 37593, 59813, 37854, 7507, 26408, - 6216, 25139, 60606, 38597, 60857, 38850, 6479, 25396, 61367, 38348, - 6977, 24890, 6726, 24637, 61104, 38091, 4208, 27147, 58502, 40701, - 58753, 40954, 4471, 27404, 59279, 40436, 4985, 26882, 4734, 26629, - 59016, 40179, 58259, 39400, 5989, 27934, 5730, 27673, 58004, 39151, - 5228, 28183, 57498, 39649, 57757, 39910, 5483, 28432, 52043, 45360, - 16317, 17862, 16058, 17601, 51788, 45111, 15540, 18127, 51266, 45625, - 51525, 45886, 15795, 18376, 14504, 17107, 52318, 46629, 52569, 46882, - 14767, 17364, 53079, 46380, 15265, 16858, 15014, 16605, 52816, 46123, - 12432, 19179, 50278, 48669, 50529, 48922, 12695, 19436, 51055, 48404, - 13209, 18914, 12958, 18661, 50792, 48147, 50035, 47368, 14213, 19966, - 13954, 19705, 49780, 47119, 13452, 20215, 49274, 47617, 49533, 47878, - 13707, 20464, 8416, 23195, 54294, 44653, 54545, 44906, 8679, 23452, - 55071, 44388, 9193, 22930, 8942, 22677, 54808, 44131, 54019, 43384, - 10229, 23950, 9970, 23689, 53764, 43135, 9468, 24199, 53258, 43633, - 53517, 43894, 9723, 24448, 56123, 41280, 12237, 21942, 11978, 21681, - 55868, 41031, 11460, 22207, 55346, 41545, 55605, 41806, 11715, 22456, - 10456, 21155, 56366, 42581, 56617, 42834, 10719, 21412, 57127, 42332, - 11217, 20906, 10966, 20653, 56864, 42075, - }, - { 0, 46002, 31609, 51403, 63218, 17728, 36235, 15929, 61945, 16971, - 35456, 14642, 1803, 46265, 31858, 53184, 65519, 19549, 33942, 14116, - 2333, 47791, 29284, 49622, 3606, 48548, 30063, 50909, 63716, 19286, - 33693, 12335, 58307, 20593, 39098, 11016, 5425, 42627, 28232, 56826, - 4666, 41352, 26947, 56049, 58568, 22394, 40881, 11267, 7212, 44958, - 26453, 54503, 60126, 22892, 37287, 8725, 60885, 24167, 38572, 9502, - 6951, 43157, 24670, 54252, 56219, 26665, 41186, 4944, 11625, 40667, - 22032, 58786, 10850, 39376, 20763, 58025, 56464, 28450, 42985, 5211, - 9332, 38854, 24333, 60607, 53894, 24884, 43519, 6733, 54669, 26175, - 44788, 7494, 9087, 37069, 22534, 60340, 14424, 35818, 17185, 61587, - 52906, 32024, 46547, 1633, 51617, 31251, 45784, 362, 16211, 36065, - 17450, 63384, 51127, 29701, 48334, 3964, 12613, 33527, 19004, 63886, - 13902, 34300, 19767, 65157, 49340, 29454, 48069, 2167, 43819, 6297, - 53330, 25568, 24025, 61035, 9888, 38162, 23250, 59744, 8619, 37401, - 44064, 8082, 55129, 25835, 21700, 59254, 12221, 39951, 41526, 4484, - 55631, 27389, 42301, 5775, 56900, 28150, 21455, 57469, 10422, 39684, - 18664, 64346, 13201, 32803, 48666, 3496, 50531, 30417, 47377, 2723, - 49768, 29146, 20451, 64593, 13466, 34600, 46855, 1205, 52350, 32716, - 16885, 62023, 14988, 35134, 18174, 62796, 15751, 36405, 45068, 958, - 52085, 30919, 28848, 49922, 3017, 47227, 34370, 13808, 64827, 20105, - 33097, 13051, 64048, 18818, 30651, 50185, 3266, 49008, 36703, 15597, - 62502, 18324, 31149, 51743, 724, 45414, 32422, 52500, 1503, 46701, - 34900, 15334, 62253, 16543, 37747, 8385, 59402, 23480, 25985, 54835, - 7928, 44362, 25226, 53560, 6643, 43585, 38008, 10186, 61185, 23731, - 27804, 57134, 6117, 42071, 39534, 10716, 57623, 21157, 40293, 11991, - 58908, 21934, 27543, 55333, 4334, 41820, - }, - { 0, 22872, 45744, 60392, 31101, 8229, 52173, 37525, 62202, 43938, - 16458, 6418, 35719, 53983, 14647, 24687, 63977, 41137, 19289, 4609, - 32916, 55756, 12836, 27516, 2835, 21067, 47523, 57595, 29294, 11062, - 49374, 39302, 61391, 46743, 23935, 1063, 38578, 53226, 9218, 32090, - 7477, 17517, 44933, 63197, 25672, 15632, 55032, 36768, 5670, 20350, - 42134, 64974, 28507, 13827, 56811, 33971, 58588, 48516, 22124, 3892, - 40353, 50425, 12049, 30281, 50051, 39643, 28979, 10347, 47870, 58278, - 2126, 20758, 12665, 26657, 33737, 55953, 18436, 4444, 64180, 41964, - 14954, 25394, 35034, 53634, 17175, 6735, 61863, 43263, 51344, 37320, - 31264, 9080, 45549, 59573, 861, 23045, 11340, 29972, 40700, 51108, - 21809, 3177, 59265, 48857, 57014, 34798, 27654, 13662, 42955, 65171, - 5499, 19491, 54693, 36093, 26389, 15949, 44248, 62848, 7784, 18224, - 10079, 32263, 38383, 52407, 24098, 1914, 60562, 46538, 39707, 49731, - 10667, 28915, 57958, 47934, 20694, 2446, 27105, 12473, 56145, 33289, - 4252, 18884, 41516, 64372, 25330, 15274, 53314, 35098, 7055, 17111, - 43327, 61543, 36872, 51536, 8888, 31712, 59765, 45101, 23493, 669, - 29908, 11660, 50788, 40764, 3497, 21745, 48921, 58945, 34350, 57206, - 13470, 28102, 65363, 42507, 19939, 5307, 36157, 54373, 16269, 26325, - 62528, 44312, 18160, 8104, 32711, 9887, 52599, 37935, 1722, 24546, - 46090, 60754, 22680, 448, 59944, 45936, 8677, 30909, 37717, 51725, - 43618, 62266, 6354, 16778, 54047, 35399, 25007, 14583, 41329, 63529, - 5057, 19097, 55308, 33108, 27324, 13284, 21387, 2771, 57659, 47203, - 10998, 29614, 38982, 49438, 46935, 60943, 1511, 23743, 52778, 38770, - 31898, 9666, 17837, 7413, 63261, 44613, 15568, 25992, 36448, 55096, - 20158, 6118, 64526, 42326, 14275, 28315, 34163, 56363, 48196, 58652, - 3828, 22444, 50489, 40033, 30601, 11985, - }, - { 0, 11309, 22618, 29815, 45236, 40089, 59630, 50371, 32117, 20824, - 9519, 2306, 52673, 57836, 38299, 47542, 64234, 54983, 41648, 36509, - 19038, 26227, 4612, 15913, 34719, 43954, 57285, 62440, 14123, 6918, - 28529, 17244, 59849, 50660, 45459, 40382, 22909, 30032, 295, 11530, - 38076, 47249, 52454, 57547, 9224, 2085, 31826, 20607, 4899, 16142, - 19321, 26452, 41879, 36794, 64461, 55264, 28246, 17019, 13836, 6689, - 57058, 62159, 34488, 43669, 53135, 58274, 38869, 48120, 32571, 21270, - 10081, 2892, 45818, 40663, 60064, 50829, 590, 11875, 23060, 30265, - 13669, 6472, 27967, 16658, 34257, 43516, 56715, 61862, 18448, 25661, - 4170, 15463, 63652, 54409, 41214, 36051, 9798, 2667, 32284, 21041, - 38642, 47839, 52904, 57989, 23347, 30494, 873, 12100, 60295, 51114, - 46045, 40944, 56492, 61569, 34038, 43227, 27672, 16437, 13378, 6255, - 41433, 36340, 63875, 54702, 4461, 15680, 18743, 25882, 33539, 44846, - 56153, 63348, 13239, 8090, 27629, 18368, 65142, 53851, 42540, 35329, - 20162, 25327, 5784, 15029, 31209, 21956, 8627, 3486, 51549, 58736, - 37127, 48426, 1180, 10417, 23750, 28907, 46120, 38917, 60530, 49247, - 27338, 18151, 12944, 7869, 55934, 63059, 33316, 44553, 6079, 15250, - 20453, 25544, 42763, 35622, 65361, 54140, 36896, 48141, 51322, 58455, - 8340, 3257, 30926, 21731, 60757, 49528, 46351, 39202, 24033, 29132, - 1467, 10646, 19596, 24737, 5334, 14587, 64568, 53269, 42082, 34895, - 12793, 7636, 27043, 17806, 33101, 44384, 55575, 62778, 46694, 39499, - 60988, 49681, 1746, 11007, 24200, 29349, 51987, 59198, 37705, 48996, - 31655, 22410, 9213, 4048, 42309, 35176, 64799, 53554, 5617, 14812, - 19883, 24966, 55344, 62493, 32874, 44103, 26756, 17577, 12510, 7411, - 24495, 29570, 2037, 11224, 61211, 49974, 46913, 39788, 8922, 3831, - 31360, 22189, 37486, 48707, 51764, 58905, - }, - { 0, 39065, 11567, 46518, 23134, 49863, 30577, 61416, 46268, 11301, - 39315, 266, 61154, 30331, 50125, 23380, 30053, 60924, 22602, 49363, - 12091, 47010, 532, 39565, 49625, 22848, 60662, 29807, 39815, 798, - 46760, 11825, 60106, 29267, 51173, 24444, 45204, 10253, 40379, 1314, - 24182, 50927, 29529, 60352, 1064, 40113, 10503, 45470, 40879, 1846, - 45696, 10777, 50673, 23912, 59614, 28743, 11027, 45962, 1596, 40613, - 29005, 59860, 23650, 50427, 51593, 20752, 58534, 31807, 37847, 2894, - 48888, 9825, 32053, 58796, 20506, 51331, 10091, 49138, 2628, 37597, - 48364, 9333, 37315, 2394, 59058, 32299, 52125, 21252, 2128, 37065, - 9599, 48614, 21006, 51863, 32545, 59320, 9027, 48090, 3692, 38645, - 31005, 57732, 21554, 52395, 38911, 3942, 47824, 8777, 52641, 21816, - 57486, 30743, 22054, 52927, 31497, 58256, 3192, 38113, 8535, 47566, - 58010, 31235, 53173, 22316, 47300, 8285, 38379, 3442, 36623, 6038, - 41504, 15033, 54609, 19912, 63614, 24807, 15283, 41770, 5788, 36357, - 25069, 63860, 19650, 54363, 64106, 25331, 55109, 20444, 41012, 14509, - 36123, 5506, 20182, 54863, 25593, 64352, 5256, 35857, 14759, 41278, - 26053, 64860, 18666, 53363, 16283, 42754, 4788, 35373, 53625, 18912, - 64598, 25807, 35623, 5054, 42504, 16017, 4256, 34873, 15759, 42262, - 19198, 53863, 26577, 65352, 42012, 15493, 35123, 4522, 65090, 26331, - 54125, 19444, 18054, 56863, 27561, 62256, 7384, 33857, 12791, 43374, - 62010, 27299, 57109, 18316, 43108, 12541, 34123, 7634, 13283, 43898, - 7884, 34389, 27069, 61732, 17554, 56331, 34655, 8134, 43632, 13033, - 56577, 17816, 61486, 26807, 44108, 13525, 33123, 6650, 62994, 28299, - 56125, 17316, 6384, 32873, 13791, 44358, 17070, 55863, 28545, 63256, - 55593, 16816, 62470, 27807, 33655, 7150, 44632, 14017, 28053, 62732, - 16570, 55331, 14283, 44882, 6884, 33405, - }, - { 0, 49859, 39323, 23384, 12075, 60904, 46768, 29811, 24150, 40085, - 51149, 1294, 29053, 46014, 59622, 10789, 48300, 32367, 9527, 59380, - 37767, 20804, 2588, 51423, 58106, 8249, 31585, 47522, 52689, 3858, - 21578, 38537, 25925, 42886, 64734, 15901, 19054, 34989, 54261, 4406, - 15123, 63952, 41608, 24651, 5176, 55035, 36259, 20320, 55785, 6954, - 16498, 33457, 63170, 13313, 28505, 44442, 34751, 17788, 7716, 56551, - 43156, 27223, 12559, 62412, 51850, 2121, 21265, 37330, 58785, 10082, - 31802, 48889, 38108, 22047, 3399, 53124, 48119, 31028, 8812, 57519, - 30246, 46309, 61373, 11646, 22797, 39886, 49302, 597, 10352, 60083, - 45547, 29480, 1883, 50584, 40640, 23555, 45007, 27916, 13908, 62615, - 32996, 16935, 6527, 56252, 61849, 13146, 26626, 43713, 57010, 7281, - 18217, 34282, 4963, 53664, 35576, 18491, 15432, 65163, 42451, 26384, - 19765, 36854, 54446, 5741, 25118, 41181, 64389, 14662, 35081, 19402, - 4242, 53841, 42530, 25825, 16313, 64890, 55135, 5532, 20164, 35847, - 63604, 15031, 25071, 41772, 13733, 63334, 44094, 28413, 6798, 55373, - 33557, 16854, 27635, 43312, 62056, 12459, 17624, 34331, 56643, 8064, - 60492, 11919, 30167, 46868, 50023, 420, 23292, 38975, 45594, 28889, - 11137, 59714, 40241, 24562, 1194, 50793, 20704, 37411, 51579, 3000, - 32715, 48392, 58960, 9363, 3766, 52341, 38701, 21998, 8605, 58206, - 47110, 31429, 17283, 33088, 55832, 6363, 27816, 44651, 62771, 14320, - 7637, 57110, 33870, 18061, 13054, 61501, 43877, 27046, 65327, 15852, - 26292, 42103, 53252, 4807, 18847, 35676, 41337, 25530, 14562, 64033, - 36434, 19601, 6089, 54538, 9926, 58373, 48989, 32158, 2541, 52014, - 36982, 21173, 30864, 47699, 57611, 9160, 22459, 38264, 52768, 3299, - 39530, 22697, 1009, 49458, 46401, 30594, 11482, 60953, 50236, 1791, - 23975, 40804, 60183, 10708, 29324, 45135, - }, - { 0, 61422, 50113, 11311, 39839, 29809, 22622, 47024, 11043, 50381, - 59618, 1804, 45244, 24402, 29565, 40083, 22086, 47528, 38279, 31337, - 52697, 8759, 3608, 57846, 32101, 37515, 48804, 20810, 59130, 2324, - 9531, 51925, 44172, 17250, 28493, 32931, 14099, 55549, 62674, 6972, - 34735, 26689, 17518, 43904, 7216, 62430, 57329, 12319, 64202, 5412, - 14603, 55013, 24917, 36539, 41620, 19834, 53737, 15879, 4648, 64966, - 19062, 42392, 35255, 26201, 17669, 43755, 34500, 26922, 56986, 12660, - 7515, 62133, 28198, 33224, 44519, 16905, 62905, 6743, 13944, 55702, - 4931, 64685, 53378, 16236, 35036, 26418, 19229, 42227, 14432, 55182, - 64417, 5199, 41983, 19473, 24638, 36816, 59785, 1639, 10824, 50598, - 29206, 40440, 45527, 24121, 49834, 11588, 363, 61061, 22837, 46811, - 39668, 29978, 49103, 20513, 31758, 37856, 9296, 52158, 59281, 2175, - 38124, 31490, 22317, 47299, 3955, 57501, 52402, 9052, 35338, 26084, - 18891, 42533, 4501, 65147, 53844, 15802, 41257, 20167, 25320, 36102, - 15030, 54616, 63863, 5785, 56396, 13218, 8077, 61539, 18387, 43069, - 33810, 27644, 63343, 6273, 13486, 56128, 27888, 33566, 44849, 16607, - 9862, 51560, 58695, 2729, 48409, 21239, 32472, 37174, 3493, 57931, - 52836, 8586, 38458, 31188, 22011, 47637, 28864, 40750, 45825, 23791, - 60255, 1201, 10398, 51056, 23523, 46093, 38946, 30668, 49276, 12178, - 957, 60499, 53007, 8417, 3278, 58144, 21648, 47998, 38737, 30911, - 58412, 3010, 10221, 51203, 32691, 36957, 48242, 21404, 39241, 30375, - 23176, 46438, 726, 60728, 49431, 12025, 45674, 23940, 29099, 40517, - 10741, 50715, 59956, 1498, 25475, 35949, 41026, 20396, 63516, 6130, - 15325, 54323, 18592, 42830, 35681, 25743, 54079, 15569, 4350, 65296, - 13765, 55851, 62980, 6634, 44634, 16820, 28059, 33397, 7910, 61704, - 56615, 13001, 34169, 27287, 18104, 43350, - }, - { 0, 30582, 61164, 39322, 49605, 46771, 12073, 22623, 40855, 59617, - 29051, 1549, 24146, 10532, 45246, 51144, 9011, 21573, 52703, 47785, - 58102, 38272, 3098, 31596, 48292, 52178, 21064, 9534, 32097, 2583, - 37773, 58619, 18022, 12560, 43146, 57340, 34723, 61653, 26959, 7737, - 55793, 44679, 14109, 16491, 6196, 28482, 63192, 33198, 25941, 4643, - 35769, 64719, 42128, 54246, 19068, 15626, 64194, 36276, 5166, 25432, - 15111, 19569, 54763, 41629, 36044, 64442, 25120, 5462, 19721, 14975, - 41957, 54419, 4955, 25645, 64951, 35521, 53918, 42472, 15474, 19204, - 45055, 55433, 16659, 13925, 28218, 6476, 32982, 63392, 12392, 18206, - 56964, 43506, 61869, 34523, 8001, 26679, 51882, 48604, 9286, 21296, - 2927, 31769, 58755, 37621, 21821, 8779, 48081, 52391, 38136, 58254, - 31252, 3426, 59801, 40687, 1909, 28675, 10332, 24362, 50864, 45510, - 30222, 376, 39138, 61332, 47051, 49341, 22823, 11857, 1413, 29427, - 60265, 39967, 50240, 45878, 10924, 24026, 39442, 60772, 29950, 904, - 23511, 11425, 46395, 49741, 9910, 20928, 51290, 48940, 59251, 36869, - 2463, 32489, 47393, 52823, 22477, 8379, 30948, 3986, 38408, 57726, - 17379, 13461, 44303, 55929, 33318, 62800, 27850, 7100, 56436, 43778, - 12952, 17902, 7601, 27335, 62301, 33835, 24784, 6054, 36412, 63818, - 41237, 54883, 20473, 14479, 65351, 34865, 4523, 26333, 16002, 18932, - 53358, 42776, 35145, 65087, 26533, 4307, 18572, 16378, 42592, 53526, - 5854, 25000, 63538, 36676, 55067, 41069, 14839, 20097, 43642, 56588, - 17558, 13280, 27583, 7369, 34131, 61989, 13805, 17051, 56065, 44151, - 62504, 33630, 6852, 28082, 53039, 47193, 8643, 22197, 3818, 31132, - 57350, 38768, 20664, 10190, 48724, 51490, 37245, 58891, 32657, 2279, - 60444, 39786, 752, 30086, 11737, 23215, 49973, 46147, 29579, 1277, - 40295, 59921, 45646, 50488, 23714, 11220, - }, - { 0, 15162, 30324, 19790, 60648, 55250, 39580, 41382, 50637, 65271, - 46009, 34947, 10533, 4639, 24401, 25707, 38791, 44221, 57843, 56009, - 31599, 16469, 3355, 13857, 21066, 26992, 9278, 7940, 48802, 34200, - 51414, 62444, 13075, 2089, 17767, 32349, 57339, 58561, 43407, 37557, - 63198, 52708, 32938, 48016, 6710, 8460, 27714, 22392, 42132, 40878, - 53984, 59866, 18556, 29510, 15880, 1330, 24921, 23139, 5933, 11287, - 36273, 46731, 64453, 49407, 26150, 23836, 4178, 11112, 35534, 45556, - 64698, 51072, 41963, 39121, 54687, 61093, 20227, 29753, 14711, 589, - 61857, 51867, 34773, 48367, 7497, 9843, 27453, 20487, 13420, 3926, - 16920, 31010, 55428, 58302, 44784, 38346, 21813, 28175, 9025, 6267, - 47581, 33511, 53161, 62611, 37112, 43970, 59020, 56758, 31760, 18218, - 2660, 12638, 49842, 63880, 46278, 36860, 11866, 5472, 22574, 25364, - 1919, 15429, 28939, 18993, 60311, 53421, 40419, 42713, 52300, 63350, - 47672, 33026, 8356, 7070, 22224, 28138, 2433, 12987, 32757, 17615, - 58729, 56915, 37661, 43047, 23499, 24817, 11711, 5765, 46883, 35865, - 49495, 64109, 40454, 42300, 59506, 54088, 29422, 18900, 1178, 16288, - 65375, 50277, 35115, 45585, 5047, 10381, 26051, 24313, 14994, 424, - 19686, 30684, 54906, 60736, 40974, 39732, 26840, 21474, 7852, 9622, - 33840, 48906, 62020, 51582, 44309, 38447, 56161, 57435, 16893, 31431, - 14217, 3251, 43626, 37200, 56350, 59172, 18050, 32184, 12534, 3020, - 28583, 21661, 6611, 8937, 33615, 47221, 62779, 52737, 15853, 1751, - 19353, 28835, 53509, 59967, 42865, 40011, 63520, 49946, 36436, 46446, - 5320, 12274, 25276, 22918, 39289, 41539, 61197, 54327, 30097, 20139, - 997, 14559, 23732, 26510, 10944, 4602, 45148, 35686, 50728, 64786, - 3838, 13764, 30858, 17328, 57878, 55596, 37986, 44888, 52019, 61449, - 48455, 34429, 10203, 7393, 20911, 27285, - }, - { 0, 7452, 14904, 10020, 29808, 26988, 20040, 21332, 59616, 62972, - 53976, 53188, 40080, 33164, 42664, 48052, 52701, 53441, 63461, 60153, - 47533, 42161, 33685, 40585, 9533, 14369, 7941, 537, 20813, 19537, - 27509, 30313, 34727, 39611, 48543, 41091, 62423, 61131, 51695, 54515, - 28487, 29275, 21887, 18531, 6967, 1579, 8463, 15379, 19066, 22374, - 28738, 27998, 15882, 8982, 1074, 6446, 41626, 49030, 39074, 34238, - 55018, 52214, 60626, 61902, 4947, 3663, 10603, 13431, 26403, 31295, - 23835, 16391, 64435, 59055, 49547, 56471, 36803, 37599, 46587, 43239, - 56974, 50066, 58550, 63914, 43774, 47074, 37062, 36314, 13934, 11122, - 3158, 4426, 16926, 24322, 30758, 25914, 38132, 35304, 44748, 46032, - 57476, 64920, 55996, 51104, 31764, 24840, 17964, 23344, 2148, 5496, - 12892, 12096, 22825, 17461, 25361, 32269, 11609, 12357, 5985, 2685, - 45513, 44245, 35825, 38637, 50617, 55461, 65409, 58013, 9894, 15290, - 7326, 386, 21206, 20426, 26862, 30194, 52806, 54106, 62590, 59746, - 47670, 42794, 32782, 40210, 60283, 63079, 53571, 52319, 40715, 33303, - 42291, 47151, 923, 7815, 14755, 9407, 30699, 27383, 19923, 20687, - 41217, 48157, 39737, 34341, 54641, 51309, 61257, 62037, 18913, 21757, - 29657, 28357, 15761, 8333, 1961, 6837, 27868, 29120, 22244, 19448, - 6316, 1456, 8852, 16264, 33852, 39200, 48644, 41752, 61516, 60752, - 51828, 55144, 13813, 10473, 4045, 4817, 16773, 23705, 31677, 26273, - 56597, 49161, 59181, 64049, 43365, 46201, 37725, 36417, 63528, 58676, - 49680, 57100, 35928, 37188, 46688, 43900, 4296, 3540, 10992, 14316, - 25784, 31140, 24192, 17308, 45650, 44878, 34922, 38262, 50722, 56126, - 64538, 57606, 23218, 18350, 24714, 32150, 11970, 13278, 5370, 2534, - 32655, 25235, 17847, 22699, 3071, 5859, 12743, 11483, 38767, 35443, - 44375, 45131, 58143, 65027, 55591, 50235, - }, - { 0, 3599, 7198, 4625, 14396, 13875, 9250, 10797, 28792, 32375, - 27750, 25193, 18500, 17995, 21594, 23125, 57584, 61183, 64750, 62177, - 55500, 54979, 50386, 51933, 37000, 40583, 35990, 33433, 43188, 42683, - 46250, 47781, 56829, 54258, 49635, 53228, 58817, 60366, 63967, 63440, - 44421, 41866, 45467, 49044, 38329, 39862, 35239, 34728, 15629, 13058, - 8467, 12060, 1329, 2878, 6447, 5920, 19829, 17274, 20843, 24420, - 30025, 31558, 26967, 26456, 42983, 43496, 48121, 46582, 40923, 37332, - 33733, 36298, 55199, 55696, 52097, 50574, 61347, 57772, 62397, 64946, - 18199, 18712, 23305, 21766, 32555, 28964, 25397, 27962, 14191, 14688, - 11121, 9598, 3923, 348, 4941, 7490, 31258, 29717, 26116, 26635, - 16934, 19497, 24120, 20535, 2658, 1133, 5756, 6259, 12894, 15441, - 11840, 8271, 39658, 38117, 34548, 35067, 41686, 44249, 48840, 45255, - 60050, 58525, 63116, 63619, 53934, 56481, 52912, 49343, 21459, 24028, - 20429, 16834, 27631, 26080, 30705, 31230, 9131, 11684, 16309, 12730, - 7063, 5528, 1929, 2438, 45859, 48428, 44861, 41266, 35615, 34064, - 38657, 39182, 50011, 52564, 57157, 53578, 64359, 62824, 59257, 59766, - 36398, 32801, 37424, 39999, 46610, 47133, 43532, 41987, 65110, 61529, - 57928, 60487, 50794, 51301, 55924, 54395, 28382, 24785, 29376, 31951, - 22242, 22765, 19196, 17651, 7846, 4265, 696, 3255, 9882, 10389, - 14980, 13451, 62516, 64059, 59434, 58917, 52232, 49671, 53270, 56857, - 33868, 35395, 38994, 38493, 48240, 45695, 41070, 44641, 5316, 6859, - 2266, 1749, 11512, 8951, 12518, 16105, 25788, 27315, 30882, 30381, - 23680, 21135, 16542, 20113, 10697, 10182, 13783, 15320, 4597, 8186, - 3563, 996, 22961, 22462, 17839, 19360, 24973, 28546, 32147, 29596, - 51513, 50998, 54567, 56104, 61701, 65290, 60699, 58132, 47425, 46926, - 42335, 43856, 33149, 36722, 40291, 37740, - }, - { 0, 35208, 3853, 34437, 7706, 38802, 4375, 39071, 15412, 46524, - 13113, 47793, 8750, 43942, 11555, 42155, 30824, 61920, 30565, 65261, - 26226, 61434, 27007, 57591, 17500, 52692, 19281, 49881, 23110, 54222, - 21835, 56515, 61648, 31064, 65501, 30293, 61130, 26434, 57799, 26703, - 52452, 17772, 50153, 19041, 54014, 23414, 56819, 21627, 35000, 304, - 34741, 3645, 38562, 7978, 39343, 4135, 46220, 15620, 48001, 12809, - 43670, 8990, 42395, 11283, 64957, 29749, 62128, 31544, 58279, 27183, - 60586, 25890, 49545, 18433, 52868, 18188, 57235, 22043, 53406, 22806, - 34261, 3165, 35544, 848, 39887, 4679, 38082, 7498, 47585, 12393, - 46828, 16228, 43003, 11891, 43254, 8574, 3437, 34021, 608, 35816, - 4983, 39679, 7290, 38386, 12633, 47313, 15956, 47068, 12099, 42699, - 8270, 43462, 29957, 64653, 31240, 62336, 27423, 58007, 25618, 60826, - 18737, 49337, 17980, 53172, 22315, 56995, 22566, 53678, 59239, 28399, - 59498, 25058, 63869, 28917, 63088, 32760, 56147, 21211, 54366, 24022, - 50505, 19649, 51780, 17356, 40719, 5767, 36866, 6538, 33045, 2205, - 36376, 1936, 41787, 10931, 44086, 9662, 48417, 13481, 45612, 15268, - 6071, 40511, 6330, 37170, 2477, 32805, 1696, 36648, 11139, 41483, - 9358, 44294, 13721, 48145, 14996, 45852, 28639, 58967, 24786, 59738, - 29125, 63565, 32456, 63296, 21483, 55907, 23782, 54638, 19953, 50297, - 17148, 52084, 6874, 37714, 5591, 40031, 1216, 36168, 3021, 33349, - 9966, 44902, 10723, 41067, 14580, 45436, 14329, 48753, 25266, 60218, - 28095, 58423, 31912, 62752, 29605, 64045, 24198, 55054, 20875, 55299, - 16540, 51476, 20369, 50713, 59914, 25474, 58631, 27791, 62480, 32152, - 64285, 29333, 54846, 24502, 55603, 20667, 51236, 16812, 50985, 20129, - 37474, 7146, 40303, 5351, 35960, 1520, 33653, 2813, 44630, 10206, - 41307, 10451, 45132, 14788, 48961, 14025, - }, - { 0, 17477, 34954, 52431, 3337, 18764, 34179, 49606, 6674, 24151, - 37528, 55005, 5915, 21342, 40849, 56276, 13348, 28769, 48302, 63723, - 14637, 32104, 45479, 62946, 11830, 27251, 42684, 58105, 9023, 26490, - 43957, 61424, 26696, 11277, 57538, 42119, 25921, 8452, 60875, 43406, - 29274, 13855, 64208, 48789, 32595, 15126, 63449, 45980, 23660, 6185, - 54502, 37027, 20837, 5408, 55791, 40362, 18046, 571, 52980, 35505, - 19319, 3890, 50173, 34744, 53392, 38101, 22554, 7263, 56729, 39388, - 21779, 4438, 51842, 36551, 16904, 1613, 51083, 33742, 20225, 2884, - 58548, 41201, 27710, 10363, 59837, 44536, 24887, 9586, 65190, 47843, - 30252, 12905, 62383, 47082, 31525, 16224, 47320, 64669, 12370, 29719, - 46545, 61844, 15707, 31006, 41674, 59023, 10816, 28165, 44995, 60294, - 10057, 25356, 36092, 51385, 1142, 16435, 33269, 50608, 2431, 19770, - 38638, 53931, 7780, 23073, 39911, 57250, 4973, 22312, 48445, 63864, - 13751, 29170, 45108, 62577, 14526, 31995, 42799, 58218, 12197, 27616, - 43558, 61027, 8876, 26345, 35097, 52572, 403, 17878, 33808, 49237, - 3226, 18655, 37643, 55118, 7041, 24516, 40450, 55879, 5768, 21197, - 54645, 37168, 24063, 6586, 55420, 39993, 20726, 5299, 53095, 35618, - 18413, 936, 49774, 34347, 19172, 3745, 57681, 42260, 27099, 11678, - 60504, 43037, 25810, 8343, 64323, 48902, 29641, 14220, 63050, 45583, - 32448, 14981, 28077, 10728, 58663, 41314, 24740, 9441, 59438, 44139, - 30655, 13306, 65333, 47984, 31414, 16115, 62012, 46713, 22921, 7628, - 53507, 38214, 21632, 4293, 56330, 38991, 17307, 2014, 51985, 36692, - 20114, 2775, 50712, 33373, 1509, 16800, 36207, 51498, 2284, 19625, - 32870, 50211, 8183, 23474, 38781, 54072, 4862, 22203, 39540, 56881, - 12737, 30084, 47435, 64782, 15560, 30861, 46146, 61447, 11219, 28566, - 41817, 59164, 9946, 25247, 44624, 59925, - }, - { 0, 44205, 17735, 59882, 35470, 9763, 53193, 25444, 2305, 42412, - 19526, 57579, 33679, 12066, 50888, 27237, 4610, 48815, 22341, 64488, - 39052, 13345, 56779, 29030, 6915, 47022, 24132, 62185, 37261, 15648, - 54474, 30823, 9220, 34985, 24899, 52718, 44682, 551, 60365, 18272, - 11525, 33192, 26690, 50415, 42891, 2854, 58060, 20065, 13830, 39595, - 29505, 57324, 48264, 4133, 63951, 21858, 16135, 37802, 31296, 55021, - 46473, 6436, 61646, 23651, 18440, 58533, 3407, 41442, 49798, 28203, - 34753, 11116, 16649, 60836, 1102, 43235, 52103, 26410, 36544, 8813, - 23050, 63143, 8013, 46048, 53380, 31785, 38339, 14702, 21259, 65446, - 5708, 47841, 55685, 29992, 40130, 12399, 27660, 49313, 10571, 34278, - 59010, 18991, 41925, 3944, 25869, 51616, 8266, 36071, 61315, 17198, - 43716, 1641, 32270, 53923, 15177, 38884, 62592, 22573, 45511, 7530, - 30479, 56226, 12872, 40677, 64897, 20780, 47302, 5227, 36880, 15549, - 54615, 31226, 6814, 46643, 24537, 62324, 39185, 13756, 56406, 28923, - 5023, 48946, 22232, 64117, 33298, 11967, 51029, 27640, 2204, 42033, - 19931, 57718, 35603, 10174, 52820, 25337, 413, 44336, 17626, 59511, - 46100, 6329, 61779, 24062, 16026, 37431, 31709, 55152, 48405, 4536, - 63570, 21759, 14235, 39734, 29404, 56945, 42518, 2747, 58193, 20476, - 11416, 32821, 27103, 50546, 44823, 954, 59984, 18173, 9625, 35124, - 24798, 52339, 55320, 29877, 40287, 12786, 21142, 65083, 6097, 47996, - 53529, 32180, 37982, 14579, 23447, 63290, 7888, 45693, 51738, 26295, - 36701, 9200, 16532, 60473, 1491, 43390, 49947, 28598, 34396, 10993, - 18837, 58680, 3282, 41087, 64540, 20657, 47451, 5622, 30354, 55871, - 13269, 40824, 62749, 22960, 45146, 7415, 32659, 54078, 15060, 38521, - 60958, 17075, 43865, 2036, 25744, 51261, 8663, 36218, 59167, 19378, - 41560, 3829, 28049, 49468, 10454, 33915, - }, - { 0, 55513, 44463, 30070, 18243, 40858, 60140, 12853, 36486, 22111, - 9001, 64496, 51653, 4380, 25706, 48307, 273, 55752, 44222, 29799, - 18002, 40587, 60413, 13092, 36759, 22350, 8760, 64225, 51412, 4109, - 25979, 48546, 546, 56059, 44941, 30548, 17761, 40376, 59598, 12311, - 36004, 21629, 8459, 63954, 52199, 4926, 26184, 48785, 819, 56298, - 44700, 30277, 17520, 40105, 59871, 12550, 36277, 21868, 8218, 63683, - 51958, 4655, 26457, 49024, 1092, 56477, 43499, 28978, 17159, 39902, - 61096, 13937, 35522, 21019, 10093, 65460, 52609, 5464, 24622, 47351, - 1365, 56716, 43258, 28707, 16918, 39631, 61369, 14176, 35795, 21258, - 9852, 65189, 52368, 5193, 24895, 47590, 1638, 57023, 43977, 29456, - 16677, 39420, 60554, 13395, 35040, 20537, 9551, 64918, 53155, 6010, - 25100, 47829, 1911, 57262, 43736, 29185, 16436, 39149, 60827, 13634, - 35313, 20776, 9310, 64647, 52914, 5739, 25373, 48068, 2184, 53329, - 42279, 32254, 20427, 38674, 57956, 15037, 34318, 24279, 11169, 62328, - 49485, 6548, 27874, 46139, 2457, 53568, 42038, 31983, 20186, 38403, - 58229, 15276, 34591, 24518, 10928, 62057, 49244, 6277, 28147, 46378, - 2730, 53875, 42757, 32732, 19945, 38192, 57414, 14495, 33836, 23797, - 10627, 61786, 50031, 7094, 28352, 46617, 3003, 54114, 42516, 32461, - 19704, 37921, 57687, 14734, 34109, 24036, 10386, 61515, 49790, 6823, - 28625, 46856, 3276, 54293, 41315, 31162, 19343, 37718, 58912, 16121, - 33354, 23187, 12261, 63292, 50441, 7632, 26790, 45183, 3549, 54532, - 41074, 30891, 19102, 37447, 59185, 16360, 33627, 23426, 12020, 63021, - 50200, 7361, 27063, 45422, 3822, 54839, 41793, 31640, 18861, 37236, - 58370, 15579, 32872, 22705, 11719, 62750, 50987, 8178, 27268, 45661, - 4095, 55078, 41552, 31369, 18620, 36965, 58643, 15818, 33145, 22944, - 11478, 62479, 50746, 7907, 27541, 45900, - }, - { 0, 58083, 55771, 15160, 44971, 19784, 30320, 38035, 17227, 41384, - 39568, 30835, 60640, 3587, 13627, 55256, 34454, 25717, 24397, 48558, - 10557, 52190, 61670, 4613, 50653, 10046, 7174, 65253, 27254, 34965, - 45997, 20814, 4401, 62418, 51434, 10761, 48794, 23673, 26433, 34210, - 21114, 45209, 35745, 26946, 64977, 7986, 9226, 50921, 38823, 30020, - 20092, 44191, 14348, 56047, 57815, 820, 54508, 13839, 3383, 61396, - 31559, 39332, 41628, 16511, 8802, 49281, 64441, 6490, 36297, 28458, - 21522, 46833, 24873, 33738, 47346, 23057, 52866, 11361, 5977, 62906, - 42228, 17943, 32047, 40908, 2911, 59836, 53892, 12391, 59327, 1372, - 15972, 56455, 18452, 43767, 37327, 29484, 13139, 53680, 60040, 2155, - 40184, 32283, 17699, 42944, 28696, 37627, 43459, 19232, 57267, 15696, - 1640, 58507, 46533, 22310, 27678, 36605, 6766, 63629, 50101, 8534, - 63118, 5229, 12117, 52662, 22821, 48070, 33022, 25117, 17604, 42535, - 40223, 32764, 60271, 2444, 12980, 53335, 1935, 58732, 56916, 15543, - 43044, 19143, 29183, 37660, 49746, 8369, 7049, 63850, 28153, 36634, - 46114, 22209, 33049, 25594, 22722, 47649, 11954, 52305, 63337, 5514, - 22005, 46870, 35886, 28365, 64094, 6333, 9093, 49510, 5822, 62557, - 53093, 11654, 47381, 23542, 24782, 33325, 54115, 12672, 2744, 59483, - 31944, 40491, 42259, 18416, 36904, 29387, 18931, 43792, 16259, 56672, - 58968, 1211, 26278, 33861, 49021, 23966, 51469, 11246, 4310, 62005, - 9709, 50958, 64566, 7893, 35398, 26789, 21405, 45438, 57392, 723, - 14827, 56072, 20379, 44408, 38464, 29859, 41851, 16792, 31392, 38979, - 3280, 60979, 54539, 14312, 30615, 38260, 44620, 19631, 55356, 15071, - 487, 58116, 13532, 54847, 60679, 4068, 39799, 31124, 17068, 41039, - 61697, 5090, 10458, 51769, 24234, 48201, 34673, 26002, 45642, 20649, - 27537, 35186, 7649, 65282, 50234, 9945, - }, - { 0, 65534, 58337, 7199, 56287, 9249, 14398, 51136, 43939, 21597, - 18498, 47036, 28796, 36738, 37789, 27747, 19291, 46245, 43194, 22340, - 36996, 28538, 29541, 35995, 57592, 7942, 793, 64743, 15143, 50393, - 55494, 10040, 38582, 26952, 30039, 35497, 19817, 45719, 44680, 20854, - 15637, 49899, 57076, 8458, 59082, 6452, 1323, 64213, 56813, 8723, - 15884, 49650, 1586, 63948, 58835, 6701, 30286, 35248, 38319, 27217, - 44433, 21103, 20080, 45454, 12657, 52879, 53904, 11630, 60078, 5456, - 2383, 63153, 39634, 25900, 31027, 34509, 16653, 48883, 41708, 23826, - 31274, 34260, 39371, 26165, 41461, 24075, 16916, 48618, 53641, 11895, - 12904, 52630, 2646, 62888, 59831, 5705, 42951, 22585, 17446, 48088, - 31768, 33766, 40953, 24583, 3172, 62362, 61317, 4219, 55227, 10309, - 13402, 52132, 60572, 4962, 3965, 61571, 14147, 51389, 54434, 11100, - 18239, 47297, 42206, 23328, 40160, 25374, 32513, 33023, 25314, 40220, - 33027, 32509, 47421, 18115, 23260, 42274, 51521, 14015, 10912, 54622, - 4766, 60768, 61823, 3713, 10681, 54855, 51800, 13734, 62054, 3480, - 4487, 61049, 33306, 32228, 25083, 40453, 22981, 42555, 47652, 17882, - 62548, 2986, 6069, 59467, 12171, 53365, 52330, 13204, 24567, 40969, - 48150, 17384, 33832, 31702, 26569, 38967, 48911, 16625, 23790, 41744, - 25808, 39726, 34609, 30927, 5292, 60242, 63309, 2227, 53107, 12429, - 11410, 54124, 21395, 44141, 45170, 20364, 34892, 30642, 27565, 37971, - 63536, 1998, 7121, 58415, 9199, 56337, 49166, 16368, 6344, 59190, - 64297, 1239, 49943, 15593, 8438, 57096, 45931, 19605, 20618, 44916, - 26804, 38730, 35669, 29867, 50469, 15067, 9924, 55610, 7930, 57604, - 64795, 741, 28294, 37240, 36199, 29337, 46425, 19111, 22200, 43334, - 36478, 29056, 28063, 37473, 21921, 43615, 46656, 18878, 9693, 55843, - 50748, 14786, 65026, 508, 7651, 57885, - }, - { 0, 32638, 65276, 33154, 57829, 40603, 7961, 24679, 57303, 41129, - 8491, 24149, 15922, 16716, 49358, 49072, 41907, 56525, 23887, 8753, - 16982, 15656, 48298, 50132, 31844, 794, 33432, 64998, 40321, 58111, - 25469, 7171, 23419, 9221, 42375, 56057, 47774, 50656, 17506, 15132, - 33964, 64466, 31312, 1326, 25929, 6711, 39861, 58571, 63688, 34742, - 1588, 31050, 6445, 26195, 59345, 39087, 10015, 22625, 55779, 42653, - 50938, 47492, 14342, 18296, 46838, 51592, 18442, 14196, 22291, 10349, - 43503, 54929, 26913, 5727, 38877, 59555, 35012, 63418, 30264, 2374, - 5445, 27195, 60345, 38087, 62624, 35806, 2652, 29986, 51858, 46572, - 13422, 19216, 11127, 21513, 54667, 43765, 60813, 37619, 4977, 27663, - 3176, 29462, 62100, 36330, 12890, 19748, 52390, 46040, 54207, 44225, - 11587, 21053, 20030, 12608, 45250, 53180, 45019, 53413, 20775, 11865, - 37353, 61079, 28437, 4203, 28684, 3954, 36592, 61838, 29169, 3727, - 36621, 61555, 36884, 61290, 28392, 4502, 44582, 53592, 20698, 12196, - 20419, 12477, 45375, 52801, 53826, 44348, 11454, 21440, 13223, 19673, - 52571, 45605, 3477, 29419, 62313, 35863, 60528, 37646, 4748, 28146, - 10890, 22004, 54390, 43784, 52079, 46097, 13715, 19181, 62813, 35363, - 2977, 29919, 5304, 27590, 59972, 38202, 35129, 63047, 30661, 2235, - 26844, 6050, 38432, 59742, 22254, 10640, 43026, 55148, 46859, 51317, - 18935, 13961, 50951, 47225, 14843, 18053, 9954, 22940, 55326, 42848, - 6352, 26542, 58924, 39250, 63797, 34379, 1993, 30903, 25780, 7114, - 39496, 58678, 34129, 64047, 31661, 1235, 47971, 50205, 17823, 15073, - 23174, 9720, 42106, 56068, 40060, 58114, 25216, 7678, 32153, 743, - 33637, 64539, 17323, 15573, 48471, 49705, 41550, 56624, 23730, 9164, - 16335, 16561, 49459, 48717, 56874, 41300, 8406, 24488, 57368, 40806, - 7908, 24986, 509, 32387, 65281, 32895, - }, - { 0, 16190, 32380, 16706, 64760, 50118, 33412, 48570, 58861, 56019, - 39825, 42159, 6421, 9771, 26473, 22615, 55239, 59641, 43451, 38533, - 11071, 5121, 21827, 27261, 12842, 3348, 19542, 29544, 52946, 61932, - 45230, 36752, 45971, 36013, 52719, 62161, 20331, 28757, 12567, 3625, - 22142, 26944, 10242, 5948, 43654, 38328, 54522, 60356, 25684, 23402, - 6696, 9494, 39084, 42898, 59088, 55790, 33209, 48775, 65477, 49403, - 32065, 17023, 829, 15363, 31547, 17413, 1351, 14969, 34755, 47357, - 63935, 50817, 40662, 41448, 57514, 57236, 25134, 23824, 7250, 9068, - 44284, 37826, 53888, 60862, 20484, 28474, 11896, 4422, 18705, 30255, - 14189, 2131, 46569, 35543, 52117, 62635, 51368, 63382, 46804, 35306, - 13392, 2926, 18988, 29970, 11589, 4731, 21305, 27655, 53693, 61059, - 44993, 37119, 8047, 8273, 24851, 24109, 58263, 56489, 40427, 41685, - 64130, 50620, 34046, 48064, 1658, 14660, 30726, 18232, 63094, 51528, - 34826, 46900, 2702, 13744, 29938, 19404, 5019, 11429, 28135, 21209, - 61283, 53341, 37151, 44577, 8625, 7823, 24525, 24819, 56649, 57975, - 41781, 39947, 50268, 64354, 47648, 34078, 14500, 1946, 18136, 31206, - 17893, 31451, 15257, 1191, 47389, 34339, 51041, 63583, 40968, 40758, - 56948, 57674, 23792, 25550, 8844, 7602, 37410, 44316, 60510, 54112, - 28378, 20964, 4262, 12184, 30671, 18673, 2483, 13965, 35639, 46089, - 62795, 51829, 36173, 45683, 62257, 52239, 29109, 20107, 4041, 12535, - 26784, 22430, 5852, 10722, 37976, 43878, 59940, 54554, 23178, 26036, - 9462, 7112, 42610, 39244, 55310, 59184, 48999, 32857, 49435, 65061, - 17311, 31905, 15843, 733, 16094, 480, 16546, 32668, 49702, 64792, - 48218, 33636, 56115, 58381, 42319, 39537, 10187, 6389, 22967, 26249, - 59673, 54823, 38757, 43099, 5601, 10975, 27549, 21667, 3316, 13258, - 29320, 19894, 61452, 53042, 36464, 45390, - }, - { 0, 7966, 15932, 8482, 31864, 25446, 16964, 23898, 63728, 59374, - 50892, 55762, 33928, 39830, 47796, 42410, 60925, 62179, 54209, 52447, - 37253, 36507, 44985, 45223, 5389, 2579, 11057, 13359, 26997, 30315, - 22345, 18519, 51175, 55545, 63963, 59077, 48031, 42113, 34211, 39613, - 16151, 8201, 299, 7733, 17263, 23665, 32083, 25165, 10778, 13572, - 5158, 2872, 22114, 18812, 26718, 30528, 53994, 52724, 60630, 62408, - 44690, 45452, 37038, 36784, 37843, 36045, 44527, 45809, 61355, 61621, - 53655, 52873, 27427, 29757, 21791, 18945, 5979, 2117, 10599, 13945, - 32302, 24880, 16402, 24332, 598, 7496, 15466, 9076, 34526, 39360, - 47330, 43004, 64166, 58808, 50330, 56196, 21556, 19242, 27144, 29974, - 10316, 14162, 5744, 2414, 44228, 46042, 37624, 36326, 53436, 53154, - 61056, 61854, 47561, 42711, 34805, 39147, 50609, 55983, 64397, 58515, - 16697, 24103, 32517, 24603, 15681, 8799, 893, 7267, 15291, 9381, - 1415, 6809, 18371, 22749, 31231, 26337, 49995, 56405, 64887, 57961, - 48947, 41005, 33039, 40465, 54854, 51544, 59514, 63332, 43582, 46368, - 37890, 35612, 11958, 12712, 4234, 3988, 21198, 19920, 27890, 29676, - 64604, 58178, 49760, 56702, 32804, 40762, 48664, 41222, 1196, 7090, - 14992, 9614, 30932, 26570, 18152, 23030, 4513, 3775, 12189, 12419, - 28121, 29383, 21477, 19707, 59729, 63055, 55149, 51315, 38185, 35383, - 43797, 46091, 43112, 46966, 38484, 35146, 54288, 51982, 59948, 62770, - 20632, 20358, 28324, 29114, 11488, 13310, 4828, 3522, 17813, 23179, - 31657, 25783, 14829, 9971, 2001, 6351, 48485, 41595, 33625, 40007, - 49437, 56835, 65313, 57407, 28559, 28817, 20915, 20141, 5111, 3305, - 11723, 13013, 38783, 34913, 43331, 46685, 60167, 62489, 54587, 51749, - 33394, 40300, 48206, 41808, 65034, 57620, 49206, 57128, 31362, 26012, - 17598, 23456, 1786, 6628, 14534, 10200, - }, - { 0, 3854, 7708, 4370, 15416, 13110, 8740, 11562, 30832, 30590, - 26220, 26978, 17480, 19270, 23124, 21850, 61664, 65518, 61180, 57842, - 52440, 50134, 53956, 56778, 34960, 34718, 38540, 39298, 46248, 48038, - 43700, 42426, 64989, 62163, 58305, 60623, 49637, 52971, 57337, 53495, - 34221, 35491, 39857, 38079, 47509, 46747, 42889, 43143, 3389, 563, - 4897, 7215, 12549, 15883, 12057, 8215, 30029, 31299, 27473, 25695, - 18805, 18043, 22377, 22631, 59303, 59561, 63931, 63157, 56223, 54417, - 50563, 51853, 40919, 37081, 33227, 36549, 41967, 44257, 48627, 45821, - 5959, 6217, 2395, 1621, 11135, 9329, 13667, 14957, 28471, 24633, - 28971, 32293, 21263, 23553, 19731, 16925, 6778, 5492, 1126, 2920, - 9794, 10572, 14430, 14160, 25098, 27908, 31766, 29464, 24114, 20796, - 16430, 20256, 60058, 58772, 62598, 64392, 54946, 55724, 51390, 51120, - 37610, 40420, 36086, 33784, 44754, 41436, 45262, 49088, 54099, 56413, - 52559, 49729, 61291, 57445, 61815, 65145, 43811, 42029, 46399, 47665, - 38683, 38933, 35079, 34313, 9139, 11453, 15791, 12961, 8075, 4229, - 407, 3737, 23491, 21709, 17887, 19153, 26619, 26869, 31207, 30441, - 11918, 8576, 12434, 16284, 4790, 7608, 3242, 932, 22270, 23024, - 18658, 18412, 27334, 26056, 29914, 31700, 56942, 53600, 49266, 53116, - 57942, 60760, 64586, 62276, 42526, 43280, 47106, 46860, 39462, 38184, - 33850, 35636, 13556, 15354, 10984, 9702, 2252, 1986, 5840, 6622, - 19588, 17290, 21144, 23958, 28860, 32690, 28320, 25006, 50196, 51994, - 55816, 54534, 63532, 63266, 58928, 59710, 48228, 45930, 41592, 44406, - 32860, 36690, 40512, 37198, 51497, 50727, 55093, 55355, 62737, 64031, - 60173, 58371, 45401, 48727, 44869, 41035, 36193, 33391, 37757, 40051, - 14793, 14023, 10197, 10459, 1521, 2815, 7149, 5347, 16825, 20151, - 24485, 20651, 32129, 29327, 25501, 27795, - }, - { 0, 1798, 3596, 2314, 7192, 6942, 4628, 5394, 14384, 16182, - 13884, 12602, 9256, 9006, 10788, 11554, 28768, 30566, 32364, 31082, - 27768, 27518, 25204, 25970, 18512, 20310, 18012, 16730, 21576, 21326, - 23108, 23874, 57536, 59334, 61132, 59850, 64728, 64478, 62164, 62930, - 55536, 57334, 55036, 53754, 50408, 50158, 51940, 52706, 37024, 38822, - 40620, 39338, 36024, 35774, 33460, 34226, 43152, 44950, 42652, 41370, - 46216, 45966, 47748, 48514, 56733, 55963, 54161, 54423, 49541, 50819, - 53129, 51343, 58797, 58027, 60321, 60583, 63925, 65203, 63417, 61631, - 44541, 43771, 41969, 42231, 45541, 46819, 49129, 47343, 38349, 37579, - 39873, 40135, 35285, 36563, 34777, 32991, 15709, 14939, 13137, 13399, - 8517, 9795, 12105, 10319, 1389, 619, 2913, 3175, 6517, 7795, - 6009, 4223, 19773, 19003, 17201, 17463, 20773, 22051, 24361, 22575, - 29965, 29195, 31489, 31751, 26901, 28179, 26393, 24607, 42791, 40993, - 43307, 44589, 47935, 48185, 46387, 45621, 40727, 38929, 37147, 38429, - 33551, 33801, 36099, 35333, 55111, 53313, 55627, 56909, 52063, 52313, - 50515, 49749, 61303, 59505, 57723, 59005, 62319, 62569, 64867, 64101, - 18407, 16609, 18923, 20205, 23551, 23801, 22003, 21237, 32727, 30929, - 29147, 30429, 25551, 25801, 28099, 27333, 14215, 12417, 14731, 16013, - 11167, 11417, 9619, 8853, 4023, 2225, 443, 1725, 5039, 5289, - 7587, 6821, 31418, 32188, 29878, 29616, 26274, 24996, 26798, 28584, - 17034, 17804, 19590, 19328, 24210, 22932, 20638, 22424, 2778, 3548, - 1238, 976, 5826, 4548, 6350, 8136, 13034, 13804, 15590, 15328, - 12018, 10740, 8446, 10232, 39546, 40316, 38006, 37744, 34402, 33124, - 34926, 36712, 41546, 42316, 44102, 43840, 48722, 47444, 45150, 46936, - 59930, 60700, 58390, 58128, 62978, 61700, 63502, 65288, 53802, 54572, - 56358, 56096, 52786, 51508, 49214, 51000, - }, - { 0, 770, 1540, 1286, 3080, 3850, 2572, 2318, 6160, 6930, - 7700, 7446, 5144, 5914, 4636, 4382, 12320, 13090, 13860, 13606, - 15400, 16170, 14892, 14638, 10288, 11058, 11828, 11574, 9272, 10042, - 8764, 8510, 24640, 25410, 26180, 25926, 27720, 28490, 27212, 26958, - 30800, 31570, 32340, 32086, 29784, 30554, 29276, 29022, 20576, 21346, - 22116, 21862, 23656, 24426, 23148, 22894, 18544, 19314, 20084, 19830, - 17528, 18298, 17020, 16766, 49280, 50050, 50820, 50566, 52360, 53130, - 51852, 51598, 55440, 56210, 56980, 56726, 54424, 55194, 53916, 53662, - 61600, 62370, 63140, 62886, 64680, 65450, 64172, 63918, 59568, 60338, - 61108, 60854, 58552, 59322, 58044, 57790, 41152, 41922, 42692, 42438, - 44232, 45002, 43724, 43470, 47312, 48082, 48852, 48598, 46296, 47066, - 45788, 45534, 37088, 37858, 38628, 38374, 40168, 40938, 39660, 39406, - 35056, 35826, 36596, 36342, 34040, 34810, 33532, 33278, 40221, 40479, - 39705, 38939, 37141, 37399, 38673, 37907, 34061, 34319, 33545, 32779, - 35077, 35335, 36609, 35843, 44349, 44607, 43833, 43067, 41269, 41527, - 42801, 42035, 46381, 46639, 45865, 45099, 47397, 47655, 48929, 48163, - 64861, 65119, 64345, 63579, 61781, 62039, 63313, 62547, 58701, 58959, - 58185, 57419, 59717, 59975, 61249, 60483, 52605, 52863, 52089, 51323, - 49525, 49783, 51057, 50291, 54637, 54895, 54121, 53355, 55653, 55911, - 57185, 56419, 23965, 24223, 23449, 22683, 20885, 21143, 22417, 21651, - 17805, 18063, 17289, 16523, 18821, 19079, 20353, 19587, 28093, 28351, - 27577, 26811, 25013, 25271, 26545, 25779, 30125, 30383, 29609, 28843, - 31141, 31399, 32673, 31907, 15837, 16095, 15321, 14555, 12757, 13015, - 14289, 13523, 9677, 9935, 9161, 8395, 10693, 10951, 12225, 11459, - 3581, 3839, 3065, 2299, 501, 759, 2033, 1267, 5613, 5871, - 5097, 4331, 6629, 6887, 8161, 7395, - }, -}; - -#endif /* __VCD_CD_SECTOR_PRIVATE_H__ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/stream.c b/src/input/vcd/libvcd/stream.c deleted file mode 100644 index 2840a05d6..000000000 --- a/src/input/vcd/libvcd/stream.c +++ /dev/null @@ -1,276 +0,0 @@ -/* - $Id: stream.c,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <stdarg.h> - -#include <cdio/cdio.h> - -/* #define STREAM_DEBUG */ - -/* Public headers */ - -#include <libvcd/logging.h> - -/* Private headers */ -#include "vcd_assert.h" -#include "stream.h" -#include "util.h" - -static const char _rcsid[] = "$Id: stream.c,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $"; - -/* - * DataSource implementations - */ - -struct _VcdDataSink { - void* user_data; - vcd_data_sink_io_functions op; - int is_open; - long position; -}; - -static void -_vcd_data_sink_open_if_necessary(VcdDataSink *obj) -{ - vcd_assert (obj != NULL); - - if (!obj->is_open) { - if (obj->op.open(obj->user_data)) - vcd_error("could not opening output stream..."); - else { - obj->is_open = 1; - obj->position = 0; - } - } -} - -VcdDataSink* -vcd_data_sink_new(void *user_data, const vcd_data_sink_io_functions *funcs) -{ - VcdDataSink *new_obj; - - new_obj = _vcd_malloc(sizeof(VcdDataSink)); - - new_obj->user_data = user_data; - memcpy(&(new_obj->op), funcs, sizeof(vcd_data_sink_io_functions)); - - return new_obj; -} - -long -vcd_data_sink_seek(VcdDataSink* obj, long offset) -{ - vcd_assert (obj != NULL); - - _vcd_data_sink_open_if_necessary(obj); - - if (obj->position != offset) { - vcd_warn("had to reposition DataSink from %ld to %ld!", obj->position, offset); - obj->position = offset; - return obj->op.seek(obj->user_data, offset); - } - - return 0; -} - -long -vcd_data_sink_write(VcdDataSink* obj, const void *ptr, long size, long nmemb) -{ - long written; - - vcd_assert (obj != NULL); - - _vcd_data_sink_open_if_necessary(obj); - - written = obj->op.write(obj->user_data, ptr, size*nmemb); - obj->position += written; - - return written; -} - -long -vcd_data_sink_printf (VcdDataSink *obj, const char format[], ...) -{ - char buf[4096] = { 0, }; - long retval; - int len; - - va_list args; - va_start (args, format); - - len = vsnprintf (buf, sizeof(buf), format, args); - - if (len < 0 || len > (sizeof (buf) - 1)) - vcd_error ("vsnprintf() returned %d", len); - - retval = vcd_data_sink_write (obj, buf, 1, len); - - va_end (args); - - return retval; -} - -void -vcd_data_sink_close(VcdDataSink* obj) -{ - vcd_assert (obj != NULL); - - if (obj->is_open) { - obj->op.close(obj->user_data); - obj->is_open = 0; - obj->position = 0; - } -} - -void -vcd_data_sink_destroy(VcdDataSink* obj) -{ - vcd_assert (obj != NULL); - - vcd_data_sink_close(obj); - - obj->op.free(obj->user_data); -} - -/* - * DataSource implementations - */ - -struct _VcdDataSource { - void* user_data; - vcd_data_source_io_functions op; - int is_open; - long position; -}; - -static void -_vcd_data_source_open_if_necessary(VcdDataSource *obj) -{ - vcd_assert (obj != NULL); - - if (!obj->is_open) { - if (obj->op.open(obj->user_data)) - vcd_error ("could not opening input stream..."); - else { -#ifdef STREAM_DEBUG - vcd_debug ("opened source..."); -#endif - obj->is_open = 1; - obj->position = 0; - } - } -} - -long -vcd_data_source_seek(VcdDataSource* obj, long offset) -{ - vcd_assert (obj != NULL); - - _vcd_data_source_open_if_necessary(obj); - - if (obj->position != offset) { -#ifdef STREAM_DEBUG - vcd_warn("had to reposition DataSource from %ld to %ld!", obj->position, offset); -#endif - obj->position = offset; - return obj->op.seek(obj->user_data, offset); - } - - return 0; -} - -VcdDataSource* -vcd_data_source_new(void *user_data, const vcd_data_source_io_functions *funcs) -{ - VcdDataSource *new_obj; - - new_obj = _vcd_malloc (sizeof (VcdDataSource)); - - new_obj->user_data = user_data; - memcpy(&(new_obj->op), funcs, sizeof(vcd_data_source_io_functions)); - - return new_obj; -} - -long -vcd_data_source_read(VcdDataSource* obj, void *ptr, long size, long nmemb) -{ - long read_bytes; - - vcd_assert (obj != NULL); - - _vcd_data_source_open_if_necessary(obj); - - read_bytes = obj->op.read(obj->user_data, ptr, size*nmemb); - obj->position += read_bytes; - - return read_bytes; -} - -long -vcd_data_source_stat(VcdDataSource* obj) -{ - vcd_assert (obj != NULL); - - _vcd_data_source_open_if_necessary(obj); - - return obj->op.stat(obj->user_data); -} - -void -vcd_data_source_close(VcdDataSource* obj) -{ - vcd_assert (obj != NULL); - - if (obj->is_open) { -#ifdef STREAM_DEBUG - vcd_debug ("closed source..."); -#endif - obj->op.close(obj->user_data); - obj->is_open = 0; - obj->position = 0; - } -} - -void -vcd_data_source_destroy(VcdDataSource* obj) -{ - vcd_assert (obj != NULL); - - vcd_data_source_close(obj); - - obj->op.free(obj->user_data); -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/stream.h b/src/input/vcd/libvcd/stream.h deleted file mode 100644 index 43b8c911a..000000000 --- a/src/input/vcd/libvcd/stream.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - $Id: stream.h,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - - -#ifndef __VCD_STREAM_H__ -#define __VCD_STREAM_H__ - -#include <libvcd/types.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* typedef'ed IO functions prototypes */ - -typedef int(*vcd_data_open_t)(void *user_data); - -typedef long(*vcd_data_read_t)(void *user_data, void *buf, long count); - -typedef long(*vcd_data_write_t)(void *user_data, const void *buf, - long count); - -typedef long(*vcd_data_seek_t)(void *user_data, long offset); - -typedef long(*vcd_data_stat_t)(void *user_data); - -typedef int(*vcd_data_close_t)(void *user_data); - -typedef void(*vcd_data_free_t)(void *user_data); - - -/* abstract data sink */ - -typedef struct _VcdDataSink VcdDataSink; - -typedef struct { - vcd_data_open_t open; - vcd_data_seek_t seek; - vcd_data_write_t write; - vcd_data_close_t close; - vcd_data_free_t free; -} vcd_data_sink_io_functions; - -VcdDataSink* -vcd_data_sink_new(void *user_data, const vcd_data_sink_io_functions *funcs); - -long -vcd_data_sink_write(VcdDataSink* obj, const void *ptr, long size, long nmemb); - -long -vcd_data_sink_printf (VcdDataSink *obj, const char format[], ...) GNUC_PRINTF(2, 3); - -long -vcd_data_sink_seek(VcdDataSink* obj, long offset); - -void -vcd_data_sink_destroy(VcdDataSink* obj); - -void -vcd_data_sink_close(VcdDataSink* obj); - -/* abstract data source */ - -typedef struct _VcdDataSource VcdDataSource; - -typedef struct { - vcd_data_open_t open; - vcd_data_seek_t seek; - vcd_data_stat_t stat; - vcd_data_read_t read; - vcd_data_close_t close; - vcd_data_free_t free; -} vcd_data_source_io_functions; - -VcdDataSource* -vcd_data_source_new(void *user_data, const vcd_data_source_io_functions *funcs); - -long -vcd_data_source_read(VcdDataSource* obj, void *ptr, long size, long nmemb); - -long -vcd_data_source_seek(VcdDataSource* obj, long offset); - -long -vcd_data_source_stat(VcdDataSource* obj); - -void -vcd_data_source_destroy(VcdDataSource* obj); - -void -vcd_data_source_close(VcdDataSource* obj); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __VCD_STREAM_H__ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/stream_stdio.c b/src/input/vcd/libvcd/stream_stdio.c deleted file mode 100644 index 4eac0f6b3..000000000 --- a/src/input/vcd/libvcd/stream_stdio.c +++ /dev/null @@ -1,236 +0,0 @@ -/* - $Id: stream_stdio.c,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/stat.h> -#include <errno.h> - -#include <cdio/cdio.h> - -#include <libvcd/logging.h> - -/* Private headers */ -#include "stream_stdio.h" -#include "util.h" - -static const char _rcsid[] = "$Id: stream_stdio.c,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $"; - -#define VCD_STREAM_STDIO_BUFSIZE (128*1024) - -typedef struct { - char *pathname; - FILE *fd; - char *fd_buf; - off_t st_size; /* used only for source */ -} _UserData; - -static int -_stdio_open_source (void *user_data) -{ - _UserData *const ud = user_data; - - if ((ud->fd = fopen (ud->pathname, "rb"))) - { - ud->fd_buf = _vcd_malloc (VCD_STREAM_STDIO_BUFSIZE); - setvbuf (ud->fd, ud->fd_buf, _IOFBF, VCD_STREAM_STDIO_BUFSIZE); - } - - return (ud->fd == NULL); -} - -static int -_stdio_open_sink (void *user_data) -{ - _UserData *const ud = user_data; - - if ((ud->fd = fopen (ud->pathname, "wb"))) - { - ud->fd_buf = _vcd_malloc (VCD_STREAM_STDIO_BUFSIZE); - setvbuf (ud->fd, ud->fd_buf, _IOFBF, VCD_STREAM_STDIO_BUFSIZE); - } - - return (ud->fd == NULL); -} - -static int -_stdio_close(void *user_data) -{ - _UserData *const ud = user_data; - - if (fclose (ud->fd)) - vcd_error ("fclose (): %s", strerror (errno)); - - ud->fd = NULL; - - free (ud->fd_buf); - ud->fd_buf = NULL; - - return 0; -} - -static void -_stdio_free(void *user_data) -{ - _UserData *const ud = user_data; - - if (ud->pathname) - free(ud->pathname); - - if (ud->fd) /* should be NULL anyway... */ - _stdio_close(user_data); - - free(ud); -} - -static long -_stdio_seek(void *user_data, long offset) -{ - _UserData *const ud = user_data; - - if (fseek (ud->fd, offset, SEEK_SET)) - vcd_error ("fseek (): %s", strerror (errno)); - - return offset; -} - -static long -_stdio_stat(void *user_data) -{ - const _UserData *const ud = user_data; - - return ud->st_size; -} - -static long -_stdio_read(void *user_data, void *buf, long count) -{ - _UserData *const ud = user_data; - long read; - - read = fread(buf, 1, count, ud->fd); - - if (read != count) - { /* fixme -- ferror/feof */ - if (feof (ud->fd)) - { - vcd_debug ("fread (): EOF encountered"); - clearerr (ud->fd); - } - else if (ferror (ud->fd)) - { - vcd_error ("fread (): %s", strerror (errno)); - clearerr (ud->fd); - } - else - vcd_debug ("fread (): short read and no EOF?!?"); - } - - return read; -} - -static long -_stdio_write(void *user_data, const void *buf, long count) -{ - _UserData *const ud = user_data; - long written; - - written = fwrite(buf, 1, count, ud->fd); - - if (written != count) - vcd_error ("fwrite (): %s", strerror (errno)); - - return written; -} - -VcdDataSource* -vcd_data_source_new_stdio(const char pathname[]) -{ - VcdDataSource *new_obj = NULL; - vcd_data_source_io_functions funcs = { 0, }; - _UserData *ud = NULL; - struct stat statbuf; - - if (stat (pathname, &statbuf) == -1) - { - vcd_error ("could not stat() file `%s': %s", pathname, strerror (errno)); - return NULL; - } - - ud = _vcd_malloc (sizeof (_UserData)); - - ud->pathname = strdup(pathname); - ud->st_size = statbuf.st_size; /* let's hope it doesn't change... */ - - funcs.open = _stdio_open_source; - funcs.seek = _stdio_seek; - funcs.stat = _stdio_stat; - funcs.read = _stdio_read; - funcs.close = _stdio_close; - funcs.free = _stdio_free; - - new_obj = vcd_data_source_new(ud, &funcs); - - return new_obj; -} - - -VcdDataSink* -vcd_data_sink_new_stdio(const char pathname[]) -{ - VcdDataSink *new_obj = NULL; - vcd_data_sink_io_functions funcs; - _UserData *ud = NULL; - struct stat statbuf; - - if (stat (pathname, &statbuf) != -1) - vcd_warn ("file `%s' exist already, will get overwritten!", pathname); - - ud = _vcd_malloc (sizeof (_UserData)); - - memset (&funcs, 0, sizeof (funcs)); - - ud->pathname = strdup (pathname); - - funcs.open = _stdio_open_sink; - funcs.seek = _stdio_seek; - funcs.write = _stdio_write; - funcs.close = _stdio_close; - funcs.free = _stdio_free; - - new_obj = vcd_data_sink_new (ud, &funcs); - - return new_obj; -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/stream_stdio.h b/src/input/vcd/libvcd/stream_stdio.h deleted file mode 100644 index 46bca3140..000000000 --- a/src/input/vcd/libvcd/stream_stdio.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - $Id: stream_stdio.h,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - - -#ifndef __VCD_STREAM_STDIO_H__ -#define __VCD_STREAM_STDIO_H__ - -/* Private headers */ -#include "stream.h" - -VcdDataSink* -vcd_data_sink_new_stdio(const char pathname[]); - -VcdDataSource* -vcd_data_source_new_stdio(const char pathname[]); - -#endif /* __VCD_STREAM_STDIO_H__ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/util.c b/src/input/vcd/libvcd/util.c deleted file mode 100644 index a1e5c57d4..000000000 --- a/src/input/vcd/libvcd/util.c +++ /dev/null @@ -1,179 +0,0 @@ -/* - $Id: util.c,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <ctype.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -/* Private includes */ -#include "vcd_assert.h" -#include "bytesex.h" -#include "util.h" - -static const char _rcsid[] = "$Id: util.c,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $"; - -size_t -_vcd_strlenv(char **str_array) -{ - size_t n = 0; - - vcd_assert (str_array != NULL); - - while(str_array[n]) - n++; - - return n; -} - -void -_vcd_strfreev(char **strv) -{ - int n; - - vcd_assert (strv != NULL); - - for(n = 0; strv[n]; n++) - free(strv[n]); - - free(strv); -} - -char * -_vcd_strjoin (char *strv[], unsigned count, const char delim[]) -{ - size_t len; - char *new_str; - unsigned n; - - vcd_assert (strv != NULL); - vcd_assert (delim != NULL); - - len = (count-1) * strlen (delim); - - for (n = 0;n < count;n++) - len += strlen (strv[n]); - - len++; - - new_str = _vcd_malloc (len); - new_str[0] = '\0'; - - for (n = 0;n < count;n++) - { - if (n) - strcat (new_str, delim); - strcat (new_str, strv[n]); - } - - return new_str; -} - -char ** -_vcd_strsplit(const char str[], char delim) /* fixme -- non-reentrant */ -{ - int n; - char **strv = NULL; - char *_str, *p; - char _delim[2] = { 0, 0 }; - - vcd_assert (str != NULL); - - _str = strdup(str); - _delim[0] = delim; - - vcd_assert (_str != NULL); - - n = 1; - p = _str; - while(*p) - if (*(p++) == delim) - n++; - - strv = _vcd_malloc (sizeof (char *) * (n+1)); - - n = 0; - while((p = strtok(n ? NULL : _str, _delim)) != NULL) - strv[n++] = strdup(p); - - free(_str); - - return strv; -} - -void * -_vcd_malloc (size_t size) -{ - void *new_mem = malloc (size); - - vcd_assert (new_mem != NULL); - - memset (new_mem, 0, size); - - return new_mem; -} - -void * -_vcd_memdup (const void *mem, size_t count) -{ - void *new_mem = NULL; - - if (mem) - { - new_mem = _vcd_malloc (count); - memcpy (new_mem, mem, count); - } - - return new_mem; -} - -char * -_vcd_strdup_upper (const char str[]) -{ - char *new_str = NULL; - - if (str) - { - char *p; - - p = new_str = strdup (str); - - while (*p) - { - *p = toupper (*p); - p++; - } - } - - return new_str; -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/util.h b/src/input/vcd/libvcd/util.h deleted file mode 100644 index c5a9ead7c..000000000 --- a/src/input/vcd/libvcd/util.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - $Id: util.h,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifndef __VCD_UTIL_H__ -#define __VCD_UTIL_H__ - -#include <stdlib.h> -#include <libvcd/types.h> - -#ifndef __CDIO_UTIL_H__ -#undef MAX -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) - -#undef MIN -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) - -#undef IN -#define IN(x, low, high) ((x) >= (low) && (x) <= (high)) - -#undef CLAMP -#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) - -#endif - -static inline unsigned -_vcd_len2blocks (unsigned len, int blocksize) -{ - unsigned blocks; - - blocks = len / blocksize; - if (len % blocksize) - blocks++; - - return blocks; -} - -/* round up to next block boundary */ -static inline unsigned -_vcd_ceil2block (unsigned offset, int blocksize) -{ - return _vcd_len2blocks (offset, blocksize) * blocksize; -} - -static inline unsigned -_vcd_ofs_add (unsigned offset, unsigned length, int blocksize) -{ - if (blocksize - (offset % blocksize) < length) - offset = _vcd_ceil2block (offset, blocksize); - - offset += length; - - return offset; -} - -size_t -_vcd_strlenv(char **str_array); - -char * -_vcd_strjoin (char *strv[], unsigned count, const char delim[]); - -char ** -_vcd_strsplit(const char str[], char delim); - -void -_vcd_strfreev(char **strv); - -void * -_vcd_malloc (size_t size); - -void * -_vcd_memdup (const void *mem, size_t count); - -char * -_vcd_strdup_upper (const char str[]); - -static inline const char * -_vcd_bool_str (bool b) -{ - return b ? "yes" : "no"; -} - -#endif /* __VCD_UTIL_H__ */ - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/vcd.c b/src/input/vcd/libvcd/vcd.c deleted file mode 100644 index 0772149ec..000000000 --- a/src/input/vcd/libvcd/vcd.c +++ /dev/null @@ -1,2412 +0,0 @@ -/* - $Id: vcd.c,v 1.4 2006/12/08 16:26:10 mshopf Exp $ - - Copyright (C) 2000, 2004 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <math.h> - -#include <cdio/cdio.h> -#include <cdio/iso9660.h> - -/* public headers */ -#include <libvcd/types.h> -#include <libvcd/info.h> - -#include <libvcd/files.h> -#include <libvcd/sector.h> -#include <libvcd/logging.h> - -/* Private headers */ -#include "assert.h" -#include "dict.h" -#include "directory.h" -#include "obj.h" -#include "pbc.h" -#include "salloc.h" -#include "util.h" -#include "vcd.h" - -static const char _rcsid[] = "$Id: vcd.c,v 1.4 2006/12/08 16:26:10 mshopf Exp $"; - -static const char zero[CDIO_CD_FRAMESIZE_RAW] = { 0, }; - -#define DEFAULT_ISO_PREPARER_ID "GNU VCDImager " VERSION " " HOST_ARCH - -/* exported private functions - */ - -mpeg_sequence_t * -_vcd_obj_get_sequence_by_id (VcdObj *obj, const char sequence_id[]) -{ - CdioListNode *node; - - vcd_assert (sequence_id != NULL); - vcd_assert (obj != NULL); - - _CDIO_LIST_FOREACH (node, obj->mpeg_sequence_list) - { - mpeg_sequence_t *_sequence = _cdio_list_node_data (node); - - if (_sequence->id && !strcmp (sequence_id, _sequence->id)) - return _sequence; - } - - return NULL; -} - -mpeg_sequence_t * -_vcd_obj_get_sequence_by_entry_id (VcdObj *obj, const char entry_id[]) -{ - CdioListNode *node; - - vcd_assert (entry_id != NULL); - vcd_assert (obj != NULL); - - _CDIO_LIST_FOREACH (node, obj->mpeg_sequence_list) - { - mpeg_sequence_t *_sequence = _cdio_list_node_data (node); - CdioListNode *node2; - - /* default entry point */ - if (_sequence->default_entry_id - && !strcmp (entry_id, _sequence->default_entry_id)) - return _sequence; - - /* additional entry points */ - _CDIO_LIST_FOREACH (node2, _sequence->entry_list) - { - entry_t *_entry = _cdio_list_node_data (node2); - - if (_entry->id - && !strcmp (entry_id, _entry->id)) - return _sequence; - } - } - - /* not found */ - - return NULL; -} - -mpeg_segment_t * -_vcd_obj_get_segment_by_id (VcdObj *obj, const char segment_id[]) -{ - CdioListNode *node; - - vcd_assert (segment_id != NULL); - vcd_assert (obj != NULL); - - _CDIO_LIST_FOREACH (node, obj->mpeg_segment_list) - { - mpeg_segment_t *_segment = _cdio_list_node_data (node); - - if (_segment->id && !strcmp (segment_id, _segment->id)) - return _segment; - } - - return NULL; -} - -bool -_vcd_obj_has_cap_p (const VcdObj *obj, enum vcd_capability_t capability) -{ - switch (capability) - { - case _CAP_VALID: - switch (obj->type) - { - case VCD_TYPE_VCD: - case VCD_TYPE_VCD11: - case VCD_TYPE_VCD2: - case VCD_TYPE_SVCD: - case VCD_TYPE_HQVCD: - return true; - break; - - case VCD_TYPE_INVALID: - return false; - break; - } - break; - - case _CAP_MPEG2: - switch (obj->type) - { - case VCD_TYPE_VCD: - case VCD_TYPE_VCD11: - case VCD_TYPE_VCD2: - case VCD_TYPE_INVALID: - return false; - break; - - case VCD_TYPE_SVCD: - case VCD_TYPE_HQVCD: - return true; - break; - } - break; - - case _CAP_PBC: - switch (obj->type) - { - case VCD_TYPE_VCD: - case VCD_TYPE_VCD11: - case VCD_TYPE_INVALID: - return false; - break; - - case VCD_TYPE_VCD2: - case VCD_TYPE_SVCD: - case VCD_TYPE_HQVCD: - return true; - break; - } - break; - - case _CAP_PBC_X: - switch (obj->type) - { - case VCD_TYPE_VCD: - case VCD_TYPE_VCD11: - case VCD_TYPE_INVALID: - case VCD_TYPE_SVCD: - case VCD_TYPE_HQVCD: - return false; - break; - - case VCD_TYPE_VCD2: - return true; - break; - } - break; - - case _CAP_4C_SVCD: - switch (obj->type) - { - case VCD_TYPE_VCD: - case VCD_TYPE_VCD11: - case VCD_TYPE_INVALID: - case VCD_TYPE_VCD2: - return false; - break; - - case VCD_TYPE_SVCD: - case VCD_TYPE_HQVCD: - return true; - break; - } - break; - - case _CAP_PAL_BITS: - return _vcd_obj_has_cap_p (obj, _CAP_PBC); /* for now */ - break; - - case _CAP_MPEG1: - return !_vcd_obj_has_cap_p (obj, _CAP_MPEG2); /* for now */ - break; - - case _CAP_TRACK_MARGINS: - return !_vcd_obj_has_cap_p (obj, _CAP_MPEG2); /* for now */ - break; - } - - vcd_assert_not_reached (); - return false; -} - -/* - * public methods - */ - -VcdObj * -vcd_obj_new (vcd_type_t vcd_type) -{ - VcdObj *new_obj = NULL; - static bool _first = true; - - if (_first) - { -#if defined(_DEVELOPMENT_) - vcd_warn ("initializing libvcd %s [%s]", VERSION, HOST_ARCH); - vcd_warn (" "); - vcd_warn (" this is the UNSTABLE development branch!"); - vcd_warn (" use only if you know what you are doing"); - vcd_warn (" see http://www.hvrlab.org/~hvr/vcdimager/ for more information"); - vcd_warn (" "); -#else - vcd_debug ("initializing libvcd %s [%s]", VERSION, HOST_ARCH); -#endif - _first = false; - } - - new_obj = _vcd_malloc (sizeof (VcdObj)); - new_obj->type = vcd_type; - - if (!_vcd_obj_has_cap_p (new_obj, _CAP_VALID)) - { - vcd_error ("VCD type not supported"); - free (new_obj); - return NULL; - } - - if (vcd_type == VCD_TYPE_VCD) - vcd_warn ("VCD 1.0 support is experimental -- user feedback needed!"); - - new_obj->iso_volume_label = strdup (""); - new_obj->iso_publisher_id = strdup (""); - new_obj->iso_application_id = strdup (""); - new_obj->iso_preparer_id = _vcd_strdup_upper (DEFAULT_ISO_PREPARER_ID); - new_obj->info_album_id = strdup (""); - new_obj->info_volume_count = 1; - new_obj->info_volume_number = 1; - - new_obj->custom_file_list = _cdio_list_new (); - new_obj->custom_dir_list = _cdio_list_new (); - - - new_obj->mpeg_sequence_list = _cdio_list_new (); - - new_obj->mpeg_segment_list = _cdio_list_new (); - - new_obj->pbc_list = _cdio_list_new (); - - /* gap's defined by IEC-10149 / ECMA-130 */ - - /* pre-gap's for tracks but the first one */ - new_obj->track_pregap = CDIO_PREGAP_SECTORS; - /* post-gap after last track */ - new_obj->leadout_pregap = CDIO_POSTGAP_SECTORS; - - if (_vcd_obj_has_cap_p (new_obj, _CAP_TRACK_MARGINS)) - { - new_obj->track_front_margin = 30; - new_obj->track_rear_margin = 45; - } - else - { - new_obj->track_front_margin = 0; - new_obj->track_rear_margin = 0; - } - - return new_obj; -} - -int -vcd_obj_remove_item (VcdObj *obj, const char id[]) -{ - vcd_warn ("vcd_obj_remove_item('%s') not implemented yet!", id); - - return -1; -} - -static void -_vcd_obj_remove_mpeg_track (VcdObj *obj, int track_id) -{ - int length; - mpeg_sequence_t *track = NULL; - CdioListNode *node = NULL; - - vcd_assert (track_id >= 0); - - node = _vcd_list_at (obj->mpeg_sequence_list, track_id); - - vcd_assert (node != NULL); - - track = (mpeg_sequence_t *) _cdio_list_node_data (node); - - vcd_mpeg_source_destroy (track->source, true); - - length = track->info->packets; - length += obj->track_pregap + obj->track_front_margin + 0 + obj->track_rear_margin; - - /* fixup offsets */ - { - CdioListNode *node2 = node; - while ((node2 = _cdio_list_node_next (node2)) != NULL) - ((mpeg_sequence_t *) _cdio_list_node_data (node))->relative_start_extent -= length; - } - - obj->relative_end_extent -= length; - - /* shift up */ - _cdio_list_node_free (node, true); -} - -int -vcd_obj_append_segment_play_item (VcdObj *obj, VcdMpegSource *mpeg_source, - const char item_id[]) -{ - mpeg_segment_t *segment = NULL; - - vcd_assert (obj != NULL); - vcd_assert (mpeg_source != NULL); - - if (!_vcd_obj_has_cap_p (obj, _CAP_PBC)) - { - vcd_error ("segment play items not supported for this vcd type"); - return -1; - } - - if (!item_id) - { - vcd_error ("no id given for segment play item"); - return -1; - } - - if (_vcd_pbc_lookup (obj, item_id)) - { - vcd_error ("item id (%s) exists already", item_id); - return -1; - } - - vcd_info ("scanning mpeg segment item #%d for scanpoints...", - _cdio_list_length (obj->mpeg_segment_list)); - - vcd_mpeg_source_scan (mpeg_source, !obj->relaxed_aps, - obj->update_scan_offsets, NULL, NULL); - - if (vcd_mpeg_source_get_info (mpeg_source)->packets == 0) - { - vcd_error ("mpeg is empty?"); - return -1; - } - - /* create list node */ - - segment = _vcd_malloc (sizeof (mpeg_sequence_t)); - - segment->source = mpeg_source; - - segment->id = strdup (item_id); - - segment->info = vcd_mpeg_source_get_info (mpeg_source); - segment->segment_count = _vcd_len2blocks (segment->info->packets, 150); - - segment->pause_list = _cdio_list_new (); - - vcd_debug ("SPI length is %d sector(s), allocated %d segment(s)", - segment->info->packets, - segment->segment_count); - - _cdio_list_append (obj->mpeg_segment_list, segment); - - return 0; -} - -int -vcd_obj_append_sequence_play_item (VcdObj *obj, VcdMpegSource *mpeg_source, - const char item_id[], - const char default_entry_id[]) -{ - unsigned length; - mpeg_sequence_t *sequence = NULL; - int track_no = _cdio_list_length (obj->mpeg_sequence_list); - - vcd_assert (obj != NULL); - vcd_assert (mpeg_source != NULL); - - if (item_id && _vcd_pbc_lookup (obj, item_id)) - { - vcd_error ("item id (%s) exist already", item_id); - return -1; - } - - if (default_entry_id && _vcd_pbc_lookup (obj, default_entry_id)) - { - vcd_error ("default entry id (%s) exist already", default_entry_id); - return -1; - } - - if (default_entry_id && item_id && !strcmp (item_id, default_entry_id)) - { - vcd_error ("default entry id == item id (%s)", item_id); - return -1; - } - - vcd_info ("scanning mpeg sequence item #%d for scanpoints...", track_no); - vcd_mpeg_source_scan (mpeg_source, !obj->relaxed_aps, - obj->update_scan_offsets, NULL, NULL); - - sequence = _vcd_malloc (sizeof (mpeg_sequence_t)); - - sequence->source = mpeg_source; - - if (item_id) - sequence->id = strdup (item_id); - - if (default_entry_id) - sequence->default_entry_id = strdup (default_entry_id); - - sequence->info = vcd_mpeg_source_get_info (mpeg_source); - length = sequence->info->packets; - - sequence->entry_list = _cdio_list_new (); - sequence->pause_list = _cdio_list_new (); - - obj->relative_end_extent += obj->track_pregap; - sequence->relative_start_extent = obj->relative_end_extent; - - obj->relative_end_extent += obj->track_front_margin + length + obj->track_rear_margin; - - /* sanity checks */ - - if (length < 75) - vcd_warn ("mpeg stream shorter than 75 sectors"); - - if (!_vcd_obj_has_cap_p (obj, _CAP_PAL_BITS) - && vcd_mpeg_get_norm (&sequence->info->shdr[0]) != MPEG_NORM_FILM - && vcd_mpeg_get_norm (&sequence->info->shdr[0]) != MPEG_NORM_NTSC) - vcd_warn ("VCD 1.x should contain only NTSC/FILM video (may work with PAL nevertheless)"); - - if (!_vcd_obj_has_cap_p (obj, _CAP_MPEG1) - && sequence->info->version == MPEG_VERS_MPEG1) - vcd_warn ("this VCD type should not contain MPEG1 streams"); - - if (!_vcd_obj_has_cap_p (obj, _CAP_MPEG2) - && sequence->info->version == MPEG_VERS_MPEG2) - vcd_warn ("this VCD type should not contain MPEG2 streams"); - - if (!sequence->info->shdr[0].seen - || sequence->info->shdr[1].seen - || sequence->info->shdr[2].seen) - vcd_warn ("sequence items should contain a motion video stream!"); - - { - int i; - - for (i = 0; i < 3; i++) - { - if (sequence->info->ahdr[i].seen) - { - if (i && !_vcd_obj_has_cap_p (obj, _CAP_MPEG2)) - vcd_warn ("audio stream #%d not supported by this VCD type", i); - - if (sequence->info->ahdr[i].sampfreq != 44100) - vcd_warn ("audio stream #%d has sampling frequency %d Hz (should be 44100 Hz)", - i, sequence->info->ahdr[i].sampfreq); - - if (sequence->info->ahdr[i].layer != 2) - vcd_warn ("audio stream #%d is not layer II", i); - - if (_vcd_obj_has_cap_p (obj, _CAP_MPEG1) - && sequence->info->ahdr[i].bitrate != 224*1024) - vcd_warn ("audio stream #%d has bitrate %d kbps (should be 224 kbps for this vcd type)", - i, sequence->info->ahdr[i].bitrate); - } - else if (!i && !_vcd_obj_has_cap_p (obj, _CAP_MPEG2)) - { - vcd_warn ("this VCD type requires an audio stream to be present"); - } - } - } - - /* vcd_debug ("track# %d's detected playing time: %.2f seconds", */ - /* track_no, sequence->info->playing_time); */ - - _cdio_list_append (obj->mpeg_sequence_list, sequence); - - return track_no; -} - -static int -_pause_cmp (pause_t *ent1, pause_t *ent2) -{ - if (ent1->time < ent2->time) - return -1; - - if (ent1->time > ent2->time) - return 1; - - return 0; -} - -int -vcd_obj_add_sequence_pause (VcdObj *obj, const char sequence_id[], - double pause_time, const char pause_id[]) -{ - mpeg_sequence_t *_sequence; - - vcd_assert (obj != NULL); - - if (sequence_id) - _sequence = _vcd_obj_get_sequence_by_id (obj, sequence_id); - else - _sequence = - _cdio_list_node_data (_cdio_list_end (obj->mpeg_sequence_list)); - - if (!_sequence) - { - vcd_error ("sequence id `%s' not found", sequence_id); - return -1; - } - - if (pause_id) - vcd_warn ("pause id ignored..."); - - { - pause_t *_pause = _vcd_malloc (sizeof (pause_t)); - - if (pause_id) - _pause->id = strdup (pause_id); - _pause->time = pause_time; - - _cdio_list_append (_sequence->pause_list, _pause); - } - - _vcd_list_sort (_sequence->pause_list, - (_cdio_list_cmp_func) _pause_cmp); - - vcd_debug ("added autopause point at %f", pause_time); - - return 0; -} - -int -vcd_obj_add_segment_pause (VcdObj *obj, const char segment_id[], - double pause_time, const char pause_id[]) -{ - mpeg_segment_t *_segment; - - vcd_assert (obj != NULL); - - if (segment_id) - _segment = _vcd_obj_get_segment_by_id (obj, segment_id); - else - _segment = _cdio_list_node_data (_cdio_list_end (obj->mpeg_segment_list)); - - if (!_segment) - { - vcd_error ("segment id `%s' not found", segment_id); - return -1; - } - - if (pause_id) - vcd_warn ("pause id ignored..."); - - { - pause_t *_pause = _vcd_malloc (sizeof (pause_t)); - - if (pause_id) - _pause->id = strdup (pause_id); - _pause->time = pause_time; - - _cdio_list_append (_segment->pause_list, _pause); - } - - _vcd_list_sort (_segment->pause_list, - (_cdio_list_cmp_func) _pause_cmp); - - vcd_debug ("added autopause point at %f", pause_time); - - return 0; -} - -static int -_entry_cmp (entry_t *ent1, entry_t *ent2) -{ - if (ent1->time < ent2->time) - return -1; - - if (ent1->time > ent2->time) - return 1; - - return 0; -} - -int -vcd_obj_add_sequence_entry (VcdObj *obj, const char sequence_id[], - double entry_time, const char entry_id[]) -{ - mpeg_sequence_t *_sequence; - - vcd_assert (obj != NULL); - - if (sequence_id) - _sequence = _vcd_obj_get_sequence_by_id (obj, sequence_id); - else - _sequence = - _cdio_list_node_data (_cdio_list_end (obj->mpeg_sequence_list)); - - if (!_sequence) - { - vcd_error ("sequence id `%s' not found", sequence_id); - return -1; - } - - if (_cdio_list_length (_sequence->entry_list) >= MAX_SEQ_ENTRIES) - { - vcd_error ("only %d entries per sequence allowed!", MAX_SEQ_ENTRIES); - return -1; - } - - if (entry_id && _vcd_pbc_lookup (obj, entry_id)) - { - vcd_error ("item id (%s) exists already", entry_id); - return -1; - } - - { - entry_t *_entry = _vcd_malloc (sizeof (entry_t)); - - if (entry_id) - _entry->id = strdup (entry_id); - _entry->time = entry_time; - - _cdio_list_append (_sequence->entry_list, _entry); - } - - _vcd_list_sort (_sequence->entry_list, - (_cdio_list_cmp_func) _entry_cmp); - - return 0; -} - -void -vcd_obj_destroy (VcdObj *obj) -{ - CdioListNode *node; - - vcd_assert (obj != NULL); - vcd_assert (!obj->in_output); - - free (obj->iso_volume_label); - free (obj->iso_application_id); - - _CDIO_LIST_FOREACH (node, obj->custom_file_list) - { - custom_file_t *p = _cdio_list_node_data (node); - - free (p->iso_pathname); - } - - _cdio_list_free (obj->custom_file_list, true); - - _cdio_list_free (obj->custom_dir_list, true); - - while (_cdio_list_length (obj->mpeg_sequence_list)) - _vcd_obj_remove_mpeg_track (obj, 0); - _cdio_list_free (obj->mpeg_sequence_list, true); - - free (obj); -} - -int -vcd_obj_set_param_uint (VcdObj *obj, vcd_parm_t param, unsigned arg) -{ - vcd_assert (obj != NULL); - - switch (param) - { - case VCD_PARM_VOLUME_COUNT: - obj->info_volume_count = arg; - if (!IN (obj->info_volume_count, 1, 65535)) - { - obj->info_volume_count = CLAMP (obj->info_volume_count, 1, 65535); - vcd_warn ("volume count out of range, clamping to range"); - } - vcd_debug ("changed volume count to %u", obj->info_volume_count); - break; - - case VCD_PARM_VOLUME_NUMBER: - obj->info_volume_number = arg; - if (!IN (obj->info_volume_number, 0, 65534)) - { - obj->info_volume_number = CLAMP (obj->info_volume_number, 0, 65534); - vcd_warn ("volume number out of range, clamping to range"); - } - vcd_debug ("changed volume number to %u", obj->info_volume_number); - break; - - case VCD_PARM_RESTRICTION: - obj->info_restriction = arg; - if (!IN (obj->info_restriction, 0, 3)) - { - obj->info_restriction = CLAMP (obj->info_restriction, 0, 65534); - vcd_warn ("restriction out of range, clamping to range"); - } - vcd_debug ("changed restriction number to %u", obj->info_restriction); - break; - - case VCD_PARM_LEADOUT_PREGAP: - obj->leadout_pregap = arg; - if (!IN (obj->leadout_pregap, 0, 300)) - { - obj->leadout_pregap = CLAMP (obj->leadout_pregap, 0, 300); - vcd_warn ("ledout pregap out of range, clamping to allowed range"); - } - if (obj->leadout_pregap < CDIO_PREGAP_SECTORS) - vcd_warn ("track leadout pregap set below %d sectors; created (s)vcd may be non-working", - CDIO_PREGAP_SECTORS); - - vcd_debug ("changed leadout pregap to %u", obj->leadout_pregap); - break; - - case VCD_PARM_TRACK_PREGAP: - obj->track_pregap = arg; - if (!IN (obj->track_pregap, 1, 300)) - { - obj->track_pregap = CLAMP (obj->track_pregap, 1, 300); - vcd_warn ("track pregap out of range, clamping to allowed range"); - } - if (obj->track_pregap < CDIO_PREGAP_SECTORS) - vcd_warn ("track pre gap set below %d sectors; created (S)VCD may be non-working", - CDIO_PREGAP_SECTORS); - vcd_debug ("changed track pregap to %u", obj->track_pregap); - break; - - case VCD_PARM_TRACK_FRONT_MARGIN: - obj->track_front_margin = arg; - if (!IN (obj->track_front_margin, 0, CDIO_PREGAP_SECTORS)) - { - obj->track_front_margin = CLAMP (obj->track_front_margin, 0, - CDIO_PREGAP_SECTORS); - vcd_warn ("front margin out of range, clamping to allowed range"); - } - if (_vcd_obj_has_cap_p (obj, _CAP_TRACK_MARGINS) - && obj->track_front_margin < 15) - vcd_warn ("front margin set smaller than recommended (%d < 15 sectors) for disc type used", - obj->track_front_margin); - - vcd_debug ("changed front margin to %u", obj->track_front_margin); - break; - - case VCD_PARM_TRACK_REAR_MARGIN: - obj->track_rear_margin = arg; - if (!IN (obj->track_rear_margin, 0, CDIO_POSTGAP_SECTORS)) - { - obj->track_rear_margin = CLAMP (obj->track_rear_margin, 0, - CDIO_POSTGAP_SECTORS); - vcd_warn ("rear margin out of range, clamping to allowed range"); - } - if (_vcd_obj_has_cap_p (obj, _CAP_TRACK_MARGINS) - && obj->track_rear_margin < 15) - vcd_warn ("rear margin set smaller than recommended (%d < 15 sectors) for disc type used", - obj->track_rear_margin); - vcd_debug ("changed rear margin to %u", obj->track_rear_margin); - break; - - default: - vcd_assert_not_reached (); - break; - } - - return 0; -} - -int -vcd_obj_set_param_str (VcdObj *obj, vcd_parm_t param, const char *arg) -{ - vcd_assert (obj != NULL); - vcd_assert (arg != NULL); - - switch (param) - { - case VCD_PARM_VOLUME_ID: - free (obj->iso_volume_label); - obj->iso_volume_label = strdup (arg); - if (strlen (obj->iso_volume_label) > 32) - { - obj->iso_volume_label[32] = '\0'; - vcd_warn ("Volume label too long, will be truncated"); - } - vcd_debug ("changed volume label to `%s'", obj->iso_volume_label); - break; - - case VCD_PARM_PUBLISHER_ID: - free (obj->iso_publisher_id); - obj->iso_publisher_id = strdup (arg); - if (strlen (obj->iso_publisher_id) > 128) - { - obj->iso_publisher_id[128] = '\0'; - vcd_warn ("Publisher ID too long, will be truncated"); - } - vcd_debug ("changed publisher id to `%s'", obj->iso_publisher_id); - break; - - case VCD_PARM_PREPARER_ID: - free (obj->iso_preparer_id); - obj->iso_preparer_id = strdup (arg); - if (strlen (obj->iso_preparer_id) > 128) - { - obj->iso_preparer_id[128] = '\0'; - vcd_warn ("Preparer ID too long, will be truncated"); - } - vcd_debug ("changed preparer id to `%s'", obj->iso_preparer_id); - break; - - case VCD_PARM_APPLICATION_ID: - free (obj->iso_application_id); - obj->iso_application_id = strdup (arg); - if (strlen (obj->iso_application_id) > 128) - { - obj->iso_application_id[128] = '\0'; - vcd_warn ("Application ID too long, will be truncated"); - } - vcd_debug ("changed application id to `%s'", obj->iso_application_id); - break; - - case VCD_PARM_ALBUM_ID: - free (obj->info_album_id); - obj->info_album_id = strdup (arg); - if (strlen (obj->info_album_id) > 16) - { - obj->info_album_id[16] = '\0'; - vcd_warn ("Album ID too long, will be truncated"); - } - vcd_debug ("changed album id to `%s'", obj->info_album_id); - break; - - default: - vcd_assert_not_reached (); - break; - } - - return 0; -} - -int -vcd_obj_set_param_bool (VcdObj *obj, vcd_parm_t param, bool arg) -{ - vcd_assert (obj != NULL); - - switch (param) - { - case VCD_PARM_RELAXED_APS: - obj->relaxed_aps = arg ? true : false; - vcd_debug ("changing 'relaxed aps' to %d", obj->relaxed_aps); - break; - - case VCD_PARM_NEXT_VOL_LID2: - obj->info_use_lid2 = arg ? true : false; - vcd_debug ("changing 'next volume use lid 2' to %d", obj->info_use_lid2); - break; - - case VCD_PARM_NEXT_VOL_SEQ2: - obj->info_use_seq2 = arg ? true : false; - vcd_debug ("changing 'next volume use sequence 2' to %d", obj->info_use_seq2); - break; - - case VCD_PARM_SVCD_VCD3_MPEGAV: - if (obj->type == VCD_TYPE_SVCD) - { - if ((obj->svcd_vcd3_mpegav = arg ? true : false)) - vcd_warn ("!! enabling deprecated VCD3.0 MPEGAV folder --" - " SVCD will not be IEC62107 compliant !!"); - } - else - vcd_error ("parameter not applicable for vcd type"); - break; - - case VCD_PARM_SVCD_VCD3_ENTRYSVD: - if (obj->type == VCD_TYPE_SVCD) - { - if ((obj->svcd_vcd3_entrysvd = arg ? true : false)) - vcd_warn ("!! enabling deprecated VCD3.0 ENTRYSVD signature --" - " SVCD will not be IEC62107 compliant !!"); - } - else - vcd_error ("parameter not applicable for vcd type"); - break; - - case VCD_PARM_SVCD_VCD3_TRACKSVD: - if (obj->type == VCD_TYPE_SVCD) - { - if ((obj->svcd_vcd3_tracksvd = arg ? true : false)) - vcd_warn ("!! enabling deprecated VCD3.0 TRACK.SVD format --" - " SVCD will not be IEC62107 compliant !!"); - } - else - vcd_error ("parameter not applicable for vcd type"); - break; - - case VCD_PARM_UPDATE_SCAN_OFFSETS: - if (_vcd_obj_has_cap_p (obj, _CAP_4C_SVCD)) - { - obj->update_scan_offsets = arg ? true : false; - vcd_debug ("changing 'update scan offsets' to %d", obj->update_scan_offsets); - } - else - vcd_error ("parameter not applicable for vcd type"); - break; - - case VCD_PARM_LEADOUT_PAUSE: - vcd_warn ("use of 'leadout pause' is deprecated and may be removed in later releases;" - " use 'leadout pregap' instead"); - vcd_obj_set_param_uint (obj, VCD_PARM_LEADOUT_PREGAP, - (arg ? CDIO_PREGAP_SECTORS : 0)); - break; - - default: - vcd_assert_not_reached (); - break; - } - - return 0; -} - -int -vcd_obj_add_dir (VcdObj *obj, const char iso_pathname[]) -{ - char *_iso_pathname; - - vcd_assert (obj != NULL); - vcd_assert (iso_pathname != NULL); - - _iso_pathname = _vcd_strdup_upper (iso_pathname); - - if (!iso9660_dirname_valid_p (_iso_pathname)) - { - vcd_error("pathname `%s' is not a valid iso pathname", - _iso_pathname); - free (_iso_pathname); - return 1; - } - - _cdio_list_append (obj->custom_dir_list, _iso_pathname); - - _vcd_list_sort (obj->custom_dir_list, - (_cdio_list_cmp_func) strcmp); - - return 0; -} - -int -vcd_obj_add_file (VcdObj *obj, const char iso_pathname[], - VcdDataSource *file, bool raw_flag) -{ - uint32_t size = 0, sectors = 0; - - vcd_assert (obj != NULL); - vcd_assert (file != NULL); - vcd_assert (iso_pathname != NULL); - vcd_assert (strlen (iso_pathname) > 0); - vcd_assert (file != NULL); - - size = vcd_data_source_stat (file); - - /* close file to save file descriptors */ - vcd_data_source_close (file); - - if (raw_flag) - { - if (!size) - { - vcd_error("raw mode2 file must not be empty\n"); - return 1; - } - - sectors = size / M2RAW_SECTOR_SIZE; - - if (size % M2RAW_SECTOR_SIZE) - { - vcd_error("raw mode2 file must have size multiple of %d \n", - M2RAW_SECTOR_SIZE); - return 1; - } - } - else - sectors = _vcd_len2blocks (size, CDIO_CD_FRAMESIZE); - - { - custom_file_t *p; - char *_iso_pathname = _vcd_strdup_upper (iso_pathname); - - if (!iso9660_pathname_valid_p (_iso_pathname)) - { - vcd_error("pathname `%s' is not a valid iso pathname", - _iso_pathname); - free (_iso_pathname); - return 1; - } - - p = _vcd_malloc (sizeof (custom_file_t)); - - p->file = file; - p->iso_pathname = _iso_pathname; - p->raw_flag = raw_flag; - - p->size = size; - p->start_extent = 0; - p->sectors = sectors; - - _cdio_list_append (obj->custom_file_list, p); - } - - return 0; -} - -static void -_finalize_vcd_iso_track_allocation (VcdObj *obj) -{ - int n; - CdioListNode *node; - - uint32_t dir_secs = SECTOR_NIL; - - _dict_clean (obj); - - /* pre-alloc 16 blocks of ISO9660 required silence */ - if (_vcd_salloc (obj->iso_bitmap, 0, 16) == SECTOR_NIL) - vcd_assert_not_reached (); - - /* keep karaoke sectors blank -- well... guess I'm too paranoid :) */ - if (_vcd_salloc (obj->iso_bitmap, 75, 75) == SECTOR_NIL) - vcd_assert_not_reached (); - - /* pre-alloc descriptors, PVD */ - _dict_insert (obj, "pvd", ISO_PVD_SECTOR, 1, SM_EOR); /* EOR */ - /* EVD */ - _dict_insert (obj, "evd", ISO_EVD_SECTOR, 1, SM_EOR|SM_EOF); /* EOR+EOF */ - - /* reserve for iso directory */ - dir_secs = _vcd_salloc (obj->iso_bitmap, 18, 75-18); - - /* VCD information area */ - - _dict_insert (obj, "info", INFO_VCD_SECTOR, 1, SM_EOF); /* INFO.VCD */ /* EOF */ - _dict_insert (obj, "entries", ENTRIES_VCD_SECTOR, 1, SM_EOF); /* ENTRIES.VCD */ /* EOF */ - - /* PBC */ - - if (_vcd_pbc_available (obj)) - { - _dict_insert (obj, "lot", LOT_VCD_SECTOR, LOT_VCD_SIZE, SM_EOF); /* LOT.VCD */ /* EOF */ - _dict_insert (obj, "psd", PSD_VCD_SECTOR, - _vcd_len2blocks (get_psd_size (obj, false), ISO_BLOCKSIZE), SM_EOF); /* PSD.VCD */ /* EOF */ - } - - if (_vcd_obj_has_cap_p (obj, _CAP_4C_SVCD)) - { - _dict_insert (obj, "tracks", SECTOR_NIL, 1, SM_EOF); /* TRACKS.SVD */ - _dict_insert (obj, "search", SECTOR_NIL, - _vcd_len2blocks (get_search_dat_size (obj), ISO_BLOCKSIZE), SM_EOF); /* SEARCH.DAT */ - - vcd_assert (_dict_get_bykey (obj, "tracks")->sector > INFO_VCD_SECTOR); - vcd_assert (_dict_get_bykey (obj, "search")->sector > INFO_VCD_SECTOR); - } - - /* done with primary information area */ - - obj->mpeg_segment_start_extent = - _vcd_len2blocks (_vcd_salloc_get_highest (obj->iso_bitmap) + 1, 75) * 75; - - /* salloc up to end of vcd sector */ - for(n = 0;n < obj->mpeg_segment_start_extent;n++) - _vcd_salloc (obj->iso_bitmap, n, 1); - - vcd_assert (_vcd_salloc_get_highest (obj->iso_bitmap) + 1 == obj->mpeg_segment_start_extent); - - /* insert segments */ - - _CDIO_LIST_FOREACH (node, obj->mpeg_segment_list) - { - mpeg_segment_t *_segment = _cdio_list_node_data (node); - - _segment->start_extent = - _vcd_salloc (obj->iso_bitmap, SECTOR_NIL, - _segment->segment_count * VCDINFO_SEGMENT_SECTOR_SIZE); - - vcd_assert (_segment->start_extent % 75 == 0); - vcd_assert (_vcd_salloc_get_highest (obj->iso_bitmap) + 1 - == _segment->start_extent - + _segment->segment_count * VCDINFO_SEGMENT_SECTOR_SIZE); - } - - obj->ext_file_start_extent = _vcd_salloc_get_highest (obj->iso_bitmap) + 1; - - vcd_assert (obj->ext_file_start_extent % 75 == 0); - - /* go on with EXT area */ - - if (_vcd_obj_has_cap_p (obj, _CAP_4C_SVCD)) - { - _dict_insert (obj, "scandata", SECTOR_NIL, - _vcd_len2blocks (get_scandata_dat_size (obj), - ISO_BLOCKSIZE), - SM_EOF); - } - - if (_vcd_obj_has_cap_p (obj, _CAP_PBC_X) - &&_vcd_pbc_available (obj)) - { - _dict_insert (obj, "lot_x", SECTOR_NIL, LOT_VCD_SIZE, SM_EOF); - - _dict_insert (obj, "psd_x", SECTOR_NIL, - _vcd_len2blocks (get_psd_size (obj, true), ISO_BLOCKSIZE), - SM_EOF); - } - - - obj->custom_file_start_extent = - _vcd_salloc_get_highest (obj->iso_bitmap) + 1; - - /* now for the custom files */ - - _CDIO_LIST_FOREACH (node, obj->custom_file_list) - { - custom_file_t *p = _cdio_list_node_data (node); - - if (p->sectors) - { - p->start_extent = - _vcd_salloc(obj->iso_bitmap, SECTOR_NIL, p->sectors); - vcd_assert (p->start_extent != SECTOR_NIL); - } - else /* zero sized files -- set dummy extent */ - p->start_extent = obj->custom_file_start_extent; - } - - /* calculate iso size -- after this point no sector shall be - allocated anymore */ - - obj->iso_size = - MAX (MIN_ISO_SIZE, _vcd_salloc_get_highest (obj->iso_bitmap) + 1); - - vcd_debug ("iso9660: highest alloced sector is %lu (using %d as isosize)", - (unsigned long int) _vcd_salloc_get_highest (obj->iso_bitmap), - obj->iso_size); - - /* after this point the ISO9660's size is frozen */ -} - -static void -_finalize_vcd_iso_track_filesystem (VcdObj *obj) -{ - int n; - CdioListNode *node; - - /* create filesystem entries */ - - switch (obj->type) { - case VCD_TYPE_VCD: - case VCD_TYPE_VCD11: - case VCD_TYPE_VCD2: - /* add only necessary directories! */ - /* _vcd_directory_mkdir (obj->dir, "CDDA"); */ - /* _vcd_directory_mkdir (obj->dir, "CDI"); */ - _vcd_directory_mkdir (obj->dir, "EXT"); - /* _vcd_directory_mkdir (obj->dir, "KARAOKE"); */ - _vcd_directory_mkdir (obj->dir, "MPEGAV"); - _vcd_directory_mkdir (obj->dir, "VCD"); - - /* add segment dir only when there are actually segment play items */ - if (_cdio_list_length (obj->mpeg_segment_list)) - _vcd_directory_mkdir (obj->dir, "SEGMENT"); - - _vcd_directory_mkfile (obj->dir, "VCD/ENTRIES.VCD", - _dict_get_bykey (obj, "entries")->sector, - ISO_BLOCKSIZE, false, 0); - _vcd_directory_mkfile (obj->dir, "VCD/INFO.VCD", - _dict_get_bykey (obj, "info")->sector, - ISO_BLOCKSIZE, false, 0); - - /* only for vcd2.0 */ - if (_vcd_pbc_available (obj)) - { - _vcd_directory_mkfile (obj->dir, "VCD/LOT.VCD", - _dict_get_bykey (obj, "lot")->sector, - ISO_BLOCKSIZE*LOT_VCD_SIZE, false, 0); - _vcd_directory_mkfile (obj->dir, "VCD/PSD.VCD", - _dict_get_bykey (obj, "psd")->sector, - get_psd_size (obj, false), false, 0); - } - break; - - case VCD_TYPE_SVCD: - case VCD_TYPE_HQVCD: - _vcd_directory_mkdir (obj->dir, "EXT"); - - if (!obj->svcd_vcd3_mpegav) - _vcd_directory_mkdir (obj->dir, "MPEG2"); - else - { - vcd_warn ("adding MPEGAV dir for *DEPRECATED* SVCD VCD30 mode"); - _vcd_directory_mkdir (obj->dir, "MPEGAV"); - } - - /* add segment dir only when there are actually segment play items */ - if (_cdio_list_length (obj->mpeg_segment_list)) - _vcd_directory_mkdir (obj->dir, "SEGMENT"); - - _vcd_directory_mkdir (obj->dir, "SVCD"); - - _vcd_directory_mkfile (obj->dir, "SVCD/ENTRIES.SVD", - _dict_get_bykey (obj, "entries")->sector, - ISO_BLOCKSIZE, false, 0); - _vcd_directory_mkfile (obj->dir, "SVCD/INFO.SVD", - _dict_get_bykey (obj, "info")->sector, - ISO_BLOCKSIZE, false, 0); - - if (_vcd_pbc_available (obj)) - { - _vcd_directory_mkfile (obj->dir, "SVCD/LOT.SVD", - _dict_get_bykey (obj, "lot")->sector, - ISO_BLOCKSIZE*LOT_VCD_SIZE, false, 0); - _vcd_directory_mkfile (obj->dir, "SVCD/PSD.SVD", - _dict_get_bykey (obj, "psd")->sector, - get_psd_size (obj, false), false, 0); - } - - _vcd_directory_mkfile (obj->dir, "SVCD/SEARCH.DAT", - _dict_get_bykey (obj, "search")->sector, - get_search_dat_size (obj), false, 0); - _vcd_directory_mkfile (obj->dir, "SVCD/TRACKS.SVD", - _dict_get_bykey (obj, "tracks")->sector, - ISO_BLOCKSIZE, false, 0); - break; - - default: - vcd_assert_not_reached (); - break; - } - - /* SEGMENTS */ - - n = 1; - _CDIO_LIST_FOREACH (node, obj->mpeg_segment_list) - { - mpeg_segment_t *segment = _cdio_list_node_data (node); - char segment_pathname[128] = { 0, }; - const char *fmt = NULL; - uint8_t fnum = 0; - - switch (obj->type) - { - case VCD_TYPE_VCD2: - fmt = "SEGMENT/ITEM%4.4d.DAT"; - fnum = 1; - break; - case VCD_TYPE_SVCD: - case VCD_TYPE_HQVCD: - fmt = "SEGMENT/ITEM%4.4d.MPG"; - fnum = 0; - break; - default: - vcd_assert_not_reached (); - } - - snprintf (segment_pathname, sizeof (segment_pathname), fmt, n); - - _vcd_directory_mkfile (obj->dir, segment_pathname, segment->start_extent, - segment->info->packets * ISO_BLOCKSIZE, - true, fnum); - - vcd_assert (n <= MAX_SEGMENTS); - - n += segment->segment_count; - } - - /* EXT files */ - - if (_vcd_obj_has_cap_p (obj, _CAP_PBC_X) - &&_vcd_pbc_available (obj)) - { - /* psd_x -- extended PSD */ - _vcd_directory_mkfile (obj->dir, "EXT/PSD_X.VCD", - _dict_get_bykey (obj, "psd_x")->sector, - get_psd_size (obj, true), false, 1); - - /* lot_x -- extended LOT */ - _vcd_directory_mkfile (obj->dir, "EXT/LOT_X.VCD", - _dict_get_bykey (obj, "lot_x")->sector, - ISO_BLOCKSIZE*LOT_VCD_SIZE, false, 1); - - vcd_assert (obj->type == VCD_TYPE_VCD2); - } - - if (_vcd_obj_has_cap_p (obj, _CAP_4C_SVCD)) - { - /* scandata.dat -- scanpoints */ - _vcd_directory_mkfile (obj->dir, "EXT/SCANDATA.DAT", - _dict_get_bykey (obj, "scandata")->sector, - get_scandata_dat_size (obj), false, 0); - } - - /* custom files/dirs */ - _CDIO_LIST_FOREACH (node, obj->custom_dir_list) - { - char *p = _cdio_list_node_data (node); - _vcd_directory_mkdir (obj->dir, p); - } - - _CDIO_LIST_FOREACH (node, obj->custom_file_list) - { - custom_file_t *p = _cdio_list_node_data (node); - - _vcd_directory_mkfile (obj->dir, p->iso_pathname, p->start_extent, - (p->raw_flag - ? (ISO_BLOCKSIZE * (p->size / M2RAW_SECTOR_SIZE)) - : p->size), - p->raw_flag, 1); - } - - - n = 0; - _CDIO_LIST_FOREACH (node, obj->mpeg_sequence_list) - { - char avseq_pathname[128] = { 0, }; - const char *fmt = NULL; - mpeg_sequence_t *_sequence = _cdio_list_node_data (node); - uint32_t extent = _sequence->relative_start_extent; - uint8_t file_num = 0; - - extent += obj->iso_size; - - switch (obj->type) - { - case VCD_TYPE_VCD: - fmt = "MPEGAV/MUSIC%2.2d.DAT"; - file_num = n + 1; - break; - - case VCD_TYPE_VCD11: - case VCD_TYPE_VCD2: - fmt = "MPEGAV/AVSEQ%2.2d.DAT"; - file_num = n + 1; - break; - case VCD_TYPE_SVCD: - case VCD_TYPE_HQVCD: - fmt = "MPEG2/AVSEQ%2.2d.MPG"; - file_num = 0; - - /* if vcd3 compat mode, override */ - if (obj->svcd_vcd3_mpegav) - { - fmt = "MPEGAV/AVSEQ%2.2d.MPG"; - file_num = n + 1; - } - - break; - default: - vcd_assert_not_reached (); - } - - vcd_assert (n < 98); - - snprintf (avseq_pathname, sizeof (avseq_pathname), fmt, n + 1); - - /* file entry contains front margin, mpeg stream and rear margin */ - _vcd_directory_mkfile (obj->dir, avseq_pathname, extent, - (obj->track_front_margin - + _sequence->info->packets - + obj->track_rear_margin) * ISO_BLOCKSIZE, - true, file_num); - - n++; - } - - /* register isofs dir structures */ - { - uint32_t dirs_size = _vcd_directory_get_size (obj->dir); - - /* be sure to stay out of information areas */ - - switch (obj->type) - { - case VCD_TYPE_VCD: - case VCD_TYPE_VCD11: - case VCD_TYPE_VCD2: - /* karaoke area starts at 03:00 */ - if (16 + 2 + dirs_size + 2 >= 75) - vcd_error ("directory section to big for a VCD"); - break; - - case VCD_TYPE_SVCD: - case VCD_TYPE_HQVCD: - /* since no karaoke exists the next fixed area starts at 04:00 */ - if (16 + 2 + dirs_size + 2 >= 150) - vcd_error ("directory section to big for a SVCD"); - break; - default: - vcd_assert_not_reached (); - } - - /* un-alloc small area */ - - _vcd_salloc_free (obj->iso_bitmap, 18, dirs_size + 2); - - /* alloc it again! */ - - _dict_insert (obj, "dir", 18, dirs_size, SM_EOR|SM_EOF); - _dict_insert (obj, "ptl", 18 + dirs_size, 1, SM_EOR|SM_EOF); - _dict_insert (obj, "ptm", 18 + dirs_size + 1, 1, SM_EOR|SM_EOF); - } -} - -static void -_finalize_vcd_iso_track (VcdObj *obj) -{ - _vcd_pbc_finalize (obj); - _finalize_vcd_iso_track_allocation (obj); - _finalize_vcd_iso_track_filesystem (obj); -} - -static int -_callback_wrapper (VcdObj *obj, int force) -{ - const int cb_frequency = 75; - - if (obj->last_cb_call + cb_frequency > obj->sectors_written && !force) - return 0; - - obj->last_cb_call = obj->sectors_written; - - if (obj->progress_callback) { - progress_info_t _pi; - - _pi.sectors_written = obj->sectors_written; - _pi.total_sectors = obj->relative_end_extent + obj->iso_size; - _pi.in_track = obj->in_track; - _pi.total_tracks = _cdio_list_length (obj->mpeg_sequence_list) + 1; - - return obj->progress_callback (&_pi, obj->callback_user_data); - } - else - return 0; -} - -static int -_write_m2_image_sector (VcdObj *obj, const void *data, uint32_t extent, - uint8_t fnum, uint8_t cnum, uint8_t sm, uint8_t ci) -{ - char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; - - vcd_assert (extent == obj->sectors_written); - - _vcd_make_mode2(buf, data, extent, fnum, cnum, sm, ci); - - vcd_image_sink_write (obj->image_sink, buf, extent); - - obj->sectors_written++; - - return _callback_wrapper (obj, false); -} - -static int -_write_m2_raw_image_sector (VcdObj *obj, const void *data, uint32_t extent) -{ - char buf[CDIO_CD_FRAMESIZE_RAW] = { 0, }; - - vcd_assert (extent == obj->sectors_written); - - _vcd_make_raw_mode2(buf, data, extent); - - vcd_image_sink_write (obj->image_sink, buf, extent); - - obj->sectors_written++; - - return _callback_wrapper (obj, false); -} - -static void -_write_source_mode2_raw (VcdObj *obj, VcdDataSource *source, uint32_t extent) -{ - int n; - uint32_t sectors; - - sectors = vcd_data_source_stat (source) / M2RAW_SECTOR_SIZE; - - vcd_data_source_seek (source, 0); - - for (n = 0;n < sectors;n++) { - char buf[M2RAW_SECTOR_SIZE] = { 0, }; - - vcd_data_source_read (source, buf, M2RAW_SECTOR_SIZE, 1); - - if (_write_m2_raw_image_sector (obj, buf, extent+n)) - break; - } - - vcd_data_source_close (source); -} - -static void -_write_source_mode2_form1 (VcdObj *obj, VcdDataSource *source, uint32_t extent) -{ - int n; - uint32_t sectors, size, last_block_size; - - size = vcd_data_source_stat (source); - - sectors = _vcd_len2blocks (size, CDIO_CD_FRAMESIZE); - - last_block_size = size % CDIO_CD_FRAMESIZE; - if (!last_block_size) - last_block_size = CDIO_CD_FRAMESIZE; - - vcd_data_source_seek (source, 0); - - for (n = 0;n < sectors;n++) { - char buf[CDIO_CD_FRAMESIZE] = { 0, }; - - vcd_data_source_read (source, buf, - ((n + 1 == sectors) - ? last_block_size - : CDIO_CD_FRAMESIZE), 1); - - if (_write_m2_image_sector (obj, buf, extent+n, 1, 0, - ((n+1 < sectors) - ? SM_DATA - : SM_DATA |SM_EOF), - 0)) - break; - } - - vcd_data_source_close (source); -} - -static int -_write_sequence (VcdObj *obj, int track_idx) -{ - mpeg_sequence_t *track = - _cdio_list_node_data (_vcd_list_at (obj->mpeg_sequence_list, track_idx)); - CdioListNode *pause_node; - int n, lastsect = obj->sectors_written; - char buf[2324]; - struct { - int audio; - int video; - int zero; - int ogt; - int unknown; - } mpeg_packets = {0, }; - - - { - char *norm_str = NULL; - const struct vcd_mpeg_stream_vid_info *_info = &track->info->shdr[0]; - - switch (vcd_mpeg_get_norm (_info)) { - case MPEG_NORM_PAL: - norm_str = strdup ("PAL SIF (352x288/25fps)"); - break; - case MPEG_NORM_NTSC: - norm_str = strdup ("NTSC SIF (352x240/29.97fps)"); - break; - case MPEG_NORM_FILM: - norm_str = strdup ("FILM SIF (352x240/24fps)"); - break; - case MPEG_NORM_PAL_S: - norm_str = strdup ("PAL 2/3 D1 (480x576/25fps)"); - break; - case MPEG_NORM_NTSC_S: - norm_str = strdup ("NTSC 2/3 D1 (480x480/29.97fps)"); - break; - - case MPEG_NORM_OTHER: - { - char buf[1024] = { 0, }; - switch (_info->vsize) - { - case 480: - case 240: - snprintf (buf, sizeof (buf), "NTSC UNKNOWN (%dx%d/%2.2ffps)", - _info->hsize, _info->vsize, _info->frate); - break; - case 288: - case 576: - snprintf (buf, sizeof (buf), "PAL UNKNOWN (%dx%d/%2.2ffps)", - _info->hsize, _info->vsize, _info->frate); - break; - default: - snprintf (buf, sizeof (buf), "UNKNOWN (%dx%d/%2.2ffps)", - _info->hsize, _info->vsize, _info->frate); - break; - } - norm_str = strdup (buf); - } - break; - } - - { - char buf[1024] = { 0, }, buf2[1024] = { 0, }; - int i; - - for (i = 0; i < 3; i++) - if (track->info->ahdr[i].seen) - { - const char *_mode_str[] = { - 0, - "stereo", - "jstereo", - "dual", - "single", - 0 - }; - - snprintf (buf, sizeof (buf), "audio[%d]: l%d/%2.1fkHz/%dkbps/%s ", - i, - track->info->ahdr[i].layer, - track->info->ahdr[i].sampfreq / 1000.0, - track->info->ahdr[i].bitrate / 1024, - _mode_str[track->info->ahdr[i].mode]); - - strncat (buf2, buf, sizeof(buf2) - strlen(buf2) - 1); - } - - vcd_info ("writing track %d, %s, %s, %s...", track_idx + 2, - (track->info->version == MPEG_VERS_MPEG1 ? "MPEG1" : "MPEG2"), - norm_str, buf2); - } - - free (norm_str); - } - - for (n = 0; n < obj->track_pregap; n++) - _write_m2_image_sector (obj, zero, lastsect++, 0, 0, SM_FORM2, 0); - - for (n = 0; n < obj->track_front_margin;n++) - _write_m2_image_sector (obj, zero, lastsect++, track_idx + 1, - 0, SM_FORM2|SM_REALT, 0); - - pause_node = _cdio_list_begin (track->pause_list); - - for (n = 0; n < track->info->packets; n++) { - int ci = 0, sm = 0, cnum = 0, fnum = 0; - struct vcd_mpeg_packet_info pkt_flags; - bool set_trigger = false; - - vcd_mpeg_source_get_packet (track->source, n, buf, &pkt_flags, - obj->update_scan_offsets); - - while (pause_node) - { - pause_t *_pause = _cdio_list_node_data (pause_node); - - if (!pkt_flags.has_pts) - break; /* no pts */ - - if (pkt_flags.pts < _pause->time) - break; /* our time has not come yet */ - - /* seems it's time to trigger! */ - set_trigger = true; - - vcd_debug ("setting auto pause trigger for time %f (pts %f) @%d", - _pause->time, pkt_flags.pts, n); - - pause_node = _cdio_list_node_next (pause_node); - } - - switch (vcd_mpeg_packet_get_type (&pkt_flags)) - { - case PKT_TYPE_VIDEO: - mpeg_packets.video++; - sm = SM_FORM2|SM_REALT|SM_VIDEO; - ci = CI_VIDEO; - cnum = CN_VIDEO; - break; - - case PKT_TYPE_OGT: - mpeg_packets.ogt++; - sm = SM_FORM2|SM_REALT|SM_VIDEO; - ci = CI_OGT; - cnum = CN_OGT; - break; - - case PKT_TYPE_AUDIO: - mpeg_packets.audio++; - sm = SM_FORM2|SM_REALT|SM_AUDIO; - ci = CI_AUDIO; - cnum = CN_AUDIO; - if (pkt_flags.audio[1] || pkt_flags.audio[2]) - { - ci = CI_AUDIO2; - cnum = CN_AUDIO2; - } - break; - - - case PKT_TYPE_ZERO: - mpeg_packets.zero++; - mpeg_packets.unknown--; - case PKT_TYPE_EMPTY: - mpeg_packets.unknown++; - sm = SM_FORM2|SM_REALT; - ci = CI_EMPTY; - cnum = CN_EMPTY; - break; - - case PKT_TYPE_INVALID: - vcd_error ("invalid mpeg packet found at packet# %d" - " -- please fix this mpeg file!", n); - vcd_mpeg_source_close (track->source); - return 1; - break; - - default: - vcd_assert_not_reached (); - } - - if (n == track->info->packets - 1) - { - sm |= SM_EOR; - if (!obj->track_rear_margin) /* if no rear margin... */ - sm |= SM_EOF; - } - - if (set_trigger) - sm |= SM_TRIG; - - fnum = track_idx + 1; - - if (_vcd_obj_has_cap_p (obj, _CAP_4C_SVCD) - && !obj->svcd_vcd3_mpegav) /* IEC62107 SVCDs have a - simplified subheader */ - { - fnum = 1; - ci = CI_MPEG2; - } - - if (_write_m2_image_sector (obj, buf, lastsect++, fnum, cnum, sm, ci)) - break; - } - - vcd_mpeg_source_close (track->source); - - for (n = 0; n < obj->track_rear_margin; n++) - { - const uint8_t ci = 0, cnum = 0; - uint8_t fnum = track_idx + 1; - uint8_t sm = SM_FORM2 | SM_REALT; - - if (n + 1 == obj->track_rear_margin) - sm |= SM_EOF; - - _write_m2_image_sector (obj, zero, lastsect++, fnum, cnum, sm, ci); - } - - vcd_debug ("MPEG packet statistics: %d video, %d audio, %d zero, %d ogt, %d unknown", - mpeg_packets.video, mpeg_packets.audio, mpeg_packets.zero, mpeg_packets.ogt, - mpeg_packets.unknown); - - return 0; -} - -static int -_write_segment (VcdObj *obj, mpeg_segment_t *_segment) -{ - CdioListNode *pause_node; - unsigned packet_no; - int n = obj->sectors_written; - - vcd_assert (_segment->start_extent == n); - - pause_node = _cdio_list_begin (_segment->pause_list); - - for (packet_no = 0; - packet_no < (_segment->segment_count * VCDINFO_SEGMENT_SECTOR_SIZE); - packet_no++) - { - uint8_t buf[M2F2_SECTOR_SIZE] = { 0, }; - uint8_t fn, cn, sm, ci; - - if (packet_no < _segment->info->packets) - { - struct vcd_mpeg_packet_info pkt_flags; - bool set_trigger = false; - bool _need_eor = false; - - vcd_mpeg_source_get_packet (_segment->source, packet_no, - buf, &pkt_flags, obj->update_scan_offsets); - - fn = 1; - cn = CN_EMPTY; - sm = SM_FORM2 | SM_REALT; - ci = CI_EMPTY; - - while (pause_node) - { - pause_t *_pause = _cdio_list_node_data (pause_node); - - if (!pkt_flags.has_pts) - break; /* no pts */ - - if (pkt_flags.pts < _pause->time) - break; /* our time has not come yet */ - - /* seems it's time to trigger! */ - set_trigger = true; - - vcd_debug ("setting auto pause trigger for time %f (pts %f) @%d", - _pause->time, pkt_flags.pts, n); - - pause_node = _cdio_list_node_next (pause_node); - } - - switch (vcd_mpeg_packet_get_type (&pkt_flags)) - { - case PKT_TYPE_VIDEO: - sm = SM_FORM2 | SM_REALT | SM_VIDEO; - - ci = CI_VIDEO; - cn = CN_VIDEO; - - if (pkt_flags.video[1]) - ci = CI_STILL, cn = CN_STILL; - else if (pkt_flags.video[2]) - ci = CI_STILL2, cn = CN_STILL2; - - if (pkt_flags.video[1] || pkt_flags.video[2]) - { /* search for endcode -- hack */ - int idx; - - for (idx = 0; idx <= 2320; idx++) - if (buf[idx] == 0x00 - && buf[idx + 1] == 0x00 - && buf[idx + 2] == 0x01 - && buf[idx + 3] == 0xb7) - { - _need_eor = true; - break; - } - } - break; - - case PKT_TYPE_AUDIO: - sm = SM_FORM2 | SM_REALT | SM_AUDIO; - - ci = CI_AUDIO; - cn = CN_AUDIO; - break; - - case PKT_TYPE_EMPTY: - ci = CI_EMPTY; - cn = CN_EMPTY; - break; - - default: - /* fixme -- check.... */ - break; - } - - if (_vcd_obj_has_cap_p (obj, _CAP_4C_SVCD)) - { - cn = 1; - sm = SM_FORM2 | SM_REALT | SM_VIDEO; - ci = CI_MPEG2; - } - - if (packet_no + 1 == _segment->info->packets) - sm |= SM_EOF; - - if (set_trigger) - sm |= SM_TRIG; - - if (_need_eor) - { - vcd_debug ("setting EOR for SeqEnd at packet# %d ('%s')", - packet_no, _segment->id); - sm |= SM_EOR; - } - } - else - { - fn = 1; - cn = CN_EMPTY; - sm = SM_FORM2 | SM_REALT; - ci = CI_EMPTY; - - if (_vcd_obj_has_cap_p (obj, _CAP_4C_SVCD)) - { - fn = 0; - sm = SM_FORM2; - } - - } - - _write_m2_image_sector (obj, buf, n, fn, cn, sm, ci); - - n++; - } - - vcd_mpeg_source_close (_segment->source); - - return 0; -} - -static uint32_t -_get_closest_aps (const struct vcd_mpeg_stream_info *_mpeg_info, double t, - struct aps_data *_best_aps) -{ - CdioListNode *node; - struct aps_data best_aps; - bool first = true; - - vcd_assert (_mpeg_info != NULL); - vcd_assert (_mpeg_info->shdr[0].aps_list != NULL); - - _CDIO_LIST_FOREACH (node, _mpeg_info->shdr[0].aps_list) - { - struct aps_data *_aps = _cdio_list_node_data (node); - - if (first) - { - best_aps = *_aps; - first = false; - } - else if (fabs (_aps->timestamp - t) < fabs (best_aps.timestamp - t)) - best_aps = *_aps; - else - break; - } - - if (_best_aps) - *_best_aps = best_aps; - - return best_aps.packet_no; -} - -static void -_update_entry_points (VcdObj *obj) -{ - CdioListNode *sequence_node; - - _CDIO_LIST_FOREACH (sequence_node, obj->mpeg_sequence_list) - { - mpeg_sequence_t *_sequence = _cdio_list_node_data (sequence_node); - CdioListNode *entry_node; - unsigned last_packet_no = 0; - - _CDIO_LIST_FOREACH (entry_node, _sequence->entry_list) - { - entry_t *_entry = _cdio_list_node_data (entry_node); - - _get_closest_aps (_sequence->info, _entry->time, &_entry->aps); - - vcd_log ((fabs (_entry->aps.timestamp - _entry->time) > 1 - ? VCD_LOG_WARN - : VCD_LOG_DEBUG), - "requested entry point (id=%s) at %f, " - "closest possible entry point at %f", - _entry->id, _entry->time, _entry->aps.timestamp); - - if (last_packet_no == _entry->aps.packet_no) - vcd_warn ("entry point '%s' falls into same sector as previous one!", - _entry->id); - - last_packet_no = _entry->aps.packet_no; - } - } -} - -static int -_write_vcd_iso_track (VcdObj *obj, const time_t *create_time) -{ - CdioListNode *node; - int n; - - /* generate dir sectors */ - - _vcd_directory_dump_entries (obj->dir, - _dict_get_bykey (obj, "dir")->buf, - _dict_get_bykey (obj, "dir")->sector); - - _vcd_directory_dump_pathtables (obj->dir, - _dict_get_bykey (obj, "ptl")->buf, - _dict_get_bykey (obj, "ptm")->buf); - - /* generate PVD and EVD at last... */ - iso9660_set_pvd (_dict_get_bykey (obj, "pvd")->buf, - obj->iso_volume_label, - obj->iso_publisher_id, - obj->iso_preparer_id, - obj->iso_application_id, - obj->iso_size, - _dict_get_bykey (obj, "dir")->buf, - _dict_get_bykey (obj, "ptl")->sector, - _dict_get_bykey (obj, "ptm")->sector, - iso9660_pathtable_get_size (_dict_get_bykey (obj, "ptm")->buf), - create_time -); - - iso9660_set_evd (_dict_get_bykey (obj, "evd")->buf); - - /* fill VCD relevant files with data */ - - set_info_vcd (obj, _dict_get_bykey (obj, "info")->buf); - set_entries_vcd (obj, _dict_get_bykey (obj, "entries")->buf); - - if (_vcd_pbc_available (obj)) - { - if (_vcd_obj_has_cap_p (obj, _CAP_PBC_X)) - { - set_lot_vcd (obj, _dict_get_bykey (obj, "lot_x")->buf, true); - set_psd_vcd (obj, _dict_get_bykey (obj, "psd_x")->buf, true); - } - - _vcd_pbc_check_unreferenced (obj); - - set_lot_vcd (obj, _dict_get_bykey (obj, "lot")->buf, false); - set_psd_vcd (obj, _dict_get_bykey (obj, "psd")->buf, false); - } - - if (_vcd_obj_has_cap_p (obj, _CAP_4C_SVCD)) - { - set_tracks_svd (obj, _dict_get_bykey (obj, "tracks")->buf); - set_search_dat (obj, _dict_get_bykey (obj, "search")->buf); - set_scandata_dat (obj, _dict_get_bykey (obj, "scandata")->buf); - } - - /* start actually writing stuff */ - - vcd_info ("writing track 1 (ISO9660)..."); - - /* 00:02:00 -> 00:04:74 */ - for (n = 0;n < obj->mpeg_segment_start_extent; n++) - { - const void *content = NULL; - uint8_t flags = SM_DATA; - - content = _dict_get_sector (obj, n); - flags |= _dict_get_sector_flags (obj, n); - - if (content == NULL) - content = zero; - - _write_m2_image_sector (obj, content, n, 0, 0, flags, 0); - } - - /* SEGMENTS */ - - vcd_assert (n == obj->mpeg_segment_start_extent); - - _CDIO_LIST_FOREACH (node, obj->mpeg_segment_list) - { - mpeg_segment_t *_segment = _cdio_list_node_data (node); - - _write_segment (obj, _segment); - } - - n = obj->sectors_written; - - /* EXT stuff */ - - vcd_assert (n == obj->ext_file_start_extent); - - for (;n < obj->custom_file_start_extent; n++) - { - const void *content = NULL; - uint8_t flags = SM_DATA; - uint8_t fileno = _vcd_obj_has_cap_p (obj, _CAP_4C_SVCD) ? 0 : 1; - - content = _dict_get_sector (obj, n); - flags |= _dict_get_sector_flags (obj, n); - - if (content == NULL) - { - vcd_debug ("unexpected empty EXT sector"); - content = zero; - } - - _write_m2_image_sector (obj, content, n, fileno, 0, flags, 0); - } - - /* write custom files */ - - vcd_assert (n == obj->custom_file_start_extent); - - _CDIO_LIST_FOREACH (node, obj->custom_file_list) - { - custom_file_t *p = _cdio_list_node_data (node); - - vcd_info ("writing file `%s' (%lu bytes%s)", - p->iso_pathname, (unsigned long) p->size, - p->raw_flag ? ", raw sectors file": ""); - if (p->raw_flag) - _write_source_mode2_raw (obj, p->file, p->start_extent); - else - _write_source_mode2_form1 (obj, p->file, p->start_extent); - } - - /* blank unalloced tracks */ - while ((n = _vcd_salloc (obj->iso_bitmap, SECTOR_NIL, 1)) < obj->iso_size) - _write_m2_image_sector (obj, zero, n, 0, 0, SM_DATA, 0); - - return 0; -} - - -long -vcd_obj_get_image_size (VcdObj *obj) -{ - long size_sectors = -1; - - vcd_assert (!obj->in_output); - - if (_cdio_list_length (obj->mpeg_sequence_list) > 0) - { - /* fixme -- make this efficient */ - size_sectors = vcd_obj_begin_output (obj); - vcd_obj_end_output (obj); - } - - return size_sectors; -} - -long -vcd_obj_begin_output (VcdObj *obj) -{ - uint32_t image_size; - - vcd_assert (obj != NULL); - vcd_assert (_cdio_list_length (obj->mpeg_sequence_list) > 0); - - vcd_assert (!obj->in_output); - obj->in_output = true; - - obj->in_track = 1; - obj->sectors_written = 0; - - obj->iso_bitmap = _vcd_salloc_new (); - - obj->dir = _vcd_directory_new (); - - obj->buffer_dict_list = _cdio_list_new (); - - _finalize_vcd_iso_track (obj); - - _update_entry_points (obj); - - image_size = obj->relative_end_extent + obj->iso_size; - - image_size += obj->leadout_pregap; - - if (image_size > CDIO_CD_MAX_SECTORS) - vcd_error ("image too big (%d sectors > %d sectors)", - (unsigned) image_size, (unsigned) CDIO_CD_MAX_SECTORS); - - { - char *_tmp = cdio_lba_to_msf_str (image_size); - - if (image_size > CDIO_CD_74MIN_SECTORS) - vcd_warn ("generated image (%d sectors [%s]) may not fit " - "on 74min CDRs (%d sectors)", - (unsigned) image_size, _tmp, (unsigned) CDIO_CD_74MIN_SECTORS); - - free (_tmp); - } - - return image_size; -} - - -void -vcd_obj_end_output (VcdObj *obj) -{ - vcd_assert (obj != NULL); - - vcd_assert (obj->in_output); - obj->in_output = false; - - _vcd_directory_destroy (obj->dir); - _vcd_salloc_destroy (obj->iso_bitmap); - - _dict_clean (obj); - _cdio_list_free (obj->buffer_dict_list, true); -} - -int -vcd_obj_append_pbc_node (VcdObj *obj, struct _pbc_t *_pbc) -{ - vcd_assert (obj != NULL); - vcd_assert (_pbc != NULL); - - if (!_vcd_obj_has_cap_p (obj, _CAP_PBC)) - { - vcd_error ("PBC not supported for current VCD type"); - return -1; - } - - if (_pbc->item_id && _vcd_pbc_lookup (obj, _pbc->item_id)) - { - vcd_error ("item id (%s) exists already", _pbc->item_id); - return -1; - } - - _cdio_list_append (obj->pbc_list, _pbc); - - return 0; -} - -int -vcd_obj_write_image (VcdObj *obj, VcdImageSink *image_sink, - progress_callback_t callback, void *user_data, - const time_t *create_time) -{ - CdioListNode *node; - - vcd_assert (obj != NULL); - vcd_assert (obj->in_output); - - if (!image_sink) - return -1; - - /* start with meta info */ - - { - CdioList *cue_list; - vcd_cue_t *_cue; - - cue_list = _cdio_list_new (); - - _cdio_list_append (cue_list, (_cue = _vcd_malloc (sizeof (vcd_cue_t)))); - - _cue->lsn = 0; - _cue->type = VCD_CUE_TRACK_START; - - _CDIO_LIST_FOREACH (node, obj->mpeg_sequence_list) - { - mpeg_sequence_t *track = _cdio_list_node_data (node); - CdioListNode *entry_node; - - _cdio_list_append (cue_list, - (_cue = _vcd_malloc (sizeof (vcd_cue_t)))); - - _cue->lsn = track->relative_start_extent + obj->iso_size; - _cue->lsn -= obj->track_pregap; - _cue->type = VCD_CUE_PREGAP_START; - - _cdio_list_append (cue_list, - (_cue = _vcd_malloc (sizeof (vcd_cue_t)))); - - _cue->lsn = track->relative_start_extent + obj->iso_size; - _cue->type = VCD_CUE_TRACK_START; - - _CDIO_LIST_FOREACH (entry_node, track->entry_list) - { - entry_t *_entry = _cdio_list_node_data (entry_node); - - _cdio_list_append (cue_list, - (_cue = _vcd_malloc (sizeof (vcd_cue_t)))); - - _cue->lsn = obj->iso_size; - _cue->lsn += track->relative_start_extent; - _cue->lsn += obj->track_front_margin; - _cue->lsn += _entry->aps.packet_no; - - _cue->type = VCD_CUE_SUBINDEX; - } - } - - /* add last one... */ - - _cdio_list_append (cue_list, (_cue = _vcd_malloc (sizeof (vcd_cue_t)))); - - _cue->lsn = obj->relative_end_extent + obj->iso_size; - - _cue->lsn += obj->leadout_pregap; - - _cue->type = VCD_CUE_END; - - /* send it to image object */ - - vcd_image_sink_set_cuesheet (image_sink, cue_list); - - _cdio_list_free (cue_list, true); - } - - /* and now for the pay load */ - - { - unsigned track; - - vcd_assert (obj != NULL); - vcd_assert (obj->sectors_written == 0); - - vcd_assert (obj->in_output); - - obj->progress_callback = callback; - obj->callback_user_data = user_data; - obj->image_sink = image_sink; - - if (_callback_wrapper (obj, true)) - return 1; - - if (_write_vcd_iso_track (obj, create_time)) - return 1; - - if (obj->update_scan_offsets) - vcd_info ("'update scan offsets' option enabled for the following tracks!"); - - for (track = 0;track < _cdio_list_length (obj->mpeg_sequence_list);track++) - { - obj->in_track++; - - if (_callback_wrapper (obj, true)) - return 1; - - if (_write_sequence (obj, track)) - return 1; - } - - if (obj->leadout_pregap) - { - int n, lastsect = obj->sectors_written; - - vcd_debug ("writting post-gap ('leadout pregap')..."); - - for (n = 0; n < obj->leadout_pregap; n++) - _write_m2_image_sector (obj, zero, lastsect++, 0, 0, SM_FORM2, 0); - } - - if (_callback_wrapper (obj, true)) - return 1; - - obj->image_sink = NULL; - - vcd_image_sink_destroy (image_sink); - - return 0; /* ok */ - } -} - -const char * -vcd_version_string (bool full_text) -{ - if (!full_text) - return ("GNU VCDImager " VERSION " [" HOST_ARCH "]"); - - return ("%s (GNU VCDImager) " VERSION "\n" - "Written by Herbert Valerio Riedel and Rocky Bernstein.\n" - "\n" - "http://www.gnu.org/software/vcdimager/\n" - "\n" - "Copyright (C) 2000-2003 Herbert Valerio Riedel <hvr@gnu.org>\n" - " 2003 Rocky Bernstein <rocky@panix.com>\n" - "\n" - "This is free software; see the source for copying conditions. There is NO\n" - "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"); -} - - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/vcd.h b/src/input/vcd/libvcd/vcd.h deleted file mode 100644 index 7c001d282..000000000 --- a/src/input/vcd/libvcd/vcd.h +++ /dev/null @@ -1,176 +0,0 @@ -/* - $Id: vcd.h,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -/* libvcd main header */ - -#ifndef __VCD_H__ -#define __VCD_H__ - -/* Private headers */ -#include "image_sink.h" -#include "mpeg_stream.h" -#include "stream.h" - -#include <libvcd/types.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* allocates and initializes a new VideoCD object */ -VcdObj * -vcd_obj_new (vcd_type_t vcd_type); - -/* VideoCD parameters */ -typedef enum { - VCD_PARM_INVALID = 0, - VCD_PARM_VOLUME_ID, /* char * max length 32 */ - VCD_PARM_PUBLISHER_ID, /* char * max length 128 */ - VCD_PARM_PREPARER_ID, /* char * max length 128 */ - VCD_PARM_ALBUM_ID, /* char * max length 16 */ - VCD_PARM_VOLUME_COUNT, /* unsigned [1..65535] */ - VCD_PARM_VOLUME_NUMBER, /* unsigned [0..65535] */ - VCD_PARM_RESTRICTION, /* unsigned [0..3] */ - VCD_PARM_NEXT_VOL_LID2, /* bool */ - VCD_PARM_NEXT_VOL_SEQ2, /* bool */ - VCD_PARM_APPLICATION_ID, /* char * max length 128 */ - VCD_PARM_SEC_TYPE, /* unsigned [2336, 2352] */ - VCD_PARM_SVCD_VCD3_MPEGAV, /* bool */ - VCD_PARM_SVCD_VCD3_ENTRYSVD, /* bool */ - VCD_PARM_SVCD_VCD3_TRACKSVD, /* bool */ - VCD_PARM_UPDATE_SCAN_OFFSETS, /* bool */ - VCD_PARM_RELAXED_APS, /* bool */ - VCD_PARM_LEADOUT_PAUSE, /* bool */ - VCD_PARM_LEADOUT_PREGAP, /* unsigned [0..300] */ - VCD_PARM_TRACK_PREGAP, /* unsigned [1..300] */ - VCD_PARM_TRACK_FRONT_MARGIN, /* unsigned [0..150] */ - VCD_PARM_TRACK_REAR_MARGIN /* unsigned [0..150] */ -} vcd_parm_t; - -/* sets VideoCD parameter */ -int -vcd_obj_set_param_uint (VcdObj *obj, vcd_parm_t param, unsigned arg); - -int -vcd_obj_set_param_str (VcdObj *obj, vcd_parm_t param, const char *arg); - -int -vcd_obj_set_param_bool (VcdObj *obj, vcd_parm_t param, bool arg); - -/* add custom files; if raw_flag set, the data source has to include a - mode2 subheader, and thus needs to be a multiple of 2336 byte blocksize */ -int -vcd_obj_add_file (VcdObj *obj, const char iso_pathname[], - VcdDataSource *file, bool raw_flag); - -int -vcd_obj_add_dir (VcdObj *obj, const char iso_pathname[]); - -/* this is for actually adding mpeg items to VCD, returns - a negative value for error.. */ - -int -vcd_obj_append_sequence_play_item (VcdObj *obj, VcdMpegSource *mpeg_source, - const char item_id[], - const char default_entry_id[]); - -int -vcd_obj_add_sequence_entry (VcdObj *obj, const char sequence_id[], - double entry_time, const char entry_id[]); - -int -vcd_obj_add_sequence_pause (VcdObj *obj, const char sequence_id[], - double pause_timestamp, const char pause_id[]); - -int -vcd_obj_add_segment_pause (VcdObj *obj, const char segment_id[], - double pause_timestamp, const char pause_id[]); - -int -vcd_obj_append_segment_play_item (VcdObj *obj, VcdMpegSource *mpeg_source, - const char item_id[]); - -/* warning -- api will change for pbc */ -typedef struct _pbc_t pbc_t; - -int -vcd_obj_append_pbc_node (VcdObj *obj, struct _pbc_t *_pbc); - -/* removes item (sequence, entry, segment, ...) by id, returns - negative value on error */ -int -vcd_obj_remove_item (VcdObj *obj, const char id[]); - -/* returns image size in sectors */ -long -vcd_obj_get_image_size (VcdObj *obj); - -/* this one is to be called when every parameter has been set and the - image is about to be written. returns sectors to be written... */ -long -vcd_obj_begin_output (VcdObj *obj); - -/* callback hook called every few (>|<) iterations, if it returns a value != 0 - the writing process gets aborted */ -typedef struct -{ - long sectors_written; - long total_sectors; - int in_track; - int total_tracks; -} -progress_info_t; - -typedef int (*progress_callback_t) (const progress_info_t *progress_info, - void *user_data); - -/* writes the actual bin image file; a return value != 0 means the - action was aborted by user or some other error has occured... */ -int -vcd_obj_write_image (VcdObj *obj, VcdImageSink *image_sink, - progress_callback_t callback, void *user_data, - const time_t *create_time); - -/* this should be called writing the bin and/or cue file is done---even if - an error occurred */ -void -vcd_obj_end_output (VcdObj *obj); - -/* destructor for VideoCD objects; call this to destory a VideoCD - object created by vcd_obj_new () */ -void -vcd_obj_destroy (VcdObj *obj); - -const char * -vcd_version_string (bool full_text); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __VCD_H__ */ - -/* - * Local variables: - * c-file-style: "gnu" - * tab-width: 8 - * indent-tabs-mode: nil - * End: - */ diff --git a/src/input/vcd/libvcd/vcd_assert.h b/src/input/vcd/libvcd/vcd_assert.h deleted file mode 100644 index c096b3677..000000000 --- a/src/input/vcd/libvcd/vcd_assert.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - $Id: vcd_assert.h,v 1.1 2004/04/11 12:20:32 miguelfreitas Exp $ - - Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org> - - 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 -*/ - -#ifndef __VCD_ASSERT_H__ -#define __VCD_ASSERT_H__ - -#if defined(__GNUC__) - -#include <libvcd/types.h> -#include <libvcd/logging.h> - -#define vcd_assert(expr) \ - { \ - if (GNUC_UNLIKELY (!(expr))) vcd_log (VCD_LOG_ASSERT, \ - "file %s: line %d (%s): assertion failed: (%s)", \ - __FILE__, __LINE__, __PRETTY_FUNCTION__, #expr); \ - } - -#define vcd_assert_not_reached() \ - { \ - vcd_log (VCD_LOG_ASSERT, \ - "file %s: line %d (%s): should not be reached", \ - __FILE__, __LINE__, __PRETTY_FUNCTION__); \ - } - -#else /* non GNU C */ - -#include <assert.h> - -#define vcd_assert(expr) \ - assert(expr) - -#define vcd_assert_not_reached() \ - assert(0) - -#endif - -#endif /* __VCD_ASSERT_H__ */ diff --git a/src/input/vcd/libvcd/vcd_read.c b/src/input/vcd/libvcd/vcd_read.c deleted file mode 100644 index dd9d30cfa..000000000 --- a/src/input/vcd/libvcd/vcd_read.c +++ /dev/null @@ -1,108 +0,0 @@ -/* - $Id: vcd_read.c,v 1.4 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2001,2003 Herbert Valerio Riedel <hvr@gnu.org> - Copyright (C) 2003 Rocky Bernstein <rocky@gnu.org> - - 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 -*/ - - -#include "vcd_read.h" -#include "vcd_assert.h" -#include <libvcd/inf.h> -#include <libvcd/files.h> -#include <libvcd/logging.h> - -#ifdef HAVE_STRING_H -#include <string.h> -#endif - -bool -read_pvd(CdIo *cdio, iso9660_pvd_t *pvd) -{ - if (cdio_read_mode2_sector (cdio, pvd, ISO_PVD_SECTOR, false)) { - vcd_error ("error reading PVD sector (%d)", ISO_PVD_SECTOR); - return false; - } - - if (pvd->type != ISO_VD_PRIMARY) { - vcd_error ("unexpected PVD type %d", pvd->type); - return false; - } - - if (strncmp (pvd->id, ISO_STANDARD_ID, strlen (ISO_STANDARD_ID))) - { - vcd_error ("unexpected ID encountered (expected `" - ISO_STANDARD_ID "', got `%.5s'", pvd->id); - return false; - } - return true; -} - -bool -read_entries(CdIo *cdio, EntriesVcd_t *entries) -{ - if (cdio_read_mode2_sector (cdio, entries, ENTRIES_VCD_SECTOR, false)) { - vcd_error ("error reading Entries sector (%d)", ENTRIES_VCD_SECTOR); - return false; - } - - /* analyze signature/type */ - - if (!strncmp (entries->ID, ENTRIES_ID_VCD, sizeof (entries->ID))) - return true; - else if (!strncmp (entries->ID, "ENTRYSVD", sizeof (entries->ID))) { - vcd_warn ("found (non-compliant) SVCD ENTRIES.SVD signature"); - return true; - } else { - vcd_error ("unexpected ID signature encountered `%.8s'", entries->ID); - return false; - } -} - -bool -read_info(CdIo *cdio, InfoVcd_t *info, vcd_type_t *vcd_type) -{ - if (cdio_read_mode2_sector (cdio, info, INFO_VCD_SECTOR, false)) { - vcd_error ("error reading Info sector (%d)", INFO_VCD_SECTOR); - return false; - } - - *vcd_type = vcd_files_info_detect_type (info); - - /* analyze signature/type */ - - switch (*vcd_type) - { - case VCD_TYPE_VCD: - case VCD_TYPE_VCD11: - case VCD_TYPE_VCD2: - case VCD_TYPE_SVCD: - case VCD_TYPE_HQVCD: - vcd_debug ("%s detected", vcdinf_get_format_version_str(*vcd_type)); - break; - case VCD_TYPE_INVALID: - vcd_error ("unknown ID encountered -- maybe not a proper (S)VCD?"); - return false; - break; - default: - vcd_assert_not_reached (); - break; - } - - return true; -} - diff --git a/src/input/vcd/libvcd/vcd_read.h b/src/input/vcd/libvcd/vcd_read.h deleted file mode 100644 index fb9e1509b..000000000 --- a/src/input/vcd/libvcd/vcd_read.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - $Id: vcd_read.h,v 1.3 2005/01/01 02:43:59 rockyb Exp $ - - Copyright (C) 2003 Rocky Bernstein <rocky@gnu.org> - - 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 -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <cdio/cdio.h> -#include <cdio/iso9660.h> - -/* FIXME: make this really private: */ -#include <libvcd/files_private.h> - -bool read_pvd(CdIo *cdio, iso9660_pvd_t *pvd); -bool read_entries(CdIo *cdio, EntriesVcd_t *entries); -bool read_info(CdIo *cdio, InfoVcd_t *info, vcd_type_t *vcd_type); - - - diff --git a/src/liba52/Makefile.am b/src/liba52/Makefile.am deleted file mode 100644 index 1025b373d..000000000 --- a/src/liba52/Makefile.am +++ /dev/null @@ -1,21 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -AM_CFLAGS = $(DEFAULT_OCFLAGS) $(VISIBILITY_FLAG) -AM_LDFLAGS = $(xineplug_ldflags) - -noinst_HEADERS = a52.h a52_internal.h bitstream.h tables.h crc.c - -if ENABLE_A52DEC -xineplug_LTLIBRARIES = xineplug_decode_a52.la -endif - -if WITH_EXTERNAL_A52DEC -external_libs = -la52 -internal_sources = -else -external_libs = -internal_sources = bitstream.c bit_allocate.c downmix.c imdct.c parse.c -endif - -xineplug_decode_a52_la_SOURCES = xine_a52_decoder.c $(internal_sources) -xineplug_decode_a52_la_LIBADD = $(XINE_LIB) $(external_libs) -lm diff --git a/src/liba52/a52.h b/src/liba52/a52.h deleted file mode 100644 index 9db52ccf8..000000000 --- a/src/liba52/a52.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * a52.h - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org> - * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> - * - * This file is part of a52dec, a free ATSC A-52 stream decoder. - * See http://liba52.sourceforge.net/ for updates. - * - * a52dec 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. - * - * a52dec 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 - */ - -#ifndef A52_H -#define A52_H - -#ifndef LIBA52_DOUBLE -typedef float sample_t; -#else -typedef double sample_t; -#endif - -typedef struct a52_state_s a52_state_t; - -#define A52_CHANNEL 0 -#define A52_MONO 1 -#define A52_STEREO 2 -#define A52_3F 3 -#define A52_2F1R 4 -#define A52_3F1R 5 -#define A52_2F2R 6 -#define A52_3F2R 7 -#define A52_CHANNEL1 8 -#define A52_CHANNEL2 9 -#define A52_DOLBY 10 -#define A52_CHANNEL_MASK 15 - -#define A52_LFE 16 -#define A52_ADJUST_LEVEL 32 - -a52_state_t * a52_init (uint32_t mm_accel); -sample_t * a52_samples (a52_state_t * state); -int a52_syncinfo (uint8_t * buf, int * flags, - int * sample_rate, int * bit_rate); -int a52_frame (a52_state_t * state, uint8_t * buf, int * flags, - sample_t * level, sample_t bias); -void a52_dynrng (a52_state_t * state, - sample_t (* call) (sample_t, void *), void * data); -int a52_block (a52_state_t * state); -void a52_free (a52_state_t * state); - -#endif /* A52_H */ diff --git a/src/liba52/a52_internal.h b/src/liba52/a52_internal.h deleted file mode 100644 index 541d94803..000000000 --- a/src/liba52/a52_internal.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - * a52_internal.h - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org> - * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> - * - * This file is part of a52dec, a free ATSC A-52 stream decoder. - * See http://liba52.sourceforge.net/ for updates. - * - * a52dec 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. - * - * a52dec 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 - */ - -typedef struct { - uint8_t bai; /* fine SNR offset, fast gain */ - uint8_t deltbae; /* delta bit allocation exists */ - int8_t deltba[50]; /* per-band delta bit allocation */ -} ba_t; - -typedef struct { - uint8_t exp[256]; /* decoded channel exponents */ - int8_t bap[256]; /* derived channel bit allocation */ -} expbap_t; - -struct a52_state_s { - uint8_t fscod; /* sample rate */ - uint8_t halfrate; /* halfrate factor */ - uint8_t acmod; /* coded channels */ - uint8_t lfeon; /* coded lfe channel */ - sample_t clev; /* centre channel mix level */ - sample_t slev; /* surround channels mix level */ - - int output; /* type of output */ - sample_t level; /* output level */ - sample_t bias; /* output bias */ - - int dynrnge; /* apply dynamic range */ - sample_t dynrng; /* dynamic range */ - void * dynrngdata; /* dynamic range callback funtion and data */ - sample_t (* dynrngcall) (sample_t range, void * dynrngdata); - - uint8_t chincpl; /* channel coupled */ - uint8_t phsflginu; /* phase flags in use (stereo only) */ - uint8_t cplstrtmant; /* coupling channel start mantissa */ - uint8_t cplendmant; /* coupling channel end mantissa */ - uint32_t cplbndstrc; /* coupling band structure */ - sample_t cplco[5][18]; /* coupling coordinates */ - - /* derived information */ - uint8_t cplstrtbnd; /* coupling start band (for bit allocation) */ - uint8_t ncplbnd; /* number of coupling bands */ - - uint8_t rematflg; /* stereo rematrixing */ - - uint8_t endmant[5]; /* channel end mantissa */ - - uint16_t bai; /* bit allocation information */ - - uint32_t * buffer_start; - uint16_t lfsr_state; /* dither state */ - uint32_t bits_left; - uint32_t current_word; - - uint8_t csnroffst; /* coarse SNR offset */ - ba_t cplba; /* coupling bit allocation parameters */ - ba_t ba[5]; /* channel bit allocation parameters */ - ba_t lfeba; /* lfe bit allocation parameters */ - - uint8_t cplfleak; /* coupling fast leak init */ - uint8_t cplsleak; /* coupling slow leak init */ - - expbap_t cpl_expbap; - expbap_t fbw_expbap[5]; - expbap_t lfe_expbap; - - sample_t * samples; - void * samples_base; - int downmixed; -}; - -#define LEVEL_PLUS6DB 2.0 -#define LEVEL_PLUS3DB 1.4142135623730951 -#define LEVEL_3DB 0.7071067811865476 -#define LEVEL_45DB 0.5946035575013605 -#define LEVEL_6DB 0.5 - -#define EXP_REUSE (0) -#define EXP_D15 (1) -#define EXP_D25 (2) -#define EXP_D45 (3) - -#define DELTA_BIT_REUSE (0) -#define DELTA_BIT_NEW (1) -#define DELTA_BIT_NONE (2) -#define DELTA_BIT_RESERVED (3) - -void a52_bit_allocate (a52_state_t * state, ba_t * ba, int bndstart, - int start, int end, int fastleak, int slowleak, - expbap_t * expbap); - -int a52_downmix_init (int input, int flags, sample_t * level, - sample_t clev, sample_t slev); -int a52_downmix_coeff (sample_t * coeff, int acmod, int output, sample_t level, - sample_t clev, sample_t slev); -void a52_downmix (sample_t * samples, int acmod, int output, sample_t bias, - sample_t clev, sample_t slev); -void a52_upmix (sample_t * samples, int acmod, int output); - -void a52_imdct_init (uint32_t mm_accel); -void a52_imdct_256 (sample_t * data, sample_t * delay, sample_t bias); -void a52_imdct_512 (sample_t * data, sample_t * delay, sample_t bias); diff --git a/src/liba52/bit_allocate.c b/src/liba52/bit_allocate.c deleted file mode 100644 index 0567b2285..000000000 --- a/src/liba52/bit_allocate.c +++ /dev/null @@ -1,265 +0,0 @@ -/* - * bit_allocate.c - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org> - * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> - * - * This file is part of a52dec, a free ATSC A-52 stream decoder. - * See http://liba52.sourceforge.net/ for updates. - * - * a52dec 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. - * - * a52dec 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 - */ - -#include "config.h" - -#include <inttypes.h> - -#include "a52.h" -#include "a52_internal.h" - -static int hthtab[3][50] = { - {0x730, 0x730, 0x7c0, 0x800, 0x820, 0x840, 0x850, 0x850, 0x860, 0x860, - 0x860, 0x860, 0x860, 0x870, 0x870, 0x870, 0x880, 0x880, 0x890, 0x890, - 0x8a0, 0x8a0, 0x8b0, 0x8b0, 0x8c0, 0x8c0, 0x8d0, 0x8e0, 0x8f0, 0x900, - 0x910, 0x910, 0x910, 0x910, 0x900, 0x8f0, 0x8c0, 0x870, 0x820, 0x7e0, - 0x7a0, 0x770, 0x760, 0x7a0, 0x7c0, 0x7c0, 0x6e0, 0x400, 0x3c0, 0x3c0}, - {0x710, 0x710, 0x7a0, 0x7f0, 0x820, 0x830, 0x840, 0x850, 0x850, 0x860, - 0x860, 0x860, 0x860, 0x860, 0x870, 0x870, 0x870, 0x880, 0x880, 0x880, - 0x890, 0x890, 0x8a0, 0x8a0, 0x8b0, 0x8b0, 0x8c0, 0x8c0, 0x8e0, 0x8f0, - 0x900, 0x910, 0x910, 0x910, 0x910, 0x900, 0x8e0, 0x8b0, 0x870, 0x820, - 0x7e0, 0x7b0, 0x760, 0x770, 0x7a0, 0x7c0, 0x780, 0x5d0, 0x3c0, 0x3c0}, - {0x680, 0x680, 0x750, 0x7b0, 0x7e0, 0x810, 0x820, 0x830, 0x840, 0x850, - 0x850, 0x850, 0x860, 0x860, 0x860, 0x860, 0x860, 0x860, 0x860, 0x860, - 0x870, 0x870, 0x870, 0x870, 0x880, 0x880, 0x880, 0x890, 0x8a0, 0x8b0, - 0x8c0, 0x8d0, 0x8e0, 0x8f0, 0x900, 0x910, 0x910, 0x910, 0x900, 0x8f0, - 0x8d0, 0x8b0, 0x840, 0x7f0, 0x790, 0x760, 0x7a0, 0x7c0, 0x7b0, 0x720} -}; - -static int8_t baptab[305] = { - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, /* 93 padding elems */ - - 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, - 14, 12, 12, 12, 12, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9, - 9, 8, 8, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5, - 5, 4, 4, -3, -3, 3, 3, 3, -2, -2, -1, -1, -1, -1, -1, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 /* 148 padding elems */ -}; - -static int bndtab[30] = {21, 22, 23, 24, 25, 26, 27, 28, 31, 34, - 37, 40, 43, 46, 49, 55, 61, 67, 73, 79, - 85, 97, 109, 121, 133, 157, 181, 205, 229, 253}; - -static int8_t latab[256] = { - -64, -63, -62, -61, -60, -59, -58, -57, -56, -55, -54, -53, - -52, -52, -51, -50, -49, -48, -47, -47, -46, -45, -44, -44, - -43, -42, -41, -41, -40, -39, -38, -38, -37, -36, -36, -35, - -35, -34, -33, -33, -32, -32, -31, -30, -30, -29, -29, -28, - -28, -27, -27, -26, -26, -25, -25, -24, -24, -23, -23, -22, - -22, -21, -21, -21, -20, -20, -19, -19, -19, -18, -18, -18, - -17, -17, -17, -16, -16, -16, -15, -15, -15, -14, -14, -14, - -13, -13, -13, -13, -12, -12, -12, -12, -11, -11, -11, -11, - -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -8, -8, - -8, -8, -8, -8, -7, -7, -7, -7, -7, -7, -6, -6, - -6, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -5, - -5, -5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, - -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 -}; - -#define UPDATE_LEAK() \ -do { \ - fastleak += fdecay; \ - if (fastleak > psd + fgain) \ - fastleak = psd + fgain; \ - slowleak += sdecay; \ - if (slowleak > psd + sgain) \ - slowleak = psd + sgain; \ -} while (0) - -#define COMPUTE_MASK() \ -do { \ - if (psd > dbknee) \ - mask -= (psd - dbknee) >> 2; \ - if (mask > hth [i >> halfrate]) \ - mask = hth [i >> halfrate]; \ - mask -= snroffset + 128 * deltba[i]; \ - mask = (mask > 0) ? 0 : ((-mask) >> 5); \ - mask -= floor; \ -} while (0) - -void a52_bit_allocate (a52_state_t * state, ba_t * ba, int bndstart, - int start, int end, int fastleak, int slowleak, - expbap_t * expbap) -{ - static int slowgain[4] = {0x540, 0x4d8, 0x478, 0x410}; - static int dbpbtab[4] = {0xc00, 0x500, 0x300, 0x100}; - static int floortab[8] = {0x910, 0x950, 0x990, 0x9d0, - 0xa10, 0xa90, 0xb10, 0x1400}; - - int i, j; - uint8_t * exp; - int8_t * bap; - int fdecay, fgain, sdecay, sgain, dbknee, floor, snroffset; - int psd, mask; - int8_t * deltba; - int * hth; - int halfrate; - - halfrate = state->halfrate; - fdecay = (63 + 20 * ((state->bai >> 7) & 3)) >> halfrate; /* fdcycod */ - fgain = 128 + 128 * (ba->bai & 7); /* fgaincod */ - sdecay = (15 + 2 * (state->bai >> 9)) >> halfrate; /* sdcycod */ - sgain = slowgain[(state->bai >> 5) & 3]; /* sgaincod */ - dbknee = dbpbtab[(state->bai >> 3) & 3]; /* dbpbcod */ - hth = hthtab[state->fscod]; - /* - * if there is no delta bit allocation, make deltba point to an area - * known to contain zeroes. baptab+156 here. - */ - deltba = (ba->deltbae == DELTA_BIT_NONE) ? baptab + 156 : ba->deltba; - floor = floortab[state->bai & 7]; /* floorcod */ - snroffset = 960 - 64 * state->csnroffst - 4 * (ba->bai >> 3) + floor; - floor >>= 5; - - exp = expbap->exp; - bap = expbap->bap; - - i = bndstart; - j = start; - if (start == 0) { /* not the coupling channel */ - int lowcomp; - - lowcomp = 0; - j = end - 1; - do { - if (i < j) { - if (exp[i+1] == exp[i] - 2) - lowcomp = 384; - else if (lowcomp && (exp[i+1] > exp[i])) - lowcomp -= 64; - } - psd = 128 * exp[i]; - mask = psd + fgain + lowcomp; - COMPUTE_MASK (); - bap[i] = (baptab+156)[mask + 4 * exp[i]]; - i++; - } while ((i < 3) || ((i < 7) && (exp[i] > exp[i-1]))); - fastleak = psd + fgain; - slowleak = psd + sgain; - - while (i < 7) { - if (i < j) { - if (exp[i+1] == exp[i] - 2) - lowcomp = 384; - else if (lowcomp && (exp[i+1] > exp[i])) - lowcomp -= 64; - } - psd = 128 * exp[i]; - UPDATE_LEAK (); - mask = ((fastleak + lowcomp < slowleak) ? - fastleak + lowcomp : slowleak); - COMPUTE_MASK (); - bap[i] = (baptab+156)[mask + 4 * exp[i]]; - i++; - } - - if (end == 7) /* lfe channel */ - return; - - do { - if (exp[i+1] == exp[i] - 2) - lowcomp = 320; - else if (lowcomp && (exp[i+1] > exp[i])) - lowcomp -= 64; - psd = 128 * exp[i]; - UPDATE_LEAK (); - mask = ((fastleak + lowcomp < slowleak) ? - fastleak + lowcomp : slowleak); - COMPUTE_MASK (); - bap[i] = (baptab+156)[mask + 4 * exp[i]]; - i++; - } while (i < 20); - - while (lowcomp > 128) { /* two iterations maximum */ - lowcomp -= 128; - psd = 128 * exp[i]; - UPDATE_LEAK (); - mask = ((fastleak + lowcomp < slowleak) ? - fastleak + lowcomp : slowleak); - COMPUTE_MASK (); - bap[i] = (baptab+156)[mask + 4 * exp[i]]; - i++; - } - j = i; - } - - do { - int startband, endband; - - startband = j; - endband = ((bndtab-20)[i] < end) ? (bndtab-20)[i] : end; - psd = 128 * exp[j++]; - while (j < endband) { - int next, delta; - - next = 128 * exp[j++]; - delta = next - psd; - switch (delta >> 9) { - case -6: case -5: case -4: case -3: case -2: - psd = next; - break; - case -1: - psd = next + latab[(-delta) >> 1]; - break; - case 0: - psd += latab[delta >> 1]; - break; - } - } - /* minpsd = -289 */ - UPDATE_LEAK (); - mask = (fastleak < slowleak) ? fastleak : slowleak; - COMPUTE_MASK (); - i++; - j = startband; - do { - /* max(mask+4*exp)=147=-(minpsd+fgain-deltba-snroffset)>>5+4*exp */ - /* min(mask+4*exp)=-156=-(sgain-deltba-snroffset)>>5 */ - bap[j] = (baptab+156)[mask + 4 * exp[j]]; - } while (++j < endband); - } while (j < end); -} diff --git a/src/liba52/bitstream.c b/src/liba52/bitstream.c deleted file mode 100644 index 04e8ca6d0..000000000 --- a/src/liba52/bitstream.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * bitstream.c - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org> - * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> - * - * This file is part of a52dec, a free ATSC A-52 stream decoder. - * See http://liba52.sourceforge.net/ for updates. - * - * a52dec 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. - * - * a52dec 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 - */ - -#include "config.h" - -#include <inttypes.h> - -#include "a52.h" -#include "a52_internal.h" -#include "bitstream.h" - -#define BUFFER_SIZE 4096 - -void a52_bitstream_set_ptr (a52_state_t * state, uint8_t * buf) -{ - int align; - - align = (long)buf & 3; - state->buffer_start = (uint32_t *) (buf - align); - state->bits_left = 0; - bitstream_get (state, align * 8); -} - -static inline void bitstream_fill_current (a52_state_t * state) -{ - uint32_t tmp; - - tmp = *(state->buffer_start++); - state->current_word = swab32 (tmp); -} - -/* - * The fast paths for _get is in the - * bitstream.h header file so it can be inlined. - * - * The "bottom half" of this routine is suffixed _bh - * - * -ah - */ - -uint32_t a52_bitstream_get_bh (a52_state_t * state, uint32_t num_bits) -{ - uint32_t result; - - num_bits -= state->bits_left; - result = ((state->current_word << (32 - state->bits_left)) >> - (32 - state->bits_left)); - - bitstream_fill_current (state); - - if (num_bits != 0) - result = (result << num_bits) | (state->current_word >> (32 - num_bits)); - - state->bits_left = 32 - num_bits; - - return result; -} - -int32_t a52_bitstream_get_bh_2 (a52_state_t * state, uint32_t num_bits) -{ - int32_t result; - - num_bits -= state->bits_left; - result = ((((int32_t)state->current_word) << (32 - state->bits_left)) >> - (32 - state->bits_left)); - - bitstream_fill_current(state); - - if (num_bits != 0) - result = (result << num_bits) | (state->current_word >> (32 - num_bits)); - - state->bits_left = 32 - num_bits; - - return result; -} diff --git a/src/liba52/bitstream.h b/src/liba52/bitstream.h deleted file mode 100644 index f242c37c4..000000000 --- a/src/liba52/bitstream.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * bitstream.h - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org> - * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> - * - * This file is part of a52dec, a free ATSC A-52 stream decoder. - * See http://liba52.sourceforge.net/ for updates. - * - * a52dec 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. - * - * a52dec 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 - */ - -#ifdef WIN32 -#include <unistd.h> -#endif - -/* (stolen from the kernel) */ -#ifdef WORDS_BIGENDIAN - -# define swab32(x) (x) - -#else - -# if 0 && defined (__i386__) - -# define swab32(x) __i386_swab32(x) - static inline const uint32_t __i386_swab32(uint32_t x) - { - __asm__("bswap %0" : "=r" (x) : "0" (x)); - return x; - } - -# else - -# define swab32(x)\ -((((uint8_t*)&x)[0] << 24) | (((uint8_t*)&x)[1] << 16) | \ - (((uint8_t*)&x)[2] << 8) | (((uint8_t*)&x)[3])) - -# endif -#endif - -void a52_bitstream_set_ptr (a52_state_t * state, uint8_t * buf); -uint32_t a52_bitstream_get_bh (a52_state_t * state, uint32_t num_bits); -int32_t a52_bitstream_get_bh_2 (a52_state_t * state, uint32_t num_bits); - -static inline uint32_t bitstream_get (a52_state_t * state, uint32_t num_bits) -{ - uint32_t result; - - if (num_bits < state->bits_left) { - result = (state->current_word << (32 - state->bits_left)) >> (32 - num_bits); - state->bits_left -= num_bits; - return result; - } - - return a52_bitstream_get_bh (state, num_bits); -} - -static inline int32_t bitstream_get_2 (a52_state_t * state, uint32_t num_bits) -{ - int32_t result; - - if (num_bits < state->bits_left) { - result = (((int32_t)state->current_word) << (32 - state->bits_left)) >> (32 - num_bits); - state->bits_left -= num_bits; - return result; - } - - return a52_bitstream_get_bh_2 (state, num_bits); -} diff --git a/src/liba52/crc.c b/src/liba52/crc.c deleted file mode 100644 index 38254c9ef..000000000 --- a/src/liba52/crc.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - * crc.c - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec 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, or (at your option) - * any later version. - * - * ac3dec 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 GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#include <stdlib.h> -#include <stdio.h> -#include <inttypes.h> - -static const uint16_t crc_lut[256] = -{ - 0x0000,0x8005,0x800f,0x000a,0x801b,0x001e,0x0014,0x8011, - 0x8033,0x0036,0x003c,0x8039,0x0028,0x802d,0x8027,0x0022, - 0x8063,0x0066,0x006c,0x8069,0x0078,0x807d,0x8077,0x0072, - 0x0050,0x8055,0x805f,0x005a,0x804b,0x004e,0x0044,0x8041, - 0x80c3,0x00c6,0x00cc,0x80c9,0x00d8,0x80dd,0x80d7,0x00d2, - 0x00f0,0x80f5,0x80ff,0x00fa,0x80eb,0x00ee,0x00e4,0x80e1, - 0x00a0,0x80a5,0x80af,0x00aa,0x80bb,0x00be,0x00b4,0x80b1, - 0x8093,0x0096,0x009c,0x8099,0x0088,0x808d,0x8087,0x0082, - 0x8183,0x0186,0x018c,0x8189,0x0198,0x819d,0x8197,0x0192, - 0x01b0,0x81b5,0x81bf,0x01ba,0x81ab,0x01ae,0x01a4,0x81a1, - 0x01e0,0x81e5,0x81ef,0x01ea,0x81fb,0x01fe,0x01f4,0x81f1, - 0x81d3,0x01d6,0x01dc,0x81d9,0x01c8,0x81cd,0x81c7,0x01c2, - 0x0140,0x8145,0x814f,0x014a,0x815b,0x015e,0x0154,0x8151, - 0x8173,0x0176,0x017c,0x8179,0x0168,0x816d,0x8167,0x0162, - 0x8123,0x0126,0x012c,0x8129,0x0138,0x813d,0x8137,0x0132, - 0x0110,0x8115,0x811f,0x011a,0x810b,0x010e,0x0104,0x8101, - 0x8303,0x0306,0x030c,0x8309,0x0318,0x831d,0x8317,0x0312, - 0x0330,0x8335,0x833f,0x033a,0x832b,0x032e,0x0324,0x8321, - 0x0360,0x8365,0x836f,0x036a,0x837b,0x037e,0x0374,0x8371, - 0x8353,0x0356,0x035c,0x8359,0x0348,0x834d,0x8347,0x0342, - 0x03c0,0x83c5,0x83cf,0x03ca,0x83db,0x03de,0x03d4,0x83d1, - 0x83f3,0x03f6,0x03fc,0x83f9,0x03e8,0x83ed,0x83e7,0x03e2, - 0x83a3,0x03a6,0x03ac,0x83a9,0x03b8,0x83bd,0x83b7,0x03b2, - 0x0390,0x8395,0x839f,0x039a,0x838b,0x038e,0x0384,0x8381, - 0x0280,0x8285,0x828f,0x028a,0x829b,0x029e,0x0294,0x8291, - 0x82b3,0x02b6,0x02bc,0x82b9,0x02a8,0x82ad,0x82a7,0x02a2, - 0x82e3,0x02e6,0x02ec,0x82e9,0x02f8,0x82fd,0x82f7,0x02f2, - 0x02d0,0x82d5,0x82df,0x02da,0x82cb,0x02ce,0x02c4,0x82c1, - 0x8243,0x0246,0x024c,0x8249,0x0258,0x825d,0x8257,0x0252, - 0x0270,0x8275,0x827f,0x027a,0x826b,0x026e,0x0264,0x8261, - 0x0220,0x8225,0x822f,0x022a,0x823b,0x023e,0x0234,0x8231, - 0x8213,0x0216,0x021c,0x8219,0x0208,0x820d,0x8207,0x0202 -}; - -static uint16_t crc16_block(uint8_t *data,uint32_t num_bytes) -{ - uint32_t i; - uint16_t state=0; - - for(i=0;i<num_bytes;i++) - state = crc_lut[data[i] ^ (state>>8)] ^ (state<<8); - - return state; -} diff --git a/src/liba52/diff_against_release.patch b/src/liba52/diff_against_release.patch deleted file mode 100644 index d7f7ff2f2..000000000 --- a/src/liba52/diff_against_release.patch +++ /dev/null @@ -1,76 +0,0 @@ ---- src/liba52/a52_internal.h Sun Jul 28 03:52:06 2002 -+++ src/liba52/a52_internal.h Wed Aug 28 19:01:05 2002 -@@ -84,6 +84,7 @@ - expbap_t lfe_expbap; - - sample_t * samples; -+ void * samples_base; - int downmixed; - }; - ---- src/liba52/imdct.c Sun Jul 28 03:52:07 2002 -+++ src/liba52/imdct.c Wed Aug 28 18:55:38 2002 -@@ -38,7 +38,7 @@ - - #include "a52.h" - #include "a52_internal.h" --#include "mm_accel.h" -+#include "xineutils.h" - - typedef struct complex_s { - sample_t real; -@@ -425,7 +425,6 @@ - } else - #endif - { -- fprintf (stderr, "liba52:No accelerated IMDCT transform found\n"); - ifft128 = ifft128_c; - ifft64 = ifft64_c; - } ---- src/liba52/parse.c Sun Jul 28 03:52:07 2002 -+++ src/liba52/parse.c Wed Aug 28 19:02:21 2002 -@@ -31,14 +31,7 @@ - #include "a52_internal.h" - #include "bitstream.h" - #include "tables.h" -- --#ifdef HAVE_MEMALIGN --/* some systems have memalign() but no declaration for it */ --void * memalign (size_t align, size_t size); --#else --/* assume malloc alignment is sufficient */ --#define memalign(align,size) malloc (size) --#endif -+#include "xineutils.h" - - typedef struct { - sample_t q1[2]; -@@ -60,7 +53,7 @@ - if (state == NULL) - return NULL; - -- state->samples = memalign (16, 256 * 12 * sizeof (sample_t)); -+ state->samples = xine_xmalloc_aligned (16, 256 * 12 * sizeof (sample_t), &state->samples_base); - if (state->samples == NULL) { - free (state); - return NULL; -@@ -896,6 +889,6 @@ - - void a52_free (a52_state_t * state) - { -- free (state->samples); -+ free (state->samples_base); - free (state); - } ---- src/liba52/bitstream.h -+++ src/liba52/bitstream.h -@@ -21,6 +21,10 @@ - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -+#ifdef WIN32 -+#include <unistd.h> -+#endif -+ - /* (stolen from the kernel) */ - #ifdef WORDS_BIGENDIAN diff --git a/src/liba52/downmix.c b/src/liba52/downmix.c deleted file mode 100644 index b9ac1fdea..000000000 --- a/src/liba52/downmix.c +++ /dev/null @@ -1,655 +0,0 @@ -/* - * downmix.c - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org> - * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> - * - * This file is part of a52dec, a free ATSC A-52 stream decoder. - * See http://liba52.sourceforge.net/ for updates. - * - * a52dec 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. - * - * a52dec 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 - */ - -#include "config.h" - -#include <string.h> -#include <inttypes.h> - -#include "a52.h" -#include "a52_internal.h" - -#define CONVERT(acmod,output) (((output) << 3) + (acmod)) - -int a52_downmix_init (int input, int flags, sample_t * level, - sample_t clev, sample_t slev) -{ - static uint8_t table[11][8] = { - {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO, - A52_STEREO, A52_STEREO, A52_STEREO, A52_STEREO}, - {A52_MONO, A52_MONO, A52_MONO, A52_MONO, - A52_MONO, A52_MONO, A52_MONO, A52_MONO}, - {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO, - A52_STEREO, A52_STEREO, A52_STEREO, A52_STEREO}, - {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_3F, - A52_STEREO, A52_3F, A52_STEREO, A52_3F}, - {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO, - A52_2F1R, A52_2F1R, A52_2F1R, A52_2F1R}, - {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO, - A52_2F1R, A52_3F1R, A52_2F1R, A52_3F1R}, - {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_3F, - A52_2F2R, A52_2F2R, A52_2F2R, A52_2F2R}, - {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_3F, - A52_2F2R, A52_3F2R, A52_2F2R, A52_3F2R}, - {A52_CHANNEL1, A52_MONO, A52_MONO, A52_MONO, - A52_MONO, A52_MONO, A52_MONO, A52_MONO}, - {A52_CHANNEL2, A52_MONO, A52_MONO, A52_MONO, - A52_MONO, A52_MONO, A52_MONO, A52_MONO}, - {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_DOLBY, - A52_DOLBY, A52_DOLBY, A52_DOLBY, A52_DOLBY} - }; - int output; - - output = flags & A52_CHANNEL_MASK; - if (output > A52_DOLBY) - return -1; - - output = table[output][input & 7]; - - if ((output == A52_STEREO) && - ((input == A52_DOLBY) || ((input == A52_3F) && (clev == LEVEL_3DB)))) - output = A52_DOLBY; - - if (flags & A52_ADJUST_LEVEL) - switch (CONVERT (input & 7, output)) { - - case CONVERT (A52_3F, A52_MONO): - *level *= LEVEL_3DB / (1 + clev); - break; - - case CONVERT (A52_STEREO, A52_MONO): - case CONVERT (A52_2F2R, A52_2F1R): - case CONVERT (A52_3F2R, A52_3F1R): - level_3db: - *level *= LEVEL_3DB; - break; - - case CONVERT (A52_3F2R, A52_2F1R): - if (clev < LEVEL_PLUS3DB - 1) - goto level_3db; - /* break thru */ - case CONVERT (A52_3F, A52_STEREO): - case CONVERT (A52_3F1R, A52_2F1R): - case CONVERT (A52_3F1R, A52_2F2R): - case CONVERT (A52_3F2R, A52_2F2R): - *level /= 1 + clev; - break; - - case CONVERT (A52_2F1R, A52_MONO): - *level *= LEVEL_PLUS3DB / (2 + slev); - break; - - case CONVERT (A52_2F1R, A52_STEREO): - case CONVERT (A52_3F1R, A52_3F): - *level /= 1 + slev * LEVEL_3DB; - break; - - case CONVERT (A52_3F1R, A52_MONO): - *level *= LEVEL_3DB / (1 + clev + 0.5 * slev); - break; - - case CONVERT (A52_3F1R, A52_STEREO): - *level /= 1 + clev + slev * LEVEL_3DB; - break; - - case CONVERT (A52_2F2R, A52_MONO): - *level *= LEVEL_3DB / (1 + slev); - break; - - case CONVERT (A52_2F2R, A52_STEREO): - case CONVERT (A52_3F2R, A52_3F): - *level /= 1 + slev; - break; - - case CONVERT (A52_3F2R, A52_MONO): - *level *= LEVEL_3DB / (1 + clev + slev); - break; - - case CONVERT (A52_3F2R, A52_STEREO): - *level /= 1 + clev + slev; - break; - - case CONVERT (A52_MONO, A52_DOLBY): - *level *= LEVEL_PLUS3DB; - break; - - case CONVERT (A52_3F, A52_DOLBY): - case CONVERT (A52_2F1R, A52_DOLBY): - *level *= 1 / (1 + LEVEL_3DB); - break; - - case CONVERT (A52_3F1R, A52_DOLBY): - case CONVERT (A52_2F2R, A52_DOLBY): - *level *= 1 / (1 + 2 * LEVEL_3DB); - break; - - case CONVERT (A52_3F2R, A52_DOLBY): - *level *= 1 / (1 + 3 * LEVEL_3DB); - break; - } - - return output; -} - -int a52_downmix_coeff (sample_t * coeff, int acmod, int output, sample_t level, - sample_t clev, sample_t slev) -{ - switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) { - - case CONVERT (A52_CHANNEL, A52_CHANNEL): - case CONVERT (A52_MONO, A52_MONO): - case CONVERT (A52_STEREO, A52_STEREO): - case CONVERT (A52_3F, A52_3F): - case CONVERT (A52_2F1R, A52_2F1R): - case CONVERT (A52_3F1R, A52_3F1R): - case CONVERT (A52_2F2R, A52_2F2R): - case CONVERT (A52_3F2R, A52_3F2R): - case CONVERT (A52_STEREO, A52_DOLBY): - coeff[0] = coeff[1] = coeff[2] = coeff[3] = coeff[4] = level; - return 0; - - case CONVERT (A52_CHANNEL, A52_MONO): - coeff[0] = coeff[1] = level * LEVEL_6DB; - return 3; - - case CONVERT (A52_STEREO, A52_MONO): - coeff[0] = coeff[1] = level * LEVEL_3DB; - return 3; - - case CONVERT (A52_3F, A52_MONO): - coeff[0] = coeff[2] = level * LEVEL_3DB; - coeff[1] = level * clev * LEVEL_PLUS3DB; - return 7; - - case CONVERT (A52_2F1R, A52_MONO): - coeff[0] = coeff[1] = level * LEVEL_3DB; - coeff[2] = level * slev * LEVEL_3DB; - return 7; - - case CONVERT (A52_2F2R, A52_MONO): - coeff[0] = coeff[1] = level * LEVEL_3DB; - coeff[2] = coeff[3] = level * slev * LEVEL_3DB; - return 15; - - case CONVERT (A52_3F1R, A52_MONO): - coeff[0] = coeff[2] = level * LEVEL_3DB; - coeff[1] = level * clev * LEVEL_PLUS3DB; - coeff[3] = level * slev * LEVEL_3DB; - return 15; - - case CONVERT (A52_3F2R, A52_MONO): - coeff[0] = coeff[2] = level * LEVEL_3DB; - coeff[1] = level * clev * LEVEL_PLUS3DB; - coeff[3] = coeff[4] = level * slev * LEVEL_3DB; - return 31; - - case CONVERT (A52_MONO, A52_DOLBY): - coeff[0] = level * LEVEL_3DB; - return 0; - - case CONVERT (A52_3F, A52_DOLBY): - clev = LEVEL_3DB; - case CONVERT (A52_3F, A52_STEREO): - case CONVERT (A52_3F1R, A52_2F1R): - case CONVERT (A52_3F2R, A52_2F2R): - coeff[0] = coeff[2] = coeff[3] = coeff[4] = level; - coeff[1] = level * clev; - return 7; - - case CONVERT (A52_2F1R, A52_DOLBY): - slev = 1; - case CONVERT (A52_2F1R, A52_STEREO): - coeff[0] = coeff[1] = level; - coeff[2] = level * slev * LEVEL_3DB; - return 7; - - case CONVERT (A52_3F1R, A52_DOLBY): - clev = LEVEL_3DB; - slev = 1; - case CONVERT (A52_3F1R, A52_STEREO): - coeff[0] = coeff[2] = level; - coeff[1] = level * clev; - coeff[3] = level * slev * LEVEL_3DB; - return 15; - - case CONVERT (A52_2F2R, A52_DOLBY): - slev = LEVEL_3DB; - case CONVERT (A52_2F2R, A52_STEREO): - coeff[0] = coeff[1] = level; - coeff[2] = coeff[3] = level * slev; - return 15; - - case CONVERT (A52_3F2R, A52_DOLBY): - clev = LEVEL_3DB; - case CONVERT (A52_3F2R, A52_2F1R): - slev = LEVEL_3DB; - case CONVERT (A52_3F2R, A52_STEREO): - coeff[0] = coeff[2] = level; - coeff[1] = level * clev; - coeff[3] = coeff[4] = level * slev; - return 31; - - case CONVERT (A52_3F1R, A52_3F): - coeff[0] = coeff[1] = coeff[2] = level; - coeff[3] = level * slev * LEVEL_3DB; - return 13; - - case CONVERT (A52_3F2R, A52_3F): - coeff[0] = coeff[1] = coeff[2] = level; - coeff[3] = coeff[4] = level * slev; - return 29; - - case CONVERT (A52_2F2R, A52_2F1R): - coeff[0] = coeff[1] = level; - coeff[2] = coeff[3] = level * LEVEL_3DB; - return 12; - - case CONVERT (A52_3F2R, A52_3F1R): - coeff[0] = coeff[1] = coeff[2] = level; - coeff[3] = coeff[4] = level * LEVEL_3DB; - return 24; - - case CONVERT (A52_2F1R, A52_2F2R): - coeff[0] = coeff[1] = level; - coeff[2] = level * LEVEL_3DB; - return 0; - - case CONVERT (A52_3F1R, A52_2F2R): - coeff[0] = coeff[2] = level; - coeff[1] = level * clev; - coeff[3] = level * LEVEL_3DB; - return 7; - - case CONVERT (A52_3F1R, A52_3F2R): - coeff[0] = coeff[1] = coeff[2] = level; - coeff[3] = level * LEVEL_3DB; - return 0; - - case CONVERT (A52_CHANNEL, A52_CHANNEL1): - coeff[0] = level; - coeff[1] = 0; - return 0; - - case CONVERT (A52_CHANNEL, A52_CHANNEL2): - coeff[0] = 0; - coeff[1] = level; - return 0; - } - - return -1; /* NOTREACHED */ -} - -static void mix2to1 (sample_t * dest, sample_t * src, sample_t bias) -{ - int i; - - for (i = 0; i < 256; i++) - dest[i] += src[i] + bias; -} - -static void mix3to1 (sample_t * samples, sample_t bias) -{ - int i; - - for (i = 0; i < 256; i++) - samples[i] += samples[i + 256] + samples[i + 512] + bias; -} - -static void mix4to1 (sample_t * samples, sample_t bias) -{ - int i; - - for (i = 0; i < 256; i++) - samples[i] += (samples[i + 256] + samples[i + 512] + - samples[i + 768] + bias); -} - -static void mix5to1 (sample_t * samples, sample_t bias) -{ - int i; - - for (i = 0; i < 256; i++) - samples[i] += (samples[i + 256] + samples[i + 512] + - samples[i + 768] + samples[i + 1024] + bias); -} - -static void mix3to2 (sample_t * samples, sample_t bias) -{ - int i; - sample_t common; - - for (i = 0; i < 256; i++) { - common = samples[i + 256] + bias; - samples[i] += common; - samples[i + 256] = samples[i + 512] + common; - } -} - -static void mix21to2 (sample_t * left, sample_t * right, sample_t bias) -{ - int i; - sample_t common; - - for (i = 0; i < 256; i++) { - common = right[i + 256] + bias; - left[i] += common; - right[i] += common; - } -} - -static void mix21toS (sample_t * samples, sample_t bias) -{ - int i; - sample_t surround; - - for (i = 0; i < 256; i++) { - surround = samples[i + 512]; - samples[i] += bias - surround; - samples[i + 256] += bias + surround; - } -} - -static void mix31to2 (sample_t * samples, sample_t bias) -{ - int i; - sample_t common; - - for (i = 0; i < 256; i++) { - common = samples[i + 256] + samples[i + 768] + bias; - samples[i] += common; - samples[i + 256] = samples[i + 512] + common; - } -} - -static void mix31toS (sample_t * samples, sample_t bias) -{ - int i; - sample_t common, surround; - - for (i = 0; i < 256; i++) { - common = samples[i + 256] + bias; - surround = samples[i + 768]; - samples[i] += common - surround; - samples[i + 256] = samples[i + 512] + common + surround; - } -} - -static void mix22toS (sample_t * samples, sample_t bias) -{ - int i; - sample_t surround; - - for (i = 0; i < 256; i++) { - surround = samples[i + 512] + samples[i + 768]; - samples[i] += bias - surround; - samples[i + 256] += bias + surround; - } -} - -static void mix32to2 (sample_t * samples, sample_t bias) -{ - int i; - sample_t common; - - for (i = 0; i < 256; i++) { - common = samples[i + 256] + bias; - samples[i] += common + samples[i + 768]; - samples[i + 256] = common + samples[i + 512] + samples[i + 1024]; - } -} - -static void mix32toS (sample_t * samples, sample_t bias) -{ - int i; - sample_t common, surround; - - for (i = 0; i < 256; i++) { - common = samples[i + 256] + bias; - surround = samples[i + 768] + samples[i + 1024]; - samples[i] += common - surround; - samples[i + 256] = samples[i + 512] + common + surround; - } -} - -static void move2to1 (sample_t * src, sample_t * dest, sample_t bias) -{ - int i; - - for (i = 0; i < 256; i++) - dest[i] = src[i] + src[i + 256] + bias; -} - -static void zero (sample_t * samples) -{ - int i; - - for (i = 0; i < 256; i++) - samples[i] = 0; -} - -void a52_downmix (sample_t * samples, int acmod, int output, sample_t bias, - sample_t clev, sample_t slev) -{ - switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) { - - case CONVERT (A52_CHANNEL, A52_CHANNEL2): - memcpy (samples, samples + 256, 256 * sizeof (sample_t)); - break; - - case CONVERT (A52_CHANNEL, A52_MONO): - case CONVERT (A52_STEREO, A52_MONO): - mix_2to1: - mix2to1 (samples, samples + 256, bias); - break; - - case CONVERT (A52_2F1R, A52_MONO): - if (slev == 0) - goto mix_2to1; - case CONVERT (A52_3F, A52_MONO): - mix_3to1: - mix3to1 (samples, bias); - break; - - case CONVERT (A52_3F1R, A52_MONO): - if (slev == 0) - goto mix_3to1; - case CONVERT (A52_2F2R, A52_MONO): - if (slev == 0) - goto mix_2to1; - mix4to1 (samples, bias); - break; - - case CONVERT (A52_3F2R, A52_MONO): - if (slev == 0) - goto mix_3to1; - mix5to1 (samples, bias); - break; - - case CONVERT (A52_MONO, A52_DOLBY): - memcpy (samples + 256, samples, 256 * sizeof (sample_t)); - break; - - case CONVERT (A52_3F, A52_STEREO): - case CONVERT (A52_3F, A52_DOLBY): - mix_3to2: - mix3to2 (samples, bias); - break; - - case CONVERT (A52_2F1R, A52_STEREO): - if (slev == 0) - break; - mix21to2 (samples, samples + 256, bias); - break; - - case CONVERT (A52_2F1R, A52_DOLBY): - mix21toS (samples, bias); - break; - - case CONVERT (A52_3F1R, A52_STEREO): - if (slev == 0) - goto mix_3to2; - mix31to2 (samples, bias); - break; - - case CONVERT (A52_3F1R, A52_DOLBY): - mix31toS (samples, bias); - break; - - case CONVERT (A52_2F2R, A52_STEREO): - if (slev == 0) - break; - mix2to1 (samples, samples + 512, bias); - mix2to1 (samples + 256, samples + 768, bias); - break; - - case CONVERT (A52_2F2R, A52_DOLBY): - mix22toS (samples, bias); - break; - - case CONVERT (A52_3F2R, A52_STEREO): - if (slev == 0) - goto mix_3to2; - mix32to2 (samples, bias); - break; - - case CONVERT (A52_3F2R, A52_DOLBY): - mix32toS (samples, bias); - break; - - case CONVERT (A52_3F1R, A52_3F): - if (slev == 0) - break; - mix21to2 (samples, samples + 512, bias); - break; - - case CONVERT (A52_3F2R, A52_3F): - if (slev == 0) - break; - mix2to1 (samples, samples + 768, bias); - mix2to1 (samples + 512, samples + 1024, bias); - break; - - case CONVERT (A52_3F1R, A52_2F1R): - mix3to2 (samples, bias); - memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t)); - break; - - case CONVERT (A52_2F2R, A52_2F1R): - mix2to1 (samples + 512, samples + 768, bias); - break; - - case CONVERT (A52_3F2R, A52_2F1R): - mix3to2 (samples, bias); - move2to1 (samples + 768, samples + 512, bias); - break; - - case CONVERT (A52_3F2R, A52_3F1R): - mix2to1 (samples + 768, samples + 1024, bias); - break; - - case CONVERT (A52_2F1R, A52_2F2R): - memcpy (samples + 768, samples + 512, 256 * sizeof (sample_t)); - break; - - case CONVERT (A52_3F1R, A52_2F2R): - mix3to2 (samples, bias); - memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t)); - break; - - case CONVERT (A52_3F2R, A52_2F2R): - mix3to2 (samples, bias); - memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t)); - memcpy (samples + 768, samples + 1024, 256 * sizeof (sample_t)); - break; - - case CONVERT (A52_3F1R, A52_3F2R): - memcpy (samples + 1027, samples + 768, 256 * sizeof (sample_t)); - break; - } -} - -void a52_upmix (sample_t * samples, int acmod, int output) -{ - switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) { - - case CONVERT (A52_CHANNEL, A52_CHANNEL2): - memcpy (samples + 256, samples, 256 * sizeof (sample_t)); - break; - - case CONVERT (A52_3F2R, A52_MONO): - zero (samples + 1024); - case CONVERT (A52_3F1R, A52_MONO): - case CONVERT (A52_2F2R, A52_MONO): - zero (samples + 768); - case CONVERT (A52_3F, A52_MONO): - case CONVERT (A52_2F1R, A52_MONO): - zero (samples + 512); - case CONVERT (A52_CHANNEL, A52_MONO): - case CONVERT (A52_STEREO, A52_MONO): - zero (samples + 256); - break; - - case CONVERT (A52_3F2R, A52_STEREO): - case CONVERT (A52_3F2R, A52_DOLBY): - zero (samples + 1024); - case CONVERT (A52_3F1R, A52_STEREO): - case CONVERT (A52_3F1R, A52_DOLBY): - zero (samples + 768); - case CONVERT (A52_3F, A52_STEREO): - case CONVERT (A52_3F, A52_DOLBY): - mix_3to2: - memcpy (samples + 512, samples + 256, 256 * sizeof (sample_t)); - zero (samples + 256); - break; - - case CONVERT (A52_2F2R, A52_STEREO): - case CONVERT (A52_2F2R, A52_DOLBY): - zero (samples + 768); - case CONVERT (A52_2F1R, A52_STEREO): - case CONVERT (A52_2F1R, A52_DOLBY): - zero (samples + 512); - break; - - case CONVERT (A52_3F2R, A52_3F): - zero (samples + 1024); - case CONVERT (A52_3F1R, A52_3F): - case CONVERT (A52_2F2R, A52_2F1R): - zero (samples + 768); - break; - - case CONVERT (A52_3F2R, A52_3F1R): - zero (samples + 1024); - break; - - case CONVERT (A52_3F2R, A52_2F1R): - zero (samples + 1024); - case CONVERT (A52_3F1R, A52_2F1R): - mix_31to21: - memcpy (samples + 768, samples + 512, 256 * sizeof (sample_t)); - goto mix_3to2; - - case CONVERT (A52_3F2R, A52_2F2R): - memcpy (samples + 1024, samples + 768, 256 * sizeof (sample_t)); - goto mix_31to21; - } -} diff --git a/src/liba52/imdct.c b/src/liba52/imdct.c deleted file mode 100644 index 5835e70a1..000000000 --- a/src/liba52/imdct.c +++ /dev/null @@ -1,431 +0,0 @@ -/* - * imdct.c - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org> - * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> - * - * The ifft algorithms in this file have been largely inspired by Dan - * Bernstein's work, djbfft, available at http://cr.yp.to/djbfft.html - * - * This file is part of a52dec, a free ATSC A-52 stream decoder. - * See http://liba52.sourceforge.net/ for updates. - * - * a52dec 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. - * - * a52dec 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 - */ - -#include "config.h" - -#include <math.h> -#include <stdio.h> -#ifdef LIBA52_DJBFFT -#include <fftc4.h> -#endif -#ifndef M_PI -#define M_PI 3.1415926535897932384626433832795029 -#endif -#include <inttypes.h> - -#include "a52.h" -#include "a52_internal.h" -#include "xineutils.h" - -typedef struct complex_s { - sample_t real; - sample_t imag; -} complex_t; - -static uint8_t fftorder[] = { - 0,128, 64,192, 32,160,224, 96, 16,144, 80,208,240,112, 48,176, - 8,136, 72,200, 40,168,232,104,248,120, 56,184, 24,152,216, 88, - 4,132, 68,196, 36,164,228,100, 20,148, 84,212,244,116, 52,180, - 252,124, 60,188, 28,156,220, 92, 12,140, 76,204,236,108, 44,172, - 2,130, 66,194, 34,162,226, 98, 18,146, 82,210,242,114, 50,178, - 10,138, 74,202, 42,170,234,106,250,122, 58,186, 26,154,218, 90, - 254,126, 62,190, 30,158,222, 94, 14,142, 78,206,238,110, 46,174, - 6,134, 70,198, 38,166,230,102,246,118, 54,182, 22,150,214, 86 -}; - -/* Root values for IFFT */ -static sample_t roots16[3]; -static sample_t roots32[7]; -static sample_t roots64[15]; -static sample_t roots128[31]; - -/* Twiddle factors for IMDCT */ -static complex_t pre1[128]; -static complex_t post1[64]; -static complex_t pre2[64]; -static complex_t post2[32]; - -static sample_t a52_imdct_window[256]; - -static void (* ifft128) (complex_t * buf); -static void (* ifft64) (complex_t * buf); - -static inline void ifft2 (complex_t * buf) -{ - double r, i; - - r = buf[0].real; - i = buf[0].imag; - buf[0].real += buf[1].real; - buf[0].imag += buf[1].imag; - buf[1].real = r - buf[1].real; - buf[1].imag = i - buf[1].imag; -} - -static inline void ifft4 (complex_t * buf) -{ - double tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8; - - tmp1 = buf[0].real + buf[1].real; - tmp2 = buf[3].real + buf[2].real; - tmp3 = buf[0].imag + buf[1].imag; - tmp4 = buf[2].imag + buf[3].imag; - tmp5 = buf[0].real - buf[1].real; - tmp6 = buf[0].imag - buf[1].imag; - tmp7 = buf[2].imag - buf[3].imag; - tmp8 = buf[3].real - buf[2].real; - - buf[0].real = tmp1 + tmp2; - buf[0].imag = tmp3 + tmp4; - buf[2].real = tmp1 - tmp2; - buf[2].imag = tmp3 - tmp4; - buf[1].real = tmp5 + tmp7; - buf[1].imag = tmp6 + tmp8; - buf[3].real = tmp5 - tmp7; - buf[3].imag = tmp6 - tmp8; -} - -/* the basic split-radix ifft butterfly */ - -#define BUTTERFLY(a0,a1,a2,a3,wr,wi) do { \ - tmp5 = a2.real * wr + a2.imag * wi; \ - tmp6 = a2.imag * wr - a2.real * wi; \ - tmp7 = a3.real * wr - a3.imag * wi; \ - tmp8 = a3.imag * wr + a3.real * wi; \ - tmp1 = tmp5 + tmp7; \ - tmp2 = tmp6 + tmp8; \ - tmp3 = tmp6 - tmp8; \ - tmp4 = tmp7 - tmp5; \ - a2.real = a0.real - tmp1; \ - a2.imag = a0.imag - tmp2; \ - a3.real = a1.real - tmp3; \ - a3.imag = a1.imag - tmp4; \ - a0.real += tmp1; \ - a0.imag += tmp2; \ - a1.real += tmp3; \ - a1.imag += tmp4; \ -} while (0) - -/* split-radix ifft butterfly, specialized for wr=1 wi=0 */ - -#define BUTTERFLY_ZERO(a0,a1,a2,a3) do { \ - tmp1 = a2.real + a3.real; \ - tmp2 = a2.imag + a3.imag; \ - tmp3 = a2.imag - a3.imag; \ - tmp4 = a3.real - a2.real; \ - a2.real = a0.real - tmp1; \ - a2.imag = a0.imag - tmp2; \ - a3.real = a1.real - tmp3; \ - a3.imag = a1.imag - tmp4; \ - a0.real += tmp1; \ - a0.imag += tmp2; \ - a1.real += tmp3; \ - a1.imag += tmp4; \ -} while (0) - -/* split-radix ifft butterfly, specialized for wr=wi */ - -#define BUTTERFLY_HALF(a0,a1,a2,a3,w) do { \ - tmp5 = (a2.real + a2.imag) * w; \ - tmp6 = (a2.imag - a2.real) * w; \ - tmp7 = (a3.real - a3.imag) * w; \ - tmp8 = (a3.imag + a3.real) * w; \ - tmp1 = tmp5 + tmp7; \ - tmp2 = tmp6 + tmp8; \ - tmp3 = tmp6 - tmp8; \ - tmp4 = tmp7 - tmp5; \ - a2.real = a0.real - tmp1; \ - a2.imag = a0.imag - tmp2; \ - a3.real = a1.real - tmp3; \ - a3.imag = a1.imag - tmp4; \ - a0.real += tmp1; \ - a0.imag += tmp2; \ - a1.real += tmp3; \ - a1.imag += tmp4; \ -} while (0) - -static inline void ifft8 (complex_t * buf) -{ - double tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8; - - ifft4 (buf); - ifft2 (buf + 4); - ifft2 (buf + 6); - BUTTERFLY_ZERO (buf[0], buf[2], buf[4], buf[6]); - BUTTERFLY_HALF (buf[1], buf[3], buf[5], buf[7], roots16[1]); -} - -static void ifft_pass (complex_t * buf, sample_t * weight, int n) -{ - complex_t * buf1; - complex_t * buf2; - complex_t * buf3; - double tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8; - int i; - - buf++; - buf1 = buf + n; - buf2 = buf + 2 * n; - buf3 = buf + 3 * n; - - BUTTERFLY_ZERO (buf[-1], buf1[-1], buf2[-1], buf3[-1]); - - i = n - 1; - - do { - BUTTERFLY (buf[0], buf1[0], buf2[0], buf3[0], weight[n], weight[2*i]); - buf++; - buf1++; - buf2++; - buf3++; - weight++; - } while (--i); -} - -static void ifft16 (complex_t * buf) -{ - ifft8 (buf); - ifft4 (buf + 8); - ifft4 (buf + 12); - ifft_pass (buf, roots16 - 4, 4); -} - -static void ifft32 (complex_t * buf) -{ - ifft16 (buf); - ifft8 (buf + 16); - ifft8 (buf + 24); - ifft_pass (buf, roots32 - 8, 8); -} - -static void ifft64_c (complex_t * buf) -{ - ifft32 (buf); - ifft16 (buf + 32); - ifft16 (buf + 48); - ifft_pass (buf, roots64 - 16, 16); -} - -static void ifft128_c (complex_t * buf) -{ - ifft32 (buf); - ifft16 (buf + 32); - ifft16 (buf + 48); - ifft_pass (buf, roots64 - 16, 16); - - ifft32 (buf + 64); - ifft32 (buf + 96); - ifft_pass (buf, roots128 - 32, 32); -} - -void a52_imdct_512 (sample_t * data, sample_t * delay, sample_t bias) -{ - int i, k; - sample_t t_r, t_i, a_r, a_i, b_r, b_i, w_1, w_2; - const sample_t * window = a52_imdct_window; - complex_t buf[128]; - - for (i = 0; i < 128; i++) { - k = fftorder[i]; - t_r = pre1[i].real; - t_i = pre1[i].imag; - - buf[i].real = t_i * data[255-k] + t_r * data[k]; - buf[i].imag = t_r * data[255-k] - t_i * data[k]; - } - - ifft128 (buf); - - /* Post IFFT complex multiply plus IFFT complex conjugate*/ - /* Window and convert to real valued signal */ - for (i = 0; i < 64; i++) { - /* y[n] = z[n] * (xcos1[n] + j * xsin1[n]) ; */ - t_r = post1[i].real; - t_i = post1[i].imag; - - a_r = t_r * buf[i].real + t_i * buf[i].imag; - a_i = t_i * buf[i].real - t_r * buf[i].imag; - b_r = t_i * buf[127-i].real + t_r * buf[127-i].imag; - b_i = t_r * buf[127-i].real - t_i * buf[127-i].imag; - - w_1 = window[2*i]; - w_2 = window[255-2*i]; - data[2*i] = delay[2*i] * w_2 - a_r * w_1 + bias; - data[255-2*i] = delay[2*i] * w_1 + a_r * w_2 + bias; - delay[2*i] = a_i; - - w_1 = window[2*i+1]; - w_2 = window[254-2*i]; - data[2*i+1] = delay[2*i+1] * w_2 + b_r * w_1 + bias; - data[254-2*i] = delay[2*i+1] * w_1 - b_r * w_2 + bias; - delay[2*i+1] = b_i; - } -} - -void a52_imdct_256(sample_t * data, sample_t * delay, sample_t bias) -{ - int i, k; - sample_t t_r, t_i, a_r, a_i, b_r, b_i, c_r, c_i, d_r, d_i, w_1, w_2; - const sample_t * window = a52_imdct_window; - complex_t buf1[64], buf2[64]; - - /* Pre IFFT complex multiply plus IFFT cmplx conjugate */ - for (i = 0; i < 64; i++) { - k = fftorder[i]; - t_r = pre2[i].real; - t_i = pre2[i].imag; - - buf1[i].real = t_i * data[254-k] + t_r * data[k]; - buf1[i].imag = t_r * data[254-k] - t_i * data[k]; - - buf2[i].real = t_i * data[255-k] + t_r * data[k+1]; - buf2[i].imag = t_r * data[255-k] - t_i * data[k+1]; - } - - ifft64 (buf1); - ifft64 (buf2); - - /* Post IFFT complex multiply */ - /* Window and convert to real valued signal */ - for (i = 0; i < 32; i++) { - /* y1[n] = z1[n] * (xcos2[n] + j * xs in2[n]) ; */ - t_r = post2[i].real; - t_i = post2[i].imag; - - a_r = t_r * buf1[i].real + t_i * buf1[i].imag; - a_i = t_i * buf1[i].real - t_r * buf1[i].imag; - b_r = t_i * buf1[63-i].real + t_r * buf1[63-i].imag; - b_i = t_r * buf1[63-i].real - t_i * buf1[63-i].imag; - - c_r = t_r * buf2[i].real + t_i * buf2[i].imag; - c_i = t_i * buf2[i].real - t_r * buf2[i].imag; - d_r = t_i * buf2[63-i].real + t_r * buf2[63-i].imag; - d_i = t_r * buf2[63-i].real - t_i * buf2[63-i].imag; - - w_1 = window[2*i]; - w_2 = window[255-2*i]; - data[2*i] = delay[2*i] * w_2 - a_r * w_1 + bias; - data[255-2*i] = delay[2*i] * w_1 + a_r * w_2 + bias; - delay[2*i] = c_i; - - w_1 = window[128+2*i]; - w_2 = window[127-2*i]; - data[128+2*i] = delay[127-2*i] * w_2 + a_i * w_1 + bias; - data[127-2*i] = delay[127-2*i] * w_1 - a_i * w_2 + bias; - delay[127-2*i] = c_r; - - w_1 = window[2*i+1]; - w_2 = window[254-2*i]; - data[2*i+1] = delay[2*i+1] * w_2 - b_i * w_1 + bias; - data[254-2*i] = delay[2*i+1] * w_1 + b_i * w_2 + bias; - delay[2*i+1] = d_r; - - w_1 = window[129+2*i]; - w_2 = window[126-2*i]; - data[129+2*i] = delay[126-2*i] * w_2 + b_r * w_1 + bias; - data[126-2*i] = delay[126-2*i] * w_1 - b_r * w_2 + bias; - delay[126-2*i] = d_i; - } -} - -static double besselI0 (double x) -{ - double bessel = 1; - int i = 100; - - do - bessel = bessel * x / (i * i) + 1; - while (--i); - return bessel; -} - -void a52_imdct_init (uint32_t mm_accel) -{ - int i, k; - double sum; - - /* compute imdct window - kaiser-bessel derived window, alpha = 5.0 */ - sum = 0; - for (i = 0; i < 256; i++) { - sum += besselI0 (i * (256 - i) * (5 * M_PI / 256) * (5 * M_PI / 256)); - a52_imdct_window[i] = sum; - } - sum++; - for (i = 0; i < 256; i++) - a52_imdct_window[i] = sqrt (a52_imdct_window[i] / sum); - - for (i = 0; i < 3; i++) - roots16[i] = cos ((M_PI / 8) * (i + 1)); - - for (i = 0; i < 7; i++) - roots32[i] = cos ((M_PI / 16) * (i + 1)); - - for (i = 0; i < 15; i++) - roots64[i] = cos ((M_PI / 32) * (i + 1)); - - for (i = 0; i < 31; i++) - roots128[i] = cos ((M_PI / 64) * (i + 1)); - - for (i = 0; i < 64; i++) { - k = fftorder[i] / 2 + 64; - pre1[i].real = cos ((M_PI / 256) * (k - 0.25)); - pre1[i].imag = sin ((M_PI / 256) * (k - 0.25)); - } - - for (i = 64; i < 128; i++) { - k = fftorder[i] / 2 + 64; - pre1[i].real = -cos ((M_PI / 256) * (k - 0.25)); - pre1[i].imag = -sin ((M_PI / 256) * (k - 0.25)); - } - - for (i = 0; i < 64; i++) { - post1[i].real = cos ((M_PI / 256) * (i + 0.5)); - post1[i].imag = sin ((M_PI / 256) * (i + 0.5)); - } - - for (i = 0; i < 64; i++) { - k = fftorder[i] / 4; - pre2[i].real = cos ((M_PI / 128) * (k - 0.25)); - pre2[i].imag = sin ((M_PI / 128) * (k - 0.25)); - } - - for (i = 0; i < 32; i++) { - post2[i].real = cos ((M_PI / 128) * (i + 0.5)); - post2[i].imag = sin ((M_PI / 128) * (i + 0.5)); - } - -#ifdef LIBA52_DJBFFT - if (mm_accel & MM_ACCEL_DJBFFT) { - fprintf (stderr, "liba52:Using djbfft for IMDCT transform\n"); - ifft128 = (void (*) (complex_t *)) fftc4_un128; - ifft64 = (void (*) (complex_t *)) fftc4_un64; - } else -#endif - { - ifft128 = ifft128_c; - ifft64 = ifft64_c; - } -} diff --git a/src/liba52/parse.c b/src/liba52/parse.c deleted file mode 100644 index 0bfd02fce..000000000 --- a/src/liba52/parse.c +++ /dev/null @@ -1,894 +0,0 @@ -/* - * parse.c - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org> - * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> - * - * This file is part of a52dec, a free ATSC A-52 stream decoder. - * See http://liba52.sourceforge.net/ for updates. - * - * a52dec 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. - * - * a52dec 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 - */ - -#include "config.h" - -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> - -#include "a52.h" -#include "a52_internal.h" -#include "bitstream.h" -#include "tables.h" -#include "xineutils.h" - -typedef struct { - sample_t q1[2]; - sample_t q2[2]; - sample_t q4; - int q1_ptr; - int q2_ptr; - int q4_ptr; -} quantizer_t; - -static uint8_t halfrate[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3}; - -a52_state_t * a52_init (uint32_t mm_accel) -{ - a52_state_t * state; - int i; - - state = xine_xmalloc (sizeof (a52_state_t)); - if (state == NULL) - return NULL; - - state->samples = xine_xmalloc_aligned (16, 256 * 12 * sizeof (sample_t), &state->samples_base); - if (state->samples == NULL) { - free (state); - return NULL; - } - - for (i = 0; i < 256 * 12; i++) - state->samples[i] = 0; - - state->downmixed = 1; - - state->lfsr_state = 1; - - a52_imdct_init (mm_accel); - - return state; -} - -sample_t * a52_samples (a52_state_t * state) -{ - return state->samples; -} - -int a52_syncinfo (uint8_t * buf, int * flags, - int * sample_rate, int * bit_rate) -{ - static int rate[] = { 32, 40, 48, 56, 64, 80, 96, 112, - 128, 160, 192, 224, 256, 320, 384, 448, - 512, 576, 640}; - static uint8_t lfeon[8] = {0x10, 0x10, 0x04, 0x04, 0x04, 0x01, 0x04, 0x01}; - int frmsizecod; - int bitrate; - int half; - int acmod; - - if ((buf[0] != 0x0b) || (buf[1] != 0x77)) /* syncword */ - return 0; - - if (buf[5] >= 0x60) /* bsid >= 12 */ - return 0; - half = halfrate[buf[5] >> 3]; - - /* acmod, dsurmod and lfeon */ - acmod = buf[6] >> 5; - *flags = ((((buf[6] & 0xf8) == 0x50) ? A52_DOLBY : acmod) | - ((buf[6] & lfeon[acmod]) ? A52_LFE : 0)); - - frmsizecod = buf[4] & 63; - if (frmsizecod >= 38) - return 0; - bitrate = rate [frmsizecod >> 1]; - *bit_rate = (bitrate * 1000) >> half; - - switch (buf[4] & 0xc0) { - case 0: - *sample_rate = 48000 >> half; - return 4 * bitrate; - case 0x40: - *sample_rate = 44100 >> half; - return 2 * (320 * bitrate / 147 + (frmsizecod & 1)); - case 0x80: - *sample_rate = 32000 >> half; - return 6 * bitrate; - default: - return 0; - } -} - -int a52_frame (a52_state_t * state, uint8_t * buf, int * flags, - sample_t * level, sample_t bias) -{ - static sample_t clev[4] = {LEVEL_3DB, LEVEL_45DB, LEVEL_6DB, LEVEL_45DB}; - static sample_t slev[4] = {LEVEL_3DB, LEVEL_6DB, 0, LEVEL_6DB}; - int chaninfo; - int acmod; - - state->fscod = buf[4] >> 6; - state->halfrate = halfrate[buf[5] >> 3]; - state->acmod = acmod = buf[6] >> 5; - - a52_bitstream_set_ptr (state, buf + 6); - bitstream_get (state, 3); /* skip acmod we already parsed */ - - if ((acmod == 2) && (bitstream_get (state, 2) == 2)) /* dsurmod */ - acmod = A52_DOLBY; - - if ((acmod & 1) && (acmod != 1)) - state->clev = clev[bitstream_get (state, 2)]; /* cmixlev */ - - if (acmod & 4) - state->slev = slev[bitstream_get (state, 2)]; /* surmixlev */ - - state->lfeon = bitstream_get (state, 1); - - state->output = a52_downmix_init (acmod, *flags, level, - state->clev, state->slev); - if (state->output < 0) - return 1; - if (state->lfeon && (*flags & A52_LFE)) - state->output |= A52_LFE; - *flags = state->output; - /* the 2* compensates for differences in imdct */ - state->dynrng = state->level = 2 * *level; - state->bias = bias; - state->dynrnge = 1; - state->dynrngcall = NULL; - state->cplba.deltbae = DELTA_BIT_NONE; - state->ba[0].deltbae = state->ba[1].deltbae = state->ba[2].deltbae = - state->ba[3].deltbae = state->ba[4].deltbae = DELTA_BIT_NONE; - - chaninfo = !acmod; - do { - bitstream_get (state, 5); /* dialnorm */ - if (bitstream_get (state, 1)) /* compre */ - bitstream_get (state, 8); /* compr */ - if (bitstream_get (state, 1)) /* langcode */ - bitstream_get (state, 8); /* langcod */ - if (bitstream_get (state, 1)) /* audprodie */ - bitstream_get (state, 7); /* mixlevel + roomtyp */ - } while (chaninfo--); - - bitstream_get (state, 2); /* copyrightb + origbs */ - - if (bitstream_get (state, 1)) /* timecod1e */ - bitstream_get (state, 14); /* timecod1 */ - if (bitstream_get (state, 1)) /* timecod2e */ - bitstream_get (state, 14); /* timecod2 */ - - if (bitstream_get (state, 1)) { /* addbsie */ - int addbsil; - - addbsil = bitstream_get (state, 6); - do { - bitstream_get (state, 8); /* addbsi */ - } while (addbsil--); - } - - return 0; -} - -void a52_dynrng (a52_state_t * state, - sample_t (* call) (sample_t, void *), void * data) -{ - state->dynrnge = 0; - if (call) { - state->dynrnge = 1; - state->dynrngcall = call; - state->dynrngdata = data; - } -} - -static int parse_exponents (a52_state_t * state, int expstr, int ngrps, - uint8_t exponent, uint8_t * dest) -{ - int exps; - - while (ngrps--) { - exps = bitstream_get (state, 7); - - exponent += exp_1[exps]; - if (exponent > 24) - return 1; - - switch (expstr) { - case EXP_D45: - *(dest++) = exponent; - *(dest++) = exponent; - case EXP_D25: - *(dest++) = exponent; - case EXP_D15: - *(dest++) = exponent; - } - - exponent += exp_2[exps]; - if (exponent > 24) - return 1; - - switch (expstr) { - case EXP_D45: - *(dest++) = exponent; - *(dest++) = exponent; - case EXP_D25: - *(dest++) = exponent; - case EXP_D15: - *(dest++) = exponent; - } - - exponent += exp_3[exps]; - if (exponent > 24) - return 1; - - switch (expstr) { - case EXP_D45: - *(dest++) = exponent; - *(dest++) = exponent; - case EXP_D25: - *(dest++) = exponent; - case EXP_D15: - *(dest++) = exponent; - } - } - - return 0; -} - -static int parse_deltba (a52_state_t * state, int8_t * deltba) -{ - int deltnseg, deltlen, delta, j; - - memset (deltba, 0, 50); - - deltnseg = bitstream_get (state, 3); - j = 0; - do { - j += bitstream_get (state, 5); - deltlen = bitstream_get (state, 4); - delta = bitstream_get (state, 3); - delta -= (delta >= 4) ? 3 : 4; - if (!deltlen) - continue; - if (j + deltlen >= 50) - return 1; - while (deltlen--) - deltba[j++] = delta; - } while (deltnseg--); - - return 0; -} - -static inline int zero_snr_offsets (int nfchans, a52_state_t * state) -{ - int i; - - if ((state->csnroffst) || - (state->chincpl && state->cplba.bai >> 3) || /* cplinu, fsnroffst */ - (state->lfeon && state->lfeba.bai >> 3)) /* fsnroffst */ - return 0; - for (i = 0; i < nfchans; i++) - if (state->ba[i].bai >> 3) /* fsnroffst */ - return 0; - return 1; -} - -static inline int16_t dither_gen (a52_state_t * state) -{ - int16_t nstate; - - nstate = dither_lut[state->lfsr_state >> 8] ^ (state->lfsr_state << 8); - - state->lfsr_state = (uint16_t) nstate; - - return nstate; -} - -static void coeff_get (a52_state_t * state, sample_t * coeff, - expbap_t * expbap, quantizer_t * quantizer, - sample_t level, int dither, int end) -{ - int i; - uint8_t * exp; - int8_t * bap; - sample_t factor[25]; - - for (i = 0; i <= 24; i++) - factor[i] = scale_factor[i] * level; - - exp = expbap->exp; - bap = expbap->bap; - - for (i = 0; i < end; i++) { - int bapi; - - bapi = bap[i]; - switch (bapi) { - case 0: - if (dither) { - coeff[i] = dither_gen (state) * LEVEL_3DB * factor[exp[i]]; - continue; - } else { - coeff[i] = 0; - continue; - } - - case -1: - if (quantizer->q1_ptr >= 0) { - coeff[i] = quantizer->q1[quantizer->q1_ptr--] * factor[exp[i]]; - continue; - } else { - int code; - - code = bitstream_get (state, 5); - - quantizer->q1_ptr = 1; - quantizer->q1[0] = q_1_2[code]; - quantizer->q1[1] = q_1_1[code]; - coeff[i] = q_1_0[code] * factor[exp[i]]; - continue; - } - - case -2: - if (quantizer->q2_ptr >= 0) { - coeff[i] = quantizer->q2[quantizer->q2_ptr--] * factor[exp[i]]; - continue; - } else { - int code; - - code = bitstream_get (state, 7); - - quantizer->q2_ptr = 1; - quantizer->q2[0] = q_2_2[code]; - quantizer->q2[1] = q_2_1[code]; - coeff[i] = q_2_0[code] * factor[exp[i]]; - continue; - } - - case 3: - coeff[i] = q_3[bitstream_get (state, 3)] * factor[exp[i]]; - continue; - - case -3: - if (quantizer->q4_ptr == 0) { - quantizer->q4_ptr = -1; - coeff[i] = quantizer->q4 * factor[exp[i]]; - continue; - } else { - int code; - - code = bitstream_get (state, 7); - - quantizer->q4_ptr = 0; - quantizer->q4 = q_4_1[code]; - coeff[i] = q_4_0[code] * factor[exp[i]]; - continue; - } - - case 4: - coeff[i] = q_5[bitstream_get (state, 4)] * factor[exp[i]]; - continue; - - default: - coeff[i] = ((bitstream_get_2 (state, bapi) << (16 - bapi)) * - factor[exp[i]]); - } - } -} - -static void coeff_get_coupling (a52_state_t * state, int nfchans, - sample_t * coeff, sample_t (* samples)[256], - quantizer_t * quantizer, uint8_t dithflag[5]) -{ - int cplbndstrc, bnd, i, i_end, ch; - uint8_t * exp; - int8_t * bap; - sample_t cplco[5]; - - exp = state->cpl_expbap.exp; - bap = state->cpl_expbap.bap; - bnd = 0; - cplbndstrc = state->cplbndstrc; - i = state->cplstrtmant; - while (i < state->cplendmant) { - i_end = i + 12; - while (cplbndstrc & 1) { - cplbndstrc >>= 1; - i_end += 12; - } - cplbndstrc >>= 1; - for (ch = 0; ch < nfchans; ch++) - cplco[ch] = state->cplco[ch][bnd] * coeff[ch]; - bnd++; - - while (i < i_end) { - sample_t cplcoeff; - int bapi; - - bapi = bap[i]; - switch (bapi) { - case 0: - cplcoeff = LEVEL_3DB * scale_factor[exp[i]]; - for (ch = 0; ch < nfchans; ch++) - if ((state->chincpl >> ch) & 1) { - if (dithflag[ch]) - samples[ch][i] = (cplcoeff * cplco[ch] * - dither_gen (state)); - else - samples[ch][i] = 0; - } - i++; - continue; - - case -1: - if (quantizer->q1_ptr >= 0) { - cplcoeff = quantizer->q1[quantizer->q1_ptr--]; - break; - } else { - int code; - - code = bitstream_get (state, 5); - - quantizer->q1_ptr = 1; - quantizer->q1[0] = q_1_2[code]; - quantizer->q1[1] = q_1_1[code]; - cplcoeff = q_1_0[code]; - break; - } - - case -2: - if (quantizer->q2_ptr >= 0) { - cplcoeff = quantizer->q2[quantizer->q2_ptr--]; - break; - } else { - int code; - - code = bitstream_get (state, 7); - - quantizer->q2_ptr = 1; - quantizer->q2[0] = q_2_2[code]; - quantizer->q2[1] = q_2_1[code]; - cplcoeff = q_2_0[code]; - break; - } - - case 3: - cplcoeff = q_3[bitstream_get (state, 3)]; - break; - - case -3: - if (quantizer->q4_ptr == 0) { - quantizer->q4_ptr = -1; - cplcoeff = quantizer->q4; - break; - } else { - int code; - - code = bitstream_get (state, 7); - - quantizer->q4_ptr = 0; - quantizer->q4 = q_4_1[code]; - cplcoeff = q_4_0[code]; - break; - } - - case 4: - cplcoeff = q_5[bitstream_get (state, 4)]; - break; - - default: - cplcoeff = bitstream_get_2 (state, bapi) << (16 - bapi); - } - - cplcoeff *= scale_factor[exp[i]]; - for (ch = 0; ch < nfchans; ch++) - if ((state->chincpl >> ch) & 1) - samples[ch][i] = cplcoeff * cplco[ch]; - i++; - } - } -} - -int a52_block (a52_state_t * state) -{ - static const uint8_t nfchans_tbl[] = {2, 1, 2, 3, 3, 4, 4, 5, 1, 1, 2}; - static int rematrix_band[4] = {25, 37, 61, 253}; - int i, nfchans, chaninfo; - uint8_t cplexpstr, chexpstr[5], lfeexpstr, do_bit_alloc, done_cpl; - uint8_t blksw[5], dithflag[5]; - sample_t coeff[5]; - int chanbias; - quantizer_t quantizer; - sample_t * samples; - - nfchans = nfchans_tbl[state->acmod]; - - for (i = 0; i < nfchans; i++) - blksw[i] = bitstream_get (state, 1); - - for (i = 0; i < nfchans; i++) - dithflag[i] = bitstream_get (state, 1); - - chaninfo = !state->acmod; - do { - if (bitstream_get (state, 1)) { /* dynrnge */ - int dynrng; - - dynrng = bitstream_get_2 (state, 8); - if (state->dynrnge) { - sample_t range; - - range = ((((dynrng & 0x1f) | 0x20) << 13) * - scale_factor[3 - (dynrng >> 5)]); - if (state->dynrngcall) - range = state->dynrngcall (range, state->dynrngdata); - state->dynrng = state->level * range; - } - } - } while (chaninfo--); - - if (bitstream_get (state, 1)) { /* cplstre */ - state->chincpl = 0; - if (bitstream_get (state, 1)) { /* cplinu */ - static uint8_t bndtab[16] = {31, 35, 37, 39, 41, 42, 43, 44, - 45, 45, 46, 46, 47, 47, 48, 48}; - int cplbegf; - int cplendf; - int ncplsubnd; - - for (i = 0; i < nfchans; i++) - state->chincpl |= bitstream_get (state, 1) << i; - switch (state->acmod) { - case 0: case 1: - return 1; - case 2: - state->phsflginu = bitstream_get (state, 1); - } - cplbegf = bitstream_get (state, 4); - cplendf = bitstream_get (state, 4); - - if (cplendf + 3 - cplbegf < 0) - return 1; - state->ncplbnd = ncplsubnd = cplendf + 3 - cplbegf; - state->cplstrtbnd = bndtab[cplbegf]; - state->cplstrtmant = cplbegf * 12 + 37; - state->cplendmant = cplendf * 12 + 73; - - state->cplbndstrc = 0; - for (i = 0; i < ncplsubnd - 1; i++) - if (bitstream_get (state, 1)) { - state->cplbndstrc |= 1 << i; - state->ncplbnd--; - } - } - } - - if (state->chincpl) { /* cplinu */ - int j, cplcoe; - - cplcoe = 0; - for (i = 0; i < nfchans; i++) - if ((state->chincpl) >> i & 1) - if (bitstream_get (state, 1)) { /* cplcoe */ - int mstrcplco, cplcoexp, cplcomant; - - cplcoe = 1; - mstrcplco = 3 * bitstream_get (state, 2); - for (j = 0; j < state->ncplbnd; j++) { - cplcoexp = bitstream_get (state, 4); - cplcomant = bitstream_get (state, 4); - if (cplcoexp == 15) - cplcomant <<= 14; - else - cplcomant = (cplcomant | 0x10) << 13; - state->cplco[i][j] = - cplcomant * scale_factor[cplcoexp + mstrcplco]; - } - } - if ((state->acmod == 2) && state->phsflginu && cplcoe) - for (j = 0; j < state->ncplbnd; j++) - if (bitstream_get (state, 1)) /* phsflg */ - state->cplco[1][j] = -state->cplco[1][j]; - } - - if ((state->acmod == 2) && (bitstream_get (state, 1))) { /* rematstr */ - int end; - - state->rematflg = 0; - end = (state->chincpl) ? state->cplstrtmant : 253; /* cplinu */ - i = 0; - do - state->rematflg |= bitstream_get (state, 1) << i; - while (rematrix_band[i++] < end); - } - - cplexpstr = EXP_REUSE; - lfeexpstr = EXP_REUSE; - if (state->chincpl) /* cplinu */ - cplexpstr = bitstream_get (state, 2); - for (i = 0; i < nfchans; i++) - chexpstr[i] = bitstream_get (state, 2); - if (state->lfeon) - lfeexpstr = bitstream_get (state, 1); - - for (i = 0; i < nfchans; i++) - if (chexpstr[i] != EXP_REUSE) { - if ((state->chincpl >> i) & 1) - state->endmant[i] = state->cplstrtmant; - else { - int chbwcod; - - chbwcod = bitstream_get (state, 6); - if (chbwcod > 60) - return 1; - state->endmant[i] = chbwcod * 3 + 73; - } - } - - do_bit_alloc = 0; - - if (cplexpstr != EXP_REUSE) { - int cplabsexp, ncplgrps; - - do_bit_alloc = 64; - ncplgrps = ((state->cplendmant - state->cplstrtmant) / - (3 << (cplexpstr - 1))); - cplabsexp = bitstream_get (state, 4) << 1; - if (parse_exponents (state, cplexpstr, ncplgrps, cplabsexp, - state->cpl_expbap.exp + state->cplstrtmant)) - return 1; - } - for (i = 0; i < nfchans; i++) - if (chexpstr[i] != EXP_REUSE) { - int grp_size, nchgrps; - - do_bit_alloc |= 1 << i; - grp_size = 3 << (chexpstr[i] - 1); - nchgrps = (state->endmant[i] + grp_size - 4) / grp_size; - state->fbw_expbap[i].exp[0] = bitstream_get (state, 4); - if (parse_exponents (state, chexpstr[i], nchgrps, - state->fbw_expbap[i].exp[0], - state->fbw_expbap[i].exp + 1)) - return 1; - bitstream_get (state, 2); /* gainrng */ - } - if (lfeexpstr != EXP_REUSE) { - do_bit_alloc |= 32; - state->lfe_expbap.exp[0] = bitstream_get (state, 4); - if (parse_exponents (state, lfeexpstr, 2, state->lfe_expbap.exp[0], - state->lfe_expbap.exp + 1)) - return 1; - } - - if (bitstream_get (state, 1)) { /* baie */ - do_bit_alloc = -1; - state->bai = bitstream_get (state, 11); - } - if (bitstream_get (state, 1)) { /* snroffste */ - do_bit_alloc = -1; - state->csnroffst = bitstream_get (state, 6); - if (state->chincpl) /* cplinu */ - state->cplba.bai = bitstream_get (state, 7); - for (i = 0; i < nfchans; i++) - state->ba[i].bai = bitstream_get (state, 7); - if (state->lfeon) - state->lfeba.bai = bitstream_get (state, 7); - } - if ((state->chincpl) && (bitstream_get (state, 1))) { /* cplleake */ - do_bit_alloc |= 64; - state->cplfleak = 9 - bitstream_get (state, 3); - state->cplsleak = 9 - bitstream_get (state, 3); - } - - if (bitstream_get (state, 1)) { /* deltbaie */ - do_bit_alloc = -1; - if (state->chincpl) /* cplinu */ - state->cplba.deltbae = bitstream_get (state, 2); - for (i = 0; i < nfchans; i++) - state->ba[i].deltbae = bitstream_get (state, 2); - if (state->chincpl && /* cplinu */ - (state->cplba.deltbae == DELTA_BIT_NEW) && - parse_deltba (state, state->cplba.deltba)) - return 1; - for (i = 0; i < nfchans; i++) - if ((state->ba[i].deltbae == DELTA_BIT_NEW) && - parse_deltba (state, state->ba[i].deltba)) - return 1; - } - - if (do_bit_alloc) { - if (zero_snr_offsets (nfchans, state)) { - memset (state->cpl_expbap.bap, 0, sizeof (state->cpl_expbap.bap)); - for (i = 0; i < nfchans; i++) - memset (state->fbw_expbap[i].bap, 0, - sizeof (state->fbw_expbap[i].bap)); - memset (state->lfe_expbap.bap, 0, sizeof (state->lfe_expbap.bap)); - } else { - if (state->chincpl && (do_bit_alloc & 64)) /* cplinu */ - a52_bit_allocate (state, &state->cplba, state->cplstrtbnd, - state->cplstrtmant, state->cplendmant, - state->cplfleak << 8, state->cplsleak << 8, - &state->cpl_expbap); - for (i = 0; i < nfchans; i++) - if (do_bit_alloc & (1 << i)) - a52_bit_allocate (state, state->ba + i, 0, 0, - state->endmant[i], 0, 0, - state->fbw_expbap +i); - if (state->lfeon && (do_bit_alloc & 32)) { - state->lfeba.deltbae = DELTA_BIT_NONE; - a52_bit_allocate (state, &state->lfeba, 0, 0, 7, 0, 0, - &state->lfe_expbap); - } - } - } - - if (bitstream_get (state, 1)) { /* skiple */ - i = bitstream_get (state, 9); /* skipl */ - while (i--) - bitstream_get (state, 8); - } - - samples = state->samples; - if (state->output & A52_LFE) - samples += 256; /* shift for LFE channel */ - - chanbias = a52_downmix_coeff (coeff, state->acmod, state->output, - state->dynrng, state->clev, state->slev); - - quantizer.q1_ptr = quantizer.q2_ptr = quantizer.q4_ptr = -1; - done_cpl = 0; - - for (i = 0; i < nfchans; i++) { - int j; - - coeff_get (state, samples + 256 * i, state->fbw_expbap +i, &quantizer, - coeff[i], dithflag[i], state->endmant[i]); - - if ((state->chincpl >> i) & 1) { - if (!done_cpl) { - done_cpl = 1; - coeff_get_coupling (state, nfchans, coeff, - (sample_t (*)[256])samples, &quantizer, - dithflag); - } - j = state->cplendmant; - } else - j = state->endmant[i]; - do - (samples + 256 * i)[j] = 0; - while (++j < 256); - } - - if (state->acmod == 2) { - int j, end, band, rematflg; - - end = ((state->endmant[0] < state->endmant[1]) ? - state->endmant[0] : state->endmant[1]); - - i = 0; - j = 13; - rematflg = state->rematflg; - do { - if (! (rematflg & 1)) { - rematflg >>= 1; - j = rematrix_band[i++]; - continue; - } - rematflg >>= 1; - band = rematrix_band[i++]; - if (band > end) - band = end; - do { - sample_t tmp0, tmp1; - - tmp0 = samples[j]; - tmp1 = (samples+256)[j]; - samples[j] = tmp0 + tmp1; - (samples+256)[j] = tmp0 - tmp1; - } while (++j < band); - } while (j < end); - } - - if (state->lfeon) { - if (state->output & A52_LFE) { - coeff_get (state, samples - 256, &state->lfe_expbap, &quantizer, - state->dynrng, 0, 7); - for (i = 7; i < 256; i++) - (samples-256)[i] = 0; - a52_imdct_512 (samples - 256, samples + 1536 - 256, state->bias); - } else { - /* just skip the LFE coefficients */ - coeff_get (state, samples + 1280, &state->lfe_expbap, &quantizer, - 0, 0, 7); - } - } - - i = 0; - if (nfchans_tbl[state->output & A52_CHANNEL_MASK] < nfchans) - for (i = 1; i < nfchans; i++) - if (blksw[i] != blksw[0]) - break; - - if (i < nfchans) { - if (state->downmixed) { - state->downmixed = 0; - a52_upmix (samples + 1536, state->acmod, state->output); - } - - for (i = 0; i < nfchans; i++) { - sample_t bias; - - bias = 0; - if (!(chanbias & (1 << i))) - bias = state->bias; - - if (coeff[i]) { - if (blksw[i]) - a52_imdct_256 (samples + 256 * i, samples + 1536 + 256 * i, - bias); - else - a52_imdct_512 (samples + 256 * i, samples + 1536 + 256 * i, - bias); - } else { - int j; - - for (j = 0; j < 256; j++) - (samples + 256 * i)[j] = bias; - } - } - - a52_downmix (samples, state->acmod, state->output, state->bias, - state->clev, state->slev); - } else { - nfchans = nfchans_tbl[state->output & A52_CHANNEL_MASK]; - - a52_downmix (samples, state->acmod, state->output, 0, - state->clev, state->slev); - - if (!state->downmixed) { - state->downmixed = 1; - a52_downmix (samples + 1536, state->acmod, state->output, 0, - state->clev, state->slev); - } - - if (blksw[0]) - for (i = 0; i < nfchans; i++) - a52_imdct_256 (samples + 256 * i, samples + 1536 + 256 * i, - state->bias); - else - for (i = 0; i < nfchans; i++) - a52_imdct_512 (samples + 256 * i, samples + 1536 + 256 * i, - state->bias); - } - - return 0; -} - -void a52_free (a52_state_t * state) -{ - free (state->samples_base); - free (state); -} diff --git a/src/liba52/tables.h b/src/liba52/tables.h deleted file mode 100644 index a35543db7..000000000 --- a/src/liba52/tables.h +++ /dev/null @@ -1,246 +0,0 @@ -/* - * tables.h - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org> - * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> - * - * This file is part of a52dec, a free ATSC A-52 stream decoder. - * See http://liba52.sourceforge.net/ for updates. - * - * a52dec 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. - * - * a52dec 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 - */ - -static const int8_t exp_1[128] = { - -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 25,25,25 -}; -static const int8_t exp_2[128] = { - -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, - -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, - -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, - -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, - -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, - 25,25,25 -}; -static const int8_t exp_3[128] = { - -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2, - -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2, - -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2, - -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2, - -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2, - 25,25,25 -}; - -#define Q0 ((-2 << 15) / 3.0) -#define Q1 (0) -#define Q2 ((2 << 15) / 3.0) - -static const sample_t q_1_0[32] = { - Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0, - Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1, - Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2, - 0,0,0,0,0 -}; - -static const sample_t q_1_1[32] = { - Q0,Q0,Q0,Q1,Q1,Q1,Q2,Q2,Q2, - Q0,Q0,Q0,Q1,Q1,Q1,Q2,Q2,Q2, - Q0,Q0,Q0,Q1,Q1,Q1,Q2,Q2,Q2, - 0,0,0,0,0 -}; - -static const sample_t q_1_2[32] = { - Q0,Q1,Q2,Q0,Q1,Q2,Q0,Q1,Q2, - Q0,Q1,Q2,Q0,Q1,Q2,Q0,Q1,Q2, - Q0,Q1,Q2,Q0,Q1,Q2,Q0,Q1,Q2, - 0,0,0,0,0 -}; - -#undef Q0 -#undef Q1 -#undef Q2 - -#define Q0 ((-4 << 15) / 5.0) -#define Q1 ((-2 << 15) / 5.0) -#define Q2 (0) -#define Q3 ((2 << 15) / 5.0) -#define Q4 ((4 << 15) / 5.0) - -static const sample_t q_2_0[128] = { - Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0, - Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1, - Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2, - Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3, - Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4, - 0,0,0 -}; - -static const sample_t q_2_1[128] = { - Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4, - Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4, - Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4, - Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4, - Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4, - 0,0,0 -}; - -static const sample_t q_2_2[128] = { - Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4, - Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4, - Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4, - Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4, - Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4, - 0,0,0 -}; - -#undef Q0 -#undef Q1 -#undef Q2 -#undef Q3 -#undef Q4 - -static const sample_t q_3[8] = { - (-6 << 15)/7.0, (-4 << 15)/7.0, (-2 << 15)/7.0, 0, - ( 2 << 15)/7.0, ( 4 << 15)/7.0, ( 6 << 15)/7.0, 0 -}; - -#define Q0 ((-10 << 15) / 11.0) -#define Q1 ((-8 << 15) / 11.0) -#define Q2 ((-6 << 15) / 11.0) -#define Q3 ((-4 << 15) / 11.0) -#define Q4 ((-2 << 15) / 11.0) -#define Q5 (0) -#define Q6 ((2 << 15) / 11.0) -#define Q7 ((4 << 15) / 11.0) -#define Q8 ((6 << 15) / 11.0) -#define Q9 ((8 << 15) / 11.0) -#define QA ((10 << 15) / 11.0) - -static const sample_t q_4_0[128] = { - Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, - Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, - Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, - Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, - Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, - Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, - Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, - Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, - Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, - Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, - QA, QA, QA, QA, QA, QA, QA, QA, QA, QA, QA, - 0, 0, 0, 0, 0, 0, 0 -}; - -static const sample_t q_4_1[128] = { - Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA, - Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA, - Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA, - Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA, - Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA, - Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA, - Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA, - Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA, - Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA, - Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA, - Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA, - 0, 0, 0, 0, 0, 0, 0 -}; - -#undef Q0 -#undef Q1 -#undef Q2 -#undef Q3 -#undef Q4 -#undef Q5 -#undef Q6 -#undef Q7 -#undef Q8 -#undef Q9 -#undef QA - -static const sample_t q_5[16] = { - (-14 << 15)/15.0,(-12 << 15)/15.0,(-10 << 15)/15.0, - ( -8 << 15)/15.0,( -6 << 15)/15.0,( -4 << 15)/15.0, - ( -2 << 15)/15.0, 0 ,( 2 << 15)/15.0, - ( 4 << 15)/15.0,( 6 << 15)/15.0,( 8 << 15)/15.0, - ( 10 << 15)/15.0,( 12 << 15)/15.0,( 14 << 15)/15.0, - 0 -}; - -static const sample_t scale_factor[25] = { - 0.000030517578125, - 0.0000152587890625, - 0.00000762939453125, - 0.000003814697265625, - 0.0000019073486328125, - 0.00000095367431640625, - 0.000000476837158203125, - 0.0000002384185791015625, - 0.00000011920928955078125, - 0.000000059604644775390625, - 0.0000000298023223876953125, - 0.00000001490116119384765625, - 0.000000007450580596923828125, - 0.0000000037252902984619140625, - 0.00000000186264514923095703125, - 0.000000000931322574615478515625, - 0.0000000004656612873077392578125, - 0.00000000023283064365386962890625, - 0.000000000116415321826934814453125, - 0.0000000000582076609134674072265625, - 0.00000000002910383045673370361328125, - 0.000000000014551915228366851806640625, - 0.0000000000072759576141834259033203125, - 0.00000000000363797880709171295166015625, - 0.000000000001818989403545856475830078125 -}; - -static const uint16_t dither_lut[256] = { - 0x0000, 0xa011, 0xe033, 0x4022, 0x6077, 0xc066, 0x8044, 0x2055, - 0xc0ee, 0x60ff, 0x20dd, 0x80cc, 0xa099, 0x0088, 0x40aa, 0xe0bb, - 0x21cd, 0x81dc, 0xc1fe, 0x61ef, 0x41ba, 0xe1ab, 0xa189, 0x0198, - 0xe123, 0x4132, 0x0110, 0xa101, 0x8154, 0x2145, 0x6167, 0xc176, - 0x439a, 0xe38b, 0xa3a9, 0x03b8, 0x23ed, 0x83fc, 0xc3de, 0x63cf, - 0x8374, 0x2365, 0x6347, 0xc356, 0xe303, 0x4312, 0x0330, 0xa321, - 0x6257, 0xc246, 0x8264, 0x2275, 0x0220, 0xa231, 0xe213, 0x4202, - 0xa2b9, 0x02a8, 0x428a, 0xe29b, 0xc2ce, 0x62df, 0x22fd, 0x82ec, - 0x8734, 0x2725, 0x6707, 0xc716, 0xe743, 0x4752, 0x0770, 0xa761, - 0x47da, 0xe7cb, 0xa7e9, 0x07f8, 0x27ad, 0x87bc, 0xc79e, 0x678f, - 0xa6f9, 0x06e8, 0x46ca, 0xe6db, 0xc68e, 0x669f, 0x26bd, 0x86ac, - 0x6617, 0xc606, 0x8624, 0x2635, 0x0660, 0xa671, 0xe653, 0x4642, - 0xc4ae, 0x64bf, 0x249d, 0x848c, 0xa4d9, 0x04c8, 0x44ea, 0xe4fb, - 0x0440, 0xa451, 0xe473, 0x4462, 0x6437, 0xc426, 0x8404, 0x2415, - 0xe563, 0x4572, 0x0550, 0xa541, 0x8514, 0x2505, 0x6527, 0xc536, - 0x258d, 0x859c, 0xc5be, 0x65af, 0x45fa, 0xe5eb, 0xa5c9, 0x05d8, - 0xae79, 0x0e68, 0x4e4a, 0xee5b, 0xce0e, 0x6e1f, 0x2e3d, 0x8e2c, - 0x6e97, 0xce86, 0x8ea4, 0x2eb5, 0x0ee0, 0xaef1, 0xeed3, 0x4ec2, - 0x8fb4, 0x2fa5, 0x6f87, 0xcf96, 0xefc3, 0x4fd2, 0x0ff0, 0xafe1, - 0x4f5a, 0xef4b, 0xaf69, 0x0f78, 0x2f2d, 0x8f3c, 0xcf1e, 0x6f0f, - 0xede3, 0x4df2, 0x0dd0, 0xadc1, 0x8d94, 0x2d85, 0x6da7, 0xcdb6, - 0x2d0d, 0x8d1c, 0xcd3e, 0x6d2f, 0x4d7a, 0xed6b, 0xad49, 0x0d58, - 0xcc2e, 0x6c3f, 0x2c1d, 0x8c0c, 0xac59, 0x0c48, 0x4c6a, 0xec7b, - 0x0cc0, 0xacd1, 0xecf3, 0x4ce2, 0x6cb7, 0xcca6, 0x8c84, 0x2c95, - 0x294d, 0x895c, 0xc97e, 0x696f, 0x493a, 0xe92b, 0xa909, 0x0918, - 0xe9a3, 0x49b2, 0x0990, 0xa981, 0x89d4, 0x29c5, 0x69e7, 0xc9f6, - 0x0880, 0xa891, 0xe8b3, 0x48a2, 0x68f7, 0xc8e6, 0x88c4, 0x28d5, - 0xc86e, 0x687f, 0x285d, 0x884c, 0xa819, 0x0808, 0x482a, 0xe83b, - 0x6ad7, 0xcac6, 0x8ae4, 0x2af5, 0x0aa0, 0xaab1, 0xea93, 0x4a82, - 0xaa39, 0x0a28, 0x4a0a, 0xea1b, 0xca4e, 0x6a5f, 0x2a7d, 0x8a6c, - 0x4b1a, 0xeb0b, 0xab29, 0x0b38, 0x2b6d, 0x8b7c, 0xcb5e, 0x6b4f, - 0x8bf4, 0x2be5, 0x6bc7, 0xcbd6, 0xeb83, 0x4b92, 0x0bb0, 0xaba1 -}; diff --git a/src/libfaad/Makefile.am b/src/libfaad/Makefile.am deleted file mode 100644 index 379033b15..000000000 --- a/src/libfaad/Makefile.am +++ /dev/null @@ -1,106 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -AM_CFLAGS = $(DEFAULT_OCFLAGS) $(VISIBILITY_FLAG) -AM_LDFLAGS = $(xineplug_ldflags) - -VPATH = @srcdir@:@srcdir@/codebook: - -SUBDIRS = codebook - -noinst_HEADERS = \ - analysis.h \ - bits.h \ - cfft.h \ - cfft_tab.h \ - common.h \ - decoder.h \ - drc.h \ - drm_dec.h \ - error.h \ - filtbank.h \ - fixed.h \ - huffman.h \ - ic_predict.h \ - is.h \ - iq_table.h \ - kbd_win.h \ - lt_predict.h \ - mdct.h \ - mdct_tab.h \ - mp4.h \ - ms.h \ - output.h \ - pns.h \ - ps_dec.h \ - ps_tables.h \ - pulse.h \ - rvlc.h \ - sbr_dct.h \ - sbr_dec.h \ - sbr_e_nf.h \ - sbr_fbt.h \ - sbr_hfadj.h \ - sbr_hfgen.h \ - sbr_huff.h \ - sbr_noise.h \ - sbr_qmf.h \ - sbr_qmf_c.h \ - sbr_syntax.h \ - sbr_tf_grid.h \ - sine_win.h \ - specrec.h \ - ssr.h \ - ssr_fb.h \ - ssr_ipqf.h \ - ssr_win.h \ - structs.h \ - syntax.h \ - tns.h - -if ENABLE_FAAD -xineplug_LTLIBRARIES = xineplug_decode_faad.la -endif - -xineplug_decode_faad_la_SOURCES = \ - bits.c \ - cfft.c \ - common.c \ - decoder.c \ - drc.c \ - drm_dec.c \ - error.c \ - filtbank.c \ - hcr.c \ - huffman.c \ - ic_predict.c \ - is.c \ - lt_predict.c \ - mdct.c \ - mp4.c \ - ms.c \ - output.c \ - pns.c \ - ps_dec.c \ - ps_syntax.c \ - pulse.c \ - rvlc.c \ - sbr_dct.c \ - sbr_dec.c \ - sbr_e_nf.c \ - sbr_fbt.c \ - sbr_hfadj.c \ - sbr_hfgen.c \ - sbr_huff.c \ - sbr_qmf.c \ - sbr_syntax.c \ - sbr_tf_grid.c \ - specrec.c \ - ssr.c \ - ssr_fb.c \ - ssr_ipqf.c \ - syntax.c \ - tns.c \ - xine_faad_decoder.c - -xineplug_decode_faad_la_LIBADD = -lm $(XINE_LIB) -xineplug_decode_faad_la_CFLAGS = $(AM_CFLAGS) -fno-strict-aliasing diff --git a/src/libfaad/analysis.h b/src/libfaad/analysis.h deleted file mode 100644 index 810a95f3b..000000000 --- a/src/libfaad/analysis.h +++ /dev/null @@ -1,49 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: analysis.h,v 1.7 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#ifndef __ANALYSIS_H__ -#define __ANALYSIS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -#ifdef ANALYSIS -#define DEBUGDEC ,uint8_t print,uint16_t var,uint8_t *dbg -#define DEBUGVAR(A,B,C) ,A,B,C -extern uint16_t dbg_count; -#else -#define DEBUGDEC -#define DEBUGVAR(A,B,C) -#endif - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/bits.c b/src/libfaad/bits.c deleted file mode 100644 index ae273c7d8..000000000 --- a/src/libfaad/bits.c +++ /dev/null @@ -1,213 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: bits.c,v 1.9 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include <stdlib.h> -#include <string.h> -#include "bits.h" - -/* initialize buffer, call once before first getbits or showbits */ -void faad_initbits(bitfile *ld, const void *_buffer, const uint32_t buffer_size) -{ - uint32_t tmp; - - if (ld == NULL) - return; - - memset(ld, 0, sizeof(bitfile)); - - if (buffer_size == 0 || _buffer == NULL) - { - ld->error = 1; - ld->no_more_reading = 1; - return; - } - - ld->buffer = faad_malloc((buffer_size+12)*sizeof(uint8_t)); - memset(ld->buffer, 0, (buffer_size+12)*sizeof(uint8_t)); - memcpy(ld->buffer, _buffer, buffer_size*sizeof(uint8_t)); - - ld->buffer_size = buffer_size; - - tmp = getdword((uint32_t*)ld->buffer); - ld->bufa = tmp; - - tmp = getdword((uint32_t*)ld->buffer + 1); - ld->bufb = tmp; - - ld->start = (uint32_t*)ld->buffer; - ld->tail = ((uint32_t*)ld->buffer + 2); - - ld->bits_left = 32; - - ld->bytes_used = 0; - ld->no_more_reading = 0; - ld->error = 0; -} - -void faad_endbits(bitfile *ld) -{ - if (ld) - { - if (ld->buffer) - { - faad_free(ld->buffer); - ld->buffer = NULL; - } - } -} - -uint32_t faad_get_processed_bits(bitfile *ld) -{ - return (uint32_t)(8 * (4*(ld->tail - ld->start) - 4) - (ld->bits_left)); -} - -uint8_t faad_byte_align(bitfile *ld) -{ - uint8_t remainder = (uint8_t)((32 - ld->bits_left) % 8); - - if (remainder) - { - faad_flushbits(ld, 8 - remainder); - return (8 - remainder); - } - return 0; -} - -void faad_flushbits_ex(bitfile *ld, uint32_t bits) -{ - uint32_t tmp; - - ld->bufa = ld->bufb; - if (ld->no_more_reading == 0) - { - tmp = getdword(ld->tail); - ld->tail++; - } else { - tmp = 0; - } - ld->bufb = tmp; - ld->bits_left += (32 - bits); - ld->bytes_used += 4; - if (ld->bytes_used == ld->buffer_size) - ld->no_more_reading = 1; - if (ld->bytes_used > ld->buffer_size) - ld->error = 1; -} - -/* rewind to beginning */ -void faad_rewindbits(bitfile *ld) -{ - uint32_t tmp; - - tmp = ld->start[0]; -#ifndef ARCH_IS_BIG_ENDIAN - BSWAP(tmp); -#endif - ld->bufa = tmp; - - tmp = ld->start[1]; -#ifndef ARCH_IS_BIG_ENDIAN - BSWAP(tmp); -#endif - ld->bufb = tmp; - ld->bits_left = 32; - ld->tail = &ld->start[2]; - ld->bytes_used = 0; - ld->no_more_reading = 0; -} - -uint8_t *faad_getbitbuffer(bitfile *ld, uint32_t bits - DEBUGDEC) -{ - uint16_t i; - uint8_t temp; - uint16_t bytes = (uint16_t)bits / 8; - uint8_t remainder = (uint8_t)bits % 8; - - uint8_t *buffer = (uint8_t*)faad_malloc((bytes+1)*sizeof(uint8_t)); - - for (i = 0; i < bytes; i++) - { - buffer[i] = (uint8_t)faad_getbits(ld, 8 DEBUGVAR(print,var,dbg)); - } - - if (remainder) - { - temp = (uint8_t)faad_getbits(ld, remainder DEBUGVAR(print,var,dbg)) << (8-remainder); - - buffer[bytes] = temp; - } - - return buffer; -} - -#ifdef DRM -/* return the original data buffer */ -void *faad_origbitbuffer(bitfile *ld) -{ - return (void*)ld->start; -} - -/* return the original data buffer size */ -uint32_t faad_origbitbuffer_size(bitfile *ld) -{ - return ld->buffer_size; -} -#endif - -/* reversed bit reading routines, used for RVLC and HCR */ -void faad_initbits_rev(bitfile *ld, void *buffer, - uint32_t bits_in_buffer) -{ - uint32_t tmp; - int32_t index; - - ld->buffer_size = bit2byte(bits_in_buffer); - - index = (bits_in_buffer+31)/32 - 1; - - ld->start = (uint32_t*)buffer + index - 2; - - tmp = getdword((uint32_t*)buffer + index); - ld->bufa = tmp; - - tmp = getdword((uint32_t*)buffer + index - 1); - ld->bufb = tmp; - - ld->tail = (uint32_t*)buffer + index; - - ld->bits_left = bits_in_buffer % 32; - if (ld->bits_left == 0) - ld->bits_left = 32; - - ld->bytes_used = 0; - ld->no_more_reading = 0; - ld->error = 0; -} diff --git a/src/libfaad/bits.h b/src/libfaad/bits.h deleted file mode 100644 index 05460f0cc..000000000 --- a/src/libfaad/bits.h +++ /dev/null @@ -1,382 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: bits.h,v 1.11 2005/10/30 01:21:53 tmmm Exp $ -**/ - -#ifndef __BITS_H__ -#define __BITS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "analysis.h" -#ifdef ANALYSIS -#include <stdio.h> -#endif - -#define BYTE_NUMBIT 8 -#define bit2byte(a) ((a+7)/BYTE_NUMBIT) - -typedef struct _bitfile -{ - /* bit input */ - uint32_t bufa; - uint32_t bufb; - uint32_t bits_left; - uint32_t buffer_size; /* size of the buffer in bytes */ - uint32_t bytes_used; - uint8_t no_more_reading; - uint8_t error; - uint32_t *tail; - uint32_t *start; - void *buffer; -} bitfile; - - -#if defined(_MSC_VER) -#define BSWAP(a) __asm mov eax,a __asm bswap eax __asm mov a, eax -#elif defined(LINUX) || defined(DJGPP) || defined (__MINGW32__) || defined (__CYGWIN__) -#define BSWAP(a) __asm__ ( "bswapl %0\n" : "=r" (a) : "0" (a) ) -#else -#define BSWAP(a) \ - ((a) = ( ((a)&0xff)<<24) | (((a)&0xff00)<<8) | (((a)>>8)&0xff00) | (((a)>>24)&0xff)) -#endif - -static uint32_t bitmask[] = { - 0x0, 0x1, 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, - 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, - 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, - 0x7FFFFF, 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF, 0x7FFFFFF, - 0xFFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF - /* added bitmask 32, correct?!?!?! */ - , 0xFFFFFFFF -}; - -void faad_initbits(bitfile *ld, const void *buffer, const uint32_t buffer_size); -void faad_endbits(bitfile *ld); -void faad_initbits_rev(bitfile *ld, void *buffer, - uint32_t bits_in_buffer); -uint8_t faad_byte_align(bitfile *ld); -uint32_t faad_get_processed_bits(bitfile *ld); -void faad_flushbits_ex(bitfile *ld, uint32_t bits); -void faad_rewindbits(bitfile *ld); -uint8_t *faad_getbitbuffer(bitfile *ld, uint32_t bits - DEBUGDEC); -#ifdef DRM -void *faad_origbitbuffer(bitfile *ld); -uint32_t faad_origbitbuffer_size(bitfile *ld); -#endif - -/* circumvent memory alignment errors on ARM */ -static INLINE uint32_t getdword(void *mem) -{ -#ifdef ARM - uint32_t tmp; -#ifndef ARCH_IS_BIG_ENDIAN - ((uint8_t*)&tmp)[0] = ((uint8_t*)mem)[3]; - ((uint8_t*)&tmp)[1] = ((uint8_t*)mem)[2]; - ((uint8_t*)&tmp)[2] = ((uint8_t*)mem)[1]; - ((uint8_t*)&tmp)[3] = ((uint8_t*)mem)[0]; -#else - ((uint8_t*)&tmp)[0] = ((uint8_t*)mem)[0]; - ((uint8_t*)&tmp)[1] = ((uint8_t*)mem)[1]; - ((uint8_t*)&tmp)[2] = ((uint8_t*)mem)[2]; - ((uint8_t*)&tmp)[3] = ((uint8_t*)mem)[3]; -#endif - - return tmp; -#else - uint32_t tmp; - tmp = *(uint32_t*)mem; -#ifndef ARCH_IS_BIG_ENDIAN - BSWAP(tmp); -#endif - return tmp; -#endif -} - -static INLINE uint32_t faad_showbits(bitfile *ld, uint32_t bits) -{ - if (bits <= ld->bits_left) - { - return (ld->bufa >> (ld->bits_left - bits)) & bitmask[bits]; - } - - bits -= ld->bits_left; - return ((ld->bufa & bitmask[ld->bits_left]) << bits) | (ld->bufb >> (32 - bits)); -} - -static INLINE void faad_flushbits(bitfile *ld, uint32_t bits) -{ - /* do nothing if error */ - if (ld->error != 0) - return; - - if (bits < ld->bits_left) - { - ld->bits_left -= bits; - } else { - faad_flushbits_ex(ld, bits); - } -} - -/* return next n bits (right adjusted) */ -static INLINE uint32_t faad_getbits(bitfile *ld, uint32_t n DEBUGDEC) -{ - uint32_t ret; - - if (ld->no_more_reading || n == 0) - return 0; - - ret = faad_showbits(ld, n); - faad_flushbits(ld, n); - -#ifdef ANALYSIS - if (print) - fprintf(stdout, "%4d %2d bits, val: %4d, variable: %d %s\n", dbg_count++, n, ret, var, dbg); -#endif - - return ret; -} - -static INLINE uint8_t faad_get1bit(bitfile *ld DEBUGDEC) -{ - uint8_t r; - - if (ld->bits_left > 0) - { - ld->bits_left--; - r = (uint8_t)((ld->bufa >> ld->bits_left) & 1); - return r; - } - - /* bits_left == 0 */ -#if 0 - r = (uint8_t)(ld->bufb >> 31); - faad_flushbits_ex(ld, 1); -#else - r = (uint8_t)faad_getbits(ld, 1); -#endif - return r; -} - -/* reversed bitreading routines */ -static INLINE uint32_t faad_showbits_rev(bitfile *ld, uint32_t bits) -{ - uint8_t i; - uint32_t B = 0; - - if (bits <= ld->bits_left) - { - for (i = 0; i < bits; i++) - { - if (ld->bufa & (1 << (i + (32 - ld->bits_left)))) - B |= (1 << (bits - i - 1)); - } - return B; - } else { - for (i = 0; i < ld->bits_left; i++) - { - if (ld->bufa & (1 << (i + (32 - ld->bits_left)))) - B |= (1 << (bits - i - 1)); - } - for (i = 0; i < bits - ld->bits_left; i++) - { - if (ld->bufb & (1 << (i + (32-ld->bits_left)))) - B |= (1 << (bits - ld->bits_left - i - 1)); - } - return B; - } -} - -static INLINE void faad_flushbits_rev(bitfile *ld, uint32_t bits) -{ - /* do nothing if error */ - if (ld->error != 0) - return; - - if (bits < ld->bits_left) - { - ld->bits_left -= bits; - } else { - uint32_t tmp; - - ld->bufa = ld->bufb; - tmp = getdword(ld->start); - ld->bufb = tmp; - ld->start--; - ld->bits_left += (32 - bits); - - ld->bytes_used += 4; - if (ld->bytes_used == ld->buffer_size) - ld->no_more_reading = 1; - if (ld->bytes_used > ld->buffer_size) - ld->error = 1; - } -} - -static INLINE uint32_t faad_getbits_rev(bitfile *ld, uint32_t n - DEBUGDEC) -{ - uint32_t ret; - - if (ld->no_more_reading) - return 0; - - if (n == 0) - return 0; - - ret = faad_showbits_rev(ld, n); - faad_flushbits_rev(ld, n); - -#ifdef ANALYSIS - if (print) - fprintf(stdout, "%4d %2d bits, val: %4d, variable: %d %s\n", dbg_count++, n, ret, var, dbg); -#endif - - return ret; -} - -#ifdef DRM -static uint8_t faad_check_CRC(bitfile *ld, uint16_t len) -{ - uint8_t CRC; - uint16_t r=255; /* Initialize to all ones */ - - /* CRC polynome used x^8 + x^4 + x^3 + x^2 +1 */ -#define GPOLY 0435 - - faad_rewindbits(ld); - - CRC = (uint8_t) ~faad_getbits(ld, 8 - DEBUGVAR(1,999,"faad_check_CRC(): CRC")); /* CRC is stored inverted */ - - for (; len>0; len--) - { - r = ( (r << 1) ^ (( ( faad_get1bit(ld - DEBUGVAR(1,998,"")) & 1) ^ ((r >> 7) & 1)) * GPOLY )) & 0xFF; - } - - if (r != CRC) - { - return 8; - } else { - return 0; - } -} - -static uint8_t tabFlipbits[256] = { - 0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240, - 8,136,72,200,40,168,104,232,24,152,88,216,56,184,120,248, - 4,132,68,196,36,164,100,228,20,148,84,212,52,180,116,244, - 12,140,76,204,44,172,108,236,28,156,92,220,60,188,124,252, - 2,130,66,194,34,162,98,226,18,146,82,210,50,178,114,242, - 10,138,74,202,42,170,106,234,26,154,90,218,58,186,122,250, - 6,134,70,198,38,166,102,230,22,150,86,214,54,182,118,246, - 14,142,78,206,46,174,110,238,30,158,94,222,62,190,126,254, - 1,129,65,193,33,161,97,225,17,145,81,209,49,177,113,241, - 9,137,73,201,41,169,105,233,25,153,89,217,57,185,121,249, - 5,133,69,197,37,165,101,229,21,149,85,213,53,181,117,245, - 13,141,77,205,45,173,109,237,29,157,93,221,61,189,125,253, - 3,131,67,195,35,163,99,227,19,147,83,211,51,179,115,243, - 11,139,75,203,43,171,107,235,27,155,91,219,59,187,123,251, - 7,135,71,199,39,167,103,231,23,151,87,215,55,183,119,247, - 15,143,79,207,47,175,111,239,31,159,95,223,63,191,127,255 -}; -#endif - -#ifdef ERROR_RESILIENCE - -/* Modified bit reading functions for HCR */ - -typedef struct -{ - /* bit input */ - uint32_t bufa; - uint32_t bufb; - int8_t len; -} bits_t; - - -static INLINE uint32_t showbits_hcr(bits_t *ld, uint8_t bits) -{ - if (bits == 0) return 0; - if (ld->len <= 32) - { - /* huffman_spectral_data_2 needs to read more than may be available, bits maybe - > ld->len, deliver 0 than */ - if (ld->len >= bits) - return ((ld->bufa >> (ld->len - bits)) & (0xFFFFFFFF >> (32 - bits))); - else - return ((ld->bufa << (bits - ld->len)) & (0xFFFFFFFF >> (32 - bits))); - } else { - if ((ld->len - bits) < 32) - { - return ( (ld->bufb & (0xFFFFFFFF >> (64 - ld->len))) << (bits - ld->len + 32)) | - (ld->bufa >> (ld->len - bits)); - } else { - return ((ld->bufb >> (ld->len - bits - 32)) & (0xFFFFFFFF >> (32 - bits))); - } - } -} - -/* return 1 if position is outside of buffer, 0 otherwise */ -static INLINE int8_t flushbits_hcr( bits_t *ld, uint8_t bits) -{ - ld->len -= bits; - - if (ld->len <0) - { - ld->len = 0; - return 1; - } else { - return 0; - } -} - -static INLINE int8_t getbits_hcr(bits_t *ld, uint8_t n, uint32_t *result) -{ - *result = showbits_hcr(ld, n); - return flushbits_hcr(ld, n); -} - -static INLINE int8_t get1bit_hcr(bits_t *ld, uint8_t *result) -{ - uint32_t res; - int8_t ret; - - ret = getbits_hcr(ld, 1, &res); - *result = (int8_t)(res & 1); - return ret; -} - -#endif - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/cfft.c b/src/libfaad/cfft.c deleted file mode 100644 index 61cac2fd5..000000000 --- a/src/libfaad/cfft.c +++ /dev/null @@ -1,1004 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: cfft.c,v 1.12 2006/09/26 18:00:31 dgp85 Exp $ -**/ - -/* - * Algorithmically based on Fortran-77 FFTPACK - * by Paul N. Swarztrauber(Version 4, 1985). - * - * Does even sized fft only - */ - -/* isign is +1 for backward and -1 for forward transforms */ - -#include "common.h" -#include "structs.h" - -#include <stdlib.h> - -#include "cfft.h" -#include "cfft_tab.h" - - -/* static function declarations */ -static void passf2pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa); -static void passf2neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa); -static void passf3(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa1, const complex_t *wa2, const int8_t isign); -static void passf4pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, - const complex_t *wa1, const complex_t *wa2, const complex_t *wa3); -static void passf4neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, - const complex_t *wa1, const complex_t *wa2, const complex_t *wa3); -static void passf5(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, - const complex_t *wa1, const complex_t *wa2, const complex_t *wa3, - const complex_t *wa4, const int8_t isign); -INLINE void cfftf1(uint16_t n, complex_t *c, complex_t *ch, - const uint16_t *ifac, const complex_t *wa, const int8_t isign); -static void cffti1(uint16_t n, complex_t *wa, uint16_t *ifac); - - -/*---------------------------------------------------------------------- - passf2, passf3, passf4, passf5. Complex FFT passes fwd and bwd. - ----------------------------------------------------------------------*/ - -static void passf2pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa) -{ - uint16_t i, k, ah, ac; - - if (ido == 1) - { - for (k = 0; k < l1; k++) - { - ah = 2*k; - ac = 4*k; - - RE(ch[ah]) = RE(cc[ac]) + RE(cc[ac+1]); - RE(ch[ah+l1]) = RE(cc[ac]) - RE(cc[ac+1]); - IM(ch[ah]) = IM(cc[ac]) + IM(cc[ac+1]); - IM(ch[ah+l1]) = IM(cc[ac]) - IM(cc[ac+1]); - } - } else { - for (k = 0; k < l1; k++) - { - ah = k*ido; - ac = 2*k*ido; - - for (i = 0; i < ido; i++) - { - complex_t t2; - - RE(ch[ah+i]) = RE(cc[ac+i]) + RE(cc[ac+i+ido]); - RE(t2) = RE(cc[ac+i]) - RE(cc[ac+i+ido]); - - IM(ch[ah+i]) = IM(cc[ac+i]) + IM(cc[ac+i+ido]); - IM(t2) = IM(cc[ac+i]) - IM(cc[ac+i+ido]); - -#if 1 - ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]), - IM(t2), RE(t2), RE(wa[i]), IM(wa[i])); -#else - ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]), - RE(t2), IM(t2), RE(wa[i]), IM(wa[i])); -#endif - } - } - } -} - -static void passf2neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa) -{ - uint16_t i, k, ah, ac; - - if (ido == 1) - { - for (k = 0; k < l1; k++) - { - ah = 2*k; - ac = 4*k; - - RE(ch[ah]) = RE(cc[ac]) + RE(cc[ac+1]); - RE(ch[ah+l1]) = RE(cc[ac]) - RE(cc[ac+1]); - IM(ch[ah]) = IM(cc[ac]) + IM(cc[ac+1]); - IM(ch[ah+l1]) = IM(cc[ac]) - IM(cc[ac+1]); - } - } else { - for (k = 0; k < l1; k++) - { - ah = k*ido; - ac = 2*k*ido; - - for (i = 0; i < ido; i++) - { - complex_t t2; - - RE(ch[ah+i]) = RE(cc[ac+i]) + RE(cc[ac+i+ido]); - RE(t2) = RE(cc[ac+i]) - RE(cc[ac+i+ido]); - - IM(ch[ah+i]) = IM(cc[ac+i]) + IM(cc[ac+i+ido]); - IM(t2) = IM(cc[ac+i]) - IM(cc[ac+i+ido]); - -#if 1 - ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]), - RE(t2), IM(t2), RE(wa[i]), IM(wa[i])); -#else - ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]), - IM(t2), RE(t2), RE(wa[i]), IM(wa[i])); -#endif - } - } - } -} - - -static void passf3(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa1, const complex_t *wa2, - const int8_t isign) -{ - static real_t taur = FRAC_CONST(-0.5); - static real_t taui = FRAC_CONST(0.866025403784439); - uint16_t i, k, ac, ah; - complex_t c2, c3, d2, d3, t2; - - if (ido == 1) - { - if (isign == 1) - { - for (k = 0; k < l1; k++) - { - ac = 3*k+1; - ah = k; - - RE(t2) = RE(cc[ac]) + RE(cc[ac+1]); - IM(t2) = IM(cc[ac]) + IM(cc[ac+1]); - RE(c2) = RE(cc[ac-1]) + MUL_F(RE(t2),taur); - IM(c2) = IM(cc[ac-1]) + MUL_F(IM(t2),taur); - - RE(ch[ah]) = RE(cc[ac-1]) + RE(t2); - IM(ch[ah]) = IM(cc[ac-1]) + IM(t2); - - RE(c3) = MUL_F((RE(cc[ac]) - RE(cc[ac+1])), taui); - IM(c3) = MUL_F((IM(cc[ac]) - IM(cc[ac+1])), taui); - - RE(ch[ah+l1]) = RE(c2) - IM(c3); - IM(ch[ah+l1]) = IM(c2) + RE(c3); - RE(ch[ah+2*l1]) = RE(c2) + IM(c3); - IM(ch[ah+2*l1]) = IM(c2) - RE(c3); - } - } else { - for (k = 0; k < l1; k++) - { - ac = 3*k+1; - ah = k; - - RE(t2) = RE(cc[ac]) + RE(cc[ac+1]); - IM(t2) = IM(cc[ac]) + IM(cc[ac+1]); - RE(c2) = RE(cc[ac-1]) + MUL_F(RE(t2),taur); - IM(c2) = IM(cc[ac-1]) + MUL_F(IM(t2),taur); - - RE(ch[ah]) = RE(cc[ac-1]) + RE(t2); - IM(ch[ah]) = IM(cc[ac-1]) + IM(t2); - - RE(c3) = MUL_F((RE(cc[ac]) - RE(cc[ac+1])), taui); - IM(c3) = MUL_F((IM(cc[ac]) - IM(cc[ac+1])), taui); - - RE(ch[ah+l1]) = RE(c2) + IM(c3); - IM(ch[ah+l1]) = IM(c2) - RE(c3); - RE(ch[ah+2*l1]) = RE(c2) - IM(c3); - IM(ch[ah+2*l1]) = IM(c2) + RE(c3); - } - } - } else { - if (isign == 1) - { - for (k = 0; k < l1; k++) - { - for (i = 0; i < ido; i++) - { - ac = i + (3*k+1)*ido; - ah = i + k * ido; - - RE(t2) = RE(cc[ac]) + RE(cc[ac+ido]); - RE(c2) = RE(cc[ac-ido]) + MUL_F(RE(t2),taur); - IM(t2) = IM(cc[ac]) + IM(cc[ac+ido]); - IM(c2) = IM(cc[ac-ido]) + MUL_F(IM(t2),taur); - - RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2); - IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2); - - RE(c3) = MUL_F((RE(cc[ac]) - RE(cc[ac+ido])), taui); - IM(c3) = MUL_F((IM(cc[ac]) - IM(cc[ac+ido])), taui); - - RE(d2) = RE(c2) - IM(c3); - IM(d3) = IM(c2) - RE(c3); - RE(d3) = RE(c2) + IM(c3); - IM(d2) = IM(c2) + RE(c3); - -#if 1 - ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]), - IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]), - IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i])); -#else - ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]), - RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]), - RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i])); -#endif - } - } - } else { - for (k = 0; k < l1; k++) - { - for (i = 0; i < ido; i++) - { - ac = i + (3*k+1)*ido; - ah = i + k * ido; - - RE(t2) = RE(cc[ac]) + RE(cc[ac+ido]); - RE(c2) = RE(cc[ac-ido]) + MUL_F(RE(t2),taur); - IM(t2) = IM(cc[ac]) + IM(cc[ac+ido]); - IM(c2) = IM(cc[ac-ido]) + MUL_F(IM(t2),taur); - - RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2); - IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2); - - RE(c3) = MUL_F((RE(cc[ac]) - RE(cc[ac+ido])), taui); - IM(c3) = MUL_F((IM(cc[ac]) - IM(cc[ac+ido])), taui); - - RE(d2) = RE(c2) + IM(c3); - IM(d3) = IM(c2) + RE(c3); - RE(d3) = RE(c2) - IM(c3); - IM(d2) = IM(c2) - RE(c3); - -#if 1 - ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]), - RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]), - RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i])); -#else - ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]), - IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]), - IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i])); -#endif - } - } - } - } -} - - -static void passf4pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa1, const complex_t *wa2, - const complex_t *wa3) -{ - uint16_t i, k, ac, ah; - - if (ido == 1) - { - for (k = 0; k < l1; k++) - { - complex_t t1, t2, t3, t4; - - ac = 4*k; - ah = k; - - RE(t2) = RE(cc[ac]) + RE(cc[ac+2]); - RE(t1) = RE(cc[ac]) - RE(cc[ac+2]); - IM(t2) = IM(cc[ac]) + IM(cc[ac+2]); - IM(t1) = IM(cc[ac]) - IM(cc[ac+2]); - RE(t3) = RE(cc[ac+1]) + RE(cc[ac+3]); - IM(t4) = RE(cc[ac+1]) - RE(cc[ac+3]); - IM(t3) = IM(cc[ac+3]) + IM(cc[ac+1]); - RE(t4) = IM(cc[ac+3]) - IM(cc[ac+1]); - - RE(ch[ah]) = RE(t2) + RE(t3); - RE(ch[ah+2*l1]) = RE(t2) - RE(t3); - - IM(ch[ah]) = IM(t2) + IM(t3); - IM(ch[ah+2*l1]) = IM(t2) - IM(t3); - - RE(ch[ah+l1]) = RE(t1) + RE(t4); - RE(ch[ah+3*l1]) = RE(t1) - RE(t4); - - IM(ch[ah+l1]) = IM(t1) + IM(t4); - IM(ch[ah+3*l1]) = IM(t1) - IM(t4); - } - } else { - for (k = 0; k < l1; k++) - { - ac = 4*k*ido; - ah = k*ido; - - for (i = 0; i < ido; i++) - { - complex_t c2, c3, c4, t1, t2, t3, t4; - - RE(t2) = RE(cc[ac+i]) + RE(cc[ac+i+2*ido]); - RE(t1) = RE(cc[ac+i]) - RE(cc[ac+i+2*ido]); - IM(t2) = IM(cc[ac+i]) + IM(cc[ac+i+2*ido]); - IM(t1) = IM(cc[ac+i]) - IM(cc[ac+i+2*ido]); - RE(t3) = RE(cc[ac+i+ido]) + RE(cc[ac+i+3*ido]); - IM(t4) = RE(cc[ac+i+ido]) - RE(cc[ac+i+3*ido]); - IM(t3) = IM(cc[ac+i+3*ido]) + IM(cc[ac+i+ido]); - RE(t4) = IM(cc[ac+i+3*ido]) - IM(cc[ac+i+ido]); - - RE(c2) = RE(t1) + RE(t4); - RE(c4) = RE(t1) - RE(t4); - - IM(c2) = IM(t1) + IM(t4); - IM(c4) = IM(t1) - IM(t4); - - RE(ch[ah+i]) = RE(t2) + RE(t3); - RE(c3) = RE(t2) - RE(t3); - - IM(ch[ah+i]) = IM(t2) + IM(t3); - IM(c3) = IM(t2) - IM(t3); - -#if 1 - ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]), - IM(c2), RE(c2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&IM(ch[ah+i+2*l1*ido]), &RE(ch[ah+i+2*l1*ido]), - IM(c3), RE(c3), RE(wa2[i]), IM(wa2[i])); - ComplexMult(&IM(ch[ah+i+3*l1*ido]), &RE(ch[ah+i+3*l1*ido]), - IM(c4), RE(c4), RE(wa3[i]), IM(wa3[i])); -#else - ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]), - RE(c2), IM(c2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&RE(ch[ah+i+2*l1*ido]), &IM(ch[ah+i+2*l1*ido]), - RE(c3), IM(c3), RE(wa2[i]), IM(wa2[i])); - ComplexMult(&RE(ch[ah+i+3*l1*ido]), &IM(ch[ah+i+3*l1*ido]), - RE(c4), IM(c4), RE(wa3[i]), IM(wa3[i])); -#endif - } - } - } -} - -static void passf4neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa1, const complex_t *wa2, - const complex_t *wa3) -{ - uint16_t i, k, ac, ah; - - if (ido == 1) - { - for (k = 0; k < l1; k++) - { - complex_t t1, t2, t3, t4; - - ac = 4*k; - ah = k; - - RE(t2) = RE(cc[ac]) + RE(cc[ac+2]); - RE(t1) = RE(cc[ac]) - RE(cc[ac+2]); - IM(t2) = IM(cc[ac]) + IM(cc[ac+2]); - IM(t1) = IM(cc[ac]) - IM(cc[ac+2]); - RE(t3) = RE(cc[ac+1]) + RE(cc[ac+3]); - IM(t4) = RE(cc[ac+1]) - RE(cc[ac+3]); - IM(t3) = IM(cc[ac+3]) + IM(cc[ac+1]); - RE(t4) = IM(cc[ac+3]) - IM(cc[ac+1]); - - RE(ch[ah]) = RE(t2) + RE(t3); - RE(ch[ah+2*l1]) = RE(t2) - RE(t3); - - IM(ch[ah]) = IM(t2) + IM(t3); - IM(ch[ah+2*l1]) = IM(t2) - IM(t3); - - RE(ch[ah+l1]) = RE(t1) - RE(t4); - RE(ch[ah+3*l1]) = RE(t1) + RE(t4); - - IM(ch[ah+l1]) = IM(t1) - IM(t4); - IM(ch[ah+3*l1]) = IM(t1) + IM(t4); - } - } else { - for (k = 0; k < l1; k++) - { - ac = 4*k*ido; - ah = k*ido; - - for (i = 0; i < ido; i++) - { - complex_t c2, c3, c4, t1, t2, t3, t4; - - RE(t2) = RE(cc[ac+i]) + RE(cc[ac+i+2*ido]); - RE(t1) = RE(cc[ac+i]) - RE(cc[ac+i+2*ido]); - IM(t2) = IM(cc[ac+i]) + IM(cc[ac+i+2*ido]); - IM(t1) = IM(cc[ac+i]) - IM(cc[ac+i+2*ido]); - RE(t3) = RE(cc[ac+i+ido]) + RE(cc[ac+i+3*ido]); - IM(t4) = RE(cc[ac+i+ido]) - RE(cc[ac+i+3*ido]); - IM(t3) = IM(cc[ac+i+3*ido]) + IM(cc[ac+i+ido]); - RE(t4) = IM(cc[ac+i+3*ido]) - IM(cc[ac+i+ido]); - - RE(c2) = RE(t1) - RE(t4); - RE(c4) = RE(t1) + RE(t4); - - IM(c2) = IM(t1) - IM(t4); - IM(c4) = IM(t1) + IM(t4); - - RE(ch[ah+i]) = RE(t2) + RE(t3); - RE(c3) = RE(t2) - RE(t3); - - IM(ch[ah+i]) = IM(t2) + IM(t3); - IM(c3) = IM(t2) - IM(t3); - -#if 1 - ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]), - RE(c2), IM(c2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&RE(ch[ah+i+2*l1*ido]), &IM(ch[ah+i+2*l1*ido]), - RE(c3), IM(c3), RE(wa2[i]), IM(wa2[i])); - ComplexMult(&RE(ch[ah+i+3*l1*ido]), &IM(ch[ah+i+3*l1*ido]), - RE(c4), IM(c4), RE(wa3[i]), IM(wa3[i])); -#else - ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]), - IM(c2), RE(c2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&IM(ch[ah+i+2*l1*ido]), &RE(ch[ah+i+2*l1*ido]), - IM(c3), RE(c3), RE(wa2[i]), IM(wa2[i])); - ComplexMult(&IM(ch[ah+i+3*l1*ido]), &RE(ch[ah+i+3*l1*ido]), - IM(c4), RE(c4), RE(wa3[i]), IM(wa3[i])); -#endif - } - } - } -} - -static void passf5(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa1, const complex_t *wa2, const complex_t *wa3, - const complex_t *wa4, const int8_t isign) -{ - static real_t tr11 = FRAC_CONST(0.309016994374947); - static real_t ti11 = FRAC_CONST(0.951056516295154); - static real_t tr12 = FRAC_CONST(-0.809016994374947); - static real_t ti12 = FRAC_CONST(0.587785252292473); - uint16_t i, k, ac, ah; - complex_t c2, c3, c4, c5, d3, d4, d5, d2, t2, t3, t4, t5; - - if (ido == 1) - { - if (isign == 1) - { - for (k = 0; k < l1; k++) - { - ac = 5*k + 1; - ah = k; - - RE(t2) = RE(cc[ac]) + RE(cc[ac+3]); - IM(t2) = IM(cc[ac]) + IM(cc[ac+3]); - RE(t3) = RE(cc[ac+1]) + RE(cc[ac+2]); - IM(t3) = IM(cc[ac+1]) + IM(cc[ac+2]); - RE(t4) = RE(cc[ac+1]) - RE(cc[ac+2]); - IM(t4) = IM(cc[ac+1]) - IM(cc[ac+2]); - RE(t5) = RE(cc[ac]) - RE(cc[ac+3]); - IM(t5) = IM(cc[ac]) - IM(cc[ac+3]); - - RE(ch[ah]) = RE(cc[ac-1]) + RE(t2) + RE(t3); - IM(ch[ah]) = IM(cc[ac-1]) + IM(t2) + IM(t3); - - RE(c2) = RE(cc[ac-1]) + MUL_F(RE(t2),tr11) + MUL_F(RE(t3),tr12); - IM(c2) = IM(cc[ac-1]) + MUL_F(IM(t2),tr11) + MUL_F(IM(t3),tr12); - RE(c3) = RE(cc[ac-1]) + MUL_F(RE(t2),tr12) + MUL_F(RE(t3),tr11); - IM(c3) = IM(cc[ac-1]) + MUL_F(IM(t2),tr12) + MUL_F(IM(t3),tr11); - - ComplexMult(&RE(c5), &RE(c4), - ti11, ti12, RE(t5), RE(t4)); - ComplexMult(&IM(c5), &IM(c4), - ti11, ti12, IM(t5), IM(t4)); - - RE(ch[ah+l1]) = RE(c2) - IM(c5); - IM(ch[ah+l1]) = IM(c2) + RE(c5); - RE(ch[ah+2*l1]) = RE(c3) - IM(c4); - IM(ch[ah+2*l1]) = IM(c3) + RE(c4); - RE(ch[ah+3*l1]) = RE(c3) + IM(c4); - IM(ch[ah+3*l1]) = IM(c3) - RE(c4); - RE(ch[ah+4*l1]) = RE(c2) + IM(c5); - IM(ch[ah+4*l1]) = IM(c2) - RE(c5); - } - } else { - for (k = 0; k < l1; k++) - { - ac = 5*k + 1; - ah = k; - - RE(t2) = RE(cc[ac]) + RE(cc[ac+3]); - IM(t2) = IM(cc[ac]) + IM(cc[ac+3]); - RE(t3) = RE(cc[ac+1]) + RE(cc[ac+2]); - IM(t3) = IM(cc[ac+1]) + IM(cc[ac+2]); - RE(t4) = RE(cc[ac+1]) - RE(cc[ac+2]); - IM(t4) = IM(cc[ac+1]) - IM(cc[ac+2]); - RE(t5) = RE(cc[ac]) - RE(cc[ac+3]); - IM(t5) = IM(cc[ac]) - IM(cc[ac+3]); - - RE(ch[ah]) = RE(cc[ac-1]) + RE(t2) + RE(t3); - IM(ch[ah]) = IM(cc[ac-1]) + IM(t2) + IM(t3); - - RE(c2) = RE(cc[ac-1]) + MUL_F(RE(t2),tr11) + MUL_F(RE(t3),tr12); - IM(c2) = IM(cc[ac-1]) + MUL_F(IM(t2),tr11) + MUL_F(IM(t3),tr12); - RE(c3) = RE(cc[ac-1]) + MUL_F(RE(t2),tr12) + MUL_F(RE(t3),tr11); - IM(c3) = IM(cc[ac-1]) + MUL_F(IM(t2),tr12) + MUL_F(IM(t3),tr11); - - ComplexMult(&RE(c4), &RE(c5), - ti12, ti11, RE(t5), RE(t4)); - ComplexMult(&IM(c4), &IM(c5), - ti12, ti12, IM(t5), IM(t4)); - - RE(ch[ah+l1]) = RE(c2) + IM(c5); - IM(ch[ah+l1]) = IM(c2) - RE(c5); - RE(ch[ah+2*l1]) = RE(c3) + IM(c4); - IM(ch[ah+2*l1]) = IM(c3) - RE(c4); - RE(ch[ah+3*l1]) = RE(c3) - IM(c4); - IM(ch[ah+3*l1]) = IM(c3) + RE(c4); - RE(ch[ah+4*l1]) = RE(c2) - IM(c5); - IM(ch[ah+4*l1]) = IM(c2) + RE(c5); - } - } - } else { - if (isign == 1) - { - for (k = 0; k < l1; k++) - { - for (i = 0; i < ido; i++) - { - ac = i + (k*5 + 1) * ido; - ah = i + k * ido; - - RE(t2) = RE(cc[ac]) + RE(cc[ac+3*ido]); - IM(t2) = IM(cc[ac]) + IM(cc[ac+3*ido]); - RE(t3) = RE(cc[ac+ido]) + RE(cc[ac+2*ido]); - IM(t3) = IM(cc[ac+ido]) + IM(cc[ac+2*ido]); - RE(t4) = RE(cc[ac+ido]) - RE(cc[ac+2*ido]); - IM(t4) = IM(cc[ac+ido]) - IM(cc[ac+2*ido]); - RE(t5) = RE(cc[ac]) - RE(cc[ac+3*ido]); - IM(t5) = IM(cc[ac]) - IM(cc[ac+3*ido]); - - RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2) + RE(t3); - IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2) + IM(t3); - - RE(c2) = RE(cc[ac-ido]) + MUL_F(RE(t2),tr11) + MUL_F(RE(t3),tr12); - IM(c2) = IM(cc[ac-ido]) + MUL_F(IM(t2),tr11) + MUL_F(IM(t3),tr12); - RE(c3) = RE(cc[ac-ido]) + MUL_F(RE(t2),tr12) + MUL_F(RE(t3),tr11); - IM(c3) = IM(cc[ac-ido]) + MUL_F(IM(t2),tr12) + MUL_F(IM(t3),tr11); - - ComplexMult(&RE(c5), &RE(c4), - ti11, ti12, RE(t5), RE(t4)); - ComplexMult(&IM(c5), &IM(c4), - ti11, ti12, IM(t5), IM(t4)); - - IM(d2) = IM(c2) + RE(c5); - IM(d3) = IM(c3) + RE(c4); - RE(d4) = RE(c3) + IM(c4); - RE(d5) = RE(c2) + IM(c5); - RE(d2) = RE(c2) - IM(c5); - IM(d5) = IM(c2) - RE(c5); - RE(d3) = RE(c3) - IM(c4); - IM(d4) = IM(c3) - RE(c4); - -#if 1 - ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]), - IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]), - IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i])); - ComplexMult(&IM(ch[ah+3*l1*ido]), &RE(ch[ah+3*l1*ido]), - IM(d4), RE(d4), RE(wa3[i]), IM(wa3[i])); - ComplexMult(&IM(ch[ah+4*l1*ido]), &RE(ch[ah+4*l1*ido]), - IM(d5), RE(d5), RE(wa4[i]), IM(wa4[i])); -#else - ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]), - RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]), - RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i])); - ComplexMult(&RE(ch[ah+3*l1*ido]), &IM(ch[ah+3*l1*ido]), - RE(d4), IM(d4), RE(wa3[i]), IM(wa3[i])); - ComplexMult(&RE(ch[ah+4*l1*ido]), &IM(ch[ah+4*l1*ido]), - RE(d5), IM(d5), RE(wa4[i]), IM(wa4[i])); -#endif - } - } - } else { - for (k = 0; k < l1; k++) - { - for (i = 0; i < ido; i++) - { - ac = i + (k*5 + 1) * ido; - ah = i + k * ido; - - RE(t2) = RE(cc[ac]) + RE(cc[ac+3*ido]); - IM(t2) = IM(cc[ac]) + IM(cc[ac+3*ido]); - RE(t3) = RE(cc[ac+ido]) + RE(cc[ac+2*ido]); - IM(t3) = IM(cc[ac+ido]) + IM(cc[ac+2*ido]); - RE(t4) = RE(cc[ac+ido]) - RE(cc[ac+2*ido]); - IM(t4) = IM(cc[ac+ido]) - IM(cc[ac+2*ido]); - RE(t5) = RE(cc[ac]) - RE(cc[ac+3*ido]); - IM(t5) = IM(cc[ac]) - IM(cc[ac+3*ido]); - - RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2) + RE(t3); - IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2) + IM(t3); - - RE(c2) = RE(cc[ac-ido]) + MUL_F(RE(t2),tr11) + MUL_F(RE(t3),tr12); - IM(c2) = IM(cc[ac-ido]) + MUL_F(IM(t2),tr11) + MUL_F(IM(t3),tr12); - RE(c3) = RE(cc[ac-ido]) + MUL_F(RE(t2),tr12) + MUL_F(RE(t3),tr11); - IM(c3) = IM(cc[ac-ido]) + MUL_F(IM(t2),tr12) + MUL_F(IM(t3),tr11); - - ComplexMult(&RE(c4), &RE(c5), - ti12, ti11, RE(t5), RE(t4)); - ComplexMult(&IM(c4), &IM(c5), - ti12, ti12, IM(t5), IM(t4)); - - IM(d2) = IM(c2) - RE(c5); - IM(d3) = IM(c3) - RE(c4); - RE(d4) = RE(c3) - IM(c4); - RE(d5) = RE(c2) - IM(c5); - RE(d2) = RE(c2) + IM(c5); - IM(d5) = IM(c2) + RE(c5); - RE(d3) = RE(c3) + IM(c4); - IM(d4) = IM(c3) + RE(c4); - -#if 1 - ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]), - RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]), - RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i])); - ComplexMult(&RE(ch[ah+3*l1*ido]), &IM(ch[ah+3*l1*ido]), - RE(d4), IM(d4), RE(wa3[i]), IM(wa3[i])); - ComplexMult(&RE(ch[ah+4*l1*ido]), &IM(ch[ah+4*l1*ido]), - RE(d5), IM(d5), RE(wa4[i]), IM(wa4[i])); -#else - ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]), - IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]), - IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i])); - ComplexMult(&IM(ch[ah+3*l1*ido]), &RE(ch[ah+3*l1*ido]), - IM(d4), RE(d4), RE(wa3[i]), IM(wa3[i])); - ComplexMult(&IM(ch[ah+4*l1*ido]), &RE(ch[ah+4*l1*ido]), - IM(d5), RE(d5), RE(wa4[i]), IM(wa4[i])); -#endif - } - } - } - } -} - - -/*---------------------------------------------------------------------- - cfftf1, cfftf, cfftb, cffti1, cffti. Complex FFTs. - ----------------------------------------------------------------------*/ - -static INLINE void cfftf1pos(uint16_t n, complex_t *c, complex_t *ch, - const uint16_t *ifac, const complex_t *wa, - const int8_t isign) -{ - uint16_t i; - uint16_t k1, l1, l2; - uint16_t na, nf, ip, iw, ix2, ix3, ix4, ido, idl1; - - nf = ifac[1]; - na = 0; - l1 = 1; - iw = 0; - - for (k1 = 2; k1 <= nf+1; k1++) - { - ip = ifac[k1]; - l2 = ip*l1; - ido = n / l2; - idl1 = ido*l1; - - switch (ip) - { - case 4: - ix2 = iw + ido; - ix3 = ix2 + ido; - - if (na == 0) - passf4pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3]); - else - passf4pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3]); - - na = 1 - na; - break; - case 2: - if (na == 0) - passf2pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw]); - else - passf2pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw]); - - na = 1 - na; - break; - case 3: - ix2 = iw + ido; - - if (na == 0) - passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], isign); - else - passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], isign); - - na = 1 - na; - break; - case 5: - ix2 = iw + ido; - ix3 = ix2 + ido; - ix4 = ix3 + ido; - - if (na == 0) - passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); - else - passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); - - na = 1 - na; - break; - } - - l1 = l2; - iw += (ip-1) * ido; - } - - if (na == 0) - return; - - for (i = 0; i < n; i++) - { - RE(c[i]) = RE(ch[i]); - IM(c[i]) = IM(ch[i]); - } -} - -static INLINE void cfftf1neg(uint16_t n, complex_t *c, complex_t *ch, - const uint16_t *ifac, const complex_t *wa, - const int8_t isign) -{ - uint16_t i; - uint16_t k1, l1, l2; - uint16_t na, nf, ip, iw, ix2, ix3, ix4, ido, idl1; - - nf = ifac[1]; - na = 0; - l1 = 1; - iw = 0; - - for (k1 = 2; k1 <= nf+1; k1++) - { - ip = ifac[k1]; - l2 = ip*l1; - ido = n / l2; - idl1 = ido*l1; - - switch (ip) - { - case 4: - ix2 = iw + ido; - ix3 = ix2 + ido; - - if (na == 0) - passf4neg((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3]); - else - passf4neg((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3]); - - na = 1 - na; - break; - case 2: - if (na == 0) - passf2neg((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw]); - else - passf2neg((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw]); - - na = 1 - na; - break; - case 3: - ix2 = iw + ido; - - if (na == 0) - passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], isign); - else - passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], isign); - - na = 1 - na; - break; - case 5: - ix2 = iw + ido; - ix3 = ix2 + ido; - ix4 = ix3 + ido; - - if (na == 0) - passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); - else - passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); - - na = 1 - na; - break; - } - - l1 = l2; - iw += (ip-1) * ido; - } - - if (na == 0) - return; - - for (i = 0; i < n; i++) - { - RE(c[i]) = RE(ch[i]); - IM(c[i]) = IM(ch[i]); - } -} - -void cfftf(cfft_info *cfft, complex_t *c) -{ - cfftf1neg(cfft->n, c, cfft->work, (const uint16_t*)cfft->ifac, (const complex_t*)cfft->tab, -1); -} - -void cfftb(cfft_info *cfft, complex_t *c) -{ - cfftf1pos(cfft->n, c, cfft->work, (const uint16_t*)cfft->ifac, (const complex_t*)cfft->tab, +1); -} - -static void cffti1(uint16_t n, complex_t *wa, uint16_t *ifac) -{ - static uint16_t ntryh[4] = {3, 4, 2, 5}; -#ifndef FIXED_POINT - real_t arg, argh, argld, fi; - uint16_t ido, ipm; - uint16_t i1, k1, l1, l2; - uint16_t ld, ii, ip; -#endif - uint16_t ntry = 0, i, j; - uint16_t ib; - uint16_t nf, nl, nq, nr; - - nl = n; - nf = 0; - j = 0; - -startloop: - j++; - - if (j <= 4) - ntry = ntryh[j-1]; - else - ntry += 2; - - do - { - nq = nl / ntry; - nr = nl - ntry*nq; - - if (nr != 0) - goto startloop; - - nf++; - ifac[nf+1] = ntry; - nl = nq; - - if (ntry == 2 && nf != 1) - { - for (i = 2; i <= nf; i++) - { - ib = nf - i + 2; - ifac[ib+1] = ifac[ib]; - } - ifac[2] = 2; - } - } while (nl != 1); - - ifac[0] = n; - ifac[1] = nf; - -#ifndef FIXED_POINT - argh = (real_t)2.0*(real_t)M_PI / (real_t)n; - i = 0; - l1 = 1; - - for (k1 = 1; k1 <= nf; k1++) - { - ip = ifac[k1+1]; - ld = 0; - l2 = l1*ip; - ido = n / l2; - ipm = ip - 1; - - for (j = 0; j < ipm; j++) - { - i1 = i; - RE(wa[i]) = 1.0; - IM(wa[i]) = 0.0; - ld += l1; - fi = 0; - argld = ld*argh; - - for (ii = 0; ii < ido; ii++) - { - i++; - fi++; - arg = fi * argld; - RE(wa[i]) = (real_t)cos(arg); -#if 1 - IM(wa[i]) = (real_t)sin(arg); -#else - IM(wa[i]) = (real_t)-sin(arg); -#endif - } - - if (ip > 5) - { - RE(wa[i1]) = RE(wa[i]); - IM(wa[i1]) = IM(wa[i]); - } - } - l1 = l2; - } -#endif -} - -cfft_info *cffti(uint16_t n) -{ - cfft_info *cfft = (cfft_info*)faad_malloc(sizeof(cfft_info)); - - cfft->n = n; - cfft->work = (complex_t*)faad_malloc(n*sizeof(complex_t)); - -#ifndef FIXED_POINT - cfft->tab = (complex_t*)faad_malloc(n*sizeof(complex_t)); - - cffti1(n, cfft->tab, cfft->ifac); -#else - cffti1(n, NULL, cfft->ifac); - - switch (n) - { - case 64: cfft->tab = (complex_t*)cfft_tab_64; break; - case 512: cfft->tab = (complex_t*)cfft_tab_512; break; -#ifdef LD_DEC - case 256: cfft->tab = (complex_t*)cfft_tab_256; break; -#endif - -#ifdef ALLOW_SMALL_FRAMELENGTH - case 60: cfft->tab = (complex_t*)cfft_tab_60; break; - case 480: cfft->tab = (complex_t*)cfft_tab_480; break; -#ifdef LD_DEC - case 240: cfft->tab = (complex_t*)cfft_tab_240; break; -#endif -#endif - case 128: cfft->tab = (complex_t*)cfft_tab_128; break; - } -#endif - - return cfft; -} - -void cfftu(cfft_info *cfft) -{ - if ( ! cfft ) return; - - faad_free(cfft->work); -#ifndef FIXED_POINT - faad_free(cfft->tab); -#endif - - faad_free(cfft); -} - diff --git a/src/libfaad/cfft.h b/src/libfaad/cfft.h deleted file mode 100644 index a29537bed..000000000 --- a/src/libfaad/cfft.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: cfft.h,v 1.9 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#ifndef __CFFT_H__ -#define __CFFT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct -{ - uint16_t n; - uint16_t ifac[15]; - complex_t *work; - complex_t *tab; -} cfft_info; - - -void cfftf(cfft_info *cfft, complex_t *c); -void cfftb(cfft_info *cfft, complex_t *c); -cfft_info *cffti(uint16_t n); -void cfftu(cfft_info *cfft); - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/cfft_tab.h b/src/libfaad/cfft_tab.h deleted file mode 100644 index 072a991f1..000000000 --- a/src/libfaad/cfft_tab.h +++ /dev/null @@ -1,1820 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: cfft_tab.h,v 1.6 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#ifndef __CFFT_TAB_H__ -#define __CFFT_TAB_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef FIXED_POINT - -ALIGN static const complex_t cfft_tab_512[] = -{ - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.999924719333649), FRAC_CONST(0.012271538376808) }, - { FRAC_CONST(0.999698817729950), FRAC_CONST(0.024541229009628) }, - { FRAC_CONST(0.999322354793549), FRAC_CONST(0.036807224154472) }, - { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, - { FRAC_CONST(0.998118102550507), FRAC_CONST(0.061320740729570) }, - { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, - { FRAC_CONST(0.996312618255615), FRAC_CONST(0.085797317326069) }, - { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, - { FRAC_CONST(0.993906974792480), FRAC_CONST(0.110222205519676) }, - { FRAC_CONST(0.992479562759399), FRAC_CONST(0.122410677373409) }, - { FRAC_CONST(0.990902662277222), FRAC_CONST(0.134580716490746) }, - { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, - { FRAC_CONST(0.987301409244537), FRAC_CONST(0.158858150243759) }, - { FRAC_CONST(0.985277652740479), FRAC_CONST(0.170961901545525) }, - { FRAC_CONST(0.983105480670929), FRAC_CONST(0.183039888739586) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.978317379951477), FRAC_CONST(0.207111388444901) }, - { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, - { FRAC_CONST(0.972939968109131), FRAC_CONST(0.231058120727539) }, - { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, - { FRAC_CONST(0.966976463794708), FRAC_CONST(0.254865676164627) }, - { FRAC_CONST(0.963776051998138), FRAC_CONST(0.266712784767151) }, - { FRAC_CONST(0.960430502891541), FRAC_CONST(0.278519690036774) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.953306019306183), FRAC_CONST(0.302005946636200) }, - { FRAC_CONST(0.949528157711029), FRAC_CONST(0.313681751489639) }, - { FRAC_CONST(0.945607304573059), FRAC_CONST(0.325310319662094) }, - { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, - { FRAC_CONST(0.937339007854462), FRAC_CONST(0.348418682813644) }, - { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, - { FRAC_CONST(0.928506076335907), FRAC_CONST(0.371317207813263) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.919113874435425), FRAC_CONST(0.393992066383362) }, - { FRAC_CONST(0.914209723472595), FRAC_CONST(0.405241340398788) }, - { FRAC_CONST(0.909167945384979), FRAC_CONST(0.416429579257965) }, - { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, - { FRAC_CONST(0.898674488067627), FRAC_CONST(0.438616245985031) }, - { FRAC_CONST(0.893224298954010), FRAC_CONST(0.449611335992813) }, - { FRAC_CONST(0.887639641761780), FRAC_CONST(0.460538715124130) }, - { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, - { FRAC_CONST(0.876070082187653), FRAC_CONST(0.482183754444122) }, - { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, - { FRAC_CONST(0.863972842693329), FRAC_CONST(0.503538370132446) }, - { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, - { FRAC_CONST(0.851355195045471), FRAC_CONST(0.524589717388153) }, - { FRAC_CONST(0.844853579998016), FRAC_CONST(0.534997642040253) }, - { FRAC_CONST(0.838224709033966), FRAC_CONST(0.545324981212616) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.824589252471924), FRAC_CONST(0.565731823444366) }, - { FRAC_CONST(0.817584812641144), FRAC_CONST(0.575808227062225) }, - { FRAC_CONST(0.810457170009613), FRAC_CONST(0.585797905921936) }, - { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, - { FRAC_CONST(0.795836925506592), FRAC_CONST(0.605511009693146) }, - { FRAC_CONST(0.788346409797668), FRAC_CONST(0.615231633186340) }, - { FRAC_CONST(0.780737221240997), FRAC_CONST(0.624859511852264) }, - { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, - { FRAC_CONST(0.765167236328125), FRAC_CONST(0.643831551074982) }, - { FRAC_CONST(0.757208824157715), FRAC_CONST(0.653172850608826) }, - { FRAC_CONST(0.749136388301849), FRAC_CONST(0.662415802478790) }, - { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, - { FRAC_CONST(0.732654273509979), FRAC_CONST(0.680601000785828) }, - { FRAC_CONST(0.724247097969055), FRAC_CONST(0.689540565013886) }, - { FRAC_CONST(0.715730786323547), FRAC_CONST(0.698376297950745) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.698376238346100), FRAC_CONST(0.715730845928192) }, - { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, - { FRAC_CONST(0.680601000785828), FRAC_CONST(0.732654273509979) }, - { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, - { FRAC_CONST(0.662415742874146), FRAC_CONST(0.749136388301849) }, - { FRAC_CONST(0.653172791004181), FRAC_CONST(0.757208883762360) }, - { FRAC_CONST(0.643831551074982), FRAC_CONST(0.765167295932770) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.624859452247620), FRAC_CONST(0.780737280845642) }, - { FRAC_CONST(0.615231573581696), FRAC_CONST(0.788346409797668) }, - { FRAC_CONST(0.605511009693146), FRAC_CONST(0.795836925506592) }, - { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(0.585797846317291), FRAC_CONST(0.810457170009613) }, - { FRAC_CONST(0.575808167457581), FRAC_CONST(0.817584812641144) }, - { FRAC_CONST(0.565731823444366), FRAC_CONST(0.824589312076569) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.545324981212616), FRAC_CONST(0.838224709033966) }, - { FRAC_CONST(0.534997642040253), FRAC_CONST(0.844853579998016) }, - { FRAC_CONST(0.524589657783508), FRAC_CONST(0.851355195045471) }, - { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, - { FRAC_CONST(0.503538429737091), FRAC_CONST(0.863972842693329) }, - { FRAC_CONST(0.492898195981979), FRAC_CONST(0.870086967945099) }, - { FRAC_CONST(0.482183724641800), FRAC_CONST(0.876070141792297) }, - { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, - { FRAC_CONST(0.460538715124130), FRAC_CONST(0.887639641761780) }, - { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, - { FRAC_CONST(0.438616186380386), FRAC_CONST(0.898674488067627) }, - { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, - { FRAC_CONST(0.416429549455643), FRAC_CONST(0.909168004989624) }, - { FRAC_CONST(0.405241280794144), FRAC_CONST(0.914209783077240) }, - { FRAC_CONST(0.393991947174072), FRAC_CONST(0.919113874435425) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.371317148208618), FRAC_CONST(0.928506076335907) }, - { FRAC_CONST(0.359894961118698), FRAC_CONST(0.932992815971375) }, - { FRAC_CONST(0.348418682813644), FRAC_CONST(0.937339007854462) }, - { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(0.325310230255127), FRAC_CONST(0.945607364177704) }, - { FRAC_CONST(0.313681662082672), FRAC_CONST(0.949528217315674) }, - { FRAC_CONST(0.302005946636200), FRAC_CONST(0.953306019306183) }, - { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, - { FRAC_CONST(0.278519600629807), FRAC_CONST(0.960430562496185) }, - { FRAC_CONST(0.266712754964828), FRAC_CONST(0.963776051998138) }, - { FRAC_CONST(0.254865646362305), FRAC_CONST(0.966976463794708) }, - { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(0.231058135628700), FRAC_CONST(0.972939968109131) }, - { FRAC_CONST(0.219101220369339), FRAC_CONST(0.975702106952667) }, - { FRAC_CONST(0.207111328840256), FRAC_CONST(0.978317379951477) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(0.183039888739586), FRAC_CONST(0.983105480670929) }, - { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, - { FRAC_CONST(0.158858075737953), FRAC_CONST(0.987301409244537) }, - { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, - { FRAC_CONST(0.134580686688423), FRAC_CONST(0.990902662277222) }, - { FRAC_CONST(0.122410625219345), FRAC_CONST(0.992479562759399) }, - { FRAC_CONST(0.110222116112709), FRAC_CONST(0.993906974792480) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(0.085797272622585), FRAC_CONST(0.996312618255615) }, - { FRAC_CONST(0.073564492166042), FRAC_CONST(0.997290432453156) }, - { FRAC_CONST(0.061320748180151), FRAC_CONST(0.998118102550507) }, - { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(0.036807164549828), FRAC_CONST(0.999322414398193) }, - { FRAC_CONST(0.024541135877371), FRAC_CONST(0.999698817729950) }, - { FRAC_CONST(0.012271529063582), FRAC_CONST(0.999924719333649) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.012271616607904), FRAC_CONST(0.999924719333649) }, - { FRAC_CONST(-0.024541223421693), FRAC_CONST(0.999698817729950) }, - { FRAC_CONST(-0.036807250231504), FRAC_CONST(0.999322354793549) }, - { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(-0.061320833861828), FRAC_CONST(0.998118102550507) }, - { FRAC_CONST(-0.073564574122429), FRAC_CONST(0.997290432453156) }, - { FRAC_CONST(-0.085797362029552), FRAC_CONST(0.996312618255615) }, - { FRAC_CONST(-0.098017223179340), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(-0.110222205519676), FRAC_CONST(0.993906974792480) }, - { FRAC_CONST(-0.122410707175732), FRAC_CONST(0.992479503154755) }, - { FRAC_CONST(-0.134580776095390), FRAC_CONST(0.990902602672577) }, - { FRAC_CONST(-0.146730571985245), FRAC_CONST(0.989176511764526) }, - { FRAC_CONST(-0.158858165144920), FRAC_CONST(0.987301409244537) }, - { FRAC_CONST(-0.170961946249008), FRAC_CONST(0.985277652740479) }, - { FRAC_CONST(-0.183039978146553), FRAC_CONST(0.983105480670929) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.207111418247223), FRAC_CONST(0.978317379951477) }, - { FRAC_CONST(-0.219101309776306), FRAC_CONST(0.975702106952667) }, - { FRAC_CONST(-0.231058210134506), FRAC_CONST(0.972939908504486) }, - { FRAC_CONST(-0.242980197072029), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(-0.254865705966949), FRAC_CONST(0.966976463794708) }, - { FRAC_CONST(-0.266712844371796), FRAC_CONST(0.963776051998138) }, - { FRAC_CONST(-0.278519690036774), FRAC_CONST(0.960430502891541) }, - { FRAC_CONST(-0.290284723043442), FRAC_CONST(0.956940293312073) }, - { FRAC_CONST(-0.302006036043167), FRAC_CONST(0.953306019306183) }, - { FRAC_CONST(-0.313681721687317), FRAC_CONST(0.949528157711029) }, - { FRAC_CONST(-0.325310319662094), FRAC_CONST(0.945607304573059) }, - { FRAC_CONST(-0.336889922618866), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(-0.348418772220612), FRAC_CONST(0.937338948249817) }, - { FRAC_CONST(-0.359895050525665), FRAC_CONST(0.932992815971375) }, - { FRAC_CONST(-0.371317237615585), FRAC_CONST(0.928506076335907) }, - { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.393992036581039), FRAC_CONST(0.919113874435425) }, - { FRAC_CONST(-0.405241340398788), FRAC_CONST(0.914209723472595) }, - { FRAC_CONST(-0.416429519653320), FRAC_CONST(0.909168004989624) }, - { FRAC_CONST(-0.427555084228516), FRAC_CONST(0.903989315032959) }, - { FRAC_CONST(-0.438616245985031), FRAC_CONST(0.898674428462982) }, - { FRAC_CONST(-0.449611365795136), FRAC_CONST(0.893224298954010) }, - { FRAC_CONST(-0.460538804531097), FRAC_CONST(0.887639582157135) }, - { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, - { FRAC_CONST(-0.482183903455734), FRAC_CONST(0.876070022583008) }, - { FRAC_CONST(-0.492898166179657), FRAC_CONST(0.870087027549744) }, - { FRAC_CONST(-0.503538370132446), FRAC_CONST(0.863972842693329) }, - { FRAC_CONST(-0.514102756977081), FRAC_CONST(0.857728600502014) }, - { FRAC_CONST(-0.524589717388153), FRAC_CONST(0.851355135440826) }, - { FRAC_CONST(-0.534997701644897), FRAC_CONST(0.844853520393372) }, - { FRAC_CONST(-0.545325100421906), FRAC_CONST(0.838224649429321) }, - { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, - { FRAC_CONST(-0.565731763839722), FRAC_CONST(0.824589312076569) }, - { FRAC_CONST(-0.575808167457581), FRAC_CONST(0.817584812641144) }, - { FRAC_CONST(-0.585797905921936), FRAC_CONST(0.810457170009613) }, - { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(-0.605511128902435), FRAC_CONST(0.795836865901947) }, - { FRAC_CONST(-0.615231692790985), FRAC_CONST(0.788346350193024) }, - { FRAC_CONST(-0.624859631061554), FRAC_CONST(0.780737102031708) }, - { FRAC_CONST(-0.634393274784088), FRAC_CONST(0.773010492324829) }, - { FRAC_CONST(-0.643831551074982), FRAC_CONST(0.765167236328125) }, - { FRAC_CONST(-0.653172850608826), FRAC_CONST(0.757208824157715) }, - { FRAC_CONST(-0.662415802478790), FRAC_CONST(0.749136328697205) }, - { FRAC_CONST(-0.671559035778046), FRAC_CONST(0.740951061248779) }, - { FRAC_CONST(-0.680601119995117), FRAC_CONST(0.732654154300690) }, - { FRAC_CONST(-0.689540684223175), FRAC_CONST(0.724246978759766) }, - { FRAC_CONST(-0.698376238346100), FRAC_CONST(0.715730845928192) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.715730845928192), FRAC_CONST(0.698376238346100) }, - { FRAC_CONST(-0.724247157573700), FRAC_CONST(0.689540505409241) }, - { FRAC_CONST(-0.732654333114624), FRAC_CONST(0.680600941181183) }, - { FRAC_CONST(-0.740951240062714), FRAC_CONST(0.671558856964111) }, - { FRAC_CONST(-0.749136507511139), FRAC_CONST(0.662415623664856) }, - { FRAC_CONST(-0.757208824157715), FRAC_CONST(0.653172850608826) }, - { FRAC_CONST(-0.765167295932770), FRAC_CONST(0.643831551074982) }, - { FRAC_CONST(-0.773010492324829), FRAC_CONST(0.634393274784088) }, - { FRAC_CONST(-0.780737280845642), FRAC_CONST(0.624859452247620) }, - { FRAC_CONST(-0.788346469402313), FRAC_CONST(0.615231513977051) }, - { FRAC_CONST(-0.795836985111237), FRAC_CONST(0.605510950088501) }, - { FRAC_CONST(-0.803207635879517), FRAC_CONST(0.595699131488800) }, - { FRAC_CONST(-0.810457170009613), FRAC_CONST(0.585797846317291) }, - { FRAC_CONST(-0.817584812641144), FRAC_CONST(0.575808167457581) }, - { FRAC_CONST(-0.824589312076569), FRAC_CONST(0.565731763839722) }, - { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, - { FRAC_CONST(-0.838224768638611), FRAC_CONST(0.545324862003326) }, - { FRAC_CONST(-0.844853639602661), FRAC_CONST(0.534997463226318) }, - { FRAC_CONST(-0.851355314254761), FRAC_CONST(0.524589538574219) }, - { FRAC_CONST(-0.857728600502014), FRAC_CONST(0.514102756977081) }, - { FRAC_CONST(-0.863972842693329), FRAC_CONST(0.503538370132446) }, - { FRAC_CONST(-0.870087027549744), FRAC_CONST(0.492898136377335) }, - { FRAC_CONST(-0.876070141792297), FRAC_CONST(0.482183694839478) }, - { FRAC_CONST(-0.881921350955963), FRAC_CONST(0.471396625041962) }, - { FRAC_CONST(-0.887639701366425), FRAC_CONST(0.460538566112518) }, - { FRAC_CONST(-0.893224298954010), FRAC_CONST(0.449611365795136) }, - { FRAC_CONST(-0.898674488067627), FRAC_CONST(0.438616245985031) }, - { FRAC_CONST(-0.903989315032959), FRAC_CONST(0.427555054426193) }, - { FRAC_CONST(-0.909168004989624), FRAC_CONST(0.416429489850998) }, - { FRAC_CONST(-0.914209783077240), FRAC_CONST(0.405241221189499) }, - { FRAC_CONST(-0.919113874435425), FRAC_CONST(0.393991917371750) }, - { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, - { FRAC_CONST(-0.928506076335907), FRAC_CONST(0.371317237615585) }, - { FRAC_CONST(-0.932992815971375), FRAC_CONST(0.359895050525665) }, - { FRAC_CONST(-0.937339007854462), FRAC_CONST(0.348418653011322) }, - { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, - { FRAC_CONST(-0.945607364177704), FRAC_CONST(0.325310200452805) }, - { FRAC_CONST(-0.949528217315674), FRAC_CONST(0.313681602478027) }, - { FRAC_CONST(-0.953306078910828), FRAC_CONST(0.302005797624588) }, - { FRAC_CONST(-0.956940352916718), FRAC_CONST(0.290284723043442) }, - { FRAC_CONST(-0.960430502891541), FRAC_CONST(0.278519690036774) }, - { FRAC_CONST(-0.963776051998138), FRAC_CONST(0.266712725162506) }, - { FRAC_CONST(-0.966976463794708), FRAC_CONST(0.254865586757660) }, - { FRAC_CONST(-0.970031261444092), FRAC_CONST(0.242980077862740) }, - { FRAC_CONST(-0.972939968109131), FRAC_CONST(0.231057971715927) }, - { FRAC_CONST(-0.975702166557312), FRAC_CONST(0.219101071357727) }, - { FRAC_CONST(-0.978317379951477), FRAC_CONST(0.207111403346062) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(-0.983105480670929), FRAC_CONST(0.183039844036102) }, - { FRAC_CONST(-0.985277652740479), FRAC_CONST(0.170961812138557) }, - { FRAC_CONST(-0.987301409244537), FRAC_CONST(0.158858031034470) }, - { FRAC_CONST(-0.989176511764526), FRAC_CONST(0.146730333566666) }, - { FRAC_CONST(-0.990902662277222), FRAC_CONST(0.134580522775650) }, - { FRAC_CONST(-0.992479503154755), FRAC_CONST(0.122410699725151) }, - { FRAC_CONST(-0.993906974792480), FRAC_CONST(0.110222198069096) }, - { FRAC_CONST(-0.995184719562531), FRAC_CONST(0.098017096519470) }, - { FRAC_CONST(-0.996312618255615), FRAC_CONST(0.085797227919102) }, - { FRAC_CONST(-0.997290492057800), FRAC_CONST(0.073564447462559) }, - { FRAC_CONST(-0.998118102550507), FRAC_CONST(0.061320584267378) }, - { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067486077547) }, - { FRAC_CONST(-0.999322354793549), FRAC_CONST(0.036807239055634) }, - { FRAC_CONST(-0.999698817729950), FRAC_CONST(0.024541210383177) }, - { FRAC_CONST(-0.999924719333649), FRAC_CONST(0.012271485291421) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.999698817729950), FRAC_CONST(0.024541229009628) }, - { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, - { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, - { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, - { FRAC_CONST(0.992479562759399), FRAC_CONST(0.122410677373409) }, - { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, - { FRAC_CONST(0.985277652740479), FRAC_CONST(0.170961901545525) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, - { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, - { FRAC_CONST(0.963776051998138), FRAC_CONST(0.266712784767151) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.949528157711029), FRAC_CONST(0.313681751489639) }, - { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, - { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.914209723472595), FRAC_CONST(0.405241340398788) }, - { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, - { FRAC_CONST(0.893224298954010), FRAC_CONST(0.449611335992813) }, - { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, - { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, - { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, - { FRAC_CONST(0.844853579998016), FRAC_CONST(0.534997642040253) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.817584812641144), FRAC_CONST(0.575808227062225) }, - { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, - { FRAC_CONST(0.788346409797668), FRAC_CONST(0.615231633186340) }, - { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, - { FRAC_CONST(0.757208824157715), FRAC_CONST(0.653172850608826) }, - { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, - { FRAC_CONST(0.724247097969055), FRAC_CONST(0.689540565013886) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, - { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, - { FRAC_CONST(0.653172791004181), FRAC_CONST(0.757208883762360) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.615231573581696), FRAC_CONST(0.788346409797668) }, - { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(0.575808167457581), FRAC_CONST(0.817584812641144) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.534997642040253), FRAC_CONST(0.844853579998016) }, - { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, - { FRAC_CONST(0.492898195981979), FRAC_CONST(0.870086967945099) }, - { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, - { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, - { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, - { FRAC_CONST(0.405241280794144), FRAC_CONST(0.914209783077240) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.359894961118698), FRAC_CONST(0.932992815971375) }, - { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(0.313681662082672), FRAC_CONST(0.949528217315674) }, - { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, - { FRAC_CONST(0.266712754964828), FRAC_CONST(0.963776051998138) }, - { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(0.219101220369339), FRAC_CONST(0.975702106952667) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, - { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, - { FRAC_CONST(0.122410625219345), FRAC_CONST(0.992479562759399) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(0.073564492166042), FRAC_CONST(0.997290432453156) }, - { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(0.024541135877371), FRAC_CONST(0.999698817729950) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, - { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, - { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, - { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, - { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, - { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, - { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, - { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, - { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, - { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(-0.098017223179340), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(-0.146730571985245), FRAC_CONST(0.989176511764526) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.242980197072029), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(-0.290284723043442), FRAC_CONST(0.956940293312073) }, - { FRAC_CONST(-0.336889922618866), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.427555084228516), FRAC_CONST(0.903989315032959) }, - { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, - { FRAC_CONST(-0.514102756977081), FRAC_CONST(0.857728600502014) }, - { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, - { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(-0.634393274784088), FRAC_CONST(0.773010492324829) }, - { FRAC_CONST(-0.671559035778046), FRAC_CONST(0.740951061248779) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.740951240062714), FRAC_CONST(0.671558856964111) }, - { FRAC_CONST(-0.773010492324829), FRAC_CONST(0.634393274784088) }, - { FRAC_CONST(-0.803207635879517), FRAC_CONST(0.595699131488800) }, - { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, - { FRAC_CONST(-0.857728600502014), FRAC_CONST(0.514102756977081) }, - { FRAC_CONST(-0.881921350955963), FRAC_CONST(0.471396625041962) }, - { FRAC_CONST(-0.903989315032959), FRAC_CONST(0.427555054426193) }, - { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, - { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, - { FRAC_CONST(-0.956940352916718), FRAC_CONST(0.290284723043442) }, - { FRAC_CONST(-0.970031261444092), FRAC_CONST(0.242980077862740) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(-0.989176511764526), FRAC_CONST(0.146730333566666) }, - { FRAC_CONST(-0.995184719562531), FRAC_CONST(0.098017096519470) }, - { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067486077547) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, - { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, - { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, - { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, - { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.788346469402313), FRAC_CONST(0.615231573581696) }, - { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, - { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.575808227062225), FRAC_CONST(0.817584812641144) }, - { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, - { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.313681751489639), FRAC_CONST(0.949528157711029) }, - { FRAC_CONST(0.242980241775513), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(0.024541255086660), FRAC_CONST(0.999698817729950) }, - { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(-0.122410707175732), FRAC_CONST(0.992479503154755) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.266712725162506), FRAC_CONST(0.963776051998138) }, - { FRAC_CONST(-0.336889803409576), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(-0.405241340398788), FRAC_CONST(0.914209723472595) }, - { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, - { FRAC_CONST(-0.534997701644897), FRAC_CONST(0.844853520393372) }, - { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(-0.653172850608826), FRAC_CONST(0.757208824157715) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.757208824157715), FRAC_CONST(0.653172850608826) }, - { FRAC_CONST(-0.803207516670227), FRAC_CONST(0.595699369907379) }, - { FRAC_CONST(-0.844853520393372), FRAC_CONST(0.534997701644897) }, - { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, - { FRAC_CONST(-0.914209783077240), FRAC_CONST(0.405241221189499) }, - { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, - { FRAC_CONST(-0.963776051998138), FRAC_CONST(0.266712725162506) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(-0.992479503154755), FRAC_CONST(0.122410699725151) }, - { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067724496126) }, - { FRAC_CONST(-0.999698817729950), FRAC_CONST(-0.024541147053242) }, - { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, - { FRAC_CONST(-0.985277652740479), FRAC_CONST(-0.170961990952492) }, - { FRAC_CONST(-0.970031261444092), FRAC_CONST(-0.242980241775513) }, - { FRAC_CONST(-0.949528157711029), FRAC_CONST(-0.313681781291962) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(-0.893224298954010), FRAC_CONST(-0.449611306190491) }, - { FRAC_CONST(-0.857728660106659), FRAC_CONST(-0.514102697372437) }, - { FRAC_CONST(-0.817584872245789), FRAC_CONST(-0.575808107852936) }, - { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, - { FRAC_CONST(-0.724247038364410), FRAC_CONST(-0.689540624618530) }, - { FRAC_CONST(-0.671558916568756), FRAC_CONST(-0.740951180458069) }, - { FRAC_CONST(-0.615231573581696), FRAC_CONST(-0.788346469402313) }, - { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, - { FRAC_CONST(-0.492898195981979), FRAC_CONST(-0.870086967945099) }, - { FRAC_CONST(-0.427554935216904), FRAC_CONST(-0.903989374637604) }, - { FRAC_CONST(-0.359895110130310), FRAC_CONST(-0.932992756366730) }, - { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, - { FRAC_CONST(-0.219101369380951), FRAC_CONST(-0.975702106952667) }, - { FRAC_CONST(-0.146730408072472), FRAC_CONST(-0.989176511764526) }, - { FRAC_CONST(-0.073564760386944), FRAC_CONST(-0.997290432453156) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, - { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, - { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, - { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.000000011924881), FRAC_CONST(-1.000000000000000) } -}; - -#ifdef ALLOW_SMALL_FRAMELENGTH -ALIGN static const complex_t cfft_tab_480[] = -{ - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.999914348125458), FRAC_CONST(0.013089596293867) }, - { FRAC_CONST(0.999657332897186), FRAC_CONST(0.026176949962974) }, - { FRAC_CONST(0.999229013919830), FRAC_CONST(0.039259817451239) }, - { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, - { FRAC_CONST(0.997858941555023), FRAC_CONST(0.065403133630753) }, - { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, - { FRAC_CONST(0.995804905891418), FRAC_CONST(0.091501623392105) }, - { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, - { FRAC_CONST(0.993068456649780), FRAC_CONST(0.117537401616573) }, - { FRAC_CONST(0.991444885730743), FRAC_CONST(0.130526199936867) }, - { FRAC_CONST(0.989651381969452), FRAC_CONST(0.143492624163628) }, - { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, - { FRAC_CONST(0.985556066036224), FRAC_CONST(0.169349506497383) }, - { FRAC_CONST(0.983254909515381), FRAC_CONST(0.182235524058342) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, - { FRAC_CONST(0.975342333316803), FRAC_CONST(0.220697447657585) }, - { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, - { FRAC_CONST(0.969230890274048), FRAC_CONST(0.246153295040131) }, - { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, - { FRAC_CONST(0.962455213069916), FRAC_CONST(0.271440446376801) }, - { FRAC_CONST(0.958819746971130), FRAC_CONST(0.284015357494354) }, - { FRAC_CONST(0.955019950866699), FRAC_CONST(0.296541601419449) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.946930110454559), FRAC_CONST(0.321439445018768) }, - { FRAC_CONST(0.942641496658325), FRAC_CONST(0.333806872367859) }, - { FRAC_CONST(0.938191354274750), FRAC_CONST(0.346117079257965) }, - { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, - { FRAC_CONST(0.928809583187103), FRAC_CONST(0.370557427406311) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.918791174888611), FRAC_CONST(0.394743889570236) }, - { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, - { FRAC_CONST(0.908143162727356), FRAC_CONST(0.418659746646881) }, - { FRAC_CONST(0.902585268020630), FRAC_CONST(0.430511116981506) }, - { FRAC_CONST(0.896872758865356), FRAC_CONST(0.442288726568222) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.884987652301788), FRAC_CONST(0.465614527463913) }, - { FRAC_CONST(0.878817081451416), FRAC_CONST(0.477158784866333) }, - { FRAC_CONST(0.872496008872986), FRAC_CONST(0.488621264696121) }, - { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, - { FRAC_CONST(0.859406411647797), FRAC_CONST(0.511293113231659) }, - { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, - { FRAC_CONST(0.845727801322937), FRAC_CONST(0.533614516258240) }, - { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.824126183986664), FRAC_CONST(0.566406250000000) }, - { FRAC_CONST(0.816641509532928), FRAC_CONST(0.577145218849182) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.801253795623779), FRAC_CONST(0.598324596881866) }, - { FRAC_CONST(0.793353319168091), FRAC_CONST(0.608761429786682) }, - { FRAC_CONST(0.785316884517670), FRAC_CONST(0.619093954563141) }, - { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, - { FRAC_CONST(0.768841803073883), FRAC_CONST(0.639438986778259) }, - { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, - { FRAC_CONST(0.751839756965637), FRAC_CONST(0.659345865249634) }, - { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, - { FRAC_CONST(0.734322488307953), FRAC_CONST(0.678800761699677) }, - { FRAC_CONST(0.725374400615692), FRAC_CONST(0.688354551792145) }, - { FRAC_CONST(0.716301918029785), FRAC_CONST(0.697790503501892) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.697790443897247), FRAC_CONST(0.716301977634430) }, - { FRAC_CONST(0.688354551792145), FRAC_CONST(0.725374400615692) }, - { FRAC_CONST(0.678800702095032), FRAC_CONST(0.734322547912598) }, - { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, - { FRAC_CONST(0.659345805644989), FRAC_CONST(0.751839816570282) }, - { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, - { FRAC_CONST(0.639438986778259), FRAC_CONST(0.768841862678528) }, - { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, - { FRAC_CONST(0.619093954563141), FRAC_CONST(0.785316944122314) }, - { FRAC_CONST(0.608761370182037), FRAC_CONST(0.793353378772736) }, - { FRAC_CONST(0.598324596881866), FRAC_CONST(0.801253855228424) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.577145159244537), FRAC_CONST(0.816641569137573) }, - { FRAC_CONST(0.566406250000000), FRAC_CONST(0.824126183986664) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, - { FRAC_CONST(0.533614516258240), FRAC_CONST(0.845727801322937) }, - { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, - { FRAC_CONST(0.511293113231659), FRAC_CONST(0.859406411647797) }, - { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, - { FRAC_CONST(0.488621175289154), FRAC_CONST(0.872496068477631) }, - { FRAC_CONST(0.477158755064011), FRAC_CONST(0.878817141056061) }, - { FRAC_CONST(0.465614467859268), FRAC_CONST(0.884987652301788) }, - { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, - { FRAC_CONST(0.442288666963577), FRAC_CONST(0.896872758865356) }, - { FRAC_CONST(0.430511027574539), FRAC_CONST(0.902585327625275) }, - { FRAC_CONST(0.418659746646881), FRAC_CONST(0.908143162727356) }, - { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, - { FRAC_CONST(0.394743800163269), FRAC_CONST(0.918791234493256) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.370557397603989), FRAC_CONST(0.928809583187103) }, - { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, - { FRAC_CONST(0.346117049455643), FRAC_CONST(0.938191354274750) }, - { FRAC_CONST(0.333806812763214), FRAC_CONST(0.942641496658325) }, - { FRAC_CONST(0.321439474821091), FRAC_CONST(0.946930110454559) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.296541512012482), FRAC_CONST(0.955019950866699) }, - { FRAC_CONST(0.284015327692032), FRAC_CONST(0.958819746971130) }, - { FRAC_CONST(0.271440386772156), FRAC_CONST(0.962455272674561) }, - { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, - { FRAC_CONST(0.246153265237808), FRAC_CONST(0.969230890274048) }, - { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, - { FRAC_CONST(0.220697447657585), FRAC_CONST(0.975342333316803) }, - { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(0.182235524058342), FRAC_CONST(0.983254909515381) }, - { FRAC_CONST(0.169349446892738), FRAC_CONST(0.985556066036224) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(0.143492594361305), FRAC_CONST(0.989651381969452) }, - { FRAC_CONST(0.130526125431061), FRAC_CONST(0.991444885730743) }, - { FRAC_CONST(0.117537401616573), FRAC_CONST(0.993068456649780) }, - { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(0.091501533985138), FRAC_CONST(0.995804905891418) }, - { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, - { FRAC_CONST(0.065403074026108), FRAC_CONST(0.997858941555023) }, - { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, - { FRAC_CONST(0.039259787648916), FRAC_CONST(0.999229013919830) }, - { FRAC_CONST(0.026176875457168), FRAC_CONST(0.999657332897186) }, - { FRAC_CONST(0.013089597225189), FRAC_CONST(0.999914348125458) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.013089684769511), FRAC_CONST(0.999914348125458) }, - { FRAC_CONST(-0.026176963001490), FRAC_CONST(0.999657332897186) }, - { FRAC_CONST(-0.039259877055883), FRAC_CONST(0.999229013919830) }, - { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, - { FRAC_CONST(-0.065403163433075), FRAC_CONST(0.997858941555023) }, - { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, - { FRAC_CONST(-0.091501623392105), FRAC_CONST(0.995804905891418) }, - { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(-0.117537491023541), FRAC_CONST(0.993068456649780) }, - { FRAC_CONST(-0.130526214838028), FRAC_CONST(0.991444885730743) }, - { FRAC_CONST(-0.143492683768272), FRAC_CONST(0.989651381969452) }, - { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.169349536299706), FRAC_CONST(0.985556066036224) }, - { FRAC_CONST(-0.182235598564148), FRAC_CONST(0.983254909515381) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, - { FRAC_CONST(-0.220697522163391), FRAC_CONST(0.975342273712158) }, - { FRAC_CONST(-0.233445391058922), FRAC_CONST(0.972369909286499) }, - { FRAC_CONST(-0.246153354644775), FRAC_CONST(0.969230890274048) }, - { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, - { FRAC_CONST(-0.271440476179123), FRAC_CONST(0.962455213069916) }, - { FRAC_CONST(-0.284015417098999), FRAC_CONST(0.958819687366486) }, - { FRAC_CONST(-0.296541571617126), FRAC_CONST(0.955019950866699) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.321439564228058), FRAC_CONST(0.946930110454559) }, - { FRAC_CONST(-0.333806872367859), FRAC_CONST(0.942641496658325) }, - { FRAC_CONST(-0.346117109060287), FRAC_CONST(0.938191294670105) }, - { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, - { FRAC_CONST(-0.370557487010956), FRAC_CONST(0.928809523582459) }, - { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.394743859767914), FRAC_CONST(0.918791234493256) }, - { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, - { FRAC_CONST(-0.418659836053848), FRAC_CONST(0.908143103122711) }, - { FRAC_CONST(-0.430511116981506), FRAC_CONST(0.902585268020630) }, - { FRAC_CONST(-0.442288637161255), FRAC_CONST(0.896872758865356) }, - { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, - { FRAC_CONST(-0.465614557266235), FRAC_CONST(0.884987592697144) }, - { FRAC_CONST(-0.477158725261688), FRAC_CONST(0.878817141056061) }, - { FRAC_CONST(-0.488621354103088), FRAC_CONST(0.872495949268341) }, - { FRAC_CONST(-0.500000059604645), FRAC_CONST(0.866025388240814) }, - { FRAC_CONST(-0.511293053627014), FRAC_CONST(0.859406411647797) }, - { FRAC_CONST(-0.522498667240143), FRAC_CONST(0.852640092372894) }, - { FRAC_CONST(-0.533614575862885), FRAC_CONST(0.845727801322937) }, - { FRAC_CONST(-0.544639050960541), FRAC_CONST(0.838670551776886) }, - { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, - { FRAC_CONST(-0.566406309604645), FRAC_CONST(0.824126124382019) }, - { FRAC_CONST(-0.577145218849182), FRAC_CONST(0.816641569137573) }, - { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(-0.598324656486511), FRAC_CONST(0.801253736019135) }, - { FRAC_CONST(-0.608761429786682), FRAC_CONST(0.793353319168091) }, - { FRAC_CONST(-0.619093894958496), FRAC_CONST(0.785316944122314) }, - { FRAC_CONST(-0.629320502281189), FRAC_CONST(0.777145862579346) }, - { FRAC_CONST(-0.639439046382904), FRAC_CONST(0.768841803073883) }, - { FRAC_CONST(-0.649448037147522), FRAC_CONST(0.760405957698822) }, - { FRAC_CONST(-0.659345924854279), FRAC_CONST(0.751839697360992) }, - { FRAC_CONST(-0.669130682945251), FRAC_CONST(0.743144810199738) }, - { FRAC_CONST(-0.678800761699677), FRAC_CONST(0.734322488307953) }, - { FRAC_CONST(-0.688354671001434), FRAC_CONST(0.725374281406403) }, - { FRAC_CONST(-0.697790503501892), FRAC_CONST(0.716301858425140) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.716302037239075), FRAC_CONST(0.697790324687958) }, - { FRAC_CONST(-0.725374460220337), FRAC_CONST(0.688354492187500) }, - { FRAC_CONST(-0.734322547912598), FRAC_CONST(0.678800702095032) }, - { FRAC_CONST(-0.743144929409027), FRAC_CONST(0.669130444526672) }, - { FRAC_CONST(-0.751839876174927), FRAC_CONST(0.659345746040344) }, - { FRAC_CONST(-0.760406017303467), FRAC_CONST(0.649448037147522) }, - { FRAC_CONST(-0.768841803073883), FRAC_CONST(0.639439046382904) }, - { FRAC_CONST(-0.777146041393280), FRAC_CONST(0.629320263862610) }, - { FRAC_CONST(-0.785316944122314), FRAC_CONST(0.619093894958496) }, - { FRAC_CONST(-0.793353319168091), FRAC_CONST(0.608761429786682) }, - { FRAC_CONST(-0.801253914833069), FRAC_CONST(0.598324477672577) }, - { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, - { FRAC_CONST(-0.816641569137573), FRAC_CONST(0.577145218849182) }, - { FRAC_CONST(-0.824126303195953), FRAC_CONST(0.566406130790710) }, - { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, - { FRAC_CONST(-0.838670551776886), FRAC_CONST(0.544639050960541) }, - { FRAC_CONST(-0.845727920532227), FRAC_CONST(0.533614337444305) }, - { FRAC_CONST(-0.852640211582184), FRAC_CONST(0.522498488426209) }, - { FRAC_CONST(-0.859406411647797), FRAC_CONST(0.511293053627014) }, - { FRAC_CONST(-0.866025388240814), FRAC_CONST(0.500000059604645) }, - { FRAC_CONST(-0.872496068477631), FRAC_CONST(0.488621145486832) }, - { FRAC_CONST(-0.878817141056061), FRAC_CONST(0.477158725261688) }, - { FRAC_CONST(-0.884987652301788), FRAC_CONST(0.465614557266235) }, - { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, - { FRAC_CONST(-0.896872758865356), FRAC_CONST(0.442288637161255) }, - { FRAC_CONST(-0.902585268020630), FRAC_CONST(0.430511116981506) }, - { FRAC_CONST(-0.908143222332001), FRAC_CONST(0.418659597635269) }, - { FRAC_CONST(-0.913545489311218), FRAC_CONST(0.406736582517624) }, - { FRAC_CONST(-0.918791234493256), FRAC_CONST(0.394743859767914) }, - { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, - { FRAC_CONST(-0.928809583187103), FRAC_CONST(0.370557337999344) }, - { FRAC_CONST(-0.933580458164215), FRAC_CONST(0.358367919921875) }, - { FRAC_CONST(-0.938191413879395), FRAC_CONST(0.346116900444031) }, - { FRAC_CONST(-0.942641556262970), FRAC_CONST(0.333806753158569) }, - { FRAC_CONST(-0.946930170059204), FRAC_CONST(0.321439445018768) }, - { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, - { FRAC_CONST(-0.955020010471344), FRAC_CONST(0.296541452407837) }, - { FRAC_CONST(-0.958819746971130), FRAC_CONST(0.284015297889709) }, - { FRAC_CONST(-0.962455213069916), FRAC_CONST(0.271440476179123) }, - { FRAC_CONST(-0.965925872325897), FRAC_CONST(0.258818924427032) }, - { FRAC_CONST(-0.969230949878693), FRAC_CONST(0.246153235435486) }, - { FRAC_CONST(-0.972369909286499), FRAC_CONST(0.233445376157761) }, - { FRAC_CONST(-0.975342333316803), FRAC_CONST(0.220697283744812) }, - { FRAC_CONST(-0.978147625923157), FRAC_CONST(0.207911610603333) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(-0.983254909515381), FRAC_CONST(0.182235360145569) }, - { FRAC_CONST(-0.985556066036224), FRAC_CONST(0.169349402189255) }, - { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, - { FRAC_CONST(-0.989651441574097), FRAC_CONST(0.143492430448532) }, - { FRAC_CONST(-0.991444885730743), FRAC_CONST(0.130526080727577) }, - { FRAC_CONST(-0.993068456649780), FRAC_CONST(0.117537356913090) }, - { FRAC_CONST(-0.994521915912628), FRAC_CONST(0.104528494179249) }, - { FRAC_CONST(-0.995804965496063), FRAC_CONST(0.091501489281654) }, - { FRAC_CONST(-0.996917366981506), FRAC_CONST(0.078459039330482) }, - { FRAC_CONST(-0.997858941555023), FRAC_CONST(0.065403148531914) }, - { FRAC_CONST(-0.998629570007324), FRAC_CONST(0.052335809916258) }, - { FRAC_CONST(-0.999229013919830), FRAC_CONST(0.039259742945433) }, - { FRAC_CONST(-0.999657332897186), FRAC_CONST(0.026176951825619) }, - { FRAC_CONST(-0.999914348125458), FRAC_CONST(0.013089434243739) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.999657332897186), FRAC_CONST(0.026176949962974) }, - { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, - { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, - { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, - { FRAC_CONST(0.991444885730743), FRAC_CONST(0.130526199936867) }, - { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, - { FRAC_CONST(0.983254909515381), FRAC_CONST(0.182235524058342) }, - { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, - { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, - { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, - { FRAC_CONST(0.958819746971130), FRAC_CONST(0.284015357494354) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.942641496658325), FRAC_CONST(0.333806872367859) }, - { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, - { FRAC_CONST(0.902585268020630), FRAC_CONST(0.430511116981506) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.878817081451416), FRAC_CONST(0.477158784866333) }, - { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, - { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, - { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, - { FRAC_CONST(0.824126183986664), FRAC_CONST(0.566406250000000) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.793353319168091), FRAC_CONST(0.608761429786682) }, - { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, - { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, - { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, - { FRAC_CONST(0.725374400615692), FRAC_CONST(0.688354551792145) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.688354551792145), FRAC_CONST(0.725374400615692) }, - { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, - { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, - { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, - { FRAC_CONST(0.608761370182037), FRAC_CONST(0.793353378772736) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.566406250000000), FRAC_CONST(0.824126183986664) }, - { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, - { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, - { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, - { FRAC_CONST(0.477158755064011), FRAC_CONST(0.878817141056061) }, - { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, - { FRAC_CONST(0.430511027574539), FRAC_CONST(0.902585327625275) }, - { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, - { FRAC_CONST(0.333806812763214), FRAC_CONST(0.942641496658325) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.284015327692032), FRAC_CONST(0.958819746971130) }, - { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, - { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, - { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, - { FRAC_CONST(0.182235524058342), FRAC_CONST(0.983254909515381) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(0.130526125431061), FRAC_CONST(0.991444885730743) }, - { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, - { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, - { FRAC_CONST(0.026176875457168), FRAC_CONST(0.999657332897186) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.026176963001490), FRAC_CONST(0.999657332897186) }, - { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, - { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, - { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(-0.130526214838028), FRAC_CONST(0.991444885730743) }, - { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.182235598564148), FRAC_CONST(0.983254909515381) }, - { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, - { FRAC_CONST(-0.233445391058922), FRAC_CONST(0.972369909286499) }, - { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, - { FRAC_CONST(-0.284015417098999), FRAC_CONST(0.958819687366486) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.333806872367859), FRAC_CONST(0.942641496658325) }, - { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, - { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, - { FRAC_CONST(-0.430511116981506), FRAC_CONST(0.902585268020630) }, - { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, - { FRAC_CONST(-0.477158725261688), FRAC_CONST(0.878817141056061) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, - { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, - { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, - { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, - { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, - { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, - { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, - { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, - { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, - { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, - { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, - { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, - { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, - { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, - { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, - { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, - { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, - { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, - { FRAC_CONST(-0.500000059604645), FRAC_CONST(0.866025388240814) }, - { FRAC_CONST(-0.544639050960541), FRAC_CONST(0.838670551776886) }, - { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(-0.629320502281189), FRAC_CONST(0.777145862579346) }, - { FRAC_CONST(-0.669130682945251), FRAC_CONST(0.743144810199738) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.743144929409027), FRAC_CONST(0.669130444526672) }, - { FRAC_CONST(-0.777146041393280), FRAC_CONST(0.629320263862610) }, - { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, - { FRAC_CONST(-0.838670551776886), FRAC_CONST(0.544639050960541) }, - { FRAC_CONST(-0.866025388240814), FRAC_CONST(0.500000059604645) }, - { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, - { FRAC_CONST(-0.913545489311218), FRAC_CONST(0.406736582517624) }, - { FRAC_CONST(-0.933580458164215), FRAC_CONST(0.358367919921875) }, - { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, - { FRAC_CONST(-0.965925872325897), FRAC_CONST(0.258818924427032) }, - { FRAC_CONST(-0.978147625923157), FRAC_CONST(0.207911610603333) }, - { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, - { FRAC_CONST(-0.994521915912628), FRAC_CONST(0.104528494179249) }, - { FRAC_CONST(-0.998629570007324), FRAC_CONST(0.052335809916258) }, - { FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.000000087422777) }, - { FRAC_CONST(-0.998629510402679), FRAC_CONST(-0.052335985004902) }, - { FRAC_CONST(-0.994521856307983), FRAC_CONST(-0.104528672993183) }, - { FRAC_CONST(-0.987688302993774), FRAC_CONST(-0.156434610486031) }, - { FRAC_CONST(-0.978147566318512), FRAC_CONST(-0.207911789417267) }, - { FRAC_CONST(-0.965925812721252), FRAC_CONST(-0.258819073438644) }, - { FRAC_CONST(-0.951056540012360), FRAC_CONST(-0.309016972780228) }, - { FRAC_CONST(-0.933580398559570), FRAC_CONST(-0.358368098735809) }, - { FRAC_CONST(-0.913545429706573), FRAC_CONST(-0.406736731529236) }, - { FRAC_CONST(-0.891006529331207), FRAC_CONST(-0.453990548849106) }, - { FRAC_CONST(-0.866025269031525), FRAC_CONST(-0.500000178813934) }, - { FRAC_CONST(-0.838670492172241), FRAC_CONST(-0.544639170169830) }, - { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, - { FRAC_CONST(-0.777145922183990), FRAC_CONST(-0.629320442676544) }, - { FRAC_CONST(-0.743144810199738), FRAC_CONST(-0.669130623340607) }, - { FRAC_CONST(-0.707106649875641), FRAC_CONST(-0.707106888294220) }, - { FRAC_CONST(-0.669130504131317), FRAC_CONST(-0.743144869804382) }, - { FRAC_CONST(-0.629320323467255), FRAC_CONST(-0.777145981788635) }, - { FRAC_CONST(-0.587785065174103), FRAC_CONST(-0.809017121791840) }, - { FRAC_CONST(-0.544639110565186), FRAC_CONST(-0.838670551776886) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, - { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, - { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, - { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, - { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, - { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, - { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, - { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.522498667240143), FRAC_CONST(0.852640092372894) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.852640211582184), FRAC_CONST(0.522498488426209) }, - { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, - { FRAC_CONST(-0.996917366981506), FRAC_CONST(0.078459039330482) }, - { FRAC_CONST(-0.987688302993774), FRAC_CONST(-0.156434610486031) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, - { FRAC_CONST(-0.649447917938232), FRAC_CONST(-0.760406076908112) }, - { FRAC_CONST(-0.453990221023560), FRAC_CONST(-0.891006648540497) }, - { FRAC_CONST(-0.233445450663567), FRAC_CONST(-0.972369909286499) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, - { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.309017121791840), FRAC_CONST(-0.951056480407715) } -}; -#endif - -ALIGN static const complex_t cfft_tab_64[] = -{ - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, - { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, - { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, - { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.000000011924881), FRAC_CONST(-1.000000000000000) } -}; - -#ifdef ALLOW_SMALL_FRAMELENGTH -ALIGN static const complex_t cfft_tab_60[] = -{ - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, - { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, - { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, - { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, - { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, - { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, - { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, - { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.500000059604645), FRAC_CONST(0.866025388240814) }, - { FRAC_CONST(-0.669130682945251), FRAC_CONST(0.743144810199738) }, - { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, - { FRAC_CONST(-0.913545489311218), FRAC_CONST(0.406736582517624) }, - { FRAC_CONST(-0.978147625923157), FRAC_CONST(0.207911610603333) }, - { FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.000000087422777) }, - { FRAC_CONST(-0.978147566318512), FRAC_CONST(-0.207911789417267) }, - { FRAC_CONST(-0.913545429706573), FRAC_CONST(-0.406736731529236) }, - { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, - { FRAC_CONST(-0.669130504131317), FRAC_CONST(-0.743144869804382) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, - { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.309017121791840), FRAC_CONST(-0.951056480407715) } -}; -#endif - -#ifdef LD_DEC - -ALIGN static const complex_t cfft_tab_256[] = -{ - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.999698817729950), FRAC_CONST(0.024541229009628) }, - { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, - { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, - { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, - { FRAC_CONST(0.992479562759399), FRAC_CONST(0.122410677373409) }, - { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, - { FRAC_CONST(0.985277652740479), FRAC_CONST(0.170961901545525) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, - { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, - { FRAC_CONST(0.963776051998138), FRAC_CONST(0.266712784767151) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.949528157711029), FRAC_CONST(0.313681751489639) }, - { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, - { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.914209723472595), FRAC_CONST(0.405241340398788) }, - { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, - { FRAC_CONST(0.893224298954010), FRAC_CONST(0.449611335992813) }, - { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, - { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, - { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, - { FRAC_CONST(0.844853579998016), FRAC_CONST(0.534997642040253) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.817584812641144), FRAC_CONST(0.575808227062225) }, - { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, - { FRAC_CONST(0.788346409797668), FRAC_CONST(0.615231633186340) }, - { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, - { FRAC_CONST(0.757208824157715), FRAC_CONST(0.653172850608826) }, - { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, - { FRAC_CONST(0.724247097969055), FRAC_CONST(0.689540565013886) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, - { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, - { FRAC_CONST(0.653172791004181), FRAC_CONST(0.757208883762360) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.615231573581696), FRAC_CONST(0.788346409797668) }, - { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(0.575808167457581), FRAC_CONST(0.817584812641144) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.534997642040253), FRAC_CONST(0.844853579998016) }, - { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, - { FRAC_CONST(0.492898195981979), FRAC_CONST(0.870086967945099) }, - { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, - { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, - { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, - { FRAC_CONST(0.405241280794144), FRAC_CONST(0.914209783077240) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.359894961118698), FRAC_CONST(0.932992815971375) }, - { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(0.313681662082672), FRAC_CONST(0.949528217315674) }, - { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, - { FRAC_CONST(0.266712754964828), FRAC_CONST(0.963776051998138) }, - { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(0.219101220369339), FRAC_CONST(0.975702106952667) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, - { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, - { FRAC_CONST(0.122410625219345), FRAC_CONST(0.992479562759399) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(0.073564492166042), FRAC_CONST(0.997290432453156) }, - { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(0.024541135877371), FRAC_CONST(0.999698817729950) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, - { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, - { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, - { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, - { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, - { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, - { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, - { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, - { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, - { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(-0.098017223179340), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(-0.146730571985245), FRAC_CONST(0.989176511764526) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.242980197072029), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(-0.290284723043442), FRAC_CONST(0.956940293312073) }, - { FRAC_CONST(-0.336889922618866), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.427555084228516), FRAC_CONST(0.903989315032959) }, - { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, - { FRAC_CONST(-0.514102756977081), FRAC_CONST(0.857728600502014) }, - { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, - { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(-0.634393274784088), FRAC_CONST(0.773010492324829) }, - { FRAC_CONST(-0.671559035778046), FRAC_CONST(0.740951061248779) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.740951240062714), FRAC_CONST(0.671558856964111) }, - { FRAC_CONST(-0.773010492324829), FRAC_CONST(0.634393274784088) }, - { FRAC_CONST(-0.803207635879517), FRAC_CONST(0.595699131488800) }, - { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, - { FRAC_CONST(-0.857728600502014), FRAC_CONST(0.514102756977081) }, - { FRAC_CONST(-0.881921350955963), FRAC_CONST(0.471396625041962) }, - { FRAC_CONST(-0.903989315032959), FRAC_CONST(0.427555054426193) }, - { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, - { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, - { FRAC_CONST(-0.956940352916718), FRAC_CONST(0.290284723043442) }, - { FRAC_CONST(-0.970031261444092), FRAC_CONST(0.242980077862740) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(-0.989176511764526), FRAC_CONST(0.146730333566666) }, - { FRAC_CONST(-0.995184719562531), FRAC_CONST(0.098017096519470) }, - { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067486077547) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, - { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, - { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, - { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, - { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.788346469402313), FRAC_CONST(0.615231573581696) }, - { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, - { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.575808227062225), FRAC_CONST(0.817584812641144) }, - { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, - { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.313681751489639), FRAC_CONST(0.949528157711029) }, - { FRAC_CONST(0.242980241775513), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(0.024541255086660), FRAC_CONST(0.999698817729950) }, - { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(-0.122410707175732), FRAC_CONST(0.992479503154755) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.266712725162506), FRAC_CONST(0.963776051998138) }, - { FRAC_CONST(-0.336889803409576), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(-0.405241340398788), FRAC_CONST(0.914209723472595) }, - { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, - { FRAC_CONST(-0.534997701644897), FRAC_CONST(0.844853520393372) }, - { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(-0.653172850608826), FRAC_CONST(0.757208824157715) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.757208824157715), FRAC_CONST(0.653172850608826) }, - { FRAC_CONST(-0.803207516670227), FRAC_CONST(0.595699369907379) }, - { FRAC_CONST(-0.844853520393372), FRAC_CONST(0.534997701644897) }, - { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, - { FRAC_CONST(-0.914209783077240), FRAC_CONST(0.405241221189499) }, - { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, - { FRAC_CONST(-0.963776051998138), FRAC_CONST(0.266712725162506) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(-0.992479503154755), FRAC_CONST(0.122410699725151) }, - { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067724496126) }, - { FRAC_CONST(-0.999698817729950), FRAC_CONST(-0.024541147053242) }, - { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, - { FRAC_CONST(-0.985277652740479), FRAC_CONST(-0.170961990952492) }, - { FRAC_CONST(-0.970031261444092), FRAC_CONST(-0.242980241775513) }, - { FRAC_CONST(-0.949528157711029), FRAC_CONST(-0.313681781291962) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(-0.893224298954010), FRAC_CONST(-0.449611306190491) }, - { FRAC_CONST(-0.857728660106659), FRAC_CONST(-0.514102697372437) }, - { FRAC_CONST(-0.817584872245789), FRAC_CONST(-0.575808107852936) }, - { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, - { FRAC_CONST(-0.724247038364410), FRAC_CONST(-0.689540624618530) }, - { FRAC_CONST(-0.671558916568756), FRAC_CONST(-0.740951180458069) }, - { FRAC_CONST(-0.615231573581696), FRAC_CONST(-0.788346469402313) }, - { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, - { FRAC_CONST(-0.492898195981979), FRAC_CONST(-0.870086967945099) }, - { FRAC_CONST(-0.427554935216904), FRAC_CONST(-0.903989374637604) }, - { FRAC_CONST(-0.359895110130310), FRAC_CONST(-0.932992756366730) }, - { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, - { FRAC_CONST(-0.219101369380951), FRAC_CONST(-0.975702106952667) }, - { FRAC_CONST(-0.146730408072472), FRAC_CONST(-0.989176511764526) }, - { FRAC_CONST(-0.073564760386944), FRAC_CONST(-0.997290432453156) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, - { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, - { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, - { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.000000011924881), FRAC_CONST(-1.000000000000000) } -}; - -#ifdef ALLOW_SMALL_FRAMELENGTH -ALIGN static const complex_t cfft_tab_240[] = -{ - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.999657332897186), FRAC_CONST(0.026176949962974) }, - { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, - { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, - { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, - { FRAC_CONST(0.991444885730743), FRAC_CONST(0.130526199936867) }, - { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, - { FRAC_CONST(0.983254909515381), FRAC_CONST(0.182235524058342) }, - { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, - { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, - { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, - { FRAC_CONST(0.958819746971130), FRAC_CONST(0.284015357494354) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.942641496658325), FRAC_CONST(0.333806872367859) }, - { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, - { FRAC_CONST(0.902585268020630), FRAC_CONST(0.430511116981506) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.878817081451416), FRAC_CONST(0.477158784866333) }, - { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, - { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, - { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, - { FRAC_CONST(0.824126183986664), FRAC_CONST(0.566406250000000) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.793353319168091), FRAC_CONST(0.608761429786682) }, - { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, - { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, - { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, - { FRAC_CONST(0.725374400615692), FRAC_CONST(0.688354551792145) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.688354551792145), FRAC_CONST(0.725374400615692) }, - { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, - { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, - { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, - { FRAC_CONST(0.608761370182037), FRAC_CONST(0.793353378772736) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.566406250000000), FRAC_CONST(0.824126183986664) }, - { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, - { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, - { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, - { FRAC_CONST(0.477158755064011), FRAC_CONST(0.878817141056061) }, - { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, - { FRAC_CONST(0.430511027574539), FRAC_CONST(0.902585327625275) }, - { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, - { FRAC_CONST(0.333806812763214), FRAC_CONST(0.942641496658325) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.284015327692032), FRAC_CONST(0.958819746971130) }, - { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, - { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, - { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, - { FRAC_CONST(0.182235524058342), FRAC_CONST(0.983254909515381) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(0.130526125431061), FRAC_CONST(0.991444885730743) }, - { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, - { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, - { FRAC_CONST(0.026176875457168), FRAC_CONST(0.999657332897186) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.026176963001490), FRAC_CONST(0.999657332897186) }, - { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, - { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, - { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(-0.130526214838028), FRAC_CONST(0.991444885730743) }, - { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.182235598564148), FRAC_CONST(0.983254909515381) }, - { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, - { FRAC_CONST(-0.233445391058922), FRAC_CONST(0.972369909286499) }, - { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, - { FRAC_CONST(-0.284015417098999), FRAC_CONST(0.958819687366486) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.333806872367859), FRAC_CONST(0.942641496658325) }, - { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, - { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, - { FRAC_CONST(-0.430511116981506), FRAC_CONST(0.902585268020630) }, - { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, - { FRAC_CONST(-0.477158725261688), FRAC_CONST(0.878817141056061) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, - { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, - { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, - { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, - { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, - { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, - { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, - { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, - { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, - { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, - { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, - { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, - { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, - { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, - { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, - { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, - { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, - { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, - { FRAC_CONST(-0.500000059604645), FRAC_CONST(0.866025388240814) }, - { FRAC_CONST(-0.544639050960541), FRAC_CONST(0.838670551776886) }, - { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(-0.629320502281189), FRAC_CONST(0.777145862579346) }, - { FRAC_CONST(-0.669130682945251), FRAC_CONST(0.743144810199738) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.743144929409027), FRAC_CONST(0.669130444526672) }, - { FRAC_CONST(-0.777146041393280), FRAC_CONST(0.629320263862610) }, - { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, - { FRAC_CONST(-0.838670551776886), FRAC_CONST(0.544639050960541) }, - { FRAC_CONST(-0.866025388240814), FRAC_CONST(0.500000059604645) }, - { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, - { FRAC_CONST(-0.913545489311218), FRAC_CONST(0.406736582517624) }, - { FRAC_CONST(-0.933580458164215), FRAC_CONST(0.358367919921875) }, - { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, - { FRAC_CONST(-0.965925872325897), FRAC_CONST(0.258818924427032) }, - { FRAC_CONST(-0.978147625923157), FRAC_CONST(0.207911610603333) }, - { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, - { FRAC_CONST(-0.994521915912628), FRAC_CONST(0.104528494179249) }, - { FRAC_CONST(-0.998629570007324), FRAC_CONST(0.052335809916258) }, - { FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.000000087422777) }, - { FRAC_CONST(-0.998629510402679), FRAC_CONST(-0.052335985004902) }, - { FRAC_CONST(-0.994521856307983), FRAC_CONST(-0.104528672993183) }, - { FRAC_CONST(-0.987688302993774), FRAC_CONST(-0.156434610486031) }, - { FRAC_CONST(-0.978147566318512), FRAC_CONST(-0.207911789417267) }, - { FRAC_CONST(-0.965925812721252), FRAC_CONST(-0.258819073438644) }, - { FRAC_CONST(-0.951056540012360), FRAC_CONST(-0.309016972780228) }, - { FRAC_CONST(-0.933580398559570), FRAC_CONST(-0.358368098735809) }, - { FRAC_CONST(-0.913545429706573), FRAC_CONST(-0.406736731529236) }, - { FRAC_CONST(-0.891006529331207), FRAC_CONST(-0.453990548849106) }, - { FRAC_CONST(-0.866025269031525), FRAC_CONST(-0.500000178813934) }, - { FRAC_CONST(-0.838670492172241), FRAC_CONST(-0.544639170169830) }, - { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, - { FRAC_CONST(-0.777145922183990), FRAC_CONST(-0.629320442676544) }, - { FRAC_CONST(-0.743144810199738), FRAC_CONST(-0.669130623340607) }, - { FRAC_CONST(-0.707106649875641), FRAC_CONST(-0.707106888294220) }, - { FRAC_CONST(-0.669130504131317), FRAC_CONST(-0.743144869804382) }, - { FRAC_CONST(-0.629320323467255), FRAC_CONST(-0.777145981788635) }, - { FRAC_CONST(-0.587785065174103), FRAC_CONST(-0.809017121791840) }, - { FRAC_CONST(-0.544639110565186), FRAC_CONST(-0.838670551776886) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, - { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, - { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, - { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, - { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, - { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, - { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, - { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.522498667240143), FRAC_CONST(0.852640092372894) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.852640211582184), FRAC_CONST(0.522498488426209) }, - { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, - { FRAC_CONST(-0.996917366981506), FRAC_CONST(0.078459039330482) }, - { FRAC_CONST(-0.987688302993774), FRAC_CONST(-0.156434610486031) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, - { FRAC_CONST(-0.649447917938232), FRAC_CONST(-0.760406076908112) }, - { FRAC_CONST(-0.453990221023560), FRAC_CONST(-0.891006648540497) }, - { FRAC_CONST(-0.233445450663567), FRAC_CONST(-0.972369909286499) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, - { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.309017121791840), FRAC_CONST(-0.951056480407715) } -}; -#endif - -#endif - -ALIGN static const complex_t cfft_tab_128[] = -{ - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, - { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, - { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, - { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, - { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, - { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, - { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, - { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, - { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, - { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(-0.098017223179340), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(-0.146730571985245), FRAC_CONST(0.989176511764526) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.242980197072029), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(-0.290284723043442), FRAC_CONST(0.956940293312073) }, - { FRAC_CONST(-0.336889922618866), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.427555084228516), FRAC_CONST(0.903989315032959) }, - { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, - { FRAC_CONST(-0.514102756977081), FRAC_CONST(0.857728600502014) }, - { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, - { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(-0.634393274784088), FRAC_CONST(0.773010492324829) }, - { FRAC_CONST(-0.671559035778046), FRAC_CONST(0.740951061248779) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.740951240062714), FRAC_CONST(0.671558856964111) }, - { FRAC_CONST(-0.773010492324829), FRAC_CONST(0.634393274784088) }, - { FRAC_CONST(-0.803207635879517), FRAC_CONST(0.595699131488800) }, - { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, - { FRAC_CONST(-0.857728600502014), FRAC_CONST(0.514102756977081) }, - { FRAC_CONST(-0.881921350955963), FRAC_CONST(0.471396625041962) }, - { FRAC_CONST(-0.903989315032959), FRAC_CONST(0.427555054426193) }, - { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, - { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, - { FRAC_CONST(-0.956940352916718), FRAC_CONST(0.290284723043442) }, - { FRAC_CONST(-0.970031261444092), FRAC_CONST(0.242980077862740) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(-0.989176511764526), FRAC_CONST(0.146730333566666) }, - { FRAC_CONST(-0.995184719562531), FRAC_CONST(0.098017096519470) }, - { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067486077547) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, - { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, - { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, - { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.000000011924881), FRAC_CONST(-1.000000000000000) } -}; - -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/codebook/Makefile.am b/src/libfaad/codebook/Makefile.am deleted file mode 100644 index e4691f4b9..000000000 --- a/src/libfaad/codebook/Makefile.am +++ /dev/null @@ -1,15 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -EXTRA_DIST = hcb.h \ - hcb_1.h \ - hcb_2.h \ - hcb_3.h \ - hcb_4.h \ - hcb_5.h \ - hcb_6.h \ - hcb_7.h \ - hcb_8.h \ - hcb_9.h \ - hcb_10.h \ - hcb_11.h \ - hcb_sf.h diff --git a/src/libfaad/codebook/hcb.h b/src/libfaad/codebook/hcb.h deleted file mode 100644 index 96093300c..000000000 --- a/src/libfaad/codebook/hcb.h +++ /dev/null @@ -1,142 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: hcb.h,v 1.6 2005/10/29 23:57:08 tmmm Exp $ -**/ - -#ifndef __HCB_H__ -#define __HCB_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Optimal huffman decoding for AAC taken from: - * "SELECTING AN OPTIMAL HUFFMAN DECODER FOR AAC" by - * VLADIMIR Z. MESAROVIC , RAGHUNATH RAO, MIROSLAV V. DOKIC, and SACHIN DEO - * AES paper 5436 - * - * 2 methods are used for huffman decoding: - * - binary search - * - 2-step table lookup - * - * The choice of the "optimal" method is based on the fact that if the - * memory size for the Two-step is exorbitantly high then the decision - * is Binary search for that codebook. However, for marginally more memory - * size, if Twostep outperforms even the best case of Binary then the - * decision is Two-step for that codebook. - * - * The following methods are used for the different tables. - * codebook "optimal" method - * HCB_1 2-Step - * HCB_2 2-Step - * HCB_3 Binary - * HCB_4 2-Step - * HCB_5 Binary - * HCB_6 2-Step - * HCB_7 Binary - * HCB_8 2-Step - * HCB_9 Binary - * HCB_10 2-Step - * HCB_11 2-Step - * HCB_SF Binary - * - */ - - -#define ZERO_HCB 0 -#define FIRST_PAIR_HCB 5 -#define ESC_HCB 11 -#define QUAD_LEN 4 -#define PAIR_LEN 2 -#define NOISE_HCB 13 -#define INTENSITY_HCB2 14 -#define INTENSITY_HCB 15 - -/* 1st step table */ -typedef struct -{ - uint8_t offset; - uint8_t extra_bits; -} hcb; - -/* 2nd step table with quadruple data */ -typedef struct -{ - uint8_t bits; - int8_t x; - int8_t y; -} hcb_2_pair; - -typedef struct -{ - uint8_t bits; - int8_t x; - int8_t y; - int8_t v; - int8_t w; -} hcb_2_quad; - -/* binary search table */ -typedef struct -{ - uint8_t is_leaf; - int8_t data[4]; -} hcb_bin_quad; - -typedef struct -{ - uint8_t is_leaf; - int8_t data[2]; -} hcb_bin_pair; - -hcb *hcb_table[]; -hcb_2_quad *hcb_2_quad_table[]; -hcb_2_pair *hcb_2_pair_table[]; -hcb_bin_pair *hcb_bin_table[]; -uint8_t hcbN[]; -uint8_t unsigned_cb[]; -int hcb_2_quad_table_size[]; -int hcb_2_pair_table_size[]; -int hcb_bin_table_size[]; - -#include "codebook/hcb_1.h" -#include "codebook/hcb_2.h" -#include "codebook/hcb_3.h" -#include "codebook/hcb_4.h" -#include "codebook/hcb_5.h" -#include "codebook/hcb_6.h" -#include "codebook/hcb_7.h" -#include "codebook/hcb_8.h" -#include "codebook/hcb_9.h" -#include "codebook/hcb_10.h" -#include "codebook/hcb_11.h" -#include "codebook/hcb_sf.h" - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/codebook/hcb_1.h b/src/libfaad/codebook/hcb_1.h deleted file mode 100644 index 220299c55..000000000 --- a/src/libfaad/codebook/hcb_1.h +++ /dev/null @@ -1,183 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: hcb_1.h,v 1.4 2005/10/29 23:57:08 tmmm Exp $ -**/ - -/* 2-step huffman table HCB_1 */ - - -/* 1st step: 5 bits - * 2^5 = 32 entries - * - * Used to find offset into 2nd step table and number of extra bits to get - */ -static hcb hcb1_1[] = { - { /* 00000 */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* 10000 */ 1, 0 }, - { /* 10001 */ 2, 0 }, - { /* 10010 */ 3, 0 }, - { /* 10011 */ 4, 0 }, - { /* 10100 */ 5, 0 }, - { /* 10101 */ 6, 0 }, - { /* 10110 */ 7, 0 }, - { /* 10111 */ 8, 0 }, - - /* 7 bit codewords */ - { /* 11000 */ 9, 2 }, - { /* 11001 */ 13, 2 }, - { /* 11010 */ 17, 2 }, - { /* 11011 */ 21, 2 }, - { /* 11100 */ 25, 2 }, - { /* 11101 */ 29, 2 }, - - /* 9 bit codewords */ - { /* 11110 */ 33, 4 }, - - /* 9/10/11 bit codewords */ - { /* 11111 */ 49, 6 } -}; - -/* 2nd step table - * - * Gives size of codeword and actual data (x,y,v,w) - */ -static hcb_2_quad hcb1_2[] = { - /* 1 bit codeword */ - { 1, 0, 0, 0, 0 }, - - /* 5 bit codewords */ - { 5, 1, 0, 0, 0 }, - { 5, -1, 0, 0, 0 }, - { 5, 0, 0, 0, -1 }, - { 5, 0, 1, 0, 0 }, - { 5, 0, 0, 0, 1 }, - { 5, 0, 0, -1, 0 }, - { 5, 0, 0, 1, 0 }, - { 5, 0, -1, 0, 0 }, - - /* 7 bit codewords */ - /* first 5 bits: 11000 */ - { 7, 1, -1, 0, 0 }, - { 7, -1, 1, 0, 0 }, - { 7, 0, 0, -1, 1 }, - { 7, 0, 1, -1, 0 }, - /* first 5 bits: 11001 */ - { 7, 0, -1, 1, 0 }, - { 7, 0, 0, 1, -1 }, - { 7, 1, 1, 0, 0 }, - { 7, 0, 0, -1, -1 }, - /* first 5 bits: 11010 */ - { 7, -1, -1, 0, 0 }, - { 7, 0, -1, -1, 0 }, - { 7, 1, 0, -1, 0 }, - { 7, 0, 1, 0, -1 }, - /* first 5 bits: 11011 */ - { 7, -1, 0, 1, 0 }, - { 7, 0, 0, 1, 1 }, - { 7, 1, 0, 1, 0 }, - { 7, 0, -1, 0, 1 }, - /* first 5 bits: 11100 */ - { 7, 0, 1, 1, 0 }, - { 7, 0, 1, 0, 1 }, - { 7, -1, 0, -1, 0 }, - { 7, 1, 0, 0, 1 }, - /* first 5 bits: 11101 */ - { 7, -1, 0, 0, -1 }, - { 7, 1, 0, 0, -1 }, - { 7, -1, 0, 0, 1 }, - { 7, 0, -1, 0, -1 }, - - /* 9 bit codeword */ - /* first 5 bits: 11110 */ - { 9, 1, 1, -1, 0 }, - { 9, -1, 1, -1, 0 }, - { 9, 1, -1, 1, 0 }, - { 9, 0, 1, 1, -1 }, - { 9, 0, 1, -1, 1 }, - { 9, 0, -1, 1, 1 }, - { 9, 0, -1, 1, -1 }, - { 9, 1, -1, -1, 0 }, - { 9, 1, 0, -1, 1 }, - { 9, 0, 1, -1, -1 }, - { 9, -1, 1, 1, 0 }, - { 9, -1, 0, 1, -1 }, - { 9, -1, -1, 1, 0 }, - { 9, 0, -1, -1, 1 }, - { 9, 1, -1, 0, 1 }, - { 9, 1, -1, 0, -1 }, - - /* 9/10/11 bit codewords */ - /* first 5 bits: 11111 */ - /* 9 bit: reading 11 bits -> 2 too much so 4 entries for each codeword */ - { 9, -1, 1, 0, -1 }, { 9, -1, 1, 0, -1 }, { 9, -1, 1, 0, -1 }, { 9, -1, 1, 0, -1 }, - { 9, -1, -1, -1, 0 }, { 9, -1, -1, -1, 0 }, { 9, -1, -1, -1, 0 }, { 9, -1, -1, -1, 0 }, - { 9, 0, -1, -1, -1 }, { 9, 0, -1, -1, -1 }, { 9, 0, -1, -1, -1 }, { 9, 0, -1, -1, -1 }, - { 9, 0, 1, 1, 1 }, { 9, 0, 1, 1, 1 }, { 9, 0, 1, 1, 1 }, { 9, 0, 1, 1, 1 }, - { 9, 1, 0, 1, -1 }, { 9, 1, 0, 1, -1 }, { 9, 1, 0, 1, -1 }, { 9, 1, 0, 1, -1 }, - { 9, 1, 1, 0, 1 }, { 9, 1, 1, 0, 1 }, { 9, 1, 1, 0, 1 }, { 9, 1, 1, 0, 1 }, - { 9, -1, 1, 0, 1 }, { 9, -1, 1, 0, 1 }, { 9, -1, 1, 0, 1 }, { 9, -1, 1, 0, 1 }, - { 9, 1, 1, 1, 0 }, { 9, 1, 1, 1, 0 }, { 9, 1, 1, 1, 0 }, { 9, 1, 1, 1, 0 }, - /* 10 bit: reading 11 bits -> 1 too much so 2 entries for each codeword */ - { 10, -1, -1, 0, 1 }, { 10, -1, -1, 0, 1 }, - { 10, -1, 0, -1, -1 }, { 10, -1, 0, -1, -1 }, - { 10, 1, 1, 0, -1 }, { 10, 1, 1, 0, -1 }, - { 10, 1, 0, -1, -1 }, { 10, 1, 0, -1, -1 }, - { 10, -1, 0, -1, 1 }, { 10, -1, 0, -1, 1 }, - { 10, -1, -1, 0, -1 }, { 10, -1, -1, 0, -1 }, - { 10, -1, 0, 1, 1 }, { 10, -1, 0, 1, 1 }, - { 10, 1, 0, 1, 1 }, { 10, 1, 0, 1, 1 }, - /* 11 bit */ - { 11, 1, -1, 1, -1 }, - { 11, -1, 1, -1, 1 }, - { 11, -1, 1, 1, -1 }, - { 11, 1, -1, -1, 1 }, - { 11, 1, 1, 1, 1 }, - { 11, -1, -1, 1, 1 }, - { 11, 1, 1, -1, -1 }, - { 11, -1, -1, 1, -1 }, - { 11, -1, -1, -1, -1 }, - { 11, 1, 1, -1, 1 }, - { 11, 1, -1, 1, 1 }, - { 11, -1, 1, 1, 1 }, - { 11, -1, 1, -1, -1 }, - { 11, -1, -1, -1, 1 }, - { 11, 1, -1, -1, -1 }, - { 11, 1, 1, 1, -1 } -}; diff --git a/src/libfaad/codebook/hcb_10.h b/src/libfaad/codebook/hcb_10.h deleted file mode 100644 index 60bcab90a..000000000 --- a/src/libfaad/codebook/hcb_10.h +++ /dev/null @@ -1,309 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: hcb_10.h,v 1.4 2005/10/29 23:57:08 tmmm Exp $ -**/ - -/* 2-step huffman table HCB_10 */ - - -/* 1st step: 6 bits - * 2^6 = 64 entries - * - * Used to find offset into 2nd step table and number of extra bits to get - */ -static hcb hcb10_1[] = { - /* 4 bit codewords */ - { /* 000000 */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* 000100 */ 1, 0 }, - { /* */ 1, 0 }, - { /* */ 1, 0 }, - { /* */ 1, 0 }, - { /* 001000 */ 2, 0 }, - { /* */ 2, 0 }, - { /* */ 2, 0 }, - { /* */ 2, 0 }, - /* 5 bit codewords */ - { /* 001100 */ 3, 0 }, - { /* */ 3, 0 }, - { /* 001110 */ 4, 0 }, - { /* */ 4, 0 }, - { /* 010000 */ 5, 0 }, - { /* */ 5, 0 }, - { /* 010010 */ 6, 0 }, - { /* */ 6, 0 }, - { /* 010100 */ 7, 0 }, - { /* */ 7, 0 }, - { /* 010110 */ 8, 0 }, - { /* */ 8, 0 }, - { /* 011000 */ 9, 0 }, - { /* */ 9, 0 }, - { /* 011010 */ 10, 0 }, - { /* */ 10, 0 }, - /* 6 bit codewords */ - { /* 011100 */ 11, 0 }, - { /* 011101 */ 12, 0 }, - { /* 011110 */ 13, 0 }, - { /* 011111 */ 14, 0 }, - { /* 100000 */ 15, 0 }, - { /* 100001 */ 16, 0 }, - { /* 100010 */ 17, 0 }, - { /* 100011 */ 18, 0 }, - { /* 100100 */ 19, 0 }, - { /* 100101 */ 20, 0 }, - { /* 100110 */ 21, 0 }, - { /* 100111 */ 22, 0 }, - { /* 101000 */ 23, 0 }, - { /* 101001 */ 24, 0 }, - /* 7 bit codewords */ - { /* 101010 */ 25, 1 }, - { /* 101011 */ 27, 1 }, - { /* 101100 */ 29, 1 }, - { /* 101101 */ 31, 1 }, - { /* 101110 */ 33, 1 }, - { /* 101111 */ 35, 1 }, - { /* 110000 */ 37, 1 }, - { /* 110001 */ 39, 1 }, - /* 7/8 bit codewords */ - { /* 110010 */ 41, 2 }, - /* 8 bit codewords */ - { /* 110011 */ 45, 2 }, - { /* 110100 */ 49, 2 }, - { /* 110101 */ 53, 2 }, - { /* 110110 */ 57, 2 }, - { /* 110111 */ 61, 2 }, - /* 8/9 bit codewords */ - { /* 111000 */ 65, 3 }, - /* 9 bit codewords */ - { /* 111001 */ 73, 3 }, - { /* 111010 */ 81, 3 }, - { /* 111011 */ 89, 3 }, - /* 9/10 bit codewords */ - { /* 111100 */ 97, 4 }, - /* 10 bit codewords */ - { /* 111101 */ 113, 4 }, - { /* 111110 */ 129, 4 }, - /* 10/11/12 bit codewords */ - { /* 111111 */ 145, 6 } -}; - -/* 2nd step table - * - * Gives size of codeword and actual data (x,y,v,w) - */ -static hcb_2_pair hcb10_2[] = { - /* 4 bit codewords */ - { 4, 1, 1 }, - { 4, 1, 2 }, - { 4, 2, 1 }, - - /* 5 bit codewords */ - { 5, 2, 2 }, - { 5, 1, 0 }, - { 5, 0, 1 }, - { 5, 1, 3 }, - { 5, 3, 2 }, - { 5, 3, 1 }, - { 5, 2, 3 }, - { 5, 3, 3 }, - - /* 6 bit codewords */ - { 6, 2, 0 }, - { 6, 0, 2 }, - { 6, 2, 4 }, - { 6, 4, 2 }, - { 6, 1, 4 }, - { 6, 4, 1 }, - { 6, 0, 0 }, - { 6, 4, 3 }, - { 6, 3, 4 }, - { 6, 3, 0 }, - { 6, 0, 3 }, - { 6, 4, 4 }, - { 6, 2, 5 }, - { 6, 5, 2 }, - - /* 7 bit codewords */ - { 7, 1, 5 }, - { 7, 5, 1 }, - { 7, 5, 3 }, - { 7, 3, 5 }, - { 7, 5, 4 }, - { 7, 4, 5 }, - { 7, 6, 2 }, - { 7, 2, 6 }, - { 7, 6, 3 }, - { 7, 4, 0 }, - { 7, 6, 1 }, - { 7, 0, 4 }, - { 7, 1, 6 }, - { 7, 3, 6 }, - { 7, 5, 5 }, - { 7, 6, 4 }, - - /* 7/8 bit codewords */ - { 7, 4, 6 }, { 7, 4, 6 }, - { 8, 6, 5 }, - { 8, 7, 2 }, - - /* 8 bit codewords */ - { 8, 3, 7 }, - { 8, 2, 7 }, - { 8, 5, 6 }, - { 8, 8, 2 }, - { 8, 7, 3 }, - { 8, 5, 0 }, - { 8, 7, 1 }, - { 8, 0, 5 }, - { 8, 8, 1 }, - { 8, 1, 7 }, - { 8, 8, 3 }, - { 8, 7, 4 }, - { 8, 4, 7 }, - { 8, 2, 8 }, - { 8, 6, 6 }, - { 8, 7, 5 }, - { 8, 1, 8 }, - { 8, 3, 8 }, - { 8, 8, 4 }, - { 8, 4, 8 }, - - /* 8/9 bit codewords */ - { 8, 5, 7 }, { 8, 5, 7 }, - { 8, 8, 5 }, { 8, 8, 5 }, - { 8, 5, 8 }, { 8, 5, 8 }, - { 9, 7, 6 }, - { 9, 6, 7 }, - - /* 9 bit codewords */ - { 9, 9, 2 }, - { 9, 6, 0 }, - { 9, 6, 8 }, - { 9, 9, 3 }, - { 9, 3, 9 }, - { 9, 9, 1 }, - { 9, 2, 9 }, - { 9, 0, 6 }, - { 9, 8, 6 }, - { 9, 9, 4 }, - { 9, 4, 9 }, - { 9, 10, 2 }, - { 9, 1, 9 }, - { 9, 7, 7 }, - { 9, 8, 7 }, - { 9, 9, 5 }, - { 9, 7, 8 }, - { 9, 10, 3 }, - { 9, 5, 9 }, - { 9, 10, 4 }, - { 9, 2, 10 }, - { 9, 10, 1 }, - { 9, 3, 10 }, - { 9, 9, 6 }, - - /* 9/10 bit codewords */ - { 9, 6, 9 }, { 9, 6, 9 }, - { 9, 8, 0 }, { 9, 8, 0 }, - { 9, 4, 10 }, { 9, 4, 10 }, - { 9, 7, 0 }, { 9, 7, 0 }, - { 9, 11, 2 }, { 9, 11, 2 }, - { 10, 7, 9 }, - { 10, 11, 3 }, - { 10, 10, 6 }, - { 10, 1, 10 }, - { 10, 11, 1 }, - { 10, 9, 7 }, - - /* 10 bit codewords */ - { 10, 0, 7 }, - { 10, 8, 8 }, - { 10, 10, 5 }, - { 10, 3, 11 }, - { 10, 5, 10 }, - { 10, 8, 9 }, - { 10, 11, 5 }, - { 10, 0, 8 }, - { 10, 11, 4 }, - { 10, 2, 11 }, - { 10, 7, 10 }, - { 10, 6, 10 }, - { 10, 10, 7 }, - { 10, 4, 11 }, - { 10, 1, 11 }, - { 10, 12, 2 }, - { 10, 9, 8 }, - { 10, 12, 3 }, - { 10, 11, 6 }, - { 10, 5, 11 }, - { 10, 12, 4 }, - { 10, 11, 7 }, - { 10, 12, 5 }, - { 10, 3, 12 }, - { 10, 6, 11 }, - { 10, 9, 0 }, - { 10, 10, 8 }, - { 10, 10, 0 }, - { 10, 12, 1 }, - { 10, 0, 9 }, - { 10, 4, 12 }, - { 10, 9, 9 }, - - /* 10/11/12 bit codewords */ - { 10, 12, 6 }, { 10, 12, 6 }, { 10, 12, 6 }, { 10, 12, 6 }, - { 10, 2, 12 }, { 10, 2, 12 }, { 10, 2, 12 }, { 10, 2, 12 }, - { 10, 8, 10 }, { 10, 8, 10 }, { 10, 8, 10 }, { 10, 8, 10 }, - { 11, 9, 10 }, { 11, 9, 10 }, - { 11, 1, 12 }, { 11, 1, 12 }, - { 11, 11, 8 }, { 11, 11, 8 }, - { 11, 12, 7 }, { 11, 12, 7 }, - { 11, 7, 11 }, { 11, 7, 11 }, - { 11, 5, 12 }, { 11, 5, 12 }, - { 11, 6, 12 }, { 11, 6, 12 }, - { 11, 10, 9 }, { 11, 10, 9 }, - { 11, 8, 11 }, { 11, 8, 11 }, - { 11, 12, 8 }, { 11, 12, 8 }, - { 11, 0, 10 }, { 11, 0, 10 }, - { 11, 7, 12 }, { 11, 7, 12 }, - { 11, 11, 0 }, { 11, 11, 0 }, - { 11, 10, 10 }, { 11, 10, 10 }, - { 11, 11, 9 }, { 11, 11, 9 }, - { 11, 11, 10 }, { 11, 11, 10 }, - { 11, 0, 11 }, { 11, 0, 11 }, - { 11, 11, 11 }, { 11, 11, 11 }, - { 11, 9, 11 }, { 11, 9, 11 }, - { 11, 10, 11 }, { 11, 10, 11 }, - { 11, 12, 0 }, { 11, 12, 0 }, - { 11, 8, 12 }, { 11, 8, 12 }, - { 12, 12, 9 }, - { 12, 10, 12 }, - { 12, 9, 12 }, - { 12, 11, 12 }, - { 12, 12, 11 }, - { 12, 0, 12 }, - { 12, 12, 10 }, - { 12, 12, 12 } -}; diff --git a/src/libfaad/codebook/hcb_11.h b/src/libfaad/codebook/hcb_11.h deleted file mode 100644 index bd4f647e6..000000000 --- a/src/libfaad/codebook/hcb_11.h +++ /dev/null @@ -1,412 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: hcb_11.h,v 1.4 2005/10/29 23:57:08 tmmm Exp $ -**/ - -/* 2-step huffman table HCB_11 */ - - -/* 1st step: 5 bits - * 2^5 = 32 entries - * - * Used to find offset into 2nd step table and number of extra bits to get - */ -static hcb hcb11_1[] = { - /* 4 bits */ - { /* 00000 */ 0, 0 }, - { /* */ 0, 0 }, - { /* 00010 */ 1, 0 }, - { /* */ 1, 0 }, - - /* 5 bits */ - { /* 00100 */ 2, 0 }, - { /* 00101 */ 3, 0 }, - { /* 00110 */ 4, 0 }, - { /* 00111 */ 5, 0 }, - { /* 01000 */ 6, 0 }, - { /* 01001 */ 7, 0 }, - - /* 6 bits */ - { /* 01010 */ 8, 1 }, - { /* 01011 */ 10, 1 }, - { /* 01100 */ 12, 1 }, - - /* 6/7 bits */ - { /* 01101 */ 14, 2 }, - - /* 7 bits */ - { /* 01110 */ 18, 2 }, - { /* 01111 */ 22, 2 }, - { /* 10000 */ 26, 2 }, - - /* 7/8 bits */ - { /* 10001 */ 30, 3 }, - - /* 8 bits */ - { /* 10010 */ 38, 3 }, - { /* 10011 */ 46, 3 }, - { /* 10100 */ 54, 3 }, - { /* 10101 */ 62, 3 }, - { /* 10110 */ 70, 3 }, - { /* 10111 */ 78, 3 }, - - /* 8/9 bits */ - { /* 11000 */ 86, 4 }, - - /* 9 bits */ - { /* 11001 */ 102, 4 }, - { /* 11010 */ 118, 4 }, - { /* 11011 */ 134, 4 }, - - /* 9/10 bits */ - { /* 11100 */ 150, 5 }, - - /* 10 bits */ - { /* 11101 */ 182, 5 }, - { /* 11110 */ 214, 5 }, - - /* 10/11/12 bits */ - { /* 11111 */ 246, 7 } -}; - -/* 2nd step table - * - * Gives size of codeword and actual data (x,y,v,w) - */ -static hcb_2_pair hcb11_2[] = { - /* 4 */ - { 4, 0, 0 }, - { 4, 1, 1 }, - - /* 5 */ - { 5, 16, 16 }, - { 5, 1, 0 }, - { 5, 0, 1 }, - { 5, 2, 1 }, - { 5, 1, 2 }, - { 5, 2, 2 }, - - /* 6 */ - { 6, 1, 3 }, - { 6, 3, 1 }, - { 6, 3, 2 }, - { 6, 2, 0 }, - { 6, 2, 3 }, - { 6, 0, 2 }, - - /* 6/7 */ - { 6, 3, 3 }, { 6, 3, 3 }, - { 7, 4, 1 }, - { 7, 1, 4 }, - - /* 7 */ - { 7, 4, 2 }, - { 7, 2, 4 }, - { 7, 4, 3 }, - { 7, 3, 4 }, - { 7, 3, 0 }, - { 7, 0, 3 }, - { 7, 5, 1 }, - { 7, 5, 2 }, - { 7, 2, 5 }, - { 7, 4, 4 }, - { 7, 1, 5 }, - { 7, 5, 3 }, - - /* 7/8 */ - { 7, 3, 5 }, { 7, 3, 5 }, - { 7, 5, 4 }, { 7, 5, 4 }, - { 8, 4, 5 }, - { 8, 6, 2 }, - { 8, 2, 6 }, - { 8, 6, 1 }, - - /* 8 */ - { 8, 6, 3 }, - { 8, 3, 6 }, - { 8, 1, 6 }, - { 8, 4, 16 }, - { 8, 3, 16 }, - { 8, 16, 5 }, - { 8, 16, 3 }, - { 8, 16, 4 }, - { 8, 6, 4 }, - { 8, 16, 6 }, - { 8, 4, 0 }, - { 8, 4, 6 }, - { 8, 0, 4 }, - { 8, 2, 16 }, - { 8, 5, 5 }, - { 8, 5, 16 }, - { 8, 16, 7 }, - { 8, 16, 2 }, - { 8, 16, 8 }, - { 8, 2, 7 }, - { 8, 7, 2 }, - { 8, 3, 7 }, - { 8, 6, 5 }, - { 8, 5, 6 }, - { 8, 6, 16 }, - { 8, 16, 10 }, - { 8, 7, 3 }, - { 8, 7, 1 }, - { 8, 16, 9 }, - { 8, 7, 16 }, - { 8, 1, 16 }, - { 8, 1, 7 }, - { 8, 4, 7 }, - { 8, 16, 11 }, - { 8, 7, 4 }, - { 8, 16, 12 }, - { 8, 8, 16 }, - { 8, 16, 1 }, - { 8, 6, 6 }, - { 8, 9, 16 }, - { 8, 2, 8 }, - { 8, 5, 7 }, - { 8, 10, 16 }, - { 8, 16, 13 }, - { 8, 8, 3 }, - { 8, 8, 2 }, - { 8, 3, 8 }, - { 8, 5, 0 }, - - /* 8/9 */ - { 8, 16, 14 }, { 8, 16, 14 }, - { 8, 11, 16 }, { 8, 11, 16 }, - { 8, 7, 5 }, { 8, 7, 5 }, - { 8, 4, 8 }, { 8, 4, 8 }, - { 8, 6, 7 }, { 8, 6, 7 }, - { 8, 7, 6 }, { 8, 7, 6 }, - { 8, 0, 5 }, { 8, 0, 5 }, - { 9, 8, 4 }, - { 9, 16, 15 }, - - /* 9 */ - { 9, 12, 16 }, - { 9, 1, 8 }, - { 9, 8, 1 }, - { 9, 14, 16 }, - { 9, 5, 8 }, - { 9, 13, 16 }, - { 9, 3, 9 }, - { 9, 8, 5 }, - { 9, 7, 7 }, - { 9, 2, 9 }, - { 9, 8, 6 }, - { 9, 9, 2 }, - { 9, 9, 3 }, - { 9, 15, 16 }, - { 9, 4, 9 }, - { 9, 6, 8 }, - { 9, 6, 0 }, - { 9, 9, 4 }, - { 9, 5, 9 }, - { 9, 8, 7 }, - { 9, 7, 8 }, - { 9, 1, 9 }, - { 9, 10, 3 }, - { 9, 0, 6 }, - { 9, 10, 2 }, - { 9, 9, 1 }, - { 9, 9, 5 }, - { 9, 4, 10 }, - { 9, 2, 10 }, - { 9, 9, 6 }, - { 9, 3, 10 }, - { 9, 6, 9 }, - { 9, 10, 4 }, - { 9, 8, 8 }, - { 9, 10, 5 }, - { 9, 9, 7 }, - { 9, 11, 3 }, - { 9, 1, 10 }, - { 9, 7, 0 }, - { 9, 10, 6 }, - { 9, 7, 9 }, - { 9, 3, 11 }, - { 9, 5, 10 }, - { 9, 10, 1 }, - { 9, 4, 11 }, - { 9, 11, 2 }, - { 9, 13, 2 }, - { 9, 6, 10 }, - - /* 9/10 */ - { 9, 13, 3 }, { 9, 13, 3 }, - { 9, 2, 11 }, { 9, 2, 11 }, - { 9, 16, 0 }, { 9, 16, 0 }, - { 9, 5, 11 }, { 9, 5, 11 }, - { 9, 11, 5 }, { 9, 11, 5 }, - { 10, 11, 4 }, - { 10, 9, 8 }, - { 10, 7, 10 }, - { 10, 8, 9 }, - { 10, 0, 16 }, - { 10, 4, 13 }, - { 10, 0, 7 }, - { 10, 3, 13 }, - { 10, 11, 6 }, - { 10, 13, 1 }, - { 10, 13, 4 }, - { 10, 12, 3 }, - { 10, 2, 13 }, - { 10, 13, 5 }, - { 10, 8, 10 }, - { 10, 6, 11 }, - { 10, 10, 8 }, - { 10, 10, 7 }, - { 10, 14, 2 }, - { 10, 12, 4 }, - { 10, 1, 11 }, - { 10, 4, 12 }, - - /* 10 */ - { 10, 11, 1 }, - { 10, 3, 12 }, - { 10, 1, 13 }, - { 10, 12, 2 }, - { 10, 7, 11 }, - { 10, 3, 14 }, - { 10, 5, 12 }, - { 10, 5, 13 }, - { 10, 14, 4 }, - { 10, 4, 14 }, - { 10, 11, 7 }, - { 10, 14, 3 }, - { 10, 12, 5 }, - { 10, 13, 6 }, - { 10, 12, 6 }, - { 10, 8, 0 }, - { 10, 11, 8 }, - { 10, 2, 12 }, - { 10, 9, 9 }, - { 10, 14, 5 }, - { 10, 6, 13 }, - { 10, 10, 10 }, - { 10, 15, 2 }, - { 10, 8, 11 }, - { 10, 9, 10 }, - { 10, 14, 6 }, - { 10, 10, 9 }, - { 10, 5, 14 }, - { 10, 11, 9 }, - { 10, 14, 1 }, - { 10, 2, 14 }, - { 10, 6, 12 }, - { 10, 1, 12 }, - { 10, 13, 8 }, - { 10, 0, 8 }, - { 10, 13, 7 }, - { 10, 7, 12 }, - { 10, 12, 7 }, - { 10, 7, 13 }, - { 10, 15, 3 }, - { 10, 12, 1 }, - { 10, 6, 14 }, - { 10, 2, 15 }, - { 10, 15, 5 }, - { 10, 15, 4 }, - { 10, 1, 14 }, - { 10, 9, 11 }, - { 10, 4, 15 }, - { 10, 14, 7 }, - { 10, 8, 13 }, - { 10, 13, 9 }, - { 10, 8, 12 }, - { 10, 5, 15 }, - { 10, 3, 15 }, - { 10, 10, 11 }, - { 10, 11, 10 }, - { 10, 12, 8 }, - { 10, 15, 6 }, - { 10, 15, 7 }, - { 10, 8, 14 }, - { 10, 15, 1 }, - { 10, 7, 14 }, - { 10, 9, 0 }, - { 10, 0, 9 }, - - /* 10/11/12 */ - { 10, 9, 13 }, { 10, 9, 13 }, { 10, 9, 13 }, { 10, 9, 13 }, - { 10, 9, 12 }, { 10, 9, 12 }, { 10, 9, 12 }, { 10, 9, 12 }, - { 10, 12, 9 }, { 10, 12, 9 }, { 10, 12, 9 }, { 10, 12, 9 }, - { 10, 14, 8 }, { 10, 14, 8 }, { 10, 14, 8 }, { 10, 14, 8 }, - { 10, 10, 13 }, { 10, 10, 13 }, { 10, 10, 13 }, { 10, 10, 13 }, - { 10, 14, 9 }, { 10, 14, 9 }, { 10, 14, 9 }, { 10, 14, 9 }, - { 10, 12, 10 }, { 10, 12, 10 }, { 10, 12, 10 }, { 10, 12, 10 }, - { 10, 6, 15 }, { 10, 6, 15 }, { 10, 6, 15 }, { 10, 6, 15 }, - { 10, 7, 15 }, { 10, 7, 15 }, { 10, 7, 15 }, { 10, 7, 15 }, - - { 11, 9, 14 }, { 11, 9, 14 }, - { 11, 15, 8 }, { 11, 15, 8 }, - { 11, 11, 11 }, { 11, 11, 11 }, - { 11, 11, 14 }, { 11, 11, 14 }, - { 11, 1, 15 }, { 11, 1, 15 }, - { 11, 10, 12 }, { 11, 10, 12 }, - { 11, 10, 14 }, { 11, 10, 14 }, - { 11, 13, 11 }, { 11, 13, 11 }, - { 11, 13, 10 }, { 11, 13, 10 }, - { 11, 11, 13 }, { 11, 11, 13 }, - { 11, 11, 12 }, { 11, 11, 12 }, - { 11, 8, 15 }, { 11, 8, 15 }, - { 11, 14, 11 }, { 11, 14, 11 }, - { 11, 13, 12 }, { 11, 13, 12 }, - { 11, 12, 13 }, { 11, 12, 13 }, - { 11, 15, 9 }, { 11, 15, 9 }, - { 11, 14, 10 }, { 11, 14, 10 }, - { 11, 10, 0 }, { 11, 10, 0 }, - { 11, 12, 11 }, { 11, 12, 11 }, - { 11, 9, 15 }, { 11, 9, 15 }, - { 11, 0, 10 }, { 11, 0, 10 }, - { 11, 12, 12 }, { 11, 12, 12 }, - { 11, 11, 0 }, { 11, 11, 0 }, - { 11, 12, 14 }, { 11, 12, 14 }, - { 11, 10, 15 }, { 11, 10, 15 }, - { 11, 13, 13 }, { 11, 13, 13 }, - { 11, 0, 13 }, { 11, 0, 13 }, - { 11, 14, 12 }, { 11, 14, 12 }, - { 11, 15, 10 }, { 11, 15, 10 }, - { 11, 15, 11 }, { 11, 15, 11 }, - { 11, 11, 15 }, { 11, 11, 15 }, - { 11, 14, 13 }, { 11, 14, 13 }, - { 11, 13, 0 }, { 11, 13, 0 }, - { 11, 0, 11 }, { 11, 0, 11 }, - { 11, 13, 14 }, { 11, 13, 14 }, - { 11, 15, 12 }, { 11, 15, 12 }, - { 11, 15, 13 }, { 11, 15, 13 }, - { 11, 12, 15 }, { 11, 12, 15 }, - { 11, 14, 0 }, { 11, 14, 0 }, - { 11, 14, 14 }, { 11, 14, 14 }, - { 11, 13, 15 }, { 11, 13, 15 }, - { 11, 12, 0 }, { 11, 12, 0 }, - { 11, 14, 15 }, { 11, 14, 15 }, - { 12, 0, 14 }, - { 12, 0, 12 }, - { 12, 15, 14 }, - { 12, 15, 0 }, - { 12, 0, 15 }, - { 12, 15, 15 } -}; diff --git a/src/libfaad/codebook/hcb_2.h b/src/libfaad/codebook/hcb_2.h deleted file mode 100644 index 6aff6b12b..000000000 --- a/src/libfaad/codebook/hcb_2.h +++ /dev/null @@ -1,182 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: hcb_2.h,v 1.4 2005/10/29 23:57:08 tmmm Exp $ -**/ - -/* 2-step huffman table HCB_2 */ - - -/* 1st step: 5 bits - * 2^5 = 32 entries - * - * Used to find offset into 2nd step table and number of extra bits to get - */ -static hcb hcb2_1[] = { - { /* 00000 */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* 00100 */ 1, 0 }, - { /* */ 1, 0 }, - { /* 00110 */ 2, 0 }, - { /* 00111 */ 3, 0 }, - { /* 01000 */ 4, 0 }, - { /* 01001 */ 5, 0 }, - { /* 01010 */ 6, 0 }, - { /* 01011 */ 7, 0 }, - { /* 01100 */ 8, 0 }, - - /* 6 bit codewords */ - { /* 01101 */ 9, 1 }, - { /* 01110 */ 11, 1 }, - { /* 01111 */ 13, 1 }, - { /* 10000 */ 15, 1 }, - { /* 10001 */ 17, 1 }, - { /* 10010 */ 19, 1 }, - { /* 10011 */ 21, 1 }, - { /* 10100 */ 23, 1 }, - { /* 10101 */ 25, 1 }, - { /* 10110 */ 27, 1 }, - { /* 10111 */ 29, 1 }, - { /* 11000 */ 31, 1 }, - - /* 7 bit codewords */ - { /* 11001 */ 33, 2 }, - { /* 11010 */ 37, 2 }, - { /* 11011 */ 41, 2 }, - - /* 7/8 bit codewords */ - { /* 11100 */ 45, 3 }, - - /* 8 bit codewords */ - { /* 11101 */ 53, 3 }, - { /* 11110 */ 61, 3 }, - - /* 8/9 bit codewords */ - { /* 11111 */ 69, 4 } -}; - -/* 2nd step table - * - * Gives size of codeword and actual data (x,y,v,w) - */ -static hcb_2_quad hcb2_2[] = { - /* 3 bit codeword */ - { 3, 0, 0, 0, 0 }, - - /* 4 bit codeword */ - { 4, 1, 0, 0, 0 }, - - /* 5 bit codewords */ - { 5, -1, 0, 0, 0 }, - { 5, 0, 0, 0, 1 }, - { 5, 0, 0, -1, 0 }, - { 5, 0, 0, 0, -1 }, - { 5, 0, -1, 0, 0 }, - { 5, 0, 0, 1, 0 }, - { 5, 0, 1, 0, 0 }, - - /* 6 bit codewords */ - { 6, 0, -1, 1, 0 }, - { 6, -1, 1, 0, 0 }, - { 6, 0, 1, -1, 0 }, - { 6, 0, 0, 1, -1 }, - { 6, 0, 1, 0, -1 }, - { 6, 0, 0, -1, 1 }, - { 6, -1, 0, 0, -1 }, - { 6, 1, -1, 0, 0 }, - { 6, 1, 0, -1, 0 }, - { 6, -1, -1, 0, 0 }, - { 6, 0, 0, -1, -1 }, - { 6, 1, 0, 1, 0 }, - { 6, 1, 0, 0, 1 }, - { 6, 0, -1, 0, 1 }, - { 6, -1, 0, 1, 0 }, - { 6, 0, 1, 0, 1 }, - { 6, 0, -1, -1, 0 }, - { 6, -1, 0, 0, 1 }, - { 6, 0, -1, 0, -1 }, - { 6, -1, 0, -1, 0 }, - { 6, 1, 1, 0, 0 }, - { 6, 0, 1, 1, 0 }, - { 6, 0, 0, 1, 1 }, - { 6, 1, 0, 0, -1 }, - - /* 7 bit codewords */ - { 7, 0, 1, -1, 1 }, - { 7, 1, 0, -1, 1 }, - { 7, -1, 1, -1, 0 }, - { 7, 0, -1, 1, -1 }, - { 7, 1, -1, 1, 0 }, - { 7, 1, 1, 0, -1 }, - { 7, 1, 0, 1, 1 }, - { 7, -1, 1, 1, 0 }, - { 7, 0, -1, -1, 1 }, - { 7, 1, 1, 1, 0 }, - { 7, -1, 0, 1, -1 }, - { 7, -1, -1, -1, 0 }, - - /* 7/8 bit codewords */ - { 7, -1, 0, -1, 1 }, { 7, -1, 0, -1, 1 }, - { 7, 1, -1, -1, 0 }, { 7, 1, -1, -1, 0 }, - { 7, 1, 1, -1, 0 }, { 7, 1, 1, -1, 0 }, - { 8, 1, -1, 0, 1 }, - { 8, -1, 1, 0, -1 }, - - /* 8 bit codewords */ - { 8, -1, -1, 1, 0 }, - { 8, -1, 0, 1, 1 }, - { 8, -1, -1, 0, 1 }, - { 8, -1, -1, 0, -1 }, - { 8, 0, -1, -1, -1 }, - { 8, 1, 0, 1, -1 }, - { 8, 1, 0, -1, -1 }, - { 8, 0, 1, -1, -1 }, - { 8, 0, 1, 1, 1 }, - { 8, -1, 1, 0, 1 }, - { 8, -1, 0, -1, -1 }, - { 8, 0, 1, 1, -1 }, - { 8, 1, -1, 0, -1 }, - { 8, 0, -1, 1, 1 }, - { 8, 1, 1, 0, 1 }, - { 8, 1, -1, 1, -1 }, - - /* 8/9 bit codewords */ - { 8, -1, 1, -1, 1 }, { 8, -1, 1, -1, 1 }, - { 9, 1, -1, -1, 1 }, - { 9, -1, -1, -1, -1 }, - { 9, -1, 1, 1, -1 }, - { 9, -1, 1, 1, 1 }, - { 9, 1, 1, 1, 1 }, - { 9, -1, -1, 1, -1 }, - { 9, 1, -1, 1, 1 }, - { 9, -1, 1, -1, -1 }, - { 9, -1, -1, 1, 1 }, - { 9, 1, 1, -1, -1 }, - { 9, 1, -1, -1, -1 }, - { 9, -1, -1, -1, 1 }, - { 9, 1, 1, -1, 1 }, - { 9, 1, 1, 1, -1 } -}; diff --git a/src/libfaad/codebook/hcb_3.h b/src/libfaad/codebook/hcb_3.h deleted file mode 100644 index 25b54da90..000000000 --- a/src/libfaad/codebook/hcb_3.h +++ /dev/null @@ -1,193 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: hcb_3.h,v 1.4 2005/10/29 23:57:08 tmmm Exp $ -**/ - -/* Binary search huffman table HCB_3 */ - - -static hcb_bin_quad hcb3[] = { - { /* 0 */ 0, { 1, 2, 0, 0 } }, - { /* 1 */ 1, { 0, 0, 0, 0 } }, /* 0 */ - { /* 2 */ 0, { 1, 2, 0, 0 } }, - { /* 3 */ 0, { 2, 3, 0, 0 } }, - { /* 4 */ 0, { 3, 4, 0, 0 } }, - { /* 5 */ 0, { 4, 5, 0, 0 } }, - { /* 6 */ 0, { 5, 6, 0, 0 } }, - { /* 7 */ 0, { 6, 7, 0, 0 } }, - { /* 8 */ 0, { 7, 8, 0, 0 } }, - { /* 9 */ 1, { 1, 0, 0, 0 } }, /* 1000 */ - { /* 10 */ 1, { 0, 0, 0, 1 } }, /* 1001 */ - { /* 11 */ 1, { 0, 1, 0, 0 } }, /* 1010 */ - { /* 12 */ 1, { 0, 0, 1, 0 } }, /* 1011 */ - { /* 13 */ 0, { 4, 5, 0, 0 } }, - { /* 14 */ 0, { 5, 6, 0, 0 } }, - { /* 15 */ 0, { 6, 7, 0, 0 } }, - { /* 16 */ 0, { 7, 8, 0, 0 } }, - { /* 17 */ 1, { 1, 1, 0, 0 } }, - { /* 18 */ 1, { 0, 0, 1, 1 } }, - { /* 19 */ 0, { 6, 7, 0, 0 } }, - { /* 20 */ 0, { 7, 8, 0, 0 } }, - { /* 21 */ 0, { 8, 9, 0, 0 } }, - { /* 22 */ 0, { 9, 10, 0, 0 } }, - { /* 23 */ 0, { 10, 11, 0, 0 } }, - { /* 24 */ 0, { 11, 12, 0, 0 } }, - { /* 25 */ 1, { 0, 1, 1, 0 } }, /* 110100 */ - { /* 26 */ 1, { 0, 1, 0, 1 } }, /* 110101 */ - { /* 27 */ 1, { 1, 0, 1, 0 } }, /* 110110 */ - { /* 28 */ 1, { 0, 1, 1, 1 } }, /* 110111 */ - { /* 29 */ 1, { 1, 0, 0, 1 } }, /* 111000 */ - { /* 30 */ 1, { 1, 1, 1, 0 } }, /* 111001 */ - { /* 31 */ 0, { 6, 7, 0, 0 } }, - { /* 32 */ 0, { 7, 8, 0, 0 } }, - { /* 33 */ 0, { 8, 9, 0, 0 } }, - { /* 34 */ 0, { 9, 10, 0, 0 } }, - { /* 35 */ 0, { 10, 11, 0, 0 } }, - { /* 36 */ 0, { 11, 12, 0, 0 } }, - { /* 37 */ 1, { 1, 1, 1, 1 } }, /* 1110100 */ - { /* 38 */ 1, { 1, 0, 1, 1 } }, /* 1110101 */ - { /* 39 */ 1, { 1, 1, 0, 1 } }, /* 1110110 */ - { /* 40 */ 0, { 9, 10, 0, 0 } }, - { /* 41 */ 0, { 10, 11, 0, 0 } }, - { /* 42 */ 0, { 11, 12, 0, 0 } }, - { /* 43 */ 0, { 12, 13, 0, 0 } }, - { /* 44 */ 0, { 13, 14, 0, 0 } }, - { /* 45 */ 0, { 14, 15, 0, 0 } }, - { /* 46 */ 0, { 15, 16, 0, 0 } }, - { /* 47 */ 0, { 16, 17, 0, 0 } }, - { /* 48 */ 0, { 17, 18, 0, 0 } }, - { /* 49 */ 1, { 2, 0, 0, 0 } }, /* 11101110 */ - { /* 50 */ 1, { 0, 0, 0, 2 } }, /* 11101111 */ - { /* 51 */ 1, { 0, 0, 1, 2 } }, /* 11110000 */ - { /* 52 */ 1, { 2, 1, 0, 0 } }, /* 11110001 */ - { /* 53 */ 1, { 1, 2, 1, 0 } }, /* 11110010 */ - { /* 54 */ 0, { 13, 14, 0, 0 } }, - { /* 55 */ 0, { 14, 15, 0, 0 } }, - { /* 56 */ 0, { 15, 16, 0, 0 } }, - { /* 57 */ 0, { 16, 17, 0, 0 } }, - { /* 58 */ 0, { 17, 18, 0, 0 } }, - { /* 59 */ 0, { 18, 19, 0, 0 } }, - { /* 60 */ 0, { 19, 20, 0, 0 } }, - { /* 61 */ 0, { 20, 21, 0, 0 } }, - { /* 62 */ 0, { 21, 22, 0, 0 } }, - { /* 63 */ 0, { 22, 23, 0, 0 } }, - { /* 64 */ 0, { 23, 24, 0, 0 } }, - { /* 65 */ 0, { 24, 25, 0, 0 } }, - { /* 66 */ 0, { 25, 26, 0, 0 } }, - { /* 67 */ 1, { 0, 0, 2, 1 } }, - { /* 68 */ 1, { 0, 1, 2, 1 } }, - { /* 69 */ 1, { 1, 2, 0, 0 } }, - { /* 70 */ 1, { 0, 1, 1, 2 } }, - { /* 71 */ 1, { 2, 1, 1, 0 } }, - { /* 72 */ 1, { 0, 0, 2, 0 } }, - { /* 73 */ 1, { 0, 2, 1, 0 } }, - { /* 74 */ 1, { 0, 1, 2, 0 } }, - { /* 75 */ 1, { 0, 2, 0, 0 } }, - { /* 76 */ 1, { 0, 1, 0, 2 } }, - { /* 77 */ 1, { 2, 0, 1, 0 } }, - { /* 78 */ 1, { 1, 2, 1, 1 } }, - { /* 79 */ 1, { 0, 2, 1, 1 } }, - { /* 80 */ 1, { 1, 1, 2, 0 } }, - { /* 81 */ 1, { 1, 1, 2, 1 } }, - { /* 82 */ 0, { 11, 12, 0, 0 } }, - { /* 83 */ 0, { 12, 13, 0, 0 } }, - { /* 84 */ 0, { 13, 14, 0, 0 } }, - { /* 85 */ 0, { 14, 15, 0, 0 } }, - { /* 86 */ 0, { 15, 16, 0, 0 } }, - { /* 87 */ 0, { 16, 17, 0, 0 } }, - { /* 88 */ 0, { 17, 18, 0, 0 } }, - { /* 89 */ 0, { 18, 19, 0, 0 } }, - { /* 90 */ 0, { 19, 20, 0, 0 } }, - { /* 91 */ 0, { 20, 21, 0, 0 } }, - { /* 92 */ 0, { 21, 22, 0, 0 } }, - { /* 93 */ 1, { 1, 2, 0, 1 } }, /* 1111101010 */ - { /* 94 */ 1, { 1, 0, 2, 0 } }, /* 1111101011 */ - { /* 95 */ 1, { 1, 0, 2, 1 } }, /* 1111101100 */ - { /* 96 */ 1, { 0, 2, 0, 1 } }, /* 1111101101 */ - { /* 97 */ 1, { 2, 1, 1, 1 } }, /* 1111101110 */ - { /* 98 */ 1, { 1, 1, 1, 2 } }, /* 1111101111 */ - { /* 99 */ 1, { 2, 1, 0, 1 } }, /* 1111110000 */ - { /* 00 */ 1, { 1, 0, 1, 2 } }, /* 1111110001 */ - { /* 01 */ 1, { 0, 0, 2, 2 } }, /* 1111110010 */ - { /* 02 */ 1, { 0, 1, 2, 2 } }, /* 1111110011 */ - { /* 03 */ 1, { 2, 2, 1, 0 } }, /* 1111110100 */ - { /* 04 */ 1, { 1, 2, 2, 0 } }, /* 1111110101 */ - { /* 05 */ 1, { 1, 0, 0, 2 } }, /* 1111110110 */ - { /* 06 */ 1, { 2, 0, 0, 1 } }, /* 1111110111 */ - { /* 07 */ 1, { 0, 2, 2, 1 } }, /* 1111111000 */ - { /* 08 */ 0, { 7, 8, 0, 0 } }, - { /* 09 */ 0, { 8, 9, 0, 0 } }, - { /* 10 */ 0, { 9, 10, 0, 0 } }, - { /* 11 */ 0, { 10, 11, 0, 0 } }, - { /* 12 */ 0, { 11, 12, 0, 0 } }, - { /* 13 */ 0, { 12, 13, 0, 0 } }, - { /* 14 */ 0, { 13, 14, 0, 0 } }, - { /* 15 */ 1, { 2, 2, 0, 0 } }, /* 11111110010 */ - { /* 16 */ 1, { 1, 2, 2, 1 } }, /* 11111110011 */ - { /* 17 */ 1, { 1, 1, 0, 2 } }, /* 11111110100 */ - { /* 18 */ 1, { 2, 0, 1, 1 } }, /* 11111110101 */ - { /* 19 */ 1, { 1, 1, 2, 2 } }, /* 11111110110 */ - { /* 20 */ 1, { 2, 2, 1, 1 } }, /* 11111110111 */ - { /* 21 */ 1, { 0, 2, 2, 0 } }, /* 11111111000 */ - { /* 22 */ 1, { 0, 2, 1, 2 } }, /* 11111111001 */ - { /* 23 */ 0, { 6, 7, 0, 0 } }, - { /* 24 */ 0, { 7, 8, 0, 0 } }, - { /* 25 */ 0, { 8, 9, 0, 0 } }, - { /* 26 */ 0, { 9, 10, 0, 0 } }, - { /* 27 */ 0, { 10, 11, 0, 0 } }, - { /* 28 */ 0, { 11, 12, 0, 0 } }, - { /* 29 */ 1, { 1, 0, 2, 2 } }, /* 111111110100 */ - { /* 30 */ 1, { 2, 2, 0, 1 } }, /* 111111110101 */ - { /* 31 */ 1, { 2, 1, 2, 0 } }, /* 111111110110 */ - { /* 32 */ 1, { 2, 2, 2, 0 } }, /* 111111110111 */ - { /* 33 */ 1, { 0, 2, 2, 2 } }, /* 111111111000 */ - { /* 34 */ 1, { 2, 2, 2, 1 } }, /* 111111111001 */ - { /* 35 */ 1, { 2, 1, 2, 1 } }, /* 111111111010 */ - { /* 36 */ 1, { 1, 2, 1, 2 } }, /* 111111111011 */ - { /* 37 */ 1, { 1, 2, 2, 2 } }, /* 111111111100 */ - { /* 38 */ 0, { 3, 4, 0, 0 } }, - { /* 39 */ 0, { 4, 5, 0, 0 } }, - { /* 40 */ 0, { 5, 6, 0, 0 } }, - { /* 41 */ 1, { 0, 2, 0, 2 } }, /* 1111111111010 */ - { /* 42 */ 1, { 2, 0, 2, 0 } }, /* 1111111111011 */ - { /* 43 */ 1, { 1, 2, 0, 2 } }, /* 1111111111100 */ - { /* 44 */ 0, { 3, 4, 0, 0 } }, - { /* 45 */ 0, { 4, 5, 0, 0 } }, - { /* 46 */ 0, { 5, 6, 0, 0 } }, - { /* 47 */ 1, { 2, 0, 2, 1 } }, /* 11111111111010 */ - { /* 48 */ 1, { 2, 1, 1, 2 } }, /* 11111111111011 */ - { /* 49 */ 1, { 2, 1, 0, 2 } }, /* 11111111111100 */ - { /* 50 */ 0, { 3, 4, 0, 0 } }, - { /* 51 */ 0, { 4, 5, 0, 0 } }, - { /* 52 */ 0, { 5, 6, 0, 0 } }, - { /* 53 */ 1, { 2, 2, 2, 2 } }, /* 111111111111010 */ - { /* 54 */ 1, { 2, 2, 1, 2 } }, /* 111111111111011 */ - { /* 55 */ 1, { 2, 1, 2, 2 } }, /* 111111111111100 */ - { /* 56 */ 1, { 2, 0, 1, 2 } }, /* 111111111111101 */ - { /* 57 */ 1, { 2, 0, 0, 2 } }, /* 111111111111110 */ - { /* 58 */ 0, { 1, 2, 0, 0 } }, - { /* 59 */ 1, { 2, 2, 0, 2 } }, /* 1111111111111110 */ - { /* 60 */ 1, { 2, 0, 2, 2 } } /* 1111111111111111 */ -}; diff --git a/src/libfaad/codebook/hcb_4.h b/src/libfaad/codebook/hcb_4.h deleted file mode 100644 index 9378b0980..000000000 --- a/src/libfaad/codebook/hcb_4.h +++ /dev/null @@ -1,196 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: hcb_4.h,v 1.4 2005/10/29 23:57:08 tmmm Exp $ -**/ - -/* 2-step huffman table HCB_4 */ - - -/* 1st step: 5 bits - * 2^5 = 32 entries - * - * Used to find offset into 2nd step table and number of extra bits to get - */ -static hcb hcb4_1[] = { - /* 4 bit codewords */ - { /* 00000 */ 0, 0 }, - { /* */ 0, 0 }, - { /* 00010 */ 1, 0 }, - { /* */ 1, 0 }, - { /* 00100 */ 2, 0 }, - { /* */ 2, 0 }, - { /* 00110 */ 3, 0 }, - { /* */ 3, 0 }, - { /* 01000 */ 4, 0 }, - { /* */ 4, 0 }, - { /* 01010 */ 5, 0 }, - { /* */ 5, 0 }, - { /* 01100 */ 6, 0 }, - { /* */ 6, 0 }, - { /* 01110 */ 7, 0 }, - { /* */ 7, 0 }, - { /* 10000 */ 8, 0 }, - { /* */ 8, 0 }, - { /* 10010 */ 9, 0 }, - { /* */ 9, 0 }, - - /* 5 bit codewords */ - { /* 10100 */ 10, 0 }, - { /* 10101 */ 11, 0 }, - { /* 10110 */ 12, 0 }, - { /* 10111 */ 13, 0 }, - { /* 11000 */ 14, 0 }, - { /* 11001 */ 15, 0 }, - - /* 7 bit codewords */ - { /* 11010 */ 16, 2 }, - { /* 11011 */ 20, 2 }, - - /* 7/8 bit codewords */ - { /* 11100 */ 24, 3 }, - - /* 8 bit codewords */ - { /* 11101 */ 32, 3 }, - - /* 8/9 bit codewords */ - { /* 11110 */ 40, 4 }, - - /* 9/10/11/12 bit codewords */ - { /* 11111 */ 56, 7 } -}; - -/* 2nd step table - * - * Gives size of codeword and actual data (x,y,v,w) - */ -static hcb_2_quad hcb4_2[] = { - /* 4 bit codewords */ - { 4, 1, 1, 1, 1 }, - { 4, 0, 1, 1, 1 }, - { 4, 1, 1, 0, 1 }, - { 4, 1, 1, 1, 0 }, - { 4, 1, 0, 1, 1 }, - { 4, 1, 0, 0, 0 }, - { 4, 1, 1, 0, 0 }, - { 4, 0, 0, 0, 0 }, - { 4, 0, 0, 1, 1 }, - { 4, 1, 0, 1, 0 }, - - /* 5 bit codewords */ - { 5, 1, 0, 0, 1 }, - { 5, 0, 1, 1, 0 }, - { 5, 0, 0, 0, 1 }, - { 5, 0, 1, 0, 1 }, - { 5, 0, 0, 1, 0 }, - { 5, 0, 1, 0, 0 }, - - /* 7 bit codewords */ - /* first 5 bits: 11010 */ - { 7, 2, 1, 1, 1 }, - { 7, 1, 1, 2, 1 }, - { 7, 1, 2, 1, 1 }, - { 7, 1, 1, 1, 2 }, - /* first 5 bits: 11011 */ - { 7, 2, 1, 1, 0 }, - { 7, 2, 1, 0, 1 }, - { 7, 1, 2, 1, 0 }, - { 7, 2, 0, 1, 1 }, - - /* 7/8 bit codewords */ - /* first 5 bits: 11100 */ - { 7, 0, 1, 2, 1 }, { 7, 0, 1, 2, 1 }, - { 8, 0, 1, 1, 2 }, - { 8, 1, 1, 2, 0 }, - { 8, 0, 2, 1, 1 }, - { 8, 1, 0, 1, 2 }, - { 8, 1, 2, 0, 1 }, - { 8, 1, 1, 0, 2 }, - - /* 8 bit codewords */ - { 8, 1, 0, 2, 1 }, - { 8, 2, 1, 0, 0 }, - { 8, 2, 0, 1, 0 }, - { 8, 1, 2, 0, 0 }, - { 8, 2, 0, 0, 1 }, - { 8, 0, 1, 0, 2 }, - { 8, 0, 2, 1, 0 }, - { 8, 0, 0, 1, 2 }, - - /* 8/9 bit codewords */ - { 8, 0, 1, 2, 0 }, { 8, 0, 1, 2, 0 }, - { 8, 0, 2, 0, 1 }, { 8, 0, 2, 0, 1 }, - { 8, 1, 0, 0, 2 }, { 8, 1, 0, 0, 2 }, - { 8, 0, 0, 2, 1 }, { 8, 0, 0, 2, 1 }, - { 8, 1, 0, 2, 0 }, { 8, 1, 0, 2, 0 }, - { 8, 2, 0, 0, 0 }, { 8, 2, 0, 0, 0 }, - { 8, 0, 0, 0, 2 }, { 8, 0, 0, 0, 2 }, - { 9, 0, 2, 0, 0 }, - { 9, 0, 0, 2, 0 }, - - /* 9/10/11 bit codewords */ - /* 9 bit codewords repeated 2^3 = 8 times */ - { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, - { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, - { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, - { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, - { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, - { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, - { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, - { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, - { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, - { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, - { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, - { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, - /* 10 bit codewords repeated 2^2 = 4 times */ - { 10, 1, 2, 2, 0 }, { 10, 1, 2, 2, 0 }, { 10, 1, 2, 2, 0 }, { 10, 1, 2, 2, 0 }, - { 10, 2, 2, 1, 0 }, { 10, 2, 2, 1, 0 }, { 10, 2, 2, 1, 0 }, { 10, 2, 2, 1, 0 }, - { 10, 2, 1, 2, 0 }, { 10, 2, 1, 2, 0 }, { 10, 2, 1, 2, 0 }, { 10, 2, 1, 2, 0 }, - { 10, 0, 2, 2, 1 }, { 10, 0, 2, 2, 1 }, { 10, 0, 2, 2, 1 }, { 10, 0, 2, 2, 1 }, - { 10, 0, 1, 2, 2 }, { 10, 0, 1, 2, 2 }, { 10, 0, 1, 2, 2 }, { 10, 0, 1, 2, 2 }, - { 10, 2, 2, 0, 1 }, { 10, 2, 2, 0, 1 }, { 10, 2, 2, 0, 1 }, { 10, 2, 2, 0, 1 }, - { 10, 0, 2, 1, 2 }, { 10, 0, 2, 1, 2 }, { 10, 0, 2, 1, 2 }, { 10, 0, 2, 1, 2 }, - { 10, 2, 0, 2, 1 }, { 10, 2, 0, 2, 1 }, { 10, 2, 0, 2, 1 }, { 10, 2, 0, 2, 1 }, - { 10, 1, 0, 2, 2 }, { 10, 1, 0, 2, 2 }, { 10, 1, 0, 2, 2 }, { 10, 1, 0, 2, 2 }, - { 10, 2, 2, 2, 1 }, { 10, 2, 2, 2, 1 }, { 10, 2, 2, 2, 1 }, { 10, 2, 2, 2, 1 }, - { 10, 1, 2, 0, 2 }, { 10, 1, 2, 0, 2 }, { 10, 1, 2, 0, 2 }, { 10, 1, 2, 0, 2 }, - { 10, 2, 0, 1, 2 }, { 10, 2, 0, 1, 2 }, { 10, 2, 0, 1, 2 }, { 10, 2, 0, 1, 2 }, - { 10, 2, 1, 0, 2 }, { 10, 2, 1, 0, 2 }, { 10, 2, 1, 0, 2 }, { 10, 2, 1, 0, 2 }, - { 10, 1, 2, 2, 2 }, { 10, 1, 2, 2, 2 }, { 10, 1, 2, 2, 2 }, { 10, 1, 2, 2, 2 }, - /* 11 bit codewords repeated 2^1 = 2 times */ - { 11, 2, 1, 2, 2 }, { 11, 2, 1, 2, 2 }, - { 11, 2, 2, 1, 2 }, { 11, 2, 2, 1, 2 }, - { 11, 0, 2, 2, 0 }, { 11, 0, 2, 2, 0 }, - { 11, 2, 2, 0, 0 }, { 11, 2, 2, 0, 0 }, - { 11, 0, 0, 2, 2 }, { 11, 0, 0, 2, 2 }, - { 11, 2, 0, 2, 0 }, { 11, 2, 0, 2, 0 }, - { 11, 0, 2, 0, 2 }, { 11, 0, 2, 0, 2 }, - { 11, 2, 0, 0, 2 }, { 11, 2, 0, 0, 2 }, - { 11, 2, 2, 2, 2 }, { 11, 2, 2, 2, 2 }, - { 11, 0, 2, 2, 2 }, { 11, 0, 2, 2, 2 }, - { 11, 2, 2, 2, 0 }, { 11, 2, 2, 2, 0 }, - /* 12 bit codewords */ - { 12, 2, 2, 0, 2 }, - { 12, 2, 0, 2, 2 }, -}; diff --git a/src/libfaad/codebook/hcb_5.h b/src/libfaad/codebook/hcb_5.h deleted file mode 100644 index 7e50207e3..000000000 --- a/src/libfaad/codebook/hcb_5.h +++ /dev/null @@ -1,193 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: hcb_5.h,v 1.4 2005/10/29 23:57:08 tmmm Exp $ -**/ - -/* Binary search huffman table HCB_5 */ - - -static hcb_bin_pair hcb5[] = { - { /* 0 */ 0, { 1, 2 } }, - { /* 1 */ 1, { 0, 0 } }, /* 0 */ - { /* 2 */ 0, { 1, 2 } }, - { /* 3 */ 0, { 2, 3 } }, - { /* 4 */ 0, { 3, 4 } }, - { /* 5 */ 0, { 4, 5 } }, - { /* 6 */ 0, { 5, 6 } }, - { /* 7 */ 0, { 6, 7 } }, - { /* 8 */ 0, { 7, 8 } }, - { /* 9 */ 1, { -1, 0 } }, /* 1000 */ - { /* 10 */ 1, { 1, 0 } }, /* 1001 */ - { /* 11 */ 1, { 0, 1 } }, /* 1010 */ - { /* 12 */ 1, { 0, -1 } }, /* 1011 */ - { /* 13 */ 0, { 4, 5 } }, - { /* 14 */ 0, { 5, 6 } }, - { /* 15 */ 0, { 6, 7 } }, - { /* 16 */ 0, { 7, 8 } }, - { /* 17 */ 1, { 1, -1 } }, - { /* 18 */ 1, { -1, 1 } }, - { /* 19 */ 1, { -1, -1 } }, - { /* 20 */ 1, { 1, 1 } }, - { /* 21 */ 0, { 4, 5 } }, - { /* 22 */ 0, { 5, 6 } }, - { /* 23 */ 0, { 6, 7 } }, - { /* 24 */ 0, { 7, 8 } }, - { /* 25 */ 0, { 8, 9 } }, - { /* 26 */ 0, { 9, 10 } }, - { /* 27 */ 0, { 10, 11 } }, - { /* 28 */ 0, { 11, 12 } }, - { /* 29 */ 0, { 12, 13 } }, - { /* 30 */ 0, { 13, 14 } }, - { /* 31 */ 0, { 14, 15 } }, - { /* 32 */ 0, { 15, 16 } }, - { /* 33 */ 1, { -2, 0 } }, - { /* 34 */ 1, { 0, 2 } }, - { /* 35 */ 1, { 2, 0 } }, - { /* 36 */ 1, { 0, -2 } }, - { /* 37 */ 0, { 12, 13 } }, - { /* 38 */ 0, { 13, 14 } }, - { /* 39 */ 0, { 14, 15 } }, - { /* 40 */ 0, { 15, 16 } }, - { /* 41 */ 0, { 16, 17 } }, - { /* 42 */ 0, { 17, 18 } }, - { /* 43 */ 0, { 18, 19 } }, - { /* 44 */ 0, { 19, 20 } }, - { /* 45 */ 0, { 20, 21 } }, - { /* 46 */ 0, { 21, 22 } }, - { /* 47 */ 0, { 22, 23 } }, - { /* 48 */ 0, { 23, 24 } }, - { /* 49 */ 1, { -2, -1 } }, - { /* 50 */ 1, { 2, 1 } }, - { /* 51 */ 1, { -1, -2 } }, - { /* 52 */ 1, { 1, 2 } }, - { /* 53 */ 1, { -2, 1 } }, - { /* 54 */ 1, { 2, -1 } }, - { /* 55 */ 1, { -1, 2 } }, - { /* 56 */ 1, { 1, -2 } }, - { /* 57 */ 1, { -3, 0 } }, - { /* 58 */ 1, { 3, 0 } }, - { /* 59 */ 1, { 0, -3 } }, - { /* 60 */ 1, { 0, 3 } }, - { /* 61 */ 0, { 12, 13 } }, - { /* 62 */ 0, { 13, 14 } }, - { /* 63 */ 0, { 14, 15 } }, - { /* 64 */ 0, { 15, 16 } }, - { /* 65 */ 0, { 16, 17 } }, - { /* 66 */ 0, { 17, 18 } }, - { /* 67 */ 0, { 18, 19 } }, - { /* 68 */ 0, { 19, 20 } }, - { /* 69 */ 0, { 20, 21 } }, - { /* 70 */ 0, { 21, 22 } }, - { /* 71 */ 0, { 22, 23 } }, - { /* 72 */ 0, { 23, 24 } }, - { /* 73 */ 1, { -3, -1 } }, - { /* 74 */ 1, { 1, 3 } }, - { /* 75 */ 1, { 3, 1 } }, - { /* 76 */ 1, { -1, -3 } }, - { /* 77 */ 1, { -3, 1 } }, - { /* 78 */ 1, { 3, -1 } }, - { /* 79 */ 1, { 1, -3 } }, - { /* 80 */ 1, { -1, 3 } }, - { /* 81 */ 1, { -2, 2 } }, - { /* 82 */ 1, { 2, 2 } }, - { /* 83 */ 1, { -2, -2 } }, - { /* 84 */ 1, { 2, -2 } }, - { /* 85 */ 0, { 12, 13 } }, - { /* 86 */ 0, { 13, 14 } }, - { /* 87 */ 0, { 14, 15 } }, - { /* 88 */ 0, { 15, 16 } }, - { /* 89 */ 0, { 16, 17 } }, - { /* 90 */ 0, { 17, 18 } }, - { /* 91 */ 0, { 18, 19 } }, - { /* 92 */ 0, { 19, 20 } }, - { /* 93 */ 0, { 20, 21 } }, - { /* 94 */ 0, { 21, 22 } }, - { /* 95 */ 0, { 22, 23 } }, - { /* 96 */ 0, { 23, 24 } }, - { /* 97 */ 1, { -3, -2 } }, - { /* 98 */ 1, { 3, -2 } }, - { /* 99 */ 1, { -2, 3 } }, - { /* 00 */ 1, { 2, -3 } }, - { /* 01 */ 1, { 3, 2 } }, - { /* 02 */ 1, { 2, 3 } }, - { /* 03 */ 1, { -3, 2 } }, - { /* 04 */ 1, { -2, -3 } }, - { /* 05 */ 1, { 0, -4 } }, - { /* 06 */ 1, { -4, 0 } }, - { /* 07 */ 1, { 4, 1 } }, - { /* 08 */ 1, { 4, 0 } }, - { /* 09 */ 0, { 12, 13 } }, - { /* 10 */ 0, { 13, 14 } }, - { /* 11 */ 0, { 14, 15 } }, - { /* 12 */ 0, { 15, 16 } }, - { /* 13 */ 0, { 16, 17 } }, - { /* 14 */ 0, { 17, 18 } }, - { /* 15 */ 0, { 18, 19 } }, - { /* 16 */ 0, { 19, 20 } }, - { /* 17 */ 0, { 20, 21 } }, - { /* 18 */ 0, { 21, 22 } }, - { /* 19 */ 0, { 22, 23 } }, - { /* 20 */ 0, { 23, 24 } }, - { /* 21 */ 1, { -4, -1 } }, - { /* 22 */ 1, { 0, 4 } }, - { /* 23 */ 1, { 4, -1 } }, - { /* 24 */ 1, { -1, -4 } }, - { /* 25 */ 1, { 1, 4 } }, - { /* 26 */ 1, { -1, 4 } }, - { /* 27 */ 1, { -4, 1 } }, - { /* 28 */ 1, { 1, -4 } }, - { /* 29 */ 1, { 3, -3 } }, - { /* 30 */ 1, { -3, -3 } }, - { /* 31 */ 1, { -3, 3 } }, - { /* 32 */ 1, { -2, 4 } }, - { /* 33 */ 1, { -4, -2 } }, - { /* 34 */ 1, { 4, 2 } }, - { /* 35 */ 1, { 2, -4 } }, - { /* 36 */ 1, { 2, 4 } }, - { /* 37 */ 1, { 3, 3 } }, - { /* 38 */ 1, { -4, 2 } }, - { /* 39 */ 0, { 6, 7 } }, - { /* 40 */ 0, { 7, 8 } }, - { /* 41 */ 0, { 8, 9 } }, - { /* 42 */ 0, { 9, 10 } }, - { /* 43 */ 0, { 10, 11 } }, - { /* 44 */ 0, { 11, 12 } }, - { /* 45 */ 1, { -2, -4 } }, - { /* 46 */ 1, { 4, -2 } }, - { /* 47 */ 1, { 3, -4 } }, - { /* 48 */ 1, { -4, -3 } }, - { /* 49 */ 1, { -4, 3 } }, - { /* 50 */ 1, { 3, 4 } }, - { /* 51 */ 1, { -3, 4 } }, - { /* 52 */ 1, { 4, 3 } }, - { /* 53 */ 1, { 4, -3 } }, - { /* 54 */ 1, { -3, -4 } }, - { /* 55 */ 0, { 2, 3 } }, - { /* 56 */ 0, { 3, 4 } }, - { /* 57 */ 1, { 4, -4 } }, - { /* 58 */ 1, { -4, 4 } }, - { /* 59 */ 1, { 4, 4 } }, - { /* 60 */ 1, { -4, -4 } } -}; diff --git a/src/libfaad/codebook/hcb_6.h b/src/libfaad/codebook/hcb_6.h deleted file mode 100644 index 12417d997..000000000 --- a/src/libfaad/codebook/hcb_6.h +++ /dev/null @@ -1,179 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: hcb_6.h,v 1.4 2005/10/29 23:57:08 tmmm Exp $ -**/ - -/* 2-step huffman table HCB_6 */ - - -/* 1st step: 5 bits - * 2^5 = 32 entries - * - * Used to find offset into 2nd step table and number of extra bits to get - */ -static hcb hcb6_1[] = { - /* 4 bit codewords */ - { /* 00000 */ 0, 0 }, - { /* */ 0, 0 }, - { /* 00010 */ 1, 0 }, - { /* */ 1, 0 }, - { /* 00100 */ 2, 0 }, - { /* */ 2, 0 }, - { /* 00110 */ 3, 0 }, - { /* */ 3, 0 }, - { /* 01000 */ 4, 0 }, - { /* */ 4, 0 }, - { /* 01010 */ 5, 0 }, - { /* */ 5, 0 }, - { /* 01100 */ 6, 0 }, - { /* */ 6, 0 }, - { /* 01110 */ 7, 0 }, - { /* */ 7, 0 }, - { /* 10000 */ 8, 0 }, - { /* */ 8, 0 }, - - /* 6 bit codewords */ - { /* 10010 */ 9, 1 }, - { /* 10011 */ 11, 1 }, - { /* 10100 */ 13, 1 }, - { /* 10101 */ 15, 1 }, - { /* 10110 */ 17, 1 }, - { /* 10111 */ 19, 1 }, - { /* 11000 */ 21, 1 }, - { /* 11001 */ 23, 1 }, - - /* 7 bit codewords */ - { /* 11010 */ 25, 2 }, - { /* 11011 */ 29, 2 }, - { /* 11100 */ 33, 2 }, - - /* 7/8 bit codewords */ - { /* 11101 */ 37, 3 }, - - /* 8/9 bit codewords */ - { /* 11110 */ 45, 4 }, - - /* 9/10/11 bit codewords */ - { /* 11111 */ 61, 6 } -}; - -/* 2nd step table - * - * Gives size of codeword and actual data (x,y,v,w) - */ -static hcb_2_pair hcb6_2[] = { - /* 4 bit codewords */ - { 4, 0, 0 }, - { 4, 1, 0 }, - { 4, 0, -1 }, - { 4, 0, 1 }, - { 4, -1, 0 }, - { 4, 1, 1 }, - { 4, -1, 1 }, - { 4, 1, -1 }, - { 4, -1, -1 }, - - /* 6 bit codewords */ - { 6, 2, -1 }, - { 6, 2, 1 }, - { 6, -2, 1 }, - { 6, -2, -1 }, - { 6, -2, 0 }, - { 6, -1, 2 }, - { 6, 2, 0 }, - { 6, 1, -2 }, - { 6, 1, 2 }, - { 6, 0, -2 }, - { 6, -1, -2 }, - { 6, 0, 2 }, - { 6, 2, -2 }, - { 6, -2, 2 }, - { 6, -2, -2 }, - { 6, 2, 2 }, - - /* 7 bit codewords */ - { 7, -3, 1 }, - { 7, 3, 1 }, - { 7, 3, -1 }, - { 7, -1, 3 }, - { 7, -3, -1 }, - { 7, 1, 3 }, - { 7, 1, -3 }, - { 7, -1, -3 }, - { 7, 3, 0 }, - { 7, -3, 0 }, - { 7, 0, -3 }, - { 7, 0, 3 }, - - /* 7/8 bit codewords */ - { 7, 3, 2 }, { 7, 3, 2 }, - { 8, -3, -2 }, - { 8, -2, 3 }, - { 8, 2, 3 }, - { 8, 3, -2 }, - { 8, 2, -3 }, - { 8, -2, -3 }, - - /* 8 bit codewords */ - { 8, -3, 2 }, { 8, -3, 2 }, - { 8, 3, 3 }, { 8, 3, 3 }, - { 9, 3, -3 }, - { 9, -3, -3 }, - { 9, -3, 3 }, - { 9, 1, -4 }, - { 9, -1, -4 }, - { 9, 4, 1 }, - { 9, -4, 1 }, - { 9, -4, -1 }, - { 9, 1, 4 }, - { 9, 4, -1 }, - { 9, -1, 4 }, - { 9, 0, -4 }, - - /* 9/10/11 bit codewords */ - { 9, -4, 2 }, { 9, -4, 2 }, { 9, -4, 2 }, { 9, -4, 2 }, - { 9, -4, -2 }, { 9, -4, -2 }, { 9, -4, -2 }, { 9, -4, -2 }, - { 9, 2, 4 }, { 9, 2, 4 }, { 9, 2, 4 }, { 9, 2, 4 }, - { 9, -2, -4 }, { 9, -2, -4 }, { 9, -2, -4 }, { 9, -2, -4 }, - { 9, -4, 0 }, { 9, -4, 0 }, { 9, -4, 0 }, { 9, -4, 0 }, - { 9, 4, 2 }, { 9, 4, 2 }, { 9, 4, 2 }, { 9, 4, 2 }, - { 9, 4, -2 }, { 9, 4, -2 }, { 9, 4, -2 }, { 9, 4, -2 }, - { 9, -2, 4 }, { 9, -2, 4 }, { 9, -2, 4 }, { 9, -2, 4 }, - { 9, 4, 0 }, { 9, 4, 0 }, { 9, 4, 0 }, { 9, 4, 0 }, - { 9, 2, -4 }, { 9, 2, -4 }, { 9, 2, -4 }, { 9, 2, -4 }, - { 9, 0, 4 }, { 9, 0, 4 }, { 9, 0, 4 }, { 9, 0, 4 }, - { 10, -3, -4 }, { 10, -3, -4 }, - { 10, -3, 4 }, { 10, -3, 4 }, - { 10, 3, -4 }, { 10, 3, -4 }, - { 10, 4, -3 }, { 10, 4, -3 }, - { 10, 3, 4 }, { 10, 3, 4 }, - { 10, 4, 3 }, { 10, 4, 3 }, - { 10, -4, 3 }, { 10, -4, 3 }, - { 10, -4, -3 }, { 10, -4, -3 }, - { 11, 4, 4 }, - { 11, -4, 4 }, - { 11, -4, -4 }, - { 11, 4, -4 } -}; diff --git a/src/libfaad/codebook/hcb_7.h b/src/libfaad/codebook/hcb_7.h deleted file mode 100644 index e5392326d..000000000 --- a/src/libfaad/codebook/hcb_7.h +++ /dev/null @@ -1,159 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: hcb_7.h,v 1.4 2005/10/29 23:57:08 tmmm Exp $ -**/ - -/* Binary search huffman table HCB_7 */ - - -static hcb_bin_pair hcb7[] = { - { /* 0 */ 0, { 1, 2 } }, - { /* 1 */ 1, { 0, 0 } }, - { /* 2 */ 0, { 1, 2 } }, - { /* 3 */ 0, { 2, 3 } }, - { /* 4 */ 0, { 3, 4 } }, - { /* 5 */ 1, { 1, 0 } }, - { /* 6 */ 1, { 0, 1 } }, - { /* 7 */ 0, { 2, 3 } }, - { /* 8 */ 0, { 3, 4 } }, - { /* 9 */ 1, { 1, 1 } }, - { /* 10 */ 0, { 3, 4 } }, - { /* 11 */ 0, { 4, 5 } }, - { /* 12 */ 0, { 5, 6 } }, - { /* 13 */ 0, { 6, 7 } }, - { /* 14 */ 0, { 7, 8 } }, - { /* 15 */ 0, { 8, 9 } }, - { /* 16 */ 0, { 9, 10 } }, - { /* 17 */ 0, { 10, 11 } }, - { /* 18 */ 0, { 11, 12 } }, - { /* 19 */ 1, { 2, 1 } }, - { /* 20 */ 1, { 1, 2 } }, - { /* 21 */ 1, { 2, 0 } }, - { /* 22 */ 1, { 0, 2 } }, - { /* 23 */ 0, { 8, 9 } }, - { /* 24 */ 0, { 9, 10 } }, - { /* 25 */ 0, { 10, 11 } }, - { /* 26 */ 0, { 11, 12 } }, - { /* 27 */ 0, { 12, 13 } }, - { /* 28 */ 0, { 13, 14 } }, - { /* 29 */ 0, { 14, 15 } }, - { /* 30 */ 0, { 15, 16 } }, - { /* 31 */ 1, { 3, 1 } }, - { /* 32 */ 1, { 1, 3 } }, - { /* 33 */ 1, { 2, 2 } }, - { /* 34 */ 1, { 3, 0 } }, - { /* 35 */ 1, { 0, 3 } }, - { /* 36 */ 0, { 11, 12 } }, - { /* 37 */ 0, { 12, 13 } }, - { /* 38 */ 0, { 13, 14 } }, - { /* 39 */ 0, { 14, 15 } }, - { /* 40 */ 0, { 15, 16 } }, - { /* 41 */ 0, { 16, 17 } }, - { /* 42 */ 0, { 17, 18 } }, - { /* 43 */ 0, { 18, 19 } }, - { /* 44 */ 0, { 19, 20 } }, - { /* 45 */ 0, { 20, 21 } }, - { /* 46 */ 0, { 21, 22 } }, - { /* 47 */ 1, { 2, 3 } }, - { /* 48 */ 1, { 3, 2 } }, - { /* 49 */ 1, { 1, 4 } }, - { /* 50 */ 1, { 4, 1 } }, - { /* 51 */ 1, { 1, 5 } }, - { /* 52 */ 1, { 5, 1 } }, - { /* 53 */ 1, { 3, 3 } }, - { /* 54 */ 1, { 2, 4 } }, - { /* 55 */ 1, { 0, 4 } }, - { /* 56 */ 1, { 4, 0 } }, - { /* 57 */ 0, { 12, 13 } }, - { /* 58 */ 0, { 13, 14 } }, - { /* 59 */ 0, { 14, 15 } }, - { /* 60 */ 0, { 15, 16 } }, - { /* 61 */ 0, { 16, 17 } }, - { /* 62 */ 0, { 17, 18 } }, - { /* 63 */ 0, { 18, 19 } }, - { /* 64 */ 0, { 19, 20 } }, - { /* 65 */ 0, { 20, 21 } }, - { /* 66 */ 0, { 21, 22 } }, - { /* 67 */ 0, { 22, 23 } }, - { /* 68 */ 0, { 23, 24 } }, - { /* 69 */ 1, { 4, 2 } }, - { /* 70 */ 1, { 2, 5 } }, - { /* 71 */ 1, { 5, 2 } }, - { /* 72 */ 1, { 0, 5 } }, - { /* 73 */ 1, { 6, 1 } }, - { /* 74 */ 1, { 5, 0 } }, - { /* 75 */ 1, { 1, 6 } }, - { /* 76 */ 1, { 4, 3 } }, - { /* 77 */ 1, { 3, 5 } }, - { /* 78 */ 1, { 3, 4 } }, - { /* 79 */ 1, { 5, 3 } }, - { /* 80 */ 1, { 2, 6 } }, - { /* 81 */ 1, { 6, 2 } }, - { /* 82 */ 1, { 1, 7 } }, - { /* 83 */ 0, { 10, 11 } }, - { /* 84 */ 0, { 11, 12 } }, - { /* 85 */ 0, { 12, 13 } }, - { /* 86 */ 0, { 13, 14 } }, - { /* 87 */ 0, { 14, 15 } }, - { /* 88 */ 0, { 15, 16 } }, - { /* 89 */ 0, { 16, 17 } }, - { /* 90 */ 0, { 17, 18 } }, - { /* 91 */ 0, { 18, 19 } }, - { /* 92 */ 0, { 19, 20 } }, - { /* 93 */ 1, { 3, 6 } }, - { /* 94 */ 1, { 0, 6 } }, - { /* 95 */ 1, { 6, 0 } }, - { /* 96 */ 1, { 4, 4 } }, - { /* 97 */ 1, { 7, 1 } }, - { /* 98 */ 1, { 4, 5 } }, - { /* 99 */ 1, { 7, 2 } }, - { /* 00 */ 1, { 5, 4 } }, - { /* 01 */ 1, { 6, 3 } }, - { /* 02 */ 1, { 2, 7 } }, - { /* 03 */ 1, { 7, 3 } }, - { /* 04 */ 1, { 6, 4 } }, - { /* 05 */ 1, { 5, 5 } }, - { /* 06 */ 1, { 4, 6 } }, - { /* 07 */ 1, { 3, 7 } }, - { /* 08 */ 0, { 5, 6 } }, - { /* 09 */ 0, { 6, 7 } }, - { /* 10 */ 0, { 7, 8 } }, - { /* 11 */ 0, { 8, 9 } }, - { /* 12 */ 0, { 9, 10 } }, - { /* 13 */ 1, { 7, 0 } }, - { /* 14 */ 1, { 0, 7 } }, - { /* 15 */ 1, { 6, 5 } }, - { /* 16 */ 1, { 5, 6 } }, - { /* 17 */ 1, { 7, 4 } }, - { /* 18 */ 1, { 4, 7 } }, - { /* 19 */ 1, { 5, 7 } }, - { /* 20 */ 1, { 7, 5 } }, - { /* 21 */ 0, { 2, 3 } }, - { /* 22 */ 0, { 3, 4 } }, - { /* 23 */ 1, { 7, 6 } }, - { /* 24 */ 1, { 6, 6 } }, - { /* 25 */ 1, { 6, 7 } }, - { /* 26 */ 1, { 7, 7 } } -}; diff --git a/src/libfaad/codebook/hcb_8.h b/src/libfaad/codebook/hcb_8.h deleted file mode 100644 index 951743bed..000000000 --- a/src/libfaad/codebook/hcb_8.h +++ /dev/null @@ -1,170 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: hcb_8.h,v 1.4 2005/10/29 23:57:08 tmmm Exp $ -**/ - -/* 2-step huffman table HCB_8 */ - - -/* 1st step: 5 bits - * 2^5 = 32 entries - * - * Used to find offset into 2nd step table and number of extra bits to get - */ -static hcb hcb8_1[] = { - /* 3 bit codeword */ - { /* 00000 */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - - /* 4 bit codewords */ - { /* 00100 */ 1, 0 }, - { /* */ 1, 0 }, - { /* 00110 */ 2, 0 }, - { /* */ 2, 0 }, - { /* 01000 */ 3, 0 }, - { /* */ 3, 0 }, - { /* 01010 */ 4, 0 }, - { /* */ 4, 0 }, - { /* 01100 */ 5, 0 }, - { /* */ 5, 0 }, - - /* 5 bit codewords */ - { /* 01110 */ 6, 0 }, - { /* 01111 */ 7, 0 }, - { /* 10000 */ 8, 0 }, - { /* 10001 */ 9, 0 }, - { /* 10010 */ 10, 0 }, - { /* 10011 */ 11, 0 }, - { /* 10100 */ 12, 0 }, - - /* 6 bit codewords */ - { /* 10101 */ 13, 1 }, - { /* 10110 */ 15, 1 }, - { /* 10111 */ 17, 1 }, - { /* 11000 */ 19, 1 }, - { /* 11001 */ 21, 1 }, - - /* 7 bit codewords */ - { /* 11010 */ 23, 2 }, - { /* 11011 */ 27, 2 }, - { /* 11100 */ 31, 2 }, - - /* 7/8 bit codewords */ - { /* 11101 */ 35, 3 }, - - /* 8 bit codewords */ - { /* 11110 */ 43, 3 }, - - /* 8/9/10 bit codewords */ - { /* 11111 */ 51, 5 } -}; - -/* 2nd step table - * - * Gives size of codeword and actual data (x,y,v,w) - */ -static hcb_2_pair hcb8_2[] = { - /* 3 bit codeword */ - { 3, 1, 1 }, - - /* 4 bit codewords */ - { 4, 2, 1 }, - { 4, 1, 0 }, - { 4, 1, 2 }, - { 4, 0, 1 }, - { 4, 2, 2 }, - - /* 5 bit codewords */ - { 5, 0, 0 }, - { 5, 2, 0 }, - { 5, 0, 2 }, - { 5, 3, 1 }, - { 5, 1, 3 }, - { 5, 3, 2 }, - { 5, 2, 3 }, - - /* 6 bit codewords */ - { 6, 3, 3 }, - { 6, 4, 1 }, - { 6, 1, 4 }, - { 6, 4, 2 }, - { 6, 2, 4 }, - { 6, 3, 0 }, - { 6, 0, 3 }, - { 6, 4, 3 }, - { 6, 3, 4 }, - { 6, 5, 2 }, - - /* 7 bit codewords */ - { 7, 5, 1 }, - { 7, 2, 5 }, - { 7, 1, 5 }, - { 7, 5, 3 }, - { 7, 3, 5 }, - { 7, 4, 4 }, - { 7, 5, 4 }, - { 7, 0, 4 }, - { 7, 4, 5 }, - { 7, 4, 0 }, - { 7, 2, 6 }, - { 7, 6, 2 }, - - /* 7/8 bit codewords */ - { 7, 6, 1 }, { 7, 6, 1 }, - { 7, 1, 6 }, { 7, 1, 6 }, - { 8, 3, 6 }, - { 8, 6, 3 }, - { 8, 5, 5 }, - { 8, 5, 0 }, - - /* 8 bit codewords */ - { 8, 6, 4 }, - { 8, 0, 5 }, - { 8, 4, 6 }, - { 8, 7, 1 }, - { 8, 7, 2 }, - { 8, 2, 7 }, - { 8, 6, 5 }, - { 8, 7, 3 }, - - /* 8/9/10 bit codewords */ - { 8, 1, 7 }, { 8, 1, 7 }, { 8, 1, 7 }, { 8, 1, 7 }, - { 8, 5, 6 }, { 8, 5, 6 }, { 8, 5, 6 }, { 8, 5, 6 }, - { 8, 3, 7 }, { 8, 3, 7 }, { 8, 3, 7 }, { 8, 3, 7 }, - { 9, 6, 6 }, { 9, 6, 6 }, - { 9, 7, 4 }, { 9, 7, 4 }, - { 9, 6, 0 }, { 9, 6, 0 }, - { 9, 4, 7 }, { 9, 4, 7 }, - { 9, 0, 6 }, { 9, 0, 6 }, - { 9, 7, 5 }, { 9, 7, 5 }, - { 9, 7, 6 }, { 9, 7, 6 }, - { 9, 6, 7 }, { 9, 6, 7 }, - { 10, 5, 7 }, - { 10, 7, 0 }, - { 10, 0, 7 }, - { 10, 7, 7 } -}; diff --git a/src/libfaad/codebook/hcb_9.h b/src/libfaad/codebook/hcb_9.h deleted file mode 100644 index daccf6197..000000000 --- a/src/libfaad/codebook/hcb_9.h +++ /dev/null @@ -1,369 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: hcb_9.h,v 1.4 2005/10/29 23:57:08 tmmm Exp $ -**/ - -/* Binary search huffman table HCB_9 */ - - -static hcb_bin_pair hcb9[] = { - { /* 0 */ 0, { 1, 2 } }, - { /* 1 */ 1, { 0, 0 } }, - { /* 2 */ 0, { 1, 2 } }, - { /* 3 */ 0, { 2, 3 } }, - { /* 4 */ 0, { 3, 4 } }, - { /* 5 */ 1, { 1, 0 } }, - { /* 6 */ 1, { 0, 1 } }, - { /* 7 */ 0, { 2, 3 } }, - { /* 8 */ 0, { 3, 4 } }, - { /* 9 */ 1, { 1, 1 } }, - { /* 10 */ 0, { 3, 4 } }, - { /* 11 */ 0, { 4, 5 } }, - { /* 12 */ 0, { 5, 6 } }, - { /* 13 */ 0, { 6, 7 } }, - { /* 14 */ 0, { 7, 8 } }, - { /* 15 */ 0, { 8, 9 } }, - { /* 16 */ 0, { 9, 10 } }, - { /* 17 */ 0, { 10, 11 } }, - { /* 18 */ 0, { 11, 12 } }, - { /* 19 */ 1, { 2, 1 } }, - { /* 20 */ 1, { 1, 2 } }, - { /* 21 */ 1, { 2, 0 } }, - { /* 22 */ 1, { 0, 2 } }, - { /* 23 */ 0, { 8, 9 } }, - { /* 24 */ 0, { 9, 10 } }, - { /* 25 */ 0, { 10, 11 } }, - { /* 26 */ 0, { 11, 12 } }, - { /* 27 */ 0, { 12, 13 } }, - { /* 28 */ 0, { 13, 14 } }, - { /* 29 */ 0, { 14, 15 } }, - { /* 30 */ 0, { 15, 16 } }, - { /* 31 */ 1, { 3, 1 } }, - { /* 32 */ 1, { 2, 2 } }, - { /* 33 */ 1, { 1, 3 } }, - { /* 34 */ 0, { 13, 14 } }, - { /* 35 */ 0, { 14, 15 } }, - { /* 36 */ 0, { 15, 16 } }, - { /* 37 */ 0, { 16, 17 } }, - { /* 38 */ 0, { 17, 18 } }, - { /* 39 */ 0, { 18, 19 } }, - { /* 40 */ 0, { 19, 20 } }, - { /* 41 */ 0, { 20, 21 } }, - { /* 42 */ 0, { 21, 22 } }, - { /* 43 */ 0, { 22, 23 } }, - { /* 44 */ 0, { 23, 24 } }, - { /* 45 */ 0, { 24, 25 } }, - { /* 46 */ 0, { 25, 26 } }, - { /* 47 */ 1, { 3, 0 } }, - { /* 48 */ 1, { 0, 3 } }, - { /* 49 */ 1, { 2, 3 } }, - { /* 50 */ 1, { 3, 2 } }, - { /* 51 */ 1, { 1, 4 } }, - { /* 52 */ 1, { 4, 1 } }, - { /* 53 */ 1, { 2, 4 } }, - { /* 54 */ 1, { 1, 5 } }, - { /* 55 */ 0, { 18, 19 } }, - { /* 56 */ 0, { 19, 20 } }, - { /* 57 */ 0, { 20, 21 } }, - { /* 58 */ 0, { 21, 22 } }, - { /* 59 */ 0, { 22, 23 } }, - { /* 60 */ 0, { 23, 24 } }, - { /* 61 */ 0, { 24, 25 } }, - { /* 62 */ 0, { 25, 26 } }, - { /* 63 */ 0, { 26, 27 } }, - { /* 64 */ 0, { 27, 28 } }, - { /* 65 */ 0, { 28, 29 } }, - { /* 66 */ 0, { 29, 30 } }, - { /* 67 */ 0, { 30, 31 } }, - { /* 68 */ 0, { 31, 32 } }, - { /* 69 */ 0, { 32, 33 } }, - { /* 70 */ 0, { 33, 34 } }, - { /* 71 */ 0, { 34, 35 } }, - { /* 72 */ 0, { 35, 36 } }, - { /* 73 */ 1, { 4, 2 } }, - { /* 74 */ 1, { 3, 3 } }, - { /* 75 */ 1, { 0, 4 } }, - { /* 76 */ 1, { 4, 0 } }, - { /* 77 */ 1, { 5, 1 } }, - { /* 78 */ 1, { 2, 5 } }, - { /* 79 */ 1, { 1, 6 } }, - { /* 80 */ 1, { 3, 4 } }, - { /* 81 */ 1, { 5, 2 } }, - { /* 82 */ 1, { 6, 1 } }, - { /* 83 */ 1, { 4, 3 } }, - { /* 84 */ 0, { 25, 26 } }, - { /* 85 */ 0, { 26, 27 } }, - { /* 86 */ 0, { 27, 28 } }, - { /* 87 */ 0, { 28, 29 } }, - { /* 88 */ 0, { 29, 30 } }, - { /* 89 */ 0, { 30, 31 } }, - { /* 90 */ 0, { 31, 32 } }, - { /* 91 */ 0, { 32, 33 } }, - { /* 92 */ 0, { 33, 34 } }, - { /* 93 */ 0, { 34, 35 } }, - { /* 94 */ 0, { 35, 36 } }, - { /* 95 */ 0, { 36, 37 } }, - { /* 96 */ 0, { 37, 38 } }, - { /* 97 */ 0, { 38, 39 } }, - { /* 98 */ 0, { 39, 40 } }, - { /* 99 */ 0, { 40, 41 } }, - { /* 00 */ 0, { 41, 42 } }, - { /* 01 */ 0, { 42, 43 } }, - { /* 02 */ 0, { 43, 44 } }, - { /* 03 */ 0, { 44, 45 } }, - { /* 04 */ 0, { 45, 46 } }, - { /* 05 */ 0, { 46, 47 } }, - { /* 06 */ 0, { 47, 48 } }, - { /* 07 */ 0, { 48, 49 } }, - { /* 08 */ 0, { 49, 50 } }, - { /* 09 */ 1, { 0, 5 } }, - { /* 10 */ 1, { 2, 6 } }, - { /* 11 */ 1, { 5, 0 } }, - { /* 12 */ 1, { 1, 7 } }, - { /* 13 */ 1, { 3, 5 } }, - { /* 14 */ 1, { 1, 8 } }, - { /* 15 */ 1, { 8, 1 } }, - { /* 16 */ 1, { 4, 4 } }, - { /* 17 */ 1, { 5, 3 } }, - { /* 18 */ 1, { 6, 2 } }, - { /* 19 */ 1, { 7, 1 } }, - { /* 20 */ 1, { 0, 6 } }, - { /* 21 */ 1, { 8, 2 } }, - { /* 22 */ 1, { 2, 8 } }, - { /* 23 */ 1, { 3, 6 } }, - { /* 24 */ 1, { 2, 7 } }, - { /* 25 */ 1, { 4, 5 } }, - { /* 26 */ 1, { 9, 1 } }, - { /* 27 */ 1, { 1, 9 } }, - { /* 28 */ 1, { 7, 2 } }, - { /* 29 */ 0, { 30, 31 } }, - { /* 30 */ 0, { 31, 32 } }, - { /* 31 */ 0, { 32, 33 } }, - { /* 32 */ 0, { 33, 34 } }, - { /* 33 */ 0, { 34, 35 } }, - { /* 34 */ 0, { 35, 36 } }, - { /* 35 */ 0, { 36, 37 } }, - { /* 36 */ 0, { 37, 38 } }, - { /* 37 */ 0, { 38, 39 } }, - { /* 38 */ 0, { 39, 40 } }, - { /* 39 */ 0, { 40, 41 } }, - { /* 40 */ 0, { 41, 42 } }, - { /* 41 */ 0, { 42, 43 } }, - { /* 42 */ 0, { 43, 44 } }, - { /* 43 */ 0, { 44, 45 } }, - { /* 44 */ 0, { 45, 46 } }, - { /* 45 */ 0, { 46, 47 } }, - { /* 46 */ 0, { 47, 48 } }, - { /* 47 */ 0, { 48, 49 } }, - { /* 48 */ 0, { 49, 50 } }, - { /* 49 */ 0, { 50, 51 } }, - { /* 50 */ 0, { 51, 52 } }, - { /* 51 */ 0, { 52, 53 } }, - { /* 52 */ 0, { 53, 54 } }, - { /* 53 */ 0, { 54, 55 } }, - { /* 54 */ 0, { 55, 56 } }, - { /* 55 */ 0, { 56, 57 } }, - { /* 56 */ 0, { 57, 58 } }, - { /* 57 */ 0, { 58, 59 } }, - { /* 58 */ 0, { 59, 60 } }, - { /* 59 */ 1, { 6, 0 } }, - { /* 60 */ 1, { 5, 4 } }, - { /* 61 */ 1, { 6, 3 } }, - { /* 62 */ 1, { 8, 3 } }, - { /* 63 */ 1, { 0, 7 } }, - { /* 64 */ 1, { 9, 2 } }, - { /* 65 */ 1, { 3, 8 } }, - { /* 66 */ 1, { 4, 6 } }, - { /* 67 */ 1, { 3, 7 } }, - { /* 68 */ 1, { 0, 8 } }, - { /* 69 */ 1, { 10, 1 } }, - { /* 70 */ 1, { 6, 4 } }, - { /* 71 */ 1, { 2, 9 } }, - { /* 72 */ 1, { 5, 5 } }, - { /* 73 */ 1, { 8, 0 } }, - { /* 74 */ 1, { 7, 0 } }, - { /* 75 */ 1, { 7, 3 } }, - { /* 76 */ 1, { 10, 2 } }, - { /* 77 */ 1, { 9, 3 } }, - { /* 78 */ 1, { 8, 4 } }, - { /* 79 */ 1, { 1, 10 } }, - { /* 80 */ 1, { 7, 4 } }, - { /* 81 */ 1, { 6, 5 } }, - { /* 82 */ 1, { 5, 6 } }, - { /* 83 */ 1, { 4, 8 } }, - { /* 84 */ 1, { 4, 7 } }, - { /* 85 */ 1, { 3, 9 } }, - { /* 86 */ 1, { 11, 1 } }, - { /* 87 */ 1, { 5, 8 } }, - { /* 88 */ 1, { 9, 0 } }, - { /* 89 */ 1, { 8, 5 } }, - { /* 90 */ 0, { 29, 30 } }, - { /* 91 */ 0, { 30, 31 } }, - { /* 92 */ 0, { 31, 32 } }, - { /* 93 */ 0, { 32, 33 } }, - { /* 94 */ 0, { 33, 34 } }, - { /* 95 */ 0, { 34, 35 } }, - { /* 96 */ 0, { 35, 36 } }, - { /* 97 */ 0, { 36, 37 } }, - { /* 98 */ 0, { 37, 38 } }, - { /* 99 */ 0, { 38, 39 } }, - { /* 00 */ 0, { 39, 40 } }, - { /* 01 */ 0, { 40, 41 } }, - { /* 02 */ 0, { 41, 42 } }, - { /* 03 */ 0, { 42, 43 } }, - { /* 04 */ 0, { 43, 44 } }, - { /* 05 */ 0, { 44, 45 } }, - { /* 06 */ 0, { 45, 46 } }, - { /* 07 */ 0, { 46, 47 } }, - { /* 08 */ 0, { 47, 48 } }, - { /* 09 */ 0, { 48, 49 } }, - { /* 10 */ 0, { 49, 50 } }, - { /* 11 */ 0, { 50, 51 } }, - { /* 12 */ 0, { 51, 52 } }, - { /* 13 */ 0, { 52, 53 } }, - { /* 14 */ 0, { 53, 54 } }, - { /* 15 */ 0, { 54, 55 } }, - { /* 16 */ 0, { 55, 56 } }, - { /* 17 */ 0, { 56, 57 } }, - { /* 18 */ 0, { 57, 58 } }, - { /* 19 */ 1, { 10, 3 } }, - { /* 20 */ 1, { 2, 10 } }, - { /* 21 */ 1, { 0, 9 } }, - { /* 22 */ 1, { 11, 2 } }, - { /* 23 */ 1, { 9, 4 } }, - { /* 24 */ 1, { 6, 6 } }, - { /* 25 */ 1, { 12, 1 } }, - { /* 26 */ 1, { 4, 9 } }, - { /* 27 */ 1, { 8, 6 } }, - { /* 28 */ 1, { 1, 11 } }, - { /* 29 */ 1, { 9, 5 } }, - { /* 30 */ 1, { 10, 4 } }, - { /* 31 */ 1, { 5, 7 } }, - { /* 32 */ 1, { 7, 5 } }, - { /* 33 */ 1, { 2, 11 } }, - { /* 34 */ 1, { 1, 12 } }, - { /* 35 */ 1, { 12, 2 } }, - { /* 36 */ 1, { 11, 3 } }, - { /* 37 */ 1, { 3, 10 } }, - { /* 38 */ 1, { 5, 9 } }, - { /* 39 */ 1, { 6, 7 } }, - { /* 40 */ 1, { 8, 7 } }, - { /* 41 */ 1, { 11, 4 } }, - { /* 42 */ 1, { 0, 10 } }, - { /* 43 */ 1, { 7, 6 } }, - { /* 44 */ 1, { 12, 3 } }, - { /* 45 */ 1, { 10, 0 } }, - { /* 46 */ 1, { 10, 5 } }, - { /* 47 */ 1, { 4, 10 } }, - { /* 48 */ 1, { 6, 8 } }, - { /* 49 */ 1, { 2, 12 } }, - { /* 50 */ 1, { 9, 6 } }, - { /* 51 */ 1, { 9, 7 } }, - { /* 52 */ 1, { 4, 11 } }, - { /* 53 */ 1, { 11, 0 } }, - { /* 54 */ 1, { 6, 9 } }, - { /* 55 */ 1, { 3, 11 } }, - { /* 56 */ 1, { 5, 10 } }, - { /* 57 */ 0, { 20, 21 } }, - { /* 58 */ 0, { 21, 22 } }, - { /* 59 */ 0, { 22, 23 } }, - { /* 60 */ 0, { 23, 24 } }, - { /* 61 */ 0, { 24, 25 } }, - { /* 62 */ 0, { 25, 26 } }, - { /* 63 */ 0, { 26, 27 } }, - { /* 64 */ 0, { 27, 28 } }, - { /* 65 */ 0, { 28, 29 } }, - { /* 66 */ 0, { 29, 30 } }, - { /* 67 */ 0, { 30, 31 } }, - { /* 68 */ 0, { 31, 32 } }, - { /* 69 */ 0, { 32, 33 } }, - { /* 70 */ 0, { 33, 34 } }, - { /* 71 */ 0, { 34, 35 } }, - { /* 72 */ 0, { 35, 36 } }, - { /* 73 */ 0, { 36, 37 } }, - { /* 74 */ 0, { 37, 38 } }, - { /* 75 */ 0, { 38, 39 } }, - { /* 76 */ 0, { 39, 40 } }, - { /* 77 */ 1, { 8, 8 } }, - { /* 78 */ 1, { 7, 8 } }, - { /* 79 */ 1, { 12, 5 } }, - { /* 80 */ 1, { 3, 12 } }, - { /* 81 */ 1, { 11, 5 } }, - { /* 82 */ 1, { 7, 7 } }, - { /* 83 */ 1, { 12, 4 } }, - { /* 84 */ 1, { 11, 6 } }, - { /* 85 */ 1, { 10, 6 } }, - { /* 86 */ 1, { 4, 12 } }, - { /* 87 */ 1, { 7, 9 } }, - { /* 88 */ 1, { 5, 11 } }, - { /* 89 */ 1, { 0, 11 } }, - { /* 90 */ 1, { 12, 6 } }, - { /* 91 */ 1, { 6, 10 } }, - { /* 92 */ 1, { 12, 0 } }, - { /* 93 */ 1, { 10, 7 } }, - { /* 94 */ 1, { 5, 12 } }, - { /* 95 */ 1, { 7, 10 } }, - { /* 96 */ 1, { 9, 8 } }, - { /* 97 */ 1, { 0, 12 } }, - { /* 98 */ 1, { 11, 7 } }, - { /* 99 */ 1, { 8, 9 } }, - { /* 00 */ 1, { 9, 9 } }, - { /* 01 */ 1, { 10, 8 } }, - { /* 02 */ 1, { 7, 11 } }, - { /* 03 */ 1, { 12, 7 } }, - { /* 04 */ 1, { 6, 11 } }, - { /* 05 */ 1, { 8, 11 } }, - { /* 06 */ 1, { 11, 8 } }, - { /* 07 */ 1, { 7, 12 } }, - { /* 08 */ 1, { 6, 12 } }, - { /* 09 */ 0, { 8, 9 } }, - { /* 10 */ 0, { 9, 10 } }, - { /* 11 */ 0, { 10, 11 } }, - { /* 12 */ 0, { 11, 12 } }, - { /* 13 */ 0, { 12, 13 } }, - { /* 14 */ 0, { 13, 14 } }, - { /* 15 */ 0, { 14, 15 } }, - { /* 16 */ 0, { 15, 16 } }, - { /* 17 */ 1, { 8, 10 } }, - { /* 18 */ 1, { 10, 9 } }, - { /* 19 */ 1, { 8, 12 } }, - { /* 20 */ 1, { 9, 10 } }, - { /* 21 */ 1, { 9, 11 } }, - { /* 22 */ 1, { 9, 12 } }, - { /* 23 */ 1, { 10, 11 } }, - { /* 24 */ 1, { 12, 9 } }, - { /* 25 */ 1, { 10, 10 } }, - { /* 26 */ 1, { 11, 9 } }, - { /* 27 */ 1, { 12, 8 } }, - { /* 28 */ 1, { 11, 10 } }, - { /* 29 */ 1, { 12, 10 } }, - { /* 30 */ 1, { 12, 11 } }, - { /* 31 */ 0, { 2, 3 } }, - { /* 32 */ 0, { 3, 4 } }, - { /* 33 */ 1, { 10, 12 } }, - { /* 34 */ 1, { 11, 11 } }, - { /* 35 */ 1, { 11, 12 } }, - { /* 36 */ 1, { 12, 12 } } -}; diff --git a/src/libfaad/codebook/hcb_sf.h b/src/libfaad/codebook/hcb_sf.h deleted file mode 100644 index 494053177..000000000 --- a/src/libfaad/codebook/hcb_sf.h +++ /dev/null @@ -1,273 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: hcb_sf.h,v 1.4 2005/10/29 23:57:08 tmmm Exp $ -**/ - -/* Binary search huffman table HCB_SF */ - - -static uint8_t hcb_sf[][2] = { - { /* 0 */ 1, 2 }, - { /* 1 */ 60, 0 }, - { /* 2 */ 1, 2 }, - { /* 3 */ 2, 3 }, - { /* 4 */ 3, 4 }, - { /* 5 */ 59, 0 }, - { /* 6 */ 3, 4 }, - { /* 7 */ 4, 5 }, - { /* 8 */ 5, 6 }, - { /* 9 */ 61, 0 }, - { /* 10 */ 58, 0 }, - { /* 11 */ 62, 0 }, - { /* 12 */ 3, 4 }, - { /* 13 */ 4, 5 }, - { /* 14 */ 5, 6 }, - { /* 15 */ 57, 0 }, - { /* 16 */ 63, 0 }, - { /* 17 */ 4, 5 }, - { /* 18 */ 5, 6 }, - { /* 19 */ 6, 7 }, - { /* 20 */ 7, 8 }, - { /* 21 */ 56, 0 }, - { /* 22 */ 64, 0 }, - { /* 23 */ 55, 0 }, - { /* 24 */ 65, 0 }, - { /* 25 */ 4, 5 }, - { /* 26 */ 5, 6 }, - { /* 27 */ 6, 7 }, - { /* 28 */ 7, 8 }, - { /* 29 */ 66, 0 }, - { /* 30 */ 54, 0 }, - { /* 31 */ 67, 0 }, - { /* 32 */ 5, 6 }, - { /* 33 */ 6, 7 }, - { /* 34 */ 7, 8 }, - { /* 35 */ 8, 9 }, - { /* 36 */ 9, 10 }, - { /* 37 */ 53, 0 }, - { /* 38 */ 68, 0 }, - { /* 39 */ 52, 0 }, - { /* 40 */ 69, 0 }, - { /* 41 */ 51, 0 }, - { /* 42 */ 5, 6 }, - { /* 43 */ 6, 7 }, - { /* 44 */ 7, 8 }, - { /* 45 */ 8, 9 }, - { /* 46 */ 9, 10 }, - { /* 47 */ 70, 0 }, - { /* 48 */ 50, 0 }, - { /* 49 */ 49, 0 }, - { /* 50 */ 71, 0 }, - { /* 51 */ 6, 7 }, - { /* 52 */ 7, 8 }, - { /* 53 */ 8, 9 }, - { /* 54 */ 9, 10 }, - { /* 55 */ 10, 11 }, - { /* 56 */ 11, 12 }, - { /* 57 */ 72, 0 }, - { /* 58 */ 48, 0 }, - { /* 59 */ 73, 0 }, - { /* 60 */ 47, 0 }, - { /* 61 */ 74, 0 }, - { /* 62 */ 46, 0 }, - { /* 63 */ 6, 7 }, - { /* 64 */ 7, 8 }, - { /* 65 */ 8, 9 }, - { /* 66 */ 9, 10 }, - { /* 67 */ 10, 11 }, - { /* 68 */ 11, 12 }, - { /* 69 */ 76, 0 }, - { /* 70 */ 75, 0 }, - { /* 71 */ 77, 0 }, - { /* 72 */ 78, 0 }, - { /* 73 */ 45, 0 }, - { /* 74 */ 43, 0 }, - { /* 75 */ 6, 7 }, - { /* 76 */ 7, 8 }, - { /* 77 */ 8, 9 }, - { /* 78 */ 9, 10 }, - { /* 79 */ 10, 11 }, - { /* 80 */ 11, 12 }, - { /* 81 */ 44, 0 }, - { /* 82 */ 79, 0 }, - { /* 83 */ 42, 0 }, - { /* 84 */ 41, 0 }, - { /* 85 */ 80, 0 }, - { /* 86 */ 40, 0 }, - { /* 87 */ 6, 7 }, - { /* 88 */ 7, 8 }, - { /* 89 */ 8, 9 }, - { /* 90 */ 9, 10 }, - { /* 91 */ 10, 11 }, - { /* 92 */ 11, 12 }, - { /* 93 */ 81, 0 }, - { /* 94 */ 39, 0 }, - { /* 95 */ 82, 0 }, - { /* 96 */ 38, 0 }, - { /* 97 */ 83, 0 }, - { /* 98 */ 7, 8 }, - { /* 99 */ 8, 9 }, - { /* 00 */ 9, 10 }, - { /* 01 */ 10, 11 }, - { /* 02 */ 11, 12 }, - { /* 03 */ 12, 13 }, - { /* 04 */ 13, 14 }, - { /* 05 */ 37, 0 }, - { /* 06 */ 35, 0 }, - { /* 07 */ 85, 0 }, - { /* 08 */ 33, 0 }, - { /* 09 */ 36, 0 }, - { /* 10 */ 34, 0 }, - { /* 11 */ 84, 0 }, - { /* 12 */ 32, 0 }, - { /* 13 */ 6, 7 }, - { /* 14 */ 7, 8 }, - { /* 15 */ 8, 9 }, - { /* 16 */ 9, 10 }, - { /* 17 */ 10, 11 }, - { /* 18 */ 11, 12 }, - { /* 19 */ 87, 0 }, - { /* 20 */ 89, 0 }, - { /* 21 */ 30, 0 }, - { /* 22 */ 31, 0 }, - { /* 23 */ 8, 9 }, - { /* 24 */ 9, 10 }, - { /* 25 */ 10, 11 }, - { /* 26 */ 11, 12 }, - { /* 27 */ 12, 13 }, - { /* 28 */ 13, 14 }, - { /* 29 */ 14, 15 }, - { /* 30 */ 15, 16 }, - { /* 31 */ 86, 0 }, - { /* 32 */ 29, 0 }, - { /* 33 */ 26, 0 }, - { /* 34 */ 27, 0 }, - { /* 35 */ 28, 0 }, - { /* 36 */ 24, 0 }, - { /* 37 */ 88, 0 }, - { /* 38 */ 9, 10 }, - { /* 39 */ 10, 11 }, - { /* 40 */ 11, 12 }, - { /* 41 */ 12, 13 }, - { /* 42 */ 13, 14 }, - { /* 43 */ 14, 15 }, - { /* 44 */ 15, 16 }, - { /* 45 */ 16, 17 }, - { /* 46 */ 17, 18 }, - { /* 47 */ 25, 0 }, - { /* 48 */ 22, 0 }, - { /* 49 */ 23, 0 }, - { /* 50 */ 15, 16 }, - { /* 51 */ 16, 17 }, - { /* 52 */ 17, 18 }, - { /* 53 */ 18, 19 }, - { /* 54 */ 19, 20 }, - { /* 55 */ 20, 21 }, - { /* 56 */ 21, 22 }, - { /* 57 */ 22, 23 }, - { /* 58 */ 23, 24 }, - { /* 59 */ 24, 25 }, - { /* 60 */ 25, 26 }, - { /* 61 */ 26, 27 }, - { /* 62 */ 27, 28 }, - { /* 63 */ 28, 29 }, - { /* 64 */ 29, 30 }, - { /* 65 */ 90, 0 }, - { /* 66 */ 21, 0 }, - { /* 67 */ 19, 0 }, - { /* 68 */ 3, 0 }, - { /* 69 */ 1, 0 }, - { /* 70 */ 2, 0 }, - { /* 71 */ 0, 0 }, - { /* 72 */ 23, 24 }, - { /* 73 */ 24, 25 }, - { /* 74 */ 25, 26 }, - { /* 75 */ 26, 27 }, - { /* 76 */ 27, 28 }, - { /* 77 */ 28, 29 }, - { /* 78 */ 29, 30 }, - { /* 79 */ 30, 31 }, - { /* 80 */ 31, 32 }, - { /* 81 */ 32, 33 }, - { /* 82 */ 33, 34 }, - { /* 83 */ 34, 35 }, - { /* 84 */ 35, 36 }, - { /* 85 */ 36, 37 }, - { /* 86 */ 37, 38 }, - { /* 87 */ 38, 39 }, - { /* 88 */ 39, 40 }, - { /* 89 */ 40, 41 }, - { /* 90 */ 41, 42 }, - { /* 91 */ 42, 43 }, - { /* 92 */ 43, 44 }, - { /* 93 */ 44, 45 }, - { /* 94 */ 45, 46 }, - { /* 95 */ 98, 0 }, - { /* 96 */ 99, 0 }, - { /* 97 */ 100, 0 }, - { /* 98 */ 101, 0 }, - { /* 99 */ 102, 0 }, - { /* 00 */ 117, 0 }, - { /* 01 */ 97, 0 }, - { /* 02 */ 91, 0 }, - { /* 03 */ 92, 0 }, - { /* 04 */ 93, 0 }, - { /* 05 */ 94, 0 }, - { /* 06 */ 95, 0 }, - { /* 07 */ 96, 0 }, - { /* 08 */ 104, 0 }, - { /* 09 */ 111, 0 }, - { /* 10 */ 112, 0 }, - { /* 11 */ 113, 0 }, - { /* 12 */ 114, 0 }, - { /* 13 */ 115, 0 }, - { /* 14 */ 116, 0 }, - { /* 15 */ 110, 0 }, - { /* 16 */ 105, 0 }, - { /* 17 */ 106, 0 }, - { /* 18 */ 107, 0 }, - { /* 19 */ 108, 0 }, - { /* 20 */ 109, 0 }, - { /* 21 */ 118, 0 }, - { /* 22 */ 6, 0 }, - { /* 23 */ 8, 0 }, - { /* 24 */ 9, 0 }, - { /* 25 */ 10, 0 }, - { /* 26 */ 5, 0 }, - { /* 27 */ 103, 0 }, - { /* 28 */ 120, 0 }, - { /* 29 */ 119, 0 }, - { /* 30 */ 4, 0 }, - { /* 31 */ 7, 0 }, - { /* 32 */ 15, 0 }, - { /* 33 */ 16, 0 }, - { /* 34 */ 18, 0 }, - { /* 35 */ 20, 0 }, - { /* 36 */ 17, 0 }, - { /* 37 */ 11, 0 }, - { /* 38 */ 12, 0 }, - { /* 39 */ 14, 0 }, - { /* 40 */ 13, 0 } -}; diff --git a/src/libfaad/common.c b/src/libfaad/common.c deleted file mode 100644 index 8c0d93e95..000000000 --- a/src/libfaad/common.c +++ /dev/null @@ -1,519 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: common.c,v 1.8 2005/10/29 23:57:06 tmmm Exp $ -**/ - -/* just some common functions that could be used anywhere */ - -#include "common.h" -#include "structs.h" - -#include <stdlib.h> -#include "syntax.h" - - -/* Returns the sample rate index based on the samplerate */ -uint8_t get_sr_index(const uint32_t samplerate) -{ - if (92017 <= samplerate) return 0; - if (75132 <= samplerate) return 1; - if (55426 <= samplerate) return 2; - if (46009 <= samplerate) return 3; - if (37566 <= samplerate) return 4; - if (27713 <= samplerate) return 5; - if (23004 <= samplerate) return 6; - if (18783 <= samplerate) return 7; - if (13856 <= samplerate) return 8; - if (11502 <= samplerate) return 9; - if (9391 <= samplerate) return 10; - if (16428320 <= samplerate) return 11; - - return 11; -} - -/* Returns the sample rate based on the sample rate index */ -uint32_t get_sample_rate(const uint8_t sr_index) -{ - static const uint32_t sample_rates[] = - { - 96000, 88200, 64000, 48000, 44100, 32000, - 24000, 22050, 16000, 12000, 11025, 8000 - }; - - if (sr_index < 12) - return sample_rates[sr_index]; - - return 0; -} - -uint8_t max_pred_sfb(const uint8_t sr_index) -{ - static const uint8_t pred_sfb_max[] = - { - 33, 33, 38, 40, 40, 40, 41, 41, 37, 37, 37, 34 - }; - - - if (sr_index < 12) - return pred_sfb_max[sr_index]; - - return 0; -} - -uint8_t max_tns_sfb(const uint8_t sr_index, const uint8_t object_type, - const uint8_t is_short) -{ - /* entry for each sampling rate - * 1 Main/LC long window - * 2 Main/LC short window - * 3 SSR long window - * 4 SSR short window - */ - static const uint8_t tns_sbf_max[][4] = - { - {31, 9, 28, 7}, /* 96000 */ - {31, 9, 28, 7}, /* 88200 */ - {34, 10, 27, 7}, /* 64000 */ - {40, 14, 26, 6}, /* 48000 */ - {42, 14, 26, 6}, /* 44100 */ - {51, 14, 26, 6}, /* 32000 */ - {46, 14, 29, 7}, /* 24000 */ - {46, 14, 29, 7}, /* 22050 */ - {42, 14, 23, 8}, /* 16000 */ - {42, 14, 23, 8}, /* 12000 */ - {42, 14, 23, 8}, /* 11025 */ - {39, 14, 19, 7}, /* 8000 */ - {39, 14, 19, 7}, /* 7350 */ - {0,0,0,0}, - {0,0,0,0}, - {0,0,0,0} - }; - uint8_t i = 0; - - if (is_short) i++; - if (object_type == SSR) i += 2; - - return tns_sbf_max[sr_index][i]; -} - -/* Returns 0 if an object type is decodable, otherwise returns -1 */ -int8_t can_decode_ot(const uint8_t object_type) -{ - switch (object_type) - { - case LC: - return 0; - case MAIN: -#ifdef MAIN_DEC - return 0; -#else - return -1; -#endif - case SSR: -#ifdef SSR_DEC - return 0; -#else - return -1; -#endif - case LTP: -#ifdef LTP_DEC - return 0; -#else - return -1; -#endif - - /* ER object types */ -#ifdef ERROR_RESILIENCE - case ER_LC: -#ifdef DRM - case DRM_ER_LC: -#endif - return 0; - case ER_LTP: -#ifdef LTP_DEC - return 0; -#else - return -1; -#endif - case LD: -#ifdef LD_DEC - return 0; -#else - return -1; -#endif -#endif - } - - return -1; -} - -void *faad_malloc(size_t size) -{ -#if 0 // defined(_WIN32) && !defined(_WIN32_WCE) - return _aligned_malloc(size, 16); -#else // #ifdef 0 - return malloc(size); -#endif // #ifdef 0 -} - -/* common free function */ -void faad_free(void *b) -{ -#if 0 // defined(_WIN32) && !defined(_WIN32_WCE) - _aligned_free(b); -#else - free(b); -} -#endif - -static const uint8_t Parity [256] = { // parity - 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, - 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, - 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, - 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, - 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, - 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, - 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, - 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0 -}; - -static uint32_t __r1 = 1; -static uint32_t __r2 = 1; - - -/* - * This is a simple random number generator with good quality for audio purposes. - * It consists of two polycounters with opposite rotation direction and different - * periods. The periods are coprime, so the total period is the product of both. - * - * ------------------------------------------------------------------------------------------------- - * +-> |31:30:29:28:27:26:25:24:23:22:21:20:19:18:17:16:15:14:13:12:11:10: 9: 8: 7: 6: 5: 4: 3: 2: 1: 0| - * | ------------------------------------------------------------------------------------------------- - * | | | | | | | - * | +--+--+--+-XOR-+--------+ - * | | - * +--------------------------------------------------------------------------------------+ - * - * ------------------------------------------------------------------------------------------------- - * |31:30:29:28:27:26:25:24:23:22:21:20:19:18:17:16:15:14:13:12:11:10: 9: 8: 7: 6: 5: 4: 3: 2: 1: 0| <-+ - * ------------------------------------------------------------------------------------------------- | - * | | | | | - * +--+----XOR----+--+ | - * | | - * +----------------------------------------------------------------------------------------+ - * - * - * The first has an period of 3*5*17*257*65537, the second of 7*47*73*178481, - * which gives a period of 18.410.713.077.675.721.215. The result is the - * XORed values of both generators. - */ -uint32_t random_int(void) -{ - uint32_t t1, t2, t3, t4; - - t3 = t1 = __r1; t4 = t2 = __r2; // Parity calculation is done via table lookup, this is also available - t1 &= 0xF5; t2 >>= 25; // on CPUs without parity, can be implemented in C and avoid unpredictable - t1 = Parity [t1]; t2 &= 0x63; // jumps and slow rotate through the carry flag operations. - t1 <<= 31; t2 = Parity [t2]; - - return (__r1 = (t3 >> 1) | t1 ) ^ (__r2 = (t4 + t4) | t2 ); -} - -uint32_t ones32(uint32_t x) -{ - x -= ((x >> 1) & 0x55555555); - x = (((x >> 2) & 0x33333333) + (x & 0x33333333)); - x = (((x >> 4) + x) & 0x0f0f0f0f); - x += (x >> 8); - x += (x >> 16); - - return (x & 0x0000003f); -} - -uint32_t floor_log2(uint32_t x) -{ -#if 1 - x |= (x >> 1); - x |= (x >> 2); - x |= (x >> 4); - x |= (x >> 8); - x |= (x >> 16); - - return (ones32(x) - 1); -#else - uint32_t count = 0; - - while (x >>= 1) - count++; - - return count; -#endif -} - -/* returns position of first bit that is not 0 from msb, - * starting count at lsb */ -uint32_t wl_min_lzc(uint32_t x) -{ -#if 1 - x |= (x >> 1); - x |= (x >> 2); - x |= (x >> 4); - x |= (x >> 8); - x |= (x >> 16); - - return (ones32(x)); -#else - uint32_t count = 0; - - while (x >>= 1) - count++; - - return (count + 1); -#endif -} - -#ifdef FIXED_POINT - -#define TABLE_BITS 6 -/* just take the maximum number of bits for interpolation */ -#define INTERP_BITS (REAL_BITS-TABLE_BITS) - -static const real_t pow2_tab[] = { - REAL_CONST(1.000000000000000), REAL_CONST(1.010889286051701), REAL_CONST(1.021897148654117), - REAL_CONST(1.033024879021228), REAL_CONST(1.044273782427414), REAL_CONST(1.055645178360557), - REAL_CONST(1.067140400676824), REAL_CONST(1.078760797757120), REAL_CONST(1.090507732665258), - REAL_CONST(1.102382583307841), REAL_CONST(1.114386742595892), REAL_CONST(1.126521618608242), - REAL_CONST(1.138788634756692), REAL_CONST(1.151189229952983), REAL_CONST(1.163724858777578), - REAL_CONST(1.176396991650281), REAL_CONST(1.189207115002721), REAL_CONST(1.202156731452703), - REAL_CONST(1.215247359980469), REAL_CONST(1.228480536106870), REAL_CONST(1.241857812073484), - REAL_CONST(1.255380757024691), REAL_CONST(1.269050957191733), REAL_CONST(1.282870016078778), - REAL_CONST(1.296839554651010), REAL_CONST(1.310961211524764), REAL_CONST(1.325236643159741), - REAL_CONST(1.339667524053303), REAL_CONST(1.354255546936893), REAL_CONST(1.369002422974591), - REAL_CONST(1.383909881963832), REAL_CONST(1.398979672538311), REAL_CONST(1.414213562373095), - REAL_CONST(1.429613338391970), REAL_CONST(1.445180806977047), REAL_CONST(1.460917794180647), - REAL_CONST(1.476826145939499), REAL_CONST(1.492907728291265), REAL_CONST(1.509164427593423), - REAL_CONST(1.525598150744538), REAL_CONST(1.542210825407941), REAL_CONST(1.559004400237837), - REAL_CONST(1.575980845107887), REAL_CONST(1.593142151342267), REAL_CONST(1.610490331949254), - REAL_CONST(1.628027421857348), REAL_CONST(1.645755478153965), REAL_CONST(1.663676580326736), - REAL_CONST(1.681792830507429), REAL_CONST(1.700106353718524), REAL_CONST(1.718619298122478), - REAL_CONST(1.737333835273706), REAL_CONST(1.756252160373300), REAL_CONST(1.775376492526521), - REAL_CONST(1.794709075003107), REAL_CONST(1.814252175500399), REAL_CONST(1.834008086409342), - REAL_CONST(1.853979125083386), REAL_CONST(1.874167634110300), REAL_CONST(1.894575981586966), - REAL_CONST(1.915206561397147), REAL_CONST(1.936061793492294), REAL_CONST(1.957144124175400), - REAL_CONST(1.978456026387951), REAL_CONST(2.000000000000000) -}; - -static const real_t log2_tab[] = { - REAL_CONST(0.000000000000000), REAL_CONST(0.022367813028455), REAL_CONST(0.044394119358453), - REAL_CONST(0.066089190457772), REAL_CONST(0.087462841250339), REAL_CONST(0.108524456778169), - REAL_CONST(0.129283016944966), REAL_CONST(0.149747119504682), REAL_CONST(0.169925001442312), - REAL_CONST(0.189824558880017), REAL_CONST(0.209453365628950), REAL_CONST(0.228818690495881), - REAL_CONST(0.247927513443585), REAL_CONST(0.266786540694901), REAL_CONST(0.285402218862248), - REAL_CONST(0.303780748177103), REAL_CONST(0.321928094887362), REAL_CONST(0.339850002884625), - REAL_CONST(0.357552004618084), REAL_CONST(0.375039431346925), REAL_CONST(0.392317422778760), - REAL_CONST(0.409390936137702), REAL_CONST(0.426264754702098), REAL_CONST(0.442943495848728), - REAL_CONST(0.459431618637297), REAL_CONST(0.475733430966398), REAL_CONST(0.491853096329675), - REAL_CONST(0.507794640198696), REAL_CONST(0.523561956057013), REAL_CONST(0.539158811108031), - REAL_CONST(0.554588851677637), REAL_CONST(0.569855608330948), REAL_CONST(0.584962500721156), - REAL_CONST(0.599912842187128), REAL_CONST(0.614709844115208), REAL_CONST(0.629356620079610), - REAL_CONST(0.643856189774725), REAL_CONST(0.658211482751795), REAL_CONST(0.672425341971496), - REAL_CONST(0.686500527183218), REAL_CONST(0.700439718141092), REAL_CONST(0.714245517666123), - REAL_CONST(0.727920454563199), REAL_CONST(0.741466986401147), REAL_CONST(0.754887502163469), - REAL_CONST(0.768184324776926), REAL_CONST(0.781359713524660), REAL_CONST(0.794415866350106), - REAL_CONST(0.807354922057604), REAL_CONST(0.820178962415188), REAL_CONST(0.832890014164742), - REAL_CONST(0.845490050944375), REAL_CONST(0.857980995127572), REAL_CONST(0.870364719583405), - REAL_CONST(0.882643049361841), REAL_CONST(0.894817763307943), REAL_CONST(0.906890595608519), - REAL_CONST(0.918863237274595), REAL_CONST(0.930737337562886), REAL_CONST(0.942514505339240), - REAL_CONST(0.954196310386875), REAL_CONST(0.965784284662087), REAL_CONST(0.977279923499917), - REAL_CONST(0.988684686772166), REAL_CONST(1.000000000000000) -}; - -real_t pow2_fix(real_t val) -{ - uint32_t x1, x2; - uint32_t errcorr; - uint32_t index_frac; - real_t retval; - int32_t whole = (val >> REAL_BITS); - - /* rest = [0..1] */ - int32_t rest = val - (whole << REAL_BITS); - - /* index into pow2_tab */ - int32_t index = rest >> (REAL_BITS-TABLE_BITS); - - - if (val == 0) - return (1<<REAL_BITS); - - /* leave INTERP_BITS bits */ - index_frac = rest >> (REAL_BITS-TABLE_BITS-INTERP_BITS); - index_frac = index_frac & ((1<<INTERP_BITS)-1); - - if (whole > 0) - { - retval = 1 << whole; - } else { - retval = REAL_CONST(1) >> -whole; - } - - x1 = pow2_tab[index & ((1<<TABLE_BITS)-1)]; - x2 = pow2_tab[(index & ((1<<TABLE_BITS)-1)) + 1]; - errcorr = ( (index_frac*(x2-x1))) >> INTERP_BITS; - - if (whole > 0) - { - retval = retval * (errcorr + x1); - } else { - retval = MUL_R(retval, (errcorr + x1)); - } - - return retval; -} - -int32_t pow2_int(real_t val) -{ - uint32_t x1, x2; - uint32_t errcorr; - uint32_t index_frac; - real_t retval; - int32_t whole = (val >> REAL_BITS); - - /* rest = [0..1] */ - int32_t rest = val - (whole << REAL_BITS); - - /* index into pow2_tab */ - int32_t index = rest >> (REAL_BITS-TABLE_BITS); - - - if (val == 0) - return 1; - - /* leave INTERP_BITS bits */ - index_frac = rest >> (REAL_BITS-TABLE_BITS-INTERP_BITS); - index_frac = index_frac & ((1<<INTERP_BITS)-1); - - if (whole > 0) - retval = 1 << whole; - else - retval = 0; - - x1 = pow2_tab[index & ((1<<TABLE_BITS)-1)]; - x2 = pow2_tab[(index & ((1<<TABLE_BITS)-1)) + 1]; - errcorr = ( (index_frac*(x2-x1))) >> INTERP_BITS; - - retval = MUL_R(retval, (errcorr + x1)); - - return retval; -} - -/* ld(x) = ld(x*y/y) = ld(x/y) + ld(y), with y=2^N and [1 <= (x/y) < 2] */ -int32_t log2_int(uint32_t val) -{ - uint32_t frac; - uint32_t whole = (val); - int32_t exp = 0; - uint32_t index; - uint32_t index_frac; - uint32_t x1, x2; - uint32_t errcorr; - - /* error */ - if (val == 0) - return -10000; - - exp = floor_log2(val); - exp -= REAL_BITS; - - /* frac = [1..2] */ - if (exp >= 0) - frac = val >> exp; - else - frac = val << -exp; - - /* index in the log2 table */ - index = frac >> (REAL_BITS-TABLE_BITS); - - /* leftover part for linear interpolation */ - index_frac = frac & ((1<<(REAL_BITS-TABLE_BITS))-1); - - /* leave INTERP_BITS bits */ - index_frac = index_frac >> (REAL_BITS-TABLE_BITS-INTERP_BITS); - - x1 = log2_tab[index & ((1<<TABLE_BITS)-1)]; - x2 = log2_tab[(index & ((1<<TABLE_BITS)-1)) + 1]; - - /* linear interpolation */ - /* retval = exp + ((index_frac)*x2 + (1-index_frac)*x1) */ - - errcorr = (index_frac * (x2-x1)) >> INTERP_BITS; - - return ((exp+REAL_BITS) << REAL_BITS) + errcorr + x1; -} - -/* ld(x) = ld(x*y/y) = ld(x/y) + ld(y), with y=2^N and [1 <= (x/y) < 2] */ -real_t log2_fix(uint32_t val) -{ - uint32_t frac; - uint32_t whole = (val >> REAL_BITS); - int8_t exp = 0; - uint32_t index; - uint32_t index_frac; - uint32_t x1, x2; - uint32_t errcorr; - - /* error */ - if (val == 0) - return -100000; - - exp = floor_log2(val); - exp -= REAL_BITS; - - /* frac = [1..2] */ - if (exp >= 0) - frac = val >> exp; - else - frac = val << -exp; - - /* index in the log2 table */ - index = frac >> (REAL_BITS-TABLE_BITS); - - /* leftover part for linear interpolation */ - index_frac = frac & ((1<<(REAL_BITS-TABLE_BITS))-1); - - /* leave INTERP_BITS bits */ - index_frac = index_frac >> (REAL_BITS-TABLE_BITS-INTERP_BITS); - - x1 = log2_tab[index & ((1<<TABLE_BITS)-1)]; - x2 = log2_tab[(index & ((1<<TABLE_BITS)-1)) + 1]; - - /* linear interpolation */ - /* retval = exp + ((index_frac)*x2 + (1-index_frac)*x1) */ - - errcorr = (index_frac * (x2-x1)) >> INTERP_BITS; - - return (exp << REAL_BITS) + errcorr + x1; -} -#endif diff --git a/src/libfaad/common.h b/src/libfaad/common.h deleted file mode 100644 index 47832e648..000000000 --- a/src/libfaad/common.h +++ /dev/null @@ -1,426 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: common.h,v 1.17 2006/06/17 20:43:57 dgp85 Exp $ -**/ - -#ifndef __COMMON_H__ -#define __COMMON_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef __CYGWIN__ -#define __STRICT_ANSI__ -#endif - -#include "../config.h" - -#define INLINE __inline -#if 0 //defined(_WIN32) && !defined(_WIN32_WCE) -#define ALIGN __declspec(align(16)) -#else -#define ALIGN -#endif - -#ifndef max -#define max(a, b) (((a) > (b)) ? (a) : (b)) -#endif -#ifndef min -#define min(a, b) (((a) < (b)) ? (a) : (b)) -#endif - -/* COMPILE TIME DEFINITIONS */ - -/* use double precision */ -/* #define USE_DOUBLE_PRECISION */ -/* use fixed point reals */ -//#define FIXED_POINT -//#define BIG_IQ_TABLE - -/* Use if target platform has address generators with autoincrement */ -//#define PREFER_POINTERS - -#if defined(_WIN32_WCE) || defined(__arm__) -#define FIXED_POINT -#endif - - -#define ERROR_RESILIENCE - - -/* Allow decoding of MAIN profile AAC */ -#define MAIN_DEC -/* Allow decoding of SSR profile AAC */ -//#define SSR_DEC -/* Allow decoding of LTP profile AAC */ -#define LTP_DEC -/* Allow decoding of LD profile AAC */ -#define LD_DEC -/* Allow decoding of scalable profiles */ -//#define SCALABLE_DEC -/* Allow decoding of Digital Radio Mondiale (DRM) */ -//#define DRM -//#define DRM_PS - -/* LD can't do without LTP */ -#ifdef LD_DEC -#ifndef ERROR_RESILIENCE -#define ERROR_RESILIENCE -#endif -#ifndef LTP_DEC -#define LTP_DEC -#endif -#endif - -#define ALLOW_SMALL_FRAMELENGTH - - -// Define LC_ONLY_DECODER if you want a pure AAC LC decoder (independant of SBR_DEC and PS_DEC) -//#define LC_ONLY_DECODER -#ifdef LC_ONLY_DECODER - #undef LD_DEC - #undef LTP_DEC - #undef MAIN_DEC - #undef SSR_DEC - #undef DRM - #undef ALLOW_SMALL_FRAMELENGTH - #undef ERROR_RESILIENCE -#endif - -#define SBR_DEC -//#define SBR_LOW_POWER -#define PS_DEC - -/* FIXED POINT: No MAIN decoding */ -#ifdef FIXED_POINT -# ifdef MAIN_DEC -# undef MAIN_DEC -# endif -# ifdef SBR_DEC -# undef SBR_DEC -# endif -#endif // FIXED_POINT - -#ifdef DRM -# ifndef SCALABLE_DEC -# define SCALABLE_DEC -# endif -#endif - - -#ifdef FIXED_POINT -#define DIV_R(A, B) (((int64_t)A << REAL_BITS)/B) -#define DIV_C(A, B) (((int64_t)A << COEF_BITS)/B) -#else -#define DIV_R(A, B) ((A)/(B)) -#define DIV_C(A, B) ((A)/(B)) -#endif - -#ifndef SBR_LOW_POWER -#define qmf_t complex_t -#define QMF_RE(A) RE(A) -#define QMF_IM(A) IM(A) -#else -#define qmf_t real_t -#define QMF_RE(A) (A) -#define QMF_IM(A) -#endif - - -/* END COMPILE TIME DEFINITIONS */ - -#include <stdio.h> -#if HAVE_SYS_TYPES_H -# include <sys/types.h> -#endif -#if HAVE_SYS_STAT_H -# include <sys/stat.h> -#endif -#if STDC_HEADERS -# include <stdlib.h> -# include <stddef.h> -#else -# if HAVE_STDLIB_H -# include <stdlib.h> -# endif -#endif -#if HAVE_STRING_H -# if !STDC_HEADERS && HAVE_MEMORY_H -# include <memory.h> -# endif -# include <string.h> -#endif -#if HAVE_STRINGS_H -# include <strings.h> -#endif - -/* precedence defining int-types by header files for all platforms */ -#if HAVE_INTTYPES_H -# include <inttypes.h> -#else -# if HAVE_STDINT_H -# include <stdint.h> -# else -/* we need these... */ -# ifdef WIN32 -typedef unsigned __int64 uint64_t; -typedef unsigned __int32 uint32_t; -typedef unsigned __int16 uint16_t; -typedef unsigned __int8 uint8_t; -typedef __int64 int64_t; -typedef __int32 int32_t; -typedef __int16 int16_t; -typedef __int8 int8_t; -# else /* WIN32 */ -typedef float float32_t; -typedef unsigned long long uint64_t; -typedef unsigned long uint32_t; -typedef unsigned short uint16_t; -typedef unsigned char uint8_t; -typedef long long int64_t; -typedef long int32_t; -typedef short int16_t; -typedef char int8_t; -# endif /* WIN32 */ -# endif -#endif -#if HAVE_UNISTD_H -# include <unistd.h> -#endif - -#ifndef HAVE_FLOAT32_T -typedef float float32_t; -#endif - -#if STDC_HEADERS -# include <string.h> -#else -# if !HAVE_STRCHR -# define strchr index -# define strrchr rindex -# endif -char *strchr(), *strrchr(); -# if !HAVE_MEMCPY -# define memcpy(d, s, n) bcopy((s), (d), (n)) -# define memmove(d, s, n) bcopy((s), (d), (n)) -# endif -#endif - -#ifdef WORDS_BIGENDIAN -#define ARCH_IS_BIG_ENDIAN -#endif - -/* FIXED_POINT doesn't work with MAIN and SSR yet */ -#ifdef FIXED_POINT - #undef MAIN_DEC - #undef SSR_DEC -#endif - - -#if defined(FIXED_POINT) - - #include "fixed.h" - -#elif defined(USE_DOUBLE_PRECISION) - - typedef double real_t; - - #include <math.h> - - #define MUL_R(A,B) ((A)*(B)) - #define MUL_C(A,B) ((A)*(B)) - #define MUL_F(A,B) ((A)*(B)) - - /* Complex multiplication */ - static INLINE void ComplexMult(real_t *y1, real_t *y2, - real_t x1, real_t x2, real_t c1, real_t c2) - { - *y1 = MUL_F(x1, c1) + MUL_F(x2, c2); - *y2 = MUL_F(x2, c1) - MUL_F(x1, c2); - } - - #define REAL_CONST(A) ((real_t)(A)) - #define COEF_CONST(A) ((real_t)(A)) - #define Q2_CONST(A) ((real_t)(A)) - #define FRAC_CONST(A) ((real_t)(A)) /* pure fractional part */ - -#else /* Normal floating point operation */ - - typedef float real_t; - - #define MUL_R(A,B) ((A)*(B)) - #define MUL_C(A,B) ((A)*(B)) - #define MUL_F(A,B) ((A)*(B)) - - #define REAL_CONST(A) ((real_t)(A)) - #define COEF_CONST(A) ((real_t)(A)) - #define Q2_CONST(A) ((real_t)(A)) - #define FRAC_CONST(A) ((real_t)(A)) /* pure fractional part */ - - /* Complex multiplication */ - static INLINE void ComplexMult(real_t *y1, real_t *y2, - real_t x1, real_t x2, real_t c1, real_t c2) - { - *y1 = MUL_F(x1, c1) + MUL_F(x2, c2); - *y2 = MUL_F(x2, c1) - MUL_F(x1, c2); - } - - -#ifndef HAVE_LRINTF - #if defined(_WIN32) && !defined(__MINGW32__) - #define HAS_LRINTF - static INLINE int lrintf(float f) - { - int i; - __asm - { - fld f - fistp i - } - return i; - } - #elif (defined(__i386__) && defined(__GNUC__)) - #define HAS_LRINTF - // from http://www.stereopsis.com/FPU.html - static INLINE int lrintf(float f) - { - int i; - __asm__ __volatile__ ( - "flds %1 \n\t" - "fistpl %0 \n\t" - : "=m" (i) - : "m" (f)); - return i; - } - #endif -#endif - - #ifdef __ICL /* only Intel C compiler has fmath ??? */ - - #include <mathf.h> - - #define sin sinf - #define cos cosf - #define log logf - #define floor floorf - #define ceil ceilf - #define sqrt sqrtf - - #else - -#include <math.h> - -#ifdef HAVE_LRINTF -# define HAS_LRINTF -# define _ISOC9X_SOURCE 1 -# define _ISOC99_SOURCE 1 -# define __USE_ISOC9X 1 -# define __USE_ISOC99 1 -#endif - -#ifdef HAVE_SINF -# define sin sinf -#error -#endif -#ifdef HAVE_COSF -# define cos cosf -#endif -#ifdef HAVE_LOGF -# define log logf -#endif -#ifdef HAVE_EXPF -# define exp expf -#endif -#ifdef HAVE_FLOORF -# define floor floorf -#endif -#ifdef HAVE_CEILF -# define ceil ceilf -#endif -#ifdef HAVE_SQRTF -# define sqrt sqrtf -#endif - - #endif - -#endif - -#ifndef HAS_LRINTF -/* standard cast */ -#define lrintf(f) ((int32_t)(f)) -#endif - -typedef real_t complex_t[2]; -#define RE(A) A[0] -#define IM(A) A[1] - - -/* common functions */ -uint8_t cpu_has_sse(void); -uint32_t random_int(void); -uint32_t ones32(uint32_t x); -uint32_t floor_log2(uint32_t x); -uint32_t wl_min_lzc(uint32_t x); -#ifdef FIXED_POINT -#define LOG2_MIN_INF REAL_CONST(-10000) -int32_t log2_int(uint32_t val); -int32_t log2_fix(uint32_t val); -int32_t pow2_int(real_t val); -real_t pow2_fix(real_t val); -#endif -uint8_t get_sr_index(const uint32_t samplerate); -uint8_t max_pred_sfb(const uint8_t sr_index); -uint8_t max_tns_sfb(const uint8_t sr_index, const uint8_t object_type, - const uint8_t is_short); -uint32_t get_sample_rate(const uint8_t sr_index); -int8_t can_decode_ot(const uint8_t object_type); - -void *faad_malloc(size_t size); -void faad_free(void *b); - -//#define PROFILE -#ifdef PROFILE -static int64_t faad_get_ts() -{ - __asm - { - rdtsc - } -} -#endif - -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif -#ifndef M_PI_2 /* PI/2 */ -#define M_PI_2 1.57079632679489661923 -#endif - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/decoder.c b/src/libfaad/decoder.c deleted file mode 100644 index 33aee247e..000000000 --- a/src/libfaad/decoder.c +++ /dev/null @@ -1,1024 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: decoder.c,v 1.10 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include <stdlib.h> -#include <string.h> - -#include "decoder.h" -#include "mp4.h" -#include "syntax.h" -#include "error.h" -#include "output.h" -#include "filtbank.h" -#include "drc.h" -#ifdef SBR_DEC -#include "sbr_dec.h" -#include "sbr_syntax.h" -#endif -#ifdef SSR_DEC -#include "ssr.h" -#endif - -#ifdef ANALYSIS -uint16_t dbg_count; -#endif - -/* static function declarations */ -static void* aac_frame_decode(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, - uint8_t *buffer, uint32_t buffer_size, - void **sample_buffer, uint32_t sample_buffer_size); -static void create_channel_config(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo); - - -char* NEAACDECAPI NeAACDecGetErrorMessage(uint8_t errcode) -{ - if (errcode >= NUM_ERROR_MESSAGES) - return NULL; - return err_msg[errcode]; -} - -uint32_t NEAACDECAPI NeAACDecGetCapabilities(void) -{ - uint32_t cap = 0; - - /* can't do without it */ - cap += LC_DEC_CAP; - -#ifdef MAIN_DEC - cap += MAIN_DEC_CAP; -#endif -#ifdef LTP_DEC - cap += LTP_DEC_CAP; -#endif -#ifdef LD_DEC - cap += LD_DEC_CAP; -#endif -#ifdef ERROR_RESILIENCE - cap += ERROR_RESILIENCE_CAP; -#endif -#ifdef FIXED_POINT - cap += FIXED_POINT_CAP; -#endif - - return cap; -} - -NeAACDecHandle NEAACDECAPI NeAACDecOpen(void) -{ - uint8_t i; - NeAACDecHandle hDecoder = NULL; - - if ((hDecoder = (NeAACDecHandle)faad_malloc(sizeof(NeAACDecStruct))) == NULL) - return NULL; - - memset(hDecoder, 0, sizeof(NeAACDecStruct)); - - hDecoder->config.outputFormat = FAAD_FMT_16BIT; - hDecoder->config.defObjectType = MAIN; - hDecoder->config.defSampleRate = 44100; /* Default: 44.1kHz */ - hDecoder->config.downMatrix = 0; - hDecoder->adts_header_present = 0; - hDecoder->adif_header_present = 0; -#ifdef ERROR_RESILIENCE - hDecoder->aacSectionDataResilienceFlag = 0; - hDecoder->aacScalefactorDataResilienceFlag = 0; - hDecoder->aacSpectralDataResilienceFlag = 0; -#endif - hDecoder->frameLength = 1024; - - hDecoder->frame = 0; - hDecoder->sample_buffer = NULL; - - for (i = 0; i < MAX_CHANNELS; i++) - { - hDecoder->window_shape_prev[i] = 0; - hDecoder->time_out[i] = NULL; - hDecoder->fb_intermed[i] = NULL; -#ifdef SSR_DEC - hDecoder->ssr_overlap[i] = NULL; - hDecoder->prev_fmd[i] = NULL; -#endif -#ifdef MAIN_DEC - hDecoder->pred_stat[i] = NULL; -#endif -#ifdef LTP_DEC - hDecoder->ltp_lag[i] = 0; - hDecoder->lt_pred_stat[i] = NULL; -#endif - } - -#ifdef SBR_DEC - for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++) - { - hDecoder->sbr[i] = NULL; - } -#endif - - hDecoder->drc = drc_init(REAL_CONST(1.0), REAL_CONST(1.0)); - - return hDecoder; -} - -NeAACDecConfigurationPtr NEAACDECAPI NeAACDecGetCurrentConfiguration(NeAACDecHandle hDecoder) -{ - if (hDecoder) - { - NeAACDecConfigurationPtr config = &(hDecoder->config); - - return config; - } - - return NULL; -} - -uint8_t NEAACDECAPI NeAACDecSetConfiguration(NeAACDecHandle hDecoder, - NeAACDecConfigurationPtr config) -{ - if (hDecoder && config) - { - /* check if we can decode this object type */ - if (can_decode_ot(config->defObjectType) < 0) - return 0; - hDecoder->config.defObjectType = config->defObjectType; - - /* samplerate: anything but 0 should be possible */ - if (config->defSampleRate == 0) - return 0; - hDecoder->config.defSampleRate = config->defSampleRate; - - /* check output format */ -#ifdef FIXED_POINT - if ((config->outputFormat < 1) || (config->outputFormat > 4)) - return 0; -#else - if ((config->outputFormat < 1) || (config->outputFormat > 5)) - return 0; -#endif - hDecoder->config.outputFormat = config->outputFormat; - - if (config->downMatrix > 1) - return 0; - hDecoder->config.downMatrix = config->downMatrix; - - /* OK */ - return 1; - } - - return 0; -} - -int32_t NEAACDECAPI NeAACDecInit(NeAACDecHandle hDecoder, uint8_t *buffer, - uint32_t buffer_size, - uint32_t *samplerate, uint8_t *channels) -{ - uint32_t bits = 0; - bitfile ld; - adif_header adif; - adts_header adts; - - if ((hDecoder == NULL) || (samplerate == NULL) || (channels == NULL)) - return -1; - - hDecoder->sf_index = get_sr_index(hDecoder->config.defSampleRate); - hDecoder->object_type = hDecoder->config.defObjectType; - *samplerate = get_sample_rate(hDecoder->sf_index); - *channels = 1; - - if (buffer != NULL) - { - faad_initbits(&ld, buffer, buffer_size); - - /* Check if an ADIF header is present */ - if ((buffer[0] == 'A') && (buffer[1] == 'D') && - (buffer[2] == 'I') && (buffer[3] == 'F')) - { - hDecoder->adif_header_present = 1; - - get_adif_header(&adif, &ld); - faad_byte_align(&ld); - - hDecoder->sf_index = adif.pce[0].sf_index; - hDecoder->object_type = adif.pce[0].object_type + 1; - - *samplerate = get_sample_rate(hDecoder->sf_index); - *channels = adif.pce[0].channels; - - memcpy(&(hDecoder->pce), &(adif.pce[0]), sizeof(program_config)); - hDecoder->pce_set = 1; - - bits = bit2byte(faad_get_processed_bits(&ld)); - - /* Check if an ADTS header is present */ - } else if (faad_showbits(&ld, 12) == 0xfff) { - hDecoder->adts_header_present = 1; - - adts.old_format = hDecoder->config.useOldADTSFormat; - adts_frame(&adts, &ld); - - hDecoder->sf_index = adts.sf_index; - hDecoder->object_type = adts.profile + 1; - - *samplerate = get_sample_rate(hDecoder->sf_index); - *channels = (adts.channel_configuration > 6) ? - 2 : adts.channel_configuration; - } - - if (ld.error) - { - faad_endbits(&ld); - return -1; - } - faad_endbits(&ld); - } - hDecoder->channelConfiguration = *channels; - -#if (defined(PS_DEC) || defined(DRM_PS)) - /* check if we have a mono file */ - if (*channels == 1) - { - /* upMatrix to 2 channels for implicit signalling of PS */ - *channels = 2; - } -#endif - -#ifdef SBR_DEC - /* implicit signalling */ - if (*samplerate <= 24000 && !(hDecoder->config.dontUpSampleImplicitSBR)) - { - *samplerate *= 2; - hDecoder->forceUpSampling = 1; - } else if (*samplerate > 24000 && !(hDecoder->config.dontUpSampleImplicitSBR)) { - hDecoder->downSampledSBR = 1; - } -#endif - - /* must be done before frameLength is divided by 2 for LD */ -#ifdef SSR_DEC - if (hDecoder->object_type == SSR) - hDecoder->fb = ssr_filter_bank_init(hDecoder->frameLength/SSR_BANDS); - else -#endif - hDecoder->fb = filter_bank_init(hDecoder->frameLength); - -#ifdef LD_DEC - if (hDecoder->object_type == LD) - hDecoder->frameLength >>= 1; -#endif - - if (can_decode_ot(hDecoder->object_type) < 0) - return -1; - - return bits; -} - -/* Init the library using a DecoderSpecificInfo */ -int8_t NEAACDECAPI NeAACDecInit2(NeAACDecHandle hDecoder, uint8_t *pBuffer, - uint32_t SizeOfDecoderSpecificInfo, - uint32_t *samplerate, uint8_t *channels) -{ - int8_t rc; - mp4AudioSpecificConfig mp4ASC; - - if((hDecoder == NULL) - || (pBuffer == NULL) - || (SizeOfDecoderSpecificInfo < 2) - || (samplerate == NULL) - || (channels == NULL)) - { - return -1; - } - - hDecoder->adif_header_present = 0; - hDecoder->adts_header_present = 0; - - /* decode the audio specific config */ - rc = AudioSpecificConfig2(pBuffer, SizeOfDecoderSpecificInfo, &mp4ASC, - &(hDecoder->pce)); - - /* copy the relevant info to the decoder handle */ - *samplerate = mp4ASC.samplingFrequency; - if (mp4ASC.channelsConfiguration) - { - *channels = mp4ASC.channelsConfiguration; - } else { - *channels = hDecoder->pce.channels; - hDecoder->pce_set = 1; - } -#if (defined(PS_DEC) || defined(DRM_PS)) - /* check if we have a mono file */ - if (*channels == 1) - { - /* upMatrix to 2 channels for implicit signalling of PS */ - *channels = 2; - } -#endif - hDecoder->sf_index = mp4ASC.samplingFrequencyIndex; - hDecoder->object_type = mp4ASC.objectTypeIndex; -#ifdef ERROR_RESILIENCE - hDecoder->aacSectionDataResilienceFlag = mp4ASC.aacSectionDataResilienceFlag; - hDecoder->aacScalefactorDataResilienceFlag = mp4ASC.aacScalefactorDataResilienceFlag; - hDecoder->aacSpectralDataResilienceFlag = mp4ASC.aacSpectralDataResilienceFlag; -#endif -#ifdef SBR_DEC - hDecoder->sbr_present_flag = mp4ASC.sbr_present_flag; - hDecoder->downSampledSBR = mp4ASC.downSampledSBR; - if (hDecoder->config.dontUpSampleImplicitSBR == 0) - hDecoder->forceUpSampling = mp4ASC.forceUpSampling; - else - hDecoder->forceUpSampling = 0; - - /* AAC core decoder samplerate is 2 times as low */ - if (((hDecoder->sbr_present_flag == 1)&&(!hDecoder->downSampledSBR)) || hDecoder->forceUpSampling == 1) - { - hDecoder->sf_index = get_sr_index(mp4ASC.samplingFrequency / 2); - } -#endif - - if (rc != 0) - { - return rc; - } - hDecoder->channelConfiguration = mp4ASC.channelsConfiguration; - if (mp4ASC.frameLengthFlag) -#ifdef ALLOW_SMALL_FRAMELENGTH - hDecoder->frameLength = 960; -#else - return -1; -#endif - - /* must be done before frameLength is divided by 2 for LD */ -#ifdef SSR_DEC - if (hDecoder->object_type == SSR) - hDecoder->fb = ssr_filter_bank_init(hDecoder->frameLength/SSR_BANDS); - else -#endif - hDecoder->fb = filter_bank_init(hDecoder->frameLength); - -#ifdef LD_DEC - if (hDecoder->object_type == LD) - hDecoder->frameLength >>= 1; -#endif - - return 0; -} - -#ifdef DRM -int8_t NEAACDECAPI NeAACDecInitDRM(NeAACDecHandle *hDecoder, uint32_t samplerate, - uint8_t channels) -{ - if (hDecoder == NULL) - return 1; /* error */ - - NeAACDecClose(*hDecoder); - - *hDecoder = NeAACDecOpen(); - - /* Special object type defined for DRM */ - (*hDecoder)->config.defObjectType = DRM_ER_LC; - - (*hDecoder)->config.defSampleRate = samplerate; -#ifdef ERROR_RESILIENCE // This shoudl always be defined for DRM - (*hDecoder)->aacSectionDataResilienceFlag = 1; /* VCB11 */ - (*hDecoder)->aacScalefactorDataResilienceFlag = 0; /* no RVLC */ - (*hDecoder)->aacSpectralDataResilienceFlag = 1; /* HCR */ -#endif - (*hDecoder)->frameLength = 960; - (*hDecoder)->sf_index = get_sr_index((*hDecoder)->config.defSampleRate); - (*hDecoder)->object_type = (*hDecoder)->config.defObjectType; - - if ((channels == DRMCH_STEREO) || (channels == DRMCH_SBR_STEREO)) - (*hDecoder)->channelConfiguration = 2; - else - (*hDecoder)->channelConfiguration = 1; - -#ifdef SBR_DEC - if ((channels == DRMCH_MONO) || (channels == DRMCH_STEREO)) - (*hDecoder)->sbr_present_flag = 0; - else - (*hDecoder)->sbr_present_flag = 1; -#endif - - (*hDecoder)->fb = filter_bank_init((*hDecoder)->frameLength); - - return 0; -} -#endif - -void NEAACDECAPI NeAACDecClose(NeAACDecHandle hDecoder) -{ - uint8_t i; - - if (hDecoder == NULL) - return; - -#ifdef PROFILE - printf("AAC decoder total: %I64d cycles\n", hDecoder->cycles); - printf("requant: %I64d cycles\n", hDecoder->requant_cycles); - printf("spectral_data: %I64d cycles\n", hDecoder->spectral_cycles); - printf("scalefactors: %I64d cycles\n", hDecoder->scalefac_cycles); - printf("output: %I64d cycles\n", hDecoder->output_cycles); -#endif - - for (i = 0; i < MAX_CHANNELS; i++) - { - if (hDecoder->time_out[i]) faad_free(hDecoder->time_out[i]); - if (hDecoder->fb_intermed[i]) faad_free(hDecoder->fb_intermed[i]); -#ifdef SSR_DEC - if (hDecoder->ssr_overlap[i]) faad_free(hDecoder->ssr_overlap[i]); - if (hDecoder->prev_fmd[i]) faad_free(hDecoder->prev_fmd[i]); -#endif -#ifdef MAIN_DEC - if (hDecoder->pred_stat[i]) faad_free(hDecoder->pred_stat[i]); -#endif -#ifdef LTP_DEC - if (hDecoder->lt_pred_stat[i]) faad_free(hDecoder->lt_pred_stat[i]); -#endif - } - -#ifdef SSR_DEC - if (hDecoder->object_type == SSR) - ssr_filter_bank_end(hDecoder->fb); - else -#endif - filter_bank_end(hDecoder->fb); - - drc_end(hDecoder->drc); - - if (hDecoder->sample_buffer) faad_free(hDecoder->sample_buffer); - -#ifdef SBR_DEC - for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++) - { - if (hDecoder->sbr[i]) - sbrDecodeEnd(hDecoder->sbr[i]); - } -#endif - - if (hDecoder) faad_free(hDecoder); -} - -void NEAACDECAPI NeAACDecPostSeekReset(NeAACDecHandle hDecoder, int32_t frame) -{ - if (hDecoder) - { - hDecoder->postSeekResetFlag = 1; - - if (frame != -1) - hDecoder->frame = frame; - } -} - -static void create_channel_config(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo) -{ - hInfo->num_front_channels = 0; - hInfo->num_side_channels = 0; - hInfo->num_back_channels = 0; - hInfo->num_lfe_channels = 0; - memset(hInfo->channel_position, 0, MAX_CHANNELS*sizeof(uint8_t)); - - if (hDecoder->downMatrix) - { - hInfo->num_front_channels = 2; - hInfo->channel_position[0] = FRONT_CHANNEL_LEFT; - hInfo->channel_position[1] = FRONT_CHANNEL_RIGHT; - return; - } - - /* check if there is a PCE */ - if (hDecoder->pce_set) - { - uint8_t i, chpos = 0; - uint8_t chdir, back_center = 0; - - hInfo->num_front_channels = hDecoder->pce.num_front_channels; - hInfo->num_side_channels = hDecoder->pce.num_side_channels; - hInfo->num_back_channels = hDecoder->pce.num_back_channels; - hInfo->num_lfe_channels = hDecoder->pce.num_lfe_channels; - - chdir = hInfo->num_front_channels; - if (chdir & 1) - { - hInfo->channel_position[chpos++] = FRONT_CHANNEL_CENTER; - chdir--; - } - for (i = 0; i < chdir; i += 2) - { - hInfo->channel_position[chpos++] = FRONT_CHANNEL_LEFT; - hInfo->channel_position[chpos++] = FRONT_CHANNEL_RIGHT; - } - - for (i = 0; i < hInfo->num_side_channels; i += 2) - { - hInfo->channel_position[chpos++] = SIDE_CHANNEL_LEFT; - hInfo->channel_position[chpos++] = SIDE_CHANNEL_RIGHT; - } - - chdir = hInfo->num_back_channels; - if (chdir & 1) - { - back_center = 1; - chdir--; - } - for (i = 0; i < chdir; i += 2) - { - hInfo->channel_position[chpos++] = BACK_CHANNEL_LEFT; - hInfo->channel_position[chpos++] = BACK_CHANNEL_RIGHT; - } - if (back_center) - { - hInfo->channel_position[chpos++] = BACK_CHANNEL_CENTER; - } - - for (i = 0; i < hInfo->num_lfe_channels; i++) - { - hInfo->channel_position[chpos++] = LFE_CHANNEL; - } - - } else { - switch (hDecoder->channelConfiguration) - { - case 1: - hInfo->num_front_channels = 1; - hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; - break; - case 2: - hInfo->num_front_channels = 2; - hInfo->channel_position[0] = FRONT_CHANNEL_LEFT; - hInfo->channel_position[1] = FRONT_CHANNEL_RIGHT; - break; - case 3: - hInfo->num_front_channels = 3; - hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; - hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; - hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; - break; - case 4: - hInfo->num_front_channels = 3; - hInfo->num_back_channels = 1; - hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; - hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; - hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; - hInfo->channel_position[3] = BACK_CHANNEL_CENTER; - break; - case 5: - hInfo->num_front_channels = 3; - hInfo->num_back_channels = 2; - hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; - hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; - hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; - hInfo->channel_position[3] = BACK_CHANNEL_LEFT; - hInfo->channel_position[4] = BACK_CHANNEL_RIGHT; - break; - case 6: - hInfo->num_front_channels = 3; - hInfo->num_back_channels = 2; - hInfo->num_lfe_channels = 1; - hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; - hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; - hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; - hInfo->channel_position[3] = BACK_CHANNEL_LEFT; - hInfo->channel_position[4] = BACK_CHANNEL_RIGHT; - hInfo->channel_position[5] = LFE_CHANNEL; - break; - case 7: - hInfo->num_front_channels = 3; - hInfo->num_side_channels = 2; - hInfo->num_back_channels = 2; - hInfo->num_lfe_channels = 1; - hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; - hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; - hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; - hInfo->channel_position[3] = SIDE_CHANNEL_LEFT; - hInfo->channel_position[4] = SIDE_CHANNEL_RIGHT; - hInfo->channel_position[5] = BACK_CHANNEL_LEFT; - hInfo->channel_position[6] = BACK_CHANNEL_RIGHT; - hInfo->channel_position[7] = LFE_CHANNEL; - break; - default: /* channelConfiguration == 0 || channelConfiguration > 7 */ - { - uint8_t i; - uint8_t ch = hDecoder->fr_channels - hDecoder->has_lfe; - if (ch & 1) /* there's either a center front or a center back channel */ - { - uint8_t ch1 = (ch-1)/2; - if (hDecoder->first_syn_ele == ID_SCE) - { - hInfo->num_front_channels = ch1 + 1; - hInfo->num_back_channels = ch1; - hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; - for (i = 1; i <= ch1; i+=2) - { - hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; - hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; - } - for (i = ch1+1; i < ch; i+=2) - { - hInfo->channel_position[i] = BACK_CHANNEL_LEFT; - hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; - } - } else { - hInfo->num_front_channels = ch1; - hInfo->num_back_channels = ch1 + 1; - for (i = 0; i < ch1; i+=2) - { - hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; - hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; - } - for (i = ch1; i < ch-1; i+=2) - { - hInfo->channel_position[i] = BACK_CHANNEL_LEFT; - hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; - } - hInfo->channel_position[ch-1] = BACK_CHANNEL_CENTER; - } - } else { - uint8_t ch1 = (ch)/2; - hInfo->num_front_channels = ch1; - hInfo->num_back_channels = ch1; - if (ch1 & 1) - { - hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; - for (i = 1; i <= ch1; i+=2) - { - hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; - hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; - } - for (i = ch1+1; i < ch-1; i+=2) - { - hInfo->channel_position[i] = BACK_CHANNEL_LEFT; - hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; - } - hInfo->channel_position[ch-1] = BACK_CHANNEL_CENTER; - } else { - for (i = 0; i < ch1; i+=2) - { - hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; - hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; - } - for (i = ch1; i < ch; i+=2) - { - hInfo->channel_position[i] = BACK_CHANNEL_LEFT; - hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; - } - } - } - hInfo->num_lfe_channels = hDecoder->has_lfe; - for (i = ch; i < hDecoder->fr_channels; i++) - { - hInfo->channel_position[i] = LFE_CHANNEL; - } - } - break; - } - } -} - -void* NEAACDECAPI NeAACDecDecode(NeAACDecHandle hDecoder, - NeAACDecFrameInfo *hInfo, - uint8_t *buffer, uint32_t buffer_size) -{ - return aac_frame_decode(hDecoder, hInfo, buffer, buffer_size, NULL, 0); -} - -void* NEAACDECAPI NeAACDecDecode2(NeAACDecHandle hDecoder, - NeAACDecFrameInfo *hInfo, - uint8_t *buffer, uint32_t buffer_size, - void **sample_buffer, uint32_t sample_buffer_size) -{ - if ((sample_buffer == NULL) || (sample_buffer_size == 0)) - { - hInfo->error = 27; - return NULL; - } - - return aac_frame_decode(hDecoder, hInfo, buffer, buffer_size, - sample_buffer, sample_buffer_size); -} - -static void* aac_frame_decode(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, - uint8_t *buffer, uint32_t buffer_size, - void **sample_buffer2, uint32_t sample_buffer_size) -{ - uint8_t channels = 0; - uint8_t output_channels = 0; - bitfile ld; - uint32_t bitsconsumed; - uint16_t frame_len; - void *sample_buffer; - -#ifdef PROFILE - int64_t count = faad_get_ts(); -#endif - - /* safety checks */ - if ((hDecoder == NULL) || (hInfo == NULL) || (buffer == NULL)) - { - return NULL; - } - -#if 0 - printf("%d\n", buffer_size*8); -#endif - - frame_len = hDecoder->frameLength; - - - memset(hInfo, 0, sizeof(NeAACDecFrameInfo)); - memset(hDecoder->internal_channel, 0, MAX_CHANNELS*sizeof(hDecoder->internal_channel[0])); - - /* initialize the bitstream */ - faad_initbits(&ld, buffer, buffer_size); - -#if 0 - { - int i; - for (i = 0; i < ((buffer_size+3)>>2); i++) - { - uint8_t *buf; - uint32_t temp = 0; - buf = faad_getbitbuffer(&ld, 32); - //temp = getdword((void*)buf); - temp = *((uint32_t*)buf); - printf("0x%.8X\n", temp); - free(buf); - } - faad_endbits(&ld); - faad_initbits(&ld, buffer, buffer_size); - } -#endif - -#ifdef DRM - if (hDecoder->object_type == DRM_ER_LC) - { - /* We do not support stereo right now */ - if (0) //(hDecoder->channelConfiguration == 2) - { - hInfo->error = 8; // Throw CRC error - goto error; - } - - faad_getbits(&ld, 8 - DEBUGVAR(1,1,"NeAACDecDecode(): skip CRC")); - } -#endif - - if (hDecoder->adts_header_present) - { - adts_header adts; - - adts.old_format = hDecoder->config.useOldADTSFormat; - if ((hInfo->error = adts_frame(&adts, &ld)) > 0) - goto error; - - /* MPEG2 does byte_alignment() here, - * but ADTS header is always multiple of 8 bits in MPEG2 - * so not needed to actually do it. - */ - } - -#ifdef ANALYSIS - dbg_count = 0; -#endif - - /* decode the complete bitstream */ -#ifdef SCALABLE_DEC - if ((hDecoder->object_type == 6) || (hDecoder->object_type == DRM_ER_LC)) - { - aac_scalable_main_element(hDecoder, hInfo, &ld, &hDecoder->pce, hDecoder->drc); - } else { -#endif - raw_data_block(hDecoder, hInfo, &ld, &hDecoder->pce, hDecoder->drc); -#ifdef SCALABLE_DEC - } -#endif - - channels = hDecoder->fr_channels; - - if (hInfo->error > 0) - goto error; - - /* safety check */ - if (channels == 0 || channels > MAX_CHANNELS) - { - /* invalid number of channels */ - hInfo->error = 12; - goto error; - } - - /* no more bit reading after this */ - bitsconsumed = faad_get_processed_bits(&ld); - hInfo->bytesconsumed = bit2byte(bitsconsumed); - if (ld.error) - { - hInfo->error = 14; - goto error; - } - faad_endbits(&ld); - - - if (!hDecoder->adts_header_present && !hDecoder->adif_header_present) - { - if (hDecoder->channelConfiguration == 0) - hDecoder->channelConfiguration = channels; - - if (channels == 8) /* 7.1 */ - hDecoder->channelConfiguration = 7; - if (channels == 7) /* not a standard channelConfiguration */ - hDecoder->channelConfiguration = 0; - } - - if ((channels == 5 || channels == 6) && hDecoder->config.downMatrix) - { - hDecoder->downMatrix = 1; - output_channels = 2; - } else { - output_channels = channels; - } - -#if (defined(PS_DEC) || defined(DRM_PS)) - hDecoder->upMatrix = 0; - /* check if we have a mono file */ - if (output_channels == 1) - { - /* upMatrix to 2 channels for implicit signalling of PS */ - hDecoder->upMatrix = 1; - output_channels = 2; - } -#endif - - /* Make a channel configuration based on either a PCE or a channelConfiguration */ - create_channel_config(hDecoder, hInfo); - - /* number of samples in this frame */ - hInfo->samples = frame_len*output_channels; - /* number of channels in this frame */ - hInfo->channels = output_channels; - /* samplerate */ - hInfo->samplerate = get_sample_rate(hDecoder->sf_index); - /* object type */ - hInfo->object_type = hDecoder->object_type; - /* sbr */ - hInfo->sbr = NO_SBR; - /* header type */ - hInfo->header_type = RAW; - if (hDecoder->adif_header_present) - hInfo->header_type = ADIF; - if (hDecoder->adts_header_present) - hInfo->header_type = ADTS; -#if (defined(PS_DEC) || defined(DRM_PS)) - hInfo->ps = hDecoder->ps_used_global; -#endif - - /* check if frame has channel elements */ - if (channels == 0) - { - hDecoder->frame++; - return NULL; - } - - /* allocate the buffer for the final samples */ - if ((hDecoder->sample_buffer == NULL) || - (hDecoder->alloced_channels != output_channels)) - { - static const uint8_t str[] = { sizeof(int16_t), sizeof(int32_t), sizeof(int32_t), - sizeof(float32_t), sizeof(double), sizeof(int16_t), sizeof(int16_t), - sizeof(int16_t), sizeof(int16_t), 0, 0, 0 - }; - uint8_t stride = str[hDecoder->config.outputFormat-1]; -#ifdef SBR_DEC - if (((hDecoder->sbr_present_flag == 1)&&(!hDecoder->downSampledSBR)) || (hDecoder->forceUpSampling == 1)) - { - stride = 2 * stride; - } -#endif - /* check if we want to use internal sample_buffer */ - if (sample_buffer_size == 0) - { - if (hDecoder->sample_buffer) - faad_free(hDecoder->sample_buffer); - hDecoder->sample_buffer = NULL; - hDecoder->sample_buffer = faad_malloc(frame_len*output_channels*stride); - } else if (sample_buffer_size < frame_len*output_channels*stride) { - /* provided sample buffer is not big enough */ - hInfo->error = 27; - return NULL; - } - hDecoder->alloced_channels = output_channels; - } - - if (sample_buffer_size == 0) - { - sample_buffer = hDecoder->sample_buffer; - } else { - sample_buffer = *sample_buffer2; - } - -#ifdef SBR_DEC - if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) - { - uint8_t ele; - - /* this data is different when SBR is used or when the data is upsampled */ - if (!hDecoder->downSampledSBR) - { - frame_len *= 2; - hInfo->samples *= 2; - hInfo->samplerate *= 2; - } - - /* check if every element was provided with SBR data */ - for (ele = 0; ele < hDecoder->fr_ch_ele; ele++) - { - if (hDecoder->sbr[ele] == NULL) - { - hInfo->error = 25; - goto error; - } - } - - /* sbr */ - if (hDecoder->sbr_present_flag == 1) - { - hInfo->object_type = HE_AAC; - hInfo->sbr = SBR_UPSAMPLED; - } else { - hInfo->sbr = NO_SBR_UPSAMPLED; - } - if (hDecoder->downSampledSBR) - { - hInfo->sbr = SBR_DOWNSAMPLED; - } - } -#endif - - sample_buffer = output_to_PCM(hDecoder, hDecoder->time_out, sample_buffer, - output_channels, frame_len, hDecoder->config.outputFormat); - - - hDecoder->postSeekResetFlag = 0; - - hDecoder->frame++; -#ifdef LD_DEC - if (hDecoder->object_type != LD) - { -#endif - if (hDecoder->frame <= 1) - hInfo->samples = 0; -#ifdef LD_DEC - } else { - /* LD encoders will give lower delay */ - if (hDecoder->frame <= 0) - hInfo->samples = 0; - } -#endif - - /* cleanup */ -#ifdef ANALYSIS - fflush(stdout); -#endif - -#ifdef PROFILE - count = faad_get_ts() - count; - hDecoder->cycles += count; -#endif - - return sample_buffer; - -error: - - faad_endbits(&ld); - - /* cleanup */ -#ifdef ANALYSIS - fflush(stdout); -#endif - - return NULL; -} diff --git a/src/libfaad/decoder.h b/src/libfaad/decoder.h deleted file mode 100644 index 5a3a2663f..000000000 --- a/src/libfaad/decoder.h +++ /dev/null @@ -1,121 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: decoder.h,v 1.9 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#ifndef __DECODER_H__ -#define __DECODER_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _WIN32 - #pragma pack(push, 8) - #ifndef NEAACDECAPI - #define NEAACDECAPI __cdecl - #endif -#else - #ifndef NEAACDECAPI - #define NEAACDECAPI - #endif -#endif - - -/* library output formats */ -#define FAAD_FMT_16BIT 1 -#define FAAD_FMT_24BIT 2 -#define FAAD_FMT_32BIT 3 -#define FAAD_FMT_FLOAT 4 -#define FAAD_FMT_FIXED FAAD_FMT_FLOAT -#define FAAD_FMT_DOUBLE 5 - -#define LC_DEC_CAP (1<<0) -#define MAIN_DEC_CAP (1<<1) -#define LTP_DEC_CAP (1<<2) -#define LD_DEC_CAP (1<<3) -#define ERROR_RESILIENCE_CAP (1<<4) -#define FIXED_POINT_CAP (1<<5) - -#define FRONT_CHANNEL_CENTER (1) -#define FRONT_CHANNEL_LEFT (2) -#define FRONT_CHANNEL_RIGHT (3) -#define SIDE_CHANNEL_LEFT (4) -#define SIDE_CHANNEL_RIGHT (5) -#define BACK_CHANNEL_LEFT (6) -#define BACK_CHANNEL_RIGHT (7) -#define BACK_CHANNEL_CENTER (8) -#define LFE_CHANNEL (9) -#define UNKNOWN_CHANNEL (0) - -char* NEAACDECAPI NeAACDecGetErrorMessage(uint8_t errcode); - -uint32_t NEAACDECAPI NeAACDecGetCapabilities(void); - -NeAACDecHandle NEAACDECAPI NeAACDecOpen(void); - -NeAACDecConfigurationPtr NEAACDECAPI NeAACDecGetCurrentConfiguration(NeAACDecHandle hDecoder); - -uint8_t NEAACDECAPI NeAACDecSetConfiguration(NeAACDecHandle hDecoder, - NeAACDecConfigurationPtr config); - -/* Init the library based on info from the AAC file (ADTS/ADIF) */ -int32_t NEAACDECAPI NeAACDecInit(NeAACDecHandle hDecoder, - uint8_t *buffer, - uint32_t buffer_size, - uint32_t *samplerate, - uint8_t *channels); - -/* Init the library using a DecoderSpecificInfo */ -int8_t NEAACDECAPI NeAACDecInit2(NeAACDecHandle hDecoder, uint8_t *pBuffer, - uint32_t SizeOfDecoderSpecificInfo, - uint32_t *samplerate, uint8_t *channels); - -/* Init the library for DRM */ -int8_t NEAACDECAPI NeAACDecInitDRM(NeAACDecHandle *hDecoder, uint32_t samplerate, - uint8_t channels); - -void NEAACDECAPI NeAACDecClose(NeAACDecHandle hDecoder); - -void NEAACDECAPI NeAACDecPostSeekReset(NeAACDecHandle hDecoder, int32_t frame); - -void* NEAACDECAPI NeAACDecDecode(NeAACDecHandle hDecoder, - NeAACDecFrameInfo *hInfo, - uint8_t *buffer, - uint32_t buffer_size); - -void* NEAACDECAPI NeAACDecDecode2(NeAACDecHandle hDecoder, - NeAACDecFrameInfo *hInfo, - uint8_t *buffer, uint32_t buffer_size, - void **sample_buffer, uint32_t sample_buffer_size); - -#ifdef _WIN32 - #pragma pack(pop) -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/diff_to_faad2_cvs.patch b/src/libfaad/diff_to_faad2_cvs.patch deleted file mode 100644 index 0d8490f2e..000000000 --- a/src/libfaad/diff_to_faad2_cvs.patch +++ /dev/null @@ -1,101 +0,0 @@ ---- faad2-cvs-15092004/libfaad/common.h 2004-09-08 03:43:12.000000000 -0600 -+++ libfaad/common.h 2005-10-29 19:21:53.000000000 -0600 -@@ -147,23 +147,6 @@ - - /* END COMPILE TIME DEFINITIONS */ - --#if defined(_WIN32) && !defined(__MINGW32__) -- --#include <stdlib.h> -- --typedef unsigned __int64 uint64_t; --typedef unsigned __int32 uint32_t; --typedef unsigned __int16 uint16_t; --typedef unsigned __int8 uint8_t; --typedef __int64 int64_t; --typedef __int32 int32_t; --typedef __int16 int16_t; --typedef __int8 int8_t; --typedef float float32_t; -- -- --#else -- - #include <stdio.h> - #if HAVE_SYS_TYPES_H - # include <sys/types.h> -@@ -188,6 +171,8 @@ - #if HAVE_STRINGS_H - # include <strings.h> - #endif -+ -+/* precedence defining int-types by header files for all platforms */ - #if HAVE_INTTYPES_H - # include <inttypes.h> - #else -@@ -195,6 +180,17 @@ - # include <stdint.h> - # else - /* we need these... */ -+# ifdef WIN32 -+typedef unsigned __int64 uint64_t; -+typedef unsigned __int32 uint32_t; -+typedef unsigned __int16 uint16_t; -+typedef unsigned __int8 uint8_t; -+typedef __int64 int64_t; -+typedef __int32 int32_t; -+typedef __int16 int16_t; -+typedef __int8 int8_t; -+# else /* WIN32 */ -+typedef float float32_t; - typedef unsigned long long uint64_t; - typedef unsigned long uint32_t; - typedef unsigned short uint16_t; -@@ -203,6 +199,7 @@ - typedef long int32_t; - typedef short int16_t; - typedef char int8_t; -+# endif /* WIN32 */ - # endif - #endif - #if HAVE_UNISTD_H -@@ -227,8 +224,6 @@ - # endif - #endif - --#endif -- - #ifdef WORDS_BIGENDIAN - #define ARCH_IS_BIG_ENDIAN - #endif -@@ -289,6 +284,7 @@ - } - - -+#ifndef HAVE_LRINTF - #if defined(_WIN32) && !defined(__MINGW32__) - #define HAS_LRINTF - static INLINE int lrintf(float f) -@@ -315,7 +311,7 @@ - return i; - } - #endif -- -+#endif - - #ifdef __ICL /* only Intel C compiler has fmath ??? */ - ---- faad2-cvs-15092004/libfaad/bits.h 2004-09-04 08:56:28.000000000 -0600 -+++ libfaad/bits.h 2005-10-29 19:21:53.000000000 -0600 -@@ -56,9 +56,9 @@ - } bitfile; - - --#if defined (_WIN32) && !defined(_WIN32_WCE) && !defined(__MINGW32__) -+#if defined(_MSC_VER) - #define BSWAP(a) __asm mov eax,a __asm bswap eax __asm mov a, eax --#elif defined(LINUX) || defined(DJGPP) || defined(__MINGW32__) -+#elif defined(LINUX) || defined(DJGPP) || defined (__MINGW32__) || defined (__CYGWIN__) - #define BSWAP(a) __asm__ ( "bswapl %0\n" : "=r" (a) : "0" (a) ) - #else - #define BSWAP(a) \ diff --git a/src/libfaad/drc.c b/src/libfaad/drc.c deleted file mode 100644 index ef4b6a96e..000000000 --- a/src/libfaad/drc.c +++ /dev/null @@ -1,170 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: drc.c,v 1.7 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include <stdlib.h> -#include <string.h> -#include "syntax.h" -#include "drc.h" - -drc_info *drc_init(real_t cut, real_t boost) -{ - drc_info *drc = (drc_info*)faad_malloc(sizeof(drc_info)); - memset(drc, 0, sizeof(drc_info)); - - drc->ctrl1 = cut; - drc->ctrl2 = boost; - - drc->num_bands = 1; - drc->band_top[0] = 1024/4 - 1; - drc->dyn_rng_sgn[0] = 1; - drc->dyn_rng_ctl[0] = 0; - - return drc; -} - -void drc_end(drc_info *drc) -{ - if (drc) faad_free(drc); -} - -#ifdef FIXED_POINT -static real_t drc_pow2_table[] = -{ - COEF_CONST(0.5146511183), - COEF_CONST(0.5297315472), - COEF_CONST(0.5452538663), - COEF_CONST(0.5612310242), - COEF_CONST(0.5776763484), - COEF_CONST(0.5946035575), - COEF_CONST(0.6120267717), - COEF_CONST(0.6299605249), - COEF_CONST(0.6484197773), - COEF_CONST(0.6674199271), - COEF_CONST(0.6869768237), - COEF_CONST(0.7071067812), - COEF_CONST(0.7278265914), - COEF_CONST(0.7491535384), - COEF_CONST(0.7711054127), - COEF_CONST(0.7937005260), - COEF_CONST(0.8169577266), - COEF_CONST(0.8408964153), - COEF_CONST(0.8655365610), - COEF_CONST(0.8908987181), - COEF_CONST(0.9170040432), - COEF_CONST(0.9438743127), - COEF_CONST(0.9715319412), - COEF_CONST(1.0000000000), - COEF_CONST(1.0293022366), - COEF_CONST(1.0594630944), - COEF_CONST(1.0905077327), - COEF_CONST(1.1224620483), - COEF_CONST(1.1553526969), - COEF_CONST(1.1892071150), - COEF_CONST(1.2240535433), - COEF_CONST(1.2599210499), - COEF_CONST(1.2968395547), - COEF_CONST(1.3348398542), - COEF_CONST(1.3739536475), - COEF_CONST(1.4142135624), - COEF_CONST(1.4556531828), - COEF_CONST(1.4983070769), - COEF_CONST(1.5422108254), - COEF_CONST(1.5874010520), - COEF_CONST(1.6339154532), - COEF_CONST(1.6817928305), - COEF_CONST(1.7310731220), - COEF_CONST(1.7817974363), - COEF_CONST(1.8340080864), - COEF_CONST(1.8877486254), - COEF_CONST(1.9430638823) -}; -#endif - -void drc_decode(drc_info *drc, real_t *spec) -{ - uint16_t i, bd, top; -#ifdef FIXED_POINT - int32_t exp, frac; -#else - real_t factor, exp; -#endif - uint16_t bottom = 0; - - if (drc->num_bands == 1) - drc->band_top[0] = 1024/4 - 1; - - for (bd = 0; bd < drc->num_bands; bd++) - { - top = 4 * (drc->band_top[bd] + 1); - -#ifndef FIXED_POINT - /* Decode DRC gain factor */ - if (drc->dyn_rng_sgn[bd]) /* compress */ - exp = -drc->ctrl1 * (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level))/REAL_CONST(24.0); - else /* boost */ - exp = drc->ctrl2 * (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level))/REAL_CONST(24.0); - factor = (real_t)pow(2.0, exp); - - /* Apply gain factor */ - for (i = bottom; i < top; i++) - spec[i] *= factor; -#else - /* Decode DRC gain factor */ - if (drc->dyn_rng_sgn[bd]) /* compress */ - { - exp = -1 * (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level))/ 24; - frac = -1 * (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level)) % 24; - } else { /* boost */ - exp = (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level))/ 24; - frac = (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level)) % 24; - } - - /* Apply gain factor */ - if (exp < 0) - { - for (i = bottom; i < top; i++) - { - spec[i] >>= -exp; - if (frac) - spec[i] = MUL_R(spec[i],drc_pow2_table[frac+23]); - } - } else { - for (i = bottom; i < top; i++) - { - spec[i] <<= exp; - if (frac) - spec[i] = MUL_R(spec[i],drc_pow2_table[frac+23]); - } - } -#endif - - bottom = top; - } -} diff --git a/src/libfaad/drc.h b/src/libfaad/drc.h deleted file mode 100644 index 046ecbc3e..000000000 --- a/src/libfaad/drc.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: drc.h,v 1.7 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#ifndef __DRC_H__ -#define __DRC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define DRC_REF_LEVEL 20*4 /* -20 dB */ - - -drc_info *drc_init(real_t cut, real_t boost); -void drc_end(drc_info *drc); -void drc_decode(drc_info *drc, real_t *spec); - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/drm_dec.c b/src/libfaad/drm_dec.c deleted file mode 100644 index a782b0f22..000000000 --- a/src/libfaad/drm_dec.c +++ /dev/null @@ -1,990 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR and PS decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: drm_dec.c,v 1.1 2005/10/30 00:50:19 tmmm Exp $ -**/ - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <math.h> -#include "common.h" - -#ifdef DRM - -#include "sbr_dec.h" -#include "drm_dec.h" -#include "bits.h" - -/* constants */ -#define DECAY_CUTOFF 3 -#define DECAY_SLOPE 0.05f - -/* type definitaions */ -typedef const int8_t (*drm_ps_huff_tab)[2]; - - -/* binary search huffman tables */ -static const int8_t f_huffman_sa[][2] = -{ - { /*0*/ -15, 1 }, /* index 0: 1 bits: x */ - { 2, 3 }, /* index 1: 2 bits: 1x */ - { /*7*/ -8, 4 }, /* index 2: 3 bits: 10x */ - { 5, 6 }, /* index 3: 3 bits: 11x */ - { /*1*/ -14, /*-1*/ -16 }, /* index 4: 4 bits: 101x */ - { /*-2*/ -17, 7 }, /* index 5: 4 bits: 110x */ - { 8, 9 }, /* index 6: 4 bits: 111x */ - { /*2*/ -13, /*-3*/ -18 }, /* index 7: 5 bits: 1101x */ - { /*3*/ -12, 10 }, /* index 8: 5 bits: 1110x */ - { 11, 12 }, /* index 9: 5 bits: 1111x */ - { /*4*/ -11, /*5*/ -10 }, /* index 10: 6 bits: 11101x */ - { /*-4*/ -19, /*-5*/ -20 }, /* index 11: 6 bits: 11110x */ - { /*6*/ -9, 13 }, /* index 12: 6 bits: 11111x */ - { /*-7*/ -22, /*-6*/ -21 } /* index 13: 7 bits: 111111x */ -}; - -static const int8_t t_huffman_sa[][2] = -{ - { /*0*/ -15, 1 }, /* index 0: 1 bits: x */ - { 2, 3 }, /* index 1: 2 bits: 1x */ - { /*-1*/ -16, /*1*/ -14 }, /* index 2: 3 bits: 10x */ - { 4, 5 }, /* index 3: 3 bits: 11x */ - { /*-2*/ -17, /*2*/ -13 }, /* index 4: 4 bits: 110x */ - { 6, 7 }, /* index 5: 4 bits: 111x */ - { /*-3*/ -18, /*3*/ -12 }, /* index 6: 5 bits: 1110x */ - { 8, 9 }, /* index 7: 5 bits: 1111x */ - { /*-4*/ -19, /*4*/ -11 }, /* index 8: 6 bits: 11110x */ - { 10, 11 }, /* index 9: 6 bits: 11111x */ - { /*-5*/ -20, /*5*/ -10 }, /* index 10: 7 bits: 111110x */ - { /*-6*/ -21, 12 }, /* index 11: 7 bits: 111111x */ - { /*-7*/ -22, 13 }, /* index 12: 8 bits: 1111111x */ - { /*6*/ -9, /*7*/ -8 } /* index 13: 9 bits: 11111111x */ -}; - -static const int8_t f_huffman_pan[][2] = -{ - { /*0*/ -15, 1 }, /* index 0: 1 bits: x */ - { /*-1*/ -16, 2 }, /* index 1: 2 bits: 1x */ - { /*1*/ -14, 3 }, /* index 2: 3 bits: 11x */ - { 4, 5 }, /* index 3: 4 bits: 111x */ - { /*-2*/ -17, /*2*/ -13 }, /* index 4: 5 bits: 1110x */ - { 6, 7 }, /* index 5: 5 bits: 1111x */ - { /*-3*/ -18, /*3*/ -12 }, /* index 6: 6 bits: 11110x */ - { 8, 9 }, /* index 7: 6 bits: 11111x */ - { /*-4*/ -19, /*4*/ -11 }, /* index 8: 7 bits: 111110x */ - { 10, 11 }, /* index 9: 7 bits: 111111x */ - { /*-5*/ -20, /*5*/ -10 }, /* index 10: 8 bits: 1111110x */ - { 12, 13 }, /* index 11: 8 bits: 1111111x */ - { /*-6*/ -21, /*6*/ -9 }, /* index 12: 9 bits: 11111110x */ - { /*-7*/ -22, 14 }, /* index 13: 9 bits: 11111111x */ - { /*7*/ -8, 15 }, /* index 14: 10 bits: 111111111x */ - { 16, 17 }, /* index 15: 11 bits: 1111111111x */ - { /*-8*/ -23, /*8*/ -7 }, /* index 16: 12 bits: 11111111110x */ - { 18, 19 }, /* index 17: 12 bits: 11111111111x */ - { /*-10*/ -25, 20 }, /* index 18: 13 bits: 111111111110x */ - { 21, 22 }, /* index 19: 13 bits: 111111111111x */ - { /*-9*/ -24, /*9*/ -6 }, /* index 20: 14 bits: 1111111111101x */ - { /*10*/ -5, 23 }, /* index 21: 14 bits: 1111111111110x */ - { 24, 25 }, /* index 22: 14 bits: 1111111111111x */ - { /*-13*/ -28, /*-11*/ -26 }, /* index 23: 15 bits: 11111111111101x */ - { /*11*/ -4, /*13*/ -2 }, /* index 24: 15 bits: 11111111111110x */ - { 26, 27 }, /* index 25: 15 bits: 11111111111111x */ - { /*-14*/ -29, /*-12*/ -27 }, /* index 26: 16 bits: 111111111111110x */ - { /*12*/ -3, /*14*/ -1 } /* index 27: 16 bits: 111111111111111x */ -}; - -static const int8_t t_huffman_pan[][2] = -{ - { /*0*/ -15, 1 }, /* index 0: 1 bits: x */ - { /*-1*/ -16, 2 }, /* index 1: 2 bits: 1x */ - { /*1*/ -14, 3 }, /* index 2: 3 bits: 11x */ - { /*-2*/ -17, 4 }, /* index 3: 4 bits: 111x */ - { /*2*/ -13, 5 }, /* index 4: 5 bits: 1111x */ - { /*-3*/ -18, 6 }, /* index 5: 6 bits: 11111x */ - { /*3*/ -12, 7 }, /* index 6: 7 bits: 111111x */ - { /*-4*/ -19, 8 }, /* index 7: 8 bits: 1111111x */ - { /*4*/ -11, 9 }, /* index 8: 9 bits: 11111111x */ - { 10, 11 }, /* index 9: 10 bits: 111111111x */ - { /*-5*/ -20, /*5*/ -10 }, /* index 10: 11 bits: 1111111110x */ - { 12, 13 }, /* index 11: 11 bits: 1111111111x */ - { /*-6*/ -21, /*6*/ -9 }, /* index 12: 12 bits: 11111111110x */ - { 14, 15 }, /* index 13: 12 bits: 11111111111x */ - { /*-7*/ -22, /*7*/ -8 }, /* index 14: 13 bits: 111111111110x */ - { 16, 17 }, /* index 15: 13 bits: 111111111111x */ - { /*-8*/ -23, /*8*/ -7 }, /* index 16: 14 bits: 1111111111110x */ - { 18, 19 }, /* index 17: 14 bits: 1111111111111x */ - { /*-10*/ -25, /*10*/ -5 }, /* index 18: 15 bits: 11111111111110x */ - { 20, 21 }, /* index 19: 15 bits: 11111111111111x */ - { /*-9*/ -24, /*9*/ -6 }, /* index 20: 16 bits: 111111111111110x */ - { 22, 23 }, /* index 21: 16 bits: 111111111111111x */ - { 24, 25 }, /* index 22: 17 bits: 1111111111111110x */ - { 26, 27 }, /* index 23: 17 bits: 1111111111111111x */ - { /*-14*/ -29, /*-13*/ -28 }, /* index 24: 18 bits: 11111111111111100x */ - { /*-12*/ -27, /*-11*/ -26 }, /* index 25: 18 bits: 11111111111111101x */ - { /*11*/ -4, /*12*/ -3 }, /* index 26: 18 bits: 11111111111111110x */ - { /*13*/ -2, /*14*/ -1 } /* index 27: 18 bits: 11111111111111111x */ -}; - -/* There are 3 classes in the standard but the last 2 are identical */ -static const real_t sa_quant[8][2] = -{ - { FRAC_CONST(0.0000), FRAC_CONST(0.0000) }, - { FRAC_CONST(0.0501), FRAC_CONST(0.1778) }, - { FRAC_CONST(0.0706), FRAC_CONST(0.2818) }, - { FRAC_CONST(0.0995), FRAC_CONST(0.4467) }, - { FRAC_CONST(0.1399), FRAC_CONST(0.5623) }, - { FRAC_CONST(0.1957), FRAC_CONST(0.7079) }, - { FRAC_CONST(0.2713), FRAC_CONST(0.8913) }, - { FRAC_CONST(0.3699), FRAC_CONST(1.0000) }, -}; - -/* We don't need the actual quantizer values */ -#if 0 -static const real_t pan_quant[8][5] = -{ - { COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000) }, - { COEF_CONST(0.1661), COEF_CONST(0.1661), COEF_CONST(0.3322), COEF_CONST(0.3322), COEF_CONST(0.3322) }, - { COEF_CONST(0.3322), COEF_CONST(0.3322), COEF_CONST(0.6644), COEF_CONST(0.8305), COEF_CONST(0.8305) }, - { COEF_CONST(0.4983), COEF_CONST(0.6644), COEF_CONST(0.9966), COEF_CONST(1.4949), COEF_CONST(1.6610) }, - { COEF_CONST(0.6644), COEF_CONST(0.9966), COEF_CONST(1.4949), COEF_CONST(2.1593), COEF_CONST(2.4914) }, - { COEF_CONST(0.8305), COEF_CONST(1.3288), COEF_CONST(2.1593), COEF_CONST(2.9897), COEF_CONST(3.4880) }, - { COEF_CONST(0.9966), COEF_CONST(1.8271), COEF_CONST(2.8236), COEF_CONST(3.8202), COEF_CONST(4.6507) }, - { COEF_CONST(1.3288), COEF_CONST(2.3253), COEF_CONST(3.4880), COEF_CONST(4.6507), COEF_CONST(5.8134) }, -}; -#endif - -/* 2^(pan_quant[x][y] */ -static const real_t pan_pow_2_pos[8][5] = { - { REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000) }, - { REAL_CONST(1.1220021), REAL_CONST(1.1220021), REAL_CONST(1.2589312), REAL_CONST(1.2589312), REAL_CONST(1.2589312) }, - { REAL_CONST(1.2589312), REAL_CONST(1.2589312), REAL_CONST(1.5849090), REAL_CONST(1.7783016), REAL_CONST(1.7783016) }, - { REAL_CONST(1.4125481), REAL_CONST(1.5849090), REAL_CONST(1.9952921), REAL_CONST(2.8184461), REAL_CONST(3.1623565) }, - { REAL_CONST(1.5849090), REAL_CONST(1.9952922), REAL_CONST(2.8184461), REAL_CONST(4.4669806), REAL_CONST(5.6232337) }, - { REAL_CONST(1.7783016), REAL_CONST(2.5119365), REAL_CONST(4.4669806), REAL_CONST(7.9430881), REAL_CONST(11.219994) }, - { REAL_CONST(1.9952921), REAL_CONST(3.5482312), REAL_CONST(7.0792671), REAL_CONST(14.125206), REAL_CONST(25.118876) }, - { REAL_CONST(2.5119365), REAL_CONST(5.0116998), REAL_CONST(11.219994), REAL_CONST(25.118876), REAL_CONST(56.235140) } -}; - -/* 2^(-pan_quant[x][y] */ -static const real_t pan_pow_2_neg[8][5] = { - { REAL_CONST(1), REAL_CONST(1), REAL_CONST(1), REAL_CONST(1), REAL_CONST(1) }, - { REAL_CONST(0.8912487), REAL_CONST(0.8912487), REAL_CONST(0.7943242), REAL_CONST(0.7943242), REAL_CONST(0.7943242) }, - { REAL_CONST(0.7943242), REAL_CONST(0.7943242), REAL_CONST(0.6309511), REAL_CONST(0.5623344), REAL_CONST(0.5623344) }, - { REAL_CONST(0.7079405), REAL_CONST(0.6309511), REAL_CONST(0.5011797), REAL_CONST(0.3548054), REAL_CONST(0.3162199) }, - { REAL_CONST(0.6309511), REAL_CONST(0.5011797), REAL_CONST(0.3548054), REAL_CONST(0.2238649), REAL_CONST(0.1778336) }, - { REAL_CONST(0.5623343), REAL_CONST(0.3980992), REAL_CONST(0.2238649), REAL_CONST(0.1258956), REAL_CONST(0.0891266) }, - { REAL_CONST(0.5011797), REAL_CONST(0.2818306), REAL_CONST(0.1412576), REAL_CONST(0.0707954), REAL_CONST(0.0398107) }, - { REAL_CONST(0.3980992), REAL_CONST(0.1995331), REAL_CONST(0.0891267), REAL_CONST(0.0398107), REAL_CONST(0.0177825) } -}; - -/* 2^(pan_quant[x][y]/30) */ -static const real_t pan_pow_2_30_pos[8][5] = { - { COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1) }, - { COEF_CONST(1.003845098), COEF_CONST(1.003845098), COEF_CONST(1.007704982), COEF_CONST(1.007704982), COEF_CONST(1.007704982) }, - { COEF_CONST(1.007704982), COEF_CONST(1.007704982), COEF_CONST(1.01546933), COEF_CONST(1.019373909), COEF_CONST(1.019373909) }, - { COEF_CONST(1.011579706), COEF_CONST(1.01546933), COEF_CONST(1.023293502), COEF_CONST(1.035142941), COEF_CONST(1.039123167) }, - { COEF_CONST(1.01546933), COEF_CONST(1.023293502), COEF_CONST(1.035142941), COEF_CONST(1.051155908), COEF_CONST(1.059252598) }, - { COEF_CONST(1.019373909), COEF_CONST(1.03117796), COEF_CONST(1.051155908), COEF_CONST(1.071518432), COEF_CONST(1.0839263) }, - { COEF_CONST(1.023293502), COEF_CONST(1.043118698), COEF_CONST(1.067414119), COEF_CONST(1.092277933), COEF_CONST(1.113439626) }, - { COEF_CONST(1.03117796), COEF_CONST(1.055195268), COEF_CONST(1.0839263), COEF_CONST(1.113439626), COEF_CONST(1.143756546) } -}; - -/* 2^(-pan_quant[x][y]/30) */ -static const real_t pan_pow_2_30_neg[8][5] = { - { COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1) }, - { COEF_CONST(0.99616963), COEF_CONST(0.99616963), COEF_CONST(0.992353931), COEF_CONST(0.992353931), COEF_CONST(0.99235393) }, - { COEF_CONST(0.992353931), COEF_CONST(0.992353931), COEF_CONST(0.984766325), COEF_CONST(0.980994305), COEF_CONST(0.980994305) }, - { COEF_CONST(0.988552848), COEF_CONST(0.984766325), COEF_CONST(0.977236734), COEF_CONST(0.966050157), COEF_CONST(0.962349827) }, - { COEF_CONST(0.984766325), COEF_CONST(0.977236734), COEF_CONST(0.966050157), COEF_CONST(0.951333663), COEF_CONST(0.944061881) }, - { COEF_CONST(0.980994305), COEF_CONST(0.969764715), COEF_CONST(0.951333663), COEF_CONST(0.933255062), COEF_CONST(0.922571949) }, - { COEF_CONST(0.977236734), COEF_CONST(0.958663671), COEF_CONST(0.936843519), COEF_CONST(0.915517901), COEF_CONST(0.898117847) }, - { COEF_CONST(0.969764715), COEF_CONST(0.947691892), COEF_CONST(0.922571949), COEF_CONST(0.898117847), COEF_CONST(0.874311936) } -}; - -static const real_t g_decayslope[MAX_SA_BAND] = { - FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.95),FRAC_CONST(0.9), FRAC_CONST(0.85), FRAC_CONST(0.8), - FRAC_CONST(0.75),FRAC_CONST(0.7), FRAC_CONST(0.65),FRAC_CONST(0.6), FRAC_CONST(0.55),FRAC_CONST(0.5), FRAC_CONST(0.45), - FRAC_CONST(0.4), FRAC_CONST(0.35),FRAC_CONST(0.3), FRAC_CONST(0.25),FRAC_CONST(0.2), FRAC_CONST(0.15), FRAC_CONST(0.1), - FRAC_CONST(0.05),FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), - FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), - FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), - FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0) -}; - -static const real_t sa_sqrt_1_minus[8][2] = { - { FRAC_CONST(1), FRAC_CONST(1) }, - { FRAC_CONST(0.998744206), FRAC_CONST(0.984066644) }, - { FRAC_CONST(0.997504707), FRAC_CONST(0.959473168) }, - { FRAC_CONST(0.995037562), FRAC_CONST(0.894683804) }, - { FRAC_CONST(0.990165638), FRAC_CONST(0.826933317) }, - { FRAC_CONST(0.980663811), FRAC_CONST(0.706312672) }, - { FRAC_CONST(0.962494836), FRAC_CONST(0.45341406) }, - { FRAC_CONST(0.929071574), FRAC_CONST(0) } -}; - -static const uint8_t sa_freq_scale[9][2] = -{ - { 0, 0}, - { 1, 1}, - { 2, 2}, - { 3, 3}, - { 5, 5}, - { 7, 7}, - {10,10}, - {13,13}, - {46,23} -}; - -static const uint8_t pan_freq_scale[21] = -{ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 18, 22, 26, 32, 64 -}; - -static const uint8_t pan_quant_class[20] = -{ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 2, 2, 3, 3, 3, 4, 4, 4 -}; - -/* Inverse mapping lookup */ -static const uint8_t pan_inv_freq[64] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19 -}; - -static const uint8_t sa_inv_freq[MAX_SA_BAND] = { - 0, 1, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7 -}; - -static const real_t filter_coeff[] = -{ - FRAC_CONST(0.65143905754106), - FRAC_CONST(0.56471812200776), - FRAC_CONST(0.48954165955695) -}; - -static const uint8_t delay_length[][2] = -{ - { 1, 3 }, { 2, 4 }, { 3, 5 } -}; - -static const real_t delay_fraction[] = -{ - FRAC_CONST(0.43), FRAC_CONST(0.75), FRAC_CONST(0.347) -}; - -static const real_t peak_decay[2] = -{ - FRAC_CONST(0.58664621951003), FRAC_CONST(0.76592833836465) -}; - -static const real_t smooth_coeff[2] = -{ - FRAC_CONST(0.6), FRAC_CONST(0.25) -}; - -/* Please note that these are the same tables as in plain PS */ -static const complex_t Q_Fract_allpass_Qmf[][3] = { - { { FRAC_CONST(0.7804303765), FRAC_CONST(0.6252426505) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.8550928831), FRAC_CONST(0.5184748173) } }, - { { FRAC_CONST(-0.4399392009), FRAC_CONST(0.8980275393) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.0643581524), FRAC_CONST(0.9979268909) } }, - { { FRAC_CONST(-0.9723699093), FRAC_CONST(-0.2334454209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.9146071672), FRAC_CONST(0.4043435752) } }, - { { FRAC_CONST(0.0157073960), FRAC_CONST(-0.9998766184) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7814115286), FRAC_CONST(-0.6240159869) } }, - { { FRAC_CONST(0.9792228341), FRAC_CONST(-0.2027871907) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.1920081824), FRAC_CONST(-0.9813933372) } }, - { { FRAC_CONST(0.4115142524), FRAC_CONST(0.9114032984) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9589683414), FRAC_CONST(-0.2835132182) } }, - { { FRAC_CONST(-0.7996847630), FRAC_CONST(0.6004201174) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.6947838664), FRAC_CONST(0.7192186117) } }, - { { FRAC_CONST(-0.7604058385), FRAC_CONST(-0.6494481564) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3164770305), FRAC_CONST(0.9486001730) } }, - { { FRAC_CONST(0.4679299891), FRAC_CONST(-0.8837655187) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9874414206), FRAC_CONST(0.1579856575) } }, - { { FRAC_CONST(0.9645573497), FRAC_CONST(0.2638732493) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.5966450572), FRAC_CONST(-0.8025052547) } }, - { { FRAC_CONST(-0.0471066870), FRAC_CONST(0.9988898635) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.4357025325), FRAC_CONST(-0.9000906944) } }, - { { FRAC_CONST(-0.9851093888), FRAC_CONST(0.1719288528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9995546937), FRAC_CONST(-0.0298405960) } }, - { { FRAC_CONST(-0.3826831877), FRAC_CONST(-0.9238796234) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.4886211455), FRAC_CONST(0.8724960685) } }, - { { FRAC_CONST(0.8181498647), FRAC_CONST(-0.5750049949) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.5477093458), FRAC_CONST(0.8366686702) } }, - { { FRAC_CONST(0.7396308780), FRAC_CONST(0.6730127335) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9951074123), FRAC_CONST(-0.0987988561) } }, - { { FRAC_CONST(-0.4954589605), FRAC_CONST(0.8686313629) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3725017905), FRAC_CONST(-0.9280315042) } }, - { { FRAC_CONST(-0.9557929039), FRAC_CONST(-0.2940406799) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.6506417990), FRAC_CONST(-0.7593847513) } }, - { { FRAC_CONST(0.0784594864), FRAC_CONST(-0.9969173074) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9741733670), FRAC_CONST(0.2258014232) } }, - { { FRAC_CONST(0.9900237322), FRAC_CONST(-0.1409008205) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.2502108514), FRAC_CONST(0.9681913853) } }, - { { FRAC_CONST(0.3534744382), FRAC_CONST(0.9354441762) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7427945137), FRAC_CONST(0.6695194840) } }, - { { FRAC_CONST(-0.8358076215), FRAC_CONST(0.5490224361) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9370992780), FRAC_CONST(-0.3490629196) } }, - { { FRAC_CONST(-0.7181259394), FRAC_CONST(-0.6959131360) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.1237744763), FRAC_CONST(-0.9923103452) } }, - { { FRAC_CONST(0.5224990249), FRAC_CONST(-0.8526399136) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.8226406574), FRAC_CONST(-0.5685616732) } }, - { { FRAC_CONST(0.9460852146), FRAC_CONST(0.3239179254) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.8844994903), FRAC_CONST(0.4665412009) } }, - { { FRAC_CONST(-0.1097348556), FRAC_CONST(0.9939609170) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.0047125919), FRAC_CONST(0.9999889135) } }, - { { FRAC_CONST(-0.9939610362), FRAC_CONST(0.1097337380) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8888573647), FRAC_CONST(0.4581840038) } }, - { { FRAC_CONST(-0.3239168525), FRAC_CONST(-0.9460855722) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8172453642), FRAC_CONST(-0.5762898922) } }, - { { FRAC_CONST(0.8526405096), FRAC_CONST(-0.5224980116) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.1331215799), FRAC_CONST(-0.9910997152) } }, - { { FRAC_CONST(0.6959123611), FRAC_CONST(0.7181267142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9403476119), FRAC_CONST(-0.3402152061) } }, - { { FRAC_CONST(-0.5490233898), FRAC_CONST(0.8358070254) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7364512086), FRAC_CONST(0.6764906645) } }, - { { FRAC_CONST(-0.9354437590), FRAC_CONST(-0.3534754813) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2593250275), FRAC_CONST(0.9657900929) } }, - { { FRAC_CONST(0.1409019381), FRAC_CONST(-0.9900235534) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9762582779), FRAC_CONST(0.2166097313) } }, - { { FRAC_CONST(0.9969173670), FRAC_CONST(-0.0784583688) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.6434556246), FRAC_CONST(-0.7654833794) } }, - { { FRAC_CONST(0.2940396070), FRAC_CONST(0.9557932615) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3812320232), FRAC_CONST(-0.9244794250) } }, - { { FRAC_CONST(-0.8686318994), FRAC_CONST(0.4954580069) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9959943891), FRAC_CONST(-0.0894154981) } }, - { { FRAC_CONST(-0.6730118990), FRAC_CONST(-0.7396316528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.5397993922), FRAC_CONST(0.8417937160) } }, - { { FRAC_CONST(0.5750059485), FRAC_CONST(-0.8181492686) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.4968227744), FRAC_CONST(0.8678520322) } }, - { { FRAC_CONST(0.9238792062), FRAC_CONST(0.3826842010) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9992290139), FRAC_CONST(-0.0392601527) } }, - { { FRAC_CONST(-0.1719299555), FRAC_CONST(0.9851091504) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4271997511), FRAC_CONST(-0.9041572809) } }, - { { FRAC_CONST(-0.9988899231), FRAC_CONST(0.0471055657) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.6041822433), FRAC_CONST(-0.7968461514) } }, - { { FRAC_CONST(-0.2638721764), FRAC_CONST(-0.9645576477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9859085083), FRAC_CONST(0.1672853529) } }, - { { FRAC_CONST(0.8837660551), FRAC_CONST(-0.4679289758) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3075223565), FRAC_CONST(0.9515408874) } }, - { { FRAC_CONST(0.6494473219), FRAC_CONST(0.7604066133) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.7015317082), FRAC_CONST(0.7126382589) } }, - { { FRAC_CONST(-0.6004210114), FRAC_CONST(0.7996840477) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9562535882), FRAC_CONST(-0.2925389707) } }, - { { FRAC_CONST(-0.9114028811), FRAC_CONST(-0.4115152657) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.1827499419), FRAC_CONST(-0.9831594229) } }, - { { FRAC_CONST(0.2027882934), FRAC_CONST(-0.9792225957) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7872582674), FRAC_CONST(-0.6166234016) } }, - { { FRAC_CONST(0.9998766780), FRAC_CONST(-0.0157062728) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9107555747), FRAC_CONST(0.4129458666) } }, - { { FRAC_CONST(0.2334443331), FRAC_CONST(0.9723701477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.0549497530), FRAC_CONST(0.9984891415) } }, - { { FRAC_CONST(-0.8980280757), FRAC_CONST(0.4399381876) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.8599416018), FRAC_CONST(0.5103924870) } }, - { { FRAC_CONST(-0.6252418160), FRAC_CONST(-0.7804310918) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8501682281), FRAC_CONST(-0.5265110731) } }, - { { FRAC_CONST(0.6252435446), FRAC_CONST(-0.7804297209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.0737608299), FRAC_CONST(-0.9972759485) } }, - { { FRAC_CONST(0.8980270624), FRAC_CONST(0.4399402142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9183775187), FRAC_CONST(-0.3957053721) } }, - { { FRAC_CONST(-0.2334465086), FRAC_CONST(0.9723696709) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.7754954696), FRAC_CONST(0.6313531399) } }, - { { FRAC_CONST(-0.9998766184), FRAC_CONST(-0.0157085191) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2012493610), FRAC_CONST(0.9795400500) } }, - { { FRAC_CONST(-0.2027861029), FRAC_CONST(-0.9792230725) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9615978599), FRAC_CONST(0.2744622827) } }, - { { FRAC_CONST(0.9114037752), FRAC_CONST(-0.4115132093) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.6879743338), FRAC_CONST(-0.7257350087) } }, - { { FRAC_CONST(0.6004192233), FRAC_CONST(0.7996854186) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.3254036009), FRAC_CONST(-0.9455752373) } }, - { { FRAC_CONST(-0.6494490504), FRAC_CONST(0.7604051232) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9888865948), FRAC_CONST(-0.1486719251) } }, - { { FRAC_CONST(-0.8837650418), FRAC_CONST(-0.4679309726) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.5890548825), FRAC_CONST(0.8080930114) } }, - { { FRAC_CONST(0.2638743520), FRAC_CONST(-0.9645570517) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.4441666007), FRAC_CONST(0.8959442377) } }, - { { FRAC_CONST(0.9988898039), FRAC_CONST(0.0471078083) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9997915030), FRAC_CONST(0.0204183888) } }, - { { FRAC_CONST(0.1719277352), FRAC_CONST(0.9851095676) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4803760946), FRAC_CONST(-0.8770626187) } }, - { { FRAC_CONST(-0.9238800406), FRAC_CONST(0.3826821446) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.5555707216), FRAC_CONST(-0.8314692974) } }, - { { FRAC_CONST(-0.5750041008), FRAC_CONST(-0.8181505203) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9941320419), FRAC_CONST(0.1081734300) } } -}; - -static const complex_t Phi_Fract_Qmf[] = { - { FRAC_CONST(0.8181497455), FRAC_CONST(0.5750052333) }, - { FRAC_CONST(-0.2638730407), FRAC_CONST(0.9645574093) }, - { FRAC_CONST(-0.9969173074), FRAC_CONST(0.0784590989) }, - { FRAC_CONST(-0.4115143716), FRAC_CONST(-0.9114032984) }, - { FRAC_CONST(0.7181262970), FRAC_CONST(-0.6959127784) }, - { FRAC_CONST(0.8980275989), FRAC_CONST(0.4399391711) }, - { FRAC_CONST(-0.1097343117), FRAC_CONST(0.9939609766) }, - { FRAC_CONST(-0.9723699093), FRAC_CONST(0.2334453613) }, - { FRAC_CONST(-0.5490227938), FRAC_CONST(-0.8358073831) }, - { FRAC_CONST(0.6004202366), FRAC_CONST(-0.7996846437) }, - { FRAC_CONST(0.9557930231), FRAC_CONST(0.2940403223) }, - { FRAC_CONST(0.0471064523), FRAC_CONST(0.9988898635) }, - { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, - { FRAC_CONST(-0.6730124950), FRAC_CONST(-0.7396311164) }, - { FRAC_CONST(0.4679298103), FRAC_CONST(-0.8837656379) }, - { FRAC_CONST(0.9900236726), FRAC_CONST(0.1409012377) }, - { FRAC_CONST(0.2027872950), FRAC_CONST(0.9792228341) }, - { FRAC_CONST(-0.8526401520), FRAC_CONST(0.5224985480) }, - { FRAC_CONST(-0.7804304361), FRAC_CONST(-0.6252426505) }, - { FRAC_CONST(0.3239174187), FRAC_CONST(-0.9460853338) }, - { FRAC_CONST(0.9998766184), FRAC_CONST(-0.0157073177) }, - { FRAC_CONST(0.3534748554), FRAC_CONST(0.9354440570) }, - { FRAC_CONST(-0.7604059577), FRAC_CONST(0.6494480371) }, - { FRAC_CONST(-0.8686315417), FRAC_CONST(-0.4954586625) }, - { FRAC_CONST(0.1719291061), FRAC_CONST(-0.9851093292) }, - { FRAC_CONST(0.9851093292), FRAC_CONST(-0.1719291061) }, - { FRAC_CONST(0.4954586625), FRAC_CONST(0.8686315417) }, - { FRAC_CONST(-0.6494480371), FRAC_CONST(0.7604059577) }, - { FRAC_CONST(-0.9354440570), FRAC_CONST(-0.3534748554) }, - { FRAC_CONST(0.0157073177), FRAC_CONST(-0.9998766184) }, - { FRAC_CONST(0.9460853338), FRAC_CONST(-0.3239174187) }, - { FRAC_CONST(0.6252426505), FRAC_CONST(0.7804304361) }, - { FRAC_CONST(-0.5224985480), FRAC_CONST(0.8526401520) }, - { FRAC_CONST(-0.9792228341), FRAC_CONST(-0.2027872950) }, - { FRAC_CONST(-0.1409012377), FRAC_CONST(-0.9900236726) }, - { FRAC_CONST(0.8837656379), FRAC_CONST(-0.4679298103) }, - { FRAC_CONST(0.7396311164), FRAC_CONST(0.6730124950) }, - { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, - { FRAC_CONST(-0.9988898635), FRAC_CONST(-0.0471064523) }, - { FRAC_CONST(-0.2940403223), FRAC_CONST(-0.9557930231) }, - { FRAC_CONST(0.7996846437), FRAC_CONST(-0.6004202366) }, - { FRAC_CONST(0.8358073831), FRAC_CONST(0.5490227938) }, - { FRAC_CONST(-0.2334453613), FRAC_CONST(0.9723699093) }, - { FRAC_CONST(-0.9939609766), FRAC_CONST(0.1097343117) }, - { FRAC_CONST(-0.4399391711), FRAC_CONST(-0.8980275989) }, - { FRAC_CONST(0.6959127784), FRAC_CONST(-0.7181262970) }, - { FRAC_CONST(0.9114032984), FRAC_CONST(0.4115143716) }, - { FRAC_CONST(-0.0784590989), FRAC_CONST(0.9969173074) }, - { FRAC_CONST(-0.9645574093), FRAC_CONST(0.2638730407) }, - { FRAC_CONST(-0.5750052333), FRAC_CONST(-0.8181497455) }, - { FRAC_CONST(0.5750052333), FRAC_CONST(-0.8181497455) }, - { FRAC_CONST(0.9645574093), FRAC_CONST(0.2638730407) }, - { FRAC_CONST(0.0784590989), FRAC_CONST(0.9969173074) }, - { FRAC_CONST(-0.9114032984), FRAC_CONST(0.4115143716) }, - { FRAC_CONST(-0.6959127784), FRAC_CONST(-0.7181262970) }, - { FRAC_CONST(0.4399391711), FRAC_CONST(-0.8980275989) }, - { FRAC_CONST(0.9939609766), FRAC_CONST(0.1097343117) }, - { FRAC_CONST(0.2334453613), FRAC_CONST(0.9723699093) }, - { FRAC_CONST(-0.8358073831), FRAC_CONST(0.5490227938) }, - { FRAC_CONST(-0.7996846437), FRAC_CONST(-0.6004202366) }, - { FRAC_CONST(0.2940403223), FRAC_CONST(-0.9557930231) }, - { FRAC_CONST(0.9988898635), FRAC_CONST(-0.0471064523) }, - { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, - { FRAC_CONST(-0.7396311164), FRAC_CONST(0.6730124950) } -}; - - -/* static function declarations */ -static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld); -static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld); -static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff); - - -uint16_t drm_ps_data(drm_ps_info *ps, bitfile *ld) -{ - uint16_t bits = (uint16_t)faad_get_processed_bits(ld); - - ps->drm_ps_data_available = 1; - - ps->bs_enable_sa = faad_get1bit(ld); - ps->bs_enable_pan = faad_get1bit(ld); - - if (ps->bs_enable_sa) - { - drm_ps_sa_element(ps, ld); - } - - if (ps->bs_enable_pan) - { - drm_ps_pan_element(ps, ld); - } - - bits = (uint16_t)faad_get_processed_bits(ld) - bits; - - return bits; -} - -static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld) -{ - drm_ps_huff_tab huff; - uint8_t band; - - ps->bs_sa_dt_flag = faad_get1bit(ld); - if (ps->bs_sa_dt_flag) - { - huff = t_huffman_sa; - } else { - huff = f_huffman_sa; - } - - for (band = 0; band < DRM_NUM_SA_BANDS; band++) - { - ps->bs_sa_data[band] = huff_dec(ld, huff); - } -} - -static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld) -{ - drm_ps_huff_tab huff; - uint8_t band; - - ps->bs_pan_dt_flag = faad_get1bit(ld); - if (ps->bs_pan_dt_flag) - { - huff = t_huffman_pan; - } else { - huff = f_huffman_pan; - } - - for (band = 0; band < DRM_NUM_PAN_BANDS; band++) - { - ps->bs_pan_data[band] = huff_dec(ld, huff); - } -} - -/* binary search huffman decoding */ -static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff) -{ - uint8_t bit; - int16_t index = 0; - - while (index >= 0) - { - bit = (uint8_t)faad_get1bit(ld); - index = huff[index][bit]; - } - - return index + 15; -} - - -static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i) -{ - if (i < 0) { - /* printf(" SAminclip %d", i); */ - ps->sa_decode_error = 1; - return 0; - } else if (i > 7) { - /* printf(" SAmaxclip %d", i); */ - ps->sa_decode_error = 1; - return 7; - } else - return i; -} - -static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i) -{ - if (i < -7) { - /* printf(" PANminclip %d", i); */ - ps->pan_decode_error = 1; - return -7; - } else if (i > 7) { - /* printf(" PANmaxclip %d", i); */ - ps->pan_decode_error = 1; - return 7; - } else - return i; -} - -static void drm_ps_delta_decode(drm_ps_info *ps) -{ - uint8_t band; - - if (ps->bs_enable_sa) - { - if (ps->bs_sa_dt_flag && !ps->g_last_had_sa) - { - for (band = 0; band < DRM_NUM_SA_BANDS; band++) - { - ps->g_prev_sa_index[band] = 0; - } - } - if (ps->bs_sa_dt_flag) - { - ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]); - - } else { - ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]); - } - - for (band = 1; band < DRM_NUM_SA_BANDS; band++) - { - if (ps->bs_sa_dt_flag) - { - ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]); - } else { - ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]); - } - } - } - - /* An error during SA decoding implies PAN data will be undecodable, too */ - /* Also, we don't like on/off switching in PS, so we force to last settings */ - if (ps->sa_decode_error) { - ps->pan_decode_error = 1; - ps->bs_enable_pan = ps->g_last_had_pan; - ps->bs_enable_sa = ps->g_last_had_sa; - } - - - if (ps->bs_enable_sa) - { - if (ps->sa_decode_error) { - for (band = 0; band < DRM_NUM_SA_BANDS; band++) - { - ps->g_sa_index[band] = ps->g_last_good_sa_index[band]; - } - } else { - for (band = 0; band < DRM_NUM_SA_BANDS; band++) - { - ps->g_last_good_sa_index[band] = ps->g_sa_index[band]; - } - } - } - - if (ps->bs_enable_pan) - { - if (ps->bs_pan_dt_flag && !ps->g_last_had_pan) - { -/* The DRM PS spec doesn't say anything about this case. (deltacoded in time without a previous frame) - AAC PS spec you must tread previous frame as 0, so that's what we try. -*/ - for (band = 0; band < DRM_NUM_PAN_BANDS; band++) - { - ps->g_prev_pan_index[band] = 0; - } - } - - if (ps->bs_pan_dt_flag) - { - ps->g_pan_index[0] = pan_delta_clip(ps, ps->g_prev_pan_index[0]+ps->bs_pan_data[0]); - } else { - ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]); - } - - for (band = 1; band < DRM_NUM_PAN_BANDS; band++) - { - if (ps->bs_pan_dt_flag) - { - ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]); - } else { - ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]); - } - } - - if (ps->pan_decode_error) { - for (band = 0; band < DRM_NUM_PAN_BANDS; band++) - { - ps->g_pan_index[band] = ps->g_last_good_pan_index[band]; - } - } else { - for (band = 0; band < DRM_NUM_PAN_BANDS; band++) - { - ps->g_last_good_pan_index[band] = ps->g_pan_index[band]; - } - } - } -} - -static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64], uint8_t rateselect) -{ - uint8_t s, b, k; - complex_t qfrac, tmp0, tmp, in, R0; - real_t peakdiff; - real_t nrg; - real_t power; - real_t transratio; - real_t new_delay_slopes[NUM_OF_LINKS]; - uint8_t temp_delay_ser[NUM_OF_LINKS]; - complex_t Phi_Fract; -#ifdef FIXED_POINT - uint32_t in_re, in_im; -#endif - - for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b++) - { - /* set delay indices */ - for (k = 0; k < NUM_OF_LINKS; k++) - temp_delay_ser[k] = ps->delay_buf_index_ser[k]; - - RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]); - IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]); - - for (s = 0; s < NUM_OF_SUBSAMPLES; s++) - { - const real_t gamma = REAL_CONST(1.5); - const real_t sigma = REAL_CONST(1.5625); - - RE(in) = QMF_RE(X[s][b]); - IM(in) = QMF_IM(X[s][b]); - -#ifdef FIXED_POINT - /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF - * meaning that P will be scaled by 2^(-10) compared to floating point version - */ - in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS); - in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS); - power = in_re*in_re + in_im*in_im; -#else - power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in)); -#endif - - ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay[rateselect]); - if (ps->peakdecay_fast[b] < power) - ps->peakdecay_fast[b] = power; - - peakdiff = ps->prev_peakdiff[b]; - peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff[rateselect]); - ps->prev_peakdiff[b] = peakdiff; - - nrg = ps->prev_nrg[b]; - nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff[rateselect]); - ps->prev_nrg[b] = nrg; - - if (MUL_R(peakdiff, gamma) <= nrg) { - transratio = sigma; - } else { - transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma); - } - - for (k = 0; k < NUM_OF_LINKS; k++) - { - new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]); - } - - RE(tmp0) = RE(ps->d_buff[0][b]); - IM(tmp0) = IM(ps->d_buff[0][b]); - - RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]); - IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]); - - RE(ps->d_buff[1][b]) = RE(in); - IM(ps->d_buff[1][b]) = IM(in); - - ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract)); - - RE(R0) = RE(tmp); - IM(R0) = IM(tmp); - - for (k = 0; k < NUM_OF_LINKS; k++) - { - RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]); - IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]); - - RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]); - IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]); - - ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac)); - - RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0)); - IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0)); - - RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp)); - IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp)); - - RE(R0) = RE(tmp); - IM(R0) = IM(tmp); - } - - QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio); - QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio); - - for (k = 0; k < NUM_OF_LINKS; k++) - { - if (++temp_delay_ser[k] >= delay_length[k][rateselect]) - temp_delay_ser[k] = 0; - } - } - } - - for (k = 0; k < NUM_OF_LINKS; k++) - ps->delay_buf_index_ser[k] = temp_delay_ser[k]; -} - -static void drm_add_ambiance(drm_ps_info *ps, uint8_t rateselect, qmf_t X_left[38][64], qmf_t X_right[38][64]) -{ - uint8_t s, b, ifreq, qclass; - real_t sa_map[MAX_SA_BAND], sa_dir_map[MAX_SA_BAND], k_sa_map[MAX_SA_BAND], k_sa_dir_map[MAX_SA_BAND]; - real_t new_dir_map, new_sa_map; - - if (ps->bs_enable_sa) - { - /* Instead of dequantization and mapping, we use an inverse mapping - to look up all the values we need */ - for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b++) - { - const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333); - - ifreq = sa_inv_freq[b]; - qclass = (b != 0); - - sa_map[b] = sa_quant[ps->g_prev_sa_index[ifreq]][qclass]; - new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass]; - - k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b])); - - sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass]; - new_dir_map = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass]; - - k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b])); - - } - - for (s = 0; s < NUM_OF_SUBSAMPLES; s++) - { - for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b++) - { - QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]); - QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]); - QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]); - QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]); - - sa_map[b] += k_sa_map[b]; - sa_dir_map[b] += k_sa_dir_map[b]; - } - for (b = sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b < NUM_OF_QMF_CHANNELS; b++) - { - QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]); - QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]); - } - } - } - else { - for (s = 0; s < NUM_OF_SUBSAMPLES; s++) - { - for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) - { - QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]); - QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]); - } - } - } -} - -static void drm_add_pan(drm_ps_info *ps, uint8_t rateselect, qmf_t X_left[38][64], qmf_t X_right[38][64]) -{ - uint8_t s, b, qclass, ifreq; - real_t tmp, coeff1, coeff2; - real_t pan_base[MAX_PAN_BAND]; - real_t pan_delta[MAX_PAN_BAND]; - qmf_t temp_l, temp_r; - - if (ps->bs_enable_pan) - { - for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) - { - /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an - inverse mapping 64->20 and look up the 2^G(x,y) values directly */ - ifreq = pan_inv_freq[b]; - qclass = pan_quant_class[ifreq]; - - if (ps->g_prev_pan_index[ifreq] >= 0) - { - pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass]; - } else { - pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass]; - } - - /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */ - /* a en b can be negative so we may need to inverse parts */ - if (ps->g_pan_index[ifreq] >= 0) - { - if (ps->g_prev_pan_index[ifreq] >= 0) - { - pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass], - pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]); - } else { - pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass], - pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]); - } - } else { - if (ps->g_prev_pan_index[ifreq] >= 0) - { - pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass], - pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]); - } else { - pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass], - pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]); - } - } - } - - for (s = 0; s < NUM_OF_SUBSAMPLES; s++) - { - /* PAN always uses all 64 channels */ - for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) - { - tmp = pan_base[b]; - - coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp)); - coeff1 = MUL_R(coeff2, tmp); - - QMF_RE(temp_l) = QMF_RE(X_left[s][b]); - QMF_IM(temp_l) = QMF_IM(X_left[s][b]); - QMF_RE(temp_r) = QMF_RE(X_right[s][b]); - QMF_IM(temp_r) = QMF_IM(X_right[s][b]); - - QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1); - QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1); - QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2); - QMF_IM(X_right[s][b]) = MUL_R(QMF_IM(temp_r), coeff2); - - /* 2^(a+k*b) = 2^a * 2^b * ... * 2^b */ - /* ^^^^^^^^^^^^^^^ k times */ - pan_base[b] = MUL_C(pan_base[b], pan_delta[b]); - } - } - } -} - -drm_ps_info *drm_ps_init(void) -{ - drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info)); - - memset(ps, 0, sizeof(drm_ps_info)); - - return ps; -} - -void drm_ps_free(drm_ps_info *ps) -{ - faad_free(ps); -} - -/* main DRM PS decoding function */ -uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, uint32_t samplerate, qmf_t X_left[38][64], qmf_t X_right[38][64]) -{ - uint8_t rateselect = (samplerate >= 24000); - - if (ps == NULL) - { - memcpy(X_right, X_left, sizeof(qmf_t)*30*64); - return 0; - } - - if (!ps->drm_ps_data_available && !guess) - { - memcpy(X_right, X_left, sizeof(qmf_t)*30*64); - memset(ps->g_prev_sa_index, 0, sizeof(ps->g_prev_sa_index)); - memset(ps->g_prev_pan_index, 0, sizeof(ps->g_prev_pan_index)); - return 0; - } - - /* if SBR CRC doesn't match out, we can assume decode errors to start with, - and we'll guess what the parameters should be */ - if (!guess) - { - ps->sa_decode_error = 0; - ps->pan_decode_error = 0; - drm_ps_delta_decode(ps); - } else - { - ps->sa_decode_error = 1; - ps->pan_decode_error = 1; - /* don't even bother decoding */ - } - - ps->drm_ps_data_available = 0; - - drm_calc_sa_side_signal(ps, X_left, rateselect); - drm_add_ambiance(ps, rateselect, X_left, X_right); - - if (ps->bs_enable_sa) - { - ps->g_last_had_sa = 1; - - memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS); - - } else { - ps->g_last_had_sa = 0; - } - - if (ps->bs_enable_pan) - { - drm_add_pan(ps, rateselect, X_left, X_right); - - ps->g_last_had_pan = 1; - - memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS); - - } else { - ps->g_last_had_pan = 0; - } - - - return 0; -} - -#endif diff --git a/src/libfaad/drm_dec.h b/src/libfaad/drm_dec.h deleted file mode 100644 index bb7d6dc93..000000000 --- a/src/libfaad/drm_dec.h +++ /dev/null @@ -1,97 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: drm_dec.h,v 1.1 2005/10/30 00:50:19 tmmm Exp $ -**/ - -#ifndef __DRM_DEC_H__ -#define __DRM_DEC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "bits.h" - -#define DRM_PARAMETRIC_STEREO 0 -#define DRM_NUM_SA_BANDS 8 -#define DRM_NUM_PAN_BANDS 20 -#define NUM_OF_LINKS 3 -#define NUM_OF_QMF_CHANNELS 64 -#define NUM_OF_SUBSAMPLES 30 -#define MAX_SA_BAND 46 -#define MAX_PAN_BAND 64 -#define MAX_DELAY 5 - -typedef struct -{ - uint8_t drm_ps_data_available; - uint8_t bs_enable_sa; - uint8_t bs_enable_pan; - - uint8_t bs_sa_dt_flag; - uint8_t bs_pan_dt_flag; - - uint8_t g_last_had_sa; - uint8_t g_last_had_pan; - - int8_t bs_sa_data[DRM_NUM_SA_BANDS]; - int8_t bs_pan_data[DRM_NUM_PAN_BANDS]; - - int8_t g_sa_index[DRM_NUM_SA_BANDS]; - int8_t g_pan_index[DRM_NUM_PAN_BANDS]; - int8_t g_prev_sa_index[DRM_NUM_SA_BANDS]; - int8_t g_prev_pan_index[DRM_NUM_PAN_BANDS]; - - int8_t sa_decode_error; - int8_t pan_decode_error; - - int8_t g_last_good_sa_index[DRM_NUM_SA_BANDS]; - int8_t g_last_good_pan_index[DRM_NUM_PAN_BANDS]; - - qmf_t SA[NUM_OF_SUBSAMPLES][MAX_SA_BAND]; - - complex_t d_buff[2][MAX_SA_BAND]; - complex_t d2_buff[NUM_OF_LINKS][MAX_DELAY][MAX_SA_BAND]; - - uint8_t delay_buf_index_ser[NUM_OF_LINKS]; - - real_t prev_nrg[MAX_SA_BAND]; - real_t prev_peakdiff[MAX_SA_BAND]; - real_t peakdecay_fast[MAX_SA_BAND]; -} drm_ps_info; - - -uint16_t drm_ps_data(drm_ps_info *ps, bitfile *ld); - -drm_ps_info *drm_ps_init(void); -void drm_ps_free(drm_ps_info *ps); - -uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, uint32_t samplerate, qmf_t X_left[38][64], qmf_t X_right[38][64]); - -#ifdef __cplusplus -} -#endif -#endif - diff --git a/src/libfaad/error.c b/src/libfaad/error.c deleted file mode 100644 index 2fbe08fc1..000000000 --- a/src/libfaad/error.c +++ /dev/null @@ -1,61 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: error.c,v 1.8 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#include "common.h" -#include "error.h" - -char *err_msg[] = { - "No error", - "Gain control not yet implemented", - "Pulse coding not allowed in short blocks", - "Invalid huffman codebook", - "Scalefactor out of range", - "Unable to find ADTS syncword", - "Channel coupling not yet implemented", - "Channel configuration not allowed in error resilient frame", - "Bit error in error resilient scalefactor decoding", - "Error decoding huffman scalefactor (bitstream error)", - "Error decoding huffman codeword (bitstream error)", - "Non existent huffman codebook number found", - "Invalid number of channels", - "Maximum number of bitstream elements exceeded", - "Input data buffer too small", - "Array index out of range", - "Maximum number of scalefactor bands exceeded", - "Quantised value out of range", - "LTP lag out of range", - "Invalid SBR parameter decoded", - "SBR called without being initialised", - "Unexpected channel configuration change", - "Error in program_config_element", - "First SBR frame is not the same as first AAC frame", - "Unexpected fill element with SBR data", - "Not all elements were provided with SBR data", - "LTP decoding not available", - "Output data buffer too small" -}; - diff --git a/src/libfaad/error.h b/src/libfaad/error.h deleted file mode 100644 index 1009a9f57..000000000 --- a/src/libfaad/error.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: error.h,v 1.7 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#ifndef __ERROR_H__ -#define __ERROR_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define NUM_ERROR_MESSAGES 28 -extern char *err_msg[]; - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/faad.h b/src/libfaad/faad.h deleted file mode 100644 index e46c31d87..000000000 --- a/src/libfaad/faad.h +++ /dev/null @@ -1,217 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: faad.h,v 1.7 2004/12/03 01:15:30 tmattern Exp $ -**/ - -#ifndef __AACDEC_H__ -#define __AACDEC_H__ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#ifdef _WIN32 - #pragma pack(push, 8) - #ifndef FAADAPI - #define FAADAPI __cdecl - #endif -#else - #ifndef FAADAPI - #define FAADAPI - #endif -#endif - -#define FAAD2_VERSION "2.0 " - -/* object types for AAC */ -#define MAIN 1 -#define LC 2 -#define SSR 3 -#define LTP 4 -#define HE_AAC 5 -#define ER_LC 17 -#define ER_LTP 19 -#define LD 23 -#define DRM_ER_LC 27 /* special object type for DRM */ - -/* header types */ -#define RAW 0 -#define ADIF 1 -#define ADTS 2 - -/* SBR signalling */ -#define NO_SBR 0 -#define SBR_UPSAMPLED 1 -#define SBR_DOWNSAMPLED 2 -#define NO_SBR_UPSAMPLED 3 - -/* library output formats */ -#define FAAD_FMT_16BIT 1 -#define FAAD_FMT_24BIT 2 -#define FAAD_FMT_32BIT 3 -#define FAAD_FMT_FLOAT 4 -#define FAAD_FMT_DOUBLE 5 - -/* Capabilities */ -#define LC_DEC_CAP (1<<0) /* Can decode LC */ -#define MAIN_DEC_CAP (1<<1) /* Can decode MAIN */ -#define LTP_DEC_CAP (1<<2) /* Can decode LTP */ -#define LD_DEC_CAP (1<<3) /* Can decode LD */ -#define ERROR_RESILIENCE_CAP (1<<4) /* Can decode ER */ -#define FIXED_POINT_CAP (1<<5) /* Fixed point */ - -/* Channel definitions */ -#define FRONT_CHANNEL_CENTER (1) -#define FRONT_CHANNEL_LEFT (2) -#define FRONT_CHANNEL_RIGHT (3) -#define SIDE_CHANNEL_LEFT (4) -#define SIDE_CHANNEL_RIGHT (5) -#define BACK_CHANNEL_LEFT (6) -#define BACK_CHANNEL_RIGHT (7) -#define BACK_CHANNEL_CENTER (8) -#define LFE_CHANNEL (9) -#define UNKNOWN_CHANNEL (0) - -/* DRM channel definitions */ -#define DRMCH_MONO 1 -#define DRMCH_STEREO 2 -#define DRMCH_SBR_MONO 3 -#define DRMCH_SBR_LC_STEREO 4 -#define DRMCH_SBR_STEREO 5 - - -/* A decode call can eat up to FAAD_MIN_STREAMSIZE bytes per decoded channel, - so at least so much bytes per channel should be available in this stream */ -#define FAAD_MIN_STREAMSIZE 768 /* 6144 bits/channel */ - - -typedef void *faacDecHandle; - -typedef struct mp4AudioSpecificConfig -{ - /* Audio Specific Info */ - unsigned char objectTypeIndex; - unsigned char samplingFrequencyIndex; - unsigned long samplingFrequency; - unsigned char channelsConfiguration; - - /* GA Specific Info */ - unsigned char frameLengthFlag; - unsigned char dependsOnCoreCoder; - unsigned short coreCoderDelay; - unsigned char extensionFlag; - unsigned char aacSectionDataResilienceFlag; - unsigned char aacScalefactorDataResilienceFlag; - unsigned char aacSpectralDataResilienceFlag; - unsigned char epConfig; - - char sbr_present_flag; - char forceUpSampling; -} mp4AudioSpecificConfig; - -typedef struct faacDecConfiguration -{ - unsigned char defObjectType; - unsigned long defSampleRate; - unsigned char outputFormat; - unsigned char downMatrix; - unsigned char useOldADTSFormat; - unsigned char dontUpSampleImplicitSBR; -} faacDecConfiguration, *faacDecConfigurationPtr; - -typedef struct faacDecFrameInfo -{ - unsigned long bytesconsumed; - unsigned long samples; - unsigned char channels; - unsigned char error; - unsigned long samplerate; - - /* SBR: 0: off, 1: on; upsample, 2: on; downsampled, 3: off; upsampled */ - unsigned char sbr; - - /* MPEG-4 ObjectType */ - unsigned char object_type; - - /* AAC header type; MP4 will be signalled as RAW also */ - unsigned char header_type; - - /* multichannel configuration */ - unsigned char num_front_channels; - unsigned char num_side_channels; - unsigned char num_back_channels; - unsigned char num_lfe_channels; - unsigned char channel_position[64]; -} faacDecFrameInfo; - -char* FAADAPI faacDecGetErrorMessage(unsigned char errcode); - -unsigned long FAADAPI faacDecGetCapabilities(void); - -faacDecHandle FAADAPI faacDecOpen(void); - -faacDecConfigurationPtr FAADAPI faacDecGetCurrentConfiguration(faacDecHandle hDecoder); - -unsigned char FAADAPI faacDecSetConfiguration(faacDecHandle hDecoder, - faacDecConfigurationPtr config); - -/* Init the library based on info from the AAC file (ADTS/ADIF) */ -long FAADAPI faacDecInit(faacDecHandle hDecoder, - unsigned char *buffer, - unsigned long buffer_size, - unsigned long *samplerate, - unsigned char *channels); - -/* Init the library using a DecoderSpecificInfo */ -char FAADAPI faacDecInit2(faacDecHandle hDecoder, unsigned char *pBuffer, - unsigned long SizeOfDecoderSpecificInfo, - unsigned long *samplerate, unsigned char *channels); - -/* Init the library for DRM */ -char FAADAPI faacDecInitDRM(faacDecHandle hDecoder, unsigned long samplerate, - unsigned char channels); - -void FAADAPI faacDecPostSeekReset(faacDecHandle hDecoder, long frame); - -void FAADAPI faacDecClose(faacDecHandle hDecoder); - -void* FAADAPI faacDecDecode(faacDecHandle hDecoder, - faacDecFrameInfo *hInfo, - unsigned char *buffer, - unsigned long buffer_size); - -char FAADAPI AudioSpecificConfig(unsigned char *pBuffer, - unsigned long buffer_size, - mp4AudioSpecificConfig *mp4ASC); - -#ifdef _WIN32 - #pragma pack(pop) -#endif - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif diff --git a/src/libfaad/filtbank.c b/src/libfaad/filtbank.c deleted file mode 100644 index 2919b5be3..000000000 --- a/src/libfaad/filtbank.c +++ /dev/null @@ -1,404 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: filtbank.c,v 1.10 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include <stdlib.h> -#include <string.h> -#ifdef _WIN32_WCE -#define assert(x) -#else -#include <assert.h> -#endif - -#include "filtbank.h" -#include "decoder.h" -#include "syntax.h" -#include "kbd_win.h" -#include "sine_win.h" -#include "mdct.h" - - -fb_info *filter_bank_init(uint16_t frame_len) -{ - uint16_t nshort = frame_len/8; -#ifdef LD_DEC - uint16_t frame_len_ld = frame_len/2; -#endif - - fb_info *fb = (fb_info*)faad_malloc(sizeof(fb_info)); - memset(fb, 0, sizeof(fb_info)); - - /* normal */ - fb->mdct256 = faad_mdct_init(2*nshort); - fb->mdct2048 = faad_mdct_init(2*frame_len); -#ifdef LD_DEC - /* LD */ - fb->mdct1024 = faad_mdct_init(2*frame_len_ld); -#endif - -#ifdef ALLOW_SMALL_FRAMELENGTH - if (frame_len == 1024) - { -#endif - fb->long_window[0] = sine_long_1024; - fb->short_window[0] = sine_short_128; - fb->long_window[1] = kbd_long_1024; - fb->short_window[1] = kbd_short_128; -#ifdef LD_DEC - fb->ld_window[0] = sine_mid_512; - fb->ld_window[1] = ld_mid_512; -#endif -#ifdef ALLOW_SMALL_FRAMELENGTH - } else /* (frame_len == 960) */ { - fb->long_window[0] = sine_long_960; - fb->short_window[0] = sine_short_120; - fb->long_window[1] = kbd_long_960; - fb->short_window[1] = kbd_short_120; -#ifdef LD_DEC - fb->ld_window[0] = sine_mid_480; - fb->ld_window[1] = ld_mid_480; -#endif - } -#endif - - return fb; -} - -void filter_bank_end(fb_info *fb) -{ - if (fb != NULL) - { -#ifdef PROFILE - printf("FB: %I64d cycles\n", fb->cycles); -#endif - - faad_mdct_end(fb->mdct256); - faad_mdct_end(fb->mdct2048); -#ifdef LD_DEC - faad_mdct_end(fb->mdct1024); -#endif - - faad_free(fb); - } -} - -static INLINE void imdct_long(fb_info *fb, real_t *in_data, real_t *out_data, uint16_t len) -{ -#ifdef LD_DEC - mdct_info *mdct = NULL; - - switch (len) - { - case 2048: - case 1920: - mdct = fb->mdct2048; - break; - case 1024: - case 960: - mdct = fb->mdct1024; - break; - } - - faad_imdct(mdct, in_data, out_data); -#else - faad_imdct(fb->mdct2048, in_data, out_data); -#endif -} - - -#ifdef LTP_DEC -static INLINE void mdct(fb_info *fb, real_t *in_data, real_t *out_data, uint16_t len) -{ - mdct_info *mdct = NULL; - - switch (len) - { - case 2048: - case 1920: - mdct = fb->mdct2048; - break; - case 256: - case 240: - mdct = fb->mdct256; - break; -#ifdef LD_DEC - case 1024: - case 960: - mdct = fb->mdct1024; - break; -#endif - } - - faad_mdct(mdct, in_data, out_data); -} -#endif - -void ifilter_bank(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, - uint8_t window_shape_prev, real_t *freq_in, - real_t *time_out, real_t *overlap, - uint8_t object_type, uint16_t frame_len) -{ - int16_t i; - ALIGN real_t transf_buf[2*1024] = {0}; - - const real_t *window_long = NULL; - const real_t *window_long_prev = NULL; - const real_t *window_short = NULL; - const real_t *window_short_prev = NULL; - - uint16_t nlong = frame_len; - uint16_t nshort = frame_len/8; - uint16_t trans = nshort/2; - - uint16_t nflat_ls = (nlong-nshort)/2; - -#ifdef PROFILE - int64_t count = faad_get_ts(); -#endif - - /* select windows of current frame and previous frame (Sine or KBD) */ -#ifdef LD_DEC - if (object_type == LD) - { - window_long = fb->ld_window[window_shape]; - window_long_prev = fb->ld_window[window_shape_prev]; - } else { -#endif - window_long = fb->long_window[window_shape]; - window_long_prev = fb->long_window[window_shape_prev]; - window_short = fb->short_window[window_shape]; - window_short_prev = fb->short_window[window_shape_prev]; -#ifdef LD_DEC - } -#endif - -#if 0 - for (i = 0; i < 1024; i++) - { - printf("%d\n", freq_in[i]); - } -#endif - -#if 0 - printf("%d %d\n", window_sequence, window_shape); -#endif - - switch (window_sequence) - { - case ONLY_LONG_SEQUENCE: - /* perform iMDCT */ - imdct_long(fb, freq_in, transf_buf, 2*nlong); - - /* add second half output of previous frame to windowed output of current frame */ - for (i = 0; i < nlong; i+=4) - { - time_out[i] = overlap[i] + MUL_F(transf_buf[i],window_long_prev[i]); - time_out[i+1] = overlap[i+1] + MUL_F(transf_buf[i+1],window_long_prev[i+1]); - time_out[i+2] = overlap[i+2] + MUL_F(transf_buf[i+2],window_long_prev[i+2]); - time_out[i+3] = overlap[i+3] + MUL_F(transf_buf[i+3],window_long_prev[i+3]); - } - - /* window the second half and save as overlap for next frame */ - for (i = 0; i < nlong; i+=4) - { - overlap[i] = MUL_F(transf_buf[nlong+i],window_long[nlong-1-i]); - overlap[i+1] = MUL_F(transf_buf[nlong+i+1],window_long[nlong-2-i]); - overlap[i+2] = MUL_F(transf_buf[nlong+i+2],window_long[nlong-3-i]); - overlap[i+3] = MUL_F(transf_buf[nlong+i+3],window_long[nlong-4-i]); - } - break; - - case LONG_START_SEQUENCE: - /* perform iMDCT */ - imdct_long(fb, freq_in, transf_buf, 2*nlong); - - /* add second half output of previous frame to windowed output of current frame */ - for (i = 0; i < nlong; i+=4) - { - time_out[i] = overlap[i] + MUL_F(transf_buf[i],window_long_prev[i]); - time_out[i+1] = overlap[i+1] + MUL_F(transf_buf[i+1],window_long_prev[i+1]); - time_out[i+2] = overlap[i+2] + MUL_F(transf_buf[i+2],window_long_prev[i+2]); - time_out[i+3] = overlap[i+3] + MUL_F(transf_buf[i+3],window_long_prev[i+3]); - } - - /* window the second half and save as overlap for next frame */ - /* construct second half window using padding with 1's and 0's */ - for (i = 0; i < nflat_ls; i++) - overlap[i] = transf_buf[nlong+i]; - for (i = 0; i < nshort; i++) - overlap[nflat_ls+i] = MUL_F(transf_buf[nlong+nflat_ls+i],window_short[nshort-i-1]); - for (i = 0; i < nflat_ls; i++) - overlap[nflat_ls+nshort+i] = 0; - break; - - case EIGHT_SHORT_SEQUENCE: - /* perform iMDCT for each short block */ - faad_imdct(fb->mdct256, freq_in+0*nshort, transf_buf+2*nshort*0); - faad_imdct(fb->mdct256, freq_in+1*nshort, transf_buf+2*nshort*1); - faad_imdct(fb->mdct256, freq_in+2*nshort, transf_buf+2*nshort*2); - faad_imdct(fb->mdct256, freq_in+3*nshort, transf_buf+2*nshort*3); - faad_imdct(fb->mdct256, freq_in+4*nshort, transf_buf+2*nshort*4); - faad_imdct(fb->mdct256, freq_in+5*nshort, transf_buf+2*nshort*5); - faad_imdct(fb->mdct256, freq_in+6*nshort, transf_buf+2*nshort*6); - faad_imdct(fb->mdct256, freq_in+7*nshort, transf_buf+2*nshort*7); - - /* add second half output of previous frame to windowed output of current frame */ - for (i = 0; i < nflat_ls; i++) - time_out[i] = overlap[i]; - for(i = 0; i < nshort; i++) - { - time_out[nflat_ls+ i] = overlap[nflat_ls+ i] + MUL_F(transf_buf[nshort*0+i],window_short_prev[i]); - time_out[nflat_ls+1*nshort+i] = overlap[nflat_ls+nshort*1+i] + MUL_F(transf_buf[nshort*1+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*2+i],window_short[i]); - time_out[nflat_ls+2*nshort+i] = overlap[nflat_ls+nshort*2+i] + MUL_F(transf_buf[nshort*3+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*4+i],window_short[i]); - time_out[nflat_ls+3*nshort+i] = overlap[nflat_ls+nshort*3+i] + MUL_F(transf_buf[nshort*5+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*6+i],window_short[i]); - if (i < trans) - time_out[nflat_ls+4*nshort+i] = overlap[nflat_ls+nshort*4+i] + MUL_F(transf_buf[nshort*7+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*8+i],window_short[i]); - } - - /* window the second half and save as overlap for next frame */ - for(i = 0; i < nshort; i++) - { - if (i >= trans) - overlap[nflat_ls+4*nshort+i-nlong] = MUL_F(transf_buf[nshort*7+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*8+i],window_short[i]); - overlap[nflat_ls+5*nshort+i-nlong] = MUL_F(transf_buf[nshort*9+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*10+i],window_short[i]); - overlap[nflat_ls+6*nshort+i-nlong] = MUL_F(transf_buf[nshort*11+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*12+i],window_short[i]); - overlap[nflat_ls+7*nshort+i-nlong] = MUL_F(transf_buf[nshort*13+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*14+i],window_short[i]); - overlap[nflat_ls+8*nshort+i-nlong] = MUL_F(transf_buf[nshort*15+i],window_short[nshort-1-i]); - } - for (i = 0; i < nflat_ls; i++) - overlap[nflat_ls+nshort+i] = 0; - break; - - case LONG_STOP_SEQUENCE: - /* perform iMDCT */ - imdct_long(fb, freq_in, transf_buf, 2*nlong); - - /* add second half output of previous frame to windowed output of current frame */ - /* construct first half window using padding with 1's and 0's */ - for (i = 0; i < nflat_ls; i++) - time_out[i] = overlap[i]; - for (i = 0; i < nshort; i++) - time_out[nflat_ls+i] = overlap[nflat_ls+i] + MUL_F(transf_buf[nflat_ls+i],window_short_prev[i]); - for (i = 0; i < nflat_ls; i++) - time_out[nflat_ls+nshort+i] = overlap[nflat_ls+nshort+i] + transf_buf[nflat_ls+nshort+i]; - - /* window the second half and save as overlap for next frame */ - for (i = 0; i < nlong; i++) - overlap[i] = MUL_F(transf_buf[nlong+i],window_long[nlong-1-i]); - break; - } - -#if 0 - for (i = 0; i < 1024; i++) - { - printf("%d\n", time_out[i]); - //printf("0x%.8X\n", time_out[i]); - } -#endif - - -#ifdef PROFILE - count = faad_get_ts() - count; - fb->cycles += count; -#endif -} - - -#ifdef LTP_DEC -/* only works for LTP -> no overlapping, no short blocks */ -void filter_bank_ltp(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, - uint8_t window_shape_prev, real_t *in_data, real_t *out_mdct, - uint8_t object_type, uint16_t frame_len) -{ - int16_t i; - ALIGN real_t windowed_buf[2*1024] = {0}; - - const real_t *window_long = NULL; - const real_t *window_long_prev = NULL; - const real_t *window_short = NULL; - const real_t *window_short_prev = NULL; - - uint16_t nlong = frame_len; - uint16_t nshort = frame_len/8; - uint16_t nflat_ls = (nlong-nshort)/2; - - assert(window_sequence != EIGHT_SHORT_SEQUENCE); - -#ifdef LD_DEC - if (object_type == LD) - { - window_long = fb->ld_window[window_shape]; - window_long_prev = fb->ld_window[window_shape_prev]; - } else { -#endif - window_long = fb->long_window[window_shape]; - window_long_prev = fb->long_window[window_shape_prev]; - window_short = fb->short_window[window_shape]; - window_short_prev = fb->short_window[window_shape_prev]; -#ifdef LD_DEC - } -#endif - - switch(window_sequence) - { - case ONLY_LONG_SEQUENCE: - for (i = nlong-1; i >= 0; i--) - { - windowed_buf[i] = MUL_F(in_data[i], window_long_prev[i]); - windowed_buf[i+nlong] = MUL_F(in_data[i+nlong], window_long[nlong-1-i]); - } - mdct(fb, windowed_buf, out_mdct, 2*nlong); - break; - - case LONG_START_SEQUENCE: - for (i = 0; i < nlong; i++) - windowed_buf[i] = MUL_F(in_data[i], window_long_prev[i]); - for (i = 0; i < nflat_ls; i++) - windowed_buf[i+nlong] = in_data[i+nlong]; - for (i = 0; i < nshort; i++) - windowed_buf[i+nlong+nflat_ls] = MUL_F(in_data[i+nlong+nflat_ls], window_short[nshort-1-i]); - for (i = 0; i < nflat_ls; i++) - windowed_buf[i+nlong+nflat_ls+nshort] = 0; - mdct(fb, windowed_buf, out_mdct, 2*nlong); - break; - - case LONG_STOP_SEQUENCE: - for (i = 0; i < nflat_ls; i++) - windowed_buf[i] = 0; - for (i = 0; i < nshort; i++) - windowed_buf[i+nflat_ls] = MUL_F(in_data[i+nflat_ls], window_short_prev[i]); - for (i = 0; i < nflat_ls; i++) - windowed_buf[i+nflat_ls+nshort] = in_data[i+nflat_ls+nshort]; - for (i = 0; i < nlong; i++) - windowed_buf[i+nlong] = MUL_F(in_data[i+nlong], window_long[nlong-1-i]); - mdct(fb, windowed_buf, out_mdct, 2*nlong); - break; - } -} -#endif diff --git a/src/libfaad/filtbank.h b/src/libfaad/filtbank.h deleted file mode 100644 index 54c72c0ef..000000000 --- a/src/libfaad/filtbank.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: filtbank.h,v 1.7 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#ifndef __FILTBANK_H__ -#define __FILTBANK_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -fb_info *filter_bank_init(uint16_t frame_len); -void filter_bank_end(fb_info *fb); - -#ifdef LTP_DEC -void filter_bank_ltp(fb_info *fb, - uint8_t window_sequence, - uint8_t window_shape, - uint8_t window_shape_prev, - real_t *in_data, - real_t *out_mdct, - uint8_t object_type, - uint16_t frame_len); -#endif - -void ifilter_bank(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, - uint8_t window_shape_prev, real_t *freq_in, - real_t *time_out, real_t *overlap, - uint8_t object_type, uint16_t frame_len); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/fixed.h b/src/libfaad/fixed.h deleted file mode 100644 index c58ee26cb..000000000 --- a/src/libfaad/fixed.h +++ /dev/null @@ -1,265 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: fixed.h,v 1.7 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#ifndef __FIXED_H__ -#define __FIXED_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(_WIN32_WCE) && defined(_ARM_) -#include <cmnintrin.h> -#endif - -#define COEF_BITS 28 -#define COEF_PRECISION (1 << COEF_BITS) -#define REAL_BITS 14 // MAXIMUM OF 14 FOR FIXED POINT SBR -#define REAL_PRECISION (1 << REAL_BITS) - -/* FRAC is the fractional only part of the fixed point number [0.0..1.0) */ -#define FRAC_SIZE 32 /* frac is a 32 bit integer */ -#define FRAC_BITS 31 -#define FRAC_PRECISION ((uint32_t)(1 << FRAC_BITS)) -#define FRAC_MAX 0x7FFFFFFF - -typedef int32_t real_t; - - -#define REAL_CONST(A) (((A) >= 0) ? ((real_t)((A)*(REAL_PRECISION)+0.5)) : ((real_t)((A)*(REAL_PRECISION)-0.5))) -#define COEF_CONST(A) (((A) >= 0) ? ((real_t)((A)*(COEF_PRECISION)+0.5)) : ((real_t)((A)*(COEF_PRECISION)-0.5))) -#define FRAC_CONST(A) (((A) == 1.00) ? ((real_t)FRAC_MAX) : (((A) >= 0) ? ((real_t)((A)*(FRAC_PRECISION)+0.5)) : ((real_t)((A)*(FRAC_PRECISION)-0.5)))) -//#define FRAC_CONST(A) (((A) >= 0) ? ((real_t)((A)*(FRAC_PRECISION)+0.5)) : ((real_t)((A)*(FRAC_PRECISION)-0.5))) - -#define Q2_BITS 22 -#define Q2_PRECISION (1 << Q2_BITS) -#define Q2_CONST(A) (((A) >= 0) ? ((real_t)((A)*(Q2_PRECISION)+0.5)) : ((real_t)((A)*(Q2_PRECISION)-0.5))) - -#if defined(_WIN32) && !defined(_WIN32_WCE) - -/* multiply with real shift */ -static INLINE real_t MUL_R(real_t A, real_t B) -{ - _asm { - mov eax,A - imul B - shrd eax,edx,REAL_BITS - } -} - -/* multiply with coef shift */ -static INLINE real_t MUL_C(real_t A, real_t B) -{ - _asm { - mov eax,A - imul B - shrd eax,edx,COEF_BITS - } -} - -static INLINE real_t MUL_Q2(real_t A, real_t B) -{ - _asm { - mov eax,A - imul B - shrd eax,edx,Q2_BITS - } -} - -static INLINE real_t MUL_SHIFT6(real_t A, real_t B) -{ - _asm { - mov eax,A - imul B - shrd eax,edx,6 - } -} - -static INLINE real_t MUL_SHIFT23(real_t A, real_t B) -{ - _asm { - mov eax,A - imul B - shrd eax,edx,23 - } -} - -#if 1 -static INLINE real_t _MulHigh(real_t A, real_t B) -{ - _asm { - mov eax,A - imul B - mov eax,edx - } -} - -/* multiply with fractional shift */ -static INLINE real_t MUL_F(real_t A, real_t B) -{ - return _MulHigh(A,B) << (FRAC_SIZE-FRAC_BITS); -} - -/* Complex multiplication */ -static INLINE void ComplexMult(real_t *y1, real_t *y2, - real_t x1, real_t x2, real_t c1, real_t c2) -{ - *y1 = (_MulHigh(x1, c1) + _MulHigh(x2, c2))<<(FRAC_SIZE-FRAC_BITS); - *y2 = (_MulHigh(x2, c1) - _MulHigh(x1, c2))<<(FRAC_SIZE-FRAC_BITS); -} -#else -static INLINE real_t MUL_F(real_t A, real_t B) -{ - _asm { - mov eax,A - imul B - shrd eax,edx,FRAC_BITS - } -} - -/* Complex multiplication */ -static INLINE void ComplexMult(real_t *y1, real_t *y2, - real_t x1, real_t x2, real_t c1, real_t c2) -{ - *y1 = MUL_F(x1, c1) + MUL_F(x2, c2); - *y2 = MUL_F(x2, c1) - MUL_F(x1, c2); -} -#endif - -#elif defined(__GNUC__) && defined (__arm__) - -/* taken from MAD */ -#define arm_mul(x, y, SCALEBITS) \ -({ \ - uint32_t __hi; \ - uint32_t __lo; \ - uint32_t __result; \ - asm("smull %0, %1, %3, %4\n\t" \ - "movs %0, %0, lsr %5\n\t" \ - "adc %2, %0, %1, lsl %6" \ - : "=&r" (__lo), "=&r" (__hi), "=r" (__result) \ - : "%r" (x), "r" (y), \ - "M" (SCALEBITS), "M" (32 - (SCALEBITS)) \ - : "cc"); \ - __result; \ -}) - -static INLINE real_t MUL_R(real_t A, real_t B) -{ - return arm_mul(A, B, REAL_BITS); -} - -static INLINE real_t MUL_C(real_t A, real_t B) -{ - return arm_mul(A, B, COEF_BITS); -} - -static INLINE real_t MUL_Q2(real_t A, real_t B) -{ - return arm_mul(A, B, Q2_BITS); -} - -static INLINE real_t MUL_SHIFT6(real_t A, real_t B) -{ - return arm_mul(A, B, 6); -} - -static INLINE real_t MUL_SHIFT23(real_t A, real_t B) -{ - return arm_mul(A, B, 23); -} - -static INLINE real_t _MulHigh(real_t x, real_t y) -{ - uint32_t __lo; - uint32_t __hi; - asm("smull\t%0, %1, %2, %3" - : "=&r"(__lo),"=&r"(__hi) - : "%r"(x),"r"(y) - : "cc"); - return __hi; -} - -static INLINE real_t MUL_F(real_t A, real_t B) -{ - return _MulHigh(A, B) << (FRAC_SIZE-FRAC_BITS); -} - -/* Complex multiplication */ -static INLINE void ComplexMult(real_t *y1, real_t *y2, - real_t x1, real_t x2, real_t c1, real_t c2) -{ - int32_t tmp, yt1, yt2; - asm("smull %0, %1, %4, %6\n\t" - "smlal %0, %1, %5, %7\n\t" - "rsb %3, %4, #0\n\t" - "smull %0, %2, %5, %6\n\t" - "smlal %0, %2, %3, %7" - : "=&r" (tmp), "=&r" (yt1), "=&r" (yt2), "=r" (x1) - : "3" (x1), "r" (x2), "r" (c1), "r" (c2) - : "cc" ); - *y1 = yt1 << (FRAC_SIZE-FRAC_BITS); - *y2 = yt2 << (FRAC_SIZE-FRAC_BITS); -} - -#else - - /* multiply with real shift */ - #define MUL_R(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (REAL_BITS-1))) >> REAL_BITS) - /* multiply with coef shift */ - #define MUL_C(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (COEF_BITS-1))) >> COEF_BITS) - /* multiply with fractional shift */ -#if defined(_WIN32_WCE) && defined(_ARM_) - /* eVC for PocketPC has an intrinsic function that returns only the high 32 bits of a 32x32 bit multiply */ - static INLINE real_t MUL_F(real_t A, real_t B) - { - return _MulHigh(A,B) << (32-FRAC_BITS); - } -#else - #define _MulHigh(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (FRAC_SIZE-1))) >> FRAC_SIZE) - #define MUL_F(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (FRAC_BITS-1))) >> FRAC_BITS) -#endif - #define MUL_Q2(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (Q2_BITS-1))) >> Q2_BITS) - #define MUL_SHIFT6(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (6-1))) >> 6) - #define MUL_SHIFT23(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (23-1))) >> 23) - -/* Complex multiplication */ -static INLINE void ComplexMult(real_t *y1, real_t *y2, - real_t x1, real_t x2, real_t c1, real_t c2) -{ - *y1 = (_MulHigh(x1, c1) + _MulHigh(x2, c2))<<(FRAC_SIZE-FRAC_BITS); - *y2 = (_MulHigh(x2, c1) - _MulHigh(x1, c2))<<(FRAC_SIZE-FRAC_BITS); -} - -#endif - - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/hcr.c b/src/libfaad/hcr.c deleted file mode 100644 index 94f08fd2a..000000000 --- a/src/libfaad/hcr.c +++ /dev/null @@ -1,409 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2004 G.C. Pascutto, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: hcr.c,v 1.7 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include <stdlib.h> -#include <string.h> - -#include "specrec.h" -#include "huffman.h" - -/* ISO/IEC 14496-3/Amd.1 - * 8.5.3.3: Huffman Codeword Reordering for AAC spectral data (HCR) - * - * HCR devides the spectral data in known fixed size segments, and - * sorts it by the importance of the data. The importance is firstly - * the (lower) position in the spectrum, and secondly the largest - * value in the used codebook. - * The most important data is written at the start of each segment - * (at known positions), the remaining data is interleaved inbetween, - * with the writing direction alternating. - * Data length is not increased. -*/ - -#ifdef ERROR_RESILIENCE - -/* 8.5.3.3.1 Pre-sorting */ - -#define NUM_CB 6 -#define NUM_CB_ER 22 -#define MAX_CB 32 -#define VCB11_FIRST 16 -#define VCB11_LAST 31 - -static const uint8_t PreSortCB_STD[NUM_CB] = - { 11, 9, 7, 5, 3, 1}; - -static const uint8_t PreSortCB_ER[NUM_CB_ER] = - { 11, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 9, 7, 5, 3, 1}; - -/* 8.5.3.3.2 Derivation of segment width */ - -static const uint8_t maxCwLen[MAX_CB] = {0, 11, 9, 20, 16, 13, 11, 14, 12, 17, 14, 49, - 0, 0, 0, 0, 14, 17, 21, 21, 25, 25, 29, 29, 29, 29, 33, 33, 33, 37, 37, 41}; - -#define segmentWidth(cb) min(maxCwLen[cb], ics->length_of_longest_codeword) - -/* bit-twiddling helpers */ -static const uint8_t S[] = {1, 2, 4, 8, 16}; -static const uint32_t B[] = {0x55555555, 0x33333333, 0x0F0F0F0F, 0x00FF00FF, 0x0000FFFF}; - -typedef struct -{ - uint8_t cb; - uint8_t decoded; - uint16_t sp_offset; - bits_t bits; -} codeword_t; - -/* rewind and reverse */ -/* 32 bit version */ -static uint32_t rewrev_word(uint32_t v, const uint8_t len) -{ - /* 32 bit reverse */ - v = ((v >> S[0]) & B[0]) | ((v << S[0]) & ~B[0]); - v = ((v >> S[1]) & B[1]) | ((v << S[1]) & ~B[1]); - v = ((v >> S[2]) & B[2]) | ((v << S[2]) & ~B[2]); - v = ((v >> S[3]) & B[3]) | ((v << S[3]) & ~B[3]); - v = ((v >> S[4]) & B[4]) | ((v << S[4]) & ~B[4]); - - /* shift off low bits */ - v >>= (32 - len); - - return v; -} - -/* 64 bit version */ -static void rewrev_lword(uint32_t *hi, uint32_t *lo, const uint8_t len) -{ - if (len <= 32) { - *hi = 0; - *lo = rewrev_word(*lo, len); - } else - { - uint32_t t = *hi, v = *lo; - - /* double 32 bit reverse */ - v = ((v >> S[0]) & B[0]) | ((v << S[0]) & ~B[0]); - t = ((t >> S[0]) & B[0]) | ((t << S[0]) & ~B[0]); - v = ((v >> S[1]) & B[1]) | ((v << S[1]) & ~B[1]); - t = ((t >> S[1]) & B[1]) | ((t << S[1]) & ~B[1]); - v = ((v >> S[2]) & B[2]) | ((v << S[2]) & ~B[2]); - t = ((t >> S[2]) & B[2]) | ((t << S[2]) & ~B[2]); - v = ((v >> S[3]) & B[3]) | ((v << S[3]) & ~B[3]); - t = ((t >> S[3]) & B[3]) | ((t << S[3]) & ~B[3]); - v = ((v >> S[4]) & B[4]) | ((v << S[4]) & ~B[4]); - t = ((t >> S[4]) & B[4]) | ((t << S[4]) & ~B[4]); - - /* last 32<>32 bit swap is implicit below */ - - /* shift off low bits (this is really only one 64 bit shift) */ - *lo = (t >> (64 - len)) | (v << (len - 32)); - *hi = v >> (64 - len); - } -} - - -/* bits_t version */ -static void rewrev_bits(bits_t *bits) -{ - if (bits->len == 0) return; - rewrev_lword(&bits->bufb, &bits->bufa, bits->len); -} - - -/* merge bits of a to b */ -static void concat_bits(bits_t *b, bits_t *a) -{ - uint32_t bl, bh, al, ah; - - if (a->len == 0) return; - - al = a->bufa; - ah = a->bufb; - - if (b->len > 32) - { - /* maskoff superfluous high b bits */ - bl = b->bufa; - bh = b->bufb & ((1 << (b->len-32)) - 1); - /* left shift a b->len bits */ - ah = al << (b->len - 32); - al = 0; - } else { - bl = b->bufa & ((1 << (b->len)) - 1); - bh = 0; - ah = (ah << (b->len)) | (al >> (32 - b->len)); - al = al << b->len; - } - - /* merge */ - b->bufa = bl | al; - b->bufb = bh | ah; - - b->len += a->len; -} - -uint8_t is_good_cb(uint8_t this_CB, uint8_t this_sec_CB) -{ - /* only want spectral data CB's */ - if ((this_sec_CB > ZERO_HCB && this_sec_CB <= ESC_HCB) || (this_sec_CB >= VCB11_FIRST && this_sec_CB <= VCB11_LAST)) - { - if (this_CB < ESC_HCB) - { - /* normal codebook pairs */ - return ((this_sec_CB == this_CB) || (this_sec_CB == this_CB + 1)); - } else - { - /* escape codebook */ - return (this_sec_CB == this_CB); - } - } - return 0; -} - -void read_segment(bits_t *segment, uint8_t segwidth, bitfile *ld) -{ - segment->len = segwidth; - - if (segwidth > 32) - { - segment->bufb = faad_getbits(ld, segwidth - 32); - segment->bufa = faad_getbits(ld, 32); - - } else { - segment->bufa = faad_getbits(ld, segwidth); - segment->bufb = 0; - } -} - -void fill_in_codeword(codeword_t *codeword, uint16_t index, uint16_t sp, uint8_t cb) -{ - codeword[index].sp_offset = sp; - codeword[index].cb = cb; - codeword[index].decoded = 0; - codeword[index].bits.len = 0; -} - -uint8_t reordered_spectral_data(NeAACDecHandle hDecoder, ic_stream *ics, - bitfile *ld, int16_t *spectral_data) -{ - uint16_t PCWs_done; - uint16_t numberOfSegments, numberOfSets, numberOfCodewords; - - codeword_t codeword[512]; - bits_t segment[512]; - - uint16_t sp_offset[8]; - uint16_t g, i, sortloop, set, bitsread; - uint8_t w_idx, sfb, this_CB, last_CB, this_sec_CB; - - const uint16_t nshort = hDecoder->frameLength/8; - const uint16_t sp_data_len = ics->length_of_reordered_spectral_data; - - const uint8_t *PreSortCb; - - /* no data (e.g. silence) */ - if (sp_data_len == 0) - return 0; - - /* since there is spectral data, at least one codeword has nonzero length */ - if (ics->length_of_longest_codeword == 0) - return 10; - - if (sp_data_len < ics->length_of_longest_codeword) - return 10; - - sp_offset[0] = 0; - for (g = 1; g < ics->num_window_groups; g++) - { - sp_offset[g] = sp_offset[g-1] + nshort*ics->window_group_length[g-1]; - } - - PCWs_done = 0; - numberOfSegments = 0; - numberOfCodewords = 0; - bitsread = 0; - - /* VCB11 code books in use */ - if (hDecoder->aacSectionDataResilienceFlag) - { - PreSortCb = PreSortCB_ER; - last_CB = NUM_CB_ER; - } else - { - PreSortCb = PreSortCB_STD; - last_CB = NUM_CB; - } - - /* step 1: decode PCW's (set 0), and stuff data in easier-to-use format */ - for (sortloop = 0; sortloop < last_CB; sortloop++) - { - /* select codebook to process this pass */ - this_CB = PreSortCb[sortloop]; - - /* loop over sfbs */ - for (sfb = 0; sfb < ics->max_sfb; sfb++) - { - /* loop over all in this sfb, 4 lines per loop */ - for (w_idx = 0; 4*w_idx < (ics->swb_offset[sfb+1] - ics->swb_offset[sfb]); w_idx++) - { - for(g = 0; g < ics->num_window_groups; g++) - { - for (i = 0; i < ics->num_sec[g]; i++) - { - /* check whether sfb used here is the one we want to process */ - if ((ics->sect_start[g][i] <= sfb) && (ics->sect_end[g][i] > sfb)) - { - /* check whether codebook used here is the one we want to process */ - this_sec_CB = ics->sect_cb[g][i]; - - if (is_good_cb(this_CB, this_sec_CB)) - { - /* precalculate some stuff */ - uint16_t sect_sfb_size = ics->sect_sfb_offset[g][sfb+1] - ics->sect_sfb_offset[g][sfb]; - uint8_t inc = (this_sec_CB < FIRST_PAIR_HCB) ? QUAD_LEN : PAIR_LEN; - uint16_t group_cws_count = (4*ics->window_group_length[g])/inc; - uint8_t segwidth = segmentWidth(this_sec_CB); - uint16_t cws; - - /* read codewords until end of sfb or end of window group (shouldn't only 1 trigger?) */ - for (cws = 0; (cws < group_cws_count) && ((cws + w_idx*group_cws_count) < sect_sfb_size); cws++) - { - uint16_t sp = sp_offset[g] + ics->sect_sfb_offset[g][sfb] + inc * (cws + w_idx*group_cws_count); - - /* read and decode PCW */ - if (!PCWs_done) - { - /* read in normal segments */ - if (bitsread + segwidth <= sp_data_len) - { - read_segment(&segment[numberOfSegments], segwidth, ld); - bitsread += segwidth; - - huffman_spectral_data_2(this_sec_CB, &segment[numberOfSegments], &spectral_data[sp]); - - /* keep leftover bits */ - rewrev_bits(&segment[numberOfSegments]); - - numberOfSegments++; - } else { - /* remaining stuff after last segment, we unfortunately couldn't read - this in earlier because it might not fit in 64 bits. since we already - decoded (and removed) the PCW it is now guaranteed to fit */ - if (bitsread < sp_data_len) - { - const uint8_t additional_bits = sp_data_len - bitsread; - - read_segment(&segment[numberOfSegments], additional_bits, ld); - segment[numberOfSegments].len += segment[numberOfSegments-1].len; - rewrev_bits(&segment[numberOfSegments]); - - if (segment[numberOfSegments-1].len > 32) - { - segment[numberOfSegments-1].bufb = segment[numberOfSegments].bufb + - showbits_hcr(&segment[numberOfSegments-1], segment[numberOfSegments-1].len - 32); - segment[numberOfSegments-1].bufa = segment[numberOfSegments].bufa + - showbits_hcr(&segment[numberOfSegments-1], 32); - } else { - segment[numberOfSegments-1].bufa = segment[numberOfSegments].bufa + - showbits_hcr(&segment[numberOfSegments-1], segment[numberOfSegments-1].len); - segment[numberOfSegments-1].bufb = segment[numberOfSegments].bufb; - } - segment[numberOfSegments-1].len += additional_bits; - } - bitsread = sp_data_len; - PCWs_done = 1; - - fill_in_codeword(codeword, 0, sp, this_sec_CB); - } - } else { - fill_in_codeword(codeword, numberOfCodewords - numberOfSegments, sp, this_sec_CB); - } - numberOfCodewords++; - } - } - } - } - } - } - } - } - - if (numberOfSegments == 0) - return 10; - - numberOfSets = numberOfCodewords / numberOfSegments; - - /* step 2: decode nonPCWs */ - for (set = 1; set <= numberOfSets; set++) - { - uint16_t trial; - - for (trial = 0; trial < numberOfSegments; trial++) - { - uint16_t codewordBase; - - for (codewordBase = 0; codewordBase < numberOfSegments; codewordBase++) - { - const uint16_t segment_idx = (trial + codewordBase) % numberOfSegments; - const uint16_t codeword_idx = codewordBase + set*numberOfSegments - numberOfSegments; - - /* data up */ - if (codeword_idx >= numberOfCodewords - numberOfSegments) break; - - if (!codeword[codeword_idx].decoded && segment[segment_idx].len > 0) - { - uint8_t tmplen; - - if (codeword[codeword_idx].bits.len != 0) - concat_bits(&segment[segment_idx], &codeword[codeword_idx].bits); - - tmplen = segment[segment_idx].len; - - if (huffman_spectral_data_2(codeword[codeword_idx].cb, &segment[segment_idx], - &spectral_data[codeword[codeword_idx].sp_offset]) >= 0) - { - codeword[codeword_idx].decoded = 1; - } else - { - codeword[codeword_idx].bits = segment[segment_idx]; - codeword[codeword_idx].bits.len = tmplen; - } - - } - } - } - for (i = 0; i < numberOfSegments; i++) - rewrev_bits(&segment[i]); - } - - return 0; -} -#endif diff --git a/src/libfaad/huffman.c b/src/libfaad/huffman.c deleted file mode 100644 index 6c24a6cec..000000000 --- a/src/libfaad/huffman.c +++ /dev/null @@ -1,556 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: huffman.c,v 1.5 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include <stdlib.h> -#ifdef ANALYSIS -#include <stdio.h> -#endif - -#include "bits.h" -#include "huffman.h" -#include "codebook/hcb.h" - - -/* static function declarations */ -static INLINE void huffman_sign_bits(bitfile *ld, int16_t *sp, uint8_t len); -static INLINE int16_t huffman_getescape(bitfile *ld, int16_t sp); -static uint8_t huffman_2step_quad(uint8_t cb, bitfile *ld, int16_t *sp); -static uint8_t huffman_2step_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp); -static uint8_t huffman_2step_pair(uint8_t cb, bitfile *ld, int16_t *sp); -static uint8_t huffman_2step_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp); -static uint8_t huffman_binary_quad(uint8_t cb, bitfile *ld, int16_t *sp); -static uint8_t huffman_binary_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp); -static uint8_t huffman_binary_pair(uint8_t cb, bitfile *ld, int16_t *sp); -static uint8_t huffman_binary_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp); -static int16_t huffman_codebook(uint8_t i); -static void vcb11_check_LAV(uint8_t cb, int16_t *sp); - -int8_t huffman_scale_factor(bitfile *ld) -{ - uint16_t offset = 0; - - while (hcb_sf[offset][1]) - { - uint8_t b = faad_get1bit(ld - DEBUGVAR(1,255,"huffman_scale_factor()")); - offset += hcb_sf[offset][b]; - - if (offset > 240) - { - /* printf("ERROR: offset into hcb_sf = %d >240!\n", offset); */ - return -1; - } - } - - return hcb_sf[offset][0]; -} - - -hcb *hcb_table[] = { - 0, hcb1_1, hcb2_1, 0, hcb4_1, 0, hcb6_1, 0, hcb8_1, 0, hcb10_1, hcb11_1 -}; - -hcb_2_quad *hcb_2_quad_table[] = { - 0, hcb1_2, hcb2_2, 0, hcb4_2, 0, 0, 0, 0, 0, 0, 0 -}; - -hcb_2_pair *hcb_2_pair_table[] = { - 0, 0, 0, 0, 0, 0, hcb6_2, 0, hcb8_2, 0, hcb10_2, hcb11_2 -}; - -hcb_bin_pair *hcb_bin_table[] = { - 0, 0, 0, 0, 0, hcb5, 0, hcb7, 0, hcb9, 0, 0 -}; - -uint8_t hcbN[] = { 0, 5, 5, 0, 5, 0, 5, 0, 5, 0, 6, 5 }; - -/* defines whether a huffman codebook is unsigned or not */ -/* Table 4.6.2 */ -uint8_t unsigned_cb[] = { 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, - /* codebook 16 to 31 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 -}; - -int hcb_2_quad_table_size[] = { 0, 114, 86, 0, 185, 0, 0, 0, 0, 0, 0, 0 }; -int hcb_2_pair_table_size[] = { 0, 0, 0, 0, 0, 0, 126, 0, 83, 0, 210, 373 }; -int hcb_bin_table_size[] = { 0, 0, 0, 161, 0, 161, 0, 127, 0, 337, 0, 0 }; - -static INLINE void huffman_sign_bits(bitfile *ld, int16_t *sp, uint8_t len) -{ - uint8_t i; - - for (i = 0; i < len; i++) - { - if(sp[i]) - { - if(faad_get1bit(ld - DEBUGVAR(1,5,"huffman_sign_bits(): sign bit")) & 1) - { - sp[i] = -sp[i]; - } - } - } -} - -static INLINE int16_t huffman_getescape(bitfile *ld, int16_t sp) -{ - uint8_t neg, i; - int16_t j; - int16_t off; - - if (sp < 0) - { - if (sp != -16) - return sp; - neg = 1; - } else { - if (sp != 16) - return sp; - neg = 0; - } - - for (i = 4; ; i++) - { - if (faad_get1bit(ld - DEBUGVAR(1,6,"huffman_getescape(): escape size")) == 0) - { - break; - } - } - - off = (int16_t)faad_getbits(ld, i - DEBUGVAR(1,9,"huffman_getescape(): escape")); - - j = off | (1<<i); - if (neg) - j = -j; - - return j; -} - -static uint8_t huffman_2step_quad(uint8_t cb, bitfile *ld, int16_t *sp) -{ - uint32_t cw; - uint16_t offset = 0; - uint8_t extra_bits; - - cw = faad_showbits(ld, hcbN[cb]); - offset = hcb_table[cb][cw].offset; - extra_bits = hcb_table[cb][cw].extra_bits; - - if (extra_bits) - { - /* we know for sure it's more than hcbN[cb] bits long */ - faad_flushbits(ld, hcbN[cb]); - offset += (uint16_t)faad_showbits(ld, extra_bits); - faad_flushbits(ld, hcb_2_quad_table[cb][offset].bits - hcbN[cb]); - } else { - faad_flushbits(ld, hcb_2_quad_table[cb][offset].bits); - } - - if (offset > hcb_2_quad_table_size[cb]) - { - /* printf("ERROR: offset into hcb_2_quad_table = %d >%d!\n", offset, - hcb_2_quad_table_size[cb]); */ - return 10; - } - - sp[0] = hcb_2_quad_table[cb][offset].x; - sp[1] = hcb_2_quad_table[cb][offset].y; - sp[2] = hcb_2_quad_table[cb][offset].v; - sp[3] = hcb_2_quad_table[cb][offset].w; - - return 0; -} - -static uint8_t huffman_2step_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp) -{ - uint8_t err = huffman_2step_quad(cb, ld, sp); - huffman_sign_bits(ld, sp, QUAD_LEN); - - return err; -} - -static uint8_t huffman_2step_pair(uint8_t cb, bitfile *ld, int16_t *sp) -{ - uint32_t cw; - uint16_t offset = 0; - uint8_t extra_bits; - - cw = faad_showbits(ld, hcbN[cb]); - offset = hcb_table[cb][cw].offset; - extra_bits = hcb_table[cb][cw].extra_bits; - - if (extra_bits) - { - /* we know for sure it's more than hcbN[cb] bits long */ - faad_flushbits(ld, hcbN[cb]); - offset += (uint16_t)faad_showbits(ld, extra_bits); - faad_flushbits(ld, hcb_2_pair_table[cb][offset].bits - hcbN[cb]); - } else { - faad_flushbits(ld, hcb_2_pair_table[cb][offset].bits); - } - - if (offset > hcb_2_pair_table_size[cb]) - { - /* printf("ERROR: offset into hcb_2_pair_table = %d >%d!\n", offset, - hcb_2_pair_table_size[cb]); */ - return 10; - } - - sp[0] = hcb_2_pair_table[cb][offset].x; - sp[1] = hcb_2_pair_table[cb][offset].y; - - return 0; -} - -static uint8_t huffman_2step_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp) -{ - uint8_t err = huffman_2step_pair(cb, ld, sp); - huffman_sign_bits(ld, sp, PAIR_LEN); - - return err; -} - -static uint8_t huffman_binary_quad(uint8_t cb, bitfile *ld, int16_t *sp) -{ - uint16_t offset = 0; - - while (!hcb3[offset].is_leaf) - { - uint8_t b = faad_get1bit(ld - DEBUGVAR(1,255,"huffman_spectral_data():3")); - offset += hcb3[offset].data[b]; - } - - if (offset > hcb_bin_table_size[cb]) - { - /* printf("ERROR: offset into hcb_bin_table = %d >%d!\n", offset, - hcb_bin_table_size[cb]); */ - return 10; - } - - sp[0] = hcb3[offset].data[0]; - sp[1] = hcb3[offset].data[1]; - sp[2] = hcb3[offset].data[2]; - sp[3] = hcb3[offset].data[3]; - - return 0; -} - -static uint8_t huffman_binary_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp) -{ - uint8_t err = huffman_binary_quad(cb, ld, sp); - huffman_sign_bits(ld, sp, QUAD_LEN); - - return err; -} - -static uint8_t huffman_binary_pair(uint8_t cb, bitfile *ld, int16_t *sp) -{ - uint16_t offset = 0; - - while (!hcb_bin_table[cb][offset].is_leaf) - { - uint8_t b = faad_get1bit(ld - DEBUGVAR(1,255,"huffman_spectral_data():9")); - offset += hcb_bin_table[cb][offset].data[b]; - } - - if (offset > hcb_bin_table_size[cb]) - { - /* printf("ERROR: offset into hcb_bin_table = %d >%d!\n", offset, - hcb_bin_table_size[cb]); */ - return 10; - } - - sp[0] = hcb_bin_table[cb][offset].data[0]; - sp[1] = hcb_bin_table[cb][offset].data[1]; - - return 0; -} - -static uint8_t huffman_binary_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp) -{ - uint8_t err = huffman_binary_pair(cb, ld, sp); - huffman_sign_bits(ld, sp, PAIR_LEN); - - return err; -} - -static int16_t huffman_codebook(uint8_t i) -{ - static const uint32_t data = 16428320; - if (i == 0) return (int16_t)(data >> 16) & 0xFFFF; - else return (int16_t)data & 0xFFFF; -} - -static void vcb11_check_LAV(uint8_t cb, int16_t *sp) -{ - static const uint16_t vcb11_LAV_tab[] = { - 16, 31, 47, 63, 95, 127, 159, 191, 223, - 255, 319, 383, 511, 767, 1023, 2047 - }; - uint16_t max = 0; - - if (cb < 16 || cb > 31) - return; - - max = vcb11_LAV_tab[cb - 16]; - - if ((abs(sp[0]) > max) || (abs(sp[1]) > max)) - { - sp[0] = 0; - sp[1] = 0; - } -} - -uint8_t huffman_spectral_data(uint8_t cb, bitfile *ld, int16_t *sp) -{ - switch (cb) - { - case 1: /* 2-step method for data quadruples */ - case 2: - return huffman_2step_quad(cb, ld, sp); - case 3: /* binary search for data quadruples */ - return huffman_binary_quad_sign(cb, ld, sp); - case 4: /* 2-step method for data quadruples */ - return huffman_2step_quad_sign(cb, ld, sp); - case 5: /* binary search for data pairs */ - return huffman_binary_pair(cb, ld, sp); - case 6: /* 2-step method for data pairs */ - return huffman_2step_pair(cb, ld, sp); - case 7: /* binary search for data pairs */ - case 9: - return huffman_binary_pair_sign(cb, ld, sp); - case 8: /* 2-step method for data pairs */ - case 10: - return huffman_2step_pair_sign(cb, ld, sp); - case 12: { - uint8_t err = huffman_2step_pair(11, ld, sp); - sp[0] = huffman_codebook(0); sp[1] = huffman_codebook(1); - return err; } - case 11: - { - uint8_t err = huffman_2step_pair_sign(11, ld, sp); - sp[0] = huffman_getescape(ld, sp[0]); - sp[1] = huffman_getescape(ld, sp[1]); - return err; - } -#ifdef ERROR_RESILIENCE - /* VCB11 uses codebook 11 */ - case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23: - case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31: - { - uint8_t err = huffman_2step_pair_sign(11, ld, sp); - sp[0] = huffman_getescape(ld, sp[0]); - sp[1] = huffman_getescape(ld, sp[1]); - - /* check LAV (Largest Absolute Value) */ - /* this finds errors in the ESCAPE signal */ - vcb11_check_LAV(cb, sp); - - return err; - } -#endif - default: - /* Non existent codebook number, something went wrong */ - return 11; - } - - return 0; -} - - -#ifdef ERROR_RESILIENCE - -/* Special version of huffman_spectral_data -Will not read from a bitfile but a bits_t structure. -Will keep track of the bits decoded and return the number of bits remaining. -Do not read more than ld->len, return -1 if codeword would be longer */ - -int8_t huffman_spectral_data_2(uint8_t cb, bits_t *ld, int16_t *sp) -{ - uint32_t cw; - uint16_t offset = 0; - uint8_t extra_bits; - uint8_t i, vcb11 = 0; - - - switch (cb) - { - case 1: /* 2-step method for data quadruples */ - case 2: - case 4: - - cw = showbits_hcr(ld, hcbN[cb]); - offset = hcb_table[cb][cw].offset; - extra_bits = hcb_table[cb][cw].extra_bits; - - if (extra_bits) - { - /* we know for sure it's more than hcbN[cb] bits long */ - if ( flushbits_hcr(ld, hcbN[cb]) ) return -1; - offset += (uint16_t)showbits_hcr(ld, extra_bits); - if ( flushbits_hcr(ld, hcb_2_quad_table[cb][offset].bits - hcbN[cb]) ) return -1; - } else { - if ( flushbits_hcr(ld, hcb_2_quad_table[cb][offset].bits) ) return -1; - } - - sp[0] = hcb_2_quad_table[cb][offset].x; - sp[1] = hcb_2_quad_table[cb][offset].y; - sp[2] = hcb_2_quad_table[cb][offset].v; - sp[3] = hcb_2_quad_table[cb][offset].w; - break; - - case 6: /* 2-step method for data pairs */ - case 8: - case 10: - case 11: - /* VCB11 uses codebook 11 */ - case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23: - case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31: - - if (cb >= 16) - { - /* store the virtual codebook */ - vcb11 = cb; - cb = 11; - } - - cw = showbits_hcr(ld, hcbN[cb]); - offset = hcb_table[cb][cw].offset; - extra_bits = hcb_table[cb][cw].extra_bits; - - if (extra_bits) - { - /* we know for sure it's more than hcbN[cb] bits long */ - if ( flushbits_hcr(ld, hcbN[cb]) ) return -1; - offset += (uint16_t)showbits_hcr(ld, extra_bits); - if ( flushbits_hcr(ld, hcb_2_pair_table[cb][offset].bits - hcbN[cb]) ) return -1; - } else { - if ( flushbits_hcr(ld, hcb_2_pair_table[cb][offset].bits) ) return -1; - } - sp[0] = hcb_2_pair_table[cb][offset].x; - sp[1] = hcb_2_pair_table[cb][offset].y; - break; - - case 3: /* binary search for data quadruples */ - - while (!hcb3[offset].is_leaf) - { - uint8_t b; - - if ( get1bit_hcr(ld, &b) ) return -1; - offset += hcb3[offset].data[b]; - } - - sp[0] = hcb3[offset].data[0]; - sp[1] = hcb3[offset].data[1]; - sp[2] = hcb3[offset].data[2]; - sp[3] = hcb3[offset].data[3]; - - break; - - case 5: /* binary search for data pairs */ - case 7: - case 9: - - while (!hcb_bin_table[cb][offset].is_leaf) - { - uint8_t b; - - if (get1bit_hcr(ld, &b) ) return -1; - offset += hcb_bin_table[cb][offset].data[b]; - } - - sp[0] = hcb_bin_table[cb][offset].data[0]; - sp[1] = hcb_bin_table[cb][offset].data[1]; - - break; - } - - /* decode sign bits */ - if (unsigned_cb[cb]) - { - for(i = 0; i < ((cb < FIRST_PAIR_HCB) ? QUAD_LEN : PAIR_LEN); i++) - { - if(sp[i]) - { - uint8_t b; - if ( get1bit_hcr(ld, &b) ) return -1; - if (b != 0) { - sp[i] = -sp[i]; - } - } - } - } - - /* decode huffman escape bits */ - if ((cb == ESC_HCB) || (cb >= 16)) - { - uint8_t k; - for (k = 0; k < 2; k++) - { - if ((sp[k] == 16) || (sp[k] == -16)) - { - uint8_t neg, i; - int32_t j; - uint32_t off; - - neg = (sp[k] < 0) ? 1 : 0; - - for (i = 4; ; i++) - { - uint8_t b; - if (get1bit_hcr(ld, &b)) - return -1; - if (b == 0) - break; - } - - if (getbits_hcr(ld, i, &off)) - return -1; - j = off + (1<<i); - sp[k] = (int16_t)((neg) ? -j : j); - } - } - - if (vcb11 != 0) - { - /* check LAV (Largest Absolute Value) */ - /* this finds errors in the ESCAPE signal */ - vcb11_check_LAV(vcb11, sp); - } - } - return ld->len; -} - -#endif - diff --git a/src/libfaad/huffman.h b/src/libfaad/huffman.h deleted file mode 100644 index cffe23093..000000000 --- a/src/libfaad/huffman.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: huffman.h,v 1.7 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#ifndef __HUFFMAN_H__ -#define __HUFFMAN_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -int8_t huffman_scale_factor(bitfile *ld); -uint8_t huffman_spectral_data(uint8_t cb, bitfile *ld, int16_t *sp); -#ifdef ERROR_RESILIENCE -int8_t huffman_spectral_data_2(uint8_t cb, bits_t *ld, int16_t *sp); -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/ic_predict.c b/src/libfaad/ic_predict.c deleted file mode 100644 index 82753a9f2..000000000 --- a/src/libfaad/ic_predict.c +++ /dev/null @@ -1,267 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: ic_predict.c,v 1.7 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#ifdef MAIN_DEC - -#include "syntax.h" -#include "ic_predict.h" -#include "pns.h" - - -static void flt_round(float32_t *pf) -{ - int32_t flg; - uint32_t tmp, tmp1, tmp2; - - tmp = *(uint32_t*)pf; - flg = tmp & (uint32_t)0x00008000; - tmp &= (uint32_t)0xffff0000; - tmp1 = tmp; - /* round 1/2 lsb toward infinity */ - if (flg) - { - tmp &= (uint32_t)0xff800000; /* extract exponent and sign */ - tmp |= (uint32_t)0x00010000; /* insert 1 lsb */ - tmp2 = tmp; /* add 1 lsb and elided one */ - tmp &= (uint32_t)0xff800000; /* extract exponent and sign */ - - *pf = *(float32_t*)&tmp1 + *(float32_t*)&tmp2 - *(float32_t*)&tmp; - } else { - *pf = *(float32_t*)&tmp; - } -} - -static int16_t quant_pred(float32_t x) -{ - int16_t q; - uint32_t *tmp = (uint32_t*)&x; - - q = (int16_t)(*tmp>>16); - - return q; -} - -static float32_t inv_quant_pred(int16_t q) -{ - float32_t x; - uint32_t *tmp = (uint32_t*)&x; - *tmp = ((uint32_t)q)<<16; - - return x; -} - -static void ic_predict(pred_state *state, real_t input, real_t *output, uint8_t pred) -{ - uint16_t tmp; - int16_t i, j; - real_t dr1, predictedvalue; - real_t e0, e1; - real_t k1, k2; - - real_t r[2]; - real_t COR[2]; - real_t VAR[2]; - - r[0] = inv_quant_pred(state->r[0]); - r[1] = inv_quant_pred(state->r[1]); - COR[0] = inv_quant_pred(state->COR[0]); - COR[1] = inv_quant_pred(state->COR[1]); - VAR[0] = inv_quant_pred(state->VAR[0]); - VAR[1] = inv_quant_pred(state->VAR[1]); - - -#if 1 - tmp = state->VAR[0]; - j = (tmp >> 7); - i = tmp & 0x7f; - if (j >= 128) - { - j -= 128; - k1 = COR[0] * exp_table[j] * mnt_table[i]; - } else { - k1 = REAL_CONST(0); - } -#else - - { -#define B 0.953125 - real_t c = COR[0]; - real_t v = VAR[0]; - real_t tmp; - if (c == 0 || v <= 1) - { - k1 = 0; - } else { - tmp = B / v; - flt_round(&tmp); - k1 = c * tmp; - } - } -#endif - - if (pred) - { -#if 1 - tmp = state->VAR[1]; - j = (tmp >> 7); - i = tmp & 0x7f; - if (j >= 128) - { - j -= 128; - k2 = COR[1] * exp_table[j] * mnt_table[i]; - } else { - k2 = REAL_CONST(0); - } -#else - -#define B 0.953125 - real_t c = COR[1]; - real_t v = VAR[1]; - real_t tmp; - if (c == 0 || v <= 1) - { - k2 = 0; - } else { - tmp = B / v; - flt_round(&tmp); - k2 = c * tmp; - } -#endif - - predictedvalue = k1*r[0] + k2*r[1]; - flt_round(&predictedvalue); - *output = input + predictedvalue; - } - - /* calculate new state data */ - e0 = *output; - e1 = e0 - k1*r[0]; - dr1 = k1*e0; - - VAR[0] = ALPHA*VAR[0] + 0.5f * (r[0]*r[0] + e0*e0); - COR[0] = ALPHA*COR[0] + r[0]*e0; - VAR[1] = ALPHA*VAR[1] + 0.5f * (r[1]*r[1] + e1*e1); - COR[1] = ALPHA*COR[1] + r[1]*e1; - - r[1] = A * (r[0]-dr1); - r[0] = A * e0; - - state->r[0] = quant_pred(r[0]); - state->r[1] = quant_pred(r[1]); - state->COR[0] = quant_pred(COR[0]); - state->COR[1] = quant_pred(COR[1]); - state->VAR[0] = quant_pred(VAR[0]); - state->VAR[1] = quant_pred(VAR[1]); -} - -static void reset_pred_state(pred_state *state) -{ - state->r[0] = 0; - state->r[1] = 0; - state->COR[0] = 0; - state->COR[1] = 0; - state->VAR[0] = 0x3F80; - state->VAR[1] = 0x3F80; -} - -void pns_reset_pred_state(ic_stream *ics, pred_state *state) -{ - uint8_t sfb, g, b; - uint16_t i, offs, offs2; - - /* prediction only for long blocks */ - if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) - return; - - for (g = 0; g < ics->num_window_groups; g++) - { - for (b = 0; b < ics->window_group_length[g]; b++) - { - for (sfb = 0; sfb < ics->max_sfb; sfb++) - { - if (is_noise(ics, g, sfb)) - { - offs = ics->swb_offset[sfb]; - offs2 = ics->swb_offset[sfb+1]; - - for (i = offs; i < offs2; i++) - reset_pred_state(&state[i]); - } - } - } - } -} - -void reset_all_predictors(pred_state *state, uint16_t frame_len) -{ - uint16_t i; - - for (i = 0; i < frame_len; i++) - reset_pred_state(&state[i]); -} - -/* intra channel prediction */ -void ic_prediction(ic_stream *ics, real_t *spec, pred_state *state, - uint16_t frame_len, uint8_t sf_index) -{ - uint8_t sfb; - uint16_t bin; - - if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) - { - reset_all_predictors(state, frame_len); - } else { - for (sfb = 0; sfb < max_pred_sfb(sf_index); sfb++) - { - uint16_t low = ics->swb_offset[sfb]; - uint16_t high = ics->swb_offset[sfb+1]; - - for (bin = low; bin < high; bin++) - { - ic_predict(&state[bin], spec[bin], &spec[bin], - (ics->predictor_data_present && ics->pred.prediction_used[sfb])); - } - } - - if (ics->predictor_data_present) - { - if (ics->pred.predictor_reset) - { - for (bin = ics->pred.predictor_reset_group_number - 1; - bin < frame_len; bin += 30) - { - reset_pred_state(&state[bin]); - } - } - } - } -} - -#endif diff --git a/src/libfaad/ic_predict.h b/src/libfaad/ic_predict.h deleted file mode 100644 index 233992b96..000000000 --- a/src/libfaad/ic_predict.h +++ /dev/null @@ -1,249 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: ic_predict.h,v 1.7 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#ifdef MAIN_DEC - -#ifndef __IC_PREDICT_H__ -#define __IC_PREDICT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define ALPHA REAL_CONST(0.90625) -#define A REAL_CONST(0.953125) - - -void pns_reset_pred_state(ic_stream *ics, pred_state *state); -void reset_all_predictors(pred_state *state, uint16_t frame_len); -void ic_prediction(ic_stream *ics, real_t *spec, pred_state *state, - uint16_t frame_len, uint8_t sf_index); - -ALIGN static const real_t mnt_table[128] = { - COEF_CONST(0.9531250000), COEF_CONST(0.9453125000), - COEF_CONST(0.9375000000), COEF_CONST(0.9296875000), - COEF_CONST(0.9257812500), COEF_CONST(0.9179687500), - COEF_CONST(0.9101562500), COEF_CONST(0.9023437500), - COEF_CONST(0.8984375000), COEF_CONST(0.8906250000), - COEF_CONST(0.8828125000), COEF_CONST(0.8789062500), - COEF_CONST(0.8710937500), COEF_CONST(0.8671875000), - COEF_CONST(0.8593750000), COEF_CONST(0.8515625000), - COEF_CONST(0.8476562500), COEF_CONST(0.8398437500), - COEF_CONST(0.8359375000), COEF_CONST(0.8281250000), - COEF_CONST(0.8242187500), COEF_CONST(0.8203125000), - COEF_CONST(0.8125000000), COEF_CONST(0.8085937500), - COEF_CONST(0.8007812500), COEF_CONST(0.7968750000), - COEF_CONST(0.7929687500), COEF_CONST(0.7851562500), - COEF_CONST(0.7812500000), COEF_CONST(0.7773437500), - COEF_CONST(0.7734375000), COEF_CONST(0.7656250000), - COEF_CONST(0.7617187500), COEF_CONST(0.7578125000), - COEF_CONST(0.7539062500), COEF_CONST(0.7500000000), - COEF_CONST(0.7421875000), COEF_CONST(0.7382812500), - COEF_CONST(0.7343750000), COEF_CONST(0.7304687500), - COEF_CONST(0.7265625000), COEF_CONST(0.7226562500), - COEF_CONST(0.7187500000), COEF_CONST(0.7148437500), - COEF_CONST(0.7109375000), COEF_CONST(0.7070312500), - COEF_CONST(0.6992187500), COEF_CONST(0.6953125000), - COEF_CONST(0.6914062500), COEF_CONST(0.6875000000), - COEF_CONST(0.6835937500), COEF_CONST(0.6796875000), - COEF_CONST(0.6796875000), COEF_CONST(0.6757812500), - COEF_CONST(0.6718750000), COEF_CONST(0.6679687500), - COEF_CONST(0.6640625000), COEF_CONST(0.6601562500), - COEF_CONST(0.6562500000), COEF_CONST(0.6523437500), - COEF_CONST(0.6484375000), COEF_CONST(0.6445312500), - COEF_CONST(0.6406250000), COEF_CONST(0.6406250000), - COEF_CONST(0.6367187500), COEF_CONST(0.6328125000), - COEF_CONST(0.6289062500), COEF_CONST(0.6250000000), - COEF_CONST(0.6210937500), COEF_CONST(0.6210937500), - COEF_CONST(0.6171875000), COEF_CONST(0.6132812500), - COEF_CONST(0.6093750000), COEF_CONST(0.6054687500), - COEF_CONST(0.6054687500), COEF_CONST(0.6015625000), - COEF_CONST(0.5976562500), COEF_CONST(0.5937500000), - COEF_CONST(0.5937500000), COEF_CONST(0.5898437500), - COEF_CONST(0.5859375000), COEF_CONST(0.5820312500), - COEF_CONST(0.5820312500), COEF_CONST(0.5781250000), - COEF_CONST(0.5742187500), COEF_CONST(0.5742187500), - COEF_CONST(0.5703125000), COEF_CONST(0.5664062500), - COEF_CONST(0.5664062500), COEF_CONST(0.5625000000), - COEF_CONST(0.5585937500), COEF_CONST(0.5585937500), - COEF_CONST(0.5546875000), COEF_CONST(0.5507812500), - COEF_CONST(0.5507812500), COEF_CONST(0.5468750000), - COEF_CONST(0.5429687500), COEF_CONST(0.5429687500), - COEF_CONST(0.5390625000), COEF_CONST(0.5390625000), - COEF_CONST(0.5351562500), COEF_CONST(0.5312500000), - COEF_CONST(0.5312500000), COEF_CONST(0.5273437500), - COEF_CONST(0.5273437500), COEF_CONST(0.5234375000), - COEF_CONST(0.5195312500), COEF_CONST(0.5195312500), - COEF_CONST(0.5156250000), COEF_CONST(0.5156250000), - COEF_CONST(0.5117187500), COEF_CONST(0.5117187500), - COEF_CONST(0.5078125000), COEF_CONST(0.5078125000), - COEF_CONST(0.5039062500), COEF_CONST(0.5039062500), - COEF_CONST(0.5000000000), COEF_CONST(0.4980468750), - COEF_CONST(0.4960937500), COEF_CONST(0.4941406250), - COEF_CONST(0.4921875000), COEF_CONST(0.4902343750), - COEF_CONST(0.4882812500), COEF_CONST(0.4863281250), - COEF_CONST(0.4843750000), COEF_CONST(0.4824218750), - COEF_CONST(0.4804687500), COEF_CONST(0.4785156250) -}; - -ALIGN static const real_t exp_table[128] = { - COEF_CONST(0.50000000000000000000000000000000000000000000000000), - COEF_CONST(0.25000000000000000000000000000000000000000000000000), - COEF_CONST(0.12500000000000000000000000000000000000000000000000), - COEF_CONST(0.06250000000000000000000000000000000000000000000000), - COEF_CONST(0.03125000000000000000000000000000000000000000000000), - COEF_CONST(0.01562500000000000000000000000000000000000000000000), - COEF_CONST(0.00781250000000000000000000000000000000000000000000), - COEF_CONST(0.00390625000000000000000000000000000000000000000000), - COEF_CONST(0.00195312500000000000000000000000000000000000000000), - COEF_CONST(0.00097656250000000000000000000000000000000000000000), - COEF_CONST(0.00048828125000000000000000000000000000000000000000), - COEF_CONST(0.00024414062500000000000000000000000000000000000000), - COEF_CONST(0.00012207031250000000000000000000000000000000000000), - COEF_CONST(0.00006103515625000000000000000000000000000000000000), - COEF_CONST(0.00003051757812500000000000000000000000000000000000), - COEF_CONST(0.00001525878906250000000000000000000000000000000000), - COEF_CONST(0.00000762939453125000000000000000000000000000000000), - COEF_CONST(0.00000381469726562500000000000000000000000000000000), - COEF_CONST(0.00000190734863281250000000000000000000000000000000), - COEF_CONST(0.00000095367431640625000000000000000000000000000000), - COEF_CONST(0.00000047683715820312500000000000000000000000000000), - COEF_CONST(0.00000023841857910156250000000000000000000000000000), - COEF_CONST(0.00000011920928955078125000000000000000000000000000), - COEF_CONST(0.00000005960464477539062500000000000000000000000000), - COEF_CONST(0.00000002980232238769531300000000000000000000000000), - COEF_CONST(0.00000001490116119384765600000000000000000000000000), - COEF_CONST(0.00000000745058059692382810000000000000000000000000), - COEF_CONST(0.00000000372529029846191410000000000000000000000000), - COEF_CONST(0.00000000186264514923095700000000000000000000000000), - COEF_CONST(0.00000000093132257461547852000000000000000000000000), - COEF_CONST(0.00000000046566128730773926000000000000000000000000), - COEF_CONST(0.00000000023283064365386963000000000000000000000000), - COEF_CONST(0.00000000011641532182693481000000000000000000000000), - COEF_CONST(0.00000000005820766091346740700000000000000000000000), - COEF_CONST(0.00000000002910383045673370400000000000000000000000), - COEF_CONST(0.00000000001455191522836685200000000000000000000000), - COEF_CONST(0.00000000000727595761418342590000000000000000000000), - COEF_CONST(0.00000000000363797880709171300000000000000000000000), - COEF_CONST(0.00000000000181898940354585650000000000000000000000), - COEF_CONST(0.00000000000090949470177292824000000000000000000000), - COEF_CONST(0.00000000000045474735088646412000000000000000000000), - COEF_CONST(0.00000000000022737367544323206000000000000000000000), - COEF_CONST(0.00000000000011368683772161603000000000000000000000), - COEF_CONST(0.00000000000005684341886080801500000000000000000000), - COEF_CONST(0.00000000000002842170943040400700000000000000000000), - COEF_CONST(0.00000000000001421085471520200400000000000000000000), - COEF_CONST(0.00000000000000710542735760100190000000000000000000), - COEF_CONST(0.00000000000000355271367880050090000000000000000000), - COEF_CONST(0.00000000000000177635683940025050000000000000000000), - COEF_CONST(0.00000000000000088817841970012523000000000000000000), - COEF_CONST(0.00000000000000044408920985006262000000000000000000), - COEF_CONST(0.00000000000000022204460492503131000000000000000000), - COEF_CONST(0.00000000000000011102230246251565000000000000000000), - COEF_CONST(0.00000000000000005551115123125782700000000000000000), - COEF_CONST(0.00000000000000002775557561562891400000000000000000), - COEF_CONST(0.00000000000000001387778780781445700000000000000000), - COEF_CONST(0.00000000000000000693889390390722840000000000000000), - COEF_CONST(0.00000000000000000346944695195361420000000000000000), - COEF_CONST(0.00000000000000000173472347597680710000000000000000), - COEF_CONST(0.00000000000000000086736173798840355000000000000000), - COEF_CONST(0.00000000000000000043368086899420177000000000000000), - COEF_CONST(0.00000000000000000021684043449710089000000000000000), - COEF_CONST(0.00000000000000000010842021724855044000000000000000), - COEF_CONST(0.00000000000000000005421010862427522200000000000000), - COEF_CONST(0.00000000000000000002710505431213761100000000000000), - COEF_CONST(0.00000000000000000001355252715606880500000000000000), - COEF_CONST(0.00000000000000000000677626357803440270000000000000), - COEF_CONST(0.00000000000000000000338813178901720140000000000000), - COEF_CONST(0.00000000000000000000169406589450860070000000000000), - COEF_CONST(0.00000000000000000000084703294725430034000000000000), - COEF_CONST(0.00000000000000000000042351647362715017000000000000), - COEF_CONST(0.00000000000000000000021175823681357508000000000000), - COEF_CONST(0.00000000000000000000010587911840678754000000000000), - COEF_CONST(0.00000000000000000000005293955920339377100000000000), - COEF_CONST(0.00000000000000000000002646977960169688600000000000), - COEF_CONST(0.00000000000000000000001323488980084844300000000000), - COEF_CONST(0.00000000000000000000000661744490042422140000000000), - COEF_CONST(0.00000000000000000000000330872245021211070000000000), - COEF_CONST(0.00000000000000000000000165436122510605530000000000), - COEF_CONST(0.00000000000000000000000082718061255302767000000000), - COEF_CONST(0.00000000000000000000000041359030627651384000000000), - COEF_CONST(0.00000000000000000000000020679515313825692000000000), - COEF_CONST(0.00000000000000000000000010339757656912846000000000), - COEF_CONST(0.00000000000000000000000005169878828456423000000000), - COEF_CONST(0.00000000000000000000000002584939414228211500000000), - COEF_CONST(0.00000000000000000000000001292469707114105700000000), - COEF_CONST(0.00000000000000000000000000646234853557052870000000), - COEF_CONST(0.00000000000000000000000000323117426778526440000000), - COEF_CONST(0.00000000000000000000000000161558713389263220000000), - COEF_CONST(0.00000000000000000000000000080779356694631609000000), - COEF_CONST(0.00000000000000000000000000040389678347315804000000), - COEF_CONST(0.00000000000000000000000000020194839173657902000000), - COEF_CONST(0.00000000000000000000000000010097419586828951000000), - COEF_CONST(0.00000000000000000000000000005048709793414475600000), - COEF_CONST(0.00000000000000000000000000002524354896707237800000), - COEF_CONST(0.00000000000000000000000000001262177448353618900000), - COEF_CONST(0.00000000000000000000000000000631088724176809440000), - COEF_CONST(0.00000000000000000000000000000315544362088404720000), - COEF_CONST(0.00000000000000000000000000000157772181044202360000), - COEF_CONST(0.00000000000000000000000000000078886090522101181000), - COEF_CONST(0.00000000000000000000000000000039443045261050590000), - COEF_CONST(0.00000000000000000000000000000019721522630525295000), - COEF_CONST(0.00000000000000000000000000000009860761315262647600), - COEF_CONST(0.00000000000000000000000000000004930380657631323800), - COEF_CONST(0.00000000000000000000000000000002465190328815661900), - COEF_CONST(0.00000000000000000000000000000001232595164407830900), - COEF_CONST(0.00000000000000000000000000000000616297582203915470), - COEF_CONST(0.00000000000000000000000000000000308148791101957740), - COEF_CONST(0.00000000000000000000000000000000154074395550978870), - COEF_CONST(0.00000000000000000000000000000000077037197775489434), - COEF_CONST(0.00000000000000000000000000000000038518598887744717), - COEF_CONST(0.00000000000000000000000000000000019259299443872359), - COEF_CONST(0.00000000000000000000000000000000009629649721936179), - COEF_CONST(0.00000000000000000000000000000000004814824860968090), - COEF_CONST(0.00000000000000000000000000000000002407412430484045), - COEF_CONST(0.00000000000000000000000000000000001203706215242022), - COEF_CONST(0.00000000000000000000000000000000000601853107621011), - COEF_CONST(0.00000000000000000000000000000000000300926553810506), - COEF_CONST(0.00000000000000000000000000000000000150463276905253), - COEF_CONST(0.00000000000000000000000000000000000075231638452626), - COEF_CONST(0.00000000000000000000000000000000000037615819226313), - COEF_CONST(0.00000000000000000000000000000000000018807909613157), - COEF_CONST(0.00000000000000000000000000000000000009403954806578), - COEF_CONST(0.00000000000000000000000000000000000004701977403289), - COEF_CONST(0.00000000000000000000000000000000000002350988701645), - COEF_CONST(0.00000000000000000000000000000000000001175494350822), - COEF_CONST(0.0 /* 0000000000000000000000000000000000000587747175411 "floating point underflow" */), - COEF_CONST(0.0) -}; - -#ifdef __cplusplus -} -#endif -#endif - -#endif diff --git a/src/libfaad/iq_table.h b/src/libfaad/iq_table.h deleted file mode 100644 index 9002e15d7..000000000 --- a/src/libfaad/iq_table.h +++ /dev/null @@ -1,16455 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: iq_table.h,v 1.6 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#ifndef IQ_TABLE_H__ -#define IQ_TABLE_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -/* !!!DON'T CHANGE IQ_TABLE_SIZE!!! */ - - -#ifndef FIXED_POINT - -#define IQ_TABLE_SIZE 8192 - -#ifdef _MSC_VER -#pragma warning(disable:4305) -#pragma warning(disable:4244) -#endif - -ALIGN static const real_t iq_table[IQ_TABLE_SIZE] = -{ - 0, - 1, - 2.5198420997897464, - 4.3267487109222245, - 6.3496042078727974, - 8.5498797333834844, - 10.902723556992836, - 13.390518279406722, - 15.999999999999998, - 18.720754407467133, - 21.544346900318832, - 24.463780996262464, - 27.47314182127996, - 30.567350940369842, - 33.741991698453212, - 36.993181114957046, - 40.317473596635935, - 43.711787041189993, - 47.173345095760126, - 50.699631325716943, - 54.288352331898118, - 57.937407704003519, - 61.6448652744185, - 65.408940536585988, - 69.227979374755591, - 73.100443455321638, - 77.024897778591622, - 80.999999999999986, - 85.024491212518527, - 89.097187944889555, - 93.216975178615741, - 97.382800224133163, - 101.59366732596474, - 105.84863288986224, - 110.14680124343441, - 114.4873208566006, - 118.86938096020653, - 123.29220851090024, - 127.75506545836058, - 132.25724627755247, - 136.79807573413572, - 141.37690685569191, - 145.99311908523086, - 150.6461165966291, - 155.33532675434674, - 160.06019870205279, - 164.82020206673349, - 169.61482576651861, - 174.44357691188537, - 179.30597979112557, - 184.20157493201927, - 189.12991823257562, - 194.09058015449685, - 199.08314497371677, - 204.1072100829694, - 209.16238534187647, - 214.24829247050752, - 219.36456448277784, - 224.51084515641216, - 229.6867885365223, - 234.89205847013176, - 240.12632816923249, - 245.38927980018505, - 250.68060409747261, - 255.99999999999991, - 261.34717430828869, - 266.72184136106449, - 272.12372272986045, - 277.55254693037961, - 283.0080491494619, - 288.48997098659891, - 293.99806020902247, - 299.53207051947408, - 305.0917613358298, - 310.67689758182206, - 316.28724948815585, - 321.92259240337177, - 327.58270661385535, - 333.26737717243742, - 338.97639373507025, - 344.70955040510125, - 350.46664558470013, - 356.24748183302603, - 362.05186573075139, - 367.87960775058258, - 373.73052213344511, - 379.60442677002078, - 385.50114308734607, - 391.42049594019937, - 397.36231350702371, - 403.32642719014467, - 409.31267152006262, - 415.32088406360799, - 421.35090533576471, - 427.40257871497619, - 433.4757503617617, - 439.5702691404793, - 445.68598654408271, - 451.82275662172759, - 457.98043590909128, - 464.15888336127773, - 470.35796028818726, - 476.5775302922363, - 482.81745920832043, - 489.07761504591741, - 495.35786793323581, - 501.65809006331688, - 507.97815564200368, - 514.31794083769648, - 520.67732373281672, - 527.05618427690604, - 533.45440424129174, - 539.87186717525128, - 546.30845836361505, - 552.76406478574609, - 559.23857507584194, - 565.73187948450413, - 572.24386984152341, - 578.77443951983378, - 585.32348340058843, - 591.89089783931263, - 598.47658063309257, - 605.08043098876044, - 611.70234949203643, - 618.3422380775919, - 624.99999999999977, - 631.67553980553748, - 638.36876330481164, - 645.07957754617485, - 651.80789078990415, - 658.55361248311499, - 665.31665323538357, - 672.09692479505225, - 678.8943400261943, - 685.70881288621433, - 692.540258404062, - 699.38859265903977, - 706.25373276018058, - 713.13559682617972, - 720.03410396586037, - 726.94917425915435, - 733.88072873858209, - 740.82868937121543, - 747.79297904110535, - 754.77352153216191, - 761.77024151147043, - 768.78306451302956, - 775.81191692189896, - 782.85672595874246, - 789.91741966475445, - 796.99392688695798, - 804.08617726386274, - 811.19410121147098, - 818.31762990962227, - 825.45669528866563, - 832.61123001644864, - 839.78116748561604, - 846.96644180120552, - 854.16698776853514, - 861.38274088137143, - 868.61363731036977, - 875.85961389178203, - 883.12060811641959, - 890.39655811886757, - 897.68740266694181, - 904.99308115138172, - 912.31353357577188, - 919.64870054668756, - 926.99852326405619, - 934.36294351172899, - 941.74190364825859, - 949.13534659787422, - 956.54321584165211, - 963.96545540887348, - 971.40200986856541, - 978.85282432122176, - 986.31784439069588, - 993.7970162162635, - 1001.29028644485, - 1008.797602223418, - 1016.3189111915103, - 1023.8541614739464, - 1031.4033016736653, - 1038.9662808647138, - 1046.5430485853758, - 1054.1335548314366, - 1061.7377500495838, - 1069.3555851309357, - 1076.9870114046978, - 1084.6319806319441, - 1092.2904449995174, - 1099.9623571140482, - 1107.6476699960892, - 1115.3463370743607, - 1123.058312180106, - 1130.7835495415541, - 1138.5220037784854, - 1146.273629896901, - 1154.0383832837879, - 1161.816219701986, - 1169.607095285146, - 1177.4109665327808, - 1185.2277903054078, - 1193.0575238197798, - 1200.9001246442001, - 1208.7555506939248, - 1216.6237602266442, - 1224.5047118380478, - 1232.3983644574657, - 1240.3046773435874, - 1248.2236100802568, - 1256.1551225723395, - 1264.099175041662, - 1272.0557280230228, - 1280.0247423602691, - 1288.0061792024444, - 1295.9999999999995, - 1304.006166501068, - 1312.0246407478062, - 1320.0553850727929, - 1328.0983620954903, - 1336.1535347187651, - 1344.2208661254647, - 1352.3003197750522, - 1360.3918594002962, - 1368.4954490040145, - 1376.6110528558709, - 1384.7386354892244, - 1392.8781616980295, - 1401.0295965337855, - 1409.1929053025353, - 1417.3680535619119, - 1425.5550071182327, - 1433.7537320236374, - 1441.9641945732744, - 1450.1863613025282, - 1458.4201989842913, - 1466.6656746262797, - 1474.9227554683875, - 1483.1914089800841, - 1491.4716028578516, - 1499.7633050226596, - 1508.0664836174794, - 1516.3811070048375, - 1524.7071437644029, - 1533.0445626906128, - 1541.3933327903342, - 1549.7534232805581, - 1558.1248035861302, - 1566.507443337515, - 1574.9013123685909, - 1583.3063807144795, - 1591.7226186094069, - 1600.1499964845941, - 1608.58848496618, - 1617.0380548731737, - 1625.4986772154357, - 1633.9703231916887, - 1642.4529641875577, - 1650.9465717736346, - 1659.4511177035752, - 1667.9665739122186, - 1676.4929125137353, - 1685.030105799801, - 1693.5781262377957, - 1702.136946469027, - 1710.7065393069795, - 1719.2868777355877, - 1727.8779349075323, - 1736.4796841425596, - 1745.092098925825, - 1753.7151529062583, - 1762.3488198949503, - 1770.9930738635628, - 1779.6478889427597, - 1788.3132394206564, - 1796.9890997412947, - 1805.6754445031333, - 1814.3722484575621, - 1823.0794865074322, - 1831.7971337056094, - 1840.5251652535437, - 1849.2635564998579, - 1858.0122829389563, - 1866.7713202096493, - 1875.5406440937966, - 1884.3202305149687, - 1893.110055537124, - 1901.9100953633042, - 1910.7203263343454, - 1919.5407249276057, - 1928.3712677557098, - 1937.2119315653083, - 1946.0626932358525, - 1954.923529778386, - 1963.79441833435, - 1972.6753361744036, - 1981.5662606972594, - 1990.467169428533, - 1999.3780400196069, - 2008.2988502465078, - 2017.2295780087982, - 2026.1702013284819, - 2035.1206983489212, - 2044.0810473337688, - 2053.0512266659125, - 2062.0312148464309, - 2071.0209904935646, - 2080.0205323416958, - 2089.0298192403443, - 2098.0488301531714, - 2107.0775441569995, - 2116.115940440839, - 2125.1639983049317, - 2134.2216971597995, - 2143.2890165253098, - 2152.3659360297484, - 2161.4524354089031, - 2170.5484945051617, - 2179.6540932666144, - 2188.7692117461711, - 2197.8938301006888, - 2207.0279285901042, - 2216.1714875765838, - 2225.324487523676, - 2234.4869089954782, - 2243.6587326558101, - 2252.8399392673982, - 2262.0305096910702, - 2271.2304248849537, - 2280.4396659036897, - 2289.6582138976523, - 2298.8860501121762, - 2308.1231558867926, - 2317.3695126544767, - 2326.6251019409005, - 2335.8899053636933, - 2345.1639046317132, - 2354.4470815443233, - 2363.7394179906792, - 2373.0408959490205, - 2382.3514974859731, - 2391.6712047558558, - 2400.9999999999991, - 2410.3378655460651, - 2419.6847838073813, - 2429.0407372822747, - 2438.4057085534191, - 2447.7796802871858, - 2457.1626352330004, - 2466.5545562227112, - 2475.9554261699564, - 2485.3652280695474, - 2494.7839449968492, - 2504.2115601071737, - 2513.6480566351788, - 2523.0934178942675, - 2532.5476272760025, - 2542.0106682495189, - 2551.482524360948, - 2560.9631792328441, - 2570.4526165636184, - 2579.9508201269791, - 2589.4577737713744, - 2598.9734614194458, - 2608.4978670674823, - 2618.0309747848837, - 2627.5727687136259, - 2637.1232330677353, - 2646.6823521327647, - 2656.2501102652768, - 2665.8264918923328, - 2675.4114815109842, - 2685.0050636877722, - 2694.6072230582295, - 2704.2179443263894, - 2713.8372122642972, - 2723.4650117115279, - 2733.1013275747096, - 2742.7461448270483, - 2752.3994485078601, - 2762.0612237221085, - 2771.7314556399419, - 2781.4101294962406, - 2791.0972305901655, - 2800.7927442847094, - 2810.4966560062589, - 2820.2089512441521, - 2829.9296155502466, - 2839.6586345384894, - 2849.3959938844923, - 2859.1416793251065, - 2868.8956766580086, - 2878.6579717412847, - 2888.4285504930212, - 2898.2073988908974, - 2907.9945029717837, - 2917.789848831344, - 2927.5934226236377, - 2937.4052105607311, - 2947.2251989123079, - 2957.0533740052865, - 2966.8897222234368, - 2976.734230007005, - 2986.5868838523397, - 2996.4476703115197, - 3006.3165759919889, - 3016.1935875561908, - 3026.0786917212095, - 3035.9718752584108, - 3045.8731249930906, - 3055.7824278041207, - 3065.6997706236039, - 3075.625140436528, - 3085.5585242804245, - 3095.4999092450298, - 3105.4492824719491, - 3115.4066311543256, - 3125.3719425365089, - 3135.3452039137287, - 3145.3264026317715, - 3155.3155260866592, - 3165.3125617243295, - 3175.3174970403229, - 3185.3303195794679, - 3195.35101693557, - 3205.3795767511078, - 3215.4159867169251, - 3225.460234571929, - 3235.5123081027928, - 3245.5721951436558, - 3255.63988357583, - 3265.7153613275095, - 3275.7986163734795, - 3285.8896367348289, - 3295.9884104786665, - 3306.0949257178395, - 3316.2091706106517, - 3326.331133360588, - 3336.4608022160378, - 3346.5981654700231, - 3356.7432114599264, - 3366.8959285672249, - 3377.0563052172211, - 3387.2243298787821, - 3397.3999910640764, - 3407.5832773283128, - 3417.7741772694862, - 3427.9726795281199, - 3438.1787727870123, - 3448.3924457709873, - 3458.6136872466445, - 3468.8424860221107, - 3479.0788309467976, - 3489.3227109111554, - 3499.5741148464344, - 3509.8330317244445, - 3520.0994505573185, - 3530.3733603972751, - 3540.6547503363886, - 3550.9436095063534, - 3561.239927078258, - 3571.5436922623535, - 3581.8548943078308, - 3592.1735225025936, - 3602.4995661730372, - 3612.8330146838275, - 3623.1738574376814, - 3633.5220838751502, - 3643.8776834744031, - 3654.2406457510142, - 3664.6109602577494, - 3674.9886165843564, - 3685.3736043573545, - 3695.7659132398294, - 3706.1655329312248, - 3716.5724531671399, - 3726.9866637191262, - 3737.4081543944876, - 3747.8369150360782, - 3758.2729355221072, - 3768.7162057659411, - 3779.1667157159077, - 3789.6244553551055, - 3800.0894147012082, - 3810.5615838062768, - 3821.0409527565694, - 3831.5275116723533, - 3842.0212507077194, - 3852.522160050396, - 3863.0302299215673, - 3873.5454505756893, - 3884.0678123003108, - 3894.5973054158922, - 3905.1339202756285, - 3915.6776472652732, - 3926.2284768029604, - 3936.7863993390338, - 3947.3514053558706, - 3957.9234853677135, - 3968.5026299204969, - 3979.0888295916798, - 3989.6820749900776, - 4000.2823567556948, - 4010.8896655595613, - 4021.5039921035655, - 4032.1253271202945, - 4042.7536613728694, - 4053.3889856547858, - 4064.0312907897551, - 4074.6805676315448, - 4085.3368070638221, - 4095.9999999999982, - 4106.6701373830711, - 4117.347210185475, - 4128.0312094089259, - 4138.722126084268, - 4149.4199512713267, - 4160.1246760587583, - 4170.8362915638982, - 4181.5547889326181, - 4192.2801593391769, - 4203.0123939860741, - 4213.7514841039101, - 4224.4974209512384, - 4235.2501958144258, - 4246.0098000075095, - 4256.7762248720574, - 4267.549461777031, - 4278.3295021186423, - 4289.1163373202198, - 4299.9099588320714, - 4310.7103581313495, - 4321.5175267219138, - 4332.3314561342004, - 4343.152137925088, - 4353.9795636777671, - 4364.8137250016052, - 4375.6546135320223, - 4386.5022209303588, - 4397.3565388837469, - 4408.2175591049827, - 4419.0852733324018, - 4429.9596733297531, - 4440.8407508860728, - 4451.7284978155603, - 4462.6229059574571, - 4473.5239671759227, - 4484.4316733599126, - 4495.3460164230582, - 4506.2669883035496, - 4517.1945809640119, - 4528.1287863913894, - 4539.069596596828, - 4550.0170036155587, - 4560.9709995067806, - 4571.931576353546, - 4582.898726262647, - 4593.8724413645004, - 4604.8527138130348, - 4615.8395357855816, - 4626.8328994827571, - 4637.8327971283588, - 4648.8392209692511, - 4659.8521632752563, - 4670.8716163390473, - 4681.8975724760394, - 4692.9300240242837, - 4703.9689633443595, - 4715.0143828192668, - 4726.0662748543255, - 4737.1246318770682, - 4748.1894463371373, - 4759.2607107061804, - 4770.3384174777493, - 4781.4225591671993, - 4792.5131283115852, - 4803.6101174695614, - 4814.7135192212854, - 4825.8233261683154, - 4836.9395309335096, - 4848.0621261609349, - 4859.1911045157631, - 4870.3264586841779, - 4881.4681813732768, - 4892.6162653109768, - 4903.7707032459193, - 4914.931487947375, - 4926.0986122051509, - 4937.2720688294967, - 4948.4518506510112, - 4959.637950520555, - 4970.8303613091521, - 4982.0290759079044, - 4993.2340872278974, - 5004.4453882001153, - 5015.6629717753467, - 5026.8868309241007, - 5038.1169586365131, - 5049.353347922266, - 5060.5959918104927, - 5071.8448833496996, - 5083.1000156076734, - 5094.3613816713996, - 5105.6289746469747, - 5116.9027876595246, - 5128.18281385312, - 5139.4690463906918, - 5150.7614784539473, - 5162.0601032432933, - 5173.3649139777472, - 5184.6759038948594, - 5195.9930662506322, - 5207.3163943194386, - 5218.6458813939435, - 5229.9815207850224, - 5241.3233058216847, - 5252.6712298509919, - 5264.025286237983, - 5275.3854683655954, - 5286.7517696345885, - 5298.1241834634639, - 5309.5027032883945, - 5320.887322563146, - 5332.2780347589978, - 5343.6748333646756, - 5355.0777118862716, - 5366.4866638471722, - 5377.901682787985, - 5389.3227622664635, - 5400.749895857437, - 5412.1830771527357, - 5423.622299761123, - 5435.067557308219, - 5446.5188434364318, - 5457.9761518048872, - 5469.4394760893592, - 5480.9088099821975, - 5492.3841471922606, - 5503.8654814448455, - 5515.3528064816201, - 5526.846116060552, - 5538.3454039558474, - 5549.8506639578736, - 5561.3618898731029, - 5572.8790755240361, - 5584.4022147491451, - 5595.9313014027975, - 5607.4663293552012, - 5619.0072924923297, - 5630.5541847158656, - 5642.1069999431284, - 5653.665732107017, - 5665.230375155943, - 5676.8009230537655, - 5688.3773697797333, - 5699.9597093284156, - 5711.5479357096474, - 5723.1420429484588, - 5734.7420250850209, - 5746.347876174581, - 5757.9595902874016, - 5769.5771615087006, - 5781.2005839385911, - 5792.8298516920213, - 5804.4649588987149, - 5816.1058997031105, - 5827.7526682643065, - 5839.4052587559972, - 5851.0636653664196, - 5862.7278822982908, - 5874.3979037687541, - 5886.0737240093204, - 5897.7553372658094, - 5909.4427377982956, - 5921.1359198810505, - 5932.8348778024874, - 5944.5396058651031, - 5956.2500983854261, - 5967.9663496939575, - 5979.6883541351208, - 5991.4161060672022, - 6003.1495998623004, - 6014.8888299062692, - 6026.6337905986684, - 6038.3844763527022, - 6050.1408815951781, - 6061.9030007664414, - 6073.6708283203316, - 6085.4443587241267, - 6097.2235864584891, - 6109.0085060174197, - 6120.7991119081998, - 6132.595398651345, - 6144.3973607805519, - 6156.2049928426459, - 6168.0182893975361, - 6179.8372450181578, - 6191.6618542904307, - 6203.4921118132024, - 6215.3280121982016, - 6227.1695500699925, - 6239.0167200659189, - 6250.8695168360628, - 6262.7279350431891, - 6274.5919693627056, - 6286.4616144826068, - 6298.3368651034316, - 6310.2177159382172, - 6322.1041617124456, - 6333.9961971640032, - 6345.8938170431311, - 6357.7970161123785, - 6369.7057891465583, - 6381.6201309327007, - 6393.5400362700075, - 6405.4654999698032, - 6417.3965168554978, - 6429.3330817625329, - 6441.2751895383453, - 6453.2228350423138, - 6465.176013145724, - 6477.134718731716, - 6489.0989466952469, - 6501.0686919430445, - 6513.0439493935628, - 6525.0247139769417, - 6537.010980634961, - 6549.002744321001, - 6560.9999999999973, - 6573.0027426483985, - 6585.0109672541284, - 6597.0246688165371, - 6609.0438423463656, - 6621.0684828657004, - 6633.0985854079354, - 6645.134145017727, - 6657.1751567509573, - 6669.2216156746908, - 6681.2735168671343, - 6693.3308554176001, - 6705.3936264264594, - 6717.461825005108, - 6729.535446275926, - 6741.6144853722335, - 6753.6989374382601, - 6765.7887976290967, - 6777.8840611106634, - 6789.9847230596661, - 6802.0907786635626, - 6814.2022231205201, - 6826.3190516393797, - 6838.4412594396181, - 6850.5688417513074, - 6862.701793815083, - 6874.840110882099, - 6886.9837882139991, - 6899.1328210828724, - 6911.2872047712199, - 6923.4469345719199, - 6935.6120057881863, - 6947.7824137335365, - 6959.9581537317536, - 6972.1392211168532, - 6984.3256112330409, - 6996.5173194346862, - 7008.7143410862773, - 7020.9166715623942, - 7033.1243062476678, - 7045.3372405367481, - 7057.5554698342685, - 7069.7789895548103, - 7082.0077951228714, - 7094.2418819728273, - 7106.4812455489018, - 7118.7258813051285, - 7130.9757847053224, - 7143.2309512230404, - 7155.4913763415516, - 7167.7570555538041, - 7180.0279843623894, - 7192.3041582795131, - 7204.5855728269571, - 7216.8722235360519, - 7229.1641059476406, - 7241.4612156120484, - 7253.7635480890503, - 7266.0710989478375, - 7278.3838637669869, - 7290.7018381344296, - 7303.0250176474174, - 7315.3533979124932, - 7327.6869745454596, - 7340.0257431713462, - 7352.3696994243801, - 7364.7188389479543, - 7377.0731573945968, - 7389.4326504259407, - 7401.7973137126937, - 7414.1671429346061, - 7426.5421337804428, - 7438.922281947951, - 7451.3075831438346, - 7463.6980330837177, - 7476.0936274921214, - 7488.4943621024304, - 7500.9002326568652, - 7513.3112349064522, - 7525.7273646109943, - 7538.1486175390446, - 7550.5749894678729, - 7563.0064761834419, - 7575.4430734803736, - 7587.8847771619248, - 7600.3315830399597, - 7612.7834869349153, - 7625.24048467578, - 7637.7025721000637, - 7650.1697450537677, - 7662.6419993913596, - 7675.1193309757446, - 7687.6017356782404, - 7700.0892093785433, - 7712.5817479647112, - 7725.079347333125, - 7737.5820033884729, - 7750.0897120437139, - 7762.6024692200581, - 7775.1202708469355, - 7787.6431128619733, - 7800.1709912109645, - 7812.7039018478481, - 7825.2418407346768, - 7837.7848038415968, - 7850.3327871468155, - 7862.8857866365806, - 7875.4437983051539, - 7888.006818154784, - 7900.5748421956796, - 7913.1478664459901, - 7925.725886931772, - 7938.3088996869719, - 7950.8969007533951, - 7963.4898861806851, - 7976.0878520262959, - 7988.6907943554688, - 8001.2987092412086, - 8013.911592764257, - 8026.5294410130691, - 8039.1522500837891, - 8051.7800160802271, - 8064.412735113835, - 8077.0504033036796, - 8089.6930167764222, - 8102.3405716662946, - 8114.9930641150731, - 8127.6504902720571, - 8140.3128462940449, - 8152.9801283453098, - 8165.6523325975786, - 8178.3294552300049, - 8191.0114924291529, - 8203.6984403889655, - 8216.3902953107463, - 8229.0870534031419, - 8241.7887108821069, - 8254.4952639708936, - 8267.2067089000211, - 8279.9230419072574, - 8292.6442592375952, - 8305.3703571432306, - 8318.101331883543, - 8330.8371797250657, - 8343.577896941475, - 8356.3234798135582, - 8369.0739246291978, - 8381.8292276833508, - 8394.5893852780209, - 8407.3543937222421, - 8420.1242493320569, - 8432.8989484304948, - 8445.6784873475499, - 8458.4628624201578, - 8471.2520699921806, - 8484.0461064143838, - 8496.8449680444082, - 8509.6486512467636, - 8522.4571523927953, - 8535.270467860666, - 8548.0885940353437, - 8560.9115273085663, - 8573.7392640788403, - 8586.5718007514006, - 8599.4091337382069, - 8612.2512594579148, - 8625.0981743358552, - 8637.9498748040205, - 8650.8063573010386, - 8663.6676182721567, - 8676.533654169225, - 8689.4044614506638, - 8702.2800365814601, - 8715.1603760331418, - 8728.0454762837508, - 8740.9353338178389, - 8753.8299451264356, - 8766.7293067070332, - 8779.6334150635721, - 8792.5422667064158, - 8805.4558581523324, - 8818.3741859244819, - 8831.2972465523908, - 8844.2250365719356, - 8857.1575525253265, - 8870.0947909610859, - 8883.0367484340295, - 8895.9834215052524, - 8908.934806742107, - 8921.8909007181846, - 8934.8517000132997, - 8947.817201213471, - 8960.7874009109, - 8973.7622957039603, - 8986.7418821971733, - 8999.7261570011924, - 9012.7151167327884, - 9025.7087580148236, - 9038.7070774762469, - 9051.7100717520643, - 9064.7177374833282, - 9077.7300713171153, - 9090.7470699065179, - 9103.7687299106146, - 9116.7950479944648, - 9129.8260208290812, - 9142.8616450914233, - 9155.9019174643727, - 9168.9468346367157, - 9181.9963933031358, - 9195.0505901641845, - 9208.1094219262741, - 9221.1728853016557, - 9234.240977008405, - 9247.3136937704076, - 9260.3910323173386, - 9273.472989384647, - 9286.5595617135423, - 9299.6507460509747, - 9312.7465391496207, - 9325.8469377678684, - 9338.9519386698012, - 9352.0615386251757, - 9365.1757344094131, - 9378.2945228035842, - 9391.4179005943843, - 9404.5458645741273, - 9417.6784115407263, - 9430.8155382976747, - 9443.9572416540359, - 9457.1035184244265, - 9470.2543654290002, - 9483.4097794934296, - 9496.5697574488931, - 9509.7342961320664, - 9522.9033923850911, - 9536.0770430555804, - 9549.2552449965824, - 9562.4379950665825, - 9575.6252901294793, - 9588.8171270545736, - 9602.0135027165488, - 9615.2144139954635, - 9628.4198577767274, - 9641.629830951093, - 9654.844330414644, - 9668.0633530687719, - 9681.286895820167, - 9694.5149555808002, - 9707.7475292679192, - 9720.9846138040157, - 9734.2262061168276, - 9747.4723031393187, - 9760.7229018096641, - 9773.9779990712323, - 9787.2375918725811, - 9800.5016771674327, - 9813.7702519146696, - 9827.0433130783094, - 9840.3208576275028, - 9853.602882536512, - 9866.8893847846994, - 9880.1803613565116, - 9893.4758092414686, - 9906.7757254341523, - 9920.0801069341851, - 9933.3889507462245, - 9946.7022538799429, - 9960.0200133500221, - 9973.3422261761298, - 9986.6688893829159, - 9999.9999999999945, - 10013.335555061929, - 10026.675551608221, - 10040.019986683301, - 10053.368857336509, - 10066.722160622081, - 10080.079893599144, - 10093.442053331697, - 10106.808636888598, - 10120.179641343551, - 10133.555063775095, - 10146.934901266595, - 10160.31915090622, - 10173.707809786936, - 10187.100875006496, - 10200.498343667417, - 10213.900212876984, - 10227.306479747222, - 10240.717141394889, - 10254.132194941467, - 10267.551637513146, - 10280.975466240814, - 10294.40367826004, - 10307.836270711066, - 10321.273240738796, - 10334.71458549278, - 10348.160302127204, - 10361.610387800878, - 10375.064839677221, - 10388.523654924258, - 10401.986830714593, - 10415.454364225412, - 10428.926252638465, - 10442.402493140049, - 10455.883082921007, - 10469.368019176709, - 10482.85729910704, - 10496.350919916393, - 10509.848878813653, - 10523.351173012188, - 10536.857799729838, - 10550.3687561889, - 10563.884039616123, - 10577.403647242685, - 10590.927576304197, - 10604.455824040679, - 10617.988387696556, - 10631.525264520642, - 10645.066451766135, - 10658.611946690598, - 10672.161746555956, - 10685.715848628475, - 10699.274250178762, - 10712.836948481747, - 10726.403940816675, - 10739.975224467091, - 10753.550796720834, - 10767.130654870027, - 10780.714796211059, - 10794.303218044579, - 10807.895917675487, - 10821.492892412922, - 10835.094139570248, - 10848.699656465047, - 10862.309440419107, - 10875.923488758415, - 10889.541798813138, - 10903.16436791762, - 10916.791193410372, - 10930.422272634056, - 10944.05760293548, - 10957.697181665582, - 10971.341006179427, - 10984.98907383619, - 10998.641381999149, - 11012.297928035676, - 11025.958709317223, - 11039.623723219316, - 11053.292967121541, - 11066.966438407539, - 11080.64413446499, - 11094.326052685608, - 11108.012190465128, - 11121.702545203296, - 11135.397114303863, - 11149.095895174571, - 11162.798885227143, - 11176.506081877278, - 11190.217482544635, - 11203.933084652828, - 11217.652885629415, - 11231.376882905886, - 11245.105073917659, - 11258.837456104062, - 11272.574026908333, - 11286.314783777601, - 11300.059724162888, - 11313.808845519083, - 11327.562145304952, - 11341.319620983111, - 11355.081270020033, - 11368.847089886023, - 11382.617078055218, - 11396.391232005579, - 11410.169549218874, - 11423.952027180676, - 11437.738663380349, - 11451.529455311042, - 11465.324400469679, - 11479.123496356951, - 11492.926740477304, - 11506.734130338931, - 11520.545663453764, - 11534.361337337466, - 11548.181149509423, - 11562.005097492724, - 11575.83317881417, - 11589.665391004253, - 11603.501731597149, - 11617.342198130715, - 11631.186788146468, - 11645.035499189589, - 11658.888328808911, - 11672.745274556904, - 11686.606333989675, - 11700.471504666955, - 11714.340784152086, - 11728.214170012021, - 11742.091659817312, - 11755.973251142101, - 11769.858941564111, - 11783.748728664636, - 11797.642610028539, - 11811.540583244237, - 11825.442645903697, - 11839.34879560242, - 11853.259029939445, - 11867.173346517333, - 11881.091742942155, - 11895.014216823492, - 11908.940765774427, - 11922.871387411526, - 11936.806079354839, - 11950.744839227897, - 11964.687664657684, - 11978.634553274653, - 11992.585502712702, - 12006.540510609168, - 12020.499574604828, - 12034.462692343877, - 12048.429861473938, - 12062.401079646032, - 12076.376344514589, - 12090.355653737433, - 12104.339004975769, - 12118.326395894188, - 12132.317824160644, - 12146.313287446457, - 12160.312783426305, - 12174.316309778205, - 12188.323864183525, - 12202.335444326955, - 12216.351047896511, - 12230.370672583531, - 12244.394316082657, - 12258.421976091831, - 12272.453650312296, - 12286.489336448574, - 12300.529032208471, - 12314.572735303058, - 12328.620443446678, - 12342.672154356922, - 12356.727865754638, - 12370.787575363909, - 12384.851280912055, - 12398.918980129623, - 12412.990670750381, - 12427.066350511306, - 12441.146017152583, - 12455.229668417589, - 12469.317302052901, - 12483.40891580827, - 12497.50450743663, - 12511.604074694078, - 12525.707615339878, - 12539.815127136444, - 12553.926607849342, - 12568.042055247275, - 12582.161467102082, - 12596.284841188726, - 12610.41217528529, - 12624.543467172971, - 12638.678714636069, - 12652.817915461985, - 12666.961067441209, - 12681.108168367316, - 12695.259216036962, - 12709.414208249869, - 12723.573142808827, - 12737.736017519681, - 12751.902830191326, - 12766.073578635704, - 12780.248260667788, - 12794.426874105588, - 12808.609416770132, - 12822.795886485468, - 12836.986281078653, - 12851.180598379744, - 12865.378836221802, - 12879.580992440871, - 12893.787064875984, - 12907.997051369144, - 12922.210949765335, - 12936.428757912496, - 12950.650473661524, - 12964.876094866273, - 12979.105619383534, - 12993.339045073039, - 13007.576369797454, - 13021.817591422368, - 13036.062707816285, - 13050.311716850629, - 13064.564616399723, - 13078.821404340792, - 13093.082078553954, - 13107.346636922217, - 13121.615077331464, - 13135.887397670458, - 13150.163595830827, - 13164.44366970706, - 13178.727617196502, - 13193.015436199352, - 13207.307124618648, - 13221.602680360265, - 13235.902101332911, - 13250.205385448118, - 13264.512530620239, - 13278.823534766434, - 13293.138395806676, - 13307.457111663734, - 13321.779680263176, - 13336.106099533356, - 13350.436367405409, - 13364.77048181325, - 13379.108440693562, - 13393.450241985796, - 13407.795883632158, - 13422.145363577607, - 13436.498679769853, - 13450.855830159346, - 13465.216812699266, - 13479.581625345529, - 13493.950266056772, - 13508.32273279435, - 13522.699023522329, - 13537.079136207483, - 13551.463068819286, - 13565.850819329906, - 13580.2423857142, - 13594.63776594971, - 13609.036958016657, - 13623.439959897927, - 13637.846769579081, - 13652.257385048335, - 13666.67180429656, - 13681.090025317284, - 13695.512046106669, - 13709.937864663521, - 13724.367478989278, - 13738.800887088004, - 13753.238086966385, - 13767.679076633727, - 13782.123854101939, - 13796.572417385545, - 13811.024764501659, - 13825.480893469998, - 13839.94080231286, - 13854.404489055134, - 13868.871951724283, - 13883.34318835034, - 13897.818196965914, - 13912.296975606168, - 13926.779522308825, - 13941.26583511416, - 13955.755912064991, - 13970.249751206682, - 13984.747350587126, - 13999.248708256751, - 14013.753822268511, - 14028.262690677873, - 14042.775311542828, - 14057.291682923867, - 14071.811802883994, - 14086.335669488704, - 14100.863280805994, - 14115.394634906341, - 14129.92972986271, - 14144.468563750548, - 14159.01113464777, - 14173.55744063476, - 14188.107479794369, - 14202.661250211901, - 14217.218749975118, - 14231.779977174227, - 14246.344929901879, - 14260.913606253163, - 14275.486004325601, - 14290.062122219146, - 14304.641958036171, - 14319.225509881464, - 14333.812775862236, - 14348.403754088098, - 14362.998442671067, - 14377.59683972556, - 14392.198943368388, - 14406.804751718748, - 14421.414262898223, - 14436.027475030774, - 14450.64438624274, - 14465.264994662828, - 14479.889298422106, - 14494.517295654005, - 14509.148984494313, - 14523.784363081166, - 14538.423429555049, - 14553.066182058781, - 14567.712618737527, - 14582.362737738777, - 14597.016537212348, - 14611.674015310382, - 14626.33517018734, - 14640.999999999993, - 14655.668502907418, - 14670.340677071003, - 14685.016520654426, - 14699.696031823671, - 14714.379208746999, - 14729.066049594967, - 14743.756552540408, - 14758.45071575843, - 14773.148537426418, - 14787.850015724018, - 14802.555148833142, - 14817.263934937961, - 14831.976372224897, - 14846.692458882624, - 14861.41219310206, - 14876.135573076363, - 14890.862597000923, - 14905.593263073371, - 14920.327569493558, - 14935.065514463557, - 14949.807096187662, - 14964.552312872382, - 14979.301162726431, - 14994.053643960735, - 15008.809754788414, - 15023.569493424788, - 15038.332858087369, - 15053.099846995858, - 15067.870458372134, - 15082.644690440264, - 15097.422541426484, - 15112.204009559202, - 15126.989093068994, - 15141.777790188597, - 15156.570099152905, - 15171.366018198967, - 15186.165545565986, - 15200.968679495301, - 15215.775418230402, - 15230.585760016909, - 15245.399703102579, - 15260.217245737298, - 15275.038386173073, - 15289.863122664035, - 15304.691453466432, - 15319.523376838621, - 15334.358891041069, - 15349.197994336346, - 15364.040684989128, - 15378.886961266177, - 15393.736821436356, - 15408.590263770609, - 15423.447286541972, - 15438.307888025554, - 15453.172066498542, - 15468.039820240196, - 15482.91114753184, - 15497.786046656869, - 15512.664515900733, - 15527.546553550939, - 15542.432157897045, - 15557.32132723066, - 15572.214059845435, - 15587.110354037064, - 15602.010208103273, - 15616.913620343823, - 15631.820589060506, - 15646.731112557136, - 15661.645189139546, - 15676.562817115593, - 15691.483994795139, - 15706.408720490062, - 15721.336992514242, - 15736.268809183561, - 15751.204168815901, - 15766.143069731135, - 15781.085510251132, - 15796.03148869974, - 15810.981003402798, - 15825.934052688119, - 15840.890634885489, - 15855.850748326673, - 15870.814391345401, - 15885.781562277361, - 15900.752259460214, - 15915.726481233565, - 15930.704225938984, - 15945.685491919978, - 15960.670277522009, - 15975.658581092481, - 15990.65040098073, - 16005.645735538035, - 16020.644583117599, - 16035.646942074556, - 16050.652810765967, - 16065.662187550806, - 16080.675070789974, - 16095.691458846273, - 16110.711350084424, - 16125.734742871053, - 16140.761635574685, - 16155.792026565747, - 16170.825914216561, - 16185.863296901338, - 16200.904172996183, - 16215.948540879079, - 16230.996398929899, - 16246.047745530386, - 16261.102579064163, - 16276.160897916721, - 16291.22270047542, - 16306.287985129484, - 16321.356750269995, - 16336.428994289896, - 16351.504715583982, - 16366.5839125489, - 16381.666583583141, - 16396.752727087041, - 16411.842341462776, - 16426.935425114363, - 16442.031976447644, - 16457.131993870298, - 16472.235475791829, - 16487.342420623561, - 16502.452826778641, - 16517.566692672033, - 16532.684016720516, - 16547.804797342676, - 16562.929032958902, - 16578.056721991394, - 16593.18786286415, - 16608.322454002962, - 16623.460493835417, - 16638.601980790896, - 16653.746913300558, - 16668.895289797354, - 16684.047108716015, - 16699.202368493046, - 16714.361067566726, - 16729.523204377107, - 16744.688777366009, - 16759.857784977012, - 16775.030225655464, - 16790.206097848466, - 16805.385400004874, - 16820.568130575302, - 16835.754288012104, - 16850.943870769381, - 16866.136877302983, - 16881.333306070494, - 16896.53315553123, - 16911.736424146249, - 16926.943110378332, - 16942.153212691992, - 16957.366729553454, - 16972.583659430682, - 16987.804000793338, - 17003.027752112816, - 17018.254911862205, - 17033.485478516312, - 17048.719450551645, - 17063.956826446421, - 17079.197604680547, - 17094.44178373563, - 17109.689362094967, - 17124.940338243552, - 17140.194710668064, - 17155.452477856852, - 17170.713638299967, - 17185.978190489128, - 17201.246132917724, - 17216.517464080825, - 17231.792182475165, - 17247.070286599141, - 17262.351774952826, - 17277.636646037936, - 17292.924898357855, - 17308.216530417623, - 17323.511540723921, - 17338.809927785089, - 17354.111690111105, - 17369.416826213594, - 17384.725334605821, - 17400.037213802683, - 17415.352462320716, - 17430.67107867809, - 17445.993061394587, - 17461.318408991636, - 17476.647119992274, - 17491.979192921168, - 17507.314626304586, - 17522.653418670423, - 17537.995568548187, - 17553.341074468986, - 17568.689934965536, - 17584.042148572156, - 17599.397713824768, - 17614.75662926089, - 17630.118893419625, - 17645.484504841683, - 17660.853462069354, - 17676.225763646511, - 17691.601408118619, - 17706.980394032718, - 17722.362719937424, - 17737.748384382936, - 17753.137385921014, - 17768.529723104999, - 17783.92539448979, - 17799.324398631856, - 17814.726734089225, - 17830.13239942148, - 17845.541393189767, - 17860.95371395678, - 17876.369360286772, - 17891.788330745527, - 17907.210623900395, - 17922.636238320254, - 17938.065172575527, - 17953.497425238176, - 17968.932994881692, - 17984.371880081104, - 17999.814079412972, - 18015.259591455371, - 18030.708414787914, - 18046.160547991731, - 18061.615989649465, - 18077.074738345284, - 18092.536792664861, - 18108.002151195393, - 18123.470812525571, - 18138.942775245599, - 18154.418037947191, - 18169.896599223546, - 18185.37845766938, - 18200.863611880886, - 18216.352060455767, - 18231.843801993204, - 18247.338835093873, - 18262.837158359936, - 18278.338770395032, - 18293.84366980429, - 18309.351855194309, - 18324.863325173166, - 18340.378078350412, - 18355.896113337069, - 18371.417428745623, - 18386.942023190033, - 18402.469895285718, - 18418.00104364955, - 18433.53546689987, - 18449.073163656474, - 18464.614132540602, - 18480.158372174956, - 18495.705881183676, - 18511.256658192357, - 18526.810701828035, - 18542.368010719183, - 18557.928583495715, - 18573.492418788985, - 18589.059515231773, - 18604.629871458303, - 18620.203486104212, - 18635.78035780658, - 18651.360485203899, - 18666.943866936086, - 18682.53050164448, - 18698.120387971841, - 18713.713524562332, - 18729.30991006154, - 18744.909543116457, - 18760.512422375479, - 18776.118546488418, - 18791.727914106479, - 18807.340523882274, - 18822.95637446981, - 18838.575464524489, - 18854.197792703111, - 18869.823357663863, - 18885.452158066328, - 18901.08419257147, - 18916.719459841639, - 18932.357958540564, - 18947.999687333362, - 18963.644644886521, - 18979.292829867907, - 18994.944240946759, - 19010.598876793687, - 19026.256736080668, - 19041.917817481048, - 19057.582119669532, - 19073.2496413222, - 19088.920381116473, - 19104.594337731145, - 19120.271509846356, - 19135.951896143604, - 19151.635495305738, - 19167.322306016948, - 19183.012326962784, - 19198.705556830122, - 19214.401994307198, - 19230.101638083579, - 19245.804486850167, - 19261.510539299208, - 19277.219794124274, - 19292.932250020265, - 19308.647905683421, - 19324.366759811302, - 19340.088811102793, - 19355.8140582581, - 19371.542499978754, - 19387.2741349676, - 19403.008961928797, - 19418.746979567823, - 19434.488186591469, - 19450.232581707827, - 19465.980163626304, - 19481.730931057613, - 19497.484882713761, - 19513.242017308068, - 19529.002333555141, - 19544.765830170898, - 19560.532505872539, - 19576.302359378566, - 19592.075389408761, - 19607.851594684209, - 19623.630973927269, - 19639.41352586159, - 19655.199249212103, - 19670.988142705017, - 19686.780205067826, - 19702.575435029288, - 19718.373831319448, - 19734.175392669615, - 19749.980117812371, - 19765.788005481569, - 19781.599054412323, - 19797.413263341008, - 19813.230631005274, - 19829.051156144014, - 19844.874837497395, - 19860.701673806827, - 19876.531663814985, - 19892.364806265789, - 19908.201099904403, - 19924.040543477258, - 19939.883135732012, - 19955.728875417579, - 19971.577761284105, - 19987.429792082985, - 20003.284966566847, - 20019.14328348956, - 20035.004741606219, - 20050.869339673161, - 20066.737076447946, - 20082.607950689362, - 20098.481961157428, - 20114.359106613385, - 20130.239385819699, - 20146.122797540058, - 20162.009340539353, - 20177.899013583716, - 20193.791815440476, - 20209.687744878182, - 20225.586800666591, - 20241.488981576669, - 20257.394286380597, - 20273.302713851754, - 20289.214262764715, - 20305.128931895277, - 20321.046720020415, - 20336.967625918318, - 20352.891648368361, - 20368.818786151114, - 20384.749038048347, - 20400.682402843009, - 20416.618879319249, - 20432.558466262391, - 20448.501162458953, - 20464.446966696629, - 20480.395877764302, - 20496.347894452025, - 20512.303015551031, - 20528.261239853735, - 20544.22256615372, - 20560.186993245738, - 20576.15451992572, - 20592.125144990758, - 20608.098867239107, - 20624.075685470198, - 20640.055598484618, - 20656.038605084115, - 20672.024704071595, - 20688.013894251126, - 20704.006174427926, - 20720.001543408373, - 20735.999999999989, - 20752.001543011454, - 20768.006171252597, - 20784.013883534382, - 20800.024678668931, - 20816.038555469506, - 20832.055512750507, - 20848.075549327474, - 20864.098664017085, - 20880.124855637161, - 20896.154123006647, - 20912.186464945626, - 20928.221880275312, - 20944.260367818049, - 20960.301926397311, - 20976.346554837684, - 20992.394251964895, - 21008.445016605787, - 21024.498847588318, - 21040.555743741574, - 21056.615703895754, - 21072.678726882168, - 21088.744811533252, - 21104.813956682538, - 21120.886161164683, - 21136.961423815443, - 21153.039743471683, - 21169.121118971379, - 21185.205549153605, - 21201.293032858535, - 21217.383568927453, - 21233.477156202731, - 21249.573793527841, - 21265.673479747358, - 21281.776213706937, - 21297.881994253334, - 21313.990820234398, - 21330.102690499054, - 21346.21760389733, - 21362.335559280327, - 21378.456555500241, - 21394.580591410333, - 21410.707665864964, - 21426.83777771956, - 21442.970925830628, - 21459.107109055756, - 21475.246326253604, - 21491.388576283895, - 21507.533858007431, - 21523.682170286087, - 21539.833511982797, - 21555.987881961566, - 21572.145279087465, - 21588.305702226615, - 21604.469150246216, - 21620.635622014521, - 21636.805116400832, - 21652.977632275521, - 21669.153168510009, - 21685.331723976764, - 21701.513297549318, - 21717.697888102244, - 21733.885494511167, - 21750.076115652759, - 21766.269750404736, - 21782.466397645861, - 21798.666056255934, - 21814.868725115801, - 21831.074403107345, - 21847.283089113484, - 21863.494782018177, - 21879.709480706417, - 21895.927184064229, - 21912.147890978667, - 21928.371600337818, - 21944.598311030797, - 21960.828021947746, - 21977.060731979829, - 21993.296440019243, - 22009.535144959198, - 22025.77684569393, - 22042.021541118691, - 22058.269230129757, - 22074.519911624411, - 22090.773584500959, - 22107.030247658717, - 22123.289899998013, - 22139.552540420187, - 22155.818167827587, - 22172.086781123569, - 22188.358379212495, - 22204.632960999726, - 22220.910525391639, - 22237.191071295601, - 22253.474597619981, - 22269.761103274148, - 22286.050587168469, - 22302.343048214312, - 22318.638485324027, - 22334.936897410968, - 22351.23828338947, - 22367.542642174871, - 22383.849972683485, - 22400.160273832618, - 22416.473544540564, - 22432.789783726603, - 22449.108990310986, - 22465.431163214958, - 22481.75630136074, - 22498.084403671528, - 22514.415469071497, - 22530.749496485802, - 22547.086484840562, - 22563.426433062879, - 22579.769340080824, - 22596.115204823436, - 22612.464026220721, - 22628.815803203655, - 22645.170534704179, - 22661.5282196552, - 22677.888856990587, - 22694.252445645168, - 22710.618984554734, - 22726.988472656034, - 22743.360908886778, - 22759.736292185622, - 22776.114621492186, - 22792.495895747044, - 22808.880113891719, - 22825.267274868678, - 22841.657377621348, - 22858.050421094096, - 22874.446404232243, - 22890.845325982053, - 22907.247185290722, - 22923.651981106406, - 22940.059712378195, - 22956.470378056114, - 22972.883977091129, - 22989.300508435153, - 23005.719971041017, - 23022.142363862498, - 23038.567685854305, - 23054.995935972078, - 23071.427113172387, - 23087.86121641273, - 23104.298244651531, - 23120.738196848146, - 23137.181071962848, - 23153.626868956846, - 23170.075586792263, - 23186.527224432142, - 23202.981780840448, - 23219.439254982066, - 23235.899645822796, - 23252.362952329357, - 23268.829173469378, - 23285.298308211408, - 23301.770355524899, - 23318.245314380223, - 23334.723183748658, - 23351.203962602387, - 23367.687649914504, - 23384.174244659007, - 23400.663745810798, - 23417.15615234568, - 23433.651463240367, - 23450.149677472462, - 23466.650794020472, - 23483.154811863806, - 23499.661729982763, - 23516.171547358543, - 23532.684262973235, - 23549.199875809823, - 23565.718384852185, - 23582.239789085092, - 23598.764087494197, - 23615.291279066041, - 23631.821362788058, - 23648.354337648565, - 23664.890202636761, - 23681.428956742733, - 23697.970598957443, - 23714.515128272738, - 23731.062543681343, - 23747.612844176863, - 23764.166028753778, - 23780.72209640744, - 23797.281046134085, - 23813.842876930816, - 23830.407587795606, - 23846.975177727301, - 23863.545645725622, - 23880.11899079115, - 23896.695211925336, - 23913.274308130498, - 23929.856278409821, - 23946.441121767348, - 23963.028837207989, - 23979.619423737513, - 23996.212880362549, - 24012.809206090584, - 24029.408399929966, - 24046.010460889898, - 24062.615387980433, - 24079.223180212492, - 24095.833836597827, - 24112.447356149063, - 24129.063737879667, - 24145.682980803951, - 24162.305083937081, - 24178.930046295067, - 24195.557866894767, - 24212.188544753884, - 24228.822078890964, - 24245.458468325389, - 24262.097712077397, - 24278.739809168052, - 24295.384758619261, - 24312.032559453768, - 24328.683210695162, - 24345.336711367858, - 24361.993060497109, - 24378.652257108995, - 24395.314300230442, - 24411.979188889192, - 24428.646922113825, - 24445.317498933746, - 24461.990918379193, - 24478.667179481225, - 24495.346281271726, - 24512.028222783407, - 24528.713003049801, - 24545.400621105266, - 24562.091075984976, - 24578.784366724925, - 24595.480492361927, - 24612.179451933614, - 24628.881244478438, - 24645.585869035654, - 24662.293324645343, - 24679.003610348394, - 24695.716725186514, - 24712.432668202211, - 24729.151438438807, - 24745.873034940436, - 24762.597456752032, - 24779.324702919344, - 24796.054772488926, - 24812.787664508123, - 24829.5233780251, - 24846.261912088819, - 24863.003265749034, - 24879.747438056307, - 24896.494428062004, - 24913.244234818278, - 24929.996857378079, - 24946.752294795166, - 24963.510546124078, - 24980.271610420157, - 24997.035486739525, - 25013.802174139113, - 25030.571671676629, - 25047.343978410572, - 25064.119093400237, - 25080.897015705697, - 25097.677744387816, - 25114.461278508239, - 25131.2476171294, - 25148.036759314517, - 25164.828704127583, - 25181.623450633375, - 25198.42099789745, - 25215.221344986145, - 25232.024490966574, - 25248.830434906627, - 25265.639175874974, - 25282.450712941049, - 25299.265045175071, - 25316.082171648024, - 25332.902091431668, - 25349.724803598532, - 25366.550307221914, - 25383.378601375884, - 25400.209685135269, - 25417.043557575678, - 25433.880217773472, - 25450.719664805783, - 25467.561897750507, - 25484.406915686297, - 25501.254717692573, - 25518.105302849512, - 25534.958670238051, - 25551.814818939893, - 25568.67374803748, - 25585.535456614027, - 25602.399943753502, - 25619.267208540619, - 25636.137250060852, - 25653.010067400432, - 25669.885659646327, - 25686.76402588627, - 25703.645165208734, - 25720.529076702944, - 25737.415759458876, - 25754.305212567244, - 25771.197435119517, - 25788.092426207899, - 25804.990184925344, - 25821.890710365547, - 25838.794001622944, - 25855.700057792714, - 25872.608877970775, - 25889.520461253778, - 25906.434806739118, - 25923.351913524923, - 25940.271780710063, - 25957.194407394138, - 25974.11979267748, - 25991.047935661154, - 26007.978835446964, - 26024.912491137442, - 26041.848901835841, - 26058.788066646157, - 26075.729984673108, - 26092.674655022136, - 26109.622076799409, - 26126.572249111829, - 26143.525171067016, - 26160.480841773315, - 26177.43926033979, - 26194.400425876229, - 26211.364337493149, - 26228.330994301767, - 26245.30039541404, - 26262.272539942627, - 26279.247427000919, - 26296.225055703002, - 26313.205425163702, - 26330.188534498539, - 26347.174382823756, - 26364.162969256304, - 26381.154292913852, - 26398.148352914774, - 26415.145148378149, - 26432.144678423778, - 26449.146942172156, - 26466.151938744493, - 26483.159667262702, - 26500.170126849403, - 26517.183316627921, - 26534.199235722277, - 26551.217883257199, - 26568.239258358124, - 26585.263360151173, - 26602.290187763181, - 26619.319740321676, - 26636.352016954883, - 26653.387016791727, - 26670.424738961825, - 26687.465182595493, - 26704.508346823739, - 26721.554230778267, - 26738.602833591467, - 26755.65415439643, - 26772.708192326929, - 26789.764946517433, - 26806.824416103096, - 26823.886600219761, - 26840.95149800396, - 26858.019108592915, - 26875.089431124517, - 26892.162464737365, - 26909.238208570721, - 26926.316661764544, - 26943.397823459472, - 26960.481692796813, - 26977.568268918571, - 26994.657550967422, - 27011.749538086722, - 27028.844229420498, - 27045.941624113464, - 27063.041721311005, - 27080.144520159181, - 27097.250019804727, - 27114.35821939505, - 27131.469118078236, - 27148.582715003027, - 27165.699009318858, - 27182.818000175819, - 27199.939686724665, - 27217.064068116837, - 27234.191143504428, - 27251.320912040203, - 27268.453372877593, - 27285.588525170693, - 27302.726368074269, - 27319.866900743735, - 27337.010122335181, - 27354.156032005358, - 27371.304628911668, - 27388.455912212183, - 27405.609881065626, - 27422.766534631384, - 27439.925872069507, - 27457.087892540683, - 27474.252595206275, - 27491.419979228293, - 27508.5900437694, - 27525.762787992917, - 27542.93821106281, - 27560.116312143706, - 27577.297090400876, - 27594.480545000242, - 27611.666675108383, - 27628.855479892518, - 27646.046958520514, - 27663.241110160889, - 27680.437933982801, - 27697.637429156068, - 27714.839594851132, - 27732.04443023909, - 27749.251934491687, - 27766.462106781299, - 27783.674946280949, - 27800.890452164302, - 27818.108623605654, - 27835.329459779954, - 27852.55295986278, - 27869.779123030345, - 27887.007948459504, - 27904.239435327745, - 27921.473582813196, - 27938.710390094613, - 27955.949856351392, - 27973.19198076355, - 27990.436762511745, - 28007.684200777272, - 28024.934294742041, - 28042.187043588601, - 28059.442446500128, - 28076.700502660427, - 28093.961211253929, - 28111.224571465693, - 28128.490582481401, - 28145.759243487362, - 28163.030553670509, - 28180.304512218394, - 28197.581118319198, - 28214.860371161725, - 28232.14226993539, - 28249.42681383024, - 28266.71400203693, - 28284.003833746745, - 28301.296308151585, - 28318.591424443959, - 28335.889181817001, - 28353.189579464462, - 28370.492616580705, - 28387.798292360701, - 28405.106606000048, - 28422.417556694945, - 28439.731143642206, - 28457.047366039264, - 28474.366223084147, - 28491.687713975512, - 28509.011837912611, - 28526.338594095305, - 28543.667981724069, - 28560.999999999982, - 28578.334648124732, - 28595.671925300605, - 28613.011830730498, - 28630.354363617909, - 28647.699523166943, - 28665.0473085823, - 28682.397719069289, - 28699.750753833818, - 28717.10641208239, - 28734.464693022121, - 28751.825595860708, - 28769.189119806462, - 28786.55526406828, - 28803.924027855664, - 28821.295410378701, - 28838.669410848088, - 28856.046028475103, - 28873.425262471628, - 28890.80711205013, - 28908.191576423673, - 28925.578654805915, - 28942.968346411097, - 28960.360650454055, - 28977.755566150216, - 28995.153092715591, - 29012.553229366786, - 29029.955975320987, - 29047.361329795975, - 29064.769292010107, - 29082.179861182336, - 29099.593036532187, - 29117.00881727978, - 29134.427202645813, - 29151.848191851568, - 29169.271784118911, - 29186.697978670283, - 29204.126774728706, - 29221.55817151779, - 29238.992168261717, - 29256.42876418525, - 29273.867958513725, - 29291.309750473058, - 29308.754139289747, - 29326.201124190855, - 29343.65070440403, - 29361.102879157483, - 29378.557647680012, - 29396.015009200975, - 29413.474962950309, - 29430.937508158524, - 29448.402644056692, - 29465.870369876469, - 29483.340684850071, - 29500.81358821028, - 29518.289079190454, - 29535.767157024511, - 29553.247820946945, - 29570.731070192807, - 29588.216903997723, - 29605.70532159787, - 29623.19632223, - 29640.689905131429, - 29658.186069540028, - 29675.684814694236, - 29693.186139833047, - 29710.690044196028, - 29728.196527023298, - 29745.705587555527, - 29763.217225033964, - 29780.731438700397, - 29798.248227797183, - 29815.76759156723, - 29833.289529254005, - 29850.81404010153, - 29868.341123354381, - 29885.870778257693, - 29903.403004057145, - 29920.937799998974, - 29938.475165329975, - 29956.015099297485, - 29973.557601149394, - 29991.102670134147, - 30008.650305500738, - 30026.200506498706, - 30043.753272378144, - 30061.308602389683, - 30078.866495784507, - 30096.426951814352, - 30113.989969731494, - 30131.55554878875, - 30149.123688239491, - 30166.694387337629, - 30184.267645337608, - 30201.843461494434, - 30219.42183506364, - 30237.002765301309, - 30254.586251464058, - 30272.172292809046, - 30289.760888593977, - 30307.35203807709, - 30324.94574051716, - 30342.541995173502, - 30360.140801305966, - 30377.742158174944, - 30395.346065041358, - 30412.952521166666, - 30430.561525812864, - 30448.173078242475, - 30465.787177718561, - 30483.403823504719, - 30501.02301486507, - 30518.644751064272, - 30536.269031367516, - 30553.895855040515, - 30571.525221349519, - 30589.157129561307, - 30606.791578943175, - 30624.428568762964, - 30642.06809828903, - 30659.710166790261, - 30677.35477353607, - 30695.001917796391, - 30712.651598841687, - 30730.303815942945, - 30747.958568371676, - 30765.615855399912, - 30783.275676300211, - 30800.938030345646, - 30818.602916809814, - 30836.270334966837, - 30853.940284091354, - 30871.612763458521, - 30889.287772344011, - 30906.965310024025, - 30924.645375775272, - 30942.327968874983, - 30960.013088600903, - 30977.700734231294, - 30995.390905044929, - 31013.083600321101, - 31030.778819339619, - 31048.476561380798, - 31066.17682572547, - 31083.879611654978, - 31101.584918451179, - 31119.29274539644, - 31137.003091773637, - 31154.715956866155, - 31172.431339957893, - 31190.14924033326, - 31207.869657277162, - 31225.592590075023, - 31243.318038012771, - 31261.046000376838, - 31278.776476454172, - 31296.50946553221, - 31314.24496689891, - 31331.98297984272, - 31349.7235036526, - 31367.466537618013, - 31385.212081028923, - 31402.960133175795, - 31420.710693349596, - 31438.463760841791, - 31456.219334944351, - 31473.977414949743, - 31491.738000150934, - 31509.501089841389, - 31527.266683315069, - 31545.034779866437, - 31562.80537879045, - 31580.578479382562, - 31598.35408093872, - 31616.132182755369, - 31633.91278412945, - 31651.695884358396, - 31669.481482740131, - 31687.269578573076, - 31705.060171156143, - 31722.853259788735, - 31740.648843770748, - 31758.446922402567, - 31776.247494985066, - 31794.050560819614, - 31811.85611920806, - 31829.664169452753, - 31847.474710856521, - 31865.287742722685, - 31883.103264355046, - 31900.921275057899, - 31918.741774136019, - 31936.564760894671, - 31954.390234639599, - 31972.21819467704, - 31990.048640313704, - 32007.881570856793, - 32025.716985613984, - 32043.554883893445, - 32061.395265003815, - 32079.238128254223, - 32097.083472954269, - 32114.931298414049, - 32132.781603944117, - 32150.634388855524, - 32168.48965245979, - 32186.347394068915, - 32204.207612995371, - 32222.07030855212, - 32239.935480052583, - 32257.803126810672, - 32275.673248140767, - 32293.545843357719, - 32311.420911776862, - 32329.298452713996, - 32347.178465485395, - 32365.060949407813, - 32382.945903798463, - 32400.83332797504, - 32418.723221255706, - 32436.615582959093, - 32454.510412404306, - 32472.407708910916, - 32490.307471798966, - 32508.209700388961, - 32526.114394001877, - 32544.021551959166, - 32561.931173582732, - 32579.843258194956, - 32597.757805118679, - 32615.674813677211, - 32633.594283194328, - 32651.516212994258, - 32669.440602401712, - 32687.367450741847, - 32705.296757340297, - 32723.228521523146, - 32741.162742616943, - 32759.099419948703, - 32777.038552845901, - 32794.980140636464, - 32812.924182648792, - 32830.87067821173, - 32848.819626654593, - 32866.77102730715, - 32884.724879499619, - 32902.681182562686, - 32920.639935827494, - 32938.601138625643, - 32956.56479028918, - 32974.530890150607, - 32992.499437542894, - 33010.470431799447, - 33028.443872254145, - 33046.419758241311, - 33064.39808909571, - 33082.378864152583, - 33100.36208274759, - 33118.347744216881, - 33136.335847897026, - 33154.326393125062, - 33172.31937923847, - 33190.314805575174, - 33208.312671473555, - 33226.312976272442, - 33244.315719311111, - 33262.320899929284, - 33280.328517467125, - 33298.33857126526, - 33316.351060664747, - 33334.365985007091, - 33352.383343634239, - 33370.403135888591, - 33388.42536111299, - 33406.450018650721, - 33424.477107845501, - 33442.506628041512, - 33460.53857858335, - 33478.572958816083, - 33496.609768085189, - 33514.649005736617, - 33532.690671116739, - 33550.734763572356, - 33568.781282450735, - 33586.830227099563, - 33604.881596866973, - 33622.935391101528, - 33640.991609152239, - 33659.050250368542, - 33677.111314100322, - 33695.174799697881, - 33713.240706511984, - 33731.309033893805, - 33749.37978119497, - 33767.452947767531, - 33785.528532963974, - 33803.606536137209, - 33821.686956640602, - 33839.769793827938, - 33857.855047053425, - 33875.942715671707, - 33894.032799037872, - 33912.125296507431, - 33930.220207436316, - 33948.317531180888, - 33966.417267097961, - 33984.519414544746, - 34002.623972878901, - 34020.730941458511, - 34038.840319642077, - 34056.952106788536, - 34075.066302257255, - 34093.182905408015, - 34111.301915601027, - 34129.42333219693, - 34147.547154556785, - 34165.673382042078, - 34183.80201401472, - 34201.933049837033, - 34220.06648887178, - 34238.202330482141, - 34256.340574031703, - 34274.481218884495, - 34292.624264404949, - 34310.769709957938, - 34328.91755490873, - 34347.067798623029, - 34365.220440466954, - 34383.375479807051, - 34401.532916010263, - 34419.692748443973, - 34437.854976475966, - 34456.01959947445, - 34474.18661680806, - 34492.356027845817, - 34510.527831957188, - 34528.702028512052, - 34546.878616880676, - 34565.05759643377, - 34583.238966542449, - 34601.422726578232, - 34619.608875913065, - 34637.797413919296, - 34655.988339969692, - 34674.181653437423, - 34692.37735369608, - 34710.575440119668, - 34728.775912082579, - 34746.978768959649, - 34765.184010126082, - 34783.391634957537, - 34801.60164283005, - 34819.814033120063, - 34838.028805204456, - 34856.24595846048, - 34874.465492265823, - 34892.687405998557, - 34910.911699037177, - 34929.138370760564, - 34947.367420548027, - 34965.598847779271, - 34983.832651834389, - 35002.068832093908, - 35020.307387938738, - 35038.548318750189, - 35056.79162390998, - 35075.03730280025, - 35093.285354803513, - 35111.535779302685, - 35129.788575681116, - 35148.043743322516, - 35166.301281611013, - 35184.561189931141, - 35202.823467667826, - 35221.088114206388, - 35239.355128932555, - 35257.624511232447, - 35275.896260492584, - 35294.170376099886, - 35312.446857441668, - 35330.725703905628, - 35349.006914879887, - 35367.290489752944, - 35385.576427913686, - 35403.864728751418, - 35422.155391655811, - 35440.448416016967, - 35458.743801225341, - 35477.041546671804, - 35495.341651747622, - 35513.644115844436, - 35531.948938354304, - 35550.256118669655, - 35568.565656183309, - 35586.877550288496, - 35605.191800378816, - 35623.508405848268, - 35641.827366091238, - 35660.148680502505, - 35678.472348477233, - 35696.798369410979, - 35715.126742699678, - 35733.457467739659, - 35751.790543927644, - 35770.125970660738, - 35788.46374733642, - 35806.803873352568, - 35825.146348107453, - 35843.49117099971, - 35861.838341428367, - 35880.187858792851, - 35898.539722492955, - 35916.893931928862, - 35935.250486501129, - 35953.609385610718, - 35971.970628658957, - 35990.334215047558, - 36008.700144178612, - 36027.068415454596, - 36045.439028278372, - 36063.811982053165, - 36082.187276182609, - 36100.564910070694, - 36118.944883121789, - 36137.327194740654, - 36155.711844332429, - 36174.098831302617, - 36192.488155057115, - 36210.87981500219, - 36229.273810544473, - 36247.670141091003, - 36266.068806049167, - 36284.469804826738, - 36302.873136831862, - 36321.278801473069, - 36339.686798159251, - 36358.097126299683, - 36376.509785304013, - 36394.924774582258, - 36413.342093544816, - 36431.761741602444, - 36450.183718166292, - 36468.608022647859, - 36487.034654459028, - 36505.463613012063, - 36523.894897719583, - 36542.328507994578, - 36560.764443250409, - 36579.202702900831, - 36597.643286359926, - 36616.086193042182, - 36634.531422362437, - 36652.978973735895, - 36671.428846578143, - 36689.881040305125, - 36708.335554333149, - 36726.792388078902, - 36745.251540959427, - 36763.713012392138, - 36782.176801794812, - 36800.642908585593, - 36819.111332182983, - 36837.582072005869, - 36856.055127473483, - 36874.530498005421, - 36893.008183021651, - 36911.488181942506, - 36929.970494188674, - 36948.455119181206, - 36966.942056341519, - 36985.431305091392, - 37003.922864852961, - 37022.416735048733, - 37040.912915101559, - 37059.411404434657, - 37077.91220247162, - 37096.415308636388, - 37114.920722353243, - 37133.428443046862, - 37151.938470142253, - 37170.450803064785, - 37188.965441240209, - 37207.482384094597, - 37226.001631054402, - 37244.523181546429, - 37263.047034997842, - 37281.573190836149, - 37300.101648489224, - 37318.632407385296, - 37337.165466952945, - 37355.700826621112, - 37374.238485819085, - 37392.778443976509, - 37411.320700523385, - 37429.865254890057, - 37448.412106507232, - 37466.961254805974, - 37485.512699217681, - 37504.066439174116, - 37522.622474107404, - 37541.180803449992, - 37559.741426634704, - 37578.304343094693, - 37596.869552263488, - 37615.43705357494, - 37634.006846463279, - 37652.578930363044, - 37671.153304709165, - 37689.729968936896, - 37708.308922481847, - 37726.890164779965, - 37745.473695267559, - 37764.059513381275, - 37782.647618558112, - 37801.238010235415, - 37819.830687850859, - 37838.425650842495, - 37857.022898648691, - 37875.622430708172, - 37894.224246460013, - 37912.828345343616, - 37931.434726798747, - 37950.043390265506, - 37968.654335184328, - 37987.267560995999, - 38005.883067141665, - 38024.500853062775, - 38043.120918201159, - 38061.743261998963, - 38080.367883898682, - 38098.994783343158, - 38117.623959775563, - 38136.255412639417, - 38154.889141378575, - 38173.525145437234, - 38192.163424259939, - 38210.803977291551, - 38229.446803977284, - 38248.091903762703, - 38266.739276093685, - 38285.388920416466, - 38304.040836177606, - 38322.695022824002, - 38341.351479802899, - 38360.010206561863, - 38378.671202548816, - 38397.334467211993, - 38415.999999999978, - 38434.667800361683, - 38453.33786774637, - 38472.010201603611, - 38490.684801383337, - 38509.361666535784, - 38528.040796511552, - 38546.722190761553, - 38565.405848737035, - 38584.091769889594, - 38602.779953671132, - 38621.470399533908, - 38640.163106930493, - 38658.858075313794, - 38677.555304137059, - 38696.254792853862, - 38714.956540918094, - 38733.660547783991, - 38752.366812906112, - 38771.075335739348, - 38789.78611573892, - 38808.499152360368, - 38827.214445059573, - 38845.931993292739, - 38864.651796516388, - 38883.373854187383, - 38902.098165762916, - 38920.824730700486, - 38939.553548457938, - 38958.284618493431, - 38977.017940265461, - 38995.753513232834, - 39014.491336854699, - 39033.231410590517, - 39051.973733900079, - 39070.718306243485, - 39089.465127081188, - 39108.214195873945, - 39126.965512082832, - 39145.719075169261, - 39164.474884594965, - 39183.232939821988, - 39201.99324031271, - 39220.755785529815, - 39239.52057493633, - 39258.287607995589, - 39277.056884171245, - 39295.828402927284, - 39314.602163728006, - 39333.378166038019, - 39352.15640932227, - 39370.936893046004, - 39389.719616674811, - 39408.504579674584, - 39427.291781511522, - 39446.081221652174, - 39464.872899563372, - 39483.666814712291, - 39502.462966566411, - 39521.261354593538, - 39540.06197826178, - 39558.864837039568, - 39577.669930395656, - 39596.47725779911, - 39615.286818719302, - 39634.098612625923, - 39652.912638988993, - 39671.728897278823, - 39690.547386966064, - 39709.368107521652, - 39728.191058416858, - 39747.016239123259, - 39765.84364911275, - 39784.673287857528, - 39803.505154830105, - 39822.339249503319, - 39841.175571350293, - 39860.014119844491, - 39878.854894459677, - 39897.697894669909, - 39916.54311994958, - 39935.390569773372, - 39954.240243616303, - 39973.092140953675, - 39991.946261261117, - 40010.802604014549, - 40029.661168690225, - 40048.521954764678, - 40067.384961714779, - 40086.250189017679, - 40105.117636150855, - 40123.98730259209, - 40142.859187819471, - 40161.733291311379, - 40180.609612546526, - 40199.488151003912, - 40218.368906162854, - 40237.25187750296, - 40256.137064504153, - 40275.024466646668, - 40293.914083411029, - 40312.805914278084, - 40331.699958728961, - 40350.596216245103, - 40369.494686308273, - 40388.39536840051, - 40407.298262004173, - 40426.20336660192, - 40445.110681676706, - 40464.020206711793, - 40482.931941190756, - 40501.845884597446, - 40520.762036416032, - 40539.680396130985, - 40558.600963227072, - 40577.523737189367, - 40596.448717503234, - 40615.375903654342, - 40634.305295128659, - 40653.236891412453, - 40672.170691992294, - 40691.106696355047, - 40710.044903987873, - 40728.985314378238, - 40747.927927013901, - 40766.872741382918, - 40785.819756973651, - 40804.768973274746, - 40823.720389775161, - 40842.674005964131, - 40861.629821331211, - 40880.587835366234, - 40899.548047559321, - 40918.510457400931, - 40937.475064381761, - 40956.441867992849, - 40975.410867725499, - 40994.382063071331, - 41013.355453522236, - 41032.331038570417, - 41051.308817708363, - 41070.288790428858, - 41089.270956224987, - 41108.255314590111, - 41127.241865017888, - 41146.23060700229, - 41165.221540037543, - 41184.214663618193, - 41203.209977239079, - 41222.207480395307, - 41241.207172582297, - 41260.209053295752, - 41279.213122031659, - 41298.219378286303, - 41317.227821556255, - 41336.23845133838, - 41355.251267129832, - 41374.266268428037, - 41393.283454730743, - 41412.302825535953, - 41431.324380341983, - 41450.348118647416, - 41469.374039951144, - 41488.402143752326, - 41507.432429550427, - 41526.464896845187, - 41545.499545136627, - 41564.536373925075, - 41583.575382711126, - 41602.616570995662, - 41621.659938279874, - 41640.705484065205, - 41659.753207853406, - 41678.803109146495, - 41697.855187446803, - 41716.909442256911, - 41735.965873079709, - 41755.02447941836, - 41774.085260776315, - 41793.148216657297, - 41812.213346565331, - 41831.280650004708, - 41850.350126480014, - 41869.421775496106, - 41888.495596558132, - 41907.571589171515, - 41926.649752841957, - 41945.730087075463, - 41964.812591378286, - 41983.897265256979, - 42002.984108218378, - 42022.073119769593, - 42041.164299418015, - 42060.257646671307, - 42079.353161037419, - 42098.450842024591, - 42117.550689141324, - 42136.652701896404, - 42155.756879798893, - 42174.863222358137, - 42193.971729083758, - 42213.082399485655, - 42232.195233074002, - 42251.310229359246, - 42270.427387852127, - 42289.546708063644, - 42308.668189505079, - 42327.791831687995, - 42346.917634124227, - 42366.045596325886, - 42385.175717805352, - 42404.307998075295, - 42423.442436648642, - 42442.579033038608, - 42461.717786758672, - 42480.858697322597, - 42500.001764244422, - 42519.146987038446, - 42538.294365219248, - 42557.443898301688, - 42576.595585800882, - 42595.749427232236, - 42614.90542211142, - 42634.063569954378, - 42653.223870277317, - 42672.386322596729, - 42691.55092642938, - 42710.717681292292, - 42729.886586702756, - 42749.057642178363, - 42768.23084723694, - 42787.406201396603, - 42806.58370417574, - 42825.76335509299, - 42844.945153667286, - 42864.129099417805, - 42883.315191864014, - 42902.503430525649, - 42921.693814922692, - 42940.88634457541, - 42960.081019004348, - 42979.277837730297, - 42998.476800274322, - 43017.677906157769, - 43036.881154902228, - 43056.086546029583, - 43075.294079061961, - 43094.503753521763, - 43113.715568931671, - 43132.929524814601, - 43152.145620693766, - 43171.363856092619, - 43190.584230534907, - 43209.806743544621, - 43229.031394646016, - 43248.258183363621, - 43267.487109222224, - 43286.718171746885, - 43305.951370462906, - 43325.186704895881, - 43344.42417457165, - 43363.663779016322, - 43382.905517756262, - 43402.149390318104, - 43421.395396228749, - 43440.643535015348, - 43459.89380620532, - 43479.146209326354, - 43498.400743906379, - 43517.657409473606, - 43536.916205556496, - 43556.177131683784, - 43575.44018738444, - 43594.705372187724, - 43613.972685623135, - 43633.242127220445, - 43652.513696509668, - 43671.787393021099, - 43691.063216285271, - 43710.341165833001, - 43729.621241195346, - 43748.903441903625, - 43768.187767489413, - 43787.474217484552, - 43806.762791421126, - 43826.053488831501, - 43845.346309248278, - 43864.641252204325, - 43883.938317232765, - 43903.237503866971, - 43922.538811640596, - 43941.842240087513, - 43961.147788741881, - 43980.455457138101, - 43999.765244810835, - 44019.077151295001, - 44038.391176125755, - 44057.70731883854, - 44077.02557896902, - 44096.345956053141, - 44115.668449627083, - 44134.993059227287, - 44154.319784390456, - 44173.648624653535, - 44192.979579553728, - 44212.312648628489, - 44231.647831415532, - 44250.985127452805, - 44270.324536278538, - 44289.666057431183, - 44309.009690449464, - 44328.355434872348, - 44347.703290239064, - 44367.053256089079, - 44386.405331962109, - 44405.759517398139, - 44425.115811937387, - 44444.474215120332, - 44463.834726487694, - 44483.197345580462, - 44502.562071939843, - 44521.928905107328, - 44541.297844624634, - 44560.668890033732, - 44580.042040876848, - 44599.417296696454, - 44618.794657035272, - 44638.174121436256, - 44657.555689442641, - 44676.939360597877, - 44696.325134445673, - 44715.713010530002, - 44735.102988395054, - 44754.495067585296, - 44773.88924764542, - 44793.285528120374, - 44812.683908555344, - 44832.084388495779, - 44851.486967487363, - 44870.891645076015, - 44890.298420807922, - 44909.707294229491, - 44929.118264887409, - 44948.531332328566, - 44967.946496100136, - 44987.363755749502, - 45006.783110824319, - 45026.204560872473, - 45045.628105442098, - 45065.053744081561, - 45084.48147633949, - 45103.911301764747, - 45123.343219906426, - 45142.777230313885, - 45162.21333253671, - 45181.651526124733, - 45201.091810628037, - 45220.534185596924, - 45239.978650581965, - 45259.425205133957, - 45278.873848803938, - 45298.324581143192, - 45317.777401703235, - 45337.232310035848, - 45356.68930569302, - 45376.148388226997, - 45395.60955719027, - 45415.072812135557, - 45434.538152615823, - 45454.005578184282, - 45473.475088394356, - 45492.946682799746, - 45512.420360954362, - 45531.896122412363, - 45551.373966728155, - 45570.853893456362, - 45590.33590215187, - 45609.819992369776, - 45629.306163665438, - 45648.794415594442, - 45668.284747712612, - 45687.777159576006, - 45707.27165074092, - 45726.768220763894, - 45746.266869201696, - 45765.767595611323, - 45785.270399550034, - 45804.775280575297, - 45824.282238244828, - 45843.79127211657, - 45863.302381748719, - 45882.815566699683, - 45902.33082652813, - 45921.848160792935, - 45941.367569053225, - 45960.889050868354, - 45980.41260579793, - 45999.938233401757, - 46019.465933239902, - 46038.995704872657, - 46058.527547860547, - 46078.06146176433, - 46097.597446144995, - 46117.135500563774, - 46136.675624582109, - 46156.217817761702, - 46175.762079664462, - 46195.308409852543, - 46214.856807888333, - 46234.407273334444, - 46253.959805753715, - 46273.51440470924, - 46293.071069764315, - 46312.629800482478, - 46332.190596427499, - 46351.753457163381, - 46371.318382254351, - 46390.885371264863, - 46410.45442375962, - 46430.025539303526, - 46449.598717461733, - 46469.17395779962, - 46488.751259882782, - 46508.33062327707, - 46527.912047548532, - 46547.495532263471, - 46567.081076988397, - 46586.668681290059, - 46606.258344735434, - 46625.850066891719, - 46645.443847326351, - 46665.039685606986, - 46684.637581301497, - 46704.237533978005, - 46723.839543204842, - 46743.443608550573, - 46763.049729583989, - 46782.657905874104, - 46802.268136990162, - 46821.880422501628, - 46841.494761978196, - 46861.111154989776, - 46880.729601106526, - 46900.350099898795, - 46919.97265093719, - 46939.597253792526, - 46959.223908035841, - 46978.852613238392, - 46998.483368971691, - 47018.11617480743, - 47037.751030317551, - 47057.387935074221, - 47077.026888649809, - 47096.66789061694, - 47116.310940548428, - 47135.956038017328, - 47155.603182596918, - 47175.252373860698, - 47194.903611382375, - 47214.556894735892, - 47234.212223495422, - 47253.869597235338, - 47273.52901553025, - 47293.19047795498, - 47312.853984084577, - 47332.519533494306, - 47352.187125759658, - 47371.856760456343, - 47391.528437160297, - 47411.202155447652, - 47430.877914894787, - 47450.555715078299, - 47470.235555574982, - 47489.917435961863, - 47509.601355816201, - 47529.287314715453, - 47548.975312237308, - 47568.665347959672, - 47588.357421460656, - 47608.051532318605, - 47627.747680112072, - 47647.445864419846, - 47667.14608482091, - 47686.848340894474, - 47706.552632219973, - 47726.258958377046, - 47745.967318945557, - 47765.677713505589, - 47785.390141637428, - 47805.104602921601, - 47824.821096938824, - 47844.539623270044, - 47864.260181496429, - 47883.982771199349, - 47903.707391960394, - 47923.434043361369, - 47943.162724984308, - 47962.893436411439, - 47982.626177225218, - 48002.36094700831, - 48022.097745343599, - 48041.836571814172, - 48061.57742600335, - 48081.32030749465, - 48101.065215871815, - 48120.81215071879, - 48140.56111161974, - 48160.312098159047, - 48180.065109921306, - 48199.820146491307, - 48219.577207454073, - 48239.336292394844, - 48259.097400899045, - 48278.860532552339, - 48298.625686940592, - 48318.392863649875, - 48338.162062266485, - 48357.933282376915, - 48377.706523567889, - 48397.481785426316, - 48417.259067539344, - 48437.038369494308, - 48456.819690878765, - 48476.603031280487, - 48496.388390287451, - 48516.175767487839, - 48535.965162470042, - 48555.756574822684, - 48575.550004134566, - 48595.345449994718, - 48615.142911992378, - 48634.942389716991, - 48654.743882758201, - 48674.547390705877, - 48694.352913150084, - 48714.160449681112, - 48733.969999889443, - 48753.781563365759, - 48773.595139700978, - 48793.410728486211, - 48813.228329312769, - 48833.047941772187, - 48852.869565456189, - 48872.693199956717, - 48892.518844865925, - 48912.346499776155, - 48932.176164279976, - 48952.007837970152, - 48971.841520439666, - 48991.677211281676, - 49011.514910089587, - 49031.354616456978, - 49051.196329977654, - 49071.04005024561, - 49090.885776855059, - 49110.733509400408, - 49130.583247476279, - 49150.434990677488, - 49170.288738599062, - 49190.144490836232, - 49210.002246984441, - 49229.86200663932, - 49249.723769396718, - 49269.587534852675, - 49289.453302603448, - 49309.32107224549, - 49329.190843375451, - 49349.062615590192, - 49368.936388486785, - 49388.812161662492, - 49408.689934714785, - 49428.569707241324, - 49448.45147883999, - 49468.335249108866, - 49488.22101764621, - 49508.108784050521, - 49527.99854792047, - 49547.890308854934, - 49567.784066453009, - 49587.679820313977, - 49607.57757003732, - 49627.477315222721, - 49647.379055470075, - 49667.28279037946, - 49687.188519551179, - 49707.096242585707, - 49727.005959083741, - 49746.917668646165, - 49766.831370874068, - 49786.747065368734, - 49806.66475173166, - 49826.584429564515, - 49846.506098469203, - 49866.429758047794, - 49886.355407902578, - 49906.283047636032, - 49926.212676850846, - 49946.144295149883, - 49966.077902136225, - 49986.013497413151, - 50005.951080584135, - 50025.890651252834, - 50045.832209023123, - 50065.775753499074, - 50085.721284284933, - 50105.668800985164, - 50125.618303204428, - 50145.569790547575, - 50165.523262619652, - 50185.478719025901, - 50205.436159371769, - 50225.395583262893, - 50245.356990305103, - 50265.320380104429, - 50285.285752267104, - 50305.253106399534, - 50325.222442108337, - 50345.193759000336, - 50365.16705668252, - 50385.142334762102, - 50405.119592846473, - 50425.098830543218, - 50445.080047460127, - 50465.063243205179, - 50485.048417386541, - 50505.035569612577, - 50525.024699491856, - 50545.015806633128, - 50565.008890645338, - 50585.003951137631, - 50605.00098771933, - 50624.999999999971, - 50645.000987589265, - 50665.003950097132, - 50685.008887133677, - 50705.015798309192, - 50725.024683234165, - 50745.035541519283, - 50765.048372775411, - 50785.063176613621, - 50805.079952645159, - 50825.098700481489, - 50845.119419734241, - 50865.142110015244, - 50885.166770936521, - 50905.193402110279, - 50925.222003148934, - 50945.252573665071, - 50965.285113271471, - 50985.319621581119, - 51005.356098207172, - 51025.394542762981, - 51045.434954862096, - 51065.477334118244, - 51085.521680145357, - 51105.567992557546, - 51125.616270969113, - 51145.66651499454, - 51165.718724248516, - 51185.772898345916, - 51205.829036901778, - 51225.887139531362, - 51245.947205850105, - 51266.009235473619, - 51286.073228017718, - 51306.139183098399, - 51326.207100331856, - 51346.276979334456, - 51366.348819722756, - 51386.42262111351, - 51406.498383123653, - 51426.57610537031, - 51446.655787470787, - 51466.737429042587, - 51486.82102970338, - 51506.906589071048, - 51526.994106763632, - 51547.083582399391, - 51567.175015596738, - 51587.268405974297, - 51607.363753150858, - 51627.461056745415, - 51647.56031637713, - 51667.661531665362, - 51687.764702229651, - 51707.869827689727, - 51727.976907665499, - 51748.085941777055, - 51768.196929644677, - 51788.309870888836, - 51808.42476513017, - 51828.541611989524, - 51848.660411087905, - 51868.781162046515, - 51888.90386448674, - 51909.028518030143, - 51929.155122298485, - 51949.283676913685, - 51969.414181497872, - 51989.546635673345, - 52009.681039062583, - 52029.817391288263, - 52049.955691973213, - 52070.095940740481, - 52090.238137213273, - 52110.382281014987, - 52130.5283717692, - 52150.676409099666, - 52170.826392630333, - 52190.97832198532, - 52211.132196788931, - 52231.288016665654, - 52251.445781240145, - 52271.60549013727, - 52291.76714298204, - 52311.930739399664, - 52332.096279015546, - 52352.263761455244, - 52372.433186344519, - 52392.604553309284, - 52412.777861975665, - 52432.953111969946, - 52453.130302918595, - 52473.309434448267, - 52493.490506185793, - 52513.67351775818, - 52533.858468792605, - 52554.045358916446, - 52574.234187757254, - 52594.42495494274, - 52614.617660100812, - 52634.812302859558, - 52655.008882847229, - 52675.20739969227, - 52695.407853023295, - 52715.610242469098, - 52735.814567658657, - 52756.02082822111, - 52776.229023785803, - 52796.439153982225, - 52816.651218440056, - 52836.865216789171, - 52857.081148659599, - 52877.29901368155, - 52897.518811485425, - 52917.740541701773, - 52937.964203961354, - 52958.18979789508, - 52978.417323134046, - 52998.646779309529, - 53018.878166052978, - 53039.111482996006, - 53059.346729770419, - 53079.583906008193, - 53099.823011341483, - 53120.0640454026, - 53140.307007824063, - 53160.551898238533, - 53180.79871627887, - 53201.047461578091, - 53221.2981337694, - 53241.550732486176, - 53261.805257361964, - 53282.061708030487, - 53302.32008412564, - 53322.580385281493, - 53342.842611132299, - 53363.106761312469, - 53383.372835456597, - 53403.640833199453, - 53423.910754175973, - 53444.18259802126, - 53464.456364370613, - 53484.732052859479, - 53505.009663123499, - 53525.289194798468, - 53545.570647520362, - 53565.854020925333, - 53586.139314649699, - 53606.426528329954, - 53626.715661602764, - 53647.006714104959, - 53667.299685473547, - 53687.59457534572, - 53707.891383358816, - 53728.190109150361, - 53748.490752358055, - 53768.793312619753, - 53789.09778957349, - 53809.404182857485, - 53829.712492110106, - 53850.022716969899, - 53870.334857075584, - 53890.648912066055, - 53910.964881580367, - 53931.28276525774, - 53951.602562737586, - 53971.924273659461, - 53992.24789766311, - 54012.57343438844, - 54032.90088347553, - 54053.23024456462, - 54073.561517296133, - 54093.894701310644, - 54114.22979624891, - 54134.566801751855, - 54154.90571746057, - 54175.246543016314, - 54195.589278060506, - 54215.933922234755, - 54236.280475180814, - 54256.628936540626, - 54276.97930595628, - 54297.331583070045, - 54317.685767524359, - 54338.041858961828, - 54358.399857025215, - 54378.759761357462, - 54399.121571601667, - 54419.485287401105, - 54439.850908399218, - 54460.218434239614, - 54480.587864566056, - 54500.95919902248, - 54521.332437252997, - 54541.707578901878, - 54562.084623613555, - 54582.46357103264, - 54602.844420803893, - 54623.227172572246, - 54643.611825982807, - 54663.998380680838, - 54684.386836311773, - 54704.777192521207, - 54725.169448954897, - 54745.563605258772, - 54765.959661078923, - 54786.357616061614, - 54806.757469853255, - 54827.159222100439, - 54847.562872449904, - 54867.968420548583, - 54888.375866043534, - 54908.785208582012, - 54929.196447811417, - 54949.609583379322, - 54970.024614933463, - 54990.441542121727, - 55010.86036459219, - 55031.28108199306, - 55051.703693972733, - 55072.128200179759, - 55092.554600262847, - 55112.982893870874, - 55133.413080652877, - 55153.845160258061, - 55174.279132335789, - 55194.714996535586, - 55215.152752507143, - 55235.592399900306, - 55256.033938365079, - 55276.477367551655, - 55296.92268711036, - 55317.369896691685, - 55337.818995946305, - 55358.269984525024, - 55378.72286207883, - 55399.177628258869, - 55419.634282716441, - 55440.092825103013, - 55460.553255070205, - 55481.015572269804, - 55501.479776353764, - 55521.945866974187, - 55542.413843783339, - 55562.883706433655, - 55583.355454577715, - 55603.82908786826, - 55624.304605958219, - 55644.782008500639, - 55665.261295148754, - 55685.742465555952, - 55706.225519375774, - 55726.710456261928, - 55747.197275868275, - 55767.685977848843, - 55788.176561857814, - 55808.669027549528, - 55829.163374578478, - 55849.659602599328, - 55870.157711266889, - 55890.657700236145, - 55911.159569162221, - 55931.663317700411, - 55952.168945506164, - 55972.676452235086, - 55993.185837542944, - 56013.697101085651, - 56034.210242519301, - 56054.72526150012, - 56075.242157684508, - 56095.760930729011, - 56116.281580290342, - 56136.804106025367, - 56157.328507591104, - 56177.85478464474, - 56198.382936843598, - 56218.912963845185, - 56239.444865307138, - 56259.978640887268, - 56280.514290243525, - 56301.051813034042, - 56321.591208917082, - 56342.13247755108, - 56362.675618594607, - 56383.220631706419, - 56403.767516545398, - 56424.316272770608, - 56444.866900041241, - 56465.419398016667, - 56485.973766356394, - 56506.530004720102, - 56527.088112767611, - 56547.648090158902, - 56568.209936554107, - 56588.773651613519, - 56609.339234997584, - 56629.9066863669, - 56650.47600538221, - 56671.04719170442, - 56691.620244994599, - 56712.195164913959, - 56732.771951123868, - 56753.350603285835, - 56773.931121061541, - 56794.513504112823, - 56815.097752101647, - 56835.683864690152, - 56856.271841540627, - 56876.86168231551, - 56897.453386677393, - 56918.046954289028, - 56938.642384813298, - 56959.239677913261, - 56979.838833252121, - 57000.439850493225, - 57021.04272930009, - 57041.647469336371, - 57062.254070265873, - 57082.862531752558, - 57103.472853460553, - 57124.085035054108, - 57144.699076197649, - 57165.314976555739, - 57185.932735793103, - 57206.552353574611, - 57227.173829565276, - 57247.797163430281, - 57268.42235483494, - 57289.049403444733, - 57309.678308925286, - 57330.30907094237, - 57350.941689161911, - 57371.576163249985, - 57392.212492872815, - 57412.850677696784, - 57433.490717388406, - 57454.132611614368, - 57474.776360041491, - 57495.421962336746, - 57516.069418167266, - 57536.718727200314, - 57557.36988910332, - 57578.022903543861, - 57598.677770189643, - 57619.334488708548, - 57639.993058768589, - 57660.653480037938, - 57681.315752184906, - 57701.979874877965, - 57722.64584778573, - 57743.31367057695, - 57763.983342920546, - 57784.654864485572, - 57805.328234941233, - 57826.003453956881, - 57846.680521202026, - 57867.359436346305, - 57888.040199059527, - 57908.722809011633, - 57929.407265872709, - 57950.093569313001, - 57970.781719002895, - 57991.471714612911, - 58012.16355581375, - 58032.857242276223, - 58053.552773671312, - 58074.25014967013, - 58094.949369943948, - 58115.650434164185, - 58136.353342002389, - 58157.058093130276, - 58177.764687219693, - 58198.47312394264, - 58219.183402971255, - 58239.895523977837, - 58260.609486634821, - 58281.325290614775, - 58302.042935590434, - 58322.762421234678, - 58343.483747220511, - 58364.206913221096, - 58384.931918909751, - 58405.658763959924, - 58426.3874480452, - 58447.117970839339, - 58467.85033201622, - 58488.584531249864, - 58509.320568214462, - 58530.058442584334, - 58550.798154033931, - 58571.539702237875, - 58592.283086870906, - 58613.028307607929, - 58633.775364123983, - 58654.52425609425, - 58675.274983194053, - 58696.027545098877, - 58716.781941484325, - 58737.538172026158, - 58758.296236400274, - 58779.056134282728, - 58799.817865349694, - 58820.581429277503, - 58841.346825742643, - 58862.114054421712, - 58882.883114991484, - 58903.654007128847, - 58924.426730510851, - 58945.201284814684, - 58965.977669717664, - 58986.755884897269, - 59007.535930031117, - 59028.317804796949, - 59049.101508872664, - 59069.887041936301, - 59090.674403666046, - 59111.463593740213, - 59132.254611837263, - 59153.047457635803, - 59173.84213081457, - 59194.638631052461, - 59215.436958028506, - 59236.237111421855, - 59257.039090911829, - 59277.842896177877, - 59298.648526899589, - 59319.455982756685, - 59340.26526342905, - 59361.076368596696, - 59381.889297939757, - 59402.704051138542, - 59423.520627873484, - 59444.339027825139, - 59465.159250674224, - 59485.9812961016, - 59506.805163788253, - 59527.630853415307, - 59548.458364664046, - 59569.287697215863, - 59590.118850752311, - 59610.951824955089, - 59631.786619506012, - 59652.623234087048, - 59673.461668380311, - 59694.301922068029, - 59715.143994832593, - 59735.987886356525, - 59756.833596322482, - 59777.681124413255, - 59798.530470311794, - 59819.381633701159, - 59840.234614264569, - 59861.089411685381, - 59881.94602564707, - 59902.804455833269, - 59923.664701927737, - 59944.526763614384, - 59965.390640577243, - 59986.256332500488, - 60007.123839068438, - 60027.993159965539, - 60048.864294876381, - 60069.737243485688, - 60090.612005478324, - 60111.488580539284, - 60132.366968353708, - 60153.247168606867, - 60174.129180984164, - 60195.013005171153, - 60215.898640853513, - 60236.786087717061, - 60257.675345447751, - 60278.566413731671, - 60299.459292255044, - 60320.353980704247, - 60341.25047876576, - 60362.148786126229, - 60383.048902472423, - 60403.950827491237, - 60424.854560869717, - 60445.76010229504, - 60466.667451454516, - 60487.57660803559, - 60508.487571725847, - 60529.400342212997, - 60550.314919184893, - 60571.231302329521, - 60592.149491335003, - 60613.069485889588, - 60633.991285681674, - 60654.914890399785, - 60675.840299732568, - 60696.767513368832, - 60717.696530997484, - 60738.627352307602, - 60759.55997698837, - 60780.494404729128, - 60801.430635219323, - 60822.368668148556, - 60843.308503206565, - 60864.250140083204, - 60885.193578468468, - 60906.138818052495, - 60927.085858525541, - 60948.034699578006, - 60968.985340900421, - 60989.937782183442, - 61010.892023117864, - 61031.848063394616, - 61052.805902704764, - 61073.765540739492, - 61094.726977190134, - 61115.690211748137, - 61136.655244105103, - 61157.622073952742, - 61178.590700982917, - 61199.561124887616, - 61220.533345358948, - 61241.507362089171, - 61262.483174770663, - 61283.460783095943, - 61304.440186757645, - 61325.421385448557, - 61346.404378861582, - 61367.389166689762, - 61388.375748626262, - 61409.364124364387, - 61430.354293597571, - 61451.346256019373, - 61472.340011323497, - 61493.335559203762, - 61514.332899354122, - 61535.332031468672, - 61556.332955241618, - 61577.335670367313, - 61598.340176540238, - 61619.346473454993, - 61640.354560806329, - 61661.3644382891, - 61682.376105598312, - 61703.389562429089, - 61724.404808476691, - 61745.42184343651, - 61766.440667004063, - 61787.461278874987, - 61808.483678745069, - 61829.507866310203, - 61850.533841266435, - 61871.561603309929, - 61892.591152136971, - 61913.622487443987, - 61934.655608927525, - 61955.690516284267, - 61976.727209211022, - 61997.765687404724, - 62018.805950562448, - 62039.847998381381, - 62060.891830558845, - 62081.93744679229, - 62102.984846779298, - 62124.034030217575, - 62145.084996804966, - 62166.137746239416, - 62187.19227821903, - 62208.248592442025, - 62229.306688606739, - 62250.366566411656, - 62271.428225555377, - 62292.491665736627, - 62313.556886654267, - 62334.623888007271, - 62355.692669494762, - 62376.763230815974, - 62397.835571670272, - 62418.909691757144, - 62439.98559077621, - 62461.063268427228, - 62482.142724410049, - 62503.223958424685, - 62524.306970171267, - 62545.39175935003, - 62566.478325661366, - 62587.566668805768, - 62608.656788483881, - 62629.748684396451, - 62650.842356244357, - 62671.937803728622, - 62693.035026550366, - 62714.134024410858, - 62735.234797011479, - 62756.337344053733, - 62777.441665239276, - 62798.547760269852, - 62819.655628847358, - 62840.765270673801, - 62861.876685451323, - 62882.989872882186, - 62904.104832668774, - 62925.221564513602, - 62946.340068119309, - 62967.460343188657, - 62988.582389424526, - 63009.70620652994, - 63030.831794208025, - 63051.959152162039, - 63073.08828009537, - 63094.219177711529, - 63115.351844714154, - 63136.486280806988, - 63157.622485693922, - 63178.760459078956, - 63199.900200666219, - 63221.041710159967, - 63242.184987264569, - 63263.330031684534, - 63284.476843124474, - 63305.625421289144, - 63326.775765883409, - 63347.927876612259, - 63369.081753180813, - 63390.237395294316, - 63411.39480265812, - 63432.553974977716, - 63453.714911958712, - 63474.877613306839, - 63496.042078727944, - 63517.208307927998, - 63538.376300613119, - 63559.546056489504, - 63580.717575263516, - 63601.890856641607, - 63623.065900330374, - 63644.242706036515, - 63665.421273466869, - 63686.601602328381, - 63707.783692328136, - 63728.967543173334, - 63750.153154571279, - 63771.340526229418, - 63792.529657855317, - 63813.720549156649, - 63834.913199841227, - 63856.107609616978, - 63877.303778191941, - 63898.501705274284, - 63919.7013905723, - 63940.902833794404, - 63962.106034649114, - 63983.310992845094, - 64004.517708091109, - 64025.726180096048, - 64046.936408568938, - 64068.1483932189, - 64089.362133755196, - 64110.577629887193, - 64131.794881324393, - 64153.013887776404, - 64174.234648952966, - 64195.457164563937, - 64216.681434319289, - 64237.907457929112, - 64259.135235103626, - 64280.36476555316, - 64301.596048988169, - 64322.829085119236, - 64344.06387365704, - 64365.300414312398, - 64386.538706796251, - 64407.778750819634, - 64429.020546093721, - 64450.26409232981, - 64471.509389239291, - 64492.756436533709, - 64514.005233924705, - 64535.255781124033, - 64556.50807784358, - 64577.762123795357, - 64599.017918691468, - 64620.275462244172, - 64641.534754165805, - 64662.795794168844, - 64684.058581965895, - 64705.323117269661, - 64726.589399792974, - 64747.857429248776, - 64769.127205350138, - 64790.398727810236, - 64811.671996342375, - 64832.947010659969, - 64854.223770476558, - 64875.502275505794, - 64896.782525461451, - 64918.064520057414, - 64939.348259007682, - 64960.633742026388, - 64981.920968827762, - 65003.209939126165, - 65024.500652636067, - 65045.793109072067, - 65067.087308148861, - 65088.383249581282, - 65109.680933084259, - 65130.980358372864, - 65152.28152516226, - 65173.584433167736, - 65194.889082104703, - 65216.195471688683, - 65237.503601635319, - 65258.813471660353, - 65280.125081479666, - 65301.438430809241, - 65322.753519365178, - 65344.070346863708, - 65365.388913021146, - 65386.709217553958, - 65408.031260178701, - 65429.355040612056, - 65450.680558570821, - 65472.00781377191, - 65493.336805932355, - 65514.66753476928, - 65535.999999999956, - 65557.334201341757, - 65578.670138512171, - 65600.007811228788, - 65621.347219209332, - 65642.688362171626, - 65664.031239833639, - 65685.375851913413, - 65706.722198129137, - 65728.070278199084, - 65749.420091841661, - 65770.771638775404, - 65792.124918718939, - 65813.479931391004, - 65834.836676510458, - 65856.195153796303, - 65877.5553629676, - 65898.917303743554, - 65920.280975843489, - 65941.646378986843, - 65963.013512893158, - 65984.382377282076, - 66005.752971873386, - 66027.125296386963, - 66048.499350542799, - 66069.875134061018, - 66091.252646661844, - 66112.631888065618, - 66134.01285799277, - 66155.395556163887, - 66176.779982299631, - 66198.166136120795, - 66219.554017348273, - 66240.943625703105, - 66262.334960906388, - 66283.728022679396, - 66305.122810743444, - 66326.519324820023, - 66347.917564630698, - 66369.317529897162, - 66390.719220341227, - 66412.122635684791, - 66433.527775649884, - 66454.934639958636, - 66476.343228333324, - 66497.753540496284, - 66519.165576169995, - 66540.57933507704, - 66561.994816940118, - 66583.412021482043, - 66604.830948425733, - 66626.251597494222, - 66647.673968410629, - 66669.098060898235, - 66690.523874680381, - 66711.951409480564, - 66733.380665022371, - 66754.811641029475, - 66776.244337225711, - 66797.678753334985, - 66819.11488908132, - 66840.552744188884, - 66861.992318381905, - 66883.433611384738, - 66904.876622921889, - 66926.321352717903, - 66947.767800497502, - 66969.215965985466, - 66990.665848906734, - 67012.117448986304, - 67033.570765949335, - 67055.025799521056, - 67076.482549426815, - 67097.941015392076, - 67119.401197142433, - 67140.863094403554, - 67162.326706901222, - 67183.792034361351, - 67205.259076509959, - 67226.72783307315, - 67248.198303777172, - 67269.670488348347, - 67291.144386513144, - 67312.619997998088, - 67334.09732252988, - 67355.576359835293, - 67377.057109641188, - 67398.53957167457, - 67420.023745662547, - 67441.50963133233, - 67462.99722841123, - 67484.486536626689, - 67505.977555706224, - 67527.470285377494, - 67548.964725368263, - 67570.460875406367, - 67591.9587352198, - 67613.458304536631, - 67634.95958308503, - 67656.462570593329, - 67677.967266789899, - 67699.473671403248, - 67720.981784162024, - 67742.491604794923, - 67764.003133030797, - 67785.516368598575, - 67807.031311227314, - 67828.547960646174, - 67850.066316584402, - 67871.58637877139, - 67893.108146936589, - 67914.63162080961, - 67936.156800120138, - 67957.683684597971, - 67979.212273973011, - 68000.742567975263, - 68022.274566334876, - 68043.808268782057, - 68065.343675047145, - 68086.880784860579, - 68108.419597952918, - 68129.960114054789, - 68151.502332896969, - 68173.04625421032, - 68194.591877725834, - 68216.139203174564, - 68237.688230287706, - 68259.238958796544, - 68280.791388432481, - 68302.345518927032, - 68323.901350011787, - 68345.458881418483, - 68367.018112878912, - 68388.579044125028, - 68410.141674888844, - 68431.706004902502, - 68453.272033898262, - 68474.839761608455, - 68496.409187765545, - 68517.980312102081, - 68539.553134350732, - 68561.127654244279, - 68582.70387151558, - 68604.281785897634, - 68625.861397123503, - 68647.44270492639, - 68669.025709039604, - 68690.610409196524, - 68712.196805130661, - 68733.784896575627, - 68755.374683265123, - 68776.966164932994, - 68798.559341313128, - 68820.154212139591, - 68841.750777146473, - 68863.349036068044, - 68884.948988638629, - 68906.550634592684, - 68928.153973664739, - 68949.75900558944, - 68971.365730101577, - 68992.974146935987, - 69014.584255827634, - 69036.196056511588, - 69057.809548723017, - 69079.424732197207, - 69101.041606669532, - 69122.660171875468, - 69144.280427550606, - 69165.902373430625, - 69187.526009251334, - 69209.151334748618, - 69230.778349658474, - 69252.40705371699, - 69274.037446660412, - 69295.669528225, - 69317.303298147192, - 69338.938756163494, - 69360.575902010532, - 69382.214735425005, - 69403.855256143754, - 69425.497463903681, - 69447.141358441833, - 69468.78693949533, - 69490.434206801394, - 69512.083160097391, - 69533.733799120717, - 69555.386123608929, - 69577.04013329967, - 69598.695827930685, - 69620.353207239794, - 69642.012270964973, - 69663.67301884426, - 69685.335450615792, - 69706.999566017839, - 69728.665364788743, - 69750.332846666963, - 69772.002011391058, - 69793.672858699691, - 69815.345388331611, - 69837.019600025669, - 69858.695493520849, - 69880.373068556204, - 69902.052324870907, - 69923.733262204216, - 69945.415880295492, - 69967.100178884211, - 69988.786157709939, - 70010.473816512356, - 70032.163155031216, - 70053.854173006403, - 70075.546870177874, - 70097.241246285717, - 70118.937301070109, - 70140.635034271298, - 70162.334445629691, - 70184.035534885741, - 70205.738301780017, - 70227.442746053217, - 70249.1488674461, - 70270.856665699539, - 70292.566140554511, - 70314.277291752107, - 70335.990119033493, - 70357.704622139936, - 70379.420800812819, - 70401.138654793613, - 70422.85818382389, - 70444.579387645339, - 70466.302265999722, - 70488.026818628918, - 70509.753045274876, - 70531.480945679708, - 70553.210519585555, - 70574.941766734701, - 70596.674686869505, - 70618.409279732456, - 70640.145545066101, - 70661.883482613106, - 70683.623092116264, - 70705.364373318414, - 70727.107325962526, - 70748.851949791671, - 70770.598244549008, - 70792.346209977783, - 70814.095845821372, - 70835.847151823225, - 70857.600127726895, - 70879.354773276034, - 70901.111088214413, - 70922.869072285859, - 70944.628725234332, - 70966.390046803877, - 70988.153036738629, - 71009.917694782853, - 71031.684020680885, - 71053.45201417715, - 71075.221675016204, - 71096.993002942661, - 71118.765997701266, - 71140.540659036851, - 71162.316986694335, - 71184.09498041874, - 71205.874639955218, - 71227.655965048951, - 71249.438955445294, - 71271.223610889632, - 71293.009931127483, - 71314.797915904477, - 71336.587564966307, - 71358.378878058764, - 71380.171854927772, - 71401.966495319313, - 71423.762798979486, - 71445.560765654489, - 71467.360395090596, - 71489.161687034211, - 71510.964641231811, - 71532.769257429973, - 71554.575535375348, - 71576.383474814749, - 71598.19307549503, - 71620.004337163133, - 71641.817259566145, - 71663.631842451214, - 71685.4480855656, - 71707.26598865664, - 71729.085551471784, - 71750.906773758586, - 71772.729655264673, - 71794.554195737772, - 71816.380394925713, - 71838.208252576442, - 71860.037768437964, - 71881.868942258385, - 71903.701773785942, - 71925.536262768932, - 71947.372408955751, - 71969.210212094898, - 71991.049671934976, - 72012.890788224686, - 72034.73356071279, - 72056.577989148165, - 72078.424073279821, - 72100.271812856794, - 72122.121207628254, - 72143.97225734347, - 72165.824961751801, - 72187.679320602692, - 72209.53533364569, - 72231.393000630429, - 72253.252321306645, - 72275.113295424177, - 72296.975922732949, - 72318.840202982959, - 72340.706135924338, - 72362.573721307272, - 72384.442958882093, - 72406.313848399179, - 72428.186389609036, - 72450.060582262216, - 72471.936426109431, - 72493.813920901433, - 72515.693066389096, - 72537.573862323392, - 72559.456308455352, - 72581.340404536139, - 72603.226150316987, - 72625.113545549248, - 72647.002589984331, - 72668.893283373764, - 72690.785625469172, - 72712.679616022273, - 72734.575254784853, - 72756.472541508803, - 72778.371475946144, - 72800.272057848939, - 72822.174286969355, - 72844.07816305969, - 72865.983685872285, - 72887.890855159596, - 72909.799670674183, - 72931.710132168693, - 72953.622239395845, - 72975.535992108475, - 72997.451390059519, - 73019.368433001961, - 73041.287120688925, - 73063.207452873612, - 73085.129429309294, - 73107.053049749389, - 73128.978313947344, - 73150.905221656736, - 73172.833772631217, - 73194.763966624567, - 73216.695803390612, - 73238.62928268328, - 73260.564404256627, - 73282.501167864757, - 73304.439573261901, - 73326.379620202337, - 73348.321308440485, - 73370.264637730841, - 73392.209607827957, - 73414.156218486532, - 73436.104469461323, - 73458.054360507173, - 73480.005891379056, - 73501.959061831993, - 73523.913871621116, - 73545.870320501665, - 73567.828408228932, - 73589.78813455833, - 73611.749499245358, - 73633.712502045615, - 73655.677142714747, - 73677.643421008557, - 73699.611336682879, - 73721.580889493693, - 73743.552079197019, - 73765.524905548999, - 73787.499368305856, - 73809.475467223907, - 73831.453202059551, - 73853.432572569291, - 73875.413578509717, - 73897.396219637507, - 73919.380495709411, - 73941.36640648231, - 73963.353951713143, - 73985.343131158952, - 74007.333944576865, - 74029.326391724098, - 74051.320472357969, - 74073.316186235883, - 74095.313533115303, - 74117.312512753837, - 74139.313124909138, - 74161.315369338976, - 74183.319245801191, - 74205.324754053727, - 74227.331893854629, - 74249.340664961986, - 74271.351067134034, - 74293.363100129049, - 74315.376763705441, - 74337.392057621662, - 74359.408981636298, - 74381.427535508003, - 74403.447718995507, - 74425.469531857671, - 74447.492973853383, - 74469.518044741693, - 74491.54474428168, - 74513.573072232539, - 74535.603028353551, - 74557.634612404087, - 74579.667824143602, - 74601.702663331642, - 74623.739129727837, - 74645.777223091936, - 74667.816943183716, - 74689.858289763113, - 74711.901262590094, - 74733.945861424741, - 74755.992086027225, - 74778.039936157802, - 74800.089411576817, - 74822.140512044702, - 74844.193237321961, - 74866.24758716923, - 74888.303561347187, - 74910.36115961663, - 74932.420381738411, - 74954.481227473516, - 74976.543696582972, - 74998.607788827925, - 75020.673503969607, - 75042.740841769322, - 75064.809801988464, - 75086.88038438854, - 75108.952588731103, - 75131.026414777836, - 75153.101862290467, - 75175.178931030852, - 75197.257620760924, - 75219.33793124267, - 75241.419862238225, - 75263.503413509738, - 75285.588584819503, - 75307.675375929874, - 75329.763786603318, - 75351.853816602365, - 75373.945465689612, - 75396.038733627807, - 75418.133620179724, - 75440.230125108254, - 75462.32824817636, - 75484.427989147109, - 75506.529347783653, - 75528.63232384919, - 75550.736917107075, - 75572.843127320695, - 75594.950954253538, - 75617.060397669193, - 75639.171457331307, - 75661.284133003646, - 75683.398424450032, - 75705.514331434402, - 75727.631853720741, - 75749.750991073175, - 75771.871743255862, - 75793.994110033076, - 75816.118091169177, - 75838.243686428585, - 75860.370895575848, - 75882.499718375562, - 75904.630154592422, - 75926.762203991224, - 75948.895866336825, - 75971.031141394182, - 75993.168028928325, - 76015.306528704401, - 76037.4466404876, - 76059.588364043215, - 76081.731699136653, - 76103.876645533353, - 76126.023202998884, - 76148.171371298871, - 76170.321150199044, - 76192.472539465205, - 76214.625538863256, - 76236.780148159174, - 76258.936367119008, - 76281.094195508922, - 76303.253633095141, - 76325.414679643975, - 76347.577334921851, - 76369.741598695226, - 76391.907470730686, - 76414.074950794879, - 76436.244038654564, - 76458.414734076548, - 76480.587036827754, - 76502.760946675175, - 76524.936463385893, - 76547.11358672705, - 76569.292316465915, - 76591.472652369819, - 76613.654594206164, - 76635.838141742468, - 76658.023294746308, - 76680.210052985349, - 76702.398416227341, - 76724.588384240138, - 76746.779956791637, - 76768.973133649866, - 76791.167914582897, - 76813.364299358902, - 76835.562287746157, - 76857.761879512967, - 76879.963074427797, - 76902.165872259109, - 76924.37027277553, - 76946.576275745727, - 76968.783880938441, - 76990.993088122515, - 77013.203897066895, - 77035.416307540567, - 77057.630319312622, - 77079.845932152239, - 77102.063145828695, - 77124.281960111301, - 77146.50237476948, - 77168.724389572759, - 77190.948004290723, - 77213.173218693031, - 77235.400032549442, - 77257.628445629802, - 77279.858457704031, - 77302.090068542122, - 77324.323277914169, - 77346.558085590339, - 77368.794491340886, - 77391.032494936138, - 77413.272096146524, - 77435.51329474253, - 77457.756090494731, - 77480.000483173804, - 77502.246472550498, - 77524.494058395634, - 77546.743240480107, - 77568.994018574944, - 77591.246392451198, - 77613.500361880026, - 77635.755926632657, - 77658.013086480438, - 77680.271841194757, - 77702.532190547092, - 77724.794134309021, - 77747.057672252195, - 77769.322804148323, - 77791.589529769248, - 77813.857848886837, - 77836.127761273063, - 77858.399266699998, - 77880.67236493979, - 77902.947055764627, - 77925.223338946831, - 77947.50121425878, - 77969.780681472927, - 77992.061740361838, - 78014.344390698127, - 78036.628632254491, - 78058.914464803747, - 78081.201888118725, - 78103.490901972415, - 78125.781506137821, - 78148.073700388064, - 78170.367484496339, - 78192.662858235926, - 78214.959821380166, - 78237.258373702498, - 78259.558514976452, - 78281.860244975614, - 78304.163563473659, - 78326.468470244363, - 78348.77496506153, - 78371.083047699125, - 78393.392717931114, - 78415.703975531578, - 78438.016820274701, - 78460.331251934695, - 78482.647270285903, - 78504.964875102727, - 78527.284066159627, - 78549.604843231195, - 78571.927206092048, - 78594.251154516911, - 78616.576688280606, - 78638.903807157985, - 78661.232510924034, - 78683.562799353778, - 78705.894672222363, - 78728.228129304945, - 78750.563170376859, - 78772.899795213423, - 78795.238003590101, - 78817.577795282399, - 78839.919170065928, - 78862.262127716356, - 78884.606668009452, - 78906.952790721043, - 78929.300495627045, - 78951.64978250346, - 78974.000651126378, - 78996.353101271932, - 79018.707132716358, - 79041.062745235977, - 79063.41993860717, - 79085.778712606436, - 79108.139067010285, - 79130.501001595389, - 79152.864516138419, - 79175.22961041618, - 79197.596284205531, - 79219.96453728342, - 79242.33436942687, - 79264.705780412987, - 79287.078770018954, - 79309.453338022009, - 79331.829484199508, - 79354.207208328866, - 79376.586510187582, - 79398.967389553218, - 79421.349846203433, - 79443.733879915948, - 79466.119490468584, - 79488.50667763922, - 79510.895441205823, - 79533.285780946433, - 79555.677696639163, - 79578.071188062226, - 79600.466254993895, - 79622.862897212515, - 79645.261114496549, - 79667.660906624471, - 79690.062273374875, - 79712.465214526455, - 79734.869729857935, - 79757.275819148126, - 79779.683482175955, - 79802.092718720378, - 79824.503528560454, - 79846.915911475327, - 79869.329867244203, - 79891.745395646343, - 79914.162496461155, - 79936.581169468045, - 79959.001414446553, - 79981.423231176261, - 80003.846619436852, - 80026.271579008084, - 80048.698109669771, - 80071.12621120183, - 80093.555883384237, - 80115.987125997053, - 80138.419938820414, - 80160.854321634528, - 80183.290274219689, - 80205.727796356281, - 80228.166887824715, - 80250.607548405547, - 80273.049777879336, - 80295.493576026798, - 80317.938942628651, - 80340.385877465727, - 80362.834380318949, - 80385.28445096928, - 80407.736089197788, - 80430.189294785596, - 80452.644067513917, - 80475.100407164035, - 80497.558313517322, - 80520.017786355209, - 80542.478825459213, - 80564.941430610925, - 80587.405601592007, - 80609.871338184195, - 80632.338640169342, - 80654.8075073293, - 80677.277939446067, - 80699.749936301683, - 80722.223497678278, - 80744.698623358039, - 80767.17531312324, - 80789.653566756242, - 80812.133384039465, - 80834.614764755403, - 80857.097708686648, - 80879.582215615854, - 80902.068285325731, - 80924.555917599093, - 80947.045112218824, - 80969.535868967869, - 80992.028187629272, - 81014.522067986123, - 81037.017509821613, - 81059.514512919006, - 81082.013077061609, - 81104.513202032831, - 81127.014887616184, - 81149.518133595193, - 81172.022939753486, - 81194.529305874807, - 81217.037231742899, - 81239.546717141639, - 81262.057761854958, - 81284.570365666848, - 81307.084528361403, - 81329.600249722775, - 81352.117529535186, - 81374.636367582949, - 81397.156763650448, - 81419.678717522125, - 81442.202228982511, - 81464.727297816222, - 81487.253923807933, - 81509.782106742379, - 81532.311846404409, - 81554.843142578902, - 81577.375995050839, - 81599.910403605274, - 81622.446368027333, - 81644.983888102215, - 81667.522963615178, - 81690.063594351581, - 81712.605780096841, - 81735.149520636449, - 81757.694815755967, - 81780.241665241047, - 81802.79006887741, - 81825.340026450824, - 81847.891537747171, - 81870.444602552379, - 81892.999220652477, - 81915.555391833506, - 81938.113115881672, - 81960.672392583176, - 81983.233221724338, - 82005.795603091537, - 82028.359536471224, - 82050.925021649906, - 82073.492058414209, - 82096.060646550788, - 82118.630785846399, - 82141.202476087841, - 82163.775717062032, - 82186.35050855593, - 82208.926850356569, - 82231.504742251054, - 82254.084184026578, - 82276.665175470393, - 82299.24771636985, - 82321.831806512317, - 82344.417445685307, - 82367.004633676348, - 82389.593370273054, - 82412.183655263143, - 82434.775488434374, - 82457.368869574595, - 82479.963798471697, - 82502.560274913689, - 82525.158298688606, - 82547.757869584602, - 82570.35898738986, - 82592.961651892678, - 82615.565862881398, - 82638.171620144421, - 82660.778923470265, - 82683.387772647475, - 82705.998167464713, - 82728.610107710658, - 82751.223593174116, - 82773.83862364394, - 82796.45519890904, - 82819.073318758441, - 82841.692982981185, - 82864.314191366429, - 82886.936943703375, - 82909.561239781324, - 82932.187079389638, - 82954.814462317736, - 82977.443388355125, - 83000.073857291369, - 83022.70586891612, - 83045.339423019104, - 83067.974519390089, - 83090.611157818959, - 83113.249338095629, - 83135.8890600101, - 83158.530323352461, - 83181.173127912858, - 83203.817473481497, - 83226.463359848669, - 83249.11078680474, - 83271.759754140134, - 83294.410261645375, - 83317.062309111003, - 83339.715896327703, - 83362.371023086147, - 83385.027689177165, - 83407.685894391587, - 83430.345638520361, - 83453.006921354478, - 83475.669742685001, - 83498.334102303095, - 83520.999999999942, - 83543.667435566866, - 83566.336408795192, - 83589.006919476349, - 83611.678967401851, - 83634.352552363242, - 83657.027674152167, - 83679.704332560359, - 83702.382527379552, - 83725.062258401638, - 83747.743525418511, - 83770.42632822218, - 83793.110666604684, - 83815.796540358162, - 83838.483949274829, - 83861.172893146941, - 83883.863371766842, - 83906.555384926964, - 83929.248932419752, - 83951.944014037799, - 83974.640629573696, - 83997.338778820151, - 84020.038461569929, - 84042.739677615857, - 84065.442426750829, - 84088.146708767847, - 84110.852523459922, - 84133.559870620171, - 84156.268750041796, - 84178.979161518029, - 84201.691104842204, - 84224.404579807713, - 84247.119586208006, - 84269.83612383662, - 84292.55419248715, - 84315.273791953281, - 84337.994922028738, - 84360.717582507335, - 84383.441773182945, - 84406.167493849513, - 84428.894744301069, - 84451.623524331691, - 84474.353833735542, - 84497.085672306828, - 84519.819039839858, - 84542.553936128999, - 84565.290360968676, - 84588.028314153402, - 84610.767795477717, - 84633.508804736295, - 84656.251341723822, - 84678.995406235073, - 84701.740998064924, - 84724.488117008252, - 84747.236762860062, - 84769.986935415407, - 84792.73863446941, - 84815.491859817252, - 84838.246611254188, - 84861.002888575575, - 84883.760691576768, - 84906.520020053256, - 84929.28087380057, - 84952.043252614312, - 84974.807156290146, - 84997.572584623806, - 85020.339537411113, - 85043.108014447949, - 85065.878015530237, - 85088.649540453989, - 85111.422589015303, - 85134.197161010321, - 85156.973256235244, - 85179.750874486374, - 85202.530015560071, - 85225.310679252725, - 85248.092865360857, - 85270.876573681016, - 85293.661804009811, - 85316.448556143951, - 85339.236829880188, - 85362.026625015351, - 85384.817941346351, - 85407.610778670132, - 85430.405136783724, - 85453.201015484257, - 85475.998414568865, - 85498.797333834795, - 85521.597773079353, - 85544.399732099904, - 85567.203210693886, - 85590.008208658808, - 85612.814725792239, - 85635.62276189182, - 85658.432316755265, - 85681.243390180331, - 85704.055981964877, - 85726.870091906807, - 85749.685719804082, - 85772.502865454764, - 85795.321528656961, - 85818.141709208852, - 85840.963406908675, - 85863.78662155474, - 85886.611352945445, - 85909.437600879217, - 85932.26536515457, - 85955.094645570091, - 85977.92544192441, - 86000.757754016275, - 86023.591581644432, - 86046.426924607746, - 86069.263782705122, - 86092.102155735556, - 86114.942043498071, - 86137.783445791807, - 86160.626362415918, - 86183.470793169676, - 86206.316737852379, - 86229.164196263402, - 86252.013168202204, - 86274.863653468303, - 86297.715651861261, - 86320.569163180728, - 86343.424187226425, - 86366.280723798132, - 86389.138772695675, - 86411.998333718977, - 86434.859406668009, - 86457.721991342827, - 86480.586087543532, - 86503.451695070296, - 86526.318813723352, - 86549.187443303032, - 86572.057583609683, - 86594.929234443756, - 86617.802395605773, - 86640.677066896271, - 86663.553248115903, - 86686.43093906538, - 86709.310139545443, - 86732.190849356964, - 86755.073068300815, - 86777.956796177954, - 86800.842032789442, - 86823.728777936354, - 86846.617031419853, - 86869.506793041175, - 86892.398062601613, - 86915.290839902518, - 86938.185124745316, - 86961.080916931489, - 86983.978216262592, - 87006.87702254027, - 87029.777335566177, - 87052.67915514209, - 87075.582481069796, - 87098.487313151185, - 87121.39365118822, - 87144.301494982894, - 87167.210844337285, - 87190.121699053532, - 87213.034058933845, - 87235.947923780506, - 87258.863293395829, - 87281.780167582241, - 87304.698546142172, - 87327.618428878181, - 87350.539815592856, - 87373.462706088845, - 87396.387100168897, - 87419.312997635774, - 87442.240398292357, - 87465.16930194154, - 87488.099708386319, - 87511.031617429733, - 87533.965028874911, - 87556.899942525008, - 87579.836358183282, - 87602.774275653021, - 87625.713694737613, - 87648.654615240492, - 87671.597036965148, - 87694.540959715145, - 87717.486383294105, - 87740.433307505737, - 87763.381732153779, - 87786.331657042057, - 87809.283081974456, - 87832.236006754916, - 87855.190431187453, - 87878.146355076155, - 87901.103778225151, - 87924.062700438633, - 87947.023121520891, - 87969.985041276246, - 87992.948459509105, - 88015.913376023906, - 88038.879790625171, - 88061.847703117513, - 88084.817113305573, - 88107.788020994049, - 88130.760425987726, - 88153.734328091465, - 88176.709727110137, - 88199.686622848749, - 88222.665015112303, - 88245.644903705906, - 88268.626288434709, - 88291.609169103947, - 88314.593545518903, - 88337.579417484914, - 88360.566784807408, - 88383.555647291854, - 88406.546004743795, - 88429.537856968818, - 88452.531203772611, - 88475.52604496089, - 88498.522380339447, - 88521.52020971413, - 88544.519532890874, - 88567.520349675644, - 88590.522659874507, - 88613.526463293543, - 88636.531759738922, - 88659.538549016899, - 88682.546830933745, - 88705.556605295846, - 88728.567871909589, - 88751.580630581491, - 88774.594881118086, - 88797.610623325963, - 88820.62785701183, - 88843.646581982393, - 88866.666798044462, - 88889.688505004888, - 88912.711702670611, - 88935.7363908486, - 88958.762569345898, - 88981.790237969632, - 89004.81939652696, - 89027.850044825114, - 89050.882182671412, - 89073.9158098732, - 89096.950926237885, - 89119.987531572973, - 89143.025625686001, - 89166.065208384563, - 89189.106279476357, - 89212.148838769106, - 89235.192886070581, - 89258.238421188667, - 89281.285443931265, - 89304.333954106376, - 89327.383951522017, - 89350.435435986306, - 89373.488407307406, - 89396.542865293537, - 89419.598809753006, - 89442.656240494165, - 89465.715157325409, - 89488.775560055219, - 89511.837448492137, - 89534.900822444746, - 89557.965681721733, - 89581.032026131812, - 89604.099855483742, - 89627.169169586399, - 89650.239968248672, - 89673.312251279538, - 89696.386018488018, - 89719.461269683205, - 89742.53800467425, - 89765.616223270365, - 89788.69592528083, - 89811.777110514988, - 89834.859778782207, - 89857.943929891975, - 89881.029563653807, - 89904.116679877261, - 89927.205278372014, - 89950.29535894774, - 89973.386921414218, - 89996.479965581268, - 90019.574491258769, - 90042.670498256688, - 90065.767986385021, - 90088.866955453836, - 90111.967405273259, - 90135.069335653476, - 90158.172746404758, - 90181.277637337407, - 90204.384008261797, - 90227.49185898836, - 90250.601189327586, - 90273.711999090039, - 90296.824288086325, - 90319.938056127125, - 90343.053303023189, - 90366.170028585286, - 90389.288232624298, - 90412.407914951138, - 90435.529075376777, - 90458.651713712257, - 90481.775829768681, - 90504.901423357209, - 90528.028494289058, - 90551.157042375504, - 90574.287067427911, - 90597.418569257643, - 90620.551547676194, - 90643.686002495073, - 90666.821933525847, - 90689.959340580186, - 90713.098223469773, - 90736.238582006365, - 90759.380416001804, - 90782.523725267951, - 90805.668509616764, - 90828.814768860233, - 90851.962502810435, - 90875.11171127946, - 90898.262394079517, - 90921.414551022855, - 90944.568181921743, - 90967.72328658856, - 90990.879864835719, - 91014.037916475718, - 91037.19744132107, - 91060.358439184391, - 91083.520909878338, - 91106.684853215629, - 91129.850269009039, - 91153.017157071401, - 91176.185517215621, - 91199.355349254649, - 91222.526653001492, - 91245.699428269247, - 91268.873674871036, - 91292.049392620058, - 91315.226581329553, - 91338.405240812834, - 91361.585370883287, - 91384.766971354344, - 91407.950042039476, - 91431.134582752245, - 91454.320593306256, - 91477.508073515171, - 91500.697023192712, - 91523.887442152685, - 91547.07933020893, - 91570.272687175326, - 91593.467512865856, - 91616.663807094534, - 91639.861569675442, - 91663.060800422725, - 91686.261499150554, - 91709.463665673218, - 91732.66729980502, - 91755.872401360321, - 91779.078970153569, - 91802.287005999257, - 91825.49650871192, - 91848.707478106167, - 91871.91991399668, - 91895.133816198169, - 91918.349184525418, - 91941.566018793281, - 91964.784318816659, - 91988.004084410495, - 92011.22531538982, - 92034.448011569708, - 92057.672172765277, - 92080.897798791746, - 92104.124889464365, - 92127.353444598411, - 92150.58346400928, - 92173.814947512379, - 92197.04789492322, - 92220.282306057314, - 92243.518180730272, - 92266.755518757753, - 92289.994319955469, - 92313.234584139194, - 92336.476311124774, - 92359.719500728082, - 92382.964152765067, - 92406.210267051734, - 92429.457843404161, - 92452.706881638471, - 92475.957381570814, - 92499.209343017443, - 92522.462765794655, - 92545.717649718805, - 92568.973994606305, - 92592.231800273614, - 92615.491066537259, - 92638.751793213814, - 92662.01398011994, - 92685.277627072326, - 92708.54273388772, - 92731.809300382942, - 92755.077326374871, - 92778.346811680414, - 92801.617756116568, - 92824.890159500384, - 92848.164021648947, - 92871.439342379424, - 92894.716121509016, - 92917.994358855023, - 92941.274054234746, - 92964.555207465572, - 92987.837818364962, - 93011.121886750407, - 93034.407412439468, - 93057.694395249753, - 93080.982834998955, - 93104.272731504767, - 93127.564084584999, - 93150.856894057491, - 93174.15115974014, - 93197.446881450916, - 93220.744059007804, - 93244.04269222889, - 93267.342780932304, - 93290.644324936235, - 93313.947324058914, - 93337.251778118633, - 93360.557686933767, - 93383.865050322696, - 93407.173868103928, - 93430.484140095941, - 93453.795866117362, - 93477.109045986799, - 93500.423679522952, - 93523.739766544561, - 93547.057306870454, - 93570.376300319491, - 93593.696746710571, - 93617.018645862699, - 93640.341997594893, - 93663.666801726242, - 93686.993058075881, - 93710.320766463032, - 93733.64992670693, - 93756.980538626914, - 93780.312602042337, - 93803.646116772637, - 93826.981082637285, - 93850.317499455836, - 93873.655367047861, - 93896.994685233032, - 93920.335453831038, - 93943.677672661666, - 93967.021341544707, - 93990.366460300051, - 94013.713028747632, - 94037.061046707429, - 94060.410513999494, - 94083.761430443905, - 94107.113795860845, - 94130.467610070496, - 94153.822872893157, - 94177.179584149111, - 94200.537743658759, - 94223.897351242529, - 94247.25840672091, - 94270.620909914433, - 94293.98486064373, - 94317.350258729421, - 94340.71710399224, - 94364.085396252936, - 94387.455135332348, - 94410.82632105134, - 94434.198953230851, - 94457.573031691878, - 94480.948556255447, - 94504.325526742658, - 94527.70394297468, - 94551.083804772716, - 94574.465111958023, - 94597.847864351934, - 94621.232061775823, - 94644.617704051096, - 94668.004790999272, - 94691.393322441872, - 94714.783298200506, - 94738.174718096794, - 94761.567581952477, - 94784.961889589307, - 94808.357640829097, - 94831.754835493703, - 94855.153473405066, - 94878.553554385173, - 94901.955078256055, - 94925.358044839784, - 94948.762453958523, - 94972.168305434476, - 94995.575599089891, - 95018.984334747074, - 95042.394512228391, - 95065.806131356265, - 95089.219191953176, - 95112.633693841635, - 95136.04963684424, - 95159.467020783617, - 95182.885845482466, - 95206.306110763529, - 95229.727816449609, - 95253.150962363579, - 95276.575548328314, - 95300.001574166803, - 95323.429039702052, - 95346.857944757154, - 95370.288289155214, - 95393.720072719429, - 95417.153295273019, - 95440.587956639298, - 95464.024056641589, - 95487.461595103305, - 95510.900571847902, - 95534.340986698866, - 95557.782839479783, - 95581.226130014256, - 95604.670858125959, - 95628.117023638595, - 95651.564626375985, - 95675.013666161918, - 95698.464142820303, - 95721.916056175076, - 95745.369406050231, - 95768.824192269807, - 95792.280414657915, - 95815.738073038709, - 95839.197167236387, - 95862.657697075221, - 95886.11966237954, - 95909.583062973688, - 95933.047898682111, - 95956.514169329268, - 95979.981874739708, - 96003.451014738006, - 96026.921589148798, - 96050.393597796792, - 96073.867040506724, - 96097.341917103375, - 96120.818227411626, - 96144.295971256375, - 96167.775148462577, - 96191.255758855244, - 96214.737802259449, - 96238.221278500292, - 96261.70618740299, - 96285.192528792715, - 96308.680302494788, - 96332.169508334526, - 96355.660146137321, - 96379.152215728609, - 96402.645716933868, - 96426.14064957868, - 96449.637013488609, - 96473.134808489311, - 96496.63403440651, - 96520.134691065963, - 96543.636778293469, - 96567.140295914898, - 96590.645243756153, - 96614.151621643221, - 96637.659429402134, - 96661.168666858954, - 96684.679333839798, - 96708.191430170875, - 96731.70495567839, - 96755.219910188665, - 96778.736293528011, - 96802.254105522836, - 96825.77334599958, - 96849.29401478474, - 96872.816111704873, - 96896.339636586577, - 96919.864589256511, - 96943.390969541389, - 96966.918777267958, - 96990.448012263048, - 97013.978674353522, - 97037.510763366285, - 97061.044279128328, - 97084.579221466673, - 97108.115590208385, - 97131.653385180587, - 97155.19260621049, - 97178.733253125291, - 97202.2753257523, - 97225.81882391886, - 97249.363747452342, - 97272.910096180189, - 97296.457869929916, - 97320.007068529041, - 97343.557691805196, - 97367.109739586012, - 97390.663211699197, - 97414.218107972498, - 97437.774428233737, - 97461.332172310766, - 97484.891340031507, - 97508.451931223899, - 97532.013945715982, - 97555.577383335811, - 97579.142243911512, - 97602.708527271257, - 97626.276233243261, - 97649.845361655811, - 97673.415912337223, - 97696.987885115886, - 97720.561279820206, - 97744.1360962787, - 97767.712334319876, - 97791.289993772341, - 97814.869074464703, - 97838.449576225685, - 97862.031498883996, - 97885.614842268449, - 97909.199606207883, - 97932.785790531183, - 97956.37339506732, - 97979.962419645264, - 98003.552864094076, - 98027.144728242856, - 98050.738011920766, - 98074.332714956996, - 98097.928837180807, - 98121.526378421506, - 98145.125338508456, - 98168.725717271067, - 98192.327514538789, - 98215.930730141132, - 98239.535363907664, - 98263.141415668011, - 98286.748885251814, - 98310.357772488816, - 98333.968077208759, - 98357.579799241488, - 98381.192938416847, - 98404.807494564782, - 98428.42346751524, - 98452.040857098269, - 98475.659663143917, - 98499.27988548232, - 98522.901523943656, - 98546.524578358163, - 98570.149048556093, - 98593.774934367786, - 98617.402235623624, - 98641.030952154048, - 98664.661083789513, - 98688.292630360564, - 98711.925591697771, - 98735.559967631794, - 98759.195757993293, - 98782.832962613014, - 98806.471581321734, - 98830.111613950285, - 98853.753060329575, - 98877.39592029051, - 98901.040193664099, - 98924.68588028138, - 98948.33297997342, - 98971.981492571387, - 98995.63141790645, - 99019.282755809851, - 99042.935506112874, - 99066.589668646877, - 99090.245243243233, - 99113.902229733401, - 99137.560627948857, - 99161.220437721131, - 99184.881658881859, - 99208.544291262631, - 99232.208334695169, - 99255.87378901121, - 99279.540654042547, - 99303.208929621018, - 99326.878615578535, - 99350.549711746993, - 99374.222217958435, - 99397.896134044888, - 99421.571459838422, - 99445.248195171211, - 99468.926339875441, - 99492.605893783344, - 99516.286856727209, - 99539.969228539398, - 99563.653009052287, - 99587.338198098325, - 99611.024795510006, - 99634.712801119866, - 99658.402214760499, - 99682.093036264545, - 99705.785265464699, - 99729.478902193689, - 99753.173946284325, - 99776.870397569437, - 99800.56825588191, - 99824.267521054688, - 99847.968192920773, - 99871.670271313182, - 99895.373756065004, - 99919.078647009388, - 99942.78494397951, - 99966.492646808634, - 99990.20175533001, - 100013.91226937699, - 100037.62418878295, - 100061.33751338134, - 100085.05224300563, - 100108.76837748935, - 100132.4859166661, - 100156.2048603695, - 100179.92520843323, - 100203.64696069101, - 100227.37011697664, - 100251.09467712394, - 100274.82064096678, - 100298.54800833909, - 100322.27677907483, - 100346.00695300807, - 100369.73852997283, - 100393.47150980328, - 100417.20589233354, - 100440.94167739789, - 100464.67886483055, - 100488.41745446586, - 100512.1574461382, - 100535.89883968196, - 100559.64163493161, - 100583.38583172169, - 100607.13142988674, - 100630.87842926137, - 100654.62682968024, - 100678.37663097809, - 100702.12783298964, - 100725.88043554971, - 100749.63443849317, - 100773.38984165489, - 100797.14664486986, - 100820.90484797307, - 100844.66445079957, - 100868.42545318443, - 100892.18785496285, - 100915.95165596998, - 100939.71685604109, - 100963.48345501146, - 100987.25145271645, - 101011.02084899142, - 101034.79164367182, - 101058.56383659317, - 101082.33742759094, - 101106.11241650078, - 101129.88880315828, - 101153.66658739912, - 101177.44576905905, - 101201.22634797383, - 101225.00832397929, - 101248.7916969113, - 101272.57646660579, - 101296.36263289873, - 101320.15019562612, - 101343.93915462404, - 101367.7295097286, - 101391.52126077596, - 101415.31440760233, - 101439.10895004397, - 101462.9048879372, - 101486.70222111834, - 101510.50094942382, - 101534.30107269008, - 101558.10259075361, - 101581.90550345098, - 101605.70981061876, - 101629.5155120936, - 101653.32260771218, - 101677.13109731126, - 101700.9409807276, - 101724.75225779804, - 101748.56492835947, - 101772.37899224881, - 101796.19444930303, - 101820.01129935916, - 101843.82954225427, - 101867.64917782549, - 101891.47020590997, - 101915.29262634492, - 101939.11643896763, - 101962.94164361537, - 101986.76824012553, - 102010.59622833549, - 102034.42560808272, - 102058.25637920471, - 102082.08854153901, - 102105.9220949232, - 102129.75703919494, - 102153.59337419191, - 102177.43109975185, - 102201.27021571253, - 102225.1107219118, - 102248.95261818753, - 102272.79590437764, - 102296.64058032009, - 102320.48664585294, - 102344.33410081422, - 102368.18294504205, - 102392.03317837461, - 102415.88480065008, - 102439.73781170673, - 102463.59221138287, - 102487.44799951684, - 102511.30517594704, - 102535.1637405119, - 102559.02369304992, - 102582.88503339965, - 102606.74776139967, - 102630.61187688859, - 102654.4773797051, - 102678.34426968795, - 102702.21254667587, - 102726.08221050771, - 102749.95326102231, - 102773.8256980586, - 102797.69952145554, - 102821.57473105213, - 102845.45132668741, - 102869.32930820051, - 102893.20867543056, - 102917.08942821674, - 102940.97156639832, - 102964.85508981455, - 102988.73999830478, - 103012.6262917084, - 103036.51396986481, - 103060.40303261351, - 103084.293479794, - 103108.18531124585, - 103132.07852680866, - 103155.97312632212, - 103179.8691096259, - 103203.76647655977, - 103227.66522696352, - 103251.56536067701, - 103275.46687754011, - 103299.36977739276, - 103323.27406007495, - 103347.1797254267, - 103371.0867732881, - 103394.99520349925, - 103418.90501590034, - 103442.81621033157, - 103466.72878663319, - 103490.64274464553, - 103514.55808420894, - 103538.4748051638, - 103562.39290735057, - 103586.31239060973, - 103610.23325478184, - 103634.15549970744, - 103658.07912522719, - 103682.00413118176, - 103705.93051741188, - 103729.85828375829, - 103753.78743006183, - 103777.71795616332, - 103801.64986190372, - 103825.58314712394, - 103849.51781166498, - 103873.4538553679, - 103897.39127807376, - 103921.33007962372, - 103945.27025985894, - 103969.21181862066, - 103993.15475575015, - 104017.0990710887, - 104041.0447644777, - 104064.99183575854, - 104088.94028477269, - 104112.89011136163, - 104136.84131536692, - 104160.79389663014, - 104184.74785499295, - 104208.70319029699, - 104232.65990238401, - 104256.61799109577, - 104280.57745627411, - 104304.53829776087, - 104328.50051539797, - 104352.46410902737, - 104376.42907849104, - 104400.39542363105, - 104424.36314428948, - 104448.33224030846, - 104472.3027115302, - 104496.27455779689, - 104520.24777895081, - 104544.22237483428, - 104568.19834528965, - 104592.17569015936, - 104616.15440928582, - 104640.13450251156, - 104664.1159696791, - 104688.09881063103, - 104712.08302520998, - 104736.06861325864, - 104760.05557461972, - 104784.043909136, - 104808.03361665027, - 104832.0246970054, - 104856.01715004431, - 104880.01097560991, - 104904.00617354522, - 104928.00274369326, - 104952.00068589712, - 104975.99999999993, - 105000.00068584486, - 105024.00274327511, - 105048.00617213396, - 105072.0109722647, - 105096.0171435107, - 105120.02468571534, - 105144.03359872208, - 105168.04388237436, - 105192.05553651576, - 105216.06856098982, - 105240.08295564017, - 105264.09872031047, - 105288.11585484444, - 105312.13435908582, - 105336.1542328784, - 105360.17547606604, - 105384.19808849262, - 105408.22207000206, - 105432.24742043833, - 105456.27413964548, - 105480.30222746753, - 105504.33168374863, - 105528.36250833291, - 105552.39470106458, - 105576.42826178786, - 105600.46319034706, - 105624.49948658649, - 105648.53715035053, - 105672.5761814836, - 105696.61657983017, - 105720.65834523473, - 105744.70147754184, - 105768.7459765961, - 105792.79184224214, - 105816.83907432464, - 105840.88767268835, - 105864.93763717801, - 105888.98896763846, - 105913.04166391456, - 105937.09572585119, - 105961.15115329332, - 105985.20794608595, - 106009.26610407409, - 106033.32562710284, - 106057.38651501729, - 106081.44876766266, - 106105.51238488412, - 106129.57736652695, - 106153.64371243643, - 106177.71142245791, - 106201.78049643678, - 106225.85093421848, - 106249.92273564848, - 106273.99590057228, - 106298.07042883546, - 106322.14632028362, - 106346.22357476239, - 106370.30219211751, - 106394.38217219469, - 106418.46351483969, - 106442.54621989837, - 106466.63028721658, - 106490.71571664025, - 106514.80250801529, - 106538.89066118775, - 106562.98017600364, - 106587.07105230905, - 106611.16328995011, - 106635.25688877302, - 106659.35184862395, - 106683.44816934918, - 106707.54585079502, - 106731.64489280782, - 106755.74529523395, - 106779.84705791986, - 106803.95018071201, - 106828.05466345693, - 106852.16050600118, - 106876.26770819137, - 106900.37626987413, - 106924.48619089619, - 106948.59747110425, - 106972.71011034511, - 106996.82410846559, - 107020.93946531253, - 107045.05618073288, - 107069.17425457356, - 107093.29368668159, - 107117.41447690397, - 107141.53662508781, - 107165.66013108024, - 107189.7849947284, - 107213.91121587952, - 107238.03879438085, - 107262.16773007967, - 107286.29802282334, - 107310.42967245923, - 107334.56267883476, - 107358.69704179741, - 107382.83276119467, - 107406.96983687414, - 107431.10826868335, - 107455.24805646999, - 107479.38920008171, - 107503.53169936626, - 107527.67555417139, - 107551.82076434491, - 107575.96732973469, - 107600.11525018861, - 107624.26452555459, - 107648.41515568066, - 107672.56714041479, - 107696.72047960508, - 107720.87517309963, - 107745.03122074658, - 107769.18862239413, - 107793.34737789053, - 107817.50748708403, - 107841.66894982298, - 107865.83176595572, - 107889.99593533068, - 107914.16145779629, - 107938.32833320105, - 107962.49656139348, - 107986.66614222217, - 108010.83707553572, - 108035.00936118282, - 108059.18299901215, - 108083.35798887245, - 108107.53433061253, - 108131.71202408121, - 108155.89106912735, - 108180.07146559987, - 108204.25321334775, - 108228.43631221994, - 108252.62076206553, - 108276.80656273357, - 108300.99371407321, - 108325.18221593359, - 108349.37206816394, - 108373.56327061349, - 108397.75582313156, - 108421.94972556747, - 108446.1449777706, - 108470.34157959036, - 108494.53953087622, - 108518.73883147769, - 108542.93948124432, - 108567.14148002568, - 108591.34482767139, - 108615.54952403114, - 108639.75556895464, - 108663.96296229165, - 108688.17170389196, - 108712.38179360541, - 108736.59323128188, - 108760.80601677128, - 108785.02014992358, - 108809.23563058881, - 108833.45245861699, - 108857.67063385822, - 108881.89015616261, - 108906.11102538036, - 108930.33324136167, - 108954.55680395682, - 108978.78171301607, - 109003.00796838976, - 109027.23556992831, - 109051.46451748211, - 109075.69481090162, - 109099.92645003737, - 109124.15943473989, - 109148.39376485976, - 109172.62944024763, - 109196.86646075416, - 109221.10482623006, - 109245.34453652608, - 109269.58559149304, - 109293.82799098175, - 109318.07173484311, - 109342.31682292801, - 109366.56325508743, - 109390.81103117237, - 109415.06015103387, - 109439.31061452301, - 109463.56242149093, - 109487.8155717888, - 109512.07006526781, - 109536.3259017792, - 109560.58308117429, - 109584.8416033044, - 109609.1014680209, - 109633.36267517522, - 109657.62522461878, - 109681.88911620311, - 109706.15434977971, - 109730.4209252002, - 109754.68884231619, - 109778.95810097932, - 109803.22870104131, - 109827.50064235389, - 109851.77392476884, - 109876.04854813802, - 109900.32451231324, - 109924.60181714644, - 109948.88046248957, - 109973.1604481946, - 109997.44177411357, - 110021.72444009855, - 110046.00844600165, - 110070.29379167501, - 110094.58047697082, - 110118.86850174134, - 110143.15786583882, - 110167.44856911557, - 110191.74061142397, - 110216.03399261639, - 110240.32871254528, - 110264.62477106311, - 110288.9221680224, - 110313.22090327571, - 110337.52097667565, - 110361.82238807483, - 110386.12513732594, - 110410.42922428172, - 110434.73464879491, - 110459.04141071832, - 110483.34950990479, - 110507.6589462072, - 110531.96971947847, - 110556.28182957157, - 110580.5952763395, - 110604.91005963532, - 110629.22617931209, - 110653.54363522294, - 110677.86242722106, - 110702.18255515963, - 110726.50401889188, - 110750.82681827113, - 110775.1509531507, - 110799.47642338395, - 110823.80322882428, - 110848.13136932514, - 110872.46084474004, - 110896.79165492248, - 110921.12379972603, - 110945.4572790043, - 110969.79209261097, - 110994.12824039967, - 111018.46572222417, - 111042.80453793822, - 111067.14468739564, - 111091.48617045028, - 111115.82898695602, - 111140.1731367668, - 111164.51861973655, - 111188.86543571933, - 111213.21358456917, - 111237.56306614014, - 111261.91388028639, - 111286.26602686207, - 111310.61950572141, - 111334.97431671864, - 111359.33045970804, - 111383.68793454397, - 111408.04674108078, - 111432.40687917286, - 111456.76834867468, - 111481.13114944073, - 111505.49528132551, - 111529.86074418361, - 111554.22753786964, - 111578.59566223821, - 111602.96511714405, - 111627.33590244185, - 111651.7080179864, - 111676.08146363248, - 111700.45623923496, - 111724.8323446487, - 111749.20977972864, - 111773.58854432974, - 111797.96863830699, - 111822.35006151545, - 111846.73281381019, - 111871.11689504632, - 111895.50230507903, - 111919.8890437635, - 111944.27711095495, - 111968.6665065087, - 111993.05723028004, - 112017.44928212435, - 112041.842661897, - 112066.23736945343, - 112090.63340464912, - 112115.03076733962, - 112139.42945738042, - 112163.82947462716, - 112188.23081893545, - 112212.63349016097, - 112237.03748815943, - 112261.44281278658, - 112285.84946389822, - 112310.25744135017, - 112334.66674499828, - 112359.07737469849, - 112383.48933030672, - 112407.90261167898, - 112432.31721867126, - 112456.73315113965, - 112481.15040894024, - 112505.56899192919, - 112529.98889996267, - 112554.41013289688, - 112578.8326905881, - 112603.25657289263, - 112627.68177966679, - 112652.10831076698, - 112676.53616604958, - 112700.96534537108, - 112725.39584858794, - 112749.82767555672, - 112774.26082613398, - 112798.6953001763, - 112823.13109754038, - 112847.56821808286, - 112872.00666166049, - 112896.44642813003, - 112920.88751734827, - 112945.32992917208, - 112969.77366345831, - 112994.21872006389, - 113018.66509884578, - 113043.11279966099, - 113067.56182236652, - 113092.01216681948, - 113116.46383287695, - 113140.9168203961, - 113165.37112923413, - 113189.82675924824, - 113214.28371029573, - 113238.74198223387, - 113263.20157492002, - 113287.66248821157, - 113312.12472196593, - 113336.58827604055, - 113361.05315029295, - 113385.51934458067, - 113409.98685876124, - 113434.45569269233, - 113458.92584623155, - 113483.39731923661, - 113507.87011156522, - 113532.34422307517, - 113556.81965362425, - 113581.2964030703, - 113605.77447127122, - 113630.25385808491, - 113654.73456336933, - 113679.2165869825, - 113703.69992878241, - 113728.18458862718, - 113752.67056637487, - 113777.15786188368, - 113801.64647501177, - 113826.13640561736, - 113850.62765355874, - 113875.12021869418, - 113899.61410088204, - 113924.1092999807, - 113948.60581584855, - 113973.10364834407, - 113997.60279732574, - 114022.1032626521, - 114046.60504418171, - 114071.10814177318, - 114095.61255528514, - 114120.11828457628, - 114144.62532950533, - 114169.13368993104, - 114193.6433657122, - 114218.15435670764, - 114242.66666277625, - 114267.18028377694, - 114291.69521956862, - 114316.21147001031, - 114340.72903496103, - 114365.24791427983, - 114389.7681078258, - 114414.2896154581, - 114438.81243703589, - 114463.33657241837, - 114487.8620214648, - 114512.38878403447, - 114536.91685998671, - 114561.44624918087, - 114585.97695147636, - 114610.5089667326, - 114635.04229480909, - 114659.57693556532, - 114684.11288886084, - 114708.65015455526, - 114733.18873250818, - 114757.72862257928, - 114782.26982462825, - 114806.81233851484, - 114831.35616409882, - 114855.90130123998, - 114880.44774979822, - 114904.99550963337, - 114929.5445806054, - 114954.09496257425, - 114978.64665539992, - 115003.19965894247, - 115027.75397306195, - 115052.30959761847, - 115076.86653247218, - 115101.42477748329, - 115125.984332512, - 115150.54519741859, - 115175.10737206334, - 115199.67085630659, - 115224.23565000873, - 115248.80175303014, - 115273.3691652313, - 115297.93788647266, - 115322.50791661476, - 115347.07925551817, - 115371.65190304347, - 115396.22585905129, - 115420.80112340231, - 115445.37769595724, - 115469.95557657682, - 115494.53476512182, - 115519.11526145306, - 115543.69706543141, - 115568.28017691776, - 115592.86459577303, - 115617.4503218582, - 115642.03735503425, - 115666.62569516223, - 115691.21534210323, - 115715.80629571836, - 115740.39855586876, - 115764.99212241563, - 115789.58699522018, - 115814.18317414368, - 115838.78065904744, - 115863.37944979276, - 115887.97954624105, - 115912.5809482537, - 115937.18365569216, - 115961.78766841792, - 115986.39298629249, - 116010.99960917742, - 116035.60753693432, - 116060.21676942479, - 116084.82730651053, - 116109.43914805322, - 116134.0522939146, - 116158.66674395646, - 116183.2824980406, - 116207.89955602887, - 116232.51791778316, - 116257.13758316539, - 116281.75855203751, - 116306.38082426153, - 116331.00439969949, - 116355.62927821343, - 116380.25545966547, - 116404.88294391775, - 116429.51173083246, - 116454.14182027178, - 116478.77321209799, - 116503.40590617337, - 116528.03990236025, - 116552.67520052097, - 116577.31180051794, - 116601.94970221359, - 116626.5889054704, - 116651.22941015086, - 116675.87121611751, - 116700.51432323294, - 116725.15873135976, - 116749.8044403606, - 116774.45145009817, - 116799.0997604352, - 116823.74937123443, - 116848.40028235866, - 116873.05249367072, - 116897.70600503348, - 116922.36081630984, - 116947.01692736275, - 116971.67433805518, - 116996.33304825013, - 117020.99305781067, - 117045.65436659988, - 117070.31697448085, - 117094.98088131678, - 117119.64608697082, - 117144.31259130624, - 117168.98039418629, - 117193.64949547425, - 117218.31989503348, - 117242.99159272734, - 117267.66458841923, - 117292.33888197262, - 117317.01447325097, - 117341.6913621178, - 117366.36954843666, - 117391.04903207115, - 117415.72981288488, - 117440.41189074152, - 117465.09526550474, - 117489.77993703831, - 117514.46590520597, - 117539.15316987153, - 117563.84173089883, - 117588.53158815173, - 117613.22274149416, - 117637.91519079007, - 117662.60893590341, - 117687.30397669821, - 117712.00031303853, - 117736.69794478847, - 117761.39687181212, - 117786.09709397367, - 117810.7986111373, - 117835.50142316725, - 117860.20552992777, - 117884.91093128319, - 117909.6176270978, - 117934.32561723603, - 117959.03490156225, - 117983.74547994092, - 118008.45735223651, - 118033.17051831353, - 118057.88497803656, - 118082.60073127014, - 118107.31777787894, - 118132.03611772758, - 118156.75575068076, - 118181.47667660323, - 118206.19889535972, - 118230.92240681504, - 118255.64721083404, - 118280.37330728157, - 118305.10069602253, - 118329.82937692189, - 118354.55934984458, - 118379.29061465565, - 118404.02317122012, - 118428.75701940308, - 118453.49215906965, - 118478.22859008498, - 118502.96631231424, - 118527.70532562268, - 118552.44562987552, - 118577.18722493808, - 118601.93011067568, - 118626.67428695368, - 118651.41975363747, - 118676.16651059251, - 118700.91455768423, - 118725.66389477813, - 118750.41452173979, - 118775.16643843475, - 118799.91964472862, - 118824.67414048707, - 118849.42992557574, - 118874.18699986035, - 118898.94536320666, - 118923.70501548045, - 118948.46595654752, - 118973.22818627374, - 118997.99170452499, - 119022.7565111672, - 119047.52260606633, - 119072.28998908834, - 119097.0586600993, - 119121.82861896523, - 119146.59986555226, - 119171.3723997265, - 119196.14622135412, - 119220.92133030134, - 119245.69772643436, - 119270.47540961947, - 119295.25437972297, - 119320.03463661121, - 119344.81618015055, - 119369.5990102074, - 119394.38312664822, - 119419.16852933947, - 119443.95521814766, - 119468.74319293935, - 119493.53245358112, - 119518.32299993958, - 119543.11483188139, - 119567.90794927324, - 119592.70235198183, - 119617.49803987393, - 119642.29501281632, - 119667.09327067583, - 119691.89281331931, - 119716.69364061367, - 119741.49575242582, - 119766.29914862274, - 119791.10382907141, - 119815.90979363887, - 119840.71704219218, - 119865.52557459843, - 119890.33539072477, - 119915.14649043836, - 119939.95887360642, - 119964.77254009615, - 119989.58748977486, - 120014.40372250983, - 120039.22123816841, - 120064.04003661797, - 120088.86011772591, - 120113.6814813597, - 120138.5041273868, - 120163.3280556747, - 120188.15326609099, - 120212.97975850321, - 120237.807532779, - 120262.63658878599, - 120287.46692639188, - 120312.29854546436, - 120337.13144587121, - 120361.9656274802, - 120386.80109015915, - 120411.63783377589, - 120436.47585819835, - 120461.31516329442, - 120486.15574893207, - 120510.99761497928, - 120535.84076130406, - 120560.68518777451, - 120585.53089425867, - 120610.3778806247, - 120635.22614674074, - 120660.07569247499, - 120684.92651769568, - 120709.77862227106, - 120734.63200606944, - 120759.48666895913, - 120784.3426108085, - 120809.19983148595, - 120834.05833085992, - 120858.91810879884, - 120883.77916517125, - 120908.64149984565, - 120933.5051126906, - 120958.37000357473, - 120983.23617236665, - 121008.10361893504, - 121032.97234314861, - 121057.84234487606, - 121082.71362398617, - 121107.58618034775, - 121132.46001382964, - 121157.33512430069, - 121182.21151162982, - 121207.08917568595, - 121231.96811633807, - 121256.84833345517, - 121281.72982690629, - 121306.61259656049, - 121331.49664228689, - 121356.38196395461, - 121381.26856143285, - 121406.15643459078, - 121431.04558329767, - 121455.93600742276, - 121480.82770683538, - 121505.72068140487, - 121530.61493100057, - 121555.51045549192, - 121580.40725474835, - 121605.30532863933, - 121630.20467703436, - 121655.10529980299, - 121680.00719681478, - 121704.91036793934, - 121729.81481304632, - 121754.72053200539, - 121779.62752468624, - 121804.53579095862, - 121829.44533069231, - 121854.3561437571, - 121879.26823002285, - 121904.1815893594, - 121929.09622163669, - 121954.01212672464, - 121978.92930449323, - 122003.84775481246, - 122028.76747755238, - 122053.68847258303, - 122078.61073977455, - 122103.53427899707, - 122128.45909012076, - 122153.38517301581, - 122178.31252755247, - 122203.24115360099, - 122228.17105103172, - 122253.10221971494, - 122278.03465952107, - 122302.96837032049, - 122327.90335198362, - 122352.83960438096, - 122377.777127383, - 122402.71592086025, - 122427.65598468333, - 122452.59731872278, - 122477.53992284928, - 122502.48379693348, - 122527.42894084606, - 122552.37535445779, - 122577.32303763942, - 122602.27199026172, - 122627.22221219557, - 122652.17370331181, - 122677.12646348133, - 122702.08049257506, - 122727.03579046397, - 122751.99235701906, - 122776.95019211136, - 122801.9092956119, - 122826.8696673918, - 122851.83130732219, - 122876.79421527422, - 122901.75839111909, - 122926.72383472799, - 122951.69054597223, - 122976.65852472307, - 123001.62777085182, - 123026.59828422987, - 123051.57006472857, - 123076.54311221937, - 123101.5174265737, - 123126.49300766307, - 123151.46985535898, - 123176.44796953299, - 123201.42735005668, - 123226.40799680166, - 123251.38990963959, - 123276.37308844214, - 123301.35753308103, - 123326.343243428, - 123351.33021935483, - 123376.31846073334, - 123401.30796743535, - 123426.29873933276, - 123451.29077629748, - 123476.28407820144, - 123501.2786449166, - 123526.27447631498, - 123551.27157226863, - 123576.26993264959, - 123601.26955732999, - 123626.27044618195, - 123651.27259907764, - 123676.27601588926, - 123701.28069648903, - 123726.28664074924, - 123751.29384854218, - 123776.30231974016, - 123801.31205421555, - 123826.32305184075, - 123851.33531248817, - 123876.34883603029, - 123901.36362233957, - 123926.37967128855, - 123951.39698274979, - 123976.41555659588, - 124001.43539269941, - 124026.45649093305, - 124051.47885116948, - 124076.50247328142, - 124101.5273571416, - 124126.55350262282, - 124151.58090959788, - 124176.60957793961, - 124201.63950752091, - 124226.67069821467, - 124251.70314989384, - 124276.73686243138, - 124301.7718357003, - 124326.80806957364, - 124351.84556392446, - 124376.88431862585, - 124401.92433355095, - 124426.96560857294, - 124452.00814356498, - 124477.05193840031, - 124502.0969929522, - 124527.14330709392, - 124552.19088069882, - 124577.23971364023, - 124602.28980579154, - 124627.34115702618, - 124652.3937672176, - 124677.44763623926, - 124702.50276396469, - 124727.55915026742, - 124752.61679502104, - 124777.67569809916, - 124802.73585937542, - 124827.79727872348, - 124852.85995601704, - 124877.92389112986, - 124902.98908393568, - 124928.05553430831, - 124953.1232421216, - 124978.19220724938, - 125003.26242956554, - 125028.33390894404, - 125053.40664525882, - 125078.48063838384, - 125103.55588819318, - 125128.63239456083, - 125153.71015736091, - 125178.78917646752, - 125203.86945175481, - 125228.95098309696, - 125254.03377036817, - 125279.1178134427, - 125304.20311219479, - 125329.28966649878, - 125354.37747622898, - 125379.46654125977, - 125404.55686146552, - 125429.6484367207, - 125454.74126689974, - 125479.83535187715, - 125504.93069152744, - 125530.02728572517, - 125555.12513434493, - 125580.22423726133, - 125605.32459434902, - 125630.4262054827, - 125655.52907053704, - 125680.63318938682, - 125705.73856190679, - 125730.84518797178, - 125755.9530674566, - 125781.06220023613, - 125806.17258618528, - 125831.28422517896, - 125856.39711709213, - 125881.51126179981, - 125906.62665917698, - 125931.74330909875, - 125956.86121144016, - 125981.98036607634, - 126007.10077288245, - 126032.22243173365, - 126057.34534250517, - 126082.46950507225, - 126107.59491931014, - 126132.72158509417, - 126157.84950229966, - 126182.97867080198, - 126208.10909047653, - 126233.24076119871, - 126258.37368284403, - 126283.50785528794, - 126308.64327840599, - 126333.77995207369, - 126358.91787616667, - 126384.0570505605, - 126409.19747513086, - 126434.3391497534, - 126459.48207430386, - 126484.62624865794, - 126509.77167269142, - 126534.9183462801, - 126560.06626929982, - 126585.21544162642, - 126610.36586313581, - 126635.51753370393, - 126660.67045320668, - 126685.82462152008, - 126710.98003852014, - 126736.13670408291, - 126761.29461808444, - 126786.45378040087, - 126811.61419090834, - 126836.77584948298, - 126861.93875600102, - 126887.10291033868, - 126912.26831237224, - 126937.43496197795, - 126962.60285903217, - 126987.77200341123, - 127012.94239499152, - 127038.11403364947, - 127063.2869192615, - 127088.46105170409, - 127113.63643085376, - 127138.81305658702, - 127163.99092878048, - 127189.17004731069, - 127214.35041205429, - 127239.53202288797, - 127264.71487968838, - 127289.89898233226, - 127315.08433069635, - 127340.27092465744, - 127365.45876409234, - 127390.64784887788, - 127415.83817889093, - 127441.02975400841, - 127466.22257410725, - 127491.41663906439, - 127516.61194875685, - 127541.80850306165, - 127567.00630185583, - 127592.20534501647, - 127617.4056324207, - 127642.60716394568, - 127667.80993946856, - 127693.01395886653, - 127718.21922201688, - 127743.42572879682, - 127768.63347908368, - 127793.84247275478, - 127819.05270968749, - 127844.26418975917, - 127869.47691284724, - 127894.69087882918, - 127919.90608758242, - 127945.12253898452, - 127970.34023291297, - 127995.55916924537, - 128020.77934785932, - 128046.00076863244, - 128071.22343144237, - 128096.44733616684, - 128121.67248268353, - 128146.89887087021, - 128172.12650060465, - 128197.35537176467, - 128222.5854842281, - 128247.81683787282, - 128273.04943257671, - 128298.28326821771, - 128323.51834467379, - 128348.75466182294, - 128373.99221954317, - 128399.23101771252, - 128424.47105620909, - 128449.71233491098, - 128474.95485369631, - 128500.19861244329, - 128525.44361103009, - 128550.68984933494, - 128575.93732723613, - 128601.18604461191, - 128626.43600134061, - 128651.68719730059, - 128676.93963237021, - 128702.1933064279, - 128727.44821935208, - 128752.70437102125, - 128777.96176131385, - 128803.22039010846, - 128828.48025728362, - 128853.74136271792, - 128879.00370628996, - 128904.26728787841, - 128929.53210736193, - 128954.79816461923, - 128980.06545952905, - 129005.33399197015, - 129030.60376182134, - 129055.87476896142, - 129081.14701326926, - 129106.42049462376, - 129131.6952129038, - 129156.97116798835, - 129182.24835975636, - 129207.52678808685, - 129232.80645285884, - 129258.08735395141, - 129283.36949124365, - 129308.65286461466, - 129333.9374739436, - 129359.22331910966, - 129384.51039999202, - 129409.79871646997, - 129435.08826842274, - 129460.37905572963, - 129485.67107826998, - 129510.96433592314, - 129536.25882856851, - 129561.55455608548, - 129586.85151835352, - 129612.14971525209, - 129637.4491466607, - 129662.74981245887, - 129688.0517125262, - 129713.35484674224, - 129738.65921498663, - 129763.96481713903, - 129789.27165307909, - 129814.57972268655, - 129839.88902584116, - 129865.19956242264, - 129890.51133231082, - 129915.82433538554, - 129941.13857152662, - 129966.45404061397, - 129991.7707425275, - 130017.08867714716, - 130042.4078443529, - 130067.72824402474, - 130093.04987604271, - 130118.37274028687, - 130143.69683663732, - 130169.02216497416, - 130194.34872517755, - 130219.67651712766, - 130245.0055407047, - 130270.33579578891, - 130295.66728226055, - 130320.99999999991, - 130346.33394888733, - 130371.66912880314, - 130397.00553962773, - 130422.34318124152, - 130447.68205352494, - 130473.02215635845, - 130498.36348962256, - 130523.70605319779, - 130549.0498469647, - 130574.39487080388, - 130599.74112459592, - 130625.08860822149, - 130650.43732156123, - 130675.78726449587, - 130701.13843690613, - 130726.49083867275, - 130751.84446967654, - 130777.19932979831, - 130802.5554189189, - 130827.91273691918, - 130853.27128368006, - 130878.63105908247, - 130903.99206300738, - 130929.35429533575, - 130954.71775594862, - 130980.08244472703, - 131005.44836155206, - 131030.81550630482, - 131056.18387886642, - 131081.55347911804, - 131106.92430694087, - 131132.29636221612, - 131157.66964482504, - 131183.0441546489, - 131208.41989156904, - 131233.79685546676, - 131259.17504622342, - 131284.55446372041, - 131309.93510783918, - 131335.31697846117, - 131360.70007546784, - 131386.0843987407, - 131411.46994816128, - 131436.85672361116, - 131462.24472497194, - 131487.63395212521, - 131513.02440495262, - 131538.41608333588, - 131563.80898715663, - 131589.2031162967, - 131614.59847063778, - 131639.9950500617, - 131665.39285445024, - 131690.79188368531, - 131716.19213764873, - 131741.59361622241, - 131766.99631928833, - 131792.40024672839, - 131817.80539842462, - 131843.21177425905, - 131868.61937411371, - 131894.02819787065, - 131919.43824541202, - 131944.84951661993, - 131970.26201137656, - 131995.67572956407, - 132021.09067106468, - 132046.50683576067, - 132071.9242235343, - 132097.34283426782, - 132122.76266784366, - 132148.1837241441, - 132173.60600305157, - 132199.02950444847, - 132224.45422821722, - 132249.88017424036, - 132275.30734240031, - 132300.73573257966, - 132326.16534466096, - 132351.59617852676, - 132377.02823405969, - 132402.46151114244, - 132427.89600965759, - 132453.33172948789, - 132478.76867051609, - 132504.20683262491, - 132529.64621569714, - 132555.08681961559, - 132580.5286442631, - 132605.97168952253, - 132631.41595527678, - 132656.86144140881, - 132682.30814780149, - 132707.75607433787, - 132733.20522090094, - 132758.65558737374, - 132784.10717363929, - 132809.55997958075, - 132835.01400508118, - 132860.46925002377, - 132885.92571429166, - 132911.38339776811, - 132936.84230033628, - 132962.30242187946, - 132987.76376228096, - 133013.22632142407, - 133038.69009919214, - 133064.15509546854, - 133089.62131013666, - 133115.08874307995, - 133140.55739418184, - 133166.02726332581, - 133191.49835039541, - 133216.97065527414, - 133242.44417784561, - 133267.91891799335, - 133293.39487560102, - 133318.87205055228, - 133344.35044273079, - 133369.83005202023, - 133395.31087830439, - 133420.79292146701, - 133446.27618139185, - 133471.76065796276, - 133497.24635106357, - 133522.73326057816, - 133548.22138639039, - 133573.71072838426, - 133599.20128644365, - 133624.69306045261, - 133650.1860502951, - 133675.68025585517, - 133701.1756770169, - 133726.67231366437, - 133752.17016568172, - 133777.66923295305, - 133803.16951536259, - 133828.67101279454, - 133854.17372513309, - 133879.67765226253, - 133905.18279406714, - 133930.68915043125, - 133956.19672123916, - 133981.70550637526, - 134007.21550572399, - 134032.7267191697, - 134058.23914659687, - 134083.75278789, - 134109.26764293358, - 134134.78371161217, - 134160.30099381026, - 134185.8194894125, - 134211.33919830353, - 134236.8601203679, - 134262.38225549037, - 134287.90560355558, - 134313.43016444831, - 134338.95593805326, - 134364.48292425525, - 134390.01112293909, - 134415.54053398955, - 134441.07115729159, - 134466.60299273001, - 134492.1360401898, - 134517.67029955584, - 134543.20577071316, - 134568.74245354676, - 134594.28034794159, - 134619.81945378278, - 134645.35977095537, - 134670.90129934452, - 134696.4440388353, - 134721.98798931291, - 134747.53315066252, - 134773.07952276937, - 134798.62710551871, - 134824.17589879577, - 134849.72590248589, - 134875.27711647438, - 134900.82954064661, - 134926.38317488792, - 134951.93801908373, - 134977.49407311951, - 135003.05133688069, - 135028.60981025276, - 135054.16949312127, - 135079.73038537172, - 135105.29248688967, - 135130.85579756077, - 135156.42031727062, - 135181.98604590484, - 135207.55298334916, - 135233.12112948924, - 135258.69048421088, - 135284.26104739975, - 135309.83281894168, - 135335.4057987225, - 135360.97998662802, - 135386.55538254412, - 135412.13198635669, - 135437.70979795168, - 135463.28881721498, - 135488.86904403262, - 135514.45047829056, - 135540.03311987486, - 135565.61696867159, - 135591.20202456677, - 135616.78828744654, - 135642.37575719706, - 135667.96443370447, - 135693.55431685498, - 135719.14540653475, - 135744.73770263011, - 135770.33120502727, - 135795.92591361253, - 135821.52182827223, - 135847.11894889272, - 135872.7172753604, - 135898.31680756161, - 135923.91754538284, - 135949.51948871053, - 135975.12263743114, - 136000.72699143123, - 136026.33255059729, - 136051.93931481591, - 136077.54728397369, - 136103.15645795723, - 136128.76683665317, - 136154.37841994822, - 136179.99120772901, - 136205.60519988232, - 136231.2203962949, - 136256.83679685349, - 136282.45440144493, - 136308.07320995603, - 136333.69322227367, - 136359.31443828469, - 136384.93685787608, - 136410.56048093468, - 136436.18530734754, - 136461.81133700156, - 136487.43856978384, - 136513.06700558143, - 136538.6966442813, - 136564.32748577066, - 136589.95952993655, - 136615.59277666616, - 136641.22722584667, - 136666.86287736523, - 136692.49973110916, - 136718.13778696564, - 136743.77704482197, - 136769.41750456547, - 136795.05916608346, - 136820.70202926331, - 136846.34609399244, - 136871.99136015819, - 136897.63782764805, - 136923.28549634948, - 136948.93436614997, - 136974.58443693706, - 137000.23570859825, - 137025.88818102115, - 137051.54185409332, - 137077.19672770242, - 137102.85280173609, - 137128.51007608202, - 137154.16855062786, - 137179.82822526142, - 137205.48909987041, - 137231.15117434258, - 137256.8144485658, - 137282.47892242789, - 137308.14459581667, - 137333.81146862009, - 137359.47954072602, - 137385.14881202241, - 137410.81928239719, - 137436.49095173844, - 137462.16381993407, - 137487.83788687221, - 137513.51315244089, - 137539.18961652822, - 137564.86727902229, - 137590.54613981131, - 137616.22619878338, - 137641.90745582676, - 137667.58991082967, - 137693.27356368033, - 137718.95841426702, - 137744.64446247809, - 137770.33170820182, - 137796.02015132661, - 137821.70979174081, - 137847.40062933284, - 137873.09266399115, - 137898.78589560417, - 137924.48032406042, - 137950.17594924837, - 137975.8727710566, - 138001.57078937365, - 138027.27000408815, - 138052.97041508864, - 138078.67202226384, - 138104.3748255024, - 138130.07882469296, - 138155.78401972432, - 138181.49041048516, - 138207.1979968643, - 138232.9067787505, - 138258.61675603263, - 138284.32792859949, - 138310.04029633995, - 138335.75385914298, - 138361.46861689744, - 138387.18456949232, - 138412.90171681659, - 138438.62005875923, - 138464.33959520931, - 138490.06032605586, - 138515.78225118798, - 138541.50537049473, - 138567.2296838653, - 138592.95519118884, - 138618.68189235451, - 138644.40978725153, - 138670.13887576913, - 138695.86915779658, - 138721.60063322316, - 138747.33330193823, - 138773.06716383106, - 138798.80221879104, - 138824.53846670757, - 138850.27590747006, - 138876.01454096794, - 138901.7543670907, - 138927.49538572782, - 138953.2375967688, - 138978.9810001032, - 139004.72559562061, - 139030.47138321059, - 139056.2183627628, - 139081.96653416683, - 139107.71589731239, - 139133.46645208917, - 139159.21819838689, - 139184.97113609532, - 139210.72526510421, - 139236.48058530336, - 139262.23709658257, - 139287.99479883176, - 139313.75369194071, - 139339.51377579942, - 139365.27505029776, - 139391.03751532568, - 139416.80117077316, - 139442.56601653024, - 139468.33205248689, - 139494.09927853322, - 139519.86769455927, - 139545.63730045516, - 139571.408096111, - 139597.18008141697, - 139622.95325626322, - 139648.72762054001, - 139674.5031741375, - 139700.27991694602, - 139726.05784885579, - 139751.83696975713, - 139777.61727954043, - 139803.39877809596, - 139829.18146531415, - 139854.96534108539, - 139880.75040530015, - 139906.53665784886, - 139932.32409862199, - 139958.11272751007, - 139983.90254440365, - 140009.69354919327, - 140035.48574176949, - 140061.27912202294, - 140087.07368984428, - 140112.86944512415, - 140138.66638775321, - 140164.4645176222, - 140190.26383462184, - 140216.06433864293, - 140241.86602957622, - 140267.66890731253, - 140293.47297174268, - 140319.27822275754, - 140345.08466024802, - 140370.89228410498, - 140396.70109421943, - 140422.51109048226, - 140448.32227278448, - 140474.13464101712, - 140499.94819507122, - 140525.76293483781, - 140551.57886020801, - 140577.3959710729, - 140603.21426732364, - 140629.03374885136, - 140654.85441554731, - 140680.67626730262, - 140706.49930400858, - 140732.32352555645, - 140758.1489318375, - 140783.97552274304, - 140809.80329816442, - 140835.63225799298, - 140861.46240212015, - 140887.29373043729, - 140913.12624283586, - 140938.95993920733, - 140964.79481944317, - 140990.63088343487, - 141016.46813107401, - 141042.30656225214, - 141068.14617686081, - 141093.98697479168, - 141119.82895593636, - 141145.6721201865, - 141171.51646743377, - 141197.36199756994, - 141223.20871048668, - 141249.05660607578, - 141274.90568422904, - 141300.75594483822, - 141326.6073877952, - 141352.4600129918, - 141378.31382031992, - 141404.16880967148, - 141430.02498093838, - 141455.8823340126, - 141481.74086878612, - 141507.60058515094, - 141533.46148299909, - 141559.32356222265, - 141585.18682271364, - 141611.05126436421, - 141636.9168870665, - 141662.78369071262, - 141688.65167519479, - 141714.5208404052, - 141740.39118623605, - 141766.26271257963, - 141792.1354193282, - 141818.00930637406, - 141843.88437360956, - 141869.760620927, - 141895.6380482188, - 141921.51665537735, - 141947.39644229505, - 141973.27740886438, - 141999.15955497778, - 142025.04288052776, - 142050.92738540689, - 142076.81306950765, - 142102.69993272264, - 142128.58797494444, - 142154.47719606571, - 142180.36759597904, - 142206.25917457714, - 142232.15193175265, - 142258.04586739838, - 142283.94098140698, - 142309.83727367126, - 142335.73474408401, - 142361.63339253806, - 142387.5332189262, - 142413.43422314132, - 142439.33640507635, - 142465.23976462413, - 142491.14430167765, - 142517.05001612983, - 142542.95690787368, - 142568.86497680223, - 142594.77422280848, - 142620.68464578551, - 142646.5962456264, - 142672.50902222423, - 142698.42297547215, - 142724.33810526333, - 142750.25441149093, - 142776.17189404817, - 142802.09055282827, - 142828.01038772447, - 142853.93139863008, - 142879.85358543837, - 142905.77694804268, - 142931.70148633636, - 142957.62720021277, - 142983.55408956532, - 143009.48215428743, - 143035.41139427255, - 143061.34180941415, - 143087.27339960571, - 143113.20616474075, - 143139.14010471283, - 143165.07521941551, - 143191.01150874238, - 143216.94897258704, - 143242.88761084314, - 143268.82742340435, - 143294.76841016437, - 143320.71057101688, - 143346.65390585564, - 143372.59841457437, - 143398.54409706692, - 143424.49095322701, - 143450.43898294857, - 143476.38818612538, - 143502.33856265133, - 143528.29011242036, - 143554.24283532638, - 143580.19673126334, - 143606.1518001252, - 143632.10804180597, - 143658.06545619969, - 143684.02404320039, - 143709.98380270213, - 143735.944734599, - 143761.90683878519, - 143787.87011515474, - 143813.83456360188, - 143839.8001840208, - 143865.76697630569, - 143891.73494035081, - 143917.7040760504, - 143943.67438329876, - 143969.6458619902, - 143995.61851201905, - 144021.59233327967, - 144047.56732566646, - 144073.54348907378, - 144099.52082339607, - 144125.49932852783, - 144151.4790043635, - 144177.45985079758, - 144203.44186772458, - 144229.42505503909, - 144255.40941263564, - 144281.39494040885, - 144307.38163825331, - 144333.36950606373, - 144359.35854373468, - 144385.34875116093, - 144411.34012823718, - 144437.33267485813, - 144463.32639091855, - 144489.32127631325, - 144515.31733093705, - 144541.31455468474, - 144567.3129474512, - 144593.3125091313, - 144619.31323961995, - 144645.31513881206, - 144671.31820660262, - 144697.32244288657, - 144723.32784755889, - 144749.33442051467, - 144775.34216164888, - 144801.35107085665, - 144827.36114803303, - 144853.37239307314, - 144879.38480587213, - 144905.39838632516, - 144931.41313432742, - 144957.4290497741, - 144983.44613256046, - 145009.46438258173, - 145035.48379973322, - 145061.50438391021, - 145087.52613500805, - 145113.54905292206, - 145139.57313754765, - 145165.59838878017, - 145191.62480651509, - 145217.65239064783, - 145243.68114107384, - 145269.71105768863, - 145295.74214038774, - 145321.77438906668, - 145347.80780362099, - 145373.84238394629, - 145399.87812993818, - 145425.91504149229, - 145451.95311850426, - 145477.9923608698, - 145504.03276848458, - 145530.07434124436, - 145556.11707904484, - 145582.16098178181, - 145608.20604935108, - 145634.25228164849, - 145660.29967856981, - 145686.34824001096, - 145712.39796586783, - 145738.4488560363, - 145764.50091041232, - 145790.55412889185, - 145816.60851137087, - 145842.66405774537, - 145868.72076791141, - 145894.77864176501, - 145920.83767920226, - 145946.89788011924, - 145972.95924441208, - 145999.02177197693, - 146025.08546270995, - 146051.15031650732, - 146077.21633326527, - 146103.28351288004, - 146129.35185524789, - 146155.42136026506, - 146181.49202782792, - 146207.56385783272, - 146233.63685017588, - 146259.71100475377, - 146285.78632146274, - 146311.86280019928, - 146337.94044085976, - 146364.01924334071, - 146390.09920753856, - 146416.18033334985, - 146442.26262067116, - 146468.34606939898, - 146494.43067942993, - 146520.51645066062, - 146546.60338298764, - 146572.69147630769, - 146598.78073051744, - 146624.87114551352, - 146650.96272119274, - 146677.05545745179, - 146703.14935418745, - 146729.2444112965, - 146755.34062867577, - 146781.43800622207, - 146807.53654383228, - 146833.63624140329, - 146859.73709883197, - 146885.83911601527, - 146911.94229285014, - 146938.04662923355, - 146964.15212506248, - 146990.25878023397, - 147016.36659464505, - 147042.47556819281, - 147068.58570077427, - 147094.6969922866, - 147120.80944262692, - 147146.92305169237, - 147173.03781938017, - 147199.15374558745, - 147225.27083021149, - 147251.38907314953, - 147277.50847429881, - 147303.62903355664, - 147329.75075082036, - 147355.87362598727, - 147381.99765895473, - 147408.12284962015, - 147434.24919788091, - 147460.37670363448, - 147486.50536677826, - 147512.63518720976, - 147538.76616482646, - 147564.89829952587, - 147591.03159120557, - 147617.16603976308, - 147643.30164509601, - 147669.43840710199, - 147695.57632567859, - 147721.71540072354, - 147747.85563213445, - 147773.99701980909, - 147800.13956364512, - 147826.28326354033, - 147852.42811939248, - 147878.57413109933, - 147904.72129855872, - 147930.86962166851, - 147957.01910032652, - 147983.16973443062, - 148009.32152387875, - 148035.47446856883, - 148061.62856839882, - 148087.78382326665, - 148113.94023307035, - 148140.09779770792, - 148166.25651707739, - 148192.41639107687, - 148218.57741960438, - 148244.73960255808, - 148270.90293983606, - 148297.0674313365, - 148323.23307695755, - 148349.39987659742, - 148375.56783015432, - 148401.73693752653, - 148427.90719861226, - 148454.07861330983, - 148480.25118151752, - 148506.42490313368, - 148532.59977805667, - 148558.77580618486, - 148584.95298741665, - 148611.13132165043, - 148637.31080878471, - 148663.49144871789, - 148689.6732413485, - 148715.85618657502, - 148742.040284296, - 148768.22553440998, - 148794.41193681557, - 148820.59949141133, - 148846.78819809589, - 148872.97805676793, - 148899.16906732606, - 148925.36122966901, - 148951.55454369547, - 148977.74900930419, - 149003.9446263939, - 149030.1413948634, - 149056.33931461151, - 149082.53838553699, - 149108.73860753875, - 149134.9399805156, - 149161.14250436646, - 149187.34617899026, - 149213.5510042859, - 149239.75698015234, - 149265.96410648854, - 149292.17238319354, - 149318.38181016635, - 149344.59238730598, - 149370.80411451156, - 149397.01699168212, - 149423.23101871679, - 149449.44619551473, - 149475.66252197503, - 149501.87999799693, - 149528.0986234796, - 149554.31839832227, - 149580.53932242419, - 149606.76139568459, - 149632.98461800278, - 149659.20898927809, - 149685.43450940982, - 149711.66117829733, - 149737.88899584001, - 149764.11796193724, - 149790.34807648844, - 149816.57933939309, - 149842.81175055061, - 149869.04530986046, - 149895.28001722222, - 149921.51587253538, - 149947.75287569952, - 149973.99102661415, - 150000.23032517891, - 150026.47077129342, - 150052.71236485732, - 150078.95510577026, - 150105.1989939319, - 150131.444029242, - 150157.69021160025, - 150183.93754090639, - 150210.18601706024, - 150236.43563996154, - 150262.68640951012, - 150288.93832560582, - 150315.19138814852, - 150341.44559703805, - 150367.70095217437, - 150393.95745345735, - 150420.21510078697, - 150446.47389406321, - 150472.73383318601, - 150498.99491805542, - 150525.25714857146, - 150551.52052463419, - 150577.78504614369, - 150604.05071300003, - 150630.31752510337, - 150656.58548235384, - 150682.85458465159, - 150709.1248318968, - 150735.39622398972, - 150761.66876083051, - 150787.9424423195, - 150814.21726835691, - 150840.49323884305, - 150866.77035367821, - 150893.04861276277, - 150919.32801599705, - 150945.60856328148, - 150971.89025451642, - 150998.17308960229, - 151024.45706843957, - 151050.74219092872, - 151077.02845697021, - 151103.31586646455, - 151129.60441931229, - 151155.894115414, - 151182.1849546702, - 151208.47693698155, - 151234.77006224863, - 151261.06433037209, - 151287.35974125259, - 151313.65629479082, - 151339.95399088747, - 151366.25282944329, - 151392.55281035902, - 151418.85393353543, - 151445.1561988733, - 151471.45960627345, - 151497.76415563675, - 151524.06984686397, - 151550.37667985607, - 151576.68465451393, - 151602.99377073845, - 151629.30402843058, - 151655.61542749128, - 151681.92796782157, - 151708.24164932242, - 151734.55647189484, - 151760.87243543993, - 151787.18953985872, - 151813.50778505235, - 151839.82717092187, - 151866.14769736846, - 151892.46936429327, - 151918.79217159748, - 151945.11611918229, - 151971.44120694889, - 151997.76743479856, - 152024.09480263255, - 152050.42331035214, - 152076.75295785864, - 152103.08374505339, - 152129.41567183775, - 152155.74873811303, - 152182.08294378067, - 152208.41828874208, - 152234.75477289871, - 152261.09239615197, - 152287.43115840337, - 152313.77105955439, - 152340.11209950657, - 152366.45427816146, - 152392.79759542056, - 152419.14205118554, - 152445.48764535793, - 152471.8343778394, - 152498.18224853161, - 152524.53125733617, - 152550.88140415482, - 152577.23268888926, - 152603.58511144121, - 152629.93867171241, - 152656.29336960468, - 152682.64920501978, - 152709.00617785956, - 152735.36428802583, - 152761.72353542043, - 152788.08391994529, - 152814.44544150229, - 152840.80809999333, - 152867.17189532038, - 152893.53682738543, - 152919.90289609041, - 152946.27010133737, - 152972.63844302832, - 152999.00792106529, - 153025.37853535041, - 153051.7502857857, - 153078.12317227334, - 153104.4971947154, - 153130.8723530141, - 153157.24864707157, - 153183.62607679001, - 153210.00464207167, - 153236.38434281875, - 153262.76517893354, - 153289.14715031831, - 153315.53025687535, - 153341.91449850702, - 153368.2998751156, - 153394.68638660354, - 153421.07403287315, - 153447.46281382689, - 153473.85272936718, - 153500.24377939643, - 153526.63596381716, - 153553.02928253182, - 153579.42373544298, - 153605.81932245308, - 153632.21604346478, - 153658.61389838057, - 153685.0128871031, - 153711.41300953497, - 153737.81426557881, - 153764.21665513728, - 153790.62017811305, - 153817.02483440886, - 153843.43062392739, - 153869.83754657139, - 153896.24560224367, - 153922.65479084692, - 153949.06511228404, - 153975.4765664578, - 154001.88915327107, - 154028.30287262669, - 154054.71772442761, - 154081.13370857667, - 154107.55082497682, - 154133.96907353101, - 154160.38845414223, - 154186.80896671346, - 154213.23061114774, - 154239.65338734805, - 154266.07729521746, - 154292.50233465908, - 154318.92850557598, - 154345.35580787127, - 154371.7842414481, - 154398.21380620965, - 154424.64450205903, - 154451.07632889951, - 154477.50928663427, - 154503.94337516659, - 154530.37859439969, - 154556.81494423689, - 154583.25242458144, - 154609.69103533673, - 154636.13077640603, - 154662.57164769279, - 154689.01364910032, - 154715.45678053208, - 154741.90104189145, - 154768.34643308193, - 154794.79295400696, - 154821.24060457002, - 154847.68938467462, - 154874.13929422433, - 154900.59033312264, - 154927.04250127316, - 154953.49579857948, - 154979.95022494521, - 155006.40578027396, - 155032.86246446942, - 155059.32027743524, - 155085.77921907514, - 155112.2392892928, - 155138.70048799197, - 155165.16281507642, - 155191.62627044989, - 155218.09085401625, - 155244.55656567923, - 155271.02340534274, - 155297.49137291059, - 155323.96046828668, - 155350.4306913749, - 155376.90204207919, - 155403.37452030348, - 155429.84812595171, - 155456.32285892789, - 155482.79871913602, - 155509.27570648011, - 155535.75382086422, - 155562.23306219239, - 155588.71343036872, - 155615.19492529731, - 155641.67754688227, - 155668.16129502779, - 155694.64616963797, - 155721.13217061706, - 155747.61929786921, - 155774.10755129869, - 155800.59693080973, - 155827.08743630661, - 155853.57906769359, - 155880.07182487496, - 155906.56570775513, - 155933.06071623837, - 155959.55685022907, - 155986.05410963166, - 156012.5524943505, - 156039.05200429002, - 156065.55263935472, - 156092.054399449, - 156118.5572844774, - 156145.06129434443, - 156171.5664289546, - 156198.07268821247, - 156224.5800720226, - 156251.08858028959, - 156277.59821291809, - 156304.10896981266, - 156330.62085087801, - 156357.1338560188, - 156383.64798513969, - 156410.16323814544, - 156436.67961494075, - 156463.1971154304, - 156489.71573951913, - 156516.23548711176, - 156542.75635811311, - 156569.27835242799, - 156595.80146996127, - 156622.32571061782, - 156648.85107430254, - 156675.37756092031, - 156701.90517037612, - 156728.43390257491, - 156754.96375742162, - 156781.49473482129, - 156808.02683467892, - 156834.5600568995, - 156861.09440138817, - 156887.62986804993, - 156914.16645678994, - 156940.70416751326, - 156967.24300012505, - 156993.78295453047, - 157020.32403063469, - 157046.8662283429, - 157073.40954756032, - 157099.9539881922, - 157126.49955014378, - 157153.04623332032, - 157179.59403762716, - 157206.14296296958, - 157232.69300925292, - 157259.24417638258, - 157285.79646426387, - 157312.34987280221, - 157338.90440190304, - 157365.46005147175, - 157392.01682141385, - 157418.57471163478, - 157445.13372204005, - 157471.69385253513, - 157498.25510302564, - 157524.81747341706, - 157551.38096361503, - 157577.9455735251, - 157604.51130305286, - 157631.07815210402, - 157657.64612058419, - 157684.21520839902, - 157710.78541545427, - 157737.35674165559, - 157763.92918690876, - 157790.50275111952, - 157817.07743419363, - 157843.65323603692, - 157870.23015655516, - 157896.80819565422, - 157923.3873532399, - 157949.96762921812, - 157976.54902349479, - 158003.13153597576, - 158029.71516656701, - 158056.29991517449, - 158082.88578170416, - 158109.47276606198, - 158136.06086815402, - 158162.65008788629, - 158189.24042516484, - 158215.83187989573, - 158242.42445198505, - 158269.01814133892, - 158295.61294786347, - 158322.20887146486, - 158348.80591204923, - 158375.4040695228, - 158402.00334379176, - 158428.60373476235, - 158455.2052423408, - 158481.80786643337, - 158508.41160694641, - 158535.01646378616, - 158561.62243685898, - 158588.2295260712, - 158614.8377313292, - 158641.44705253936, - 158668.05748960807, - 158694.66904244179, - 158721.28171094693, - 158747.89549502998, - 158774.5103945974, - 158801.12640955573, - 158827.74353981143, - 158854.36178527112, - 158880.9811458413, - 158907.60162142856, - 158934.22321193956, - 158960.84591728085, - 158987.46973735912, - 159014.09467208097, - 159040.72072135314, - 159067.3478850823, - 159093.97616317519, - 159120.60555553852, - 159147.23606207906, - 159173.8676827036, - 159200.50041731889, - 159227.13426583182, - 159253.76922814918, - 159280.40530417781, - 159307.04249382461, - 159333.68079699649, - 159360.32021360032, - 159386.96074354305, - 159413.60238673165, - 159440.24514307309, - 159466.88901247433, - 159493.53399484244, - 159520.18009008438, - 159546.82729810724, - 159573.47561881805, - 159600.12505212394, - 159626.77559793202, - 159653.42725614941, - 159680.08002668325, - 159706.73390944069, - 159733.38890432892, - 159760.04501125516, - 159786.70223012666, - 159813.36056085059, - 159840.02000333427, - 159866.68055748497, - 159893.34222320997, - 159920.00500041663, - 159946.66888901225, - 159973.33388890422, - 159999.99999999988, - 160026.66722220668, - 160053.33555543202, - 160080.0049995833, - 160106.67555456801, - 160133.3472202936, - 160160.0199966676, - 160186.6938835975, - 160213.36888099083, - 160240.04498875517, - 160266.72220679806, - 160293.40053502709, - 160320.07997334987, - 160346.76052167406, - 160373.44217990729, - 160400.1249479572, - 160426.80882573154, - 160453.49381313793, - 160480.17991008417, - 160506.86711647795, - 160533.55543222709, - 160560.24485723933, - 160586.93539142248, - 160613.62703468435, - 160640.31978693281, - 160667.01364807569, - 160693.70861802087, - 160720.40469667627, - 160747.1018839498, - 160773.80017974938, - 160800.49958398298, - 160827.20009655855, - 160853.90171738411, - 160880.60444636765, - 160907.30828341722, - 160934.01322844089, - 160960.71928134665, - 160987.42644204266, - 161014.13471043704, - 161040.84408643784, - 161067.55456995327, - 161094.26616089148, - 161120.97885916062, - 161147.69266466892, - 161174.40757732463, - 161201.12359703594, - 161227.84072371112, - 161254.55895725847, - 161281.27829758628, - 161307.99874460287, - 161334.72029821656, - 161361.44295833571, - 161388.1667248687, - 161414.89159772391, - 161441.61757680977, - 161468.34466203468, - 161495.07285330712, - 161521.80215053557, - 161548.53255362847, - 161575.26406249436, - 161601.99667704175, - 161628.7303971792, - 161655.46522281526, - 161682.20115385848, - 161708.93819021754, - 161735.67633180099, - 161762.41557851751, - 161789.15593027571, - 161815.89738698432, - 161842.63994855201, - 161869.38361488748, - 161896.1283858995, - 161922.87426149679, - 161949.62124158812, - 161976.36932608229, - 162003.1185148881, - 162029.8688079144, - 162056.62020507001, - 162083.37270626382, - 162110.12631140469, - 162136.88102040152, - 162163.63683316324, - 162190.39374959879, - 162217.15176961714, - 162243.91089312723, - 162270.67112003808, - 162297.43245025873, - 162324.19488369819, - 162350.9584202655, - 162377.72305986975, - 162404.48880242003, - 162431.25564782543, - 162458.02359599507, - 162484.79264683815, - 162511.56280026378, - 162538.33405618116, - 162565.10641449949, - 162591.87987512801, - 162618.65443797593, - 162645.43010295252, - 162672.20686996708, - 162698.98473892888, - 162725.76370974723, - 162752.54378233149, - 162779.32495659095, - 162806.10723243505, - 162832.89060977317, - 162859.67508851466, - 162886.46066856899, - 162913.24734984562, - 162940.03513225398, - 162966.82401570358, - 162993.6140001039, - 163020.40508536444, - 163047.19727139481, - 163073.99055810447, - 163100.78494540305, - 163127.58043320014, - 163154.37702140535, - 163181.17470992831, - 163207.97349867865, - 163234.77338756606, - 163261.57437650024, - 163288.37646539087, - 163315.17965414765, - 163341.98394268038, - 163368.78933089875, - 163395.59581871261, - 163422.40340603172, - 163449.2120927659, - 163476.02187882498, - 163502.83276411882, - 163529.6447485573, - 163556.45783205028, - 163583.2720145077, - 163610.08729583945, - 163636.90367595552, - 163663.72115476584, - 163690.53973218042, - 163717.35940810922, - 163744.18018246227, - 163771.00205514964, - 163797.82502608138, - 163824.64909516752, - 163851.4742623182, - 163878.3005274435, - 163905.12789045356, - 163931.95635125853, - 163958.78590976857, - 163985.61656589387, - 164012.44831954464, - 164039.28117063109, - 164066.11511906344, - 164092.95016475199, - 164119.78630760699, - 164146.62354753874, - 164173.46188445756, - 164200.30131827376, - 164227.14184889771, - 164253.98347623978, - 164280.82620021031, - 164307.67002071979, - 164334.51493767856, - 164361.3609509971, - 164388.20806058586, - 164415.05626635533, - 164441.905568216, - 164468.75596607837, - 164495.607459853, - 164522.4600494504, - 164549.31373478117, - 164576.16851575591, - 164603.02439228518, - 164629.88136427966, - 164656.73943164994, - 164683.59859430668, - 164710.45885216061, - 164737.32020512238, - 164764.1826531027, - 164791.04619601235, - 164817.91083376206, - 164844.77656626256, - 164871.64339342469, - 164898.51131515924, - 164925.38033137703, - 164952.25044198887, - 164979.1216469057, - 165005.9939460383, - 165032.86733929763, - 165059.7418265946, - 165086.61740784015, - 165113.4940829452 -}; - -#else - -#ifdef BIG_IQ_TABLE -#define IQ_TABLE_SIZE 8192 -#else -#define IQ_TABLE_SIZE 1026 -#endif - -ALIGN static const real_t iq_table[IQ_TABLE_SIZE] = -{ - REAL_CONST(0.0), - REAL_CONST(1.0/8.0), - REAL_CONST(2.5198420997897464/8.0), - REAL_CONST(4.3267487109222245/8.0), - REAL_CONST(6.3496042078727974/8.0), - REAL_CONST(8.5498797333834844/8.0), - REAL_CONST(10.902723556992836/8.0), - REAL_CONST(13.390518279406722/8.0), - REAL_CONST(15.999999999999998/8.0), - REAL_CONST(18.720754407467133/8.0), - REAL_CONST(21.544346900318832/8.0), - REAL_CONST(24.463780996262464/8.0), - REAL_CONST(27.47314182127996/8.0), - REAL_CONST(30.567350940369842/8.0), - REAL_CONST(33.741991698453212/8.0), - REAL_CONST(36.993181114957046/8.0), - REAL_CONST(40.317473596635935/8.0), - REAL_CONST(43.711787041189993/8.0), - REAL_CONST(47.173345095760126/8.0), - REAL_CONST(50.699631325716943/8.0), - REAL_CONST(54.288352331898118/8.0), - REAL_CONST(57.937407704003519/8.0), - REAL_CONST(61.6448652744185/8.0), - REAL_CONST(65.408940536585988/8.0), - REAL_CONST(69.227979374755591/8.0), - REAL_CONST(73.100443455321638/8.0), - REAL_CONST(77.024897778591622/8.0), - REAL_CONST(80.999999999999986/8.0), - REAL_CONST(85.024491212518527/8.0), - REAL_CONST(89.097187944889555/8.0), - REAL_CONST(93.216975178615741/8.0), - REAL_CONST(97.382800224133163/8.0), - REAL_CONST(101.59366732596474/8.0), - REAL_CONST(105.84863288986224/8.0), - REAL_CONST(110.14680124343441/8.0), - REAL_CONST(114.4873208566006/8.0), - REAL_CONST(118.86938096020653/8.0), - REAL_CONST(123.29220851090024/8.0), - REAL_CONST(127.75506545836058/8.0), - REAL_CONST(132.25724627755247/8.0), - REAL_CONST(136.79807573413572/8.0), - REAL_CONST(141.37690685569191/8.0), - REAL_CONST(145.99311908523086/8.0), - REAL_CONST(150.6461165966291/8.0), - REAL_CONST(155.33532675434674/8.0), - REAL_CONST(160.06019870205279/8.0), - REAL_CONST(164.82020206673349/8.0), - REAL_CONST(169.61482576651861/8.0), - REAL_CONST(174.44357691188537/8.0), - REAL_CONST(179.30597979112557/8.0), - REAL_CONST(184.20157493201927/8.0), - REAL_CONST(189.12991823257562/8.0), - REAL_CONST(194.09058015449685/8.0), - REAL_CONST(199.08314497371677/8.0), - REAL_CONST(204.1072100829694/8.0), - REAL_CONST(209.16238534187647/8.0), - REAL_CONST(214.24829247050752/8.0), - REAL_CONST(219.36456448277784/8.0), - REAL_CONST(224.51084515641216/8.0), - REAL_CONST(229.6867885365223/8.0), - REAL_CONST(234.89205847013176/8.0), - REAL_CONST(240.12632816923249/8.0), - REAL_CONST(245.38927980018505/8.0), - REAL_CONST(250.68060409747261/8.0), - REAL_CONST(255.99999999999991/8.0), - REAL_CONST(261.34717430828869/8.0), - REAL_CONST(266.72184136106449/8.0), - REAL_CONST(272.12372272986045/8.0), - REAL_CONST(277.55254693037961/8.0), - REAL_CONST(283.0080491494619/8.0), - REAL_CONST(288.48997098659891/8.0), - REAL_CONST(293.99806020902247/8.0), - REAL_CONST(299.53207051947408/8.0), - REAL_CONST(305.0917613358298/8.0), - REAL_CONST(310.67689758182206/8.0), - REAL_CONST(316.28724948815585/8.0), - REAL_CONST(321.92259240337177/8.0), - REAL_CONST(327.58270661385535/8.0), - REAL_CONST(333.26737717243742/8.0), - REAL_CONST(338.97639373507025/8.0), - REAL_CONST(344.70955040510125/8.0), - REAL_CONST(350.46664558470013/8.0), - REAL_CONST(356.24748183302603/8.0), - REAL_CONST(362.05186573075139/8.0), - REAL_CONST(367.87960775058258/8.0), - REAL_CONST(373.73052213344511/8.0), - REAL_CONST(379.60442677002078/8.0), - REAL_CONST(385.50114308734607/8.0), - REAL_CONST(391.42049594019937/8.0), - REAL_CONST(397.36231350702371/8.0), - REAL_CONST(403.32642719014467/8.0), - REAL_CONST(409.31267152006262/8.0), - REAL_CONST(415.32088406360799/8.0), - REAL_CONST(421.35090533576471/8.0), - REAL_CONST(427.40257871497619/8.0), - REAL_CONST(433.4757503617617/8.0), - REAL_CONST(439.5702691404793/8.0), - REAL_CONST(445.68598654408271/8.0), - REAL_CONST(451.82275662172759/8.0), - REAL_CONST(457.98043590909128/8.0), - REAL_CONST(464.15888336127773/8.0), - REAL_CONST(470.35796028818726/8.0), - REAL_CONST(476.5775302922363/8.0), - REAL_CONST(482.81745920832043/8.0), - REAL_CONST(489.07761504591741/8.0), - REAL_CONST(495.35786793323581/8.0), - REAL_CONST(501.65809006331688/8.0), - REAL_CONST(507.97815564200368/8.0), - REAL_CONST(514.31794083769648/8.0), - REAL_CONST(520.67732373281672/8.0), - REAL_CONST(527.05618427690604/8.0), - REAL_CONST(533.45440424129174/8.0), - REAL_CONST(539.87186717525128/8.0), - REAL_CONST(546.30845836361505/8.0), - REAL_CONST(552.76406478574609/8.0), - REAL_CONST(559.23857507584194/8.0), - REAL_CONST(565.73187948450413/8.0), - REAL_CONST(572.24386984152341/8.0), - REAL_CONST(578.77443951983378/8.0), - REAL_CONST(585.32348340058843/8.0), - REAL_CONST(591.89089783931263/8.0), - REAL_CONST(598.47658063309257/8.0), - REAL_CONST(605.08043098876044/8.0), - REAL_CONST(611.70234949203643/8.0), - REAL_CONST(618.3422380775919/8.0), - REAL_CONST(624.99999999999977/8.0), - REAL_CONST(631.67553980553748/8.0), - REAL_CONST(638.36876330481164/8.0), - REAL_CONST(645.07957754617485/8.0), - REAL_CONST(651.80789078990415/8.0), - REAL_CONST(658.55361248311499/8.0), - REAL_CONST(665.31665323538357/8.0), - REAL_CONST(672.09692479505225/8.0), - REAL_CONST(678.8943400261943/8.0), - REAL_CONST(685.70881288621433/8.0), - REAL_CONST(692.540258404062/8.0), - REAL_CONST(699.38859265903977/8.0), - REAL_CONST(706.25373276018058/8.0), - REAL_CONST(713.13559682617972/8.0), - REAL_CONST(720.03410396586037/8.0), - REAL_CONST(726.94917425915435/8.0), - REAL_CONST(733.88072873858209/8.0), - REAL_CONST(740.82868937121543/8.0), - REAL_CONST(747.79297904110535/8.0), - REAL_CONST(754.77352153216191/8.0), - REAL_CONST(761.77024151147043/8.0), - REAL_CONST(768.78306451302956/8.0), - REAL_CONST(775.81191692189896/8.0), - REAL_CONST(782.85672595874246/8.0), - REAL_CONST(789.91741966475445/8.0), - REAL_CONST(796.99392688695798/8.0), - REAL_CONST(804.08617726386274/8.0), - REAL_CONST(811.19410121147098/8.0), - REAL_CONST(818.31762990962227/8.0), - REAL_CONST(825.45669528866563/8.0), - REAL_CONST(832.61123001644864/8.0), - REAL_CONST(839.78116748561604/8.0), - REAL_CONST(846.96644180120552/8.0), - REAL_CONST(854.16698776853514/8.0), - REAL_CONST(861.38274088137143/8.0), - REAL_CONST(868.61363731036977/8.0), - REAL_CONST(875.85961389178203/8.0), - REAL_CONST(883.12060811641959/8.0), - REAL_CONST(890.39655811886757/8.0), - REAL_CONST(897.68740266694181/8.0), - REAL_CONST(904.99308115138172/8.0), - REAL_CONST(912.31353357577188/8.0), - REAL_CONST(919.64870054668756/8.0), - REAL_CONST(926.99852326405619/8.0), - REAL_CONST(934.36294351172899/8.0), - REAL_CONST(941.74190364825859/8.0), - REAL_CONST(949.13534659787422/8.0), - REAL_CONST(956.54321584165211/8.0), - REAL_CONST(963.96545540887348/8.0), - REAL_CONST(971.40200986856541/8.0), - REAL_CONST(978.85282432122176/8.0), - REAL_CONST(986.31784439069588/8.0), - REAL_CONST(993.7970162162635/8.0), - REAL_CONST(1001.29028644485/8.0), - REAL_CONST(1008.797602223418/8.0), - REAL_CONST(1016.3189111915103/8.0), - REAL_CONST(1023.8541614739464/8.0), - REAL_CONST(1031.4033016736653/8.0), - REAL_CONST(1038.9662808647138/8.0), - REAL_CONST(1046.5430485853758/8.0), - REAL_CONST(1054.1335548314366/8.0), - REAL_CONST(1061.7377500495838/8.0), - REAL_CONST(1069.3555851309357/8.0), - REAL_CONST(1076.9870114046978/8.0), - REAL_CONST(1084.6319806319441/8.0), - REAL_CONST(1092.2904449995174/8.0), - REAL_CONST(1099.9623571140482/8.0), - REAL_CONST(1107.6476699960892/8.0), - REAL_CONST(1115.3463370743607/8.0), - REAL_CONST(1123.058312180106/8.0), - REAL_CONST(1130.7835495415541/8.0), - REAL_CONST(1138.5220037784854/8.0), - REAL_CONST(1146.273629896901/8.0), - REAL_CONST(1154.0383832837879/8.0), - REAL_CONST(1161.816219701986/8.0), - REAL_CONST(1169.607095285146/8.0), - REAL_CONST(1177.4109665327808/8.0), - REAL_CONST(1185.2277903054078/8.0), - REAL_CONST(1193.0575238197798/8.0), - REAL_CONST(1200.9001246442001/8.0), - REAL_CONST(1208.7555506939248/8.0), - REAL_CONST(1216.6237602266442/8.0), - REAL_CONST(1224.5047118380478/8.0), - REAL_CONST(1232.3983644574657/8.0), - REAL_CONST(1240.3046773435874/8.0), - REAL_CONST(1248.2236100802568/8.0), - REAL_CONST(1256.1551225723395/8.0), - REAL_CONST(1264.099175041662/8.0), - REAL_CONST(1272.0557280230228/8.0), - REAL_CONST(1280.0247423602691/8.0), - REAL_CONST(1288.0061792024444/8.0), - REAL_CONST(1295.9999999999995/8.0), - REAL_CONST(1304.006166501068/8.0), - REAL_CONST(1312.0246407478062/8.0), - REAL_CONST(1320.0553850727929/8.0), - REAL_CONST(1328.0983620954903/8.0), - REAL_CONST(1336.1535347187651/8.0), - REAL_CONST(1344.2208661254647/8.0), - REAL_CONST(1352.3003197750522/8.0), - REAL_CONST(1360.3918594002962/8.0), - REAL_CONST(1368.4954490040145/8.0), - REAL_CONST(1376.6110528558709/8.0), - REAL_CONST(1384.7386354892244/8.0), - REAL_CONST(1392.8781616980295/8.0), - REAL_CONST(1401.0295965337855/8.0), - REAL_CONST(1409.1929053025353/8.0), - REAL_CONST(1417.3680535619119/8.0), - REAL_CONST(1425.5550071182327/8.0), - REAL_CONST(1433.7537320236374/8.0), - REAL_CONST(1441.9641945732744/8.0), - REAL_CONST(1450.1863613025282/8.0), - REAL_CONST(1458.4201989842913/8.0), - REAL_CONST(1466.6656746262797/8.0), - REAL_CONST(1474.9227554683875/8.0), - REAL_CONST(1483.1914089800841/8.0), - REAL_CONST(1491.4716028578516/8.0), - REAL_CONST(1499.7633050226596/8.0), - REAL_CONST(1508.0664836174794/8.0), - REAL_CONST(1516.3811070048375/8.0), - REAL_CONST(1524.7071437644029/8.0), - REAL_CONST(1533.0445626906128/8.0), - REAL_CONST(1541.3933327903342/8.0), - REAL_CONST(1549.7534232805581/8.0), - REAL_CONST(1558.1248035861302/8.0), - REAL_CONST(1566.507443337515/8.0), - REAL_CONST(1574.9013123685909/8.0), - REAL_CONST(1583.3063807144795/8.0), - REAL_CONST(1591.7226186094069/8.0), - REAL_CONST(1600.1499964845941/8.0), - REAL_CONST(1608.58848496618/8.0), - REAL_CONST(1617.0380548731737/8.0), - REAL_CONST(1625.4986772154357/8.0), - REAL_CONST(1633.9703231916887/8.0), - REAL_CONST(1642.4529641875577/8.0), - REAL_CONST(1650.9465717736346/8.0), - REAL_CONST(1659.4511177035752/8.0), - REAL_CONST(1667.9665739122186/8.0), - REAL_CONST(1676.4929125137353/8.0), - REAL_CONST(1685.030105799801/8.0), - REAL_CONST(1693.5781262377957/8.0), - REAL_CONST(1702.136946469027/8.0), - REAL_CONST(1710.7065393069795/8.0), - REAL_CONST(1719.2868777355877/8.0), - REAL_CONST(1727.8779349075323/8.0), - REAL_CONST(1736.4796841425596/8.0), - REAL_CONST(1745.092098925825/8.0), - REAL_CONST(1753.7151529062583/8.0), - REAL_CONST(1762.3488198949503/8.0), - REAL_CONST(1770.9930738635628/8.0), - REAL_CONST(1779.6478889427597/8.0), - REAL_CONST(1788.3132394206564/8.0), - REAL_CONST(1796.9890997412947/8.0), - REAL_CONST(1805.6754445031333/8.0), - REAL_CONST(1814.3722484575621/8.0), - REAL_CONST(1823.0794865074322/8.0), - REAL_CONST(1831.7971337056094/8.0), - REAL_CONST(1840.5251652535437/8.0), - REAL_CONST(1849.2635564998579/8.0), - REAL_CONST(1858.0122829389563/8.0), - REAL_CONST(1866.7713202096493/8.0), - REAL_CONST(1875.5406440937966/8.0), - REAL_CONST(1884.3202305149687/8.0), - REAL_CONST(1893.110055537124/8.0), - REAL_CONST(1901.9100953633042/8.0), - REAL_CONST(1910.7203263343454/8.0), - REAL_CONST(1919.5407249276057/8.0), - REAL_CONST(1928.3712677557098/8.0), - REAL_CONST(1937.2119315653083/8.0), - REAL_CONST(1946.0626932358525/8.0), - REAL_CONST(1954.923529778386/8.0), - REAL_CONST(1963.79441833435/8.0), - REAL_CONST(1972.6753361744036/8.0), - REAL_CONST(1981.5662606972594/8.0), - REAL_CONST(1990.467169428533/8.0), - REAL_CONST(1999.3780400196069/8.0), - REAL_CONST(2008.2988502465078/8.0), - REAL_CONST(2017.2295780087982/8.0), - REAL_CONST(2026.1702013284819/8.0), - REAL_CONST(2035.1206983489212/8.0), - REAL_CONST(2044.0810473337688/8.0), - REAL_CONST(2053.0512266659125/8.0), - REAL_CONST(2062.0312148464309/8.0), - REAL_CONST(2071.0209904935646/8.0), - REAL_CONST(2080.0205323416958/8.0), - REAL_CONST(2089.0298192403443/8.0), - REAL_CONST(2098.0488301531714/8.0), - REAL_CONST(2107.0775441569995/8.0), - REAL_CONST(2116.115940440839/8.0), - REAL_CONST(2125.1639983049317/8.0), - REAL_CONST(2134.2216971597995/8.0), - REAL_CONST(2143.2890165253098/8.0), - REAL_CONST(2152.3659360297484/8.0), - REAL_CONST(2161.4524354089031/8.0), - REAL_CONST(2170.5484945051617/8.0), - REAL_CONST(2179.6540932666144/8.0), - REAL_CONST(2188.7692117461711/8.0), - REAL_CONST(2197.8938301006888/8.0), - REAL_CONST(2207.0279285901042/8.0), - REAL_CONST(2216.1714875765838/8.0), - REAL_CONST(2225.324487523676/8.0), - REAL_CONST(2234.4869089954782/8.0), - REAL_CONST(2243.6587326558101/8.0), - REAL_CONST(2252.8399392673982/8.0), - REAL_CONST(2262.0305096910702/8.0), - REAL_CONST(2271.2304248849537/8.0), - REAL_CONST(2280.4396659036897/8.0), - REAL_CONST(2289.6582138976523/8.0), - REAL_CONST(2298.8860501121762/8.0), - REAL_CONST(2308.1231558867926/8.0), - REAL_CONST(2317.3695126544767/8.0), - REAL_CONST(2326.6251019409005/8.0), - REAL_CONST(2335.8899053636933/8.0), - REAL_CONST(2345.1639046317132/8.0), - REAL_CONST(2354.4470815443233/8.0), - REAL_CONST(2363.7394179906792/8.0), - REAL_CONST(2373.0408959490205/8.0), - REAL_CONST(2382.3514974859731/8.0), - REAL_CONST(2391.6712047558558/8.0), - REAL_CONST(2400.9999999999991/8.0), - REAL_CONST(2410.3378655460651/8.0), - REAL_CONST(2419.6847838073813/8.0), - REAL_CONST(2429.0407372822747/8.0), - REAL_CONST(2438.4057085534191/8.0), - REAL_CONST(2447.7796802871858/8.0), - REAL_CONST(2457.1626352330004/8.0), - REAL_CONST(2466.5545562227112/8.0), - REAL_CONST(2475.9554261699564/8.0), - REAL_CONST(2485.3652280695474/8.0), - REAL_CONST(2494.7839449968492/8.0), - REAL_CONST(2504.2115601071737/8.0), - REAL_CONST(2513.6480566351788/8.0), - REAL_CONST(2523.0934178942675/8.0), - REAL_CONST(2532.5476272760025/8.0), - REAL_CONST(2542.0106682495189/8.0), - REAL_CONST(2551.482524360948/8.0), - REAL_CONST(2560.9631792328441/8.0), - REAL_CONST(2570.4526165636184/8.0), - REAL_CONST(2579.9508201269791/8.0), - REAL_CONST(2589.4577737713744/8.0), - REAL_CONST(2598.9734614194458/8.0), - REAL_CONST(2608.4978670674823/8.0), - REAL_CONST(2618.0309747848837/8.0), - REAL_CONST(2627.5727687136259/8.0), - REAL_CONST(2637.1232330677353/8.0), - REAL_CONST(2646.6823521327647/8.0), - REAL_CONST(2656.2501102652768/8.0), - REAL_CONST(2665.8264918923328/8.0), - REAL_CONST(2675.4114815109842/8.0), - REAL_CONST(2685.0050636877722/8.0), - REAL_CONST(2694.6072230582295/8.0), - REAL_CONST(2704.2179443263894/8.0), - REAL_CONST(2713.8372122642972/8.0), - REAL_CONST(2723.4650117115279/8.0), - REAL_CONST(2733.1013275747096/8.0), - REAL_CONST(2742.7461448270483/8.0), - REAL_CONST(2752.3994485078601/8.0), - REAL_CONST(2762.0612237221085/8.0), - REAL_CONST(2771.7314556399419/8.0), - REAL_CONST(2781.4101294962406/8.0), - REAL_CONST(2791.0972305901655/8.0), - REAL_CONST(2800.7927442847094/8.0), - REAL_CONST(2810.4966560062589/8.0), - REAL_CONST(2820.2089512441521/8.0), - REAL_CONST(2829.9296155502466/8.0), - REAL_CONST(2839.6586345384894/8.0), - REAL_CONST(2849.3959938844923/8.0), - REAL_CONST(2859.1416793251065/8.0), - REAL_CONST(2868.8956766580086/8.0), - REAL_CONST(2878.6579717412847/8.0), - REAL_CONST(2888.4285504930212/8.0), - REAL_CONST(2898.2073988908974/8.0), - REAL_CONST(2907.9945029717837/8.0), - REAL_CONST(2917.789848831344/8.0), - REAL_CONST(2927.5934226236377/8.0), - REAL_CONST(2937.4052105607311/8.0), - REAL_CONST(2947.2251989123079/8.0), - REAL_CONST(2957.0533740052865/8.0), - REAL_CONST(2966.8897222234368/8.0), - REAL_CONST(2976.734230007005/8.0), - REAL_CONST(2986.5868838523397/8.0), - REAL_CONST(2996.4476703115197/8.0), - REAL_CONST(3006.3165759919889/8.0), - REAL_CONST(3016.1935875561908/8.0), - REAL_CONST(3026.0786917212095/8.0), - REAL_CONST(3035.9718752584108/8.0), - REAL_CONST(3045.8731249930906/8.0), - REAL_CONST(3055.7824278041207/8.0), - REAL_CONST(3065.6997706236039/8.0), - REAL_CONST(3075.625140436528/8.0), - REAL_CONST(3085.5585242804245/8.0), - REAL_CONST(3095.4999092450298/8.0), - REAL_CONST(3105.4492824719491/8.0), - REAL_CONST(3115.4066311543256/8.0), - REAL_CONST(3125.3719425365089/8.0), - REAL_CONST(3135.3452039137287/8.0), - REAL_CONST(3145.3264026317715/8.0), - REAL_CONST(3155.3155260866592/8.0), - REAL_CONST(3165.3125617243295/8.0), - REAL_CONST(3175.3174970403229/8.0), - REAL_CONST(3185.3303195794679/8.0), - REAL_CONST(3195.35101693557/8.0), - REAL_CONST(3205.3795767511078/8.0), - REAL_CONST(3215.4159867169251/8.0), - REAL_CONST(3225.460234571929/8.0), - REAL_CONST(3235.5123081027928/8.0), - REAL_CONST(3245.5721951436558/8.0), - REAL_CONST(3255.63988357583/8.0), - REAL_CONST(3265.7153613275095/8.0), - REAL_CONST(3275.7986163734795/8.0), - REAL_CONST(3285.8896367348289/8.0), - REAL_CONST(3295.9884104786665/8.0), - REAL_CONST(3306.0949257178395/8.0), - REAL_CONST(3316.2091706106517/8.0), - REAL_CONST(3326.331133360588/8.0), - REAL_CONST(3336.4608022160378/8.0), - REAL_CONST(3346.5981654700231/8.0), - REAL_CONST(3356.7432114599264/8.0), - REAL_CONST(3366.8959285672249/8.0), - REAL_CONST(3377.0563052172211/8.0), - REAL_CONST(3387.2243298787821/8.0), - REAL_CONST(3397.3999910640764/8.0), - REAL_CONST(3407.5832773283128/8.0), - REAL_CONST(3417.7741772694862/8.0), - REAL_CONST(3427.9726795281199/8.0), - REAL_CONST(3438.1787727870123/8.0), - REAL_CONST(3448.3924457709873/8.0), - REAL_CONST(3458.6136872466445/8.0), - REAL_CONST(3468.8424860221107/8.0), - REAL_CONST(3479.0788309467976/8.0), - REAL_CONST(3489.3227109111554/8.0), - REAL_CONST(3499.5741148464344/8.0), - REAL_CONST(3509.8330317244445/8.0), - REAL_CONST(3520.0994505573185/8.0), - REAL_CONST(3530.3733603972751/8.0), - REAL_CONST(3540.6547503363886/8.0), - REAL_CONST(3550.9436095063534/8.0), - REAL_CONST(3561.239927078258/8.0), - REAL_CONST(3571.5436922623535/8.0), - REAL_CONST(3581.8548943078308/8.0), - REAL_CONST(3592.1735225025936/8.0), - REAL_CONST(3602.4995661730372/8.0), - REAL_CONST(3612.8330146838275/8.0), - REAL_CONST(3623.1738574376814/8.0), - REAL_CONST(3633.5220838751502/8.0), - REAL_CONST(3643.8776834744031/8.0), - REAL_CONST(3654.2406457510142/8.0), - REAL_CONST(3664.6109602577494/8.0), - REAL_CONST(3674.9886165843564/8.0), - REAL_CONST(3685.3736043573545/8.0), - REAL_CONST(3695.7659132398294/8.0), - REAL_CONST(3706.1655329312248/8.0), - REAL_CONST(3716.5724531671399/8.0), - REAL_CONST(3726.9866637191262/8.0), - REAL_CONST(3737.4081543944876/8.0), - REAL_CONST(3747.8369150360782/8.0), - REAL_CONST(3758.2729355221072/8.0), - REAL_CONST(3768.7162057659411/8.0), - REAL_CONST(3779.1667157159077/8.0), - REAL_CONST(3789.6244553551055/8.0), - REAL_CONST(3800.0894147012082/8.0), - REAL_CONST(3810.5615838062768/8.0), - REAL_CONST(3821.0409527565694/8.0), - REAL_CONST(3831.5275116723533/8.0), - REAL_CONST(3842.0212507077194/8.0), - REAL_CONST(3852.522160050396/8.0), - REAL_CONST(3863.0302299215673/8.0), - REAL_CONST(3873.5454505756893/8.0), - REAL_CONST(3884.0678123003108/8.0), - REAL_CONST(3894.5973054158922/8.0), - REAL_CONST(3905.1339202756285/8.0), - REAL_CONST(3915.6776472652732/8.0), - REAL_CONST(3926.2284768029604/8.0), - REAL_CONST(3936.7863993390338/8.0), - REAL_CONST(3947.3514053558706/8.0), - REAL_CONST(3957.9234853677135/8.0), - REAL_CONST(3968.5026299204969/8.0), - REAL_CONST(3979.0888295916798/8.0), - REAL_CONST(3989.6820749900776/8.0), - REAL_CONST(4000.2823567556948/8.0), - REAL_CONST(4010.8896655595613/8.0), - REAL_CONST(4021.5039921035655/8.0), - REAL_CONST(4032.1253271202945/8.0), - REAL_CONST(4042.7536613728694/8.0), - REAL_CONST(4053.3889856547858/8.0), - REAL_CONST(4064.0312907897551/8.0), - REAL_CONST(4074.6805676315448/8.0), - REAL_CONST(4085.3368070638221/8.0), - REAL_CONST(4095.9999999999982/8.0), - REAL_CONST(4106.6701373830711/8.0), - REAL_CONST(4117.347210185475/8.0), - REAL_CONST(4128.0312094089259/8.0), - REAL_CONST(4138.722126084268/8.0), - REAL_CONST(4149.4199512713267/8.0), - REAL_CONST(4160.1246760587583/8.0), - REAL_CONST(4170.8362915638982/8.0), - REAL_CONST(4181.5547889326181/8.0), - REAL_CONST(4192.2801593391769/8.0), - REAL_CONST(4203.0123939860741/8.0), - REAL_CONST(4213.7514841039101/8.0), - REAL_CONST(4224.4974209512384/8.0), - REAL_CONST(4235.2501958144258/8.0), - REAL_CONST(4246.0098000075095/8.0), - REAL_CONST(4256.7762248720574/8.0), - REAL_CONST(4267.549461777031/8.0), - REAL_CONST(4278.3295021186423/8.0), - REAL_CONST(4289.1163373202198/8.0), - REAL_CONST(4299.9099588320714/8.0), - REAL_CONST(4310.7103581313495/8.0), - REAL_CONST(4321.5175267219138/8.0), - REAL_CONST(4332.3314561342004/8.0), - REAL_CONST(4343.152137925088/8.0), - REAL_CONST(4353.9795636777671/8.0), - REAL_CONST(4364.8137250016052/8.0), - REAL_CONST(4375.6546135320223/8.0), - REAL_CONST(4386.5022209303588/8.0), - REAL_CONST(4397.3565388837469/8.0), - REAL_CONST(4408.2175591049827/8.0), - REAL_CONST(4419.0852733324018/8.0), - REAL_CONST(4429.9596733297531/8.0), - REAL_CONST(4440.8407508860728/8.0), - REAL_CONST(4451.7284978155603/8.0), - REAL_CONST(4462.6229059574571/8.0), - REAL_CONST(4473.5239671759227/8.0), - REAL_CONST(4484.4316733599126/8.0), - REAL_CONST(4495.3460164230582/8.0), - REAL_CONST(4506.2669883035496/8.0), - REAL_CONST(4517.1945809640119/8.0), - REAL_CONST(4528.1287863913894/8.0), - REAL_CONST(4539.069596596828/8.0), - REAL_CONST(4550.0170036155587/8.0), - REAL_CONST(4560.9709995067806/8.0), - REAL_CONST(4571.931576353546/8.0), - REAL_CONST(4582.898726262647/8.0), - REAL_CONST(4593.8724413645004/8.0), - REAL_CONST(4604.8527138130348/8.0), - REAL_CONST(4615.8395357855816/8.0), - REAL_CONST(4626.8328994827571/8.0), - REAL_CONST(4637.8327971283588/8.0), - REAL_CONST(4648.8392209692511/8.0), - REAL_CONST(4659.8521632752563/8.0), - REAL_CONST(4670.8716163390473/8.0), - REAL_CONST(4681.8975724760394/8.0), - REAL_CONST(4692.9300240242837/8.0), - REAL_CONST(4703.9689633443595/8.0), - REAL_CONST(4715.0143828192668/8.0), - REAL_CONST(4726.0662748543255/8.0), - REAL_CONST(4737.1246318770682/8.0), - REAL_CONST(4748.1894463371373/8.0), - REAL_CONST(4759.2607107061804/8.0), - REAL_CONST(4770.3384174777493/8.0), - REAL_CONST(4781.4225591671993/8.0), - REAL_CONST(4792.5131283115852/8.0), - REAL_CONST(4803.6101174695614/8.0), - REAL_CONST(4814.7135192212854/8.0), - REAL_CONST(4825.8233261683154/8.0), - REAL_CONST(4836.9395309335096/8.0), - REAL_CONST(4848.0621261609349/8.0), - REAL_CONST(4859.1911045157631/8.0), - REAL_CONST(4870.3264586841779/8.0), - REAL_CONST(4881.4681813732768/8.0), - REAL_CONST(4892.6162653109768/8.0), - REAL_CONST(4903.7707032459193/8.0), - REAL_CONST(4914.931487947375/8.0), - REAL_CONST(4926.0986122051509/8.0), - REAL_CONST(4937.2720688294967/8.0), - REAL_CONST(4948.4518506510112/8.0), - REAL_CONST(4959.637950520555/8.0), - REAL_CONST(4970.8303613091521/8.0), - REAL_CONST(4982.0290759079044/8.0), - REAL_CONST(4993.2340872278974/8.0), - REAL_CONST(5004.4453882001153/8.0), - REAL_CONST(5015.6629717753467/8.0), - REAL_CONST(5026.8868309241007/8.0), - REAL_CONST(5038.1169586365131/8.0), - REAL_CONST(5049.353347922266/8.0), - REAL_CONST(5060.5959918104927/8.0), - REAL_CONST(5071.8448833496996/8.0), - REAL_CONST(5083.1000156076734/8.0), - REAL_CONST(5094.3613816713996/8.0), - REAL_CONST(5105.6289746469747/8.0), - REAL_CONST(5116.9027876595246/8.0), - REAL_CONST(5128.18281385312/8.0), - REAL_CONST(5139.4690463906918/8.0), - REAL_CONST(5150.7614784539473/8.0), - REAL_CONST(5162.0601032432933/8.0), - REAL_CONST(5173.3649139777472/8.0), - REAL_CONST(5184.6759038948594/8.0), - REAL_CONST(5195.9930662506322/8.0), - REAL_CONST(5207.3163943194386/8.0), - REAL_CONST(5218.6458813939435/8.0), - REAL_CONST(5229.9815207850224/8.0), - REAL_CONST(5241.3233058216847/8.0), - REAL_CONST(5252.6712298509919/8.0), - REAL_CONST(5264.025286237983/8.0), - REAL_CONST(5275.3854683655954/8.0), - REAL_CONST(5286.7517696345885/8.0), - REAL_CONST(5298.1241834634639/8.0), - REAL_CONST(5309.5027032883945/8.0), - REAL_CONST(5320.887322563146/8.0), - REAL_CONST(5332.2780347589978/8.0), - REAL_CONST(5343.6748333646756/8.0), - REAL_CONST(5355.0777118862716/8.0), - REAL_CONST(5366.4866638471722/8.0), - REAL_CONST(5377.901682787985/8.0), - REAL_CONST(5389.3227622664635/8.0), - REAL_CONST(5400.749895857437/8.0), - REAL_CONST(5412.1830771527357/8.0), - REAL_CONST(5423.622299761123/8.0), - REAL_CONST(5435.067557308219/8.0), - REAL_CONST(5446.5188434364318/8.0), - REAL_CONST(5457.9761518048872/8.0), - REAL_CONST(5469.4394760893592/8.0), - REAL_CONST(5480.9088099821975/8.0), - REAL_CONST(5492.3841471922606/8.0), - REAL_CONST(5503.8654814448455/8.0), - REAL_CONST(5515.3528064816201/8.0), - REAL_CONST(5526.846116060552/8.0), - REAL_CONST(5538.3454039558474/8.0), - REAL_CONST(5549.8506639578736/8.0), - REAL_CONST(5561.3618898731029/8.0), - REAL_CONST(5572.8790755240361/8.0), - REAL_CONST(5584.4022147491451/8.0), - REAL_CONST(5595.9313014027975/8.0), - REAL_CONST(5607.4663293552012/8.0), - REAL_CONST(5619.0072924923297/8.0), - REAL_CONST(5630.5541847158656/8.0), - REAL_CONST(5642.1069999431284/8.0), - REAL_CONST(5653.665732107017/8.0), - REAL_CONST(5665.230375155943/8.0), - REAL_CONST(5676.8009230537655/8.0), - REAL_CONST(5688.3773697797333/8.0), - REAL_CONST(5699.9597093284156/8.0), - REAL_CONST(5711.5479357096474/8.0), - REAL_CONST(5723.1420429484588/8.0), - REAL_CONST(5734.7420250850209/8.0), - REAL_CONST(5746.347876174581/8.0), - REAL_CONST(5757.9595902874016/8.0), - REAL_CONST(5769.5771615087006/8.0), - REAL_CONST(5781.2005839385911/8.0), - REAL_CONST(5792.8298516920213/8.0), - REAL_CONST(5804.4649588987149/8.0), - REAL_CONST(5816.1058997031105/8.0), - REAL_CONST(5827.7526682643065/8.0), - REAL_CONST(5839.4052587559972/8.0), - REAL_CONST(5851.0636653664196/8.0), - REAL_CONST(5862.7278822982908/8.0), - REAL_CONST(5874.3979037687541/8.0), - REAL_CONST(5886.0737240093204/8.0), - REAL_CONST(5897.7553372658094/8.0), - REAL_CONST(5909.4427377982956/8.0), - REAL_CONST(5921.1359198810505/8.0), - REAL_CONST(5932.8348778024874/8.0), - REAL_CONST(5944.5396058651031/8.0), - REAL_CONST(5956.2500983854261/8.0), - REAL_CONST(5967.9663496939575/8.0), - REAL_CONST(5979.6883541351208/8.0), - REAL_CONST(5991.4161060672022/8.0), - REAL_CONST(6003.1495998623004/8.0), - REAL_CONST(6014.8888299062692/8.0), - REAL_CONST(6026.6337905986684/8.0), - REAL_CONST(6038.3844763527022/8.0), - REAL_CONST(6050.1408815951781/8.0), - REAL_CONST(6061.9030007664414/8.0), - REAL_CONST(6073.6708283203316/8.0), - REAL_CONST(6085.4443587241267/8.0), - REAL_CONST(6097.2235864584891/8.0), - REAL_CONST(6109.0085060174197/8.0), - REAL_CONST(6120.7991119081998/8.0), - REAL_CONST(6132.595398651345/8.0), - REAL_CONST(6144.3973607805519/8.0), - REAL_CONST(6156.2049928426459/8.0), - REAL_CONST(6168.0182893975361/8.0), - REAL_CONST(6179.8372450181578/8.0), - REAL_CONST(6191.6618542904307/8.0), - REAL_CONST(6203.4921118132024/8.0), - REAL_CONST(6215.3280121982016/8.0), - REAL_CONST(6227.1695500699925/8.0), - REAL_CONST(6239.0167200659189/8.0), - REAL_CONST(6250.8695168360628/8.0), - REAL_CONST(6262.7279350431891/8.0), - REAL_CONST(6274.5919693627056/8.0), - REAL_CONST(6286.4616144826068/8.0), - REAL_CONST(6298.3368651034316/8.0), - REAL_CONST(6310.2177159382172/8.0), - REAL_CONST(6322.1041617124456/8.0), - REAL_CONST(6333.9961971640032/8.0), - REAL_CONST(6345.8938170431311/8.0), - REAL_CONST(6357.7970161123785/8.0), - REAL_CONST(6369.7057891465583/8.0), - REAL_CONST(6381.6201309327007/8.0), - REAL_CONST(6393.5400362700075/8.0), - REAL_CONST(6405.4654999698032/8.0), - REAL_CONST(6417.3965168554978/8.0), - REAL_CONST(6429.3330817625329/8.0), - REAL_CONST(6441.2751895383453/8.0), - REAL_CONST(6453.2228350423138/8.0), - REAL_CONST(6465.176013145724/8.0), - REAL_CONST(6477.134718731716/8.0), - REAL_CONST(6489.0989466952469/8.0), - REAL_CONST(6501.0686919430445/8.0), - REAL_CONST(6513.0439493935628/8.0), - REAL_CONST(6525.0247139769417/8.0), - REAL_CONST(6537.010980634961/8.0), - REAL_CONST(6549.002744321001/8.0), - REAL_CONST(6560.9999999999973/8.0), - REAL_CONST(6573.0027426483985/8.0), - REAL_CONST(6585.0109672541284/8.0), - REAL_CONST(6597.0246688165371/8.0), - REAL_CONST(6609.0438423463656/8.0), - REAL_CONST(6621.0684828657004/8.0), - REAL_CONST(6633.0985854079354/8.0), - REAL_CONST(6645.134145017727/8.0), - REAL_CONST(6657.1751567509573/8.0), - REAL_CONST(6669.2216156746908/8.0), - REAL_CONST(6681.2735168671343/8.0), - REAL_CONST(6693.3308554176001/8.0), - REAL_CONST(6705.3936264264594/8.0), - REAL_CONST(6717.461825005108/8.0), - REAL_CONST(6729.535446275926/8.0), - REAL_CONST(6741.6144853722335/8.0), - REAL_CONST(6753.6989374382601/8.0), - REAL_CONST(6765.7887976290967/8.0), - REAL_CONST(6777.8840611106634/8.0), - REAL_CONST(6789.9847230596661/8.0), - REAL_CONST(6802.0907786635626/8.0), - REAL_CONST(6814.2022231205201/8.0), - REAL_CONST(6826.3190516393797/8.0), - REAL_CONST(6838.4412594396181/8.0), - REAL_CONST(6850.5688417513074/8.0), - REAL_CONST(6862.701793815083/8.0), - REAL_CONST(6874.840110882099/8.0), - REAL_CONST(6886.9837882139991/8.0), - REAL_CONST(6899.1328210828724/8.0), - REAL_CONST(6911.2872047712199/8.0), - REAL_CONST(6923.4469345719199/8.0), - REAL_CONST(6935.6120057881863/8.0), - REAL_CONST(6947.7824137335365/8.0), - REAL_CONST(6959.9581537317536/8.0), - REAL_CONST(6972.1392211168532/8.0), - REAL_CONST(6984.3256112330409/8.0), - REAL_CONST(6996.5173194346862/8.0), - REAL_CONST(7008.7143410862773/8.0), - REAL_CONST(7020.9166715623942/8.0), - REAL_CONST(7033.1243062476678/8.0), - REAL_CONST(7045.3372405367481/8.0), - REAL_CONST(7057.5554698342685/8.0), - REAL_CONST(7069.7789895548103/8.0), - REAL_CONST(7082.0077951228714/8.0), - REAL_CONST(7094.2418819728273/8.0), - REAL_CONST(7106.4812455489018/8.0), - REAL_CONST(7118.7258813051285/8.0), - REAL_CONST(7130.9757847053224/8.0), - REAL_CONST(7143.2309512230404/8.0), - REAL_CONST(7155.4913763415516/8.0), - REAL_CONST(7167.7570555538041/8.0), - REAL_CONST(7180.0279843623894/8.0), - REAL_CONST(7192.3041582795131/8.0), - REAL_CONST(7204.5855728269571/8.0), - REAL_CONST(7216.8722235360519/8.0), - REAL_CONST(7229.1641059476406/8.0), - REAL_CONST(7241.4612156120484/8.0), - REAL_CONST(7253.7635480890503/8.0), - REAL_CONST(7266.0710989478375/8.0), - REAL_CONST(7278.3838637669869/8.0), - REAL_CONST(7290.7018381344296/8.0), - REAL_CONST(7303.0250176474174/8.0), - REAL_CONST(7315.3533979124932/8.0), - REAL_CONST(7327.6869745454596/8.0), - REAL_CONST(7340.0257431713462/8.0), - REAL_CONST(7352.3696994243801/8.0), - REAL_CONST(7364.7188389479543/8.0), - REAL_CONST(7377.0731573945968/8.0), - REAL_CONST(7389.4326504259407/8.0), - REAL_CONST(7401.7973137126937/8.0), - REAL_CONST(7414.1671429346061/8.0), - REAL_CONST(7426.5421337804428/8.0), - REAL_CONST(7438.922281947951/8.0), - REAL_CONST(7451.3075831438346/8.0), - REAL_CONST(7463.6980330837177/8.0), - REAL_CONST(7476.0936274921214/8.0), - REAL_CONST(7488.4943621024304/8.0), - REAL_CONST(7500.9002326568652/8.0), - REAL_CONST(7513.3112349064522/8.0), - REAL_CONST(7525.7273646109943/8.0), - REAL_CONST(7538.1486175390446/8.0), - REAL_CONST(7550.5749894678729/8.0), - REAL_CONST(7563.0064761834419/8.0), - REAL_CONST(7575.4430734803736/8.0), - REAL_CONST(7587.8847771619248/8.0), - REAL_CONST(7600.3315830399597/8.0), - REAL_CONST(7612.7834869349153/8.0), - REAL_CONST(7625.24048467578/8.0), - REAL_CONST(7637.7025721000637/8.0), - REAL_CONST(7650.1697450537677/8.0), - REAL_CONST(7662.6419993913596/8.0), - REAL_CONST(7675.1193309757446/8.0), - REAL_CONST(7687.6017356782404/8.0), - REAL_CONST(7700.0892093785433/8.0), - REAL_CONST(7712.5817479647112/8.0), - REAL_CONST(7725.079347333125/8.0), - REAL_CONST(7737.5820033884729/8.0), - REAL_CONST(7750.0897120437139/8.0), - REAL_CONST(7762.6024692200581/8.0), - REAL_CONST(7775.1202708469355/8.0), - REAL_CONST(7787.6431128619733/8.0), - REAL_CONST(7800.1709912109645/8.0), - REAL_CONST(7812.7039018478481/8.0), - REAL_CONST(7825.2418407346768/8.0), - REAL_CONST(7837.7848038415968/8.0), - REAL_CONST(7850.3327871468155/8.0), - REAL_CONST(7862.8857866365806/8.0), - REAL_CONST(7875.4437983051539/8.0), - REAL_CONST(7888.006818154784/8.0), - REAL_CONST(7900.5748421956796/8.0), - REAL_CONST(7913.1478664459901/8.0), - REAL_CONST(7925.725886931772/8.0), - REAL_CONST(7938.3088996869719/8.0), - REAL_CONST(7950.8969007533951/8.0), - REAL_CONST(7963.4898861806851/8.0), - REAL_CONST(7976.0878520262959/8.0), - REAL_CONST(7988.6907943554688/8.0), - REAL_CONST(8001.2987092412086/8.0), - REAL_CONST(8013.911592764257/8.0), - REAL_CONST(8026.5294410130691/8.0), - REAL_CONST(8039.1522500837891/8.0), - REAL_CONST(8051.7800160802271/8.0), - REAL_CONST(8064.412735113835/8.0), - REAL_CONST(8077.0504033036796/8.0), - REAL_CONST(8089.6930167764222/8.0), - REAL_CONST(8102.3405716662946/8.0), - REAL_CONST(8114.9930641150731/8.0), - REAL_CONST(8127.6504902720571/8.0), - REAL_CONST(8140.3128462940449/8.0), - REAL_CONST(8152.9801283453098/8.0), - REAL_CONST(8165.6523325975786/8.0), - REAL_CONST(8178.3294552300049/8.0), - REAL_CONST(8191.0114924291529/8.0), - REAL_CONST(8203.6984403889655/8.0), - REAL_CONST(8216.3902953107463/8.0), - REAL_CONST(8229.0870534031419/8.0), - REAL_CONST(8241.7887108821069/8.0), - REAL_CONST(8254.4952639708936/8.0), - REAL_CONST(8267.2067089000211/8.0), - REAL_CONST(8279.9230419072574/8.0), - REAL_CONST(8292.6442592375952/8.0), - REAL_CONST(8305.3703571432306/8.0), - REAL_CONST(8318.101331883543/8.0), - REAL_CONST(8330.8371797250657/8.0), - REAL_CONST(8343.577896941475/8.0), - REAL_CONST(8356.3234798135582/8.0), - REAL_CONST(8369.0739246291978/8.0), - REAL_CONST(8381.8292276833508/8.0), - REAL_CONST(8394.5893852780209/8.0), - REAL_CONST(8407.3543937222421/8.0), - REAL_CONST(8420.1242493320569/8.0), - REAL_CONST(8432.8989484304948/8.0), - REAL_CONST(8445.6784873475499/8.0), - REAL_CONST(8458.4628624201578/8.0), - REAL_CONST(8471.2520699921806/8.0), - REAL_CONST(8484.0461064143838/8.0), - REAL_CONST(8496.8449680444082/8.0), - REAL_CONST(8509.6486512467636/8.0), - REAL_CONST(8522.4571523927953/8.0), - REAL_CONST(8535.270467860666/8.0), - REAL_CONST(8548.0885940353437/8.0), - REAL_CONST(8560.9115273085663/8.0), - REAL_CONST(8573.7392640788403/8.0), - REAL_CONST(8586.5718007514006/8.0), - REAL_CONST(8599.4091337382069/8.0), - REAL_CONST(8612.2512594579148/8.0), - REAL_CONST(8625.0981743358552/8.0), - REAL_CONST(8637.9498748040205/8.0), - REAL_CONST(8650.8063573010386/8.0), - REAL_CONST(8663.6676182721567/8.0), - REAL_CONST(8676.533654169225/8.0), - REAL_CONST(8689.4044614506638/8.0), - REAL_CONST(8702.2800365814601/8.0), - REAL_CONST(8715.1603760331418/8.0), - REAL_CONST(8728.0454762837508/8.0), - REAL_CONST(8740.9353338178389/8.0), - REAL_CONST(8753.8299451264356/8.0), - REAL_CONST(8766.7293067070332/8.0), - REAL_CONST(8779.6334150635721/8.0), - REAL_CONST(8792.5422667064158/8.0), - REAL_CONST(8805.4558581523324/8.0), - REAL_CONST(8818.3741859244819/8.0), - REAL_CONST(8831.2972465523908/8.0), - REAL_CONST(8844.2250365719356/8.0), - REAL_CONST(8857.1575525253265/8.0), - REAL_CONST(8870.0947909610859/8.0), - REAL_CONST(8883.0367484340295/8.0), - REAL_CONST(8895.9834215052524/8.0), - REAL_CONST(8908.934806742107/8.0), - REAL_CONST(8921.8909007181846/8.0), - REAL_CONST(8934.8517000132997/8.0), - REAL_CONST(8947.817201213471/8.0), - REAL_CONST(8960.7874009109/8.0), - REAL_CONST(8973.7622957039603/8.0), - REAL_CONST(8986.7418821971733/8.0), - REAL_CONST(8999.7261570011924/8.0), - REAL_CONST(9012.7151167327884/8.0), - REAL_CONST(9025.7087580148236/8.0), - REAL_CONST(9038.7070774762469/8.0), - REAL_CONST(9051.7100717520643/8.0), - REAL_CONST(9064.7177374833282/8.0), - REAL_CONST(9077.7300713171153/8.0), - REAL_CONST(9090.7470699065179/8.0), - REAL_CONST(9103.7687299106146/8.0), - REAL_CONST(9116.7950479944648/8.0), - REAL_CONST(9129.8260208290812/8.0), - REAL_CONST(9142.8616450914233/8.0), - REAL_CONST(9155.9019174643727/8.0), - REAL_CONST(9168.9468346367157/8.0), - REAL_CONST(9181.9963933031358/8.0), - REAL_CONST(9195.0505901641845/8.0), - REAL_CONST(9208.1094219262741/8.0), - REAL_CONST(9221.1728853016557/8.0), - REAL_CONST(9234.240977008405/8.0), - REAL_CONST(9247.3136937704076/8.0), - REAL_CONST(9260.3910323173386/8.0), - REAL_CONST(9273.472989384647/8.0), - REAL_CONST(9286.5595617135423/8.0), - REAL_CONST(9299.6507460509747/8.0), - REAL_CONST(9312.7465391496207/8.0), - REAL_CONST(9325.8469377678684/8.0), - REAL_CONST(9338.9519386698012/8.0), - REAL_CONST(9352.0615386251757/8.0), - REAL_CONST(9365.1757344094131/8.0), - REAL_CONST(9378.2945228035842/8.0), - REAL_CONST(9391.4179005943843/8.0), - REAL_CONST(9404.5458645741273/8.0), - REAL_CONST(9417.6784115407263/8.0), - REAL_CONST(9430.8155382976747/8.0), - REAL_CONST(9443.9572416540359/8.0), - REAL_CONST(9457.1035184244265/8.0), - REAL_CONST(9470.2543654290002/8.0), - REAL_CONST(9483.4097794934296/8.0), - REAL_CONST(9496.5697574488931/8.0), - REAL_CONST(9509.7342961320664/8.0), - REAL_CONST(9522.9033923850911/8.0), - REAL_CONST(9536.0770430555804/8.0), - REAL_CONST(9549.2552449965824/8.0), - REAL_CONST(9562.4379950665825/8.0), - REAL_CONST(9575.6252901294793/8.0), - REAL_CONST(9588.8171270545736/8.0), - REAL_CONST(9602.0135027165488/8.0), - REAL_CONST(9615.2144139954635/8.0), - REAL_CONST(9628.4198577767274/8.0), - REAL_CONST(9641.629830951093/8.0), - REAL_CONST(9654.844330414644/8.0), - REAL_CONST(9668.0633530687719/8.0), - REAL_CONST(9681.286895820167/8.0), - REAL_CONST(9694.5149555808002/8.0), - REAL_CONST(9707.7475292679192/8.0), - REAL_CONST(9720.9846138040157/8.0), - REAL_CONST(9734.2262061168276/8.0), - REAL_CONST(9747.4723031393187/8.0), - REAL_CONST(9760.7229018096641/8.0), - REAL_CONST(9773.9779990712323/8.0), - REAL_CONST(9787.2375918725811/8.0), - REAL_CONST(9800.5016771674327/8.0), - REAL_CONST(9813.7702519146696/8.0), - REAL_CONST(9827.0433130783094/8.0), - REAL_CONST(9840.3208576275028/8.0), - REAL_CONST(9853.602882536512/8.0), - REAL_CONST(9866.8893847846994/8.0), - REAL_CONST(9880.1803613565116/8.0), - REAL_CONST(9893.4758092414686/8.0), - REAL_CONST(9906.7757254341523/8.0), - REAL_CONST(9920.0801069341851/8.0), - REAL_CONST(9933.3889507462245/8.0), - REAL_CONST(9946.7022538799429/8.0), - REAL_CONST(9960.0200133500221/8.0), - REAL_CONST(9973.3422261761298/8.0), - REAL_CONST(9986.6688893829159/8.0), - REAL_CONST(9999.9999999999945/8.0), - REAL_CONST(10013.335555061929/8.0), - REAL_CONST(10026.675551608221/8.0), - REAL_CONST(10040.019986683301/8.0), - REAL_CONST(10053.368857336509/8.0), - REAL_CONST(10066.722160622081/8.0), - REAL_CONST(10080.079893599144/8.0), - REAL_CONST(10093.442053331697/8.0), - REAL_CONST(10106.808636888598/8.0), - REAL_CONST(10120.179641343551/8.0), - REAL_CONST(10133.555063775095/8.0), - REAL_CONST(10146.934901266595/8.0), - REAL_CONST(10160.31915090622/8.0), - REAL_CONST(10173.707809786936/8.0), - REAL_CONST(10187.100875006496/8.0), - REAL_CONST(10200.498343667417/8.0), - REAL_CONST(10213.900212876984/8.0), - REAL_CONST(10227.306479747222/8.0), - REAL_CONST(10240.717141394889/8.0), - REAL_CONST(10254.132194941467/8.0), - REAL_CONST(10267.551637513146/8.0), - REAL_CONST(10280.975466240814/8.0), - REAL_CONST(10294.40367826004/8.0), - REAL_CONST(10307.836270711066/8.0), - REAL_CONST(10321.273240738796/8.0), - REAL_CONST(10334.71458549278/8.0) -#ifdef BIG_IQ_TABLE - ,REAL_CONST(10348.160302127204/8.0), - REAL_CONST(10361.610387800878/8.0), - REAL_CONST(10375.064839677221/8.0), - REAL_CONST(10388.523654924258/8.0), - REAL_CONST(10401.986830714593/8.0), - REAL_CONST(10415.454364225412/8.0), - REAL_CONST(10428.926252638465/8.0), - REAL_CONST(10442.402493140049/8.0), - REAL_CONST(10455.883082921007/8.0), - REAL_CONST(10469.368019176709/8.0), - REAL_CONST(10482.85729910704/8.0), - REAL_CONST(10496.350919916393/8.0), - REAL_CONST(10509.848878813653/8.0), - REAL_CONST(10523.351173012188/8.0), - REAL_CONST(10536.857799729838/8.0), - REAL_CONST(10550.3687561889/8.0), - REAL_CONST(10563.884039616123/8.0), - REAL_CONST(10577.403647242685/8.0), - REAL_CONST(10590.927576304197/8.0), - REAL_CONST(10604.455824040679/8.0), - REAL_CONST(10617.988387696556/8.0), - REAL_CONST(10631.525264520642/8.0), - REAL_CONST(10645.066451766135/8.0), - REAL_CONST(10658.611946690598/8.0), - REAL_CONST(10672.161746555956/8.0), - REAL_CONST(10685.715848628475/8.0), - REAL_CONST(10699.274250178762/8.0), - REAL_CONST(10712.836948481747/8.0), - REAL_CONST(10726.403940816675/8.0), - REAL_CONST(10739.975224467091/8.0), - REAL_CONST(10753.550796720834/8.0), - REAL_CONST(10767.130654870027/8.0), - REAL_CONST(10780.714796211059/8.0), - REAL_CONST(10794.303218044579/8.0), - REAL_CONST(10807.895917675487/8.0), - REAL_CONST(10821.492892412922/8.0), - REAL_CONST(10835.094139570248/8.0), - REAL_CONST(10848.699656465047/8.0), - REAL_CONST(10862.309440419107/8.0), - REAL_CONST(10875.923488758415/8.0), - REAL_CONST(10889.541798813138/8.0), - REAL_CONST(10903.16436791762/8.0), - REAL_CONST(10916.791193410372/8.0), - REAL_CONST(10930.422272634056/8.0), - REAL_CONST(10944.05760293548/8.0), - REAL_CONST(10957.697181665582/8.0), - REAL_CONST(10971.341006179427/8.0), - REAL_CONST(10984.98907383619/8.0), - REAL_CONST(10998.641381999149/8.0), - REAL_CONST(11012.297928035676/8.0), - REAL_CONST(11025.958709317223/8.0), - REAL_CONST(11039.623723219316/8.0), - REAL_CONST(11053.292967121541/8.0), - REAL_CONST(11066.966438407539/8.0), - REAL_CONST(11080.64413446499/8.0), - REAL_CONST(11094.326052685608/8.0), - REAL_CONST(11108.012190465128/8.0), - REAL_CONST(11121.702545203296/8.0), - REAL_CONST(11135.397114303863/8.0), - REAL_CONST(11149.095895174571/8.0), - REAL_CONST(11162.798885227143/8.0), - REAL_CONST(11176.506081877278/8.0), - REAL_CONST(11190.217482544635/8.0), - REAL_CONST(11203.933084652828/8.0), - REAL_CONST(11217.652885629415/8.0), - REAL_CONST(11231.376882905886/8.0), - REAL_CONST(11245.105073917659/8.0), - REAL_CONST(11258.837456104062/8.0), - REAL_CONST(11272.574026908333/8.0), - REAL_CONST(11286.314783777601/8.0), - REAL_CONST(11300.059724162888/8.0), - REAL_CONST(11313.808845519083/8.0), - REAL_CONST(11327.562145304952/8.0), - REAL_CONST(11341.319620983111/8.0), - REAL_CONST(11355.081270020033/8.0), - REAL_CONST(11368.847089886023/8.0), - REAL_CONST(11382.617078055218/8.0), - REAL_CONST(11396.391232005579/8.0), - REAL_CONST(11410.169549218874/8.0), - REAL_CONST(11423.952027180676/8.0), - REAL_CONST(11437.738663380349/8.0), - REAL_CONST(11451.529455311042/8.0), - REAL_CONST(11465.324400469679/8.0), - REAL_CONST(11479.123496356951/8.0), - REAL_CONST(11492.926740477304/8.0), - REAL_CONST(11506.734130338931/8.0), - REAL_CONST(11520.545663453764/8.0), - REAL_CONST(11534.361337337466/8.0), - REAL_CONST(11548.181149509423/8.0), - REAL_CONST(11562.005097492724/8.0), - REAL_CONST(11575.83317881417/8.0), - REAL_CONST(11589.665391004253/8.0), - REAL_CONST(11603.501731597149/8.0), - REAL_CONST(11617.342198130715/8.0), - REAL_CONST(11631.186788146468/8.0), - REAL_CONST(11645.035499189589/8.0), - REAL_CONST(11658.888328808911/8.0), - REAL_CONST(11672.745274556904/8.0), - REAL_CONST(11686.606333989675/8.0), - REAL_CONST(11700.471504666955/8.0), - REAL_CONST(11714.340784152086/8.0), - REAL_CONST(11728.214170012021/8.0), - REAL_CONST(11742.091659817312/8.0), - REAL_CONST(11755.973251142101/8.0), - REAL_CONST(11769.858941564111/8.0), - REAL_CONST(11783.748728664636/8.0), - REAL_CONST(11797.642610028539/8.0), - REAL_CONST(11811.540583244237/8.0), - REAL_CONST(11825.442645903697/8.0), - REAL_CONST(11839.34879560242/8.0), - REAL_CONST(11853.259029939445/8.0), - REAL_CONST(11867.173346517333/8.0), - REAL_CONST(11881.091742942155/8.0), - REAL_CONST(11895.014216823492/8.0), - REAL_CONST(11908.940765774427/8.0), - REAL_CONST(11922.871387411526/8.0), - REAL_CONST(11936.806079354839/8.0), - REAL_CONST(11950.744839227897/8.0), - REAL_CONST(11964.687664657684/8.0), - REAL_CONST(11978.634553274653/8.0), - REAL_CONST(11992.585502712702/8.0), - REAL_CONST(12006.540510609168/8.0), - REAL_CONST(12020.499574604828/8.0), - REAL_CONST(12034.462692343877/8.0), - REAL_CONST(12048.429861473938/8.0), - REAL_CONST(12062.401079646032/8.0), - REAL_CONST(12076.376344514589/8.0), - REAL_CONST(12090.355653737433/8.0), - REAL_CONST(12104.339004975769/8.0), - REAL_CONST(12118.326395894188/8.0), - REAL_CONST(12132.317824160644/8.0), - REAL_CONST(12146.313287446457/8.0), - REAL_CONST(12160.312783426305/8.0), - REAL_CONST(12174.316309778205/8.0), - REAL_CONST(12188.323864183525/8.0), - REAL_CONST(12202.335444326955/8.0), - REAL_CONST(12216.351047896511/8.0), - REAL_CONST(12230.370672583531/8.0), - REAL_CONST(12244.394316082657/8.0), - REAL_CONST(12258.421976091831/8.0), - REAL_CONST(12272.453650312296/8.0), - REAL_CONST(12286.489336448574/8.0), - REAL_CONST(12300.529032208471/8.0), - REAL_CONST(12314.572735303058/8.0), - REAL_CONST(12328.620443446678/8.0), - REAL_CONST(12342.672154356922/8.0), - REAL_CONST(12356.727865754638/8.0), - REAL_CONST(12370.787575363909/8.0), - REAL_CONST(12384.851280912055/8.0), - REAL_CONST(12398.918980129623/8.0), - REAL_CONST(12412.990670750381/8.0), - REAL_CONST(12427.066350511306/8.0), - REAL_CONST(12441.146017152583/8.0), - REAL_CONST(12455.229668417589/8.0), - REAL_CONST(12469.317302052901/8.0), - REAL_CONST(12483.40891580827/8.0), - REAL_CONST(12497.50450743663/8.0), - REAL_CONST(12511.604074694078/8.0), - REAL_CONST(12525.707615339878/8.0), - REAL_CONST(12539.815127136444/8.0), - REAL_CONST(12553.926607849342/8.0), - REAL_CONST(12568.042055247275/8.0), - REAL_CONST(12582.161467102082/8.0), - REAL_CONST(12596.284841188726/8.0), - REAL_CONST(12610.41217528529/8.0), - REAL_CONST(12624.543467172971/8.0), - REAL_CONST(12638.678714636069/8.0), - REAL_CONST(12652.817915461985/8.0), - REAL_CONST(12666.961067441209/8.0), - REAL_CONST(12681.108168367316/8.0), - REAL_CONST(12695.259216036962/8.0), - REAL_CONST(12709.414208249869/8.0), - REAL_CONST(12723.573142808827/8.0), - REAL_CONST(12737.736017519681/8.0), - REAL_CONST(12751.902830191326/8.0), - REAL_CONST(12766.073578635704/8.0), - REAL_CONST(12780.248260667788/8.0), - REAL_CONST(12794.426874105588/8.0), - REAL_CONST(12808.609416770132/8.0), - REAL_CONST(12822.795886485468/8.0), - REAL_CONST(12836.986281078653/8.0), - REAL_CONST(12851.180598379744/8.0), - REAL_CONST(12865.378836221802/8.0), - REAL_CONST(12879.580992440871/8.0), - REAL_CONST(12893.787064875984/8.0), - REAL_CONST(12907.997051369144/8.0), - REAL_CONST(12922.210949765335/8.0), - REAL_CONST(12936.428757912496/8.0), - REAL_CONST(12950.650473661524/8.0), - REAL_CONST(12964.876094866273/8.0), - REAL_CONST(12979.105619383534/8.0), - REAL_CONST(12993.339045073039/8.0), - REAL_CONST(13007.576369797454/8.0), - REAL_CONST(13021.817591422368/8.0), - REAL_CONST(13036.062707816285/8.0), - REAL_CONST(13050.311716850629/8.0), - REAL_CONST(13064.564616399723/8.0), - REAL_CONST(13078.821404340792/8.0), - REAL_CONST(13093.082078553954/8.0), - REAL_CONST(13107.346636922217/8.0), - REAL_CONST(13121.615077331464/8.0), - REAL_CONST(13135.887397670458/8.0), - REAL_CONST(13150.163595830827/8.0), - REAL_CONST(13164.44366970706/8.0), - REAL_CONST(13178.727617196502/8.0), - REAL_CONST(13193.015436199352/8.0), - REAL_CONST(13207.307124618648/8.0), - REAL_CONST(13221.602680360265/8.0), - REAL_CONST(13235.902101332911/8.0), - REAL_CONST(13250.205385448118/8.0), - REAL_CONST(13264.512530620239/8.0), - REAL_CONST(13278.823534766434/8.0), - REAL_CONST(13293.138395806676/8.0), - REAL_CONST(13307.457111663734/8.0), - REAL_CONST(13321.779680263176/8.0), - REAL_CONST(13336.106099533356/8.0), - REAL_CONST(13350.436367405409/8.0), - REAL_CONST(13364.77048181325/8.0), - REAL_CONST(13379.108440693562/8.0), - REAL_CONST(13393.450241985796/8.0), - REAL_CONST(13407.795883632158/8.0), - REAL_CONST(13422.145363577607/8.0), - REAL_CONST(13436.498679769853/8.0), - REAL_CONST(13450.855830159346/8.0), - REAL_CONST(13465.216812699266/8.0), - REAL_CONST(13479.581625345529/8.0), - REAL_CONST(13493.950266056772/8.0), - REAL_CONST(13508.32273279435/8.0), - REAL_CONST(13522.699023522329/8.0), - REAL_CONST(13537.079136207483/8.0), - REAL_CONST(13551.463068819286/8.0), - REAL_CONST(13565.850819329906/8.0), - REAL_CONST(13580.2423857142/8.0), - REAL_CONST(13594.63776594971/8.0), - REAL_CONST(13609.036958016657/8.0), - REAL_CONST(13623.439959897927/8.0), - REAL_CONST(13637.846769579081/8.0), - REAL_CONST(13652.257385048335/8.0), - REAL_CONST(13666.67180429656/8.0), - REAL_CONST(13681.090025317284/8.0), - REAL_CONST(13695.512046106669/8.0), - REAL_CONST(13709.937864663521/8.0), - REAL_CONST(13724.367478989278/8.0), - REAL_CONST(13738.800887088004/8.0), - REAL_CONST(13753.238086966385/8.0), - REAL_CONST(13767.679076633727/8.0), - REAL_CONST(13782.123854101939/8.0), - REAL_CONST(13796.572417385545/8.0), - REAL_CONST(13811.024764501659/8.0), - REAL_CONST(13825.480893469998/8.0), - REAL_CONST(13839.94080231286/8.0), - REAL_CONST(13854.404489055134/8.0), - REAL_CONST(13868.871951724283/8.0), - REAL_CONST(13883.34318835034/8.0), - REAL_CONST(13897.818196965914/8.0), - REAL_CONST(13912.296975606168/8.0), - REAL_CONST(13926.779522308825/8.0), - REAL_CONST(13941.26583511416/8.0), - REAL_CONST(13955.755912064991/8.0), - REAL_CONST(13970.249751206682/8.0), - REAL_CONST(13984.747350587126/8.0), - REAL_CONST(13999.248708256751/8.0), - REAL_CONST(14013.753822268511/8.0), - REAL_CONST(14028.262690677873/8.0), - REAL_CONST(14042.775311542828/8.0), - REAL_CONST(14057.291682923867/8.0), - REAL_CONST(14071.811802883994/8.0), - REAL_CONST(14086.335669488704/8.0), - REAL_CONST(14100.863280805994/8.0), - REAL_CONST(14115.394634906341/8.0), - REAL_CONST(14129.92972986271/8.0), - REAL_CONST(14144.468563750548/8.0), - REAL_CONST(14159.01113464777/8.0), - REAL_CONST(14173.55744063476/8.0), - REAL_CONST(14188.107479794369/8.0), - REAL_CONST(14202.661250211901/8.0), - REAL_CONST(14217.218749975118/8.0), - REAL_CONST(14231.779977174227/8.0), - REAL_CONST(14246.344929901879/8.0), - REAL_CONST(14260.913606253163/8.0), - REAL_CONST(14275.486004325601/8.0), - REAL_CONST(14290.062122219146/8.0), - REAL_CONST(14304.641958036171/8.0), - REAL_CONST(14319.225509881464/8.0), - REAL_CONST(14333.812775862236/8.0), - REAL_CONST(14348.403754088098/8.0), - REAL_CONST(14362.998442671067/8.0), - REAL_CONST(14377.59683972556/8.0), - REAL_CONST(14392.198943368388/8.0), - REAL_CONST(14406.804751718748/8.0), - REAL_CONST(14421.414262898223/8.0), - REAL_CONST(14436.027475030774/8.0), - REAL_CONST(14450.64438624274/8.0), - REAL_CONST(14465.264994662828/8.0), - REAL_CONST(14479.889298422106/8.0), - REAL_CONST(14494.517295654005/8.0), - REAL_CONST(14509.148984494313/8.0), - REAL_CONST(14523.784363081166/8.0), - REAL_CONST(14538.423429555049/8.0), - REAL_CONST(14553.066182058781/8.0), - REAL_CONST(14567.712618737527/8.0), - REAL_CONST(14582.362737738777/8.0), - REAL_CONST(14597.016537212348/8.0), - REAL_CONST(14611.674015310382/8.0), - REAL_CONST(14626.33517018734/8.0), - REAL_CONST(14640.999999999993/8.0), - REAL_CONST(14655.668502907418/8.0), - REAL_CONST(14670.340677071003/8.0), - REAL_CONST(14685.016520654426/8.0), - REAL_CONST(14699.696031823671/8.0), - REAL_CONST(14714.379208746999/8.0), - REAL_CONST(14729.066049594967/8.0), - REAL_CONST(14743.756552540408/8.0), - REAL_CONST(14758.45071575843/8.0), - REAL_CONST(14773.148537426418/8.0), - REAL_CONST(14787.850015724018/8.0), - REAL_CONST(14802.555148833142/8.0), - REAL_CONST(14817.263934937961/8.0), - REAL_CONST(14831.976372224897/8.0), - REAL_CONST(14846.692458882624/8.0), - REAL_CONST(14861.41219310206/8.0), - REAL_CONST(14876.135573076363/8.0), - REAL_CONST(14890.862597000923/8.0), - REAL_CONST(14905.593263073371/8.0), - REAL_CONST(14920.327569493558/8.0), - REAL_CONST(14935.065514463557/8.0), - REAL_CONST(14949.807096187662/8.0), - REAL_CONST(14964.552312872382/8.0), - REAL_CONST(14979.301162726431/8.0), - REAL_CONST(14994.053643960735/8.0), - REAL_CONST(15008.809754788414/8.0), - REAL_CONST(15023.569493424788/8.0), - REAL_CONST(15038.332858087369/8.0), - REAL_CONST(15053.099846995858/8.0), - REAL_CONST(15067.870458372134/8.0), - REAL_CONST(15082.644690440264/8.0), - REAL_CONST(15097.422541426484/8.0), - REAL_CONST(15112.204009559202/8.0), - REAL_CONST(15126.989093068994/8.0), - REAL_CONST(15141.777790188597/8.0), - REAL_CONST(15156.570099152905/8.0), - REAL_CONST(15171.366018198967/8.0), - REAL_CONST(15186.165545565986/8.0), - REAL_CONST(15200.968679495301/8.0), - REAL_CONST(15215.775418230402/8.0), - REAL_CONST(15230.585760016909/8.0), - REAL_CONST(15245.399703102579/8.0), - REAL_CONST(15260.217245737298/8.0), - REAL_CONST(15275.038386173073/8.0), - REAL_CONST(15289.863122664035/8.0), - REAL_CONST(15304.691453466432/8.0), - REAL_CONST(15319.523376838621/8.0), - REAL_CONST(15334.358891041069/8.0), - REAL_CONST(15349.197994336346/8.0), - REAL_CONST(15364.040684989128/8.0), - REAL_CONST(15378.886961266177/8.0), - REAL_CONST(15393.736821436356/8.0), - REAL_CONST(15408.590263770609/8.0), - REAL_CONST(15423.447286541972/8.0), - REAL_CONST(15438.307888025554/8.0), - REAL_CONST(15453.172066498542/8.0), - REAL_CONST(15468.039820240196/8.0), - REAL_CONST(15482.91114753184/8.0), - REAL_CONST(15497.786046656869/8.0), - REAL_CONST(15512.664515900733/8.0), - REAL_CONST(15527.546553550939/8.0), - REAL_CONST(15542.432157897045/8.0), - REAL_CONST(15557.32132723066/8.0), - REAL_CONST(15572.214059845435/8.0), - REAL_CONST(15587.110354037064/8.0), - REAL_CONST(15602.010208103273/8.0), - REAL_CONST(15616.913620343823/8.0), - REAL_CONST(15631.820589060506/8.0), - REAL_CONST(15646.731112557136/8.0), - REAL_CONST(15661.645189139546/8.0), - REAL_CONST(15676.562817115593/8.0), - REAL_CONST(15691.483994795139/8.0), - REAL_CONST(15706.408720490062/8.0), - REAL_CONST(15721.336992514242/8.0), - REAL_CONST(15736.268809183561/8.0), - REAL_CONST(15751.204168815901/8.0), - REAL_CONST(15766.143069731135/8.0), - REAL_CONST(15781.085510251132/8.0), - REAL_CONST(15796.03148869974/8.0), - REAL_CONST(15810.981003402798/8.0), - REAL_CONST(15825.934052688119/8.0), - REAL_CONST(15840.890634885489/8.0), - REAL_CONST(15855.850748326673/8.0), - REAL_CONST(15870.814391345401/8.0), - REAL_CONST(15885.781562277361/8.0), - REAL_CONST(15900.752259460214/8.0), - REAL_CONST(15915.726481233565/8.0), - REAL_CONST(15930.704225938984/8.0), - REAL_CONST(15945.685491919978/8.0), - REAL_CONST(15960.670277522009/8.0), - REAL_CONST(15975.658581092481/8.0), - REAL_CONST(15990.65040098073/8.0), - REAL_CONST(16005.645735538035/8.0), - REAL_CONST(16020.644583117599/8.0), - REAL_CONST(16035.646942074556/8.0), - REAL_CONST(16050.652810765967/8.0), - REAL_CONST(16065.662187550806/8.0), - REAL_CONST(16080.675070789974/8.0), - REAL_CONST(16095.691458846273/8.0), - REAL_CONST(16110.711350084424/8.0), - REAL_CONST(16125.734742871053/8.0), - REAL_CONST(16140.761635574685/8.0), - REAL_CONST(16155.792026565747/8.0), - REAL_CONST(16170.825914216561/8.0), - REAL_CONST(16185.863296901338/8.0), - REAL_CONST(16200.904172996183/8.0), - REAL_CONST(16215.948540879079/8.0), - REAL_CONST(16230.996398929899/8.0), - REAL_CONST(16246.047745530386/8.0), - REAL_CONST(16261.102579064163/8.0), - REAL_CONST(16276.160897916721/8.0), - REAL_CONST(16291.22270047542/8.0), - REAL_CONST(16306.287985129484/8.0), - REAL_CONST(16321.356750269995/8.0), - REAL_CONST(16336.428994289896/8.0), - REAL_CONST(16351.504715583982/8.0), - REAL_CONST(16366.5839125489/8.0), - REAL_CONST(16381.666583583141/8.0), - REAL_CONST(16396.752727087041/8.0), - REAL_CONST(16411.842341462776/8.0), - REAL_CONST(16426.935425114363/8.0), - REAL_CONST(16442.031976447644/8.0), - REAL_CONST(16457.131993870298/8.0), - REAL_CONST(16472.235475791829/8.0), - REAL_CONST(16487.342420623561/8.0), - REAL_CONST(16502.452826778641/8.0), - REAL_CONST(16517.566692672033/8.0), - REAL_CONST(16532.684016720516/8.0), - REAL_CONST(16547.804797342676/8.0), - REAL_CONST(16562.929032958902/8.0), - REAL_CONST(16578.056721991394/8.0), - REAL_CONST(16593.18786286415/8.0), - REAL_CONST(16608.322454002962/8.0), - REAL_CONST(16623.460493835417/8.0), - REAL_CONST(16638.601980790896/8.0), - REAL_CONST(16653.746913300558/8.0), - REAL_CONST(16668.895289797354/8.0), - REAL_CONST(16684.047108716015/8.0), - REAL_CONST(16699.202368493046/8.0), - REAL_CONST(16714.361067566726/8.0), - REAL_CONST(16729.523204377107/8.0), - REAL_CONST(16744.688777366009/8.0), - REAL_CONST(16759.857784977012/8.0), - REAL_CONST(16775.030225655464/8.0), - REAL_CONST(16790.206097848466/8.0), - REAL_CONST(16805.385400004874/8.0), - REAL_CONST(16820.568130575302/8.0), - REAL_CONST(16835.754288012104/8.0), - REAL_CONST(16850.943870769381/8.0), - REAL_CONST(16866.136877302983/8.0), - REAL_CONST(16881.333306070494/8.0), - REAL_CONST(16896.53315553123/8.0), - REAL_CONST(16911.736424146249/8.0), - REAL_CONST(16926.943110378332/8.0), - REAL_CONST(16942.153212691992/8.0), - REAL_CONST(16957.366729553454/8.0), - REAL_CONST(16972.583659430682/8.0), - REAL_CONST(16987.804000793338/8.0), - REAL_CONST(17003.027752112816/8.0), - REAL_CONST(17018.254911862205/8.0), - REAL_CONST(17033.485478516312/8.0), - REAL_CONST(17048.719450551645/8.0), - REAL_CONST(17063.956826446421/8.0), - REAL_CONST(17079.197604680547/8.0), - REAL_CONST(17094.44178373563/8.0), - REAL_CONST(17109.689362094967/8.0), - REAL_CONST(17124.940338243552/8.0), - REAL_CONST(17140.194710668064/8.0), - REAL_CONST(17155.452477856852/8.0), - REAL_CONST(17170.713638299967/8.0), - REAL_CONST(17185.978190489128/8.0), - REAL_CONST(17201.246132917724/8.0), - REAL_CONST(17216.517464080825/8.0), - REAL_CONST(17231.792182475165/8.0), - REAL_CONST(17247.070286599141/8.0), - REAL_CONST(17262.351774952826/8.0), - REAL_CONST(17277.636646037936/8.0), - REAL_CONST(17292.924898357855/8.0), - REAL_CONST(17308.216530417623/8.0), - REAL_CONST(17323.511540723921/8.0), - REAL_CONST(17338.809927785089/8.0), - REAL_CONST(17354.111690111105/8.0), - REAL_CONST(17369.416826213594/8.0), - REAL_CONST(17384.725334605821/8.0), - REAL_CONST(17400.037213802683/8.0), - REAL_CONST(17415.352462320716/8.0), - REAL_CONST(17430.67107867809/8.0), - REAL_CONST(17445.993061394587/8.0), - REAL_CONST(17461.318408991636/8.0), - REAL_CONST(17476.647119992274/8.0), - REAL_CONST(17491.979192921168/8.0), - REAL_CONST(17507.314626304586/8.0), - REAL_CONST(17522.653418670423/8.0), - REAL_CONST(17537.995568548187/8.0), - REAL_CONST(17553.341074468986/8.0), - REAL_CONST(17568.689934965536/8.0), - REAL_CONST(17584.042148572156/8.0), - REAL_CONST(17599.397713824768/8.0), - REAL_CONST(17614.75662926089/8.0), - REAL_CONST(17630.118893419625/8.0), - REAL_CONST(17645.484504841683/8.0), - REAL_CONST(17660.853462069354/8.0), - REAL_CONST(17676.225763646511/8.0), - REAL_CONST(17691.601408118619/8.0), - REAL_CONST(17706.980394032718/8.0), - REAL_CONST(17722.362719937424/8.0), - REAL_CONST(17737.748384382936/8.0), - REAL_CONST(17753.137385921014/8.0), - REAL_CONST(17768.529723104999/8.0), - REAL_CONST(17783.92539448979/8.0), - REAL_CONST(17799.324398631856/8.0), - REAL_CONST(17814.726734089225/8.0), - REAL_CONST(17830.13239942148/8.0), - REAL_CONST(17845.541393189767/8.0), - REAL_CONST(17860.95371395678/8.0), - REAL_CONST(17876.369360286772/8.0), - REAL_CONST(17891.788330745527/8.0), - REAL_CONST(17907.210623900395/8.0), - REAL_CONST(17922.636238320254/8.0), - REAL_CONST(17938.065172575527/8.0), - REAL_CONST(17953.497425238176/8.0), - REAL_CONST(17968.932994881692/8.0), - REAL_CONST(17984.371880081104/8.0), - REAL_CONST(17999.814079412972/8.0), - REAL_CONST(18015.259591455371/8.0), - REAL_CONST(18030.708414787914/8.0), - REAL_CONST(18046.160547991731/8.0), - REAL_CONST(18061.615989649465/8.0), - REAL_CONST(18077.074738345284/8.0), - REAL_CONST(18092.536792664861/8.0), - REAL_CONST(18108.002151195393/8.0), - REAL_CONST(18123.470812525571/8.0), - REAL_CONST(18138.942775245599/8.0), - REAL_CONST(18154.418037947191/8.0), - REAL_CONST(18169.896599223546/8.0), - REAL_CONST(18185.37845766938/8.0), - REAL_CONST(18200.863611880886/8.0), - REAL_CONST(18216.352060455767/8.0), - REAL_CONST(18231.843801993204/8.0), - REAL_CONST(18247.338835093873/8.0), - REAL_CONST(18262.837158359936/8.0), - REAL_CONST(18278.338770395032/8.0), - REAL_CONST(18293.84366980429/8.0), - REAL_CONST(18309.351855194309/8.0), - REAL_CONST(18324.863325173166/8.0), - REAL_CONST(18340.378078350412/8.0), - REAL_CONST(18355.896113337069/8.0), - REAL_CONST(18371.417428745623/8.0), - REAL_CONST(18386.942023190033/8.0), - REAL_CONST(18402.469895285718/8.0), - REAL_CONST(18418.00104364955/8.0), - REAL_CONST(18433.53546689987/8.0), - REAL_CONST(18449.073163656474/8.0), - REAL_CONST(18464.614132540602/8.0), - REAL_CONST(18480.158372174956/8.0), - REAL_CONST(18495.705881183676/8.0), - REAL_CONST(18511.256658192357/8.0), - REAL_CONST(18526.810701828035/8.0), - REAL_CONST(18542.368010719183/8.0), - REAL_CONST(18557.928583495715/8.0), - REAL_CONST(18573.492418788985/8.0), - REAL_CONST(18589.059515231773/8.0), - REAL_CONST(18604.629871458303/8.0), - REAL_CONST(18620.203486104212/8.0), - REAL_CONST(18635.78035780658/8.0), - REAL_CONST(18651.360485203899/8.0), - REAL_CONST(18666.943866936086/8.0), - REAL_CONST(18682.53050164448/8.0), - REAL_CONST(18698.120387971841/8.0), - REAL_CONST(18713.713524562332/8.0), - REAL_CONST(18729.30991006154/8.0), - REAL_CONST(18744.909543116457/8.0), - REAL_CONST(18760.512422375479/8.0), - REAL_CONST(18776.118546488418/8.0), - REAL_CONST(18791.727914106479/8.0), - REAL_CONST(18807.340523882274/8.0), - REAL_CONST(18822.95637446981/8.0), - REAL_CONST(18838.575464524489/8.0), - REAL_CONST(18854.197792703111/8.0), - REAL_CONST(18869.823357663863/8.0), - REAL_CONST(18885.452158066328/8.0), - REAL_CONST(18901.08419257147/8.0), - REAL_CONST(18916.719459841639/8.0), - REAL_CONST(18932.357958540564/8.0), - REAL_CONST(18947.999687333362/8.0), - REAL_CONST(18963.644644886521/8.0), - REAL_CONST(18979.292829867907/8.0), - REAL_CONST(18994.944240946759/8.0), - REAL_CONST(19010.598876793687/8.0), - REAL_CONST(19026.256736080668/8.0), - REAL_CONST(19041.917817481048/8.0), - REAL_CONST(19057.582119669532/8.0), - REAL_CONST(19073.2496413222/8.0), - REAL_CONST(19088.920381116473/8.0), - REAL_CONST(19104.594337731145/8.0), - REAL_CONST(19120.271509846356/8.0), - REAL_CONST(19135.951896143604/8.0), - REAL_CONST(19151.635495305738/8.0), - REAL_CONST(19167.322306016948/8.0), - REAL_CONST(19183.012326962784/8.0), - REAL_CONST(19198.705556830122/8.0), - REAL_CONST(19214.401994307198/8.0), - REAL_CONST(19230.101638083579/8.0), - REAL_CONST(19245.804486850167/8.0), - REAL_CONST(19261.510539299208/8.0), - REAL_CONST(19277.219794124274/8.0), - REAL_CONST(19292.932250020265/8.0), - REAL_CONST(19308.647905683421/8.0), - REAL_CONST(19324.366759811302/8.0), - REAL_CONST(19340.088811102793/8.0), - REAL_CONST(19355.8140582581/8.0), - REAL_CONST(19371.542499978754/8.0), - REAL_CONST(19387.2741349676/8.0), - REAL_CONST(19403.008961928797/8.0), - REAL_CONST(19418.746979567823/8.0), - REAL_CONST(19434.488186591469/8.0), - REAL_CONST(19450.232581707827/8.0), - REAL_CONST(19465.980163626304/8.0), - REAL_CONST(19481.730931057613/8.0), - REAL_CONST(19497.484882713761/8.0), - REAL_CONST(19513.242017308068/8.0), - REAL_CONST(19529.002333555141/8.0), - REAL_CONST(19544.765830170898/8.0), - REAL_CONST(19560.532505872539/8.0), - REAL_CONST(19576.302359378566/8.0), - REAL_CONST(19592.075389408761/8.0), - REAL_CONST(19607.851594684209/8.0), - REAL_CONST(19623.630973927269/8.0), - REAL_CONST(19639.41352586159/8.0), - REAL_CONST(19655.199249212103/8.0), - REAL_CONST(19670.988142705017/8.0), - REAL_CONST(19686.780205067826/8.0), - REAL_CONST(19702.575435029288/8.0), - REAL_CONST(19718.373831319448/8.0), - REAL_CONST(19734.175392669615/8.0), - REAL_CONST(19749.980117812371/8.0), - REAL_CONST(19765.788005481569/8.0), - REAL_CONST(19781.599054412323/8.0), - REAL_CONST(19797.413263341008/8.0), - REAL_CONST(19813.230631005274/8.0), - REAL_CONST(19829.051156144014/8.0), - REAL_CONST(19844.874837497395/8.0), - REAL_CONST(19860.701673806827/8.0), - REAL_CONST(19876.531663814985/8.0), - REAL_CONST(19892.364806265789/8.0), - REAL_CONST(19908.201099904403/8.0), - REAL_CONST(19924.040543477258/8.0), - REAL_CONST(19939.883135732012/8.0), - REAL_CONST(19955.728875417579/8.0), - REAL_CONST(19971.577761284105/8.0), - REAL_CONST(19987.429792082985/8.0), - REAL_CONST(20003.284966566847/8.0), - REAL_CONST(20019.14328348956/8.0), - REAL_CONST(20035.004741606219/8.0), - REAL_CONST(20050.869339673161/8.0), - REAL_CONST(20066.737076447946/8.0), - REAL_CONST(20082.607950689362/8.0), - REAL_CONST(20098.481961157428/8.0), - REAL_CONST(20114.359106613385/8.0), - REAL_CONST(20130.239385819699/8.0), - REAL_CONST(20146.122797540058/8.0), - REAL_CONST(20162.009340539353/8.0), - REAL_CONST(20177.899013583716/8.0), - REAL_CONST(20193.791815440476/8.0), - REAL_CONST(20209.687744878182/8.0), - REAL_CONST(20225.586800666591/8.0), - REAL_CONST(20241.488981576669/8.0), - REAL_CONST(20257.394286380597/8.0), - REAL_CONST(20273.302713851754/8.0), - REAL_CONST(20289.214262764715/8.0), - REAL_CONST(20305.128931895277/8.0), - REAL_CONST(20321.046720020415/8.0), - REAL_CONST(20336.967625918318/8.0), - REAL_CONST(20352.891648368361/8.0), - REAL_CONST(20368.818786151114/8.0), - REAL_CONST(20384.749038048347/8.0), - REAL_CONST(20400.682402843009/8.0), - REAL_CONST(20416.618879319249/8.0), - REAL_CONST(20432.558466262391/8.0), - REAL_CONST(20448.501162458953/8.0), - REAL_CONST(20464.446966696629/8.0), - REAL_CONST(20480.395877764302/8.0), - REAL_CONST(20496.347894452025/8.0), - REAL_CONST(20512.303015551031/8.0), - REAL_CONST(20528.261239853735/8.0), - REAL_CONST(20544.22256615372/8.0), - REAL_CONST(20560.186993245738/8.0), - REAL_CONST(20576.15451992572/8.0), - REAL_CONST(20592.125144990758/8.0), - REAL_CONST(20608.098867239107/8.0), - REAL_CONST(20624.075685470198/8.0), - REAL_CONST(20640.055598484618/8.0), - REAL_CONST(20656.038605084115/8.0), - REAL_CONST(20672.024704071595/8.0), - REAL_CONST(20688.013894251126/8.0), - REAL_CONST(20704.006174427926/8.0), - REAL_CONST(20720.001543408373/8.0), - REAL_CONST(20735.999999999989/8.0), - REAL_CONST(20752.001543011454/8.0), - REAL_CONST(20768.006171252597/8.0), - REAL_CONST(20784.013883534382/8.0), - REAL_CONST(20800.024678668931/8.0), - REAL_CONST(20816.038555469506/8.0), - REAL_CONST(20832.055512750507/8.0), - REAL_CONST(20848.075549327474/8.0), - REAL_CONST(20864.098664017085/8.0), - REAL_CONST(20880.124855637161/8.0), - REAL_CONST(20896.154123006647/8.0), - REAL_CONST(20912.186464945626/8.0), - REAL_CONST(20928.221880275312/8.0), - REAL_CONST(20944.260367818049/8.0), - REAL_CONST(20960.301926397311/8.0), - REAL_CONST(20976.346554837684/8.0), - REAL_CONST(20992.394251964895/8.0), - REAL_CONST(21008.445016605787/8.0), - REAL_CONST(21024.498847588318/8.0), - REAL_CONST(21040.555743741574/8.0), - REAL_CONST(21056.615703895754/8.0), - REAL_CONST(21072.678726882168/8.0), - REAL_CONST(21088.744811533252/8.0), - REAL_CONST(21104.813956682538/8.0), - REAL_CONST(21120.886161164683/8.0), - REAL_CONST(21136.961423815443/8.0), - REAL_CONST(21153.039743471683/8.0), - REAL_CONST(21169.121118971379/8.0), - REAL_CONST(21185.205549153605/8.0), - REAL_CONST(21201.293032858535/8.0), - REAL_CONST(21217.383568927453/8.0), - REAL_CONST(21233.477156202731/8.0), - REAL_CONST(21249.573793527841/8.0), - REAL_CONST(21265.673479747358/8.0), - REAL_CONST(21281.776213706937/8.0), - REAL_CONST(21297.881994253334/8.0), - REAL_CONST(21313.990820234398/8.0), - REAL_CONST(21330.102690499054/8.0), - REAL_CONST(21346.21760389733/8.0), - REAL_CONST(21362.335559280327/8.0), - REAL_CONST(21378.456555500241/8.0), - REAL_CONST(21394.580591410333/8.0), - REAL_CONST(21410.707665864964/8.0), - REAL_CONST(21426.83777771956/8.0), - REAL_CONST(21442.970925830628/8.0), - REAL_CONST(21459.107109055756/8.0), - REAL_CONST(21475.246326253604/8.0), - REAL_CONST(21491.388576283895/8.0), - REAL_CONST(21507.533858007431/8.0), - REAL_CONST(21523.682170286087/8.0), - REAL_CONST(21539.833511982797/8.0), - REAL_CONST(21555.987881961566/8.0), - REAL_CONST(21572.145279087465/8.0), - REAL_CONST(21588.305702226615/8.0), - REAL_CONST(21604.469150246216/8.0), - REAL_CONST(21620.635622014521/8.0), - REAL_CONST(21636.805116400832/8.0), - REAL_CONST(21652.977632275521/8.0), - REAL_CONST(21669.153168510009/8.0), - REAL_CONST(21685.331723976764/8.0), - REAL_CONST(21701.513297549318/8.0), - REAL_CONST(21717.697888102244/8.0), - REAL_CONST(21733.885494511167/8.0), - REAL_CONST(21750.076115652759/8.0), - REAL_CONST(21766.269750404736/8.0), - REAL_CONST(21782.466397645861/8.0), - REAL_CONST(21798.666056255934/8.0), - REAL_CONST(21814.868725115801/8.0), - REAL_CONST(21831.074403107345/8.0), - REAL_CONST(21847.283089113484/8.0), - REAL_CONST(21863.494782018177/8.0), - REAL_CONST(21879.709480706417/8.0), - REAL_CONST(21895.927184064229/8.0), - REAL_CONST(21912.147890978667/8.0), - REAL_CONST(21928.371600337818/8.0), - REAL_CONST(21944.598311030797/8.0), - REAL_CONST(21960.828021947746/8.0), - REAL_CONST(21977.060731979829/8.0), - REAL_CONST(21993.296440019243/8.0), - REAL_CONST(22009.535144959198/8.0), - REAL_CONST(22025.77684569393/8.0), - REAL_CONST(22042.021541118691/8.0), - REAL_CONST(22058.269230129757/8.0), - REAL_CONST(22074.519911624411/8.0), - REAL_CONST(22090.773584500959/8.0), - REAL_CONST(22107.030247658717/8.0), - REAL_CONST(22123.289899998013/8.0), - REAL_CONST(22139.552540420187/8.0), - REAL_CONST(22155.818167827587/8.0), - REAL_CONST(22172.086781123569/8.0), - REAL_CONST(22188.358379212495/8.0), - REAL_CONST(22204.632960999726/8.0), - REAL_CONST(22220.910525391639/8.0), - REAL_CONST(22237.191071295601/8.0), - REAL_CONST(22253.474597619981/8.0), - REAL_CONST(22269.761103274148/8.0), - REAL_CONST(22286.050587168469/8.0), - REAL_CONST(22302.343048214312/8.0), - REAL_CONST(22318.638485324027/8.0), - REAL_CONST(22334.936897410968/8.0), - REAL_CONST(22351.23828338947/8.0), - REAL_CONST(22367.542642174871/8.0), - REAL_CONST(22383.849972683485/8.0), - REAL_CONST(22400.160273832618/8.0), - REAL_CONST(22416.473544540564/8.0), - REAL_CONST(22432.789783726603/8.0), - REAL_CONST(22449.108990310986/8.0), - REAL_CONST(22465.431163214958/8.0), - REAL_CONST(22481.75630136074/8.0), - REAL_CONST(22498.084403671528/8.0), - REAL_CONST(22514.415469071497/8.0), - REAL_CONST(22530.749496485802/8.0), - REAL_CONST(22547.086484840562/8.0), - REAL_CONST(22563.426433062879/8.0), - REAL_CONST(22579.769340080824/8.0), - REAL_CONST(22596.115204823436/8.0), - REAL_CONST(22612.464026220721/8.0), - REAL_CONST(22628.815803203655/8.0), - REAL_CONST(22645.170534704179/8.0), - REAL_CONST(22661.5282196552/8.0), - REAL_CONST(22677.888856990587/8.0), - REAL_CONST(22694.252445645168/8.0), - REAL_CONST(22710.618984554734/8.0), - REAL_CONST(22726.988472656034/8.0), - REAL_CONST(22743.360908886778/8.0), - REAL_CONST(22759.736292185622/8.0), - REAL_CONST(22776.114621492186/8.0), - REAL_CONST(22792.495895747044/8.0), - REAL_CONST(22808.880113891719/8.0), - REAL_CONST(22825.267274868678/8.0), - REAL_CONST(22841.657377621348/8.0), - REAL_CONST(22858.050421094096/8.0), - REAL_CONST(22874.446404232243/8.0), - REAL_CONST(22890.845325982053/8.0), - REAL_CONST(22907.247185290722/8.0), - REAL_CONST(22923.651981106406/8.0), - REAL_CONST(22940.059712378195/8.0), - REAL_CONST(22956.470378056114/8.0), - REAL_CONST(22972.883977091129/8.0), - REAL_CONST(22989.300508435153/8.0), - REAL_CONST(23005.719971041017/8.0), - REAL_CONST(23022.142363862498/8.0), - REAL_CONST(23038.567685854305/8.0), - REAL_CONST(23054.995935972078/8.0), - REAL_CONST(23071.427113172387/8.0), - REAL_CONST(23087.86121641273/8.0), - REAL_CONST(23104.298244651531/8.0), - REAL_CONST(23120.738196848146/8.0), - REAL_CONST(23137.181071962848/8.0), - REAL_CONST(23153.626868956846/8.0), - REAL_CONST(23170.075586792263/8.0), - REAL_CONST(23186.527224432142/8.0), - REAL_CONST(23202.981780840448/8.0), - REAL_CONST(23219.439254982066/8.0), - REAL_CONST(23235.899645822796/8.0), - REAL_CONST(23252.362952329357/8.0), - REAL_CONST(23268.829173469378/8.0), - REAL_CONST(23285.298308211408/8.0), - REAL_CONST(23301.770355524899/8.0), - REAL_CONST(23318.245314380223/8.0), - REAL_CONST(23334.723183748658/8.0), - REAL_CONST(23351.203962602387/8.0), - REAL_CONST(23367.687649914504/8.0), - REAL_CONST(23384.174244659007/8.0), - REAL_CONST(23400.663745810798/8.0), - REAL_CONST(23417.15615234568/8.0), - REAL_CONST(23433.651463240367/8.0), - REAL_CONST(23450.149677472462/8.0), - REAL_CONST(23466.650794020472/8.0), - REAL_CONST(23483.154811863806/8.0), - REAL_CONST(23499.661729982763/8.0), - REAL_CONST(23516.171547358543/8.0), - REAL_CONST(23532.684262973235/8.0), - REAL_CONST(23549.199875809823/8.0), - REAL_CONST(23565.718384852185/8.0), - REAL_CONST(23582.239789085092/8.0), - REAL_CONST(23598.764087494197/8.0), - REAL_CONST(23615.291279066041/8.0), - REAL_CONST(23631.821362788058/8.0), - REAL_CONST(23648.354337648565/8.0), - REAL_CONST(23664.890202636761/8.0), - REAL_CONST(23681.428956742733/8.0), - REAL_CONST(23697.970598957443/8.0), - REAL_CONST(23714.515128272738/8.0), - REAL_CONST(23731.062543681343/8.0), - REAL_CONST(23747.612844176863/8.0), - REAL_CONST(23764.166028753778/8.0), - REAL_CONST(23780.72209640744/8.0), - REAL_CONST(23797.281046134085/8.0), - REAL_CONST(23813.842876930816/8.0), - REAL_CONST(23830.407587795606/8.0), - REAL_CONST(23846.975177727301/8.0), - REAL_CONST(23863.545645725622/8.0), - REAL_CONST(23880.11899079115/8.0), - REAL_CONST(23896.695211925336/8.0), - REAL_CONST(23913.274308130498/8.0), - REAL_CONST(23929.856278409821/8.0), - REAL_CONST(23946.441121767348/8.0), - REAL_CONST(23963.028837207989/8.0), - REAL_CONST(23979.619423737513/8.0), - REAL_CONST(23996.212880362549/8.0), - REAL_CONST(24012.809206090584/8.0), - REAL_CONST(24029.408399929966/8.0), - REAL_CONST(24046.010460889898/8.0), - REAL_CONST(24062.615387980433/8.0), - REAL_CONST(24079.223180212492/8.0), - REAL_CONST(24095.833836597827/8.0), - REAL_CONST(24112.447356149063/8.0), - REAL_CONST(24129.063737879667/8.0), - REAL_CONST(24145.682980803951/8.0), - REAL_CONST(24162.305083937081/8.0), - REAL_CONST(24178.930046295067/8.0), - REAL_CONST(24195.557866894767/8.0), - REAL_CONST(24212.188544753884/8.0), - REAL_CONST(24228.822078890964/8.0), - REAL_CONST(24245.458468325389/8.0), - REAL_CONST(24262.097712077397/8.0), - REAL_CONST(24278.739809168052/8.0), - REAL_CONST(24295.384758619261/8.0), - REAL_CONST(24312.032559453768/8.0), - REAL_CONST(24328.683210695162/8.0), - REAL_CONST(24345.336711367858/8.0), - REAL_CONST(24361.993060497109/8.0), - REAL_CONST(24378.652257108995/8.0), - REAL_CONST(24395.314300230442/8.0), - REAL_CONST(24411.979188889192/8.0), - REAL_CONST(24428.646922113825/8.0), - REAL_CONST(24445.317498933746/8.0), - REAL_CONST(24461.990918379193/8.0), - REAL_CONST(24478.667179481225/8.0), - REAL_CONST(24495.346281271726/8.0), - REAL_CONST(24512.028222783407/8.0), - REAL_CONST(24528.713003049801/8.0), - REAL_CONST(24545.400621105266/8.0), - REAL_CONST(24562.091075984976/8.0), - REAL_CONST(24578.784366724925/8.0), - REAL_CONST(24595.480492361927/8.0), - REAL_CONST(24612.179451933614/8.0), - REAL_CONST(24628.881244478438/8.0), - REAL_CONST(24645.585869035654/8.0), - REAL_CONST(24662.293324645343/8.0), - REAL_CONST(24679.003610348394/8.0), - REAL_CONST(24695.716725186514/8.0), - REAL_CONST(24712.432668202211/8.0), - REAL_CONST(24729.151438438807/8.0), - REAL_CONST(24745.873034940436/8.0), - REAL_CONST(24762.597456752032/8.0), - REAL_CONST(24779.324702919344/8.0), - REAL_CONST(24796.054772488926/8.0), - REAL_CONST(24812.787664508123/8.0), - REAL_CONST(24829.5233780251/8.0), - REAL_CONST(24846.261912088819/8.0), - REAL_CONST(24863.003265749034/8.0), - REAL_CONST(24879.747438056307/8.0), - REAL_CONST(24896.494428062004/8.0), - REAL_CONST(24913.244234818278/8.0), - REAL_CONST(24929.996857378079/8.0), - REAL_CONST(24946.752294795166/8.0), - REAL_CONST(24963.510546124078/8.0), - REAL_CONST(24980.271610420157/8.0), - REAL_CONST(24997.035486739525/8.0), - REAL_CONST(25013.802174139113/8.0), - REAL_CONST(25030.571671676629/8.0), - REAL_CONST(25047.343978410572/8.0), - REAL_CONST(25064.119093400237/8.0), - REAL_CONST(25080.897015705697/8.0), - REAL_CONST(25097.677744387816/8.0), - REAL_CONST(25114.461278508239/8.0), - REAL_CONST(25131.2476171294/8.0), - REAL_CONST(25148.036759314517/8.0), - REAL_CONST(25164.828704127583/8.0), - REAL_CONST(25181.623450633375/8.0), - REAL_CONST(25198.42099789745/8.0), - REAL_CONST(25215.221344986145/8.0), - REAL_CONST(25232.024490966574/8.0), - REAL_CONST(25248.830434906627/8.0), - REAL_CONST(25265.639175874974/8.0), - REAL_CONST(25282.450712941049/8.0), - REAL_CONST(25299.265045175071/8.0), - REAL_CONST(25316.082171648024/8.0), - REAL_CONST(25332.902091431668/8.0), - REAL_CONST(25349.724803598532/8.0), - REAL_CONST(25366.550307221914/8.0), - REAL_CONST(25383.378601375884/8.0), - REAL_CONST(25400.209685135269/8.0), - REAL_CONST(25417.043557575678/8.0), - REAL_CONST(25433.880217773472/8.0), - REAL_CONST(25450.719664805783/8.0), - REAL_CONST(25467.561897750507/8.0), - REAL_CONST(25484.406915686297/8.0), - REAL_CONST(25501.254717692573/8.0), - REAL_CONST(25518.105302849512/8.0), - REAL_CONST(25534.958670238051/8.0), - REAL_CONST(25551.814818939893/8.0), - REAL_CONST(25568.67374803748/8.0), - REAL_CONST(25585.535456614027/8.0), - REAL_CONST(25602.399943753502/8.0), - REAL_CONST(25619.267208540619/8.0), - REAL_CONST(25636.137250060852/8.0), - REAL_CONST(25653.010067400432/8.0), - REAL_CONST(25669.885659646327/8.0), - REAL_CONST(25686.76402588627/8.0), - REAL_CONST(25703.645165208734/8.0), - REAL_CONST(25720.529076702944/8.0), - REAL_CONST(25737.415759458876/8.0), - REAL_CONST(25754.305212567244/8.0), - REAL_CONST(25771.197435119517/8.0), - REAL_CONST(25788.092426207899/8.0), - REAL_CONST(25804.990184925344/8.0), - REAL_CONST(25821.890710365547/8.0), - REAL_CONST(25838.794001622944/8.0), - REAL_CONST(25855.700057792714/8.0), - REAL_CONST(25872.608877970775/8.0), - REAL_CONST(25889.520461253778/8.0), - REAL_CONST(25906.434806739118/8.0), - REAL_CONST(25923.351913524923/8.0), - REAL_CONST(25940.271780710063/8.0), - REAL_CONST(25957.194407394138/8.0), - REAL_CONST(25974.11979267748/8.0), - REAL_CONST(25991.047935661154/8.0), - REAL_CONST(26007.978835446964/8.0), - REAL_CONST(26024.912491137442/8.0), - REAL_CONST(26041.848901835841/8.0), - REAL_CONST(26058.788066646157/8.0), - REAL_CONST(26075.729984673108/8.0), - REAL_CONST(26092.674655022136/8.0), - REAL_CONST(26109.622076799409/8.0), - REAL_CONST(26126.572249111829/8.0), - REAL_CONST(26143.525171067016/8.0), - REAL_CONST(26160.480841773315/8.0), - REAL_CONST(26177.43926033979/8.0), - REAL_CONST(26194.400425876229/8.0), - REAL_CONST(26211.364337493149/8.0), - REAL_CONST(26228.330994301767/8.0), - REAL_CONST(26245.30039541404/8.0), - REAL_CONST(26262.272539942627/8.0), - REAL_CONST(26279.247427000919/8.0), - REAL_CONST(26296.225055703002/8.0), - REAL_CONST(26313.205425163702/8.0), - REAL_CONST(26330.188534498539/8.0), - REAL_CONST(26347.174382823756/8.0), - REAL_CONST(26364.162969256304/8.0), - REAL_CONST(26381.154292913852/8.0), - REAL_CONST(26398.148352914774/8.0), - REAL_CONST(26415.145148378149/8.0), - REAL_CONST(26432.144678423778/8.0), - REAL_CONST(26449.146942172156/8.0), - REAL_CONST(26466.151938744493/8.0), - REAL_CONST(26483.159667262702/8.0), - REAL_CONST(26500.170126849403/8.0), - REAL_CONST(26517.183316627921/8.0), - REAL_CONST(26534.199235722277/8.0), - REAL_CONST(26551.217883257199/8.0), - REAL_CONST(26568.239258358124/8.0), - REAL_CONST(26585.263360151173/8.0), - REAL_CONST(26602.290187763181/8.0), - REAL_CONST(26619.319740321676/8.0), - REAL_CONST(26636.352016954883/8.0), - REAL_CONST(26653.387016791727/8.0), - REAL_CONST(26670.424738961825/8.0), - REAL_CONST(26687.465182595493/8.0), - REAL_CONST(26704.508346823739/8.0), - REAL_CONST(26721.554230778267/8.0), - REAL_CONST(26738.602833591467/8.0), - REAL_CONST(26755.65415439643/8.0), - REAL_CONST(26772.708192326929/8.0), - REAL_CONST(26789.764946517433/8.0), - REAL_CONST(26806.824416103096/8.0), - REAL_CONST(26823.886600219761/8.0), - REAL_CONST(26840.95149800396/8.0), - REAL_CONST(26858.019108592915/8.0), - REAL_CONST(26875.089431124517/8.0), - REAL_CONST(26892.162464737365/8.0), - REAL_CONST(26909.238208570721/8.0), - REAL_CONST(26926.316661764544/8.0), - REAL_CONST(26943.397823459472/8.0), - REAL_CONST(26960.481692796813/8.0), - REAL_CONST(26977.568268918571/8.0), - REAL_CONST(26994.657550967422/8.0), - REAL_CONST(27011.749538086722/8.0), - REAL_CONST(27028.844229420498/8.0), - REAL_CONST(27045.941624113464/8.0), - REAL_CONST(27063.041721311005/8.0), - REAL_CONST(27080.144520159181/8.0), - REAL_CONST(27097.250019804727/8.0), - REAL_CONST(27114.35821939505/8.0), - REAL_CONST(27131.469118078236/8.0), - REAL_CONST(27148.582715003027/8.0), - REAL_CONST(27165.699009318858/8.0), - REAL_CONST(27182.818000175819/8.0), - REAL_CONST(27199.939686724665/8.0), - REAL_CONST(27217.064068116837/8.0), - REAL_CONST(27234.191143504428/8.0), - REAL_CONST(27251.320912040203/8.0), - REAL_CONST(27268.453372877593/8.0), - REAL_CONST(27285.588525170693/8.0), - REAL_CONST(27302.726368074269/8.0), - REAL_CONST(27319.866900743735/8.0), - REAL_CONST(27337.010122335181/8.0), - REAL_CONST(27354.156032005358/8.0), - REAL_CONST(27371.304628911668/8.0), - REAL_CONST(27388.455912212183/8.0), - REAL_CONST(27405.609881065626/8.0), - REAL_CONST(27422.766534631384/8.0), - REAL_CONST(27439.925872069507/8.0), - REAL_CONST(27457.087892540683/8.0), - REAL_CONST(27474.252595206275/8.0), - REAL_CONST(27491.419979228293/8.0), - REAL_CONST(27508.5900437694/8.0), - REAL_CONST(27525.762787992917/8.0), - REAL_CONST(27542.93821106281/8.0), - REAL_CONST(27560.116312143706/8.0), - REAL_CONST(27577.297090400876/8.0), - REAL_CONST(27594.480545000242/8.0), - REAL_CONST(27611.666675108383/8.0), - REAL_CONST(27628.855479892518/8.0), - REAL_CONST(27646.046958520514/8.0), - REAL_CONST(27663.241110160889/8.0), - REAL_CONST(27680.437933982801/8.0), - REAL_CONST(27697.637429156068/8.0), - REAL_CONST(27714.839594851132/8.0), - REAL_CONST(27732.04443023909/8.0), - REAL_CONST(27749.251934491687/8.0), - REAL_CONST(27766.462106781299/8.0), - REAL_CONST(27783.674946280949/8.0), - REAL_CONST(27800.890452164302/8.0), - REAL_CONST(27818.108623605654/8.0), - REAL_CONST(27835.329459779954/8.0), - REAL_CONST(27852.55295986278/8.0), - REAL_CONST(27869.779123030345/8.0), - REAL_CONST(27887.007948459504/8.0), - REAL_CONST(27904.239435327745/8.0), - REAL_CONST(27921.473582813196/8.0), - REAL_CONST(27938.710390094613/8.0), - REAL_CONST(27955.949856351392/8.0), - REAL_CONST(27973.19198076355/8.0), - REAL_CONST(27990.436762511745/8.0), - REAL_CONST(28007.684200777272/8.0), - REAL_CONST(28024.934294742041/8.0), - REAL_CONST(28042.187043588601/8.0), - REAL_CONST(28059.442446500128/8.0), - REAL_CONST(28076.700502660427/8.0), - REAL_CONST(28093.961211253929/8.0), - REAL_CONST(28111.224571465693/8.0), - REAL_CONST(28128.490582481401/8.0), - REAL_CONST(28145.759243487362/8.0), - REAL_CONST(28163.030553670509/8.0), - REAL_CONST(28180.304512218394/8.0), - REAL_CONST(28197.581118319198/8.0), - REAL_CONST(28214.860371161725/8.0), - REAL_CONST(28232.14226993539/8.0), - REAL_CONST(28249.42681383024/8.0), - REAL_CONST(28266.71400203693/8.0), - REAL_CONST(28284.003833746745/8.0), - REAL_CONST(28301.296308151585/8.0), - REAL_CONST(28318.591424443959/8.0), - REAL_CONST(28335.889181817001/8.0), - REAL_CONST(28353.189579464462/8.0), - REAL_CONST(28370.492616580705/8.0), - REAL_CONST(28387.798292360701/8.0), - REAL_CONST(28405.106606000048/8.0), - REAL_CONST(28422.417556694945/8.0), - REAL_CONST(28439.731143642206/8.0), - REAL_CONST(28457.047366039264/8.0), - REAL_CONST(28474.366223084147/8.0), - REAL_CONST(28491.687713975512/8.0), - REAL_CONST(28509.011837912611/8.0), - REAL_CONST(28526.338594095305/8.0), - REAL_CONST(28543.667981724069/8.0), - REAL_CONST(28560.999999999982/8.0), - REAL_CONST(28578.334648124732/8.0), - REAL_CONST(28595.671925300605/8.0), - REAL_CONST(28613.011830730498/8.0), - REAL_CONST(28630.354363617909/8.0), - REAL_CONST(28647.699523166943/8.0), - REAL_CONST(28665.0473085823/8.0), - REAL_CONST(28682.397719069289/8.0), - REAL_CONST(28699.750753833818/8.0), - REAL_CONST(28717.10641208239/8.0), - REAL_CONST(28734.464693022121/8.0), - REAL_CONST(28751.825595860708/8.0), - REAL_CONST(28769.189119806462/8.0), - REAL_CONST(28786.55526406828/8.0), - REAL_CONST(28803.924027855664/8.0), - REAL_CONST(28821.295410378701/8.0), - REAL_CONST(28838.669410848088/8.0), - REAL_CONST(28856.046028475103/8.0), - REAL_CONST(28873.425262471628/8.0), - REAL_CONST(28890.80711205013/8.0), - REAL_CONST(28908.191576423673/8.0), - REAL_CONST(28925.578654805915/8.0), - REAL_CONST(28942.968346411097/8.0), - REAL_CONST(28960.360650454055/8.0), - REAL_CONST(28977.755566150216/8.0), - REAL_CONST(28995.153092715591/8.0), - REAL_CONST(29012.553229366786/8.0), - REAL_CONST(29029.955975320987/8.0), - REAL_CONST(29047.361329795975/8.0), - REAL_CONST(29064.769292010107/8.0), - REAL_CONST(29082.179861182336/8.0), - REAL_CONST(29099.593036532187/8.0), - REAL_CONST(29117.00881727978/8.0), - REAL_CONST(29134.427202645813/8.0), - REAL_CONST(29151.848191851568/8.0), - REAL_CONST(29169.271784118911/8.0), - REAL_CONST(29186.697978670283/8.0), - REAL_CONST(29204.126774728706/8.0), - REAL_CONST(29221.55817151779/8.0), - REAL_CONST(29238.992168261717/8.0), - REAL_CONST(29256.42876418525/8.0), - REAL_CONST(29273.867958513725/8.0), - REAL_CONST(29291.309750473058/8.0), - REAL_CONST(29308.754139289747/8.0), - REAL_CONST(29326.201124190855/8.0), - REAL_CONST(29343.65070440403/8.0), - REAL_CONST(29361.102879157483/8.0), - REAL_CONST(29378.557647680012/8.0), - REAL_CONST(29396.015009200975/8.0), - REAL_CONST(29413.474962950309/8.0), - REAL_CONST(29430.937508158524/8.0), - REAL_CONST(29448.402644056692/8.0), - REAL_CONST(29465.870369876469/8.0), - REAL_CONST(29483.340684850071/8.0), - REAL_CONST(29500.81358821028/8.0), - REAL_CONST(29518.289079190454/8.0), - REAL_CONST(29535.767157024511/8.0), - REAL_CONST(29553.247820946945/8.0), - REAL_CONST(29570.731070192807/8.0), - REAL_CONST(29588.216903997723/8.0), - REAL_CONST(29605.70532159787/8.0), - REAL_CONST(29623.19632223/8.0), - REAL_CONST(29640.689905131429/8.0), - REAL_CONST(29658.186069540028/8.0), - REAL_CONST(29675.684814694236/8.0), - REAL_CONST(29693.186139833047/8.0), - REAL_CONST(29710.690044196028/8.0), - REAL_CONST(29728.196527023298/8.0), - REAL_CONST(29745.705587555527/8.0), - REAL_CONST(29763.217225033964/8.0), - REAL_CONST(29780.731438700397/8.0), - REAL_CONST(29798.248227797183/8.0), - REAL_CONST(29815.76759156723/8.0), - REAL_CONST(29833.289529254005/8.0), - REAL_CONST(29850.81404010153/8.0), - REAL_CONST(29868.341123354381/8.0), - REAL_CONST(29885.870778257693/8.0), - REAL_CONST(29903.403004057145/8.0), - REAL_CONST(29920.937799998974/8.0), - REAL_CONST(29938.475165329975/8.0), - REAL_CONST(29956.015099297485/8.0), - REAL_CONST(29973.557601149394/8.0), - REAL_CONST(29991.102670134147/8.0), - REAL_CONST(30008.650305500738/8.0), - REAL_CONST(30026.200506498706/8.0), - REAL_CONST(30043.753272378144/8.0), - REAL_CONST(30061.308602389683/8.0), - REAL_CONST(30078.866495784507/8.0), - REAL_CONST(30096.426951814352/8.0), - REAL_CONST(30113.989969731494/8.0), - REAL_CONST(30131.55554878875/8.0), - REAL_CONST(30149.123688239491/8.0), - REAL_CONST(30166.694387337629/8.0), - REAL_CONST(30184.267645337608/8.0), - REAL_CONST(30201.843461494434/8.0), - REAL_CONST(30219.42183506364/8.0), - REAL_CONST(30237.002765301309/8.0), - REAL_CONST(30254.586251464058/8.0), - REAL_CONST(30272.172292809046/8.0), - REAL_CONST(30289.760888593977/8.0), - REAL_CONST(30307.35203807709/8.0), - REAL_CONST(30324.94574051716/8.0), - REAL_CONST(30342.541995173502/8.0), - REAL_CONST(30360.140801305966/8.0), - REAL_CONST(30377.742158174944/8.0), - REAL_CONST(30395.346065041358/8.0), - REAL_CONST(30412.952521166666/8.0), - REAL_CONST(30430.561525812864/8.0), - REAL_CONST(30448.173078242475/8.0), - REAL_CONST(30465.787177718561/8.0), - REAL_CONST(30483.403823504719/8.0), - REAL_CONST(30501.02301486507/8.0), - REAL_CONST(30518.644751064272/8.0), - REAL_CONST(30536.269031367516/8.0), - REAL_CONST(30553.895855040515/8.0), - REAL_CONST(30571.525221349519/8.0), - REAL_CONST(30589.157129561307/8.0), - REAL_CONST(30606.791578943175/8.0), - REAL_CONST(30624.428568762964/8.0), - REAL_CONST(30642.06809828903/8.0), - REAL_CONST(30659.710166790261/8.0), - REAL_CONST(30677.35477353607/8.0), - REAL_CONST(30695.001917796391/8.0), - REAL_CONST(30712.651598841687/8.0), - REAL_CONST(30730.303815942945/8.0), - REAL_CONST(30747.958568371676/8.0), - REAL_CONST(30765.615855399912/8.0), - REAL_CONST(30783.275676300211/8.0), - REAL_CONST(30800.938030345646/8.0), - REAL_CONST(30818.602916809814/8.0), - REAL_CONST(30836.270334966837/8.0), - REAL_CONST(30853.940284091354/8.0), - REAL_CONST(30871.612763458521/8.0), - REAL_CONST(30889.287772344011/8.0), - REAL_CONST(30906.965310024025/8.0), - REAL_CONST(30924.645375775272/8.0), - REAL_CONST(30942.327968874983/8.0), - REAL_CONST(30960.013088600903/8.0), - REAL_CONST(30977.700734231294/8.0), - REAL_CONST(30995.390905044929/8.0), - REAL_CONST(31013.083600321101/8.0), - REAL_CONST(31030.778819339619/8.0), - REAL_CONST(31048.476561380798/8.0), - REAL_CONST(31066.17682572547/8.0), - REAL_CONST(31083.879611654978/8.0), - REAL_CONST(31101.584918451179/8.0), - REAL_CONST(31119.29274539644/8.0), - REAL_CONST(31137.003091773637/8.0), - REAL_CONST(31154.715956866155/8.0), - REAL_CONST(31172.431339957893/8.0), - REAL_CONST(31190.14924033326/8.0), - REAL_CONST(31207.869657277162/8.0), - REAL_CONST(31225.592590075023/8.0), - REAL_CONST(31243.318038012771/8.0), - REAL_CONST(31261.046000376838/8.0), - REAL_CONST(31278.776476454172/8.0), - REAL_CONST(31296.50946553221/8.0), - REAL_CONST(31314.24496689891/8.0), - REAL_CONST(31331.98297984272/8.0), - REAL_CONST(31349.7235036526/8.0), - REAL_CONST(31367.466537618013/8.0), - REAL_CONST(31385.212081028923/8.0), - REAL_CONST(31402.960133175795/8.0), - REAL_CONST(31420.710693349596/8.0), - REAL_CONST(31438.463760841791/8.0), - REAL_CONST(31456.219334944351/8.0), - REAL_CONST(31473.977414949743/8.0), - REAL_CONST(31491.738000150934/8.0), - REAL_CONST(31509.501089841389/8.0), - REAL_CONST(31527.266683315069/8.0), - REAL_CONST(31545.034779866437/8.0), - REAL_CONST(31562.80537879045/8.0), - REAL_CONST(31580.578479382562/8.0), - REAL_CONST(31598.35408093872/8.0), - REAL_CONST(31616.132182755369/8.0), - REAL_CONST(31633.91278412945/8.0), - REAL_CONST(31651.695884358396/8.0), - REAL_CONST(31669.481482740131/8.0), - REAL_CONST(31687.269578573076/8.0), - REAL_CONST(31705.060171156143/8.0), - REAL_CONST(31722.853259788735/8.0), - REAL_CONST(31740.648843770748/8.0), - REAL_CONST(31758.446922402567/8.0), - REAL_CONST(31776.247494985066/8.0), - REAL_CONST(31794.050560819614/8.0), - REAL_CONST(31811.85611920806/8.0), - REAL_CONST(31829.664169452753/8.0), - REAL_CONST(31847.474710856521/8.0), - REAL_CONST(31865.287742722685/8.0), - REAL_CONST(31883.103264355046/8.0), - REAL_CONST(31900.921275057899/8.0), - REAL_CONST(31918.741774136019/8.0), - REAL_CONST(31936.564760894671/8.0), - REAL_CONST(31954.390234639599/8.0), - REAL_CONST(31972.21819467704/8.0), - REAL_CONST(31990.048640313704/8.0), - REAL_CONST(32007.881570856793/8.0), - REAL_CONST(32025.716985613984/8.0), - REAL_CONST(32043.554883893445/8.0), - REAL_CONST(32061.395265003815/8.0), - REAL_CONST(32079.238128254223/8.0), - REAL_CONST(32097.083472954269/8.0), - REAL_CONST(32114.931298414049/8.0), - REAL_CONST(32132.781603944117/8.0), - REAL_CONST(32150.634388855524/8.0), - REAL_CONST(32168.48965245979/8.0), - REAL_CONST(32186.347394068915/8.0), - REAL_CONST(32204.207612995371/8.0), - REAL_CONST(32222.07030855212/8.0), - REAL_CONST(32239.935480052583/8.0), - REAL_CONST(32257.803126810672/8.0), - REAL_CONST(32275.673248140767/8.0), - REAL_CONST(32293.545843357719/8.0), - REAL_CONST(32311.420911776862/8.0), - REAL_CONST(32329.298452713996/8.0), - REAL_CONST(32347.178465485395/8.0), - REAL_CONST(32365.060949407813/8.0), - REAL_CONST(32382.945903798463/8.0), - REAL_CONST(32400.83332797504/8.0), - REAL_CONST(32418.723221255706/8.0), - REAL_CONST(32436.615582959093/8.0), - REAL_CONST(32454.510412404306/8.0), - REAL_CONST(32472.407708910916/8.0), - REAL_CONST(32490.307471798966/8.0), - REAL_CONST(32508.209700388961/8.0), - REAL_CONST(32526.114394001877/8.0), - REAL_CONST(32544.021551959166/8.0), - REAL_CONST(32561.931173582732/8.0), - REAL_CONST(32579.843258194956/8.0), - REAL_CONST(32597.757805118679/8.0), - REAL_CONST(32615.674813677211/8.0), - REAL_CONST(32633.594283194328/8.0), - REAL_CONST(32651.516212994258/8.0), - REAL_CONST(32669.440602401712/8.0), - REAL_CONST(32687.367450741847/8.0), - REAL_CONST(32705.296757340297/8.0), - REAL_CONST(32723.228521523146/8.0), - REAL_CONST(32741.162742616943/8.0), - REAL_CONST(32759.099419948703/8.0), - REAL_CONST(32777.038552845901/8.0), - REAL_CONST(32794.980140636464/8.0), - REAL_CONST(32812.924182648792/8.0), - REAL_CONST(32830.87067821173/8.0), - REAL_CONST(32848.819626654593/8.0), - REAL_CONST(32866.77102730715/8.0), - REAL_CONST(32884.724879499619/8.0), - REAL_CONST(32902.681182562686/8.0), - REAL_CONST(32920.639935827494/8.0), - REAL_CONST(32938.601138625643/8.0), - REAL_CONST(32956.56479028918/8.0), - REAL_CONST(32974.530890150607/8.0), - REAL_CONST(32992.499437542894/8.0), - REAL_CONST(33010.470431799447/8.0), - REAL_CONST(33028.443872254145/8.0), - REAL_CONST(33046.419758241311/8.0), - REAL_CONST(33064.39808909571/8.0), - REAL_CONST(33082.378864152583/8.0), - REAL_CONST(33100.36208274759/8.0), - REAL_CONST(33118.347744216881/8.0), - REAL_CONST(33136.335847897026/8.0), - REAL_CONST(33154.326393125062/8.0), - REAL_CONST(33172.31937923847/8.0), - REAL_CONST(33190.314805575174/8.0), - REAL_CONST(33208.312671473555/8.0), - REAL_CONST(33226.312976272442/8.0), - REAL_CONST(33244.315719311111/8.0), - REAL_CONST(33262.320899929284/8.0), - REAL_CONST(33280.328517467125/8.0), - REAL_CONST(33298.33857126526/8.0), - REAL_CONST(33316.351060664747/8.0), - REAL_CONST(33334.365985007091/8.0), - REAL_CONST(33352.383343634239/8.0), - REAL_CONST(33370.403135888591/8.0), - REAL_CONST(33388.42536111299/8.0), - REAL_CONST(33406.450018650721/8.0), - REAL_CONST(33424.477107845501/8.0), - REAL_CONST(33442.506628041512/8.0), - REAL_CONST(33460.53857858335/8.0), - REAL_CONST(33478.572958816083/8.0), - REAL_CONST(33496.609768085189/8.0), - REAL_CONST(33514.649005736617/8.0), - REAL_CONST(33532.690671116739/8.0), - REAL_CONST(33550.734763572356/8.0), - REAL_CONST(33568.781282450735/8.0), - REAL_CONST(33586.830227099563/8.0), - REAL_CONST(33604.881596866973/8.0), - REAL_CONST(33622.935391101528/8.0), - REAL_CONST(33640.991609152239/8.0), - REAL_CONST(33659.050250368542/8.0), - REAL_CONST(33677.111314100322/8.0), - REAL_CONST(33695.174799697881/8.0), - REAL_CONST(33713.240706511984/8.0), - REAL_CONST(33731.309033893805/8.0), - REAL_CONST(33749.37978119497/8.0), - REAL_CONST(33767.452947767531/8.0), - REAL_CONST(33785.528532963974/8.0), - REAL_CONST(33803.606536137209/8.0), - REAL_CONST(33821.686956640602/8.0), - REAL_CONST(33839.769793827938/8.0), - REAL_CONST(33857.855047053425/8.0), - REAL_CONST(33875.942715671707/8.0), - REAL_CONST(33894.032799037872/8.0), - REAL_CONST(33912.125296507431/8.0), - REAL_CONST(33930.220207436316/8.0), - REAL_CONST(33948.317531180888/8.0), - REAL_CONST(33966.417267097961/8.0), - REAL_CONST(33984.519414544746/8.0), - REAL_CONST(34002.623972878901/8.0), - REAL_CONST(34020.730941458511/8.0), - REAL_CONST(34038.840319642077/8.0), - REAL_CONST(34056.952106788536/8.0), - REAL_CONST(34075.066302257255/8.0), - REAL_CONST(34093.182905408015/8.0), - REAL_CONST(34111.301915601027/8.0), - REAL_CONST(34129.42333219693/8.0), - REAL_CONST(34147.547154556785/8.0), - REAL_CONST(34165.673382042078/8.0), - REAL_CONST(34183.80201401472/8.0), - REAL_CONST(34201.933049837033/8.0), - REAL_CONST(34220.06648887178/8.0), - REAL_CONST(34238.202330482141/8.0), - REAL_CONST(34256.340574031703/8.0), - REAL_CONST(34274.481218884495/8.0), - REAL_CONST(34292.624264404949/8.0), - REAL_CONST(34310.769709957938/8.0), - REAL_CONST(34328.91755490873/8.0), - REAL_CONST(34347.067798623029/8.0), - REAL_CONST(34365.220440466954/8.0), - REAL_CONST(34383.375479807051/8.0), - REAL_CONST(34401.532916010263/8.0), - REAL_CONST(34419.692748443973/8.0), - REAL_CONST(34437.854976475966/8.0), - REAL_CONST(34456.01959947445/8.0), - REAL_CONST(34474.18661680806/8.0), - REAL_CONST(34492.356027845817/8.0), - REAL_CONST(34510.527831957188/8.0), - REAL_CONST(34528.702028512052/8.0), - REAL_CONST(34546.878616880676/8.0), - REAL_CONST(34565.05759643377/8.0), - REAL_CONST(34583.238966542449/8.0), - REAL_CONST(34601.422726578232/8.0), - REAL_CONST(34619.608875913065/8.0), - REAL_CONST(34637.797413919296/8.0), - REAL_CONST(34655.988339969692/8.0), - REAL_CONST(34674.181653437423/8.0), - REAL_CONST(34692.37735369608/8.0), - REAL_CONST(34710.575440119668/8.0), - REAL_CONST(34728.775912082579/8.0), - REAL_CONST(34746.978768959649/8.0), - REAL_CONST(34765.184010126082/8.0), - REAL_CONST(34783.391634957537/8.0), - REAL_CONST(34801.60164283005/8.0), - REAL_CONST(34819.814033120063/8.0), - REAL_CONST(34838.028805204456/8.0), - REAL_CONST(34856.24595846048/8.0), - REAL_CONST(34874.465492265823/8.0), - REAL_CONST(34892.687405998557/8.0), - REAL_CONST(34910.911699037177/8.0), - REAL_CONST(34929.138370760564/8.0), - REAL_CONST(34947.367420548027/8.0), - REAL_CONST(34965.598847779271/8.0), - REAL_CONST(34983.832651834389/8.0), - REAL_CONST(35002.068832093908/8.0), - REAL_CONST(35020.307387938738/8.0), - REAL_CONST(35038.548318750189/8.0), - REAL_CONST(35056.79162390998/8.0), - REAL_CONST(35075.03730280025/8.0), - REAL_CONST(35093.285354803513/8.0), - REAL_CONST(35111.535779302685/8.0), - REAL_CONST(35129.788575681116/8.0), - REAL_CONST(35148.043743322516/8.0), - REAL_CONST(35166.301281611013/8.0), - REAL_CONST(35184.561189931141/8.0), - REAL_CONST(35202.823467667826/8.0), - REAL_CONST(35221.088114206388/8.0), - REAL_CONST(35239.355128932555/8.0), - REAL_CONST(35257.624511232447/8.0), - REAL_CONST(35275.896260492584/8.0), - REAL_CONST(35294.170376099886/8.0), - REAL_CONST(35312.446857441668/8.0), - REAL_CONST(35330.725703905628/8.0), - REAL_CONST(35349.006914879887/8.0), - REAL_CONST(35367.290489752944/8.0), - REAL_CONST(35385.576427913686/8.0), - REAL_CONST(35403.864728751418/8.0), - REAL_CONST(35422.155391655811/8.0), - REAL_CONST(35440.448416016967/8.0), - REAL_CONST(35458.743801225341/8.0), - REAL_CONST(35477.041546671804/8.0), - REAL_CONST(35495.341651747622/8.0), - REAL_CONST(35513.644115844436/8.0), - REAL_CONST(35531.948938354304/8.0), - REAL_CONST(35550.256118669655/8.0), - REAL_CONST(35568.565656183309/8.0), - REAL_CONST(35586.877550288496/8.0), - REAL_CONST(35605.191800378816/8.0), - REAL_CONST(35623.508405848268/8.0), - REAL_CONST(35641.827366091238/8.0), - REAL_CONST(35660.148680502505/8.0), - REAL_CONST(35678.472348477233/8.0), - REAL_CONST(35696.798369410979/8.0), - REAL_CONST(35715.126742699678/8.0), - REAL_CONST(35733.457467739659/8.0), - REAL_CONST(35751.790543927644/8.0), - REAL_CONST(35770.125970660738/8.0), - REAL_CONST(35788.46374733642/8.0), - REAL_CONST(35806.803873352568/8.0), - REAL_CONST(35825.146348107453/8.0), - REAL_CONST(35843.49117099971/8.0), - REAL_CONST(35861.838341428367/8.0), - REAL_CONST(35880.187858792851/8.0), - REAL_CONST(35898.539722492955/8.0), - REAL_CONST(35916.893931928862/8.0), - REAL_CONST(35935.250486501129/8.0), - REAL_CONST(35953.609385610718/8.0), - REAL_CONST(35971.970628658957/8.0), - REAL_CONST(35990.334215047558/8.0), - REAL_CONST(36008.700144178612/8.0), - REAL_CONST(36027.068415454596/8.0), - REAL_CONST(36045.439028278372/8.0), - REAL_CONST(36063.811982053165/8.0), - REAL_CONST(36082.187276182609/8.0), - REAL_CONST(36100.564910070694/8.0), - REAL_CONST(36118.944883121789/8.0), - REAL_CONST(36137.327194740654/8.0), - REAL_CONST(36155.711844332429/8.0), - REAL_CONST(36174.098831302617/8.0), - REAL_CONST(36192.488155057115/8.0), - REAL_CONST(36210.87981500219/8.0), - REAL_CONST(36229.273810544473/8.0), - REAL_CONST(36247.670141091003/8.0), - REAL_CONST(36266.068806049167/8.0), - REAL_CONST(36284.469804826738/8.0), - REAL_CONST(36302.873136831862/8.0), - REAL_CONST(36321.278801473069/8.0), - REAL_CONST(36339.686798159251/8.0), - REAL_CONST(36358.097126299683/8.0), - REAL_CONST(36376.509785304013/8.0), - REAL_CONST(36394.924774582258/8.0), - REAL_CONST(36413.342093544816/8.0), - REAL_CONST(36431.761741602444/8.0), - REAL_CONST(36450.183718166292/8.0), - REAL_CONST(36468.608022647859/8.0), - REAL_CONST(36487.034654459028/8.0), - REAL_CONST(36505.463613012063/8.0), - REAL_CONST(36523.894897719583/8.0), - REAL_CONST(36542.328507994578/8.0), - REAL_CONST(36560.764443250409/8.0), - REAL_CONST(36579.202702900831/8.0), - REAL_CONST(36597.643286359926/8.0), - REAL_CONST(36616.086193042182/8.0), - REAL_CONST(36634.531422362437/8.0), - REAL_CONST(36652.978973735895/8.0), - REAL_CONST(36671.428846578143/8.0), - REAL_CONST(36689.881040305125/8.0), - REAL_CONST(36708.335554333149/8.0), - REAL_CONST(36726.792388078902/8.0), - REAL_CONST(36745.251540959427/8.0), - REAL_CONST(36763.713012392138/8.0), - REAL_CONST(36782.176801794812/8.0), - REAL_CONST(36800.642908585593/8.0), - REAL_CONST(36819.111332182983/8.0), - REAL_CONST(36837.582072005869/8.0), - REAL_CONST(36856.055127473483/8.0), - REAL_CONST(36874.530498005421/8.0), - REAL_CONST(36893.008183021651/8.0), - REAL_CONST(36911.488181942506/8.0), - REAL_CONST(36929.970494188674/8.0), - REAL_CONST(36948.455119181206/8.0), - REAL_CONST(36966.942056341519/8.0), - REAL_CONST(36985.431305091392/8.0), - REAL_CONST(37003.922864852961/8.0), - REAL_CONST(37022.416735048733/8.0), - REAL_CONST(37040.912915101559/8.0), - REAL_CONST(37059.411404434657/8.0), - REAL_CONST(37077.91220247162/8.0), - REAL_CONST(37096.415308636388/8.0), - REAL_CONST(37114.920722353243/8.0), - REAL_CONST(37133.428443046862/8.0), - REAL_CONST(37151.938470142253/8.0), - REAL_CONST(37170.450803064785/8.0), - REAL_CONST(37188.965441240209/8.0), - REAL_CONST(37207.482384094597/8.0), - REAL_CONST(37226.001631054402/8.0), - REAL_CONST(37244.523181546429/8.0), - REAL_CONST(37263.047034997842/8.0), - REAL_CONST(37281.573190836149/8.0), - REAL_CONST(37300.101648489224/8.0), - REAL_CONST(37318.632407385296/8.0), - REAL_CONST(37337.165466952945/8.0), - REAL_CONST(37355.700826621112/8.0), - REAL_CONST(37374.238485819085/8.0), - REAL_CONST(37392.778443976509/8.0), - REAL_CONST(37411.320700523385/8.0), - REAL_CONST(37429.865254890057/8.0), - REAL_CONST(37448.412106507232/8.0), - REAL_CONST(37466.961254805974/8.0), - REAL_CONST(37485.512699217681/8.0), - REAL_CONST(37504.066439174116/8.0), - REAL_CONST(37522.622474107404/8.0), - REAL_CONST(37541.180803449992/8.0), - REAL_CONST(37559.741426634704/8.0), - REAL_CONST(37578.304343094693/8.0), - REAL_CONST(37596.869552263488/8.0), - REAL_CONST(37615.43705357494/8.0), - REAL_CONST(37634.006846463279/8.0), - REAL_CONST(37652.578930363044/8.0), - REAL_CONST(37671.153304709165/8.0), - REAL_CONST(37689.729968936896/8.0), - REAL_CONST(37708.308922481847/8.0), - REAL_CONST(37726.890164779965/8.0), - REAL_CONST(37745.473695267559/8.0), - REAL_CONST(37764.059513381275/8.0), - REAL_CONST(37782.647618558112/8.0), - REAL_CONST(37801.238010235415/8.0), - REAL_CONST(37819.830687850859/8.0), - REAL_CONST(37838.425650842495/8.0), - REAL_CONST(37857.022898648691/8.0), - REAL_CONST(37875.622430708172/8.0), - REAL_CONST(37894.224246460013/8.0), - REAL_CONST(37912.828345343616/8.0), - REAL_CONST(37931.434726798747/8.0), - REAL_CONST(37950.043390265506/8.0), - REAL_CONST(37968.654335184328/8.0), - REAL_CONST(37987.267560995999/8.0), - REAL_CONST(38005.883067141665/8.0), - REAL_CONST(38024.500853062775/8.0), - REAL_CONST(38043.120918201159/8.0), - REAL_CONST(38061.743261998963/8.0), - REAL_CONST(38080.367883898682/8.0), - REAL_CONST(38098.994783343158/8.0), - REAL_CONST(38117.623959775563/8.0), - REAL_CONST(38136.255412639417/8.0), - REAL_CONST(38154.889141378575/8.0), - REAL_CONST(38173.525145437234/8.0), - REAL_CONST(38192.163424259939/8.0), - REAL_CONST(38210.803977291551/8.0), - REAL_CONST(38229.446803977284/8.0), - REAL_CONST(38248.091903762703/8.0), - REAL_CONST(38266.739276093685/8.0), - REAL_CONST(38285.388920416466/8.0), - REAL_CONST(38304.040836177606/8.0), - REAL_CONST(38322.695022824002/8.0), - REAL_CONST(38341.351479802899/8.0), - REAL_CONST(38360.010206561863/8.0), - REAL_CONST(38378.671202548816/8.0), - REAL_CONST(38397.334467211993/8.0), - REAL_CONST(38415.999999999978/8.0), - REAL_CONST(38434.667800361683/8.0), - REAL_CONST(38453.33786774637/8.0), - REAL_CONST(38472.010201603611/8.0), - REAL_CONST(38490.684801383337/8.0), - REAL_CONST(38509.361666535784/8.0), - REAL_CONST(38528.040796511552/8.0), - REAL_CONST(38546.722190761553/8.0), - REAL_CONST(38565.405848737035/8.0), - REAL_CONST(38584.091769889594/8.0), - REAL_CONST(38602.779953671132/8.0), - REAL_CONST(38621.470399533908/8.0), - REAL_CONST(38640.163106930493/8.0), - REAL_CONST(38658.858075313794/8.0), - REAL_CONST(38677.555304137059/8.0), - REAL_CONST(38696.254792853862/8.0), - REAL_CONST(38714.956540918094/8.0), - REAL_CONST(38733.660547783991/8.0), - REAL_CONST(38752.366812906112/8.0), - REAL_CONST(38771.075335739348/8.0), - REAL_CONST(38789.78611573892/8.0), - REAL_CONST(38808.499152360368/8.0), - REAL_CONST(38827.214445059573/8.0), - REAL_CONST(38845.931993292739/8.0), - REAL_CONST(38864.651796516388/8.0), - REAL_CONST(38883.373854187383/8.0), - REAL_CONST(38902.098165762916/8.0), - REAL_CONST(38920.824730700486/8.0), - REAL_CONST(38939.553548457938/8.0), - REAL_CONST(38958.284618493431/8.0), - REAL_CONST(38977.017940265461/8.0), - REAL_CONST(38995.753513232834/8.0), - REAL_CONST(39014.491336854699/8.0), - REAL_CONST(39033.231410590517/8.0), - REAL_CONST(39051.973733900079/8.0), - REAL_CONST(39070.718306243485/8.0), - REAL_CONST(39089.465127081188/8.0), - REAL_CONST(39108.214195873945/8.0), - REAL_CONST(39126.965512082832/8.0), - REAL_CONST(39145.719075169261/8.0), - REAL_CONST(39164.474884594965/8.0), - REAL_CONST(39183.232939821988/8.0), - REAL_CONST(39201.99324031271/8.0), - REAL_CONST(39220.755785529815/8.0), - REAL_CONST(39239.52057493633/8.0), - REAL_CONST(39258.287607995589/8.0), - REAL_CONST(39277.056884171245/8.0), - REAL_CONST(39295.828402927284/8.0), - REAL_CONST(39314.602163728006/8.0), - REAL_CONST(39333.378166038019/8.0), - REAL_CONST(39352.15640932227/8.0), - REAL_CONST(39370.936893046004/8.0), - REAL_CONST(39389.719616674811/8.0), - REAL_CONST(39408.504579674584/8.0), - REAL_CONST(39427.291781511522/8.0), - REAL_CONST(39446.081221652174/8.0), - REAL_CONST(39464.872899563372/8.0), - REAL_CONST(39483.666814712291/8.0), - REAL_CONST(39502.462966566411/8.0), - REAL_CONST(39521.261354593538/8.0), - REAL_CONST(39540.06197826178/8.0), - REAL_CONST(39558.864837039568/8.0), - REAL_CONST(39577.669930395656/8.0), - REAL_CONST(39596.47725779911/8.0), - REAL_CONST(39615.286818719302/8.0), - REAL_CONST(39634.098612625923/8.0), - REAL_CONST(39652.912638988993/8.0), - REAL_CONST(39671.728897278823/8.0), - REAL_CONST(39690.547386966064/8.0), - REAL_CONST(39709.368107521652/8.0), - REAL_CONST(39728.191058416858/8.0), - REAL_CONST(39747.016239123259/8.0), - REAL_CONST(39765.84364911275/8.0), - REAL_CONST(39784.673287857528/8.0), - REAL_CONST(39803.505154830105/8.0), - REAL_CONST(39822.339249503319/8.0), - REAL_CONST(39841.175571350293/8.0), - REAL_CONST(39860.014119844491/8.0), - REAL_CONST(39878.854894459677/8.0), - REAL_CONST(39897.697894669909/8.0), - REAL_CONST(39916.54311994958/8.0), - REAL_CONST(39935.390569773372/8.0), - REAL_CONST(39954.240243616303/8.0), - REAL_CONST(39973.092140953675/8.0), - REAL_CONST(39991.946261261117/8.0), - REAL_CONST(40010.802604014549/8.0), - REAL_CONST(40029.661168690225/8.0), - REAL_CONST(40048.521954764678/8.0), - REAL_CONST(40067.384961714779/8.0), - REAL_CONST(40086.250189017679/8.0), - REAL_CONST(40105.117636150855/8.0), - REAL_CONST(40123.98730259209/8.0), - REAL_CONST(40142.859187819471/8.0), - REAL_CONST(40161.733291311379/8.0), - REAL_CONST(40180.609612546526/8.0), - REAL_CONST(40199.488151003912/8.0), - REAL_CONST(40218.368906162854/8.0), - REAL_CONST(40237.25187750296/8.0), - REAL_CONST(40256.137064504153/8.0), - REAL_CONST(40275.024466646668/8.0), - REAL_CONST(40293.914083411029/8.0), - REAL_CONST(40312.805914278084/8.0), - REAL_CONST(40331.699958728961/8.0), - REAL_CONST(40350.596216245103/8.0), - REAL_CONST(40369.494686308273/8.0), - REAL_CONST(40388.39536840051/8.0), - REAL_CONST(40407.298262004173/8.0), - REAL_CONST(40426.20336660192/8.0), - REAL_CONST(40445.110681676706/8.0), - REAL_CONST(40464.020206711793/8.0), - REAL_CONST(40482.931941190756/8.0), - REAL_CONST(40501.845884597446/8.0), - REAL_CONST(40520.762036416032/8.0), - REAL_CONST(40539.680396130985/8.0), - REAL_CONST(40558.600963227072/8.0), - REAL_CONST(40577.523737189367/8.0), - REAL_CONST(40596.448717503234/8.0), - REAL_CONST(40615.375903654342/8.0), - REAL_CONST(40634.305295128659/8.0), - REAL_CONST(40653.236891412453/8.0), - REAL_CONST(40672.170691992294/8.0), - REAL_CONST(40691.106696355047/8.0), - REAL_CONST(40710.044903987873/8.0), - REAL_CONST(40728.985314378238/8.0), - REAL_CONST(40747.927927013901/8.0), - REAL_CONST(40766.872741382918/8.0), - REAL_CONST(40785.819756973651/8.0), - REAL_CONST(40804.768973274746/8.0), - REAL_CONST(40823.720389775161/8.0), - REAL_CONST(40842.674005964131/8.0), - REAL_CONST(40861.629821331211/8.0), - REAL_CONST(40880.587835366234/8.0), - REAL_CONST(40899.548047559321/8.0), - REAL_CONST(40918.510457400931/8.0), - REAL_CONST(40937.475064381761/8.0), - REAL_CONST(40956.441867992849/8.0), - REAL_CONST(40975.410867725499/8.0), - REAL_CONST(40994.382063071331/8.0), - REAL_CONST(41013.355453522236/8.0), - REAL_CONST(41032.331038570417/8.0), - REAL_CONST(41051.308817708363/8.0), - REAL_CONST(41070.288790428858/8.0), - REAL_CONST(41089.270956224987/8.0), - REAL_CONST(41108.255314590111/8.0), - REAL_CONST(41127.241865017888/8.0), - REAL_CONST(41146.23060700229/8.0), - REAL_CONST(41165.221540037543/8.0), - REAL_CONST(41184.214663618193/8.0), - REAL_CONST(41203.209977239079/8.0), - REAL_CONST(41222.207480395307/8.0), - REAL_CONST(41241.207172582297/8.0), - REAL_CONST(41260.209053295752/8.0), - REAL_CONST(41279.213122031659/8.0), - REAL_CONST(41298.219378286303/8.0), - REAL_CONST(41317.227821556255/8.0), - REAL_CONST(41336.23845133838/8.0), - REAL_CONST(41355.251267129832/8.0), - REAL_CONST(41374.266268428037/8.0), - REAL_CONST(41393.283454730743/8.0), - REAL_CONST(41412.302825535953/8.0), - REAL_CONST(41431.324380341983/8.0), - REAL_CONST(41450.348118647416/8.0), - REAL_CONST(41469.374039951144/8.0), - REAL_CONST(41488.402143752326/8.0), - REAL_CONST(41507.432429550427/8.0), - REAL_CONST(41526.464896845187/8.0), - REAL_CONST(41545.499545136627/8.0), - REAL_CONST(41564.536373925075/8.0), - REAL_CONST(41583.575382711126/8.0), - REAL_CONST(41602.616570995662/8.0), - REAL_CONST(41621.659938279874/8.0), - REAL_CONST(41640.705484065205/8.0), - REAL_CONST(41659.753207853406/8.0), - REAL_CONST(41678.803109146495/8.0), - REAL_CONST(41697.855187446803/8.0), - REAL_CONST(41716.909442256911/8.0), - REAL_CONST(41735.965873079709/8.0), - REAL_CONST(41755.02447941836/8.0), - REAL_CONST(41774.085260776315/8.0), - REAL_CONST(41793.148216657297/8.0), - REAL_CONST(41812.213346565331/8.0), - REAL_CONST(41831.280650004708/8.0), - REAL_CONST(41850.350126480014/8.0), - REAL_CONST(41869.421775496106/8.0), - REAL_CONST(41888.495596558132/8.0), - REAL_CONST(41907.571589171515/8.0), - REAL_CONST(41926.649752841957/8.0), - REAL_CONST(41945.730087075463/8.0), - REAL_CONST(41964.812591378286/8.0), - REAL_CONST(41983.897265256979/8.0), - REAL_CONST(42002.984108218378/8.0), - REAL_CONST(42022.073119769593/8.0), - REAL_CONST(42041.164299418015/8.0), - REAL_CONST(42060.257646671307/8.0), - REAL_CONST(42079.353161037419/8.0), - REAL_CONST(42098.450842024591/8.0), - REAL_CONST(42117.550689141324/8.0), - REAL_CONST(42136.652701896404/8.0), - REAL_CONST(42155.756879798893/8.0), - REAL_CONST(42174.863222358137/8.0), - REAL_CONST(42193.971729083758/8.0), - REAL_CONST(42213.082399485655/8.0), - REAL_CONST(42232.195233074002/8.0), - REAL_CONST(42251.310229359246/8.0), - REAL_CONST(42270.427387852127/8.0), - REAL_CONST(42289.546708063644/8.0), - REAL_CONST(42308.668189505079/8.0), - REAL_CONST(42327.791831687995/8.0), - REAL_CONST(42346.917634124227/8.0), - REAL_CONST(42366.045596325886/8.0), - REAL_CONST(42385.175717805352/8.0), - REAL_CONST(42404.307998075295/8.0), - REAL_CONST(42423.442436648642/8.0), - REAL_CONST(42442.579033038608/8.0), - REAL_CONST(42461.717786758672/8.0), - REAL_CONST(42480.858697322597/8.0), - REAL_CONST(42500.001764244422/8.0), - REAL_CONST(42519.146987038446/8.0), - REAL_CONST(42538.294365219248/8.0), - REAL_CONST(42557.443898301688/8.0), - REAL_CONST(42576.595585800882/8.0), - REAL_CONST(42595.749427232236/8.0), - REAL_CONST(42614.90542211142/8.0), - REAL_CONST(42634.063569954378/8.0), - REAL_CONST(42653.223870277317/8.0), - REAL_CONST(42672.386322596729/8.0), - REAL_CONST(42691.55092642938/8.0), - REAL_CONST(42710.717681292292/8.0), - REAL_CONST(42729.886586702756/8.0), - REAL_CONST(42749.057642178363/8.0), - REAL_CONST(42768.23084723694/8.0), - REAL_CONST(42787.406201396603/8.0), - REAL_CONST(42806.58370417574/8.0), - REAL_CONST(42825.76335509299/8.0), - REAL_CONST(42844.945153667286/8.0), - REAL_CONST(42864.129099417805/8.0), - REAL_CONST(42883.315191864014/8.0), - REAL_CONST(42902.503430525649/8.0), - REAL_CONST(42921.693814922692/8.0), - REAL_CONST(42940.88634457541/8.0), - REAL_CONST(42960.081019004348/8.0), - REAL_CONST(42979.277837730297/8.0), - REAL_CONST(42998.476800274322/8.0), - REAL_CONST(43017.677906157769/8.0), - REAL_CONST(43036.881154902228/8.0), - REAL_CONST(43056.086546029583/8.0), - REAL_CONST(43075.294079061961/8.0), - REAL_CONST(43094.503753521763/8.0), - REAL_CONST(43113.715568931671/8.0), - REAL_CONST(43132.929524814601/8.0), - REAL_CONST(43152.145620693766/8.0), - REAL_CONST(43171.363856092619/8.0), - REAL_CONST(43190.584230534907/8.0), - REAL_CONST(43209.806743544621/8.0), - REAL_CONST(43229.031394646016/8.0), - REAL_CONST(43248.258183363621/8.0), - REAL_CONST(43267.487109222224/8.0), - REAL_CONST(43286.718171746885/8.0), - REAL_CONST(43305.951370462906/8.0), - REAL_CONST(43325.186704895881/8.0), - REAL_CONST(43344.42417457165/8.0), - REAL_CONST(43363.663779016322/8.0), - REAL_CONST(43382.905517756262/8.0), - REAL_CONST(43402.149390318104/8.0), - REAL_CONST(43421.395396228749/8.0), - REAL_CONST(43440.643535015348/8.0), - REAL_CONST(43459.89380620532/8.0), - REAL_CONST(43479.146209326354/8.0), - REAL_CONST(43498.400743906379/8.0), - REAL_CONST(43517.657409473606/8.0), - REAL_CONST(43536.916205556496/8.0), - REAL_CONST(43556.177131683784/8.0), - REAL_CONST(43575.44018738444/8.0), - REAL_CONST(43594.705372187724/8.0), - REAL_CONST(43613.972685623135/8.0), - REAL_CONST(43633.242127220445/8.0), - REAL_CONST(43652.513696509668/8.0), - REAL_CONST(43671.787393021099/8.0), - REAL_CONST(43691.063216285271/8.0), - REAL_CONST(43710.341165833001/8.0), - REAL_CONST(43729.621241195346/8.0), - REAL_CONST(43748.903441903625/8.0), - REAL_CONST(43768.187767489413/8.0), - REAL_CONST(43787.474217484552/8.0), - REAL_CONST(43806.762791421126/8.0), - REAL_CONST(43826.053488831501/8.0), - REAL_CONST(43845.346309248278/8.0), - REAL_CONST(43864.641252204325/8.0), - REAL_CONST(43883.938317232765/8.0), - REAL_CONST(43903.237503866971/8.0), - REAL_CONST(43922.538811640596/8.0), - REAL_CONST(43941.842240087513/8.0), - REAL_CONST(43961.147788741881/8.0), - REAL_CONST(43980.455457138101/8.0), - REAL_CONST(43999.765244810835/8.0), - REAL_CONST(44019.077151295001/8.0), - REAL_CONST(44038.391176125755/8.0), - REAL_CONST(44057.70731883854/8.0), - REAL_CONST(44077.02557896902/8.0), - REAL_CONST(44096.345956053141/8.0), - REAL_CONST(44115.668449627083/8.0), - REAL_CONST(44134.993059227287/8.0), - REAL_CONST(44154.319784390456/8.0), - REAL_CONST(44173.648624653535/8.0), - REAL_CONST(44192.979579553728/8.0), - REAL_CONST(44212.312648628489/8.0), - REAL_CONST(44231.647831415532/8.0), - REAL_CONST(44250.985127452805/8.0), - REAL_CONST(44270.324536278538/8.0), - REAL_CONST(44289.666057431183/8.0), - REAL_CONST(44309.009690449464/8.0), - REAL_CONST(44328.355434872348/8.0), - REAL_CONST(44347.703290239064/8.0), - REAL_CONST(44367.053256089079/8.0), - REAL_CONST(44386.405331962109/8.0), - REAL_CONST(44405.759517398139/8.0), - REAL_CONST(44425.115811937387/8.0), - REAL_CONST(44444.474215120332/8.0), - REAL_CONST(44463.834726487694/8.0), - REAL_CONST(44483.197345580462/8.0), - REAL_CONST(44502.562071939843/8.0), - REAL_CONST(44521.928905107328/8.0), - REAL_CONST(44541.297844624634/8.0), - REAL_CONST(44560.668890033732/8.0), - REAL_CONST(44580.042040876848/8.0), - REAL_CONST(44599.417296696454/8.0), - REAL_CONST(44618.794657035272/8.0), - REAL_CONST(44638.174121436256/8.0), - REAL_CONST(44657.555689442641/8.0), - REAL_CONST(44676.939360597877/8.0), - REAL_CONST(44696.325134445673/8.0), - REAL_CONST(44715.713010530002/8.0), - REAL_CONST(44735.102988395054/8.0), - REAL_CONST(44754.495067585296/8.0), - REAL_CONST(44773.88924764542/8.0), - REAL_CONST(44793.285528120374/8.0), - REAL_CONST(44812.683908555344/8.0), - REAL_CONST(44832.084388495779/8.0), - REAL_CONST(44851.486967487363/8.0), - REAL_CONST(44870.891645076015/8.0), - REAL_CONST(44890.298420807922/8.0), - REAL_CONST(44909.707294229491/8.0), - REAL_CONST(44929.118264887409/8.0), - REAL_CONST(44948.531332328566/8.0), - REAL_CONST(44967.946496100136/8.0), - REAL_CONST(44987.363755749502/8.0), - REAL_CONST(45006.783110824319/8.0), - REAL_CONST(45026.204560872473/8.0), - REAL_CONST(45045.628105442098/8.0), - REAL_CONST(45065.053744081561/8.0), - REAL_CONST(45084.48147633949/8.0), - REAL_CONST(45103.911301764747/8.0), - REAL_CONST(45123.343219906426/8.0), - REAL_CONST(45142.777230313885/8.0), - REAL_CONST(45162.21333253671/8.0), - REAL_CONST(45181.651526124733/8.0), - REAL_CONST(45201.091810628037/8.0), - REAL_CONST(45220.534185596924/8.0), - REAL_CONST(45239.978650581965/8.0), - REAL_CONST(45259.425205133957/8.0), - REAL_CONST(45278.873848803938/8.0), - REAL_CONST(45298.324581143192/8.0), - REAL_CONST(45317.777401703235/8.0), - REAL_CONST(45337.232310035848/8.0), - REAL_CONST(45356.68930569302/8.0), - REAL_CONST(45376.148388226997/8.0), - REAL_CONST(45395.60955719027/8.0), - REAL_CONST(45415.072812135557/8.0), - REAL_CONST(45434.538152615823/8.0), - REAL_CONST(45454.005578184282/8.0), - REAL_CONST(45473.475088394356/8.0), - REAL_CONST(45492.946682799746/8.0), - REAL_CONST(45512.420360954362/8.0), - REAL_CONST(45531.896122412363/8.0), - REAL_CONST(45551.373966728155/8.0), - REAL_CONST(45570.853893456362/8.0), - REAL_CONST(45590.33590215187/8.0), - REAL_CONST(45609.819992369776/8.0), - REAL_CONST(45629.306163665438/8.0), - REAL_CONST(45648.794415594442/8.0), - REAL_CONST(45668.284747712612/8.0), - REAL_CONST(45687.777159576006/8.0), - REAL_CONST(45707.27165074092/8.0), - REAL_CONST(45726.768220763894/8.0), - REAL_CONST(45746.266869201696/8.0), - REAL_CONST(45765.767595611323/8.0), - REAL_CONST(45785.270399550034/8.0), - REAL_CONST(45804.775280575297/8.0), - REAL_CONST(45824.282238244828/8.0), - REAL_CONST(45843.79127211657/8.0), - REAL_CONST(45863.302381748719/8.0), - REAL_CONST(45882.815566699683/8.0), - REAL_CONST(45902.33082652813/8.0), - REAL_CONST(45921.848160792935/8.0), - REAL_CONST(45941.367569053225/8.0), - REAL_CONST(45960.889050868354/8.0), - REAL_CONST(45980.41260579793/8.0), - REAL_CONST(45999.938233401757/8.0), - REAL_CONST(46019.465933239902/8.0), - REAL_CONST(46038.995704872657/8.0), - REAL_CONST(46058.527547860547/8.0), - REAL_CONST(46078.06146176433/8.0), - REAL_CONST(46097.597446144995/8.0), - REAL_CONST(46117.135500563774/8.0), - REAL_CONST(46136.675624582109/8.0), - REAL_CONST(46156.217817761702/8.0), - REAL_CONST(46175.762079664462/8.0), - REAL_CONST(46195.308409852543/8.0), - REAL_CONST(46214.856807888333/8.0), - REAL_CONST(46234.407273334444/8.0), - REAL_CONST(46253.959805753715/8.0), - REAL_CONST(46273.51440470924/8.0), - REAL_CONST(46293.071069764315/8.0), - REAL_CONST(46312.629800482478/8.0), - REAL_CONST(46332.190596427499/8.0), - REAL_CONST(46351.753457163381/8.0), - REAL_CONST(46371.318382254351/8.0), - REAL_CONST(46390.885371264863/8.0), - REAL_CONST(46410.45442375962/8.0), - REAL_CONST(46430.025539303526/8.0), - REAL_CONST(46449.598717461733/8.0), - REAL_CONST(46469.17395779962/8.0), - REAL_CONST(46488.751259882782/8.0), - REAL_CONST(46508.33062327707/8.0), - REAL_CONST(46527.912047548532/8.0), - REAL_CONST(46547.495532263471/8.0), - REAL_CONST(46567.081076988397/8.0), - REAL_CONST(46586.668681290059/8.0), - REAL_CONST(46606.258344735434/8.0), - REAL_CONST(46625.850066891719/8.0), - REAL_CONST(46645.443847326351/8.0), - REAL_CONST(46665.039685606986/8.0), - REAL_CONST(46684.637581301497/8.0), - REAL_CONST(46704.237533978005/8.0), - REAL_CONST(46723.839543204842/8.0), - REAL_CONST(46743.443608550573/8.0), - REAL_CONST(46763.049729583989/8.0), - REAL_CONST(46782.657905874104/8.0), - REAL_CONST(46802.268136990162/8.0), - REAL_CONST(46821.880422501628/8.0), - REAL_CONST(46841.494761978196/8.0), - REAL_CONST(46861.111154989776/8.0), - REAL_CONST(46880.729601106526/8.0), - REAL_CONST(46900.350099898795/8.0), - REAL_CONST(46919.97265093719/8.0), - REAL_CONST(46939.597253792526/8.0), - REAL_CONST(46959.223908035841/8.0), - REAL_CONST(46978.852613238392/8.0), - REAL_CONST(46998.483368971691/8.0), - REAL_CONST(47018.11617480743/8.0), - REAL_CONST(47037.751030317551/8.0), - REAL_CONST(47057.387935074221/8.0), - REAL_CONST(47077.026888649809/8.0), - REAL_CONST(47096.66789061694/8.0), - REAL_CONST(47116.310940548428/8.0), - REAL_CONST(47135.956038017328/8.0), - REAL_CONST(47155.603182596918/8.0), - REAL_CONST(47175.252373860698/8.0), - REAL_CONST(47194.903611382375/8.0), - REAL_CONST(47214.556894735892/8.0), - REAL_CONST(47234.212223495422/8.0), - REAL_CONST(47253.869597235338/8.0), - REAL_CONST(47273.52901553025/8.0), - REAL_CONST(47293.19047795498/8.0), - REAL_CONST(47312.853984084577/8.0), - REAL_CONST(47332.519533494306/8.0), - REAL_CONST(47352.187125759658/8.0), - REAL_CONST(47371.856760456343/8.0), - REAL_CONST(47391.528437160297/8.0), - REAL_CONST(47411.202155447652/8.0), - REAL_CONST(47430.877914894787/8.0), - REAL_CONST(47450.555715078299/8.0), - REAL_CONST(47470.235555574982/8.0), - REAL_CONST(47489.917435961863/8.0), - REAL_CONST(47509.601355816201/8.0), - REAL_CONST(47529.287314715453/8.0), - REAL_CONST(47548.975312237308/8.0), - REAL_CONST(47568.665347959672/8.0), - REAL_CONST(47588.357421460656/8.0), - REAL_CONST(47608.051532318605/8.0), - REAL_CONST(47627.747680112072/8.0), - REAL_CONST(47647.445864419846/8.0), - REAL_CONST(47667.14608482091/8.0), - REAL_CONST(47686.848340894474/8.0), - REAL_CONST(47706.552632219973/8.0), - REAL_CONST(47726.258958377046/8.0), - REAL_CONST(47745.967318945557/8.0), - REAL_CONST(47765.677713505589/8.0), - REAL_CONST(47785.390141637428/8.0), - REAL_CONST(47805.104602921601/8.0), - REAL_CONST(47824.821096938824/8.0), - REAL_CONST(47844.539623270044/8.0), - REAL_CONST(47864.260181496429/8.0), - REAL_CONST(47883.982771199349/8.0), - REAL_CONST(47903.707391960394/8.0), - REAL_CONST(47923.434043361369/8.0), - REAL_CONST(47943.162724984308/8.0), - REAL_CONST(47962.893436411439/8.0), - REAL_CONST(47982.626177225218/8.0), - REAL_CONST(48002.36094700831/8.0), - REAL_CONST(48022.097745343599/8.0), - REAL_CONST(48041.836571814172/8.0), - REAL_CONST(48061.57742600335/8.0), - REAL_CONST(48081.32030749465/8.0), - REAL_CONST(48101.065215871815/8.0), - REAL_CONST(48120.81215071879/8.0), - REAL_CONST(48140.56111161974/8.0), - REAL_CONST(48160.312098159047/8.0), - REAL_CONST(48180.065109921306/8.0), - REAL_CONST(48199.820146491307/8.0), - REAL_CONST(48219.577207454073/8.0), - REAL_CONST(48239.336292394844/8.0), - REAL_CONST(48259.097400899045/8.0), - REAL_CONST(48278.860532552339/8.0), - REAL_CONST(48298.625686940592/8.0), - REAL_CONST(48318.392863649875/8.0), - REAL_CONST(48338.162062266485/8.0), - REAL_CONST(48357.933282376915/8.0), - REAL_CONST(48377.706523567889/8.0), - REAL_CONST(48397.481785426316/8.0), - REAL_CONST(48417.259067539344/8.0), - REAL_CONST(48437.038369494308/8.0), - REAL_CONST(48456.819690878765/8.0), - REAL_CONST(48476.603031280487/8.0), - REAL_CONST(48496.388390287451/8.0), - REAL_CONST(48516.175767487839/8.0), - REAL_CONST(48535.965162470042/8.0), - REAL_CONST(48555.756574822684/8.0), - REAL_CONST(48575.550004134566/8.0), - REAL_CONST(48595.345449994718/8.0), - REAL_CONST(48615.142911992378/8.0), - REAL_CONST(48634.942389716991/8.0), - REAL_CONST(48654.743882758201/8.0), - REAL_CONST(48674.547390705877/8.0), - REAL_CONST(48694.352913150084/8.0), - REAL_CONST(48714.160449681112/8.0), - REAL_CONST(48733.969999889443/8.0), - REAL_CONST(48753.781563365759/8.0), - REAL_CONST(48773.595139700978/8.0), - REAL_CONST(48793.410728486211/8.0), - REAL_CONST(48813.228329312769/8.0), - REAL_CONST(48833.047941772187/8.0), - REAL_CONST(48852.869565456189/8.0), - REAL_CONST(48872.693199956717/8.0), - REAL_CONST(48892.518844865925/8.0), - REAL_CONST(48912.346499776155/8.0), - REAL_CONST(48932.176164279976/8.0), - REAL_CONST(48952.007837970152/8.0), - REAL_CONST(48971.841520439666/8.0), - REAL_CONST(48991.677211281676/8.0), - REAL_CONST(49011.514910089587/8.0), - REAL_CONST(49031.354616456978/8.0), - REAL_CONST(49051.196329977654/8.0), - REAL_CONST(49071.04005024561/8.0), - REAL_CONST(49090.885776855059/8.0), - REAL_CONST(49110.733509400408/8.0), - REAL_CONST(49130.583247476279/8.0), - REAL_CONST(49150.434990677488/8.0), - REAL_CONST(49170.288738599062/8.0), - REAL_CONST(49190.144490836232/8.0), - REAL_CONST(49210.002246984441/8.0), - REAL_CONST(49229.86200663932/8.0), - REAL_CONST(49249.723769396718/8.0), - REAL_CONST(49269.587534852675/8.0), - REAL_CONST(49289.453302603448/8.0), - REAL_CONST(49309.32107224549/8.0), - REAL_CONST(49329.190843375451/8.0), - REAL_CONST(49349.062615590192/8.0), - REAL_CONST(49368.936388486785/8.0), - REAL_CONST(49388.812161662492/8.0), - REAL_CONST(49408.689934714785/8.0), - REAL_CONST(49428.569707241324/8.0), - REAL_CONST(49448.45147883999/8.0), - REAL_CONST(49468.335249108866/8.0), - REAL_CONST(49488.22101764621/8.0), - REAL_CONST(49508.108784050521/8.0), - REAL_CONST(49527.99854792047/8.0), - REAL_CONST(49547.890308854934/8.0), - REAL_CONST(49567.784066453009/8.0), - REAL_CONST(49587.679820313977/8.0), - REAL_CONST(49607.57757003732/8.0), - REAL_CONST(49627.477315222721/8.0), - REAL_CONST(49647.379055470075/8.0), - REAL_CONST(49667.28279037946/8.0), - REAL_CONST(49687.188519551179/8.0), - REAL_CONST(49707.096242585707/8.0), - REAL_CONST(49727.005959083741/8.0), - REAL_CONST(49746.917668646165/8.0), - REAL_CONST(49766.831370874068/8.0), - REAL_CONST(49786.747065368734/8.0), - REAL_CONST(49806.66475173166/8.0), - REAL_CONST(49826.584429564515/8.0), - REAL_CONST(49846.506098469203/8.0), - REAL_CONST(49866.429758047794/8.0), - REAL_CONST(49886.355407902578/8.0), - REAL_CONST(49906.283047636032/8.0), - REAL_CONST(49926.212676850846/8.0), - REAL_CONST(49946.144295149883/8.0), - REAL_CONST(49966.077902136225/8.0), - REAL_CONST(49986.013497413151/8.0), - REAL_CONST(50005.951080584135/8.0), - REAL_CONST(50025.890651252834/8.0), - REAL_CONST(50045.832209023123/8.0), - REAL_CONST(50065.775753499074/8.0), - REAL_CONST(50085.721284284933/8.0), - REAL_CONST(50105.668800985164/8.0), - REAL_CONST(50125.618303204428/8.0), - REAL_CONST(50145.569790547575/8.0), - REAL_CONST(50165.523262619652/8.0), - REAL_CONST(50185.478719025901/8.0), - REAL_CONST(50205.436159371769/8.0), - REAL_CONST(50225.395583262893/8.0), - REAL_CONST(50245.356990305103/8.0), - REAL_CONST(50265.320380104429/8.0), - REAL_CONST(50285.285752267104/8.0), - REAL_CONST(50305.253106399534/8.0), - REAL_CONST(50325.222442108337/8.0), - REAL_CONST(50345.193759000336/8.0), - REAL_CONST(50365.16705668252/8.0), - REAL_CONST(50385.142334762102/8.0), - REAL_CONST(50405.119592846473/8.0), - REAL_CONST(50425.098830543218/8.0), - REAL_CONST(50445.080047460127/8.0), - REAL_CONST(50465.063243205179/8.0), - REAL_CONST(50485.048417386541/8.0), - REAL_CONST(50505.035569612577/8.0), - REAL_CONST(50525.024699491856/8.0), - REAL_CONST(50545.015806633128/8.0), - REAL_CONST(50565.008890645338/8.0), - REAL_CONST(50585.003951137631/8.0), - REAL_CONST(50605.00098771933/8.0), - REAL_CONST(50624.999999999971/8.0), - REAL_CONST(50645.000987589265/8.0), - REAL_CONST(50665.003950097132/8.0), - REAL_CONST(50685.008887133677/8.0), - REAL_CONST(50705.015798309192/8.0), - REAL_CONST(50725.024683234165/8.0), - REAL_CONST(50745.035541519283/8.0), - REAL_CONST(50765.048372775411/8.0), - REAL_CONST(50785.063176613621/8.0), - REAL_CONST(50805.079952645159/8.0), - REAL_CONST(50825.098700481489/8.0), - REAL_CONST(50845.119419734241/8.0), - REAL_CONST(50865.142110015244/8.0), - REAL_CONST(50885.166770936521/8.0), - REAL_CONST(50905.193402110279/8.0), - REAL_CONST(50925.222003148934/8.0), - REAL_CONST(50945.252573665071/8.0), - REAL_CONST(50965.285113271471/8.0), - REAL_CONST(50985.319621581119/8.0), - REAL_CONST(51005.356098207172/8.0), - REAL_CONST(51025.394542762981/8.0), - REAL_CONST(51045.434954862096/8.0), - REAL_CONST(51065.477334118244/8.0), - REAL_CONST(51085.521680145357/8.0), - REAL_CONST(51105.567992557546/8.0), - REAL_CONST(51125.616270969113/8.0), - REAL_CONST(51145.66651499454/8.0), - REAL_CONST(51165.718724248516/8.0), - REAL_CONST(51185.772898345916/8.0), - REAL_CONST(51205.829036901778/8.0), - REAL_CONST(51225.887139531362/8.0), - REAL_CONST(51245.947205850105/8.0), - REAL_CONST(51266.009235473619/8.0), - REAL_CONST(51286.073228017718/8.0), - REAL_CONST(51306.139183098399/8.0), - REAL_CONST(51326.207100331856/8.0), - REAL_CONST(51346.276979334456/8.0), - REAL_CONST(51366.348819722756/8.0), - REAL_CONST(51386.42262111351/8.0), - REAL_CONST(51406.498383123653/8.0), - REAL_CONST(51426.57610537031/8.0), - REAL_CONST(51446.655787470787/8.0), - REAL_CONST(51466.737429042587/8.0), - REAL_CONST(51486.82102970338/8.0), - REAL_CONST(51506.906589071048/8.0), - REAL_CONST(51526.994106763632/8.0), - REAL_CONST(51547.083582399391/8.0), - REAL_CONST(51567.175015596738/8.0), - REAL_CONST(51587.268405974297/8.0), - REAL_CONST(51607.363753150858/8.0), - REAL_CONST(51627.461056745415/8.0), - REAL_CONST(51647.56031637713/8.0), - REAL_CONST(51667.661531665362/8.0), - REAL_CONST(51687.764702229651/8.0), - REAL_CONST(51707.869827689727/8.0), - REAL_CONST(51727.976907665499/8.0), - REAL_CONST(51748.085941777055/8.0), - REAL_CONST(51768.196929644677/8.0), - REAL_CONST(51788.309870888836/8.0), - REAL_CONST(51808.42476513017/8.0), - REAL_CONST(51828.541611989524/8.0), - REAL_CONST(51848.660411087905/8.0), - REAL_CONST(51868.781162046515/8.0), - REAL_CONST(51888.90386448674/8.0), - REAL_CONST(51909.028518030143/8.0), - REAL_CONST(51929.155122298485/8.0), - REAL_CONST(51949.283676913685/8.0), - REAL_CONST(51969.414181497872/8.0), - REAL_CONST(51989.546635673345/8.0), - REAL_CONST(52009.681039062583/8.0), - REAL_CONST(52029.817391288263/8.0), - REAL_CONST(52049.955691973213/8.0), - REAL_CONST(52070.095940740481/8.0), - REAL_CONST(52090.238137213273/8.0), - REAL_CONST(52110.382281014987/8.0), - REAL_CONST(52130.5283717692/8.0), - REAL_CONST(52150.676409099666/8.0), - REAL_CONST(52170.826392630333/8.0), - REAL_CONST(52190.97832198532/8.0), - REAL_CONST(52211.132196788931/8.0), - REAL_CONST(52231.288016665654/8.0), - REAL_CONST(52251.445781240145/8.0), - REAL_CONST(52271.60549013727/8.0), - REAL_CONST(52291.76714298204/8.0), - REAL_CONST(52311.930739399664/8.0), - REAL_CONST(52332.096279015546/8.0), - REAL_CONST(52352.263761455244/8.0), - REAL_CONST(52372.433186344519/8.0), - REAL_CONST(52392.604553309284/8.0), - REAL_CONST(52412.777861975665/8.0), - REAL_CONST(52432.953111969946/8.0), - REAL_CONST(52453.130302918595/8.0), - REAL_CONST(52473.309434448267/8.0), - REAL_CONST(52493.490506185793/8.0), - REAL_CONST(52513.67351775818/8.0), - REAL_CONST(52533.858468792605/8.0), - REAL_CONST(52554.045358916446/8.0), - REAL_CONST(52574.234187757254/8.0), - REAL_CONST(52594.42495494274/8.0), - REAL_CONST(52614.617660100812/8.0), - REAL_CONST(52634.812302859558/8.0), - REAL_CONST(52655.008882847229/8.0), - REAL_CONST(52675.20739969227/8.0), - REAL_CONST(52695.407853023295/8.0), - REAL_CONST(52715.610242469098/8.0), - REAL_CONST(52735.814567658657/8.0), - REAL_CONST(52756.02082822111/8.0), - REAL_CONST(52776.229023785803/8.0), - REAL_CONST(52796.439153982225/8.0), - REAL_CONST(52816.651218440056/8.0), - REAL_CONST(52836.865216789171/8.0), - REAL_CONST(52857.081148659599/8.0), - REAL_CONST(52877.29901368155/8.0), - REAL_CONST(52897.518811485425/8.0), - REAL_CONST(52917.740541701773/8.0), - REAL_CONST(52937.964203961354/8.0), - REAL_CONST(52958.18979789508/8.0), - REAL_CONST(52978.417323134046/8.0), - REAL_CONST(52998.646779309529/8.0), - REAL_CONST(53018.878166052978/8.0), - REAL_CONST(53039.111482996006/8.0), - REAL_CONST(53059.346729770419/8.0), - REAL_CONST(53079.583906008193/8.0), - REAL_CONST(53099.823011341483/8.0), - REAL_CONST(53120.0640454026/8.0), - REAL_CONST(53140.307007824063/8.0), - REAL_CONST(53160.551898238533/8.0), - REAL_CONST(53180.79871627887/8.0), - REAL_CONST(53201.047461578091/8.0), - REAL_CONST(53221.2981337694/8.0), - REAL_CONST(53241.550732486176/8.0), - REAL_CONST(53261.805257361964/8.0), - REAL_CONST(53282.061708030487/8.0), - REAL_CONST(53302.32008412564/8.0), - REAL_CONST(53322.580385281493/8.0), - REAL_CONST(53342.842611132299/8.0), - REAL_CONST(53363.106761312469/8.0), - REAL_CONST(53383.372835456597/8.0), - REAL_CONST(53403.640833199453/8.0), - REAL_CONST(53423.910754175973/8.0), - REAL_CONST(53444.18259802126/8.0), - REAL_CONST(53464.456364370613/8.0), - REAL_CONST(53484.732052859479/8.0), - REAL_CONST(53505.009663123499/8.0), - REAL_CONST(53525.289194798468/8.0), - REAL_CONST(53545.570647520362/8.0), - REAL_CONST(53565.854020925333/8.0), - REAL_CONST(53586.139314649699/8.0), - REAL_CONST(53606.426528329954/8.0), - REAL_CONST(53626.715661602764/8.0), - REAL_CONST(53647.006714104959/8.0), - REAL_CONST(53667.299685473547/8.0), - REAL_CONST(53687.59457534572/8.0), - REAL_CONST(53707.891383358816/8.0), - REAL_CONST(53728.190109150361/8.0), - REAL_CONST(53748.490752358055/8.0), - REAL_CONST(53768.793312619753/8.0), - REAL_CONST(53789.09778957349/8.0), - REAL_CONST(53809.404182857485/8.0), - REAL_CONST(53829.712492110106/8.0), - REAL_CONST(53850.022716969899/8.0), - REAL_CONST(53870.334857075584/8.0), - REAL_CONST(53890.648912066055/8.0), - REAL_CONST(53910.964881580367/8.0), - REAL_CONST(53931.28276525774/8.0), - REAL_CONST(53951.602562737586/8.0), - REAL_CONST(53971.924273659461/8.0), - REAL_CONST(53992.24789766311/8.0), - REAL_CONST(54012.57343438844/8.0), - REAL_CONST(54032.90088347553/8.0), - REAL_CONST(54053.23024456462/8.0), - REAL_CONST(54073.561517296133/8.0), - REAL_CONST(54093.894701310644/8.0), - REAL_CONST(54114.22979624891/8.0), - REAL_CONST(54134.566801751855/8.0), - REAL_CONST(54154.90571746057/8.0), - REAL_CONST(54175.246543016314/8.0), - REAL_CONST(54195.589278060506/8.0), - REAL_CONST(54215.933922234755/8.0), - REAL_CONST(54236.280475180814/8.0), - REAL_CONST(54256.628936540626/8.0), - REAL_CONST(54276.97930595628/8.0), - REAL_CONST(54297.331583070045/8.0), - REAL_CONST(54317.685767524359/8.0), - REAL_CONST(54338.041858961828/8.0), - REAL_CONST(54358.399857025215/8.0), - REAL_CONST(54378.759761357462/8.0), - REAL_CONST(54399.121571601667/8.0), - REAL_CONST(54419.485287401105/8.0), - REAL_CONST(54439.850908399218/8.0), - REAL_CONST(54460.218434239614/8.0), - REAL_CONST(54480.587864566056/8.0), - REAL_CONST(54500.95919902248/8.0), - REAL_CONST(54521.332437252997/8.0), - REAL_CONST(54541.707578901878/8.0), - REAL_CONST(54562.084623613555/8.0), - REAL_CONST(54582.46357103264/8.0), - REAL_CONST(54602.844420803893/8.0), - REAL_CONST(54623.227172572246/8.0), - REAL_CONST(54643.611825982807/8.0), - REAL_CONST(54663.998380680838/8.0), - REAL_CONST(54684.386836311773/8.0), - REAL_CONST(54704.777192521207/8.0), - REAL_CONST(54725.169448954897/8.0), - REAL_CONST(54745.563605258772/8.0), - REAL_CONST(54765.959661078923/8.0), - REAL_CONST(54786.357616061614/8.0), - REAL_CONST(54806.757469853255/8.0), - REAL_CONST(54827.159222100439/8.0), - REAL_CONST(54847.562872449904/8.0), - REAL_CONST(54867.968420548583/8.0), - REAL_CONST(54888.375866043534/8.0), - REAL_CONST(54908.785208582012/8.0), - REAL_CONST(54929.196447811417/8.0), - REAL_CONST(54949.609583379322/8.0), - REAL_CONST(54970.024614933463/8.0), - REAL_CONST(54990.441542121727/8.0), - REAL_CONST(55010.86036459219/8.0), - REAL_CONST(55031.28108199306/8.0), - REAL_CONST(55051.703693972733/8.0), - REAL_CONST(55072.128200179759/8.0), - REAL_CONST(55092.554600262847/8.0), - REAL_CONST(55112.982893870874/8.0), - REAL_CONST(55133.413080652877/8.0), - REAL_CONST(55153.845160258061/8.0), - REAL_CONST(55174.279132335789/8.0), - REAL_CONST(55194.714996535586/8.0), - REAL_CONST(55215.152752507143/8.0), - REAL_CONST(55235.592399900306/8.0), - REAL_CONST(55256.033938365079/8.0), - REAL_CONST(55276.477367551655/8.0), - REAL_CONST(55296.92268711036/8.0), - REAL_CONST(55317.369896691685/8.0), - REAL_CONST(55337.818995946305/8.0), - REAL_CONST(55358.269984525024/8.0), - REAL_CONST(55378.72286207883/8.0), - REAL_CONST(55399.177628258869/8.0), - REAL_CONST(55419.634282716441/8.0), - REAL_CONST(55440.092825103013/8.0), - REAL_CONST(55460.553255070205/8.0), - REAL_CONST(55481.015572269804/8.0), - REAL_CONST(55501.479776353764/8.0), - REAL_CONST(55521.945866974187/8.0), - REAL_CONST(55542.413843783339/8.0), - REAL_CONST(55562.883706433655/8.0), - REAL_CONST(55583.355454577715/8.0), - REAL_CONST(55603.82908786826/8.0), - REAL_CONST(55624.304605958219/8.0), - REAL_CONST(55644.782008500639/8.0), - REAL_CONST(55665.261295148754/8.0), - REAL_CONST(55685.742465555952/8.0), - REAL_CONST(55706.225519375774/8.0), - REAL_CONST(55726.710456261928/8.0), - REAL_CONST(55747.197275868275/8.0), - REAL_CONST(55767.685977848843/8.0), - REAL_CONST(55788.176561857814/8.0), - REAL_CONST(55808.669027549528/8.0), - REAL_CONST(55829.163374578478/8.0), - REAL_CONST(55849.659602599328/8.0), - REAL_CONST(55870.157711266889/8.0), - REAL_CONST(55890.657700236145/8.0), - REAL_CONST(55911.159569162221/8.0), - REAL_CONST(55931.663317700411/8.0), - REAL_CONST(55952.168945506164/8.0), - REAL_CONST(55972.676452235086/8.0), - REAL_CONST(55993.185837542944/8.0), - REAL_CONST(56013.697101085651/8.0), - REAL_CONST(56034.210242519301/8.0), - REAL_CONST(56054.72526150012/8.0), - REAL_CONST(56075.242157684508/8.0), - REAL_CONST(56095.760930729011/8.0), - REAL_CONST(56116.281580290342/8.0), - REAL_CONST(56136.804106025367/8.0), - REAL_CONST(56157.328507591104/8.0), - REAL_CONST(56177.85478464474/8.0), - REAL_CONST(56198.382936843598/8.0), - REAL_CONST(56218.912963845185/8.0), - REAL_CONST(56239.444865307138/8.0), - REAL_CONST(56259.978640887268/8.0), - REAL_CONST(56280.514290243525/8.0), - REAL_CONST(56301.051813034042/8.0), - REAL_CONST(56321.591208917082/8.0), - REAL_CONST(56342.13247755108/8.0), - REAL_CONST(56362.675618594607/8.0), - REAL_CONST(56383.220631706419/8.0), - REAL_CONST(56403.767516545398/8.0), - REAL_CONST(56424.316272770608/8.0), - REAL_CONST(56444.866900041241/8.0), - REAL_CONST(56465.419398016667/8.0), - REAL_CONST(56485.973766356394/8.0), - REAL_CONST(56506.530004720102/8.0), - REAL_CONST(56527.088112767611/8.0), - REAL_CONST(56547.648090158902/8.0), - REAL_CONST(56568.209936554107/8.0), - REAL_CONST(56588.773651613519/8.0), - REAL_CONST(56609.339234997584/8.0), - REAL_CONST(56629.9066863669/8.0), - REAL_CONST(56650.47600538221/8.0), - REAL_CONST(56671.04719170442/8.0), - REAL_CONST(56691.620244994599/8.0), - REAL_CONST(56712.195164913959/8.0), - REAL_CONST(56732.771951123868/8.0), - REAL_CONST(56753.350603285835/8.0), - REAL_CONST(56773.931121061541/8.0), - REAL_CONST(56794.513504112823/8.0), - REAL_CONST(56815.097752101647/8.0), - REAL_CONST(56835.683864690152/8.0), - REAL_CONST(56856.271841540627/8.0), - REAL_CONST(56876.86168231551/8.0), - REAL_CONST(56897.453386677393/8.0), - REAL_CONST(56918.046954289028/8.0), - REAL_CONST(56938.642384813298/8.0), - REAL_CONST(56959.239677913261/8.0), - REAL_CONST(56979.838833252121/8.0), - REAL_CONST(57000.439850493225/8.0), - REAL_CONST(57021.04272930009/8.0), - REAL_CONST(57041.647469336371/8.0), - REAL_CONST(57062.254070265873/8.0), - REAL_CONST(57082.862531752558/8.0), - REAL_CONST(57103.472853460553/8.0), - REAL_CONST(57124.085035054108/8.0), - REAL_CONST(57144.699076197649/8.0), - REAL_CONST(57165.314976555739/8.0), - REAL_CONST(57185.932735793103/8.0), - REAL_CONST(57206.552353574611/8.0), - REAL_CONST(57227.173829565276/8.0), - REAL_CONST(57247.797163430281/8.0), - REAL_CONST(57268.42235483494/8.0), - REAL_CONST(57289.049403444733/8.0), - REAL_CONST(57309.678308925286/8.0), - REAL_CONST(57330.30907094237/8.0), - REAL_CONST(57350.941689161911/8.0), - REAL_CONST(57371.576163249985/8.0), - REAL_CONST(57392.212492872815/8.0), - REAL_CONST(57412.850677696784/8.0), - REAL_CONST(57433.490717388406/8.0), - REAL_CONST(57454.132611614368/8.0), - REAL_CONST(57474.776360041491/8.0), - REAL_CONST(57495.421962336746/8.0), - REAL_CONST(57516.069418167266/8.0), - REAL_CONST(57536.718727200314/8.0), - REAL_CONST(57557.36988910332/8.0), - REAL_CONST(57578.022903543861/8.0), - REAL_CONST(57598.677770189643/8.0), - REAL_CONST(57619.334488708548/8.0), - REAL_CONST(57639.993058768589/8.0), - REAL_CONST(57660.653480037938/8.0), - REAL_CONST(57681.315752184906/8.0), - REAL_CONST(57701.979874877965/8.0), - REAL_CONST(57722.64584778573/8.0), - REAL_CONST(57743.31367057695/8.0), - REAL_CONST(57763.983342920546/8.0), - REAL_CONST(57784.654864485572/8.0), - REAL_CONST(57805.328234941233/8.0), - REAL_CONST(57826.003453956881/8.0), - REAL_CONST(57846.680521202026/8.0), - REAL_CONST(57867.359436346305/8.0), - REAL_CONST(57888.040199059527/8.0), - REAL_CONST(57908.722809011633/8.0), - REAL_CONST(57929.407265872709/8.0), - REAL_CONST(57950.093569313001/8.0), - REAL_CONST(57970.781719002895/8.0), - REAL_CONST(57991.471714612911/8.0), - REAL_CONST(58012.16355581375/8.0), - REAL_CONST(58032.857242276223/8.0), - REAL_CONST(58053.552773671312/8.0), - REAL_CONST(58074.25014967013/8.0), - REAL_CONST(58094.949369943948/8.0), - REAL_CONST(58115.650434164185/8.0), - REAL_CONST(58136.353342002389/8.0), - REAL_CONST(58157.058093130276/8.0), - REAL_CONST(58177.764687219693/8.0), - REAL_CONST(58198.47312394264/8.0), - REAL_CONST(58219.183402971255/8.0), - REAL_CONST(58239.895523977837/8.0), - REAL_CONST(58260.609486634821/8.0), - REAL_CONST(58281.325290614775/8.0), - REAL_CONST(58302.042935590434/8.0), - REAL_CONST(58322.762421234678/8.0), - REAL_CONST(58343.483747220511/8.0), - REAL_CONST(58364.206913221096/8.0), - REAL_CONST(58384.931918909751/8.0), - REAL_CONST(58405.658763959924/8.0), - REAL_CONST(58426.3874480452/8.0), - REAL_CONST(58447.117970839339/8.0), - REAL_CONST(58467.85033201622/8.0), - REAL_CONST(58488.584531249864/8.0), - REAL_CONST(58509.320568214462/8.0), - REAL_CONST(58530.058442584334/8.0), - REAL_CONST(58550.798154033931/8.0), - REAL_CONST(58571.539702237875/8.0), - REAL_CONST(58592.283086870906/8.0), - REAL_CONST(58613.028307607929/8.0), - REAL_CONST(58633.775364123983/8.0), - REAL_CONST(58654.52425609425/8.0), - REAL_CONST(58675.274983194053/8.0), - REAL_CONST(58696.027545098877/8.0), - REAL_CONST(58716.781941484325/8.0), - REAL_CONST(58737.538172026158/8.0), - REAL_CONST(58758.296236400274/8.0), - REAL_CONST(58779.056134282728/8.0), - REAL_CONST(58799.817865349694/8.0), - REAL_CONST(58820.581429277503/8.0), - REAL_CONST(58841.346825742643/8.0), - REAL_CONST(58862.114054421712/8.0), - REAL_CONST(58882.883114991484/8.0), - REAL_CONST(58903.654007128847/8.0), - REAL_CONST(58924.426730510851/8.0), - REAL_CONST(58945.201284814684/8.0), - REAL_CONST(58965.977669717664/8.0), - REAL_CONST(58986.755884897269/8.0), - REAL_CONST(59007.535930031117/8.0), - REAL_CONST(59028.317804796949/8.0), - REAL_CONST(59049.101508872664/8.0), - REAL_CONST(59069.887041936301/8.0), - REAL_CONST(59090.674403666046/8.0), - REAL_CONST(59111.463593740213/8.0), - REAL_CONST(59132.254611837263/8.0), - REAL_CONST(59153.047457635803/8.0), - REAL_CONST(59173.84213081457/8.0), - REAL_CONST(59194.638631052461/8.0), - REAL_CONST(59215.436958028506/8.0), - REAL_CONST(59236.237111421855/8.0), - REAL_CONST(59257.039090911829/8.0), - REAL_CONST(59277.842896177877/8.0), - REAL_CONST(59298.648526899589/8.0), - REAL_CONST(59319.455982756685/8.0), - REAL_CONST(59340.26526342905/8.0), - REAL_CONST(59361.076368596696/8.0), - REAL_CONST(59381.889297939757/8.0), - REAL_CONST(59402.704051138542/8.0), - REAL_CONST(59423.520627873484/8.0), - REAL_CONST(59444.339027825139/8.0), - REAL_CONST(59465.159250674224/8.0), - REAL_CONST(59485.9812961016/8.0), - REAL_CONST(59506.805163788253/8.0), - REAL_CONST(59527.630853415307/8.0), - REAL_CONST(59548.458364664046/8.0), - REAL_CONST(59569.287697215863/8.0), - REAL_CONST(59590.118850752311/8.0), - REAL_CONST(59610.951824955089/8.0), - REAL_CONST(59631.786619506012/8.0), - REAL_CONST(59652.623234087048/8.0), - REAL_CONST(59673.461668380311/8.0), - REAL_CONST(59694.301922068029/8.0), - REAL_CONST(59715.143994832593/8.0), - REAL_CONST(59735.987886356525/8.0), - REAL_CONST(59756.833596322482/8.0), - REAL_CONST(59777.681124413255/8.0), - REAL_CONST(59798.530470311794/8.0), - REAL_CONST(59819.381633701159/8.0), - REAL_CONST(59840.234614264569/8.0), - REAL_CONST(59861.089411685381/8.0), - REAL_CONST(59881.94602564707/8.0), - REAL_CONST(59902.804455833269/8.0), - REAL_CONST(59923.664701927737/8.0), - REAL_CONST(59944.526763614384/8.0), - REAL_CONST(59965.390640577243/8.0), - REAL_CONST(59986.256332500488/8.0), - REAL_CONST(60007.123839068438/8.0), - REAL_CONST(60027.993159965539/8.0), - REAL_CONST(60048.864294876381/8.0), - REAL_CONST(60069.737243485688/8.0), - REAL_CONST(60090.612005478324/8.0), - REAL_CONST(60111.488580539284/8.0), - REAL_CONST(60132.366968353708/8.0), - REAL_CONST(60153.247168606867/8.0), - REAL_CONST(60174.129180984164/8.0), - REAL_CONST(60195.013005171153/8.0), - REAL_CONST(60215.898640853513/8.0), - REAL_CONST(60236.786087717061/8.0), - REAL_CONST(60257.675345447751/8.0), - REAL_CONST(60278.566413731671/8.0), - REAL_CONST(60299.459292255044/8.0), - REAL_CONST(60320.353980704247/8.0), - REAL_CONST(60341.25047876576/8.0), - REAL_CONST(60362.148786126229/8.0), - REAL_CONST(60383.048902472423/8.0), - REAL_CONST(60403.950827491237/8.0), - REAL_CONST(60424.854560869717/8.0), - REAL_CONST(60445.76010229504/8.0), - REAL_CONST(60466.667451454516/8.0), - REAL_CONST(60487.57660803559/8.0), - REAL_CONST(60508.487571725847/8.0), - REAL_CONST(60529.400342212997/8.0), - REAL_CONST(60550.314919184893/8.0), - REAL_CONST(60571.231302329521/8.0), - REAL_CONST(60592.149491335003/8.0), - REAL_CONST(60613.069485889588/8.0), - REAL_CONST(60633.991285681674/8.0), - REAL_CONST(60654.914890399785/8.0), - REAL_CONST(60675.840299732568/8.0), - REAL_CONST(60696.767513368832/8.0), - REAL_CONST(60717.696530997484/8.0), - REAL_CONST(60738.627352307602/8.0), - REAL_CONST(60759.55997698837/8.0), - REAL_CONST(60780.494404729128/8.0), - REAL_CONST(60801.430635219323/8.0), - REAL_CONST(60822.368668148556/8.0), - REAL_CONST(60843.308503206565/8.0), - REAL_CONST(60864.250140083204/8.0), - REAL_CONST(60885.193578468468/8.0), - REAL_CONST(60906.138818052495/8.0), - REAL_CONST(60927.085858525541/8.0), - REAL_CONST(60948.034699578006/8.0), - REAL_CONST(60968.985340900421/8.0), - REAL_CONST(60989.937782183442/8.0), - REAL_CONST(61010.892023117864/8.0), - REAL_CONST(61031.848063394616/8.0), - REAL_CONST(61052.805902704764/8.0), - REAL_CONST(61073.765540739492/8.0), - REAL_CONST(61094.726977190134/8.0), - REAL_CONST(61115.690211748137/8.0), - REAL_CONST(61136.655244105103/8.0), - REAL_CONST(61157.622073952742/8.0), - REAL_CONST(61178.590700982917/8.0), - REAL_CONST(61199.561124887616/8.0), - REAL_CONST(61220.533345358948/8.0), - REAL_CONST(61241.507362089171/8.0), - REAL_CONST(61262.483174770663/8.0), - REAL_CONST(61283.460783095943/8.0), - REAL_CONST(61304.440186757645/8.0), - REAL_CONST(61325.421385448557/8.0), - REAL_CONST(61346.404378861582/8.0), - REAL_CONST(61367.389166689762/8.0), - REAL_CONST(61388.375748626262/8.0), - REAL_CONST(61409.364124364387/8.0), - REAL_CONST(61430.354293597571/8.0), - REAL_CONST(61451.346256019373/8.0), - REAL_CONST(61472.340011323497/8.0), - REAL_CONST(61493.335559203762/8.0), - REAL_CONST(61514.332899354122/8.0), - REAL_CONST(61535.332031468672/8.0), - REAL_CONST(61556.332955241618/8.0), - REAL_CONST(61577.335670367313/8.0), - REAL_CONST(61598.340176540238/8.0), - REAL_CONST(61619.346473454993/8.0), - REAL_CONST(61640.354560806329/8.0), - REAL_CONST(61661.3644382891/8.0), - REAL_CONST(61682.376105598312/8.0), - REAL_CONST(61703.389562429089/8.0), - REAL_CONST(61724.404808476691/8.0), - REAL_CONST(61745.42184343651/8.0), - REAL_CONST(61766.440667004063/8.0), - REAL_CONST(61787.461278874987/8.0), - REAL_CONST(61808.483678745069/8.0), - REAL_CONST(61829.507866310203/8.0), - REAL_CONST(61850.533841266435/8.0), - REAL_CONST(61871.561603309929/8.0), - REAL_CONST(61892.591152136971/8.0), - REAL_CONST(61913.622487443987/8.0), - REAL_CONST(61934.655608927525/8.0), - REAL_CONST(61955.690516284267/8.0), - REAL_CONST(61976.727209211022/8.0), - REAL_CONST(61997.765687404724/8.0), - REAL_CONST(62018.805950562448/8.0), - REAL_CONST(62039.847998381381/8.0), - REAL_CONST(62060.891830558845/8.0), - REAL_CONST(62081.93744679229/8.0), - REAL_CONST(62102.984846779298/8.0), - REAL_CONST(62124.034030217575/8.0), - REAL_CONST(62145.084996804966/8.0), - REAL_CONST(62166.137746239416/8.0), - REAL_CONST(62187.19227821903/8.0), - REAL_CONST(62208.248592442025/8.0), - REAL_CONST(62229.306688606739/8.0), - REAL_CONST(62250.366566411656/8.0), - REAL_CONST(62271.428225555377/8.0), - REAL_CONST(62292.491665736627/8.0), - REAL_CONST(62313.556886654267/8.0), - REAL_CONST(62334.623888007271/8.0), - REAL_CONST(62355.692669494762/8.0), - REAL_CONST(62376.763230815974/8.0), - REAL_CONST(62397.835571670272/8.0), - REAL_CONST(62418.909691757144/8.0), - REAL_CONST(62439.98559077621/8.0), - REAL_CONST(62461.063268427228/8.0), - REAL_CONST(62482.142724410049/8.0), - REAL_CONST(62503.223958424685/8.0), - REAL_CONST(62524.306970171267/8.0), - REAL_CONST(62545.39175935003/8.0), - REAL_CONST(62566.478325661366/8.0), - REAL_CONST(62587.566668805768/8.0), - REAL_CONST(62608.656788483881/8.0), - REAL_CONST(62629.748684396451/8.0), - REAL_CONST(62650.842356244357/8.0), - REAL_CONST(62671.937803728622/8.0), - REAL_CONST(62693.035026550366/8.0), - REAL_CONST(62714.134024410858/8.0), - REAL_CONST(62735.234797011479/8.0), - REAL_CONST(62756.337344053733/8.0), - REAL_CONST(62777.441665239276/8.0), - REAL_CONST(62798.547760269852/8.0), - REAL_CONST(62819.655628847358/8.0), - REAL_CONST(62840.765270673801/8.0), - REAL_CONST(62861.876685451323/8.0), - REAL_CONST(62882.989872882186/8.0), - REAL_CONST(62904.104832668774/8.0), - REAL_CONST(62925.221564513602/8.0), - REAL_CONST(62946.340068119309/8.0), - REAL_CONST(62967.460343188657/8.0), - REAL_CONST(62988.582389424526/8.0), - REAL_CONST(63009.70620652994/8.0), - REAL_CONST(63030.831794208025/8.0), - REAL_CONST(63051.959152162039/8.0), - REAL_CONST(63073.08828009537/8.0), - REAL_CONST(63094.219177711529/8.0), - REAL_CONST(63115.351844714154/8.0), - REAL_CONST(63136.486280806988/8.0), - REAL_CONST(63157.622485693922/8.0), - REAL_CONST(63178.760459078956/8.0), - REAL_CONST(63199.900200666219/8.0), - REAL_CONST(63221.041710159967/8.0), - REAL_CONST(63242.184987264569/8.0), - REAL_CONST(63263.330031684534/8.0), - REAL_CONST(63284.476843124474/8.0), - REAL_CONST(63305.625421289144/8.0), - REAL_CONST(63326.775765883409/8.0), - REAL_CONST(63347.927876612259/8.0), - REAL_CONST(63369.081753180813/8.0), - REAL_CONST(63390.237395294316/8.0), - REAL_CONST(63411.39480265812/8.0), - REAL_CONST(63432.553974977716/8.0), - REAL_CONST(63453.714911958712/8.0), - REAL_CONST(63474.877613306839/8.0), - REAL_CONST(63496.042078727944/8.0), - REAL_CONST(63517.208307927998/8.0), - REAL_CONST(63538.376300613119/8.0), - REAL_CONST(63559.546056489504/8.0), - REAL_CONST(63580.717575263516/8.0), - REAL_CONST(63601.890856641607/8.0), - REAL_CONST(63623.065900330374/8.0), - REAL_CONST(63644.242706036515/8.0), - REAL_CONST(63665.421273466869/8.0), - REAL_CONST(63686.601602328381/8.0), - REAL_CONST(63707.783692328136/8.0), - REAL_CONST(63728.967543173334/8.0), - REAL_CONST(63750.153154571279/8.0), - REAL_CONST(63771.340526229418/8.0), - REAL_CONST(63792.529657855317/8.0), - REAL_CONST(63813.720549156649/8.0), - REAL_CONST(63834.913199841227/8.0), - REAL_CONST(63856.107609616978/8.0), - REAL_CONST(63877.303778191941/8.0), - REAL_CONST(63898.501705274284/8.0), - REAL_CONST(63919.7013905723/8.0), - REAL_CONST(63940.902833794404/8.0), - REAL_CONST(63962.106034649114/8.0), - REAL_CONST(63983.310992845094/8.0), - REAL_CONST(64004.517708091109/8.0), - REAL_CONST(64025.726180096048/8.0), - REAL_CONST(64046.936408568938/8.0), - REAL_CONST(64068.1483932189/8.0), - REAL_CONST(64089.362133755196/8.0), - REAL_CONST(64110.577629887193/8.0), - REAL_CONST(64131.794881324393/8.0), - REAL_CONST(64153.013887776404/8.0), - REAL_CONST(64174.234648952966/8.0), - REAL_CONST(64195.457164563937/8.0), - REAL_CONST(64216.681434319289/8.0), - REAL_CONST(64237.907457929112/8.0), - REAL_CONST(64259.135235103626/8.0), - REAL_CONST(64280.36476555316/8.0), - REAL_CONST(64301.596048988169/8.0), - REAL_CONST(64322.829085119236/8.0), - REAL_CONST(64344.06387365704/8.0), - REAL_CONST(64365.300414312398/8.0), - REAL_CONST(64386.538706796251/8.0), - REAL_CONST(64407.778750819634/8.0), - REAL_CONST(64429.020546093721/8.0), - REAL_CONST(64450.26409232981/8.0), - REAL_CONST(64471.509389239291/8.0), - REAL_CONST(64492.756436533709/8.0), - REAL_CONST(64514.005233924705/8.0), - REAL_CONST(64535.255781124033/8.0), - REAL_CONST(64556.50807784358/8.0), - REAL_CONST(64577.762123795357/8.0), - REAL_CONST(64599.017918691468/8.0), - REAL_CONST(64620.275462244172/8.0), - REAL_CONST(64641.534754165805/8.0), - REAL_CONST(64662.795794168844/8.0), - REAL_CONST(64684.058581965895/8.0), - REAL_CONST(64705.323117269661/8.0), - REAL_CONST(64726.589399792974/8.0), - REAL_CONST(64747.857429248776/8.0), - REAL_CONST(64769.127205350138/8.0), - REAL_CONST(64790.398727810236/8.0), - REAL_CONST(64811.671996342375/8.0), - REAL_CONST(64832.947010659969/8.0), - REAL_CONST(64854.223770476558/8.0), - REAL_CONST(64875.502275505794/8.0), - REAL_CONST(64896.782525461451/8.0), - REAL_CONST(64918.064520057414/8.0), - REAL_CONST(64939.348259007682/8.0), - REAL_CONST(64960.633742026388/8.0), - REAL_CONST(64981.920968827762/8.0), - REAL_CONST(65003.209939126165/8.0), - REAL_CONST(65024.500652636067/8.0), - REAL_CONST(65045.793109072067/8.0), - REAL_CONST(65067.087308148861/8.0), - REAL_CONST(65088.383249581282/8.0), - REAL_CONST(65109.680933084259/8.0), - REAL_CONST(65130.980358372864/8.0), - REAL_CONST(65152.28152516226/8.0), - REAL_CONST(65173.584433167736/8.0), - REAL_CONST(65194.889082104703/8.0), - REAL_CONST(65216.195471688683/8.0), - REAL_CONST(65237.503601635319/8.0), - REAL_CONST(65258.813471660353/8.0), - REAL_CONST(65280.125081479666/8.0), - REAL_CONST(65301.438430809241/8.0), - REAL_CONST(65322.753519365178/8.0), - REAL_CONST(65344.070346863708/8.0), - REAL_CONST(65365.388913021146/8.0), - REAL_CONST(65386.709217553958/8.0), - REAL_CONST(65408.031260178701/8.0), - REAL_CONST(65429.355040612056/8.0), - REAL_CONST(65450.680558570821/8.0), - REAL_CONST(65472.00781377191/8.0), - REAL_CONST(65493.336805932355/8.0), - REAL_CONST(65514.66753476928/8.0), - REAL_CONST(65535.999999999956/8.0), - REAL_CONST(65557.334201341757/8.0), - REAL_CONST(65578.670138512171/8.0), - REAL_CONST(65600.007811228788/8.0), - REAL_CONST(65621.347219209332/8.0), - REAL_CONST(65642.688362171626/8.0), - REAL_CONST(65664.031239833639/8.0), - REAL_CONST(65685.375851913413/8.0), - REAL_CONST(65706.722198129137/8.0), - REAL_CONST(65728.070278199084/8.0), - REAL_CONST(65749.420091841661/8.0), - REAL_CONST(65770.771638775404/8.0), - REAL_CONST(65792.124918718939/8.0), - REAL_CONST(65813.479931391004/8.0), - REAL_CONST(65834.836676510458/8.0), - REAL_CONST(65856.195153796303/8.0), - REAL_CONST(65877.5553629676/8.0), - REAL_CONST(65898.917303743554/8.0), - REAL_CONST(65920.280975843489/8.0), - REAL_CONST(65941.646378986843/8.0), - REAL_CONST(65963.013512893158/8.0), - REAL_CONST(65984.382377282076/8.0), - REAL_CONST(66005.752971873386/8.0), - REAL_CONST(66027.125296386963/8.0), - REAL_CONST(66048.499350542799/8.0), - REAL_CONST(66069.875134061018/8.0), - REAL_CONST(66091.252646661844/8.0), - REAL_CONST(66112.631888065618/8.0), - REAL_CONST(66134.01285799277/8.0), - REAL_CONST(66155.395556163887/8.0), - REAL_CONST(66176.779982299631/8.0), - REAL_CONST(66198.166136120795/8.0), - REAL_CONST(66219.554017348273/8.0), - REAL_CONST(66240.943625703105/8.0), - REAL_CONST(66262.334960906388/8.0), - REAL_CONST(66283.728022679396/8.0), - REAL_CONST(66305.122810743444/8.0), - REAL_CONST(66326.519324820023/8.0), - REAL_CONST(66347.917564630698/8.0), - REAL_CONST(66369.317529897162/8.0), - REAL_CONST(66390.719220341227/8.0), - REAL_CONST(66412.122635684791/8.0), - REAL_CONST(66433.527775649884/8.0), - REAL_CONST(66454.934639958636/8.0), - REAL_CONST(66476.343228333324/8.0), - REAL_CONST(66497.753540496284/8.0), - REAL_CONST(66519.165576169995/8.0), - REAL_CONST(66540.57933507704/8.0), - REAL_CONST(66561.994816940118/8.0), - REAL_CONST(66583.412021482043/8.0), - REAL_CONST(66604.830948425733/8.0), - REAL_CONST(66626.251597494222/8.0), - REAL_CONST(66647.673968410629/8.0), - REAL_CONST(66669.098060898235/8.0), - REAL_CONST(66690.523874680381/8.0), - REAL_CONST(66711.951409480564/8.0), - REAL_CONST(66733.380665022371/8.0), - REAL_CONST(66754.811641029475/8.0), - REAL_CONST(66776.244337225711/8.0), - REAL_CONST(66797.678753334985/8.0), - REAL_CONST(66819.11488908132/8.0), - REAL_CONST(66840.552744188884/8.0), - REAL_CONST(66861.992318381905/8.0), - REAL_CONST(66883.433611384738/8.0), - REAL_CONST(66904.876622921889/8.0), - REAL_CONST(66926.321352717903/8.0), - REAL_CONST(66947.767800497502/8.0), - REAL_CONST(66969.215965985466/8.0), - REAL_CONST(66990.665848906734/8.0), - REAL_CONST(67012.117448986304/8.0), - REAL_CONST(67033.570765949335/8.0), - REAL_CONST(67055.025799521056/8.0), - REAL_CONST(67076.482549426815/8.0), - REAL_CONST(67097.941015392076/8.0), - REAL_CONST(67119.401197142433/8.0), - REAL_CONST(67140.863094403554/8.0), - REAL_CONST(67162.326706901222/8.0), - REAL_CONST(67183.792034361351/8.0), - REAL_CONST(67205.259076509959/8.0), - REAL_CONST(67226.72783307315/8.0), - REAL_CONST(67248.198303777172/8.0), - REAL_CONST(67269.670488348347/8.0), - REAL_CONST(67291.144386513144/8.0), - REAL_CONST(67312.619997998088/8.0), - REAL_CONST(67334.09732252988/8.0), - REAL_CONST(67355.576359835293/8.0), - REAL_CONST(67377.057109641188/8.0), - REAL_CONST(67398.53957167457/8.0), - REAL_CONST(67420.023745662547/8.0), - REAL_CONST(67441.50963133233/8.0), - REAL_CONST(67462.99722841123/8.0), - REAL_CONST(67484.486536626689/8.0), - REAL_CONST(67505.977555706224/8.0), - REAL_CONST(67527.470285377494/8.0), - REAL_CONST(67548.964725368263/8.0), - REAL_CONST(67570.460875406367/8.0), - REAL_CONST(67591.9587352198/8.0), - REAL_CONST(67613.458304536631/8.0), - REAL_CONST(67634.95958308503/8.0), - REAL_CONST(67656.462570593329/8.0), - REAL_CONST(67677.967266789899/8.0), - REAL_CONST(67699.473671403248/8.0), - REAL_CONST(67720.981784162024/8.0), - REAL_CONST(67742.491604794923/8.0), - REAL_CONST(67764.003133030797/8.0), - REAL_CONST(67785.516368598575/8.0), - REAL_CONST(67807.031311227314/8.0), - REAL_CONST(67828.547960646174/8.0), - REAL_CONST(67850.066316584402/8.0), - REAL_CONST(67871.58637877139/8.0), - REAL_CONST(67893.108146936589/8.0), - REAL_CONST(67914.63162080961/8.0), - REAL_CONST(67936.156800120138/8.0), - REAL_CONST(67957.683684597971/8.0), - REAL_CONST(67979.212273973011/8.0), - REAL_CONST(68000.742567975263/8.0), - REAL_CONST(68022.274566334876/8.0), - REAL_CONST(68043.808268782057/8.0), - REAL_CONST(68065.343675047145/8.0), - REAL_CONST(68086.880784860579/8.0), - REAL_CONST(68108.419597952918/8.0), - REAL_CONST(68129.960114054789/8.0), - REAL_CONST(68151.502332896969/8.0), - REAL_CONST(68173.04625421032/8.0), - REAL_CONST(68194.591877725834/8.0), - REAL_CONST(68216.139203174564/8.0), - REAL_CONST(68237.688230287706/8.0), - REAL_CONST(68259.238958796544/8.0), - REAL_CONST(68280.791388432481/8.0), - REAL_CONST(68302.345518927032/8.0), - REAL_CONST(68323.901350011787/8.0), - REAL_CONST(68345.458881418483/8.0), - REAL_CONST(68367.018112878912/8.0), - REAL_CONST(68388.579044125028/8.0), - REAL_CONST(68410.141674888844/8.0), - REAL_CONST(68431.706004902502/8.0), - REAL_CONST(68453.272033898262/8.0), - REAL_CONST(68474.839761608455/8.0), - REAL_CONST(68496.409187765545/8.0), - REAL_CONST(68517.980312102081/8.0), - REAL_CONST(68539.553134350732/8.0), - REAL_CONST(68561.127654244279/8.0), - REAL_CONST(68582.70387151558/8.0), - REAL_CONST(68604.281785897634/8.0), - REAL_CONST(68625.861397123503/8.0), - REAL_CONST(68647.44270492639/8.0), - REAL_CONST(68669.025709039604/8.0), - REAL_CONST(68690.610409196524/8.0), - REAL_CONST(68712.196805130661/8.0), - REAL_CONST(68733.784896575627/8.0), - REAL_CONST(68755.374683265123/8.0), - REAL_CONST(68776.966164932994/8.0), - REAL_CONST(68798.559341313128/8.0), - REAL_CONST(68820.154212139591/8.0), - REAL_CONST(68841.750777146473/8.0), - REAL_CONST(68863.349036068044/8.0), - REAL_CONST(68884.948988638629/8.0), - REAL_CONST(68906.550634592684/8.0), - REAL_CONST(68928.153973664739/8.0), - REAL_CONST(68949.75900558944/8.0), - REAL_CONST(68971.365730101577/8.0), - REAL_CONST(68992.974146935987/8.0), - REAL_CONST(69014.584255827634/8.0), - REAL_CONST(69036.196056511588/8.0), - REAL_CONST(69057.809548723017/8.0), - REAL_CONST(69079.424732197207/8.0), - REAL_CONST(69101.041606669532/8.0), - REAL_CONST(69122.660171875468/8.0), - REAL_CONST(69144.280427550606/8.0), - REAL_CONST(69165.902373430625/8.0), - REAL_CONST(69187.526009251334/8.0), - REAL_CONST(69209.151334748618/8.0), - REAL_CONST(69230.778349658474/8.0), - REAL_CONST(69252.40705371699/8.0), - REAL_CONST(69274.037446660412/8.0), - REAL_CONST(69295.669528225/8.0), - REAL_CONST(69317.303298147192/8.0), - REAL_CONST(69338.938756163494/8.0), - REAL_CONST(69360.575902010532/8.0), - REAL_CONST(69382.214735425005/8.0), - REAL_CONST(69403.855256143754/8.0), - REAL_CONST(69425.497463903681/8.0), - REAL_CONST(69447.141358441833/8.0), - REAL_CONST(69468.78693949533/8.0), - REAL_CONST(69490.434206801394/8.0), - REAL_CONST(69512.083160097391/8.0), - REAL_CONST(69533.733799120717/8.0), - REAL_CONST(69555.386123608929/8.0), - REAL_CONST(69577.04013329967/8.0), - REAL_CONST(69598.695827930685/8.0), - REAL_CONST(69620.353207239794/8.0), - REAL_CONST(69642.012270964973/8.0), - REAL_CONST(69663.67301884426/8.0), - REAL_CONST(69685.335450615792/8.0), - REAL_CONST(69706.999566017839/8.0), - REAL_CONST(69728.665364788743/8.0), - REAL_CONST(69750.332846666963/8.0), - REAL_CONST(69772.002011391058/8.0), - REAL_CONST(69793.672858699691/8.0), - REAL_CONST(69815.345388331611/8.0), - REAL_CONST(69837.019600025669/8.0), - REAL_CONST(69858.695493520849/8.0), - REAL_CONST(69880.373068556204/8.0), - REAL_CONST(69902.052324870907/8.0), - REAL_CONST(69923.733262204216/8.0), - REAL_CONST(69945.415880295492/8.0), - REAL_CONST(69967.100178884211/8.0), - REAL_CONST(69988.786157709939/8.0), - REAL_CONST(70010.473816512356/8.0), - REAL_CONST(70032.163155031216/8.0), - REAL_CONST(70053.854173006403/8.0), - REAL_CONST(70075.546870177874/8.0), - REAL_CONST(70097.241246285717/8.0), - REAL_CONST(70118.937301070109/8.0), - REAL_CONST(70140.635034271298/8.0), - REAL_CONST(70162.334445629691/8.0), - REAL_CONST(70184.035534885741/8.0), - REAL_CONST(70205.738301780017/8.0), - REAL_CONST(70227.442746053217/8.0), - REAL_CONST(70249.1488674461/8.0), - REAL_CONST(70270.856665699539/8.0), - REAL_CONST(70292.566140554511/8.0), - REAL_CONST(70314.277291752107/8.0), - REAL_CONST(70335.990119033493/8.0), - REAL_CONST(70357.704622139936/8.0), - REAL_CONST(70379.420800812819/8.0), - REAL_CONST(70401.138654793613/8.0), - REAL_CONST(70422.85818382389/8.0), - REAL_CONST(70444.579387645339/8.0), - REAL_CONST(70466.302265999722/8.0), - REAL_CONST(70488.026818628918/8.0), - REAL_CONST(70509.753045274876/8.0), - REAL_CONST(70531.480945679708/8.0), - REAL_CONST(70553.210519585555/8.0), - REAL_CONST(70574.941766734701/8.0), - REAL_CONST(70596.674686869505/8.0), - REAL_CONST(70618.409279732456/8.0), - REAL_CONST(70640.145545066101/8.0), - REAL_CONST(70661.883482613106/8.0), - REAL_CONST(70683.623092116264/8.0), - REAL_CONST(70705.364373318414/8.0), - REAL_CONST(70727.107325962526/8.0), - REAL_CONST(70748.851949791671/8.0), - REAL_CONST(70770.598244549008/8.0), - REAL_CONST(70792.346209977783/8.0), - REAL_CONST(70814.095845821372/8.0), - REAL_CONST(70835.847151823225/8.0), - REAL_CONST(70857.600127726895/8.0), - REAL_CONST(70879.354773276034/8.0), - REAL_CONST(70901.111088214413/8.0), - REAL_CONST(70922.869072285859/8.0), - REAL_CONST(70944.628725234332/8.0), - REAL_CONST(70966.390046803877/8.0), - REAL_CONST(70988.153036738629/8.0), - REAL_CONST(71009.917694782853/8.0), - REAL_CONST(71031.684020680885/8.0), - REAL_CONST(71053.45201417715/8.0), - REAL_CONST(71075.221675016204/8.0), - REAL_CONST(71096.993002942661/8.0), - REAL_CONST(71118.765997701266/8.0), - REAL_CONST(71140.540659036851/8.0), - REAL_CONST(71162.316986694335/8.0), - REAL_CONST(71184.09498041874/8.0), - REAL_CONST(71205.874639955218/8.0), - REAL_CONST(71227.655965048951/8.0), - REAL_CONST(71249.438955445294/8.0), - REAL_CONST(71271.223610889632/8.0), - REAL_CONST(71293.009931127483/8.0), - REAL_CONST(71314.797915904477/8.0), - REAL_CONST(71336.587564966307/8.0), - REAL_CONST(71358.378878058764/8.0), - REAL_CONST(71380.171854927772/8.0), - REAL_CONST(71401.966495319313/8.0), - REAL_CONST(71423.762798979486/8.0), - REAL_CONST(71445.560765654489/8.0), - REAL_CONST(71467.360395090596/8.0), - REAL_CONST(71489.161687034211/8.0), - REAL_CONST(71510.964641231811/8.0), - REAL_CONST(71532.769257429973/8.0), - REAL_CONST(71554.575535375348/8.0), - REAL_CONST(71576.383474814749/8.0), - REAL_CONST(71598.19307549503/8.0), - REAL_CONST(71620.004337163133/8.0), - REAL_CONST(71641.817259566145/8.0), - REAL_CONST(71663.631842451214/8.0), - REAL_CONST(71685.4480855656/8.0), - REAL_CONST(71707.26598865664/8.0), - REAL_CONST(71729.085551471784/8.0), - REAL_CONST(71750.906773758586/8.0), - REAL_CONST(71772.729655264673/8.0), - REAL_CONST(71794.554195737772/8.0), - REAL_CONST(71816.380394925713/8.0), - REAL_CONST(71838.208252576442/8.0), - REAL_CONST(71860.037768437964/8.0), - REAL_CONST(71881.868942258385/8.0), - REAL_CONST(71903.701773785942/8.0), - REAL_CONST(71925.536262768932/8.0), - REAL_CONST(71947.372408955751/8.0), - REAL_CONST(71969.210212094898/8.0), - REAL_CONST(71991.049671934976/8.0), - REAL_CONST(72012.890788224686/8.0), - REAL_CONST(72034.73356071279/8.0), - REAL_CONST(72056.577989148165/8.0), - REAL_CONST(72078.424073279821/8.0), - REAL_CONST(72100.271812856794/8.0), - REAL_CONST(72122.121207628254/8.0), - REAL_CONST(72143.97225734347/8.0), - REAL_CONST(72165.824961751801/8.0), - REAL_CONST(72187.679320602692/8.0), - REAL_CONST(72209.53533364569/8.0), - REAL_CONST(72231.393000630429/8.0), - REAL_CONST(72253.252321306645/8.0), - REAL_CONST(72275.113295424177/8.0), - REAL_CONST(72296.975922732949/8.0), - REAL_CONST(72318.840202982959/8.0), - REAL_CONST(72340.706135924338/8.0), - REAL_CONST(72362.573721307272/8.0), - REAL_CONST(72384.442958882093/8.0), - REAL_CONST(72406.313848399179/8.0), - REAL_CONST(72428.186389609036/8.0), - REAL_CONST(72450.060582262216/8.0), - REAL_CONST(72471.936426109431/8.0), - REAL_CONST(72493.813920901433/8.0), - REAL_CONST(72515.693066389096/8.0), - REAL_CONST(72537.573862323392/8.0), - REAL_CONST(72559.456308455352/8.0), - REAL_CONST(72581.340404536139/8.0), - REAL_CONST(72603.226150316987/8.0), - REAL_CONST(72625.113545549248/8.0), - REAL_CONST(72647.002589984331/8.0), - REAL_CONST(72668.893283373764/8.0), - REAL_CONST(72690.785625469172/8.0), - REAL_CONST(72712.679616022273/8.0), - REAL_CONST(72734.575254784853/8.0), - REAL_CONST(72756.472541508803/8.0), - REAL_CONST(72778.371475946144/8.0), - REAL_CONST(72800.272057848939/8.0), - REAL_CONST(72822.174286969355/8.0), - REAL_CONST(72844.07816305969/8.0), - REAL_CONST(72865.983685872285/8.0), - REAL_CONST(72887.890855159596/8.0), - REAL_CONST(72909.799670674183/8.0), - REAL_CONST(72931.710132168693/8.0), - REAL_CONST(72953.622239395845/8.0), - REAL_CONST(72975.535992108475/8.0), - REAL_CONST(72997.451390059519/8.0), - REAL_CONST(73019.368433001961/8.0), - REAL_CONST(73041.287120688925/8.0), - REAL_CONST(73063.207452873612/8.0), - REAL_CONST(73085.129429309294/8.0), - REAL_CONST(73107.053049749389/8.0), - REAL_CONST(73128.978313947344/8.0), - REAL_CONST(73150.905221656736/8.0), - REAL_CONST(73172.833772631217/8.0), - REAL_CONST(73194.763966624567/8.0), - REAL_CONST(73216.695803390612/8.0), - REAL_CONST(73238.62928268328/8.0), - REAL_CONST(73260.564404256627/8.0), - REAL_CONST(73282.501167864757/8.0), - REAL_CONST(73304.439573261901/8.0), - REAL_CONST(73326.379620202337/8.0), - REAL_CONST(73348.321308440485/8.0), - REAL_CONST(73370.264637730841/8.0), - REAL_CONST(73392.209607827957/8.0), - REAL_CONST(73414.156218486532/8.0), - REAL_CONST(73436.104469461323/8.0), - REAL_CONST(73458.054360507173/8.0), - REAL_CONST(73480.005891379056/8.0), - REAL_CONST(73501.959061831993/8.0), - REAL_CONST(73523.913871621116/8.0), - REAL_CONST(73545.870320501665/8.0), - REAL_CONST(73567.828408228932/8.0), - REAL_CONST(73589.78813455833/8.0), - REAL_CONST(73611.749499245358/8.0), - REAL_CONST(73633.712502045615/8.0), - REAL_CONST(73655.677142714747/8.0), - REAL_CONST(73677.643421008557/8.0), - REAL_CONST(73699.611336682879/8.0), - REAL_CONST(73721.580889493693/8.0), - REAL_CONST(73743.552079197019/8.0), - REAL_CONST(73765.524905548999/8.0), - REAL_CONST(73787.499368305856/8.0), - REAL_CONST(73809.475467223907/8.0), - REAL_CONST(73831.453202059551/8.0), - REAL_CONST(73853.432572569291/8.0), - REAL_CONST(73875.413578509717/8.0), - REAL_CONST(73897.396219637507/8.0), - REAL_CONST(73919.380495709411/8.0), - REAL_CONST(73941.36640648231/8.0), - REAL_CONST(73963.353951713143/8.0), - REAL_CONST(73985.343131158952/8.0), - REAL_CONST(74007.333944576865/8.0), - REAL_CONST(74029.326391724098/8.0), - REAL_CONST(74051.320472357969/8.0), - REAL_CONST(74073.316186235883/8.0), - REAL_CONST(74095.313533115303/8.0), - REAL_CONST(74117.312512753837/8.0), - REAL_CONST(74139.313124909138/8.0), - REAL_CONST(74161.315369338976/8.0), - REAL_CONST(74183.319245801191/8.0), - REAL_CONST(74205.324754053727/8.0), - REAL_CONST(74227.331893854629/8.0), - REAL_CONST(74249.340664961986/8.0), - REAL_CONST(74271.351067134034/8.0), - REAL_CONST(74293.363100129049/8.0), - REAL_CONST(74315.376763705441/8.0), - REAL_CONST(74337.392057621662/8.0), - REAL_CONST(74359.408981636298/8.0), - REAL_CONST(74381.427535508003/8.0), - REAL_CONST(74403.447718995507/8.0), - REAL_CONST(74425.469531857671/8.0), - REAL_CONST(74447.492973853383/8.0), - REAL_CONST(74469.518044741693/8.0), - REAL_CONST(74491.54474428168/8.0), - REAL_CONST(74513.573072232539/8.0), - REAL_CONST(74535.603028353551/8.0), - REAL_CONST(74557.634612404087/8.0), - REAL_CONST(74579.667824143602/8.0), - REAL_CONST(74601.702663331642/8.0), - REAL_CONST(74623.739129727837/8.0), - REAL_CONST(74645.777223091936/8.0), - REAL_CONST(74667.816943183716/8.0), - REAL_CONST(74689.858289763113/8.0), - REAL_CONST(74711.901262590094/8.0), - REAL_CONST(74733.945861424741/8.0), - REAL_CONST(74755.992086027225/8.0), - REAL_CONST(74778.039936157802/8.0), - REAL_CONST(74800.089411576817/8.0), - REAL_CONST(74822.140512044702/8.0), - REAL_CONST(74844.193237321961/8.0), - REAL_CONST(74866.24758716923/8.0), - REAL_CONST(74888.303561347187/8.0), - REAL_CONST(74910.36115961663/8.0), - REAL_CONST(74932.420381738411/8.0), - REAL_CONST(74954.481227473516/8.0), - REAL_CONST(74976.543696582972/8.0), - REAL_CONST(74998.607788827925/8.0), - REAL_CONST(75020.673503969607/8.0), - REAL_CONST(75042.740841769322/8.0), - REAL_CONST(75064.809801988464/8.0), - REAL_CONST(75086.88038438854/8.0), - REAL_CONST(75108.952588731103/8.0), - REAL_CONST(75131.026414777836/8.0), - REAL_CONST(75153.101862290467/8.0), - REAL_CONST(75175.178931030852/8.0), - REAL_CONST(75197.257620760924/8.0), - REAL_CONST(75219.33793124267/8.0), - REAL_CONST(75241.419862238225/8.0), - REAL_CONST(75263.503413509738/8.0), - REAL_CONST(75285.588584819503/8.0), - REAL_CONST(75307.675375929874/8.0), - REAL_CONST(75329.763786603318/8.0), - REAL_CONST(75351.853816602365/8.0), - REAL_CONST(75373.945465689612/8.0), - REAL_CONST(75396.038733627807/8.0), - REAL_CONST(75418.133620179724/8.0), - REAL_CONST(75440.230125108254/8.0), - REAL_CONST(75462.32824817636/8.0), - REAL_CONST(75484.427989147109/8.0), - REAL_CONST(75506.529347783653/8.0), - REAL_CONST(75528.63232384919/8.0), - REAL_CONST(75550.736917107075/8.0), - REAL_CONST(75572.843127320695/8.0), - REAL_CONST(75594.950954253538/8.0), - REAL_CONST(75617.060397669193/8.0), - REAL_CONST(75639.171457331307/8.0), - REAL_CONST(75661.284133003646/8.0), - REAL_CONST(75683.398424450032/8.0), - REAL_CONST(75705.514331434402/8.0), - REAL_CONST(75727.631853720741/8.0), - REAL_CONST(75749.750991073175/8.0), - REAL_CONST(75771.871743255862/8.0), - REAL_CONST(75793.994110033076/8.0), - REAL_CONST(75816.118091169177/8.0), - REAL_CONST(75838.243686428585/8.0), - REAL_CONST(75860.370895575848/8.0), - REAL_CONST(75882.499718375562/8.0), - REAL_CONST(75904.630154592422/8.0), - REAL_CONST(75926.762203991224/8.0), - REAL_CONST(75948.895866336825/8.0), - REAL_CONST(75971.031141394182/8.0), - REAL_CONST(75993.168028928325/8.0), - REAL_CONST(76015.306528704401/8.0), - REAL_CONST(76037.4466404876/8.0), - REAL_CONST(76059.588364043215/8.0), - REAL_CONST(76081.731699136653/8.0), - REAL_CONST(76103.876645533353/8.0), - REAL_CONST(76126.023202998884/8.0), - REAL_CONST(76148.171371298871/8.0), - REAL_CONST(76170.321150199044/8.0), - REAL_CONST(76192.472539465205/8.0), - REAL_CONST(76214.625538863256/8.0), - REAL_CONST(76236.780148159174/8.0), - REAL_CONST(76258.936367119008/8.0), - REAL_CONST(76281.094195508922/8.0), - REAL_CONST(76303.253633095141/8.0), - REAL_CONST(76325.414679643975/8.0), - REAL_CONST(76347.577334921851/8.0), - REAL_CONST(76369.741598695226/8.0), - REAL_CONST(76391.907470730686/8.0), - REAL_CONST(76414.074950794879/8.0), - REAL_CONST(76436.244038654564/8.0), - REAL_CONST(76458.414734076548/8.0), - REAL_CONST(76480.587036827754/8.0), - REAL_CONST(76502.760946675175/8.0), - REAL_CONST(76524.936463385893/8.0), - REAL_CONST(76547.11358672705/8.0), - REAL_CONST(76569.292316465915/8.0), - REAL_CONST(76591.472652369819/8.0), - REAL_CONST(76613.654594206164/8.0), - REAL_CONST(76635.838141742468/8.0), - REAL_CONST(76658.023294746308/8.0), - REAL_CONST(76680.210052985349/8.0), - REAL_CONST(76702.398416227341/8.0), - REAL_CONST(76724.588384240138/8.0), - REAL_CONST(76746.779956791637/8.0), - REAL_CONST(76768.973133649866/8.0), - REAL_CONST(76791.167914582897/8.0), - REAL_CONST(76813.364299358902/8.0), - REAL_CONST(76835.562287746157/8.0), - REAL_CONST(76857.761879512967/8.0), - REAL_CONST(76879.963074427797/8.0), - REAL_CONST(76902.165872259109/8.0), - REAL_CONST(76924.37027277553/8.0), - REAL_CONST(76946.576275745727/8.0), - REAL_CONST(76968.783880938441/8.0), - REAL_CONST(76990.993088122515/8.0), - REAL_CONST(77013.203897066895/8.0), - REAL_CONST(77035.416307540567/8.0), - REAL_CONST(77057.630319312622/8.0), - REAL_CONST(77079.845932152239/8.0), - REAL_CONST(77102.063145828695/8.0), - REAL_CONST(77124.281960111301/8.0), - REAL_CONST(77146.50237476948/8.0), - REAL_CONST(77168.724389572759/8.0), - REAL_CONST(77190.948004290723/8.0), - REAL_CONST(77213.173218693031/8.0), - REAL_CONST(77235.400032549442/8.0), - REAL_CONST(77257.628445629802/8.0), - REAL_CONST(77279.858457704031/8.0), - REAL_CONST(77302.090068542122/8.0), - REAL_CONST(77324.323277914169/8.0), - REAL_CONST(77346.558085590339/8.0), - REAL_CONST(77368.794491340886/8.0), - REAL_CONST(77391.032494936138/8.0), - REAL_CONST(77413.272096146524/8.0), - REAL_CONST(77435.51329474253/8.0), - REAL_CONST(77457.756090494731/8.0), - REAL_CONST(77480.000483173804/8.0), - REAL_CONST(77502.246472550498/8.0), - REAL_CONST(77524.494058395634/8.0), - REAL_CONST(77546.743240480107/8.0), - REAL_CONST(77568.994018574944/8.0), - REAL_CONST(77591.246392451198/8.0), - REAL_CONST(77613.500361880026/8.0), - REAL_CONST(77635.755926632657/8.0), - REAL_CONST(77658.013086480438/8.0), - REAL_CONST(77680.271841194757/8.0), - REAL_CONST(77702.532190547092/8.0), - REAL_CONST(77724.794134309021/8.0), - REAL_CONST(77747.057672252195/8.0), - REAL_CONST(77769.322804148323/8.0), - REAL_CONST(77791.589529769248/8.0), - REAL_CONST(77813.857848886837/8.0), - REAL_CONST(77836.127761273063/8.0), - REAL_CONST(77858.399266699998/8.0), - REAL_CONST(77880.67236493979/8.0), - REAL_CONST(77902.947055764627/8.0), - REAL_CONST(77925.223338946831/8.0), - REAL_CONST(77947.50121425878/8.0), - REAL_CONST(77969.780681472927/8.0), - REAL_CONST(77992.061740361838/8.0), - REAL_CONST(78014.344390698127/8.0), - REAL_CONST(78036.628632254491/8.0), - REAL_CONST(78058.914464803747/8.0), - REAL_CONST(78081.201888118725/8.0), - REAL_CONST(78103.490901972415/8.0), - REAL_CONST(78125.781506137821/8.0), - REAL_CONST(78148.073700388064/8.0), - REAL_CONST(78170.367484496339/8.0), - REAL_CONST(78192.662858235926/8.0), - REAL_CONST(78214.959821380166/8.0), - REAL_CONST(78237.258373702498/8.0), - REAL_CONST(78259.558514976452/8.0), - REAL_CONST(78281.860244975614/8.0), - REAL_CONST(78304.163563473659/8.0), - REAL_CONST(78326.468470244363/8.0), - REAL_CONST(78348.77496506153/8.0), - REAL_CONST(78371.083047699125/8.0), - REAL_CONST(78393.392717931114/8.0), - REAL_CONST(78415.703975531578/8.0), - REAL_CONST(78438.016820274701/8.0), - REAL_CONST(78460.331251934695/8.0), - REAL_CONST(78482.647270285903/8.0), - REAL_CONST(78504.964875102727/8.0), - REAL_CONST(78527.284066159627/8.0), - REAL_CONST(78549.604843231195/8.0), - REAL_CONST(78571.927206092048/8.0), - REAL_CONST(78594.251154516911/8.0), - REAL_CONST(78616.576688280606/8.0), - REAL_CONST(78638.903807157985/8.0), - REAL_CONST(78661.232510924034/8.0), - REAL_CONST(78683.562799353778/8.0), - REAL_CONST(78705.894672222363/8.0), - REAL_CONST(78728.228129304945/8.0), - REAL_CONST(78750.563170376859/8.0), - REAL_CONST(78772.899795213423/8.0), - REAL_CONST(78795.238003590101/8.0), - REAL_CONST(78817.577795282399/8.0), - REAL_CONST(78839.919170065928/8.0), - REAL_CONST(78862.262127716356/8.0), - REAL_CONST(78884.606668009452/8.0), - REAL_CONST(78906.952790721043/8.0), - REAL_CONST(78929.300495627045/8.0), - REAL_CONST(78951.64978250346/8.0), - REAL_CONST(78974.000651126378/8.0), - REAL_CONST(78996.353101271932/8.0), - REAL_CONST(79018.707132716358/8.0), - REAL_CONST(79041.062745235977/8.0), - REAL_CONST(79063.41993860717/8.0), - REAL_CONST(79085.778712606436/8.0), - REAL_CONST(79108.139067010285/8.0), - REAL_CONST(79130.501001595389/8.0), - REAL_CONST(79152.864516138419/8.0), - REAL_CONST(79175.22961041618/8.0), - REAL_CONST(79197.596284205531/8.0), - REAL_CONST(79219.96453728342/8.0), - REAL_CONST(79242.33436942687/8.0), - REAL_CONST(79264.705780412987/8.0), - REAL_CONST(79287.078770018954/8.0), - REAL_CONST(79309.453338022009/8.0), - REAL_CONST(79331.829484199508/8.0), - REAL_CONST(79354.207208328866/8.0), - REAL_CONST(79376.586510187582/8.0), - REAL_CONST(79398.967389553218/8.0), - REAL_CONST(79421.349846203433/8.0), - REAL_CONST(79443.733879915948/8.0), - REAL_CONST(79466.119490468584/8.0), - REAL_CONST(79488.50667763922/8.0), - REAL_CONST(79510.895441205823/8.0), - REAL_CONST(79533.285780946433/8.0), - REAL_CONST(79555.677696639163/8.0), - REAL_CONST(79578.071188062226/8.0), - REAL_CONST(79600.466254993895/8.0), - REAL_CONST(79622.862897212515/8.0), - REAL_CONST(79645.261114496549/8.0), - REAL_CONST(79667.660906624471/8.0), - REAL_CONST(79690.062273374875/8.0), - REAL_CONST(79712.465214526455/8.0), - REAL_CONST(79734.869729857935/8.0), - REAL_CONST(79757.275819148126/8.0), - REAL_CONST(79779.683482175955/8.0), - REAL_CONST(79802.092718720378/8.0), - REAL_CONST(79824.503528560454/8.0), - REAL_CONST(79846.915911475327/8.0), - REAL_CONST(79869.329867244203/8.0), - REAL_CONST(79891.745395646343/8.0), - REAL_CONST(79914.162496461155/8.0), - REAL_CONST(79936.581169468045/8.0), - REAL_CONST(79959.001414446553/8.0), - REAL_CONST(79981.423231176261/8.0), - REAL_CONST(80003.846619436852/8.0), - REAL_CONST(80026.271579008084/8.0), - REAL_CONST(80048.698109669771/8.0), - REAL_CONST(80071.12621120183/8.0), - REAL_CONST(80093.555883384237/8.0), - REAL_CONST(80115.987125997053/8.0), - REAL_CONST(80138.419938820414/8.0), - REAL_CONST(80160.854321634528/8.0), - REAL_CONST(80183.290274219689/8.0), - REAL_CONST(80205.727796356281/8.0), - REAL_CONST(80228.166887824715/8.0), - REAL_CONST(80250.607548405547/8.0), - REAL_CONST(80273.049777879336/8.0), - REAL_CONST(80295.493576026798/8.0), - REAL_CONST(80317.938942628651/8.0), - REAL_CONST(80340.385877465727/8.0), - REAL_CONST(80362.834380318949/8.0), - REAL_CONST(80385.28445096928/8.0), - REAL_CONST(80407.736089197788/8.0), - REAL_CONST(80430.189294785596/8.0), - REAL_CONST(80452.644067513917/8.0), - REAL_CONST(80475.100407164035/8.0), - REAL_CONST(80497.558313517322/8.0), - REAL_CONST(80520.017786355209/8.0), - REAL_CONST(80542.478825459213/8.0), - REAL_CONST(80564.941430610925/8.0), - REAL_CONST(80587.405601592007/8.0), - REAL_CONST(80609.871338184195/8.0), - REAL_CONST(80632.338640169342/8.0), - REAL_CONST(80654.8075073293/8.0), - REAL_CONST(80677.277939446067/8.0), - REAL_CONST(80699.749936301683/8.0), - REAL_CONST(80722.223497678278/8.0), - REAL_CONST(80744.698623358039/8.0), - REAL_CONST(80767.17531312324/8.0), - REAL_CONST(80789.653566756242/8.0), - REAL_CONST(80812.133384039465/8.0), - REAL_CONST(80834.614764755403/8.0), - REAL_CONST(80857.097708686648/8.0), - REAL_CONST(80879.582215615854/8.0), - REAL_CONST(80902.068285325731/8.0), - REAL_CONST(80924.555917599093/8.0), - REAL_CONST(80947.045112218824/8.0), - REAL_CONST(80969.535868967869/8.0), - REAL_CONST(80992.028187629272/8.0), - REAL_CONST(81014.522067986123/8.0), - REAL_CONST(81037.017509821613/8.0), - REAL_CONST(81059.514512919006/8.0), - REAL_CONST(81082.013077061609/8.0), - REAL_CONST(81104.513202032831/8.0), - REAL_CONST(81127.014887616184/8.0), - REAL_CONST(81149.518133595193/8.0), - REAL_CONST(81172.022939753486/8.0), - REAL_CONST(81194.529305874807/8.0), - REAL_CONST(81217.037231742899/8.0), - REAL_CONST(81239.546717141639/8.0), - REAL_CONST(81262.057761854958/8.0), - REAL_CONST(81284.570365666848/8.0), - REAL_CONST(81307.084528361403/8.0), - REAL_CONST(81329.600249722775/8.0), - REAL_CONST(81352.117529535186/8.0), - REAL_CONST(81374.636367582949/8.0), - REAL_CONST(81397.156763650448/8.0), - REAL_CONST(81419.678717522125/8.0), - REAL_CONST(81442.202228982511/8.0), - REAL_CONST(81464.727297816222/8.0), - REAL_CONST(81487.253923807933/8.0), - REAL_CONST(81509.782106742379/8.0), - REAL_CONST(81532.311846404409/8.0), - REAL_CONST(81554.843142578902/8.0), - REAL_CONST(81577.375995050839/8.0), - REAL_CONST(81599.910403605274/8.0), - REAL_CONST(81622.446368027333/8.0), - REAL_CONST(81644.983888102215/8.0), - REAL_CONST(81667.522963615178/8.0), - REAL_CONST(81690.063594351581/8.0), - REAL_CONST(81712.605780096841/8.0), - REAL_CONST(81735.149520636449/8.0), - REAL_CONST(81757.694815755967/8.0), - REAL_CONST(81780.241665241047/8.0), - REAL_CONST(81802.79006887741/8.0), - REAL_CONST(81825.340026450824/8.0), - REAL_CONST(81847.891537747171/8.0), - REAL_CONST(81870.444602552379/8.0), - REAL_CONST(81892.999220652477/8.0), - REAL_CONST(81915.555391833506/8.0), - REAL_CONST(81938.113115881672/8.0), - REAL_CONST(81960.672392583176/8.0), - REAL_CONST(81983.233221724338/8.0), - REAL_CONST(82005.795603091537/8.0), - REAL_CONST(82028.359536471224/8.0), - REAL_CONST(82050.925021649906/8.0), - REAL_CONST(82073.492058414209/8.0), - REAL_CONST(82096.060646550788/8.0), - REAL_CONST(82118.630785846399/8.0), - REAL_CONST(82141.202476087841/8.0), - REAL_CONST(82163.775717062032/8.0), - REAL_CONST(82186.35050855593/8.0), - REAL_CONST(82208.926850356569/8.0), - REAL_CONST(82231.504742251054/8.0), - REAL_CONST(82254.084184026578/8.0), - REAL_CONST(82276.665175470393/8.0), - REAL_CONST(82299.24771636985/8.0), - REAL_CONST(82321.831806512317/8.0), - REAL_CONST(82344.417445685307/8.0), - REAL_CONST(82367.004633676348/8.0), - REAL_CONST(82389.593370273054/8.0), - REAL_CONST(82412.183655263143/8.0), - REAL_CONST(82434.775488434374/8.0), - REAL_CONST(82457.368869574595/8.0), - REAL_CONST(82479.963798471697/8.0), - REAL_CONST(82502.560274913689/8.0), - REAL_CONST(82525.158298688606/8.0), - REAL_CONST(82547.757869584602/8.0), - REAL_CONST(82570.35898738986/8.0), - REAL_CONST(82592.961651892678/8.0), - REAL_CONST(82615.565862881398/8.0), - REAL_CONST(82638.171620144421/8.0), - REAL_CONST(82660.778923470265/8.0), - REAL_CONST(82683.387772647475/8.0), - REAL_CONST(82705.998167464713/8.0), - REAL_CONST(82728.610107710658/8.0), - REAL_CONST(82751.223593174116/8.0), - REAL_CONST(82773.83862364394/8.0), - REAL_CONST(82796.45519890904/8.0), - REAL_CONST(82819.073318758441/8.0), - REAL_CONST(82841.692982981185/8.0), - REAL_CONST(82864.314191366429/8.0), - REAL_CONST(82886.936943703375/8.0), - REAL_CONST(82909.561239781324/8.0), - REAL_CONST(82932.187079389638/8.0), - REAL_CONST(82954.814462317736/8.0), - REAL_CONST(82977.443388355125/8.0), - REAL_CONST(83000.073857291369/8.0), - REAL_CONST(83022.70586891612/8.0), - REAL_CONST(83045.339423019104/8.0), - REAL_CONST(83067.974519390089/8.0), - REAL_CONST(83090.611157818959/8.0), - REAL_CONST(83113.249338095629/8.0), - REAL_CONST(83135.8890600101/8.0), - REAL_CONST(83158.530323352461/8.0), - REAL_CONST(83181.173127912858/8.0), - REAL_CONST(83203.817473481497/8.0), - REAL_CONST(83226.463359848669/8.0), - REAL_CONST(83249.11078680474/8.0), - REAL_CONST(83271.759754140134/8.0), - REAL_CONST(83294.410261645375/8.0), - REAL_CONST(83317.062309111003/8.0), - REAL_CONST(83339.715896327703/8.0), - REAL_CONST(83362.371023086147/8.0), - REAL_CONST(83385.027689177165/8.0), - REAL_CONST(83407.685894391587/8.0), - REAL_CONST(83430.345638520361/8.0), - REAL_CONST(83453.006921354478/8.0), - REAL_CONST(83475.669742685001/8.0), - REAL_CONST(83498.334102303095/8.0), - REAL_CONST(83520.999999999942/8.0), - REAL_CONST(83543.667435566866/8.0), - REAL_CONST(83566.336408795192/8.0), - REAL_CONST(83589.006919476349/8.0), - REAL_CONST(83611.678967401851/8.0), - REAL_CONST(83634.352552363242/8.0), - REAL_CONST(83657.027674152167/8.0), - REAL_CONST(83679.704332560359/8.0), - REAL_CONST(83702.382527379552/8.0), - REAL_CONST(83725.062258401638/8.0), - REAL_CONST(83747.743525418511/8.0), - REAL_CONST(83770.42632822218/8.0), - REAL_CONST(83793.110666604684/8.0), - REAL_CONST(83815.796540358162/8.0), - REAL_CONST(83838.483949274829/8.0), - REAL_CONST(83861.172893146941/8.0), - REAL_CONST(83883.863371766842/8.0), - REAL_CONST(83906.555384926964/8.0), - REAL_CONST(83929.248932419752/8.0), - REAL_CONST(83951.944014037799/8.0), - REAL_CONST(83974.640629573696/8.0), - REAL_CONST(83997.338778820151/8.0), - REAL_CONST(84020.038461569929/8.0), - REAL_CONST(84042.739677615857/8.0), - REAL_CONST(84065.442426750829/8.0), - REAL_CONST(84088.146708767847/8.0), - REAL_CONST(84110.852523459922/8.0), - REAL_CONST(84133.559870620171/8.0), - REAL_CONST(84156.268750041796/8.0), - REAL_CONST(84178.979161518029/8.0), - REAL_CONST(84201.691104842204/8.0), - REAL_CONST(84224.404579807713/8.0), - REAL_CONST(84247.119586208006/8.0), - REAL_CONST(84269.83612383662/8.0), - REAL_CONST(84292.55419248715/8.0), - REAL_CONST(84315.273791953281/8.0), - REAL_CONST(84337.994922028738/8.0), - REAL_CONST(84360.717582507335/8.0), - REAL_CONST(84383.441773182945/8.0), - REAL_CONST(84406.167493849513/8.0), - REAL_CONST(84428.894744301069/8.0), - REAL_CONST(84451.623524331691/8.0), - REAL_CONST(84474.353833735542/8.0), - REAL_CONST(84497.085672306828/8.0), - REAL_CONST(84519.819039839858/8.0), - REAL_CONST(84542.553936128999/8.0), - REAL_CONST(84565.290360968676/8.0), - REAL_CONST(84588.028314153402/8.0), - REAL_CONST(84610.767795477717/8.0), - REAL_CONST(84633.508804736295/8.0), - REAL_CONST(84656.251341723822/8.0), - REAL_CONST(84678.995406235073/8.0), - REAL_CONST(84701.740998064924/8.0), - REAL_CONST(84724.488117008252/8.0), - REAL_CONST(84747.236762860062/8.0), - REAL_CONST(84769.986935415407/8.0), - REAL_CONST(84792.73863446941/8.0), - REAL_CONST(84815.491859817252/8.0), - REAL_CONST(84838.246611254188/8.0), - REAL_CONST(84861.002888575575/8.0), - REAL_CONST(84883.760691576768/8.0), - REAL_CONST(84906.520020053256/8.0), - REAL_CONST(84929.28087380057/8.0), - REAL_CONST(84952.043252614312/8.0), - REAL_CONST(84974.807156290146/8.0), - REAL_CONST(84997.572584623806/8.0), - REAL_CONST(85020.339537411113/8.0), - REAL_CONST(85043.108014447949/8.0), - REAL_CONST(85065.878015530237/8.0), - REAL_CONST(85088.649540453989/8.0), - REAL_CONST(85111.422589015303/8.0), - REAL_CONST(85134.197161010321/8.0), - REAL_CONST(85156.973256235244/8.0), - REAL_CONST(85179.750874486374/8.0), - REAL_CONST(85202.530015560071/8.0), - REAL_CONST(85225.310679252725/8.0), - REAL_CONST(85248.092865360857/8.0), - REAL_CONST(85270.876573681016/8.0), - REAL_CONST(85293.661804009811/8.0), - REAL_CONST(85316.448556143951/8.0), - REAL_CONST(85339.236829880188/8.0), - REAL_CONST(85362.026625015351/8.0), - REAL_CONST(85384.817941346351/8.0), - REAL_CONST(85407.610778670132/8.0), - REAL_CONST(85430.405136783724/8.0), - REAL_CONST(85453.201015484257/8.0), - REAL_CONST(85475.998414568865/8.0), - REAL_CONST(85498.797333834795/8.0), - REAL_CONST(85521.597773079353/8.0), - REAL_CONST(85544.399732099904/8.0), - REAL_CONST(85567.203210693886/8.0), - REAL_CONST(85590.008208658808/8.0), - REAL_CONST(85612.814725792239/8.0), - REAL_CONST(85635.62276189182/8.0), - REAL_CONST(85658.432316755265/8.0), - REAL_CONST(85681.243390180331/8.0), - REAL_CONST(85704.055981964877/8.0), - REAL_CONST(85726.870091906807/8.0), - REAL_CONST(85749.685719804082/8.0), - REAL_CONST(85772.502865454764/8.0), - REAL_CONST(85795.321528656961/8.0), - REAL_CONST(85818.141709208852/8.0), - REAL_CONST(85840.963406908675/8.0), - REAL_CONST(85863.78662155474/8.0), - REAL_CONST(85886.611352945445/8.0), - REAL_CONST(85909.437600879217/8.0), - REAL_CONST(85932.26536515457/8.0), - REAL_CONST(85955.094645570091/8.0), - REAL_CONST(85977.92544192441/8.0), - REAL_CONST(86000.757754016275/8.0), - REAL_CONST(86023.591581644432/8.0), - REAL_CONST(86046.426924607746/8.0), - REAL_CONST(86069.263782705122/8.0), - REAL_CONST(86092.102155735556/8.0), - REAL_CONST(86114.942043498071/8.0), - REAL_CONST(86137.783445791807/8.0), - REAL_CONST(86160.626362415918/8.0), - REAL_CONST(86183.470793169676/8.0), - REAL_CONST(86206.316737852379/8.0), - REAL_CONST(86229.164196263402/8.0), - REAL_CONST(86252.013168202204/8.0), - REAL_CONST(86274.863653468303/8.0), - REAL_CONST(86297.715651861261/8.0), - REAL_CONST(86320.569163180728/8.0), - REAL_CONST(86343.424187226425/8.0), - REAL_CONST(86366.280723798132/8.0), - REAL_CONST(86389.138772695675/8.0), - REAL_CONST(86411.998333718977/8.0), - REAL_CONST(86434.859406668009/8.0), - REAL_CONST(86457.721991342827/8.0), - REAL_CONST(86480.586087543532/8.0), - REAL_CONST(86503.451695070296/8.0), - REAL_CONST(86526.318813723352/8.0), - REAL_CONST(86549.187443303032/8.0), - REAL_CONST(86572.057583609683/8.0), - REAL_CONST(86594.929234443756/8.0), - REAL_CONST(86617.802395605773/8.0), - REAL_CONST(86640.677066896271/8.0), - REAL_CONST(86663.553248115903/8.0), - REAL_CONST(86686.43093906538/8.0), - REAL_CONST(86709.310139545443/8.0), - REAL_CONST(86732.190849356964/8.0), - REAL_CONST(86755.073068300815/8.0), - REAL_CONST(86777.956796177954/8.0), - REAL_CONST(86800.842032789442/8.0), - REAL_CONST(86823.728777936354/8.0), - REAL_CONST(86846.617031419853/8.0), - REAL_CONST(86869.506793041175/8.0), - REAL_CONST(86892.398062601613/8.0), - REAL_CONST(86915.290839902518/8.0), - REAL_CONST(86938.185124745316/8.0), - REAL_CONST(86961.080916931489/8.0), - REAL_CONST(86983.978216262592/8.0), - REAL_CONST(87006.87702254027/8.0), - REAL_CONST(87029.777335566177/8.0), - REAL_CONST(87052.67915514209/8.0), - REAL_CONST(87075.582481069796/8.0), - REAL_CONST(87098.487313151185/8.0), - REAL_CONST(87121.39365118822/8.0), - REAL_CONST(87144.301494982894/8.0), - REAL_CONST(87167.210844337285/8.0), - REAL_CONST(87190.121699053532/8.0), - REAL_CONST(87213.034058933845/8.0), - REAL_CONST(87235.947923780506/8.0), - REAL_CONST(87258.863293395829/8.0), - REAL_CONST(87281.780167582241/8.0), - REAL_CONST(87304.698546142172/8.0), - REAL_CONST(87327.618428878181/8.0), - REAL_CONST(87350.539815592856/8.0), - REAL_CONST(87373.462706088845/8.0), - REAL_CONST(87396.387100168897/8.0), - REAL_CONST(87419.312997635774/8.0), - REAL_CONST(87442.240398292357/8.0), - REAL_CONST(87465.16930194154/8.0), - REAL_CONST(87488.099708386319/8.0), - REAL_CONST(87511.031617429733/8.0), - REAL_CONST(87533.965028874911/8.0), - REAL_CONST(87556.899942525008/8.0), - REAL_CONST(87579.836358183282/8.0), - REAL_CONST(87602.774275653021/8.0), - REAL_CONST(87625.713694737613/8.0), - REAL_CONST(87648.654615240492/8.0), - REAL_CONST(87671.597036965148/8.0), - REAL_CONST(87694.540959715145/8.0), - REAL_CONST(87717.486383294105/8.0), - REAL_CONST(87740.433307505737/8.0), - REAL_CONST(87763.381732153779/8.0), - REAL_CONST(87786.331657042057/8.0), - REAL_CONST(87809.283081974456/8.0), - REAL_CONST(87832.236006754916/8.0), - REAL_CONST(87855.190431187453/8.0), - REAL_CONST(87878.146355076155/8.0), - REAL_CONST(87901.103778225151/8.0), - REAL_CONST(87924.062700438633/8.0), - REAL_CONST(87947.023121520891/8.0), - REAL_CONST(87969.985041276246/8.0), - REAL_CONST(87992.948459509105/8.0), - REAL_CONST(88015.913376023906/8.0), - REAL_CONST(88038.879790625171/8.0), - REAL_CONST(88061.847703117513/8.0), - REAL_CONST(88084.817113305573/8.0), - REAL_CONST(88107.788020994049/8.0), - REAL_CONST(88130.760425987726/8.0), - REAL_CONST(88153.734328091465/8.0), - REAL_CONST(88176.709727110137/8.0), - REAL_CONST(88199.686622848749/8.0), - REAL_CONST(88222.665015112303/8.0), - REAL_CONST(88245.644903705906/8.0), - REAL_CONST(88268.626288434709/8.0), - REAL_CONST(88291.609169103947/8.0), - REAL_CONST(88314.593545518903/8.0), - REAL_CONST(88337.579417484914/8.0), - REAL_CONST(88360.566784807408/8.0), - REAL_CONST(88383.555647291854/8.0), - REAL_CONST(88406.546004743795/8.0), - REAL_CONST(88429.537856968818/8.0), - REAL_CONST(88452.531203772611/8.0), - REAL_CONST(88475.52604496089/8.0), - REAL_CONST(88498.522380339447/8.0), - REAL_CONST(88521.52020971413/8.0), - REAL_CONST(88544.519532890874/8.0), - REAL_CONST(88567.520349675644/8.0), - REAL_CONST(88590.522659874507/8.0), - REAL_CONST(88613.526463293543/8.0), - REAL_CONST(88636.531759738922/8.0), - REAL_CONST(88659.538549016899/8.0), - REAL_CONST(88682.546830933745/8.0), - REAL_CONST(88705.556605295846/8.0), - REAL_CONST(88728.567871909589/8.0), - REAL_CONST(88751.580630581491/8.0), - REAL_CONST(88774.594881118086/8.0), - REAL_CONST(88797.610623325963/8.0), - REAL_CONST(88820.62785701183/8.0), - REAL_CONST(88843.646581982393/8.0), - REAL_CONST(88866.666798044462/8.0), - REAL_CONST(88889.688505004888/8.0), - REAL_CONST(88912.711702670611/8.0), - REAL_CONST(88935.7363908486/8.0), - REAL_CONST(88958.762569345898/8.0), - REAL_CONST(88981.790237969632/8.0), - REAL_CONST(89004.81939652696/8.0), - REAL_CONST(89027.850044825114/8.0), - REAL_CONST(89050.882182671412/8.0), - REAL_CONST(89073.9158098732/8.0), - REAL_CONST(89096.950926237885/8.0), - REAL_CONST(89119.987531572973/8.0), - REAL_CONST(89143.025625686001/8.0), - REAL_CONST(89166.065208384563/8.0), - REAL_CONST(89189.106279476357/8.0), - REAL_CONST(89212.148838769106/8.0), - REAL_CONST(89235.192886070581/8.0), - REAL_CONST(89258.238421188667/8.0), - REAL_CONST(89281.285443931265/8.0), - REAL_CONST(89304.333954106376/8.0), - REAL_CONST(89327.383951522017/8.0), - REAL_CONST(89350.435435986306/8.0), - REAL_CONST(89373.488407307406/8.0), - REAL_CONST(89396.542865293537/8.0), - REAL_CONST(89419.598809753006/8.0), - REAL_CONST(89442.656240494165/8.0), - REAL_CONST(89465.715157325409/8.0), - REAL_CONST(89488.775560055219/8.0), - REAL_CONST(89511.837448492137/8.0), - REAL_CONST(89534.900822444746/8.0), - REAL_CONST(89557.965681721733/8.0), - REAL_CONST(89581.032026131812/8.0), - REAL_CONST(89604.099855483742/8.0), - REAL_CONST(89627.169169586399/8.0), - REAL_CONST(89650.239968248672/8.0), - REAL_CONST(89673.312251279538/8.0), - REAL_CONST(89696.386018488018/8.0), - REAL_CONST(89719.461269683205/8.0), - REAL_CONST(89742.53800467425/8.0), - REAL_CONST(89765.616223270365/8.0), - REAL_CONST(89788.69592528083/8.0), - REAL_CONST(89811.777110514988/8.0), - REAL_CONST(89834.859778782207/8.0), - REAL_CONST(89857.943929891975/8.0), - REAL_CONST(89881.029563653807/8.0), - REAL_CONST(89904.116679877261/8.0), - REAL_CONST(89927.205278372014/8.0), - REAL_CONST(89950.29535894774/8.0), - REAL_CONST(89973.386921414218/8.0), - REAL_CONST(89996.479965581268/8.0), - REAL_CONST(90019.574491258769/8.0), - REAL_CONST(90042.670498256688/8.0), - REAL_CONST(90065.767986385021/8.0), - REAL_CONST(90088.866955453836/8.0), - REAL_CONST(90111.967405273259/8.0), - REAL_CONST(90135.069335653476/8.0), - REAL_CONST(90158.172746404758/8.0), - REAL_CONST(90181.277637337407/8.0), - REAL_CONST(90204.384008261797/8.0), - REAL_CONST(90227.49185898836/8.0), - REAL_CONST(90250.601189327586/8.0), - REAL_CONST(90273.711999090039/8.0), - REAL_CONST(90296.824288086325/8.0), - REAL_CONST(90319.938056127125/8.0), - REAL_CONST(90343.053303023189/8.0), - REAL_CONST(90366.170028585286/8.0), - REAL_CONST(90389.288232624298/8.0), - REAL_CONST(90412.407914951138/8.0), - REAL_CONST(90435.529075376777/8.0), - REAL_CONST(90458.651713712257/8.0), - REAL_CONST(90481.775829768681/8.0), - REAL_CONST(90504.901423357209/8.0), - REAL_CONST(90528.028494289058/8.0), - REAL_CONST(90551.157042375504/8.0), - REAL_CONST(90574.287067427911/8.0), - REAL_CONST(90597.418569257643/8.0), - REAL_CONST(90620.551547676194/8.0), - REAL_CONST(90643.686002495073/8.0), - REAL_CONST(90666.821933525847/8.0), - REAL_CONST(90689.959340580186/8.0), - REAL_CONST(90713.098223469773/8.0), - REAL_CONST(90736.238582006365/8.0), - REAL_CONST(90759.380416001804/8.0), - REAL_CONST(90782.523725267951/8.0), - REAL_CONST(90805.668509616764/8.0), - REAL_CONST(90828.814768860233/8.0), - REAL_CONST(90851.962502810435/8.0), - REAL_CONST(90875.11171127946/8.0), - REAL_CONST(90898.262394079517/8.0), - REAL_CONST(90921.414551022855/8.0), - REAL_CONST(90944.568181921743/8.0), - REAL_CONST(90967.72328658856/8.0), - REAL_CONST(90990.879864835719/8.0), - REAL_CONST(91014.037916475718/8.0), - REAL_CONST(91037.19744132107/8.0), - REAL_CONST(91060.358439184391/8.0), - REAL_CONST(91083.520909878338/8.0), - REAL_CONST(91106.684853215629/8.0), - REAL_CONST(91129.850269009039/8.0), - REAL_CONST(91153.017157071401/8.0), - REAL_CONST(91176.185517215621/8.0), - REAL_CONST(91199.355349254649/8.0), - REAL_CONST(91222.526653001492/8.0), - REAL_CONST(91245.699428269247/8.0), - REAL_CONST(91268.873674871036/8.0), - REAL_CONST(91292.049392620058/8.0), - REAL_CONST(91315.226581329553/8.0), - REAL_CONST(91338.405240812834/8.0), - REAL_CONST(91361.585370883287/8.0), - REAL_CONST(91384.766971354344/8.0), - REAL_CONST(91407.950042039476/8.0), - REAL_CONST(91431.134582752245/8.0), - REAL_CONST(91454.320593306256/8.0), - REAL_CONST(91477.508073515171/8.0), - REAL_CONST(91500.697023192712/8.0), - REAL_CONST(91523.887442152685/8.0), - REAL_CONST(91547.07933020893/8.0), - REAL_CONST(91570.272687175326/8.0), - REAL_CONST(91593.467512865856/8.0), - REAL_CONST(91616.663807094534/8.0), - REAL_CONST(91639.861569675442/8.0), - REAL_CONST(91663.060800422725/8.0), - REAL_CONST(91686.261499150554/8.0), - REAL_CONST(91709.463665673218/8.0), - REAL_CONST(91732.66729980502/8.0), - REAL_CONST(91755.872401360321/8.0), - REAL_CONST(91779.078970153569/8.0), - REAL_CONST(91802.287005999257/8.0), - REAL_CONST(91825.49650871192/8.0), - REAL_CONST(91848.707478106167/8.0), - REAL_CONST(91871.91991399668/8.0), - REAL_CONST(91895.133816198169/8.0), - REAL_CONST(91918.349184525418/8.0), - REAL_CONST(91941.566018793281/8.0), - REAL_CONST(91964.784318816659/8.0), - REAL_CONST(91988.004084410495/8.0), - REAL_CONST(92011.22531538982/8.0), - REAL_CONST(92034.448011569708/8.0), - REAL_CONST(92057.672172765277/8.0), - REAL_CONST(92080.897798791746/8.0), - REAL_CONST(92104.124889464365/8.0), - REAL_CONST(92127.353444598411/8.0), - REAL_CONST(92150.58346400928/8.0), - REAL_CONST(92173.814947512379/8.0), - REAL_CONST(92197.04789492322/8.0), - REAL_CONST(92220.282306057314/8.0), - REAL_CONST(92243.518180730272/8.0), - REAL_CONST(92266.755518757753/8.0), - REAL_CONST(92289.994319955469/8.0), - REAL_CONST(92313.234584139194/8.0), - REAL_CONST(92336.476311124774/8.0), - REAL_CONST(92359.719500728082/8.0), - REAL_CONST(92382.964152765067/8.0), - REAL_CONST(92406.210267051734/8.0), - REAL_CONST(92429.457843404161/8.0), - REAL_CONST(92452.706881638471/8.0), - REAL_CONST(92475.957381570814/8.0), - REAL_CONST(92499.209343017443/8.0), - REAL_CONST(92522.462765794655/8.0), - REAL_CONST(92545.717649718805/8.0), - REAL_CONST(92568.973994606305/8.0), - REAL_CONST(92592.231800273614/8.0), - REAL_CONST(92615.491066537259/8.0), - REAL_CONST(92638.751793213814/8.0), - REAL_CONST(92662.01398011994/8.0), - REAL_CONST(92685.277627072326/8.0), - REAL_CONST(92708.54273388772/8.0), - REAL_CONST(92731.809300382942/8.0), - REAL_CONST(92755.077326374871/8.0), - REAL_CONST(92778.346811680414/8.0), - REAL_CONST(92801.617756116568/8.0), - REAL_CONST(92824.890159500384/8.0), - REAL_CONST(92848.164021648947/8.0), - REAL_CONST(92871.439342379424/8.0), - REAL_CONST(92894.716121509016/8.0), - REAL_CONST(92917.994358855023/8.0), - REAL_CONST(92941.274054234746/8.0), - REAL_CONST(92964.555207465572/8.0), - REAL_CONST(92987.837818364962/8.0), - REAL_CONST(93011.121886750407/8.0), - REAL_CONST(93034.407412439468/8.0), - REAL_CONST(93057.694395249753/8.0), - REAL_CONST(93080.982834998955/8.0), - REAL_CONST(93104.272731504767/8.0), - REAL_CONST(93127.564084584999/8.0), - REAL_CONST(93150.856894057491/8.0), - REAL_CONST(93174.15115974014/8.0), - REAL_CONST(93197.446881450916/8.0), - REAL_CONST(93220.744059007804/8.0), - REAL_CONST(93244.04269222889/8.0), - REAL_CONST(93267.342780932304/8.0), - REAL_CONST(93290.644324936235/8.0), - REAL_CONST(93313.947324058914/8.0), - REAL_CONST(93337.251778118633/8.0), - REAL_CONST(93360.557686933767/8.0), - REAL_CONST(93383.865050322696/8.0), - REAL_CONST(93407.173868103928/8.0), - REAL_CONST(93430.484140095941/8.0), - REAL_CONST(93453.795866117362/8.0), - REAL_CONST(93477.109045986799/8.0), - REAL_CONST(93500.423679522952/8.0), - REAL_CONST(93523.739766544561/8.0), - REAL_CONST(93547.057306870454/8.0), - REAL_CONST(93570.376300319491/8.0), - REAL_CONST(93593.696746710571/8.0), - REAL_CONST(93617.018645862699/8.0), - REAL_CONST(93640.341997594893/8.0), - REAL_CONST(93663.666801726242/8.0), - REAL_CONST(93686.993058075881/8.0), - REAL_CONST(93710.320766463032/8.0), - REAL_CONST(93733.64992670693/8.0), - REAL_CONST(93756.980538626914/8.0), - REAL_CONST(93780.312602042337/8.0), - REAL_CONST(93803.646116772637/8.0), - REAL_CONST(93826.981082637285/8.0), - REAL_CONST(93850.317499455836/8.0), - REAL_CONST(93873.655367047861/8.0), - REAL_CONST(93896.994685233032/8.0), - REAL_CONST(93920.335453831038/8.0), - REAL_CONST(93943.677672661666/8.0), - REAL_CONST(93967.021341544707/8.0), - REAL_CONST(93990.366460300051/8.0), - REAL_CONST(94013.713028747632/8.0), - REAL_CONST(94037.061046707429/8.0), - REAL_CONST(94060.410513999494/8.0), - REAL_CONST(94083.761430443905/8.0), - REAL_CONST(94107.113795860845/8.0), - REAL_CONST(94130.467610070496/8.0), - REAL_CONST(94153.822872893157/8.0), - REAL_CONST(94177.179584149111/8.0), - REAL_CONST(94200.537743658759/8.0), - REAL_CONST(94223.897351242529/8.0), - REAL_CONST(94247.25840672091/8.0), - REAL_CONST(94270.620909914433/8.0), - REAL_CONST(94293.98486064373/8.0), - REAL_CONST(94317.350258729421/8.0), - REAL_CONST(94340.71710399224/8.0), - REAL_CONST(94364.085396252936/8.0), - REAL_CONST(94387.455135332348/8.0), - REAL_CONST(94410.82632105134/8.0), - REAL_CONST(94434.198953230851/8.0), - REAL_CONST(94457.573031691878/8.0), - REAL_CONST(94480.948556255447/8.0), - REAL_CONST(94504.325526742658/8.0), - REAL_CONST(94527.70394297468/8.0), - REAL_CONST(94551.083804772716/8.0), - REAL_CONST(94574.465111958023/8.0), - REAL_CONST(94597.847864351934/8.0), - REAL_CONST(94621.232061775823/8.0), - REAL_CONST(94644.617704051096/8.0), - REAL_CONST(94668.004790999272/8.0), - REAL_CONST(94691.393322441872/8.0), - REAL_CONST(94714.783298200506/8.0), - REAL_CONST(94738.174718096794/8.0), - REAL_CONST(94761.567581952477/8.0), - REAL_CONST(94784.961889589307/8.0), - REAL_CONST(94808.357640829097/8.0), - REAL_CONST(94831.754835493703/8.0), - REAL_CONST(94855.153473405066/8.0), - REAL_CONST(94878.553554385173/8.0), - REAL_CONST(94901.955078256055/8.0), - REAL_CONST(94925.358044839784/8.0), - REAL_CONST(94948.762453958523/8.0), - REAL_CONST(94972.168305434476/8.0), - REAL_CONST(94995.575599089891/8.0), - REAL_CONST(95018.984334747074/8.0), - REAL_CONST(95042.394512228391/8.0), - REAL_CONST(95065.806131356265/8.0), - REAL_CONST(95089.219191953176/8.0), - REAL_CONST(95112.633693841635/8.0), - REAL_CONST(95136.04963684424/8.0), - REAL_CONST(95159.467020783617/8.0), - REAL_CONST(95182.885845482466/8.0), - REAL_CONST(95206.306110763529/8.0), - REAL_CONST(95229.727816449609/8.0), - REAL_CONST(95253.150962363579/8.0), - REAL_CONST(95276.575548328314/8.0), - REAL_CONST(95300.001574166803/8.0), - REAL_CONST(95323.429039702052/8.0), - REAL_CONST(95346.857944757154/8.0), - REAL_CONST(95370.288289155214/8.0), - REAL_CONST(95393.720072719429/8.0), - REAL_CONST(95417.153295273019/8.0), - REAL_CONST(95440.587956639298/8.0), - REAL_CONST(95464.024056641589/8.0), - REAL_CONST(95487.461595103305/8.0), - REAL_CONST(95510.900571847902/8.0), - REAL_CONST(95534.340986698866/8.0), - REAL_CONST(95557.782839479783/8.0), - REAL_CONST(95581.226130014256/8.0), - REAL_CONST(95604.670858125959/8.0), - REAL_CONST(95628.117023638595/8.0), - REAL_CONST(95651.564626375985/8.0), - REAL_CONST(95675.013666161918/8.0), - REAL_CONST(95698.464142820303/8.0), - REAL_CONST(95721.916056175076/8.0), - REAL_CONST(95745.369406050231/8.0), - REAL_CONST(95768.824192269807/8.0), - REAL_CONST(95792.280414657915/8.0), - REAL_CONST(95815.738073038709/8.0), - REAL_CONST(95839.197167236387/8.0), - REAL_CONST(95862.657697075221/8.0), - REAL_CONST(95886.11966237954/8.0), - REAL_CONST(95909.583062973688/8.0), - REAL_CONST(95933.047898682111/8.0), - REAL_CONST(95956.514169329268/8.0), - REAL_CONST(95979.981874739708/8.0), - REAL_CONST(96003.451014738006/8.0), - REAL_CONST(96026.921589148798/8.0), - REAL_CONST(96050.393597796792/8.0), - REAL_CONST(96073.867040506724/8.0), - REAL_CONST(96097.341917103375/8.0), - REAL_CONST(96120.818227411626/8.0), - REAL_CONST(96144.295971256375/8.0), - REAL_CONST(96167.775148462577/8.0), - REAL_CONST(96191.255758855244/8.0), - REAL_CONST(96214.737802259449/8.0), - REAL_CONST(96238.221278500292/8.0), - REAL_CONST(96261.70618740299/8.0), - REAL_CONST(96285.192528792715/8.0), - REAL_CONST(96308.680302494788/8.0), - REAL_CONST(96332.169508334526/8.0), - REAL_CONST(96355.660146137321/8.0), - REAL_CONST(96379.152215728609/8.0), - REAL_CONST(96402.645716933868/8.0), - REAL_CONST(96426.14064957868/8.0), - REAL_CONST(96449.637013488609/8.0), - REAL_CONST(96473.134808489311/8.0), - REAL_CONST(96496.63403440651/8.0), - REAL_CONST(96520.134691065963/8.0), - REAL_CONST(96543.636778293469/8.0), - REAL_CONST(96567.140295914898/8.0), - REAL_CONST(96590.645243756153/8.0), - REAL_CONST(96614.151621643221/8.0), - REAL_CONST(96637.659429402134/8.0), - REAL_CONST(96661.168666858954/8.0), - REAL_CONST(96684.679333839798/8.0), - REAL_CONST(96708.191430170875/8.0), - REAL_CONST(96731.70495567839/8.0), - REAL_CONST(96755.219910188665/8.0), - REAL_CONST(96778.736293528011/8.0), - REAL_CONST(96802.254105522836/8.0), - REAL_CONST(96825.77334599958/8.0), - REAL_CONST(96849.29401478474/8.0), - REAL_CONST(96872.816111704873/8.0), - REAL_CONST(96896.339636586577/8.0), - REAL_CONST(96919.864589256511/8.0), - REAL_CONST(96943.390969541389/8.0), - REAL_CONST(96966.918777267958/8.0), - REAL_CONST(96990.448012263048/8.0), - REAL_CONST(97013.978674353522/8.0), - REAL_CONST(97037.510763366285/8.0), - REAL_CONST(97061.044279128328/8.0), - REAL_CONST(97084.579221466673/8.0), - REAL_CONST(97108.115590208385/8.0), - REAL_CONST(97131.653385180587/8.0), - REAL_CONST(97155.19260621049/8.0), - REAL_CONST(97178.733253125291/8.0), - REAL_CONST(97202.2753257523/8.0), - REAL_CONST(97225.81882391886/8.0), - REAL_CONST(97249.363747452342/8.0), - REAL_CONST(97272.910096180189/8.0), - REAL_CONST(97296.457869929916/8.0), - REAL_CONST(97320.007068529041/8.0), - REAL_CONST(97343.557691805196/8.0), - REAL_CONST(97367.109739586012/8.0), - REAL_CONST(97390.663211699197/8.0), - REAL_CONST(97414.218107972498/8.0), - REAL_CONST(97437.774428233737/8.0), - REAL_CONST(97461.332172310766/8.0), - REAL_CONST(97484.891340031507/8.0), - REAL_CONST(97508.451931223899/8.0), - REAL_CONST(97532.013945715982/8.0), - REAL_CONST(97555.577383335811/8.0), - REAL_CONST(97579.142243911512/8.0), - REAL_CONST(97602.708527271257/8.0), - REAL_CONST(97626.276233243261/8.0), - REAL_CONST(97649.845361655811/8.0), - REAL_CONST(97673.415912337223/8.0), - REAL_CONST(97696.987885115886/8.0), - REAL_CONST(97720.561279820206/8.0), - REAL_CONST(97744.1360962787/8.0), - REAL_CONST(97767.712334319876/8.0), - REAL_CONST(97791.289993772341/8.0), - REAL_CONST(97814.869074464703/8.0), - REAL_CONST(97838.449576225685/8.0), - REAL_CONST(97862.031498883996/8.0), - REAL_CONST(97885.614842268449/8.0), - REAL_CONST(97909.199606207883/8.0), - REAL_CONST(97932.785790531183/8.0), - REAL_CONST(97956.37339506732/8.0), - REAL_CONST(97979.962419645264/8.0), - REAL_CONST(98003.552864094076/8.0), - REAL_CONST(98027.144728242856/8.0), - REAL_CONST(98050.738011920766/8.0), - REAL_CONST(98074.332714956996/8.0), - REAL_CONST(98097.928837180807/8.0), - REAL_CONST(98121.526378421506/8.0), - REAL_CONST(98145.125338508456/8.0), - REAL_CONST(98168.725717271067/8.0), - REAL_CONST(98192.327514538789/8.0), - REAL_CONST(98215.930730141132/8.0), - REAL_CONST(98239.535363907664/8.0), - REAL_CONST(98263.141415668011/8.0), - REAL_CONST(98286.748885251814/8.0), - REAL_CONST(98310.357772488816/8.0), - REAL_CONST(98333.968077208759/8.0), - REAL_CONST(98357.579799241488/8.0), - REAL_CONST(98381.192938416847/8.0), - REAL_CONST(98404.807494564782/8.0), - REAL_CONST(98428.42346751524/8.0), - REAL_CONST(98452.040857098269/8.0), - REAL_CONST(98475.659663143917/8.0), - REAL_CONST(98499.27988548232/8.0), - REAL_CONST(98522.901523943656/8.0), - REAL_CONST(98546.524578358163/8.0), - REAL_CONST(98570.149048556093/8.0), - REAL_CONST(98593.774934367786/8.0), - REAL_CONST(98617.402235623624/8.0), - REAL_CONST(98641.030952154048/8.0), - REAL_CONST(98664.661083789513/8.0), - REAL_CONST(98688.292630360564/8.0), - REAL_CONST(98711.925591697771/8.0), - REAL_CONST(98735.559967631794/8.0), - REAL_CONST(98759.195757993293/8.0), - REAL_CONST(98782.832962613014/8.0), - REAL_CONST(98806.471581321734/8.0), - REAL_CONST(98830.111613950285/8.0), - REAL_CONST(98853.753060329575/8.0), - REAL_CONST(98877.39592029051/8.0), - REAL_CONST(98901.040193664099/8.0), - REAL_CONST(98924.68588028138/8.0), - REAL_CONST(98948.33297997342/8.0), - REAL_CONST(98971.981492571387/8.0), - REAL_CONST(98995.63141790645/8.0), - REAL_CONST(99019.282755809851/8.0), - REAL_CONST(99042.935506112874/8.0), - REAL_CONST(99066.589668646877/8.0), - REAL_CONST(99090.245243243233/8.0), - REAL_CONST(99113.902229733401/8.0), - REAL_CONST(99137.560627948857/8.0), - REAL_CONST(99161.220437721131/8.0), - REAL_CONST(99184.881658881859/8.0), - REAL_CONST(99208.544291262631/8.0), - REAL_CONST(99232.208334695169/8.0), - REAL_CONST(99255.87378901121/8.0), - REAL_CONST(99279.540654042547/8.0), - REAL_CONST(99303.208929621018/8.0), - REAL_CONST(99326.878615578535/8.0), - REAL_CONST(99350.549711746993/8.0), - REAL_CONST(99374.222217958435/8.0), - REAL_CONST(99397.896134044888/8.0), - REAL_CONST(99421.571459838422/8.0), - REAL_CONST(99445.248195171211/8.0), - REAL_CONST(99468.926339875441/8.0), - REAL_CONST(99492.605893783344/8.0), - REAL_CONST(99516.286856727209/8.0), - REAL_CONST(99539.969228539398/8.0), - REAL_CONST(99563.653009052287/8.0), - REAL_CONST(99587.338198098325/8.0), - REAL_CONST(99611.024795510006/8.0), - REAL_CONST(99634.712801119866/8.0), - REAL_CONST(99658.402214760499/8.0), - REAL_CONST(99682.093036264545/8.0), - REAL_CONST(99705.785265464699/8.0), - REAL_CONST(99729.478902193689/8.0), - REAL_CONST(99753.173946284325/8.0), - REAL_CONST(99776.870397569437/8.0), - REAL_CONST(99800.56825588191/8.0), - REAL_CONST(99824.267521054688/8.0), - REAL_CONST(99847.968192920773/8.0), - REAL_CONST(99871.670271313182/8.0), - REAL_CONST(99895.373756065004/8.0), - REAL_CONST(99919.078647009388/8.0), - REAL_CONST(99942.78494397951/8.0), - REAL_CONST(99966.492646808634/8.0), - REAL_CONST(99990.20175533001/8.0), - REAL_CONST(100013.91226937699/8.0), - REAL_CONST(100037.62418878295/8.0), - REAL_CONST(100061.33751338134/8.0), - REAL_CONST(100085.05224300563/8.0), - REAL_CONST(100108.76837748935/8.0), - REAL_CONST(100132.4859166661/8.0), - REAL_CONST(100156.2048603695/8.0), - REAL_CONST(100179.92520843323/8.0), - REAL_CONST(100203.64696069101/8.0), - REAL_CONST(100227.37011697664/8.0), - REAL_CONST(100251.09467712394/8.0), - REAL_CONST(100274.82064096678/8.0), - REAL_CONST(100298.54800833909/8.0), - REAL_CONST(100322.27677907483/8.0), - REAL_CONST(100346.00695300807/8.0), - REAL_CONST(100369.73852997283/8.0), - REAL_CONST(100393.47150980328/8.0), - REAL_CONST(100417.20589233354/8.0), - REAL_CONST(100440.94167739789/8.0), - REAL_CONST(100464.67886483055/8.0), - REAL_CONST(100488.41745446586/8.0), - REAL_CONST(100512.1574461382/8.0), - REAL_CONST(100535.89883968196/8.0), - REAL_CONST(100559.64163493161/8.0), - REAL_CONST(100583.38583172169/8.0), - REAL_CONST(100607.13142988674/8.0), - REAL_CONST(100630.87842926137/8.0), - REAL_CONST(100654.62682968024/8.0), - REAL_CONST(100678.37663097809/8.0), - REAL_CONST(100702.12783298964/8.0), - REAL_CONST(100725.88043554971/8.0), - REAL_CONST(100749.63443849317/8.0), - REAL_CONST(100773.38984165489/8.0), - REAL_CONST(100797.14664486986/8.0), - REAL_CONST(100820.90484797307/8.0), - REAL_CONST(100844.66445079957/8.0), - REAL_CONST(100868.42545318443/8.0), - REAL_CONST(100892.18785496285/8.0), - REAL_CONST(100915.95165596998/8.0), - REAL_CONST(100939.71685604109/8.0), - REAL_CONST(100963.48345501146/8.0), - REAL_CONST(100987.25145271645/8.0), - REAL_CONST(101011.02084899142/8.0), - REAL_CONST(101034.79164367182/8.0), - REAL_CONST(101058.56383659317/8.0), - REAL_CONST(101082.33742759094/8.0), - REAL_CONST(101106.11241650078/8.0), - REAL_CONST(101129.88880315828/8.0), - REAL_CONST(101153.66658739912/8.0), - REAL_CONST(101177.44576905905/8.0), - REAL_CONST(101201.22634797383/8.0), - REAL_CONST(101225.00832397929/8.0), - REAL_CONST(101248.7916969113/8.0), - REAL_CONST(101272.57646660579/8.0), - REAL_CONST(101296.36263289873/8.0), - REAL_CONST(101320.15019562612/8.0), - REAL_CONST(101343.93915462404/8.0), - REAL_CONST(101367.7295097286/8.0), - REAL_CONST(101391.52126077596/8.0), - REAL_CONST(101415.31440760233/8.0), - REAL_CONST(101439.10895004397/8.0), - REAL_CONST(101462.9048879372/8.0), - REAL_CONST(101486.70222111834/8.0), - REAL_CONST(101510.50094942382/8.0), - REAL_CONST(101534.30107269008/8.0), - REAL_CONST(101558.10259075361/8.0), - REAL_CONST(101581.90550345098/8.0), - REAL_CONST(101605.70981061876/8.0), - REAL_CONST(101629.5155120936/8.0), - REAL_CONST(101653.32260771218/8.0), - REAL_CONST(101677.13109731126/8.0), - REAL_CONST(101700.9409807276/8.0), - REAL_CONST(101724.75225779804/8.0), - REAL_CONST(101748.56492835947/8.0), - REAL_CONST(101772.37899224881/8.0), - REAL_CONST(101796.19444930303/8.0), - REAL_CONST(101820.01129935916/8.0), - REAL_CONST(101843.82954225427/8.0), - REAL_CONST(101867.64917782549/8.0), - REAL_CONST(101891.47020590997/8.0), - REAL_CONST(101915.29262634492/8.0), - REAL_CONST(101939.11643896763/8.0), - REAL_CONST(101962.94164361537/8.0), - REAL_CONST(101986.76824012553/8.0), - REAL_CONST(102010.59622833549/8.0), - REAL_CONST(102034.42560808272/8.0), - REAL_CONST(102058.25637920471/8.0), - REAL_CONST(102082.08854153901/8.0), - REAL_CONST(102105.9220949232/8.0), - REAL_CONST(102129.75703919494/8.0), - REAL_CONST(102153.59337419191/8.0), - REAL_CONST(102177.43109975185/8.0), - REAL_CONST(102201.27021571253/8.0), - REAL_CONST(102225.1107219118/8.0), - REAL_CONST(102248.95261818753/8.0), - REAL_CONST(102272.79590437764/8.0), - REAL_CONST(102296.64058032009/8.0), - REAL_CONST(102320.48664585294/8.0), - REAL_CONST(102344.33410081422/8.0), - REAL_CONST(102368.18294504205/8.0), - REAL_CONST(102392.03317837461/8.0), - REAL_CONST(102415.88480065008/8.0), - REAL_CONST(102439.73781170673/8.0), - REAL_CONST(102463.59221138287/8.0), - REAL_CONST(102487.44799951684/8.0), - REAL_CONST(102511.30517594704/8.0), - REAL_CONST(102535.1637405119/8.0), - REAL_CONST(102559.02369304992/8.0), - REAL_CONST(102582.88503339965/8.0), - REAL_CONST(102606.74776139967/8.0), - REAL_CONST(102630.61187688859/8.0), - REAL_CONST(102654.4773797051/8.0), - REAL_CONST(102678.34426968795/8.0), - REAL_CONST(102702.21254667587/8.0), - REAL_CONST(102726.08221050771/8.0), - REAL_CONST(102749.95326102231/8.0), - REAL_CONST(102773.8256980586/8.0), - REAL_CONST(102797.69952145554/8.0), - REAL_CONST(102821.57473105213/8.0), - REAL_CONST(102845.45132668741/8.0), - REAL_CONST(102869.32930820051/8.0), - REAL_CONST(102893.20867543056/8.0), - REAL_CONST(102917.08942821674/8.0), - REAL_CONST(102940.97156639832/8.0), - REAL_CONST(102964.85508981455/8.0), - REAL_CONST(102988.73999830478/8.0), - REAL_CONST(103012.6262917084/8.0), - REAL_CONST(103036.51396986481/8.0), - REAL_CONST(103060.40303261351/8.0), - REAL_CONST(103084.293479794/8.0), - REAL_CONST(103108.18531124585/8.0), - REAL_CONST(103132.07852680866/8.0), - REAL_CONST(103155.97312632212/8.0), - REAL_CONST(103179.8691096259/8.0), - REAL_CONST(103203.76647655977/8.0), - REAL_CONST(103227.66522696352/8.0), - REAL_CONST(103251.56536067701/8.0), - REAL_CONST(103275.46687754011/8.0), - REAL_CONST(103299.36977739276/8.0), - REAL_CONST(103323.27406007495/8.0), - REAL_CONST(103347.1797254267/8.0), - REAL_CONST(103371.0867732881/8.0), - REAL_CONST(103394.99520349925/8.0), - REAL_CONST(103418.90501590034/8.0), - REAL_CONST(103442.81621033157/8.0), - REAL_CONST(103466.72878663319/8.0), - REAL_CONST(103490.64274464553/8.0), - REAL_CONST(103514.55808420894/8.0), - REAL_CONST(103538.4748051638/8.0), - REAL_CONST(103562.39290735057/8.0), - REAL_CONST(103586.31239060973/8.0), - REAL_CONST(103610.23325478184/8.0), - REAL_CONST(103634.15549970744/8.0), - REAL_CONST(103658.07912522719/8.0), - REAL_CONST(103682.00413118176/8.0), - REAL_CONST(103705.93051741188/8.0), - REAL_CONST(103729.85828375829/8.0), - REAL_CONST(103753.78743006183/8.0), - REAL_CONST(103777.71795616332/8.0), - REAL_CONST(103801.64986190372/8.0), - REAL_CONST(103825.58314712394/8.0), - REAL_CONST(103849.51781166498/8.0), - REAL_CONST(103873.4538553679/8.0), - REAL_CONST(103897.39127807376/8.0), - REAL_CONST(103921.33007962372/8.0), - REAL_CONST(103945.27025985894/8.0), - REAL_CONST(103969.21181862066/8.0), - REAL_CONST(103993.15475575015/8.0), - REAL_CONST(104017.0990710887/8.0), - REAL_CONST(104041.0447644777/8.0), - REAL_CONST(104064.99183575854/8.0), - REAL_CONST(104088.94028477269/8.0), - REAL_CONST(104112.89011136163/8.0), - REAL_CONST(104136.84131536692/8.0), - REAL_CONST(104160.79389663014/8.0), - REAL_CONST(104184.74785499295/8.0), - REAL_CONST(104208.70319029699/8.0), - REAL_CONST(104232.65990238401/8.0), - REAL_CONST(104256.61799109577/8.0), - REAL_CONST(104280.57745627411/8.0), - REAL_CONST(104304.53829776087/8.0), - REAL_CONST(104328.50051539797/8.0), - REAL_CONST(104352.46410902737/8.0), - REAL_CONST(104376.42907849104/8.0), - REAL_CONST(104400.39542363105/8.0), - REAL_CONST(104424.36314428948/8.0), - REAL_CONST(104448.33224030846/8.0), - REAL_CONST(104472.3027115302/8.0), - REAL_CONST(104496.27455779689/8.0), - REAL_CONST(104520.24777895081/8.0), - REAL_CONST(104544.22237483428/8.0), - REAL_CONST(104568.19834528965/8.0), - REAL_CONST(104592.17569015936/8.0), - REAL_CONST(104616.15440928582/8.0), - REAL_CONST(104640.13450251156/8.0), - REAL_CONST(104664.1159696791/8.0), - REAL_CONST(104688.09881063103/8.0), - REAL_CONST(104712.08302520998/8.0), - REAL_CONST(104736.06861325864/8.0), - REAL_CONST(104760.05557461972/8.0), - REAL_CONST(104784.043909136/8.0), - REAL_CONST(104808.03361665027/8.0), - REAL_CONST(104832.0246970054/8.0), - REAL_CONST(104856.01715004431/8.0), - REAL_CONST(104880.01097560991/8.0), - REAL_CONST(104904.00617354522/8.0), - REAL_CONST(104928.00274369326/8.0), - REAL_CONST(104952.00068589712/8.0), - REAL_CONST(104975.99999999993/8.0), - REAL_CONST(105000.00068584486/8.0), - REAL_CONST(105024.00274327511/8.0), - REAL_CONST(105048.00617213396/8.0), - REAL_CONST(105072.0109722647/8.0), - REAL_CONST(105096.0171435107/8.0), - REAL_CONST(105120.02468571534/8.0), - REAL_CONST(105144.03359872208/8.0), - REAL_CONST(105168.04388237436/8.0), - REAL_CONST(105192.05553651576/8.0), - REAL_CONST(105216.06856098982/8.0), - REAL_CONST(105240.08295564017/8.0), - REAL_CONST(105264.09872031047/8.0), - REAL_CONST(105288.11585484444/8.0), - REAL_CONST(105312.13435908582/8.0), - REAL_CONST(105336.1542328784/8.0), - REAL_CONST(105360.17547606604/8.0), - REAL_CONST(105384.19808849262/8.0), - REAL_CONST(105408.22207000206/8.0), - REAL_CONST(105432.24742043833/8.0), - REAL_CONST(105456.27413964548/8.0), - REAL_CONST(105480.30222746753/8.0), - REAL_CONST(105504.33168374863/8.0), - REAL_CONST(105528.36250833291/8.0), - REAL_CONST(105552.39470106458/8.0), - REAL_CONST(105576.42826178786/8.0), - REAL_CONST(105600.46319034706/8.0), - REAL_CONST(105624.49948658649/8.0), - REAL_CONST(105648.53715035053/8.0), - REAL_CONST(105672.5761814836/8.0), - REAL_CONST(105696.61657983017/8.0), - REAL_CONST(105720.65834523473/8.0), - REAL_CONST(105744.70147754184/8.0), - REAL_CONST(105768.7459765961/8.0), - REAL_CONST(105792.79184224214/8.0), - REAL_CONST(105816.83907432464/8.0), - REAL_CONST(105840.88767268835/8.0), - REAL_CONST(105864.93763717801/8.0), - REAL_CONST(105888.98896763846/8.0), - REAL_CONST(105913.04166391456/8.0), - REAL_CONST(105937.09572585119/8.0), - REAL_CONST(105961.15115329332/8.0), - REAL_CONST(105985.20794608595/8.0), - REAL_CONST(106009.26610407409/8.0), - REAL_CONST(106033.32562710284/8.0), - REAL_CONST(106057.38651501729/8.0), - REAL_CONST(106081.44876766266/8.0), - REAL_CONST(106105.51238488412/8.0), - REAL_CONST(106129.57736652695/8.0), - REAL_CONST(106153.64371243643/8.0), - REAL_CONST(106177.71142245791/8.0), - REAL_CONST(106201.78049643678/8.0), - REAL_CONST(106225.85093421848/8.0), - REAL_CONST(106249.92273564848/8.0), - REAL_CONST(106273.99590057228/8.0), - REAL_CONST(106298.07042883546/8.0), - REAL_CONST(106322.14632028362/8.0), - REAL_CONST(106346.22357476239/8.0), - REAL_CONST(106370.30219211751/8.0), - REAL_CONST(106394.38217219469/8.0), - REAL_CONST(106418.46351483969/8.0), - REAL_CONST(106442.54621989837/8.0), - REAL_CONST(106466.63028721658/8.0), - REAL_CONST(106490.71571664025/8.0), - REAL_CONST(106514.80250801529/8.0), - REAL_CONST(106538.89066118775/8.0), - REAL_CONST(106562.98017600364/8.0), - REAL_CONST(106587.07105230905/8.0), - REAL_CONST(106611.16328995011/8.0), - REAL_CONST(106635.25688877302/8.0), - REAL_CONST(106659.35184862395/8.0), - REAL_CONST(106683.44816934918/8.0), - REAL_CONST(106707.54585079502/8.0), - REAL_CONST(106731.64489280782/8.0), - REAL_CONST(106755.74529523395/8.0), - REAL_CONST(106779.84705791986/8.0), - REAL_CONST(106803.95018071201/8.0), - REAL_CONST(106828.05466345693/8.0), - REAL_CONST(106852.16050600118/8.0), - REAL_CONST(106876.26770819137/8.0), - REAL_CONST(106900.37626987413/8.0), - REAL_CONST(106924.48619089619/8.0), - REAL_CONST(106948.59747110425/8.0), - REAL_CONST(106972.71011034511/8.0), - REAL_CONST(106996.82410846559/8.0), - REAL_CONST(107020.93946531253/8.0), - REAL_CONST(107045.05618073288/8.0), - REAL_CONST(107069.17425457356/8.0), - REAL_CONST(107093.29368668159/8.0), - REAL_CONST(107117.41447690397/8.0), - REAL_CONST(107141.53662508781/8.0), - REAL_CONST(107165.66013108024/8.0), - REAL_CONST(107189.7849947284/8.0), - REAL_CONST(107213.91121587952/8.0), - REAL_CONST(107238.03879438085/8.0), - REAL_CONST(107262.16773007967/8.0), - REAL_CONST(107286.29802282334/8.0), - REAL_CONST(107310.42967245923/8.0), - REAL_CONST(107334.56267883476/8.0), - REAL_CONST(107358.69704179741/8.0), - REAL_CONST(107382.83276119467/8.0), - REAL_CONST(107406.96983687414/8.0), - REAL_CONST(107431.10826868335/8.0), - REAL_CONST(107455.24805646999/8.0), - REAL_CONST(107479.38920008171/8.0), - REAL_CONST(107503.53169936626/8.0), - REAL_CONST(107527.67555417139/8.0), - REAL_CONST(107551.82076434491/8.0), - REAL_CONST(107575.96732973469/8.0), - REAL_CONST(107600.11525018861/8.0), - REAL_CONST(107624.26452555459/8.0), - REAL_CONST(107648.41515568066/8.0), - REAL_CONST(107672.56714041479/8.0), - REAL_CONST(107696.72047960508/8.0), - REAL_CONST(107720.87517309963/8.0), - REAL_CONST(107745.03122074658/8.0), - REAL_CONST(107769.18862239413/8.0), - REAL_CONST(107793.34737789053/8.0), - REAL_CONST(107817.50748708403/8.0), - REAL_CONST(107841.66894982298/8.0), - REAL_CONST(107865.83176595572/8.0), - REAL_CONST(107889.99593533068/8.0), - REAL_CONST(107914.16145779629/8.0), - REAL_CONST(107938.32833320105/8.0), - REAL_CONST(107962.49656139348/8.0), - REAL_CONST(107986.66614222217/8.0), - REAL_CONST(108010.83707553572/8.0), - REAL_CONST(108035.00936118282/8.0), - REAL_CONST(108059.18299901215/8.0), - REAL_CONST(108083.35798887245/8.0), - REAL_CONST(108107.53433061253/8.0), - REAL_CONST(108131.71202408121/8.0), - REAL_CONST(108155.89106912735/8.0), - REAL_CONST(108180.07146559987/8.0), - REAL_CONST(108204.25321334775/8.0), - REAL_CONST(108228.43631221994/8.0), - REAL_CONST(108252.62076206553/8.0), - REAL_CONST(108276.80656273357/8.0), - REAL_CONST(108300.99371407321/8.0), - REAL_CONST(108325.18221593359/8.0), - REAL_CONST(108349.37206816394/8.0), - REAL_CONST(108373.56327061349/8.0), - REAL_CONST(108397.75582313156/8.0), - REAL_CONST(108421.94972556747/8.0), - REAL_CONST(108446.1449777706/8.0), - REAL_CONST(108470.34157959036/8.0), - REAL_CONST(108494.53953087622/8.0), - REAL_CONST(108518.73883147769/8.0), - REAL_CONST(108542.93948124432/8.0), - REAL_CONST(108567.14148002568/8.0), - REAL_CONST(108591.34482767139/8.0), - REAL_CONST(108615.54952403114/8.0), - REAL_CONST(108639.75556895464/8.0), - REAL_CONST(108663.96296229165/8.0), - REAL_CONST(108688.17170389196/8.0), - REAL_CONST(108712.38179360541/8.0), - REAL_CONST(108736.59323128188/8.0), - REAL_CONST(108760.80601677128/8.0), - REAL_CONST(108785.02014992358/8.0), - REAL_CONST(108809.23563058881/8.0), - REAL_CONST(108833.45245861699/8.0), - REAL_CONST(108857.67063385822/8.0), - REAL_CONST(108881.89015616261/8.0), - REAL_CONST(108906.11102538036/8.0), - REAL_CONST(108930.33324136167/8.0), - REAL_CONST(108954.55680395682/8.0), - REAL_CONST(108978.78171301607/8.0), - REAL_CONST(109003.00796838976/8.0), - REAL_CONST(109027.23556992831/8.0), - REAL_CONST(109051.46451748211/8.0), - REAL_CONST(109075.69481090162/8.0), - REAL_CONST(109099.92645003737/8.0), - REAL_CONST(109124.15943473989/8.0), - REAL_CONST(109148.39376485976/8.0), - REAL_CONST(109172.62944024763/8.0), - REAL_CONST(109196.86646075416/8.0), - REAL_CONST(109221.10482623006/8.0), - REAL_CONST(109245.34453652608/8.0), - REAL_CONST(109269.58559149304/8.0), - REAL_CONST(109293.82799098175/8.0), - REAL_CONST(109318.07173484311/8.0), - REAL_CONST(109342.31682292801/8.0), - REAL_CONST(109366.56325508743/8.0), - REAL_CONST(109390.81103117237/8.0), - REAL_CONST(109415.06015103387/8.0), - REAL_CONST(109439.31061452301/8.0), - REAL_CONST(109463.56242149093/8.0), - REAL_CONST(109487.8155717888/8.0), - REAL_CONST(109512.07006526781/8.0), - REAL_CONST(109536.3259017792/8.0), - REAL_CONST(109560.58308117429/8.0), - REAL_CONST(109584.8416033044/8.0), - REAL_CONST(109609.1014680209/8.0), - REAL_CONST(109633.36267517522/8.0), - REAL_CONST(109657.62522461878/8.0), - REAL_CONST(109681.88911620311/8.0), - REAL_CONST(109706.15434977971/8.0), - REAL_CONST(109730.4209252002/8.0), - REAL_CONST(109754.68884231619/8.0), - REAL_CONST(109778.95810097932/8.0), - REAL_CONST(109803.22870104131/8.0), - REAL_CONST(109827.50064235389/8.0), - REAL_CONST(109851.77392476884/8.0), - REAL_CONST(109876.04854813802/8.0), - REAL_CONST(109900.32451231324/8.0), - REAL_CONST(109924.60181714644/8.0), - REAL_CONST(109948.88046248957/8.0), - REAL_CONST(109973.1604481946/8.0), - REAL_CONST(109997.44177411357/8.0), - REAL_CONST(110021.72444009855/8.0), - REAL_CONST(110046.00844600165/8.0), - REAL_CONST(110070.29379167501/8.0), - REAL_CONST(110094.58047697082/8.0), - REAL_CONST(110118.86850174134/8.0), - REAL_CONST(110143.15786583882/8.0), - REAL_CONST(110167.44856911557/8.0), - REAL_CONST(110191.74061142397/8.0), - REAL_CONST(110216.03399261639/8.0), - REAL_CONST(110240.32871254528/8.0), - REAL_CONST(110264.62477106311/8.0), - REAL_CONST(110288.9221680224/8.0), - REAL_CONST(110313.22090327571/8.0), - REAL_CONST(110337.52097667565/8.0), - REAL_CONST(110361.82238807483/8.0), - REAL_CONST(110386.12513732594/8.0), - REAL_CONST(110410.42922428172/8.0), - REAL_CONST(110434.73464879491/8.0), - REAL_CONST(110459.04141071832/8.0), - REAL_CONST(110483.34950990479/8.0), - REAL_CONST(110507.6589462072/8.0), - REAL_CONST(110531.96971947847/8.0), - REAL_CONST(110556.28182957157/8.0), - REAL_CONST(110580.5952763395/8.0), - REAL_CONST(110604.91005963532/8.0), - REAL_CONST(110629.22617931209/8.0), - REAL_CONST(110653.54363522294/8.0), - REAL_CONST(110677.86242722106/8.0), - REAL_CONST(110702.18255515963/8.0), - REAL_CONST(110726.50401889188/8.0), - REAL_CONST(110750.82681827113/8.0), - REAL_CONST(110775.1509531507/8.0), - REAL_CONST(110799.47642338395/8.0), - REAL_CONST(110823.80322882428/8.0), - REAL_CONST(110848.13136932514/8.0), - REAL_CONST(110872.46084474004/8.0), - REAL_CONST(110896.79165492248/8.0), - REAL_CONST(110921.12379972603/8.0), - REAL_CONST(110945.4572790043/8.0), - REAL_CONST(110969.79209261097/8.0), - REAL_CONST(110994.12824039967/8.0), - REAL_CONST(111018.46572222417/8.0), - REAL_CONST(111042.80453793822/8.0), - REAL_CONST(111067.14468739564/8.0), - REAL_CONST(111091.48617045028/8.0), - REAL_CONST(111115.82898695602/8.0), - REAL_CONST(111140.1731367668/8.0), - REAL_CONST(111164.51861973655/8.0), - REAL_CONST(111188.86543571933/8.0), - REAL_CONST(111213.21358456917/8.0), - REAL_CONST(111237.56306614014/8.0), - REAL_CONST(111261.91388028639/8.0), - REAL_CONST(111286.26602686207/8.0), - REAL_CONST(111310.61950572141/8.0), - REAL_CONST(111334.97431671864/8.0), - REAL_CONST(111359.33045970804/8.0), - REAL_CONST(111383.68793454397/8.0), - REAL_CONST(111408.04674108078/8.0), - REAL_CONST(111432.40687917286/8.0), - REAL_CONST(111456.76834867468/8.0), - REAL_CONST(111481.13114944073/8.0), - REAL_CONST(111505.49528132551/8.0), - REAL_CONST(111529.86074418361/8.0), - REAL_CONST(111554.22753786964/8.0), - REAL_CONST(111578.59566223821/8.0), - REAL_CONST(111602.96511714405/8.0), - REAL_CONST(111627.33590244185/8.0), - REAL_CONST(111651.7080179864/8.0), - REAL_CONST(111676.08146363248/8.0), - REAL_CONST(111700.45623923496/8.0), - REAL_CONST(111724.8323446487/8.0), - REAL_CONST(111749.20977972864/8.0), - REAL_CONST(111773.58854432974/8.0), - REAL_CONST(111797.96863830699/8.0), - REAL_CONST(111822.35006151545/8.0), - REAL_CONST(111846.73281381019/8.0), - REAL_CONST(111871.11689504632/8.0), - REAL_CONST(111895.50230507903/8.0), - REAL_CONST(111919.8890437635/8.0), - REAL_CONST(111944.27711095495/8.0), - REAL_CONST(111968.6665065087/8.0), - REAL_CONST(111993.05723028004/8.0), - REAL_CONST(112017.44928212435/8.0), - REAL_CONST(112041.842661897/8.0), - REAL_CONST(112066.23736945343/8.0), - REAL_CONST(112090.63340464912/8.0), - REAL_CONST(112115.03076733962/8.0), - REAL_CONST(112139.42945738042/8.0), - REAL_CONST(112163.82947462716/8.0), - REAL_CONST(112188.23081893545/8.0), - REAL_CONST(112212.63349016097/8.0), - REAL_CONST(112237.03748815943/8.0), - REAL_CONST(112261.44281278658/8.0), - REAL_CONST(112285.84946389822/8.0), - REAL_CONST(112310.25744135017/8.0), - REAL_CONST(112334.66674499828/8.0), - REAL_CONST(112359.07737469849/8.0), - REAL_CONST(112383.48933030672/8.0), - REAL_CONST(112407.90261167898/8.0), - REAL_CONST(112432.31721867126/8.0), - REAL_CONST(112456.73315113965/8.0), - REAL_CONST(112481.15040894024/8.0), - REAL_CONST(112505.56899192919/8.0), - REAL_CONST(112529.98889996267/8.0), - REAL_CONST(112554.41013289688/8.0), - REAL_CONST(112578.8326905881/8.0), - REAL_CONST(112603.25657289263/8.0), - REAL_CONST(112627.68177966679/8.0), - REAL_CONST(112652.10831076698/8.0), - REAL_CONST(112676.53616604958/8.0), - REAL_CONST(112700.96534537108/8.0), - REAL_CONST(112725.39584858794/8.0), - REAL_CONST(112749.82767555672/8.0), - REAL_CONST(112774.26082613398/8.0), - REAL_CONST(112798.6953001763/8.0), - REAL_CONST(112823.13109754038/8.0), - REAL_CONST(112847.56821808286/8.0), - REAL_CONST(112872.00666166049/8.0), - REAL_CONST(112896.44642813003/8.0), - REAL_CONST(112920.88751734827/8.0), - REAL_CONST(112945.32992917208/8.0), - REAL_CONST(112969.77366345831/8.0), - REAL_CONST(112994.21872006389/8.0), - REAL_CONST(113018.66509884578/8.0), - REAL_CONST(113043.11279966099/8.0), - REAL_CONST(113067.56182236652/8.0), - REAL_CONST(113092.01216681948/8.0), - REAL_CONST(113116.46383287695/8.0), - REAL_CONST(113140.9168203961/8.0), - REAL_CONST(113165.37112923413/8.0), - REAL_CONST(113189.82675924824/8.0), - REAL_CONST(113214.28371029573/8.0), - REAL_CONST(113238.74198223387/8.0), - REAL_CONST(113263.20157492002/8.0), - REAL_CONST(113287.66248821157/8.0), - REAL_CONST(113312.12472196593/8.0), - REAL_CONST(113336.58827604055/8.0), - REAL_CONST(113361.05315029295/8.0), - REAL_CONST(113385.51934458067/8.0), - REAL_CONST(113409.98685876124/8.0), - REAL_CONST(113434.45569269233/8.0), - REAL_CONST(113458.92584623155/8.0), - REAL_CONST(113483.39731923661/8.0), - REAL_CONST(113507.87011156522/8.0), - REAL_CONST(113532.34422307517/8.0), - REAL_CONST(113556.81965362425/8.0), - REAL_CONST(113581.2964030703/8.0), - REAL_CONST(113605.77447127122/8.0), - REAL_CONST(113630.25385808491/8.0), - REAL_CONST(113654.73456336933/8.0), - REAL_CONST(113679.2165869825/8.0), - REAL_CONST(113703.69992878241/8.0), - REAL_CONST(113728.18458862718/8.0), - REAL_CONST(113752.67056637487/8.0), - REAL_CONST(113777.15786188368/8.0), - REAL_CONST(113801.64647501177/8.0), - REAL_CONST(113826.13640561736/8.0), - REAL_CONST(113850.62765355874/8.0), - REAL_CONST(113875.12021869418/8.0), - REAL_CONST(113899.61410088204/8.0), - REAL_CONST(113924.1092999807/8.0), - REAL_CONST(113948.60581584855/8.0), - REAL_CONST(113973.10364834407/8.0), - REAL_CONST(113997.60279732574/8.0), - REAL_CONST(114022.1032626521/8.0), - REAL_CONST(114046.60504418171/8.0), - REAL_CONST(114071.10814177318/8.0), - REAL_CONST(114095.61255528514/8.0), - REAL_CONST(114120.11828457628/8.0), - REAL_CONST(114144.62532950533/8.0), - REAL_CONST(114169.13368993104/8.0), - REAL_CONST(114193.6433657122/8.0), - REAL_CONST(114218.15435670764/8.0), - REAL_CONST(114242.66666277625/8.0), - REAL_CONST(114267.18028377694/8.0), - REAL_CONST(114291.69521956862/8.0), - REAL_CONST(114316.21147001031/8.0), - REAL_CONST(114340.72903496103/8.0), - REAL_CONST(114365.24791427983/8.0), - REAL_CONST(114389.7681078258/8.0), - REAL_CONST(114414.2896154581/8.0), - REAL_CONST(114438.81243703589/8.0), - REAL_CONST(114463.33657241837/8.0), - REAL_CONST(114487.8620214648/8.0), - REAL_CONST(114512.38878403447/8.0), - REAL_CONST(114536.91685998671/8.0), - REAL_CONST(114561.44624918087/8.0), - REAL_CONST(114585.97695147636/8.0), - REAL_CONST(114610.5089667326/8.0), - REAL_CONST(114635.04229480909/8.0), - REAL_CONST(114659.57693556532/8.0), - REAL_CONST(114684.11288886084/8.0), - REAL_CONST(114708.65015455526/8.0), - REAL_CONST(114733.18873250818/8.0), - REAL_CONST(114757.72862257928/8.0), - REAL_CONST(114782.26982462825/8.0), - REAL_CONST(114806.81233851484/8.0), - REAL_CONST(114831.35616409882/8.0), - REAL_CONST(114855.90130123998/8.0), - REAL_CONST(114880.44774979822/8.0), - REAL_CONST(114904.99550963337/8.0), - REAL_CONST(114929.5445806054/8.0), - REAL_CONST(114954.09496257425/8.0), - REAL_CONST(114978.64665539992/8.0), - REAL_CONST(115003.19965894247/8.0), - REAL_CONST(115027.75397306195/8.0), - REAL_CONST(115052.30959761847/8.0), - REAL_CONST(115076.86653247218/8.0), - REAL_CONST(115101.42477748329/8.0), - REAL_CONST(115125.984332512/8.0), - REAL_CONST(115150.54519741859/8.0), - REAL_CONST(115175.10737206334/8.0), - REAL_CONST(115199.67085630659/8.0), - REAL_CONST(115224.23565000873/8.0), - REAL_CONST(115248.80175303014/8.0), - REAL_CONST(115273.3691652313/8.0), - REAL_CONST(115297.93788647266/8.0), - REAL_CONST(115322.50791661476/8.0), - REAL_CONST(115347.07925551817/8.0), - REAL_CONST(115371.65190304347/8.0), - REAL_CONST(115396.22585905129/8.0), - REAL_CONST(115420.80112340231/8.0), - REAL_CONST(115445.37769595724/8.0), - REAL_CONST(115469.95557657682/8.0), - REAL_CONST(115494.53476512182/8.0), - REAL_CONST(115519.11526145306/8.0), - REAL_CONST(115543.69706543141/8.0), - REAL_CONST(115568.28017691776/8.0), - REAL_CONST(115592.86459577303/8.0), - REAL_CONST(115617.4503218582/8.0), - REAL_CONST(115642.03735503425/8.0), - REAL_CONST(115666.62569516223/8.0), - REAL_CONST(115691.21534210323/8.0), - REAL_CONST(115715.80629571836/8.0), - REAL_CONST(115740.39855586876/8.0), - REAL_CONST(115764.99212241563/8.0), - REAL_CONST(115789.58699522018/8.0), - REAL_CONST(115814.18317414368/8.0), - REAL_CONST(115838.78065904744/8.0), - REAL_CONST(115863.37944979276/8.0), - REAL_CONST(115887.97954624105/8.0), - REAL_CONST(115912.5809482537/8.0), - REAL_CONST(115937.18365569216/8.0), - REAL_CONST(115961.78766841792/8.0), - REAL_CONST(115986.39298629249/8.0), - REAL_CONST(116010.99960917742/8.0), - REAL_CONST(116035.60753693432/8.0), - REAL_CONST(116060.21676942479/8.0), - REAL_CONST(116084.82730651053/8.0), - REAL_CONST(116109.43914805322/8.0), - REAL_CONST(116134.0522939146/8.0), - REAL_CONST(116158.66674395646/8.0), - REAL_CONST(116183.2824980406/8.0), - REAL_CONST(116207.89955602887/8.0), - REAL_CONST(116232.51791778316/8.0), - REAL_CONST(116257.13758316539/8.0), - REAL_CONST(116281.75855203751/8.0), - REAL_CONST(116306.38082426153/8.0), - REAL_CONST(116331.00439969949/8.0), - REAL_CONST(116355.62927821343/8.0), - REAL_CONST(116380.25545966547/8.0), - REAL_CONST(116404.88294391775/8.0), - REAL_CONST(116429.51173083246/8.0), - REAL_CONST(116454.14182027178/8.0), - REAL_CONST(116478.77321209799/8.0), - REAL_CONST(116503.40590617337/8.0), - REAL_CONST(116528.03990236025/8.0), - REAL_CONST(116552.67520052097/8.0), - REAL_CONST(116577.31180051794/8.0), - REAL_CONST(116601.94970221359/8.0), - REAL_CONST(116626.5889054704/8.0), - REAL_CONST(116651.22941015086/8.0), - REAL_CONST(116675.87121611751/8.0), - REAL_CONST(116700.51432323294/8.0), - REAL_CONST(116725.15873135976/8.0), - REAL_CONST(116749.8044403606/8.0), - REAL_CONST(116774.45145009817/8.0), - REAL_CONST(116799.0997604352/8.0), - REAL_CONST(116823.74937123443/8.0), - REAL_CONST(116848.40028235866/8.0), - REAL_CONST(116873.05249367072/8.0), - REAL_CONST(116897.70600503348/8.0), - REAL_CONST(116922.36081630984/8.0), - REAL_CONST(116947.01692736275/8.0), - REAL_CONST(116971.67433805518/8.0), - REAL_CONST(116996.33304825013/8.0), - REAL_CONST(117020.99305781067/8.0), - REAL_CONST(117045.65436659988/8.0), - REAL_CONST(117070.31697448085/8.0), - REAL_CONST(117094.98088131678/8.0), - REAL_CONST(117119.64608697082/8.0), - REAL_CONST(117144.31259130624/8.0), - REAL_CONST(117168.98039418629/8.0), - REAL_CONST(117193.64949547425/8.0), - REAL_CONST(117218.31989503348/8.0), - REAL_CONST(117242.99159272734/8.0), - REAL_CONST(117267.66458841923/8.0), - REAL_CONST(117292.33888197262/8.0), - REAL_CONST(117317.01447325097/8.0), - REAL_CONST(117341.6913621178/8.0), - REAL_CONST(117366.36954843666/8.0), - REAL_CONST(117391.04903207115/8.0), - REAL_CONST(117415.72981288488/8.0), - REAL_CONST(117440.41189074152/8.0), - REAL_CONST(117465.09526550474/8.0), - REAL_CONST(117489.77993703831/8.0), - REAL_CONST(117514.46590520597/8.0), - REAL_CONST(117539.15316987153/8.0), - REAL_CONST(117563.84173089883/8.0), - REAL_CONST(117588.53158815173/8.0), - REAL_CONST(117613.22274149416/8.0), - REAL_CONST(117637.91519079007/8.0), - REAL_CONST(117662.60893590341/8.0), - REAL_CONST(117687.30397669821/8.0), - REAL_CONST(117712.00031303853/8.0), - REAL_CONST(117736.69794478847/8.0), - REAL_CONST(117761.39687181212/8.0), - REAL_CONST(117786.09709397367/8.0), - REAL_CONST(117810.7986111373/8.0), - REAL_CONST(117835.50142316725/8.0), - REAL_CONST(117860.20552992777/8.0), - REAL_CONST(117884.91093128319/8.0), - REAL_CONST(117909.6176270978/8.0), - REAL_CONST(117934.32561723603/8.0), - REAL_CONST(117959.03490156225/8.0), - REAL_CONST(117983.74547994092/8.0), - REAL_CONST(118008.45735223651/8.0), - REAL_CONST(118033.17051831353/8.0), - REAL_CONST(118057.88497803656/8.0), - REAL_CONST(118082.60073127014/8.0), - REAL_CONST(118107.31777787894/8.0), - REAL_CONST(118132.03611772758/8.0), - REAL_CONST(118156.75575068076/8.0), - REAL_CONST(118181.47667660323/8.0), - REAL_CONST(118206.19889535972/8.0), - REAL_CONST(118230.92240681504/8.0), - REAL_CONST(118255.64721083404/8.0), - REAL_CONST(118280.37330728157/8.0), - REAL_CONST(118305.10069602253/8.0), - REAL_CONST(118329.82937692189/8.0), - REAL_CONST(118354.55934984458/8.0), - REAL_CONST(118379.29061465565/8.0), - REAL_CONST(118404.02317122012/8.0), - REAL_CONST(118428.75701940308/8.0), - REAL_CONST(118453.49215906965/8.0), - REAL_CONST(118478.22859008498/8.0), - REAL_CONST(118502.96631231424/8.0), - REAL_CONST(118527.70532562268/8.0), - REAL_CONST(118552.44562987552/8.0), - REAL_CONST(118577.18722493808/8.0), - REAL_CONST(118601.93011067568/8.0), - REAL_CONST(118626.67428695368/8.0), - REAL_CONST(118651.41975363747/8.0), - REAL_CONST(118676.16651059251/8.0), - REAL_CONST(118700.91455768423/8.0), - REAL_CONST(118725.66389477813/8.0), - REAL_CONST(118750.41452173979/8.0), - REAL_CONST(118775.16643843475/8.0), - REAL_CONST(118799.91964472862/8.0), - REAL_CONST(118824.67414048707/8.0), - REAL_CONST(118849.42992557574/8.0), - REAL_CONST(118874.18699986035/8.0), - REAL_CONST(118898.94536320666/8.0), - REAL_CONST(118923.70501548045/8.0), - REAL_CONST(118948.46595654752/8.0), - REAL_CONST(118973.22818627374/8.0), - REAL_CONST(118997.99170452499/8.0), - REAL_CONST(119022.7565111672/8.0), - REAL_CONST(119047.52260606633/8.0), - REAL_CONST(119072.28998908834/8.0), - REAL_CONST(119097.0586600993/8.0), - REAL_CONST(119121.82861896523/8.0), - REAL_CONST(119146.59986555226/8.0), - REAL_CONST(119171.3723997265/8.0), - REAL_CONST(119196.14622135412/8.0), - REAL_CONST(119220.92133030134/8.0), - REAL_CONST(119245.69772643436/8.0), - REAL_CONST(119270.47540961947/8.0), - REAL_CONST(119295.25437972297/8.0), - REAL_CONST(119320.03463661121/8.0), - REAL_CONST(119344.81618015055/8.0), - REAL_CONST(119369.5990102074/8.0), - REAL_CONST(119394.38312664822/8.0), - REAL_CONST(119419.16852933947/8.0), - REAL_CONST(119443.95521814766/8.0), - REAL_CONST(119468.74319293935/8.0), - REAL_CONST(119493.53245358112/8.0), - REAL_CONST(119518.32299993958/8.0), - REAL_CONST(119543.11483188139/8.0), - REAL_CONST(119567.90794927324/8.0), - REAL_CONST(119592.70235198183/8.0), - REAL_CONST(119617.49803987393/8.0), - REAL_CONST(119642.29501281632/8.0), - REAL_CONST(119667.09327067583/8.0), - REAL_CONST(119691.89281331931/8.0), - REAL_CONST(119716.69364061367/8.0), - REAL_CONST(119741.49575242582/8.0), - REAL_CONST(119766.29914862274/8.0), - REAL_CONST(119791.10382907141/8.0), - REAL_CONST(119815.90979363887/8.0), - REAL_CONST(119840.71704219218/8.0), - REAL_CONST(119865.52557459843/8.0), - REAL_CONST(119890.33539072477/8.0), - REAL_CONST(119915.14649043836/8.0), - REAL_CONST(119939.95887360642/8.0), - REAL_CONST(119964.77254009615/8.0), - REAL_CONST(119989.58748977486/8.0), - REAL_CONST(120014.40372250983/8.0), - REAL_CONST(120039.22123816841/8.0), - REAL_CONST(120064.04003661797/8.0), - REAL_CONST(120088.86011772591/8.0), - REAL_CONST(120113.6814813597/8.0), - REAL_CONST(120138.5041273868/8.0), - REAL_CONST(120163.3280556747/8.0), - REAL_CONST(120188.15326609099/8.0), - REAL_CONST(120212.97975850321/8.0), - REAL_CONST(120237.807532779/8.0), - REAL_CONST(120262.63658878599/8.0), - REAL_CONST(120287.46692639188/8.0), - REAL_CONST(120312.29854546436/8.0), - REAL_CONST(120337.13144587121/8.0), - REAL_CONST(120361.9656274802/8.0), - REAL_CONST(120386.80109015915/8.0), - REAL_CONST(120411.63783377589/8.0), - REAL_CONST(120436.47585819835/8.0), - REAL_CONST(120461.31516329442/8.0), - REAL_CONST(120486.15574893207/8.0), - REAL_CONST(120510.99761497928/8.0), - REAL_CONST(120535.84076130406/8.0), - REAL_CONST(120560.68518777451/8.0), - REAL_CONST(120585.53089425867/8.0), - REAL_CONST(120610.3778806247/8.0), - REAL_CONST(120635.22614674074/8.0), - REAL_CONST(120660.07569247499/8.0), - REAL_CONST(120684.92651769568/8.0), - REAL_CONST(120709.77862227106/8.0), - REAL_CONST(120734.63200606944/8.0), - REAL_CONST(120759.48666895913/8.0), - REAL_CONST(120784.3426108085/8.0), - REAL_CONST(120809.19983148595/8.0), - REAL_CONST(120834.05833085992/8.0), - REAL_CONST(120858.91810879884/8.0), - REAL_CONST(120883.77916517125/8.0), - REAL_CONST(120908.64149984565/8.0), - REAL_CONST(120933.5051126906/8.0), - REAL_CONST(120958.37000357473/8.0), - REAL_CONST(120983.23617236665/8.0), - REAL_CONST(121008.10361893504/8.0), - REAL_CONST(121032.97234314861/8.0), - REAL_CONST(121057.84234487606/8.0), - REAL_CONST(121082.71362398617/8.0), - REAL_CONST(121107.58618034775/8.0), - REAL_CONST(121132.46001382964/8.0), - REAL_CONST(121157.33512430069/8.0), - REAL_CONST(121182.21151162982/8.0), - REAL_CONST(121207.08917568595/8.0), - REAL_CONST(121231.96811633807/8.0), - REAL_CONST(121256.84833345517/8.0), - REAL_CONST(121281.72982690629/8.0), - REAL_CONST(121306.61259656049/8.0), - REAL_CONST(121331.49664228689/8.0), - REAL_CONST(121356.38196395461/8.0), - REAL_CONST(121381.26856143285/8.0), - REAL_CONST(121406.15643459078/8.0), - REAL_CONST(121431.04558329767/8.0), - REAL_CONST(121455.93600742276/8.0), - REAL_CONST(121480.82770683538/8.0), - REAL_CONST(121505.72068140487/8.0), - REAL_CONST(121530.61493100057/8.0), - REAL_CONST(121555.51045549192/8.0), - REAL_CONST(121580.40725474835/8.0), - REAL_CONST(121605.30532863933/8.0), - REAL_CONST(121630.20467703436/8.0), - REAL_CONST(121655.10529980299/8.0), - REAL_CONST(121680.00719681478/8.0), - REAL_CONST(121704.91036793934/8.0), - REAL_CONST(121729.81481304632/8.0), - REAL_CONST(121754.72053200539/8.0), - REAL_CONST(121779.62752468624/8.0), - REAL_CONST(121804.53579095862/8.0), - REAL_CONST(121829.44533069231/8.0), - REAL_CONST(121854.3561437571/8.0), - REAL_CONST(121879.26823002285/8.0), - REAL_CONST(121904.1815893594/8.0), - REAL_CONST(121929.09622163669/8.0), - REAL_CONST(121954.01212672464/8.0), - REAL_CONST(121978.92930449323/8.0), - REAL_CONST(122003.84775481246/8.0), - REAL_CONST(122028.76747755238/8.0), - REAL_CONST(122053.68847258303/8.0), - REAL_CONST(122078.61073977455/8.0), - REAL_CONST(122103.53427899707/8.0), - REAL_CONST(122128.45909012076/8.0), - REAL_CONST(122153.38517301581/8.0), - REAL_CONST(122178.31252755247/8.0), - REAL_CONST(122203.24115360099/8.0), - REAL_CONST(122228.17105103172/8.0), - REAL_CONST(122253.10221971494/8.0), - REAL_CONST(122278.03465952107/8.0), - REAL_CONST(122302.96837032049/8.0), - REAL_CONST(122327.90335198362/8.0), - REAL_CONST(122352.83960438096/8.0), - REAL_CONST(122377.777127383/8.0), - REAL_CONST(122402.71592086025/8.0), - REAL_CONST(122427.65598468333/8.0), - REAL_CONST(122452.59731872278/8.0), - REAL_CONST(122477.53992284928/8.0), - REAL_CONST(122502.48379693348/8.0), - REAL_CONST(122527.42894084606/8.0), - REAL_CONST(122552.37535445779/8.0), - REAL_CONST(122577.32303763942/8.0), - REAL_CONST(122602.27199026172/8.0), - REAL_CONST(122627.22221219557/8.0), - REAL_CONST(122652.17370331181/8.0), - REAL_CONST(122677.12646348133/8.0), - REAL_CONST(122702.08049257506/8.0), - REAL_CONST(122727.03579046397/8.0), - REAL_CONST(122751.99235701906/8.0), - REAL_CONST(122776.95019211136/8.0), - REAL_CONST(122801.9092956119/8.0), - REAL_CONST(122826.8696673918/8.0), - REAL_CONST(122851.83130732219/8.0), - REAL_CONST(122876.79421527422/8.0), - REAL_CONST(122901.75839111909/8.0), - REAL_CONST(122926.72383472799/8.0), - REAL_CONST(122951.69054597223/8.0), - REAL_CONST(122976.65852472307/8.0), - REAL_CONST(123001.62777085182/8.0), - REAL_CONST(123026.59828422987/8.0), - REAL_CONST(123051.57006472857/8.0), - REAL_CONST(123076.54311221937/8.0), - REAL_CONST(123101.5174265737/8.0), - REAL_CONST(123126.49300766307/8.0), - REAL_CONST(123151.46985535898/8.0), - REAL_CONST(123176.44796953299/8.0), - REAL_CONST(123201.42735005668/8.0), - REAL_CONST(123226.40799680166/8.0), - REAL_CONST(123251.38990963959/8.0), - REAL_CONST(123276.37308844214/8.0), - REAL_CONST(123301.35753308103/8.0), - REAL_CONST(123326.343243428/8.0), - REAL_CONST(123351.33021935483/8.0), - REAL_CONST(123376.31846073334/8.0), - REAL_CONST(123401.30796743535/8.0), - REAL_CONST(123426.29873933276/8.0), - REAL_CONST(123451.29077629748/8.0), - REAL_CONST(123476.28407820144/8.0), - REAL_CONST(123501.2786449166/8.0), - REAL_CONST(123526.27447631498/8.0), - REAL_CONST(123551.27157226863/8.0), - REAL_CONST(123576.26993264959/8.0), - REAL_CONST(123601.26955732999/8.0), - REAL_CONST(123626.27044618195/8.0), - REAL_CONST(123651.27259907764/8.0), - REAL_CONST(123676.27601588926/8.0), - REAL_CONST(123701.28069648903/8.0), - REAL_CONST(123726.28664074924/8.0), - REAL_CONST(123751.29384854218/8.0), - REAL_CONST(123776.30231974016/8.0), - REAL_CONST(123801.31205421555/8.0), - REAL_CONST(123826.32305184075/8.0), - REAL_CONST(123851.33531248817/8.0), - REAL_CONST(123876.34883603029/8.0), - REAL_CONST(123901.36362233957/8.0), - REAL_CONST(123926.37967128855/8.0), - REAL_CONST(123951.39698274979/8.0), - REAL_CONST(123976.41555659588/8.0), - REAL_CONST(124001.43539269941/8.0), - REAL_CONST(124026.45649093305/8.0), - REAL_CONST(124051.47885116948/8.0), - REAL_CONST(124076.50247328142/8.0), - REAL_CONST(124101.5273571416/8.0), - REAL_CONST(124126.55350262282/8.0), - REAL_CONST(124151.58090959788/8.0), - REAL_CONST(124176.60957793961/8.0), - REAL_CONST(124201.63950752091/8.0), - REAL_CONST(124226.67069821467/8.0), - REAL_CONST(124251.70314989384/8.0), - REAL_CONST(124276.73686243138/8.0), - REAL_CONST(124301.7718357003/8.0), - REAL_CONST(124326.80806957364/8.0), - REAL_CONST(124351.84556392446/8.0), - REAL_CONST(124376.88431862585/8.0), - REAL_CONST(124401.92433355095/8.0), - REAL_CONST(124426.96560857294/8.0), - REAL_CONST(124452.00814356498/8.0), - REAL_CONST(124477.05193840031/8.0), - REAL_CONST(124502.0969929522/8.0), - REAL_CONST(124527.14330709392/8.0), - REAL_CONST(124552.19088069882/8.0), - REAL_CONST(124577.23971364023/8.0), - REAL_CONST(124602.28980579154/8.0), - REAL_CONST(124627.34115702618/8.0), - REAL_CONST(124652.3937672176/8.0), - REAL_CONST(124677.44763623926/8.0), - REAL_CONST(124702.50276396469/8.0), - REAL_CONST(124727.55915026742/8.0), - REAL_CONST(124752.61679502104/8.0), - REAL_CONST(124777.67569809916/8.0), - REAL_CONST(124802.73585937542/8.0), - REAL_CONST(124827.79727872348/8.0), - REAL_CONST(124852.85995601704/8.0), - REAL_CONST(124877.92389112986/8.0), - REAL_CONST(124902.98908393568/8.0), - REAL_CONST(124928.05553430831/8.0), - REAL_CONST(124953.1232421216/8.0), - REAL_CONST(124978.19220724938/8.0), - REAL_CONST(125003.26242956554/8.0), - REAL_CONST(125028.33390894404/8.0), - REAL_CONST(125053.40664525882/8.0), - REAL_CONST(125078.48063838384/8.0), - REAL_CONST(125103.55588819318/8.0), - REAL_CONST(125128.63239456083/8.0), - REAL_CONST(125153.71015736091/8.0), - REAL_CONST(125178.78917646752/8.0), - REAL_CONST(125203.86945175481/8.0), - REAL_CONST(125228.95098309696/8.0), - REAL_CONST(125254.03377036817/8.0), - REAL_CONST(125279.1178134427/8.0), - REAL_CONST(125304.20311219479/8.0), - REAL_CONST(125329.28966649878/8.0), - REAL_CONST(125354.37747622898/8.0), - REAL_CONST(125379.46654125977/8.0), - REAL_CONST(125404.55686146552/8.0), - REAL_CONST(125429.6484367207/8.0), - REAL_CONST(125454.74126689974/8.0), - REAL_CONST(125479.83535187715/8.0), - REAL_CONST(125504.93069152744/8.0), - REAL_CONST(125530.02728572517/8.0), - REAL_CONST(125555.12513434493/8.0), - REAL_CONST(125580.22423726133/8.0), - REAL_CONST(125605.32459434902/8.0), - REAL_CONST(125630.4262054827/8.0), - REAL_CONST(125655.52907053704/8.0), - REAL_CONST(125680.63318938682/8.0), - REAL_CONST(125705.73856190679/8.0), - REAL_CONST(125730.84518797178/8.0), - REAL_CONST(125755.9530674566/8.0), - REAL_CONST(125781.06220023613/8.0), - REAL_CONST(125806.17258618528/8.0), - REAL_CONST(125831.28422517896/8.0), - REAL_CONST(125856.39711709213/8.0), - REAL_CONST(125881.51126179981/8.0), - REAL_CONST(125906.62665917698/8.0), - REAL_CONST(125931.74330909875/8.0), - REAL_CONST(125956.86121144016/8.0), - REAL_CONST(125981.98036607634/8.0), - REAL_CONST(126007.10077288245/8.0), - REAL_CONST(126032.22243173365/8.0), - REAL_CONST(126057.34534250517/8.0), - REAL_CONST(126082.46950507225/8.0), - REAL_CONST(126107.59491931014/8.0), - REAL_CONST(126132.72158509417/8.0), - REAL_CONST(126157.84950229966/8.0), - REAL_CONST(126182.97867080198/8.0), - REAL_CONST(126208.10909047653/8.0), - REAL_CONST(126233.24076119871/8.0), - REAL_CONST(126258.37368284403/8.0), - REAL_CONST(126283.50785528794/8.0), - REAL_CONST(126308.64327840599/8.0), - REAL_CONST(126333.77995207369/8.0), - REAL_CONST(126358.91787616667/8.0), - REAL_CONST(126384.0570505605/8.0), - REAL_CONST(126409.19747513086/8.0), - REAL_CONST(126434.3391497534/8.0), - REAL_CONST(126459.48207430386/8.0), - REAL_CONST(126484.62624865794/8.0), - REAL_CONST(126509.77167269142/8.0), - REAL_CONST(126534.9183462801/8.0), - REAL_CONST(126560.06626929982/8.0), - REAL_CONST(126585.21544162642/8.0), - REAL_CONST(126610.36586313581/8.0), - REAL_CONST(126635.51753370393/8.0), - REAL_CONST(126660.67045320668/8.0), - REAL_CONST(126685.82462152008/8.0), - REAL_CONST(126710.98003852014/8.0), - REAL_CONST(126736.13670408291/8.0), - REAL_CONST(126761.29461808444/8.0), - REAL_CONST(126786.45378040087/8.0), - REAL_CONST(126811.61419090834/8.0), - REAL_CONST(126836.77584948298/8.0), - REAL_CONST(126861.93875600102/8.0), - REAL_CONST(126887.10291033868/8.0), - REAL_CONST(126912.26831237224/8.0), - REAL_CONST(126937.43496197795/8.0), - REAL_CONST(126962.60285903217/8.0), - REAL_CONST(126987.77200341123/8.0), - REAL_CONST(127012.94239499152/8.0), - REAL_CONST(127038.11403364947/8.0), - REAL_CONST(127063.2869192615/8.0), - REAL_CONST(127088.46105170409/8.0), - REAL_CONST(127113.63643085376/8.0), - REAL_CONST(127138.81305658702/8.0), - REAL_CONST(127163.99092878048/8.0), - REAL_CONST(127189.17004731069/8.0), - REAL_CONST(127214.35041205429/8.0), - REAL_CONST(127239.53202288797/8.0), - REAL_CONST(127264.71487968838/8.0), - REAL_CONST(127289.89898233226/8.0), - REAL_CONST(127315.08433069635/8.0), - REAL_CONST(127340.27092465744/8.0), - REAL_CONST(127365.45876409234/8.0), - REAL_CONST(127390.64784887788/8.0), - REAL_CONST(127415.83817889093/8.0), - REAL_CONST(127441.02975400841/8.0), - REAL_CONST(127466.22257410725/8.0), - REAL_CONST(127491.41663906439/8.0), - REAL_CONST(127516.61194875685/8.0), - REAL_CONST(127541.80850306165/8.0), - REAL_CONST(127567.00630185583/8.0), - REAL_CONST(127592.20534501647/8.0), - REAL_CONST(127617.4056324207/8.0), - REAL_CONST(127642.60716394568/8.0), - REAL_CONST(127667.80993946856/8.0), - REAL_CONST(127693.01395886653/8.0), - REAL_CONST(127718.21922201688/8.0), - REAL_CONST(127743.42572879682/8.0), - REAL_CONST(127768.63347908368/8.0), - REAL_CONST(127793.84247275478/8.0), - REAL_CONST(127819.05270968749/8.0), - REAL_CONST(127844.26418975917/8.0), - REAL_CONST(127869.47691284724/8.0), - REAL_CONST(127894.69087882918/8.0), - REAL_CONST(127919.90608758242/8.0), - REAL_CONST(127945.12253898452/8.0), - REAL_CONST(127970.34023291297/8.0), - REAL_CONST(127995.55916924537/8.0), - REAL_CONST(128020.77934785932/8.0), - REAL_CONST(128046.00076863244/8.0), - REAL_CONST(128071.22343144237/8.0), - REAL_CONST(128096.44733616684/8.0), - REAL_CONST(128121.67248268353/8.0), - REAL_CONST(128146.89887087021/8.0), - REAL_CONST(128172.12650060465/8.0), - REAL_CONST(128197.35537176467/8.0), - REAL_CONST(128222.5854842281/8.0), - REAL_CONST(128247.81683787282/8.0), - REAL_CONST(128273.04943257671/8.0), - REAL_CONST(128298.28326821771/8.0), - REAL_CONST(128323.51834467379/8.0), - REAL_CONST(128348.75466182294/8.0), - REAL_CONST(128373.99221954317/8.0), - REAL_CONST(128399.23101771252/8.0), - REAL_CONST(128424.47105620909/8.0), - REAL_CONST(128449.71233491098/8.0), - REAL_CONST(128474.95485369631/8.0), - REAL_CONST(128500.19861244329/8.0), - REAL_CONST(128525.44361103009/8.0), - REAL_CONST(128550.68984933494/8.0), - REAL_CONST(128575.93732723613/8.0), - REAL_CONST(128601.18604461191/8.0), - REAL_CONST(128626.43600134061/8.0), - REAL_CONST(128651.68719730059/8.0), - REAL_CONST(128676.93963237021/8.0), - REAL_CONST(128702.1933064279/8.0), - REAL_CONST(128727.44821935208/8.0), - REAL_CONST(128752.70437102125/8.0), - REAL_CONST(128777.96176131385/8.0), - REAL_CONST(128803.22039010846/8.0), - REAL_CONST(128828.48025728362/8.0), - REAL_CONST(128853.74136271792/8.0), - REAL_CONST(128879.00370628996/8.0), - REAL_CONST(128904.26728787841/8.0), - REAL_CONST(128929.53210736193/8.0), - REAL_CONST(128954.79816461923/8.0), - REAL_CONST(128980.06545952905/8.0), - REAL_CONST(129005.33399197015/8.0), - REAL_CONST(129030.60376182134/8.0), - REAL_CONST(129055.87476896142/8.0), - REAL_CONST(129081.14701326926/8.0), - REAL_CONST(129106.42049462376/8.0), - REAL_CONST(129131.6952129038/8.0), - REAL_CONST(129156.97116798835/8.0), - REAL_CONST(129182.24835975636/8.0), - REAL_CONST(129207.52678808685/8.0), - REAL_CONST(129232.80645285884/8.0), - REAL_CONST(129258.08735395141/8.0), - REAL_CONST(129283.36949124365/8.0), - REAL_CONST(129308.65286461466/8.0), - REAL_CONST(129333.9374739436/8.0), - REAL_CONST(129359.22331910966/8.0), - REAL_CONST(129384.51039999202/8.0), - REAL_CONST(129409.79871646997/8.0), - REAL_CONST(129435.08826842274/8.0), - REAL_CONST(129460.37905572963/8.0), - REAL_CONST(129485.67107826998/8.0), - REAL_CONST(129510.96433592314/8.0), - REAL_CONST(129536.25882856851/8.0), - REAL_CONST(129561.55455608548/8.0), - REAL_CONST(129586.85151835352/8.0), - REAL_CONST(129612.14971525209/8.0), - REAL_CONST(129637.4491466607/8.0), - REAL_CONST(129662.74981245887/8.0), - REAL_CONST(129688.0517125262/8.0), - REAL_CONST(129713.35484674224/8.0), - REAL_CONST(129738.65921498663/8.0), - REAL_CONST(129763.96481713903/8.0), - REAL_CONST(129789.27165307909/8.0), - REAL_CONST(129814.57972268655/8.0), - REAL_CONST(129839.88902584116/8.0), - REAL_CONST(129865.19956242264/8.0), - REAL_CONST(129890.51133231082/8.0), - REAL_CONST(129915.82433538554/8.0), - REAL_CONST(129941.13857152662/8.0), - REAL_CONST(129966.45404061397/8.0), - REAL_CONST(129991.7707425275/8.0), - REAL_CONST(130017.08867714716/8.0), - REAL_CONST(130042.4078443529/8.0), - REAL_CONST(130067.72824402474/8.0), - REAL_CONST(130093.04987604271/8.0), - REAL_CONST(130118.37274028687/8.0), - REAL_CONST(130143.69683663732/8.0), - REAL_CONST(130169.02216497416/8.0), - REAL_CONST(130194.34872517755/8.0), - REAL_CONST(130219.67651712766/8.0), - REAL_CONST(130245.0055407047/8.0), - REAL_CONST(130270.33579578891/8.0), - REAL_CONST(130295.66728226055/8.0), - REAL_CONST(130320.99999999991/8.0), - REAL_CONST(130346.33394888733/8.0), - REAL_CONST(130371.66912880314/8.0), - REAL_CONST(130397.00553962773/8.0), - REAL_CONST(130422.34318124152/8.0), - REAL_CONST(130447.68205352494/8.0), - REAL_CONST(130473.02215635845/8.0), - REAL_CONST(130498.36348962256/8.0), - REAL_CONST(130523.70605319779/8.0), - REAL_CONST(130549.0498469647/8.0), - REAL_CONST(130574.39487080388/8.0), - REAL_CONST(130599.74112459592/8.0), - REAL_CONST(130625.08860822149/8.0), - REAL_CONST(130650.43732156123/8.0), - REAL_CONST(130675.78726449587/8.0), - REAL_CONST(130701.13843690613/8.0), - REAL_CONST(130726.49083867275/8.0), - REAL_CONST(130751.84446967654/8.0), - REAL_CONST(130777.19932979831/8.0), - REAL_CONST(130802.5554189189/8.0), - REAL_CONST(130827.91273691918/8.0), - REAL_CONST(130853.27128368006/8.0), - REAL_CONST(130878.63105908247/8.0), - REAL_CONST(130903.99206300738/8.0), - REAL_CONST(130929.35429533575/8.0), - REAL_CONST(130954.71775594862/8.0), - REAL_CONST(130980.08244472703/8.0), - REAL_CONST(131005.44836155206/8.0), - REAL_CONST(131030.81550630482/8.0), - REAL_CONST(131056.18387886642/8.0), - REAL_CONST(131081.55347911804/8.0), - REAL_CONST(131106.92430694087/8.0), - REAL_CONST(131132.29636221612/8.0), - REAL_CONST(131157.66964482504/8.0), - REAL_CONST(131183.0441546489/8.0), - REAL_CONST(131208.41989156904/8.0), - REAL_CONST(131233.79685546676/8.0), - REAL_CONST(131259.17504622342/8.0), - REAL_CONST(131284.55446372041/8.0), - REAL_CONST(131309.93510783918/8.0), - REAL_CONST(131335.31697846117/8.0), - REAL_CONST(131360.70007546784/8.0), - REAL_CONST(131386.0843987407/8.0), - REAL_CONST(131411.46994816128/8.0), - REAL_CONST(131436.85672361116/8.0), - REAL_CONST(131462.24472497194/8.0), - REAL_CONST(131487.63395212521/8.0), - REAL_CONST(131513.02440495262/8.0), - REAL_CONST(131538.41608333588/8.0), - REAL_CONST(131563.80898715663/8.0), - REAL_CONST(131589.2031162967/8.0), - REAL_CONST(131614.59847063778/8.0), - REAL_CONST(131639.9950500617/8.0), - REAL_CONST(131665.39285445024/8.0), - REAL_CONST(131690.79188368531/8.0), - REAL_CONST(131716.19213764873/8.0), - REAL_CONST(131741.59361622241/8.0), - REAL_CONST(131766.99631928833/8.0), - REAL_CONST(131792.40024672839/8.0), - REAL_CONST(131817.80539842462/8.0), - REAL_CONST(131843.21177425905/8.0), - REAL_CONST(131868.61937411371/8.0), - REAL_CONST(131894.02819787065/8.0), - REAL_CONST(131919.43824541202/8.0), - REAL_CONST(131944.84951661993/8.0), - REAL_CONST(131970.26201137656/8.0), - REAL_CONST(131995.67572956407/8.0), - REAL_CONST(132021.09067106468/8.0), - REAL_CONST(132046.50683576067/8.0), - REAL_CONST(132071.9242235343/8.0), - REAL_CONST(132097.34283426782/8.0), - REAL_CONST(132122.76266784366/8.0), - REAL_CONST(132148.1837241441/8.0), - REAL_CONST(132173.60600305157/8.0), - REAL_CONST(132199.02950444847/8.0), - REAL_CONST(132224.45422821722/8.0), - REAL_CONST(132249.88017424036/8.0), - REAL_CONST(132275.30734240031/8.0), - REAL_CONST(132300.73573257966/8.0), - REAL_CONST(132326.16534466096/8.0), - REAL_CONST(132351.59617852676/8.0), - REAL_CONST(132377.02823405969/8.0), - REAL_CONST(132402.46151114244/8.0), - REAL_CONST(132427.89600965759/8.0), - REAL_CONST(132453.33172948789/8.0), - REAL_CONST(132478.76867051609/8.0), - REAL_CONST(132504.20683262491/8.0), - REAL_CONST(132529.64621569714/8.0), - REAL_CONST(132555.08681961559/8.0), - REAL_CONST(132580.5286442631/8.0), - REAL_CONST(132605.97168952253/8.0), - REAL_CONST(132631.41595527678/8.0), - REAL_CONST(132656.86144140881/8.0), - REAL_CONST(132682.30814780149/8.0), - REAL_CONST(132707.75607433787/8.0), - REAL_CONST(132733.20522090094/8.0), - REAL_CONST(132758.65558737374/8.0), - REAL_CONST(132784.10717363929/8.0), - REAL_CONST(132809.55997958075/8.0), - REAL_CONST(132835.01400508118/8.0), - REAL_CONST(132860.46925002377/8.0), - REAL_CONST(132885.92571429166/8.0), - REAL_CONST(132911.38339776811/8.0), - REAL_CONST(132936.84230033628/8.0), - REAL_CONST(132962.30242187946/8.0), - REAL_CONST(132987.76376228096/8.0), - REAL_CONST(133013.22632142407/8.0), - REAL_CONST(133038.69009919214/8.0), - REAL_CONST(133064.15509546854/8.0), - REAL_CONST(133089.62131013666/8.0), - REAL_CONST(133115.08874307995/8.0), - REAL_CONST(133140.55739418184/8.0), - REAL_CONST(133166.02726332581/8.0), - REAL_CONST(133191.49835039541/8.0), - REAL_CONST(133216.97065527414/8.0), - REAL_CONST(133242.44417784561/8.0), - REAL_CONST(133267.91891799335/8.0), - REAL_CONST(133293.39487560102/8.0), - REAL_CONST(133318.87205055228/8.0), - REAL_CONST(133344.35044273079/8.0), - REAL_CONST(133369.83005202023/8.0), - REAL_CONST(133395.31087830439/8.0), - REAL_CONST(133420.79292146701/8.0), - REAL_CONST(133446.27618139185/8.0), - REAL_CONST(133471.76065796276/8.0), - REAL_CONST(133497.24635106357/8.0), - REAL_CONST(133522.73326057816/8.0), - REAL_CONST(133548.22138639039/8.0), - REAL_CONST(133573.71072838426/8.0), - REAL_CONST(133599.20128644365/8.0), - REAL_CONST(133624.69306045261/8.0), - REAL_CONST(133650.1860502951/8.0), - REAL_CONST(133675.68025585517/8.0), - REAL_CONST(133701.1756770169/8.0), - REAL_CONST(133726.67231366437/8.0), - REAL_CONST(133752.17016568172/8.0), - REAL_CONST(133777.66923295305/8.0), - REAL_CONST(133803.16951536259/8.0), - REAL_CONST(133828.67101279454/8.0), - REAL_CONST(133854.17372513309/8.0), - REAL_CONST(133879.67765226253/8.0), - REAL_CONST(133905.18279406714/8.0), - REAL_CONST(133930.68915043125/8.0), - REAL_CONST(133956.19672123916/8.0), - REAL_CONST(133981.70550637526/8.0), - REAL_CONST(134007.21550572399/8.0), - REAL_CONST(134032.7267191697/8.0), - REAL_CONST(134058.23914659687/8.0), - REAL_CONST(134083.75278789/8.0), - REAL_CONST(134109.26764293358/8.0), - REAL_CONST(134134.78371161217/8.0), - REAL_CONST(134160.30099381026/8.0), - REAL_CONST(134185.8194894125/8.0), - REAL_CONST(134211.33919830353/8.0), - REAL_CONST(134236.8601203679/8.0), - REAL_CONST(134262.38225549037/8.0), - REAL_CONST(134287.90560355558/8.0), - REAL_CONST(134313.43016444831/8.0), - REAL_CONST(134338.95593805326/8.0), - REAL_CONST(134364.48292425525/8.0), - REAL_CONST(134390.01112293909/8.0), - REAL_CONST(134415.54053398955/8.0), - REAL_CONST(134441.07115729159/8.0), - REAL_CONST(134466.60299273001/8.0), - REAL_CONST(134492.1360401898/8.0), - REAL_CONST(134517.67029955584/8.0), - REAL_CONST(134543.20577071316/8.0), - REAL_CONST(134568.74245354676/8.0), - REAL_CONST(134594.28034794159/8.0), - REAL_CONST(134619.81945378278/8.0), - REAL_CONST(134645.35977095537/8.0), - REAL_CONST(134670.90129934452/8.0), - REAL_CONST(134696.4440388353/8.0), - REAL_CONST(134721.98798931291/8.0), - REAL_CONST(134747.53315066252/8.0), - REAL_CONST(134773.07952276937/8.0), - REAL_CONST(134798.62710551871/8.0), - REAL_CONST(134824.17589879577/8.0), - REAL_CONST(134849.72590248589/8.0), - REAL_CONST(134875.27711647438/8.0), - REAL_CONST(134900.82954064661/8.0), - REAL_CONST(134926.38317488792/8.0), - REAL_CONST(134951.93801908373/8.0), - REAL_CONST(134977.49407311951/8.0), - REAL_CONST(135003.05133688069/8.0), - REAL_CONST(135028.60981025276/8.0), - REAL_CONST(135054.16949312127/8.0), - REAL_CONST(135079.73038537172/8.0), - REAL_CONST(135105.29248688967/8.0), - REAL_CONST(135130.85579756077/8.0), - REAL_CONST(135156.42031727062/8.0), - REAL_CONST(135181.98604590484/8.0), - REAL_CONST(135207.55298334916/8.0), - REAL_CONST(135233.12112948924/8.0), - REAL_CONST(135258.69048421088/8.0), - REAL_CONST(135284.26104739975/8.0), - REAL_CONST(135309.83281894168/8.0), - REAL_CONST(135335.4057987225/8.0), - REAL_CONST(135360.97998662802/8.0), - REAL_CONST(135386.55538254412/8.0), - REAL_CONST(135412.13198635669/8.0), - REAL_CONST(135437.70979795168/8.0), - REAL_CONST(135463.28881721498/8.0), - REAL_CONST(135488.86904403262/8.0), - REAL_CONST(135514.45047829056/8.0), - REAL_CONST(135540.03311987486/8.0), - REAL_CONST(135565.61696867159/8.0), - REAL_CONST(135591.20202456677/8.0), - REAL_CONST(135616.78828744654/8.0), - REAL_CONST(135642.37575719706/8.0), - REAL_CONST(135667.96443370447/8.0), - REAL_CONST(135693.55431685498/8.0), - REAL_CONST(135719.14540653475/8.0), - REAL_CONST(135744.73770263011/8.0), - REAL_CONST(135770.33120502727/8.0), - REAL_CONST(135795.92591361253/8.0), - REAL_CONST(135821.52182827223/8.0), - REAL_CONST(135847.11894889272/8.0), - REAL_CONST(135872.7172753604/8.0), - REAL_CONST(135898.31680756161/8.0), - REAL_CONST(135923.91754538284/8.0), - REAL_CONST(135949.51948871053/8.0), - REAL_CONST(135975.12263743114/8.0), - REAL_CONST(136000.72699143123/8.0), - REAL_CONST(136026.33255059729/8.0), - REAL_CONST(136051.93931481591/8.0), - REAL_CONST(136077.54728397369/8.0), - REAL_CONST(136103.15645795723/8.0), - REAL_CONST(136128.76683665317/8.0), - REAL_CONST(136154.37841994822/8.0), - REAL_CONST(136179.99120772901/8.0), - REAL_CONST(136205.60519988232/8.0), - REAL_CONST(136231.2203962949/8.0), - REAL_CONST(136256.83679685349/8.0), - REAL_CONST(136282.45440144493/8.0), - REAL_CONST(136308.07320995603/8.0), - REAL_CONST(136333.69322227367/8.0), - REAL_CONST(136359.31443828469/8.0), - REAL_CONST(136384.93685787608/8.0), - REAL_CONST(136410.56048093468/8.0), - REAL_CONST(136436.18530734754/8.0), - REAL_CONST(136461.81133700156/8.0), - REAL_CONST(136487.43856978384/8.0), - REAL_CONST(136513.06700558143/8.0), - REAL_CONST(136538.6966442813/8.0), - REAL_CONST(136564.32748577066/8.0), - REAL_CONST(136589.95952993655/8.0), - REAL_CONST(136615.59277666616/8.0), - REAL_CONST(136641.22722584667/8.0), - REAL_CONST(136666.86287736523/8.0), - REAL_CONST(136692.49973110916/8.0), - REAL_CONST(136718.13778696564/8.0), - REAL_CONST(136743.77704482197/8.0), - REAL_CONST(136769.41750456547/8.0), - REAL_CONST(136795.05916608346/8.0), - REAL_CONST(136820.70202926331/8.0), - REAL_CONST(136846.34609399244/8.0), - REAL_CONST(136871.99136015819/8.0), - REAL_CONST(136897.63782764805/8.0), - REAL_CONST(136923.28549634948/8.0), - REAL_CONST(136948.93436614997/8.0), - REAL_CONST(136974.58443693706/8.0), - REAL_CONST(137000.23570859825/8.0), - REAL_CONST(137025.88818102115/8.0), - REAL_CONST(137051.54185409332/8.0), - REAL_CONST(137077.19672770242/8.0), - REAL_CONST(137102.85280173609/8.0), - REAL_CONST(137128.51007608202/8.0), - REAL_CONST(137154.16855062786/8.0), - REAL_CONST(137179.82822526142/8.0), - REAL_CONST(137205.48909987041/8.0), - REAL_CONST(137231.15117434258/8.0), - REAL_CONST(137256.8144485658/8.0), - REAL_CONST(137282.47892242789/8.0), - REAL_CONST(137308.14459581667/8.0), - REAL_CONST(137333.81146862009/8.0), - REAL_CONST(137359.47954072602/8.0), - REAL_CONST(137385.14881202241/8.0), - REAL_CONST(137410.81928239719/8.0), - REAL_CONST(137436.49095173844/8.0), - REAL_CONST(137462.16381993407/8.0), - REAL_CONST(137487.83788687221/8.0), - REAL_CONST(137513.51315244089/8.0), - REAL_CONST(137539.18961652822/8.0), - REAL_CONST(137564.86727902229/8.0), - REAL_CONST(137590.54613981131/8.0), - REAL_CONST(137616.22619878338/8.0), - REAL_CONST(137641.90745582676/8.0), - REAL_CONST(137667.58991082967/8.0), - REAL_CONST(137693.27356368033/8.0), - REAL_CONST(137718.95841426702/8.0), - REAL_CONST(137744.64446247809/8.0), - REAL_CONST(137770.33170820182/8.0), - REAL_CONST(137796.02015132661/8.0), - REAL_CONST(137821.70979174081/8.0), - REAL_CONST(137847.40062933284/8.0), - REAL_CONST(137873.09266399115/8.0), - REAL_CONST(137898.78589560417/8.0), - REAL_CONST(137924.48032406042/8.0), - REAL_CONST(137950.17594924837/8.0), - REAL_CONST(137975.8727710566/8.0), - REAL_CONST(138001.57078937365/8.0), - REAL_CONST(138027.27000408815/8.0), - REAL_CONST(138052.97041508864/8.0), - REAL_CONST(138078.67202226384/8.0), - REAL_CONST(138104.3748255024/8.0), - REAL_CONST(138130.07882469296/8.0), - REAL_CONST(138155.78401972432/8.0), - REAL_CONST(138181.49041048516/8.0), - REAL_CONST(138207.1979968643/8.0), - REAL_CONST(138232.9067787505/8.0), - REAL_CONST(138258.61675603263/8.0), - REAL_CONST(138284.32792859949/8.0), - REAL_CONST(138310.04029633995/8.0), - REAL_CONST(138335.75385914298/8.0), - REAL_CONST(138361.46861689744/8.0), - REAL_CONST(138387.18456949232/8.0), - REAL_CONST(138412.90171681659/8.0), - REAL_CONST(138438.62005875923/8.0), - REAL_CONST(138464.33959520931/8.0), - REAL_CONST(138490.06032605586/8.0), - REAL_CONST(138515.78225118798/8.0), - REAL_CONST(138541.50537049473/8.0), - REAL_CONST(138567.2296838653/8.0), - REAL_CONST(138592.95519118884/8.0), - REAL_CONST(138618.68189235451/8.0), - REAL_CONST(138644.40978725153/8.0), - REAL_CONST(138670.13887576913/8.0), - REAL_CONST(138695.86915779658/8.0), - REAL_CONST(138721.60063322316/8.0), - REAL_CONST(138747.33330193823/8.0), - REAL_CONST(138773.06716383106/8.0), - REAL_CONST(138798.80221879104/8.0), - REAL_CONST(138824.53846670757/8.0), - REAL_CONST(138850.27590747006/8.0), - REAL_CONST(138876.01454096794/8.0), - REAL_CONST(138901.7543670907/8.0), - REAL_CONST(138927.49538572782/8.0), - REAL_CONST(138953.2375967688/8.0), - REAL_CONST(138978.9810001032/8.0), - REAL_CONST(139004.72559562061/8.0), - REAL_CONST(139030.47138321059/8.0), - REAL_CONST(139056.2183627628/8.0), - REAL_CONST(139081.96653416683/8.0), - REAL_CONST(139107.71589731239/8.0), - REAL_CONST(139133.46645208917/8.0), - REAL_CONST(139159.21819838689/8.0), - REAL_CONST(139184.97113609532/8.0), - REAL_CONST(139210.72526510421/8.0), - REAL_CONST(139236.48058530336/8.0), - REAL_CONST(139262.23709658257/8.0), - REAL_CONST(139287.99479883176/8.0), - REAL_CONST(139313.75369194071/8.0), - REAL_CONST(139339.51377579942/8.0), - REAL_CONST(139365.27505029776/8.0), - REAL_CONST(139391.03751532568/8.0), - REAL_CONST(139416.80117077316/8.0), - REAL_CONST(139442.56601653024/8.0), - REAL_CONST(139468.33205248689/8.0), - REAL_CONST(139494.09927853322/8.0), - REAL_CONST(139519.86769455927/8.0), - REAL_CONST(139545.63730045516/8.0), - REAL_CONST(139571.408096111/8.0), - REAL_CONST(139597.18008141697/8.0), - REAL_CONST(139622.95325626322/8.0), - REAL_CONST(139648.72762054001/8.0), - REAL_CONST(139674.5031741375/8.0), - REAL_CONST(139700.27991694602/8.0), - REAL_CONST(139726.05784885579/8.0), - REAL_CONST(139751.83696975713/8.0), - REAL_CONST(139777.61727954043/8.0), - REAL_CONST(139803.39877809596/8.0), - REAL_CONST(139829.18146531415/8.0), - REAL_CONST(139854.96534108539/8.0), - REAL_CONST(139880.75040530015/8.0), - REAL_CONST(139906.53665784886/8.0), - REAL_CONST(139932.32409862199/8.0), - REAL_CONST(139958.11272751007/8.0), - REAL_CONST(139983.90254440365/8.0), - REAL_CONST(140009.69354919327/8.0), - REAL_CONST(140035.48574176949/8.0), - REAL_CONST(140061.27912202294/8.0), - REAL_CONST(140087.07368984428/8.0), - REAL_CONST(140112.86944512415/8.0), - REAL_CONST(140138.66638775321/8.0), - REAL_CONST(140164.4645176222/8.0), - REAL_CONST(140190.26383462184/8.0), - REAL_CONST(140216.06433864293/8.0), - REAL_CONST(140241.86602957622/8.0), - REAL_CONST(140267.66890731253/8.0), - REAL_CONST(140293.47297174268/8.0), - REAL_CONST(140319.27822275754/8.0), - REAL_CONST(140345.08466024802/8.0), - REAL_CONST(140370.89228410498/8.0), - REAL_CONST(140396.70109421943/8.0), - REAL_CONST(140422.51109048226/8.0), - REAL_CONST(140448.32227278448/8.0), - REAL_CONST(140474.13464101712/8.0), - REAL_CONST(140499.94819507122/8.0), - REAL_CONST(140525.76293483781/8.0), - REAL_CONST(140551.57886020801/8.0), - REAL_CONST(140577.3959710729/8.0), - REAL_CONST(140603.21426732364/8.0), - REAL_CONST(140629.03374885136/8.0), - REAL_CONST(140654.85441554731/8.0), - REAL_CONST(140680.67626730262/8.0), - REAL_CONST(140706.49930400858/8.0), - REAL_CONST(140732.32352555645/8.0), - REAL_CONST(140758.1489318375/8.0), - REAL_CONST(140783.97552274304/8.0), - REAL_CONST(140809.80329816442/8.0), - REAL_CONST(140835.63225799298/8.0), - REAL_CONST(140861.46240212015/8.0), - REAL_CONST(140887.29373043729/8.0), - REAL_CONST(140913.12624283586/8.0), - REAL_CONST(140938.95993920733/8.0), - REAL_CONST(140964.79481944317/8.0), - REAL_CONST(140990.63088343487/8.0), - REAL_CONST(141016.46813107401/8.0), - REAL_CONST(141042.30656225214/8.0), - REAL_CONST(141068.14617686081/8.0), - REAL_CONST(141093.98697479168/8.0), - REAL_CONST(141119.82895593636/8.0), - REAL_CONST(141145.6721201865/8.0), - REAL_CONST(141171.51646743377/8.0), - REAL_CONST(141197.36199756994/8.0), - REAL_CONST(141223.20871048668/8.0), - REAL_CONST(141249.05660607578/8.0), - REAL_CONST(141274.90568422904/8.0), - REAL_CONST(141300.75594483822/8.0), - REAL_CONST(141326.6073877952/8.0), - REAL_CONST(141352.4600129918/8.0), - REAL_CONST(141378.31382031992/8.0), - REAL_CONST(141404.16880967148/8.0), - REAL_CONST(141430.02498093838/8.0), - REAL_CONST(141455.8823340126/8.0), - REAL_CONST(141481.74086878612/8.0), - REAL_CONST(141507.60058515094/8.0), - REAL_CONST(141533.46148299909/8.0), - REAL_CONST(141559.32356222265/8.0), - REAL_CONST(141585.18682271364/8.0), - REAL_CONST(141611.05126436421/8.0), - REAL_CONST(141636.9168870665/8.0), - REAL_CONST(141662.78369071262/8.0), - REAL_CONST(141688.65167519479/8.0), - REAL_CONST(141714.5208404052/8.0), - REAL_CONST(141740.39118623605/8.0), - REAL_CONST(141766.26271257963/8.0), - REAL_CONST(141792.1354193282/8.0), - REAL_CONST(141818.00930637406/8.0), - REAL_CONST(141843.88437360956/8.0), - REAL_CONST(141869.760620927/8.0), - REAL_CONST(141895.6380482188/8.0), - REAL_CONST(141921.51665537735/8.0), - REAL_CONST(141947.39644229505/8.0), - REAL_CONST(141973.27740886438/8.0), - REAL_CONST(141999.15955497778/8.0), - REAL_CONST(142025.04288052776/8.0), - REAL_CONST(142050.92738540689/8.0), - REAL_CONST(142076.81306950765/8.0), - REAL_CONST(142102.69993272264/8.0), - REAL_CONST(142128.58797494444/8.0), - REAL_CONST(142154.47719606571/8.0), - REAL_CONST(142180.36759597904/8.0), - REAL_CONST(142206.25917457714/8.0), - REAL_CONST(142232.15193175265/8.0), - REAL_CONST(142258.04586739838/8.0), - REAL_CONST(142283.94098140698/8.0), - REAL_CONST(142309.83727367126/8.0), - REAL_CONST(142335.73474408401/8.0), - REAL_CONST(142361.63339253806/8.0), - REAL_CONST(142387.5332189262/8.0), - REAL_CONST(142413.43422314132/8.0), - REAL_CONST(142439.33640507635/8.0), - REAL_CONST(142465.23976462413/8.0), - REAL_CONST(142491.14430167765/8.0), - REAL_CONST(142517.05001612983/8.0), - REAL_CONST(142542.95690787368/8.0), - REAL_CONST(142568.86497680223/8.0), - REAL_CONST(142594.77422280848/8.0), - REAL_CONST(142620.68464578551/8.0), - REAL_CONST(142646.5962456264/8.0), - REAL_CONST(142672.50902222423/8.0), - REAL_CONST(142698.42297547215/8.0), - REAL_CONST(142724.33810526333/8.0), - REAL_CONST(142750.25441149093/8.0), - REAL_CONST(142776.17189404817/8.0), - REAL_CONST(142802.09055282827/8.0), - REAL_CONST(142828.01038772447/8.0), - REAL_CONST(142853.93139863008/8.0), - REAL_CONST(142879.85358543837/8.0), - REAL_CONST(142905.77694804268/8.0), - REAL_CONST(142931.70148633636/8.0), - REAL_CONST(142957.62720021277/8.0), - REAL_CONST(142983.55408956532/8.0), - REAL_CONST(143009.48215428743/8.0), - REAL_CONST(143035.41139427255/8.0), - REAL_CONST(143061.34180941415/8.0), - REAL_CONST(143087.27339960571/8.0), - REAL_CONST(143113.20616474075/8.0), - REAL_CONST(143139.14010471283/8.0), - REAL_CONST(143165.07521941551/8.0), - REAL_CONST(143191.01150874238/8.0), - REAL_CONST(143216.94897258704/8.0), - REAL_CONST(143242.88761084314/8.0), - REAL_CONST(143268.82742340435/8.0), - REAL_CONST(143294.76841016437/8.0), - REAL_CONST(143320.71057101688/8.0), - REAL_CONST(143346.65390585564/8.0), - REAL_CONST(143372.59841457437/8.0), - REAL_CONST(143398.54409706692/8.0), - REAL_CONST(143424.49095322701/8.0), - REAL_CONST(143450.43898294857/8.0), - REAL_CONST(143476.38818612538/8.0), - REAL_CONST(143502.33856265133/8.0), - REAL_CONST(143528.29011242036/8.0), - REAL_CONST(143554.24283532638/8.0), - REAL_CONST(143580.19673126334/8.0), - REAL_CONST(143606.1518001252/8.0), - REAL_CONST(143632.10804180597/8.0), - REAL_CONST(143658.06545619969/8.0), - REAL_CONST(143684.02404320039/8.0), - REAL_CONST(143709.98380270213/8.0), - REAL_CONST(143735.944734599/8.0), - REAL_CONST(143761.90683878519/8.0), - REAL_CONST(143787.87011515474/8.0), - REAL_CONST(143813.83456360188/8.0), - REAL_CONST(143839.8001840208/8.0), - REAL_CONST(143865.76697630569/8.0), - REAL_CONST(143891.73494035081/8.0), - REAL_CONST(143917.7040760504/8.0), - REAL_CONST(143943.67438329876/8.0), - REAL_CONST(143969.6458619902/8.0), - REAL_CONST(143995.61851201905/8.0), - REAL_CONST(144021.59233327967/8.0), - REAL_CONST(144047.56732566646/8.0), - REAL_CONST(144073.54348907378/8.0), - REAL_CONST(144099.52082339607/8.0), - REAL_CONST(144125.49932852783/8.0), - REAL_CONST(144151.4790043635/8.0), - REAL_CONST(144177.45985079758/8.0), - REAL_CONST(144203.44186772458/8.0), - REAL_CONST(144229.42505503909/8.0), - REAL_CONST(144255.40941263564/8.0), - REAL_CONST(144281.39494040885/8.0), - REAL_CONST(144307.38163825331/8.0), - REAL_CONST(144333.36950606373/8.0), - REAL_CONST(144359.35854373468/8.0), - REAL_CONST(144385.34875116093/8.0), - REAL_CONST(144411.34012823718/8.0), - REAL_CONST(144437.33267485813/8.0), - REAL_CONST(144463.32639091855/8.0), - REAL_CONST(144489.32127631325/8.0), - REAL_CONST(144515.31733093705/8.0), - REAL_CONST(144541.31455468474/8.0), - REAL_CONST(144567.3129474512/8.0), - REAL_CONST(144593.3125091313/8.0), - REAL_CONST(144619.31323961995/8.0), - REAL_CONST(144645.31513881206/8.0), - REAL_CONST(144671.31820660262/8.0), - REAL_CONST(144697.32244288657/8.0), - REAL_CONST(144723.32784755889/8.0), - REAL_CONST(144749.33442051467/8.0), - REAL_CONST(144775.34216164888/8.0), - REAL_CONST(144801.35107085665/8.0), - REAL_CONST(144827.36114803303/8.0), - REAL_CONST(144853.37239307314/8.0), - REAL_CONST(144879.38480587213/8.0), - REAL_CONST(144905.39838632516/8.0), - REAL_CONST(144931.41313432742/8.0), - REAL_CONST(144957.4290497741/8.0), - REAL_CONST(144983.44613256046/8.0), - REAL_CONST(145009.46438258173/8.0), - REAL_CONST(145035.48379973322/8.0), - REAL_CONST(145061.50438391021/8.0), - REAL_CONST(145087.52613500805/8.0), - REAL_CONST(145113.54905292206/8.0), - REAL_CONST(145139.57313754765/8.0), - REAL_CONST(145165.59838878017/8.0), - REAL_CONST(145191.62480651509/8.0), - REAL_CONST(145217.65239064783/8.0), - REAL_CONST(145243.68114107384/8.0), - REAL_CONST(145269.71105768863/8.0), - REAL_CONST(145295.74214038774/8.0), - REAL_CONST(145321.77438906668/8.0), - REAL_CONST(145347.80780362099/8.0), - REAL_CONST(145373.84238394629/8.0), - REAL_CONST(145399.87812993818/8.0), - REAL_CONST(145425.91504149229/8.0), - REAL_CONST(145451.95311850426/8.0), - REAL_CONST(145477.9923608698/8.0), - REAL_CONST(145504.03276848458/8.0), - REAL_CONST(145530.07434124436/8.0), - REAL_CONST(145556.11707904484/8.0), - REAL_CONST(145582.16098178181/8.0), - REAL_CONST(145608.20604935108/8.0), - REAL_CONST(145634.25228164849/8.0), - REAL_CONST(145660.29967856981/8.0), - REAL_CONST(145686.34824001096/8.0), - REAL_CONST(145712.39796586783/8.0), - REAL_CONST(145738.4488560363/8.0), - REAL_CONST(145764.50091041232/8.0), - REAL_CONST(145790.55412889185/8.0), - REAL_CONST(145816.60851137087/8.0), - REAL_CONST(145842.66405774537/8.0), - REAL_CONST(145868.72076791141/8.0), - REAL_CONST(145894.77864176501/8.0), - REAL_CONST(145920.83767920226/8.0), - REAL_CONST(145946.89788011924/8.0), - REAL_CONST(145972.95924441208/8.0), - REAL_CONST(145999.02177197693/8.0), - REAL_CONST(146025.08546270995/8.0), - REAL_CONST(146051.15031650732/8.0), - REAL_CONST(146077.21633326527/8.0), - REAL_CONST(146103.28351288004/8.0), - REAL_CONST(146129.35185524789/8.0), - REAL_CONST(146155.42136026506/8.0), - REAL_CONST(146181.49202782792/8.0), - REAL_CONST(146207.56385783272/8.0), - REAL_CONST(146233.63685017588/8.0), - REAL_CONST(146259.71100475377/8.0), - REAL_CONST(146285.78632146274/8.0), - REAL_CONST(146311.86280019928/8.0), - REAL_CONST(146337.94044085976/8.0), - REAL_CONST(146364.01924334071/8.0), - REAL_CONST(146390.09920753856/8.0), - REAL_CONST(146416.18033334985/8.0), - REAL_CONST(146442.26262067116/8.0), - REAL_CONST(146468.34606939898/8.0), - REAL_CONST(146494.43067942993/8.0), - REAL_CONST(146520.51645066062/8.0), - REAL_CONST(146546.60338298764/8.0), - REAL_CONST(146572.69147630769/8.0), - REAL_CONST(146598.78073051744/8.0), - REAL_CONST(146624.87114551352/8.0), - REAL_CONST(146650.96272119274/8.0), - REAL_CONST(146677.05545745179/8.0), - REAL_CONST(146703.14935418745/8.0), - REAL_CONST(146729.2444112965/8.0), - REAL_CONST(146755.34062867577/8.0), - REAL_CONST(146781.43800622207/8.0), - REAL_CONST(146807.53654383228/8.0), - REAL_CONST(146833.63624140329/8.0), - REAL_CONST(146859.73709883197/8.0), - REAL_CONST(146885.83911601527/8.0), - REAL_CONST(146911.94229285014/8.0), - REAL_CONST(146938.04662923355/8.0), - REAL_CONST(146964.15212506248/8.0), - REAL_CONST(146990.25878023397/8.0), - REAL_CONST(147016.36659464505/8.0), - REAL_CONST(147042.47556819281/8.0), - REAL_CONST(147068.58570077427/8.0), - REAL_CONST(147094.6969922866/8.0), - REAL_CONST(147120.80944262692/8.0), - REAL_CONST(147146.92305169237/8.0), - REAL_CONST(147173.03781938017/8.0), - REAL_CONST(147199.15374558745/8.0), - REAL_CONST(147225.27083021149/8.0), - REAL_CONST(147251.38907314953/8.0), - REAL_CONST(147277.50847429881/8.0), - REAL_CONST(147303.62903355664/8.0), - REAL_CONST(147329.75075082036/8.0), - REAL_CONST(147355.87362598727/8.0), - REAL_CONST(147381.99765895473/8.0), - REAL_CONST(147408.12284962015/8.0), - REAL_CONST(147434.24919788091/8.0), - REAL_CONST(147460.37670363448/8.0), - REAL_CONST(147486.50536677826/8.0), - REAL_CONST(147512.63518720976/8.0), - REAL_CONST(147538.76616482646/8.0), - REAL_CONST(147564.89829952587/8.0), - REAL_CONST(147591.03159120557/8.0), - REAL_CONST(147617.16603976308/8.0), - REAL_CONST(147643.30164509601/8.0), - REAL_CONST(147669.43840710199/8.0), - REAL_CONST(147695.57632567859/8.0), - REAL_CONST(147721.71540072354/8.0), - REAL_CONST(147747.85563213445/8.0), - REAL_CONST(147773.99701980909/8.0), - REAL_CONST(147800.13956364512/8.0), - REAL_CONST(147826.28326354033/8.0), - REAL_CONST(147852.42811939248/8.0), - REAL_CONST(147878.57413109933/8.0), - REAL_CONST(147904.72129855872/8.0), - REAL_CONST(147930.86962166851/8.0), - REAL_CONST(147957.01910032652/8.0), - REAL_CONST(147983.16973443062/8.0), - REAL_CONST(148009.32152387875/8.0), - REAL_CONST(148035.47446856883/8.0), - REAL_CONST(148061.62856839882/8.0), - REAL_CONST(148087.78382326665/8.0), - REAL_CONST(148113.94023307035/8.0), - REAL_CONST(148140.09779770792/8.0), - REAL_CONST(148166.25651707739/8.0), - REAL_CONST(148192.41639107687/8.0), - REAL_CONST(148218.57741960438/8.0), - REAL_CONST(148244.73960255808/8.0), - REAL_CONST(148270.90293983606/8.0), - REAL_CONST(148297.0674313365/8.0), - REAL_CONST(148323.23307695755/8.0), - REAL_CONST(148349.39987659742/8.0), - REAL_CONST(148375.56783015432/8.0), - REAL_CONST(148401.73693752653/8.0), - REAL_CONST(148427.90719861226/8.0), - REAL_CONST(148454.07861330983/8.0), - REAL_CONST(148480.25118151752/8.0), - REAL_CONST(148506.42490313368/8.0), - REAL_CONST(148532.59977805667/8.0), - REAL_CONST(148558.77580618486/8.0), - REAL_CONST(148584.95298741665/8.0), - REAL_CONST(148611.13132165043/8.0), - REAL_CONST(148637.31080878471/8.0), - REAL_CONST(148663.49144871789/8.0), - REAL_CONST(148689.6732413485/8.0), - REAL_CONST(148715.85618657502/8.0), - REAL_CONST(148742.040284296/8.0), - REAL_CONST(148768.22553440998/8.0), - REAL_CONST(148794.41193681557/8.0), - REAL_CONST(148820.59949141133/8.0), - REAL_CONST(148846.78819809589/8.0), - REAL_CONST(148872.97805676793/8.0), - REAL_CONST(148899.16906732606/8.0), - REAL_CONST(148925.36122966901/8.0), - REAL_CONST(148951.55454369547/8.0), - REAL_CONST(148977.74900930419/8.0), - REAL_CONST(149003.9446263939/8.0), - REAL_CONST(149030.1413948634/8.0), - REAL_CONST(149056.33931461151/8.0), - REAL_CONST(149082.53838553699/8.0), - REAL_CONST(149108.73860753875/8.0), - REAL_CONST(149134.9399805156/8.0), - REAL_CONST(149161.14250436646/8.0), - REAL_CONST(149187.34617899026/8.0), - REAL_CONST(149213.5510042859/8.0), - REAL_CONST(149239.75698015234/8.0), - REAL_CONST(149265.96410648854/8.0), - REAL_CONST(149292.17238319354/8.0), - REAL_CONST(149318.38181016635/8.0), - REAL_CONST(149344.59238730598/8.0), - REAL_CONST(149370.80411451156/8.0), - REAL_CONST(149397.01699168212/8.0), - REAL_CONST(149423.23101871679/8.0), - REAL_CONST(149449.44619551473/8.0), - REAL_CONST(149475.66252197503/8.0), - REAL_CONST(149501.87999799693/8.0), - REAL_CONST(149528.0986234796/8.0), - REAL_CONST(149554.31839832227/8.0), - REAL_CONST(149580.53932242419/8.0), - REAL_CONST(149606.76139568459/8.0), - REAL_CONST(149632.98461800278/8.0), - REAL_CONST(149659.20898927809/8.0), - REAL_CONST(149685.43450940982/8.0), - REAL_CONST(149711.66117829733/8.0), - REAL_CONST(149737.88899584001/8.0), - REAL_CONST(149764.11796193724/8.0), - REAL_CONST(149790.34807648844/8.0), - REAL_CONST(149816.57933939309/8.0), - REAL_CONST(149842.81175055061/8.0), - REAL_CONST(149869.04530986046/8.0), - REAL_CONST(149895.28001722222/8.0), - REAL_CONST(149921.51587253538/8.0), - REAL_CONST(149947.75287569952/8.0), - REAL_CONST(149973.99102661415/8.0), - REAL_CONST(150000.23032517891/8.0), - REAL_CONST(150026.47077129342/8.0), - REAL_CONST(150052.71236485732/8.0), - REAL_CONST(150078.95510577026/8.0), - REAL_CONST(150105.1989939319/8.0), - REAL_CONST(150131.444029242/8.0), - REAL_CONST(150157.69021160025/8.0), - REAL_CONST(150183.93754090639/8.0), - REAL_CONST(150210.18601706024/8.0), - REAL_CONST(150236.43563996154/8.0), - REAL_CONST(150262.68640951012/8.0), - REAL_CONST(150288.93832560582/8.0), - REAL_CONST(150315.19138814852/8.0), - REAL_CONST(150341.44559703805/8.0), - REAL_CONST(150367.70095217437/8.0), - REAL_CONST(150393.95745345735/8.0), - REAL_CONST(150420.21510078697/8.0), - REAL_CONST(150446.47389406321/8.0), - REAL_CONST(150472.73383318601/8.0), - REAL_CONST(150498.99491805542/8.0), - REAL_CONST(150525.25714857146/8.0), - REAL_CONST(150551.52052463419/8.0), - REAL_CONST(150577.78504614369/8.0), - REAL_CONST(150604.05071300003/8.0), - REAL_CONST(150630.31752510337/8.0), - REAL_CONST(150656.58548235384/8.0), - REAL_CONST(150682.85458465159/8.0), - REAL_CONST(150709.1248318968/8.0), - REAL_CONST(150735.39622398972/8.0), - REAL_CONST(150761.66876083051/8.0), - REAL_CONST(150787.9424423195/8.0), - REAL_CONST(150814.21726835691/8.0), - REAL_CONST(150840.49323884305/8.0), - REAL_CONST(150866.77035367821/8.0), - REAL_CONST(150893.04861276277/8.0), - REAL_CONST(150919.32801599705/8.0), - REAL_CONST(150945.60856328148/8.0), - REAL_CONST(150971.89025451642/8.0), - REAL_CONST(150998.17308960229/8.0), - REAL_CONST(151024.45706843957/8.0), - REAL_CONST(151050.74219092872/8.0), - REAL_CONST(151077.02845697021/8.0), - REAL_CONST(151103.31586646455/8.0), - REAL_CONST(151129.60441931229/8.0), - REAL_CONST(151155.894115414/8.0), - REAL_CONST(151182.1849546702/8.0), - REAL_CONST(151208.47693698155/8.0), - REAL_CONST(151234.77006224863/8.0), - REAL_CONST(151261.06433037209/8.0), - REAL_CONST(151287.35974125259/8.0), - REAL_CONST(151313.65629479082/8.0), - REAL_CONST(151339.95399088747/8.0), - REAL_CONST(151366.25282944329/8.0), - REAL_CONST(151392.55281035902/8.0), - REAL_CONST(151418.85393353543/8.0), - REAL_CONST(151445.1561988733/8.0), - REAL_CONST(151471.45960627345/8.0), - REAL_CONST(151497.76415563675/8.0), - REAL_CONST(151524.06984686397/8.0), - REAL_CONST(151550.37667985607/8.0), - REAL_CONST(151576.68465451393/8.0), - REAL_CONST(151602.99377073845/8.0), - REAL_CONST(151629.30402843058/8.0), - REAL_CONST(151655.61542749128/8.0), - REAL_CONST(151681.92796782157/8.0), - REAL_CONST(151708.24164932242/8.0), - REAL_CONST(151734.55647189484/8.0), - REAL_CONST(151760.87243543993/8.0), - REAL_CONST(151787.18953985872/8.0), - REAL_CONST(151813.50778505235/8.0), - REAL_CONST(151839.82717092187/8.0), - REAL_CONST(151866.14769736846/8.0), - REAL_CONST(151892.46936429327/8.0), - REAL_CONST(151918.79217159748/8.0), - REAL_CONST(151945.11611918229/8.0), - REAL_CONST(151971.44120694889/8.0), - REAL_CONST(151997.76743479856/8.0), - REAL_CONST(152024.09480263255/8.0), - REAL_CONST(152050.42331035214/8.0), - REAL_CONST(152076.75295785864/8.0), - REAL_CONST(152103.08374505339/8.0), - REAL_CONST(152129.41567183775/8.0), - REAL_CONST(152155.74873811303/8.0), - REAL_CONST(152182.08294378067/8.0), - REAL_CONST(152208.41828874208/8.0), - REAL_CONST(152234.75477289871/8.0), - REAL_CONST(152261.09239615197/8.0), - REAL_CONST(152287.43115840337/8.0), - REAL_CONST(152313.77105955439/8.0), - REAL_CONST(152340.11209950657/8.0), - REAL_CONST(152366.45427816146/8.0), - REAL_CONST(152392.79759542056/8.0), - REAL_CONST(152419.14205118554/8.0), - REAL_CONST(152445.48764535793/8.0), - REAL_CONST(152471.8343778394/8.0), - REAL_CONST(152498.18224853161/8.0), - REAL_CONST(152524.53125733617/8.0), - REAL_CONST(152550.88140415482/8.0), - REAL_CONST(152577.23268888926/8.0), - REAL_CONST(152603.58511144121/8.0), - REAL_CONST(152629.93867171241/8.0), - REAL_CONST(152656.29336960468/8.0), - REAL_CONST(152682.64920501978/8.0), - REAL_CONST(152709.00617785956/8.0), - REAL_CONST(152735.36428802583/8.0), - REAL_CONST(152761.72353542043/8.0), - REAL_CONST(152788.08391994529/8.0), - REAL_CONST(152814.44544150229/8.0), - REAL_CONST(152840.80809999333/8.0), - REAL_CONST(152867.17189532038/8.0), - REAL_CONST(152893.53682738543/8.0), - REAL_CONST(152919.90289609041/8.0), - REAL_CONST(152946.27010133737/8.0), - REAL_CONST(152972.63844302832/8.0), - REAL_CONST(152999.00792106529/8.0), - REAL_CONST(153025.37853535041/8.0), - REAL_CONST(153051.7502857857/8.0), - REAL_CONST(153078.12317227334/8.0), - REAL_CONST(153104.4971947154/8.0), - REAL_CONST(153130.8723530141/8.0), - REAL_CONST(153157.24864707157/8.0), - REAL_CONST(153183.62607679001/8.0), - REAL_CONST(153210.00464207167/8.0), - REAL_CONST(153236.38434281875/8.0), - REAL_CONST(153262.76517893354/8.0), - REAL_CONST(153289.14715031831/8.0), - REAL_CONST(153315.53025687535/8.0), - REAL_CONST(153341.91449850702/8.0), - REAL_CONST(153368.2998751156/8.0), - REAL_CONST(153394.68638660354/8.0), - REAL_CONST(153421.07403287315/8.0), - REAL_CONST(153447.46281382689/8.0), - REAL_CONST(153473.85272936718/8.0), - REAL_CONST(153500.24377939643/8.0), - REAL_CONST(153526.63596381716/8.0), - REAL_CONST(153553.02928253182/8.0), - REAL_CONST(153579.42373544298/8.0), - REAL_CONST(153605.81932245308/8.0), - REAL_CONST(153632.21604346478/8.0), - REAL_CONST(153658.61389838057/8.0), - REAL_CONST(153685.0128871031/8.0), - REAL_CONST(153711.41300953497/8.0), - REAL_CONST(153737.81426557881/8.0), - REAL_CONST(153764.21665513728/8.0), - REAL_CONST(153790.62017811305/8.0), - REAL_CONST(153817.02483440886/8.0), - REAL_CONST(153843.43062392739/8.0), - REAL_CONST(153869.83754657139/8.0), - REAL_CONST(153896.24560224367/8.0), - REAL_CONST(153922.65479084692/8.0), - REAL_CONST(153949.06511228404/8.0), - REAL_CONST(153975.4765664578/8.0), - REAL_CONST(154001.88915327107/8.0), - REAL_CONST(154028.30287262669/8.0), - REAL_CONST(154054.71772442761/8.0), - REAL_CONST(154081.13370857667/8.0), - REAL_CONST(154107.55082497682/8.0), - REAL_CONST(154133.96907353101/8.0), - REAL_CONST(154160.38845414223/8.0), - REAL_CONST(154186.80896671346/8.0), - REAL_CONST(154213.23061114774/8.0), - REAL_CONST(154239.65338734805/8.0), - REAL_CONST(154266.07729521746/8.0), - REAL_CONST(154292.50233465908/8.0), - REAL_CONST(154318.92850557598/8.0), - REAL_CONST(154345.35580787127/8.0), - REAL_CONST(154371.7842414481/8.0), - REAL_CONST(154398.21380620965/8.0), - REAL_CONST(154424.64450205903/8.0), - REAL_CONST(154451.07632889951/8.0), - REAL_CONST(154477.50928663427/8.0), - REAL_CONST(154503.94337516659/8.0), - REAL_CONST(154530.37859439969/8.0), - REAL_CONST(154556.81494423689/8.0), - REAL_CONST(154583.25242458144/8.0), - REAL_CONST(154609.69103533673/8.0), - REAL_CONST(154636.13077640603/8.0), - REAL_CONST(154662.57164769279/8.0), - REAL_CONST(154689.01364910032/8.0), - REAL_CONST(154715.45678053208/8.0), - REAL_CONST(154741.90104189145/8.0), - REAL_CONST(154768.34643308193/8.0), - REAL_CONST(154794.79295400696/8.0), - REAL_CONST(154821.24060457002/8.0), - REAL_CONST(154847.68938467462/8.0), - REAL_CONST(154874.13929422433/8.0), - REAL_CONST(154900.59033312264/8.0), - REAL_CONST(154927.04250127316/8.0), - REAL_CONST(154953.49579857948/8.0), - REAL_CONST(154979.95022494521/8.0), - REAL_CONST(155006.40578027396/8.0), - REAL_CONST(155032.86246446942/8.0), - REAL_CONST(155059.32027743524/8.0), - REAL_CONST(155085.77921907514/8.0), - REAL_CONST(155112.2392892928/8.0), - REAL_CONST(155138.70048799197/8.0), - REAL_CONST(155165.16281507642/8.0), - REAL_CONST(155191.62627044989/8.0), - REAL_CONST(155218.09085401625/8.0), - REAL_CONST(155244.55656567923/8.0), - REAL_CONST(155271.02340534274/8.0), - REAL_CONST(155297.49137291059/8.0), - REAL_CONST(155323.96046828668/8.0), - REAL_CONST(155350.4306913749/8.0), - REAL_CONST(155376.90204207919/8.0), - REAL_CONST(155403.37452030348/8.0), - REAL_CONST(155429.84812595171/8.0), - REAL_CONST(155456.32285892789/8.0), - REAL_CONST(155482.79871913602/8.0), - REAL_CONST(155509.27570648011/8.0), - REAL_CONST(155535.75382086422/8.0), - REAL_CONST(155562.23306219239/8.0), - REAL_CONST(155588.71343036872/8.0), - REAL_CONST(155615.19492529731/8.0), - REAL_CONST(155641.67754688227/8.0), - REAL_CONST(155668.16129502779/8.0), - REAL_CONST(155694.64616963797/8.0), - REAL_CONST(155721.13217061706/8.0), - REAL_CONST(155747.61929786921/8.0), - REAL_CONST(155774.10755129869/8.0), - REAL_CONST(155800.59693080973/8.0), - REAL_CONST(155827.08743630661/8.0), - REAL_CONST(155853.57906769359/8.0), - REAL_CONST(155880.07182487496/8.0), - REAL_CONST(155906.56570775513/8.0), - REAL_CONST(155933.06071623837/8.0), - REAL_CONST(155959.55685022907/8.0), - REAL_CONST(155986.05410963166/8.0), - REAL_CONST(156012.5524943505/8.0), - REAL_CONST(156039.05200429002/8.0), - REAL_CONST(156065.55263935472/8.0), - REAL_CONST(156092.054399449/8.0), - REAL_CONST(156118.5572844774/8.0), - REAL_CONST(156145.06129434443/8.0), - REAL_CONST(156171.5664289546/8.0), - REAL_CONST(156198.07268821247/8.0), - REAL_CONST(156224.5800720226/8.0), - REAL_CONST(156251.08858028959/8.0), - REAL_CONST(156277.59821291809/8.0), - REAL_CONST(156304.10896981266/8.0), - REAL_CONST(156330.62085087801/8.0), - REAL_CONST(156357.1338560188/8.0), - REAL_CONST(156383.64798513969/8.0), - REAL_CONST(156410.16323814544/8.0), - REAL_CONST(156436.67961494075/8.0), - REAL_CONST(156463.1971154304/8.0), - REAL_CONST(156489.71573951913/8.0), - REAL_CONST(156516.23548711176/8.0), - REAL_CONST(156542.75635811311/8.0), - REAL_CONST(156569.27835242799/8.0), - REAL_CONST(156595.80146996127/8.0), - REAL_CONST(156622.32571061782/8.0), - REAL_CONST(156648.85107430254/8.0), - REAL_CONST(156675.37756092031/8.0), - REAL_CONST(156701.90517037612/8.0), - REAL_CONST(156728.43390257491/8.0), - REAL_CONST(156754.96375742162/8.0), - REAL_CONST(156781.49473482129/8.0), - REAL_CONST(156808.02683467892/8.0), - REAL_CONST(156834.5600568995/8.0), - REAL_CONST(156861.09440138817/8.0), - REAL_CONST(156887.62986804993/8.0), - REAL_CONST(156914.16645678994/8.0), - REAL_CONST(156940.70416751326/8.0), - REAL_CONST(156967.24300012505/8.0), - REAL_CONST(156993.78295453047/8.0), - REAL_CONST(157020.32403063469/8.0), - REAL_CONST(157046.8662283429/8.0), - REAL_CONST(157073.40954756032/8.0), - REAL_CONST(157099.9539881922/8.0), - REAL_CONST(157126.49955014378/8.0), - REAL_CONST(157153.04623332032/8.0), - REAL_CONST(157179.59403762716/8.0), - REAL_CONST(157206.14296296958/8.0), - REAL_CONST(157232.69300925292/8.0), - REAL_CONST(157259.24417638258/8.0), - REAL_CONST(157285.79646426387/8.0), - REAL_CONST(157312.34987280221/8.0), - REAL_CONST(157338.90440190304/8.0), - REAL_CONST(157365.46005147175/8.0), - REAL_CONST(157392.01682141385/8.0), - REAL_CONST(157418.57471163478/8.0), - REAL_CONST(157445.13372204005/8.0), - REAL_CONST(157471.69385253513/8.0), - REAL_CONST(157498.25510302564/8.0), - REAL_CONST(157524.81747341706/8.0), - REAL_CONST(157551.38096361503/8.0), - REAL_CONST(157577.9455735251/8.0), - REAL_CONST(157604.51130305286/8.0), - REAL_CONST(157631.07815210402/8.0), - REAL_CONST(157657.64612058419/8.0), - REAL_CONST(157684.21520839902/8.0), - REAL_CONST(157710.78541545427/8.0), - REAL_CONST(157737.35674165559/8.0), - REAL_CONST(157763.92918690876/8.0), - REAL_CONST(157790.50275111952/8.0), - REAL_CONST(157817.07743419363/8.0), - REAL_CONST(157843.65323603692/8.0), - REAL_CONST(157870.23015655516/8.0), - REAL_CONST(157896.80819565422/8.0), - REAL_CONST(157923.3873532399/8.0), - REAL_CONST(157949.96762921812/8.0), - REAL_CONST(157976.54902349479/8.0), - REAL_CONST(158003.13153597576/8.0), - REAL_CONST(158029.71516656701/8.0), - REAL_CONST(158056.29991517449/8.0), - REAL_CONST(158082.88578170416/8.0), - REAL_CONST(158109.47276606198/8.0), - REAL_CONST(158136.06086815402/8.0), - REAL_CONST(158162.65008788629/8.0), - REAL_CONST(158189.24042516484/8.0), - REAL_CONST(158215.83187989573/8.0), - REAL_CONST(158242.42445198505/8.0), - REAL_CONST(158269.01814133892/8.0), - REAL_CONST(158295.61294786347/8.0), - REAL_CONST(158322.20887146486/8.0), - REAL_CONST(158348.80591204923/8.0), - REAL_CONST(158375.4040695228/8.0), - REAL_CONST(158402.00334379176/8.0), - REAL_CONST(158428.60373476235/8.0), - REAL_CONST(158455.2052423408/8.0), - REAL_CONST(158481.80786643337/8.0), - REAL_CONST(158508.41160694641/8.0), - REAL_CONST(158535.01646378616/8.0), - REAL_CONST(158561.62243685898/8.0), - REAL_CONST(158588.2295260712/8.0), - REAL_CONST(158614.8377313292/8.0), - REAL_CONST(158641.44705253936/8.0), - REAL_CONST(158668.05748960807/8.0), - REAL_CONST(158694.66904244179/8.0), - REAL_CONST(158721.28171094693/8.0), - REAL_CONST(158747.89549502998/8.0), - REAL_CONST(158774.5103945974/8.0), - REAL_CONST(158801.12640955573/8.0), - REAL_CONST(158827.74353981143/8.0), - REAL_CONST(158854.36178527112/8.0), - REAL_CONST(158880.9811458413/8.0), - REAL_CONST(158907.60162142856/8.0), - REAL_CONST(158934.22321193956/8.0), - REAL_CONST(158960.84591728085/8.0), - REAL_CONST(158987.46973735912/8.0), - REAL_CONST(159014.09467208097/8.0), - REAL_CONST(159040.72072135314/8.0), - REAL_CONST(159067.3478850823/8.0), - REAL_CONST(159093.97616317519/8.0), - REAL_CONST(159120.60555553852/8.0), - REAL_CONST(159147.23606207906/8.0), - REAL_CONST(159173.8676827036/8.0), - REAL_CONST(159200.50041731889/8.0), - REAL_CONST(159227.13426583182/8.0), - REAL_CONST(159253.76922814918/8.0), - REAL_CONST(159280.40530417781/8.0), - REAL_CONST(159307.04249382461/8.0), - REAL_CONST(159333.68079699649/8.0), - REAL_CONST(159360.32021360032/8.0), - REAL_CONST(159386.96074354305/8.0), - REAL_CONST(159413.60238673165/8.0), - REAL_CONST(159440.24514307309/8.0), - REAL_CONST(159466.88901247433/8.0), - REAL_CONST(159493.53399484244/8.0), - REAL_CONST(159520.18009008438/8.0), - REAL_CONST(159546.82729810724/8.0), - REAL_CONST(159573.47561881805/8.0), - REAL_CONST(159600.12505212394/8.0), - REAL_CONST(159626.77559793202/8.0), - REAL_CONST(159653.42725614941/8.0), - REAL_CONST(159680.08002668325/8.0), - REAL_CONST(159706.73390944069/8.0), - REAL_CONST(159733.38890432892/8.0), - REAL_CONST(159760.04501125516/8.0), - REAL_CONST(159786.70223012666/8.0), - REAL_CONST(159813.36056085059/8.0), - REAL_CONST(159840.02000333427/8.0), - REAL_CONST(159866.68055748497/8.0), - REAL_CONST(159893.34222320997/8.0), - REAL_CONST(159920.00500041663/8.0), - REAL_CONST(159946.66888901225/8.0), - REAL_CONST(159973.33388890422/8.0), - REAL_CONST(159999.99999999988/8.0), - REAL_CONST(160026.66722220668/8.0), - REAL_CONST(160053.33555543202/8.0), - REAL_CONST(160080.0049995833/8.0), - REAL_CONST(160106.67555456801/8.0), - REAL_CONST(160133.3472202936/8.0), - REAL_CONST(160160.0199966676/8.0), - REAL_CONST(160186.6938835975/8.0), - REAL_CONST(160213.36888099083/8.0), - REAL_CONST(160240.04498875517/8.0), - REAL_CONST(160266.72220679806/8.0), - REAL_CONST(160293.40053502709/8.0), - REAL_CONST(160320.07997334987/8.0), - REAL_CONST(160346.76052167406/8.0), - REAL_CONST(160373.44217990729/8.0), - REAL_CONST(160400.1249479572/8.0), - REAL_CONST(160426.80882573154/8.0), - REAL_CONST(160453.49381313793/8.0), - REAL_CONST(160480.17991008417/8.0), - REAL_CONST(160506.86711647795/8.0), - REAL_CONST(160533.55543222709/8.0), - REAL_CONST(160560.24485723933/8.0), - REAL_CONST(160586.93539142248/8.0), - REAL_CONST(160613.62703468435/8.0), - REAL_CONST(160640.31978693281/8.0), - REAL_CONST(160667.01364807569/8.0), - REAL_CONST(160693.70861802087/8.0), - REAL_CONST(160720.40469667627/8.0), - REAL_CONST(160747.1018839498/8.0), - REAL_CONST(160773.80017974938/8.0), - REAL_CONST(160800.49958398298/8.0), - REAL_CONST(160827.20009655855/8.0), - REAL_CONST(160853.90171738411/8.0), - REAL_CONST(160880.60444636765/8.0), - REAL_CONST(160907.30828341722/8.0), - REAL_CONST(160934.01322844089/8.0), - REAL_CONST(160960.71928134665/8.0), - REAL_CONST(160987.42644204266/8.0), - REAL_CONST(161014.13471043704/8.0), - REAL_CONST(161040.84408643784/8.0), - REAL_CONST(161067.55456995327/8.0), - REAL_CONST(161094.26616089148/8.0), - REAL_CONST(161120.97885916062/8.0), - REAL_CONST(161147.69266466892/8.0), - REAL_CONST(161174.40757732463/8.0), - REAL_CONST(161201.12359703594/8.0), - REAL_CONST(161227.84072371112/8.0), - REAL_CONST(161254.55895725847/8.0), - REAL_CONST(161281.27829758628/8.0), - REAL_CONST(161307.99874460287/8.0), - REAL_CONST(161334.72029821656/8.0), - REAL_CONST(161361.44295833571/8.0), - REAL_CONST(161388.1667248687/8.0), - REAL_CONST(161414.89159772391/8.0), - REAL_CONST(161441.61757680977/8.0), - REAL_CONST(161468.34466203468/8.0), - REAL_CONST(161495.07285330712/8.0), - REAL_CONST(161521.80215053557/8.0), - REAL_CONST(161548.53255362847/8.0), - REAL_CONST(161575.26406249436/8.0), - REAL_CONST(161601.99667704175/8.0), - REAL_CONST(161628.7303971792/8.0), - REAL_CONST(161655.46522281526/8.0), - REAL_CONST(161682.20115385848/8.0), - REAL_CONST(161708.93819021754/8.0), - REAL_CONST(161735.67633180099/8.0), - REAL_CONST(161762.41557851751/8.0), - REAL_CONST(161789.15593027571/8.0), - REAL_CONST(161815.89738698432/8.0), - REAL_CONST(161842.63994855201/8.0), - REAL_CONST(161869.38361488748/8.0), - REAL_CONST(161896.1283858995/8.0), - REAL_CONST(161922.87426149679/8.0), - REAL_CONST(161949.62124158812/8.0), - REAL_CONST(161976.36932608229/8.0), - REAL_CONST(162003.1185148881/8.0), - REAL_CONST(162029.8688079144/8.0), - REAL_CONST(162056.62020507001/8.0), - REAL_CONST(162083.37270626382/8.0), - REAL_CONST(162110.12631140469/8.0), - REAL_CONST(162136.88102040152/8.0), - REAL_CONST(162163.63683316324/8.0), - REAL_CONST(162190.39374959879/8.0), - REAL_CONST(162217.15176961714/8.0), - REAL_CONST(162243.91089312723/8.0), - REAL_CONST(162270.67112003808/8.0), - REAL_CONST(162297.43245025873/8.0), - REAL_CONST(162324.19488369819/8.0), - REAL_CONST(162350.9584202655/8.0), - REAL_CONST(162377.72305986975/8.0), - REAL_CONST(162404.48880242003/8.0), - REAL_CONST(162431.25564782543/8.0), - REAL_CONST(162458.02359599507/8.0), - REAL_CONST(162484.79264683815/8.0), - REAL_CONST(162511.56280026378/8.0), - REAL_CONST(162538.33405618116/8.0), - REAL_CONST(162565.10641449949/8.0), - REAL_CONST(162591.87987512801/8.0), - REAL_CONST(162618.65443797593/8.0), - REAL_CONST(162645.43010295252/8.0), - REAL_CONST(162672.20686996708/8.0), - REAL_CONST(162698.98473892888/8.0), - REAL_CONST(162725.76370974723/8.0), - REAL_CONST(162752.54378233149/8.0), - REAL_CONST(162779.32495659095/8.0), - REAL_CONST(162806.10723243505/8.0), - REAL_CONST(162832.89060977317/8.0), - REAL_CONST(162859.67508851466/8.0), - REAL_CONST(162886.46066856899/8.0), - REAL_CONST(162913.24734984562/8.0), - REAL_CONST(162940.03513225398/8.0), - REAL_CONST(162966.82401570358/8.0), - REAL_CONST(162993.6140001039/8.0), - REAL_CONST(163020.40508536444/8.0), - REAL_CONST(163047.19727139481/8.0), - REAL_CONST(163073.99055810447/8.0), - REAL_CONST(163100.78494540305/8.0), - REAL_CONST(163127.58043320014/8.0), - REAL_CONST(163154.37702140535/8.0), - REAL_CONST(163181.17470992831/8.0), - REAL_CONST(163207.97349867865/8.0), - REAL_CONST(163234.77338756606/8.0), - REAL_CONST(163261.57437650024/8.0), - REAL_CONST(163288.37646539087/8.0), - REAL_CONST(163315.17965414765/8.0), - REAL_CONST(163341.98394268038/8.0), - REAL_CONST(163368.78933089875/8.0), - REAL_CONST(163395.59581871261/8.0), - REAL_CONST(163422.40340603172/8.0), - REAL_CONST(163449.2120927659/8.0), - REAL_CONST(163476.02187882498/8.0), - REAL_CONST(163502.83276411882/8.0), - REAL_CONST(163529.6447485573/8.0), - REAL_CONST(163556.45783205028/8.0), - REAL_CONST(163583.2720145077/8.0), - REAL_CONST(163610.08729583945/8.0), - REAL_CONST(163636.90367595552/8.0), - REAL_CONST(163663.72115476584/8.0), - REAL_CONST(163690.53973218042/8.0), - REAL_CONST(163717.35940810922/8.0), - REAL_CONST(163744.18018246227/8.0), - REAL_CONST(163771.00205514964/8.0), - REAL_CONST(163797.82502608138/8.0), - REAL_CONST(163824.64909516752/8.0), - REAL_CONST(163851.4742623182/8.0), - REAL_CONST(163878.3005274435/8.0), - REAL_CONST(163905.12789045356/8.0), - REAL_CONST(163931.95635125853/8.0), - REAL_CONST(163958.78590976857/8.0), - REAL_CONST(163985.61656589387/8.0), - REAL_CONST(164012.44831954464/8.0), - REAL_CONST(164039.28117063109/8.0), - REAL_CONST(164066.11511906344/8.0), - REAL_CONST(164092.95016475199/8.0), - REAL_CONST(164119.78630760699/8.0), - REAL_CONST(164146.62354753874/8.0), - REAL_CONST(164173.46188445756/8.0), - REAL_CONST(164200.30131827376/8.0), - REAL_CONST(164227.14184889771/8.0), - REAL_CONST(164253.98347623978/8.0), - REAL_CONST(164280.82620021031/8.0), - REAL_CONST(164307.67002071979/8.0), - REAL_CONST(164334.51493767856/8.0), - REAL_CONST(164361.3609509971/8.0), - REAL_CONST(164388.20806058586/8.0), - REAL_CONST(164415.05626635533/8.0), - REAL_CONST(164441.905568216/8.0), - REAL_CONST(164468.75596607837/8.0), - REAL_CONST(164495.607459853/8.0), - REAL_CONST(164522.4600494504/8.0), - REAL_CONST(164549.31373478117/8.0), - REAL_CONST(164576.16851575591/8.0), - REAL_CONST(164603.02439228518/8.0), - REAL_CONST(164629.88136427966/8.0), - REAL_CONST(164656.73943164994/8.0), - REAL_CONST(164683.59859430668/8.0), - REAL_CONST(164710.45885216061/8.0), - REAL_CONST(164737.32020512238/8.0), - REAL_CONST(164764.1826531027/8.0), - REAL_CONST(164791.04619601235/8.0), - REAL_CONST(164817.91083376206/8.0), - REAL_CONST(164844.77656626256/8.0), - REAL_CONST(164871.64339342469/8.0), - REAL_CONST(164898.51131515924/8.0), - REAL_CONST(164925.38033137703/8.0), - REAL_CONST(164952.25044198887/8.0), - REAL_CONST(164979.1216469057/8.0), - REAL_CONST(165005.9939460383/8.0), - REAL_CONST(165032.86733929763/8.0), - REAL_CONST(165059.7418265946/8.0), - REAL_CONST(165086.61740784015/8.0), - REAL_CONST(165113.4940829452/8.0) -#endif -}; - -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/is.c b/src/libfaad/is.c deleted file mode 100644 index 9fcdbcbb5..000000000 --- a/src/libfaad/is.c +++ /dev/null @@ -1,106 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: is.c,v 1.7 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include "syntax.h" -#include "is.h" - -#ifdef FIXED_POINT -static real_t pow05_table[] = { - COEF_CONST(1.68179283050743), /* 0.5^(-3/4) */ - COEF_CONST(1.41421356237310), /* 0.5^(-2/4) */ - COEF_CONST(1.18920711500272), /* 0.5^(-1/4) */ - COEF_CONST(1.0), /* 0.5^( 0/4) */ - COEF_CONST(0.84089641525371), /* 0.5^(+1/4) */ - COEF_CONST(0.70710678118655), /* 0.5^(+2/4) */ - COEF_CONST(0.59460355750136) /* 0.5^(+3/4) */ -}; -#endif - -void is_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, - uint16_t frame_len) -{ - uint8_t g, sfb, b; - uint16_t i; -#ifndef FIXED_POINT - real_t scale; -#else - int32_t exp, frac; -#endif - - uint16_t nshort = frame_len/8; - uint8_t group = 0; - - for (g = 0; g < icsr->num_window_groups; g++) - { - /* Do intensity stereo decoding */ - for (b = 0; b < icsr->window_group_length[g]; b++) - { - for (sfb = 0; sfb < icsr->max_sfb; sfb++) - { - if (is_intensity(icsr, g, sfb)) - { -#ifdef MAIN_DEC - /* For scalefactor bands coded in intensity stereo the - corresponding predictors in the right channel are - switched to "off". - */ - ics->pred.prediction_used[sfb] = 0; - icsr->pred.prediction_used[sfb] = 0; -#endif - -#ifndef FIXED_POINT - scale = (real_t)pow(0.5, (0.25*icsr->scale_factors[g][sfb])); -#else - exp = icsr->scale_factors[g][sfb] >> 2; - frac = icsr->scale_factors[g][sfb] & 3; -#endif - - /* Scale from left to right channel, - do not touch left channel */ - for (i = icsr->swb_offset[sfb]; i < icsr->swb_offset[sfb+1]; i++) - { -#ifndef FIXED_POINT - r_spec[(group*nshort)+i] = MUL_R(l_spec[(group*nshort)+i], scale); -#else - if (exp < 0) - r_spec[(group*nshort)+i] = l_spec[(group*nshort)+i] << -exp; - else - r_spec[(group*nshort)+i] = l_spec[(group*nshort)+i] >> exp; - r_spec[(group*nshort)+i] = MUL_C(r_spec[(group*nshort)+i], pow05_table[frac + 3]); -#endif - if (is_intensity(icsr, g, sfb) != invert_intensity(ics, g, sfb)) - r_spec[(group*nshort)+i] = -r_spec[(group*nshort)+i]; - } - } - } - group++; - } - } -} diff --git a/src/libfaad/is.h b/src/libfaad/is.h deleted file mode 100644 index 0786f7258..000000000 --- a/src/libfaad/is.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: is.h,v 1.7 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#ifndef __IS_H__ -#define __IS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "syntax.h" - -void is_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, - uint16_t frame_len); - -static INLINE int8_t is_intensity(ic_stream *ics, uint8_t group, uint8_t sfb) -{ - switch (ics->sfb_cb[group][sfb]) - { - case INTENSITY_HCB: - return 1; - case INTENSITY_HCB2: - return -1; - default: - return 0; - } -} - -static INLINE int8_t invert_intensity(ic_stream *ics, uint8_t group, uint8_t sfb) -{ - if (ics->ms_mask_present == 1) - return (1-2*ics->ms_used[group][sfb]); - return 1; -} - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/kbd_win.h b/src/libfaad/kbd_win.h deleted file mode 100644 index 046b6b995..000000000 --- a/src/libfaad/kbd_win.h +++ /dev/null @@ -1,2294 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: kbd_win.h,v 1.7 2005/10/29 23:57:06 tmmm Exp $ -**/ - -#ifndef __KBD_WIN_H__ -#define __KBD_WIN_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _MSC_VER -#pragma warning(disable:4305) -#pragma warning(disable:4244) -#endif - -ALIGN static const real_t kbd_long_1024[] = -{ - FRAC_CONST(0.00029256153896361), - FRAC_CONST(0.00042998567353047), - FRAC_CONST(0.00054674074589540), - FRAC_CONST(0.00065482304299792), - FRAC_CONST(0.00075870195068747), - FRAC_CONST(0.00086059331713336), - FRAC_CONST(0.00096177541439010), - FRAC_CONST(0.0010630609410878), - FRAC_CONST(0.0011650036308132), - FRAC_CONST(0.0012680012194148), - FRAC_CONST(0.0013723517232956), - FRAC_CONST(0.0014782864109136), - FRAC_CONST(0.0015859901976719), - FRAC_CONST(0.0016956148252373), - FRAC_CONST(0.0018072876903517), - FRAC_CONST(0.0019211179405514), - FRAC_CONST(0.0020372007924215), - FRAC_CONST(0.0021556206591754), - FRAC_CONST(0.0022764534599614), - FRAC_CONST(0.0023997683540995), - FRAC_CONST(0.0025256290631156), - FRAC_CONST(0.0026540948920831), - FRAC_CONST(0.0027852215281403), - FRAC_CONST(0.0029190616715331), - FRAC_CONST(0.0030556655443223), - FRAC_CONST(0.0031950812943391), - FRAC_CONST(0.0033373553240392), - FRAC_CONST(0.0034825325586930), - FRAC_CONST(0.0036306566699199), - FRAC_CONST(0.0037817702604646), - FRAC_CONST(0.0039359150179719), - FRAC_CONST(0.0040931318437260), - FRAC_CONST(0.0042534609610026), - FRAC_CONST(0.0044169420066964), - FRAC_CONST(0.0045836141091341), - FRAC_CONST(0.0047535159544086), - FRAC_CONST(0.0049266858431214), - FRAC_CONST(0.0051031617390698), - FRAC_CONST(0.0052829813111335), - FRAC_CONST(0.0054661819693975), - FRAC_CONST(0.0056528008963682), - FRAC_CONST(0.0058428750739943), - FRAC_CONST(0.0060364413070882), - FRAC_CONST(0.0062335362436492), - FRAC_CONST(0.0064341963925079), - FRAC_CONST(0.0066384581386503), - FRAC_CONST(0.0068463577565218), - FRAC_CONST(0.0070579314215715), - FRAC_CONST(0.0072732152202559), - FRAC_CONST(0.0074922451586909), - FRAC_CONST(0.0077150571701162), - FRAC_CONST(0.0079416871213115), - FRAC_CONST(0.0081721708180857), - FRAC_CONST(0.0084065440099458), - FRAC_CONST(0.0086448423940363), - FRAC_CONST(0.0088871016184291), - FRAC_CONST(0.0091333572848345), - FRAC_CONST(0.0093836449507939), - FRAC_CONST(0.0096380001314086), - FRAC_CONST(0.0098964583006517), - FRAC_CONST(0.010159054892306), - FRAC_CONST(0.010425825300561), - FRAC_CONST(0.010696804880310), - FRAC_CONST(0.010972028947167), - FRAC_CONST(0.011251532777236), - FRAC_CONST(0.011535351606646), - FRAC_CONST(0.011823520630897), - FRAC_CONST(0.012116075003993), - FRAC_CONST(0.012413049837429), - FRAC_CONST(0.012714480198999), - FRAC_CONST(0.013020401111478), - FRAC_CONST(0.013330847551161), - FRAC_CONST(0.013645854446288), - FRAC_CONST(0.013965456675352), - FRAC_CONST(0.014289689065314), - FRAC_CONST(0.014618586389712), - FRAC_CONST(0.014952183366697), - FRAC_CONST(0.015290514656976), - FRAC_CONST(0.015633614861688), - FRAC_CONST(0.015981518520214), - FRAC_CONST(0.016334260107915), - FRAC_CONST(0.016691874033817), - FRAC_CONST(0.017054394638241), - FRAC_CONST(0.017421856190380), - FRAC_CONST(0.017794292885832), - FRAC_CONST(0.018171738844085), - FRAC_CONST(0.018554228105962), - FRAC_CONST(0.018941794631032), - FRAC_CONST(0.019334472294980), - FRAC_CONST(0.019732294886947), - FRAC_CONST(0.020135296106839), - FRAC_CONST(0.020543509562604), - FRAC_CONST(0.020956968767488), - FRAC_CONST(0.021375707137257), - FRAC_CONST(0.021799757987407), - FRAC_CONST(0.022229154530343), - FRAC_CONST(0.022663929872540), - FRAC_CONST(0.023104117011689), - FRAC_CONST(0.023549748833816), - FRAC_CONST(0.024000858110398), - FRAC_CONST(0.024457477495451), - FRAC_CONST(0.024919639522613), - FRAC_CONST(0.025387376602207), - FRAC_CONST(0.025860721018295), - FRAC_CONST(0.026339704925726), - FRAC_CONST(0.026824360347160), - FRAC_CONST(0.027314719170100), - FRAC_CONST(0.027810813143900), - FRAC_CONST(0.028312673876775), - FRAC_CONST(0.028820332832801), - FRAC_CONST(0.029333821328905), - FRAC_CONST(0.029853170531859), - FRAC_CONST(0.030378411455255), - FRAC_CONST(0.030909574956490), - FRAC_CONST(0.031446691733739), - FRAC_CONST(0.031989792322926), - FRAC_CONST(0.032538907094693), - FRAC_CONST(0.033094066251369), - FRAC_CONST(0.033655299823935), - FRAC_CONST(0.034222637668991), - FRAC_CONST(0.034796109465717), - FRAC_CONST(0.035375744712844), - FRAC_CONST(0.035961572725616), - FRAC_CONST(0.036553622632758), - FRAC_CONST(0.037151923373446), - FRAC_CONST(0.037756503694277), - FRAC_CONST(0.038367392146243), - FRAC_CONST(0.038984617081711), - FRAC_CONST(0.039608206651398), - FRAC_CONST(0.040238188801359), - FRAC_CONST(0.040874591269976), - FRAC_CONST(0.041517441584950), - FRAC_CONST(0.042166767060301), - FRAC_CONST(0.042822594793376), - FRAC_CONST(0.043484951661852), - FRAC_CONST(0.044153864320760), - FRAC_CONST(0.044829359199509), - FRAC_CONST(0.045511462498913), - FRAC_CONST(0.046200200188234), - FRAC_CONST(0.046895598002228), - FRAC_CONST(0.047597681438201), - FRAC_CONST(0.048306475753074), - FRAC_CONST(0.049022005960455), - FRAC_CONST(0.049744296827725), - FRAC_CONST(0.050473372873129), - FRAC_CONST(0.051209258362879), - FRAC_CONST(0.051951977308273), - FRAC_CONST(0.052701553462813), - FRAC_CONST(0.053458010319350), - FRAC_CONST(0.054221371107223), - FRAC_CONST(0.054991658789428), - FRAC_CONST(0.055768896059787), - FRAC_CONST(0.056553105340134), - FRAC_CONST(0.057344308777513), - FRAC_CONST(0.058142528241393), - FRAC_CONST(0.058947785320893), - FRAC_CONST(0.059760101322019), - FRAC_CONST(0.060579497264926), - FRAC_CONST(0.061405993881180), - FRAC_CONST(0.062239611611049), - FRAC_CONST(0.063080370600799), - FRAC_CONST(0.063928290700012), - FRAC_CONST(0.064783391458919), - FRAC_CONST(0.065645692125747), - FRAC_CONST(0.066515211644086), - FRAC_CONST(0.067391968650269), - FRAC_CONST(0.068275981470777), - FRAC_CONST(0.069167268119652), - FRAC_CONST(0.070065846295935), - FRAC_CONST(0.070971733381121), - FRAC_CONST(0.071884946436630), - FRAC_CONST(0.072805502201299), - FRAC_CONST(0.073733417088896), - FRAC_CONST(0.074668707185649), - FRAC_CONST(0.075611388247794), - FRAC_CONST(0.076561475699152), - FRAC_CONST(0.077518984628715), - FRAC_CONST(0.078483929788261), - FRAC_CONST(0.079456325589986), - FRAC_CONST(0.080436186104162), - FRAC_CONST(0.081423525056808), - FRAC_CONST(0.082418355827392), - FRAC_CONST(0.083420691446553), - FRAC_CONST(0.084430544593841), - FRAC_CONST(0.085447927595483), - FRAC_CONST(0.086472852422178), - FRAC_CONST(0.087505330686900), - FRAC_CONST(0.088545373642744), - FRAC_CONST(0.089592992180780), - FRAC_CONST(0.090648196827937), - FRAC_CONST(0.091710997744919), - FRAC_CONST(0.092781404724131), - FRAC_CONST(0.093859427187640), - FRAC_CONST(0.094945074185163), - FRAC_CONST(0.096038354392069), - FRAC_CONST(0.097139276107423), - FRAC_CONST(0.098247847252041), - FRAC_CONST(0.099364075366580), - FRAC_CONST(0.10048796760965), - FRAC_CONST(0.10161953075597), - FRAC_CONST(0.10275877119451), - FRAC_CONST(0.10390569492671), - FRAC_CONST(0.10506030756469), - FRAC_CONST(0.10622261432949), - FRAC_CONST(0.10739262004941), - FRAC_CONST(0.10857032915821), - FRAC_CONST(0.10975574569357), - FRAC_CONST(0.11094887329534), - FRAC_CONST(0.11214971520402), - FRAC_CONST(0.11335827425914), - FRAC_CONST(0.11457455289772), - FRAC_CONST(0.11579855315274), - FRAC_CONST(0.11703027665170), - FRAC_CONST(0.11826972461510), - FRAC_CONST(0.11951689785504), - FRAC_CONST(0.12077179677383), - FRAC_CONST(0.12203442136263), - FRAC_CONST(0.12330477120008), - FRAC_CONST(0.12458284545102), - FRAC_CONST(0.12586864286523), - FRAC_CONST(0.12716216177615), - FRAC_CONST(0.12846340009971), - FRAC_CONST(0.12977235533312), - FRAC_CONST(0.13108902455375), - FRAC_CONST(0.13241340441801), - FRAC_CONST(0.13374549116025), - FRAC_CONST(0.13508528059173), - FRAC_CONST(0.13643276809961), - FRAC_CONST(0.13778794864595), - FRAC_CONST(0.13915081676677), - FRAC_CONST(0.14052136657114), - FRAC_CONST(0.14189959174027), - FRAC_CONST(0.14328548552671), - FRAC_CONST(0.14467904075349), - FRAC_CONST(0.14608024981336), - FRAC_CONST(0.14748910466804), - FRAC_CONST(0.14890559684750), - FRAC_CONST(0.15032971744929), - FRAC_CONST(0.15176145713790), - FRAC_CONST(0.15320080614414), - FRAC_CONST(0.15464775426459), - FRAC_CONST(0.15610229086100), - FRAC_CONST(0.15756440485987), - FRAC_CONST(0.15903408475193), - FRAC_CONST(0.16051131859170), - FRAC_CONST(0.16199609399712), - FRAC_CONST(0.16348839814917), - FRAC_CONST(0.16498821779156), - FRAC_CONST(0.16649553923042), - FRAC_CONST(0.16801034833404), - FRAC_CONST(0.16953263053270), - FRAC_CONST(0.17106237081842), - FRAC_CONST(0.17259955374484), - FRAC_CONST(0.17414416342714), - FRAC_CONST(0.17569618354193), - FRAC_CONST(0.17725559732720), - FRAC_CONST(0.17882238758238), - FRAC_CONST(0.18039653666830), - FRAC_CONST(0.18197802650733), - FRAC_CONST(0.18356683858343), - FRAC_CONST(0.18516295394233), - FRAC_CONST(0.18676635319174), - FRAC_CONST(0.18837701650148), - FRAC_CONST(0.18999492360384), - FRAC_CONST(0.19162005379380), - FRAC_CONST(0.19325238592940), - FRAC_CONST(0.19489189843209), - FRAC_CONST(0.19653856928714), - FRAC_CONST(0.19819237604409), - FRAC_CONST(0.19985329581721), - FRAC_CONST(0.20152130528605), - FRAC_CONST(0.20319638069594), - FRAC_CONST(0.20487849785865), - FRAC_CONST(0.20656763215298), - FRAC_CONST(0.20826375852540), - FRAC_CONST(0.20996685149083), - FRAC_CONST(0.21167688513330), - FRAC_CONST(0.21339383310678), - FRAC_CONST(0.21511766863598), - FRAC_CONST(0.21684836451719), - FRAC_CONST(0.21858589311922), - FRAC_CONST(0.22033022638425), - FRAC_CONST(0.22208133582887), - FRAC_CONST(0.22383919254503), - FRAC_CONST(0.22560376720111), - FRAC_CONST(0.22737503004300), - FRAC_CONST(0.22915295089517), - FRAC_CONST(0.23093749916189), - FRAC_CONST(0.23272864382838), - FRAC_CONST(0.23452635346201), - FRAC_CONST(0.23633059621364), - FRAC_CONST(0.23814133981883), - FRAC_CONST(0.23995855159925), - FRAC_CONST(0.24178219846403), - FRAC_CONST(0.24361224691114), - FRAC_CONST(0.24544866302890), - FRAC_CONST(0.24729141249740), - FRAC_CONST(0.24914046059007), - FRAC_CONST(0.25099577217522), - FRAC_CONST(0.25285731171763), - FRAC_CONST(0.25472504328019), - FRAC_CONST(0.25659893052556), - FRAC_CONST(0.25847893671788), - FRAC_CONST(0.26036502472451), - FRAC_CONST(0.26225715701781), - FRAC_CONST(0.26415529567692), - FRAC_CONST(0.26605940238966), - FRAC_CONST(0.26796943845439), - FRAC_CONST(0.26988536478190), - FRAC_CONST(0.27180714189742), - FRAC_CONST(0.27373472994256), - FRAC_CONST(0.27566808867736), - FRAC_CONST(0.27760717748238), - FRAC_CONST(0.27955195536071), - FRAC_CONST(0.28150238094021), - FRAC_CONST(0.28345841247557), - FRAC_CONST(0.28542000785059), - FRAC_CONST(0.28738712458038), - FRAC_CONST(0.28935971981364), - FRAC_CONST(0.29133775033492), - FRAC_CONST(0.29332117256704), - FRAC_CONST(0.29530994257338), - FRAC_CONST(0.29730401606034), - FRAC_CONST(0.29930334837974), - FRAC_CONST(0.30130789453132), - FRAC_CONST(0.30331760916521), - FRAC_CONST(0.30533244658452), - FRAC_CONST(0.30735236074785), - FRAC_CONST(0.30937730527195), - FRAC_CONST(0.31140723343430), - FRAC_CONST(0.31344209817583), - FRAC_CONST(0.31548185210356), - FRAC_CONST(0.31752644749341), - FRAC_CONST(0.31957583629288), - FRAC_CONST(0.32162997012390), - FRAC_CONST(0.32368880028565), - FRAC_CONST(0.32575227775738), - FRAC_CONST(0.32782035320134), - FRAC_CONST(0.32989297696566), - FRAC_CONST(0.33197009908736), - FRAC_CONST(0.33405166929523), - FRAC_CONST(0.33613763701295), - FRAC_CONST(0.33822795136203), - FRAC_CONST(0.34032256116495), - FRAC_CONST(0.34242141494820), - FRAC_CONST(0.34452446094547), - FRAC_CONST(0.34663164710072), - FRAC_CONST(0.34874292107143), - FRAC_CONST(0.35085823023181), - FRAC_CONST(0.35297752167598), - FRAC_CONST(0.35510074222129), - FRAC_CONST(0.35722783841160), - FRAC_CONST(0.35935875652060), - FRAC_CONST(0.36149344255514), - FRAC_CONST(0.36363184225864), - FRAC_CONST(0.36577390111444), - FRAC_CONST(0.36791956434930), - FRAC_CONST(0.37006877693676), - FRAC_CONST(0.37222148360070), - FRAC_CONST(0.37437762881878), - FRAC_CONST(0.37653715682603), - FRAC_CONST(0.37870001161834), - FRAC_CONST(0.38086613695607), - FRAC_CONST(0.38303547636766), - FRAC_CONST(0.38520797315322), - FRAC_CONST(0.38738357038821), - FRAC_CONST(0.38956221092708), - FRAC_CONST(0.39174383740701), - FRAC_CONST(0.39392839225157), - FRAC_CONST(0.39611581767449), - FRAC_CONST(0.39830605568342), - FRAC_CONST(0.40049904808370), - FRAC_CONST(0.40269473648218), - FRAC_CONST(0.40489306229101), - FRAC_CONST(0.40709396673153), - FRAC_CONST(0.40929739083810), - FRAC_CONST(0.41150327546197), - FRAC_CONST(0.41371156127524), - FRAC_CONST(0.41592218877472), - FRAC_CONST(0.41813509828594), - FRAC_CONST(0.42035022996702), - FRAC_CONST(0.42256752381274), - FRAC_CONST(0.42478691965848), - FRAC_CONST(0.42700835718423), - FRAC_CONST(0.42923177591866), - FRAC_CONST(0.43145711524314), - FRAC_CONST(0.43368431439580), - FRAC_CONST(0.43591331247564), - FRAC_CONST(0.43814404844658), - FRAC_CONST(0.44037646114161), - FRAC_CONST(0.44261048926688), - FRAC_CONST(0.44484607140589), - FRAC_CONST(0.44708314602359), - FRAC_CONST(0.44932165147057), - FRAC_CONST(0.45156152598727), - FRAC_CONST(0.45380270770813), - FRAC_CONST(0.45604513466581), - FRAC_CONST(0.45828874479543), - FRAC_CONST(0.46053347593880), - FRAC_CONST(0.46277926584861), - FRAC_CONST(0.46502605219277), - FRAC_CONST(0.46727377255861), - FRAC_CONST(0.46952236445718), - FRAC_CONST(0.47177176532752), - FRAC_CONST(0.47402191254100), - FRAC_CONST(0.47627274340557), - FRAC_CONST(0.47852419517009), - FRAC_CONST(0.48077620502869), - FRAC_CONST(0.48302871012505), - FRAC_CONST(0.48528164755674), - FRAC_CONST(0.48753495437962), - FRAC_CONST(0.48978856761212), - FRAC_CONST(0.49204242423966), - FRAC_CONST(0.49429646121898), - FRAC_CONST(0.49655061548250), - FRAC_CONST(0.49880482394273), - FRAC_CONST(0.50105902349665), - FRAC_CONST(0.50331315103004), - FRAC_CONST(0.50556714342194), - FRAC_CONST(0.50782093754901), - FRAC_CONST(0.51007447028990), - FRAC_CONST(0.51232767852971), - FRAC_CONST(0.51458049916433), - FRAC_CONST(0.51683286910489), - FRAC_CONST(0.51908472528213), - FRAC_CONST(0.52133600465083), - FRAC_CONST(0.52358664419420), - FRAC_CONST(0.52583658092832), - FRAC_CONST(0.52808575190648), - FRAC_CONST(0.53033409422367), - FRAC_CONST(0.53258154502092), - FRAC_CONST(0.53482804148974), - FRAC_CONST(0.53707352087652), - FRAC_CONST(0.53931792048690), - FRAC_CONST(0.54156117769021), - FRAC_CONST(0.54380322992385), - FRAC_CONST(0.54604401469766), - FRAC_CONST(0.54828346959835), - FRAC_CONST(0.55052153229384), - FRAC_CONST(0.55275814053768), - FRAC_CONST(0.55499323217338), - FRAC_CONST(0.55722674513883), - FRAC_CONST(0.55945861747062), - FRAC_CONST(0.56168878730842), - FRAC_CONST(0.56391719289930), - FRAC_CONST(0.56614377260214), - FRAC_CONST(0.56836846489188), - FRAC_CONST(0.57059120836390), - FRAC_CONST(0.57281194173835), - FRAC_CONST(0.57503060386439), - FRAC_CONST(0.57724713372458), - FRAC_CONST(0.57946147043912), - FRAC_CONST(0.58167355327012), - FRAC_CONST(0.58388332162591), - FRAC_CONST(0.58609071506528), - FRAC_CONST(0.58829567330173), - FRAC_CONST(0.59049813620770), - FRAC_CONST(0.59269804381879), - FRAC_CONST(0.59489533633802), - FRAC_CONST(0.59708995413996), - FRAC_CONST(0.59928183777495), - FRAC_CONST(0.60147092797329), - FRAC_CONST(0.60365716564937), - FRAC_CONST(0.60584049190582), - FRAC_CONST(0.60802084803764), - FRAC_CONST(0.61019817553632), - FRAC_CONST(0.61237241609393), - FRAC_CONST(0.61454351160718), - FRAC_CONST(0.61671140418155), - FRAC_CONST(0.61887603613527), - FRAC_CONST(0.62103735000336), - FRAC_CONST(0.62319528854167), - FRAC_CONST(0.62534979473088), - FRAC_CONST(0.62750081178042), - FRAC_CONST(0.62964828313250), - FRAC_CONST(0.63179215246597), - FRAC_CONST(0.63393236370030), - FRAC_CONST(0.63606886099946), - FRAC_CONST(0.63820158877577), - FRAC_CONST(0.64033049169379), - FRAC_CONST(0.64245551467413), - FRAC_CONST(0.64457660289729), - FRAC_CONST(0.64669370180740), - FRAC_CONST(0.64880675711607), - FRAC_CONST(0.65091571480603), - FRAC_CONST(0.65302052113494), - FRAC_CONST(0.65512112263906), - FRAC_CONST(0.65721746613689), - FRAC_CONST(0.65930949873289), - FRAC_CONST(0.66139716782102), - FRAC_CONST(0.66348042108842), - FRAC_CONST(0.66555920651892), - FRAC_CONST(0.66763347239664), - FRAC_CONST(0.66970316730947), - FRAC_CONST(0.67176824015260), - FRAC_CONST(0.67382864013196), - FRAC_CONST(0.67588431676768), - FRAC_CONST(0.67793521989751), - FRAC_CONST(0.67998129968017), - FRAC_CONST(0.68202250659876), - FRAC_CONST(0.68405879146403), - FRAC_CONST(0.68609010541774), - FRAC_CONST(0.68811639993588), - FRAC_CONST(0.69013762683195), - FRAC_CONST(0.69215373826012), - FRAC_CONST(0.69416468671849), - FRAC_CONST(0.69617042505214), - FRAC_CONST(0.69817090645634), - FRAC_CONST(0.70016608447958), - FRAC_CONST(0.70215591302664), - FRAC_CONST(0.70414034636163), - FRAC_CONST(0.70611933911096), - FRAC_CONST(0.70809284626630), - FRAC_CONST(0.71006082318751), - FRAC_CONST(0.71202322560554), - FRAC_CONST(0.71398000962530), - FRAC_CONST(0.71593113172842), - FRAC_CONST(0.71787654877613), - FRAC_CONST(0.71981621801195), - FRAC_CONST(0.72175009706445), - FRAC_CONST(0.72367814394990), - FRAC_CONST(0.72560031707496), - FRAC_CONST(0.72751657523927), - FRAC_CONST(0.72942687763803), - FRAC_CONST(0.73133118386457), - FRAC_CONST(0.73322945391280), - FRAC_CONST(0.73512164817975), - FRAC_CONST(0.73700772746796), - FRAC_CONST(0.73888765298787), - FRAC_CONST(0.74076138636020), - FRAC_CONST(0.74262888961827), - FRAC_CONST(0.74449012521027), - FRAC_CONST(0.74634505600152), - FRAC_CONST(0.74819364527663), - FRAC_CONST(0.75003585674175), - FRAC_CONST(0.75187165452661), - FRAC_CONST(0.75370100318668), - FRAC_CONST(0.75552386770515), - FRAC_CONST(0.75734021349500), - FRAC_CONST(0.75915000640095), - FRAC_CONST(0.76095321270137), - FRAC_CONST(0.76274979911019), - FRAC_CONST(0.76453973277875), - FRAC_CONST(0.76632298129757), - FRAC_CONST(0.76809951269819), - FRAC_CONST(0.76986929545481), - FRAC_CONST(0.77163229848604), - FRAC_CONST(0.77338849115651), - FRAC_CONST(0.77513784327849), - FRAC_CONST(0.77688032511340), - FRAC_CONST(0.77861590737340), - FRAC_CONST(0.78034456122283), - FRAC_CONST(0.78206625827961), - FRAC_CONST(0.78378097061667), - FRAC_CONST(0.78548867076330), - FRAC_CONST(0.78718933170643), - FRAC_CONST(0.78888292689189), - FRAC_CONST(0.79056943022564), - FRAC_CONST(0.79224881607494), - FRAC_CONST(0.79392105926949), - FRAC_CONST(0.79558613510249), - FRAC_CONST(0.79724401933170), - FRAC_CONST(0.79889468818046), - FRAC_CONST(0.80053811833858), - FRAC_CONST(0.80217428696334), - FRAC_CONST(0.80380317168028), - FRAC_CONST(0.80542475058405), - FRAC_CONST(0.80703900223920), - FRAC_CONST(0.80864590568089), - FRAC_CONST(0.81024544041560), - FRAC_CONST(0.81183758642175), - FRAC_CONST(0.81342232415032), - FRAC_CONST(0.81499963452540), - FRAC_CONST(0.81656949894467), - FRAC_CONST(0.81813189927991), - FRAC_CONST(0.81968681787738), - FRAC_CONST(0.82123423755821), - FRAC_CONST(0.82277414161874), - FRAC_CONST(0.82430651383076), - FRAC_CONST(0.82583133844180), - FRAC_CONST(0.82734860017528), - FRAC_CONST(0.82885828423070), - FRAC_CONST(0.83036037628369), - FRAC_CONST(0.83185486248609), - FRAC_CONST(0.83334172946597), - FRAC_CONST(0.83482096432759), - FRAC_CONST(0.83629255465130), - FRAC_CONST(0.83775648849344), - FRAC_CONST(0.83921275438615), - FRAC_CONST(0.84066134133716), - FRAC_CONST(0.84210223882952), - FRAC_CONST(0.84353543682130), - FRAC_CONST(0.84496092574524), - FRAC_CONST(0.84637869650833), - FRAC_CONST(0.84778874049138), - FRAC_CONST(0.84919104954855), - FRAC_CONST(0.85058561600677), - FRAC_CONST(0.85197243266520), - FRAC_CONST(0.85335149279457), - FRAC_CONST(0.85472279013653), - FRAC_CONST(0.85608631890295), - FRAC_CONST(0.85744207377513), - FRAC_CONST(0.85879004990298), - FRAC_CONST(0.86013024290422), - FRAC_CONST(0.86146264886346), - FRAC_CONST(0.86278726433124), - FRAC_CONST(0.86410408632306), - FRAC_CONST(0.86541311231838), - FRAC_CONST(0.86671434025950), - FRAC_CONST(0.86800776855046), - FRAC_CONST(0.86929339605590), - FRAC_CONST(0.87057122209981), - FRAC_CONST(0.87184124646433), - FRAC_CONST(0.87310346938840), - FRAC_CONST(0.87435789156650), - FRAC_CONST(0.87560451414719), - FRAC_CONST(0.87684333873173), - FRAC_CONST(0.87807436737261), - FRAC_CONST(0.87929760257204), - FRAC_CONST(0.88051304728038), - FRAC_CONST(0.88172070489456), - FRAC_CONST(0.88292057925645), - FRAC_CONST(0.88411267465117), - FRAC_CONST(0.88529699580537), - FRAC_CONST(0.88647354788545), - FRAC_CONST(0.88764233649580), - FRAC_CONST(0.88880336767692), - FRAC_CONST(0.88995664790351), - FRAC_CONST(0.89110218408260), - FRAC_CONST(0.89223998355154), - FRAC_CONST(0.89337005407600), - FRAC_CONST(0.89449240384793), - FRAC_CONST(0.89560704148345), - FRAC_CONST(0.89671397602074), - FRAC_CONST(0.89781321691786), - FRAC_CONST(0.89890477405053), - FRAC_CONST(0.89998865770993), - FRAC_CONST(0.90106487860034), - FRAC_CONST(0.90213344783689), - FRAC_CONST(0.90319437694315), - FRAC_CONST(0.90424767784873), - FRAC_CONST(0.90529336288690), - FRAC_CONST(0.90633144479201), - FRAC_CONST(0.90736193669708), - FRAC_CONST(0.90838485213119), - FRAC_CONST(0.90940020501694), - FRAC_CONST(0.91040800966776), - FRAC_CONST(0.91140828078533), - FRAC_CONST(0.91240103345685), - FRAC_CONST(0.91338628315231), - FRAC_CONST(0.91436404572173), - FRAC_CONST(0.91533433739238), - FRAC_CONST(0.91629717476594), - FRAC_CONST(0.91725257481564), - FRAC_CONST(0.91820055488334), - FRAC_CONST(0.91914113267664), - FRAC_CONST(0.92007432626589), - FRAC_CONST(0.92100015408120), - FRAC_CONST(0.92191863490944), - FRAC_CONST(0.92282978789113), - FRAC_CONST(0.92373363251740), - FRAC_CONST(0.92463018862687), - FRAC_CONST(0.92551947640245), - FRAC_CONST(0.92640151636824), - FRAC_CONST(0.92727632938624), - FRAC_CONST(0.92814393665320), - FRAC_CONST(0.92900435969727), - FRAC_CONST(0.92985762037477), - FRAC_CONST(0.93070374086684), - FRAC_CONST(0.93154274367610), - FRAC_CONST(0.93237465162328), - FRAC_CONST(0.93319948784382), - FRAC_CONST(0.93401727578443), - FRAC_CONST(0.93482803919967), - FRAC_CONST(0.93563180214841), - FRAC_CONST(0.93642858899043), - FRAC_CONST(0.93721842438279), - FRAC_CONST(0.93800133327637), - FRAC_CONST(0.93877734091223), - FRAC_CONST(0.93954647281807), - FRAC_CONST(0.94030875480458), - FRAC_CONST(0.94106421296182), - FRAC_CONST(0.94181287365556), - FRAC_CONST(0.94255476352362), - FRAC_CONST(0.94328990947213), - FRAC_CONST(0.94401833867184), - FRAC_CONST(0.94474007855439), - FRAC_CONST(0.94545515680855), - FRAC_CONST(0.94616360137644), - FRAC_CONST(0.94686544044975), - FRAC_CONST(0.94756070246592), - FRAC_CONST(0.94824941610434), - FRAC_CONST(0.94893161028248), - FRAC_CONST(0.94960731415209), - FRAC_CONST(0.95027655709525), - FRAC_CONST(0.95093936872056), - FRAC_CONST(0.95159577885924), - FRAC_CONST(0.95224581756115), - FRAC_CONST(0.95288951509097), - FRAC_CONST(0.95352690192417), - FRAC_CONST(0.95415800874314), - FRAC_CONST(0.95478286643320), - FRAC_CONST(0.95540150607863), - FRAC_CONST(0.95601395895871), - FRAC_CONST(0.95662025654373), - FRAC_CONST(0.95722043049100), - FRAC_CONST(0.95781451264084), - FRAC_CONST(0.95840253501260), - FRAC_CONST(0.95898452980058), - FRAC_CONST(0.95956052937008), - FRAC_CONST(0.96013056625336), - FRAC_CONST(0.96069467314557), - FRAC_CONST(0.96125288290073), - FRAC_CONST(0.96180522852773), - FRAC_CONST(0.96235174318622), - FRAC_CONST(0.96289246018262), - FRAC_CONST(0.96342741296604), - FRAC_CONST(0.96395663512424), - FRAC_CONST(0.96448016037959), - FRAC_CONST(0.96499802258499), - FRAC_CONST(0.96551025571985), - FRAC_CONST(0.96601689388602), - FRAC_CONST(0.96651797130376), - FRAC_CONST(0.96701352230768), - FRAC_CONST(0.96750358134269), - FRAC_CONST(0.96798818295998), - FRAC_CONST(0.96846736181297), - FRAC_CONST(0.96894115265327), - FRAC_CONST(0.96940959032667), - FRAC_CONST(0.96987270976912), - FRAC_CONST(0.97033054600270), - FRAC_CONST(0.97078313413161), - FRAC_CONST(0.97123050933818), - FRAC_CONST(0.97167270687887), - FRAC_CONST(0.97210976208030), - FRAC_CONST(0.97254171033525), - FRAC_CONST(0.97296858709871), - FRAC_CONST(0.97339042788392), - FRAC_CONST(0.97380726825843), - FRAC_CONST(0.97421914384017), - FRAC_CONST(0.97462609029350), - FRAC_CONST(0.97502814332534), - FRAC_CONST(0.97542533868127), - FRAC_CONST(0.97581771214160), - FRAC_CONST(0.97620529951759), - FRAC_CONST(0.97658813664749), - FRAC_CONST(0.97696625939282), - FRAC_CONST(0.97733970363445), - FRAC_CONST(0.97770850526884), - FRAC_CONST(0.97807270020427), - FRAC_CONST(0.97843232435704), - FRAC_CONST(0.97878741364771), - FRAC_CONST(0.97913800399743), - FRAC_CONST(0.97948413132414), - FRAC_CONST(0.97982583153895), - FRAC_CONST(0.98016314054243), - FRAC_CONST(0.98049609422096), - FRAC_CONST(0.98082472844313), - FRAC_CONST(0.98114907905608), - FRAC_CONST(0.98146918188197), - FRAC_CONST(0.98178507271438), - FRAC_CONST(0.98209678731477), - FRAC_CONST(0.98240436140902), - FRAC_CONST(0.98270783068385), - FRAC_CONST(0.98300723078342), - FRAC_CONST(0.98330259730589), - FRAC_CONST(0.98359396579995), - FRAC_CONST(0.98388137176152), - FRAC_CONST(0.98416485063031), - FRAC_CONST(0.98444443778651), - FRAC_CONST(0.98472016854752), - FRAC_CONST(0.98499207816463), - FRAC_CONST(0.98526020181980), - FRAC_CONST(0.98552457462240), - FRAC_CONST(0.98578523160609), - FRAC_CONST(0.98604220772560), - FRAC_CONST(0.98629553785362), - FRAC_CONST(0.98654525677772), - FRAC_CONST(0.98679139919726), - FRAC_CONST(0.98703399972035), - FRAC_CONST(0.98727309286089), - FRAC_CONST(0.98750871303556), - FRAC_CONST(0.98774089456089), - FRAC_CONST(0.98796967165036), - FRAC_CONST(0.98819507841154), - FRAC_CONST(0.98841714884323), - FRAC_CONST(0.98863591683269), - FRAC_CONST(0.98885141615285), - FRAC_CONST(0.98906368045957), - FRAC_CONST(0.98927274328896), - FRAC_CONST(0.98947863805473), - FRAC_CONST(0.98968139804554), - FRAC_CONST(0.98988105642241), - FRAC_CONST(0.99007764621618), - FRAC_CONST(0.99027120032501), - FRAC_CONST(0.99046175151186), - FRAC_CONST(0.99064933240208), - FRAC_CONST(0.99083397548099), - FRAC_CONST(0.99101571309153), - FRAC_CONST(0.99119457743191), - FRAC_CONST(0.99137060055337), - FRAC_CONST(0.99154381435784), - FRAC_CONST(0.99171425059582), - FRAC_CONST(0.99188194086414), - FRAC_CONST(0.99204691660388), - FRAC_CONST(0.99220920909823), - FRAC_CONST(0.99236884947045), - FRAC_CONST(0.99252586868186), - FRAC_CONST(0.99268029752989), - FRAC_CONST(0.99283216664606), - FRAC_CONST(0.99298150649419), - FRAC_CONST(0.99312834736847), - FRAC_CONST(0.99327271939167), - FRAC_CONST(0.99341465251338), - FRAC_CONST(0.99355417650825), - FRAC_CONST(0.99369132097430), - FRAC_CONST(0.99382611533130), - FRAC_CONST(0.99395858881910), - FRAC_CONST(0.99408877049612), - FRAC_CONST(0.99421668923778), - FRAC_CONST(0.99434237373503), - FRAC_CONST(0.99446585249289), - FRAC_CONST(0.99458715382906), - FRAC_CONST(0.99470630587254), - FRAC_CONST(0.99482333656229), - FRAC_CONST(0.99493827364600), - FRAC_CONST(0.99505114467878), - FRAC_CONST(0.99516197702200), - FRAC_CONST(0.99527079784214), - FRAC_CONST(0.99537763410962), - FRAC_CONST(0.99548251259777), - FRAC_CONST(0.99558545988178), - FRAC_CONST(0.99568650233767), - FRAC_CONST(0.99578566614138), - FRAC_CONST(0.99588297726783), - FRAC_CONST(0.99597846149005), - FRAC_CONST(0.99607214437834), - FRAC_CONST(0.99616405129947), - FRAC_CONST(0.99625420741595), - FRAC_CONST(0.99634263768527), - FRAC_CONST(0.99642936685928), - FRAC_CONST(0.99651441948352), - FRAC_CONST(0.99659781989663), - FRAC_CONST(0.99667959222978), - FRAC_CONST(0.99675976040620), - FRAC_CONST(0.99683834814063), - FRAC_CONST(0.99691537893895), - FRAC_CONST(0.99699087609774), - FRAC_CONST(0.99706486270391), - FRAC_CONST(0.99713736163442), - FRAC_CONST(0.99720839555593), - FRAC_CONST(0.99727798692461), - FRAC_CONST(0.99734615798589), - FRAC_CONST(0.99741293077431), - FRAC_CONST(0.99747832711337), - FRAC_CONST(0.99754236861541), - FRAC_CONST(0.99760507668158), - FRAC_CONST(0.99766647250181), - FRAC_CONST(0.99772657705478), - FRAC_CONST(0.99778541110799), - FRAC_CONST(0.99784299521785), - FRAC_CONST(0.99789934972976), - FRAC_CONST(0.99795449477828), - FRAC_CONST(0.99800845028730), - FRAC_CONST(0.99806123597027), - FRAC_CONST(0.99811287133042), - FRAC_CONST(0.99816337566108), - FRAC_CONST(0.99821276804596), - FRAC_CONST(0.99826106735952), - FRAC_CONST(0.99830829226732), - FRAC_CONST(0.99835446122649), - FRAC_CONST(0.99839959248609), - FRAC_CONST(0.99844370408765), - FRAC_CONST(0.99848681386566), - FRAC_CONST(0.99852893944805), - FRAC_CONST(0.99857009825685), - FRAC_CONST(0.99861030750869), - FRAC_CONST(0.99864958421549), - FRAC_CONST(0.99868794518504), - FRAC_CONST(0.99872540702178), - FRAC_CONST(0.99876198612738), - FRAC_CONST(0.99879769870160), - FRAC_CONST(0.99883256074295), - FRAC_CONST(0.99886658804953), - FRAC_CONST(0.99889979621983), - FRAC_CONST(0.99893220065356), - FRAC_CONST(0.99896381655254), - FRAC_CONST(0.99899465892154), - FRAC_CONST(0.99902474256924), - FRAC_CONST(0.99905408210916), - FRAC_CONST(0.99908269196056), - FRAC_CONST(0.99911058634952), - FRAC_CONST(0.99913777930986), - FRAC_CONST(0.99916428468421), - FRAC_CONST(0.99919011612505), - FRAC_CONST(0.99921528709576), - FRAC_CONST(0.99923981087174), - FRAC_CONST(0.99926370054150), - FRAC_CONST(0.99928696900779), - FRAC_CONST(0.99930962898876), - FRAC_CONST(0.99933169301910), - FRAC_CONST(0.99935317345126), - FRAC_CONST(0.99937408245662), - FRAC_CONST(0.99939443202674), - FRAC_CONST(0.99941423397457), - FRAC_CONST(0.99943349993572), - FRAC_CONST(0.99945224136972), - FRAC_CONST(0.99947046956130), - FRAC_CONST(0.99948819562171), - FRAC_CONST(0.99950543049000), - FRAC_CONST(0.99952218493439), - FRAC_CONST(0.99953846955355), - FRAC_CONST(0.99955429477803), - FRAC_CONST(0.99956967087154), - FRAC_CONST(0.99958460793242), - FRAC_CONST(0.99959911589494), - FRAC_CONST(0.99961320453077), - FRAC_CONST(0.99962688345035), - FRAC_CONST(0.99964016210433), - FRAC_CONST(0.99965304978499), - FRAC_CONST(0.99966555562769), - FRAC_CONST(0.99967768861231), - FRAC_CONST(0.99968945756473), - FRAC_CONST(0.99970087115825), - FRAC_CONST(0.99971193791510), - FRAC_CONST(0.99972266620792), - FRAC_CONST(0.99973306426121), - FRAC_CONST(0.99974314015288), - FRAC_CONST(0.99975290181568), - FRAC_CONST(0.99976235703876), - FRAC_CONST(0.99977151346914), - FRAC_CONST(0.99978037861326), - FRAC_CONST(0.99978895983845), - FRAC_CONST(0.99979726437448), - FRAC_CONST(0.99980529931507), - FRAC_CONST(0.99981307161943), - FRAC_CONST(0.99982058811377), - FRAC_CONST(0.99982785549283), - FRAC_CONST(0.99983488032144), - FRAC_CONST(0.99984166903600), - FRAC_CONST(0.99984822794606), - FRAC_CONST(0.99985456323584), - FRAC_CONST(0.99986068096572), - FRAC_CONST(0.99986658707386), - FRAC_CONST(0.99987228737764), - FRAC_CONST(0.99987778757524), - FRAC_CONST(0.99988309324717), - FRAC_CONST(0.99988820985777), - FRAC_CONST(0.99989314275675), - FRAC_CONST(0.99989789718072), - FRAC_CONST(0.99990247825468), - FRAC_CONST(0.99990689099357), - FRAC_CONST(0.99991114030376), - FRAC_CONST(0.99991523098456), - FRAC_CONST(0.99991916772971), - FRAC_CONST(0.99992295512891), - FRAC_CONST(0.99992659766930), - FRAC_CONST(0.99993009973692), - FRAC_CONST(0.99993346561824), - FRAC_CONST(0.99993669950161), - FRAC_CONST(0.99993980547870), - FRAC_CONST(0.99994278754604), - FRAC_CONST(0.99994564960642), - FRAC_CONST(0.99994839547033), - FRAC_CONST(0.99995102885747), - FRAC_CONST(0.99995355339809), - FRAC_CONST(0.99995597263451), - FRAC_CONST(0.99995829002249), - FRAC_CONST(0.99996050893264), - FRAC_CONST(0.99996263265183), - FRAC_CONST(0.99996466438460), - FRAC_CONST(0.99996660725452), - FRAC_CONST(0.99996846430558), - FRAC_CONST(0.99997023850356), - FRAC_CONST(0.99997193273736), - FRAC_CONST(0.99997354982037), - FRAC_CONST(0.99997509249183), - FRAC_CONST(0.99997656341810), - FRAC_CONST(0.99997796519400), - FRAC_CONST(0.99997930034415), - FRAC_CONST(0.99998057132421), - FRAC_CONST(0.99998178052220), - FRAC_CONST(0.99998293025975), - FRAC_CONST(0.99998402279338), - FRAC_CONST(0.99998506031574), - FRAC_CONST(0.99998604495686), - FRAC_CONST(0.99998697878536), - FRAC_CONST(0.99998786380966), - FRAC_CONST(0.99998870197921), - FRAC_CONST(0.99998949518567), - FRAC_CONST(0.99999024526408), - FRAC_CONST(0.99999095399401), - FRAC_CONST(0.99999162310077), - FRAC_CONST(0.99999225425649), - FRAC_CONST(0.99999284908128), - FRAC_CONST(0.99999340914435), - FRAC_CONST(0.99999393596510), - FRAC_CONST(0.99999443101421), - FRAC_CONST(0.99999489571473), - FRAC_CONST(0.99999533144314), - FRAC_CONST(0.99999573953040), - FRAC_CONST(0.99999612126300), - FRAC_CONST(0.99999647788395), - FRAC_CONST(0.99999681059383), - FRAC_CONST(0.99999712055178), - FRAC_CONST(0.99999740887647), - FRAC_CONST(0.99999767664709), - FRAC_CONST(0.99999792490431), - FRAC_CONST(0.99999815465123), - FRAC_CONST(0.99999836685427), - FRAC_CONST(0.99999856244415), - FRAC_CONST(0.99999874231676), - FRAC_CONST(0.99999890733405), - FRAC_CONST(0.99999905832493), - FRAC_CONST(0.99999919608613), - FRAC_CONST(0.99999932138304), - FRAC_CONST(0.99999943495056), - FRAC_CONST(0.99999953749392), - FRAC_CONST(0.99999962968950), - FRAC_CONST(0.99999971218563), - FRAC_CONST(0.99999978560337), - FRAC_CONST(0.99999985053727), - FRAC_CONST(0.99999990755616), - FRAC_CONST(0.99999995720387) -}; - -#ifdef ALLOW_SMALL_FRAMELENGTH -ALIGN static const real_t kbd_long_960[] = { - FRAC_CONST(0.0003021562530949), - FRAC_CONST(0.0004452267024786), - FRAC_CONST(0.0005674947527496), - FRAC_CONST(0.0006812465553466), - FRAC_CONST(0.0007910496776387), - FRAC_CONST(0.0008991655033895), - FRAC_CONST(0.0010068978259384), - FRAC_CONST(0.0011150758515751), - FRAC_CONST(0.0012242653193642), - FRAC_CONST(0.0013348735658205), - FRAC_CONST(0.0014472068670273), - FRAC_CONST(0.0015615039850448), - FRAC_CONST(0.0016779568885263), - FRAC_CONST(0.0017967241232412), - FRAC_CONST(0.0019179397560955), - FRAC_CONST(0.0020417195415393), - FRAC_CONST(0.0021681652836642), - FRAC_CONST(0.0022973679910599), - FRAC_CONST(0.0024294102029937), - FRAC_CONST(0.0025643677339078), - FRAC_CONST(0.0027023110014772), - FRAC_CONST(0.0028433060512612), - FRAC_CONST(0.0029874153568025), - FRAC_CONST(0.0031346984511728), - FRAC_CONST(0.0032852124303662), - FRAC_CONST(0.0034390123581190), - FRAC_CONST(0.0035961515940931), - FRAC_CONST(0.0037566820618961), - FRAC_CONST(0.0039206544694386), - FRAC_CONST(0.0040881184912194), - FRAC_CONST(0.0042591229199617), - FRAC_CONST(0.0044337157933972), - FRAC_CONST(0.0046119445007641), - FRAC_CONST(0.0047938558726415), - FRAC_CONST(0.0049794962570131), - FRAC_CONST(0.0051689115838900), - FRAC_CONST(0.0053621474203763), - FRAC_CONST(0.0055592490177131), - FRAC_CONST(0.0057602613515573), - FRAC_CONST(0.0059652291565289), - FRAC_CONST(0.0061741969558843), - FRAC_CONST(0.0063872090870253), - FRAC_CONST(0.0066043097234387), - FRAC_CONST(0.0068255428935640), - FRAC_CONST(0.0070509524970088), - FRAC_CONST(0.0072805823184660), - FRAC_CONST(0.0075144760396340), - FRAC_CONST(0.0077526772493942), - FRAC_CONST(0.0079952294524673), - FRAC_CONST(0.0082421760767325), - FRAC_CONST(0.0084935604793733), - FRAC_CONST(0.0087494259519870), - FRAC_CONST(0.0090098157247792), - FRAC_CONST(0.0092747729699467), - FRAC_CONST(0.0095443408043399), - FRAC_CONST(0.0098185622914832), - FRAC_CONST(0.0100974804430226), - FRAC_CONST(0.0103811382196612), - FRAC_CONST(0.0106695785316351), - FRAC_CONST(0.0109628442387771), - FRAC_CONST(0.0112609781502091), - FRAC_CONST(0.0115640230236993), - FRAC_CONST(0.0118720215647169), - FRAC_CONST(0.0121850164252137), - FRAC_CONST(0.0125030502021561), - FRAC_CONST(0.0128261654358321), - FRAC_CONST(0.0131544046079532), - FRAC_CONST(0.0134878101395681), - FRAC_CONST(0.0138264243888068), - FRAC_CONST(0.0141702896484671), - FRAC_CONST(0.0145194481434592), - FRAC_CONST(0.0148739420281182), - FRAC_CONST(0.0152338133833959), - FRAC_CONST(0.0155991042139432), - FRAC_CONST(0.0159698564450882), - FRAC_CONST(0.0163461119197227), - FRAC_CONST(0.0167279123950996), - FRAC_CONST(0.0171152995395520), - FRAC_CONST(0.0175083149291368), - FRAC_CONST(0.0179070000442104), - FRAC_CONST(0.0183113962659409), - FRAC_CONST(0.0187215448727609), - FRAC_CONST(0.0191374870367659), - FRAC_CONST(0.0195592638200623), - FRAC_CONST(0.0199869161710679), - FRAC_CONST(0.0204204849207691), - FRAC_CONST(0.0208600107789370), - FRAC_CONST(0.0213055343303066), - FRAC_CONST(0.0217570960307201), - FRAC_CONST(0.0222147362032386), - FRAC_CONST(0.0226784950342228), - FRAC_CONST(0.0231484125693867), - FRAC_CONST(0.0236245287098244), - FRAC_CONST(0.0241068832080138), - FRAC_CONST(0.0245955156637973), - FRAC_CONST(0.0250904655203431), - FRAC_CONST(0.0255917720600868), - FRAC_CONST(0.0260994744006559), - FRAC_CONST(0.0266136114907790), - FRAC_CONST(0.0271342221061795), - FRAC_CONST(0.0276613448454576), - FRAC_CONST(0.0281950181259587), - FRAC_CONST(0.0287352801796329), - FRAC_CONST(0.0292821690488833), - FRAC_CONST(0.0298357225824074), - FRAC_CONST(0.0303959784310299), - FRAC_CONST(0.0309629740435296), - FRAC_CONST(0.0315367466624615), - FRAC_CONST(0.0321173333199732), - FRAC_CONST(0.0327047708336193), - FRAC_CONST(0.0332990958021720), - FRAC_CONST(0.0339003446014307), - FRAC_CONST(0.0345085533800302), - FRAC_CONST(0.0351237580552491), - FRAC_CONST(0.0357459943088193), - FRAC_CONST(0.0363752975827358), - FRAC_CONST(0.0370117030750704), - FRAC_CONST(0.0376552457357870), - FRAC_CONST(0.0383059602625614), - FRAC_CONST(0.0389638810966056), - FRAC_CONST(0.0396290424184964), - FRAC_CONST(0.0403014781440112), - FRAC_CONST(0.0409812219199691), - FRAC_CONST(0.0416683071200799), - FRAC_CONST(0.0423627668408009), - FRAC_CONST(0.0430646338972016), - FRAC_CONST(0.0437739408188385), - FRAC_CONST(0.0444907198456388), - FRAC_CONST(0.0452150029237951), - FRAC_CONST(0.0459468217016708), - FRAC_CONST(0.0466862075257170), - FRAC_CONST(0.0474331914364021), - FRAC_CONST(0.0481878041641539), - FRAC_CONST(0.0489500761253148), - FRAC_CONST(0.0497200374181119), - FRAC_CONST(0.0504977178186404), - FRAC_CONST(0.0512831467768636), - FRAC_CONST(0.0520763534126273), - FRAC_CONST(0.0528773665116913), - FRAC_CONST(0.0536862145217772), - FRAC_CONST(0.0545029255486345), - FRAC_CONST(0.0553275273521232), - FRAC_CONST(0.0561600473423164), - FRAC_CONST(0.0570005125756209), - FRAC_CONST(0.0578489497509179), - FRAC_CONST(0.0587053852057233), - FRAC_CONST(0.0595698449123695), - FRAC_CONST(0.0604423544742077), - FRAC_CONST(0.0613229391218317), - FRAC_CONST(0.0622116237093247), - FRAC_CONST(0.0631084327105284), - FRAC_CONST(0.0640133902153352), - FRAC_CONST(0.0649265199260043), - FRAC_CONST(0.0658478451535027), - FRAC_CONST(0.0667773888138695), - FRAC_CONST(0.0677151734246072), - FRAC_CONST(0.0686612211010977), - FRAC_CONST(0.0696155535530446), - FRAC_CONST(0.0705781920809429), - FRAC_CONST(0.0715491575725758), - FRAC_CONST(0.0725284704995383), - FRAC_CONST(0.0735161509137906), - FRAC_CONST(0.0745122184442388), - FRAC_CONST(0.0755166922933461), - FRAC_CONST(0.0765295912337720), - FRAC_CONST(0.0775509336050437), - FRAC_CONST(0.0785807373102561), - FRAC_CONST(0.0796190198128044), - FRAC_CONST(0.0806657981331473), - FRAC_CONST(0.0817210888456026), - FRAC_CONST(0.0827849080751753), - FRAC_CONST(0.0838572714944183), - FRAC_CONST(0.0849381943203265), - FRAC_CONST(0.0860276913112652), - FRAC_CONST(0.0871257767639319), - FRAC_CONST(0.0882324645103534), - FRAC_CONST(0.0893477679149177), - FRAC_CONST(0.0904716998714418), - FRAC_CONST(0.0916042728002747), - FRAC_CONST(0.0927454986454381), - FRAC_CONST(0.0938953888718020), - FRAC_CONST(0.0950539544622996), - FRAC_CONST(0.0962212059151784), - FRAC_CONST(0.0973971532412897), - FRAC_CONST(0.0985818059614169), - FRAC_CONST(0.0997751731036425), - FRAC_CONST(0.1009772632007537), - FRAC_CONST(0.1021880842876888), - FRAC_CONST(0.1034076438990227), - FRAC_CONST(0.1046359490664932), - FRAC_CONST(0.1058730063165681), - FRAC_CONST(0.1071188216680533), - FRAC_CONST(0.1083734006297428), - FRAC_CONST(0.1096367481981100), - FRAC_CONST(0.1109088688550422), - FRAC_CONST(0.1121897665656167), - FRAC_CONST(0.1134794447759207), - FRAC_CONST(0.1147779064109143), - FRAC_CONST(0.1160851538723372), - FRAC_CONST(0.1174011890366591), - FRAC_CONST(0.1187260132530751), - FRAC_CONST(0.1200596273415457), - FRAC_CONST(0.1214020315908810), - FRAC_CONST(0.1227532257568719), - FRAC_CONST(0.1241132090604651), - FRAC_CONST(0.1254819801859856), - FRAC_CONST(0.1268595372794049), - FRAC_CONST(0.1282458779466558), - FRAC_CONST(0.1296409992519942), - FRAC_CONST(0.1310448977164081), - FRAC_CONST(0.1324575693160745), - FRAC_CONST(0.1338790094808633), - FRAC_CONST(0.1353092130928902), - FRAC_CONST(0.1367481744851168), - FRAC_CONST(0.1381958874400010), - FRAC_CONST(0.1396523451881945), - FRAC_CONST(0.1411175404072910), - FRAC_CONST(0.1425914652206223), - FRAC_CONST(0.1440741111961058), - FRAC_CONST(0.1455654693451402), - FRAC_CONST(0.1470655301215526), - FRAC_CONST(0.1485742834205956), - FRAC_CONST(0.1500917185779945), - FRAC_CONST(0.1516178243690463), - FRAC_CONST(0.1531525890077689), - FRAC_CONST(0.1546960001461024), - FRAC_CONST(0.1562480448731608), - FRAC_CONST(0.1578087097145364), - FRAC_CONST(0.1593779806316558), - FRAC_CONST(0.1609558430211876), - FRAC_CONST(0.1625422817145027), - FRAC_CONST(0.1641372809771871), - FRAC_CONST(0.1657408245086070), - FRAC_CONST(0.1673528954415270), - FRAC_CONST(0.1689734763417811), - FRAC_CONST(0.1706025492079969), - FRAC_CONST(0.1722400954713725), - FRAC_CONST(0.1738860959955082), - FRAC_CONST(0.1755405310762898), - FRAC_CONST(0.1772033804418275), - FRAC_CONST(0.1788746232524467), - FRAC_CONST(0.1805542381007349), - FRAC_CONST(0.1822422030116404), - FRAC_CONST(0.1839384954426268), - FRAC_CONST(0.1856430922838810), - FRAC_CONST(0.1873559698585756), - FRAC_CONST(0.1890771039231862), - FRAC_CONST(0.1908064696678625), - FRAC_CONST(0.1925440417168546), - FRAC_CONST(0.1942897941289937), - FRAC_CONST(0.1960437003982277), - FRAC_CONST(0.1978057334542116), - FRAC_CONST(0.1995758656629525), - FRAC_CONST(0.2013540688275098), - FRAC_CONST(0.2031403141887507), - FRAC_CONST(0.2049345724261595), - FRAC_CONST(0.2067368136587033), - FRAC_CONST(0.2085470074457521), - FRAC_CONST(0.2103651227880538), - FRAC_CONST(0.2121911281287646), - FRAC_CONST(0.2140249913545346), - FRAC_CONST(0.2158666797966480), - FRAC_CONST(0.2177161602322188), - FRAC_CONST(0.2195733988854414), - FRAC_CONST(0.2214383614288963), - FRAC_CONST(0.2233110129849106), - FRAC_CONST(0.2251913181269740), - FRAC_CONST(0.2270792408812093), - FRAC_CONST(0.2289747447278976), - FRAC_CONST(0.2308777926030592), - FRAC_CONST(0.2327883469000885), - FRAC_CONST(0.2347063694714437), - FRAC_CONST(0.2366318216303919), - FRAC_CONST(0.2385646641528076), - FRAC_CONST(0.2405048572790267), - FRAC_CONST(0.2424523607157545), - FRAC_CONST(0.2444071336380283), - FRAC_CONST(0.2463691346912334), - FRAC_CONST(0.2483383219931741), - FRAC_CONST(0.2503146531361985), - FRAC_CONST(0.2522980851893767), - FRAC_CONST(0.2542885747007335), - FRAC_CONST(0.2562860776995335), - FRAC_CONST(0.2582905496986215), - FRAC_CONST(0.2603019456968142), - FRAC_CONST(0.2623202201813464), - FRAC_CONST(0.2643453271303700), - FRAC_CONST(0.2663772200155053), - FRAC_CONST(0.2684158518044454), - FRAC_CONST(0.2704611749636135), - FRAC_CONST(0.2725131414608710), - FRAC_CONST(0.2745717027682799), - FRAC_CONST(0.2766368098649151), - FRAC_CONST(0.2787084132397296), - FRAC_CONST(0.2807864628944707), - FRAC_CONST(0.2828709083466482), - FRAC_CONST(0.2849616986325523), - FRAC_CONST(0.2870587823103237), - FRAC_CONST(0.2891621074630737), - FRAC_CONST(0.2912716217020546), - FRAC_CONST(0.2933872721698803), - FRAC_CONST(0.2955090055437973), - FRAC_CONST(0.2976367680390041), - FRAC_CONST(0.2997705054120213), - FRAC_CONST(0.3019101629641097), - FRAC_CONST(0.3040556855447379), - FRAC_CONST(0.3062070175550981), - FRAC_CONST(0.3083641029516701), - FRAC_CONST(0.3105268852498334), - FRAC_CONST(0.3126953075275265), - FRAC_CONST(0.3148693124289546), - FRAC_CONST(0.3170488421683428), - FRAC_CONST(0.3192338385337370), - FRAC_CONST(0.3214242428908514), - FRAC_CONST(0.3236199961869606), - FRAC_CONST(0.3258210389548392), - FRAC_CONST(0.3280273113167459), - FRAC_CONST(0.3302387529884521), - FRAC_CONST(0.3324553032833160), - FRAC_CONST(0.3346769011164010), - FRAC_CONST(0.3369034850086373), - FRAC_CONST(0.3391349930910280), - FRAC_CONST(0.3413713631088974), - FRAC_CONST(0.3436125324261830), - FRAC_CONST(0.3458584380297697), - FRAC_CONST(0.3481090165338656), - FRAC_CONST(0.3503642041844199), - FRAC_CONST(0.3526239368635820), - FRAC_CONST(0.3548881500942010), - FRAC_CONST(0.3571567790443668), - FRAC_CONST(0.3594297585319891), - FRAC_CONST(0.3617070230294185), - FRAC_CONST(0.3639885066681048), - FRAC_CONST(0.3662741432432950), - FRAC_CONST(0.3685638662187693), - FRAC_CONST(0.3708576087316147), - FRAC_CONST(0.3731553035970366), - FRAC_CONST(0.3754568833132069), - FRAC_CONST(0.3777622800661488), - FRAC_CONST(0.3800714257346570), - FRAC_CONST(0.3823842518952546), - FRAC_CONST(0.3847006898271841), - FRAC_CONST(0.3870206705174334), - FRAC_CONST(0.3893441246657958), - FRAC_CONST(0.3916709826899639), - FRAC_CONST(0.3940011747306560), - FRAC_CONST(0.3963346306567764), - FRAC_CONST(0.3986712800706062), - FRAC_CONST(0.4010110523130271), - FRAC_CONST(0.4033538764687756), - FRAC_CONST(0.4056996813717284), - FRAC_CONST(0.4080483956102172), - FRAC_CONST(0.4103999475323736), - FRAC_CONST(0.4127542652515031), - FRAC_CONST(0.4151112766514873), - FRAC_CONST(0.4174709093922143), - FRAC_CONST(0.4198330909150365), - FRAC_CONST(0.4221977484482556), - FRAC_CONST(0.4245648090126334), - FRAC_CONST(0.4269341994269293), - FRAC_CONST(0.4293058463134616), - FRAC_CONST(0.4316796761036958), - FRAC_CONST(0.4340556150438547), - FRAC_CONST(0.4364335892005536), - FRAC_CONST(0.4388135244664580), - FRAC_CONST(0.4411953465659639), - FRAC_CONST(0.4435789810609000), - FRAC_CONST(0.4459643533562509), - FRAC_CONST(0.4483513887059016), - FRAC_CONST(0.4507400122184019), - FRAC_CONST(0.4531301488627497), - FRAC_CONST(0.4555217234741947), - FRAC_CONST(0.4579146607600593), - FRAC_CONST(0.4603088853055777), - FRAC_CONST(0.4627043215797521), - FRAC_CONST(0.4651008939412254), - FRAC_CONST(0.4674985266441709), - FRAC_CONST(0.4698971438441951), - FRAC_CONST(0.4722966696042580), - FRAC_CONST(0.4746970279006055), - FRAC_CONST(0.4770981426287164), - FRAC_CONST(0.4794999376092619), - FRAC_CONST(0.4819023365940778), - FRAC_CONST(0.4843052632721476), - FRAC_CONST(0.4867086412755978), - FRAC_CONST(0.4891123941857028), - FRAC_CONST(0.4915164455388997), - FRAC_CONST(0.4939207188328126), - FRAC_CONST(0.4963251375322855), - FRAC_CONST(0.4987296250754225), - FRAC_CONST(0.5011341048796359), - FRAC_CONST(0.5035385003477012), - FRAC_CONST(0.5059427348738168), - FRAC_CONST(0.5083467318496706), - FRAC_CONST(0.5107504146705106), - FRAC_CONST(0.5131537067412193), - FRAC_CONST(0.5155565314823923), - FRAC_CONST(0.5179588123364193), - FRAC_CONST(0.5203604727735667), - FRAC_CONST(0.5227614362980630), - FRAC_CONST(0.5251616264541841), - FRAC_CONST(0.5275609668323384), - FRAC_CONST(0.5299593810751532), - FRAC_CONST(0.5323567928835578), - FRAC_CONST(0.5347531260228663), - FRAC_CONST(0.5371483043288580), - FRAC_CONST(0.5395422517138538), - FRAC_CONST(0.5419348921727899), - FRAC_CONST(0.5443261497892862), - FRAC_CONST(0.5467159487417104), - FRAC_CONST(0.5491042133092364), - FRAC_CONST(0.5514908678778958), - FRAC_CONST(0.5538758369466227), - FRAC_CONST(0.5562590451332913), - FRAC_CONST(0.5586404171807443), - FRAC_CONST(0.5610198779628133), - FRAC_CONST(0.5633973524903286), - FRAC_CONST(0.5657727659171199), - FRAC_CONST(0.5681460435460047), - FRAC_CONST(0.5705171108347663), - FRAC_CONST(0.5728858934021188), - FRAC_CONST(0.5752523170336598), - FRAC_CONST(0.5776163076878088), - FRAC_CONST(0.5799777915017323), - FRAC_CONST(0.5823366947972535), - FRAC_CONST(0.5846929440867458), - FRAC_CONST(0.5870464660790119), - FRAC_CONST(0.5893971876851449), - FRAC_CONST(0.5917450360243719), - FRAC_CONST(0.5940899384298793), - FRAC_CONST(0.5964318224546208), - FRAC_CONST(0.5987706158771039), - FRAC_CONST(0.6011062467071583), - FRAC_CONST(0.6034386431916822), - FRAC_CONST(0.6057677338203681), - FRAC_CONST(0.6080934473314057), - FRAC_CONST(0.6104157127171639), - FRAC_CONST(0.6127344592298474), - FRAC_CONST(0.6150496163871310), - FRAC_CONST(0.6173611139777690), - FRAC_CONST(0.6196688820671789), - FRAC_CONST(0.6219728510029997), - FRAC_CONST(0.6242729514206247), - FRAC_CONST(0.6265691142487051), - FRAC_CONST(0.6288612707146283), - FRAC_CONST(0.6311493523499663), - FRAC_CONST(0.6334332909958958), - FRAC_CONST(0.6357130188085891), - FRAC_CONST(0.6379884682645743), - FRAC_CONST(0.6402595721660647), - FRAC_CONST(0.6425262636462578), - FRAC_CONST(0.6447884761746012), - FRAC_CONST(0.6470461435620266), - FRAC_CONST(0.6492991999661505), - FRAC_CONST(0.6515475798964411), - FRAC_CONST(0.6537912182193508), - FRAC_CONST(0.6560300501634142), - FRAC_CONST(0.6582640113243098), - FRAC_CONST(0.6604930376698862), - FRAC_CONST(0.6627170655451516), - FRAC_CONST(0.6649360316772256), - FRAC_CONST(0.6671498731802533), - FRAC_CONST(0.6693585275602818), - FRAC_CONST(0.6715619327200959), - FRAC_CONST(0.6737600269640164), - FRAC_CONST(0.6759527490026566), - FRAC_CONST(0.6781400379576392), - FRAC_CONST(0.6803218333662715), - FRAC_CONST(0.6824980751861787), - FRAC_CONST(0.6846687037998949), - FRAC_CONST(0.6868336600194123), - FRAC_CONST(0.6889928850906855), - FRAC_CONST(0.6911463206980928), - FRAC_CONST(0.6932939089688525), - FRAC_CONST(0.6954355924773949), - FRAC_CONST(0.6975713142496884), - FRAC_CONST(0.6997010177675195), - FRAC_CONST(0.7018246469727265), - FRAC_CONST(0.7039421462713862), - FRAC_CONST(0.7060534605379528), - FRAC_CONST(0.7081585351193496), - FRAC_CONST(0.7102573158390105), - FRAC_CONST(0.7123497490008750), - FRAC_CONST(0.7144357813933307), - FRAC_CONST(0.7165153602931092), - FRAC_CONST(0.7185884334691287), - FRAC_CONST(0.7206549491862871), - FRAC_CONST(0.7227148562092042), - FRAC_CONST(0.7247681038059106), - FRAC_CONST(0.7268146417514855), - FRAC_CONST(0.7288544203316418), - FRAC_CONST(0.7308873903462577), - FRAC_CONST(0.7329135031128549), - FRAC_CONST(0.7349327104700221), - FRAC_CONST(0.7369449647807855), - FRAC_CONST(0.7389502189359237), - FRAC_CONST(0.7409484263572271), - FRAC_CONST(0.7429395410007016), - FRAC_CONST(0.7449235173597176), - FRAC_CONST(0.7469003104681008), - FRAC_CONST(0.7488698759031670), - FRAC_CONST(0.7508321697887005), - FRAC_CONST(0.7527871487978728), - FRAC_CONST(0.7547347701561059), - FRAC_CONST(0.7566749916438754), - FRAC_CONST(0.7586077715994560), - FRAC_CONST(0.7605330689216074), - FRAC_CONST(0.7624508430722016), - FRAC_CONST(0.7643610540787891), - FRAC_CONST(0.7662636625371070), - FRAC_CONST(0.7681586296135255), - FRAC_CONST(0.7700459170474343), - FRAC_CONST(0.7719254871535672), - FRAC_CONST(0.7737973028242671), - FRAC_CONST(0.7756613275316875), - FRAC_CONST(0.7775175253299340), - FRAC_CONST(0.7793658608571425), - FRAC_CONST(0.7812062993374951), - FRAC_CONST(0.7830388065831744), - FRAC_CONST(0.7848633489962533), - FRAC_CONST(0.7866798935705233), - FRAC_CONST(0.7884884078932579), - FRAC_CONST(0.7902888601469138), - FRAC_CONST(0.7920812191107668), - FRAC_CONST(0.7938654541624850), - FRAC_CONST(0.7956415352796368), - FRAC_CONST(0.7974094330411343), - FRAC_CONST(0.7991691186286133), - FRAC_CONST(0.8009205638277465), - FRAC_CONST(0.8026637410294932), - FRAC_CONST(0.8043986232312831), - FRAC_CONST(0.8061251840381346), - FRAC_CONST(0.8078433976637077), - FRAC_CONST(0.8095532389312917), - FRAC_CONST(0.8112546832747255), - FRAC_CONST(0.8129477067392539), - FRAC_CONST(0.8146322859823164), - FRAC_CONST(0.8163083982742698), - FRAC_CONST(0.8179760214990457), - FRAC_CONST(0.8196351341547393), - FRAC_CONST(0.8212857153541345), - FRAC_CONST(0.8229277448251595), - FRAC_CONST(0.8245612029112778), - FRAC_CONST(0.8261860705718113), - FRAC_CONST(0.8278023293821971), - FRAC_CONST(0.8294099615341773), - FRAC_CONST(0.8310089498359212), - FRAC_CONST(0.8325992777120815), - FRAC_CONST(0.8341809292037831), - FRAC_CONST(0.8357538889685445), - FRAC_CONST(0.8373181422801330), - FRAC_CONST(0.8388736750283521), - FRAC_CONST(0.8404204737187619), - FRAC_CONST(0.8419585254723335), - FRAC_CONST(0.8434878180250348), - FRAC_CONST(0.8450083397273509), - FRAC_CONST(0.8465200795437368), - FRAC_CONST(0.8480230270520029), - FRAC_CONST(0.8495171724426350), - FRAC_CONST(0.8510025065180464), - FRAC_CONST(0.8524790206917633), - FRAC_CONST(0.8539467069875448), - FRAC_CONST(0.8554055580384357), - FRAC_CONST(0.8568555670857525), - FRAC_CONST(0.8582967279780043), - FRAC_CONST(0.8597290351697464), - FRAC_CONST(0.8611524837203691), - FRAC_CONST(0.8625670692928198), - FRAC_CONST(0.8639727881522599), - FRAC_CONST(0.8653696371646555), - FRAC_CONST(0.8667576137953045), - FRAC_CONST(0.8681367161072958), - FRAC_CONST(0.8695069427599065), - FRAC_CONST(0.8708682930069319), - FRAC_CONST(0.8722207666949527), - FRAC_CONST(0.8735643642615368), - FRAC_CONST(0.8748990867333771), - FRAC_CONST(0.8762249357243662), - FRAC_CONST(0.8775419134336067), - FRAC_CONST(0.8788500226433579), - FRAC_CONST(0.8801492667169208), - FRAC_CONST(0.8814396495964587), - FRAC_CONST(0.8827211758007560), - FRAC_CONST(0.8839938504229149), - FRAC_CONST(0.8852576791279895), - FRAC_CONST(0.8865126681505587), - FRAC_CONST(0.8877588242922386), - FRAC_CONST(0.8889961549191320), - FRAC_CONST(0.8902246679592184), - FRAC_CONST(0.8914443718996848), - FRAC_CONST(0.8926552757841945), - FRAC_CONST(0.8938573892100969), - FRAC_CONST(0.8950507223255798), - FRAC_CONST(0.8962352858267605), - FRAC_CONST(0.8974110909547198), - FRAC_CONST(0.8985781494924783), - FRAC_CONST(0.8997364737619142), - FRAC_CONST(0.9008860766206249), - FRAC_CONST(0.9020269714587307), - FRAC_CONST(0.9031591721956235), - FRAC_CONST(0.9042826932766591), - FRAC_CONST(0.9053975496697941), - FRAC_CONST(0.9065037568621681), - FRAC_CONST(0.9076013308566311), - FRAC_CONST(0.9086902881682180), - FRAC_CONST(0.9097706458205682), - FRAC_CONST(0.9108424213422940), - FRAC_CONST(0.9119056327632955), - FRAC_CONST(0.9129602986110235), - FRAC_CONST(0.9140064379066919), - FRAC_CONST(0.9150440701614393), - FRAC_CONST(0.9160732153724396), - FRAC_CONST(0.9170938940189634), - FRAC_CONST(0.9181061270583908), - FRAC_CONST(0.9191099359221748), - FRAC_CONST(0.9201053425117579), - FRAC_CONST(0.9210923691944400), - FRAC_CONST(0.9220710387992010), - FRAC_CONST(0.9230413746124764), - FRAC_CONST(0.9240034003738882), - FRAC_CONST(0.9249571402719298), - FRAC_CONST(0.9259026189396085), - FRAC_CONST(0.9268398614500427), - FRAC_CONST(0.9277688933120170), - FRAC_CONST(0.9286897404654957), - FRAC_CONST(0.9296024292770939), - FRAC_CONST(0.9305069865355076), - FRAC_CONST(0.9314034394469048), - FRAC_CONST(0.9322918156302762), - FRAC_CONST(0.9331721431127471), - FRAC_CONST(0.9340444503248519), - FRAC_CONST(0.9349087660957711), - FRAC_CONST(0.9357651196485313), - FRAC_CONST(0.9366135405951697), - FRAC_CONST(0.9374540589318637), - FRAC_CONST(0.9382867050340261), - FRAC_CONST(0.9391115096513655), - FRAC_CONST(0.9399285039029165), - FRAC_CONST(0.9407377192720349), - FRAC_CONST(0.9415391876013639), - FRAC_CONST(0.9423329410877687), - FRAC_CONST(0.9431190122772415), - FRAC_CONST(0.9438974340597782), - FRAC_CONST(0.9446682396642262), - FRAC_CONST(0.9454314626531054), - FRAC_CONST(0.9461871369174033), - FRAC_CONST(0.9469352966713429), - FRAC_CONST(0.9476759764471278), - FRAC_CONST(0.9484092110896616), - FRAC_CONST(0.9491350357512457), - FRAC_CONST(0.9498534858862532), - FRAC_CONST(0.9505645972457831), - FRAC_CONST(0.9512684058722927), - FRAC_CONST(0.9519649480942105), - FRAC_CONST(0.9526542605205314), - FRAC_CONST(0.9533363800353921), - FRAC_CONST(0.9540113437926313), - FRAC_CONST(0.9546791892103320), - FRAC_CONST(0.9553399539653500), - FRAC_CONST(0.9559936759878265), - FRAC_CONST(0.9566403934556893), - FRAC_CONST(0.9572801447891388), - FRAC_CONST(0.9579129686451244), - FRAC_CONST(0.9585389039118085), - FRAC_CONST(0.9591579897030224), - FRAC_CONST(0.9597702653527108), - FRAC_CONST(0.9603757704093711), - FRAC_CONST(0.9609745446304828), - FRAC_CONST(0.9615666279769324), - FRAC_CONST(0.9621520606074324), - FRAC_CONST(0.9627308828729358), - FRAC_CONST(0.9633031353110477), - FRAC_CONST(0.9638688586404335), - FRAC_CONST(0.9644280937552258), - FRAC_CONST(0.9649808817194311), - FRAC_CONST(0.9655272637613366), - FRAC_CONST(0.9660672812679171), - FRAC_CONST(0.9666009757792454), - FRAC_CONST(0.9671283889829055), - FRAC_CONST(0.9676495627084089), - FRAC_CONST(0.9681645389216160), - FRAC_CONST(0.9686733597191652), - FRAC_CONST(0.9691760673229058), - FRAC_CONST(0.9696727040743406), - FRAC_CONST(0.9701633124290767), - FRAC_CONST(0.9706479349512860), - FRAC_CONST(0.9711266143081750), - FRAC_CONST(0.9715993932644684), - FRAC_CONST(0.9720663146769026), - FRAC_CONST(0.9725274214887337), - FRAC_CONST(0.9729827567242596), - FRAC_CONST(0.9734323634833574), - FRAC_CONST(0.9738762849360358), - FRAC_CONST(0.9743145643170059), - FRAC_CONST(0.9747472449202687), - FRAC_CONST(0.9751743700937215), - FRAC_CONST(0.9755959832337850), - FRAC_CONST(0.9760121277800496), - FRAC_CONST(0.9764228472099433), - FRAC_CONST(0.9768281850334235), - FRAC_CONST(0.9772281847876897), - FRAC_CONST(0.9776228900319223), - FRAC_CONST(0.9780123443420448), - FRAC_CONST(0.9783965913055132), - FRAC_CONST(0.9787756745161313), - FRAC_CONST(0.9791496375688939), - FRAC_CONST(0.9795185240548578), - FRAC_CONST(0.9798823775560431), - FRAC_CONST(0.9802412416403639), - FRAC_CONST(0.9805951598565897), - FRAC_CONST(0.9809441757293399), - FRAC_CONST(0.9812883327541090), - FRAC_CONST(0.9816276743923267), - FRAC_CONST(0.9819622440664515), - FRAC_CONST(0.9822920851550995), - FRAC_CONST(0.9826172409882086), - FRAC_CONST(0.9829377548422400), - FRAC_CONST(0.9832536699354163), - FRAC_CONST(0.9835650294229984), - FRAC_CONST(0.9838718763926001), - FRAC_CONST(0.9841742538595437), - FRAC_CONST(0.9844722047622547), - FRAC_CONST(0.9847657719576983), - FRAC_CONST(0.9850549982168574), - FRAC_CONST(0.9853399262202529), - FRAC_CONST(0.9856205985535073), - FRAC_CONST(0.9858970577029519), - FRAC_CONST(0.9861693460512790), - FRAC_CONST(0.9864375058732389), - FRAC_CONST(0.9867015793313820), - FRAC_CONST(0.9869616084718489), - FRAC_CONST(0.9872176352202061), - FRAC_CONST(0.9874697013773301), - FRAC_CONST(0.9877178486153397), - FRAC_CONST(0.9879621184735767), - FRAC_CONST(0.9882025523546365), - FRAC_CONST(0.9884391915204485), - FRAC_CONST(0.9886720770884069), - FRAC_CONST(0.9889012500275530), - FRAC_CONST(0.9891267511548089), - FRAC_CONST(0.9893486211312621), - FRAC_CONST(0.9895669004585049), - FRAC_CONST(0.9897816294750255), - FRAC_CONST(0.9899928483526520), - FRAC_CONST(0.9902005970930525), - FRAC_CONST(0.9904049155242876), - FRAC_CONST(0.9906058432974180), - FRAC_CONST(0.9908034198831690), - FRAC_CONST(0.9909976845686489), - FRAC_CONST(0.9911886764541239), - FRAC_CONST(0.9913764344498495), - FRAC_CONST(0.9915609972729590), - FRAC_CONST(0.9917424034444086), - FRAC_CONST(0.9919206912859797), - FRAC_CONST(0.9920958989173397), - FRAC_CONST(0.9922680642531603), - FRAC_CONST(0.9924372250002933), - FRAC_CONST(0.9926034186550070), - FRAC_CONST(0.9927666825002789), - FRAC_CONST(0.9929270536031491), - FRAC_CONST(0.9930845688121325), - FRAC_CONST(0.9932392647546895), - FRAC_CONST(0.9933911778347579), - FRAC_CONST(0.9935403442303433), - FRAC_CONST(0.9936867998911693), - FRAC_CONST(0.9938305805363887), - FRAC_CONST(0.9939717216523539), - FRAC_CONST(0.9941102584904481), - FRAC_CONST(0.9942462260649764), - FRAC_CONST(0.9943796591511174), - FRAC_CONST(0.9945105922829353), - FRAC_CONST(0.9946390597514524), - FRAC_CONST(0.9947650956027824), - FRAC_CONST(0.9948887336363228), - FRAC_CONST(0.9950100074030103), - FRAC_CONST(0.9951289502036336), - FRAC_CONST(0.9952455950872091), - FRAC_CONST(0.9953599748494155), - FRAC_CONST(0.9954721220310890), - FRAC_CONST(0.9955820689167787), - FRAC_CONST(0.9956898475333619), - FRAC_CONST(0.9957954896487196), - FRAC_CONST(0.9958990267704713), - FRAC_CONST(0.9960004901447701), - FRAC_CONST(0.9960999107551559), - FRAC_CONST(0.9961973193214694), - FRAC_CONST(0.9962927462988245), - FRAC_CONST(0.9963862218766388), - FRAC_CONST(0.9964777759777242), - FRAC_CONST(0.9965674382574342), - FRAC_CONST(0.9966552381028704), - FRAC_CONST(0.9967412046321465), - FRAC_CONST(0.9968253666937095), - FRAC_CONST(0.9969077528657186), - FRAC_CONST(0.9969883914554805), - FRAC_CONST(0.9970673104989413), - FRAC_CONST(0.9971445377602348), - FRAC_CONST(0.9972201007312871), - FRAC_CONST(0.9972940266314749), - FRAC_CONST(0.9973663424073412), - FRAC_CONST(0.9974370747323638), - FRAC_CONST(0.9975062500067785), - FRAC_CONST(0.9975738943574574), - FRAC_CONST(0.9976400336378379), - FRAC_CONST(0.9977046934279079), - FRAC_CONST(0.9977678990342401), - FRAC_CONST(0.9978296754900812), - FRAC_CONST(0.9978900475554902), - FRAC_CONST(0.9979490397175296), - FRAC_CONST(0.9980066761905056), - FRAC_CONST(0.9980629809162593), - FRAC_CONST(0.9981179775645063), - FRAC_CONST(0.9981716895332257), - FRAC_CONST(0.9982241399490979), - FRAC_CONST(0.9982753516679893), - FRAC_CONST(0.9983253472754841), - FRAC_CONST(0.9983741490874634), - FRAC_CONST(0.9984217791507299), - FRAC_CONST(0.9984682592436778), - FRAC_CONST(0.9985136108770075), - FRAC_CONST(0.9985578552944850), - FRAC_CONST(0.9986010134737439), - FRAC_CONST(0.9986431061271304), - FRAC_CONST(0.9986841537025921), - FRAC_CONST(0.9987241763846056), - FRAC_CONST(0.9987631940951476), - FRAC_CONST(0.9988012264947044), - FRAC_CONST(0.9988382929833222), - FRAC_CONST(0.9988744127016956), - FRAC_CONST(0.9989096045322947), - FRAC_CONST(0.9989438871005292), - FRAC_CONST(0.9989772787759494), - FRAC_CONST(0.9990097976734847), - FRAC_CONST(0.9990414616547146), - FRAC_CONST(0.9990722883291779), - FRAC_CONST(0.9991022950557125), - FRAC_CONST(0.9991314989438310), - FRAC_CONST(0.9991599168551279), - FRAC_CONST(0.9991875654047181), - FRAC_CONST(0.9992144609627068), - FRAC_CONST(0.9992406196556911), - FRAC_CONST(0.9992660573682882), - FRAC_CONST(0.9992907897446957), - FRAC_CONST(0.9993148321902777), - FRAC_CONST(0.9993381998731797), - FRAC_CONST(0.9993609077259696), - FRAC_CONST(0.9993829704473038), - FRAC_CONST(0.9994044025036201), - FRAC_CONST(0.9994252181308537), - FRAC_CONST(0.9994454313361775), - FRAC_CONST(0.9994650558997651), - FRAC_CONST(0.9994841053765757), - FRAC_CONST(0.9995025930981609), - FRAC_CONST(0.9995205321744921), - FRAC_CONST(0.9995379354958073), - FRAC_CONST(0.9995548157344778), - FRAC_CONST(0.9995711853468930), - FRAC_CONST(0.9995870565753632), - FRAC_CONST(0.9996024414500382), - FRAC_CONST(0.9996173517908444), - FRAC_CONST(0.9996317992094352), - FRAC_CONST(0.9996457951111574), - FRAC_CONST(0.9996593506970310), - FRAC_CONST(0.9996724769657434), - FRAC_CONST(0.9996851847156547), - FRAC_CONST(0.9996974845468164), - FRAC_CONST(0.9997093868630000), - FRAC_CONST(0.9997209018737374), - FRAC_CONST(0.9997320395963699), - FRAC_CONST(0.9997428098581069), - FRAC_CONST(0.9997532222980933), - FRAC_CONST(0.9997632863694836), - FRAC_CONST(0.9997730113415246), - FRAC_CONST(0.9997824063016426), - FRAC_CONST(0.9997914801575380), - FRAC_CONST(0.9998002416392840), - FRAC_CONST(0.9998086993014300), - FRAC_CONST(0.9998168615251084), - FRAC_CONST(0.9998247365201450), - FRAC_CONST(0.9998323323271717), - FRAC_CONST(0.9998396568197407), - FRAC_CONST(0.9998467177064404), - FRAC_CONST(0.9998535225330116), - FRAC_CONST(0.9998600786844637), - FRAC_CONST(0.9998663933871905), - FRAC_CONST(0.9998724737110845), - FRAC_CONST(0.9998783265716498), - FRAC_CONST(0.9998839587321121), - FRAC_CONST(0.9998893768055266), - FRAC_CONST(0.9998945872568815), - FRAC_CONST(0.9998995964051983), - FRAC_CONST(0.9999044104256269), - FRAC_CONST(0.9999090353515359), - FRAC_CONST(0.9999134770765971), - FRAC_CONST(0.9999177413568642), - FRAC_CONST(0.9999218338128448), - FRAC_CONST(0.9999257599315647), - FRAC_CONST(0.9999295250686255), - FRAC_CONST(0.9999331344502529), - FRAC_CONST(0.9999365931753376), - FRAC_CONST(0.9999399062174669), - FRAC_CONST(0.9999430784269460), - FRAC_CONST(0.9999461145328103), - FRAC_CONST(0.9999490191448277), - FRAC_CONST(0.9999517967554878), - FRAC_CONST(0.9999544517419835), - FRAC_CONST(0.9999569883681778), - FRAC_CONST(0.9999594107865607), - FRAC_CONST(0.9999617230401926), - FRAC_CONST(0.9999639290646355), - FRAC_CONST(0.9999660326898712), - FRAC_CONST(0.9999680376422052), - FRAC_CONST(0.9999699475461585), - FRAC_CONST(0.9999717659263435), - FRAC_CONST(0.9999734962093266), - FRAC_CONST(0.9999751417254756), - FRAC_CONST(0.9999767057107922), - FRAC_CONST(0.9999781913087290), - FRAC_CONST(0.9999796015719915), - FRAC_CONST(0.9999809394643231), - FRAC_CONST(0.9999822078622751), - FRAC_CONST(0.9999834095569596), - FRAC_CONST(0.9999845472557860), - FRAC_CONST(0.9999856235841805), - FRAC_CONST(0.9999866410872889), - FRAC_CONST(0.9999876022316609), - FRAC_CONST(0.9999885094069193), - FRAC_CONST(0.9999893649274085), - FRAC_CONST(0.9999901710338274), - FRAC_CONST(0.9999909298948430), - FRAC_CONST(0.9999916436086862), - FRAC_CONST(0.9999923142047299), - FRAC_CONST(0.9999929436450469), - FRAC_CONST(0.9999935338259505), - FRAC_CONST(0.9999940865795161), - FRAC_CONST(0.9999946036750835), - FRAC_CONST(0.9999950868207405), - FRAC_CONST(0.9999955376647868), - FRAC_CONST(0.9999959577971798), - FRAC_CONST(0.9999963487509599), - FRAC_CONST(0.9999967120036571), - FRAC_CONST(0.9999970489786785), - FRAC_CONST(0.9999973610466748), - FRAC_CONST(0.9999976495268890), - FRAC_CONST(0.9999979156884846), - FRAC_CONST(0.9999981607518545), - FRAC_CONST(0.9999983858899099), - FRAC_CONST(0.9999985922293493), - FRAC_CONST(0.9999987808519092), - FRAC_CONST(0.9999989527955938), - FRAC_CONST(0.9999991090558848), - FRAC_CONST(0.9999992505869332), - FRAC_CONST(0.9999993783027293), - FRAC_CONST(0.9999994930782556), - FRAC_CONST(0.9999995957506171), - FRAC_CONST(0.9999996871201549), - FRAC_CONST(0.9999997679515386), - FRAC_CONST(0.9999998389748399), - FRAC_CONST(0.9999999008865869), - FRAC_CONST(0.9999999543507984) -}; -#endif - -ALIGN static const real_t kbd_short_128[] = -{ - FRAC_CONST(4.3795702929468881e-005), - FRAC_CONST(0.00011867384265436617), - FRAC_CONST(0.0002307165763996192), - FRAC_CONST(0.00038947282760568383), - FRAC_CONST(0.00060581272288302553), - FRAC_CONST(0.00089199695169487453), - FRAC_CONST(0.0012617254423430522), - FRAC_CONST(0.0017301724373162003), - FRAC_CONST(0.0023140071937421476), - FRAC_CONST(0.0030313989666022221), - FRAC_CONST(0.0039020049735530842), - FRAC_CONST(0.0049469401815512024), - FRAC_CONST(0.0061887279335368318), - FRAC_CONST(0.0076512306364647726), - FRAC_CONST(0.0093595599562652423), - FRAC_CONST(0.011339966208377799), - FRAC_CONST(0.013619706891715299), - FRAC_CONST(0.016226894586323766), - FRAC_CONST(0.019190324717288168), - FRAC_CONST(0.022539283975960878), - FRAC_CONST(0.026303340480472455), - FRAC_CONST(0.030512117046644357), - FRAC_CONST(0.03519504922365594), - FRAC_CONST(0.040381130021856941), - FRAC_CONST(0.046098643518702249), - FRAC_CONST(0.052374889768730587), - FRAC_CONST(0.059235903660769147), - FRAC_CONST(0.066706170556282418), - FRAC_CONST(0.074808341703430481), - FRAC_CONST(0.083562952548726227), - FRAC_CONST(0.092988147159339674), - FRAC_CONST(0.1030994120216919), - FRAC_CONST(0.11390932249409955), - FRAC_CONST(0.12542730516149531), - FRAC_CONST(0.13765941926783826), - FRAC_CONST(0.15060816028651081), - FRAC_CONST(0.16427228853114245), - FRAC_CONST(0.17864668550988483), - FRAC_CONST(0.19372224048676889), - FRAC_CONST(0.20948576943658073), - FRAC_CONST(0.22591996826744942), - FRAC_CONST(0.24300340184133981), - FRAC_CONST(0.26071052995068139), - FRAC_CONST(0.27901177101369551), - FRAC_CONST(0.29787360383626599), - FRAC_CONST(0.3172587073594233), - FRAC_CONST(0.33712613787396362), - FRAC_CONST(0.35743154274286698), - FRAC_CONST(0.37812740923363009), - FRAC_CONST(0.39916334663203618), - FRAC_CONST(0.42048639939189658), - FRAC_CONST(0.4420413886774246), - FRAC_CONST(0.4637712792815169), - FRAC_CONST(0.4856175685594023), - FRAC_CONST(0.50752069370766872), - FRAC_CONST(0.52942045344797806), - FRAC_CONST(0.55125643994680196), - FRAC_CONST(0.57296847662071559), - FRAC_CONST(0.59449705734411495), - FRAC_CONST(0.61578378249506627), - FRAC_CONST(0.63677178724712891), - FRAC_CONST(0.65740615754163356), - FRAC_CONST(0.67763432925662526), - FRAC_CONST(0.69740646622548552), - FRAC_CONST(0.71667581294953808), - FRAC_CONST(0.73539901809352737), - FRAC_CONST(0.75353642514900732), - FRAC_CONST(0.77105232699609816), - FRAC_CONST(0.78791518148597028), - FRAC_CONST(0.80409778560147072), - FRAC_CONST(0.81957740622770781), - FRAC_CONST(0.83433586607383625), - FRAC_CONST(0.84835958382689225), - FRAC_CONST(0.86163956818294229), - FRAC_CONST(0.87417136598406997), - FRAC_CONST(0.88595496528524853), - FRAC_CONST(0.89699465477567619), - FRAC_CONST(0.90729884157670959), - FRAC_CONST(0.91687983002436779), - FRAC_CONST(0.92575356460899649), - FRAC_CONST(0.93393934077779084), - FRAC_CONST(0.94145948779657318), - FRAC_CONST(0.94833902830402828), - FRAC_CONST(0.95460531956280026), - FRAC_CONST(0.96028768170574896), - FRAC_CONST(0.96541701848104766), - FRAC_CONST(0.97002543610646474), - FRAC_CONST(0.97414586584250062), - FRAC_CONST(0.97781169577969584), - FRAC_CONST(0.98105641710392333), - FRAC_CONST(0.98391328975491177), - FRAC_CONST(0.98641503193166202), - FRAC_CONST(0.98859353733226141), - FRAC_CONST(0.99047962335771556), - FRAC_CONST(0.9921028127769449), - FRAC_CONST(0.99349115056397752), - FRAC_CONST(0.99467105680259038), - FRAC_CONST(0.9956672157341897), - FRAC_CONST(0.99650250022834352), - FRAC_CONST(0.99719793020823266), - FRAC_CONST(0.99777266288955657), - FRAC_CONST(0.99824401211201486), - FRAC_CONST(0.99862749357391212), - FRAC_CONST(0.99893689243401962), - FRAC_CONST(0.99918434952623147), - FRAC_CONST(0.99938046234161726), - FRAC_CONST(0.99953439696357238), - FRAC_CONST(0.99965400728430465), - FRAC_CONST(0.99974595807027455), - FRAC_CONST(0.99981584876278362), - FRAC_CONST(0.99986833527824281), - FRAC_CONST(0.99990724749057802), - FRAC_CONST(0.99993570051598468), - FRAC_CONST(0.99995619835942084), - FRAC_CONST(0.99997072890647543), - FRAC_CONST(0.9999808496399144), - FRAC_CONST(0.99998776381655818), - FRAC_CONST(0.99999238714961569), - FRAC_CONST(0.99999540529959718), - FRAC_CONST(0.99999732268176988), - FRAC_CONST(0.99999850325054862), - FRAC_CONST(0.99999920402413744), - FRAC_CONST(0.9999996021706401), - FRAC_CONST(0.99999981649545566), - FRAC_CONST(0.99999992415545547), - FRAC_CONST(0.99999997338493041), - FRAC_CONST(0.99999999295825959), - FRAC_CONST(0.99999999904096815) -}; - -#ifdef ALLOW_SMALL_FRAMELENGTH -ALIGN static const real_t kbd_short_120[] = -{ - FRAC_CONST(0.0000452320086910), - FRAC_CONST(0.0001274564692111), - FRAC_CONST(0.0002529398385345), - FRAC_CONST(0.0004335140496648), - FRAC_CONST(0.0006827100966952), - FRAC_CONST(0.0010158708222246), - FRAC_CONST(0.0014502162869659), - FRAC_CONST(0.0020048865156264), - FRAC_CONST(0.0027009618393178), - FRAC_CONST(0.0035614590925043), - FRAC_CONST(0.0046113018122711), - FRAC_CONST(0.0058772627936484), - FRAC_CONST(0.0073878776584103), - FRAC_CONST(0.0091733284512589), - FRAC_CONST(0.0112652966728373), - FRAC_CONST(0.0136967855861945), - FRAC_CONST(0.0165019120857793), - FRAC_CONST(0.0197156688892217), - FRAC_CONST(0.0233736582950619), - FRAC_CONST(0.0275117992367496), - FRAC_CONST(0.0321660098468534), - FRAC_CONST(0.0373718682174417), - FRAC_CONST(0.0431642544948834), - FRAC_CONST(0.0495769778717676), - FRAC_CONST(0.0566423924273392), - FRAC_CONST(0.0643910061132260), - FRAC_CONST(0.0728510874761729), - FRAC_CONST(0.0820482749475221), - FRAC_CONST(0.0920051937045235), - FRAC_CONST(0.1027410852163450), - FRAC_CONST(0.1142714546239370), - FRAC_CONST(0.1266077410648368), - FRAC_CONST(0.1397570159398145), - FRAC_CONST(0.1537217139274270), - FRAC_CONST(0.1684994012857075), - FRAC_CONST(0.1840825856392944), - FRAC_CONST(0.2004585710384133), - FRAC_CONST(0.2176093615976121), - FRAC_CONST(0.2355116164824983), - FRAC_CONST(0.2541366584185075), - FRAC_CONST(0.2734505372545160), - FRAC_CONST(0.2934141494343369), - FRAC_CONST(0.3139834135200387), - FRAC_CONST(0.3351095011824163), - FRAC_CONST(0.3567391223361566), - FRAC_CONST(0.3788148623608774), - FRAC_CONST(0.4012755686250732), - FRAC_CONST(0.4240567828288110), - FRAC_CONST(0.4470912150133537), - FRAC_CONST(0.4703092544619664), - FRAC_CONST(0.4936395121456694), - FRAC_CONST(0.5170093888596962), - FRAC_CONST(0.5403456627591340), - FRAC_CONST(0.5635750896430154), - FRAC_CONST(0.5866250090612892), - FRAC_CONST(0.6094239491338723), - FRAC_CONST(0.6319022228794100), - FRAC_CONST(0.6539925088563087), - FRAC_CONST(0.6756304090216887), - FRAC_CONST(0.6967549769155277), - FRAC_CONST(0.7173092095766250), - FRAC_CONST(0.7372404969921184), - FRAC_CONST(0.7565010233699827), - FRAC_CONST(0.7750481150999984), - FRAC_CONST(0.7928445309277697), - FRAC_CONST(0.8098586906021583), - FRAC_CONST(0.8260648390616000), - FRAC_CONST(0.8414431440907889), - FRAC_CONST(0.8559797262966709), - FRAC_CONST(0.8696666212110165), - FRAC_CONST(0.8825016743142358), - FRAC_CONST(0.8944883707784486), - FRAC_CONST(0.9056356027326216), - FRAC_CONST(0.9159573778427816), - FRAC_CONST(0.9254724739583072), - FRAC_CONST(0.9342040454819434), - FRAC_CONST(0.9421791879559176), - FRAC_CONST(0.9494284680976784), - FRAC_CONST(0.9559854271440150), - FRAC_CONST(0.9618860658493898), - FRAC_CONST(0.9671683198119525), - FRAC_CONST(0.9718715339497299), - FRAC_CONST(0.9760359449042233), - FRAC_CONST(0.9797021798981759), - FRAC_CONST(0.9829107801140203), - FRAC_CONST(0.9857017559923277), - FRAC_CONST(0.9881141809867999), - FRAC_CONST(0.9901858292742826), - FRAC_CONST(0.9919528617340944), - FRAC_CONST(0.9934495632180476), - FRAC_CONST(0.9947081327749199), - FRAC_CONST(0.9957585271195989), - FRAC_CONST(0.9966283562984427), - FRAC_CONST(0.9973428292485683), - FRAC_CONST(0.9979247458259197), - FRAC_CONST(0.9983945309245774), - FRAC_CONST(0.9987703055583410), - FRAC_CONST(0.9990679892449266), - FRAC_CONST(0.9993014277313617), - FRAC_CONST(0.9994825400228521), - FRAC_CONST(0.9996214788122335), - FRAC_CONST(0.9997267987294857), - FRAC_CONST(0.9998056273097539), - FRAC_CONST(0.9998638341781910), - FRAC_CONST(0.9999061946325793), - FRAC_CONST(0.9999365445321382), - FRAC_CONST(0.9999579241373735), - FRAC_CONST(0.9999727092594598), - FRAC_CONST(0.9999827287418790), - FRAC_CONST(0.9999893678912771), - FRAC_CONST(0.9999936579844555), - FRAC_CONST(0.9999963523959187), - FRAC_CONST(0.9999979902130101), - FRAC_CONST(0.9999989484358076), - FRAC_CONST(0.9999994840031031), - FRAC_CONST(0.9999997669534347), - FRAC_CONST(0.9999999060327799), - FRAC_CONST(0.9999999680107184), - FRAC_CONST(0.9999999918774242), - FRAC_CONST(0.9999999989770326) -}; -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/lt_predict.c b/src/libfaad/lt_predict.c deleted file mode 100644 index 3aab00426..000000000 --- a/src/libfaad/lt_predict.c +++ /dev/null @@ -1,215 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: lt_predict.c,v 1.7 2005/10/29 23:57:07 tmmm Exp $ -**/ - - -#include "common.h" -#include "structs.h" - -#ifdef LTP_DEC - -#include <stdlib.h> -#include "syntax.h" -#include "lt_predict.h" -#include "filtbank.h" -#include "tns.h" - - -/* static function declarations */ -static int16_t real_to_int16(real_t sig_in); - - -/* check if the object type is an object type that can have LTP */ -uint8_t is_ltp_ot(uint8_t object_type) -{ -#ifdef LTP_DEC - if ((object_type == LTP) -#ifdef ERROR_RESILIENCE - || (object_type == ER_LTP) -#endif -#ifdef LD_DEC - || (object_type == LD) -#endif -#ifdef SCALABLE_DEC - || (object_type == 6) /* TODO */ -#endif - ) - { - return 1; - } -#endif - - return 0; -} - -ALIGN static const real_t codebook[8] = -{ - REAL_CONST(0.570829), - REAL_CONST(0.696616), - REAL_CONST(0.813004), - REAL_CONST(0.911304), - REAL_CONST(0.984900), - REAL_CONST(1.067894), - REAL_CONST(1.194601), - REAL_CONST(1.369533) -}; - -void lt_prediction(ic_stream *ics, ltp_info *ltp, real_t *spec, - int16_t *lt_pred_stat, fb_info *fb, uint8_t win_shape, - uint8_t win_shape_prev, uint8_t sr_index, - uint8_t object_type, uint16_t frame_len) -{ - uint8_t sfb; - uint16_t bin, i, num_samples; - ALIGN real_t x_est[2048]; - ALIGN real_t X_est[2048]; - - if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) - { - if (ltp->data_present) - { - num_samples = frame_len << 1; - - for(i = 0; i < num_samples; i++) - { - /* The extra lookback M (N/2 for LD, 0 for LTP) is handled - in the buffer updating */ - -#if 0 - x_est[i] = MUL_R_C(lt_pred_stat[num_samples + i - ltp->lag], - codebook[ltp->coef]); -#else - /* lt_pred_stat is a 16 bit int, multiplied with the fixed point real - this gives a real for x_est - */ - x_est[i] = (real_t)lt_pred_stat[num_samples + i - ltp->lag] * codebook[ltp->coef]; -#endif - } - - filter_bank_ltp(fb, ics->window_sequence, win_shape, win_shape_prev, - x_est, X_est, object_type, frame_len); - - tns_encode_frame(ics, &(ics->tns), sr_index, object_type, X_est, - frame_len); - - for (sfb = 0; sfb < ltp->last_band; sfb++) - { - if (ltp->long_used[sfb]) - { - uint16_t low = ics->swb_offset[sfb]; - uint16_t high = ics->swb_offset[sfb+1]; - - for (bin = low; bin < high; bin++) - { - spec[bin] += X_est[bin]; - } - } - } - } - } -} - -#ifdef FIXED_POINT -static INLINE int16_t real_to_int16(real_t sig_in) -{ - if (sig_in >= 0) - { - sig_in += (1 << (REAL_BITS-1)); - if (sig_in >= REAL_CONST(32768)) - return 32767; - } else { - sig_in += -(1 << (REAL_BITS-1)); - if (sig_in <= REAL_CONST(-32768)) - return -32768; - } - - return (sig_in >> REAL_BITS); -} -#else -static INLINE int16_t real_to_int16(real_t sig_in) -{ - if (sig_in >= 0) - { -#ifndef HAS_LRINTF - sig_in += 0.5f; -#endif - if (sig_in >= 32768.0f) - return 32767; - } else { -#ifndef HAS_LRINTF - sig_in += -0.5f; -#endif - if (sig_in <= -32768.0f) - return -32768; - } - - return lrintf(sig_in); -} -#endif - -void lt_update_state(int16_t *lt_pred_stat, real_t *time, real_t *overlap, - uint16_t frame_len, uint8_t object_type) -{ - uint16_t i; - - /* - * The reference point for index i and the content of the buffer - * lt_pred_stat are arranged so that lt_pred_stat(0 ... N/2 - 1) contains the - * last aliased half window from the IMDCT, and lt_pred_stat(N/2 ... N-1) - * is always all zeros. The rest of lt_pred_stat (i<0) contains the previous - * fully reconstructed time domain samples, i.e., output of the decoder. - * - * These values are shifted up by N*2 to avoid (i<0) - * - * For the LD object type an extra 512 samples lookback is accomodated here. - */ -#ifdef LD_DEC - if (object_type == LD) - { - for (i = 0; i < frame_len; i++) - { - lt_pred_stat[i] /* extra 512 */ = lt_pred_stat[i + frame_len]; - lt_pred_stat[frame_len + i] = lt_pred_stat[i + (frame_len * 2)]; - lt_pred_stat[(frame_len * 2) + i] = real_to_int16(time[i]); - lt_pred_stat[(frame_len * 3) + i] = real_to_int16(overlap[i]); - } - } else { -#endif - for (i = 0; i < frame_len; i++) - { - lt_pred_stat[i] = lt_pred_stat[i + frame_len]; - lt_pred_stat[frame_len + i] = real_to_int16(time[i]); - lt_pred_stat[(frame_len * 2) + i] = real_to_int16(overlap[i]); -#if 0 /* set to zero once upon initialisation */ - lt_pred_stat[(frame_len * 3) + i] = 0; -#endif - } -#ifdef LD_DEC - } -#endif -} - -#endif diff --git a/src/libfaad/lt_predict.h b/src/libfaad/lt_predict.h deleted file mode 100644 index faa2fbca7..000000000 --- a/src/libfaad/lt_predict.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: lt_predict.h,v 1.7 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifdef LTP_DEC - -#ifndef __LT_PREDICT_H__ -#define __LT_PREDICT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "filtbank.h" - -uint8_t is_ltp_ot(uint8_t object_type); - -void lt_prediction(ic_stream *ics, - ltp_info *ltp, - real_t *spec, - int16_t *lt_pred_stat, - fb_info *fb, - uint8_t win_shape, - uint8_t win_shape_prev, - uint8_t sr_index, - uint8_t object_type, - uint16_t frame_len); - -void lt_update_state(int16_t *lt_pred_stat, - real_t *time, - real_t *overlap, - uint16_t frame_len, - uint8_t object_type); - -#ifdef __cplusplus -} -#endif -#endif - -#endif diff --git a/src/libfaad/mdct.c b/src/libfaad/mdct.c deleted file mode 100644 index 0df3d6aae..000000000 --- a/src/libfaad/mdct.c +++ /dev/null @@ -1,298 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: mdct.c,v 1.11 2005/10/29 23:57:07 tmmm Exp $ -**/ - -/* - * Fast (I)MDCT Implementation using (I)FFT ((Inverse) Fast Fourier Transform) - * and consists of three steps: pre-(I)FFT complex multiplication, complex - * (I)FFT, post-(I)FFT complex multiplication, - * - * As described in: - * P. Duhamel, Y. Mahieux, and J.P. Petit, "A Fast Algorithm for the - * Implementation of Filter Banks Based on 'Time Domain Aliasing - * Cancellation'," IEEE Proc. on ICASSP'91, 1991, pp. 2209-2212. - * - * - * As of April 6th 2002 completely rewritten. - * This (I)MDCT can now be used for any data size n, where n is divisible by 8. - * - */ - -#include "common.h" -#include "structs.h" - -#include <stdlib.h> -#ifdef _WIN32_WCE -#define assert(x) -#else -#include <assert.h> -#endif - -#include "cfft.h" -#include "mdct.h" -#include "mdct_tab.h" - - -mdct_info *faad_mdct_init(uint16_t N) -{ - mdct_info *mdct = (mdct_info*)faad_malloc(sizeof(mdct_info)); - - assert(N % 8 == 0); - - mdct->N = N; - - /* NOTE: For "small framelengths" in FIXED_POINT the coefficients need to be - * scaled by sqrt("(nearest power of 2) > N" / N) */ - - /* RE(mdct->sincos[k]) = scale*(real_t)(cos(2.0*M_PI*(k+1./8.) / (real_t)N)); - * IM(mdct->sincos[k]) = scale*(real_t)(sin(2.0*M_PI*(k+1./8.) / (real_t)N)); */ - /* scale is 1 for fixed point, sqrt(N) for floating point */ - switch (N) - { - case 2048: mdct->sincos = (complex_t*)mdct_tab_2048; break; - case 256: mdct->sincos = (complex_t*)mdct_tab_256; break; -#ifdef LD_DEC - case 1024: mdct->sincos = (complex_t*)mdct_tab_1024; break; -#endif -#ifdef ALLOW_SMALL_FRAMELENGTH - case 1920: mdct->sincos = (complex_t*)mdct_tab_1920; break; - case 240: mdct->sincos = (complex_t*)mdct_tab_240; break; -#ifdef LD_DEC - case 960: mdct->sincos = (complex_t*)mdct_tab_960; break; -#endif -#endif -#ifdef SSR_DEC - case 512: mdct->sincos = (complex_t*)mdct_tab_512; break; - case 64: mdct->sincos = (complex_t*)mdct_tab_64; break; -#endif - } - - /* initialise fft */ - mdct->cfft = cffti(N/4); - -#ifdef PROFILE - mdct->cycles = 0; - mdct->fft_cycles = 0; -#endif - - return mdct; -} - -void faad_mdct_end(mdct_info *mdct) -{ - if (mdct != NULL) - { -#ifdef PROFILE - printf("MDCT[%.4d]: %I64d cycles\n", mdct->N, mdct->cycles); - printf("CFFT[%.4d]: %I64d cycles\n", mdct->N/4, mdct->fft_cycles); -#endif - - cfftu(mdct->cfft); - - faad_free(mdct); - } -} - -void faad_imdct(mdct_info *mdct, real_t *X_in, real_t *X_out) -{ - uint16_t k; - - complex_t x; -#ifdef ALLOW_SMALL_FRAMELENGTH -#ifdef FIXED_POINT - real_t scale, b_scale = 0; -#endif -#endif - ALIGN complex_t Z1[512]; - complex_t *sincos = mdct->sincos; - - uint16_t N = mdct->N; - uint16_t N2 = N >> 1; - uint16_t N4 = N >> 2; - uint16_t N8 = N >> 3; - -#ifdef PROFILE - int64_t count1, count2 = faad_get_ts(); -#endif - -#ifdef ALLOW_SMALL_FRAMELENGTH -#ifdef FIXED_POINT - /* detect non-power of 2 */ - if (N & (N-1)) - { - /* adjust scale for non-power of 2 MDCT */ - /* 2048/1920 */ - b_scale = 1; - scale = COEF_CONST(1.0666666666666667); - } -#endif -#endif - - /* pre-IFFT complex multiplication */ - for (k = 0; k < N4; k++) - { - ComplexMult(&IM(Z1[k]), &RE(Z1[k]), - X_in[2*k], X_in[N2 - 1 - 2*k], RE(sincos[k]), IM(sincos[k])); - } - -#ifdef PROFILE - count1 = faad_get_ts(); -#endif - - /* complex IFFT, any non-scaling FFT can be used here */ - cfftb(mdct->cfft, Z1); - -#ifdef PROFILE - count1 = faad_get_ts() - count1; -#endif - - /* post-IFFT complex multiplication */ - for (k = 0; k < N4; k++) - { - RE(x) = RE(Z1[k]); - IM(x) = IM(Z1[k]); - ComplexMult(&IM(Z1[k]), &RE(Z1[k]), - IM(x), RE(x), RE(sincos[k]), IM(sincos[k])); - -#ifdef ALLOW_SMALL_FRAMELENGTH -#ifdef FIXED_POINT - /* non-power of 2 MDCT scaling */ - if (b_scale) - { - RE(Z1[k]) = MUL_C(RE(Z1[k]), scale); - IM(Z1[k]) = MUL_C(IM(Z1[k]), scale); - } -#endif -#endif - } - - /* reordering */ - for (k = 0; k < N8; k+=2) - { - X_out[ 2*k] = IM(Z1[N8 + k]); - X_out[ 2 + 2*k] = IM(Z1[N8 + 1 + k]); - - X_out[ 1 + 2*k] = -RE(Z1[N8 - 1 - k]); - X_out[ 3 + 2*k] = -RE(Z1[N8 - 2 - k]); - - X_out[N4 + 2*k] = RE(Z1[ k]); - X_out[N4 + + 2 + 2*k] = RE(Z1[ 1 + k]); - - X_out[N4 + 1 + 2*k] = -IM(Z1[N4 - 1 - k]); - X_out[N4 + 3 + 2*k] = -IM(Z1[N4 - 2 - k]); - - X_out[N2 + 2*k] = RE(Z1[N8 + k]); - X_out[N2 + + 2 + 2*k] = RE(Z1[N8 + 1 + k]); - - X_out[N2 + 1 + 2*k] = -IM(Z1[N8 - 1 - k]); - X_out[N2 + 3 + 2*k] = -IM(Z1[N8 - 2 - k]); - - X_out[N2 + N4 + 2*k] = -IM(Z1[ k]); - X_out[N2 + N4 + 2 + 2*k] = -IM(Z1[ 1 + k]); - - X_out[N2 + N4 + 1 + 2*k] = RE(Z1[N4 - 1 - k]); - X_out[N2 + N4 + 3 + 2*k] = RE(Z1[N4 - 2 - k]); - } - -#ifdef PROFILE - count2 = faad_get_ts() - count2; - mdct->fft_cycles += count1; - mdct->cycles += (count2 - count1); -#endif -} - -#ifdef LTP_DEC -void faad_mdct(mdct_info *mdct, real_t *X_in, real_t *X_out) -{ - uint16_t k; - - complex_t x; - ALIGN complex_t Z1[512]; - complex_t *sincos = mdct->sincos; - - uint16_t N = mdct->N; - uint16_t N2 = N >> 1; - uint16_t N4 = N >> 2; - uint16_t N8 = N >> 3; - -#ifndef FIXED_POINT - real_t scale = REAL_CONST(N); -#else - real_t scale = REAL_CONST(4.0/N); -#endif - -#ifdef ALLOW_SMALL_FRAMELENGTH -#ifdef FIXED_POINT - /* detect non-power of 2 */ - if (N & (N-1)) - { - /* adjust scale for non-power of 2 MDCT */ - /* *= sqrt(2048/1920) */ - scale = MUL_C(scale, COEF_CONST(1.0327955589886444)); - } -#endif -#endif - - /* pre-FFT complex multiplication */ - for (k = 0; k < N8; k++) - { - uint16_t n = k << 1; - RE(x) = X_in[N - N4 - 1 - n] + X_in[N - N4 + n]; - IM(x) = X_in[ N4 + n] - X_in[ N4 - 1 - n]; - - ComplexMult(&RE(Z1[k]), &IM(Z1[k]), - RE(x), IM(x), RE(sincos[k]), IM(sincos[k])); - - RE(Z1[k]) = MUL_R(RE(Z1[k]), scale); - IM(Z1[k]) = MUL_R(IM(Z1[k]), scale); - - RE(x) = X_in[N2 - 1 - n] - X_in[ n]; - IM(x) = X_in[N2 + n] + X_in[N - 1 - n]; - - ComplexMult(&RE(Z1[k + N8]), &IM(Z1[k + N8]), - RE(x), IM(x), RE(sincos[k + N8]), IM(sincos[k + N8])); - - RE(Z1[k + N8]) = MUL_R(RE(Z1[k + N8]), scale); - IM(Z1[k + N8]) = MUL_R(IM(Z1[k + N8]), scale); - } - - /* complex FFT, any non-scaling FFT can be used here */ - cfftf(mdct->cfft, Z1); - - /* post-FFT complex multiplication */ - for (k = 0; k < N4; k++) - { - uint16_t n = k << 1; - ComplexMult(&RE(x), &IM(x), - RE(Z1[k]), IM(Z1[k]), RE(sincos[k]), IM(sincos[k])); - - X_out[ n] = -RE(x); - X_out[N2 - 1 - n] = IM(x); - X_out[N2 + n] = -IM(x); - X_out[N - 1 - n] = RE(x); - } -} -#endif diff --git a/src/libfaad/mdct.h b/src/libfaad/mdct.h deleted file mode 100644 index c2b738795..000000000 --- a/src/libfaad/mdct.h +++ /dev/null @@ -1,45 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: mdct.h,v 1.8 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __MDCT_H__ -#define __MDCT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -mdct_info *faad_mdct_init(uint16_t N); -void faad_mdct_end(mdct_info *mdct); -void faad_imdct(mdct_info *mdct, real_t *X_in, real_t *X_out); -void faad_mdct(mdct_info *mdct, real_t *X_in, real_t *X_out); - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/mdct_tab.h b/src/libfaad/mdct_tab.h deleted file mode 100644 index 7dd17166b..000000000 --- a/src/libfaad/mdct_tab.h +++ /dev/null @@ -1,3652 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: mdct_tab.h,v 1.1 2005/10/30 00:50:19 tmmm Exp $ -**/ - -#ifndef __MDCT_TAB_H__ -#define __MDCT_TAB_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef FIXED_POINT - -/* 256 (N/4) complex twiddle factors */ -ALIGN static const complex_t mdct_tab_2048[] = -{ - { FRAC_CONST(0.999999926465718), FRAC_CONST(0.000383495187571) }, - { FRAC_CONST(0.999994043728986), FRAC_CONST(0.003451449920136) }, - { FRAC_CONST(0.999978748667469), FRAC_CONST(0.006519372166339) }, - { FRAC_CONST(0.999954041425130), FRAC_CONST(0.009587233049729) }, - { FRAC_CONST(0.999919922234523), FRAC_CONST(0.012655003694430) }, - { FRAC_CONST(0.999876391416790), FRAC_CONST(0.015722655225417) }, - { FRAC_CONST(0.999823449381662), FRAC_CONST(0.018790158768785) }, - { FRAC_CONST(0.999761096627447), FRAC_CONST(0.021857485452022) }, - { FRAC_CONST(0.999689333741034), FRAC_CONST(0.024924606404281) }, - { FRAC_CONST(0.999608161397882), FRAC_CONST(0.027991492756653) }, - { FRAC_CONST(0.999517580362017), FRAC_CONST(0.031058115642435) }, - { FRAC_CONST(0.999417591486022), FRAC_CONST(0.034124446197403) }, - { FRAC_CONST(0.999308195711029), FRAC_CONST(0.037190455560088) }, - { FRAC_CONST(0.999189394066715), FRAC_CONST(0.040256114872041) }, - { FRAC_CONST(0.999061187671285), FRAC_CONST(0.043321395278110) }, - { FRAC_CONST(0.998923577731466), FRAC_CONST(0.046386267926707) }, - { FRAC_CONST(0.998776565542496), FRAC_CONST(0.049450703970085) }, - { FRAC_CONST(0.998620152488109), FRAC_CONST(0.052514674564603) }, - { FRAC_CONST(0.998454340040525), FRAC_CONST(0.055578150871005) }, - { FRAC_CONST(0.998279129760433), FRAC_CONST(0.058641104054683) }, - { FRAC_CONST(0.998094523296980), FRAC_CONST(0.061703505285957) }, - { FRAC_CONST(0.997900522387752), FRAC_CONST(0.064765325740340) }, - { FRAC_CONST(0.997697128858759), FRAC_CONST(0.067826536598811) }, - { FRAC_CONST(0.997484344624418), FRAC_CONST(0.070887109048088) }, - { FRAC_CONST(0.997262171687536), FRAC_CONST(0.073947014280897) }, - { FRAC_CONST(0.997030612139289), FRAC_CONST(0.077006223496246) }, - { FRAC_CONST(0.996789668159205), FRAC_CONST(0.080064707899691) }, - { FRAC_CONST(0.996539342015138), FRAC_CONST(0.083122438703613) }, - { FRAC_CONST(0.996279636063255), FRAC_CONST(0.086179387127485) }, - { FRAC_CONST(0.996010552748006), FRAC_CONST(0.089235524398144) }, - { FRAC_CONST(0.995732094602106), FRAC_CONST(0.092290821750062) }, - { FRAC_CONST(0.995444264246510), FRAC_CONST(0.095345250425618) }, - { FRAC_CONST(0.995147064390386), FRAC_CONST(0.098398781675364) }, - { FRAC_CONST(0.994840497831093), FRAC_CONST(0.101451386758302) }, - { FRAC_CONST(0.994524567454152), FRAC_CONST(0.104503036942151) }, - { FRAC_CONST(0.994199276233219), FRAC_CONST(0.107553703503616) }, - { FRAC_CONST(0.993864627230060), FRAC_CONST(0.110603357728662) }, - { FRAC_CONST(0.993520623594518), FRAC_CONST(0.113651970912782) }, - { FRAC_CONST(0.993167268564487), FRAC_CONST(0.116699514361268) }, - { FRAC_CONST(0.992804565465879), FRAC_CONST(0.119745959389480) }, - { FRAC_CONST(0.992432517712594), FRAC_CONST(0.122791277323117) }, - { FRAC_CONST(0.992051128806486), FRAC_CONST(0.125835439498487) }, - { FRAC_CONST(0.991660402337333), FRAC_CONST(0.128878417262777) }, - { FRAC_CONST(0.991260341982802), FRAC_CONST(0.131920181974320) }, - { FRAC_CONST(0.990850951508414), FRAC_CONST(0.134960705002869) }, - { FRAC_CONST(0.990432234767506), FRAC_CONST(0.137999957729863) }, - { FRAC_CONST(0.990004195701201), FRAC_CONST(0.141037911548698) }, - { FRAC_CONST(0.989566838338365), FRAC_CONST(0.144074537864995) }, - { FRAC_CONST(0.989120166795573), FRAC_CONST(0.147109808096872) }, - { FRAC_CONST(0.988664185277066), FRAC_CONST(0.150143693675208) }, - { FRAC_CONST(0.988198898074718), FRAC_CONST(0.153176166043918) }, - { FRAC_CONST(0.987724309567987), FRAC_CONST(0.156207196660216) }, - { FRAC_CONST(0.987240424223882), FRAC_CONST(0.159236756994888) }, - { FRAC_CONST(0.986747246596917), FRAC_CONST(0.162264818532558) }, - { FRAC_CONST(0.986244781329065), FRAC_CONST(0.165291352771958) }, - { FRAC_CONST(0.985733033149723), FRAC_CONST(0.168316331226195) }, - { FRAC_CONST(0.985212006875659), FRAC_CONST(0.171339725423019) }, - { FRAC_CONST(0.984681707410971), FRAC_CONST(0.174361506905094) }, - { FRAC_CONST(0.984142139747039), FRAC_CONST(0.177381647230260) }, - { FRAC_CONST(0.983593308962479), FRAC_CONST(0.180400117971807) }, - { FRAC_CONST(0.983035220223096), FRAC_CONST(0.183416890718739) }, - { FRAC_CONST(0.982467878781833), FRAC_CONST(0.186431937076042) }, - { FRAC_CONST(0.981891289978725), FRAC_CONST(0.189445228664950) }, - { FRAC_CONST(0.981305459240845), FRAC_CONST(0.192456737123217) }, - { FRAC_CONST(0.980710392082254), FRAC_CONST(0.195466434105377) }, - { FRAC_CONST(0.980106094103952), FRAC_CONST(0.198474291283016) }, - { FRAC_CONST(0.979492570993821), FRAC_CONST(0.201480280345038) }, - { FRAC_CONST(0.978869828526574), FRAC_CONST(0.204484372997927) }, - { FRAC_CONST(0.978237872563701), FRAC_CONST(0.207486540966021) }, - { FRAC_CONST(0.977596709053412), FRAC_CONST(0.210486755991770) }, - { FRAC_CONST(0.976946344030582), FRAC_CONST(0.213484989836008) }, - { FRAC_CONST(0.976286783616694), FRAC_CONST(0.216481214278217) }, - { FRAC_CONST(0.975618034019782), FRAC_CONST(0.219475401116790) }, - { FRAC_CONST(0.974940101534372), FRAC_CONST(0.222467522169302) }, - { FRAC_CONST(0.974252992541423), FRAC_CONST(0.225457549272769) }, - { FRAC_CONST(0.973556713508266), FRAC_CONST(0.228445454283916) }, - { FRAC_CONST(0.972851270988544), FRAC_CONST(0.231431209079446) }, - { FRAC_CONST(0.972136671622152), FRAC_CONST(0.234414785556295) }, - { FRAC_CONST(0.971412922135171), FRAC_CONST(0.237396155631907) }, - { FRAC_CONST(0.970680029339806), FRAC_CONST(0.240375291244489) }, - { FRAC_CONST(0.969938000134324), FRAC_CONST(0.243352164353285) }, - { FRAC_CONST(0.969186841502986), FRAC_CONST(0.246326746938829) }, - { FRAC_CONST(0.968426560515983), FRAC_CONST(0.249299011003218) }, - { FRAC_CONST(0.967657164329370), FRAC_CONST(0.252268928570371) }, - { FRAC_CONST(0.966878660184996), FRAC_CONST(0.255236471686292) }, - { FRAC_CONST(0.966091055410439), FRAC_CONST(0.258201612419335) }, - { FRAC_CONST(0.965294357418935), FRAC_CONST(0.261164322860466) }, - { FRAC_CONST(0.964488573709308), FRAC_CONST(0.264124575123528) }, - { FRAC_CONST(0.963673711865903), FRAC_CONST(0.267082341345496) }, - { FRAC_CONST(0.962849779558509), FRAC_CONST(0.270037593686751) }, - { FRAC_CONST(0.962016784542291), FRAC_CONST(0.272990304331330) }, - { FRAC_CONST(0.961174734657714), FRAC_CONST(0.275940445487197) }, - { FRAC_CONST(0.960323637830474), FRAC_CONST(0.278887989386500) }, - { FRAC_CONST(0.959463502071418), FRAC_CONST(0.281832908285833) }, - { FRAC_CONST(0.958594335476470), FRAC_CONST(0.284775174466498) }, - { FRAC_CONST(0.957716146226559), FRAC_CONST(0.287714760234765) }, - { FRAC_CONST(0.956828942587535), FRAC_CONST(0.290651637922133) }, - { FRAC_CONST(0.955932732910098), FRAC_CONST(0.293585779885591) }, - { FRAC_CONST(0.955027525629714), FRAC_CONST(0.296517158507877) }, - { FRAC_CONST(0.954113329266539), FRAC_CONST(0.299445746197740) }, - { FRAC_CONST(0.953190152425337), FRAC_CONST(0.302371515390196) }, - { FRAC_CONST(0.952258003795400), FRAC_CONST(0.305294438546792) }, - { FRAC_CONST(0.951316892150466), FRAC_CONST(0.308214488155861) }, - { FRAC_CONST(0.950366826348636), FRAC_CONST(0.311131636732785) }, - { FRAC_CONST(0.949407815332292), FRAC_CONST(0.314045856820251) }, - { FRAC_CONST(0.948439868128010), FRAC_CONST(0.316957120988508) }, - { FRAC_CONST(0.947462993846478), FRAC_CONST(0.319865401835631) }, - { FRAC_CONST(0.946477201682409), FRAC_CONST(0.322770671987771) }, - { FRAC_CONST(0.945482500914454), FRAC_CONST(0.325672904099420) }, - { FRAC_CONST(0.944478900905116), FRAC_CONST(0.328572070853664) }, - { FRAC_CONST(0.943466411100659), FRAC_CONST(0.331468144962441) }, - { FRAC_CONST(0.942445041031025), FRAC_CONST(0.334361099166799) }, - { FRAC_CONST(0.941414800309736), FRAC_CONST(0.337250906237151) }, - { FRAC_CONST(0.940375698633812), FRAC_CONST(0.340137538973532) }, - { FRAC_CONST(0.939327745783671), FRAC_CONST(0.343020970205856) }, - { FRAC_CONST(0.938270951623047), FRAC_CONST(0.345901172794169) }, - { FRAC_CONST(0.937205326098888), FRAC_CONST(0.348778119628908) }, - { FRAC_CONST(0.936130879241267), FRAC_CONST(0.351651783631155) }, - { FRAC_CONST(0.935047621163287), FRAC_CONST(0.354522137752887) }, - { FRAC_CONST(0.933955562060987), FRAC_CONST(0.357389154977241) }, - { FRAC_CONST(0.932854712213241), FRAC_CONST(0.360252808318757) }, - { FRAC_CONST(0.931745081981669), FRAC_CONST(0.363113070823639) }, - { FRAC_CONST(0.930626681810532), FRAC_CONST(0.365969915570009) }, - { FRAC_CONST(0.929499522226639), FRAC_CONST(0.368823315668154) }, - { FRAC_CONST(0.928363613839244), FRAC_CONST(0.371673244260787) }, - { FRAC_CONST(0.927218967339952), FRAC_CONST(0.374519674523293) }, - { FRAC_CONST(0.926065593502609), FRAC_CONST(0.377362579663988) }, - { FRAC_CONST(0.924903503183211), FRAC_CONST(0.380201932924366) }, - { FRAC_CONST(0.923732707319793), FRAC_CONST(0.383037707579352) }, - { FRAC_CONST(0.922553216932333), FRAC_CONST(0.385869876937555) }, - { FRAC_CONST(0.921365043122642), FRAC_CONST(0.388698414341519) }, - { FRAC_CONST(0.920168197074266), FRAC_CONST(0.391523293167972) }, - { FRAC_CONST(0.918962690052376), FRAC_CONST(0.394344486828080) }, - { FRAC_CONST(0.917748533403661), FRAC_CONST(0.397161968767692) }, - { FRAC_CONST(0.916525738556228), FRAC_CONST(0.399975712467595) }, - { FRAC_CONST(0.915294317019487), FRAC_CONST(0.402785691443764) }, - { FRAC_CONST(0.914054280384047), FRAC_CONST(0.405591879247604) }, - { FRAC_CONST(0.912805640321604), FRAC_CONST(0.408394249466208) }, - { FRAC_CONST(0.911548408584834), FRAC_CONST(0.411192775722600) }, - { FRAC_CONST(0.910282597007282), FRAC_CONST(0.413987431675985) }, - { FRAC_CONST(0.909008217503247), FRAC_CONST(0.416778191021998) }, - { FRAC_CONST(0.907725282067676), FRAC_CONST(0.419565027492947) }, - { FRAC_CONST(0.906433802776045), FRAC_CONST(0.422347914858067) }, - { FRAC_CONST(0.905133791784250), FRAC_CONST(0.425126826923762) }, - { FRAC_CONST(0.903825261328488), FRAC_CONST(0.427901737533854) }, - { FRAC_CONST(0.902508223725146), FRAC_CONST(0.430672620569827) }, - { FRAC_CONST(0.901182691370685), FRAC_CONST(0.433439449951074) }, - { FRAC_CONST(0.899848676741519), FRAC_CONST(0.436202199635144) }, - { FRAC_CONST(0.898506192393902), FRAC_CONST(0.438960843617984) }, - { FRAC_CONST(0.897155250963809), FRAC_CONST(0.441715355934187) }, - { FRAC_CONST(0.895795865166814), FRAC_CONST(0.444465710657234) }, - { FRAC_CONST(0.894428047797974), FRAC_CONST(0.447211881899738) }, - { FRAC_CONST(0.893051811731707), FRAC_CONST(0.449953843813691) }, - { FRAC_CONST(0.891667169921672), FRAC_CONST(0.452691570590701) }, - { FRAC_CONST(0.890274135400645), FRAC_CONST(0.455425036462242) }, - { FRAC_CONST(0.888872721280396), FRAC_CONST(0.458154215699893) }, - { FRAC_CONST(0.887462940751569), FRAC_CONST(0.460879082615579) }, - { FRAC_CONST(0.886044807083556), FRAC_CONST(0.463599611561814) }, - { FRAC_CONST(0.884618333624370), FRAC_CONST(0.466315776931944) }, - { FRAC_CONST(0.883183533800523), FRAC_CONST(0.469027553160387) }, - { FRAC_CONST(0.881740421116898), FRAC_CONST(0.471734914722871) }, - { FRAC_CONST(0.880289009156621), FRAC_CONST(0.474437836136679) }, - { FRAC_CONST(0.878829311580933), FRAC_CONST(0.477136291960885) }, - { FRAC_CONST(0.877361342129065), FRAC_CONST(0.479830256796594) }, - { FRAC_CONST(0.875885114618104), FRAC_CONST(0.482519705287184) }, - { FRAC_CONST(0.874400642942865), FRAC_CONST(0.485204612118542) }, - { FRAC_CONST(0.872907941075761), FRAC_CONST(0.487884952019301) }, - { FRAC_CONST(0.871407023066671), FRAC_CONST(0.490560699761082) }, - { FRAC_CONST(0.869897903042806), FRAC_CONST(0.493231830158728) }, - { FRAC_CONST(0.868380595208580), FRAC_CONST(0.495898318070542) }, - { FRAC_CONST(0.866855113845470), FRAC_CONST(0.498560138398525) }, - { FRAC_CONST(0.865321473311890), FRAC_CONST(0.501217266088610) }, - { FRAC_CONST(0.863779688043047), FRAC_CONST(0.503869676130899) }, - { FRAC_CONST(0.862229772550811), FRAC_CONST(0.506517343559899) }, - { FRAC_CONST(0.860671741423578), FRAC_CONST(0.509160243454755) }, - { FRAC_CONST(0.859105609326130), FRAC_CONST(0.511798350939487) }, - { FRAC_CONST(0.857531390999499), FRAC_CONST(0.514431641183223) }, - { FRAC_CONST(0.855949101260827), FRAC_CONST(0.517060089400432) }, - { FRAC_CONST(0.854358755003227), FRAC_CONST(0.519683670851158) }, - { FRAC_CONST(0.852760367195645), FRAC_CONST(0.522302360841255) }, - { FRAC_CONST(0.851153952882715), FRAC_CONST(0.524916134722613) }, - { FRAC_CONST(0.849539527184621), FRAC_CONST(0.527524967893398) }, - { FRAC_CONST(0.847917105296951), FRAC_CONST(0.530128835798279) }, - { FRAC_CONST(0.846286702490560), FRAC_CONST(0.532727713928659) }, - { FRAC_CONST(0.844648334111418), FRAC_CONST(0.535321577822907) }, - { FRAC_CONST(0.843002015580473), FRAC_CONST(0.537910403066589) }, - { FRAC_CONST(0.841347762393502), FRAC_CONST(0.540494165292695) }, - { FRAC_CONST(0.839685590120966), FRAC_CONST(0.543072840181872) }, - { FRAC_CONST(0.838015514407864), FRAC_CONST(0.545646403462649) }, - { FRAC_CONST(0.836337550973584), FRAC_CONST(0.548214830911668) }, - { FRAC_CONST(0.834651715611756), FRAC_CONST(0.550778098353912) }, - { FRAC_CONST(0.832958024190107), FRAC_CONST(0.553336181662932) }, - { FRAC_CONST(0.831256492650303), FRAC_CONST(0.555889056761074) }, - { FRAC_CONST(0.829547137007809), FRAC_CONST(0.558436699619704) }, - { FRAC_CONST(0.827829973351730), FRAC_CONST(0.560979086259438) }, - { FRAC_CONST(0.826105017844665), FRAC_CONST(0.563516192750365) }, - { FRAC_CONST(0.824372286722551), FRAC_CONST(0.566047995212271) }, - { FRAC_CONST(0.822631796294515), FRAC_CONST(0.568574469814869) }, - { FRAC_CONST(0.820883562942715), FRAC_CONST(0.571095592778017) }, - { FRAC_CONST(0.819127603122188), FRAC_CONST(0.573611340371945) }, - { FRAC_CONST(0.817363933360698), FRAC_CONST(0.576121688917478) }, - { FRAC_CONST(0.815592570258577), FRAC_CONST(0.578626614786261) }, - { FRAC_CONST(0.813813530488567), FRAC_CONST(0.581126094400978) }, - { FRAC_CONST(0.812026830795670), FRAC_CONST(0.583620104235573) }, - { FRAC_CONST(0.810232487996982), FRAC_CONST(0.586108620815476) }, - { FRAC_CONST(0.808430518981543), FRAC_CONST(0.588591620717823) }, - { FRAC_CONST(0.806620940710170), FRAC_CONST(0.591069080571671) }, - { FRAC_CONST(0.804803770215303), FRAC_CONST(0.593540977058226) }, - { FRAC_CONST(0.802979024600843), FRAC_CONST(0.596007286911057) }, - { FRAC_CONST(0.801146721041991), FRAC_CONST(0.598467986916314) }, - { FRAC_CONST(0.799306876785086), FRAC_CONST(0.600923053912954) }, - { FRAC_CONST(0.797459509147442), FRAC_CONST(0.603372464792950) }, - { FRAC_CONST(0.795604635517188), FRAC_CONST(0.605816196501515) }, - { FRAC_CONST(0.793742273353100), FRAC_CONST(0.608254226037314) }, - { FRAC_CONST(0.791872440184440), FRAC_CONST(0.610686530452686) }, - { FRAC_CONST(0.789995153610791), FRAC_CONST(0.613113086853855) }, - { FRAC_CONST(0.788110431301888), FRAC_CONST(0.615533872401147) }, - { FRAC_CONST(0.786218290997456), FRAC_CONST(0.617948864309208) }, - { FRAC_CONST(0.784318750507039), FRAC_CONST(0.620358039847214) }, - { FRAC_CONST(0.782411827709837), FRAC_CONST(0.622761376339086) }, - { FRAC_CONST(0.780497540554532), FRAC_CONST(0.625158851163708) }, - { FRAC_CONST(0.778575907059125), FRAC_CONST(0.627550441755132) }, - { FRAC_CONST(0.776646945310762), FRAC_CONST(0.629936125602796) }, - { FRAC_CONST(0.774710673465566), FRAC_CONST(0.632315880251738) }, - { FRAC_CONST(0.772767109748464), FRAC_CONST(0.634689683302798) }, - { FRAC_CONST(0.770816272453019), FRAC_CONST(0.637057512412839) }, - { FRAC_CONST(0.768858179941253), FRAC_CONST(0.639419345294951) }, - { FRAC_CONST(0.766892850643481), FRAC_CONST(0.641775159718664) }, - { FRAC_CONST(0.764920303058128), FRAC_CONST(0.644124933510155) }, - { FRAC_CONST(0.762940555751566), FRAC_CONST(0.646468644552458) }, - { FRAC_CONST(0.760953627357928), FRAC_CONST(0.648806270785673) }, - { FRAC_CONST(0.758959536578942), FRAC_CONST(0.651137790207170) }, - { FRAC_CONST(0.756958302183750), FRAC_CONST(0.653463180871802) }, - { FRAC_CONST(0.754949943008733), FRAC_CONST(0.655782420892106) }, - { FRAC_CONST(0.752934477957330), FRAC_CONST(0.658095488438511) }, - { FRAC_CONST(0.750911925999868), FRAC_CONST(0.660402361739545) }, - { FRAC_CONST(0.748882306173375), FRAC_CONST(0.662703019082037) }, - { FRAC_CONST(0.746845637581407), FRAC_CONST(0.664997438811325) }, - { FRAC_CONST(0.744801939393863), FRAC_CONST(0.667285599331456) }, - { FRAC_CONST(0.742751230846809), FRAC_CONST(0.669567479105392) }, - { FRAC_CONST(0.740693531242296), FRAC_CONST(0.671843056655212) }, - { FRAC_CONST(0.738628859948175), FRAC_CONST(0.674112310562312) }, - { FRAC_CONST(0.736557236397919), FRAC_CONST(0.676375219467612) }, - { FRAC_CONST(0.734478680090438), FRAC_CONST(0.678631762071749) }, - { FRAC_CONST(0.732393210589896), FRAC_CONST(0.680881917135287) }, - { FRAC_CONST(0.730300847525525), FRAC_CONST(0.683125663478909) }, - { FRAC_CONST(0.728201610591445), FRAC_CONST(0.685362979983619) }, - { FRAC_CONST(0.726095519546471), FRAC_CONST(0.687593845590942) }, - { FRAC_CONST(0.723982594213936), FRAC_CONST(0.689818239303122) }, - { FRAC_CONST(0.721862854481496), FRAC_CONST(0.692036140183319) }, - { FRAC_CONST(0.719736320300951), FRAC_CONST(0.694247527355803) }, - { FRAC_CONST(0.717603011688049), FRAC_CONST(0.696452380006158) }, - { FRAC_CONST(0.715462948722304), FRAC_CONST(0.698650677381469) }, - { FRAC_CONST(0.713316151546803), FRAC_CONST(0.700842398790526) }, - { FRAC_CONST(0.711162640368018), FRAC_CONST(0.703027523604011) }, - { FRAC_CONST(0.709002435455618), FRAC_CONST(0.705206031254698) }, - { FRAC_CONST(0.706835557142274), FRAC_CONST(0.707377901237642) }, - { FRAC_CONST(0.704662025823469), FRAC_CONST(0.709543113110377) }, - { FRAC_CONST(0.702481861957308), FRAC_CONST(0.711701646493103) }, - { FRAC_CONST(0.700295086064324), FRAC_CONST(0.713853481068882) }, - { FRAC_CONST(0.698101718727284), FRAC_CONST(0.715998596583829) }, - { FRAC_CONST(0.695901780590997), FRAC_CONST(0.718136972847297) }, - { FRAC_CONST(0.693695292362118), FRAC_CONST(0.720268589732077) }, - { FRAC_CONST(0.691482274808956), FRAC_CONST(0.722393427174578) }, - { FRAC_CONST(0.689262748761273), FRAC_CONST(0.724511465175020) }, - { FRAC_CONST(0.687036735110096), FRAC_CONST(0.726622683797623) }, - { FRAC_CONST(0.684804254807511), FRAC_CONST(0.728727063170794) }, - { FRAC_CONST(0.682565328866473), FRAC_CONST(0.730824583487312) }, - { FRAC_CONST(0.680319978360607), FRAC_CONST(0.732915225004518) }, - { FRAC_CONST(0.678068224424007), FRAC_CONST(0.734998968044497) }, - { FRAC_CONST(0.675810088251037), FRAC_CONST(0.737075792994266) }, - { FRAC_CONST(0.673545591096136), FRAC_CONST(0.739145680305957) }, - { FRAC_CONST(0.671274754273613), FRAC_CONST(0.741208610497004) }, - { FRAC_CONST(0.668997599157450), FRAC_CONST(0.743264564150321) }, - { FRAC_CONST(0.666714147181098), FRAC_CONST(0.745313521914490) }, - { FRAC_CONST(0.664424419837275), FRAC_CONST(0.747355464503940) }, - { FRAC_CONST(0.662128438677769), FRAC_CONST(0.749390372699130) }, - { FRAC_CONST(0.659826225313227), FRAC_CONST(0.751418227346727) }, - { FRAC_CONST(0.657517801412960), FRAC_CONST(0.753439009359794) }, - { FRAC_CONST(0.655203188704732), FRAC_CONST(0.755452699717958) }, - { FRAC_CONST(0.652882408974559), FRAC_CONST(0.757459279467601) }, - { FRAC_CONST(0.650555484066504), FRAC_CONST(0.759458729722028) }, - { FRAC_CONST(0.648222435882470), FRAC_CONST(0.761451031661654) }, - { FRAC_CONST(0.645883286381996), FRAC_CONST(0.763436166534172) }, - { FRAC_CONST(0.643538057582048), FRAC_CONST(0.765414115654738) }, - { FRAC_CONST(0.641186771556811), FRAC_CONST(0.767384860406142) }, - { FRAC_CONST(0.638829450437486), FRAC_CONST(0.769348382238982) }, - { FRAC_CONST(0.636466116412077), FRAC_CONST(0.771304662671845) }, - { FRAC_CONST(0.634096791725184), FRAC_CONST(0.773253683291473) }, - { FRAC_CONST(0.631721498677792), FRAC_CONST(0.775195425752941) }, - { FRAC_CONST(0.629340259627066), FRAC_CONST(0.777129871779832) }, - { FRAC_CONST(0.626953096986133), FRAC_CONST(0.779057003164401) }, - { FRAC_CONST(0.624560033223877), FRAC_CONST(0.780976801767754) }, - { FRAC_CONST(0.622161090864727), FRAC_CONST(0.782889249520015) }, - { FRAC_CONST(0.619756292488441), FRAC_CONST(0.784794328420499) }, - { FRAC_CONST(0.617345660729897), FRAC_CONST(0.786692020537877) }, - { FRAC_CONST(0.614929218278880), FRAC_CONST(0.788582308010347) }, - { FRAC_CONST(0.612506987879866), FRAC_CONST(0.790465173045805) }, - { FRAC_CONST(0.610078992331810), FRAC_CONST(0.792340597922007) }, - { FRAC_CONST(0.607645254487931), FRAC_CONST(0.794208564986741) }, - { FRAC_CONST(0.605205797255497), FRAC_CONST(0.796069056657988) }, - { FRAC_CONST(0.602760643595607), FRAC_CONST(0.797922055424093) }, - { FRAC_CONST(0.600309816522980), FRAC_CONST(0.799767543843926) }, - { FRAC_CONST(0.597853339105734), FRAC_CONST(0.801605504547046) }, - { FRAC_CONST(0.595391234465169), FRAC_CONST(0.803435920233868) }, - { FRAC_CONST(0.592923525775551), FRAC_CONST(0.805258773675822) }, - { FRAC_CONST(0.590450236263896), FRAC_CONST(0.807074047715518) }, - { FRAC_CONST(0.587971389209745), FRAC_CONST(0.808881725266904) }, - { FRAC_CONST(0.585487007944951), FRAC_CONST(0.810681789315431) }, - { FRAC_CONST(0.582997115853458), FRAC_CONST(0.812474222918210) }, - { FRAC_CONST(0.580501736371077), FRAC_CONST(0.814259009204175) }, - { FRAC_CONST(0.578000892985270), FRAC_CONST(0.816036131374237) }, - { FRAC_CONST(0.575494609234928), FRAC_CONST(0.817805572701444) }, - { FRAC_CONST(0.572982908710149), FRAC_CONST(0.819567316531142) }, - { FRAC_CONST(0.570465815052013), FRAC_CONST(0.821321346281127) }, - { FRAC_CONST(0.567943351952366), FRAC_CONST(0.823067645441802) }, - { FRAC_CONST(0.565415543153590), FRAC_CONST(0.824806197576334) }, - { FRAC_CONST(0.562882412448385), FRAC_CONST(0.826536986320810) }, - { FRAC_CONST(0.560343983679541), FRAC_CONST(0.828259995384386) }, - { FRAC_CONST(0.557800280739717), FRAC_CONST(0.829975208549444) }, - { FRAC_CONST(0.555251327571214), FRAC_CONST(0.831682609671745) }, - { FRAC_CONST(0.552697148165750), FRAC_CONST(0.833382182680580) }, - { FRAC_CONST(0.550137766564234), FRAC_CONST(0.835073911578919) }, - { FRAC_CONST(0.547573206856540), FRAC_CONST(0.836757780443567) }, - { FRAC_CONST(0.545003493181281), FRAC_CONST(0.838433773425308) }, - { FRAC_CONST(0.542428649725581), FRAC_CONST(0.840101874749058) }, - { FRAC_CONST(0.539848700724848), FRAC_CONST(0.841762068714012) }, - { FRAC_CONST(0.537263670462543), FRAC_CONST(0.843414339693793) }, - { FRAC_CONST(0.534673583269956), FRAC_CONST(0.845058672136595) }, - { FRAC_CONST(0.532078463525974), FRAC_CONST(0.846695050565337) }, - { FRAC_CONST(0.529478335656852), FRAC_CONST(0.848323459577802) }, - { FRAC_CONST(0.526873224135985), FRAC_CONST(0.849943883846782) }, - { FRAC_CONST(0.524263153483673), FRAC_CONST(0.851556308120229) }, - { FRAC_CONST(0.521648148266897), FRAC_CONST(0.853160717221390) }, - { FRAC_CONST(0.519028233099081), FRAC_CONST(0.854757096048957) }, - { FRAC_CONST(0.516403432639864), FRAC_CONST(0.856345429577204) }, - { FRAC_CONST(0.513773771594868), FRAC_CONST(0.857925702856130) }, - { FRAC_CONST(0.511139274715464), FRAC_CONST(0.859497901011602) }, - { FRAC_CONST(0.508499966798541), FRAC_CONST(0.861062009245491) }, - { FRAC_CONST(0.505855872686269), FRAC_CONST(0.862618012835817) }, - { FRAC_CONST(0.503207017265869), FRAC_CONST(0.864165897136879) }, - { FRAC_CONST(0.500553425469378), FRAC_CONST(0.865705647579402) }, - { FRAC_CONST(0.497895122273411), FRAC_CONST(0.867237249670668) }, - { FRAC_CONST(0.495232132698931), FRAC_CONST(0.868760688994655) }, - { FRAC_CONST(0.492564481811011), FRAC_CONST(0.870275951212172) }, - { FRAC_CONST(0.489892194718595), FRAC_CONST(0.871783022060993) }, - { FRAC_CONST(0.487215296574269), FRAC_CONST(0.873281887355994) }, - { FRAC_CONST(0.484533812574016), FRAC_CONST(0.874772532989284) }, - { FRAC_CONST(0.481847767956986), FRAC_CONST(0.876254944930338) }, - { FRAC_CONST(0.479157188005253), FRAC_CONST(0.877729109226132) }, - { FRAC_CONST(0.476462098043581), FRAC_CONST(0.879195012001267) }, - { FRAC_CONST(0.473762523439183), FRAC_CONST(0.880652639458111) }, - { FRAC_CONST(0.471058489601483), FRAC_CONST(0.882101977876918) }, - { FRAC_CONST(0.468350021981877), FRAC_CONST(0.883543013615962) }, - { FRAC_CONST(0.465637146073494), FRAC_CONST(0.884975733111667) }, - { FRAC_CONST(0.462919887410955), FRAC_CONST(0.886400122878730) }, - { FRAC_CONST(0.460198271570134), FRAC_CONST(0.887816169510255) }, - { FRAC_CONST(0.457472324167916), FRAC_CONST(0.889223859677868) }, - { FRAC_CONST(0.454742070861955), FRAC_CONST(0.890623180131856) }, - { FRAC_CONST(0.452007537350437), FRAC_CONST(0.892014117701280) }, - { FRAC_CONST(0.449268749371830), FRAC_CONST(0.893396659294108) }, - { FRAC_CONST(0.446525732704651), FRAC_CONST(0.894770791897330) }, - { FRAC_CONST(0.443778513167218), FRAC_CONST(0.896136502577087) }, - { FRAC_CONST(0.441027116617407), FRAC_CONST(0.897493778478790) }, - { FRAC_CONST(0.438271568952410), FRAC_CONST(0.898842606827242) }, - { FRAC_CONST(0.435511896108492), FRAC_CONST(0.900182974926757) }, - { FRAC_CONST(0.432748124060744), FRAC_CONST(0.901514870161279) }, - { FRAC_CONST(0.429980278822841), FRAC_CONST(0.902838279994503) }, - { FRAC_CONST(0.427208386446796), FRAC_CONST(0.904153191969992) }, - { FRAC_CONST(0.424432473022717), FRAC_CONST(0.905459593711293) }, - { FRAC_CONST(0.421652564678558), FRAC_CONST(0.906757472922057) }, - { FRAC_CONST(0.418868687579875), FRAC_CONST(0.908046817386148) }, - { FRAC_CONST(0.416080867929579), FRAC_CONST(0.909327614967767) }, - { FRAC_CONST(0.413289131967691), FRAC_CONST(0.910599853611559) }, - { FRAC_CONST(0.410493505971093), FRAC_CONST(0.911863521342729) }, - { FRAC_CONST(0.407694016253280), FRAC_CONST(0.913118606267154) }, - { FRAC_CONST(0.404890689164118), FRAC_CONST(0.914365096571498) }, - { FRAC_CONST(0.402083551089587), FRAC_CONST(0.915602980523320) }, - { FRAC_CONST(0.399272628451541), FRAC_CONST(0.916832246471184) }, - { FRAC_CONST(0.396457947707454), FRAC_CONST(0.918052882844770) }, - { FRAC_CONST(0.393639535350173), FRAC_CONST(0.919264878154985) }, - { FRAC_CONST(0.390817417907669), FRAC_CONST(0.920468220994067) }, - { FRAC_CONST(0.387991621942785), FRAC_CONST(0.921662900035695) }, - { FRAC_CONST(0.385162174052990), FRAC_CONST(0.922848904035094) }, - { FRAC_CONST(0.382329100870125), FRAC_CONST(0.924026221829144) }, - { FRAC_CONST(0.379492429060153), FRAC_CONST(0.925194842336480) }, - { FRAC_CONST(0.376652185322910), FRAC_CONST(0.926354754557603) }, - { FRAC_CONST(0.373808396391851), FRAC_CONST(0.927505947574975) }, - { FRAC_CONST(0.370961089033802), FRAC_CONST(0.928648410553131) }, - { FRAC_CONST(0.368110290048703), FRAC_CONST(0.929782132738772) }, - { FRAC_CONST(0.365256026269360), FRAC_CONST(0.930907103460875) }, - { FRAC_CONST(0.362398324561191), FRAC_CONST(0.932023312130786) }, - { FRAC_CONST(0.359537211821973), FRAC_CONST(0.933130748242325) }, - { FRAC_CONST(0.356672714981588), FRAC_CONST(0.934229401371881) }, - { FRAC_CONST(0.353804861001772), FRAC_CONST(0.935319261178512) }, - { FRAC_CONST(0.350933676875858), FRAC_CONST(0.936400317404042) }, - { FRAC_CONST(0.348059189628526), FRAC_CONST(0.937472559873159) }, - { FRAC_CONST(0.345181426315543), FRAC_CONST(0.938535978493509) }, - { FRAC_CONST(0.342300414023514), FRAC_CONST(0.939590563255789) }, - { FRAC_CONST(0.339416179869623), FRAC_CONST(0.940636304233848) }, - { FRAC_CONST(0.336528751001382), FRAC_CONST(0.941673191584771) }, - { FRAC_CONST(0.333638154596371), FRAC_CONST(0.942701215548982) }, - { FRAC_CONST(0.330744417861983), FRAC_CONST(0.943720366450326) }, - { FRAC_CONST(0.327847568035171), FRAC_CONST(0.944730634696168) }, - { FRAC_CONST(0.324947632382188), FRAC_CONST(0.945732010777477) }, - { FRAC_CONST(0.322044638198335), FRAC_CONST(0.946724485268921) }, - { FRAC_CONST(0.319138612807696), FRAC_CONST(0.947708048828952) }, - { FRAC_CONST(0.316229583562890), FRAC_CONST(0.948682692199895) }, - { FRAC_CONST(0.313317577844809), FRAC_CONST(0.949648406208035) }, - { FRAC_CONST(0.310402623062359), FRAC_CONST(0.950605181763705) }, - { FRAC_CONST(0.307484746652204), FRAC_CONST(0.951553009861369) }, - { FRAC_CONST(0.304563976078509), FRAC_CONST(0.952491881579706) }, - { FRAC_CONST(0.301640338832679), FRAC_CONST(0.953421788081700) }, - { FRAC_CONST(0.298713862433100), FRAC_CONST(0.954342720614716) }, - { FRAC_CONST(0.295784574424884), FRAC_CONST(0.955254670510587) }, - { FRAC_CONST(0.292852502379605), FRAC_CONST(0.956157629185692) }, - { FRAC_CONST(0.289917673895041), FRAC_CONST(0.957051588141041) }, - { FRAC_CONST(0.286980116594916), FRAC_CONST(0.957936538962351) }, - { FRAC_CONST(0.284039858128637), FRAC_CONST(0.958812473320129) }, - { FRAC_CONST(0.281096926171038), FRAC_CONST(0.959679382969747) }, - { FRAC_CONST(0.278151348422115), FRAC_CONST(0.960537259751520) }, - { FRAC_CONST(0.275203152606767), FRAC_CONST(0.961386095590786) }, - { FRAC_CONST(0.272252366474537), FRAC_CONST(0.962225882497979) }, - { FRAC_CONST(0.269299017799346), FRAC_CONST(0.963056612568704) }, - { FRAC_CONST(0.266343134379238), FRAC_CONST(0.963878277983814) }, - { FRAC_CONST(0.263384744036113), FRAC_CONST(0.964690871009481) }, - { FRAC_CONST(0.260423874615468), FRAC_CONST(0.965494383997270) }, - { FRAC_CONST(0.257460553986133), FRAC_CONST(0.966288809384210) }, - { FRAC_CONST(0.254494810040011), FRAC_CONST(0.967074139692867) }, - { FRAC_CONST(0.251526670691813), FRAC_CONST(0.967850367531414) }, - { FRAC_CONST(0.248556163878797), FRAC_CONST(0.968617485593698) }, - { FRAC_CONST(0.245583317560504), FRAC_CONST(0.969375486659311) }, - { FRAC_CONST(0.242608159718497), FRAC_CONST(0.970124363593660) }, - { FRAC_CONST(0.239630718356094), FRAC_CONST(0.970864109348029) }, - { FRAC_CONST(0.236651021498106), FRAC_CONST(0.971594716959650) }, - { FRAC_CONST(0.233669097190577), FRAC_CONST(0.972316179551765) }, - { FRAC_CONST(0.230684973500512), FRAC_CONST(0.973028490333694) }, - { FRAC_CONST(0.227698678515621), FRAC_CONST(0.973731642600896) }, - { FRAC_CONST(0.224710240344050), FRAC_CONST(0.974425629735035) }, - { FRAC_CONST(0.221719687114115), FRAC_CONST(0.975110445204039) }, - { FRAC_CONST(0.218727046974045), FRAC_CONST(0.975786082562164) }, - { FRAC_CONST(0.215732348091706), FRAC_CONST(0.976452535450054) }, - { FRAC_CONST(0.212735618654346), FRAC_CONST(0.977109797594801) }, - { FRAC_CONST(0.209736886868323), FRAC_CONST(0.977757862810003) }, - { FRAC_CONST(0.206736180958844), FRAC_CONST(0.978396724995823) }, - { FRAC_CONST(0.203733529169694), FRAC_CONST(0.979026378139048) }, - { FRAC_CONST(0.200728959762976), FRAC_CONST(0.979646816313141) }, - { FRAC_CONST(0.197722501018842), FRAC_CONST(0.980258033678304) }, - { FRAC_CONST(0.194714181235226), FRAC_CONST(0.980860024481524) }, - { FRAC_CONST(0.191704028727580), FRAC_CONST(0.981452783056636) }, - { FRAC_CONST(0.188692071828605), FRAC_CONST(0.982036303824369) }, - { FRAC_CONST(0.185678338887988), FRAC_CONST(0.982610581292405) }, - { FRAC_CONST(0.182662858272129), FRAC_CONST(0.983175610055424) }, - { FRAC_CONST(0.179645658363882), FRAC_CONST(0.983731384795162) }, - { FRAC_CONST(0.176626767562281), FRAC_CONST(0.984277900280454) }, - { FRAC_CONST(0.173606214282275), FRAC_CONST(0.984815151367289) }, - { FRAC_CONST(0.170584026954464), FRAC_CONST(0.985343132998855) }, - { FRAC_CONST(0.167560234024824), FRAC_CONST(0.985861840205587) }, - { FRAC_CONST(0.164534863954446), FRAC_CONST(0.986371268105216) }, - { FRAC_CONST(0.161507945219266), FRAC_CONST(0.986871411902812) }, - { FRAC_CONST(0.158479506309796), FRAC_CONST(0.987362266890832) }, - { FRAC_CONST(0.155449575730856), FRAC_CONST(0.987843828449162) }, - { FRAC_CONST(0.152418182001307), FRAC_CONST(0.988316092045160) }, - { FRAC_CONST(0.149385353653780), FRAC_CONST(0.988779053233702) }, - { FRAC_CONST(0.146351119234411), FRAC_CONST(0.989232707657220) }, - { FRAC_CONST(0.143315507302572), FRAC_CONST(0.989677051045747) }, - { FRAC_CONST(0.140278546430595), FRAC_CONST(0.990112079216954) }, - { FRAC_CONST(0.137240265203516), FRAC_CONST(0.990537788076189) }, - { FRAC_CONST(0.134200692218792), FRAC_CONST(0.990954173616519) }, - { FRAC_CONST(0.131159856086043), FRAC_CONST(0.991361231918763) }, - { FRAC_CONST(0.128117785426777), FRAC_CONST(0.991758959151536) }, - { FRAC_CONST(0.125074508874121), FRAC_CONST(0.992147351571276) }, - { FRAC_CONST(0.122030055072553), FRAC_CONST(0.992526405522286) }, - { FRAC_CONST(0.118984452677633), FRAC_CONST(0.992896117436766) }, - { FRAC_CONST(0.115937730355728), FRAC_CONST(0.993256483834846) }, - { FRAC_CONST(0.112889916783750), FRAC_CONST(0.993607501324622) }, - { FRAC_CONST(0.109841040648883), FRAC_CONST(0.993949166602181) }, - { FRAC_CONST(0.106791130648307), FRAC_CONST(0.994281476451642) }, - { FRAC_CONST(0.103740215488939), FRAC_CONST(0.994604427745176) }, - { FRAC_CONST(0.100688323887154), FRAC_CONST(0.994918017443043) }, - { FRAC_CONST(0.097635484568517), FRAC_CONST(0.995222242593618) }, - { FRAC_CONST(0.094581726267515), FRAC_CONST(0.995517100333418) }, - { FRAC_CONST(0.091527077727285), FRAC_CONST(0.995802587887129) }, - { FRAC_CONST(0.088471567699341), FRAC_CONST(0.996078702567634) }, - { FRAC_CONST(0.085415224943307), FRAC_CONST(0.996345441776036) }, - { FRAC_CONST(0.082358078226647), FRAC_CONST(0.996602803001684) }, - { FRAC_CONST(0.079300156324388), FRAC_CONST(0.996850783822197) }, - { FRAC_CONST(0.076241488018856), FRAC_CONST(0.997089381903483) }, - { FRAC_CONST(0.073182102099403), FRAC_CONST(0.997318594999769) }, - { FRAC_CONST(0.070122027362134), FRAC_CONST(0.997538420953611) }, - { FRAC_CONST(0.067061292609637), FRAC_CONST(0.997748857695926) }, - { FRAC_CONST(0.063999926650714), FRAC_CONST(0.997949903246001) }, - { FRAC_CONST(0.060937958300107), FRAC_CONST(0.998141555711521) }, - { FRAC_CONST(0.057875416378229), FRAC_CONST(0.998323813288578) }, - { FRAC_CONST(0.054812329710890), FRAC_CONST(0.998496674261695) }, - { FRAC_CONST(0.051748727129028), FRAC_CONST(0.998660137003838) }, - { FRAC_CONST(0.048684637468439), FRAC_CONST(0.998814199976435) }, - { FRAC_CONST(0.045620089569500), FRAC_CONST(0.998958861729386) }, - { FRAC_CONST(0.042555112276904), FRAC_CONST(0.999094120901079) }, - { FRAC_CONST(0.039489734439384), FRAC_CONST(0.999219976218404) }, - { FRAC_CONST(0.036423984909444), FRAC_CONST(0.999336426496761) }, - { FRAC_CONST(0.033357892543086), FRAC_CONST(0.999443470640078) }, - { FRAC_CONST(0.030291486199539), FRAC_CONST(0.999541107640813) }, - { FRAC_CONST(0.027224794740988), FRAC_CONST(0.999629336579970) }, - { FRAC_CONST(0.024157847032300), FRAC_CONST(0.999708156627105) }, - { FRAC_CONST(0.021090671940755), FRAC_CONST(0.999777567040333) }, - { FRAC_CONST(0.018023298335774), FRAC_CONST(0.999837567166337) }, - { FRAC_CONST(0.014955755088644), FRAC_CONST(0.999888156440373) }, - { FRAC_CONST(0.011888071072252), FRAC_CONST(0.999929334386276) }, - { FRAC_CONST(0.008820275160808), FRAC_CONST(0.999961100616463) }, - { FRAC_CONST(0.005752396229574), FRAC_CONST(0.999983454831938) }, - { FRAC_CONST(0.002684463154596), FRAC_CONST(0.999996396822294) } -}; - -/* 64 (N/4) complex twiddle factors */ -ALIGN static const complex_t mdct_tab_256[] = -{ - { FRAC_CONST(0.999995293809576), FRAC_CONST(0.003067956762966) }, - { FRAC_CONST(0.999618822495179), FRAC_CONST(0.027608145778966) }, - { FRAC_CONST(0.998640218180265), FRAC_CONST(0.052131704680283) }, - { FRAC_CONST(0.997060070339483), FRAC_CONST(0.076623861392031) }, - { FRAC_CONST(0.994879330794806), FRAC_CONST(0.101069862754828) }, - { FRAC_CONST(0.992099313142192), FRAC_CONST(0.125454983411546) }, - { FRAC_CONST(0.988721691960324), FRAC_CONST(0.149764534677322) }, - { FRAC_CONST(0.984748501801904), FRAC_CONST(0.173983873387464) }, - { FRAC_CONST(0.980182135968117), FRAC_CONST(0.198098410717954) }, - { FRAC_CONST(0.975025345066994), FRAC_CONST(0.222093620973204) }, - { FRAC_CONST(0.969281235356549), FRAC_CONST(0.245955050335795) }, - { FRAC_CONST(0.962953266873684), FRAC_CONST(0.269668325572915) }, - { FRAC_CONST(0.956045251349996), FRAC_CONST(0.293219162694259) }, - { FRAC_CONST(0.948561349915730), FRAC_CONST(0.316593375556166) }, - { FRAC_CONST(0.940506070593268), FRAC_CONST(0.339776884406827) }, - { FRAC_CONST(0.931884265581668), FRAC_CONST(0.362755724367397) }, - { FRAC_CONST(0.922701128333879), FRAC_CONST(0.385516053843919) }, - { FRAC_CONST(0.912962190428398), FRAC_CONST(0.408044162864979) }, - { FRAC_CONST(0.902673318237259), FRAC_CONST(0.430326481340083) }, - { FRAC_CONST(0.891840709392343), FRAC_CONST(0.452349587233771) }, - { FRAC_CONST(0.880470889052161), FRAC_CONST(0.474100214650550) }, - { FRAC_CONST(0.868570705971341), FRAC_CONST(0.495565261825773) }, - { FRAC_CONST(0.856147328375194), FRAC_CONST(0.516731799017650) }, - { FRAC_CONST(0.843208239641845), FRAC_CONST(0.537587076295645) }, - { FRAC_CONST(0.829761233794523), FRAC_CONST(0.558118531220556) }, - { FRAC_CONST(0.815814410806734), FRAC_CONST(0.578313796411656) }, - { FRAC_CONST(0.801376171723140), FRAC_CONST(0.598160706996342) }, - { FRAC_CONST(0.786455213599086), FRAC_CONST(0.617647307937804) }, - { FRAC_CONST(0.771060524261814), FRAC_CONST(0.636761861236284) }, - { FRAC_CONST(0.755201376896537), FRAC_CONST(0.655492852999615) }, - { FRAC_CONST(0.738887324460615), FRAC_CONST(0.673829000378756) }, - { FRAC_CONST(0.722128193929215), FRAC_CONST(0.691759258364158) }, - { FRAC_CONST(0.704934080375905), FRAC_CONST(0.709272826438866) }, - { FRAC_CONST(0.687315340891759), FRAC_CONST(0.726359155084346) }, - { FRAC_CONST(0.669282588346636), FRAC_CONST(0.743007952135122) }, - { FRAC_CONST(0.650846684996381), FRAC_CONST(0.759209188978388) }, - { FRAC_CONST(0.632018735939809), FRAC_CONST(0.774953106594874) }, - { FRAC_CONST(0.612810082429410), FRAC_CONST(0.790230221437310) }, - { FRAC_CONST(0.593232295039800), FRAC_CONST(0.805031331142964) }, - { FRAC_CONST(0.573297166698042), FRAC_CONST(0.819347520076797) }, - { FRAC_CONST(0.553016705580028), FRAC_CONST(0.833170164701913) }, - { FRAC_CONST(0.532403127877198), FRAC_CONST(0.846490938774052) }, - { FRAC_CONST(0.511468850437971), FRAC_CONST(0.859301818357008) }, - { FRAC_CONST(0.490226483288291), FRAC_CONST(0.871595086655951) }, - { FRAC_CONST(0.468688822035828), FRAC_CONST(0.883363338665732) }, - { FRAC_CONST(0.446868840162374), FRAC_CONST(0.894599485631383) }, - { FRAC_CONST(0.424779681209109), FRAC_CONST(0.905296759318119) }, - { FRAC_CONST(0.402434650859419), FRAC_CONST(0.915448716088268) }, - { FRAC_CONST(0.379847208924051), FRAC_CONST(0.925049240782678) }, - { FRAC_CONST(0.357030961233430), FRAC_CONST(0.934092550404259) }, - { FRAC_CONST(0.333999651442009), FRAC_CONST(0.942573197601447) }, - { FRAC_CONST(0.310767152749611), FRAC_CONST(0.950486073949482) }, - { FRAC_CONST(0.287347459544730), FRAC_CONST(0.957826413027533) }, - { FRAC_CONST(0.263754678974832), FRAC_CONST(0.964589793289813) }, - { FRAC_CONST(0.240003022448742), FRAC_CONST(0.970772140728950) }, - { FRAC_CONST(0.216106797076220), FRAC_CONST(0.976369731330021) }, - { FRAC_CONST(0.192080397049892), FRAC_CONST(0.981379193313755) }, - { FRAC_CONST(0.167938294974731), FRAC_CONST(0.985797509167567) }, - { FRAC_CONST(0.143695033150295), FRAC_CONST(0.989622017463201) }, - { FRAC_CONST(0.119365214810991), FRAC_CONST(0.992850414459865) }, - { FRAC_CONST(0.094963495329639), FRAC_CONST(0.995480755491927) }, - { FRAC_CONST(0.070504573389614), FRAC_CONST(0.997511456140303) }, - { FRAC_CONST(0.046003182130915), FRAC_CONST(0.998941293186857) }, - { FRAC_CONST(0.021474080275470), FRAC_CONST(0.999769405351215) } -}; - -#ifdef LD_DEC -/* 256 (N/4) complex twiddle factors */ -ALIGN static const complex_t mdct_tab_1024[] = -{ - { FRAC_CONST(0.999999705862882), FRAC_CONST(0.000766990318743) }, - { FRAC_CONST(0.999976174986898), FRAC_CONST(0.006902858724730) }, - { FRAC_CONST(0.999914995573113), FRAC_CONST(0.013038467241987) }, - { FRAC_CONST(0.999816169924900), FRAC_CONST(0.019173584868323) }, - { FRAC_CONST(0.999679701762988), FRAC_CONST(0.025307980620025) }, - { FRAC_CONST(0.999505596225325), FRAC_CONST(0.031441423540560) }, - { FRAC_CONST(0.999293859866888), FRAC_CONST(0.037573682709270) }, - { FRAC_CONST(0.999044500659429), FRAC_CONST(0.043704527250063) }, - { FRAC_CONST(0.998757527991183), FRAC_CONST(0.049833726340107) }, - { FRAC_CONST(0.998432952666508), FRAC_CONST(0.055961049218521) }, - { FRAC_CONST(0.998070786905482), FRAC_CONST(0.062086265195060) }, - { FRAC_CONST(0.997671044343441), FRAC_CONST(0.068209143658806) }, - { FRAC_CONST(0.997233740030466), FRAC_CONST(0.074329454086846) }, - { FRAC_CONST(0.996758890430818), FRAC_CONST(0.080446966052950) }, - { FRAC_CONST(0.996246513422316), FRAC_CONST(0.086561449236251) }, - { FRAC_CONST(0.995696628295664), FRAC_CONST(0.092672673429913) }, - { FRAC_CONST(0.995109255753726), FRAC_CONST(0.098780408549800) }, - { FRAC_CONST(0.994484417910748), FRAC_CONST(0.104884424643135) }, - { FRAC_CONST(0.993822138291520), FRAC_CONST(0.110984491897163) }, - { FRAC_CONST(0.993122441830496), FRAC_CONST(0.117080380647801) }, - { FRAC_CONST(0.992385354870852), FRAC_CONST(0.123171861388280) }, - { FRAC_CONST(0.991610905163495), FRAC_CONST(0.129258704777796) }, - { FRAC_CONST(0.990799121866020), FRAC_CONST(0.135340681650134) }, - { FRAC_CONST(0.989950035541609), FRAC_CONST(0.141417563022303) }, - { FRAC_CONST(0.989063678157882), FRAC_CONST(0.147489120103154) }, - { FRAC_CONST(0.988140083085693), FRAC_CONST(0.153555124301993) }, - { FRAC_CONST(0.987179285097874), FRAC_CONST(0.159615347237193) }, - { FRAC_CONST(0.986181320367928), FRAC_CONST(0.165669560744784) }, - { FRAC_CONST(0.985146226468662), FRAC_CONST(0.171717536887050) }, - { FRAC_CONST(0.984074042370776), FRAC_CONST(0.177759047961107) }, - { FRAC_CONST(0.982964808441396), FRAC_CONST(0.183793866507478) }, - { FRAC_CONST(0.981818566442553), FRAC_CONST(0.189821765318656) }, - { FRAC_CONST(0.980635359529608), FRAC_CONST(0.195842517447658) }, - { FRAC_CONST(0.979415232249635), FRAC_CONST(0.201855896216568) }, - { FRAC_CONST(0.978158230539735), FRAC_CONST(0.207861675225075) }, - { FRAC_CONST(0.976864401725313), FRAC_CONST(0.213859628358994) }, - { FRAC_CONST(0.975533794518291), FRAC_CONST(0.219849529798779) }, - { FRAC_CONST(0.974166459015280), FRAC_CONST(0.225831154028026) }, - { FRAC_CONST(0.972762446695689), FRAC_CONST(0.231804275841965) }, - { FRAC_CONST(0.971321810419786), FRAC_CONST(0.237768670355934) }, - { FRAC_CONST(0.969844604426715), FRAC_CONST(0.243724113013852) }, - { FRAC_CONST(0.968330884332445), FRAC_CONST(0.249670379596669) }, - { FRAC_CONST(0.966780707127683), FRAC_CONST(0.255607246230807) }, - { FRAC_CONST(0.965194131175725), FRAC_CONST(0.261534489396596) }, - { FRAC_CONST(0.963571216210257), FRAC_CONST(0.267451885936678) }, - { FRAC_CONST(0.961912023333112), FRAC_CONST(0.273359213064419) }, - { FRAC_CONST(0.960216615011963), FRAC_CONST(0.279256248372291) }, - { FRAC_CONST(0.958485055077976), FRAC_CONST(0.285142769840249) }, - { FRAC_CONST(0.956717408723403), FRAC_CONST(0.291018555844085) }, - { FRAC_CONST(0.954913742499131), FRAC_CONST(0.296883385163778) }, - { FRAC_CONST(0.953074124312172), FRAC_CONST(0.302737036991819) }, - { FRAC_CONST(0.951198623423113), FRAC_CONST(0.308579290941525) }, - { FRAC_CONST(0.949287310443502), FRAC_CONST(0.314409927055337) }, - { FRAC_CONST(0.947340257333192), FRAC_CONST(0.320228725813100) }, - { FRAC_CONST(0.945357537397632), FRAC_CONST(0.326035468140330) }, - { FRAC_CONST(0.943339225285108), FRAC_CONST(0.331829935416461) }, - { FRAC_CONST(0.941285396983929), FRAC_CONST(0.337611909483075) }, - { FRAC_CONST(0.939196129819570), FRAC_CONST(0.343381172652115) }, - { FRAC_CONST(0.937071502451759), FRAC_CONST(0.349137507714085) }, - { FRAC_CONST(0.934911594871516), FRAC_CONST(0.354880697946223) }, - { FRAC_CONST(0.932716488398140), FRAC_CONST(0.360610527120662) }, - { FRAC_CONST(0.930486265676150), FRAC_CONST(0.366326779512574) }, - { FRAC_CONST(0.928221010672169), FRAC_CONST(0.372029239908285) }, - { FRAC_CONST(0.925920808671770), FRAC_CONST(0.377717693613386) }, - { FRAC_CONST(0.923585746276257), FRAC_CONST(0.383391926460809) }, - { FRAC_CONST(0.921215911399409), FRAC_CONST(0.389051724818894) }, - { FRAC_CONST(0.918811393264170), FRAC_CONST(0.394696875599434) }, - { FRAC_CONST(0.916372282399289), FRAC_CONST(0.400327166265690) }, - { FRAC_CONST(0.913898670635912), FRAC_CONST(0.405942384840403) }, - { FRAC_CONST(0.911390651104122), FRAC_CONST(0.411542319913765) }, - { FRAC_CONST(0.908848318229439), FRAC_CONST(0.417126760651388) }, - { FRAC_CONST(0.906271767729258), FRAC_CONST(0.422695496802233) }, - { FRAC_CONST(0.903661096609248), FRAC_CONST(0.428248318706532) }, - { FRAC_CONST(0.901016403159702), FRAC_CONST(0.433785017303679) }, - { FRAC_CONST(0.898337786951834), FRAC_CONST(0.439305384140100) }, - { FRAC_CONST(0.895625348834030), FRAC_CONST(0.444809211377105) }, - { FRAC_CONST(0.892879190928052), FRAC_CONST(0.450296291798709) }, - { FRAC_CONST(0.890099416625192), FRAC_CONST(0.455766418819435) }, - { FRAC_CONST(0.887286130582383), FRAC_CONST(0.461219386492092) }, - { FRAC_CONST(0.884439438718254), FRAC_CONST(0.466654989515531) }, - { FRAC_CONST(0.881559448209144), FRAC_CONST(0.472073023242369) }, - { FRAC_CONST(0.878646267485068), FRAC_CONST(0.477473283686698) }, - { FRAC_CONST(0.875700006225635), FRAC_CONST(0.482855567531766) }, - { FRAC_CONST(0.872720775355914), FRAC_CONST(0.488219672137627) }, - { FRAC_CONST(0.869708687042266), FRAC_CONST(0.493565395548775) }, - { FRAC_CONST(0.866663854688111), FRAC_CONST(0.498892536501745) }, - { FRAC_CONST(0.863586392929668), FRAC_CONST(0.504200894432690) }, - { FRAC_CONST(0.860476417631632), FRAC_CONST(0.509490269484936) }, - { FRAC_CONST(0.857334045882816), FRAC_CONST(0.514760462516501) }, - { FRAC_CONST(0.854159395991739), FRAC_CONST(0.520011275107596) }, - { FRAC_CONST(0.850952587482176), FRAC_CONST(0.525242509568095) }, - { FRAC_CONST(0.847713741088654), FRAC_CONST(0.530453968944976) }, - { FRAC_CONST(0.844442978751911), FRAC_CONST(0.535645457029741) }, - { FRAC_CONST(0.841140423614298), FRAC_CONST(0.540816778365797) }, - { FRAC_CONST(0.837806200015151), FRAC_CONST(0.545967738255818) }, - { FRAC_CONST(0.834440433486103), FRAC_CONST(0.551098142769075) }, - { FRAC_CONST(0.831043250746362), FRAC_CONST(0.556207798748740) }, - { FRAC_CONST(0.827614779697938), FRAC_CONST(0.561296513819151) }, - { FRAC_CONST(0.824155149420829), FRAC_CONST(0.566364096393064) }, - { FRAC_CONST(0.820664490168157), FRAC_CONST(0.571410355678857) }, - { FRAC_CONST(0.817142933361273), FRAC_CONST(0.576435101687722) }, - { FRAC_CONST(0.813590611584799), FRAC_CONST(0.581438145240810) }, - { FRAC_CONST(0.810007658581641), FRAC_CONST(0.586419297976361) }, - { FRAC_CONST(0.806394209247956), FRAC_CONST(0.591378372356788) }, - { FRAC_CONST(0.802750399628069), FRAC_CONST(0.596315181675744) }, - { FRAC_CONST(0.799076366909352), FRAC_CONST(0.601229540065149) }, - { FRAC_CONST(0.795372249417061), FRAC_CONST(0.606121262502186) }, - { FRAC_CONST(0.791638186609126), FRAC_CONST(0.610990164816272) }, - { FRAC_CONST(0.787874319070900), FRAC_CONST(0.615836063695985) }, - { FRAC_CONST(0.784080788509870), FRAC_CONST(0.620658776695972) }, - { FRAC_CONST(0.780257737750317), FRAC_CONST(0.625458122243814) }, - { FRAC_CONST(0.776405310727940), FRAC_CONST(0.630233919646864) }, - { FRAC_CONST(0.772523652484441), FRAC_CONST(0.634985989099049) }, - { FRAC_CONST(0.768612909162058), FRAC_CONST(0.639714151687640) }, - { FRAC_CONST(0.764673227998067), FRAC_CONST(0.644418229399988) }, - { FRAC_CONST(0.760704757319237), FRAC_CONST(0.649098045130226) }, - { FRAC_CONST(0.756707646536246), FRAC_CONST(0.653753422685936) }, - { FRAC_CONST(0.752682046138055), FRAC_CONST(0.658384186794785) }, - { FRAC_CONST(0.748628107686245), FRAC_CONST(0.662990163111121) }, - { FRAC_CONST(0.744545983809307), FRAC_CONST(0.667571178222540) }, - { FRAC_CONST(0.740435828196898), FRAC_CONST(0.672127059656412) }, - { FRAC_CONST(0.736297795594053), FRAC_CONST(0.676657635886375) }, - { FRAC_CONST(0.732132041795361), FRAC_CONST(0.681162736338795) }, - { FRAC_CONST(0.727938723639099), FRAC_CONST(0.685642191399187) }, - { FRAC_CONST(0.723717999001324), FRAC_CONST(0.690095832418600) }, - { FRAC_CONST(0.719470026789933), FRAC_CONST(0.694523491719966) }, - { FRAC_CONST(0.715194966938680), FRAC_CONST(0.698925002604414) }, - { FRAC_CONST(0.710892980401152), FRAC_CONST(0.703300199357549) }, - { FRAC_CONST(0.706564229144710), FRAC_CONST(0.707648917255684) }, - { FRAC_CONST(0.702208876144392), FRAC_CONST(0.711970992572050) }, - { FRAC_CONST(0.697827085376777), FRAC_CONST(0.716266262582953) }, - { FRAC_CONST(0.693419021813812), FRAC_CONST(0.720534565573905) }, - { FRAC_CONST(0.688984851416597), FRAC_CONST(0.724775740845711) }, - { FRAC_CONST(0.684524741129142), FRAC_CONST(0.728989628720519) }, - { FRAC_CONST(0.680038858872079), FRAC_CONST(0.733176070547833) }, - { FRAC_CONST(0.675527373536339), FRAC_CONST(0.737334908710483) }, - { FRAC_CONST(0.670990454976794), FRAC_CONST(0.741465986630563) }, - { FRAC_CONST(0.666428274005865), FRAC_CONST(0.745569148775325) }, - { FRAC_CONST(0.661841002387087), FRAC_CONST(0.749644240663033) }, - { FRAC_CONST(0.657228812828643), FRAC_CONST(0.753691108868781) }, - { FRAC_CONST(0.652591878976863), FRAC_CONST(0.757709601030268) }, - { FRAC_CONST(0.647930375409685), FRAC_CONST(0.761699565853535) }, - { FRAC_CONST(0.643244477630086), FRAC_CONST(0.765660853118662) }, - { FRAC_CONST(0.638534362059467), FRAC_CONST(0.769593313685423) }, - { FRAC_CONST(0.633800206031017), FRAC_CONST(0.773496799498899) }, - { FRAC_CONST(0.629042187783036), FRAC_CONST(0.777371163595056) }, - { FRAC_CONST(0.624260486452221), FRAC_CONST(0.781216260106276) }, - { FRAC_CONST(0.619455282066924), FRAC_CONST(0.785031944266848) }, - { FRAC_CONST(0.614626755540375), FRAC_CONST(0.788818072418420) }, - { FRAC_CONST(0.609775088663868), FRAC_CONST(0.792574502015408) }, - { FRAC_CONST(0.604900464099920), FRAC_CONST(0.796301091630359) }, - { FRAC_CONST(0.600003065375389), FRAC_CONST(0.799997700959282) }, - { FRAC_CONST(0.595083076874570), FRAC_CONST(0.803664190826924) }, - { FRAC_CONST(0.590140683832249), FRAC_CONST(0.807300423192014) }, - { FRAC_CONST(0.585176072326730), FRAC_CONST(0.810906261152460) }, - { FRAC_CONST(0.580189429272832), FRAC_CONST(0.814481568950499) }, - { FRAC_CONST(0.575180942414845), FRAC_CONST(0.818026211977813) }, - { FRAC_CONST(0.570150800319470), FRAC_CONST(0.821540056780598) }, - { FRAC_CONST(0.565099192368714), FRAC_CONST(0.825022971064580) }, - { FRAC_CONST(0.560026308752760), FRAC_CONST(0.828474823700007) }, - { FRAC_CONST(0.554932340462810), FRAC_CONST(0.831895484726578) }, - { FRAC_CONST(0.549817479283891), FRAC_CONST(0.835284825358337) }, - { FRAC_CONST(0.544681917787635), FRAC_CONST(0.838642717988527) }, - { FRAC_CONST(0.539525849325029), FRAC_CONST(0.841969036194388) }, - { FRAC_CONST(0.534349468019138), FRAC_CONST(0.845263654741918) }, - { FRAC_CONST(0.529152968757791), FRAC_CONST(0.848526449590593) }, - { FRAC_CONST(0.523936547186249), FRAC_CONST(0.851757297898029) }, - { FRAC_CONST(0.518700399699835), FRAC_CONST(0.854956078024615) }, - { FRAC_CONST(0.513444723436544), FRAC_CONST(0.858122669538086) }, - { FRAC_CONST(0.508169716269615), FRAC_CONST(0.861256953218062) }, - { FRAC_CONST(0.502875576800087), FRAC_CONST(0.864358811060534) }, - { FRAC_CONST(0.497562504349319), FRAC_CONST(0.867428126282307) }, - { FRAC_CONST(0.492230698951486), FRAC_CONST(0.870464783325398) }, - { FRAC_CONST(0.486880361346047), FRAC_CONST(0.873468667861385) }, - { FRAC_CONST(0.481511692970190), FRAC_CONST(0.876439666795714) }, - { FRAC_CONST(0.476124895951244), FRAC_CONST(0.879377668271953) }, - { FRAC_CONST(0.470720173099072), FRAC_CONST(0.882282561676009) }, - { FRAC_CONST(0.465297727898435), FRAC_CONST(0.885154237640285) }, - { FRAC_CONST(0.459857764501330), FRAC_CONST(0.887992588047806) }, - { FRAC_CONST(0.454400487719304), FRAC_CONST(0.890797506036281) }, - { FRAC_CONST(0.448926103015743), FRAC_CONST(0.893568886002136) }, - { FRAC_CONST(0.443434816498138), FRAC_CONST(0.896306623604480) }, - { FRAC_CONST(0.437926834910323), FRAC_CONST(0.899010615769039) }, - { FRAC_CONST(0.432402365624690), FRAC_CONST(0.901680760692038) }, - { FRAC_CONST(0.426861616634386), FRAC_CONST(0.904316957844028) }, - { FRAC_CONST(0.421304796545480), FRAC_CONST(0.906919107973678) }, - { FRAC_CONST(0.415732114569105), FRAC_CONST(0.909487113111505) }, - { FRAC_CONST(0.410143780513590), FRAC_CONST(0.912020876573568) }, - { FRAC_CONST(0.404540004776553), FRAC_CONST(0.914520302965104) }, - { FRAC_CONST(0.398920998336983), FRAC_CONST(0.916985298184123) }, - { FRAC_CONST(0.393286972747297), FRAC_CONST(0.919415769424947) }, - { FRAC_CONST(0.387638140125373), FRAC_CONST(0.921811625181708) }, - { FRAC_CONST(0.381974713146567), FRAC_CONST(0.924172775251791) }, - { FRAC_CONST(0.376296905035705), FRAC_CONST(0.926499130739231) }, - { FRAC_CONST(0.370604929559052), FRAC_CONST(0.928790604058057) }, - { FRAC_CONST(0.364899001016267), FRAC_CONST(0.931047108935595) }, - { FRAC_CONST(0.359179334232337), FRAC_CONST(0.933268560415712) }, - { FRAC_CONST(0.353446144549481), FRAC_CONST(0.935454874862015) }, - { FRAC_CONST(0.347699647819051), FRAC_CONST(0.937605969961000) }, - { FRAC_CONST(0.341940060393402), FRAC_CONST(0.939721764725153) }, - { FRAC_CONST(0.336167599117745), FRAC_CONST(0.941802179495998) }, - { FRAC_CONST(0.330382481321983), FRAC_CONST(0.943847135947093) }, - { FRAC_CONST(0.324584924812532), FRAC_CONST(0.945856557086984) }, - { FRAC_CONST(0.318775147864118), FRAC_CONST(0.947830367262101) }, - { FRAC_CONST(0.312953369211560), FRAC_CONST(0.949768492159607) }, - { FRAC_CONST(0.307119808041533), FRAC_CONST(0.951670858810194) }, - { FRAC_CONST(0.301274683984318), FRAC_CONST(0.953537395590833) }, - { FRAC_CONST(0.295418217105532), FRAC_CONST(0.955368032227470) }, - { FRAC_CONST(0.289550627897843), FRAC_CONST(0.957162699797670) }, - { FRAC_CONST(0.283672137272669), FRAC_CONST(0.958921330733213) }, - { FRAC_CONST(0.277782966551858), FRAC_CONST(0.960643858822638) }, - { FRAC_CONST(0.271883337459360), FRAC_CONST(0.962330219213737) }, - { FRAC_CONST(0.265973472112876), FRAC_CONST(0.963980348415994) }, - { FRAC_CONST(0.260053593015495), FRAC_CONST(0.965594184302977) }, - { FRAC_CONST(0.254123923047321), FRAC_CONST(0.967171666114677) }, - { FRAC_CONST(0.248184685457075), FRAC_CONST(0.968712734459795) }, - { FRAC_CONST(0.242236103853696), FRAC_CONST(0.970217331317979) }, - { FRAC_CONST(0.236278402197920), FRAC_CONST(0.971685400042009) }, - { FRAC_CONST(0.230311804793846), FRAC_CONST(0.973116885359925) }, - { FRAC_CONST(0.224336536280494), FRAC_CONST(0.974511733377116) }, - { FRAC_CONST(0.218352821623346), FRAC_CONST(0.975869891578341) }, - { FRAC_CONST(0.212360886105879), FRAC_CONST(0.977191308829712) }, - { FRAC_CONST(0.206360955321076), FRAC_CONST(0.978475935380617) }, - { FRAC_CONST(0.200353255162940), FRAC_CONST(0.979723722865591) }, - { FRAC_CONST(0.194338011817989), FRAC_CONST(0.980934624306142) }, - { FRAC_CONST(0.188315451756732), FRAC_CONST(0.982108594112514) }, - { FRAC_CONST(0.182285801725153), FRAC_CONST(0.983245588085407) }, - { FRAC_CONST(0.176249288736168), FRAC_CONST(0.984345563417642) }, - { FRAC_CONST(0.170206140061078), FRAC_CONST(0.985408478695768) }, - { FRAC_CONST(0.164156583221016), FRAC_CONST(0.986434293901627) }, - { FRAC_CONST(0.158100845978377), FRAC_CONST(0.987422970413855) }, - { FRAC_CONST(0.152039156328246), FRAC_CONST(0.988374471009341) }, - { FRAC_CONST(0.145971742489812), FRAC_CONST(0.989288759864625) }, - { FRAC_CONST(0.139898832897777), FRAC_CONST(0.990165802557248) }, - { FRAC_CONST(0.133820656193755), FRAC_CONST(0.991005566067049) }, - { FRAC_CONST(0.127737441217662), FRAC_CONST(0.991808018777406) }, - { FRAC_CONST(0.121649416999106), FRAC_CONST(0.992573130476429) }, - { FRAC_CONST(0.115556812748755), FRAC_CONST(0.993300872358093) }, - { FRAC_CONST(0.109459857849718), FRAC_CONST(0.993991217023329) }, - { FRAC_CONST(0.103358781848900), FRAC_CONST(0.994644138481051) }, - { FRAC_CONST(0.097253814448363), FRAC_CONST(0.995259612149133) }, - { FRAC_CONST(0.091145185496681), FRAC_CONST(0.995837614855342) }, - { FRAC_CONST(0.085033124980280), FRAC_CONST(0.996378124838200) }, - { FRAC_CONST(0.078917863014785), FRAC_CONST(0.996881121747814) }, - { FRAC_CONST(0.072799629836352), FRAC_CONST(0.997346586646633) }, - { FRAC_CONST(0.066678655793002), FRAC_CONST(0.997774502010168) }, - { FRAC_CONST(0.060555171335948), FRAC_CONST(0.998164851727646) }, - { FRAC_CONST(0.054429407010919), FRAC_CONST(0.998517621102622) }, - { FRAC_CONST(0.048301593449480), FRAC_CONST(0.998832796853528) }, - { FRAC_CONST(0.042171961360348), FRAC_CONST(0.999110367114175) }, - { FRAC_CONST(0.036040741520706), FRAC_CONST(0.999350321434199) }, - { FRAC_CONST(0.029908164767517), FRAC_CONST(0.999552650779457) }, - { FRAC_CONST(0.023774461988828), FRAC_CONST(0.999717347532362) }, - { FRAC_CONST(0.017639864115082), FRAC_CONST(0.999844405492175) }, - { FRAC_CONST(0.011504602110423), FRAC_CONST(0.999933819875236) }, - { FRAC_CONST(0.005368906963996), FRAC_CONST(0.999985587315143) } -}; -#endif // LD_DEC - -#ifdef ALLOW_SMALL_FRAMELENGTH -/* 480 (N/4) complex twiddle factors */ -ALIGN static const complex_t mdct_tab_1920[] = -{ - { FRAC_CONST(0.999999916334328), FRAC_CONST(0.000409061532028) }, - { FRAC_CONST(0.999993223088129), FRAC_CONST(0.003681545574400) }, - { FRAC_CONST(0.999975820717897), FRAC_CONST(0.006953990190376) }, - { FRAC_CONST(0.999947709409999), FRAC_CONST(0.010226360334704) }, - { FRAC_CONST(0.999908889465485), FRAC_CONST(0.013498620962929) }, - { FRAC_CONST(0.999859361300084), FRAC_CONST(0.016770737031768) }, - { FRAC_CONST(0.999799125444203), FRAC_CONST(0.020042673499487) }, - { FRAC_CONST(0.999728182542920), FRAC_CONST(0.023314395326274) }, - { FRAC_CONST(0.999646533355977), FRAC_CONST(0.026585867474619) }, - { FRAC_CONST(0.999554178757770), FRAC_CONST(0.029857054909681) }, - { FRAC_CONST(0.999451119737344), FRAC_CONST(0.033127922599673) }, - { FRAC_CONST(0.999337357398377), FRAC_CONST(0.036398435516228) }, - { FRAC_CONST(0.999212892959173), FRAC_CONST(0.039668558634781) }, - { FRAC_CONST(0.999077727752645), FRAC_CONST(0.042938256934941) }, - { FRAC_CONST(0.998931863226306), FRAC_CONST(0.046207495400865) }, - { FRAC_CONST(0.998775300942246), FRAC_CONST(0.049476239021636) }, - { FRAC_CONST(0.998608042577122), FRAC_CONST(0.052744452791636) }, - { FRAC_CONST(0.998430089922136), FRAC_CONST(0.056012101710921) }, - { FRAC_CONST(0.998241444883019), FRAC_CONST(0.059279150785597) }, - { FRAC_CONST(0.998042109480008), FRAC_CONST(0.062545565028192) }, - { FRAC_CONST(0.997832085847824), FRAC_CONST(0.065811309458034) }, - { FRAC_CONST(0.997611376235651), FRAC_CONST(0.069076349101624) }, - { FRAC_CONST(0.997379983007114), FRAC_CONST(0.072340648993011) }, - { FRAC_CONST(0.997137908640245), FRAC_CONST(0.075604174174166) }, - { FRAC_CONST(0.996885155727469), FRAC_CONST(0.078866889695354) }, - { FRAC_CONST(0.996621726975566), FRAC_CONST(0.082128760615515) }, - { FRAC_CONST(0.996347625205645), FRAC_CONST(0.085389752002632) }, - { FRAC_CONST(0.996062853353117), FRAC_CONST(0.088649828934106) }, - { FRAC_CONST(0.995767414467660), FRAC_CONST(0.091908956497133) }, - { FRAC_CONST(0.995461311713186), FRAC_CONST(0.095167099789075) }, - { FRAC_CONST(0.995144548367810), FRAC_CONST(0.098424223917834) }, - { FRAC_CONST(0.994817127823813), FRAC_CONST(0.101680294002229) }, - { FRAC_CONST(0.994479053587606), FRAC_CONST(0.104935275172364) }, - { FRAC_CONST(0.994130329279692), FRAC_CONST(0.108189132570007) }, - { FRAC_CONST(0.993770958634630), FRAC_CONST(0.111441831348957) }, - { FRAC_CONST(0.993400945500988), FRAC_CONST(0.114693336675426) }, - { FRAC_CONST(0.993020293841312), FRAC_CONST(0.117943613728403) }, - { FRAC_CONST(0.992629007732074), FRAC_CONST(0.121192627700032) }, - { FRAC_CONST(0.992227091363634), FRAC_CONST(0.124440343795983) }, - { FRAC_CONST(0.991814549040194), FRAC_CONST(0.127686727235827) }, - { FRAC_CONST(0.991391385179751), FRAC_CONST(0.130931743253405) }, - { FRAC_CONST(0.990957604314048), FRAC_CONST(0.134175357097202) }, - { FRAC_CONST(0.990513211088533), FRAC_CONST(0.137417534030720) }, - { FRAC_CONST(0.990058210262297), FRAC_CONST(0.140658239332849) }, - { FRAC_CONST(0.989592606708036), FRAC_CONST(0.143897438298239) }, - { FRAC_CONST(0.989116405411988), FRAC_CONST(0.147135096237670) }, - { FRAC_CONST(0.988629611473887), FRAC_CONST(0.150371178478428) }, - { FRAC_CONST(0.988132230106905), FRAC_CONST(0.153605650364672) }, - { FRAC_CONST(0.987624266637598), FRAC_CONST(0.156838477257806) }, - { FRAC_CONST(0.987105726505845), FRAC_CONST(0.160069624536852) }, - { FRAC_CONST(0.986576615264794), FRAC_CONST(0.163299057598817) }, - { FRAC_CONST(0.986036938580803), FRAC_CONST(0.166526741859069) }, - { FRAC_CONST(0.985486702233375), FRAC_CONST(0.169752642751702) }, - { FRAC_CONST(0.984925912115099), FRAC_CONST(0.172976725729910) }, - { FRAC_CONST(0.984354574231587), FRAC_CONST(0.176198956266353) }, - { FRAC_CONST(0.983772694701407), FRAC_CONST(0.179419299853531) }, - { FRAC_CONST(0.983180279756024), FRAC_CONST(0.182637722004152) }, - { FRAC_CONST(0.982577335739725), FRAC_CONST(0.185854188251500) }, - { FRAC_CONST(0.981963869109555), FRAC_CONST(0.189068664149806) }, - { FRAC_CONST(0.981339886435250), FRAC_CONST(0.192281115274616) }, - { FRAC_CONST(0.980705394399163), FRAC_CONST(0.195491507223158) }, - { FRAC_CONST(0.980060399796194), FRAC_CONST(0.198699805614714) }, - { FRAC_CONST(0.979404909533716), FRAC_CONST(0.201905976090986) }, - { FRAC_CONST(0.978738930631504), FRAC_CONST(0.205109984316464) }, - { FRAC_CONST(0.978062470221657), FRAC_CONST(0.208311795978794) }, - { FRAC_CONST(0.977375535548522), FRAC_CONST(0.211511376789145) }, - { FRAC_CONST(0.976678133968618), FRAC_CONST(0.214708692482577) }, - { FRAC_CONST(0.975970272950556), FRAC_CONST(0.217903708818409) }, - { FRAC_CONST(0.975251960074958), FRAC_CONST(0.221096391580581) }, - { FRAC_CONST(0.974523203034377), FRAC_CONST(0.224286706578026) }, - { FRAC_CONST(0.973784009633218), FRAC_CONST(0.227474619645035) }, - { FRAC_CONST(0.973034387787646), FRAC_CONST(0.230660096641619) }, - { FRAC_CONST(0.972274345525510), FRAC_CONST(0.233843103453878) }, - { FRAC_CONST(0.971503890986252), FRAC_CONST(0.237023605994367) }, - { FRAC_CONST(0.970723032420820), FRAC_CONST(0.240201570202459) }, - { FRAC_CONST(0.969931778191584), FRAC_CONST(0.243376962044711) }, - { FRAC_CONST(0.969130136772239), FRAC_CONST(0.246549747515226) }, - { FRAC_CONST(0.968318116747721), FRAC_CONST(0.249719892636022) }, - { FRAC_CONST(0.967495726814114), FRAC_CONST(0.252887363457390) }, - { FRAC_CONST(0.966662975778551), FRAC_CONST(0.256052126058264) }, - { FRAC_CONST(0.965819872559127), FRAC_CONST(0.259214146546579) }, - { FRAC_CONST(0.964966426184802), FRAC_CONST(0.262373391059634) }, - { FRAC_CONST(0.964102645795299), FRAC_CONST(0.265529825764461) }, - { FRAC_CONST(0.963228540641012), FRAC_CONST(0.268683416858178) }, - { FRAC_CONST(0.962344120082907), FRAC_CONST(0.271834130568359) }, - { FRAC_CONST(0.961449393592416), FRAC_CONST(0.274981933153391) }, - { FRAC_CONST(0.960544370751341), FRAC_CONST(0.278126790902837) }, - { FRAC_CONST(0.959629061251750), FRAC_CONST(0.281268670137799) }, - { FRAC_CONST(0.958703474895872), FRAC_CONST(0.284407537211272) }, - { FRAC_CONST(0.957767621595993), FRAC_CONST(0.287543358508512) }, - { FRAC_CONST(0.956821511374351), FRAC_CONST(0.290676100447394) }, - { FRAC_CONST(0.955865154363025), FRAC_CONST(0.293805729478766) }, - { FRAC_CONST(0.954898560803832), FRAC_CONST(0.296932212086818) }, - { FRAC_CONST(0.953921741048211), FRAC_CONST(0.300055514789431) }, - { FRAC_CONST(0.952934705557117), FRAC_CONST(0.303175604138543) }, - { FRAC_CONST(0.951937464900908), FRAC_CONST(0.306292446720504) }, - { FRAC_CONST(0.950930029759229), FRAC_CONST(0.309406009156434) }, - { FRAC_CONST(0.949912410920903), FRAC_CONST(0.312516258102580) }, - { FRAC_CONST(0.948884619283808), FRAC_CONST(0.315623160250676) }, - { FRAC_CONST(0.947846665854767), FRAC_CONST(0.318726682328294) }, - { FRAC_CONST(0.946798561749429), FRAC_CONST(0.321826791099207) }, - { FRAC_CONST(0.945740318192145), FRAC_CONST(0.324923453363742) }, - { FRAC_CONST(0.944671946515855), FRAC_CONST(0.328016635959131) }, - { FRAC_CONST(0.943593458161960), FRAC_CONST(0.331106305759876) }, - { FRAC_CONST(0.942504864680205), FRAC_CONST(0.334192429678095) }, - { FRAC_CONST(0.941406177728551), FRAC_CONST(0.337274974663880) }, - { FRAC_CONST(0.940297409073052), FRAC_CONST(0.340353907705650) }, - { FRAC_CONST(0.939178570587730), FRAC_CONST(0.343429195830507) }, - { FRAC_CONST(0.938049674254446), FRAC_CONST(0.346500806104585) }, - { FRAC_CONST(0.936910732162774), FRAC_CONST(0.349568705633406) }, - { FRAC_CONST(0.935761756509868), FRAC_CONST(0.352632861562230) }, - { FRAC_CONST(0.934602759600334), FRAC_CONST(0.355693241076410) }, - { FRAC_CONST(0.933433753846097), FRAC_CONST(0.358749811401739) }, - { FRAC_CONST(0.932254751766271), FRAC_CONST(0.361802539804806) }, - { FRAC_CONST(0.931065765987021), FRAC_CONST(0.364851393593340) }, - { FRAC_CONST(0.929866809241428), FRAC_CONST(0.367896340116568) }, - { FRAC_CONST(0.928657894369357), FRAC_CONST(0.370937346765559) }, - { FRAC_CONST(0.927439034317314), FRAC_CONST(0.373974380973575) }, - { FRAC_CONST(0.926210242138311), FRAC_CONST(0.377007410216418) }, - { FRAC_CONST(0.924971530991726), FRAC_CONST(0.380036402012783) }, - { FRAC_CONST(0.923722914143160), FRAC_CONST(0.383061323924602) }, - { FRAC_CONST(0.922464404964295), FRAC_CONST(0.386082143557389) }, - { FRAC_CONST(0.921196016932755), FRAC_CONST(0.389098828560595) }, - { FRAC_CONST(0.919917763631956), FRAC_CONST(0.392111346627946) }, - { FRAC_CONST(0.918629658750963), FRAC_CONST(0.395119665497795) }, - { FRAC_CONST(0.917331716084346), FRAC_CONST(0.398123752953462) }, - { FRAC_CONST(0.916023949532027), FRAC_CONST(0.401123576823585) }, - { FRAC_CONST(0.914706373099136), FRAC_CONST(0.404119104982459) }, - { FRAC_CONST(0.913379000895858), FRAC_CONST(0.407110305350386) }, - { FRAC_CONST(0.912041847137282), FRAC_CONST(0.410097145894012) }, - { FRAC_CONST(0.910694926143251), FRAC_CONST(0.413079594626675) }, - { FRAC_CONST(0.909338252338207), FRAC_CONST(0.416057619608744) }, - { FRAC_CONST(0.907971840251037), FRAC_CONST(0.419031188947965) }, - { FRAC_CONST(0.906595704514915), FRAC_CONST(0.422000270799800) }, - { FRAC_CONST(0.905209859867151), FRAC_CONST(0.424964833367766) }, - { FRAC_CONST(0.903814321149027), FRAC_CONST(0.427924844903780) }, - { FRAC_CONST(0.902409103305641), FRAC_CONST(0.430880273708497) }, - { FRAC_CONST(0.900994221385748), FRAC_CONST(0.433831088131649) }, - { FRAC_CONST(0.899569690541596), FRAC_CONST(0.436777256572384) }, - { FRAC_CONST(0.898135526028766), FRAC_CONST(0.439718747479604) }, - { FRAC_CONST(0.896691743206008), FRAC_CONST(0.442655529352306) }, - { FRAC_CONST(0.895238357535076), FRAC_CONST(0.445587570739915) }, - { FRAC_CONST(0.893775384580563), FRAC_CONST(0.448514840242624) }, - { FRAC_CONST(0.892302840009734), FRAC_CONST(0.451437306511726) }, - { FRAC_CONST(0.890820739592359), FRAC_CONST(0.454354938249958) }, - { FRAC_CONST(0.889329099200541), FRAC_CONST(0.457267704211826) }, - { FRAC_CONST(0.887827934808551), FRAC_CONST(0.460175573203949) }, - { FRAC_CONST(0.886317262492655), FRAC_CONST(0.463078514085383) }, - { FRAC_CONST(0.884797098430938), FRAC_CONST(0.465976495767966) }, - { FRAC_CONST(0.883267458903136), FRAC_CONST(0.468869487216642) }, - { FRAC_CONST(0.881728360290461), FRAC_CONST(0.471757457449795) }, - { FRAC_CONST(0.880179819075421), FRAC_CONST(0.474640375539586) }, - { FRAC_CONST(0.878621851841649), FRAC_CONST(0.477518210612278) }, - { FRAC_CONST(0.877054475273722), FRAC_CONST(0.480390931848569) }, - { FRAC_CONST(0.875477706156984), FRAC_CONST(0.483258508483922) }, - { FRAC_CONST(0.873891561377366), FRAC_CONST(0.486120909808896) }, - { FRAC_CONST(0.872296057921204), FRAC_CONST(0.488978105169472) }, - { FRAC_CONST(0.870691212875058), FRAC_CONST(0.491830063967383) }, - { FRAC_CONST(0.869077043425529), FRAC_CONST(0.494676755660442) }, - { FRAC_CONST(0.867453566859076), FRAC_CONST(0.497518149762867) }, - { FRAC_CONST(0.865820800561827), FRAC_CONST(0.500354215845611) }, - { FRAC_CONST(0.864178762019399), FRAC_CONST(0.503184923536685) }, - { FRAC_CONST(0.862527468816704), FRAC_CONST(0.506010242521482) }, - { FRAC_CONST(0.860866938637767), FRAC_CONST(0.508830142543107) }, - { FRAC_CONST(0.859197189265532), FRAC_CONST(0.511644593402696) }, - { FRAC_CONST(0.857518238581672), FRAC_CONST(0.514453564959741) }, - { FRAC_CONST(0.855830104566401), FRAC_CONST(0.517257027132414) }, - { FRAC_CONST(0.854132805298278), FRAC_CONST(0.520054949897887) }, - { FRAC_CONST(0.852426358954015), FRAC_CONST(0.522847303292655) }, - { FRAC_CONST(0.850710783808280), FRAC_CONST(0.525634057412856) }, - { FRAC_CONST(0.848986098233506), FRAC_CONST(0.528415182414593) }, - { FRAC_CONST(0.847252320699689), FRAC_CONST(0.531190648514252) }, - { FRAC_CONST(0.845509469774194), FRAC_CONST(0.533960425988819) }, - { FRAC_CONST(0.843757564121554), FRAC_CONST(0.536724485176205) }, - { FRAC_CONST(0.841996622503271), FRAC_CONST(0.539482796475555) }, - { FRAC_CONST(0.840226663777615), FRAC_CONST(0.542235330347571) }, - { FRAC_CONST(0.838447706899422), FRAC_CONST(0.544982057314827) }, - { FRAC_CONST(0.836659770919891), FRAC_CONST(0.547722947962084) }, - { FRAC_CONST(0.834862874986380), FRAC_CONST(0.550457972936605) }, - { FRAC_CONST(0.833057038342201), FRAC_CONST(0.553187102948470) }, - { FRAC_CONST(0.831242280326413), FRAC_CONST(0.555910308770889) }, - { FRAC_CONST(0.829418620373617), FRAC_CONST(0.558627561240515) }, - { FRAC_CONST(0.827586078013746), FRAC_CONST(0.561338831257758) }, - { FRAC_CONST(0.825744672871856), FRAC_CONST(0.564044089787093) }, - { FRAC_CONST(0.823894424667918), FRAC_CONST(0.566743307857377) }, - { FRAC_CONST(0.822035353216601), FRAC_CONST(0.569436456562150) }, - { FRAC_CONST(0.820167478427070), FRAC_CONST(0.572123507059955) }, - { FRAC_CONST(0.818290820302761), FRAC_CONST(0.574804430574639) }, - { FRAC_CONST(0.816405398941175), FRAC_CONST(0.577479198395666) }, - { FRAC_CONST(0.814511234533661), FRAC_CONST(0.580147781878420) }, - { FRAC_CONST(0.812608347365198), FRAC_CONST(0.582810152444517) }, - { FRAC_CONST(0.810696757814178), FRAC_CONST(0.585466281582107) }, - { FRAC_CONST(0.808776486352191), FRAC_CONST(0.588116140846181) }, - { FRAC_CONST(0.806847553543799), FRAC_CONST(0.590759701858874) }, - { FRAC_CONST(0.804909980046325), FRAC_CONST(0.593396936309773) }, - { FRAC_CONST(0.802963786609623), FRAC_CONST(0.596027815956215) }, - { FRAC_CONST(0.801008994075862), FRAC_CONST(0.598652312623592) }, - { FRAC_CONST(0.799045623379300), FRAC_CONST(0.601270398205654) }, - { FRAC_CONST(0.797073695546059), FRAC_CONST(0.603882044664808) }, - { FRAC_CONST(0.795093231693901), FRAC_CONST(0.606487224032418) }, - { FRAC_CONST(0.793104253032005), FRAC_CONST(0.609085908409106) }, - { FRAC_CONST(0.791106780860733), FRAC_CONST(0.611678069965050) }, - { FRAC_CONST(0.789100836571407), FRAC_CONST(0.614263680940283) }, - { FRAC_CONST(0.787086441646080), FRAC_CONST(0.616842713644988) }, - { FRAC_CONST(0.785063617657302), FRAC_CONST(0.619415140459796) }, - { FRAC_CONST(0.783032386267894), FRAC_CONST(0.621980933836084) }, - { FRAC_CONST(0.780992769230711), FRAC_CONST(0.624540066296266) }, - { FRAC_CONST(0.778944788388414), FRAC_CONST(0.627092510434089) }, - { FRAC_CONST(0.776888465673232), FRAC_CONST(0.629638238914927) }, - { FRAC_CONST(0.774823823106730), FRAC_CONST(0.632177224476073) }, - { FRAC_CONST(0.772750882799570), FRAC_CONST(0.634709439927031) }, - { FRAC_CONST(0.770669666951277), FRAC_CONST(0.637234858149809) }, - { FRAC_CONST(0.768580197850002), FRAC_CONST(0.639753452099206) }, - { FRAC_CONST(0.766482497872280), FRAC_CONST(0.642265194803105) }, - { FRAC_CONST(0.764376589482793), FRAC_CONST(0.644770059362758) }, - { FRAC_CONST(0.762262495234126), FRAC_CONST(0.647268018953079) }, - { FRAC_CONST(0.760140237766532), FRAC_CONST(0.649759046822928) }, - { FRAC_CONST(0.758009839807683), FRAC_CONST(0.652243116295397) }, - { FRAC_CONST(0.755871324172429), FRAC_CONST(0.654720200768098) }, - { FRAC_CONST(0.753724713762555), FRAC_CONST(0.657190273713446) }, - { FRAC_CONST(0.751570031566534), FRAC_CONST(0.659653308678945) }, - { FRAC_CONST(0.749407300659280), FRAC_CONST(0.662109279287469) }, - { FRAC_CONST(0.747236544201905), FRAC_CONST(0.664558159237545) }, - { FRAC_CONST(0.745057785441466), FRAC_CONST(0.666999922303638) }, - { FRAC_CONST(0.742871047710719), FRAC_CONST(0.669434542336425) }, - { FRAC_CONST(0.740676354427868), FRAC_CONST(0.671861993263083) }, - { FRAC_CONST(0.738473729096316), FRAC_CONST(0.674282249087562) }, - { FRAC_CONST(0.736263195304409), FRAC_CONST(0.676695283890867) }, - { FRAC_CONST(0.734044776725190), FRAC_CONST(0.679101071831334) }, - { FRAC_CONST(0.731818497116138), FRAC_CONST(0.681499587144906) }, - { FRAC_CONST(0.729584380318920), FRAC_CONST(0.683890804145412) }, - { FRAC_CONST(0.727342450259131), FRAC_CONST(0.686274697224838) }, - { FRAC_CONST(0.725092730946042), FRAC_CONST(0.688651240853606) }, - { FRAC_CONST(0.722835246472338), FRAC_CONST(0.691020409580841) }, - { FRAC_CONST(0.720570021013866), FRAC_CONST(0.693382178034651) }, - { FRAC_CONST(0.718297078829369), FRAC_CONST(0.695736520922392) }, - { FRAC_CONST(0.716016444260233), FRAC_CONST(0.698083413030944) }, - { FRAC_CONST(0.713728141730222), FRAC_CONST(0.700422829226978) }, - { FRAC_CONST(0.711432195745216), FRAC_CONST(0.702754744457225) }, - { FRAC_CONST(0.709128630892954), FRAC_CONST(0.705079133748748) }, - { FRAC_CONST(0.706817471842764), FRAC_CONST(0.707395972209203) }, - { FRAC_CONST(0.704498743345302), FRAC_CONST(0.709705235027113) }, - { FRAC_CONST(0.702172470232289), FRAC_CONST(0.712006897472128) }, - { FRAC_CONST(0.699838677416240), FRAC_CONST(0.714300934895292) }, - { FRAC_CONST(0.697497389890200), FRAC_CONST(0.716587322729308) }, - { FRAC_CONST(0.695148632727480), FRAC_CONST(0.718866036488799) }, - { FRAC_CONST(0.692792431081381), FRAC_CONST(0.721137051770570) }, - { FRAC_CONST(0.690428810184929), FRAC_CONST(0.723400344253874) }, - { FRAC_CONST(0.688057795350606), FRAC_CONST(0.725655889700665) }, - { FRAC_CONST(0.685679411970075), FRAC_CONST(0.727903663955865) }, - { FRAC_CONST(0.683293685513912), FRAC_CONST(0.730143642947616) }, - { FRAC_CONST(0.680900641531330), FRAC_CONST(0.732375802687543) }, - { FRAC_CONST(0.678500305649909), FRAC_CONST(0.734600119271009) }, - { FRAC_CONST(0.676092703575316), FRAC_CONST(0.736816568877370) }, - { FRAC_CONST(0.673677861091036), FRAC_CONST(0.739025127770231) }, - { FRAC_CONST(0.671255804058092), FRAC_CONST(0.741225772297702) }, - { FRAC_CONST(0.668826558414768), FRAC_CONST(0.743418478892647) }, - { FRAC_CONST(0.666390150176334), FRAC_CONST(0.745603224072940) }, - { FRAC_CONST(0.663946605434765), FRAC_CONST(0.747779984441716) }, - { FRAC_CONST(0.661495950358462), FRAC_CONST(0.749948736687619) }, - { FRAC_CONST(0.659038211191971), FRAC_CONST(0.752109457585056) }, - { FRAC_CONST(0.656573414255705), FRAC_CONST(0.754262123994441) }, - { FRAC_CONST(0.654101585945659), FRAC_CONST(0.756406712862448) }, - { FRAC_CONST(0.651622752733128), FRAC_CONST(0.758543201222251) }, - { FRAC_CONST(0.649136941164425), FRAC_CONST(0.760671566193777) }, - { FRAC_CONST(0.646644177860593), FRAC_CONST(0.762791784983948) }, - { FRAC_CONST(0.644144489517126), FRAC_CONST(0.764903834886923) }, - { FRAC_CONST(0.641637902903677), FRAC_CONST(0.767007693284345) }, - { FRAC_CONST(0.639124444863776), FRAC_CONST(0.769103337645580) }, - { FRAC_CONST(0.636604142314538), FRAC_CONST(0.771190745527961) }, - { FRAC_CONST(0.634077022246379), FRAC_CONST(0.773269894577026) }, - { FRAC_CONST(0.631543111722725), FRAC_CONST(0.775340762526760) }, - { FRAC_CONST(0.629002437879721), FRAC_CONST(0.777403327199831) }, - { FRAC_CONST(0.626455027925944), FRAC_CONST(0.779457566507828) }, - { FRAC_CONST(0.623900909142107), FRAC_CONST(0.781503458451498) }, - { FRAC_CONST(0.621340108880771), FRAC_CONST(0.783540981120982) }, - { FRAC_CONST(0.618772654566049), FRAC_CONST(0.785570112696050) }, - { FRAC_CONST(0.616198573693314), FRAC_CONST(0.787590831446332) }, - { FRAC_CONST(0.613617893828905), FRAC_CONST(0.789603115731555) }, - { FRAC_CONST(0.611030642609828), FRAC_CONST(0.791606944001769) }, - { FRAC_CONST(0.608436847743468), FRAC_CONST(0.793602294797585) }, - { FRAC_CONST(0.605836537007281), FRAC_CONST(0.795589146750397) }, - { FRAC_CONST(0.603229738248508), FRAC_CONST(0.797567478582619) }, - { FRAC_CONST(0.600616479383869), FRAC_CONST(0.799537269107905) }, - { FRAC_CONST(0.597996788399267), FRAC_CONST(0.801498497231381) }, - { FRAC_CONST(0.595370693349487), FRAC_CONST(0.803451141949871) }, - { FRAC_CONST(0.592738222357898), FRAC_CONST(0.805395182352117) }, - { FRAC_CONST(0.590099403616149), FRAC_CONST(0.807330597619008) }, - { FRAC_CONST(0.587454265383869), FRAC_CONST(0.809257367023803) }, - { FRAC_CONST(0.584802835988364), FRAC_CONST(0.811175469932349) }, - { FRAC_CONST(0.582145143824311), FRAC_CONST(0.813084885803304) }, - { FRAC_CONST(0.579481217353460), FRAC_CONST(0.814985594188359) }, - { FRAC_CONST(0.576811085104321), FRAC_CONST(0.816877574732454) }, - { FRAC_CONST(0.574134775671867), FRAC_CONST(0.818760807173997) }, - { FRAC_CONST(0.571452317717222), FRAC_CONST(0.820635271345081) }, - { FRAC_CONST(0.568763739967354), FRAC_CONST(0.822500947171703) }, - { FRAC_CONST(0.566069071214772), FRAC_CONST(0.824357814673971) }, - { FRAC_CONST(0.563368340317214), FRAC_CONST(0.826205853966327) }, - { FRAC_CONST(0.560661576197336), FRAC_CONST(0.828045045257756) }, - { FRAC_CONST(0.557948807842409), FRAC_CONST(0.829875368851995) }, - { FRAC_CONST(0.555230064304002), FRAC_CONST(0.831696805147750) }, - { FRAC_CONST(0.552505374697674), FRAC_CONST(0.833509334638900) }, - { FRAC_CONST(0.549774768202663), FRAC_CONST(0.835312937914713) }, - { FRAC_CONST(0.547038274061568), FRAC_CONST(0.837107595660044) }, - { FRAC_CONST(0.544295921580046), FRAC_CONST(0.838893288655553) }, - { FRAC_CONST(0.541547740126486), FRAC_CONST(0.840669997777901) }, - { FRAC_CONST(0.538793759131706), FRAC_CONST(0.842437703999961) }, - { FRAC_CONST(0.536034008088628), FRAC_CONST(0.844196388391019) }, - { FRAC_CONST(0.533268516551970), FRAC_CONST(0.845946032116980) }, - { FRAC_CONST(0.530497314137923), FRAC_CONST(0.847686616440563) }, - { FRAC_CONST(0.527720430523840), FRAC_CONST(0.849418122721510) }, - { FRAC_CONST(0.524937895447912), FRAC_CONST(0.851140532416778) }, - { FRAC_CONST(0.522149738708856), FRAC_CONST(0.852853827080745) }, - { FRAC_CONST(0.519355990165590), FRAC_CONST(0.854557988365401) }, - { FRAC_CONST(0.516556679736915), FRAC_CONST(0.856252998020546) }, - { FRAC_CONST(0.513751837401199), FRAC_CONST(0.857938837893991) }, - { FRAC_CONST(0.510941493196049), FRAC_CONST(0.859615489931744) }, - { FRAC_CONST(0.508125677217994), FRAC_CONST(0.861282936178208) }, - { FRAC_CONST(0.505304419622159), FRAC_CONST(0.862941158776375) }, - { FRAC_CONST(0.502477750621949), FRAC_CONST(0.864590139968012) }, - { FRAC_CONST(0.499645700488717), FRAC_CONST(0.866229862093855) }, - { FRAC_CONST(0.496808299551444), FRAC_CONST(0.867860307593799) }, - { FRAC_CONST(0.493965578196415), FRAC_CONST(0.869481459007080) }, - { FRAC_CONST(0.491117566866892), FRAC_CONST(0.871093298972471) }, - { FRAC_CONST(0.488264296062789), FRAC_CONST(0.872695810228461) }, - { FRAC_CONST(0.485405796340343), FRAC_CONST(0.874288975613440) }, - { FRAC_CONST(0.482542098311789), FRAC_CONST(0.875872778065888) }, - { FRAC_CONST(0.479673232645033), FRAC_CONST(0.877447200624553) }, - { FRAC_CONST(0.476799230063322), FRAC_CONST(0.879012226428633) }, - { FRAC_CONST(0.473920121344914), FRAC_CONST(0.880567838717962) }, - { FRAC_CONST(0.471035937322751), FRAC_CONST(0.882114020833179) }, - { FRAC_CONST(0.468146708884125), FRAC_CONST(0.883650756215917) }, - { FRAC_CONST(0.465252466970353), FRAC_CONST(0.885178028408975) }, - { FRAC_CONST(0.462353242576441), FRAC_CONST(0.886695821056495) }, - { FRAC_CONST(0.459449066750752), FRAC_CONST(0.888204117904136) }, - { FRAC_CONST(0.456539970594675), FRAC_CONST(0.889702902799251) }, - { FRAC_CONST(0.453625985262295), FRAC_CONST(0.891192159691058) }, - { FRAC_CONST(0.450707141960053), FRAC_CONST(0.892671872630812) }, - { FRAC_CONST(0.447783471946415), FRAC_CONST(0.894142025771977) }, - { FRAC_CONST(0.444855006531538), FRAC_CONST(0.895602603370393) }, - { FRAC_CONST(0.441921777076935), FRAC_CONST(0.897053589784447) }, - { FRAC_CONST(0.438983814995137), FRAC_CONST(0.898494969475242) }, - { FRAC_CONST(0.436041151749356), FRAC_CONST(0.899926727006758) }, - { FRAC_CONST(0.433093818853152), FRAC_CONST(0.901348847046022) }, - { FRAC_CONST(0.430141847870093), FRAC_CONST(0.902761314363272) }, - { FRAC_CONST(0.427185270413416), FRAC_CONST(0.904164113832116) }, - { FRAC_CONST(0.424224118145690), FRAC_CONST(0.905557230429701) }, - { FRAC_CONST(0.421258422778478), FRAC_CONST(0.906940649236866) }, - { FRAC_CONST(0.418288216071994), FRAC_CONST(0.908314355438308) }, - { FRAC_CONST(0.415313529834766), FRAC_CONST(0.909678334322736) }, - { FRAC_CONST(0.412334395923293), FRAC_CONST(0.911032571283032) }, - { FRAC_CONST(0.409350846241706), FRAC_CONST(0.912377051816407) }, - { FRAC_CONST(0.406362912741425), FRAC_CONST(0.913711761524555) }, - { FRAC_CONST(0.403370627420818), FRAC_CONST(0.915036686113806) }, - { FRAC_CONST(0.400374022324857), FRAC_CONST(0.916351811395282) }, - { FRAC_CONST(0.397373129544774), FRAC_CONST(0.917657123285050) }, - { FRAC_CONST(0.394367981217720), FRAC_CONST(0.918952607804266) }, - { FRAC_CONST(0.391358609526420), FRAC_CONST(0.920238251079332) }, - { FRAC_CONST(0.388345046698826), FRAC_CONST(0.921514039342042) }, - { FRAC_CONST(0.385327325007776), FRAC_CONST(0.922779958929729) }, - { FRAC_CONST(0.382305476770645), FRAC_CONST(0.924035996285410) }, - { FRAC_CONST(0.379279534348999), FRAC_CONST(0.925282137957935) }, - { FRAC_CONST(0.376249530148250), FRAC_CONST(0.926518370602127) }, - { FRAC_CONST(0.373215496617310), FRAC_CONST(0.927744680978929) }, - { FRAC_CONST(0.370177466248239), FRAC_CONST(0.928961055955541) }, - { FRAC_CONST(0.367135471575903), FRAC_CONST(0.930167482505564) }, - { FRAC_CONST(0.364089545177621), FRAC_CONST(0.931363947709140) }, - { FRAC_CONST(0.361039719672816), FRAC_CONST(0.932550438753087) }, - { FRAC_CONST(0.357986027722671), FRAC_CONST(0.933726942931039) }, - { FRAC_CONST(0.354928502029772), FRAC_CONST(0.934893447643582) }, - { FRAC_CONST(0.351867175337763), FRAC_CONST(0.936049940398387) }, - { FRAC_CONST(0.348802080430994), FRAC_CONST(0.937196408810347) }, - { FRAC_CONST(0.345733250134169), FRAC_CONST(0.938332840601705) }, - { FRAC_CONST(0.342660717311994), FRAC_CONST(0.939459223602190) }, - { FRAC_CONST(0.339584514868829), FRAC_CONST(0.940575545749145) }, - { FRAC_CONST(0.336504675748328), FRAC_CONST(0.941681795087657) }, - { FRAC_CONST(0.333421232933097), FRAC_CONST(0.942777959770684) }, - { FRAC_CONST(0.330334219444328), FRAC_CONST(0.943864028059183) }, - { FRAC_CONST(0.327243668341457), FRAC_CONST(0.944939988322235) }, - { FRAC_CONST(0.324149612721804), FRAC_CONST(0.946005829037171) }, - { FRAC_CONST(0.321052085720218), FRAC_CONST(0.947061538789691) }, - { FRAC_CONST(0.317951120508725), FRAC_CONST(0.948107106273994) }, - { FRAC_CONST(0.314846750296171), FRAC_CONST(0.949142520292891) }, - { FRAC_CONST(0.311739008327867), FRAC_CONST(0.950167769757930) }, - { FRAC_CONST(0.308627927885232), FRAC_CONST(0.951182843689513) }, - { FRAC_CONST(0.305513542285440), FRAC_CONST(0.952187731217013) }, - { FRAC_CONST(0.302395884881056), FRAC_CONST(0.953182421578893) }, - { FRAC_CONST(0.299274989059689), FRAC_CONST(0.954166904122818) }, - { FRAC_CONST(0.296150888243624), FRAC_CONST(0.955141168305771) }, - { FRAC_CONST(0.293023615889471), FRAC_CONST(0.956105203694164) }, - { FRAC_CONST(0.289893205487806), FRAC_CONST(0.957058999963955) }, - { FRAC_CONST(0.286759690562807), FRAC_CONST(0.958002546900750) }, - { FRAC_CONST(0.283623104671904), FRAC_CONST(0.958935834399920) }, - { FRAC_CONST(0.280483481405410), FRAC_CONST(0.959858852466706) }, - { FRAC_CONST(0.277340854386169), FRAC_CONST(0.960771591216325) }, - { FRAC_CONST(0.274195257269191), FRAC_CONST(0.961674040874080) }, - { FRAC_CONST(0.271046723741295), FRAC_CONST(0.962566191775459) }, - { FRAC_CONST(0.267895287520743), FRAC_CONST(0.963448034366243) }, - { FRAC_CONST(0.264740982356888), FRAC_CONST(0.964319559202607) }, - { FRAC_CONST(0.261583842029803), FRAC_CONST(0.965180756951218) }, - { FRAC_CONST(0.258423900349924), FRAC_CONST(0.966031618389343) }, - { FRAC_CONST(0.255261191157689), FRAC_CONST(0.966872134404937) }, - { FRAC_CONST(0.252095748323171), FRAC_CONST(0.967702295996750) }, - { FRAC_CONST(0.248927605745720), FRAC_CONST(0.968522094274417) }, - { FRAC_CONST(0.245756797353599), FRAC_CONST(0.969331520458559) }, - { FRAC_CONST(0.242583357103617), FRAC_CONST(0.970130565880871) }, - { FRAC_CONST(0.239407318980770), FRAC_CONST(0.970919221984218) }, - { FRAC_CONST(0.236228716997876), FRAC_CONST(0.971697480322728) }, - { FRAC_CONST(0.233047585195206), FRAC_CONST(0.972465332561878) }, - { FRAC_CONST(0.229863957640129), FRAC_CONST(0.973222770478587) }, - { FRAC_CONST(0.226677868426735), FRAC_CONST(0.973969785961306) }, - { FRAC_CONST(0.223489351675482), FRAC_CONST(0.974706371010097) }, - { FRAC_CONST(0.220298441532823), FRAC_CONST(0.975432517736727) }, - { FRAC_CONST(0.217105172170841), FRAC_CONST(0.976148218364747) }, - { FRAC_CONST(0.213909577786886), FRAC_CONST(0.976853465229579) }, - { FRAC_CONST(0.210711692603206), FRAC_CONST(0.977548250778596) }, - { FRAC_CONST(0.207511550866582), FRAC_CONST(0.978232567571202) }, - { FRAC_CONST(0.204309186847962), FRAC_CONST(0.978906408278914) }, - { FRAC_CONST(0.201104634842092), FRAC_CONST(0.979569765685441) }, - { FRAC_CONST(0.197897929167148), FRAC_CONST(0.980222632686756) }, - { FRAC_CONST(0.194689104164373), FRAC_CONST(0.980865002291179) }, - { FRAC_CONST(0.191478194197704), FRAC_CONST(0.981496867619447) }, - { FRAC_CONST(0.188265233653407), FRAC_CONST(0.982118221904791) }, - { FRAC_CONST(0.185050256939710), FRAC_CONST(0.982729058493005) }, - { FRAC_CONST(0.181833298486427), FRAC_CONST(0.983329370842520) }, - { FRAC_CONST(0.178614392744603), FRAC_CONST(0.983919152524473) }, - { FRAC_CONST(0.175393574186129), FRAC_CONST(0.984498397222776) }, - { FRAC_CONST(0.172170877303385), FRAC_CONST(0.985067098734184) }, - { FRAC_CONST(0.168946336608867), FRAC_CONST(0.985625250968360) }, - { FRAC_CONST(0.165719986634814), FRAC_CONST(0.986172847947943) }, - { FRAC_CONST(0.162491861932842), FRAC_CONST(0.986709883808609) }, - { FRAC_CONST(0.159261997073573), FRAC_CONST(0.987236352799134) }, - { FRAC_CONST(0.156030426646266), FRAC_CONST(0.987752249281460) }, - { FRAC_CONST(0.152797185258443), FRAC_CONST(0.988257567730749) }, - { FRAC_CONST(0.149562307535523), FRAC_CONST(0.988752302735447) }, - { FRAC_CONST(0.146325828120446), FRAC_CONST(0.989236448997339) }, - { FRAC_CONST(0.143087781673307), FRAC_CONST(0.989710001331608) }, - { FRAC_CONST(0.139848202870981), FRAC_CONST(0.990172954666889) }, - { FRAC_CONST(0.136607126406757), FRAC_CONST(0.990625304045323) }, - { FRAC_CONST(0.133364586989957), FRAC_CONST(0.991067044622612) }, - { FRAC_CONST(0.130120619345575), FRAC_CONST(0.991498171668069) }, - { FRAC_CONST(0.126875258213898), FRAC_CONST(0.991918680564670) }, - { FRAC_CONST(0.123628538350136), FRAC_CONST(0.992328566809103) }, - { FRAC_CONST(0.120380494524051), FRAC_CONST(0.992727826011815) }, - { FRAC_CONST(0.117131161519582), FRAC_CONST(0.993116453897061) }, - { FRAC_CONST(0.113880574134475), FRAC_CONST(0.993494446302948) }, - { FRAC_CONST(0.110628767179910), FRAC_CONST(0.993861799181482) }, - { FRAC_CONST(0.107375775480128), FRAC_CONST(0.994218508598608) }, - { FRAC_CONST(0.104121633872055), FRAC_CONST(0.994564570734255) }, - { FRAC_CONST(0.100866377204933), FRAC_CONST(0.994899981882376) }, - { FRAC_CONST(0.097610040339947), FRAC_CONST(0.995224738450986) }, - { FRAC_CONST(0.094352658149849), FRAC_CONST(0.995538836962204) }, - { FRAC_CONST(0.091094265518583), FRAC_CONST(0.995842274052287) }, - { FRAC_CONST(0.087834897340919), FRAC_CONST(0.996135046471667) }, - { FRAC_CONST(0.084574588522070), FRAC_CONST(0.996417151084987) }, - { FRAC_CONST(0.081313373977324), FRAC_CONST(0.996688584871134) }, - { FRAC_CONST(0.078051288631670), FRAC_CONST(0.996949344923269) }, - { FRAC_CONST(0.074788367419420), FRAC_CONST(0.997199428448862) }, - { FRAC_CONST(0.071524645283840), FRAC_CONST(0.997438832769720) }, - { FRAC_CONST(0.068260157176771), FRAC_CONST(0.997667555322013) }, - { FRAC_CONST(0.064994938058259), FRAC_CONST(0.997885593656308) }, - { FRAC_CONST(0.061729022896176), FRAC_CONST(0.998092945437590) }, - { FRAC_CONST(0.058462446665851), FRAC_CONST(0.998289608445286) }, - { FRAC_CONST(0.055195244349690), FRAC_CONST(0.998475580573295) }, - { FRAC_CONST(0.051927450936806), FRAC_CONST(0.998650859830004) }, - { FRAC_CONST(0.048659101422640), FRAC_CONST(0.998815444338313) }, - { FRAC_CONST(0.045390230808591), FRAC_CONST(0.998969332335654) }, - { FRAC_CONST(0.042120874101635), FRAC_CONST(0.999112522174011) }, - { FRAC_CONST(0.038851066313958), FRAC_CONST(0.999245012319936) }, - { FRAC_CONST(0.035580842462574), FRAC_CONST(0.999366801354564) }, - { FRAC_CONST(0.032310237568951), FRAC_CONST(0.999477887973635) }, - { FRAC_CONST(0.029039286658643), FRAC_CONST(0.999578270987499) }, - { FRAC_CONST(0.025768024760904), FRAC_CONST(0.999667949321134) }, - { FRAC_CONST(0.022496486908322), FRAC_CONST(0.999746922014158) }, - { FRAC_CONST(0.019224708136438), FRAC_CONST(0.999815188220837) }, - { FRAC_CONST(0.015952723483375), FRAC_CONST(0.999872747210095) }, - { FRAC_CONST(0.012680567989461), FRAC_CONST(0.999919598365521) }, - { FRAC_CONST(0.009408276696850), FRAC_CONST(0.999955741185376) }, - { FRAC_CONST(0.006135884649155), FRAC_CONST(0.999981175282601) }, - { FRAC_CONST(0.002863426891064), FRAC_CONST(0.999995900384816) } -}; - -#ifdef LD_DEC -/* 240 (N/4) complex twiddle factors */ -ALIGN static const complex_t mdct_tab_960[] = -{ - { FRAC_CONST(0.999999665337326), FRAC_CONST(0.000818122995607) }, - { FRAC_CONST(0.999972892444367), FRAC_CONST(0.007363041249780) }, - { FRAC_CONST(0.999903284040864), FRAC_CONST(0.013907644095771) }, - { FRAC_CONST(0.999790843108610), FRAC_CONST(0.020451651184577) }, - { FRAC_CONST(0.999635574464198), FRAC_CONST(0.026994782192715) }, - { FRAC_CONST(0.999437484758823), FRAC_CONST(0.033536756834230) }, - { FRAC_CONST(0.999196582477986), FRAC_CONST(0.040077294872701) }, - { FRAC_CONST(0.998912877941140), FRAC_CONST(0.046616116133247) }, - { FRAC_CONST(0.998586383301244), FRAC_CONST(0.053152940514528) }, - { FRAC_CONST(0.998217112544241), FRAC_CONST(0.059687488000744) }, - { FRAC_CONST(0.997805081488460), FRAC_CONST(0.066219478673630) }, - { FRAC_CONST(0.997350307783942), FRAC_CONST(0.072748632724445) }, - { FRAC_CONST(0.996852810911678), FRAC_CONST(0.079274670465961) }, - { FRAC_CONST(0.996312612182778), FRAC_CONST(0.085797312344440) }, - { FRAC_CONST(0.995729734737558), FRAC_CONST(0.092316278951614) }, - { FRAC_CONST(0.995104203544548), FRAC_CONST(0.098831291036650) }, - { FRAC_CONST(0.994436045399422), FRAC_CONST(0.105342069518114) }, - { FRAC_CONST(0.993725288923851), FRAC_CONST(0.111848335495926) }, - { FRAC_CONST(0.992971964564277), FRAC_CONST(0.118349810263305) }, - { FRAC_CONST(0.992176104590608), FRAC_CONST(0.124846215318711) }, - { FRAC_CONST(0.991337743094838), FRAC_CONST(0.131337272377774) }, - { FRAC_CONST(0.990456915989581), FRAC_CONST(0.137822703385212) }, - { FRAC_CONST(0.989533661006540), FRAC_CONST(0.144302230526747) }, - { FRAC_CONST(0.988568017694885), FRAC_CONST(0.150775576241001) }, - { FRAC_CONST(0.987560027419562), FRAC_CONST(0.157242463231389) }, - { FRAC_CONST(0.986509733359519), FRAC_CONST(0.163702614477995) }, - { FRAC_CONST(0.985417180505858), FRAC_CONST(0.170155753249442) }, - { FRAC_CONST(0.984282415659907), FRAC_CONST(0.176601603114742) }, - { FRAC_CONST(0.983105487431216), FRAC_CONST(0.183039887955141) }, - { FRAC_CONST(0.981886446235473), FRAC_CONST(0.189470331975943) }, - { FRAC_CONST(0.980625344292344), FRAC_CONST(0.195892659718330) }, - { FRAC_CONST(0.979322235623241), FRAC_CONST(0.202306596071156) }, - { FRAC_CONST(0.977977176049000), FRAC_CONST(0.208711866282735) }, - { FRAC_CONST(0.976590223187499), FRAC_CONST(0.215108195972610) }, - { FRAC_CONST(0.975161436451181), FRAC_CONST(0.221495311143304) }, - { FRAC_CONST(0.973690877044515), FRAC_CONST(0.227872938192063) }, - { FRAC_CONST(0.972178607961371), FRAC_CONST(0.234240803922570) }, - { FRAC_CONST(0.970624693982323), FRAC_CONST(0.240598635556650) }, - { FRAC_CONST(0.969029201671875), FRAC_CONST(0.246946160745958) }, - { FRAC_CONST(0.967392199375607), FRAC_CONST(0.253283107583640) }, - { FRAC_CONST(0.965713757217249), FRAC_CONST(0.259609204615985) }, - { FRAC_CONST(0.963993947095677), FRAC_CONST(0.265924180854051) }, - { FRAC_CONST(0.962232842681832), FRAC_CONST(0.272227765785273) }, - { FRAC_CONST(0.960430519415566), FRAC_CONST(0.278519689385053) }, - { FRAC_CONST(0.958587054502409), FRAC_CONST(0.284799682128326) }, - { FRAC_CONST(0.956702526910263), FRAC_CONST(0.291067475001103) }, - { FRAC_CONST(0.954777017366017), FRAC_CONST(0.297322799511998) }, - { FRAC_CONST(0.952810608352092), FRAC_CONST(0.303565387703730) }, - { FRAC_CONST(0.950803384102905), FRAC_CONST(0.309794972164597) }, - { FRAC_CONST(0.948755430601263), FRAC_CONST(0.316011286039934) }, - { FRAC_CONST(0.946666835574676), FRAC_CONST(0.322214063043544) }, - { FRAC_CONST(0.944537688491606), FRAC_CONST(0.328403037469105) }, - { FRAC_CONST(0.942368080557626), FRAC_CONST(0.334577944201551) }, - { FRAC_CONST(0.940158104711519), FRAC_CONST(0.340738518728429) }, - { FRAC_CONST(0.937907855621296), FRAC_CONST(0.346884497151231) }, - { FRAC_CONST(0.935617429680138), FRAC_CONST(0.353015616196696) }, - { FRAC_CONST(0.933286925002268), FRAC_CONST(0.359131613228090) }, - { FRAC_CONST(0.930916441418752), FRAC_CONST(0.365232226256457) }, - { FRAC_CONST(0.928506080473216), FRAC_CONST(0.371317193951838) }, - { FRAC_CONST(0.926055945417500), FRAC_CONST(0.377386255654469) }, - { FRAC_CONST(0.923566141207236), FRAC_CONST(0.383439151385947) }, - { FRAC_CONST(0.921036774497350), FRAC_CONST(0.389475621860365) }, - { FRAC_CONST(0.918467953637492), FRAC_CONST(0.395495408495417) }, - { FRAC_CONST(0.915859788667400), FRAC_CONST(0.401498253423481) }, - { FRAC_CONST(0.913212391312179), FRAC_CONST(0.407483899502658) }, - { FRAC_CONST(0.910525874977521), FRAC_CONST(0.413452090327791) }, - { FRAC_CONST(0.907800354744844), FRAC_CONST(0.419402570241451) }, - { FRAC_CONST(0.905035947366364), FRAC_CONST(0.425335084344881) }, - { FRAC_CONST(0.902232771260093), FRAC_CONST(0.431249378508924) }, - { FRAC_CONST(0.899390946504764), FRAC_CONST(0.437145199384900) }, - { FRAC_CONST(0.896510594834693), FRAC_CONST(0.443022294415467) }, - { FRAC_CONST(0.893591839634558), FRAC_CONST(0.448880411845433) }, - { FRAC_CONST(0.890634805934118), FRAC_CONST(0.454719300732547) }, - { FRAC_CONST(0.887639620402854), FRAC_CONST(0.460538710958240) }, - { FRAC_CONST(0.884606411344546), FRAC_CONST(0.466338393238348) }, - { FRAC_CONST(0.881535308691775), FRAC_CONST(0.472118099133784) }, - { FRAC_CONST(0.878426444000357), FRAC_CONST(0.477877581061184) }, - { FRAC_CONST(0.875279950443708), FRAC_CONST(0.483616592303511) }, - { FRAC_CONST(0.872095962807140), FRAC_CONST(0.489334887020625) }, - { FRAC_CONST(0.868874617482085), FRAC_CONST(0.495032220259813) }, - { FRAC_CONST(0.865616052460258), FRAC_CONST(0.500708347966279) }, - { FRAC_CONST(0.862320407327736), FRAC_CONST(0.506363026993605) }, - { FRAC_CONST(0.858987823258990), FRAC_CONST(0.511996015114162) }, - { FRAC_CONST(0.855618443010829), FRAC_CONST(0.517607071029487) }, - { FRAC_CONST(0.852212410916289), FRAC_CONST(0.523195954380619) }, - { FRAC_CONST(0.848769872878448), FRAC_CONST(0.528762425758396) }, - { FRAC_CONST(0.845290976364179), FRAC_CONST(0.534306246713712) }, - { FRAC_CONST(0.841775870397828), FRAC_CONST(0.539827179767727) }, - { FRAC_CONST(0.838224705554838), FRAC_CONST(0.545324988422046) }, - { FRAC_CONST(0.834637633955290), FRAC_CONST(0.550799437168844) }, - { FRAC_CONST(0.831014809257393), FRAC_CONST(0.556250291500956) }, - { FRAC_CONST(0.827356386650900), FRAC_CONST(0.561677317921925) }, - { FRAC_CONST(0.823662522850458), FRAC_CONST(0.567080283956001) }, - { FRAC_CONST(0.819933376088899), FRAC_CONST(0.572458958158102) }, - { FRAC_CONST(0.816169106110459), FRAC_CONST(0.577813110123727) }, - { FRAC_CONST(0.812369874163934), FRAC_CONST(0.583142510498826) }, - { FRAC_CONST(0.808535842995778), FRAC_CONST(0.588446930989624) }, - { FRAC_CONST(0.804667176843123), FRAC_CONST(0.593726144372402) }, - { FRAC_CONST(0.800764041426753), FRAC_CONST(0.598979924503229) }, - { FRAC_CONST(0.796826603943998), FRAC_CONST(0.604208046327650) }, - { FRAC_CONST(0.792855033061574), FRAC_CONST(0.609410285890327) }, - { FRAC_CONST(0.788849498908361), FRAC_CONST(0.614586420344631) }, - { FRAC_CONST(0.784810173068109), FRAC_CONST(0.619736227962191) }, - { FRAC_CONST(0.780737228572094), FRAC_CONST(0.624859488142386) }, - { FRAC_CONST(0.776630839891703), FRAC_CONST(0.629955981421804) }, - { FRAC_CONST(0.772491182930959), FRAC_CONST(0.635025489483633) }, - { FRAC_CONST(0.768318435018988), FRAC_CONST(0.640067795167023) }, - { FRAC_CONST(0.764112774902423), FRAC_CONST(0.645082682476378) }, - { FRAC_CONST(0.759874382737746), FRAC_CONST(0.650069936590618) }, - { FRAC_CONST(0.755603440083571), FRAC_CONST(0.655029343872374) }, - { FRAC_CONST(0.751300129892866), FRAC_CONST(0.659960691877147) }, - { FRAC_CONST(0.746964636505118), FRAC_CONST(0.664863769362399) }, - { FRAC_CONST(0.742597145638433), FRAC_CONST(0.669738366296610) }, - { FRAC_CONST(0.738197844381584), FRAC_CONST(0.674584273868271) }, - { FRAC_CONST(0.733766921185995), FRAC_CONST(0.679401284494831) }, - { FRAC_CONST(0.729304565857668), FRAC_CONST(0.684189191831585) }, - { FRAC_CONST(0.724810969549055), FRAC_CONST(0.688947790780520) }, - { FRAC_CONST(0.720286324750863), FRAC_CONST(0.693676877499095) }, - { FRAC_CONST(0.715730825283819), FRAC_CONST(0.698376249408973) }, - { FRAC_CONST(0.711144666290356), FRAC_CONST(0.703045705204703) }, - { FRAC_CONST(0.706528044226263), FRAC_CONST(0.707685044862340) }, - { FRAC_CONST(0.701881156852263), FRAC_CONST(0.712294069648014) }, - { FRAC_CONST(0.697204203225545), FRAC_CONST(0.716872582126442) }, - { FRAC_CONST(0.692497383691237), FRAC_CONST(0.721420386169390) }, - { FRAC_CONST(0.687760899873822), FRAC_CONST(0.725937286964068) }, - { FRAC_CONST(0.682994954668502), FRAC_CONST(0.730423091021479) }, - { FRAC_CONST(0.678199752232508), FRAC_CONST(0.734877606184707) }, - { FRAC_CONST(0.673375497976352), FRAC_CONST(0.739300641637149) }, - { FRAC_CONST(0.668522398555031), FRAC_CONST(0.743692007910687) }, - { FRAC_CONST(0.663640661859171), FRAC_CONST(0.748051516893805) }, - { FRAC_CONST(0.658730497006124), FRAC_CONST(0.752378981839648) }, - { FRAC_CONST(0.653792114331011), FRAC_CONST(0.756674217374021) }, - { FRAC_CONST(0.648825725377709), FRAC_CONST(0.760937039503328) }, - { FRAC_CONST(0.643831542889792), FRAC_CONST(0.765167265622459) }, - { FRAC_CONST(0.638809780801414), FRAC_CONST(0.769364714522605) }, - { FRAC_CONST(0.633760654228152), FRAC_CONST(0.773529206399025) }, - { FRAC_CONST(0.628684379457781), FRAC_CONST(0.777660562858748) }, - { FRAC_CONST(0.623581173941019), FRAC_CONST(0.781758606928213) }, - { FRAC_CONST(0.618451256282204), FRAC_CONST(0.785823163060853) }, - { FRAC_CONST(0.613294846229936), FRAC_CONST(0.789854057144609) }, - { FRAC_CONST(0.608112164667659), FRAC_CONST(0.793851116509396) }, - { FRAC_CONST(0.602903433604202), FRAC_CONST(0.797814169934493) }, - { FRAC_CONST(0.597668876164268), FRAC_CONST(0.801743047655882) }, - { FRAC_CONST(0.592408716578875), FRAC_CONST(0.805637581373517) }, - { FRAC_CONST(0.587123180175754), FRAC_CONST(0.809497604258536) }, - { FRAC_CONST(0.581812493369691), FRAC_CONST(0.813322950960406) }, - { FRAC_CONST(0.576476883652835), FRAC_CONST(0.817113457614006) }, - { FRAC_CONST(0.571116579584947), FRAC_CONST(0.820868961846646) }, - { FRAC_CONST(0.565731810783613), FRAC_CONST(0.824589302785025) }, - { FRAC_CONST(0.560322807914407), FRAC_CONST(0.828274321062119) }, - { FRAC_CONST(0.554889802681009), FRAC_CONST(0.831923858824010) }, - { FRAC_CONST(0.549433027815281), FRAC_CONST(0.835537759736646) }, - { FRAC_CONST(0.543952717067296), FRAC_CONST(0.839115868992540) }, - { FRAC_CONST(0.538449105195327), FRAC_CONST(0.842658033317402) }, - { FRAC_CONST(0.532922427955790), FRAC_CONST(0.846164100976699) }, - { FRAC_CONST(0.527372922093142), FRAC_CONST(0.849633921782164) }, - { FRAC_CONST(0.521800825329746), FRAC_CONST(0.853067347098221) }, - { FRAC_CONST(0.516206376355680), FRAC_CONST(0.856464229848356) }, - { FRAC_CONST(0.510589814818519), FRAC_CONST(0.859824424521420) }, - { FRAC_CONST(0.504951381313066), FRAC_CONST(0.863147787177854) }, - { FRAC_CONST(0.499291317371047), FRAC_CONST(0.866434175455865) }, - { FRAC_CONST(0.493609865450762), FRAC_CONST(0.869683448577516) }, - { FRAC_CONST(0.487907268926702), FRAC_CONST(0.872895467354761) }, - { FRAC_CONST(0.482183772079123), FRAC_CONST(0.876070094195407) }, - { FRAC_CONST(0.476439620083580), FRAC_CONST(0.879207193109004) }, - { FRAC_CONST(0.470675059000427), FRAC_CONST(0.882306629712678) }, - { FRAC_CONST(0.464890335764274), FRAC_CONST(0.885368271236879) }, - { FRAC_CONST(0.459085698173413), FRAC_CONST(0.888391986531075) }, - { FRAC_CONST(0.453261394879198), FRAC_CONST(0.891377646069366) }, - { FRAC_CONST(0.447417675375397), FRAC_CONST(0.894325121956035) }, - { FRAC_CONST(0.441554789987504), FRAC_CONST(0.897234287931024) }, - { FRAC_CONST(0.435672989862017), FRAC_CONST(0.900105019375345) }, - { FRAC_CONST(0.429772526955677), FRAC_CONST(0.902937193316419) }, - { FRAC_CONST(0.423853654024676), FRAC_CONST(0.905730688433339) }, - { FRAC_CONST(0.417916624613831), FRAC_CONST(0.908485385062073) }, - { FRAC_CONST(0.411961693045722), FRAC_CONST(0.911201165200584) }, - { FRAC_CONST(0.405989114409798), FRAC_CONST(0.913877912513892) }, - { FRAC_CONST(0.399999144551449), FRAC_CONST(0.916515512339049) }, - { FRAC_CONST(0.393992040061048), FRAC_CONST(0.919113851690058) }, - { FRAC_CONST(0.387968058262959), FRAC_CONST(0.921672819262709) }, - { FRAC_CONST(0.381927457204511), FRAC_CONST(0.924192305439348) }, - { FRAC_CONST(0.375870495644949), FRAC_CONST(0.926672202293573) }, - { FRAC_CONST(0.369797433044349), FRAC_CONST(0.929112403594856) }, - { FRAC_CONST(0.363708529552499), FRAC_CONST(0.931512804813095) }, - { FRAC_CONST(0.357604045997758), FRAC_CONST(0.933873303123091) }, - { FRAC_CONST(0.351484243875885), FRAC_CONST(0.936193797408954) }, - { FRAC_CONST(0.345349385338836), FRAC_CONST(0.938474188268430) }, - { FRAC_CONST(0.339199733183530), FRAC_CONST(0.940714378017165) }, - { FRAC_CONST(0.333035550840599), FRAC_CONST(0.942914270692887) }, - { FRAC_CONST(0.326857102363098), FRAC_CONST(0.945073772059514) }, - { FRAC_CONST(0.320664652415198), FRAC_CONST(0.947192789611197) }, - { FRAC_CONST(0.314458466260842), FRAC_CONST(0.949271232576274) }, - { FRAC_CONST(0.308238809752391), FRAC_CONST(0.951309011921168) }, - { FRAC_CONST(0.302005949319228), FRAC_CONST(0.953306040354194) }, - { FRAC_CONST(0.295760151956351), FRAC_CONST(0.955262232329299) }, - { FRAC_CONST(0.289501685212929), FRAC_CONST(0.957177504049732) }, - { FRAC_CONST(0.283230817180850), FRAC_CONST(0.959051773471624) }, - { FRAC_CONST(0.276947816483228), FRAC_CONST(0.960884960307514) }, - { FRAC_CONST(0.270652952262902), FRAC_CONST(0.962676986029777) }, - { FRAC_CONST(0.264346494170904), FRAC_CONST(0.964427773873996) }, - { FRAC_CONST(0.258028712354909), FRAC_CONST(0.966137248842248) }, - { FRAC_CONST(0.251699877447663), FRAC_CONST(0.967805337706313) }, - { FRAC_CONST(0.245360260555389), FRAC_CONST(0.969431969010818) }, - { FRAC_CONST(0.239010133246176), FRAC_CONST(0.971017073076290) }, - { FRAC_CONST(0.232649767538342), FRAC_CONST(0.972560582002147) }, - { FRAC_CONST(0.226279435888785), FRAC_CONST(0.974062429669605) }, - { FRAC_CONST(0.219899411181310), FRAC_CONST(0.975522551744506) }, - { FRAC_CONST(0.213509966714943), FRAC_CONST(0.976940885680082) }, - { FRAC_CONST(0.207111376192219), FRAC_CONST(0.978317370719628) }, - { FRAC_CONST(0.200703913707458), FRAC_CONST(0.979651947899104) }, - { FRAC_CONST(0.194287853735029), FRAC_CONST(0.980944560049668) }, - { FRAC_CONST(0.187863471117585), FRAC_CONST(0.982195151800116) }, - { FRAC_CONST(0.181431041054297), FRAC_CONST(0.983403669579260) }, - { FRAC_CONST(0.174990839089060), FRAC_CONST(0.984570061618221) }, - { FRAC_CONST(0.168543141098691), FRAC_CONST(0.985694277952645) }, - { FRAC_CONST(0.162088223281113), FRAC_CONST(0.986776270424848) }, - { FRAC_CONST(0.155626362143520), FRAC_CONST(0.987815992685872) }, - { FRAC_CONST(0.149157834490539), FRAC_CONST(0.988813400197476) }, - { FRAC_CONST(0.142682917412363), FRAC_CONST(0.989768450234042) }, - { FRAC_CONST(0.136201888272891), FRAC_CONST(0.990681101884405) }, - { FRAC_CONST(0.129715024697841), FRAC_CONST(0.991551316053606) }, - { FRAC_CONST(0.123222604562857), FRAC_CONST(0.992379055464567) }, - { FRAC_CONST(0.116724905981611), FRAC_CONST(0.993164284659685) }, - { FRAC_CONST(0.110222207293883), FRAC_CONST(0.993906970002356) }, - { FRAC_CONST(0.103714787053643), FRAC_CONST(0.994607079678411) }, - { FRAC_CONST(0.097202924017115), FRAC_CONST(0.995264583697482) }, - { FRAC_CONST(0.090686897130838), FRAC_CONST(0.995879453894286) }, - { FRAC_CONST(0.084166985519718), FRAC_CONST(0.996451663929828) }, - { FRAC_CONST(0.077643468475068), FRAC_CONST(0.996981189292537) }, - { FRAC_CONST(0.071116625442645), FRAC_CONST(0.997468007299307) }, - { FRAC_CONST(0.064586736010684), FRAC_CONST(0.997912097096476) }, - { FRAC_CONST(0.058054079897912), FRAC_CONST(0.998313439660714) }, - { FRAC_CONST(0.051518936941578), FRAC_CONST(0.998672017799843) }, - { FRAC_CONST(0.044981587085452), FRAC_CONST(0.998987816153567) }, - { FRAC_CONST(0.038442310367847), FRAC_CONST(0.999260821194138) }, - { FRAC_CONST(0.031901386909611), FRAC_CONST(0.999491021226926) }, - { FRAC_CONST(0.025359096902136), FRAC_CONST(0.999678406390929) }, - { FRAC_CONST(0.018815720595351), FRAC_CONST(0.999822968659191) }, - { FRAC_CONST(0.012271538285720), FRAC_CONST(0.999924701839145) }, - { FRAC_CONST(0.005726830304231), FRAC_CONST(0.999983601572879) } -}; -#endif // LD_DEC - -/* 60 (N/4) complex twiddle factors */ -ALIGN static const complex_t mdct_tab_240[] = -{ - { FRAC_CONST(0.999994645401696), FRAC_CONST(0.003272486506527) }, - { FRAC_CONST(0.999566308502021), FRAC_CONST(0.029448173247963) }, - { FRAC_CONST(0.998452918783950), FRAC_CONST(0.055603677682425) }, - { FRAC_CONST(0.996655239309180), FRAC_CONST(0.081721074133668) }, - { FRAC_CONST(0.994174502117428), FRAC_CONST(0.107782463042759) }, - { FRAC_CONST(0.991012407382049), FRAC_CONST(0.133769983235535) }, - { FRAC_CONST(0.987171122244825), FRAC_CONST(0.159665824163761) }, - { FRAC_CONST(0.982653279330712), FRAC_CONST(0.185452238111591) }, - { FRAC_CONST(0.977461974943572), FRAC_CONST(0.211111552358965) }, - { FRAC_CONST(0.971600766944121), FRAC_CONST(0.236626181293610) }, - { FRAC_CONST(0.965073672311547), FRAC_CONST(0.261978638463337) }, - { FRAC_CONST(0.957885164390477), FRAC_CONST(0.287151548560387) }, - { FRAC_CONST(0.950040169825165), FRAC_CONST(0.312127659329594) }, - { FRAC_CONST(0.941544065183021), FRAC_CONST(0.336889853392220) }, - { FRAC_CONST(0.932402673269775), FRAC_CONST(0.361421159977355) }, - { FRAC_CONST(0.922622259138823), FRAC_CONST(0.385704766552831) }, - { FRAC_CONST(0.912209525797468), FRAC_CONST(0.409724030347695) }, - { FRAC_CONST(0.901171609613013), FRAC_CONST(0.433462489758331) }, - { FRAC_CONST(0.889516075421856), FRAC_CONST(0.456903875630421) }, - { FRAC_CONST(0.877250911344924), FRAC_CONST(0.480032122409011) }, - { FRAC_CONST(0.864384523313017), FRAC_CONST(0.502831379149042) }, - { FRAC_CONST(0.850925729305802), FRAC_CONST(0.525286020378792) }, - { FRAC_CONST(0.836883753308409), FRAC_CONST(0.547380656808797) }, - { FRAC_CONST(0.822268218989775), FRAC_CONST(0.569100145878898) }, - { FRAC_CONST(0.807089143107059), FRAC_CONST(0.590429602136201) }, - { FRAC_CONST(0.791356928640660), FRAC_CONST(0.611354407436816) }, - { FRAC_CONST(0.775082357664531), FRAC_CONST(0.631860220964409) }, - { FRAC_CONST(0.758276583956687), FRAC_CONST(0.651932989058674) }, - { FRAC_CONST(0.740951125354959), FRAC_CONST(0.671558954847018) }, - { FRAC_CONST(0.723117855863248), FRAC_CONST(0.690724667672829) }, - { FRAC_CONST(0.704788997513670), FRAC_CONST(0.709416992313883) }, - { FRAC_CONST(0.685977111990193), FRAC_CONST(0.727623117984575) }, - { FRAC_CONST(0.666695092019479), FRAC_CONST(0.745330567115786) }, - { FRAC_CONST(0.646956152534857), FRAC_CONST(0.762527203906388) }, - { FRAC_CONST(0.626773821619469), FRAC_CONST(0.779201242640517) }, - { FRAC_CONST(0.606161931234795), FRAC_CONST(0.795341255764910) }, - { FRAC_CONST(0.585134607740916), FRAC_CONST(0.810936181720784) }, - { FRAC_CONST(0.563706262215017), FRAC_CONST(0.825975332524873) }, - { FRAC_CONST(0.541891580574752), FRAC_CONST(0.840448401094438) }, - { FRAC_CONST(0.519705513513249), FRAC_CONST(0.854345468311227) }, - { FRAC_CONST(0.497163266252654), FRAC_CONST(0.867657009819544) }, - { FRAC_CONST(0.474280288123229), FRAC_CONST(0.880373902553765) }, - { FRAC_CONST(0.451072261975153), FRAC_CONST(0.892487430990834) }, - { FRAC_CONST(0.427555093430282), FRAC_CONST(0.903989293123443) }, - { FRAC_CONST(0.403744899981227), FRAC_CONST(0.914871606149819) }, - { FRAC_CONST(0.379657999945233), FRAC_CONST(0.925126911876195) }, - { FRAC_CONST(0.355310901280416), FRAC_CONST(0.934748181828292) }, - { FRAC_CONST(0.330720290272038), FRAC_CONST(0.943728822068278) }, - { FRAC_CONST(0.305903020096554), FRAC_CONST(0.952062677713924) }, - { FRAC_CONST(0.280876099271292), FRAC_CONST(0.959744037156857) }, - { FRAC_CONST(0.255656679997665), FRAC_CONST(0.966767635977008) }, - { FRAC_CONST(0.230262046405902), FRAC_CONST(0.973128660550580) }, - { FRAC_CONST(0.204709602709380), FRAC_CONST(0.978822751349072) }, - { FRAC_CONST(0.179016861276633), FRAC_CONST(0.983846005927077) }, - { FRAC_CONST(0.153201430629259), FRAC_CONST(0.988194981596825) }, - { FRAC_CONST(0.127281003373913), FRAC_CONST(0.991866697787626) }, - { FRAC_CONST(0.101273344076683), FRAC_CONST(0.994858638088611) }, - { FRAC_CONST(0.075196277088140), FRAC_CONST(0.997168751973348) }, - { FRAC_CONST(0.049067674327418), FRAC_CONST(0.998795456205172) }, - { FRAC_CONST(0.022905443033697), FRAC_CONST(0.999737635922260) } -}; -#endif // ALLOW_SMALL_FRAMELENGTH - -#ifdef SSR_DEC -/* 128 (N/4) complex twiddle factors */ -ALIGN static const complex_t mdct_tab_512[] = -{ - { FRAC_CONST(0.999998823451702), FRAC_CONST(0.001533980186285) }, - { FRAC_CONST(0.999904701082853), FRAC_CONST(0.013805388528060) }, - { FRAC_CONST(0.999659996743959), FRAC_CONST(0.026074717829104) }, - { FRAC_CONST(0.999264747286594), FRAC_CONST(0.038340120373553) }, - { FRAC_CONST(0.998719012233873), FRAC_CONST(0.050599749036899) }, - { FRAC_CONST(0.998022873771486), FRAC_CONST(0.062851757564161) }, - { FRAC_CONST(0.997176436735326), FRAC_CONST(0.075094300847921) }, - { FRAC_CONST(0.996179828595697), FRAC_CONST(0.087325535206192) }, - { FRAC_CONST(0.995033199438119), FRAC_CONST(0.099543618660069) }, - { FRAC_CONST(0.993736721940725), FRAC_CONST(0.111746711211127) }, - { FRAC_CONST(0.992290591348257), FRAC_CONST(0.123932975118512) }, - { FRAC_CONST(0.990695025442665), FRAC_CONST(0.136100575175706) }, - { FRAC_CONST(0.988950264510303), FRAC_CONST(0.148247678986896) }, - { FRAC_CONST(0.987056571305751), FRAC_CONST(0.160372457242928) }, - { FRAC_CONST(0.985014231012240), FRAC_CONST(0.172473083996796) }, - { FRAC_CONST(0.982823551198705), FRAC_CONST(0.184547736938620) }, - { FRAC_CONST(0.980484861773469), FRAC_CONST(0.196594597670080) }, - { FRAC_CONST(0.977998514934557), FRAC_CONST(0.208611851978263) }, - { FRAC_CONST(0.975364885116657), FRAC_CONST(0.220597690108874) }, - { FRAC_CONST(0.972584368934732), FRAC_CONST(0.232550307038775) }, - { FRAC_CONST(0.969657385124292), FRAC_CONST(0.244467902747824) }, - { FRAC_CONST(0.966584374478333), FRAC_CONST(0.256348682489943) }, - { FRAC_CONST(0.963365799780954), FRAC_CONST(0.268190857063403) }, - { FRAC_CONST(0.960002145737666), FRAC_CONST(0.279992643080273) }, - { FRAC_CONST(0.956493918902395), FRAC_CONST(0.291752263234989) }, - { FRAC_CONST(0.952841647601199), FRAC_CONST(0.303467946572011) }, - { FRAC_CONST(0.949045881852701), FRAC_CONST(0.315137928752522) }, - { FRAC_CONST(0.945107193285261), FRAC_CONST(0.326760452320132) }, - { FRAC_CONST(0.941026175050889), FRAC_CONST(0.338333766965541) }, - { FRAC_CONST(0.936803441735922), FRAC_CONST(0.349856129790135) }, - { FRAC_CONST(0.932439629268462), FRAC_CONST(0.361325805568454) }, - { FRAC_CONST(0.927935394822618), FRAC_CONST(0.372741067009516) }, - { FRAC_CONST(0.923291416719528), FRAC_CONST(0.384100195016935) }, - { FRAC_CONST(0.918508394325212), FRAC_CONST(0.395401478947816) }, - { FRAC_CONST(0.913587047945251), FRAC_CONST(0.406643216870369) }, - { FRAC_CONST(0.908528118716306), FRAC_CONST(0.417823715820212) }, - { FRAC_CONST(0.903332368494512), FRAC_CONST(0.428941292055329) }, - { FRAC_CONST(0.898000579740740), FRAC_CONST(0.439994271309633) }, - { FRAC_CONST(0.892533555402765), FRAC_CONST(0.450980989045104) }, - { FRAC_CONST(0.886932118794342), FRAC_CONST(0.461899790702463) }, - { FRAC_CONST(0.881197113471222), FRAC_CONST(0.472749031950343) }, - { FRAC_CONST(0.875329403104111), FRAC_CONST(0.483527078932919) }, - { FRAC_CONST(0.869329871348607), FRAC_CONST(0.494232308515960) }, - { FRAC_CONST(0.863199421712124), FRAC_CONST(0.504863108531268) }, - { FRAC_CONST(0.856938977417829), FRAC_CONST(0.515417878019463) }, - { FRAC_CONST(0.850549481265603), FRAC_CONST(0.525895027471085) }, - { FRAC_CONST(0.844031895490066), FRAC_CONST(0.536292979065963) }, - { FRAC_CONST(0.837387201615662), FRAC_CONST(0.546610166910835) }, - { FRAC_CONST(0.830616400308846), FRAC_CONST(0.556845037275160) }, - { FRAC_CONST(0.823720511227391), FRAC_CONST(0.566996048825109) }, - { FRAC_CONST(0.816700572866828), FRAC_CONST(0.577061672855679) }, - { FRAC_CONST(0.809557642404051), FRAC_CONST(0.587040393520918) }, - { FRAC_CONST(0.802292795538116), FRAC_CONST(0.596930708062197) }, - { FRAC_CONST(0.794907126328237), FRAC_CONST(0.606731127034524) }, - { FRAC_CONST(0.787401747029031), FRAC_CONST(0.616440174530854) }, - { FRAC_CONST(0.779777787923015), FRAC_CONST(0.626056388404344) }, - { FRAC_CONST(0.772036397150385), FRAC_CONST(0.635578320488556) }, - { FRAC_CONST(0.764178740536117), FRAC_CONST(0.645004536815544) }, - { FRAC_CONST(0.756206001414395), FRAC_CONST(0.654333617831800) }, - { FRAC_CONST(0.748119380450404), FRAC_CONST(0.663564158612040) }, - { FRAC_CONST(0.739920095459516), FRAC_CONST(0.672694769070773) }, - { FRAC_CONST(0.731609381223893), FRAC_CONST(0.681724074171650) }, - { FRAC_CONST(0.723188489306527), FRAC_CONST(0.690650714134535) }, - { FRAC_CONST(0.714658687862769), FRAC_CONST(0.699473344640284) }, - { FRAC_CONST(0.706021261449340), FRAC_CONST(0.708190637033195) }, - { FRAC_CONST(0.697277510830887), FRAC_CONST(0.716801278521100) }, - { FRAC_CONST(0.688428752784091), FRAC_CONST(0.725303972373061) }, - { FRAC_CONST(0.679476319899365), FRAC_CONST(0.733697438114660) }, - { FRAC_CONST(0.670421560380173), FRAC_CONST(0.741980411720831) }, - { FRAC_CONST(0.661265837839992), FRAC_CONST(0.750151645806215) }, - { FRAC_CONST(0.652010531096960), FRAC_CONST(0.758209909813015) }, - { FRAC_CONST(0.642657033966227), FRAC_CONST(0.766153990196313) }, - { FRAC_CONST(0.633206755050057), FRAC_CONST(0.773982690606823) }, - { FRAC_CONST(0.623661117525695), FRAC_CONST(0.781694832071059) }, - { FRAC_CONST(0.614021558931038), FRAC_CONST(0.789289253168886) }, - { FRAC_CONST(0.604289530948156), FRAC_CONST(0.796764810208419) }, - { FRAC_CONST(0.594466499184665), FRAC_CONST(0.804120377398266) }, - { FRAC_CONST(0.584553942953015), FRAC_CONST(0.811354847017064) }, - { FRAC_CONST(0.574553355047716), FRAC_CONST(0.818467129580299) }, - { FRAC_CONST(0.564466241520520), FRAC_CONST(0.825456154004377) }, - { FRAC_CONST(0.554294121453620), FRAC_CONST(0.832320867767930) }, - { FRAC_CONST(0.544038526730884), FRAC_CONST(0.839060237070313) }, - { FRAC_CONST(0.533701001807153), FRAC_CONST(0.845673246987299) }, - { FRAC_CONST(0.523283103475656), FRAC_CONST(0.852158901623920) }, - { FRAC_CONST(0.512786400633563), FRAC_CONST(0.858516224264443) }, - { FRAC_CONST(0.502212474045711), FRAC_CONST(0.864744257519462) }, - { FRAC_CONST(0.491562916106550), FRAC_CONST(0.870842063470079) }, - { FRAC_CONST(0.480839330600334), FRAC_CONST(0.876808723809146) }, - { FRAC_CONST(0.470043332459596), FRAC_CONST(0.882643339979563) }, - { FRAC_CONST(0.459176547521944), FRAC_CONST(0.888345033309596) }, - { FRAC_CONST(0.448240612285220), FRAC_CONST(0.893912945145203) }, - { FRAC_CONST(0.437237173661044), FRAC_CONST(0.899346236979341) }, - { FRAC_CONST(0.426167888726800), FRAC_CONST(0.904644090578246) }, - { FRAC_CONST(0.415034424476082), FRAC_CONST(0.909805708104652) }, - { FRAC_CONST(0.403838457567654), FRAC_CONST(0.914830312237946) }, - { FRAC_CONST(0.392581674072952), FRAC_CONST(0.919717146291227) }, - { FRAC_CONST(0.381265769222162), FRAC_CONST(0.924465474325263) }, - { FRAC_CONST(0.369892447148934), FRAC_CONST(0.929074581259316) }, - { FRAC_CONST(0.358463420633737), FRAC_CONST(0.933543772978836) }, - { FRAC_CONST(0.346980410845924), FRAC_CONST(0.937872376439990) }, - { FRAC_CONST(0.335445147084532), FRAC_CONST(0.942059739771017) }, - { FRAC_CONST(0.323859366517853), FRAC_CONST(0.946105232370403) }, - { FRAC_CONST(0.312224813921825), FRAC_CONST(0.950008245001843) }, - { FRAC_CONST(0.300543241417273), FRAC_CONST(0.953768189885990) }, - { FRAC_CONST(0.288816408206049), FRAC_CONST(0.957384500788976) }, - { FRAC_CONST(0.277046080306100), FRAC_CONST(0.960856633107680) }, - { FRAC_CONST(0.265234030285512), FRAC_CONST(0.964184063951746) }, - { FRAC_CONST(0.253382036995570), FRAC_CONST(0.967366292222329) }, - { FRAC_CONST(0.241491885302869), FRAC_CONST(0.970402838687556) }, - { FRAC_CONST(0.229565365820519), FRAC_CONST(0.973293246054698) }, - { FRAC_CONST(0.217604274638484), FRAC_CONST(0.976037079039039) }, - { FRAC_CONST(0.205610413053099), FRAC_CONST(0.978633924429423) }, - { FRAC_CONST(0.193585587295804), FRAC_CONST(0.981083391150487) }, - { FRAC_CONST(0.181531608261125), FRAC_CONST(0.983385110321551) }, - { FRAC_CONST(0.169450291233968), FRAC_CONST(0.985538735312176) }, - { FRAC_CONST(0.157343455616238), FRAC_CONST(0.987543941794359) }, - { FRAC_CONST(0.145212924652848), FRAC_CONST(0.989400427791380) }, - { FRAC_CONST(0.133060525157139), FRAC_CONST(0.991107913723277) }, - { FRAC_CONST(0.120888087235777), FRAC_CONST(0.992666142448948) }, - { FRAC_CONST(0.108697444013139), FRAC_CONST(0.994074879304879) }, - { FRAC_CONST(0.096490431355253), FRAC_CONST(0.995333912140482) }, - { FRAC_CONST(0.084268887593324), FRAC_CONST(0.996443051350043) }, - { FRAC_CONST(0.072034653246889), FRAC_CONST(0.997402129901275) }, - { FRAC_CONST(0.059789570746640), FRAC_CONST(0.998211003360478) }, - { FRAC_CONST(0.047535484156959), FRAC_CONST(0.998869549914284) }, - { FRAC_CONST(0.035274238898214), FRAC_CONST(0.999377670388003) }, - { FRAC_CONST(0.023007681468839), FRAC_CONST(0.999735288260562) }, - { FRAC_CONST(0.010737659167265), FRAC_CONST(0.999942349676024) } -}; - -/* 16 (N/4) complex twiddle factors */ -ALIGN static const complex_t mdct_tab_64[] = -{ - { FRAC_CONST(0.999924701839145), FRAC_CONST(0.012271538285720) }, - { FRAC_CONST(0.993906970002356), FRAC_CONST(0.110222207293883) }, - { FRAC_CONST(0.978317370719628), FRAC_CONST(0.207111376192219) }, - { FRAC_CONST(0.953306040354194), FRAC_CONST(0.302005949319228) }, - { FRAC_CONST(0.919113851690058), FRAC_CONST(0.393992040061048) }, - { FRAC_CONST(0.876070094195407), FRAC_CONST(0.482183772079123) }, - { FRAC_CONST(0.824589302785025), FRAC_CONST(0.565731810783613) }, - { FRAC_CONST(0.765167265622459), FRAC_CONST(0.643831542889791) }, - { FRAC_CONST(0.698376249408973), FRAC_CONST(0.715730825283819) }, - { FRAC_CONST(0.624859488142386), FRAC_CONST(0.780737228572094) }, - { FRAC_CONST(0.545324988422046), FRAC_CONST(0.838224705554838) }, - { FRAC_CONST(0.460538710958240), FRAC_CONST(0.887639620402854) }, - { FRAC_CONST(0.371317193951838), FRAC_CONST(0.928506080473215) }, - { FRAC_CONST(0.278519689385053), FRAC_CONST(0.960430519415566) }, - { FRAC_CONST(0.183039887955141), FRAC_CONST(0.983105487431216) }, - { FRAC_CONST(0.085797312344440), FRAC_CONST(0.996312612182778) } -}; -#endif // SSR_DEC - -#else // FIXED_POINT - -/* 256 (N/4) complex twiddle factors */ -ALIGN static const complex_t mdct_tab_2048[] = -{ - { FRAC_CONST(0.031249997702054), FRAC_CONST(0.000011984224612) }, - { FRAC_CONST(0.031249813866531), FRAC_CONST(0.000107857810004) }, - { FRAC_CONST(0.031249335895858), FRAC_CONST(0.000203730380198) }, - { FRAC_CONST(0.031248563794535), FRAC_CONST(0.000299601032804) }, - { FRAC_CONST(0.031247497569829), FRAC_CONST(0.000395468865451) }, - { FRAC_CONST(0.031246137231775), FRAC_CONST(0.000491332975794) }, - { FRAC_CONST(0.031244482793177), FRAC_CONST(0.000587192461525) }, - { FRAC_CONST(0.031242534269608), FRAC_CONST(0.000683046420376) }, - { FRAC_CONST(0.031240291679407), FRAC_CONST(0.000778893950134) }, - { FRAC_CONST(0.031237755043684), FRAC_CONST(0.000874734148645) }, - { FRAC_CONST(0.031234924386313), FRAC_CONST(0.000970566113826) }, - { FRAC_CONST(0.031231799733938), FRAC_CONST(0.001066388943669) }, - { FRAC_CONST(0.031228381115970), FRAC_CONST(0.001162201736253) }, - { FRAC_CONST(0.031224668564585), FRAC_CONST(0.001258003589751) }, - { FRAC_CONST(0.031220662114728), FRAC_CONST(0.001353793602441) }, - { FRAC_CONST(0.031216361804108), FRAC_CONST(0.001449570872710) }, - { FRAC_CONST(0.031211767673203), FRAC_CONST(0.001545334499065) }, - { FRAC_CONST(0.031206879765253), FRAC_CONST(0.001641083580144) }, - { FRAC_CONST(0.031201698126266), FRAC_CONST(0.001736817214719) }, - { FRAC_CONST(0.031196222805014), FRAC_CONST(0.001832534501709) }, - { FRAC_CONST(0.031190453853031), FRAC_CONST(0.001928234540186) }, - { FRAC_CONST(0.031184391324617), FRAC_CONST(0.002023916429386) }, - { FRAC_CONST(0.031178035276836), FRAC_CONST(0.002119579268713) }, - { FRAC_CONST(0.031171385769513), FRAC_CONST(0.002215222157753) }, - { FRAC_CONST(0.031164442865236), FRAC_CONST(0.002310844196278) }, - { FRAC_CONST(0.031157206629353), FRAC_CONST(0.002406444484258) }, - { FRAC_CONST(0.031149677129975), FRAC_CONST(0.002502022121865) }, - { FRAC_CONST(0.031141854437973), FRAC_CONST(0.002597576209488) }, - { FRAC_CONST(0.031133738626977), FRAC_CONST(0.002693105847734) }, - { FRAC_CONST(0.031125329773375), FRAC_CONST(0.002788610137442) }, - { FRAC_CONST(0.031116627956316), FRAC_CONST(0.002884088179689) }, - { FRAC_CONST(0.031107633257703), FRAC_CONST(0.002979539075801) }, - { FRAC_CONST(0.031098345762200), FRAC_CONST(0.003074961927355) }, - { FRAC_CONST(0.031088765557222), FRAC_CONST(0.003170355836197) }, - { FRAC_CONST(0.031078892732942), FRAC_CONST(0.003265719904442) }, - { FRAC_CONST(0.031068727382288), FRAC_CONST(0.003361053234488) }, - { FRAC_CONST(0.031058269600939), FRAC_CONST(0.003456354929021) }, - { FRAC_CONST(0.031047519487329), FRAC_CONST(0.003551624091024) }, - { FRAC_CONST(0.031036477142640), FRAC_CONST(0.003646859823790) }, - { FRAC_CONST(0.031025142670809), FRAC_CONST(0.003742061230921) }, - { FRAC_CONST(0.031013516178519), FRAC_CONST(0.003837227416347) }, - { FRAC_CONST(0.031001597775203), FRAC_CONST(0.003932357484328) }, - { FRAC_CONST(0.030989387573042), FRAC_CONST(0.004027450539462) }, - { FRAC_CONST(0.030976885686963), FRAC_CONST(0.004122505686697) }, - { FRAC_CONST(0.030964092234638), FRAC_CONST(0.004217522031340) }, - { FRAC_CONST(0.030951007336485), FRAC_CONST(0.004312498679058) }, - { FRAC_CONST(0.030937631115663), FRAC_CONST(0.004407434735897) }, - { FRAC_CONST(0.030923963698074), FRAC_CONST(0.004502329308281) }, - { FRAC_CONST(0.030910005212362), FRAC_CONST(0.004597181503027) }, - { FRAC_CONST(0.030895755789908), FRAC_CONST(0.004691990427350) }, - { FRAC_CONST(0.030881215564835), FRAC_CONST(0.004786755188872) }, - { FRAC_CONST(0.030866384674000), FRAC_CONST(0.004881474895632) }, - { FRAC_CONST(0.030851263256996), FRAC_CONST(0.004976148656090) }, - { FRAC_CONST(0.030835851456154), FRAC_CONST(0.005070775579142) }, - { FRAC_CONST(0.030820149416533), FRAC_CONST(0.005165354774124) }, - { FRAC_CONST(0.030804157285929), FRAC_CONST(0.005259885350819) }, - { FRAC_CONST(0.030787875214864), FRAC_CONST(0.005354366419469) }, - { FRAC_CONST(0.030771303356593), FRAC_CONST(0.005448797090784) }, - { FRAC_CONST(0.030754441867095), FRAC_CONST(0.005543176475946) }, - { FRAC_CONST(0.030737290905077), FRAC_CONST(0.005637503686619) }, - { FRAC_CONST(0.030719850631972), FRAC_CONST(0.005731777834961) }, - { FRAC_CONST(0.030702121211932), FRAC_CONST(0.005825998033626) }, - { FRAC_CONST(0.030684102811835), FRAC_CONST(0.005920163395780) }, - { FRAC_CONST(0.030665795601276), FRAC_CONST(0.006014273035101) }, - { FRAC_CONST(0.030647199752570), FRAC_CONST(0.006108326065793) }, - { FRAC_CONST(0.030628315440748), FRAC_CONST(0.006202321602594) }, - { FRAC_CONST(0.030609142843557), FRAC_CONST(0.006296258760782) }, - { FRAC_CONST(0.030589682141455), FRAC_CONST(0.006390136656185) }, - { FRAC_CONST(0.030569933517616), FRAC_CONST(0.006483954405188) }, - { FRAC_CONST(0.030549897157919), FRAC_CONST(0.006577711124743) }, - { FRAC_CONST(0.030529573250956), FRAC_CONST(0.006671405932375) }, - { FRAC_CONST(0.030508961988022), FRAC_CONST(0.006765037946194) }, - { FRAC_CONST(0.030488063563118), FRAC_CONST(0.006858606284900) }, - { FRAC_CONST(0.030466878172949), FRAC_CONST(0.006952110067791) }, - { FRAC_CONST(0.030445406016919), FRAC_CONST(0.007045548414774) }, - { FRAC_CONST(0.030423647297133), FRAC_CONST(0.007138920446372) }, - { FRAC_CONST(0.030401602218392), FRAC_CONST(0.007232225283733) }, - { FRAC_CONST(0.030379270988192), FRAC_CONST(0.007325462048634) }, - { FRAC_CONST(0.030356653816724), FRAC_CONST(0.007418629863497) }, - { FRAC_CONST(0.030333750916869), FRAC_CONST(0.007511727851390) }, - { FRAC_CONST(0.030310562504198), FRAC_CONST(0.007604755136040) }, - { FRAC_CONST(0.030287088796968), FRAC_CONST(0.007697710841838) }, - { FRAC_CONST(0.030263330016124), FRAC_CONST(0.007790594093851) }, - { FRAC_CONST(0.030239286385293), FRAC_CONST(0.007883404017824) }, - { FRAC_CONST(0.030214958130781), FRAC_CONST(0.007976139740197) }, - { FRAC_CONST(0.030190345481576), FRAC_CONST(0.008068800388104) }, - { FRAC_CONST(0.030165448669342), FRAC_CONST(0.008161385089390) }, - { FRAC_CONST(0.030140267928416), FRAC_CONST(0.008253892972610) }, - { FRAC_CONST(0.030114803495809), FRAC_CONST(0.008346323167047) }, - { FRAC_CONST(0.030089055611203), FRAC_CONST(0.008438674802711) }, - { FRAC_CONST(0.030063024516947), FRAC_CONST(0.008530947010354) }, - { FRAC_CONST(0.030036710458054), FRAC_CONST(0.008623138921475) }, - { FRAC_CONST(0.030010113682202), FRAC_CONST(0.008715249668328) }, - { FRAC_CONST(0.029983234439732), FRAC_CONST(0.008807278383932) }, - { FRAC_CONST(0.029956072983640), FRAC_CONST(0.008899224202078) }, - { FRAC_CONST(0.029928629569580), FRAC_CONST(0.008991086257336) }, - { FRAC_CONST(0.029900904455860), FRAC_CONST(0.009082863685067) }, - { FRAC_CONST(0.029872897903441), FRAC_CONST(0.009174555621425) }, - { FRAC_CONST(0.029844610175929), FRAC_CONST(0.009266161203371) }, - { FRAC_CONST(0.029816041539579), FRAC_CONST(0.009357679568679) }, - { FRAC_CONST(0.029787192263292), FRAC_CONST(0.009449109855944) }, - { FRAC_CONST(0.029758062618606), FRAC_CONST(0.009540451204587) }, - { FRAC_CONST(0.029728652879702), FRAC_CONST(0.009631702754871) }, - { FRAC_CONST(0.029698963323395), FRAC_CONST(0.009722863647900) }, - { FRAC_CONST(0.029668994229134), FRAC_CONST(0.009813933025633) }, - { FRAC_CONST(0.029638745879000), FRAC_CONST(0.009904910030891) }, - { FRAC_CONST(0.029608218557702), FRAC_CONST(0.009995793807363) }, - { FRAC_CONST(0.029577412552575), FRAC_CONST(0.010086583499618) }, - { FRAC_CONST(0.029546328153577), FRAC_CONST(0.010177278253107) }, - { FRAC_CONST(0.029514965653285), FRAC_CONST(0.010267877214177) }, - { FRAC_CONST(0.029483325346896), FRAC_CONST(0.010358379530076) }, - { FRAC_CONST(0.029451407532220), FRAC_CONST(0.010448784348962) }, - { FRAC_CONST(0.029419212509679), FRAC_CONST(0.010539090819911) }, - { FRAC_CONST(0.029386740582307), FRAC_CONST(0.010629298092923) }, - { FRAC_CONST(0.029353992055740), FRAC_CONST(0.010719405318933) }, - { FRAC_CONST(0.029320967238220), FRAC_CONST(0.010809411649818) }, - { FRAC_CONST(0.029287666440590), FRAC_CONST(0.010899316238403) }, - { FRAC_CONST(0.029254089976290), FRAC_CONST(0.010989118238474) }, - { FRAC_CONST(0.029220238161353), FRAC_CONST(0.011078816804778) }, - { FRAC_CONST(0.029186111314406), FRAC_CONST(0.011168411093039) }, - { FRAC_CONST(0.029151709756664), FRAC_CONST(0.011257900259961) }, - { FRAC_CONST(0.029117033811927), FRAC_CONST(0.011347283463239) }, - { FRAC_CONST(0.029082083806579), FRAC_CONST(0.011436559861563) }, - { FRAC_CONST(0.029046860069582), FRAC_CONST(0.011525728614630) }, - { FRAC_CONST(0.029011362932476), FRAC_CONST(0.011614788883150) }, - { FRAC_CONST(0.028975592729373), FRAC_CONST(0.011703739828853) }, - { FRAC_CONST(0.028939549796957), FRAC_CONST(0.011792580614500) }, - { FRAC_CONST(0.028903234474475), FRAC_CONST(0.011881310403886) }, - { FRAC_CONST(0.028866647103744), FRAC_CONST(0.011969928361855) }, - { FRAC_CONST(0.028829788029135), FRAC_CONST(0.012058433654299) }, - { FRAC_CONST(0.028792657597583), FRAC_CONST(0.012146825448172) }, - { FRAC_CONST(0.028755256158571), FRAC_CONST(0.012235102911499) }, - { FRAC_CONST(0.028717584064137), FRAC_CONST(0.012323265213377) }, - { FRAC_CONST(0.028679641668864), FRAC_CONST(0.012411311523990) }, - { FRAC_CONST(0.028641429329882), FRAC_CONST(0.012499241014612) }, - { FRAC_CONST(0.028602947406859), FRAC_CONST(0.012587052857618) }, - { FRAC_CONST(0.028564196262001), FRAC_CONST(0.012674746226488) }, - { FRAC_CONST(0.028525176260050), FRAC_CONST(0.012762320295819) }, - { FRAC_CONST(0.028485887768276), FRAC_CONST(0.012849774241331) }, - { FRAC_CONST(0.028446331156478), FRAC_CONST(0.012937107239875) }, - { FRAC_CONST(0.028406506796976), FRAC_CONST(0.013024318469437) }, - { FRAC_CONST(0.028366415064615), FRAC_CONST(0.013111407109155) }, - { FRAC_CONST(0.028326056336751), FRAC_CONST(0.013198372339315) }, - { FRAC_CONST(0.028285430993258), FRAC_CONST(0.013285213341368) }, - { FRAC_CONST(0.028244539416515), FRAC_CONST(0.013371929297933) }, - { FRAC_CONST(0.028203381991411), FRAC_CONST(0.013458519392807) }, - { FRAC_CONST(0.028161959105334), FRAC_CONST(0.013544982810971) }, - { FRAC_CONST(0.028120271148172), FRAC_CONST(0.013631318738598) }, - { FRAC_CONST(0.028078318512309), FRAC_CONST(0.013717526363062) }, - { FRAC_CONST(0.028036101592619), FRAC_CONST(0.013803604872943) }, - { FRAC_CONST(0.027993620786463), FRAC_CONST(0.013889553458039) }, - { FRAC_CONST(0.027950876493687), FRAC_CONST(0.013975371309367) }, - { FRAC_CONST(0.027907869116616), FRAC_CONST(0.014061057619178) }, - { FRAC_CONST(0.027864599060052), FRAC_CONST(0.014146611580959) }, - { FRAC_CONST(0.027821066731270), FRAC_CONST(0.014232032389445) }, - { FRAC_CONST(0.027777272540012), FRAC_CONST(0.014317319240622) }, - { FRAC_CONST(0.027733216898487), FRAC_CONST(0.014402471331737) }, - { FRAC_CONST(0.027688900221361), FRAC_CONST(0.014487487861307) }, - { FRAC_CONST(0.027644322925762), FRAC_CONST(0.014572368029123) }, - { FRAC_CONST(0.027599485431266), FRAC_CONST(0.014657111036262) }, - { FRAC_CONST(0.027554388159903), FRAC_CONST(0.014741716085090) }, - { FRAC_CONST(0.027509031536144), FRAC_CONST(0.014826182379271) }, - { FRAC_CONST(0.027463415986904), FRAC_CONST(0.014910509123778) }, - { FRAC_CONST(0.027417541941533), FRAC_CONST(0.014994695524894) }, - { FRAC_CONST(0.027371409831816), FRAC_CONST(0.015078740790225) }, - { FRAC_CONST(0.027325020091965), FRAC_CONST(0.015162644128704) }, - { FRAC_CONST(0.027278373158618), FRAC_CONST(0.015246404750603) }, - { FRAC_CONST(0.027231469470833), FRAC_CONST(0.015330021867534) }, - { FRAC_CONST(0.027184309470088), FRAC_CONST(0.015413494692460) }, - { FRAC_CONST(0.027136893600268), FRAC_CONST(0.015496822439704) }, - { FRAC_CONST(0.027089222307671), FRAC_CONST(0.015580004324954) }, - { FRAC_CONST(0.027041296040997), FRAC_CONST(0.015663039565269) }, - { FRAC_CONST(0.026993115251345), FRAC_CONST(0.015745927379091) }, - { FRAC_CONST(0.026944680392213), FRAC_CONST(0.015828666986247) }, - { FRAC_CONST(0.026895991919487), FRAC_CONST(0.015911257607961) }, - { FRAC_CONST(0.026847050291442), FRAC_CONST(0.015993698466859) }, - { FRAC_CONST(0.026797855968734), FRAC_CONST(0.016075988786976) }, - { FRAC_CONST(0.026748409414401), FRAC_CONST(0.016158127793763) }, - { FRAC_CONST(0.026698711093851), FRAC_CONST(0.016240114714099) }, - { FRAC_CONST(0.026648761474864), FRAC_CONST(0.016321948776289) }, - { FRAC_CONST(0.026598561027585), FRAC_CONST(0.016403629210082) }, - { FRAC_CONST(0.026548110224519), FRAC_CONST(0.016485155246669) }, - { FRAC_CONST(0.026497409540530), FRAC_CONST(0.016566526118696) }, - { FRAC_CONST(0.026446459452830), FRAC_CONST(0.016647741060271) }, - { FRAC_CONST(0.026395260440982), FRAC_CONST(0.016728799306966) }, - { FRAC_CONST(0.026343812986890), FRAC_CONST(0.016809700095831) }, - { FRAC_CONST(0.026292117574797), FRAC_CONST(0.016890442665397) }, - { FRAC_CONST(0.026240174691280), FRAC_CONST(0.016971026255683) }, - { FRAC_CONST(0.026187984825246), FRAC_CONST(0.017051450108208) }, - { FRAC_CONST(0.026135548467924), FRAC_CONST(0.017131713465990) }, - { FRAC_CONST(0.026082866112867), FRAC_CONST(0.017211815573560) }, - { FRAC_CONST(0.026029938255941), FRAC_CONST(0.017291755676967) }, - { FRAC_CONST(0.025976765395322), FRAC_CONST(0.017371533023784) }, - { FRAC_CONST(0.025923348031494), FRAC_CONST(0.017451146863116) }, - { FRAC_CONST(0.025869686667242), FRAC_CONST(0.017530596445607) }, - { FRAC_CONST(0.025815781807646), FRAC_CONST(0.017609881023449) }, - { FRAC_CONST(0.025761633960080), FRAC_CONST(0.017688999850383) }, - { FRAC_CONST(0.025707243634204), FRAC_CONST(0.017767952181715) }, - { FRAC_CONST(0.025652611341960), FRAC_CONST(0.017846737274313) }, - { FRAC_CONST(0.025597737597568), FRAC_CONST(0.017925354386623) }, - { FRAC_CONST(0.025542622917522), FRAC_CONST(0.018003802778671) }, - { FRAC_CONST(0.025487267820581), FRAC_CONST(0.018082081712071) }, - { FRAC_CONST(0.025431672827768), FRAC_CONST(0.018160190450031) }, - { FRAC_CONST(0.025375838462365), FRAC_CONST(0.018238128257362) }, - { FRAC_CONST(0.025319765249906), FRAC_CONST(0.018315894400484) }, - { FRAC_CONST(0.025263453718173), FRAC_CONST(0.018393488147432) }, - { FRAC_CONST(0.025206904397193), FRAC_CONST(0.018470908767865) }, - { FRAC_CONST(0.025150117819228), FRAC_CONST(0.018548155533070) }, - { FRAC_CONST(0.025093094518776), FRAC_CONST(0.018625227715971) }, - { FRAC_CONST(0.025035835032562), FRAC_CONST(0.018702124591135) }, - { FRAC_CONST(0.024978339899534), FRAC_CONST(0.018778845434780) }, - { FRAC_CONST(0.024920609660858), FRAC_CONST(0.018855389524780) }, - { FRAC_CONST(0.024862644859912), FRAC_CONST(0.018931756140672) }, - { FRAC_CONST(0.024804446042284), FRAC_CONST(0.019007944563666) }, - { FRAC_CONST(0.024746013755764), FRAC_CONST(0.019083954076646) }, - { FRAC_CONST(0.024687348550337), FRAC_CONST(0.019159783964183) }, - { FRAC_CONST(0.024628450978184), FRAC_CONST(0.019235433512536) }, - { FRAC_CONST(0.024569321593670), FRAC_CONST(0.019310902009663) }, - { FRAC_CONST(0.024509960953345), FRAC_CONST(0.019386188745225) }, - { FRAC_CONST(0.024450369615932), FRAC_CONST(0.019461293010596) }, - { FRAC_CONST(0.024390548142329), FRAC_CONST(0.019536214098866) }, - { FRAC_CONST(0.024330497095598), FRAC_CONST(0.019610951304848) }, - { FRAC_CONST(0.024270217040961), FRAC_CONST(0.019685503925087) }, - { FRAC_CONST(0.024209708545799), FRAC_CONST(0.019759871257867) }, - { FRAC_CONST(0.024148972179639), FRAC_CONST(0.019834052603212) }, - { FRAC_CONST(0.024088008514157), FRAC_CONST(0.019908047262901) }, - { FRAC_CONST(0.024026818123164), FRAC_CONST(0.019981854540467) }, - { FRAC_CONST(0.023965401582609), FRAC_CONST(0.020055473741208) }, - { FRAC_CONST(0.023903759470567), FRAC_CONST(0.020128904172192) }, - { FRAC_CONST(0.023841892367236), FRAC_CONST(0.020202145142264) }, - { FRAC_CONST(0.023779800854935), FRAC_CONST(0.020275195962052) }, - { FRAC_CONST(0.023717485518092), FRAC_CONST(0.020348055943974) }, - { FRAC_CONST(0.023654946943242), FRAC_CONST(0.020420724402244) }, - { FRAC_CONST(0.023592185719023), FRAC_CONST(0.020493200652878) }, - { FRAC_CONST(0.023529202436167), FRAC_CONST(0.020565484013703) }, - { FRAC_CONST(0.023465997687496), FRAC_CONST(0.020637573804361) }, - { FRAC_CONST(0.023402572067918), FRAC_CONST(0.020709469346314) }, - { FRAC_CONST(0.023338926174419), FRAC_CONST(0.020781169962854) }, - { FRAC_CONST(0.023275060606058), FRAC_CONST(0.020852674979108) }, - { FRAC_CONST(0.023210975963963), FRAC_CONST(0.020923983722044) }, - { FRAC_CONST(0.023146672851322), FRAC_CONST(0.020995095520475) }, - { FRAC_CONST(0.023082151873380), FRAC_CONST(0.021066009705072) }, - { FRAC_CONST(0.023017413637435), FRAC_CONST(0.021136725608363) }, - { FRAC_CONST(0.022952458752826), FRAC_CONST(0.021207242564742) }, - { FRAC_CONST(0.022887287830934), FRAC_CONST(0.021277559910478) }, - { FRAC_CONST(0.022821901485173), FRAC_CONST(0.021347676983716) }, - { FRAC_CONST(0.022756300330983), FRAC_CONST(0.021417593124488) }, - { FRAC_CONST(0.022690484985827), FRAC_CONST(0.021487307674717) }, - { FRAC_CONST(0.022624456069185), FRAC_CONST(0.021556819978223) }, - { FRAC_CONST(0.022558214202547), FRAC_CONST(0.021626129380729) }, - { FRAC_CONST(0.022491760009405), FRAC_CONST(0.021695235229869) }, - { FRAC_CONST(0.022425094115252), FRAC_CONST(0.021764136875192) }, - { FRAC_CONST(0.022358217147572), FRAC_CONST(0.021832833668171) }, - { FRAC_CONST(0.022291129735838), FRAC_CONST(0.021901324962204) }, - { FRAC_CONST(0.022223832511501), FRAC_CONST(0.021969610112625) }, - { FRAC_CONST(0.022156326107988), FRAC_CONST(0.022037688476709) }, - { FRAC_CONST(0.022088611160696), FRAC_CONST(0.022105559413676) }, - { FRAC_CONST(0.022020688306983), FRAC_CONST(0.022173222284699) }, - { FRAC_CONST(0.021952558186166), FRAC_CONST(0.022240676452909) }, - { FRAC_CONST(0.021884221439510), FRAC_CONST(0.022307921283403) }, - { FRAC_CONST(0.021815678710228), FRAC_CONST(0.022374956143245) }, - { FRAC_CONST(0.021746930643469), FRAC_CONST(0.022441780401478) }, - { FRAC_CONST(0.021677977886316), FRAC_CONST(0.022508393429127) }, - { FRAC_CONST(0.021608821087780), FRAC_CONST(0.022574794599206) }, - { FRAC_CONST(0.021539460898790), FRAC_CONST(0.022640983286719) }, - { FRAC_CONST(0.021469897972190), FRAC_CONST(0.022706958868676) }, - { FRAC_CONST(0.021400132962735), FRAC_CONST(0.022772720724087) }, - { FRAC_CONST(0.021330166527077), FRAC_CONST(0.022838268233979) }, - { FRAC_CONST(0.021259999323769), FRAC_CONST(0.022903600781391) }, - { FRAC_CONST(0.021189632013250), FRAC_CONST(0.022968717751391) }, - { FRAC_CONST(0.021119065257845), FRAC_CONST(0.023033618531071) }, - { FRAC_CONST(0.021048299721754), FRAC_CONST(0.023098302509561) }, - { FRAC_CONST(0.020977336071050), FRAC_CONST(0.023162769078031) }, - { FRAC_CONST(0.020906174973670), FRAC_CONST(0.023227017629698) }, - { FRAC_CONST(0.020834817099409), FRAC_CONST(0.023291047559828) }, - { FRAC_CONST(0.020763263119915), FRAC_CONST(0.023354858265748) }, - { FRAC_CONST(0.020691513708680), FRAC_CONST(0.023418449146848) }, - { FRAC_CONST(0.020619569541038), FRAC_CONST(0.023481819604585) }, - { FRAC_CONST(0.020547431294155), FRAC_CONST(0.023544969042494) }, - { FRAC_CONST(0.020475099647023), FRAC_CONST(0.023607896866186) }, - { FRAC_CONST(0.020402575280455), FRAC_CONST(0.023670602483363) }, - { FRAC_CONST(0.020329858877078), FRAC_CONST(0.023733085303813) }, - { FRAC_CONST(0.020256951121327), FRAC_CONST(0.023795344739427) }, - { FRAC_CONST(0.020183852699437), FRAC_CONST(0.023857380204193) }, - { FRAC_CONST(0.020110564299439), FRAC_CONST(0.023919191114211) }, - { FRAC_CONST(0.020037086611150), FRAC_CONST(0.023980776887692) }, - { FRAC_CONST(0.019963420326171), FRAC_CONST(0.024042136944968) }, - { FRAC_CONST(0.019889566137877), FRAC_CONST(0.024103270708495) }, - { FRAC_CONST(0.019815524741412), FRAC_CONST(0.024164177602859) }, - { FRAC_CONST(0.019741296833681), FRAC_CONST(0.024224857054779) }, - { FRAC_CONST(0.019666883113346), FRAC_CONST(0.024285308493120) }, - { FRAC_CONST(0.019592284280817), FRAC_CONST(0.024345531348888) }, - { FRAC_CONST(0.019517501038246), FRAC_CONST(0.024405525055242) }, - { FRAC_CONST(0.019442534089523), FRAC_CONST(0.024465289047500) }, - { FRAC_CONST(0.019367384140264), FRAC_CONST(0.024524822763141) }, - { FRAC_CONST(0.019292051897809), FRAC_CONST(0.024584125641809) }, - { FRAC_CONST(0.019216538071215), FRAC_CONST(0.024643197125323) }, - { FRAC_CONST(0.019140843371246), FRAC_CONST(0.024702036657681) }, - { FRAC_CONST(0.019064968510369), FRAC_CONST(0.024760643685063) }, - { FRAC_CONST(0.018988914202748), FRAC_CONST(0.024819017655836) }, - { FRAC_CONST(0.018912681164234), FRAC_CONST(0.024877158020562) }, - { FRAC_CONST(0.018836270112363), FRAC_CONST(0.024935064232003) }, - { FRAC_CONST(0.018759681766343), FRAC_CONST(0.024992735745123) }, - { FRAC_CONST(0.018682916847054), FRAC_CONST(0.025050172017095) }, - { FRAC_CONST(0.018605976077037), FRAC_CONST(0.025107372507308) }, - { FRAC_CONST(0.018528860180486), FRAC_CONST(0.025164336677369) }, - { FRAC_CONST(0.018451569883247), FRAC_CONST(0.025221063991110) }, - { FRAC_CONST(0.018374105912805), FRAC_CONST(0.025277553914591) }, - { FRAC_CONST(0.018296468998280), FRAC_CONST(0.025333805916107) }, - { FRAC_CONST(0.018218659870421), FRAC_CONST(0.025389819466194) }, - { FRAC_CONST(0.018140679261596), FRAC_CONST(0.025445594037630) }, - { FRAC_CONST(0.018062527905790), FRAC_CONST(0.025501129105445) }, - { FRAC_CONST(0.017984206538592), FRAC_CONST(0.025556424146920) }, - { FRAC_CONST(0.017905715897192), FRAC_CONST(0.025611478641598) }, - { FRAC_CONST(0.017827056720375), FRAC_CONST(0.025666292071285) }, - { FRAC_CONST(0.017748229748511), FRAC_CONST(0.025720863920056) }, - { FRAC_CONST(0.017669235723550), FRAC_CONST(0.025775193674260) }, - { FRAC_CONST(0.017590075389012), FRAC_CONST(0.025829280822525) }, - { FRAC_CONST(0.017510749489986), FRAC_CONST(0.025883124855762) }, - { FRAC_CONST(0.017431258773116), FRAC_CONST(0.025936725267170) }, - { FRAC_CONST(0.017351603986600), FRAC_CONST(0.025990081552242) }, - { FRAC_CONST(0.017271785880180), FRAC_CONST(0.026043193208768) }, - { FRAC_CONST(0.017191805205132), FRAC_CONST(0.026096059736841) }, - { FRAC_CONST(0.017111662714267), FRAC_CONST(0.026148680638861) }, - { FRAC_CONST(0.017031359161915), FRAC_CONST(0.026201055419541) }, - { FRAC_CONST(0.016950895303924), FRAC_CONST(0.026253183585908) }, - { FRAC_CONST(0.016870271897651), FRAC_CONST(0.026305064647313) }, - { FRAC_CONST(0.016789489701954), FRAC_CONST(0.026356698115431) }, - { FRAC_CONST(0.016708549477186), FRAC_CONST(0.026408083504269) }, - { FRAC_CONST(0.016627451985187), FRAC_CONST(0.026459220330167) }, - { FRAC_CONST(0.016546197989277), FRAC_CONST(0.026510108111806) }, - { FRAC_CONST(0.016464788254250), FRAC_CONST(0.026560746370212) }, - { FRAC_CONST(0.016383223546365), FRAC_CONST(0.026611134628757) }, - { FRAC_CONST(0.016301504633341), FRAC_CONST(0.026661272413168) }, - { FRAC_CONST(0.016219632284346), FRAC_CONST(0.026711159251530) }, - { FRAC_CONST(0.016137607269996), FRAC_CONST(0.026760794674288) }, - { FRAC_CONST(0.016055430362340), FRAC_CONST(0.026810178214254) }, - { FRAC_CONST(0.015973102334858), FRAC_CONST(0.026859309406613) }, - { FRAC_CONST(0.015890623962454), FRAC_CONST(0.026908187788922) }, - { FRAC_CONST(0.015807996021446), FRAC_CONST(0.026956812901119) }, - { FRAC_CONST(0.015725219289558), FRAC_CONST(0.027005184285527) }, - { FRAC_CONST(0.015642294545918), FRAC_CONST(0.027053301486856) }, - { FRAC_CONST(0.015559222571044), FRAC_CONST(0.027101164052208) }, - { FRAC_CONST(0.015476004146842), FRAC_CONST(0.027148771531083) }, - { FRAC_CONST(0.015392640056594), FRAC_CONST(0.027196123475380) }, - { FRAC_CONST(0.015309131084956), FRAC_CONST(0.027243219439406) }, - { FRAC_CONST(0.015225478017946), FRAC_CONST(0.027290058979875) }, - { FRAC_CONST(0.015141681642938), FRAC_CONST(0.027336641655915) }, - { FRAC_CONST(0.015057742748656), FRAC_CONST(0.027382967029073) }, - { FRAC_CONST(0.014973662125164), FRAC_CONST(0.027429034663317) }, - { FRAC_CONST(0.014889440563862), FRAC_CONST(0.027474844125040) }, - { FRAC_CONST(0.014805078857474), FRAC_CONST(0.027520394983066) }, - { FRAC_CONST(0.014720577800046), FRAC_CONST(0.027565686808654) }, - { FRAC_CONST(0.014635938186934), FRAC_CONST(0.027610719175499) }, - { FRAC_CONST(0.014551160814797), FRAC_CONST(0.027655491659740) }, - { FRAC_CONST(0.014466246481592), FRAC_CONST(0.027700003839960) }, - { FRAC_CONST(0.014381195986567), FRAC_CONST(0.027744255297195) }, - { FRAC_CONST(0.014296010130247), FRAC_CONST(0.027788245614933) }, - { FRAC_CONST(0.014210689714436), FRAC_CONST(0.027831974379120) }, - { FRAC_CONST(0.014125235542201), FRAC_CONST(0.027875441178165) }, - { FRAC_CONST(0.014039648417870), FRAC_CONST(0.027918645602941) }, - { FRAC_CONST(0.013953929147020), FRAC_CONST(0.027961587246792) }, - { FRAC_CONST(0.013868078536476), FRAC_CONST(0.028004265705534) }, - { FRAC_CONST(0.013782097394294), FRAC_CONST(0.028046680577462) }, - { FRAC_CONST(0.013695986529763), FRAC_CONST(0.028088831463351) }, - { FRAC_CONST(0.013609746753390), FRAC_CONST(0.028130717966461) }, - { FRAC_CONST(0.013523378876898), FRAC_CONST(0.028172339692540) }, - { FRAC_CONST(0.013436883713214), FRAC_CONST(0.028213696249828) }, - { FRAC_CONST(0.013350262076462), FRAC_CONST(0.028254787249062) }, - { FRAC_CONST(0.013263514781960), FRAC_CONST(0.028295612303478) }, - { FRAC_CONST(0.013176642646205), FRAC_CONST(0.028336171028814) }, - { FRAC_CONST(0.013089646486871), FRAC_CONST(0.028376463043317) }, - { FRAC_CONST(0.013002527122799), FRAC_CONST(0.028416487967743) }, - { FRAC_CONST(0.012915285373990), FRAC_CONST(0.028456245425361) }, - { FRAC_CONST(0.012827922061597), FRAC_CONST(0.028495735041960) }, - { FRAC_CONST(0.012740438007915), FRAC_CONST(0.028534956445849) }, - { FRAC_CONST(0.012652834036379), FRAC_CONST(0.028573909267859) }, - { FRAC_CONST(0.012565110971550), FRAC_CONST(0.028612593141354) }, - { FRAC_CONST(0.012477269639111), FRAC_CONST(0.028651007702224) }, - { FRAC_CONST(0.012389310865858), FRAC_CONST(0.028689152588899) }, - { FRAC_CONST(0.012301235479693), FRAC_CONST(0.028727027442343) }, - { FRAC_CONST(0.012213044309615), FRAC_CONST(0.028764631906065) }, - { FRAC_CONST(0.012124738185712), FRAC_CONST(0.028801965626115) }, - { FRAC_CONST(0.012036317939156), FRAC_CONST(0.028839028251097) }, - { FRAC_CONST(0.011947784402191), FRAC_CONST(0.028875819432161) }, - { FRAC_CONST(0.011859138408130), FRAC_CONST(0.028912338823015) }, - { FRAC_CONST(0.011770380791341), FRAC_CONST(0.028948586079925) }, - { FRAC_CONST(0.011681512387245), FRAC_CONST(0.028984560861718) }, - { FRAC_CONST(0.011592534032306), FRAC_CONST(0.029020262829785) }, - { FRAC_CONST(0.011503446564022), FRAC_CONST(0.029055691648087) }, - { FRAC_CONST(0.011414250820918), FRAC_CONST(0.029090846983152) }, - { FRAC_CONST(0.011324947642537), FRAC_CONST(0.029125728504087) }, - { FRAC_CONST(0.011235537869437), FRAC_CONST(0.029160335882573) }, - { FRAC_CONST(0.011146022343175), FRAC_CONST(0.029194668792871) }, - { FRAC_CONST(0.011056401906305), FRAC_CONST(0.029228726911828) }, - { FRAC_CONST(0.010966677402371), FRAC_CONST(0.029262509918876) }, - { FRAC_CONST(0.010876849675891), FRAC_CONST(0.029296017496036) }, - { FRAC_CONST(0.010786919572361), FRAC_CONST(0.029329249327922) }, - { FRAC_CONST(0.010696887938235), FRAC_CONST(0.029362205101743) }, - { FRAC_CONST(0.010606755620926), FRAC_CONST(0.029394884507308) }, - { FRAC_CONST(0.010516523468793), FRAC_CONST(0.029427287237024) }, - { FRAC_CONST(0.010426192331137), FRAC_CONST(0.029459412985906) }, - { FRAC_CONST(0.010335763058187), FRAC_CONST(0.029491261451573) }, - { FRAC_CONST(0.010245236501099), FRAC_CONST(0.029522832334255) }, - { FRAC_CONST(0.010154613511943), FRAC_CONST(0.029554125336796) }, - { FRAC_CONST(0.010063894943698), FRAC_CONST(0.029585140164654) }, - { FRAC_CONST(0.009973081650240), FRAC_CONST(0.029615876525905) }, - { FRAC_CONST(0.009882174486340), FRAC_CONST(0.029646334131247) }, - { FRAC_CONST(0.009791174307650), FRAC_CONST(0.029676512694001) }, - { FRAC_CONST(0.009700081970699), FRAC_CONST(0.029706411930116) }, - { FRAC_CONST(0.009608898332881), FRAC_CONST(0.029736031558168) }, - { FRAC_CONST(0.009517624252453), FRAC_CONST(0.029765371299366) }, - { FRAC_CONST(0.009426260588521), FRAC_CONST(0.029794430877553) }, - { FRAC_CONST(0.009334808201034), FRAC_CONST(0.029823210019210) }, - { FRAC_CONST(0.009243267950778), FRAC_CONST(0.029851708453456) }, - { FRAC_CONST(0.009151640699363), FRAC_CONST(0.029879925912053) }, - { FRAC_CONST(0.009059927309220), FRAC_CONST(0.029907862129408) }, - { FRAC_CONST(0.008968128643591), FRAC_CONST(0.029935516842573) }, - { FRAC_CONST(0.008876245566520), FRAC_CONST(0.029962889791254) }, - { FRAC_CONST(0.008784278942845), FRAC_CONST(0.029989980717805) }, - { FRAC_CONST(0.008692229638191), FRAC_CONST(0.030016789367235) }, - { FRAC_CONST(0.008600098518961), FRAC_CONST(0.030043315487212) }, - { FRAC_CONST(0.008507886452329), FRAC_CONST(0.030069558828062) }, - { FRAC_CONST(0.008415594306230), FRAC_CONST(0.030095519142772) }, - { FRAC_CONST(0.008323222949351), FRAC_CONST(0.030121196186994) }, - { FRAC_CONST(0.008230773251129), FRAC_CONST(0.030146589719046) }, - { FRAC_CONST(0.008138246081733), FRAC_CONST(0.030171699499915) }, - { FRAC_CONST(0.008045642312067), FRAC_CONST(0.030196525293257) }, - { FRAC_CONST(0.007952962813750), FRAC_CONST(0.030221066865402) }, - { FRAC_CONST(0.007860208459119), FRAC_CONST(0.030245323985357) }, - { FRAC_CONST(0.007767380121212), FRAC_CONST(0.030269296424803) }, - { FRAC_CONST(0.007674478673766), FRAC_CONST(0.030292983958103) }, - { FRAC_CONST(0.007581504991203), FRAC_CONST(0.030316386362302) }, - { FRAC_CONST(0.007488459948628), FRAC_CONST(0.030339503417126) }, - { FRAC_CONST(0.007395344421816), FRAC_CONST(0.030362334904989) }, - { FRAC_CONST(0.007302159287206), FRAC_CONST(0.030384880610993) }, - { FRAC_CONST(0.007208905421891), FRAC_CONST(0.030407140322928) }, - { FRAC_CONST(0.007115583703613), FRAC_CONST(0.030429113831278) }, - { FRAC_CONST(0.007022195010752), FRAC_CONST(0.030450800929220) }, - { FRAC_CONST(0.006928740222316), FRAC_CONST(0.030472201412626) }, - { FRAC_CONST(0.006835220217939), FRAC_CONST(0.030493315080068) }, - { FRAC_CONST(0.006741635877866), FRAC_CONST(0.030514141732814) }, - { FRAC_CONST(0.006647988082948), FRAC_CONST(0.030534681174838) }, - { FRAC_CONST(0.006554277714635), FRAC_CONST(0.030554933212813) }, - { FRAC_CONST(0.006460505654964), FRAC_CONST(0.030574897656119) }, - { FRAC_CONST(0.006366672786553), FRAC_CONST(0.030594574316845) }, - { FRAC_CONST(0.006272779992593), FRAC_CONST(0.030613963009786) }, - { FRAC_CONST(0.006178828156839), FRAC_CONST(0.030633063552447) }, - { FRAC_CONST(0.006084818163601), FRAC_CONST(0.030651875765048) }, - { FRAC_CONST(0.005990750897737), FRAC_CONST(0.030670399470520) }, - { FRAC_CONST(0.005896627244644), FRAC_CONST(0.030688634494512) }, - { FRAC_CONST(0.005802448090250), FRAC_CONST(0.030706580665388) }, - { FRAC_CONST(0.005708214321004), FRAC_CONST(0.030724237814232) }, - { FRAC_CONST(0.005613926823871), FRAC_CONST(0.030741605774849) }, - { FRAC_CONST(0.005519586486321), FRAC_CONST(0.030758684383764) }, - { FRAC_CONST(0.005425194196321), FRAC_CONST(0.030775473480228) }, - { FRAC_CONST(0.005330750842327), FRAC_CONST(0.030791972906214) }, - { FRAC_CONST(0.005236257313276), FRAC_CONST(0.030808182506425) }, - { FRAC_CONST(0.005141714498576), FRAC_CONST(0.030824102128288) }, - { FRAC_CONST(0.005047123288102), FRAC_CONST(0.030839731621963) }, - { FRAC_CONST(0.004952484572181), FRAC_CONST(0.030855070840339) }, - { FRAC_CONST(0.004857799241589), FRAC_CONST(0.030870119639036) }, - { FRAC_CONST(0.004763068187541), FRAC_CONST(0.030884877876411) }, - { FRAC_CONST(0.004668292301681), FRAC_CONST(0.030899345413553) }, - { FRAC_CONST(0.004573472476075), FRAC_CONST(0.030913522114288) }, - { FRAC_CONST(0.004478609603205), FRAC_CONST(0.030927407845180) }, - { FRAC_CONST(0.004383704575956), FRAC_CONST(0.030941002475530) }, - { FRAC_CONST(0.004288758287610), FRAC_CONST(0.030954305877381) }, - { FRAC_CONST(0.004193771631837), FRAC_CONST(0.030967317925516) }, - { FRAC_CONST(0.004098745502689), FRAC_CONST(0.030980038497461) }, - { FRAC_CONST(0.004003680794587), FRAC_CONST(0.030992467473486) }, - { FRAC_CONST(0.003908578402316), FRAC_CONST(0.031004604736602) }, - { FRAC_CONST(0.003813439221017), FRAC_CONST(0.031016450172571) }, - { FRAC_CONST(0.003718264146176), FRAC_CONST(0.031028003669899) }, - { FRAC_CONST(0.003623054073616), FRAC_CONST(0.031039265119839) }, - { FRAC_CONST(0.003527809899492), FRAC_CONST(0.031050234416394) }, - { FRAC_CONST(0.003432532520278), FRAC_CONST(0.031060911456318) }, - { FRAC_CONST(0.003337222832760), FRAC_CONST(0.031071296139114) }, - { FRAC_CONST(0.003241881734029), FRAC_CONST(0.031081388367037) }, - { FRAC_CONST(0.003146510121474), FRAC_CONST(0.031091188045095) }, - { FRAC_CONST(0.003051108892766), FRAC_CONST(0.031100695081051) }, - { FRAC_CONST(0.002955678945860), FRAC_CONST(0.031109909385419) }, - { FRAC_CONST(0.002860221178978), FRAC_CONST(0.031118830871473) }, - { FRAC_CONST(0.002764736490604), FRAC_CONST(0.031127459455239) }, - { FRAC_CONST(0.002669225779478), FRAC_CONST(0.031135795055501) }, - { FRAC_CONST(0.002573689944583), FRAC_CONST(0.031143837593803) }, - { FRAC_CONST(0.002478129885137), FRAC_CONST(0.031151586994444) }, - { FRAC_CONST(0.002382546500589), FRAC_CONST(0.031159043184484) }, - { FRAC_CONST(0.002286940690606), FRAC_CONST(0.031166206093743) }, - { FRAC_CONST(0.002191313355067), FRAC_CONST(0.031173075654800) }, - { FRAC_CONST(0.002095665394051), FRAC_CONST(0.031179651802998) }, - { FRAC_CONST(0.001999997707835), FRAC_CONST(0.031185934476438) }, - { FRAC_CONST(0.001904311196878), FRAC_CONST(0.031191923615985) }, - { FRAC_CONST(0.001808606761820), FRAC_CONST(0.031197619165268) }, - { FRAC_CONST(0.001712885303465), FRAC_CONST(0.031203021070678) }, - { FRAC_CONST(0.001617147722782), FRAC_CONST(0.031208129281370) }, - { FRAC_CONST(0.001521394920889), FRAC_CONST(0.031212943749264) }, - { FRAC_CONST(0.001425627799047), FRAC_CONST(0.031217464429043) }, - { FRAC_CONST(0.001329847258653), FRAC_CONST(0.031221691278159) }, - { FRAC_CONST(0.001234054201231), FRAC_CONST(0.031225624256825) }, - { FRAC_CONST(0.001138249528420), FRAC_CONST(0.031229263328024) }, - { FRAC_CONST(0.001042434141971), FRAC_CONST(0.031232608457502) }, - { FRAC_CONST(0.000946608943736), FRAC_CONST(0.031235659613775) }, - { FRAC_CONST(0.000850774835656), FRAC_CONST(0.031238416768124) }, - { FRAC_CONST(0.000754932719759), FRAC_CONST(0.031240879894597) }, - { FRAC_CONST(0.000659083498149), FRAC_CONST(0.031243048970010) }, - { FRAC_CONST(0.000563228072993), FRAC_CONST(0.031244923973948) }, - { FRAC_CONST(0.000467367346520), FRAC_CONST(0.031246504888762) }, - { FRAC_CONST(0.000371502221008), FRAC_CONST(0.031247791699571) }, - { FRAC_CONST(0.000275633598775), FRAC_CONST(0.031248784394264) }, - { FRAC_CONST(0.000179762382174), FRAC_CONST(0.031249482963498) }, - { FRAC_CONST(0.000083889473581), FRAC_CONST(0.031249887400697) } -}; - -/* 64 (N/4) complex twiddle factors */ -ALIGN static const complex_t mdct_tab_256[] = -{ - { FRAC_CONST(0.088387931675923), FRAC_CONST(0.000271171628935) }, - { FRAC_CONST(0.088354655998507), FRAC_CONST(0.002440238387037) }, - { FRAC_CONST(0.088268158780110), FRAC_CONST(0.004607835236780) }, - { FRAC_CONST(0.088128492123423), FRAC_CONST(0.006772656498875) }, - { FRAC_CONST(0.087935740158418), FRAC_CONST(0.008933398165942) }, - { FRAC_CONST(0.087690018991670), FRAC_CONST(0.011088758687994) }, - { FRAC_CONST(0.087391476636423), FRAC_CONST(0.013237439756448) }, - { FRAC_CONST(0.087040292923427), FRAC_CONST(0.015378147086172) }, - { FRAC_CONST(0.086636679392621), FRAC_CONST(0.017509591195118) }, - { FRAC_CONST(0.086180879165703), FRAC_CONST(0.019630488181053) }, - { FRAC_CONST(0.085673166799686), FRAC_CONST(0.021739560494940) }, - { FRAC_CONST(0.085113848121515), FRAC_CONST(0.023835537710479) }, - { FRAC_CONST(0.084503260043847), FRAC_CONST(0.025917157289369) }, - { FRAC_CONST(0.083841770362110), FRAC_CONST(0.027983165341813) }, - { FRAC_CONST(0.083129777532952), FRAC_CONST(0.030032317381813) }, - { FRAC_CONST(0.082367710434230), FRAC_CONST(0.032063379076803) }, - { FRAC_CONST(0.081556028106671), FRAC_CONST(0.034075126991164) }, - { FRAC_CONST(0.080695219477356), FRAC_CONST(0.036066349323177) }, - { FRAC_CONST(0.079785803065216), FRAC_CONST(0.038035846634965) }, - { FRAC_CONST(0.078828326668693), FRAC_CONST(0.039982432574992) }, - { FRAC_CONST(0.077823367035766), FRAC_CONST(0.041904934592675) }, - { FRAC_CONST(0.076771529516540), FRAC_CONST(0.043802194644686) }, - { FRAC_CONST(0.075673447698606), FRAC_CONST(0.045673069892513) }, - { FRAC_CONST(0.074529783025390), FRAC_CONST(0.047516433390863) }, - { FRAC_CONST(0.073341224397728), FRAC_CONST(0.049331174766491) }, - { FRAC_CONST(0.072108487758894), FRAC_CONST(0.051116200887052) }, - { FRAC_CONST(0.070832315663343), FRAC_CONST(0.052870436519557) }, - { FRAC_CONST(0.069513476829429), FRAC_CONST(0.054592824978055) }, - { FRAC_CONST(0.068152765676348), FRAC_CONST(0.056282328760143) }, - { FRAC_CONST(0.066751001845620), FRAC_CONST(0.057937930171918) }, - { FRAC_CONST(0.065309029707361), FRAC_CONST(0.059558631940996) }, - { FRAC_CONST(0.063827717851668), FRAC_CONST(0.061143457817234) }, - { FRAC_CONST(0.062307958565413), FRAC_CONST(0.062691453160784) }, - { FRAC_CONST(0.060750667294763), FRAC_CONST(0.064201685517134) }, - { FRAC_CONST(0.059156782093749), FRAC_CONST(0.065673245178784) }, - { FRAC_CONST(0.057527263059216), FRAC_CONST(0.067105245733220) }, - { FRAC_CONST(0.055863091752499), FRAC_CONST(0.068496824596852) }, - { FRAC_CONST(0.054165270608165), FRAC_CONST(0.069847143534609) }, - { FRAC_CONST(0.052434822330188), FRAC_CONST(0.071155389164853) }, - { FRAC_CONST(0.050672789275903), FRAC_CONST(0.072420773449336) }, - { FRAC_CONST(0.048880232828135), FRAC_CONST(0.073642534167879) }, - { FRAC_CONST(0.047058232755862), FRAC_CONST(0.074819935377512) }, - { FRAC_CONST(0.045207886563797), FRAC_CONST(0.075952267855771) }, - { FRAC_CONST(0.043330308831298), FRAC_CONST(0.077038849527912) }, - { FRAC_CONST(0.041426630540984), FRAC_CONST(0.078079025877766) }, - { FRAC_CONST(0.039497998397473), FRAC_CONST(0.079072170341994) }, - { FRAC_CONST(0.037545574136653), FRAC_CONST(0.080017684687506) }, - { FRAC_CONST(0.035570533825892), FRAC_CONST(0.080914999371817) }, - { FRAC_CONST(0.033574067155622), FRAC_CONST(0.081763573886112) }, - { FRAC_CONST(0.031557376722714), FRAC_CONST(0.082562897080836) }, - { FRAC_CONST(0.029521677306074), FRAC_CONST(0.083312487473584) }, - { FRAC_CONST(0.027468195134911), FRAC_CONST(0.084011893539132) }, - { FRAC_CONST(0.025398167150101), FRAC_CONST(0.084660693981419) }, - { FRAC_CONST(0.023312840259098), FRAC_CONST(0.085258497987320) }, - { FRAC_CONST(0.021213470584847), FRAC_CONST(0.085804945462053) }, - { FRAC_CONST(0.019101322709138), FRAC_CONST(0.086299707246093) }, - { FRAC_CONST(0.016977668910873), FRAC_CONST(0.086742485313442) }, - { FRAC_CONST(0.014843788399692), FRAC_CONST(0.087133012951149) }, - { FRAC_CONST(0.012700966545425), FRAC_CONST(0.087471054919968) }, - { FRAC_CONST(0.010550494103830), FRAC_CONST(0.087756407596056) }, - { FRAC_CONST(0.008393666439096), FRAC_CONST(0.087988899093631) }, - { FRAC_CONST(0.006231782743558), FRAC_CONST(0.088168389368510) }, - { FRAC_CONST(0.004066145255116), FRAC_CONST(0.088294770302461) }, - { FRAC_CONST(0.001898058472816), FRAC_CONST(0.088367965768336) } -}; - -#ifdef LD_DEC -/* 128 (N/4) complex twiddle factors */ -ALIGN static const complex_t mdct_tab_1024[] = -{ - { FRAC_CONST(0.044194160825012), FRAC_CONST(0.000033896503468) }, - { FRAC_CONST(0.044193120897389), FRAC_CONST(0.000305066138364) }, - { FRAC_CONST(0.044190417123742), FRAC_CONST(0.000576224287693) }, - { FRAC_CONST(0.044186049605866), FRAC_CONST(0.000847360742503) }, - { FRAC_CONST(0.044180018508197), FRAC_CONST(0.001118465294660) }, - { FRAC_CONST(0.044172324057802), FRAC_CONST(0.001389527737231) }, - { FRAC_CONST(0.044162966544372), FRAC_CONST(0.001660537864867) }, - { FRAC_CONST(0.044151946320213), FRAC_CONST(0.001931485474192) }, - { FRAC_CONST(0.044139263800230), FRAC_CONST(0.002202360364180) }, - { FRAC_CONST(0.044124919461912), FRAC_CONST(0.002473152336546) }, - { FRAC_CONST(0.044108913845316), FRAC_CONST(0.002743851196123) }, - { FRAC_CONST(0.044091247553044), FRAC_CONST(0.003014446751254) }, - { FRAC_CONST(0.044071921250223), FRAC_CONST(0.003284928814169) }, - { FRAC_CONST(0.044050935664476), FRAC_CONST(0.003555287201370) }, - { FRAC_CONST(0.044028291585898), FRAC_CONST(0.003825511734018) }, - { FRAC_CONST(0.044003989867028), FRAC_CONST(0.004095592238311) }, - { FRAC_CONST(0.043978031422810), FRAC_CONST(0.004365518545871) }, - { FRAC_CONST(0.043950417230565), FRAC_CONST(0.004635280494126) }, - { FRAC_CONST(0.043921148329953), FRAC_CONST(0.004904867926689) }, - { FRAC_CONST(0.043890225822930), FRAC_CONST(0.005174270693748) }, - { FRAC_CONST(0.043857650873712), FRAC_CONST(0.005443478652439) }, - { FRAC_CONST(0.043823424708727), FRAC_CONST(0.005712481667236) }, - { FRAC_CONST(0.043787548616571), FRAC_CONST(0.005981269610326) }, - { FRAC_CONST(0.043750023947958), FRAC_CONST(0.006249832361997) }, - { FRAC_CONST(0.043710852115672), FRAC_CONST(0.006518159811011) }, - { FRAC_CONST(0.043670034594508), FRAC_CONST(0.006786241854993) }, - { FRAC_CONST(0.043627572921225), FRAC_CONST(0.007054068400804) }, - { FRAC_CONST(0.043583468694479), FRAC_CONST(0.007321629364927) }, - { FRAC_CONST(0.043537723574771), FRAC_CONST(0.007588914673843) }, - { FRAC_CONST(0.043490339284377), FRAC_CONST(0.007855914264410) }, - { FRAC_CONST(0.043441317607290), FRAC_CONST(0.008122618084246) }, - { FRAC_CONST(0.043390660389149), FRAC_CONST(0.008389016092101) }, - { FRAC_CONST(0.043338369537168), FRAC_CONST(0.008655098258243) }, - { FRAC_CONST(0.043284447020070), FRAC_CONST(0.008920854564826) }, - { FRAC_CONST(0.043228894868005), FRAC_CONST(0.009186275006278) }, - { FRAC_CONST(0.043171715172482), FRAC_CONST(0.009451349589667) }, - { FRAC_CONST(0.043112910086283), FRAC_CONST(0.009716068335087) }, - { FRAC_CONST(0.043052481823387), FRAC_CONST(0.009980421276025) }, - { FRAC_CONST(0.042990432658884), FRAC_CONST(0.010244398459743) }, - { FRAC_CONST(0.042926764928889), FRAC_CONST(0.010507989947649) }, - { FRAC_CONST(0.042861481030457), FRAC_CONST(0.010771185815673) }, - { FRAC_CONST(0.042794583421490), FRAC_CONST(0.011033976154639) }, - { FRAC_CONST(0.042726074620644), FRAC_CONST(0.011296351070639) }, - { FRAC_CONST(0.042655957207238), FRAC_CONST(0.011558300685406) }, - { FRAC_CONST(0.042584233821153), FRAC_CONST(0.011819815136685) }, - { FRAC_CONST(0.042510907162732), FRAC_CONST(0.012080884578604) }, - { FRAC_CONST(0.042435979992684), FRAC_CONST(0.012341499182048) }, - { FRAC_CONST(0.042359455131975), FRAC_CONST(0.012601649135022) }, - { FRAC_CONST(0.042281335461721), FRAC_CONST(0.012861324643029) }, - { FRAC_CONST(0.042201623923085), FRAC_CONST(0.013120515929433) }, - { FRAC_CONST(0.042120323517160), FRAC_CONST(0.013379213235827) }, - { FRAC_CONST(0.042037437304862), FRAC_CONST(0.013637406822406) }, - { FRAC_CONST(0.041952968406809), FRAC_CONST(0.013895086968325) }, - { FRAC_CONST(0.041866920003207), FRAC_CONST(0.014152243972073) }, - { FRAC_CONST(0.041779295333730), FRAC_CONST(0.014408868151835) }, - { FRAC_CONST(0.041690097697398), FRAC_CONST(0.014664949845855) }, - { FRAC_CONST(0.041599330452450), FRAC_CONST(0.014920479412801) }, - { FRAC_CONST(0.041506997016224), FRAC_CONST(0.015175447232131) }, - { FRAC_CONST(0.041413100865019), FRAC_CONST(0.015429843704450) }, - { FRAC_CONST(0.041317645533974), FRAC_CONST(0.015683659251874) }, - { FRAC_CONST(0.041220634616927), FRAC_CONST(0.015936884318392) }, - { FRAC_CONST(0.041122071766285), FRAC_CONST(0.016189509370223) }, - { FRAC_CONST(0.041021960692883), FRAC_CONST(0.016441524896177) }, - { FRAC_CONST(0.040920305165846), FRAC_CONST(0.016692921408010) }, - { FRAC_CONST(0.040817109012449), FRAC_CONST(0.016943689440788) }, - { FRAC_CONST(0.040712376117967), FRAC_CONST(0.017193819553235) }, - { FRAC_CONST(0.040606110425535), FRAC_CONST(0.017443302328094) }, - { FRAC_CONST(0.040498315935996), FRAC_CONST(0.017692128372479) }, - { FRAC_CONST(0.040388996707752), FRAC_CONST(0.017940288318230) }, - { FRAC_CONST(0.040278156856609), FRAC_CONST(0.018187772822267) }, - { FRAC_CONST(0.040165800555627), FRAC_CONST(0.018434572566936) }, - { FRAC_CONST(0.040051932034955), FRAC_CONST(0.018680678260367) }, - { FRAC_CONST(0.039936555581679), FRAC_CONST(0.018926080636820) }, - { FRAC_CONST(0.039819675539659), FRAC_CONST(0.019170770457035) }, - { FRAC_CONST(0.039701296309360), FRAC_CONST(0.019414738508577) }, - { FRAC_CONST(0.039581422347694), FRAC_CONST(0.019657975606187) }, - { FRAC_CONST(0.039460058167849), FRAC_CONST(0.019900472592126) }, - { FRAC_CONST(0.039337208339116), FRAC_CONST(0.020142220336521) }, - { FRAC_CONST(0.039212877486723), FRAC_CONST(0.020383209737704) }, - { FRAC_CONST(0.039087070291656), FRAC_CONST(0.020623431722561) }, - { FRAC_CONST(0.038959791490485), FRAC_CONST(0.020862877246870) }, - { FRAC_CONST(0.038831045875184), FRAC_CONST(0.021101537295642) }, - { FRAC_CONST(0.038700838292953), FRAC_CONST(0.021339402883462) }, - { FRAC_CONST(0.038569173646034), FRAC_CONST(0.021576465054824) }, - { FRAC_CONST(0.038436056891527), FRAC_CONST(0.021812714884472) }, - { FRAC_CONST(0.038301493041202), FRAC_CONST(0.022048143477734) }, - { FRAC_CONST(0.038165487161312), FRAC_CONST(0.022282741970855) }, - { FRAC_CONST(0.038028044372402), FRAC_CONST(0.022516501531335) }, - { FRAC_CONST(0.037889169849115), FRAC_CONST(0.022749413358259) }, - { FRAC_CONST(0.037748868819998), FRAC_CONST(0.022981468682628) }, - { FRAC_CONST(0.037607146567305), FRAC_CONST(0.023212658767690) }, - { FRAC_CONST(0.037464008426800), FRAC_CONST(0.023442974909269) }, - { FRAC_CONST(0.037319459787553), FRAC_CONST(0.023672408436094) }, - { FRAC_CONST(0.037173506091737), FRAC_CONST(0.023900950710120) }, - { FRAC_CONST(0.037026152834428), FRAC_CONST(0.024128593126861) }, - { FRAC_CONST(0.036877405563392), FRAC_CONST(0.024355327115708) }, - { FRAC_CONST(0.036727269878879), FRAC_CONST(0.024581144140255) }, - { FRAC_CONST(0.036575751433414), FRAC_CONST(0.024806035698618) }, - { FRAC_CONST(0.036422855931580), FRAC_CONST(0.025029993323758) }, - { FRAC_CONST(0.036268589129807), FRAC_CONST(0.025253008583796) }, - { FRAC_CONST(0.036112956836151), FRAC_CONST(0.025475073082334) }, - { FRAC_CONST(0.035955964910083), FRAC_CONST(0.025696178458769) }, - { FRAC_CONST(0.035797619262257), FRAC_CONST(0.025916316388609) }, - { FRAC_CONST(0.035637925854300), FRAC_CONST(0.026135478583784) }, - { FRAC_CONST(0.035476890698576), FRAC_CONST(0.026353656792963) }, - { FRAC_CONST(0.035314519857970), FRAC_CONST(0.026570842801858) }, - { FRAC_CONST(0.035150819445650), FRAC_CONST(0.026787028433540) }, - { FRAC_CONST(0.034985795624846), FRAC_CONST(0.027002205548742) }, - { FRAC_CONST(0.034819454608610), FRAC_CONST(0.027216366046166) }, - { FRAC_CONST(0.034651802659589), FRAC_CONST(0.027429501862792) }, - { FRAC_CONST(0.034482846089783), FRAC_CONST(0.027641604974175) }, - { FRAC_CONST(0.034312591260311), FRAC_CONST(0.027852667394755) }, - { FRAC_CONST(0.034141044581172), FRAC_CONST(0.028062681178149) }, - { FRAC_CONST(0.033968212511001), FRAC_CONST(0.028271638417458) }, - { FRAC_CONST(0.033794101556828), FRAC_CONST(0.028479531245560) }, - { FRAC_CONST(0.033618718273831), FRAC_CONST(0.028686351835407) }, - { FRAC_CONST(0.033442069265093), FRAC_CONST(0.028892092400321) }, - { FRAC_CONST(0.033264161181349), FRAC_CONST(0.029096745194286) }, - { FRAC_CONST(0.033085000720737), FRAC_CONST(0.029300302512241) }, - { FRAC_CONST(0.032904594628548), FRAC_CONST(0.029502756690366) }, - { FRAC_CONST(0.032722949696969), FRAC_CONST(0.029704100106376) }, - { FRAC_CONST(0.032540072764829), FRAC_CONST(0.029904325179807) }, - { FRAC_CONST(0.032355970717341), FRAC_CONST(0.030103424372297) }, - { FRAC_CONST(0.032170650485843), FRAC_CONST(0.030301390187873) }, - { FRAC_CONST(0.031984119047537), FRAC_CONST(0.030498215173235) }, - { FRAC_CONST(0.031796383425227), FRAC_CONST(0.030693891918034) }, - { FRAC_CONST(0.031607450687052), FRAC_CONST(0.030888413055150) }, - { FRAC_CONST(0.031417327946223), FRAC_CONST(0.031081771260973) }, - { FRAC_CONST(0.031226022360754), FRAC_CONST(0.031273959255676) }, - { FRAC_CONST(0.031033541133193), FRAC_CONST(0.031464969803488) }, - { FRAC_CONST(0.030839891510348), FRAC_CONST(0.031654795712972) }, - { FRAC_CONST(0.030645080783018), FRAC_CONST(0.031843429837288) }, - { FRAC_CONST(0.030449116285718), FRAC_CONST(0.032030865074469) }, - { FRAC_CONST(0.030252005396399), FRAC_CONST(0.032217094367684) }, - { FRAC_CONST(0.030053755536176), FRAC_CONST(0.032402110705505) }, - { FRAC_CONST(0.029854374169043), FRAC_CONST(0.032585907122172) }, - { FRAC_CONST(0.029653868801596), FRAC_CONST(0.032768476697853) }, - { FRAC_CONST(0.029452246982750), FRAC_CONST(0.032949812558907) }, - { FRAC_CONST(0.029249516303451), FRAC_CONST(0.033129907878142) }, - { FRAC_CONST(0.029045684396395), FRAC_CONST(0.033308755875070) }, - { FRAC_CONST(0.028840758935738), FRAC_CONST(0.033486349816166) }, - { FRAC_CONST(0.028634747636808), FRAC_CONST(0.033662683015118) }, - { FRAC_CONST(0.028427658255815), FRAC_CONST(0.033837748833080) }, - { FRAC_CONST(0.028219498589555), FRAC_CONST(0.034011540678924) }, - { FRAC_CONST(0.028010276475123), FRAC_CONST(0.034184052009485) }, - { FRAC_CONST(0.027799999789613), FRAC_CONST(0.034355276329809) }, - { FRAC_CONST(0.027588676449824), FRAC_CONST(0.034525207193396) }, - { FRAC_CONST(0.027376314411959), FRAC_CONST(0.034693838202447) }, - { FRAC_CONST(0.027162921671330), FRAC_CONST(0.034861163008098) }, - { FRAC_CONST(0.026948506262053), FRAC_CONST(0.035027175310665) }, - { FRAC_CONST(0.026733076256746), FRAC_CONST(0.035191868859880) }, - { FRAC_CONST(0.026516639766228), FRAC_CONST(0.035355237455122) }, - { FRAC_CONST(0.026299204939210), FRAC_CONST(0.035517274945657) }, - { FRAC_CONST(0.026080779961991), FRAC_CONST(0.035677975230865) }, - { FRAC_CONST(0.025861373058146), FRAC_CONST(0.035837332260471) }, - { FRAC_CONST(0.025640992488223), FRAC_CONST(0.035995340034772) }, - { FRAC_CONST(0.025419646549425), FRAC_CONST(0.036151992604866) }, - { FRAC_CONST(0.025197343575302), FRAC_CONST(0.036307284072871) }, - { FRAC_CONST(0.024974091935435), FRAC_CONST(0.036461208592152) }, - { FRAC_CONST(0.024749900035122), FRAC_CONST(0.036613760367538) }, - { FRAC_CONST(0.024524776315061), FRAC_CONST(0.036764933655540) }, - { FRAC_CONST(0.024298729251033), FRAC_CONST(0.036914722764569) }, - { FRAC_CONST(0.024071767353583), FRAC_CONST(0.037063122055150) }, - { FRAC_CONST(0.023843899167697), FRAC_CONST(0.037210125940135) }, - { FRAC_CONST(0.023615133272485), FRAC_CONST(0.037355728884908) }, - { FRAC_CONST(0.023385478280852), FRAC_CONST(0.037499925407603) }, - { FRAC_CONST(0.023154942839179), FRAC_CONST(0.037642710079302) }, - { FRAC_CONST(0.022923535626995), FRAC_CONST(0.037784077524241) }, - { FRAC_CONST(0.022691265356652), FRAC_CONST(0.037924022420018) }, - { FRAC_CONST(0.022458140772993), FRAC_CONST(0.038062539497785) }, - { FRAC_CONST(0.022224170653027), FRAC_CONST(0.038199623542453) }, - { FRAC_CONST(0.021989363805598), FRAC_CONST(0.038335269392885) }, - { FRAC_CONST(0.021753729071049), FRAC_CONST(0.038469471942092) }, - { FRAC_CONST(0.021517275320897), FRAC_CONST(0.038602226137423) }, - { FRAC_CONST(0.021280011457490), FRAC_CONST(0.038733526980758) }, - { FRAC_CONST(0.021041946413679), FRAC_CONST(0.038863369528695) }, - { FRAC_CONST(0.020803089152479), FRAC_CONST(0.038991748892734) }, - { FRAC_CONST(0.020563448666730), FRAC_CONST(0.039118660239466) }, - { FRAC_CONST(0.020323033978761), FRAC_CONST(0.039244098790750) }, - { FRAC_CONST(0.020081854140050), FRAC_CONST(0.039368059823895) }, - { FRAC_CONST(0.019839918230880), FRAC_CONST(0.039490538671839) }, - { FRAC_CONST(0.019597235360003), FRAC_CONST(0.039611530723322) }, - { FRAC_CONST(0.019353814664291), FRAC_CONST(0.039731031423061) }, - { FRAC_CONST(0.019109665308395), FRAC_CONST(0.039849036271924) }, - { FRAC_CONST(0.018864796484402), FRAC_CONST(0.039965540827094) }, - { FRAC_CONST(0.018619217411483), FRAC_CONST(0.040080540702240) }, - { FRAC_CONST(0.018372937335552), FRAC_CONST(0.040194031567683) }, - { FRAC_CONST(0.018125965528915), FRAC_CONST(0.040306009150554) }, - { FRAC_CONST(0.017878311289921), FRAC_CONST(0.040416469234963) }, - { FRAC_CONST(0.017629983942612), FRAC_CONST(0.040525407662148) }, - { FRAC_CONST(0.017380992836371), FRAC_CONST(0.040632820330639) }, - { FRAC_CONST(0.017131347345575), FRAC_CONST(0.040738703196411) }, - { FRAC_CONST(0.016881056869233), FRAC_CONST(0.040843052273033) }, - { FRAC_CONST(0.016630130830641), FRAC_CONST(0.040945863631822) }, - { FRAC_CONST(0.016378578677023), FRAC_CONST(0.041047133401988) }, - { FRAC_CONST(0.016126409879175), FRAC_CONST(0.041146857770781) }, - { FRAC_CONST(0.015873633931110), FRAC_CONST(0.041245032983635) }, - { FRAC_CONST(0.015620260349699), FRAC_CONST(0.041341655344309) }, - { FRAC_CONST(0.015366298674314), FRAC_CONST(0.041436721215026) }, - { FRAC_CONST(0.015111758466470), FRAC_CONST(0.041530227016609) }, - { FRAC_CONST(0.014856649309460), FRAC_CONST(0.041622169228618) }, - { FRAC_CONST(0.014600980808001), FRAC_CONST(0.041712544389481) }, - { FRAC_CONST(0.014344762587867), FRAC_CONST(0.041801349096623) }, - { FRAC_CONST(0.014088004295529), FRAC_CONST(0.041888580006598) }, - { FRAC_CONST(0.013830715597792), FRAC_CONST(0.041974233835211) }, - { FRAC_CONST(0.013572906181430), FRAC_CONST(0.042058307357645) }, - { FRAC_CONST(0.013314585752822), FRAC_CONST(0.042140797408577) }, - { FRAC_CONST(0.013055764037585), FRAC_CONST(0.042221700882306) }, - { FRAC_CONST(0.012796450780212), FRAC_CONST(0.042301014732860) }, - { FRAC_CONST(0.012536655743699), FRAC_CONST(0.042378735974118) }, - { FRAC_CONST(0.012276388709183), FRAC_CONST(0.042454861679919) }, - { FRAC_CONST(0.012015659475571), FRAC_CONST(0.042529388984173) }, - { FRAC_CONST(0.011754477859172), FRAC_CONST(0.042602315080970) }, - { FRAC_CONST(0.011492853693324), FRAC_CONST(0.042673637224683) }, - { FRAC_CONST(0.011230796828031), FRAC_CONST(0.042743352730074) }, - { FRAC_CONST(0.010968317129584), FRAC_CONST(0.042811458972393) }, - { FRAC_CONST(0.010705424480197), FRAC_CONST(0.042877953387479) }, - { FRAC_CONST(0.010442128777629), FRAC_CONST(0.042942833471854) }, - { FRAC_CONST(0.010178439934815), FRAC_CONST(0.043006096782821) }, - { FRAC_CONST(0.009914367879490), FRAC_CONST(0.043067740938551) }, - { FRAC_CONST(0.009649922553818), FRAC_CONST(0.043127763618177) }, - { FRAC_CONST(0.009385113914016), FRAC_CONST(0.043186162561878) }, - { FRAC_CONST(0.009119951929979), FRAC_CONST(0.043242935570968) }, - { FRAC_CONST(0.008854446584907), FRAC_CONST(0.043298080507974) }, - { FRAC_CONST(0.008588607874926), FRAC_CONST(0.043351595296722) }, - { FRAC_CONST(0.008322445808712), FRAC_CONST(0.043403477922409) }, - { FRAC_CONST(0.008055970407118), FRAC_CONST(0.043453726431684) }, - { FRAC_CONST(0.007789191702791), FRAC_CONST(0.043502338932719) }, - { FRAC_CONST(0.007522119739798), FRAC_CONST(0.043549313595281) }, - { FRAC_CONST(0.007254764573250), FRAC_CONST(0.043594648650800) }, - { FRAC_CONST(0.006987136268915), FRAC_CONST(0.043638342392438) }, - { FRAC_CONST(0.006719244902849), FRAC_CONST(0.043680393175148) }, - { FRAC_CONST(0.006451100561010), FRAC_CONST(0.043720799415744) }, - { FRAC_CONST(0.006182713338881), FRAC_CONST(0.043759559592953) }, - { FRAC_CONST(0.005914093341090), FRAC_CONST(0.043796672247476) }, - { FRAC_CONST(0.005645250681027), FRAC_CONST(0.043832135982044) }, - { FRAC_CONST(0.005376195480466), FRAC_CONST(0.043865949461465) }, - { FRAC_CONST(0.005106937869184), FRAC_CONST(0.043898111412683) }, - { FRAC_CONST(0.004837487984578), FRAC_CONST(0.043928620624817) }, - { FRAC_CONST(0.004567855971284), FRAC_CONST(0.043957475949213) }, - { FRAC_CONST(0.004298051980793), FRAC_CONST(0.043984676299484) }, - { FRAC_CONST(0.004028086171076), FRAC_CONST(0.044010220651553) }, - { FRAC_CONST(0.003757968706190), FRAC_CONST(0.044034108043689) }, - { FRAC_CONST(0.003487709755907), FRAC_CONST(0.044056337576546) }, - { FRAC_CONST(0.003217319495322), FRAC_CONST(0.044076908413193) }, - { FRAC_CONST(0.002946808104477), FRAC_CONST(0.044095819779151) }, - { FRAC_CONST(0.002676185767973), FRAC_CONST(0.044113070962418) }, - { FRAC_CONST(0.002405462674586), FRAC_CONST(0.044128661313495) }, - { FRAC_CONST(0.002134649016890), FRAC_CONST(0.044142590245416) }, - { FRAC_CONST(0.001863754990865), FRAC_CONST(0.044154857233763) }, - { FRAC_CONST(0.001592790795518), FRAC_CONST(0.044165461816692) }, - { FRAC_CONST(0.001321766632497), FRAC_CONST(0.044174403594946) }, - { FRAC_CONST(0.001050692705710), FRAC_CONST(0.044181682231873) }, - { FRAC_CONST(0.000779579220936), FRAC_CONST(0.044187297453434) }, - { FRAC_CONST(0.000508436385446), FRAC_CONST(0.044191249048222) }, - { FRAC_CONST(0.000237274407613), FRAC_CONST(0.044193536867459) } -}; -#endif // LD_DEC - -#ifdef ALLOW_SMALL_FRAMELENGTH -/* 480 (N/4) complex twiddle factors */ -ALIGN static const complex_t mdct_tab_1920[] = -{ - { FRAC_CONST(0.032274858518097), FRAC_CONST(0.000013202404176) }, - { FRAC_CONST(0.032274642494505), FRAC_CONST(0.000118821372483) }, - { FRAC_CONST(0.032274080835421), FRAC_CONST(0.000224439068308) }, - { FRAC_CONST(0.032273173546860), FRAC_CONST(0.000330054360572) }, - { FRAC_CONST(0.032271920638538), FRAC_CONST(0.000435666118218) }, - { FRAC_CONST(0.032270322123873), FRAC_CONST(0.000541273210231) }, - { FRAC_CONST(0.032268378019984), FRAC_CONST(0.000646874505642) }, - { FRAC_CONST(0.032266088347691), FRAC_CONST(0.000752468873546) }, - { FRAC_CONST(0.032263453131514), FRAC_CONST(0.000858055183114) }, - { FRAC_CONST(0.032260472399674), FRAC_CONST(0.000963632303600) }, - { FRAC_CONST(0.032257146184092), FRAC_CONST(0.001069199104358) }, - { FRAC_CONST(0.032253474520390), FRAC_CONST(0.001174754454853) }, - { FRAC_CONST(0.032249457447888), FRAC_CONST(0.001280297224671) }, - { FRAC_CONST(0.032245095009606), FRAC_CONST(0.001385826283535) }, - { FRAC_CONST(0.032240387252262), FRAC_CONST(0.001491340501313) }, - { FRAC_CONST(0.032235334226272), FRAC_CONST(0.001596838748031) }, - { FRAC_CONST(0.032229935985750), FRAC_CONST(0.001702319893890) }, - { FRAC_CONST(0.032224192588507), FRAC_CONST(0.001807782809271) }, - { FRAC_CONST(0.032218104096050), FRAC_CONST(0.001913226364749) }, - { FRAC_CONST(0.032211670573582), FRAC_CONST(0.002018649431111) }, - { FRAC_CONST(0.032204892090000), FRAC_CONST(0.002124050879359) }, - { FRAC_CONST(0.032197768717898), FRAC_CONST(0.002229429580728) }, - { FRAC_CONST(0.032190300533560), FRAC_CONST(0.002334784406698) }, - { FRAC_CONST(0.032182487616965), FRAC_CONST(0.002440114229003) }, - { FRAC_CONST(0.032174330051782), FRAC_CONST(0.002545417919644) }, - { FRAC_CONST(0.032165827925374), FRAC_CONST(0.002650694350905) }, - { FRAC_CONST(0.032156981328790), FRAC_CONST(0.002755942395358) }, - { FRAC_CONST(0.032147790356771), FRAC_CONST(0.002861160925883) }, - { FRAC_CONST(0.032138255107744), FRAC_CONST(0.002966348815672) }, - { FRAC_CONST(0.032128375683825), FRAC_CONST(0.003071504938250) }, - { FRAC_CONST(0.032118152190814), FRAC_CONST(0.003176628167476) }, - { FRAC_CONST(0.032107584738196), FRAC_CONST(0.003281717377568) }, - { FRAC_CONST(0.032096673439141), FRAC_CONST(0.003386771443102) }, - { FRAC_CONST(0.032085418410500), FRAC_CONST(0.003491789239036) }, - { FRAC_CONST(0.032073819772804), FRAC_CONST(0.003596769640711) }, - { FRAC_CONST(0.032061877650267), FRAC_CONST(0.003701711523874) }, - { FRAC_CONST(0.032049592170778), FRAC_CONST(0.003806613764680) }, - { FRAC_CONST(0.032036963465906), FRAC_CONST(0.003911475239711) }, - { FRAC_CONST(0.032023991670893), FRAC_CONST(0.004016294825985) }, - { FRAC_CONST(0.032010676924657), FRAC_CONST(0.004121071400967) }, - { FRAC_CONST(0.031997019369789), FRAC_CONST(0.004225803842586) }, - { FRAC_CONST(0.031983019152549), FRAC_CONST(0.004330491029241) }, - { FRAC_CONST(0.031968676422869), FRAC_CONST(0.004435131839816) }, - { FRAC_CONST(0.031953991334348), FRAC_CONST(0.004539725153692) }, - { FRAC_CONST(0.031938964044252), FRAC_CONST(0.004644269850758) }, - { FRAC_CONST(0.031923594713510), FRAC_CONST(0.004748764811426) }, - { FRAC_CONST(0.031907883506716), FRAC_CONST(0.004853208916638) }, - { FRAC_CONST(0.031891830592124), FRAC_CONST(0.004957601047881) }, - { FRAC_CONST(0.031875436141648), FRAC_CONST(0.005061940087200) }, - { FRAC_CONST(0.031858700330859), FRAC_CONST(0.005166224917208) }, - { FRAC_CONST(0.031841623338985), FRAC_CONST(0.005270454421097) }, - { FRAC_CONST(0.031824205348907), FRAC_CONST(0.005374627482653) }, - { FRAC_CONST(0.031806446547156), FRAC_CONST(0.005478742986267) }, - { FRAC_CONST(0.031788347123916), FRAC_CONST(0.005582799816945) }, - { FRAC_CONST(0.031769907273017), FRAC_CONST(0.005686796860323) }, - { FRAC_CONST(0.031751127191935), FRAC_CONST(0.005790733002674) }, - { FRAC_CONST(0.031732007081789), FRAC_CONST(0.005894607130928) }, - { FRAC_CONST(0.031712547147340), FRAC_CONST(0.005998418132675) }, - { FRAC_CONST(0.031692747596989), FRAC_CONST(0.006102164896182) }, - { FRAC_CONST(0.031672608642773), FRAC_CONST(0.006205846310406) }, - { FRAC_CONST(0.031652130500364), FRAC_CONST(0.006309461265002) }, - { FRAC_CONST(0.031631313389067), FRAC_CONST(0.006413008650337) }, - { FRAC_CONST(0.031610157531816), FRAC_CONST(0.006516487357501) }, - { FRAC_CONST(0.031588663155172), FRAC_CONST(0.006619896278321) }, - { FRAC_CONST(0.031566830489325), FRAC_CONST(0.006723234305370) }, - { FRAC_CONST(0.031544659768083), FRAC_CONST(0.006826500331981) }, - { FRAC_CONST(0.031522151228878), FRAC_CONST(0.006929693252258) }, - { FRAC_CONST(0.031499305112758), FRAC_CONST(0.007032811961088) }, - { FRAC_CONST(0.031476121664387), FRAC_CONST(0.007135855354151) }, - { FRAC_CONST(0.031452601132040), FRAC_CONST(0.007238822327937) }, - { FRAC_CONST(0.031428743767604), FRAC_CONST(0.007341711779751) }, - { FRAC_CONST(0.031404549826572), FRAC_CONST(0.007444522607730) }, - { FRAC_CONST(0.031380019568042), FRAC_CONST(0.007547253710853) }, - { FRAC_CONST(0.031355153254712), FRAC_CONST(0.007649903988952) }, - { FRAC_CONST(0.031329951152882), FRAC_CONST(0.007752472342725) }, - { FRAC_CONST(0.031304413532445), FRAC_CONST(0.007854957673748) }, - { FRAC_CONST(0.031278540666888), FRAC_CONST(0.007957358884484) }, - { FRAC_CONST(0.031252332833290), FRAC_CONST(0.008059674878300) }, - { FRAC_CONST(0.031225790312316), FRAC_CONST(0.008161904559473) }, - { FRAC_CONST(0.031198913388214), FRAC_CONST(0.008264046833205) }, - { FRAC_CONST(0.031171702348814), FRAC_CONST(0.008366100605636) }, - { FRAC_CONST(0.031144157485525), FRAC_CONST(0.008468064783849) }, - { FRAC_CONST(0.031116279093331), FRAC_CONST(0.008569938275893) }, - { FRAC_CONST(0.031088067470786), FRAC_CONST(0.008671719990782) }, - { FRAC_CONST(0.031059522920014), FRAC_CONST(0.008773408838517) }, - { FRAC_CONST(0.031030645746705), FRAC_CONST(0.008875003730092) }, - { FRAC_CONST(0.031001436260110), FRAC_CONST(0.008976503577507) }, - { FRAC_CONST(0.030971894773039), FRAC_CONST(0.009077907293780) }, - { FRAC_CONST(0.030942021601857), FRAC_CONST(0.009179213792959) }, - { FRAC_CONST(0.030911817066483), FRAC_CONST(0.009280421990133) }, - { FRAC_CONST(0.030881281490382), FRAC_CONST(0.009381530801444) }, - { FRAC_CONST(0.030850415200566), FRAC_CONST(0.009482539144097) }, - { FRAC_CONST(0.030819218527589), FRAC_CONST(0.009583445936373) }, - { FRAC_CONST(0.030787691805541), FRAC_CONST(0.009684250097643) }, - { FRAC_CONST(0.030755835372048), FRAC_CONST(0.009784950548375) }, - { FRAC_CONST(0.030723649568268), FRAC_CONST(0.009885546210147) }, - { FRAC_CONST(0.030691134738883), FRAC_CONST(0.009986036005661) }, - { FRAC_CONST(0.030658291232103), FRAC_CONST(0.010086418858753) }, - { FRAC_CONST(0.030625119399655), FRAC_CONST(0.010186693694402) }, - { FRAC_CONST(0.030591619596781), FRAC_CONST(0.010286859438745) }, - { FRAC_CONST(0.030557792182239), FRAC_CONST(0.010386915019088) }, - { FRAC_CONST(0.030523637518292), FRAC_CONST(0.010486859363916) }, - { FRAC_CONST(0.030489155970710), FRAC_CONST(0.010586691402906) }, - { FRAC_CONST(0.030454347908763), FRAC_CONST(0.010686410066936) }, - { FRAC_CONST(0.030419213705216), FRAC_CONST(0.010786014288099) }, - { FRAC_CONST(0.030383753736329), FRAC_CONST(0.010885502999714) }, - { FRAC_CONST(0.030347968381849), FRAC_CONST(0.010984875136338) }, - { FRAC_CONST(0.030311858025010), FRAC_CONST(0.011084129633775) }, - { FRAC_CONST(0.030275423052523), FRAC_CONST(0.011183265429088) }, - { FRAC_CONST(0.030238663854579), FRAC_CONST(0.011282281460612) }, - { FRAC_CONST(0.030201580824838), FRAC_CONST(0.011381176667967) }, - { FRAC_CONST(0.030164174360430), FRAC_CONST(0.011479949992062) }, - { FRAC_CONST(0.030126444861948), FRAC_CONST(0.011578600375117) }, - { FRAC_CONST(0.030088392733446), FRAC_CONST(0.011677126760663) }, - { FRAC_CONST(0.030050018382430), FRAC_CONST(0.011775528093563) }, - { FRAC_CONST(0.030011322219859), FRAC_CONST(0.011873803320018) }, - { FRAC_CONST(0.029972304660138), FRAC_CONST(0.011971951387578) }, - { FRAC_CONST(0.029932966121114), FRAC_CONST(0.012069971245157) }, - { FRAC_CONST(0.029893307024070), FRAC_CONST(0.012167861843041) }, - { FRAC_CONST(0.029853327793724), FRAC_CONST(0.012265622132901) }, - { FRAC_CONST(0.029813028858222), FRAC_CONST(0.012363251067801) }, - { FRAC_CONST(0.029772410649132), FRAC_CONST(0.012460747602215) }, - { FRAC_CONST(0.029731473601443), FRAC_CONST(0.012558110692033) }, - { FRAC_CONST(0.029690218153558), FRAC_CONST(0.012655339294575) }, - { FRAC_CONST(0.029648644747289), FRAC_CONST(0.012752432368600) }, - { FRAC_CONST(0.029606753827855), FRAC_CONST(0.012849388874320) }, - { FRAC_CONST(0.029564545843872), FRAC_CONST(0.012946207773407) }, - { FRAC_CONST(0.029522021247356), FRAC_CONST(0.013042888029011) }, - { FRAC_CONST(0.029479180493710), FRAC_CONST(0.013139428605762) }, - { FRAC_CONST(0.029436024041725), FRAC_CONST(0.013235828469789) }, - { FRAC_CONST(0.029392552353570), FRAC_CONST(0.013332086588727) }, - { FRAC_CONST(0.029348765894794), FRAC_CONST(0.013428201931728) }, - { FRAC_CONST(0.029304665134313), FRAC_CONST(0.013524173469475) }, - { FRAC_CONST(0.029260250544412), FRAC_CONST(0.013620000174189) }, - { FRAC_CONST(0.029215522600735), FRAC_CONST(0.013715681019643) }, - { FRAC_CONST(0.029170481782283), FRAC_CONST(0.013811214981173) }, - { FRAC_CONST(0.029125128571406), FRAC_CONST(0.013906601035686) }, - { FRAC_CONST(0.029079463453801), FRAC_CONST(0.014001838161674) }, - { FRAC_CONST(0.029033486918505), FRAC_CONST(0.014096925339225) }, - { FRAC_CONST(0.028987199457889), FRAC_CONST(0.014191861550031) }, - { FRAC_CONST(0.028940601567655), FRAC_CONST(0.014286645777401) }, - { FRAC_CONST(0.028893693746829), FRAC_CONST(0.014381277006273) }, - { FRAC_CONST(0.028846476497755), FRAC_CONST(0.014475754223221) }, - { FRAC_CONST(0.028798950326094), FRAC_CONST(0.014570076416472) }, - { FRAC_CONST(0.028751115740811), FRAC_CONST(0.014664242575910) }, - { FRAC_CONST(0.028702973254178), FRAC_CONST(0.014758251693091) }, - { FRAC_CONST(0.028654523381760), FRAC_CONST(0.014852102761253) }, - { FRAC_CONST(0.028605766642418), FRAC_CONST(0.014945794775326) }, - { FRAC_CONST(0.028556703558297), FRAC_CONST(0.015039326731945) }, - { FRAC_CONST(0.028507334654823), FRAC_CONST(0.015132697629457) }, - { FRAC_CONST(0.028457660460698), FRAC_CONST(0.015225906467935) }, - { FRAC_CONST(0.028407681507891), FRAC_CONST(0.015318952249187) }, - { FRAC_CONST(0.028357398331639), FRAC_CONST(0.015411833976768) }, - { FRAC_CONST(0.028306811470432), FRAC_CONST(0.015504550655988) }, - { FRAC_CONST(0.028255921466016), FRAC_CONST(0.015597101293927) }, - { FRAC_CONST(0.028204728863381), FRAC_CONST(0.015689484899442) }, - { FRAC_CONST(0.028153234210760), FRAC_CONST(0.015781700483179) }, - { FRAC_CONST(0.028101438059619), FRAC_CONST(0.015873747057582) }, - { FRAC_CONST(0.028049340964652), FRAC_CONST(0.015965623636907) }, - { FRAC_CONST(0.027996943483779), FRAC_CONST(0.016057329237229) }, - { FRAC_CONST(0.027944246178133), FRAC_CONST(0.016148862876456) }, - { FRAC_CONST(0.027891249612061), FRAC_CONST(0.016240223574335) }, - { FRAC_CONST(0.027837954353113), FRAC_CONST(0.016331410352467) }, - { FRAC_CONST(0.027784360972039), FRAC_CONST(0.016422422234315) }, - { FRAC_CONST(0.027730470042780), FRAC_CONST(0.016513258245214) }, - { FRAC_CONST(0.027676282142466), FRAC_CONST(0.016603917412384) }, - { FRAC_CONST(0.027621797851405), FRAC_CONST(0.016694398764938) }, - { FRAC_CONST(0.027567017753080), FRAC_CONST(0.016784701333894) }, - { FRAC_CONST(0.027511942434143), FRAC_CONST(0.016874824152183) }, - { FRAC_CONST(0.027456572484404), FRAC_CONST(0.016964766254662) }, - { FRAC_CONST(0.027400908496833), FRAC_CONST(0.017054526678124) }, - { FRAC_CONST(0.027344951067546), FRAC_CONST(0.017144104461307) }, - { FRAC_CONST(0.027288700795801), FRAC_CONST(0.017233498644904) }, - { FRAC_CONST(0.027232158283994), FRAC_CONST(0.017322708271577) }, - { FRAC_CONST(0.027175324137651), FRAC_CONST(0.017411732385960) }, - { FRAC_CONST(0.027118198965418), FRAC_CONST(0.017500570034678) }, - { FRAC_CONST(0.027060783379060), FRAC_CONST(0.017589220266351) }, - { FRAC_CONST(0.027003077993454), FRAC_CONST(0.017677682131607) }, - { FRAC_CONST(0.026945083426576), FRAC_CONST(0.017765954683088) }, - { FRAC_CONST(0.026886800299502), FRAC_CONST(0.017854036975468) }, - { FRAC_CONST(0.026828229236397), FRAC_CONST(0.017941928065456) }, - { FRAC_CONST(0.026769370864511), FRAC_CONST(0.018029627011808) }, - { FRAC_CONST(0.026710225814170), FRAC_CONST(0.018117132875340) }, - { FRAC_CONST(0.026650794718768), FRAC_CONST(0.018204444718934) }, - { FRAC_CONST(0.026591078214767), FRAC_CONST(0.018291561607551) }, - { FRAC_CONST(0.026531076941680), FRAC_CONST(0.018378482608238) }, - { FRAC_CONST(0.026470791542075), FRAC_CONST(0.018465206790142) }, - { FRAC_CONST(0.026410222661558), FRAC_CONST(0.018551733224515) }, - { FRAC_CONST(0.026349370948775), FRAC_CONST(0.018638060984730) }, - { FRAC_CONST(0.026288237055398), FRAC_CONST(0.018724189146286) }, - { FRAC_CONST(0.026226821636121), FRAC_CONST(0.018810116786819) }, - { FRAC_CONST(0.026165125348656), FRAC_CONST(0.018895842986112) }, - { FRAC_CONST(0.026103148853718), FRAC_CONST(0.018981366826109) }, - { FRAC_CONST(0.026040892815028), FRAC_CONST(0.019066687390916) }, - { FRAC_CONST(0.025978357899296), FRAC_CONST(0.019151803766819) }, - { FRAC_CONST(0.025915544776223), FRAC_CONST(0.019236715042290) }, - { FRAC_CONST(0.025852454118485), FRAC_CONST(0.019321420307998) }, - { FRAC_CONST(0.025789086601733), FRAC_CONST(0.019405918656817) }, - { FRAC_CONST(0.025725442904582), FRAC_CONST(0.019490209183837) }, - { FRAC_CONST(0.025661523708606), FRAC_CONST(0.019574290986376) }, - { FRAC_CONST(0.025597329698327), FRAC_CONST(0.019658163163984) }, - { FRAC_CONST(0.025532861561211), FRAC_CONST(0.019741824818458) }, - { FRAC_CONST(0.025468119987662), FRAC_CONST(0.019825275053848) }, - { FRAC_CONST(0.025403105671008), FRAC_CONST(0.019908512976470) }, - { FRAC_CONST(0.025337819307501), FRAC_CONST(0.019991537694913) }, - { FRAC_CONST(0.025272261596305), FRAC_CONST(0.020074348320047) }, - { FRAC_CONST(0.025206433239491), FRAC_CONST(0.020156943965039) }, - { FRAC_CONST(0.025140334942028), FRAC_CONST(0.020239323745355) }, - { FRAC_CONST(0.025073967411776), FRAC_CONST(0.020321486778774) }, - { FRAC_CONST(0.025007331359476), FRAC_CONST(0.020403432185395) }, - { FRAC_CONST(0.024940427498748), FRAC_CONST(0.020485159087650) }, - { FRAC_CONST(0.024873256546079), FRAC_CONST(0.020566666610309) }, - { FRAC_CONST(0.024805819220816), FRAC_CONST(0.020647953880491) }, - { FRAC_CONST(0.024738116245157), FRAC_CONST(0.020729020027676) }, - { FRAC_CONST(0.024670148344147), FRAC_CONST(0.020809864183709) }, - { FRAC_CONST(0.024601916245669), FRAC_CONST(0.020890485482816) }, - { FRAC_CONST(0.024533420680433), FRAC_CONST(0.020970883061607) }, - { FRAC_CONST(0.024464662381971), FRAC_CONST(0.021051056059087) }, - { FRAC_CONST(0.024395642086630), FRAC_CONST(0.021131003616670) }, - { FRAC_CONST(0.024326360533561), FRAC_CONST(0.021210724878181) }, - { FRAC_CONST(0.024256818464715), FRAC_CONST(0.021290218989868) }, - { FRAC_CONST(0.024187016624830), FRAC_CONST(0.021369485100415) }, - { FRAC_CONST(0.024116955761430), FRAC_CONST(0.021448522360944) }, - { FRAC_CONST(0.024046636624808), FRAC_CONST(0.021527329925030) }, - { FRAC_CONST(0.023976059968027), FRAC_CONST(0.021605906948708) }, - { FRAC_CONST(0.023905226546906), FRAC_CONST(0.021684252590480) }, - { FRAC_CONST(0.023834137120014), FRAC_CONST(0.021762366011328) }, - { FRAC_CONST(0.023762792448662), FRAC_CONST(0.021840246374720) }, - { FRAC_CONST(0.023691193296893), FRAC_CONST(0.021917892846620) }, - { FRAC_CONST(0.023619340431478), FRAC_CONST(0.021995304595495) }, - { FRAC_CONST(0.023547234621902), FRAC_CONST(0.022072480792330) }, - { FRAC_CONST(0.023474876640361), FRAC_CONST(0.022149420610628) }, - { FRAC_CONST(0.023402267261751), FRAC_CONST(0.022226123226426) }, - { FRAC_CONST(0.023329407263659), FRAC_CONST(0.022302587818300) }, - { FRAC_CONST(0.023256297426359), FRAC_CONST(0.022378813567377) }, - { FRAC_CONST(0.023182938532797), FRAC_CONST(0.022454799657339) }, - { FRAC_CONST(0.023109331368588), FRAC_CONST(0.022530545274437) }, - { FRAC_CONST(0.023035476722006), FRAC_CONST(0.022606049607496) }, - { FRAC_CONST(0.022961375383975), FRAC_CONST(0.022681311847926) }, - { FRAC_CONST(0.022887028148061), FRAC_CONST(0.022756331189727) }, - { FRAC_CONST(0.022812435810462), FRAC_CONST(0.022831106829504) }, - { FRAC_CONST(0.022737599170003), FRAC_CONST(0.022905637966469) }, - { FRAC_CONST(0.022662519028125), FRAC_CONST(0.022979923802453) }, - { FRAC_CONST(0.022587196188874), FRAC_CONST(0.023053963541915) }, - { FRAC_CONST(0.022511631458899), FRAC_CONST(0.023127756391950) }, - { FRAC_CONST(0.022435825647437), FRAC_CONST(0.023201301562294) }, - { FRAC_CONST(0.022359779566306), FRAC_CONST(0.023274598265338) }, - { FRAC_CONST(0.022283494029900), FRAC_CONST(0.023347645716133) }, - { FRAC_CONST(0.022206969855176), FRAC_CONST(0.023420443132400) }, - { FRAC_CONST(0.022130207861645), FRAC_CONST(0.023492989734537) }, - { FRAC_CONST(0.022053208871367), FRAC_CONST(0.023565284745628) }, - { FRAC_CONST(0.021975973708940), FRAC_CONST(0.023637327391451) }, - { FRAC_CONST(0.021898503201489), FRAC_CONST(0.023709116900488) }, - { FRAC_CONST(0.021820798178663), FRAC_CONST(0.023780652503931) }, - { FRAC_CONST(0.021742859472618), FRAC_CONST(0.023851933435691) }, - { FRAC_CONST(0.021664687918017), FRAC_CONST(0.023922958932406) }, - { FRAC_CONST(0.021586284352013), FRAC_CONST(0.023993728233451) }, - { FRAC_CONST(0.021507649614247), FRAC_CONST(0.024064240580942) }, - { FRAC_CONST(0.021428784546832), FRAC_CONST(0.024134495219750) }, - { FRAC_CONST(0.021349689994350), FRAC_CONST(0.024204491397504) }, - { FRAC_CONST(0.021270366803840), FRAC_CONST(0.024274228364600) }, - { FRAC_CONST(0.021190815824791), FRAC_CONST(0.024343705374213) }, - { FRAC_CONST(0.021111037909128), FRAC_CONST(0.024412921682298) }, - { FRAC_CONST(0.021031033911210), FRAC_CONST(0.024481876547605) }, - { FRAC_CONST(0.020950804687815), FRAC_CONST(0.024550569231683) }, - { FRAC_CONST(0.020870351098134), FRAC_CONST(0.024618998998889) }, - { FRAC_CONST(0.020789674003759), FRAC_CONST(0.024687165116394) }, - { FRAC_CONST(0.020708774268678), FRAC_CONST(0.024755066854194) }, - { FRAC_CONST(0.020627652759262), FRAC_CONST(0.024822703485116) }, - { FRAC_CONST(0.020546310344257), FRAC_CONST(0.024890074284826) }, - { FRAC_CONST(0.020464747894775), FRAC_CONST(0.024957178531837) }, - { FRAC_CONST(0.020382966284284), FRAC_CONST(0.025024015507516) }, - { FRAC_CONST(0.020300966388600), FRAC_CONST(0.025090584496093) }, - { FRAC_CONST(0.020218749085876), FRAC_CONST(0.025156884784668) }, - { FRAC_CONST(0.020136315256592), FRAC_CONST(0.025222915663218) }, - { FRAC_CONST(0.020053665783549), FRAC_CONST(0.025288676424605) }, - { FRAC_CONST(0.019970801551857), FRAC_CONST(0.025354166364584) }, - { FRAC_CONST(0.019887723448925), FRAC_CONST(0.025419384781811) }, - { FRAC_CONST(0.019804432364452), FRAC_CONST(0.025484330977848) }, - { FRAC_CONST(0.019720929190419), FRAC_CONST(0.025549004257175) }, - { FRAC_CONST(0.019637214821078), FRAC_CONST(0.025613403927192) }, - { FRAC_CONST(0.019553290152943), FRAC_CONST(0.025677529298230) }, - { FRAC_CONST(0.019469156084779), FRAC_CONST(0.025741379683559) }, - { FRAC_CONST(0.019384813517595), FRAC_CONST(0.025804954399392) }, - { FRAC_CONST(0.019300263354632), FRAC_CONST(0.025868252764895) }, - { FRAC_CONST(0.019215506501354), FRAC_CONST(0.025931274102193) }, - { FRAC_CONST(0.019130543865439), FRAC_CONST(0.025994017736379) }, - { FRAC_CONST(0.019045376356769), FRAC_CONST(0.026056482995518) }, - { FRAC_CONST(0.018960004887419), FRAC_CONST(0.026118669210657) }, - { FRAC_CONST(0.018874430371648), FRAC_CONST(0.026180575715833) }, - { FRAC_CONST(0.018788653725892), FRAC_CONST(0.026242201848076) }, - { FRAC_CONST(0.018702675868750), FRAC_CONST(0.026303546947421) }, - { FRAC_CONST(0.018616497720974), FRAC_CONST(0.026364610356909) }, - { FRAC_CONST(0.018530120205464), FRAC_CONST(0.026425391422602) }, - { FRAC_CONST(0.018443544247254), FRAC_CONST(0.026485889493583) }, - { FRAC_CONST(0.018356770773502), FRAC_CONST(0.026546103921965) }, - { FRAC_CONST(0.018269800713483), FRAC_CONST(0.026606034062902) }, - { FRAC_CONST(0.018182634998576), FRAC_CONST(0.026665679274589) }, - { FRAC_CONST(0.018095274562256), FRAC_CONST(0.026725038918274) }, - { FRAC_CONST(0.018007720340083), FRAC_CONST(0.026784112358263) }, - { FRAC_CONST(0.017919973269692), FRAC_CONST(0.026842898961926) }, - { FRAC_CONST(0.017832034290785), FRAC_CONST(0.026901398099707) }, - { FRAC_CONST(0.017743904345116), FRAC_CONST(0.026959609145127) }, - { FRAC_CONST(0.017655584376488), FRAC_CONST(0.027017531474792) }, - { FRAC_CONST(0.017567075330734), FRAC_CONST(0.027075164468401) }, - { FRAC_CONST(0.017478378155718), FRAC_CONST(0.027132507508750) }, - { FRAC_CONST(0.017389493801313), FRAC_CONST(0.027189559981742) }, - { FRAC_CONST(0.017300423219401), FRAC_CONST(0.027246321276391) }, - { FRAC_CONST(0.017211167363854), FRAC_CONST(0.027302790784828) }, - { FRAC_CONST(0.017121727190533), FRAC_CONST(0.027358967902310) }, - { FRAC_CONST(0.017032103657269), FRAC_CONST(0.027414852027226) }, - { FRAC_CONST(0.016942297723858), FRAC_CONST(0.027470442561102) }, - { FRAC_CONST(0.016852310352050), FRAC_CONST(0.027525738908608) }, - { FRAC_CONST(0.016762142505537), FRAC_CONST(0.027580740477564) }, - { FRAC_CONST(0.016671795149944), FRAC_CONST(0.027635446678948) }, - { FRAC_CONST(0.016581269252819), FRAC_CONST(0.027689856926900) }, - { FRAC_CONST(0.016490565783622), FRAC_CONST(0.027743970638730) }, - { FRAC_CONST(0.016399685713714), FRAC_CONST(0.027797787234924) }, - { FRAC_CONST(0.016308630016347), FRAC_CONST(0.027851306139149) }, - { FRAC_CONST(0.016217399666655), FRAC_CONST(0.027904526778260) }, - { FRAC_CONST(0.016125995641641), FRAC_CONST(0.027957448582309) }, - { FRAC_CONST(0.016034418920170), FRAC_CONST(0.028010070984544) }, - { FRAC_CONST(0.015942670482954), FRAC_CONST(0.028062393421421) }, - { FRAC_CONST(0.015850751312545), FRAC_CONST(0.028114415332610) }, - { FRAC_CONST(0.015758662393324), FRAC_CONST(0.028166136160998) }, - { FRAC_CONST(0.015666404711489), FRAC_CONST(0.028217555352697) }, - { FRAC_CONST(0.015573979255046), FRAC_CONST(0.028268672357047) }, - { FRAC_CONST(0.015481387013797), FRAC_CONST(0.028319486626627) }, - { FRAC_CONST(0.015388628979331), FRAC_CONST(0.028369997617257) }, - { FRAC_CONST(0.015295706145012), FRAC_CONST(0.028420204788004) }, - { FRAC_CONST(0.015202619505968), FRAC_CONST(0.028470107601191) }, - { FRAC_CONST(0.015109370059084), FRAC_CONST(0.028519705522399) }, - { FRAC_CONST(0.015015958802984), FRAC_CONST(0.028568998020472) }, - { FRAC_CONST(0.014922386738030), FRAC_CONST(0.028617984567529) }, - { FRAC_CONST(0.014828654866302), FRAC_CONST(0.028666664638963) }, - { FRAC_CONST(0.014734764191593), FRAC_CONST(0.028715037713449) }, - { FRAC_CONST(0.014640715719398), FRAC_CONST(0.028763103272951) }, - { FRAC_CONST(0.014546510456900), FRAC_CONST(0.028810860802724) }, - { FRAC_CONST(0.014452149412962), FRAC_CONST(0.028858309791325) }, - { FRAC_CONST(0.014357633598114), FRAC_CONST(0.028905449730613) }, - { FRAC_CONST(0.014262964024545), FRAC_CONST(0.028952280115756) }, - { FRAC_CONST(0.014168141706090), FRAC_CONST(0.028998800445240) }, - { FRAC_CONST(0.014073167658220), FRAC_CONST(0.029045010220868) }, - { FRAC_CONST(0.013978042898030), FRAC_CONST(0.029090908947771) }, - { FRAC_CONST(0.013882768444231), FRAC_CONST(0.029136496134411) }, - { FRAC_CONST(0.013787345317136), FRAC_CONST(0.029181771292585) }, - { FRAC_CONST(0.013691774538648), FRAC_CONST(0.029226733937433) }, - { FRAC_CONST(0.013596057132255), FRAC_CONST(0.029271383587441) }, - { FRAC_CONST(0.013500194123014), FRAC_CONST(0.029315719764447) }, - { FRAC_CONST(0.013404186537539), FRAC_CONST(0.029359741993647) }, - { FRAC_CONST(0.013308035403995), FRAC_CONST(0.029403449803598) }, - { FRAC_CONST(0.013211741752084), FRAC_CONST(0.029446842726223) }, - { FRAC_CONST(0.013115306613032), FRAC_CONST(0.029489920296820) }, - { FRAC_CONST(0.013018731019584), FRAC_CONST(0.029532682054063) }, - { FRAC_CONST(0.012922016005985), FRAC_CONST(0.029575127540008) }, - { FRAC_CONST(0.012825162607977), FRAC_CONST(0.029617256300097) }, - { FRAC_CONST(0.012728171862781), FRAC_CONST(0.029659067883165) }, - { FRAC_CONST(0.012631044809089), FRAC_CONST(0.029700561841444) }, - { FRAC_CONST(0.012533782487056), FRAC_CONST(0.029741737730567) }, - { FRAC_CONST(0.012436385938281), FRAC_CONST(0.029782595109573) }, - { FRAC_CONST(0.012338856205805), FRAC_CONST(0.029823133540913) }, - { FRAC_CONST(0.012241194334091), FRAC_CONST(0.029863352590452) }, - { FRAC_CONST(0.012143401369021), FRAC_CONST(0.029903251827477) }, - { FRAC_CONST(0.012045478357878), FRAC_CONST(0.029942830824699) }, - { FRAC_CONST(0.011947426349339), FRAC_CONST(0.029982089158259) }, - { FRAC_CONST(0.011849246393462), FRAC_CONST(0.030021026407731) }, - { FRAC_CONST(0.011750939541676), FRAC_CONST(0.030059642156129) }, - { FRAC_CONST(0.011652506846768), FRAC_CONST(0.030097935989909) }, - { FRAC_CONST(0.011553949362874), FRAC_CONST(0.030135907498976) }, - { FRAC_CONST(0.011455268145464), FRAC_CONST(0.030173556276684) }, - { FRAC_CONST(0.011356464251335), FRAC_CONST(0.030210881919845) }, - { FRAC_CONST(0.011257538738598), FRAC_CONST(0.030247884028732) }, - { FRAC_CONST(0.011158492666665), FRAC_CONST(0.030284562207083) }, - { FRAC_CONST(0.011059327096240), FRAC_CONST(0.030320916062102) }, - { FRAC_CONST(0.010960043089307), FRAC_CONST(0.030356945204470) }, - { FRAC_CONST(0.010860641709118), FRAC_CONST(0.030392649248343) }, - { FRAC_CONST(0.010761124020182), FRAC_CONST(0.030428027811361) }, - { FRAC_CONST(0.010661491088253), FRAC_CONST(0.030463080514646) }, - { FRAC_CONST(0.010561743980319), FRAC_CONST(0.030497806982812) }, - { FRAC_CONST(0.010461883764593), FRAC_CONST(0.030532206843968) }, - { FRAC_CONST(0.010361911510496), FRAC_CONST(0.030566279729717) }, - { FRAC_CONST(0.010261828288652), FRAC_CONST(0.030600025275167) }, - { FRAC_CONST(0.010161635170872), FRAC_CONST(0.030633443118931) }, - { FRAC_CONST(0.010061333230142), FRAC_CONST(0.030666532903129) }, - { FRAC_CONST(0.009960923540617), FRAC_CONST(0.030699294273397) }, - { FRAC_CONST(0.009860407177603), FRAC_CONST(0.030731726878888) }, - { FRAC_CONST(0.009759785217550), FRAC_CONST(0.030763830372273) }, - { FRAC_CONST(0.009659058738038), FRAC_CONST(0.030795604409750) }, - { FRAC_CONST(0.009558228817767), FRAC_CONST(0.030827048651045) }, - { FRAC_CONST(0.009457296536545), FRAC_CONST(0.030858162759415) }, - { FRAC_CONST(0.009356262975275), FRAC_CONST(0.030888946401653) }, - { FRAC_CONST(0.009255129215945), FRAC_CONST(0.030919399248091) }, - { FRAC_CONST(0.009153896341616), FRAC_CONST(0.030949520972603) }, - { FRAC_CONST(0.009052565436412), FRAC_CONST(0.030979311252611) }, - { FRAC_CONST(0.008951137585505), FRAC_CONST(0.031008769769084) }, - { FRAC_CONST(0.008849613875105), FRAC_CONST(0.031037896206544) }, - { FRAC_CONST(0.008747995392451), FRAC_CONST(0.031066690253072) }, - { FRAC_CONST(0.008646283225794), FRAC_CONST(0.031095151600306) }, - { FRAC_CONST(0.008544478464390), FRAC_CONST(0.031123279943448) }, - { FRAC_CONST(0.008442582198486), FRAC_CONST(0.031151074981266) }, - { FRAC_CONST(0.008340595519310), FRAC_CONST(0.031178536416098) }, - { FRAC_CONST(0.008238519519057), FRAC_CONST(0.031205663953853) }, - { FRAC_CONST(0.008136355290878), FRAC_CONST(0.031232457304017) }, - { FRAC_CONST(0.008034103928871), FRAC_CONST(0.031258916179656) }, - { FRAC_CONST(0.007931766528065), FRAC_CONST(0.031285040297416) }, - { FRAC_CONST(0.007829344184412), FRAC_CONST(0.031310829377528) }, - { FRAC_CONST(0.007726837994772), FRAC_CONST(0.031336283143813) }, - { FRAC_CONST(0.007624249056906), FRAC_CONST(0.031361401323680) }, - { FRAC_CONST(0.007521578469457), FRAC_CONST(0.031386183648135) }, - { FRAC_CONST(0.007418827331946), FRAC_CONST(0.031410629851778) }, - { FRAC_CONST(0.007315996744755), FRAC_CONST(0.031434739672811) }, - { FRAC_CONST(0.007213087809115), FRAC_CONST(0.031458512853036) }, - { FRAC_CONST(0.007110101627101), FRAC_CONST(0.031481949137863) }, - { FRAC_CONST(0.007007039301610), FRAC_CONST(0.031505048276306) }, - { FRAC_CONST(0.006903901936357), FRAC_CONST(0.031527810020993) }, - { FRAC_CONST(0.006800690635862), FRAC_CONST(0.031550234128164) }, - { FRAC_CONST(0.006697406505433), FRAC_CONST(0.031572320357675) }, - { FRAC_CONST(0.006594050651161), FRAC_CONST(0.031594068473000) }, - { FRAC_CONST(0.006490624179905), FRAC_CONST(0.031615478241233) }, - { FRAC_CONST(0.006387128199278), FRAC_CONST(0.031636549433095) }, - { FRAC_CONST(0.006283563817639), FRAC_CONST(0.031657281822929) }, - { FRAC_CONST(0.006179932144080), FRAC_CONST(0.031677675188707) }, - { FRAC_CONST(0.006076234288412), FRAC_CONST(0.031697729312034) }, - { FRAC_CONST(0.005972471361157), FRAC_CONST(0.031717443978146) }, - { FRAC_CONST(0.005868644473532), FRAC_CONST(0.031736818975914) }, - { FRAC_CONST(0.005764754737440), FRAC_CONST(0.031755854097848) }, - { FRAC_CONST(0.005660803265456), FRAC_CONST(0.031774549140098) }, - { FRAC_CONST(0.005556791170816), FRAC_CONST(0.031792903902453) }, - { FRAC_CONST(0.005452719567407), FRAC_CONST(0.031810918188350) }, - { FRAC_CONST(0.005348589569753), FRAC_CONST(0.031828591804869) }, - { FRAC_CONST(0.005244402293001), FRAC_CONST(0.031845924562742) }, - { FRAC_CONST(0.005140158852914), FRAC_CONST(0.031862916276347) }, - { FRAC_CONST(0.005035860365855), FRAC_CONST(0.031879566763717) }, - { FRAC_CONST(0.004931507948778), FRAC_CONST(0.031895875846539) }, - { FRAC_CONST(0.004827102719212), FRAC_CONST(0.031911843350155) }, - { FRAC_CONST(0.004722645795254), FRAC_CONST(0.031927469103567) }, - { FRAC_CONST(0.004618138295554), FRAC_CONST(0.031942752939435) }, - { FRAC_CONST(0.004513581339303), FRAC_CONST(0.031957694694082) }, - { FRAC_CONST(0.004408976046222), FRAC_CONST(0.031972294207493) }, - { FRAC_CONST(0.004304323536549), FRAC_CONST(0.031986551323320) }, - { FRAC_CONST(0.004199624931030), FRAC_CONST(0.032000465888879) }, - { FRAC_CONST(0.004094881350902), FRAC_CONST(0.032014037755158) }, - { FRAC_CONST(0.003990093917884), FRAC_CONST(0.032027266776813) }, - { FRAC_CONST(0.003885263754166), FRAC_CONST(0.032040152812170) }, - { FRAC_CONST(0.003780391982394), FRAC_CONST(0.032052695723232) }, - { FRAC_CONST(0.003675479725661), FRAC_CONST(0.032064895375674) }, - { FRAC_CONST(0.003570528107494), FRAC_CONST(0.032076751638847) }, - { FRAC_CONST(0.003465538251839), FRAC_CONST(0.032088264385780) }, - { FRAC_CONST(0.003360511283053), FRAC_CONST(0.032099433493181) }, - { FRAC_CONST(0.003255448325892), FRAC_CONST(0.032110258841438) }, - { FRAC_CONST(0.003150350505494), FRAC_CONST(0.032120740314619) }, - { FRAC_CONST(0.003045218947373), FRAC_CONST(0.032130877800478) }, - { FRAC_CONST(0.002940054777404), FRAC_CONST(0.032140671190449) }, - { FRAC_CONST(0.002834859121810), FRAC_CONST(0.032150120379653) }, - { FRAC_CONST(0.002729633107153), FRAC_CONST(0.032159225266897) }, - { FRAC_CONST(0.002624377860318), FRAC_CONST(0.032167985754674) }, - { FRAC_CONST(0.002519094508504), FRAC_CONST(0.032176401749168) }, - { FRAC_CONST(0.002413784179212), FRAC_CONST(0.032184473160250) }, - { FRAC_CONST(0.002308448000231), FRAC_CONST(0.032192199901481) }, - { FRAC_CONST(0.002203087099626), FRAC_CONST(0.032199581890114) }, - { FRAC_CONST(0.002097702605728), FRAC_CONST(0.032206619047093) }, - { FRAC_CONST(0.001992295647121), FRAC_CONST(0.032213311297057) }, - { FRAC_CONST(0.001886867352628), FRAC_CONST(0.032219658568338) }, - { FRAC_CONST(0.001781418851302), FRAC_CONST(0.032225660792960) }, - { FRAC_CONST(0.001675951272410), FRAC_CONST(0.032231317906644) }, - { FRAC_CONST(0.001570465745428), FRAC_CONST(0.032236629848809) }, - { FRAC_CONST(0.001464963400018), FRAC_CONST(0.032241596562566) }, - { FRAC_CONST(0.001359445366028), FRAC_CONST(0.032246217994727) }, - { FRAC_CONST(0.001253912773470), FRAC_CONST(0.032250494095799) }, - { FRAC_CONST(0.001148366752513), FRAC_CONST(0.032254424819990) }, - { FRAC_CONST(0.001042808433471), FRAC_CONST(0.032258010125204) }, - { FRAC_CONST(0.000937238946789), FRAC_CONST(0.032261249973045) }, - { FRAC_CONST(0.000831659423030), FRAC_CONST(0.032264144328817) }, - { FRAC_CONST(0.000726070992868), FRAC_CONST(0.032266693161525) }, - { FRAC_CONST(0.000620474787068), FRAC_CONST(0.032268896443871) }, - { FRAC_CONST(0.000514871936481), FRAC_CONST(0.032270754152261) }, - { FRAC_CONST(0.000409263572030), FRAC_CONST(0.032272266266801) }, - { FRAC_CONST(0.000303650824695), FRAC_CONST(0.032273432771295) }, - { FRAC_CONST(0.000198034825504), FRAC_CONST(0.032274253653254) }, - { FRAC_CONST(0.000092416705518), FRAC_CONST(0.032274728903884) } -}; - -#ifdef LD_DEC -/* 240 (N/4) complex twiddle factors */ -ALIGN static const complex_t mdct_tab_960[] = -{ - { FRAC_CONST(0.045643531183573), FRAC_CONST(0.000037342034959) }, - { FRAC_CONST(0.045642309173789), FRAC_CONST(0.000336075315362) }, - { FRAC_CONST(0.045639131999390), FRAC_CONST(0.000634794199417) }, - { FRAC_CONST(0.045633999796474), FRAC_CONST(0.000933485891002) }, - { FRAC_CONST(0.045626912784890), FRAC_CONST(0.001232137595157) }, - { FRAC_CONST(0.045617871268219), FRAC_CONST(0.001530736518639) }, - { FRAC_CONST(0.045606875633772), FRAC_CONST(0.001829269870464) }, - { FRAC_CONST(0.045593926352564), FRAC_CONST(0.002127724862455) }, - { FRAC_CONST(0.045579023979299), FRAC_CONST(0.002426088709795) }, - { FRAC_CONST(0.045562169152346), FRAC_CONST(0.002724348631569) }, - { FRAC_CONST(0.045543362593709), FRAC_CONST(0.003022491851315) }, - { FRAC_CONST(0.045522605108999), FRAC_CONST(0.003320505597570) }, - { FRAC_CONST(0.045499897587396), FRAC_CONST(0.003618377104416) }, - { FRAC_CONST(0.045475241001617), FRAC_CONST(0.003916093612031) }, - { FRAC_CONST(0.045448636407866), FRAC_CONST(0.004213642367228) }, - { FRAC_CONST(0.045420084945797), FRAC_CONST(0.004511010624011) }, - { FRAC_CONST(0.045389587838458), FRAC_CONST(0.004808185644112) }, - { FRAC_CONST(0.045357146392244), FRAC_CONST(0.005105154697544) }, - { FRAC_CONST(0.045322761996840), FRAC_CONST(0.005401905063139) }, - { FRAC_CONST(0.045286436125157), FRAC_CONST(0.005698424029100) }, - { FRAC_CONST(0.045248170333275), FRAC_CONST(0.005994698893542) }, - { FRAC_CONST(0.045207966260374), FRAC_CONST(0.006290716965035) }, - { FRAC_CONST(0.045165825628663), FRAC_CONST(0.006586465563151) }, - { FRAC_CONST(0.045121750243305), FRAC_CONST(0.006881932019003) }, - { FRAC_CONST(0.045075741992343), FRAC_CONST(0.007177103675792) }, - { FRAC_CONST(0.045027802846618), FRAC_CONST(0.007471967889347) }, - { FRAC_CONST(0.044977934859683), FRAC_CONST(0.007766512028667) }, - { FRAC_CONST(0.044926140167717), FRAC_CONST(0.008060723476460) }, - { FRAC_CONST(0.044872420989432), FRAC_CONST(0.008354589629687) }, - { FRAC_CONST(0.044816779625979), FRAC_CONST(0.008648097900101) }, - { FRAC_CONST(0.044759218460849), FRAC_CONST(0.008941235714784) }, - { FRAC_CONST(0.044699739959770), FRAC_CONST(0.009233990516688) }, - { FRAC_CONST(0.044638346670603), FRAC_CONST(0.009526349765171) }, - { FRAC_CONST(0.044575041223233), FRAC_CONST(0.009818300936537) }, - { FRAC_CONST(0.044509826329454), FRAC_CONST(0.010109831524568) }, - { FRAC_CONST(0.044442704782856), FRAC_CONST(0.010400929041064) }, - { FRAC_CONST(0.044373679458701), FRAC_CONST(0.010691581016378) }, - { FRAC_CONST(0.044302753313806), FRAC_CONST(0.010981774999945) }, - { FRAC_CONST(0.044229929386409), FRAC_CONST(0.011271498560822) }, - { FRAC_CONST(0.044155210796046), FRAC_CONST(0.011560739288214) }, - { FRAC_CONST(0.044078600743413), FRAC_CONST(0.011849484792012) }, - { FRAC_CONST(0.044000102510229), FRAC_CONST(0.012137722703321) }, - { FRAC_CONST(0.043919719459097), FRAC_CONST(0.012425440674986) }, - { FRAC_CONST(0.043837455033359), FRAC_CONST(0.012712626382127) }, - { FRAC_CONST(0.043753312756950), FRAC_CONST(0.012999267522665) }, - { FRAC_CONST(0.043667296234245), FRAC_CONST(0.013285351817848) }, - { FRAC_CONST(0.043579409149906), FRAC_CONST(0.013570867012776) }, - { FRAC_CONST(0.043489655268722), FRAC_CONST(0.013855800876928) }, - { FRAC_CONST(0.043398038435451), FRAC_CONST(0.014140141204686) }, - { FRAC_CONST(0.043304562574653), FRAC_CONST(0.014423875815857) }, - { FRAC_CONST(0.043209231690524), FRAC_CONST(0.014706992556195) }, - { FRAC_CONST(0.043112049866720), FRAC_CONST(0.014989479297920) }, - { FRAC_CONST(0.043013021266188), FRAC_CONST(0.015271323940241) }, - { FRAC_CONST(0.042912150130984), FRAC_CONST(0.015552514409871) }, - { FRAC_CONST(0.042809440782090), FRAC_CONST(0.015833038661547) }, - { FRAC_CONST(0.042704897619235), FRAC_CONST(0.016112884678543) }, - { FRAC_CONST(0.042598525120698), FRAC_CONST(0.016392040473187) }, - { FRAC_CONST(0.042490327843124), FRAC_CONST(0.016670494087374) }, - { FRAC_CONST(0.042380310421324), FRAC_CONST(0.016948233593079) }, - { FRAC_CONST(0.042268477568078), FRAC_CONST(0.017225247092864) }, - { FRAC_CONST(0.042154834073934), FRAC_CONST(0.017501522720393) }, - { FRAC_CONST(0.042039384807000), FRAC_CONST(0.017777048640940) }, - { FRAC_CONST(0.041922134712739), FRAC_CONST(0.018051813051888) }, - { FRAC_CONST(0.041803088813754), FRAC_CONST(0.018325804183247) }, - { FRAC_CONST(0.041682252209576), FRAC_CONST(0.018599010298148) }, - { FRAC_CONST(0.041559630076443), FRAC_CONST(0.018871419693350) }, - { FRAC_CONST(0.041435227667079), FRAC_CONST(0.019143020699741) }, - { FRAC_CONST(0.041309050310468), FRAC_CONST(0.019413801682838) }, - { FRAC_CONST(0.041181103411629), FRAC_CONST(0.019683751043285) }, - { FRAC_CONST(0.041051392451382), FRAC_CONST(0.019952857217350) }, - { FRAC_CONST(0.040919922986111), FRAC_CONST(0.020221108677421) }, - { FRAC_CONST(0.040786700647532), FRAC_CONST(0.020488493932496) }, - { FRAC_CONST(0.040651731142446), FRAC_CONST(0.020755001528683) }, - { FRAC_CONST(0.040515020252497), FRAC_CONST(0.021020620049682) }, - { FRAC_CONST(0.040376573833925), FRAC_CONST(0.021285338117280) }, - { FRAC_CONST(0.040236397817314), FRAC_CONST(0.021549144391836) }, - { FRAC_CONST(0.040094498207337), FRAC_CONST(0.021812027572768) }, - { FRAC_CONST(0.039950881082502), FRAC_CONST(0.022073976399034) }, - { FRAC_CONST(0.039805552594888), FRAC_CONST(0.022334979649620) }, - { FRAC_CONST(0.039658518969884), FRAC_CONST(0.022595026144014) }, - { FRAC_CONST(0.039509786505922), FRAC_CONST(0.022854104742690) }, - { FRAC_CONST(0.039359361574204), FRAC_CONST(0.023112204347583) }, - { FRAC_CONST(0.039207250618434), FRAC_CONST(0.023369313902565) }, - { FRAC_CONST(0.039053460154540), FRAC_CONST(0.023625422393919) }, - { FRAC_CONST(0.038897996770393), FRAC_CONST(0.023880518850809) }, - { FRAC_CONST(0.038740867125527), FRAC_CONST(0.024134592345752) }, - { FRAC_CONST(0.038582077950852), FRAC_CONST(0.024387631995085) }, - { FRAC_CONST(0.038421636048370), FRAC_CONST(0.024639626959432) }, - { FRAC_CONST(0.038259548290876), FRAC_CONST(0.024890566444167) }, - { FRAC_CONST(0.038095821621671), FRAC_CONST(0.025140439699877) }, - { FRAC_CONST(0.037930463054261), FRAC_CONST(0.025389236022825) }, - { FRAC_CONST(0.037763479672055), FRAC_CONST(0.025636944755403) }, - { FRAC_CONST(0.037594878628068), FRAC_CONST(0.025883555286595) }, - { FRAC_CONST(0.037424667144605), FRAC_CONST(0.026129057052425) }, - { FRAC_CONST(0.037252852512960), FRAC_CONST(0.026373439536415) }, - { FRAC_CONST(0.037079442093102), FRAC_CONST(0.026616692270033) }, - { FRAC_CONST(0.036904443313354), FRAC_CONST(0.026858804833142) }, - { FRAC_CONST(0.036727863670081), FRAC_CONST(0.027099766854444) }, - { FRAC_CONST(0.036549710727369), FRAC_CONST(0.027339568011930) }, - { FRAC_CONST(0.036369992116697), FRAC_CONST(0.027578198033315) }, - { FRAC_CONST(0.036188715536611), FRAC_CONST(0.027815646696484) }, - { FRAC_CONST(0.036005888752396), FRAC_CONST(0.028051903829926) }, - { FRAC_CONST(0.035821519595745), FRAC_CONST(0.028286959313171) }, - { FRAC_CONST(0.035635615964417), FRAC_CONST(0.028520803077226) }, - { FRAC_CONST(0.035448185821906), FRAC_CONST(0.028753425105002) }, - { FRAC_CONST(0.035259237197095), FRAC_CONST(0.028984815431745) }, - { FRAC_CONST(0.035068778183914), FRAC_CONST(0.029214964145465) }, - { FRAC_CONST(0.034876816940994), FRAC_CONST(0.029443861387355) }, - { FRAC_CONST(0.034683361691315), FRAC_CONST(0.029671497352220) }, - { FRAC_CONST(0.034488420721856), FRAC_CONST(0.029897862288892) }, - { FRAC_CONST(0.034292002383240), FRAC_CONST(0.030122946500652) }, - { FRAC_CONST(0.034094115089375), FRAC_CONST(0.030346740345641) }, - { FRAC_CONST(0.033894767317093), FRAC_CONST(0.030569234237276) }, - { FRAC_CONST(0.033693967605790), FRAC_CONST(0.030790418644658) }, - { FRAC_CONST(0.033491724557057), FRAC_CONST(0.031010284092984) }, - { FRAC_CONST(0.033288046834313), FRAC_CONST(0.031228821163949) }, - { FRAC_CONST(0.033082943162434), FRAC_CONST(0.031446020496153) }, - { FRAC_CONST(0.032876422327378), FRAC_CONST(0.031661872785500) }, - { FRAC_CONST(0.032668493175811), FRAC_CONST(0.031876368785596) }, - { FRAC_CONST(0.032459164614726), FRAC_CONST(0.032089499308145) }, - { FRAC_CONST(0.032248445611061), FRAC_CONST(0.032301255223347) }, - { FRAC_CONST(0.032036345191317), FRAC_CONST(0.032511627460281) }, - { FRAC_CONST(0.031822872441171), FRAC_CONST(0.032720607007302) }, - { FRAC_CONST(0.031608036505083), FRAC_CONST(0.032928184912422) }, - { FRAC_CONST(0.031391846585912), FRAC_CONST(0.033134352283693) }, - { FRAC_CONST(0.031174311944513), FRAC_CONST(0.033339100289593) }, - { FRAC_CONST(0.030955441899347), FRAC_CONST(0.033542420159397) }, - { FRAC_CONST(0.030735245826077), FRAC_CONST(0.033744303183559) }, - { FRAC_CONST(0.030513733157171), FRAC_CONST(0.033944740714083) }, - { FRAC_CONST(0.030290913381494), FRAC_CONST(0.034143724164891) }, - { FRAC_CONST(0.030066796043904), FRAC_CONST(0.034341245012195) }, - { FRAC_CONST(0.029841390744841), FRAC_CONST(0.034537294794860) }, - { FRAC_CONST(0.029614707139919), FRAC_CONST(0.034731865114764) }, - { FRAC_CONST(0.029386754939508), FRAC_CONST(0.034924947637164) }, - { FRAC_CONST(0.029157543908322), FRAC_CONST(0.035116534091046) }, - { FRAC_CONST(0.028927083864999), FRAC_CONST(0.035306616269485) }, - { FRAC_CONST(0.028695384681680), FRAC_CONST(0.035495186029992) }, - { FRAC_CONST(0.028462456283587), FRAC_CONST(0.035682235294866) }, - { FRAC_CONST(0.028228308648598), FRAC_CONST(0.035867756051541) }, - { FRAC_CONST(0.027992951806817), FRAC_CONST(0.036051740352923) }, - { FRAC_CONST(0.027756395840148), FRAC_CONST(0.036234180317738) }, - { FRAC_CONST(0.027518650881862), FRAC_CONST(0.036415068130865) }, - { FRAC_CONST(0.027279727116161), FRAC_CONST(0.036594396043672) }, - { FRAC_CONST(0.027039634777745), FRAC_CONST(0.036772156374348) }, - { FRAC_CONST(0.026798384151369), FRAC_CONST(0.036948341508233) }, - { FRAC_CONST(0.026555985571409), FRAC_CONST(0.037122943898140) }, - { FRAC_CONST(0.026312449421412), FRAC_CONST(0.037295956064686) }, - { FRAC_CONST(0.026067786133656), FRAC_CONST(0.037467370596605) }, - { FRAC_CONST(0.025822006188702), FRAC_CONST(0.037637180151068) }, - { FRAC_CONST(0.025575120114946), FRAC_CONST(0.037805377454000) }, - { FRAC_CONST(0.025327138488165), FRAC_CONST(0.037971955300388) }, - { FRAC_CONST(0.025078071931066), FRAC_CONST(0.038136906554591) }, - { FRAC_CONST(0.024827931112832), FRAC_CONST(0.038300224150647) }, - { FRAC_CONST(0.024576726748663), FRAC_CONST(0.038461901092573) }, - { FRAC_CONST(0.024324469599317), FRAC_CONST(0.038621930454668) }, - { FRAC_CONST(0.024071170470652), FRAC_CONST(0.038780305381806) }, - { FRAC_CONST(0.023816840213160), FRAC_CONST(0.038937019089732) }, - { FRAC_CONST(0.023561489721501), FRAC_CONST(0.039092064865353) }, - { FRAC_CONST(0.023305129934041), FRAC_CONST(0.039245436067023) }, - { FRAC_CONST(0.023047771832380), FRAC_CONST(0.039397126124832) }, - { FRAC_CONST(0.022789426440883), FRAC_CONST(0.039547128540881) }, - { FRAC_CONST(0.022530104826206), FRAC_CONST(0.039695436889566) }, - { FRAC_CONST(0.022269818096825), FRAC_CONST(0.039842044817851) }, - { FRAC_CONST(0.022008577402555), FRAC_CONST(0.039986946045542) }, - { FRAC_CONST(0.021746393934081), FRAC_CONST(0.040130134365550) }, - { FRAC_CONST(0.021483278922467), FRAC_CONST(0.040271603644166) }, - { FRAC_CONST(0.021219243638687), FRAC_CONST(0.040411347821316) }, - { FRAC_CONST(0.020954299393132), FRAC_CONST(0.040549360910825) }, - { FRAC_CONST(0.020688457535133), FRAC_CONST(0.040685637000671) }, - { FRAC_CONST(0.020421729452469), FRAC_CONST(0.040820170253240) }, - { FRAC_CONST(0.020154126570884), FRAC_CONST(0.040952954905576) }, - { FRAC_CONST(0.019885660353596), FRAC_CONST(0.041083985269625) }, - { FRAC_CONST(0.019616342300802), FRAC_CONST(0.041213255732484) }, - { FRAC_CONST(0.019346183949192), FRAC_CONST(0.041340760756635) }, - { FRAC_CONST(0.019075196871451), FRAC_CONST(0.041466494880189) }, - { FRAC_CONST(0.018803392675763), FRAC_CONST(0.041590452717113) }, - { FRAC_CONST(0.018530783005316), FRAC_CONST(0.041712628957466) }, - { FRAC_CONST(0.018257379537800), FRAC_CONST(0.041833018367625) }, - { FRAC_CONST(0.017983193984910), FRAC_CONST(0.041951615790509) }, - { FRAC_CONST(0.017708238091842), FRAC_CONST(0.042068416145797) }, - { FRAC_CONST(0.017432523636792), FRAC_CONST(0.042183414430153) }, - { FRAC_CONST(0.017156062430449), FRAC_CONST(0.042296605717432) }, - { FRAC_CONST(0.016878866315491), FRAC_CONST(0.042407985158896) }, - { FRAC_CONST(0.016600947166078), FRAC_CONST(0.042517547983420) }, - { FRAC_CONST(0.016322316887341), FRAC_CONST(0.042625289497698) }, - { FRAC_CONST(0.016042987414872), FRAC_CONST(0.042731205086442) }, - { FRAC_CONST(0.015762970714219), FRAC_CONST(0.042835290212581) }, - { FRAC_CONST(0.015482278780363), FRAC_CONST(0.042937540417454) }, - { FRAC_CONST(0.015200923637213), FRAC_CONST(0.043037951321002) }, - { FRAC_CONST(0.014918917337087), FRAC_CONST(0.043136518621958) }, - { FRAC_CONST(0.014636271960196), FRAC_CONST(0.043233238098025) }, - { FRAC_CONST(0.014352999614128), FRAC_CONST(0.043328105606063) }, - { FRAC_CONST(0.014069112433327), FRAC_CONST(0.043421117082265) }, - { FRAC_CONST(0.013784622578575), FRAC_CONST(0.043512268542327) }, - { FRAC_CONST(0.013499542236471), FRAC_CONST(0.043601556081625) }, - { FRAC_CONST(0.013213883618907), FRAC_CONST(0.043688975875378) }, - { FRAC_CONST(0.012927658962548), FRAC_CONST(0.043774524178812) }, - { FRAC_CONST(0.012640880528305), FRAC_CONST(0.043858197327323) }, - { FRAC_CONST(0.012353560600813), FRAC_CONST(0.043939991736633) }, - { FRAC_CONST(0.012065711487901), FRAC_CONST(0.044019903902940) }, - { FRAC_CONST(0.011777345520066), FRAC_CONST(0.044097930403073) }, - { FRAC_CONST(0.011488475049948), FRAC_CONST(0.044174067894638) }, - { FRAC_CONST(0.011199112451794), FRAC_CONST(0.044248313116156) }, - { FRAC_CONST(0.010909270120937), FRAC_CONST(0.044320662887211) }, - { FRAC_CONST(0.010618960473257), FRAC_CONST(0.044391114108577) }, - { FRAC_CONST(0.010328195944653), FRAC_CONST(0.044459663762361) }, - { FRAC_CONST(0.010036988990509), FRAC_CONST(0.044526308912122) }, - { FRAC_CONST(0.009745352085163), FRAC_CONST(0.044591046703005) }, - { FRAC_CONST(0.009453297721368), FRAC_CONST(0.044653874361857) }, - { FRAC_CONST(0.009160838409762), FRAC_CONST(0.044714789197351) }, - { FRAC_CONST(0.008867986678328), FRAC_CONST(0.044773788600099) }, - { FRAC_CONST(0.008574755071860), FRAC_CONST(0.044830870042761) }, - { FRAC_CONST(0.008281156151424), FRAC_CONST(0.044886031080160) }, - { FRAC_CONST(0.007987202493820), FRAC_CONST(0.044939269349379) }, - { FRAC_CONST(0.007692906691044), FRAC_CONST(0.044990582569869) }, - { FRAC_CONST(0.007398281349750), FRAC_CONST(0.045039968543542) }, - { FRAC_CONST(0.007103339090706), FRAC_CONST(0.045087425154868) }, - { FRAC_CONST(0.006808092548258), FRAC_CONST(0.045132950370962) }, - { FRAC_CONST(0.006512554369783), FRAC_CONST(0.045176542241676) }, - { FRAC_CONST(0.006216737215155), FRAC_CONST(0.045218198899680) }, - { FRAC_CONST(0.005920653756196), FRAC_CONST(0.045257918560541) }, - { FRAC_CONST(0.005624316676135), FRAC_CONST(0.045295699522801) }, - { FRAC_CONST(0.005327738669067), FRAC_CONST(0.045331540168049) }, - { FRAC_CONST(0.005030932439406), FRAC_CONST(0.045365438960992) }, - { FRAC_CONST(0.004733910701344), FRAC_CONST(0.045397394449517) }, - { FRAC_CONST(0.004436686178303), FRAC_CONST(0.045427405264758) }, - { FRAC_CONST(0.004139271602393), FRAC_CONST(0.045455470121152) }, - { FRAC_CONST(0.003841679713863), FRAC_CONST(0.045481587816494) }, - { FRAC_CONST(0.003543923260561), FRAC_CONST(0.045505757231988) }, - { FRAC_CONST(0.003246014997382), FRAC_CONST(0.045527977332297) }, - { FRAC_CONST(0.002947967685724), FRAC_CONST(0.045548247165585) }, - { FRAC_CONST(0.002649794092941), FRAC_CONST(0.045566565863562) }, - { FRAC_CONST(0.002351506991799), FRAC_CONST(0.045582932641515) }, - { FRAC_CONST(0.002053119159924), FRAC_CONST(0.045597346798344) }, - { FRAC_CONST(0.001754643379257), FRAC_CONST(0.045609807716597) }, - { FRAC_CONST(0.001456092435508), FRAC_CONST(0.045620314862489) }, - { FRAC_CONST(0.001157479117605), FRAC_CONST(0.045628867785927) }, - { FRAC_CONST(0.000858816217149), FRAC_CONST(0.045635466120535) }, - { FRAC_CONST(0.000560116527865), FRAC_CONST(0.045640109583661) }, - { FRAC_CONST(0.000261392845053), FRAC_CONST(0.045642797976394) } -}; -#endif // LD_DEC - -/* 60 (N/4) complex twiddle factors */ -ALIGN static const complex_t mdct_tab_240[] = -{ - { FRAC_CONST(0.091286604111815), FRAC_CONST(0.000298735779793) }, - { FRAC_CONST(0.091247502481454), FRAC_CONST(0.002688238127538) }, - { FRAC_CONST(0.091145864370807), FRAC_CONST(0.005075898091152) }, - { FRAC_CONST(0.090981759437558), FRAC_CONST(0.007460079287760) }, - { FRAC_CONST(0.090755300151030), FRAC_CONST(0.009839147718664) }, - { FRAC_CONST(0.090466641715108), FRAC_CONST(0.012211472889198) }, - { FRAC_CONST(0.090115981961863), FRAC_CONST(0.014575428926191) }, - { FRAC_CONST(0.089703561215976), FRAC_CONST(0.016929395692256) }, - { FRAC_CONST(0.089229662130024), FRAC_CONST(0.019271759896156) }, - { FRAC_CONST(0.088694609490769), FRAC_CONST(0.021600916198470) }, - { FRAC_CONST(0.088098769996564), FRAC_CONST(0.023915268311810) }, - { FRAC_CONST(0.087442552006035), FRAC_CONST(0.026213230094844) }, - { FRAC_CONST(0.086726405258214), FRAC_CONST(0.028493226639351) }, - { FRAC_CONST(0.085950820564309), FRAC_CONST(0.030753695349588) }, - { FRAC_CONST(0.085116329471329), FRAC_CONST(0.032993087013213) }, - { FRAC_CONST(0.084223503897785), FRAC_CONST(0.035209866863042) }, - { FRAC_CONST(0.083272955741727), FRAC_CONST(0.037402515628894) }, - { FRAC_CONST(0.082265336461381), FRAC_CONST(0.039569530578832) }, - { FRAC_CONST(0.081201336628670), FRAC_CONST(0.041709426549053) }, - { FRAC_CONST(0.080081685455930), FRAC_CONST(0.043820736961749) }, - { FRAC_CONST(0.078907150296148), FRAC_CONST(0.045902014830227) }, - { FRAC_CONST(0.077678536117054), FRAC_CONST(0.047951833750597) }, - { FRAC_CONST(0.076396684949434), FRAC_CONST(0.049968788879362) }, - { FRAC_CONST(0.075062475310050), FRAC_CONST(0.051951497896226) }, - { FRAC_CONST(0.073676821599542), FRAC_CONST(0.053898601951466) }, - { FRAC_CONST(0.072240673475749), FRAC_CONST(0.055808766597225) }, - { FRAC_CONST(0.070755015202858), FRAC_CONST(0.057680682702068) }, - { FRAC_CONST(0.069220864976840), FRAC_CONST(0.059513067348201) }, - { FRAC_CONST(0.067639274227625), FRAC_CONST(0.061304664710718) }, - { FRAC_CONST(0.066011326898512), FRAC_CONST(0.063054246918278) }, - { FRAC_CONST(0.064338138703282), FRAC_CONST(0.064760614894630) }, - { FRAC_CONST(0.062620856361546), FRAC_CONST(0.066422599180399) }, - { FRAC_CONST(0.060860656812842), FRAC_CONST(0.068039060734572) }, - { FRAC_CONST(0.059058746410016), FRAC_CONST(0.069608891715145) }, - { FRAC_CONST(0.057216360092450), FRAC_CONST(0.071131016238378) }, - { FRAC_CONST(0.055334760539699), FRAC_CONST(0.072604391116154) }, - { FRAC_CONST(0.053415237306106), FRAC_CONST(0.074028006570930) }, - { FRAC_CONST(0.051459105937014), FRAC_CONST(0.075400886927784) }, - { FRAC_CONST(0.049467707067153), FRAC_CONST(0.076722091283096) }, - { FRAC_CONST(0.047442405501835), FRAC_CONST(0.077990714149396) }, - { FRAC_CONST(0.045384589281588), FRAC_CONST(0.079205886075941) }, - { FRAC_CONST(0.043295668730857), FRAC_CONST(0.080366774244592) }, - { FRAC_CONST(0.041177075491445), FRAC_CONST(0.081472583040586) }, - { FRAC_CONST(0.039030261541332), FRAC_CONST(0.082522554597810) }, - { FRAC_CONST(0.036856698199564), FRAC_CONST(0.083515969318206) }, - { FRAC_CONST(0.034657875117883), FRAC_CONST(0.084452146364948) }, - { FRAC_CONST(0.032435299259796), FRAC_CONST(0.085330444129049) }, - { FRAC_CONST(0.030190493867775), FRAC_CONST(0.086150260669096) }, - { FRAC_CONST(0.027924997419306), FRAC_CONST(0.086911034123781) }, - { FRAC_CONST(0.025640362572491), FRAC_CONST(0.087612243096981) }, - { FRAC_CONST(0.023338155101933), FRAC_CONST(0.088253407015092) }, - { FRAC_CONST(0.021019952825636), FRAC_CONST(0.088834086456390) }, - { FRAC_CONST(0.018687344523641), FRAC_CONST(0.089353883452193) }, - { FRAC_CONST(0.016341928849164), FRAC_CONST(0.089812441759604) }, - { FRAC_CONST(0.013985313232951), FRAC_CONST(0.090209447105664) }, - { FRAC_CONST(0.011619112781631), FRAC_CONST(0.090544627402740) }, - { FRAC_CONST(0.009244949170797), FRAC_CONST(0.090817752935000) }, - { FRAC_CONST(0.006864449533597), FRAC_CONST(0.091028636515846) }, - { FRAC_CONST(0.004479245345574), FRAC_CONST(0.091177133616206) }, - { FRAC_CONST(0.002090971306534), FRAC_CONST(0.091263142463585) } -}; -#endif // ALLOW_SMALL_FRAMELENGTH - -#ifdef SSR_DEC -/* 128 (N/4) complex twiddle factors */ -ALIGN static const complex_t mdct_tab_512[] = -{ - { FRAC_CONST(0.062499926465731), FRAC_CONST(0.000095873761643) }, - { FRAC_CONST(0.062494043817678), FRAC_CONST(0.000862836783004) }, - { FRAC_CONST(0.062478749796497), FRAC_CONST(0.001629669864319) }, - { FRAC_CONST(0.062454046705412), FRAC_CONST(0.002396257523347) }, - { FRAC_CONST(0.062419938264617), FRAC_CONST(0.003162484314806) }, - { FRAC_CONST(0.062376429610718), FRAC_CONST(0.003928234847760) }, - { FRAC_CONST(0.062323527295958), FRAC_CONST(0.004693393802995) }, - { FRAC_CONST(0.062261239287231), FRAC_CONST(0.005457845950387) }, - { FRAC_CONST(0.062189574964882), FRAC_CONST(0.006221476166254) }, - { FRAC_CONST(0.062108545121295), FRAC_CONST(0.006984169450695) }, - { FRAC_CONST(0.062018161959266), FRAC_CONST(0.007745810944907) }, - { FRAC_CONST(0.061918439090167), FRAC_CONST(0.008506285948482) }, - { FRAC_CONST(0.061809391531894), FRAC_CONST(0.009265479936681) }, - { FRAC_CONST(0.061691035706609), FRAC_CONST(0.010023278577683) }, - { FRAC_CONST(0.061563389438265), FRAC_CONST(0.010779567749800) }, - { FRAC_CONST(0.061426471949919), FRAC_CONST(0.011534233558664) }, - { FRAC_CONST(0.061280303860842), FRAC_CONST(0.012287162354380) }, - { FRAC_CONST(0.061124907183410), FRAC_CONST(0.013038240748641) }, - { FRAC_CONST(0.060960305319791), FRAC_CONST(0.013787355631805) }, - { FRAC_CONST(0.060786523058421), FRAC_CONST(0.014534394189923) }, - { FRAC_CONST(0.060603586570268), FRAC_CONST(0.015279243921739) }, - { FRAC_CONST(0.060411523404896), FRAC_CONST(0.016021792655621) }, - { FRAC_CONST(0.060210362486310), FRAC_CONST(0.016761928566463) }, - { FRAC_CONST(0.060000134108604), FRAC_CONST(0.017499540192517) }, - { FRAC_CONST(0.059780869931400), FRAC_CONST(0.018234516452187) }, - { FRAC_CONST(0.059552602975075), FRAC_CONST(0.018966746660751) }, - { FRAC_CONST(0.059315367615794), FRAC_CONST(0.019696120547033) }, - { FRAC_CONST(0.059069199580329), FRAC_CONST(0.020422528270008) }, - { FRAC_CONST(0.058814135940681), FRAC_CONST(0.021145860435346) }, - { FRAC_CONST(0.058550215108495), FRAC_CONST(0.021866008111883) }, - { FRAC_CONST(0.058277476829279), FRAC_CONST(0.022582862848028) }, - { FRAC_CONST(0.057995962176414), FRAC_CONST(0.023296316688095) }, - { FRAC_CONST(0.057705713544970), FRAC_CONST(0.024006262188558) }, - { FRAC_CONST(0.057406774645326), FRAC_CONST(0.024712592434239) }, - { FRAC_CONST(0.057099190496578), FRAC_CONST(0.025415201054398) }, - { FRAC_CONST(0.056783007419769), FRAC_CONST(0.026113982238763) }, - { FRAC_CONST(0.056458273030907), FRAC_CONST(0.026808830753458) }, - { FRAC_CONST(0.056125036233796), FRAC_CONST(0.027499641956852) }, - { FRAC_CONST(0.055783347212673), FRAC_CONST(0.028186311815319) }, - { FRAC_CONST(0.055433257424646), FRAC_CONST(0.028868736918904) }, - { FRAC_CONST(0.055074819591951), FRAC_CONST(0.029546814496896) }, - { FRAC_CONST(0.054708087694007), FRAC_CONST(0.030220442433307) }, - { FRAC_CONST(0.054333116959288), FRAC_CONST(0.030889519282247) }, - { FRAC_CONST(0.053949963857008), FRAC_CONST(0.031553944283204) }, - { FRAC_CONST(0.053558686088614), FRAC_CONST(0.032213617376216) }, - { FRAC_CONST(0.053159342579100), FRAC_CONST(0.032868439216943) }, - { FRAC_CONST(0.052751993468129), FRAC_CONST(0.033518311191623) }, - { FRAC_CONST(0.052336700100979), FRAC_CONST(0.034163135431927) }, - { FRAC_CONST(0.051913525019303), FRAC_CONST(0.034802814829698) }, - { FRAC_CONST(0.051482531951712), FRAC_CONST(0.035437253051569) }, - { FRAC_CONST(0.051043785804177), FRAC_CONST(0.036066354553480) }, - { FRAC_CONST(0.050597352650253), FRAC_CONST(0.036690024595057) }, - { FRAC_CONST(0.050143299721132), FRAC_CONST(0.037308169253887) }, - { FRAC_CONST(0.049681695395515), FRAC_CONST(0.037920695439658) }, - { FRAC_CONST(0.049212609189314), FRAC_CONST(0.038527510908178) }, - { FRAC_CONST(0.048736111745188), FRAC_CONST(0.039128524275271) }, - { FRAC_CONST(0.048252274821899), FRAC_CONST(0.039723645030535) }, - { FRAC_CONST(0.047761171283507), FRAC_CONST(0.040312783550971) }, - { FRAC_CONST(0.047262875088400), FRAC_CONST(0.040895851114488) }, - { FRAC_CONST(0.046757461278150), FRAC_CONST(0.041472759913252) }, - { FRAC_CONST(0.046245005966220), FRAC_CONST(0.042043423066923) }, - { FRAC_CONST(0.045725586326493), FRAC_CONST(0.042607754635728) }, - { FRAC_CONST(0.045199280581658), FRAC_CONST(0.043165669633408) }, - { FRAC_CONST(0.044666167991423), FRAC_CONST(0.043717084040018) }, - { FRAC_CONST(0.044126328840584), FRAC_CONST(0.044261914814575) }, - { FRAC_CONST(0.043579844426930), FRAC_CONST(0.044800079907569) }, - { FRAC_CONST(0.043026797049006), FRAC_CONST(0.045331498273316) }, - { FRAC_CONST(0.042467269993710), FRAC_CONST(0.045856089882166) }, - { FRAC_CONST(0.041901347523761), FRAC_CONST(0.046373775732552) }, - { FRAC_CONST(0.041329114865000), FRAC_CONST(0.046884477862888) }, - { FRAC_CONST(0.040750658193560), FRAC_CONST(0.047388119363313) }, - { FRAC_CONST(0.040166064622889), FRAC_CONST(0.047884624387270) }, - { FRAC_CONST(0.039575422190629), FRAC_CONST(0.048373918162926) }, - { FRAC_CONST(0.038978819845356), FRAC_CONST(0.048855927004441) }, - { FRAC_CONST(0.038376347433190), FRAC_CONST(0.049330578323055) }, - { FRAC_CONST(0.037768095684260), FRAC_CONST(0.049797800638026) }, - { FRAC_CONST(0.037154156199042), FRAC_CONST(0.050257523587392) }, - { FRAC_CONST(0.036534621434563), FRAC_CONST(0.050709677938566) }, - { FRAC_CONST(0.035909584690482), FRAC_CONST(0.051154195598769) }, - { FRAC_CONST(0.035279140095032), FRAC_CONST(0.051591009625274) }, - { FRAC_CONST(0.034643382590851), FRAC_CONST(0.052020054235496) }, - { FRAC_CONST(0.034002407920680), FRAC_CONST(0.052441264816895) }, - { FRAC_CONST(0.033356312612947), FRAC_CONST(0.052854577936706) }, - { FRAC_CONST(0.032705193967229), FRAC_CONST(0.053259931351495) }, - { FRAC_CONST(0.032049150039598), FRAC_CONST(0.053657264016528) }, - { FRAC_CONST(0.031388279627857), FRAC_CONST(0.054046516094966) }, - { FRAC_CONST(0.030722682256659), FRAC_CONST(0.054427628966880) }, - { FRAC_CONST(0.030052458162521), FRAC_CONST(0.054800545238072) }, - { FRAC_CONST(0.029377708278725), FRAC_CONST(0.055165208748723) }, - { FRAC_CONST(0.028698534220122), FRAC_CONST(0.055521564581850) }, - { FRAC_CONST(0.028015038267826), FRAC_CONST(0.055869559071575) }, - { FRAC_CONST(0.027327323353815), FRAC_CONST(0.056209139811209) }, - { FRAC_CONST(0.026635493045425), FRAC_CONST(0.056540255661140) }, - { FRAC_CONST(0.025939651529755), FRAC_CONST(0.056862856756541) }, - { FRAC_CONST(0.025239903597978), FRAC_CONST(0.057176894514872) }, - { FRAC_CONST(0.024536354629559), FRAC_CONST(0.057482321643202) }, - { FRAC_CONST(0.023829110576385), FRAC_CONST(0.057779092145329) }, - { FRAC_CONST(0.023118277946808), FRAC_CONST(0.058067161328707) }, - { FRAC_CONST(0.022403963789609), FRAC_CONST(0.058346485811177) }, - { FRAC_CONST(0.021686275677870), FRAC_CONST(0.058617023527499) }, - { FRAC_CONST(0.020965321692783), FRAC_CONST(0.058878733735689) }, - { FRAC_CONST(0.020241210407366), FRAC_CONST(0.059131577023150) }, - { FRAC_CONST(0.019514050870114), FRAC_CONST(0.059375515312615) }, - { FRAC_CONST(0.018783952588580), FRAC_CONST(0.059610511867874) }, - { FRAC_CONST(0.018051025512878), FRAC_CONST(0.059836531299311) }, - { FRAC_CONST(0.017315380019131), FRAC_CONST(0.060053539569230) }, - { FRAC_CONST(0.016577126892844), FRAC_CONST(0.060261503996984) }, - { FRAC_CONST(0.015836377312223), FRAC_CONST(0.060460393263896) }, - { FRAC_CONST(0.015093242831429), FRAC_CONST(0.060650177417972) }, - { FRAC_CONST(0.014347835363782), FRAC_CONST(0.060830827878419) }, - { FRAC_CONST(0.013600267164905), FRAC_CONST(0.061002317439940) }, - { FRAC_CONST(0.012850650815819), FRAC_CONST(0.061164620276839) }, - { FRAC_CONST(0.012099099205988), FRAC_CONST(0.061317711946905) }, - { FRAC_CONST(0.011345725516320), FRAC_CONST(0.061461569395097) }, - { FRAC_CONST(0.010590643202123), FRAC_CONST(0.061596170957011) }, - { FRAC_CONST(0.009833965976015), FRAC_CONST(0.061721496362147) }, - { FRAC_CONST(0.009075807790803), FRAC_CONST(0.061837526736961) }, - { FRAC_CONST(0.008316282822321), FRAC_CONST(0.061944244607705) }, - { FRAC_CONST(0.007555505452236), FRAC_CONST(0.062041633903059) }, - { FRAC_CONST(0.006793590250821), FRAC_CONST(0.062129679956555) }, - { FRAC_CONST(0.006030651959703), FRAC_CONST(0.062208369508780) }, - { FRAC_CONST(0.005266805474583), FRAC_CONST(0.062277690709378) }, - { FRAC_CONST(0.004502165827931), FRAC_CONST(0.062337633118830) }, - { FRAC_CONST(0.003736848171665), FRAC_CONST(0.062388187710030) }, - { FRAC_CONST(0.002970967759810), FRAC_CONST(0.062429346869643) }, - { FRAC_CONST(0.002204639931138), FRAC_CONST(0.062461104399250) }, - { FRAC_CONST(0.001437980091802), FRAC_CONST(0.062483455516285) }, - { FRAC_CONST(0.000671103697954), FRAC_CONST(0.062496396854751) } -}; - -/* 16 (N/4) complex twiddle factors */ -ALIGN static const complex_t mdct_tab_64[] = -{ - { FRAC_CONST(0.176763384336599), FRAC_CONST(0.002169321984356) }, - { FRAC_CONST(0.175699589589310), FRAC_CONST(0.019484717553714) }, - { FRAC_CONST(0.172943711747111), FRAC_CONST(0.036612464641599) }, - { FRAC_CONST(0.168522291420137), FRAC_CONST(0.053387613680577) }, - { FRAC_CONST(0.162477909303132), FRAC_CONST(0.069648610815172) }, - { FRAC_CONST(0.154868776100077), FRAC_CONST(0.085238853753814) }, - { FRAC_CONST(0.145768171923295), FRAC_CONST(0.100008199934509) }, - { FRAC_CONST(0.135263740565902), FRAC_CONST(0.113814412479792) }, - { FRAC_CONST(0.123456645444178), FRAC_CONST(0.126524530015608) }, - { FRAC_CONST(0.110460595338559), FRAC_CONST(0.138016147162030) }, - { FRAC_CONST(0.096400749315926), FRAC_CONST(0.148178593363981) }, - { FRAC_CONST(0.081412511379371), FRAC_CONST(0.156913998709178) }, - { FRAC_CONST(0.065640226453626), FRAC_CONST(0.164138236468888) }, - { FRAC_CONST(0.049235790264535), FRAC_CONST(0.169781733284316) }, - { FRAC_CONST(0.032357186500177), FRAC_CONST(0.173790139196080) }, - { FRAC_CONST(0.015166965341583), FRAC_CONST(0.176124851064031) } -}; -#endif // SSR_DEC - -#endif // FIXED_POINT - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/mp4.c b/src/libfaad/mp4.c deleted file mode 100644 index 651280805..000000000 --- a/src/libfaad/mp4.c +++ /dev/null @@ -1,299 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: mp4.c,v 1.9 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include <stdlib.h> - -#include "bits.h" -#include "mp4.h" -#include "syntax.h" - -/* defines if an object type can be decoded by this library or not */ -static uint8_t ObjectTypesTable[32] = { - 0, /* 0 NULL */ -#ifdef MAIN_DEC - 1, /* 1 AAC Main */ -#else - 0, /* 1 AAC Main */ -#endif - 1, /* 2 AAC LC */ -#ifdef SSR_DEC - 1, /* 3 AAC SSR */ -#else - 0, /* 3 AAC SSR */ -#endif -#ifdef LTP_DEC - 1, /* 4 AAC LTP */ -#else - 0, /* 4 AAC LTP */ -#endif -#ifdef SBR_DEC - 1, /* 5 SBR */ -#else - 0, /* 5 SBR */ -#endif -#ifdef SCALABLE_DEC - 1, /* 6 AAC Scalable */ -#else - 0, /* 6 AAC Scalable */ -#endif - 0, /* 7 TwinVQ */ - 0, /* 8 CELP */ - 0, /* 9 HVXC */ - 0, /* 10 Reserved */ - 0, /* 11 Reserved */ - 0, /* 12 TTSI */ - 0, /* 13 Main synthetic */ - 0, /* 14 Wavetable synthesis */ - 0, /* 15 General MIDI */ - 0, /* 16 Algorithmic Synthesis and Audio FX */ - - /* MPEG-4 Version 2 */ -#ifdef ERROR_RESILIENCE - 1, /* 17 ER AAC LC */ - 0, /* 18 (Reserved) */ -#ifdef LTP_DEC - 1, /* 19 ER AAC LTP */ -#else - 0, /* 19 ER AAC LTP */ -#endif -#ifdef SCALABLE_DEC - 1, /* 20 ER AAC scalable */ -#else - 0, /* 20 ER AAC scalable */ -#endif - 0, /* 21 ER TwinVQ */ - 0, /* 22 ER BSAC */ -#ifdef LD_DEC - 1, /* 23 ER AAC LD */ -#else - 0, /* 23 ER AAC LD */ -#endif - 0, /* 24 ER CELP */ - 0, /* 25 ER HVXC */ - 0, /* 26 ER HILN */ - 0, /* 27 ER Parametric */ -#else /* No ER defined */ - 0, /* 17 ER AAC LC */ - 0, /* 18 (Reserved) */ - 0, /* 19 ER AAC LTP */ - 0, /* 20 ER AAC scalable */ - 0, /* 21 ER TwinVQ */ - 0, /* 22 ER BSAC */ - 0, /* 23 ER AAC LD */ - 0, /* 24 ER CELP */ - 0, /* 25 ER HVXC */ - 0, /* 26 ER HILN */ - 0, /* 27 ER Parametric */ -#endif - 0, /* 28 (Reserved) */ - 0, /* 29 (Reserved) */ - 0, /* 30 (Reserved) */ - 0 /* 31 (Reserved) */ -}; - -/* Table 1.6.1 */ -int8_t NEAACDECAPI NeAACDecAudioSpecificConfig(uint8_t *pBuffer, - uint32_t buffer_size, - mp4AudioSpecificConfig *mp4ASC) -{ - return AudioSpecificConfig2(pBuffer, buffer_size, mp4ASC, NULL); -} - -int8_t AudioSpecificConfig2(uint8_t *pBuffer, - uint32_t buffer_size, - mp4AudioSpecificConfig *mp4ASC, - program_config *pce) -{ - bitfile ld; - int8_t result = 0; -#ifdef SBR_DEC - int8_t bits_to_decode = 0; -#endif - - if (pBuffer == NULL) - return -7; - if (mp4ASC == NULL) - return -8; - - memset(mp4ASC, 0, sizeof(mp4AudioSpecificConfig)); - - faad_initbits(&ld, pBuffer, buffer_size); - faad_byte_align(&ld); - - mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(&ld, 5 - DEBUGVAR(1,1,"parse_audio_decoder_specific_info(): ObjectTypeIndex")); - - mp4ASC->samplingFrequencyIndex = (uint8_t)faad_getbits(&ld, 4 - DEBUGVAR(1,2,"parse_audio_decoder_specific_info(): SamplingFrequencyIndex")); - - mp4ASC->channelsConfiguration = (uint8_t)faad_getbits(&ld, 4 - DEBUGVAR(1,3,"parse_audio_decoder_specific_info(): ChannelsConfiguration")); - - mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); - - if (ObjectTypesTable[mp4ASC->objectTypeIndex] != 1) - { - faad_endbits(&ld); - return -1; - } - - if (mp4ASC->samplingFrequency == 0) - { - faad_endbits(&ld); - return -2; - } - - if (mp4ASC->channelsConfiguration > 7) - { - faad_endbits(&ld); - return -3; - } - -#if (defined(PS_DEC) || defined(DRM_PS)) - /* check if we have a mono file */ - if (mp4ASC->channelsConfiguration == 1) - { - /* upMatrix to 2 channels for implicit signalling of PS */ - mp4ASC->channelsConfiguration = 2; - } -#endif - -#ifdef SBR_DEC - mp4ASC->sbr_present_flag = -1; - if (mp4ASC->objectTypeIndex == 5) - { - uint8_t tmp; - - mp4ASC->sbr_present_flag = 1; - tmp = (uint8_t)faad_getbits(&ld, 4 - DEBUGVAR(1,5,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); - /* check for downsampled SBR */ - if (tmp == mp4ASC->samplingFrequencyIndex) - mp4ASC->downSampledSBR = 1; - mp4ASC->samplingFrequencyIndex = tmp; - if (mp4ASC->samplingFrequencyIndex == 15) - { - mp4ASC->samplingFrequency = (uint32_t)faad_getbits(&ld, 24 - DEBUGVAR(1,6,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); - } else { - mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); - } - mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(&ld, 5 - DEBUGVAR(1,7,"parse_audio_decoder_specific_info(): ObjectTypeIndex")); - } -#endif - - /* get GASpecificConfig */ - if (mp4ASC->objectTypeIndex == 1 || mp4ASC->objectTypeIndex == 2 || - mp4ASC->objectTypeIndex == 3 || mp4ASC->objectTypeIndex == 4 || - mp4ASC->objectTypeIndex == 6 || mp4ASC->objectTypeIndex == 7) - { - result = GASpecificConfig(&ld, mp4ASC, pce); - -#ifdef ERROR_RESILIENCE - } else if (mp4ASC->objectTypeIndex >= ER_OBJECT_START) { /* ER */ - result = GASpecificConfig(&ld, mp4ASC, pce); - mp4ASC->epConfig = (uint8_t)faad_getbits(&ld, 2 - DEBUGVAR(1,143,"parse_audio_decoder_specific_info(): epConfig")); - - if (mp4ASC->epConfig != 0) - result = -5; -#endif - - } else { - result = -4; - } - -#ifdef SSR_DEC - /* shorter frames not allowed for SSR */ - if ((mp4ASC->objectTypeIndex == 4) && mp4ASC->frameLengthFlag) - return -6; -#endif - - -#ifdef SBR_DEC - bits_to_decode = (int8_t)(buffer_size*8 - faad_get_processed_bits(&ld)); - - if ((mp4ASC->objectTypeIndex != 5) && (bits_to_decode >= 16)) - { - int16_t syncExtensionType = (int16_t)faad_getbits(&ld, 11 - DEBUGVAR(1,9,"parse_audio_decoder_specific_info(): syncExtensionType")); - - if (syncExtensionType == 0x2b7) - { - mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(&ld, 5 - DEBUGVAR(1,10,"parse_audio_decoder_specific_info(): extensionAudioObjectType")); - - if (mp4ASC->objectTypeIndex == 5) - { - mp4ASC->sbr_present_flag = (uint8_t)faad_get1bit(&ld - DEBUGVAR(1,11,"parse_audio_decoder_specific_info(): sbr_present_flag")); - - if (mp4ASC->sbr_present_flag) - { - uint8_t tmp; - tmp = (uint8_t)faad_getbits(&ld, 4 - DEBUGVAR(1,12,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); - - /* check for downsampled SBR */ - if (tmp == mp4ASC->samplingFrequencyIndex) - mp4ASC->downSampledSBR = 1; - mp4ASC->samplingFrequencyIndex = tmp; - - if (mp4ASC->samplingFrequencyIndex == 15) - { - mp4ASC->samplingFrequency = (uint32_t)faad_getbits(&ld, 24 - DEBUGVAR(1,13,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); - } else { - mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); - } - } - } - } - } - - /* no SBR signalled, this could mean either implicit signalling or no SBR in this file */ - /* MPEG specification states: assume SBR on files with samplerate <= 24000 Hz */ - if (mp4ASC->sbr_present_flag == -1) - { - if (mp4ASC->samplingFrequency <= 24000) - { - mp4ASC->samplingFrequency *= 2; - mp4ASC->forceUpSampling = 1; - } else /* > 24000*/ { - mp4ASC->downSampledSBR = 1; - } - } -#endif - - faad_endbits(&ld); - - return result; -} diff --git a/src/libfaad/mp4.h b/src/libfaad/mp4.h deleted file mode 100644 index 478c9b9be..000000000 --- a/src/libfaad/mp4.h +++ /dev/null @@ -1,49 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: mp4.h,v 1.8 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __MP4_H__ -#define __MP4_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "decoder.h" - -int8_t NEAACDECAPI NeAACDecAudioSpecificConfig(uint8_t *pBuffer, - uint32_t buffer_size, - mp4AudioSpecificConfig *mp4ASC); - -int8_t AudioSpecificConfig2(uint8_t *pBuffer, - uint32_t buffer_size, - mp4AudioSpecificConfig *mp4ASC, - program_config *pce); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/ms.c b/src/libfaad/ms.c deleted file mode 100644 index 93b0a2051..000000000 --- a/src/libfaad/ms.c +++ /dev/null @@ -1,74 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: ms.c,v 1.7 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include "syntax.h" -#include "ms.h" -#include "is.h" -#include "pns.h" - -void ms_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, - uint16_t frame_len) -{ - uint8_t g, b, sfb; - uint8_t group = 0; - uint16_t nshort = frame_len/8; - - uint16_t i, k; - real_t tmp; - - if (ics->ms_mask_present >= 1) - { - for (g = 0; g < ics->num_window_groups; g++) - { - for (b = 0; b < ics->window_group_length[g]; b++) - { - for (sfb = 0; sfb < ics->max_sfb; sfb++) - { - /* If intensity stereo coding or noise substitution is on - for a particular scalefactor band, no M/S stereo decoding - is carried out. - */ - if ((ics->ms_used[g][sfb] || ics->ms_mask_present == 2) && - !is_intensity(icsr, g, sfb) && !is_noise(ics, g, sfb)) - { - for (i = ics->swb_offset[sfb]; i < ics->swb_offset[sfb+1]; i++) - { - k = (group*nshort) + i; - tmp = l_spec[k] - r_spec[k]; - l_spec[k] = l_spec[k] + r_spec[k]; - r_spec[k] = tmp; - } - } - } - group++; - } - } - } -} diff --git a/src/libfaad/ms.h b/src/libfaad/ms.h deleted file mode 100644 index 4bc7c8175..000000000 --- a/src/libfaad/ms.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: ms.h,v 1.7 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __MS_H__ -#define __MS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -void ms_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, - uint16_t frame_len); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/output.c b/src/libfaad/output.c deleted file mode 100644 index 33ebed39c..000000000 --- a/src/libfaad/output.c +++ /dev/null @@ -1,609 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: output.c,v 1.9 2006/06/30 21:36:27 dgp85 Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include "output.h" -#include "decoder.h" - -#ifndef FIXED_POINT - - -#define FLOAT_SCALE (1.0f/(1<<15)) - -#define DM_MUL REAL_CONST(0.3203772410170407) // 1/(1+sqrt(2) + 1/sqrt(2)) -#define RSQRT2 REAL_CONST(0.7071067811865475244) // 1/sqrt(2) - - -static INLINE real_t get_sample(real_t **input, uint8_t channel, uint16_t sample, - uint8_t down_matrix, uint8_t *internal_channel) -{ - if (!down_matrix) - return input[internal_channel[channel]][sample]; - - if (channel == 0) - { - return DM_MUL * (input[internal_channel[1]][sample] + - input[internal_channel[0]][sample] * RSQRT2 + - input[internal_channel[3]][sample] * RSQRT2); - } else { - return DM_MUL * (input[internal_channel[2]][sample] + - input[internal_channel[0]][sample] * RSQRT2 + - input[internal_channel[4]][sample] * RSQRT2); - } -} - -#ifndef HAS_LRINTF -#define CLIP(sample, max, min) \ -if (sample >= 0.0f) \ -{ \ - sample += 0.5f; \ - if (sample >= max) \ - sample = max; \ -} else { \ - sample += -0.5f; \ - if (sample <= min) \ - sample = min; \ -} -#else -#define CLIP(sample, max, min) \ -if (sample >= 0.0f) \ -{ \ - if (sample >= max) \ - sample = max; \ -} else { \ - if (sample <= min) \ - sample = min; \ -} -#endif - -#define CONV(a,b) ((a<<1)|(b&0x1)) - -static void to_PCM_16bit(NeAACDecHandle hDecoder, real_t **input, - uint8_t channels, uint16_t frame_len, - int16_t **sample_buffer) -{ - uint8_t ch, ch1; - uint16_t i; - - switch (CONV(channels,hDecoder->downMatrix)) - { - case CONV(1,0): - case CONV(1,1): - for(i = 0; i < frame_len; i++) - { - real_t inp = input[hDecoder->internal_channel[0]][i]; - - CLIP(inp, 32767.0f, -32768.0f); - - (*sample_buffer)[i] = (int16_t)lrintf(inp); - } - break; - case CONV(2,0): - if (hDecoder->upMatrix) - { - ch = hDecoder->internal_channel[0]; - for(i = 0; i < frame_len; i++) - { - real_t inp0 = input[ch][i]; - - CLIP(inp0, 32767.0f, -32768.0f); - - (*sample_buffer)[(i*2)+0] = (int16_t)lrintf(inp0); - (*sample_buffer)[(i*2)+1] = (int16_t)lrintf(inp0); - } - } else { - ch = hDecoder->internal_channel[0]; - ch1 = hDecoder->internal_channel[1]; - for(i = 0; i < frame_len; i++) - { - real_t inp0 = input[ch ][i]; - real_t inp1 = input[ch1][i]; - - CLIP(inp0, 32767.0f, -32768.0f); - CLIP(inp1, 32767.0f, -32768.0f); - - (*sample_buffer)[(i*2)+0] = (int16_t)lrintf(inp0); - (*sample_buffer)[(i*2)+1] = (int16_t)lrintf(inp1); - } - } - break; - default: - for (ch = 0; ch < channels; ch++) - { - for(i = 0; i < frame_len; i++) - { - real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); - - CLIP(inp, 32767.0f, -32768.0f); - - (*sample_buffer)[(i*channels)+ch] = (int16_t)lrintf(inp); - } - } - break; - } -} - -static void to_PCM_24bit(NeAACDecHandle hDecoder, real_t **input, - uint8_t channels, uint16_t frame_len, - int32_t **sample_buffer) -{ - uint8_t ch, ch1; - uint16_t i; - - switch (CONV(channels,hDecoder->downMatrix)) - { - case CONV(1,0): - case CONV(1,1): - for(i = 0; i < frame_len; i++) - { - real_t inp = input[hDecoder->internal_channel[0]][i]; - - inp *= 256.0f; - CLIP(inp, 8388607.0f, -8388608.0f); - - (*sample_buffer)[i] = (int32_t)lrintf(inp); - } - break; - case CONV(2,0): - if (hDecoder->upMatrix) - { - ch = hDecoder->internal_channel[0]; - for(i = 0; i < frame_len; i++) - { - real_t inp0 = input[ch][i]; - - inp0 *= 256.0f; - CLIP(inp0, 8388607.0f, -8388608.0f); - - (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); - (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp0); - } - } else { - ch = hDecoder->internal_channel[0]; - ch1 = hDecoder->internal_channel[1]; - for(i = 0; i < frame_len; i++) - { - real_t inp0 = input[ch ][i]; - real_t inp1 = input[ch1][i]; - - inp0 *= 256.0f; - inp1 *= 256.0f; - CLIP(inp0, 8388607.0f, -8388608.0f); - CLIP(inp1, 8388607.0f, -8388608.0f); - - (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); - (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp1); - } - } - break; - default: - for (ch = 0; ch < channels; ch++) - { - for(i = 0; i < frame_len; i++) - { - real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); - - inp *= 256.0f; - CLIP(inp, 8388607.0f, -8388608.0f); - - (*sample_buffer)[(i*channels)+ch] = (int32_t)lrintf(inp); - } - } - break; - } -} - -static void to_PCM_32bit(NeAACDecHandle hDecoder, real_t **input, - uint8_t channels, uint16_t frame_len, - int32_t **sample_buffer) -{ - uint8_t ch, ch1; - uint16_t i; - - switch (CONV(channels,hDecoder->downMatrix)) - { - case CONV(1,0): - case CONV(1,1): - for(i = 0; i < frame_len; i++) - { - real_t inp = input[hDecoder->internal_channel[0]][i]; - - inp *= 65536.0f; - CLIP(inp, 2147483647.0f, -2147483648.0f); - - (*sample_buffer)[i] = (int32_t)lrintf(inp); - } - break; - case CONV(2,0): - if (hDecoder->upMatrix) - { - ch = hDecoder->internal_channel[0]; - for(i = 0; i < frame_len; i++) - { - real_t inp0 = input[ch][i]; - - inp0 *= 65536.0f; - CLIP(inp0, 2147483647.0f, -2147483648.0f); - - (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); - (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp0); - } - } else { - ch = hDecoder->internal_channel[0]; - ch1 = hDecoder->internal_channel[1]; - for(i = 0; i < frame_len; i++) - { - real_t inp0 = input[ch ][i]; - real_t inp1 = input[ch1][i]; - - inp0 *= 65536.0f; - inp1 *= 65536.0f; - CLIP(inp0, 2147483647.0f, -2147483648.0f); - CLIP(inp1, 2147483647.0f, -2147483648.0f); - - (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); - (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp1); - } - } - break; - default: - for (ch = 0; ch < channels; ch++) - { - for(i = 0; i < frame_len; i++) - { - real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); - - inp *= 65536.0f; - CLIP(inp, 2147483647.0f, -2147483648.0f); - - (*sample_buffer)[(i*channels)+ch] = (int32_t)lrintf(inp); - } - } - break; - } -} - -static void to_PCM_float(NeAACDecHandle hDecoder, real_t **input, - uint8_t channels, uint16_t frame_len, - float32_t **sample_buffer) -{ - uint8_t ch, ch1; - uint16_t i; - - switch (CONV(channels,hDecoder->downMatrix)) - { - case CONV(1,0): - case CONV(1,1): - for(i = 0; i < frame_len; i++) - { - real_t inp = input[hDecoder->internal_channel[0]][i]; - (*sample_buffer)[i] = inp*FLOAT_SCALE; - } - break; - case CONV(2,0): - if (hDecoder->upMatrix) - { - ch = hDecoder->internal_channel[0]; - for(i = 0; i < frame_len; i++) - { - real_t inp0 = input[ch][i]; - (*sample_buffer)[(i*2)+0] = inp0*FLOAT_SCALE; - (*sample_buffer)[(i*2)+1] = inp0*FLOAT_SCALE; - } - } else { - ch = hDecoder->internal_channel[0]; - ch1 = hDecoder->internal_channel[1]; - for(i = 0; i < frame_len; i++) - { - real_t inp0 = input[ch ][i]; - real_t inp1 = input[ch1][i]; - (*sample_buffer)[(i*2)+0] = inp0*FLOAT_SCALE; - (*sample_buffer)[(i*2)+1] = inp1*FLOAT_SCALE; - } - } - break; - default: - for (ch = 0; ch < channels; ch++) - { - for(i = 0; i < frame_len; i++) - { - real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); - (*sample_buffer)[(i*channels)+ch] = inp*FLOAT_SCALE; - } - } - break; - } -} - -static void to_PCM_double(NeAACDecHandle hDecoder, real_t **input, - uint8_t channels, uint16_t frame_len, - double **sample_buffer) -{ - uint8_t ch, ch1; - uint16_t i; - - switch (CONV(channels,hDecoder->downMatrix)) - { - case CONV(1,0): - case CONV(1,1): - for(i = 0; i < frame_len; i++) - { - real_t inp = input[hDecoder->internal_channel[0]][i]; - (*sample_buffer)[i] = (double)inp*FLOAT_SCALE; - } - break; - case CONV(2,0): - if (hDecoder->upMatrix) - { - ch = hDecoder->internal_channel[0]; - for(i = 0; i < frame_len; i++) - { - real_t inp0 = input[ch][i]; - (*sample_buffer)[(i*2)+0] = (double)inp0*FLOAT_SCALE; - (*sample_buffer)[(i*2)+1] = (double)inp0*FLOAT_SCALE; - } - } else { - ch = hDecoder->internal_channel[0]; - ch1 = hDecoder->internal_channel[1]; - for(i = 0; i < frame_len; i++) - { - real_t inp0 = input[ch ][i]; - real_t inp1 = input[ch1][i]; - (*sample_buffer)[(i*2)+0] = (double)inp0*FLOAT_SCALE; - (*sample_buffer)[(i*2)+1] = (double)inp1*FLOAT_SCALE; - } - } - break; - default: - for (ch = 0; ch < channels; ch++) - { - for(i = 0; i < frame_len; i++) - { - real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); - (*sample_buffer)[(i*channels)+ch] = (double)inp*FLOAT_SCALE; - } - } - break; - } -} - -void *output_to_PCM(NeAACDecHandle hDecoder, - real_t **input, void *sample_buffer, uint8_t channels, - uint16_t frame_len, uint8_t format) -{ - int16_t *short_sample_buffer = (int16_t*)sample_buffer; - int32_t *int_sample_buffer = (int32_t*)sample_buffer; - float32_t *float_sample_buffer = (float32_t*)sample_buffer; - double *double_sample_buffer = (double*)sample_buffer; - -#ifdef PROFILE - int64_t count = faad_get_ts(); -#endif - - /* Copy output to a standard PCM buffer */ - switch (format) - { - case FAAD_FMT_16BIT: - to_PCM_16bit(hDecoder, input, channels, frame_len, &short_sample_buffer); - break; - case FAAD_FMT_24BIT: - to_PCM_24bit(hDecoder, input, channels, frame_len, &int_sample_buffer); - break; - case FAAD_FMT_32BIT: - to_PCM_32bit(hDecoder, input, channels, frame_len, &int_sample_buffer); - break; - case FAAD_FMT_FLOAT: - to_PCM_float(hDecoder, input, channels, frame_len, &float_sample_buffer); - break; - case FAAD_FMT_DOUBLE: - to_PCM_double(hDecoder, input, channels, frame_len, &double_sample_buffer); - break; - } - -#ifdef PROFILE - count = faad_get_ts() - count; - hDecoder->output_cycles += count; -#endif - - return sample_buffer; -} - -#else - -#define DM_MUL FRAC_CONST(0.3203772410170407) // 1/(1+sqrt(2) + 1/sqrt(2)) -#define RSQRT2 FRAC_CONST(0.7071067811865475244) // 1/sqrt(2) - -static INLINE real_t get_sample(real_t **input, uint8_t channel, uint16_t sample, - uint8_t down_matrix, uint8_t up_matrix, - uint8_t *internal_channel) -{ - if (up_matrix == 1) - return input[internal_channel[0]][sample]; - - if (!down_matrix) - return input[internal_channel[channel]][sample]; - - if (channel == 0) - { - real_t C = MUL_F(input[internal_channel[0]][sample], RSQRT2); - real_t L_S = MUL_F(input[internal_channel[3]][sample], RSQRT2); - real_t cum = input[internal_channel[1]][sample] + C + L_S; - return MUL_F(cum, DM_MUL); - } else { - real_t C = MUL_F(input[internal_channel[0]][sample], RSQRT2); - real_t R_S = MUL_F(input[internal_channel[4]][sample], RSQRT2); - real_t cum = input[internal_channel[2]][sample] + C + R_S; - return MUL_F(cum, DM_MUL); - } -} - -static void* output_to_PCM_orig(NeAACDecHandle hDecoder, - real_t **input, void *sample_buffer, uint8_t channels, - uint16_t frame_len, uint8_t format) -{ - uint8_t ch; - uint16_t i; - int16_t *short_sample_buffer = (int16_t*)sample_buffer; - int32_t *int_sample_buffer = (int32_t*)sample_buffer; - - /* Copy output to a standard PCM buffer */ - for (ch = 0; ch < channels; ch++) - { - switch (format) - { - case FAAD_FMT_16BIT: - for(i = 0; i < frame_len; i++) - { - int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, - hDecoder->internal_channel); - if (tmp >= 0) - { - tmp += (1 << (REAL_BITS-1)); - if (tmp >= REAL_CONST(32767)) - { - tmp = REAL_CONST(32767); - } - } else { - tmp += -(1 << (REAL_BITS-1)); - if (tmp <= REAL_CONST(-32768)) - { - tmp = REAL_CONST(-32768); - } - } - tmp >>= REAL_BITS; - short_sample_buffer[(i*channels)+ch] = (int16_t)tmp; - } - break; - case FAAD_FMT_24BIT: - for(i = 0; i < frame_len; i++) - { - int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, - hDecoder->internal_channel); - if (tmp >= 0) - { - tmp += (1 << (REAL_BITS-9)); - tmp >>= (REAL_BITS-8); - if (tmp >= 8388607) - { - tmp = 8388607; - } - } else { - tmp += -(1 << (REAL_BITS-9)); - tmp >>= (REAL_BITS-8); - if (tmp <= -8388608) - { - tmp = -8388608; - } - } - int_sample_buffer[(i*channels)+ch] = (int32_t)tmp; - } - break; - case FAAD_FMT_32BIT: - for(i = 0; i < frame_len; i++) - { - int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, - hDecoder->internal_channel); - if (tmp >= 0) - { - tmp += (1 << (16-REAL_BITS-1)); - tmp <<= (16-REAL_BITS); - } else { - tmp += -(1 << (16-REAL_BITS-1)); - tmp <<= (16-REAL_BITS); - } - int_sample_buffer[(i*channels)+ch] = (int32_t)tmp; - } - break; - case FAAD_FMT_FIXED: - for(i = 0; i < frame_len; i++) - { - real_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, - hDecoder->internal_channel); - int_sample_buffer[(i*channels)+ch] = (int32_t)tmp; - } - break; - } - } - - return sample_buffer; -} - -void *output_to_PCM(NeAACDecHandle hDecoder, - real_t **input, void *sample_buffer, uint8_t channels, - uint16_t frame_len, uint8_t format) -{ - int ch, i; - int16_t *short_sample_buffer; - real_t *ch0, *ch1, *ch2, *ch3, *ch4; - - if (format != FAAD_FMT_16BIT) - return output_to_PCM_orig(hDecoder, input, sample_buffer, channels, frame_len, format); - - short_sample_buffer = (int16_t *)sample_buffer; - ch0 = input[hDecoder->internal_channel[0]]; - ch1 = input[hDecoder->internal_channel[1]]; - ch2 = input[hDecoder->internal_channel[2]]; - ch3 = input[hDecoder->internal_channel[3]]; - ch4 = input[hDecoder->internal_channel[4]]; - - if (hDecoder->downMatrix) - { - for (i = 0; i < frame_len; ++i) - { - int32_t tmp = (ch1[i] + ((ch0[i] + ch3[i]) >> 1) + ((ch0[i] + ch3[i]) >> 2) + (1 << (REAL_BITS))) >> (REAL_BITS + 1); - if ((tmp + 0x8000) & ~0xffff) - tmp = ~(tmp >> 31) - 0x8000; - short_sample_buffer[0] = tmp; - tmp = (ch2[i] + ((ch0[i] + ch4[i]) >> 1) + ((ch0[i] + ch4[i]) >> 2) + (1 << (REAL_BITS))) >> (REAL_BITS + 1); - if ((tmp + 0x8000) & ~0xffff) - tmp = ~(tmp >> 31) - 0x8000; - short_sample_buffer[1] = tmp; - short_sample_buffer += channels; - } - return sample_buffer; - } - - /* Copy output to a standard PCM buffer */ - for (i = 0; i < frame_len; ++i) - { - for (ch = 0; ch < channels; ++ch) - { - int32_t tmp = input[hDecoder->internal_channel[ch]][i]; - tmp += (1 << (REAL_BITS - 1)); - tmp >>= REAL_BITS; - if ((tmp + 0x8000) & ~0xffff) - tmp = ~(tmp >> 31) - 0x8000; - *(short_sample_buffer++) = tmp; - } - } - - return sample_buffer; -} - -#endif diff --git a/src/libfaad/output.h b/src/libfaad/output.h deleted file mode 100644 index 1b15dae58..000000000 --- a/src/libfaad/output.h +++ /dev/null @@ -1,45 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: output.h,v 1.7 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __OUTPUT_H__ -#define __OUTPUT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -void* output_to_PCM(NeAACDecHandle hDecoder, - real_t **input, - void *samplebuffer, - uint8_t channels, - uint16_t frame_len, - uint8_t format); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/pns.c b/src/libfaad/pns.c deleted file mode 100644 index 5266d8eef..000000000 --- a/src/libfaad/pns.c +++ /dev/null @@ -1,265 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: pns.c,v 1.8 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include "pns.h" - - -/* static function declarations */ -static void gen_rand_vector(real_t *spec, int16_t scale_factor, uint16_t size, - uint8_t sub); - - -#ifdef FIXED_POINT - -#define DIV(A, B) (((int64_t)A << REAL_BITS)/B) - -#define step(shift) \ - if ((0x40000000l >> shift) + root <= value) \ - { \ - value -= (0x40000000l >> shift) + root; \ - root = (root >> 1) | (0x40000000l >> shift); \ - } else { \ - root = root >> 1; \ - } - -/* fixed point square root approximation */ -/* !!!! ONLY WORKS FOR EVEN %REAL_BITS% !!!! */ -real_t fp_sqrt(real_t value) -{ - real_t root = 0; - - step( 0); step( 2); step( 4); step( 6); - step( 8); step(10); step(12); step(14); - step(16); step(18); step(20); step(22); - step(24); step(26); step(28); step(30); - - if (root < value) - ++root; - - root <<= (REAL_BITS/2); - - return root; -} - -static real_t pow2_table[] = -{ - COEF_CONST(1.0), - COEF_CONST(1.18920711500272), - COEF_CONST(1.41421356237310), - COEF_CONST(1.68179283050743) -}; -#endif - -/* The function gen_rand_vector(addr, size) generates a vector of length - <size> with signed random values of average energy MEAN_NRG per random - value. A suitable random number generator can be realized using one - multiplication/accumulation per random value. -*/ -static INLINE void gen_rand_vector(real_t *spec, int16_t scale_factor, uint16_t size, - uint8_t sub) -{ -#ifndef FIXED_POINT - uint16_t i; - real_t energy = 0.0; - - real_t scale = (real_t)1.0/(real_t)size; - - for (i = 0; i < size; i++) - { - real_t tmp = scale*(real_t)(int32_t)random_int(); - spec[i] = tmp; - energy += tmp*tmp; - } - - scale = (real_t)1.0/(real_t)sqrt(energy); - scale *= (real_t)pow(2.0, 0.25 * scale_factor); - for (i = 0; i < size; i++) - { - spec[i] *= scale; - } -#else - uint16_t i; - real_t energy = 0, scale; - int32_t exp, frac; - - for (i = 0; i < size; i++) - { - /* this can be replaced by a 16 bit random generator!!!! */ - real_t tmp = (int32_t)random_int(); - if (tmp < 0) - tmp = -(tmp & ((1<<(REAL_BITS-1))-1)); - else - tmp = (tmp & ((1<<(REAL_BITS-1))-1)); - - energy += MUL_R(tmp,tmp); - - spec[i] = tmp; - } - - energy = fp_sqrt(energy); - if (energy > 0) - { - scale = DIV(REAL_CONST(1),energy); - - exp = scale_factor >> 2; - frac = scale_factor & 3; - - /* IMDCT pre-scaling */ - exp -= sub; - - if (exp < 0) - scale >>= -exp; - else - scale <<= exp; - - if (frac) - scale = MUL_C(scale, pow2_table[frac]); - - for (i = 0; i < size; i++) - { - spec[i] = MUL_R(spec[i], scale); - } - } -#endif -} - -void pns_decode(ic_stream *ics_left, ic_stream *ics_right, - real_t *spec_left, real_t *spec_right, uint16_t frame_len, - uint8_t channel_pair, uint8_t object_type) -{ - uint8_t g, sfb, b; - uint16_t size, offs; - - uint8_t group = 0; - uint16_t nshort = frame_len >> 3; - - uint8_t sub = 0; - -#ifdef FIXED_POINT - /* IMDCT scaling */ - if (object_type == LD) - { - sub = 9 /*9*/; - } else { - if (ics_left->window_sequence == EIGHT_SHORT_SEQUENCE) - sub = 7 /*7*/; - else - sub = 10 /*10*/; - } -#endif - - for (g = 0; g < ics_left->num_window_groups; g++) - { - /* Do perceptual noise substitution decoding */ - for (b = 0; b < ics_left->window_group_length[g]; b++) - { - for (sfb = 0; sfb < ics_left->max_sfb; sfb++) - { - if (is_noise(ics_left, g, sfb)) - { -#ifdef LTP_DEC - /* Simultaneous use of LTP and PNS is not prevented in the - syntax. If both LTP, and PNS are enabled on the same - scalefactor band, PNS takes precedence, and no prediction - is applied to this band. - */ - ics_left->ltp.long_used[sfb] = 0; - ics_left->ltp2.long_used[sfb] = 0; -#endif - -#ifdef MAIN_DEC - /* For scalefactor bands coded using PNS the corresponding - predictors are switched to "off". - */ - ics_left->pred.prediction_used[sfb] = 0; -#endif - - offs = ics_left->swb_offset[sfb]; - size = ics_left->swb_offset[sfb+1] - offs; - - /* Generate random vector */ - gen_rand_vector(&spec_left[(group*nshort)+offs], - ics_left->scale_factors[g][sfb], size, sub); - } - -/* From the spec: - If the same scalefactor band and group is coded by perceptual noise - substitution in both channels of a channel pair, the correlation of - the noise signal can be controlled by means of the ms_used field: While - the default noise generation process works independently for each channel - (separate generation of random vectors), the same random vector is used - for both channels if ms_used[] is set for a particular scalefactor band - and group. In this case, no M/S stereo coding is carried out (because M/S - stereo coding and noise substitution coding are mutually exclusive). - If the same scalefactor band and group is coded by perceptual noise - substitution in only one channel of a channel pair the setting of ms_used[] - is not evaluated. -*/ - if (channel_pair) - { - if (is_noise(ics_right, g, sfb)) - { - if (((ics_left->ms_mask_present == 1) && - (ics_left->ms_used[g][sfb])) || - (ics_left->ms_mask_present == 2)) - { - uint16_t c; - - offs = ics_right->swb_offset[sfb]; - size = ics_right->swb_offset[sfb+1] - offs; - - for (c = 0; c < size; c++) - { - spec_right[(group*nshort) + offs + c] = - spec_left[(group*nshort) + offs + c]; - } - } else /*if (ics_left->ms_mask_present == 0)*/ { -#ifdef LTP_DEC - ics_right->ltp.long_used[sfb] = 0; - ics_right->ltp2.long_used[sfb] = 0; -#endif -#ifdef MAIN_DEC - ics_right->pred.prediction_used[sfb] = 0; -#endif - - offs = ics_right->swb_offset[sfb]; - size = ics_right->swb_offset[sfb+1] - offs; - - /* Generate random vector */ - gen_rand_vector(&spec_right[(group*nshort)+offs], - ics_right->scale_factors[g][sfb], size, sub); - } - } - } - } /* sfb */ - group++; - } /* b */ - } /* g */ -} diff --git a/src/libfaad/pns.h b/src/libfaad/pns.h deleted file mode 100644 index 2f246cc4f..000000000 --- a/src/libfaad/pns.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: pns.h,v 1.7 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __PNS_H__ -#define __PNS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "syntax.h" - -#define NOISE_OFFSET 90 - -void pns_decode(ic_stream *ics_left, ic_stream *ics_right, - real_t *spec_left, real_t *spec_right, uint16_t frame_len, - uint8_t channel_pair, uint8_t object_type); - -static INLINE uint8_t is_noise(ic_stream *ics, uint8_t group, uint8_t sfb) -{ - if (ics->sfb_cb[group][sfb] == NOISE_HCB) - return 1; - return 0; -} - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/ps_dec.c b/src/libfaad/ps_dec.c deleted file mode 100644 index 3b957bfda..000000000 --- a/src/libfaad/ps_dec.c +++ /dev/null @@ -1,1977 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR and PS decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: ps_dec.c,v 1.3 2006/09/26 17:55:59 dgp85 Exp $ -**/ - -#include "common.h" - -#ifdef PS_DEC - -#include <stdlib.h> -#include "ps_dec.h" -#include "ps_tables.h" - -/* constants */ -#define NEGATE_IPD_MASK (0x1000) -#define DECAY_SLOPE FRAC_CONST(0.05) -#define COEF_SQRT2 COEF_CONST(1.4142135623731) - -/* tables */ -/* filters are mirrored in coef 6, second half left out */ -static const real_t p8_13_20[7] = -{ - FRAC_CONST(0.00746082949812), - FRAC_CONST(0.02270420949825), - FRAC_CONST(0.04546865930473), - FRAC_CONST(0.07266113929591), - FRAC_CONST(0.09885108575264), - FRAC_CONST(0.11793710567217), - FRAC_CONST(0.125) -}; - -static const real_t p2_13_20[7] = -{ - FRAC_CONST(0.0), - FRAC_CONST(0.01899487526049), - FRAC_CONST(0.0), - FRAC_CONST(-0.07293139167538), - FRAC_CONST(0.0), - FRAC_CONST(0.30596630545168), - FRAC_CONST(0.5) -}; - -static const real_t p12_13_34[7] = -{ - FRAC_CONST(0.04081179924692), - FRAC_CONST(0.03812810994926), - FRAC_CONST(0.05144908135699), - FRAC_CONST(0.06399831151592), - FRAC_CONST(0.07428313801106), - FRAC_CONST(0.08100347892914), - FRAC_CONST(0.08333333333333) -}; - -static const real_t p8_13_34[7] = -{ - FRAC_CONST(0.01565675600122), - FRAC_CONST(0.03752716391991), - FRAC_CONST(0.05417891378782), - FRAC_CONST(0.08417044116767), - FRAC_CONST(0.10307344158036), - FRAC_CONST(0.12222452249753), - FRAC_CONST(0.125) -}; - -static const real_t p4_13_34[7] = -{ - FRAC_CONST(-0.05908211155639), - FRAC_CONST(-0.04871498374946), - FRAC_CONST(0.0), - FRAC_CONST(0.07778723915851), - FRAC_CONST(0.16486303567403), - FRAC_CONST(0.23279856662996), - FRAC_CONST(0.25) -}; - -#ifdef PARAM_32KHZ -static const uint8_t delay_length_d[2][NO_ALLPASS_LINKS] = { - { 1, 2, 3 } /* d_24kHz */, - { 3, 4, 5 } /* d_48kHz */ -}; -#else -static const uint8_t delay_length_d[NO_ALLPASS_LINKS] = { - 3, 4, 5 /* d_48kHz */ -}; -#endif -static const real_t filter_a[NO_ALLPASS_LINKS] = { /* a(m) = exp(-d_48kHz(m)/7) */ - FRAC_CONST(0.65143905753106), - FRAC_CONST(0.56471812200776), - FRAC_CONST(0.48954165955695) -}; - -static const uint8_t group_border20[10+12 + 1] = -{ - 6, 7, 0, 1, 2, 3, /* 6 subqmf subbands */ - 9, 8, /* 2 subqmf subbands */ - 10, 11, /* 2 subqmf subbands */ - 3, 4, 5, 6, 7, 8, 9, 11, 14, 18, 23, 35, 64 -}; - -static const uint8_t group_border34[32+18 + 1] = -{ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, /* 12 subqmf subbands */ - 12, 13, 14, 15, 16, 17, 18, 19, /* 8 subqmf subbands */ - 20, 21, 22, 23, /* 4 subqmf subbands */ - 24, 25, 26, 27, /* 4 subqmf subbands */ - 28, 29, 30, 31, /* 4 subqmf subbands */ - 32-27, 33-27, 34-27, 35-27, 36-27, 37-27, 38-27, 40-27, 42-27, 44-27, 46-27, 48-27, 51-27, 54-27, 57-27, 60-27, 64-27, 68-27, 91-27 -}; - -static const uint16_t map_group2bk20[10+12] = -{ - (NEGATE_IPD_MASK | 1), (NEGATE_IPD_MASK | 0), - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 -}; - -static const uint16_t map_group2bk34[32+18] = -{ - 0, 1, 2, 3, 4, 5, 6, 6, 7, (NEGATE_IPD_MASK | 2), (NEGATE_IPD_MASK | 1), (NEGATE_IPD_MASK | 0), - 10, 10, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 9, - 14, 11, 12, 13, - 14, 15, 16, 13, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33 -}; - -/* type definitions */ -typedef struct -{ - uint8_t frame_len; - uint8_t resolution20[3]; - uint8_t resolution34[5]; - - qmf_t *work; - qmf_t **buffer; - qmf_t **temp; -} hyb_info; - -/* static function declarations */ -static void ps_data_decode(ps_info *ps); -static hyb_info *hybrid_init(void); -static void channel_filter2(hyb_info *hyb, uint8_t frame_len, const real_t *filter, - qmf_t *buffer, qmf_t **X_hybrid); -static void INLINE DCT3_4_unscaled(real_t *y, real_t *x); -static void channel_filter8(hyb_info *hyb, uint8_t frame_len, const real_t *filter, - qmf_t *buffer, qmf_t **X_hybrid); -static void hybrid_analysis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], - uint8_t use34); -static void hybrid_synthesis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], - uint8_t use34); -static int8_t delta_clip(int8_t i, int8_t min, int8_t max); -static void delta_decode(uint8_t enable, int8_t *index, int8_t *index_prev, - uint8_t dt_flag, uint8_t nr_par, uint8_t stride, - int8_t min_index, int8_t max_index); -static void delta_modulo_decode(uint8_t enable, int8_t *index, int8_t *index_prev, - uint8_t dt_flag, uint8_t nr_par, uint8_t stride, - int8_t log2modulo); -static void map20indexto34(int8_t *index, uint8_t bins); -#ifdef PS_LOW_POWER -static void map34indexto20(int8_t *index, uint8_t bins); -#endif -static void ps_data_decode(ps_info *ps); -static void ps_decorrelate(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], - qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]); -static void ps_mix_phase(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], - qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]); - -/* */ - - -static hyb_info *hybrid_init(void) -{ - uint8_t i; - - hyb_info *hyb = (hyb_info*)faad_malloc(sizeof(hyb_info)); - - hyb->resolution34[0] = 12; - hyb->resolution34[1] = 8; - hyb->resolution34[2] = 4; - hyb->resolution34[3] = 4; - hyb->resolution34[4] = 4; - - hyb->resolution20[0] = 8; - hyb->resolution20[1] = 2; - hyb->resolution20[2] = 2; - - hyb->frame_len = 32; - - hyb->work = (qmf_t*)faad_malloc((hyb->frame_len+12) * sizeof(qmf_t)); - memset(hyb->work, 0, (hyb->frame_len+12) * sizeof(qmf_t)); - - hyb->buffer = (qmf_t**)faad_malloc(5 * sizeof(qmf_t*)); - for (i = 0; i < 5; i++) - { - hyb->buffer[i] = (qmf_t*)faad_malloc(hyb->frame_len * sizeof(qmf_t)); - memset(hyb->buffer[i], 0, hyb->frame_len * sizeof(qmf_t)); - } - - hyb->temp = (qmf_t**)faad_malloc(hyb->frame_len * sizeof(qmf_t*)); - for (i = 0; i < hyb->frame_len; i++) - { - hyb->temp[i] = (qmf_t*)faad_malloc(12 /*max*/ * sizeof(qmf_t)); - } - - return hyb; -} - -static void hybrid_free(hyb_info *hyb) -{ - uint8_t i; - - faad_free(hyb->work); - - for (i = 0; i < 5; i++) - faad_free(hyb->buffer[i]); - faad_free(hyb->buffer); - - for (i = 0; i < hyb->frame_len; i++) - faad_free(hyb->temp[i]); - - faad_free(hyb->temp); -} - -/* real filter, size 2 */ -static void channel_filter2(hyb_info *hyb, uint8_t frame_len, const real_t *filter, - qmf_t *buffer, qmf_t **X_hybrid) -{ - uint8_t i; - - for (i = 0; i < frame_len; i++) - { - real_t r0 = MUL_F(filter[0],(QMF_RE(buffer[0+i]) + QMF_RE(buffer[12+i]))); - real_t r1 = MUL_F(filter[1],(QMF_RE(buffer[1+i]) + QMF_RE(buffer[11+i]))); - real_t r2 = MUL_F(filter[2],(QMF_RE(buffer[2+i]) + QMF_RE(buffer[10+i]))); - real_t r3 = MUL_F(filter[3],(QMF_RE(buffer[3+i]) + QMF_RE(buffer[9+i]))); - real_t r4 = MUL_F(filter[4],(QMF_RE(buffer[4+i]) + QMF_RE(buffer[8+i]))); - real_t r5 = MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i]))); - real_t r6 = MUL_F(filter[6],QMF_RE(buffer[6+i])); - real_t i0 = MUL_F(filter[0],(QMF_IM(buffer[0+i]) + QMF_IM(buffer[12+i]))); - real_t i1 = MUL_F(filter[1],(QMF_IM(buffer[1+i]) + QMF_IM(buffer[11+i]))); - real_t i2 = MUL_F(filter[2],(QMF_IM(buffer[2+i]) + QMF_IM(buffer[10+i]))); - real_t i3 = MUL_F(filter[3],(QMF_IM(buffer[3+i]) + QMF_IM(buffer[9+i]))); - real_t i4 = MUL_F(filter[4],(QMF_IM(buffer[4+i]) + QMF_IM(buffer[8+i]))); - real_t i5 = MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i]))); - real_t i6 = MUL_F(filter[6],QMF_IM(buffer[6+i])); - - /* q = 0 */ - QMF_RE(X_hybrid[i][0]) = r0 + r1 + r2 + r3 + r4 + r5 + r6; - QMF_IM(X_hybrid[i][0]) = i0 + i1 + i2 + i3 + i4 + i5 + i6; - - /* q = 1 */ - QMF_RE(X_hybrid[i][1]) = r0 - r1 + r2 - r3 + r4 - r5 + r6; - QMF_IM(X_hybrid[i][1]) = i0 - i1 + i2 - i3 + i4 - i5 + i6; - } -} - -/* complex filter, size 4 */ -static void channel_filter4(hyb_info *hyb, uint8_t frame_len, const real_t *filter, - qmf_t *buffer, qmf_t **X_hybrid) -{ - uint8_t i; - real_t input_re1[2], input_re2[2], input_im1[2], input_im2[2]; - - for (i = 0; i < frame_len; i++) - { - input_re1[0] = -MUL_F(filter[2], (QMF_RE(buffer[i+2]) + QMF_RE(buffer[i+10]))) + - MUL_F(filter[6], QMF_RE(buffer[i+6])); - input_re1[1] = MUL_F(FRAC_CONST(-0.70710678118655), - (MUL_F(filter[1], (QMF_RE(buffer[i+1]) + QMF_RE(buffer[i+11]))) + - MUL_F(filter[3], (QMF_RE(buffer[i+3]) + QMF_RE(buffer[i+9]))) - - MUL_F(filter[5], (QMF_RE(buffer[i+5]) + QMF_RE(buffer[i+7]))))); - - input_im1[0] = MUL_F(filter[0], (QMF_IM(buffer[i+0]) - QMF_IM(buffer[i+12]))) - - MUL_F(filter[4], (QMF_IM(buffer[i+4]) - QMF_IM(buffer[i+8]))); - input_im1[1] = MUL_F(FRAC_CONST(0.70710678118655), - (MUL_F(filter[1], (QMF_IM(buffer[i+1]) - QMF_IM(buffer[i+11]))) - - MUL_F(filter[3], (QMF_IM(buffer[i+3]) - QMF_IM(buffer[i+9]))) - - MUL_F(filter[5], (QMF_IM(buffer[i+5]) - QMF_IM(buffer[i+7]))))); - - input_re2[0] = MUL_F(filter[0], (QMF_RE(buffer[i+0]) - QMF_RE(buffer[i+12]))) - - MUL_F(filter[4], (QMF_RE(buffer[i+4]) - QMF_RE(buffer[i+8]))); - input_re2[1] = MUL_F(FRAC_CONST(0.70710678118655), - (MUL_F(filter[1], (QMF_RE(buffer[i+1]) - QMF_RE(buffer[i+11]))) - - MUL_F(filter[3], (QMF_RE(buffer[i+3]) - QMF_RE(buffer[i+9]))) - - MUL_F(filter[5], (QMF_RE(buffer[i+5]) - QMF_RE(buffer[i+7]))))); - - input_im2[0] = -MUL_F(filter[2], (QMF_IM(buffer[i+2]) + QMF_IM(buffer[i+10]))) + - MUL_F(filter[6], QMF_IM(buffer[i+6])); - input_im2[1] = MUL_F(FRAC_CONST(-0.70710678118655), - (MUL_F(filter[1], (QMF_IM(buffer[i+1]) + QMF_IM(buffer[i+11]))) + - MUL_F(filter[3], (QMF_IM(buffer[i+3]) + QMF_IM(buffer[i+9]))) - - MUL_F(filter[5], (QMF_IM(buffer[i+5]) + QMF_IM(buffer[i+7]))))); - - /* q == 0 */ - QMF_RE(X_hybrid[i][0]) = input_re1[0] + input_re1[1] + input_im1[0] + input_im1[1]; - QMF_IM(X_hybrid[i][0]) = -input_re2[0] - input_re2[1] + input_im2[0] + input_im2[1]; - - /* q == 1 */ - QMF_RE(X_hybrid[i][1]) = input_re1[0] - input_re1[1] - input_im1[0] + input_im1[1]; - QMF_IM(X_hybrid[i][1]) = input_re2[0] - input_re2[1] + input_im2[0] - input_im2[1]; - - /* q == 2 */ - QMF_RE(X_hybrid[i][2]) = input_re1[0] - input_re1[1] + input_im1[0] - input_im1[1]; - QMF_IM(X_hybrid[i][2]) = -input_re2[0] + input_re2[1] + input_im2[0] - input_im2[1]; - - /* q == 3 */ - QMF_RE(X_hybrid[i][3]) = input_re1[0] + input_re1[1] - input_im1[0] - input_im1[1]; - QMF_IM(X_hybrid[i][3]) = input_re2[0] + input_re2[1] + input_im2[0] + input_im2[1]; - } -} - -static void INLINE DCT3_4_unscaled(real_t *y, real_t *x) -{ - real_t f0, f1, f2, f3, f4, f5, f6, f7, f8; - - f0 = MUL_F(x[2], FRAC_CONST(0.7071067811865476)); - f1 = x[0] - f0; - f2 = x[0] + f0; - f3 = x[1] + x[3]; - f4 = MUL_C(x[1], COEF_CONST(1.3065629648763766)); - f5 = MUL_F(f3, FRAC_CONST(-0.9238795325112866)); - f6 = MUL_F(x[3], FRAC_CONST(-0.5411961001461967)); - f7 = f4 + f5; - f8 = f6 - f5; - y[3] = f2 - f8; - y[0] = f2 + f8; - y[2] = f1 - f7; - y[1] = f1 + f7; -} - -/* complex filter, size 8 */ -static void channel_filter8(hyb_info *hyb, uint8_t frame_len, const real_t *filter, - qmf_t *buffer, qmf_t **X_hybrid) -{ - uint8_t i, n; - real_t input_re1[4], input_re2[4], input_im1[4], input_im2[4]; - real_t x[4]; - - for (i = 0; i < frame_len; i++) - { - input_re1[0] = MUL_F(filter[6],QMF_RE(buffer[6+i])); - input_re1[1] = MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i]))); - input_re1[2] = -MUL_F(filter[0],(QMF_RE(buffer[0+i]) + QMF_RE(buffer[12+i]))) + MUL_F(filter[4],(QMF_RE(buffer[4+i]) + QMF_RE(buffer[8+i]))); - input_re1[3] = -MUL_F(filter[1],(QMF_RE(buffer[1+i]) + QMF_RE(buffer[11+i]))) + MUL_F(filter[3],(QMF_RE(buffer[3+i]) + QMF_RE(buffer[9+i]))); - - input_im1[0] = MUL_F(filter[5],(QMF_IM(buffer[7+i]) - QMF_IM(buffer[5+i]))); - input_im1[1] = MUL_F(filter[0],(QMF_IM(buffer[12+i]) - QMF_IM(buffer[0+i]))) + MUL_F(filter[4],(QMF_IM(buffer[8+i]) - QMF_IM(buffer[4+i]))); - input_im1[2] = MUL_F(filter[1],(QMF_IM(buffer[11+i]) - QMF_IM(buffer[1+i]))) + MUL_F(filter[3],(QMF_IM(buffer[9+i]) - QMF_IM(buffer[3+i]))); - input_im1[3] = MUL_F(filter[2],(QMF_IM(buffer[10+i]) - QMF_IM(buffer[2+i]))); - - for (n = 0; n < 4; n++) - { - x[n] = input_re1[n] - input_im1[3-n]; - } - DCT3_4_unscaled(x, x); - QMF_RE(X_hybrid[i][7]) = x[0]; - QMF_RE(X_hybrid[i][5]) = x[2]; - QMF_RE(X_hybrid[i][3]) = x[3]; - QMF_RE(X_hybrid[i][1]) = x[1]; - - for (n = 0; n < 4; n++) - { - x[n] = input_re1[n] + input_im1[3-n]; - } - DCT3_4_unscaled(x, x); - QMF_RE(X_hybrid[i][6]) = x[1]; - QMF_RE(X_hybrid[i][4]) = x[3]; - QMF_RE(X_hybrid[i][2]) = x[2]; - QMF_RE(X_hybrid[i][0]) = x[0]; - - input_im2[0] = MUL_F(filter[6],QMF_IM(buffer[6+i])); - input_im2[1] = MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i]))); - input_im2[2] = -MUL_F(filter[0],(QMF_IM(buffer[0+i]) + QMF_IM(buffer[12+i]))) + MUL_F(filter[4],(QMF_IM(buffer[4+i]) + QMF_IM(buffer[8+i]))); - input_im2[3] = -MUL_F(filter[1],(QMF_IM(buffer[1+i]) + QMF_IM(buffer[11+i]))) + MUL_F(filter[3],(QMF_IM(buffer[3+i]) + QMF_IM(buffer[9+i]))); - - input_re2[0] = MUL_F(filter[5],(QMF_RE(buffer[7+i]) - QMF_RE(buffer[5+i]))); - input_re2[1] = MUL_F(filter[0],(QMF_RE(buffer[12+i]) - QMF_RE(buffer[0+i]))) + MUL_F(filter[4],(QMF_RE(buffer[8+i]) - QMF_RE(buffer[4+i]))); - input_re2[2] = MUL_F(filter[1],(QMF_RE(buffer[11+i]) - QMF_RE(buffer[1+i]))) + MUL_F(filter[3],(QMF_RE(buffer[9+i]) - QMF_RE(buffer[3+i]))); - input_re2[3] = MUL_F(filter[2],(QMF_RE(buffer[10+i]) - QMF_RE(buffer[2+i]))); - - for (n = 0; n < 4; n++) - { - x[n] = input_im2[n] + input_re2[3-n]; - } - DCT3_4_unscaled(x, x); - QMF_IM(X_hybrid[i][7]) = x[0]; - QMF_IM(X_hybrid[i][5]) = x[2]; - QMF_IM(X_hybrid[i][3]) = x[3]; - QMF_IM(X_hybrid[i][1]) = x[1]; - - for (n = 0; n < 4; n++) - { - x[n] = input_im2[n] - input_re2[3-n]; - } - DCT3_4_unscaled(x, x); - QMF_IM(X_hybrid[i][6]) = x[1]; - QMF_IM(X_hybrid[i][4]) = x[3]; - QMF_IM(X_hybrid[i][2]) = x[2]; - QMF_IM(X_hybrid[i][0]) = x[0]; - } -} - -static void INLINE DCT3_6_unscaled(real_t *y, real_t *x) -{ - real_t f0, f1, f2, f3, f4, f5, f6, f7; - - f0 = MUL_F(x[3], FRAC_CONST(0.70710678118655)); - f1 = x[0] + f0; - f2 = x[0] - f0; - f3 = MUL_F((x[1] - x[5]), FRAC_CONST(0.70710678118655)); - f4 = MUL_F(x[2], FRAC_CONST(0.86602540378444)) + MUL_F(x[4], FRAC_CONST(0.5)); - f5 = f4 - x[4]; - f6 = MUL_F(x[1], FRAC_CONST(0.96592582628907)) + MUL_F(x[5], FRAC_CONST(0.25881904510252)); - f7 = f6 - f3; - y[0] = f1 + f6 + f4; - y[1] = f2 + f3 - x[4]; - y[2] = f7 + f2 - f5; - y[3] = f1 - f7 - f5; - y[4] = f1 - f3 - x[4]; - y[5] = f2 - f6 + f4; -} - -/* complex filter, size 12 */ -static void channel_filter12(hyb_info *hyb, uint8_t frame_len, const real_t *filter, - qmf_t *buffer, qmf_t **X_hybrid) -{ - uint8_t i, n; - real_t input_re1[6], input_re2[6], input_im1[6], input_im2[6]; - real_t out_re1[6], out_re2[6], out_im1[6], out_im2[6]; - - for (i = 0; i < frame_len; i++) - { - for (n = 0; n < 6; n++) - { - if (n == 0) - { - input_re1[0] = MUL_F(QMF_RE(buffer[6+i]), filter[6]); - input_re2[0] = MUL_F(QMF_IM(buffer[6+i]), filter[6]); - } else { - input_re1[6-n] = MUL_F((QMF_RE(buffer[n+i]) + QMF_RE(buffer[12-n+i])), filter[n]); - input_re2[6-n] = MUL_F((QMF_IM(buffer[n+i]) + QMF_IM(buffer[12-n+i])), filter[n]); - } - input_im2[n] = MUL_F((QMF_RE(buffer[n+i]) - QMF_RE(buffer[12-n+i])), filter[n]); - input_im1[n] = MUL_F((QMF_IM(buffer[n+i]) - QMF_IM(buffer[12-n+i])), filter[n]); - } - - DCT3_6_unscaled(out_re1, input_re1); - DCT3_6_unscaled(out_re2, input_re2); - - DCT3_6_unscaled(out_im1, input_im1); - DCT3_6_unscaled(out_im2, input_im2); - - for (n = 0; n < 6; n += 2) - { - QMF_RE(X_hybrid[i][n]) = out_re1[n] - out_im1[n]; - QMF_IM(X_hybrid[i][n]) = out_re2[n] + out_im2[n]; - QMF_RE(X_hybrid[i][n+1]) = out_re1[n+1] + out_im1[n+1]; - QMF_IM(X_hybrid[i][n+1]) = out_re2[n+1] - out_im2[n+1]; - - QMF_RE(X_hybrid[i][10-n]) = out_re1[n+1] - out_im1[n+1]; - QMF_IM(X_hybrid[i][10-n]) = out_re2[n+1] + out_im2[n+1]; - QMF_RE(X_hybrid[i][11-n]) = out_re1[n] + out_im1[n]; - QMF_IM(X_hybrid[i][11-n]) = out_re2[n] - out_im2[n]; - } - } -} - -/* Hybrid analysis: further split up QMF subbands - * to improve frequency resolution - */ -static void hybrid_analysis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], - uint8_t use34) -{ - uint8_t k, n, band; - uint8_t offset = 0; - uint8_t qmf_bands = (use34) ? 5 : 3; - uint8_t *resolution = (use34) ? hyb->resolution34 : hyb->resolution20; - - for (band = 0; band < qmf_bands; band++) - { - /* build working buffer */ - memcpy(hyb->work, hyb->buffer[band], 12 * sizeof(qmf_t)); - - /* add new samples */ - for (n = 0; n < hyb->frame_len; n++) - { - QMF_RE(hyb->work[12 + n]) = QMF_RE(X[n + 6 /*delay*/][band]); - QMF_IM(hyb->work[12 + n]) = QMF_IM(X[n + 6 /*delay*/][band]); - } - - /* store samples */ - memcpy(hyb->buffer[band], hyb->work + hyb->frame_len, 12 * sizeof(qmf_t)); - - - switch(resolution[band]) - { - case 2: - /* Type B real filter, Q[p] = 2 */ - channel_filter2(hyb, hyb->frame_len, p2_13_20, hyb->work, hyb->temp); - break; - case 4: - /* Type A complex filter, Q[p] = 4 */ - channel_filter4(hyb, hyb->frame_len, p4_13_34, hyb->work, hyb->temp); - break; - case 8: - /* Type A complex filter, Q[p] = 8 */ - channel_filter8(hyb, hyb->frame_len, (use34) ? p8_13_34 : p8_13_20, - hyb->work, hyb->temp); - break; - case 12: - /* Type A complex filter, Q[p] = 12 */ - channel_filter12(hyb, hyb->frame_len, p12_13_34, hyb->work, hyb->temp); - break; - } - - for (n = 0; n < hyb->frame_len; n++) - { - for (k = 0; k < resolution[band]; k++) - { - QMF_RE(X_hybrid[n][offset + k]) = QMF_RE(hyb->temp[n][k]); - QMF_IM(X_hybrid[n][offset + k]) = QMF_IM(hyb->temp[n][k]); - } - } - offset += resolution[band]; - } - - /* group hybrid channels */ - if (!use34) - { - for (n = 0; n < 32 /*30?*/; n++) - { - QMF_RE(X_hybrid[n][3]) += QMF_RE(X_hybrid[n][4]); - QMF_IM(X_hybrid[n][3]) += QMF_IM(X_hybrid[n][4]); - QMF_RE(X_hybrid[n][4]) = 0; - QMF_IM(X_hybrid[n][4]) = 0; - - QMF_RE(X_hybrid[n][2]) += QMF_RE(X_hybrid[n][5]); - QMF_IM(X_hybrid[n][2]) += QMF_IM(X_hybrid[n][5]); - QMF_RE(X_hybrid[n][5]) = 0; - QMF_IM(X_hybrid[n][5]) = 0; - } - } -} - -static void hybrid_synthesis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], - uint8_t use34) -{ - uint8_t k, n, band; - uint8_t offset = 0; - uint8_t qmf_bands = (use34) ? 5 : 3; - uint8_t *resolution = (use34) ? hyb->resolution34 : hyb->resolution20; - - for(band = 0; band < qmf_bands; band++) - { - for (n = 0; n < hyb->frame_len; n++) - { - QMF_RE(X[n][band]) = 0; - QMF_IM(X[n][band]) = 0; - - for (k = 0; k < resolution[band]; k++) - { - QMF_RE(X[n][band]) += QMF_RE(X_hybrid[n][offset + k]); - QMF_IM(X[n][band]) += QMF_IM(X_hybrid[n][offset + k]); - } - } - offset += resolution[band]; - } -} - -/* limits the value i to the range [min,max] */ -static int8_t delta_clip(int8_t i, int8_t min, int8_t max) -{ - if (i < min) - return min; - else if (i > max) - return max; - else - return i; -} - -//int iid = 0; - -/* delta decode array */ -static void delta_decode(uint8_t enable, int8_t *index, int8_t *index_prev, - uint8_t dt_flag, uint8_t nr_par, uint8_t stride, - int8_t min_index, int8_t max_index) -{ - int8_t i; - - if (enable == 1) - { - if (dt_flag == 0) - { - /* delta coded in frequency direction */ - index[0] = 0 + index[0]; - index[0] = delta_clip(index[0], min_index, max_index); - - for (i = 1; i < nr_par; i++) - { - index[i] = index[i-1] + index[i]; - index[i] = delta_clip(index[i], min_index, max_index); - } - } else { - /* delta coded in time direction */ - for (i = 0; i < nr_par; i++) - { - //int8_t tmp2; - //int8_t tmp = index[i]; - - //printf("%d %d\n", index_prev[i*stride], index[i]); - //printf("%d\n", index[i]); - - index[i] = index_prev[i*stride] + index[i]; - //tmp2 = index[i]; - index[i] = delta_clip(index[i], min_index, max_index); - - //if (iid) - //{ - // if (index[i] == 7) - // { - // printf("%d %d %d\n", index_prev[i*stride], tmp, tmp2); - // } - //} - } - } - } else { - /* set indices to zero */ - for (i = 0; i < nr_par; i++) - { - index[i] = 0; - } - } - - /* coarse */ - if (stride == 2) - { - for (i = (nr_par<<1)-1; i > 0; i--) - { - index[i] = index[i>>1]; - } - } -} - -/* delta modulo decode array */ -/* in: log2 value of the modulo value to allow using AND instead of MOD */ -static void delta_modulo_decode(uint8_t enable, int8_t *index, int8_t *index_prev, - uint8_t dt_flag, uint8_t nr_par, uint8_t stride, - int8_t log2modulo) -{ - int8_t i; - - if (enable == 1) - { - if (dt_flag == 0) - { - /* delta coded in frequency direction */ - index[0] = 0 + index[0]; - index[0] &= log2modulo; - - for (i = 1; i < nr_par; i++) - { - index[i] = index[i-1] + index[i]; - index[i] &= log2modulo; - } - } else { - /* delta coded in time direction */ - for (i = 0; i < nr_par; i++) - { - index[i] = index_prev[i*stride] + index[i]; - index[i] &= log2modulo; - } - } - } else { - /* set indices to zero */ - for (i = 0; i < nr_par; i++) - { - index[i] = 0; - } - } - - /* coarse */ - if (stride == 2) - { - index[0] = 0; - for (i = (nr_par<<1)-1; i > 0; i--) - { - index[i] = index[i>>1]; - } - } -} - -#ifdef PS_LOW_POWER -static void map34indexto20(int8_t *index, uint8_t bins) -{ - index[0] = (2*index[0]+index[1])/3; - index[1] = (index[1]+2*index[2])/3; - index[2] = (2*index[3]+index[4])/3; - index[3] = (index[4]+2*index[5])/3; - index[4] = (index[6]+index[7])/2; - index[5] = (index[8]+index[9])/2; - index[6] = index[10]; - index[7] = index[11]; - index[8] = (index[12]+index[13])/2; - index[9] = (index[14]+index[15])/2; - index[10] = index[16]; - - if (bins == 34) - { - index[11] = index[17]; - index[12] = index[18]; - index[13] = index[19]; - index[14] = (index[20]+index[21])/2; - index[15] = (index[22]+index[23])/2; - index[16] = (index[24]+index[25])/2; - index[17] = (index[26]+index[27])/2; - index[18] = (index[28]+index[29]+index[30]+index[31])/4; - index[19] = (index[32]+index[33])/2; - } -} -#endif - -static void map20indexto34(int8_t *index, uint8_t bins) -{ - index[0] = index[0]; - index[1] = (index[0] + index[1])/2; - index[2] = index[1]; - index[3] = index[2]; - index[4] = (index[2] + index[3])/2; - index[5] = index[3]; - index[6] = index[4]; - index[7] = index[4]; - index[8] = index[5]; - index[9] = index[5]; - index[10] = index[6]; - index[11] = index[7]; - index[12] = index[8]; - index[13] = index[8]; - index[14] = index[9]; - index[15] = index[9]; - index[16] = index[10]; - - if (bins == 34) - { - index[17] = index[11]; - index[18] = index[12]; - index[19] = index[13]; - index[20] = index[14]; - index[21] = index[14]; - index[22] = index[15]; - index[23] = index[15]; - index[24] = index[16]; - index[25] = index[16]; - index[26] = index[17]; - index[27] = index[17]; - index[28] = index[18]; - index[29] = index[18]; - index[30] = index[18]; - index[31] = index[18]; - index[32] = index[19]; - index[33] = index[19]; - } -} - -/* parse the bitstream data decoded in ps_data() */ -static void ps_data_decode(ps_info *ps) -{ - uint8_t env, bin; - - /* ps data not available, use data from previous frame */ - if (ps->ps_data_available == 0) - { - ps->num_env = 0; - } - - for (env = 0; env < ps->num_env; env++) - { - int8_t *iid_index_prev; - int8_t *icc_index_prev; - int8_t *ipd_index_prev; - int8_t *opd_index_prev; - - int8_t num_iid_steps = (ps->iid_mode < 3) ? 7 : 15 /*fine quant*/; - - if (env == 0) - { - /* take last envelope from previous frame */ - iid_index_prev = ps->iid_index_prev; - icc_index_prev = ps->icc_index_prev; - ipd_index_prev = ps->ipd_index_prev; - opd_index_prev = ps->opd_index_prev; - } else { - /* take index values from previous envelope */ - iid_index_prev = ps->iid_index[env - 1]; - icc_index_prev = ps->icc_index[env - 1]; - ipd_index_prev = ps->ipd_index[env - 1]; - opd_index_prev = ps->opd_index[env - 1]; - } - -// iid = 1; - /* delta decode iid parameters */ - delta_decode(ps->enable_iid, ps->iid_index[env], iid_index_prev, - ps->iid_dt[env], ps->nr_iid_par, - (ps->iid_mode == 0 || ps->iid_mode == 3) ? 2 : 1, - -num_iid_steps, num_iid_steps); -// iid = 0; - - /* delta decode icc parameters */ - delta_decode(ps->enable_icc, ps->icc_index[env], icc_index_prev, - ps->icc_dt[env], ps->nr_icc_par, - (ps->icc_mode == 0 || ps->icc_mode == 3) ? 2 : 1, - 0, 7); - - /* delta modulo decode ipd parameters */ - delta_modulo_decode(ps->enable_ipdopd, ps->ipd_index[env], ipd_index_prev, - ps->ipd_dt[env], ps->nr_ipdopd_par, 1, /*log2(8)*/ 3); - - /* delta modulo decode opd parameters */ - delta_modulo_decode(ps->enable_ipdopd, ps->opd_index[env], opd_index_prev, - ps->opd_dt[env], ps->nr_ipdopd_par, 1, /*log2(8)*/ 3); - } - - /* handle error case */ - if (ps->num_env == 0) - { - /* force to 1 */ - ps->num_env = 1; - - if (ps->enable_iid) - { - for (bin = 0; bin < 34; bin++) - ps->iid_index[0][bin] = ps->iid_index_prev[bin]; - } else { - for (bin = 0; bin < 34; bin++) - ps->iid_index[0][bin] = 0; - } - - if (ps->enable_icc) - { - for (bin = 0; bin < 34; bin++) - ps->icc_index[0][bin] = ps->icc_index_prev[bin]; - } else { - for (bin = 0; bin < 34; bin++) - ps->icc_index[0][bin] = 0; - } - - if (ps->enable_ipdopd) - { - for (bin = 0; bin < 17; bin++) - { - ps->ipd_index[0][bin] = ps->ipd_index_prev[bin]; - ps->opd_index[0][bin] = ps->opd_index_prev[bin]; - } - } else { - for (bin = 0; bin < 17; bin++) - { - ps->ipd_index[0][bin] = 0; - ps->opd_index[0][bin] = 0; - } - } - } - - /* update previous indices */ - for (bin = 0; bin < 34; bin++) - ps->iid_index_prev[bin] = ps->iid_index[ps->num_env-1][bin]; - for (bin = 0; bin < 34; bin++) - ps->icc_index_prev[bin] = ps->icc_index[ps->num_env-1][bin]; - for (bin = 0; bin < 17; bin++) - { - ps->ipd_index_prev[bin] = ps->ipd_index[ps->num_env-1][bin]; - ps->opd_index_prev[bin] = ps->opd_index[ps->num_env-1][bin]; - } - - ps->ps_data_available = 0; - - if (ps->frame_class == 0) - { - ps->border_position[0] = 0; - for (env = 1; env < ps->num_env; env++) - { - ps->border_position[env] = (env * 32 /* 30 for 960? */) / ps->num_env; - } - ps->border_position[ps->num_env] = 32 /* 30 for 960? */; - } else { - ps->border_position[0] = 0; - - if (ps->border_position[ps->num_env] < 32 /* 30 for 960? */) - { - ps->num_env++; - ps->border_position[ps->num_env] = 32 /* 30 for 960? */; - for (bin = 0; bin < 34; bin++) - { - ps->iid_index[ps->num_env][bin] = ps->iid_index[ps->num_env-1][bin]; - ps->icc_index[ps->num_env][bin] = ps->icc_index[ps->num_env-1][bin]; - } - for (bin = 0; bin < 17; bin++) - { - ps->ipd_index[ps->num_env][bin] = ps->ipd_index[ps->num_env-1][bin]; - ps->opd_index[ps->num_env][bin] = ps->opd_index[ps->num_env-1][bin]; - } - } - - for (env = 1; env < ps->num_env; env++) - { - int8_t thr = 32 /* 30 for 960? */ - (ps->num_env - env); - - if (ps->border_position[env] > thr) - { - ps->border_position[env] = thr; - } else { - thr = ps->border_position[env-1]+1; - if (ps->border_position[env] < thr) - { - ps->border_position[env] = thr; - } - } - } - } - - /* make sure that the indices of all parameters can be mapped - * to the same hybrid synthesis filterbank - */ -#ifdef PS_LOW_POWER - for (env = 0; env < ps->num_env; env++) - { - if (ps->iid_mode == 2 || ps->iid_mode == 5) - map34indexto20(ps->iid_index[env], 34); - if (ps->icc_mode == 2 || ps->icc_mode == 5) - map34indexto20(ps->icc_index[env], 34); - - /* disable ipd/opd */ - for (bin = 0; bin < 17; bin++) - { - ps->aaIpdIndex[env][bin] = 0; - ps->aaOpdIndex[env][bin] = 0; - } - } -#else - if (ps->use34hybrid_bands) - { - for (env = 0; env < ps->num_env; env++) - { - if (ps->iid_mode != 2 && ps->iid_mode != 5) - map20indexto34(ps->iid_index[env], 34); - if (ps->icc_mode != 2 && ps->icc_mode != 5) - map20indexto34(ps->icc_index[env], 34); - if (ps->ipd_mode != 2 && ps->ipd_mode != 5) - { - map20indexto34(ps->ipd_index[env], 17); - map20indexto34(ps->opd_index[env], 17); - } - } - } -#endif - -#if 0 - for (env = 0; env < ps->num_env; env++) - { - printf("iid[env:%d]:", env); - for (bin = 0; bin < 34; bin++) - { - printf(" %d", ps->iid_index[env][bin]); - } - printf("\n"); - } - for (env = 0; env < ps->num_env; env++) - { - printf("icc[env:%d]:", env); - for (bin = 0; bin < 34; bin++) - { - printf(" %d", ps->icc_index[env][bin]); - } - printf("\n"); - } - for (env = 0; env < ps->num_env; env++) - { - printf("ipd[env:%d]:", env); - for (bin = 0; bin < 17; bin++) - { - printf(" %d", ps->ipd_index[env][bin]); - } - printf("\n"); - } - for (env = 0; env < ps->num_env; env++) - { - printf("opd[env:%d]:", env); - for (bin = 0; bin < 17; bin++) - { - printf(" %d", ps->opd_index[env][bin]); - } - printf("\n"); - } - printf("\n"); -#endif -} - -/* decorrelate the mono signal using an allpass filter */ -static void ps_decorrelate(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], - qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]) -{ - uint8_t gr, n, m, bk; - uint8_t temp_delay; - uint8_t sb, maxsb; - const complex_t *Phi_Fract_SubQmf; - uint8_t temp_delay_ser[NO_ALLPASS_LINKS]; - real_t P_SmoothPeakDecayDiffNrg, nrg; - real_t P[32][34]; - real_t G_TransientRatio[32][34] = {{0}}; - complex_t inputLeft; - - - /* chose hybrid filterbank: 20 or 34 band case */ - if (ps->use34hybrid_bands) - { - Phi_Fract_SubQmf = Phi_Fract_SubQmf34; - } else{ - Phi_Fract_SubQmf = Phi_Fract_SubQmf20; - } - - /* clear the energy values */ - for (n = 0; n < 32; n++) - { - for (bk = 0; bk < 34; bk++) - { - P[n][bk] = 0; - } - } - - /* calculate the energy in each parameter band b(k) */ - for (gr = 0; gr < ps->num_groups; gr++) - { - /* select the parameter index b(k) to which this group belongs */ - bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; - - /* select the upper subband border for this group */ - maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr]+1 : ps->group_border[gr+1]; - - for (sb = ps->group_border[gr]; sb < maxsb; sb++) - { - for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) - { -#ifdef FIXED_POINT - uint32_t in_re, in_im; -#endif - - /* input from hybrid subbands or QMF subbands */ - if (gr < ps->num_hybrid_groups) - { - RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]); - IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]); - } else { - RE(inputLeft) = QMF_RE(X_left[n][sb]); - IM(inputLeft) = QMF_IM(X_left[n][sb]); - } - - /* accumulate energy */ -#ifdef FIXED_POINT - /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF - * meaning that P will be scaled by 2^(-10) compared to floating point version - */ - in_re = ((abs(RE(inputLeft))+(1<<(REAL_BITS-1)))>>REAL_BITS); - in_im = ((abs(IM(inputLeft))+(1<<(REAL_BITS-1)))>>REAL_BITS); - P[n][bk] += in_re*in_re + in_im*in_im; -#else - P[n][bk] += MUL_R(RE(inputLeft),RE(inputLeft)) + MUL_R(IM(inputLeft),IM(inputLeft)); -#endif - } - } - } - -#if 0 - for (n = 0; n < 32; n++) - { - for (bk = 0; bk < 34; bk++) - { -#ifdef FIXED_POINT - printf("%d %d: %d\n", n, bk, P[n][bk] /*/(float)REAL_PRECISION*/); -#else - printf("%d %d: %f\n", n, bk, P[n][bk]/1024.0); -#endif - } - } -#endif - - /* calculate transient reduction ratio for each parameter band b(k) */ - for (bk = 0; bk < ps->nr_par_bands; bk++) - { - for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) - { - const real_t gamma = COEF_CONST(1.5); - - ps->P_PeakDecayNrg[bk] = MUL_F(ps->P_PeakDecayNrg[bk], ps->alpha_decay); - if (ps->P_PeakDecayNrg[bk] < P[n][bk]) - ps->P_PeakDecayNrg[bk] = P[n][bk]; - - /* apply smoothing filter to peak decay energy */ - P_SmoothPeakDecayDiffNrg = ps->P_SmoothPeakDecayDiffNrg_prev[bk]; - P_SmoothPeakDecayDiffNrg += MUL_F((ps->P_PeakDecayNrg[bk] - P[n][bk] - ps->P_SmoothPeakDecayDiffNrg_prev[bk]), ps->alpha_smooth); - ps->P_SmoothPeakDecayDiffNrg_prev[bk] = P_SmoothPeakDecayDiffNrg; - - /* apply smoothing filter to energy */ - nrg = ps->P_prev[bk]; - nrg += MUL_F((P[n][bk] - ps->P_prev[bk]), ps->alpha_smooth); - ps->P_prev[bk] = nrg; - - /* calculate transient ratio */ - if (MUL_C(P_SmoothPeakDecayDiffNrg, gamma) <= nrg) - { - G_TransientRatio[n][bk] = REAL_CONST(1.0); - } else { - G_TransientRatio[n][bk] = DIV_R(nrg, (MUL_C(P_SmoothPeakDecayDiffNrg, gamma))); - } - } - } - -#if 0 - for (n = 0; n < 32; n++) - { - for (bk = 0; bk < 34; bk++) - { -#ifdef FIXED_POINT - printf("%d %d: %f\n", n, bk, G_TransientRatio[n][bk]/(float)REAL_PRECISION); -#else - printf("%d %d: %f\n", n, bk, G_TransientRatio[n][bk]); -#endif - } - } -#endif - - /* apply stereo decorrelation filter to the signal */ - for (gr = 0; gr < ps->num_groups; gr++) - { - if (gr < ps->num_hybrid_groups) - maxsb = ps->group_border[gr] + 1; - else - maxsb = ps->group_border[gr + 1]; - - /* QMF channel */ - for (sb = ps->group_border[gr]; sb < maxsb; sb++) - { - real_t g_DecaySlope; - real_t g_DecaySlope_filt[NO_ALLPASS_LINKS]; - - /* g_DecaySlope: [0..1] */ - if (gr < ps->num_hybrid_groups || sb <= ps->decay_cutoff) - { - g_DecaySlope = FRAC_CONST(1.0); - } else { - int8_t decay = ps->decay_cutoff - sb; - if (decay <= -20 /* -1/DECAY_SLOPE */) - { - g_DecaySlope = 0; - } else { - /* decay(int)*decay_slope(frac) = g_DecaySlope(frac) */ - g_DecaySlope = FRAC_CONST(1.0) + DECAY_SLOPE * decay; - } - } - - /* calculate g_DecaySlope_filt for every m multiplied by filter_a[m] */ - for (m = 0; m < NO_ALLPASS_LINKS; m++) - { - g_DecaySlope_filt[m] = MUL_F(g_DecaySlope, filter_a[m]); - } - - - /* set delay indices */ - temp_delay = ps->saved_delay; - for (n = 0; n < NO_ALLPASS_LINKS; n++) - temp_delay_ser[n] = ps->delay_buf_index_ser[n]; - - for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) - { - complex_t tmp, tmp0, R0; - - if (gr < ps->num_hybrid_groups) - { - /* hybrid filterbank input */ - RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]); - IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]); - } else { - /* QMF filterbank input */ - RE(inputLeft) = QMF_RE(X_left[n][sb]); - IM(inputLeft) = QMF_IM(X_left[n][sb]); - } - - if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups) - { - /* delay */ - - /* never hybrid subbands here, always QMF subbands */ - RE(tmp) = RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]); - IM(tmp) = IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]); - RE(R0) = RE(tmp); - IM(R0) = IM(tmp); - RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = RE(inputLeft); - IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = IM(inputLeft); - } else { - /* allpass filter */ - uint8_t m; - complex_t Phi_Fract; - - /* fetch parameters */ - if (gr < ps->num_hybrid_groups) - { - /* select data from the hybrid subbands */ - RE(tmp0) = RE(ps->delay_SubQmf[temp_delay][sb]); - IM(tmp0) = IM(ps->delay_SubQmf[temp_delay][sb]); - - RE(ps->delay_SubQmf[temp_delay][sb]) = RE(inputLeft); - IM(ps->delay_SubQmf[temp_delay][sb]) = IM(inputLeft); - - RE(Phi_Fract) = RE(Phi_Fract_SubQmf[sb]); - IM(Phi_Fract) = IM(Phi_Fract_SubQmf[sb]); - } else { - /* select data from the QMF subbands */ - RE(tmp0) = RE(ps->delay_Qmf[temp_delay][sb]); - IM(tmp0) = IM(ps->delay_Qmf[temp_delay][sb]); - - RE(ps->delay_Qmf[temp_delay][sb]) = RE(inputLeft); - IM(ps->delay_Qmf[temp_delay][sb]) = IM(inputLeft); - - RE(Phi_Fract) = RE(Phi_Fract_Qmf[sb]); - IM(Phi_Fract) = IM(Phi_Fract_Qmf[sb]); - } - - /* z^(-2) * Phi_Fract[k] */ - ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract)); - - RE(R0) = RE(tmp); - IM(R0) = IM(tmp); - for (m = 0; m < NO_ALLPASS_LINKS; m++) - { - complex_t Q_Fract_allpass, tmp2; - - /* fetch parameters */ - if (gr < ps->num_hybrid_groups) - { - /* select data from the hybrid subbands */ - RE(tmp0) = RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]); - IM(tmp0) = IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]); - - if (ps->use34hybrid_bands) - { - RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf34[sb][m]); - IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf34[sb][m]); - } else { - RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf20[sb][m]); - IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf20[sb][m]); - } - } else { - /* select data from the QMF subbands */ - RE(tmp0) = RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]); - IM(tmp0) = IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]); - - RE(Q_Fract_allpass) = RE(Q_Fract_allpass_Qmf[sb][m]); - IM(Q_Fract_allpass) = IM(Q_Fract_allpass_Qmf[sb][m]); - } - - /* delay by a fraction */ - /* z^(-d(m)) * Q_Fract_allpass[k,m] */ - ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Q_Fract_allpass), IM(Q_Fract_allpass)); - - /* -a(m) * g_DecaySlope[k] */ - RE(tmp) += -MUL_F(g_DecaySlope_filt[m], RE(R0)); - IM(tmp) += -MUL_F(g_DecaySlope_filt[m], IM(R0)); - - /* -a(m) * g_DecaySlope[k] * Q_Fract_allpass[k,m] * z^(-d(m)) */ - RE(tmp2) = RE(R0) + MUL_F(g_DecaySlope_filt[m], RE(tmp)); - IM(tmp2) = IM(R0) + MUL_F(g_DecaySlope_filt[m], IM(tmp)); - - /* store sample */ - if (gr < ps->num_hybrid_groups) - { - RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2); - IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2); - } else { - RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2); - IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2); - } - - /* store for next iteration (or as output value if last iteration) */ - RE(R0) = RE(tmp); - IM(R0) = IM(tmp); - } - } - - /* select b(k) for reading the transient ratio */ - bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; - - /* duck if a past transient is found */ - RE(R0) = MUL_R(G_TransientRatio[n][bk], RE(R0)); - IM(R0) = MUL_R(G_TransientRatio[n][bk], IM(R0)); - - if (gr < ps->num_hybrid_groups) - { - /* hybrid */ - QMF_RE(X_hybrid_right[n][sb]) = RE(R0); - QMF_IM(X_hybrid_right[n][sb]) = IM(R0); - } else { - /* QMF */ - QMF_RE(X_right[n][sb]) = RE(R0); - QMF_IM(X_right[n][sb]) = IM(R0); - } - - /* Update delay buffer index */ - if (++temp_delay >= 2) - { - temp_delay = 0; - } - - /* update delay indices */ - if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups) - { - /* delay_D depends on the samplerate, it can hold the values 14 and 1 */ - if (++ps->delay_buf_index_delay[sb] >= ps->delay_D[sb]) - { - ps->delay_buf_index_delay[sb] = 0; - } - } - - for (m = 0; m < NO_ALLPASS_LINKS; m++) - { - if (++temp_delay_ser[m] >= ps->num_sample_delay_ser[m]) - { - temp_delay_ser[m] = 0; - } - } - } - } - } - - /* update delay indices */ - ps->saved_delay = temp_delay; - for (m = 0; m < NO_ALLPASS_LINKS; m++) - ps->delay_buf_index_ser[m] = temp_delay_ser[m]; -} - -#ifdef FIXED_POINT -#define step(shift) \ - if ((0x40000000l >> shift) + root <= value) \ - { \ - value -= (0x40000000l >> shift) + root; \ - root = (root >> 1) | (0x40000000l >> shift); \ - } else { \ - root = root >> 1; \ - } - -/* fixed point square root approximation */ -static real_t ps_sqrt(real_t value) -{ - real_t root = 0; - - step( 0); step( 2); step( 4); step( 6); - step( 8); step(10); step(12); step(14); - step(16); step(18); step(20); step(22); - step(24); step(26); step(28); step(30); - - if (root < value) - ++root; - - root <<= (REAL_BITS/2); - - return root; -} -#else -#define ps_sqrt(A) sqrt(A) -#endif - -static const real_t ipdopd_cos_tab[] = { - FRAC_CONST(1.000000000000000), - FRAC_CONST(0.707106781186548), - FRAC_CONST(0.000000000000000), - FRAC_CONST(-0.707106781186547), - FRAC_CONST(-1.000000000000000), - FRAC_CONST(-0.707106781186548), - FRAC_CONST(-0.000000000000000), - FRAC_CONST(0.707106781186547), - FRAC_CONST(1.000000000000000) -}; - -static const real_t ipdopd_sin_tab[] = { - FRAC_CONST(0.000000000000000), - FRAC_CONST(0.707106781186547), - FRAC_CONST(1.000000000000000), - FRAC_CONST(0.707106781186548), - FRAC_CONST(0.000000000000000), - FRAC_CONST(-0.707106781186547), - FRAC_CONST(-1.000000000000000), - FRAC_CONST(-0.707106781186548), - FRAC_CONST(-0.000000000000000) -}; - -static void ps_mix_phase(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], - qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]) -{ - uint8_t n; - uint8_t gr; - uint8_t bk = 0; - uint8_t sb, maxsb; - uint8_t env; - uint8_t nr_ipdopd_par; - complex_t h11, h12, h21, h22; - complex_t H11, H12, H21, H22; - complex_t deltaH11, deltaH12, deltaH21, deltaH22; - complex_t tempLeft; - complex_t tempRight; - complex_t phaseLeft; - complex_t phaseRight; - real_t L; - const real_t *sf_iid; - uint8_t no_iid_steps; - - if (ps->iid_mode >= 3) - { - no_iid_steps = 15; - sf_iid = sf_iid_fine; - } else { - no_iid_steps = 7; - sf_iid = sf_iid_normal; - } - - if (ps->ipd_mode == 0 || ps->ipd_mode == 3) - { - nr_ipdopd_par = 11; /* resolution */ - } else { - nr_ipdopd_par = ps->nr_ipdopd_par; - } - - for (gr = 0; gr < ps->num_groups; gr++) - { - bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; - - /* use one channel per group in the subqmf domain */ - maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr] + 1 : ps->group_border[gr + 1]; - - for (env = 0; env < ps->num_env; env++) - { - if (ps->icc_mode < 3) - { - /* type 'A' mixing as described in 8.6.4.6.2.1 */ - real_t c_1, c_2; - real_t cosa, sina; - real_t cosb, sinb; - real_t ab1, ab2; - real_t ab3, ab4; - - /* - c_1 = sqrt(2.0 / (1.0 + pow(10.0, quant_iid[no_iid_steps + iid_index] / 10.0))); - c_2 = sqrt(2.0 / (1.0 + pow(10.0, quant_iid[no_iid_steps - iid_index] / 10.0))); - alpha = 0.5 * acos(quant_rho[icc_index]); - beta = alpha * ( c_1 - c_2 ) / sqrt(2.0); - */ - - //printf("%d\n", ps->iid_index[env][bk]); - - /* calculate the scalefactors c_1 and c_2 from the intensity differences */ - c_1 = sf_iid[no_iid_steps + ps->iid_index[env][bk]]; - c_2 = sf_iid[no_iid_steps - ps->iid_index[env][bk]]; - - /* calculate alpha and beta using the ICC parameters */ - cosa = cos_alphas[ps->icc_index[env][bk]]; - sina = sin_alphas[ps->icc_index[env][bk]]; - - if (ps->iid_mode >= 3) - { - if (ps->iid_index[env][bk] < 0) - { - cosb = cos_betas_fine[-ps->iid_index[env][bk]][ps->icc_index[env][bk]]; - sinb = -sin_betas_fine[-ps->iid_index[env][bk]][ps->icc_index[env][bk]]; - } else { - cosb = cos_betas_fine[ps->iid_index[env][bk]][ps->icc_index[env][bk]]; - sinb = sin_betas_fine[ps->iid_index[env][bk]][ps->icc_index[env][bk]]; - } - } else { - if (ps->iid_index[env][bk] < 0) - { - cosb = cos_betas_normal[-ps->iid_index[env][bk]][ps->icc_index[env][bk]]; - sinb = -sin_betas_normal[-ps->iid_index[env][bk]][ps->icc_index[env][bk]]; - } else { - cosb = cos_betas_normal[ps->iid_index[env][bk]][ps->icc_index[env][bk]]; - sinb = sin_betas_normal[ps->iid_index[env][bk]][ps->icc_index[env][bk]]; - } - } - - ab1 = MUL_C(cosb, cosa); - ab2 = MUL_C(sinb, sina); - ab3 = MUL_C(sinb, cosa); - ab4 = MUL_C(cosb, sina); - - /* h_xy: COEF */ - RE(h11) = MUL_C(c_2, (ab1 - ab2)); - RE(h12) = MUL_C(c_1, (ab1 + ab2)); - RE(h21) = MUL_C(c_2, (ab3 + ab4)); - RE(h22) = MUL_C(c_1, (ab3 - ab4)); - } else { - /* type 'B' mixing as described in 8.6.4.6.2.2 */ - real_t sina, cosa; - real_t cosg, sing; - - /* - real_t c, rho, mu, alpha, gamma; - uint8_t i; - - i = ps->iid_index[env][bk]; - c = (real_t)pow(10.0, ((i)?(((i>0)?1:-1)*quant_iid[((i>0)?i:-i)-1]):0.)/20.0); - rho = quant_rho[ps->icc_index[env][bk]]; - - if (rho == 0.0f && c == 1.) - { - alpha = (real_t)M_PI/4.0f; - rho = 0.05f; - } else { - if (rho <= 0.05f) - { - rho = 0.05f; - } - alpha = 0.5f*(real_t)atan( (2.0f*c*rho) / (c*c-1.0f) ); - - if (alpha < 0.) - { - alpha += (real_t)M_PI/2.0f; - } - if (rho < 0.) - { - alpha += (real_t)M_PI; - } - } - mu = c+1.0f/c; - mu = 1+(4.0f*rho*rho-4.0f)/(mu*mu); - gamma = (real_t)atan(sqrt((1.0f-sqrt(mu))/(1.0f+sqrt(mu)))); - */ - - if (ps->iid_mode >= 3) - { - uint8_t abs_iid = abs(ps->iid_index[env][bk]); - - cosa = sincos_alphas_B_fine[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]]; - sina = sincos_alphas_B_fine[30 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]]; - cosg = cos_gammas_fine[abs_iid][ps->icc_index[env][bk]]; - sing = sin_gammas_fine[abs_iid][ps->icc_index[env][bk]]; - } else { - uint8_t abs_iid = abs(ps->iid_index[env][bk]); - - cosa = sincos_alphas_B_normal[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]]; - sina = sincos_alphas_B_normal[14 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]]; - cosg = cos_gammas_normal[abs_iid][ps->icc_index[env][bk]]; - sing = sin_gammas_normal[abs_iid][ps->icc_index[env][bk]]; - } - - RE(h11) = MUL_C(COEF_SQRT2, MUL_C(cosa, cosg)); - RE(h12) = MUL_C(COEF_SQRT2, MUL_C(sina, cosg)); - RE(h21) = MUL_C(COEF_SQRT2, MUL_C(-cosa, sing)); - RE(h22) = MUL_C(COEF_SQRT2, MUL_C(sina, sing)); - } - - /* calculate phase rotation parameters H_xy */ - /* note that the imaginary part of these parameters are only calculated when - IPD and OPD are enabled - */ - if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) - { - int8_t i; - real_t xxyy, ppqq; - real_t yq, xp, xq, py, tmp; - - /* ringbuffer index */ - i = ps->phase_hist; - - /* previous value */ -#ifdef FIXED_POINT - /* divide by 4, shift right 2 bits */ - RE(tempLeft) = RE(ps->ipd_prev[bk][i]) >> 2; - IM(tempLeft) = IM(ps->ipd_prev[bk][i]) >> 2; - RE(tempRight) = RE(ps->opd_prev[bk][i]) >> 2; - IM(tempRight) = IM(ps->opd_prev[bk][i]) >> 2; -#else - RE(tempLeft) = MUL_F(RE(ps->ipd_prev[bk][i]), FRAC_CONST(0.25)); - IM(tempLeft) = MUL_F(IM(ps->ipd_prev[bk][i]), FRAC_CONST(0.25)); - RE(tempRight) = MUL_F(RE(ps->opd_prev[bk][i]), FRAC_CONST(0.25)); - IM(tempRight) = MUL_F(IM(ps->opd_prev[bk][i]), FRAC_CONST(0.25)); -#endif - - /* save current value */ - RE(ps->ipd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->ipd_index[env][bk])]; - IM(ps->ipd_prev[bk][i]) = ipdopd_sin_tab[abs(ps->ipd_index[env][bk])]; - RE(ps->opd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->opd_index[env][bk])]; - IM(ps->opd_prev[bk][i]) = ipdopd_sin_tab[abs(ps->opd_index[env][bk])]; - - /* add current value */ - RE(tempLeft) += RE(ps->ipd_prev[bk][i]); - IM(tempLeft) += IM(ps->ipd_prev[bk][i]); - RE(tempRight) += RE(ps->opd_prev[bk][i]); - IM(tempRight) += IM(ps->opd_prev[bk][i]); - - /* ringbuffer index */ - if (i == 0) - { - i = 2; - } - i--; - - /* get value before previous */ -#ifdef FIXED_POINT - /* dividing by 2, shift right 1 bit */ - RE(tempLeft) += (RE(ps->ipd_prev[bk][i]) >> 1); - IM(tempLeft) += (IM(ps->ipd_prev[bk][i]) >> 1); - RE(tempRight) += (RE(ps->opd_prev[bk][i]) >> 1); - IM(tempRight) += (IM(ps->opd_prev[bk][i]) >> 1); -#else - RE(tempLeft) += MUL_F(RE(ps->ipd_prev[bk][i]), FRAC_CONST(0.5)); - IM(tempLeft) += MUL_F(IM(ps->ipd_prev[bk][i]), FRAC_CONST(0.5)); - RE(tempRight) += MUL_F(RE(ps->opd_prev[bk][i]), FRAC_CONST(0.5)); - IM(tempRight) += MUL_F(IM(ps->opd_prev[bk][i]), FRAC_CONST(0.5)); -#endif - -#if 0 /* original code */ - ipd = (float)atan2(IM(tempLeft), RE(tempLeft)); - opd = (float)atan2(IM(tempRight), RE(tempRight)); - - /* phase rotation */ - RE(phaseLeft) = (float)cos(opd); - IM(phaseLeft) = (float)sin(opd); - opd -= ipd; - RE(phaseRight) = (float)cos(opd); - IM(phaseRight) = (float)sin(opd); -#else - // x = IM(tempLeft) - // y = RE(tempLeft) - // p = IM(tempRight) - // q = RE(tempRight) - // cos(atan2(x,y)) = 1/sqrt(1 + (x*x)/(y*y)) - // sin(atan2(x,y)) = x/(y*sqrt(1 + (x*x)/(y*y))) - // cos(atan2(x,y)-atan2(p,q)) = (y*q+x*p)/(y*q * sqrt(1 + (x*x)/(y*y)) * sqrt(1 + (p*p)/(q*q))); - // sin(atan2(x,y)-atan2(p,q)) = (x*q-p*y)/(y*q * sqrt(1 + (x*x)/(y*y)) * sqrt(1 + (p*p)/(q*q))); - - /* (x*x)/(y*y) (REAL > 0) */ - xxyy = DIV_R(MUL_C(IM(tempLeft),IM(tempLeft)), MUL_C(RE(tempLeft),RE(tempLeft))); - ppqq = DIV_R(MUL_C(IM(tempRight),IM(tempRight)), MUL_C(RE(tempRight),RE(tempRight))); - - /* 1 + (x*x)/(y*y) (REAL > 1) */ - xxyy += REAL_CONST(1); - ppqq += REAL_CONST(1); - - /* 1 / sqrt(1 + (x*x)/(y*y)) (FRAC <= 1) */ - xxyy = DIV_R(FRAC_CONST(1), ps_sqrt(xxyy)); - ppqq = DIV_R(FRAC_CONST(1), ps_sqrt(ppqq)); - - /* COEF */ - yq = MUL_C(RE(tempLeft), RE(tempRight)); - xp = MUL_C(IM(tempLeft), IM(tempRight)); - xq = MUL_C(IM(tempLeft), RE(tempRight)); - py = MUL_C(RE(tempLeft), IM(tempRight)); - - RE(phaseLeft) = xxyy; - IM(phaseLeft) = MUL_R(xxyy, (DIV_R(IM(tempLeft), RE(tempLeft)))); - - tmp = DIV_C(MUL_F(xxyy, ppqq), yq); - - /* MUL_C(FRAC,COEF) = FRAC */ - RE(phaseRight) = MUL_C(tmp, (yq+xp)); - IM(phaseRight) = MUL_C(tmp, (xq-py)); -#endif - - /* MUL_F(COEF, FRAC) = COEF */ - IM(h11) = MUL_F(RE(h11), IM(phaseLeft)); - IM(h12) = MUL_F(RE(h12), IM(phaseRight)); - IM(h21) = MUL_F(RE(h21), IM(phaseLeft)); - IM(h22) = MUL_F(RE(h22), IM(phaseRight)); - - RE(h11) = MUL_F(RE(h11), RE(phaseLeft)); - RE(h12) = MUL_F(RE(h12), RE(phaseRight)); - RE(h21) = MUL_F(RE(h21), RE(phaseLeft)); - RE(h22) = MUL_F(RE(h22), RE(phaseRight)); - } - - /* length of the envelope n_e+1 - n_e (in time samples) */ - /* 0 < L <= 32: integer */ - L = (real_t)(ps->border_position[env + 1] - ps->border_position[env]); - - /* obtain final H_xy by means of linear interpolation */ - RE(deltaH11) = (RE(h11) - RE(ps->h11_prev[gr])) / L; - RE(deltaH12) = (RE(h12) - RE(ps->h12_prev[gr])) / L; - RE(deltaH21) = (RE(h21) - RE(ps->h21_prev[gr])) / L; - RE(deltaH22) = (RE(h22) - RE(ps->h22_prev[gr])) / L; - - RE(H11) = RE(ps->h11_prev[gr]); - RE(H12) = RE(ps->h12_prev[gr]); - RE(H21) = RE(ps->h21_prev[gr]); - RE(H22) = RE(ps->h22_prev[gr]); - - RE(ps->h11_prev[gr]) = RE(h11); - RE(ps->h12_prev[gr]) = RE(h12); - RE(ps->h21_prev[gr]) = RE(h21); - RE(ps->h22_prev[gr]) = RE(h22); - - /* only calculate imaginary part when needed */ - if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) - { - /* obtain final H_xy by means of linear interpolation */ - IM(deltaH11) = (IM(h11) - IM(ps->h11_prev[gr])) / L; - IM(deltaH12) = (IM(h12) - IM(ps->h12_prev[gr])) / L; - IM(deltaH21) = (IM(h21) - IM(ps->h21_prev[gr])) / L; - IM(deltaH22) = (IM(h22) - IM(ps->h22_prev[gr])) / L; - - IM(H11) = IM(ps->h11_prev[gr]); - IM(H12) = IM(ps->h12_prev[gr]); - IM(H21) = IM(ps->h21_prev[gr]); - IM(H22) = IM(ps->h22_prev[gr]); - - if ((NEGATE_IPD_MASK & ps->map_group2bk[gr]) != 0) - { - IM(deltaH11) = -IM(deltaH11); - IM(deltaH12) = -IM(deltaH12); - IM(deltaH21) = -IM(deltaH21); - IM(deltaH22) = -IM(deltaH22); - - IM(H11) = -IM(H11); - IM(H12) = -IM(H12); - IM(H21) = -IM(H21); - IM(H22) = -IM(H22); - } - - IM(ps->h11_prev[gr]) = IM(h11); - IM(ps->h12_prev[gr]) = IM(h12); - IM(ps->h21_prev[gr]) = IM(h21); - IM(ps->h22_prev[gr]) = IM(h22); - } - - /* apply H_xy to the current envelope band of the decorrelated subband */ - for (n = ps->border_position[env]; n < ps->border_position[env + 1]; n++) - { - /* addition finalises the interpolation over every n */ - RE(H11) += RE(deltaH11); - RE(H12) += RE(deltaH12); - RE(H21) += RE(deltaH21); - RE(H22) += RE(deltaH22); - if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) - { - IM(H11) += IM(deltaH11); - IM(H12) += IM(deltaH12); - IM(H21) += IM(deltaH21); - IM(H22) += IM(deltaH22); - } - - /* channel is an alias to the subband */ - for (sb = ps->group_border[gr]; sb < maxsb; sb++) - { - complex_t inLeft, inRight; - - /* load decorrelated samples */ - if (gr < ps->num_hybrid_groups) - { - RE(inLeft) = RE(X_hybrid_left[n][sb]); - IM(inLeft) = IM(X_hybrid_left[n][sb]); - RE(inRight) = RE(X_hybrid_right[n][sb]); - IM(inRight) = IM(X_hybrid_right[n][sb]); - } else { - RE(inLeft) = RE(X_left[n][sb]); - IM(inLeft) = IM(X_left[n][sb]); - RE(inRight) = RE(X_right[n][sb]); - IM(inRight) = IM(X_right[n][sb]); - } - - /* apply mixing */ - RE(tempLeft) = MUL_C(RE(H11), RE(inLeft)) + MUL_C(RE(H21), RE(inRight)); - IM(tempLeft) = MUL_C(RE(H11), IM(inLeft)) + MUL_C(RE(H21), IM(inRight)); - RE(tempRight) = MUL_C(RE(H12), RE(inLeft)) + MUL_C(RE(H22), RE(inRight)); - IM(tempRight) = MUL_C(RE(H12), IM(inLeft)) + MUL_C(RE(H22), IM(inRight)); - - /* only perform imaginary operations when needed */ - if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) - { - /* apply rotation */ - RE(tempLeft) -= MUL_C(IM(H11), IM(inLeft)) + MUL_C(IM(H21), IM(inRight)); - IM(tempLeft) += MUL_C(IM(H11), RE(inLeft)) + MUL_C(IM(H21), RE(inRight)); - RE(tempRight) -= MUL_C(IM(H12), IM(inLeft)) + MUL_C(IM(H22), IM(inRight)); - IM(tempRight) += MUL_C(IM(H12), RE(inLeft)) + MUL_C(IM(H22), RE(inRight)); - } - - /* store final samples */ - if (gr < ps->num_hybrid_groups) - { - RE(X_hybrid_left[n][sb]) = RE(tempLeft); - IM(X_hybrid_left[n][sb]) = IM(tempLeft); - RE(X_hybrid_right[n][sb]) = RE(tempRight); - IM(X_hybrid_right[n][sb]) = IM(tempRight); - } else { - RE(X_left[n][sb]) = RE(tempLeft); - IM(X_left[n][sb]) = IM(tempLeft); - RE(X_right[n][sb]) = RE(tempRight); - IM(X_right[n][sb]) = IM(tempRight); - } - } - } - - /* shift phase smoother's circular buffer index */ - ps->phase_hist++; - if (ps->phase_hist == 2) - { - ps->phase_hist = 0; - } - } - } -} - -void ps_free(ps_info *ps) -{ - /* free hybrid filterbank structures */ - hybrid_free(ps->hyb); - - faad_free(ps); -} - -ps_info *ps_init(uint8_t sr_index) -{ - uint8_t i; - uint8_t short_delay_band; - - ps_info *ps = (ps_info*)faad_malloc(sizeof(ps_info)); - memset(ps, 0, sizeof(ps_info)); - - ps->hyb = hybrid_init(); - - ps->ps_data_available = 0; - - /* delay stuff*/ - ps->saved_delay = 0; - - for (i = 0; i < 64; i++) - { - ps->delay_buf_index_delay[i] = 0; - } - - for (i = 0; i < NO_ALLPASS_LINKS; i++) - { - ps->delay_buf_index_ser[i] = 0; -#ifdef PARAM_32KHZ - if (sr_index <= 5) /* >= 32 kHz*/ - { - ps->num_sample_delay_ser[i] = delay_length_d[1][i]; - } else { - ps->num_sample_delay_ser[i] = delay_length_d[0][i]; - } -#else - /* THESE ARE CONSTANTS NOW */ - ps->num_sample_delay_ser[i] = delay_length_d[i]; -#endif - } - -#ifdef PARAM_32KHZ - if (sr_index <= 5) /* >= 32 kHz*/ - { - short_delay_band = 35; - ps->nr_allpass_bands = 22; - ps->alpha_decay = FRAC_CONST(0.76592833836465); - ps->alpha_smooth = FRAC_CONST(0.25); - } else { - short_delay_band = 64; - ps->nr_allpass_bands = 45; - ps->alpha_decay = FRAC_CONST(0.58664621951003); - ps->alpha_smooth = FRAC_CONST(0.6); - } -#else - /* THESE ARE CONSTANTS NOW */ - short_delay_band = 35; - ps->nr_allpass_bands = 22; - ps->alpha_decay = FRAC_CONST(0.76592833836465); - ps->alpha_smooth = FRAC_CONST(0.25); -#endif - - /* THESE ARE CONSTANT NOW IF PS IS INDEPENDANT OF SAMPLERATE */ - for (i = 0; i < short_delay_band; i++) - { - ps->delay_D[i] = 14; - } - for (i = short_delay_band; i < 64; i++) - { - ps->delay_D[i] = 1; - } - - /* mixing and phase */ - for (i = 0; i < 50; i++) - { - RE(ps->h11_prev[i]) = 1; - IM(ps->h12_prev[i]) = 1; - RE(ps->h11_prev[i]) = 1; - IM(ps->h12_prev[i]) = 1; - } - - ps->phase_hist = 0; - - for (i = 0; i < 20; i++) - { - RE(ps->ipd_prev[i][0]) = 0; - IM(ps->ipd_prev[i][0]) = 0; - RE(ps->ipd_prev[i][1]) = 0; - IM(ps->ipd_prev[i][1]) = 0; - RE(ps->opd_prev[i][0]) = 0; - IM(ps->opd_prev[i][0]) = 0; - RE(ps->opd_prev[i][1]) = 0; - IM(ps->opd_prev[i][1]) = 0; - } - - return ps; -} - -/* main Parametric Stereo decoding function */ -uint8_t ps_decode(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]) -{ - qmf_t X_hybrid_left[32][32] = {{{0}}}; - qmf_t X_hybrid_right[32][32] = {{{0}}}; - - /* delta decoding of the bitstream data */ - ps_data_decode(ps); - - /* set up some parameters depending on filterbank type */ - if (ps->use34hybrid_bands) - { - ps->group_border = (uint8_t*)group_border34; - ps->map_group2bk = (uint16_t*)map_group2bk34; - ps->num_groups = 32+18; - ps->num_hybrid_groups = 32; - ps->nr_par_bands = 34; - ps->decay_cutoff = 5; - } else { - ps->group_border = (uint8_t*)group_border20; - ps->map_group2bk = (uint16_t*)map_group2bk20; - ps->num_groups = 10+12; - ps->num_hybrid_groups = 10; - ps->nr_par_bands = 20; - ps->decay_cutoff = 3; - } - - /* Perform further analysis on the lowest subbands to get a higher - * frequency resolution - */ - hybrid_analysis((hyb_info*)ps->hyb, X_left, X_hybrid_left, - ps->use34hybrid_bands); - - /* decorrelate mono signal */ - ps_decorrelate(ps, X_left, X_right, X_hybrid_left, X_hybrid_right); - - /* apply mixing and phase parameters */ - ps_mix_phase(ps, X_left, X_right, X_hybrid_left, X_hybrid_right); - - /* hybrid synthesis, to rebuild the SBR QMF matrices */ - hybrid_synthesis((hyb_info*)ps->hyb, X_left, X_hybrid_left, - ps->use34hybrid_bands); - - hybrid_synthesis((hyb_info*)ps->hyb, X_right, X_hybrid_right, - ps->use34hybrid_bands); - - return 0; -} - -#endif - diff --git a/src/libfaad/ps_dec.h b/src/libfaad/ps_dec.h deleted file mode 100644 index 978161fff..000000000 --- a/src/libfaad/ps_dec.h +++ /dev/null @@ -1,148 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: ps_dec.h,v 1.1 2005/10/30 00:50:19 tmmm Exp $ -**/ - -#ifndef __PS_DEC_H__ -#define __PS_DEC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "bits.h" - -#define EXTENSION_ID_PS 2 - -#define MAX_PS_ENVELOPES 5 -#define NO_ALLPASS_LINKS 3 - -typedef struct -{ - /* bitstream parameters */ - uint8_t enable_iid; - uint8_t enable_icc; - uint8_t enable_ext; - - uint8_t iid_mode; - uint8_t icc_mode; - uint8_t nr_iid_par; - uint8_t nr_ipdopd_par; - uint8_t nr_icc_par; - - uint8_t frame_class; - uint8_t num_env; - - uint8_t border_position[MAX_PS_ENVELOPES+1]; - - uint8_t iid_dt[MAX_PS_ENVELOPES]; - uint8_t icc_dt[MAX_PS_ENVELOPES]; - - uint8_t enable_ipdopd; - uint8_t ipd_mode; - uint8_t ipd_dt[MAX_PS_ENVELOPES]; - uint8_t opd_dt[MAX_PS_ENVELOPES]; - - /* indices */ - int8_t iid_index_prev[34]; - int8_t icc_index_prev[34]; - int8_t ipd_index_prev[17]; - int8_t opd_index_prev[17]; - int8_t iid_index[MAX_PS_ENVELOPES][34]; - int8_t icc_index[MAX_PS_ENVELOPES][34]; - int8_t ipd_index[MAX_PS_ENVELOPES][17]; - int8_t opd_index[MAX_PS_ENVELOPES][17]; - - int8_t ipd_index_1[17]; - int8_t opd_index_1[17]; - int8_t ipd_index_2[17]; - int8_t opd_index_2[17]; - - /* ps data was correctly read */ - uint8_t ps_data_available; - - /* a header has been read */ - uint8_t header_read; - - /* hybrid filterbank parameters */ - void *hyb; - uint8_t use34hybrid_bands; - - /**/ - uint8_t num_groups; - uint8_t num_hybrid_groups; - uint8_t nr_par_bands; - uint8_t nr_allpass_bands; - uint8_t decay_cutoff; - - uint8_t *group_border; - uint16_t *map_group2bk; - - /* filter delay handling */ - uint8_t saved_delay; - uint8_t delay_buf_index_ser[NO_ALLPASS_LINKS]; - uint8_t num_sample_delay_ser[NO_ALLPASS_LINKS]; - uint8_t delay_D[64]; - uint8_t delay_buf_index_delay[64]; - - complex_t delay_Qmf[14][64]; /* 14 samples delay max, 64 QMF channels */ - complex_t delay_SubQmf[2][32]; /* 2 samples delay max (SubQmf is always allpass filtered) */ - complex_t delay_Qmf_ser[NO_ALLPASS_LINKS][5][64]; /* 5 samples delay max (table 8.34), 64 QMF channels */ - complex_t delay_SubQmf_ser[NO_ALLPASS_LINKS][5][32]; /* 5 samples delay max (table 8.34) */ - - /* transients */ - real_t alpha_decay; - real_t alpha_smooth; - - real_t P_PeakDecayNrg[34]; - real_t P_prev[34]; - real_t P_SmoothPeakDecayDiffNrg_prev[34]; - - /* mixing and phase */ - complex_t h11_prev[50]; - complex_t h12_prev[50]; - complex_t h21_prev[50]; - complex_t h22_prev[50]; - uint8_t phase_hist; - complex_t ipd_prev[20][2]; - complex_t opd_prev[20][2]; - -} ps_info; - -/* ps_syntax.c */ -uint16_t ps_data(ps_info *ps, bitfile *ld, uint8_t *header); - -/* ps_dec.c */ -ps_info *ps_init(uint8_t sr_index); -void ps_free(ps_info *ps); - -uint8_t ps_decode(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]); - - -#ifdef __cplusplus -} -#endif -#endif - diff --git a/src/libfaad/ps_syntax.c b/src/libfaad/ps_syntax.c deleted file mode 100644 index fc2f9e7f2..000000000 --- a/src/libfaad/ps_syntax.c +++ /dev/null @@ -1,545 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR and PS decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: ps_syntax.c,v 1.1 2005/10/30 00:50:19 tmmm Exp $ -**/ - -#include "common.h" - -#ifdef PS_DEC - -#include "bits.h" -#include "ps_dec.h" - -/* type definitaions */ -typedef const int8_t (*ps_huff_tab)[2]; - -/* static data tables */ -static const uint8_t nr_iid_par_tab[] = { - 10, 20, 34, 10, 20, 34, 0, 0 -}; -static const uint8_t nr_ipdopd_par_tab[] = { - 5, 11, 17, 5, 11, 17, 0, 0 -}; -static const uint8_t nr_icc_par_tab[] = { - 10, 20, 34, 10, 20, 34, 0, 0 -}; -static const uint8_t num_env_tab[][4] = { - { 0, 1, 2, 4 }, - { 1, 2, 3, 4 } -}; - -/* binary lookup huffman tables */ -static const int8_t f_huff_iid_def[][2] = { - { /*0*/ -31, 1 }, /* index 0: 1 bits: x */ - { 2, 3 }, /* index 1: 2 bits: 1x */ - { /*1*/ -30, /*-1*/ -32 }, /* index 2: 3 bits: 10x */ - { 4, 5 }, /* index 3: 3 bits: 11x */ - { /*2*/ -29, /*-2*/ -33 }, /* index 4: 4 bits: 110x */ - { 6, 7 }, /* index 5: 4 bits: 111x */ - { /*3*/ -28, /*-3*/ -34 }, /* index 6: 5 bits: 1110x */ - { 8, 9 }, /* index 7: 5 bits: 1111x */ - { /*-4*/ -35, /*4*/ -27 }, /* index 8: 6 bits: 11110x */ - { /*5*/ -26, 10 }, /* index 9: 6 bits: 11111x */ - { /*-5*/ -36, 11 }, /* index 10: 7 bits: 111111x */ - { /*6*/ -25, 12 }, /* index 11: 8 bits: 1111111x */ - { /*-6*/ -37, 13 }, /* index 12: 9 bits: 11111111x */ - { /*-7*/ -38, 14 }, /* index 13: 10 bits: 111111111x */ - { /*7*/ -24, 15 }, /* index 14: 11 bits: 1111111111x */ - { 16, 17 }, /* index 15: 12 bits: 11111111111x */ - { /*8*/ -23, /*-8*/ -39 }, /* index 16: 13 bits: 111111111110x */ - { 18, 19 }, /* index 17: 13 bits: 111111111111x */ - { /*9*/ -22, /*10*/ -21 }, /* index 18: 14 bits: 1111111111110x */ - { 20, 21 }, /* index 19: 14 bits: 1111111111111x */ - { /*-9*/ -40, /*11*/ -20 }, /* index 20: 15 bits: 11111111111110x */ - { 22, 23 }, /* index 21: 15 bits: 11111111111111x */ - { /*-10*/ -41, 24 }, /* index 22: 16 bits: 111111111111110x */ - { 25, 26 }, /* index 23: 16 bits: 111111111111111x */ - { /*-11*/ -42, /*-14*/ -45 }, /* index 24: 17 bits: 1111111111111101x */ - { /*-13*/ -44, /*-12*/ -43 }, /* index 25: 17 bits: 1111111111111110x */ - { /*12*/ -19, 27 }, /* index 26: 17 bits: 1111111111111111x */ - { /*13*/ -18, /*14*/ -17 } /* index 27: 18 bits: 11111111111111111x */ -}; - -static const int8_t t_huff_iid_def[][2] = { - { /*0*/ -31, 1 }, /* index 0: 1 bits: x */ - { /*-1*/ -32, 2 }, /* index 1: 2 bits: 1x */ - { /*1*/ -30, 3 }, /* index 2: 3 bits: 11x */ - { /*-2*/ -33, 4 }, /* index 3: 4 bits: 111x */ - { /*2*/ -29, 5 }, /* index 4: 5 bits: 1111x */ - { /*-3*/ -34, 6 }, /* index 5: 6 bits: 11111x */ - { /*3*/ -28, 7 }, /* index 6: 7 bits: 111111x */ - { /*-4*/ -35, 8 }, /* index 7: 8 bits: 1111111x */ - { /*4*/ -27, 9 }, /* index 8: 9 bits: 11111111x */ - { /*-5*/ -36, 10 }, /* index 9: 10 bits: 111111111x */ - { /*5*/ -26, 11 }, /* index 10: 11 bits: 1111111111x */ - { /*-6*/ -37, 12 }, /* index 11: 12 bits: 11111111111x */ - { /*6*/ -25, 13 }, /* index 12: 13 bits: 111111111111x */ - { /*7*/ -24, 14 }, /* index 13: 14 bits: 1111111111111x */ - { /*-7*/ -38, 15 }, /* index 14: 15 bits: 11111111111111x */ - { 16, 17 }, /* index 15: 16 bits: 111111111111111x */ - { /*8*/ -23, /*-8*/ -39 }, /* index 16: 17 bits: 1111111111111110x */ - { 18, 19 }, /* index 17: 17 bits: 1111111111111111x */ - { 20, 21 }, /* index 18: 18 bits: 11111111111111110x */ - { 22, 23 }, /* index 19: 18 bits: 11111111111111111x */ - { /*9*/ -22, /*-14*/ -45 }, /* index 20: 19 bits: 111111111111111100x */ - { /*-13*/ -44, /*-12*/ -43 }, /* index 21: 19 bits: 111111111111111101x */ - { 24, 25 }, /* index 22: 19 bits: 111111111111111110x */ - { 26, 27 }, /* index 23: 19 bits: 111111111111111111x */ - { /*-11*/ -42, /*-10*/ -41 }, /* index 24: 20 bits: 1111111111111111100x */ - { /*-9*/ -40, /*10*/ -21 }, /* index 25: 20 bits: 1111111111111111101x */ - { /*11*/ -20, /*12*/ -19 }, /* index 26: 20 bits: 1111111111111111110x */ - { /*13*/ -18, /*14*/ -17 } /* index 27: 20 bits: 1111111111111111111x */ -}; - -static const int8_t f_huff_iid_fine[][2] = { - { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ - { 2, 3 }, /* index 1: 2 bits: 0x */ - { 4, /*-1*/ -32 }, /* index 2: 3 bits: 00x */ - { /*1*/ -30, 5 }, /* index 3: 3 bits: 01x */ - { /*-2*/ -33, /*2*/ -29 }, /* index 4: 4 bits: 000x */ - { 6, 7 }, /* index 5: 4 bits: 011x */ - { /*-3*/ -34, /*3*/ -28 }, /* index 6: 5 bits: 0110x */ - { 8, 9 }, /* index 7: 5 bits: 0111x */ - { /*-4*/ -35, /*4*/ -27 }, /* index 8: 6 bits: 01110x */ - { 10, 11 }, /* index 9: 6 bits: 01111x */ - { /*-5*/ -36, /*5*/ -26 }, /* index 10: 7 bits: 011110x */ - { 12, 13 }, /* index 11: 7 bits: 011111x */ - { /*-6*/ -37, /*6*/ -25 }, /* index 12: 8 bits: 0111110x */ - { 14, 15 }, /* index 13: 8 bits: 0111111x */ - { /*7*/ -24, 16 }, /* index 14: 9 bits: 01111110x */ - { 17, 18 }, /* index 15: 9 bits: 01111111x */ - { 19, /*-8*/ -39 }, /* index 16: 10 bits: 011111101x */ - { /*8*/ -23, 20 }, /* index 17: 10 bits: 011111110x */ - { 21, /*-7*/ -38 }, /* index 18: 10 bits: 011111111x */ - { /*10*/ -21, 22 }, /* index 19: 11 bits: 0111111010x */ - { 23, /*-9*/ -40 }, /* index 20: 11 bits: 0111111101x */ - { /*9*/ -22, 24 }, /* index 21: 11 bits: 0111111110x */ - { /*-11*/ -42, /*11*/ -20 }, /* index 22: 12 bits: 01111110101x */ - { 25, 26 }, /* index 23: 12 bits: 01111111010x */ - { 27, /*-10*/ -41 }, /* index 24: 12 bits: 01111111101x */ - { 28, /*-12*/ -43 }, /* index 25: 13 bits: 011111110100x */ - { /*12*/ -19, 29 }, /* index 26: 13 bits: 011111110101x */ - { 30, 31 }, /* index 27: 13 bits: 011111111010x */ - { 32, /*-14*/ -45 }, /* index 28: 14 bits: 0111111101000x */ - { /*14*/ -17, 33 }, /* index 29: 14 bits: 0111111101011x */ - { 34, /*-13*/ -44 }, /* index 30: 14 bits: 0111111110100x */ - { /*13*/ -18, 35 }, /* index 31: 14 bits: 0111111110101x */ - { 36, 37 }, /* index 32: 15 bits: 01111111010000x */ - { 38, /*-15*/ -46 }, /* index 33: 15 bits: 01111111010111x */ - { /*15*/ -16, 39 }, /* index 34: 15 bits: 01111111101000x */ - { 40, 41 }, /* index 35: 15 bits: 01111111101011x */ - { 42, 43 }, /* index 36: 16 bits: 011111110100000x */ - { /*-17*/ -48, /*17*/ -14 }, /* index 37: 16 bits: 011111110100001x */ - { 44, 45 }, /* index 38: 16 bits: 011111110101110x */ - { 46, 47 }, /* index 39: 16 bits: 011111111010001x */ - { 48, 49 }, /* index 40: 16 bits: 011111111010110x */ - { /*-16*/ -47, /*16*/ -15 }, /* index 41: 16 bits: 011111111010111x */ - { /*-21*/ -52, /*21*/ -10 }, /* index 42: 17 bits: 0111111101000000x */ - { /*-19*/ -50, /*19*/ -12 }, /* index 43: 17 bits: 0111111101000001x */ - { /*-18*/ -49, /*18*/ -13 }, /* index 44: 17 bits: 0111111101011100x */ - { 50, 51 }, /* index 45: 17 bits: 0111111101011101x */ - { 52, 53 }, /* index 46: 17 bits: 0111111110100010x */ - { 54, 55 }, /* index 47: 17 bits: 0111111110100011x */ - { 56, 57 }, /* index 48: 17 bits: 0111111110101100x */ - { 58, 59 }, /* index 49: 17 bits: 0111111110101101x */ - { /*-26*/ -57, /*-25*/ -56 }, /* index 50: 18 bits: 01111111010111010x */ - { /*-28*/ -59, /*-27*/ -58 }, /* index 51: 18 bits: 01111111010111011x */ - { /*-22*/ -53, /*22*/ -9 }, /* index 52: 18 bits: 01111111101000100x */ - { /*-24*/ -55, /*-23*/ -54 }, /* index 53: 18 bits: 01111111101000101x */ - { /*25*/ -6, /*26*/ -5 }, /* index 54: 18 bits: 01111111101000110x */ - { /*23*/ -8, /*24*/ -7 }, /* index 55: 18 bits: 01111111101000111x */ - { /*29*/ -2, /*30*/ -1 }, /* index 56: 18 bits: 01111111101011000x */ - { /*27*/ -4, /*28*/ -3 }, /* index 57: 18 bits: 01111111101011001x */ - { /*-30*/ -61, /*-29*/ -60 }, /* index 58: 18 bits: 01111111101011010x */ - { /*-20*/ -51, /*20*/ -11 } /* index 59: 18 bits: 01111111101011011x */ -}; - -static const int8_t t_huff_iid_fine[][2] = { - { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ - { /*1*/ -30, 2 }, /* index 1: 2 bits: 0x */ - { 3, /*-1*/ -32 }, /* index 2: 3 bits: 01x */ - { 4, 5 }, /* index 3: 4 bits: 010x */ - { 6, 7 }, /* index 4: 5 bits: 0100x */ - { /*-2*/ -33, /*2*/ -29 }, /* index 5: 5 bits: 0101x */ - { 8, /*-3*/ -34 }, /* index 6: 6 bits: 01000x */ - { /*3*/ -28, 9 }, /* index 7: 6 bits: 01001x */ - { /*-4*/ -35, /*4*/ -27 }, /* index 8: 7 bits: 010000x */ - { 10, 11 }, /* index 9: 7 bits: 010011x */ - { /*5*/ -26, 12 }, /* index 10: 8 bits: 0100110x */ - { 13, 14 }, /* index 11: 8 bits: 0100111x */ - { /*-6*/ -37, /*6*/ -25 }, /* index 12: 9 bits: 01001101x */ - { 15, 16 }, /* index 13: 9 bits: 01001110x */ - { 17, /*-5*/ -36 }, /* index 14: 9 bits: 01001111x */ - { 18, /*-7*/ -38 }, /* index 15: 10 bits: 010011100x */ - { /*7*/ -24, 19 }, /* index 16: 10 bits: 010011101x */ - { 20, 21 }, /* index 17: 10 bits: 010011110x */ - { /*9*/ -22, 22 }, /* index 18: 11 bits: 0100111000x */ - { 23, 24 }, /* index 19: 11 bits: 0100111011x */ - { /*-8*/ -39, /*8*/ -23 }, /* index 20: 11 bits: 0100111100x */ - { 25, 26 }, /* index 21: 11 bits: 0100111101x */ - { /*11*/ -20, 27 }, /* index 22: 12 bits: 01001110001x */ - { 28, 29 }, /* index 23: 12 bits: 01001110110x */ - { /*-10*/ -41, /*10*/ -21 }, /* index 24: 12 bits: 01001110111x */ - { 30, 31 }, /* index 25: 12 bits: 01001111010x */ - { 32, /*-9*/ -40 }, /* index 26: 12 bits: 01001111011x */ - { 33, /*-13*/ -44 }, /* index 27: 13 bits: 010011100011x */ - { /*13*/ -18, 34 }, /* index 28: 13 bits: 010011101100x */ - { 35, 36 }, /* index 29: 13 bits: 010011101101x */ - { 37, /*-12*/ -43 }, /* index 30: 13 bits: 010011110100x */ - { /*12*/ -19, 38 }, /* index 31: 13 bits: 010011110101x */ - { 39, /*-11*/ -42 }, /* index 32: 13 bits: 010011110110x */ - { 40, 41 }, /* index 33: 14 bits: 0100111000110x */ - { 42, 43 }, /* index 34: 14 bits: 0100111011001x */ - { 44, 45 }, /* index 35: 14 bits: 0100111011010x */ - { 46, /*-15*/ -46 }, /* index 36: 14 bits: 0100111011011x */ - { /*15*/ -16, 47 }, /* index 37: 14 bits: 0100111101000x */ - { /*-14*/ -45, /*14*/ -17 }, /* index 38: 14 bits: 0100111101011x */ - { 48, 49 }, /* index 39: 14 bits: 0100111101100x */ - { /*-21*/ -52, /*-20*/ -51 }, /* index 40: 15 bits: 01001110001100x */ - { /*18*/ -13, /*19*/ -12 }, /* index 41: 15 bits: 01001110001101x */ - { /*-19*/ -50, /*-18*/ -49 }, /* index 42: 15 bits: 01001110110010x */ - { 50, 51 }, /* index 43: 15 bits: 01001110110011x */ - { 52, 53 }, /* index 44: 15 bits: 01001110110100x */ - { 54, 55 }, /* index 45: 15 bits: 01001110110101x */ - { 56, /*-17*/ -48 }, /* index 46: 15 bits: 01001110110110x */ - { /*17*/ -14, 57 }, /* index 47: 15 bits: 01001111010001x */ - { 58, /*-16*/ -47 }, /* index 48: 15 bits: 01001111011000x */ - { /*16*/ -15, 59 }, /* index 49: 15 bits: 01001111011001x */ - { /*-26*/ -57, /*26*/ -5 }, /* index 50: 16 bits: 010011101100110x */ - { /*-28*/ -59, /*-27*/ -58 }, /* index 51: 16 bits: 010011101100111x */ - { /*29*/ -2, /*30*/ -1 }, /* index 52: 16 bits: 010011101101000x */ - { /*27*/ -4, /*28*/ -3 }, /* index 53: 16 bits: 010011101101001x */ - { /*-30*/ -61, /*-29*/ -60 }, /* index 54: 16 bits: 010011101101010x */ - { /*-25*/ -56, /*25*/ -6 }, /* index 55: 16 bits: 010011101101011x */ - { /*-24*/ -55, /*24*/ -7 }, /* index 56: 16 bits: 010011101101100x */ - { /*-23*/ -54, /*23*/ -8 }, /* index 57: 16 bits: 010011110100011x */ - { /*-22*/ -53, /*22*/ -9 }, /* index 58: 16 bits: 010011110110000x */ - { /*20*/ -11, /*21*/ -10 } /* index 59: 16 bits: 010011110110011x */ -}; - -static const int8_t f_huff_icc[][2] = { - { /*0*/ -31, 1 }, /* index 0: 1 bits: x */ - { /*1*/ -30, 2 }, /* index 1: 2 bits: 1x */ - { /*-1*/ -32, 3 }, /* index 2: 3 bits: 11x */ - { /*2*/ -29, 4 }, /* index 3: 4 bits: 111x */ - { /*-2*/ -33, 5 }, /* index 4: 5 bits: 1111x */ - { /*3*/ -28, 6 }, /* index 5: 6 bits: 11111x */ - { /*-3*/ -34, 7 }, /* index 6: 7 bits: 111111x */ - { /*4*/ -27, 8 }, /* index 7: 8 bits: 1111111x */ - { /*5*/ -26, 9 }, /* index 8: 9 bits: 11111111x */ - { /*-4*/ -35, 10 }, /* index 9: 10 bits: 111111111x */ - { /*6*/ -25, 11 }, /* index 10: 11 bits: 1111111111x */ - { /*-5*/ -36, 12 }, /* index 11: 12 bits: 11111111111x */ - { /*7*/ -24, 13 }, /* index 12: 13 bits: 111111111111x */ - { /*-6*/ -37, /*-7*/ -38 } /* index 13: 14 bits: 1111111111111x */ -}; - -static const int8_t t_huff_icc[][2] = { - { /*0*/ -31, 1 }, /* index 0: 1 bits: x */ - { /*1*/ -30, 2 }, /* index 1: 2 bits: 1x */ - { /*-1*/ -32, 3 }, /* index 2: 3 bits: 11x */ - { /*2*/ -29, 4 }, /* index 3: 4 bits: 111x */ - { /*-2*/ -33, 5 }, /* index 4: 5 bits: 1111x */ - { /*3*/ -28, 6 }, /* index 5: 6 bits: 11111x */ - { /*-3*/ -34, 7 }, /* index 6: 7 bits: 111111x */ - { /*4*/ -27, 8 }, /* index 7: 8 bits: 1111111x */ - { /*-4*/ -35, 9 }, /* index 8: 9 bits: 11111111x */ - { /*5*/ -26, 10 }, /* index 9: 10 bits: 111111111x */ - { /*-5*/ -36, 11 }, /* index 10: 11 bits: 1111111111x */ - { /*6*/ -25, 12 }, /* index 11: 12 bits: 11111111111x */ - { /*-6*/ -37, 13 }, /* index 12: 13 bits: 111111111111x */ - { /*-7*/ -38, /*7*/ -24 } /* index 13: 14 bits: 1111111111111x */ -}; - -static const int8_t f_huff_ipd[][2] = { - { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ - { 2, 3 }, /* index 1: 2 bits: 0x */ - { /*1*/ -30, 4 }, /* index 2: 3 bits: 00x */ - { 5, 6 }, /* index 3: 3 bits: 01x */ - { /*4*/ -27, /*5*/ -26 }, /* index 4: 4 bits: 001x */ - { /*3*/ -28, /*6*/ -25 }, /* index 5: 4 bits: 010x */ - { /*2*/ -29, /*7*/ -24 } /* index 6: 4 bits: 011x */ -}; - -static const int8_t t_huff_ipd[][2] = { - { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ - { 2, 3 }, /* index 1: 2 bits: 0x */ - { 4, 5 }, /* index 2: 3 bits: 00x */ - { /*1*/ -30, /*7*/ -24 }, /* index 3: 3 bits: 01x */ - { /*5*/ -26, 6 }, /* index 4: 4 bits: 000x */ - { /*2*/ -29, /*6*/ -25 }, /* index 5: 4 bits: 001x */ - { /*4*/ -27, /*3*/ -28 } /* index 6: 5 bits: 0001x */ -}; - -static const int8_t f_huff_opd[][2] = { - { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ - { 2, 3 }, /* index 1: 2 bits: 0x */ - { /*7*/ -24, /*1*/ -30 }, /* index 2: 3 bits: 00x */ - { 4, 5 }, /* index 3: 3 bits: 01x */ - { /*3*/ -28, /*6*/ -25 }, /* index 4: 4 bits: 010x */ - { /*2*/ -29, 6 }, /* index 5: 4 bits: 011x */ - { /*5*/ -26, /*4*/ -27 } /* index 6: 5 bits: 0111x */ -}; - -static const int8_t t_huff_opd[][2] = { - { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ - { 2, 3 }, /* index 1: 2 bits: 0x */ - { 4, 5 }, /* index 2: 3 bits: 00x */ - { /*1*/ -30, /*7*/ -24 }, /* index 3: 3 bits: 01x */ - { /*5*/ -26, 6 }, /* index 4: 4 bits: 000x */ - { /*2*/ -29, /*6*/ -25 }, /* index 5: 4 bits: 001x */ - { /*4*/ -27, /*3*/ -28 } /* index 6: 5 bits: 0001x */ -}; - -/* static function declarations */ -static uint16_t ps_extension(ps_info *ps, bitfile *ld, - const uint8_t ps_extension_id, - const uint16_t num_bits_left); -static void huff_data(bitfile *ld, const uint8_t dt, const uint8_t nr_par, - ps_huff_tab t_huff, ps_huff_tab f_huff, int8_t *par); -static INLINE int8_t ps_huff_dec(bitfile *ld, ps_huff_tab t_huff); - - -uint16_t ps_data(ps_info *ps, bitfile *ld, uint8_t *header) -{ - uint8_t tmp, n; - uint16_t bits = (uint16_t)faad_get_processed_bits(ld); - - *header = 0; - - /* check for new PS header */ - if (faad_get1bit(ld - DEBUGVAR(1,1000,"ps_data(): enable_ps_header"))) - { - *header = 1; - - ps->header_read = 1; - - ps->use34hybrid_bands = 0; - - /* Inter-channel Intensity Difference (IID) parameters enabled */ - ps->enable_iid = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,1001,"ps_data(): enable_iid")); - - if (ps->enable_iid) - { - ps->iid_mode = (uint8_t)faad_getbits(ld, 3 - DEBUGVAR(1,1002,"ps_data(): iid_mode")); - - ps->nr_iid_par = nr_iid_par_tab[ps->iid_mode]; - ps->nr_ipdopd_par = nr_ipdopd_par_tab[ps->iid_mode]; - - if (ps->iid_mode == 2 || ps->iid_mode == 5) - ps->use34hybrid_bands = 1; - - /* IPD freq res equal to IID freq res */ - ps->ipd_mode = ps->iid_mode; - } - - /* Inter-channel Coherence (ICC) parameters enabled */ - ps->enable_icc = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,1003,"ps_data(): enable_icc")); - - if (ps->enable_icc) - { - ps->icc_mode = (uint8_t)faad_getbits(ld, 3 - DEBUGVAR(1,1004,"ps_data(): icc_mode")); - - ps->nr_icc_par = nr_icc_par_tab[ps->icc_mode]; - - if (ps->icc_mode == 2 || ps->icc_mode == 5) - ps->use34hybrid_bands = 1; - } - - /* PS extension layer enabled */ - ps->enable_ext = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,1005,"ps_data(): enable_ext")); - } - - /* we are here, but no header has been read yet */ - if (ps->header_read == 0) - return 1; - - ps->frame_class = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,1006,"ps_data(): frame_class")); - tmp = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,1007,"ps_data(): num_env_idx")); - - ps->num_env = num_env_tab[ps->frame_class][tmp]; - - if (ps->frame_class) - { - for (n = 1; n < ps->num_env+1; n++) - { - ps->border_position[n] = (uint8_t)faad_getbits(ld, 5 - DEBUGVAR(1,1008,"ps_data(): border_position")); - } - } - - if (ps->enable_iid) - { - for (n = 0; n < ps->num_env; n++) - { - ps->iid_dt[n] = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,1009,"ps_data(): iid_dt")); - - /* iid_data */ - if (ps->iid_mode < 3) - { - huff_data(ld, ps->iid_dt[n], ps->nr_iid_par, t_huff_iid_def, - f_huff_iid_def, ps->iid_index[n]); - } else { - huff_data(ld, ps->iid_dt[n], ps->nr_iid_par, t_huff_iid_fine, - f_huff_iid_fine, ps->iid_index[n]); - } - } - } - - if (ps->enable_icc) - { - for (n = 0; n < ps->num_env; n++) - { - ps->icc_dt[n] = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,1010,"ps_data(): icc_dt")); - - /* icc_data */ - huff_data(ld, ps->icc_dt[n], ps->nr_icc_par, t_huff_icc, - f_huff_icc, ps->icc_index[n]); - } - } - - if (ps->enable_ext) - { - uint16_t num_bits_left; - uint16_t cnt = (uint16_t)faad_getbits(ld, 4 - DEBUGVAR(1,1011,"ps_data(): ps_extension_size")); - if (cnt == 15) - { - cnt += (uint16_t)faad_getbits(ld, 8 - DEBUGVAR(1,1012,"ps_data(): esc_count")); - } - - num_bits_left = 8 * cnt; - while (num_bits_left > 7) - { - uint8_t ps_extension_id = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,1013,"ps_data(): ps_extension_size")); - - num_bits_left -= 2; - num_bits_left -= ps_extension(ps, ld, ps_extension_id, num_bits_left); - } - - faad_getbits(ld, num_bits_left - DEBUGVAR(1,1014,"ps_data(): fill_bits")); - } - - bits = (uint16_t)faad_get_processed_bits(ld) - bits; - - ps->ps_data_available = 1; - - return bits; -} - -static uint16_t ps_extension(ps_info *ps, bitfile *ld, - const uint8_t ps_extension_id, - const uint16_t num_bits_left) -{ - uint8_t n; - uint16_t bits = (uint16_t)faad_get_processed_bits(ld); - - if (ps_extension_id == 0) - { - ps->enable_ipdopd = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,1015,"ps_extension(): enable_ipdopd")); - - if (ps->enable_ipdopd) - { - for (n = 0; n < ps->num_env; n++) - { - ps->ipd_dt[n] = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,1016,"ps_extension(): ipd_dt")); - - /* ipd_data */ - huff_data(ld, ps->ipd_dt[n], ps->nr_ipdopd_par, t_huff_ipd, - f_huff_ipd, ps->ipd_index[n]); - - ps->opd_dt[n] = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,1017,"ps_extension(): opd_dt")); - - /* opd_data */ - huff_data(ld, ps->opd_dt[n], ps->nr_ipdopd_par, t_huff_opd, - f_huff_opd, ps->opd_index[n]); - } - } - faad_get1bit(ld - DEBUGVAR(1,1018,"ps_extension(): reserved_ps")); - } - - /* return number of bits read */ - bits = (uint16_t)faad_get_processed_bits(ld) - bits; - - return bits; -} - -/* read huffman data coded in either the frequency or the time direction */ -static void huff_data(bitfile *ld, const uint8_t dt, const uint8_t nr_par, - ps_huff_tab t_huff, ps_huff_tab f_huff, int8_t *par) -{ - uint8_t n; - - if (dt) - { - /* coded in time direction */ - for (n = 0; n < nr_par; n++) - { - par[n] = ps_huff_dec(ld, t_huff); - } - } else { - /* coded in frequency direction */ - par[0] = ps_huff_dec(ld, f_huff); - - for (n = 1; n < nr_par; n++) - { - par[n] = ps_huff_dec(ld, f_huff); - } - } -} - -/* binary search huffman decoding */ -static INLINE int8_t ps_huff_dec(bitfile *ld, ps_huff_tab t_huff) -{ - uint8_t bit; - int16_t index = 0; - - while (index >= 0) - { - bit = (uint8_t)faad_get1bit(ld); - index = t_huff[index][bit]; - } - - return index + 31; -} - -#endif diff --git a/src/libfaad/ps_tables.h b/src/libfaad/ps_tables.h deleted file mode 100644 index c71489617..000000000 --- a/src/libfaad/ps_tables.h +++ /dev/null @@ -1,547 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: ps_tables.h,v 1.1 2005/10/30 00:50:19 tmmm Exp $ -**/ - -#ifndef __PS_TABLES_H__ -#define __PS_TABLES_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _MSC_VER -#pragma warning(disable:4305) -#pragma warning(disable:4244) -#endif - -#if 0 -#if 0 -float f_center_20[12] = { - 0.5/4, 1.5/4, 2.5/4, 3.5/4, - 4.5/4*0, 5.5/4*0, -1.5/4, -0.5/4, - 3.5/2, 2.5/2, 4.5/2, 5.5/2 -}; -#else -float f_center_20[12] = { - 0.5/8, 1.5/8, 2.5/8, 3.5/8, - 4.5/8*0, 5.5/8*0, -1.5/8, -0.5/8, - 3.5/4, 2.5/4, 4.5/4, 5.5/4 -}; -#endif - -float f_center_34[32] = { - 1/12, 3/12, 5/12, 7/12, - 9/12, 11/12, 13/12, 15/12, - 17/12, -5/12, -3/12, -1/12, - 17/8, 19/8, 5/8, 7/8, - 9/8, 11/8, 13/8, 15/8, - 9/4, 11/4, 13/4, 7/4, - 17/4, 11/4, 13/4, 15/4, - 17/4, 19/4, 21/4, 15/4 -}; - -static const real_t frac_delay_q[] = { - FRAC_CONST(0.43), - FRAC_CONST(0.75), - FRAC_CONST(0.347) -}; -#endif - -/* RE(ps->Phi_Fract_Qmf[j]) = (float)cos(M_PI*(j+0.5)*(0.39)); */ -/* IM(ps->Phi_Fract_Qmf[j]) = (float)sin(M_PI*(j+0.5)*(0.39)); */ -static const complex_t Phi_Fract_Qmf[] = { - { FRAC_CONST(0.8181497455), FRAC_CONST(0.5750052333) }, - { FRAC_CONST(-0.2638730407), FRAC_CONST(0.9645574093) }, - { FRAC_CONST(-0.9969173074), FRAC_CONST(0.0784590989) }, - { FRAC_CONST(-0.4115143716), FRAC_CONST(-0.9114032984) }, - { FRAC_CONST(0.7181262970), FRAC_CONST(-0.6959127784) }, - { FRAC_CONST(0.8980275989), FRAC_CONST(0.4399391711) }, - { FRAC_CONST(-0.1097343117), FRAC_CONST(0.9939609766) }, - { FRAC_CONST(-0.9723699093), FRAC_CONST(0.2334453613) }, - { FRAC_CONST(-0.5490227938), FRAC_CONST(-0.8358073831) }, - { FRAC_CONST(0.6004202366), FRAC_CONST(-0.7996846437) }, - { FRAC_CONST(0.9557930231), FRAC_CONST(0.2940403223) }, - { FRAC_CONST(0.0471064523), FRAC_CONST(0.9988898635) }, - { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, - { FRAC_CONST(-0.6730124950), FRAC_CONST(-0.7396311164) }, - { FRAC_CONST(0.4679298103), FRAC_CONST(-0.8837656379) }, - { FRAC_CONST(0.9900236726), FRAC_CONST(0.1409012377) }, - { FRAC_CONST(0.2027872950), FRAC_CONST(0.9792228341) }, - { FRAC_CONST(-0.8526401520), FRAC_CONST(0.5224985480) }, - { FRAC_CONST(-0.7804304361), FRAC_CONST(-0.6252426505) }, - { FRAC_CONST(0.3239174187), FRAC_CONST(-0.9460853338) }, - { FRAC_CONST(0.9998766184), FRAC_CONST(-0.0157073177) }, - { FRAC_CONST(0.3534748554), FRAC_CONST(0.9354440570) }, - { FRAC_CONST(-0.7604059577), FRAC_CONST(0.6494480371) }, - { FRAC_CONST(-0.8686315417), FRAC_CONST(-0.4954586625) }, - { FRAC_CONST(0.1719291061), FRAC_CONST(-0.9851093292) }, - { FRAC_CONST(0.9851093292), FRAC_CONST(-0.1719291061) }, - { FRAC_CONST(0.4954586625), FRAC_CONST(0.8686315417) }, - { FRAC_CONST(-0.6494480371), FRAC_CONST(0.7604059577) }, - { FRAC_CONST(-0.9354440570), FRAC_CONST(-0.3534748554) }, - { FRAC_CONST(0.0157073177), FRAC_CONST(-0.9998766184) }, - { FRAC_CONST(0.9460853338), FRAC_CONST(-0.3239174187) }, - { FRAC_CONST(0.6252426505), FRAC_CONST(0.7804304361) }, - { FRAC_CONST(-0.5224985480), FRAC_CONST(0.8526401520) }, - { FRAC_CONST(-0.9792228341), FRAC_CONST(-0.2027872950) }, - { FRAC_CONST(-0.1409012377), FRAC_CONST(-0.9900236726) }, - { FRAC_CONST(0.8837656379), FRAC_CONST(-0.4679298103) }, - { FRAC_CONST(0.7396311164), FRAC_CONST(0.6730124950) }, - { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, - { FRAC_CONST(-0.9988898635), FRAC_CONST(-0.0471064523) }, - { FRAC_CONST(-0.2940403223), FRAC_CONST(-0.9557930231) }, - { FRAC_CONST(0.7996846437), FRAC_CONST(-0.6004202366) }, - { FRAC_CONST(0.8358073831), FRAC_CONST(0.5490227938) }, - { FRAC_CONST(-0.2334453613), FRAC_CONST(0.9723699093) }, - { FRAC_CONST(-0.9939609766), FRAC_CONST(0.1097343117) }, - { FRAC_CONST(-0.4399391711), FRAC_CONST(-0.8980275989) }, - { FRAC_CONST(0.6959127784), FRAC_CONST(-0.7181262970) }, - { FRAC_CONST(0.9114032984), FRAC_CONST(0.4115143716) }, - { FRAC_CONST(-0.0784590989), FRAC_CONST(0.9969173074) }, - { FRAC_CONST(-0.9645574093), FRAC_CONST(0.2638730407) }, - { FRAC_CONST(-0.5750052333), FRAC_CONST(-0.8181497455) }, - { FRAC_CONST(0.5750052333), FRAC_CONST(-0.8181497455) }, - { FRAC_CONST(0.9645574093), FRAC_CONST(0.2638730407) }, - { FRAC_CONST(0.0784590989), FRAC_CONST(0.9969173074) }, - { FRAC_CONST(-0.9114032984), FRAC_CONST(0.4115143716) }, - { FRAC_CONST(-0.6959127784), FRAC_CONST(-0.7181262970) }, - { FRAC_CONST(0.4399391711), FRAC_CONST(-0.8980275989) }, - { FRAC_CONST(0.9939609766), FRAC_CONST(0.1097343117) }, - { FRAC_CONST(0.2334453613), FRAC_CONST(0.9723699093) }, - { FRAC_CONST(-0.8358073831), FRAC_CONST(0.5490227938) }, - { FRAC_CONST(-0.7996846437), FRAC_CONST(-0.6004202366) }, - { FRAC_CONST(0.2940403223), FRAC_CONST(-0.9557930231) }, - { FRAC_CONST(0.9988898635), FRAC_CONST(-0.0471064523) }, - { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, - { FRAC_CONST(-0.7396311164), FRAC_CONST(0.6730124950) } -}; - -/* RE(Phi_Fract_SubQmf20[j]) = (float)cos(M_PI*f_center_20[j]*0.39); */ -/* IM(Phi_Fract_SubQmf20[j]) = (float)sin(M_PI*f_center_20[j]*0.39); */ -static const complex_t Phi_Fract_SubQmf20[] = { - { FRAC_CONST(0.9882950187), FRAC_CONST(0.1525546312) }, - { FRAC_CONST(0.8962930441), FRAC_CONST(0.4434623122) }, - { FRAC_CONST(0.7208535671), FRAC_CONST(0.6930873394) }, - { FRAC_CONST(0.4783087075), FRAC_CONST(0.8781917691) }, - { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, - { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, - { FRAC_CONST(0.8962930441), FRAC_CONST(-0.4434623122) }, - { FRAC_CONST(0.9882950187), FRAC_CONST(-0.1525546312) }, - { FRAC_CONST(-0.5424415469), FRAC_CONST(0.8400935531) }, - { FRAC_CONST(0.0392598175), FRAC_CONST(0.9992290139) }, - { FRAC_CONST(-0.9268565774), FRAC_CONST(0.3754155636) }, - { FRAC_CONST(-0.9741733670), FRAC_CONST(-0.2258012742) } -}; - -/* RE(Phi_Fract_SubQmf34[j]) = (float)cos(M_PI*f_center_34[j]*0.39); */ -/* IM(Phi_Fract_SubQmf34[j]) = (float)sin(M_PI*f_center_34[j]*0.39); */ -static const complex_t Phi_Fract_SubQmf34[] = { - { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, - { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, - { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, - { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, - { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, - { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, - { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, - { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, - { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, - { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, - { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, - { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, - { FRAC_CONST(-0.7705132365), FRAC_CONST(0.6374239922) }, - { FRAC_CONST(-0.7705132365), FRAC_CONST(0.6374239922) }, - { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, - { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, - { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, - { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, - { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, - { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, - { FRAC_CONST(-0.7705132365), FRAC_CONST(0.6374239922) }, - { FRAC_CONST(-0.7705132365), FRAC_CONST(0.6374239922) }, - { FRAC_CONST(-0.8607420325), FRAC_CONST(-0.5090414286) }, - { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, - { FRAC_CONST(0.1873813123), FRAC_CONST(-0.9822872281) }, - { FRAC_CONST(-0.7705132365), FRAC_CONST(0.6374239922) }, - { FRAC_CONST(-0.8607420325), FRAC_CONST(-0.5090414286) }, - { FRAC_CONST(-0.8607420325), FRAC_CONST(-0.5090414286) }, - { FRAC_CONST(0.1873813123), FRAC_CONST(-0.9822872281) }, - { FRAC_CONST(0.1873813123), FRAC_CONST(-0.9822872281) }, - { FRAC_CONST(0.9876883626), FRAC_CONST(-0.1564344615) }, - { FRAC_CONST(-0.8607420325), FRAC_CONST(-0.5090414286) } -}; - -/* RE(Q_Fract_allpass_Qmf[j][i]) = (float)cos(M_PI*(j+0.5)*(frac_delay_q[i])); */ -/* IM(Q_Fract_allpass_Qmf[j][i]) = (float)sin(M_PI*(j+0.5)*(frac_delay_q[i])); */ -static const complex_t Q_Fract_allpass_Qmf[][3] = { - { { FRAC_CONST(0.7804303765), FRAC_CONST(0.6252426505) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.8550928831), FRAC_CONST(0.5184748173) } }, - { { FRAC_CONST(-0.4399392009), FRAC_CONST(0.8980275393) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.0643581524), FRAC_CONST(0.9979268909) } }, - { { FRAC_CONST(-0.9723699093), FRAC_CONST(-0.2334454209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.9146071672), FRAC_CONST(0.4043435752) } }, - { { FRAC_CONST(0.0157073960), FRAC_CONST(-0.9998766184) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7814115286), FRAC_CONST(-0.6240159869) } }, - { { FRAC_CONST(0.9792228341), FRAC_CONST(-0.2027871907) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.1920081824), FRAC_CONST(-0.9813933372) } }, - { { FRAC_CONST(0.4115142524), FRAC_CONST(0.9114032984) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9589683414), FRAC_CONST(-0.2835132182) } }, - { { FRAC_CONST(-0.7996847630), FRAC_CONST(0.6004201174) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.6947838664), FRAC_CONST(0.7192186117) } }, - { { FRAC_CONST(-0.7604058385), FRAC_CONST(-0.6494481564) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3164770305), FRAC_CONST(0.9486001730) } }, - { { FRAC_CONST(0.4679299891), FRAC_CONST(-0.8837655187) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9874414206), FRAC_CONST(0.1579856575) } }, - { { FRAC_CONST(0.9645573497), FRAC_CONST(0.2638732493) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.5966450572), FRAC_CONST(-0.8025052547) } }, - { { FRAC_CONST(-0.0471066870), FRAC_CONST(0.9988898635) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.4357025325), FRAC_CONST(-0.9000906944) } }, - { { FRAC_CONST(-0.9851093888), FRAC_CONST(0.1719288528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9995546937), FRAC_CONST(-0.0298405960) } }, - { { FRAC_CONST(-0.3826831877), FRAC_CONST(-0.9238796234) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.4886211455), FRAC_CONST(0.8724960685) } }, - { { FRAC_CONST(0.8181498647), FRAC_CONST(-0.5750049949) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.5477093458), FRAC_CONST(0.8366686702) } }, - { { FRAC_CONST(0.7396308780), FRAC_CONST(0.6730127335) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9951074123), FRAC_CONST(-0.0987988561) } }, - { { FRAC_CONST(-0.4954589605), FRAC_CONST(0.8686313629) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3725017905), FRAC_CONST(-0.9280315042) } }, - { { FRAC_CONST(-0.9557929039), FRAC_CONST(-0.2940406799) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.6506417990), FRAC_CONST(-0.7593847513) } }, - { { FRAC_CONST(0.0784594864), FRAC_CONST(-0.9969173074) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9741733670), FRAC_CONST(0.2258014232) } }, - { { FRAC_CONST(0.9900237322), FRAC_CONST(-0.1409008205) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.2502108514), FRAC_CONST(0.9681913853) } }, - { { FRAC_CONST(0.3534744382), FRAC_CONST(0.9354441762) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7427945137), FRAC_CONST(0.6695194840) } }, - { { FRAC_CONST(-0.8358076215), FRAC_CONST(0.5490224361) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9370992780), FRAC_CONST(-0.3490629196) } }, - { { FRAC_CONST(-0.7181259394), FRAC_CONST(-0.6959131360) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.1237744763), FRAC_CONST(-0.9923103452) } }, - { { FRAC_CONST(0.5224990249), FRAC_CONST(-0.8526399136) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.8226406574), FRAC_CONST(-0.5685616732) } }, - { { FRAC_CONST(0.9460852146), FRAC_CONST(0.3239179254) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.8844994903), FRAC_CONST(0.4665412009) } }, - { { FRAC_CONST(-0.1097348556), FRAC_CONST(0.9939609170) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.0047125919), FRAC_CONST(0.9999889135) } }, - { { FRAC_CONST(-0.9939610362), FRAC_CONST(0.1097337380) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8888573647), FRAC_CONST(0.4581840038) } }, - { { FRAC_CONST(-0.3239168525), FRAC_CONST(-0.9460855722) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8172453642), FRAC_CONST(-0.5762898922) } }, - { { FRAC_CONST(0.8526405096), FRAC_CONST(-0.5224980116) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.1331215799), FRAC_CONST(-0.9910997152) } }, - { { FRAC_CONST(0.6959123611), FRAC_CONST(0.7181267142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9403476119), FRAC_CONST(-0.3402152061) } }, - { { FRAC_CONST(-0.5490233898), FRAC_CONST(0.8358070254) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7364512086), FRAC_CONST(0.6764906645) } }, - { { FRAC_CONST(-0.9354437590), FRAC_CONST(-0.3534754813) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2593250275), FRAC_CONST(0.9657900929) } }, - { { FRAC_CONST(0.1409019381), FRAC_CONST(-0.9900235534) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9762582779), FRAC_CONST(0.2166097313) } }, - { { FRAC_CONST(0.9969173670), FRAC_CONST(-0.0784583688) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.6434556246), FRAC_CONST(-0.7654833794) } }, - { { FRAC_CONST(0.2940396070), FRAC_CONST(0.9557932615) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3812320232), FRAC_CONST(-0.9244794250) } }, - { { FRAC_CONST(-0.8686318994), FRAC_CONST(0.4954580069) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9959943891), FRAC_CONST(-0.0894154981) } }, - { { FRAC_CONST(-0.6730118990), FRAC_CONST(-0.7396316528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.5397993922), FRAC_CONST(0.8417937160) } }, - { { FRAC_CONST(0.5750059485), FRAC_CONST(-0.8181492686) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.4968227744), FRAC_CONST(0.8678520322) } }, - { { FRAC_CONST(0.9238792062), FRAC_CONST(0.3826842010) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9992290139), FRAC_CONST(-0.0392601527) } }, - { { FRAC_CONST(-0.1719299555), FRAC_CONST(0.9851091504) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4271997511), FRAC_CONST(-0.9041572809) } }, - { { FRAC_CONST(-0.9988899231), FRAC_CONST(0.0471055657) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.6041822433), FRAC_CONST(-0.7968461514) } }, - { { FRAC_CONST(-0.2638721764), FRAC_CONST(-0.9645576477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9859085083), FRAC_CONST(0.1672853529) } }, - { { FRAC_CONST(0.8837660551), FRAC_CONST(-0.4679289758) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3075223565), FRAC_CONST(0.9515408874) } }, - { { FRAC_CONST(0.6494473219), FRAC_CONST(0.7604066133) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.7015317082), FRAC_CONST(0.7126382589) } }, - { { FRAC_CONST(-0.6004210114), FRAC_CONST(0.7996840477) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9562535882), FRAC_CONST(-0.2925389707) } }, - { { FRAC_CONST(-0.9114028811), FRAC_CONST(-0.4115152657) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.1827499419), FRAC_CONST(-0.9831594229) } }, - { { FRAC_CONST(0.2027882934), FRAC_CONST(-0.9792225957) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7872582674), FRAC_CONST(-0.6166234016) } }, - { { FRAC_CONST(0.9998766780), FRAC_CONST(-0.0157062728) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9107555747), FRAC_CONST(0.4129458666) } }, - { { FRAC_CONST(0.2334443331), FRAC_CONST(0.9723701477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.0549497530), FRAC_CONST(0.9984891415) } }, - { { FRAC_CONST(-0.8980280757), FRAC_CONST(0.4399381876) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.8599416018), FRAC_CONST(0.5103924870) } }, - { { FRAC_CONST(-0.6252418160), FRAC_CONST(-0.7804310918) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8501682281), FRAC_CONST(-0.5265110731) } }, - { { FRAC_CONST(0.6252435446), FRAC_CONST(-0.7804297209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.0737608299), FRAC_CONST(-0.9972759485) } }, - { { FRAC_CONST(0.8980270624), FRAC_CONST(0.4399402142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9183775187), FRAC_CONST(-0.3957053721) } }, - { { FRAC_CONST(-0.2334465086), FRAC_CONST(0.9723696709) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.7754954696), FRAC_CONST(0.6313531399) } }, - { { FRAC_CONST(-0.9998766184), FRAC_CONST(-0.0157085191) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2012493610), FRAC_CONST(0.9795400500) } }, - { { FRAC_CONST(-0.2027861029), FRAC_CONST(-0.9792230725) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9615978599), FRAC_CONST(0.2744622827) } }, - { { FRAC_CONST(0.9114037752), FRAC_CONST(-0.4115132093) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.6879743338), FRAC_CONST(-0.7257350087) } }, - { { FRAC_CONST(0.6004192233), FRAC_CONST(0.7996854186) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.3254036009), FRAC_CONST(-0.9455752373) } }, - { { FRAC_CONST(-0.6494490504), FRAC_CONST(0.7604051232) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9888865948), FRAC_CONST(-0.1486719251) } }, - { { FRAC_CONST(-0.8837650418), FRAC_CONST(-0.4679309726) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.5890548825), FRAC_CONST(0.8080930114) } }, - { { FRAC_CONST(0.2638743520), FRAC_CONST(-0.9645570517) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.4441666007), FRAC_CONST(0.8959442377) } }, - { { FRAC_CONST(0.9988898039), FRAC_CONST(0.0471078083) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9997915030), FRAC_CONST(0.0204183888) } }, - { { FRAC_CONST(0.1719277352), FRAC_CONST(0.9851095676) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4803760946), FRAC_CONST(-0.8770626187) } }, - { { FRAC_CONST(-0.9238800406), FRAC_CONST(0.3826821446) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.5555707216), FRAC_CONST(-0.8314692974) } }, - { { FRAC_CONST(-0.5750041008), FRAC_CONST(-0.8181505203) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9941320419), FRAC_CONST(0.1081734300) } } -}; - -/* RE(Q_Fract_allpass_SubQmf20[j][i]) = (float)cos(M_PI*f_center_20[j]*frac_delay_q[i]); */ -/* IM(Q_Fract_allpass_SubQmf20[j][i]) = (float)sin(M_PI*f_center_20[j]*frac_delay_q[i]); */ -static const complex_t Q_Fract_allpass_SubQmf20[][3] = { - { { FRAC_CONST(0.9857769012), FRAC_CONST(0.1680592746) }, { FRAC_CONST(0.9569403529), FRAC_CONST(0.2902846634) }, { FRAC_CONST(0.9907300472), FRAC_CONST(0.1358452588) } }, - { { FRAC_CONST(0.8744080663), FRAC_CONST(0.4851911962) }, { FRAC_CONST(0.6343932748), FRAC_CONST(0.7730104327) }, { FRAC_CONST(0.9175986052), FRAC_CONST(0.3975082636) } }, - { { FRAC_CONST(0.6642524004), FRAC_CONST(0.7475083470) }, { FRAC_CONST(0.0980171412), FRAC_CONST(0.9951847196) }, { FRAC_CONST(0.7767338753), FRAC_CONST(0.6298289299) } }, - { { FRAC_CONST(0.3790524006), FRAC_CONST(0.9253752232) }, { FRAC_CONST(-0.4713967443), FRAC_CONST(0.8819212914) }, { FRAC_CONST(0.5785340071), FRAC_CONST(0.8156582713) } }, - { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, - { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, - { { FRAC_CONST(0.8744080663), FRAC_CONST(-0.4851911962) }, { FRAC_CONST(0.6343932748), FRAC_CONST(-0.7730104327) }, { FRAC_CONST(0.9175986052), FRAC_CONST(-0.3975082636) } }, - { { FRAC_CONST(0.9857769012), FRAC_CONST(-0.1680592746) }, { FRAC_CONST(0.9569403529), FRAC_CONST(-0.2902846634) }, { FRAC_CONST(0.9907300472), FRAC_CONST(-0.1358452588) } }, - { { FRAC_CONST(-0.7126385570), FRAC_CONST(0.7015314102) }, { FRAC_CONST(-0.5555702448), FRAC_CONST(-0.8314695954) }, { FRAC_CONST(-0.3305967748), FRAC_CONST(0.9437720776) } }, - { { FRAC_CONST(-0.1175374240), FRAC_CONST(0.9930684566) }, { FRAC_CONST(-0.9807852507), FRAC_CONST(0.1950903237) }, { FRAC_CONST(0.2066311091), FRAC_CONST(0.9784189463) } }, - { { FRAC_CONST(-0.9947921634), FRAC_CONST(0.1019244045) }, { FRAC_CONST(0.5555702448), FRAC_CONST(-0.8314695954) }, { FRAC_CONST(-0.7720130086), FRAC_CONST(0.6356067061) } }, - { { FRAC_CONST(-0.8400934935), FRAC_CONST(-0.5424416065) }, { FRAC_CONST(0.9807852507), FRAC_CONST(0.1950903237) }, { FRAC_CONST(-0.9896889329), FRAC_CONST(0.1432335079) } } -}; - -/* RE(Q_Fract_allpass_SubQmf34[j][i]) = (float)cos(M_PI*f_center_34[j]*frac_delay_q[i]); */ -/* IM(Q_Fract_allpass_SubQmf34[j][i]) = (float)sin(M_PI*f_center_34[j]*frac_delay_q[i]); */ -static const complex_t Q_Fract_allpass_SubQmf34[][3] = { - { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, - { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, - { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, - { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, - { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, - { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, - { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, - { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, - { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, - { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, - { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, - { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, - { { FRAC_CONST(-0.9048270583), FRAC_CONST(0.4257792532) }, { FRAC_CONST(-0.0000000000), FRAC_CONST(-1.0000000000) }, { FRAC_CONST(-0.5724321604), FRAC_CONST(0.8199520707) } }, - { { FRAC_CONST(-0.9048270583), FRAC_CONST(0.4257792532) }, { FRAC_CONST(-0.0000000000), FRAC_CONST(-1.0000000000) }, { FRAC_CONST(-0.5724321604), FRAC_CONST(0.8199520707) } }, - { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, - { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, - { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, - { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, - { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, - { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, - { { FRAC_CONST(-0.9048270583), FRAC_CONST(0.4257792532) }, { FRAC_CONST(-0.0000000000), FRAC_CONST(-1.0000000000) }, { FRAC_CONST(-0.5724321604), FRAC_CONST(0.8199520707) } }, - { { FRAC_CONST(-0.9048270583), FRAC_CONST(0.4257792532) }, { FRAC_CONST(-0.0000000000), FRAC_CONST(-1.0000000000) }, { FRAC_CONST(-0.5724321604), FRAC_CONST(0.8199520707) } }, - { { FRAC_CONST(-0.6129069924), FRAC_CONST(-0.7901550531) }, { FRAC_CONST(0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(-0.9917160273), FRAC_CONST(-0.1284494549) } }, - { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, - { { FRAC_CONST(0.6374240518), FRAC_CONST(-0.7705131769) }, { FRAC_CONST(-1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(-0.3446428776), FRAC_CONST(-0.9387338758) } }, - { { FRAC_CONST(-0.9048270583), FRAC_CONST(0.4257792532) }, { FRAC_CONST(-0.0000000000), FRAC_CONST(-1.0000000000) }, { FRAC_CONST(-0.5724321604), FRAC_CONST(0.8199520707) } }, - { { FRAC_CONST(-0.6129069924), FRAC_CONST(-0.7901550531) }, { FRAC_CONST(0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(-0.9917160273), FRAC_CONST(-0.1284494549) } }, - { { FRAC_CONST(-0.6129069924), FRAC_CONST(-0.7901550531) }, { FRAC_CONST(0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(-0.9917160273), FRAC_CONST(-0.1284494549) } }, - { { FRAC_CONST(0.6374240518), FRAC_CONST(-0.7705131769) }, { FRAC_CONST(-1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(-0.3446428776), FRAC_CONST(-0.9387338758) } }, - { { FRAC_CONST(0.6374240518), FRAC_CONST(-0.7705131769) }, { FRAC_CONST(-1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(-0.3446428776), FRAC_CONST(-0.9387338758) } }, - { { FRAC_CONST(0.8910064697), FRAC_CONST(0.4539906085) }, { FRAC_CONST(0.7071067691), FRAC_CONST(-0.7071067691) }, { FRAC_CONST(0.6730125546), FRAC_CONST(-0.7396310568) } }, - { { FRAC_CONST(-0.6129069924), FRAC_CONST(-0.7901550531) }, { FRAC_CONST(0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(-0.9917160273), FRAC_CONST(-0.1284494549) } } -}; - -#if 0 -static float quant_rho[8] = -{ - FRAC_CONST(1.0), FRAC_CONST(0.937), FRAC_CONST(0.84118), FRAC_CONST(0.60092), - FRAC_CONST(0.36764), FRAC_CONST(0.0), FRAC_CONST(-0.589), FRAC_CONST(-1.0) -}; - -static const uint8_t quant_iid_normal[7] = -{ - 2, 4, 7, 10, 14, 18, 25 -}; - -static const uint8_t quant_iid_fine[15] = -{ - 2, 4, 6, 8, 10, 13, 16, 19, 22, 25, 30, 35, 40, 45, 50 -}; -#endif - -static const real_t cos_alphas[] = { - COEF_CONST(1.0000000000), COEF_CONST(0.9841239700), COEF_CONST(0.9594738210), - COEF_CONST(0.8946843079), COEF_CONST(0.8269340931), COEF_CONST(0.7071067812), - COEF_CONST(0.4533210856), COEF_CONST(0.0000000000) -}; - -static const real_t sin_alphas[] = { - COEF_CONST(0.0000000000), COEF_CONST(0.1774824264), COEF_CONST(0.2817977763), - COEF_CONST(0.4466989918), COEF_CONST(0.5622988580), COEF_CONST(0.7071067812), - COEF_CONST(0.8913472911), COEF_CONST(1.0000000000) -}; - -static const real_t cos_betas_normal[][8] = { - { COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9995871699), COEF_CONST(0.9989419133), COEF_CONST(0.9972204583), COEF_CONST(0.9953790839), COEF_CONST(0.9920112747), COEF_CONST(0.9843408180), COEF_CONST(0.9681727381) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9984497744), COEF_CONST(0.9960279377), COEF_CONST(0.9895738413), COEF_CONST(0.9826814632), COEF_CONST(0.9701058164), COEF_CONST(0.9416098832), COEF_CONST(0.8822105900) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9959398908), COEF_CONST(0.9896038018), COEF_CONST(0.9727589768), COEF_CONST(0.9548355329), COEF_CONST(0.9223070404), COEF_CONST(0.8494349490), COEF_CONST(0.7013005535) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9932417400), COEF_CONST(0.9827071856), COEF_CONST(0.9547730996), COEF_CONST(0.9251668930), COEF_CONST(0.8717461589), COEF_CONST(0.7535520592), COEF_CONST(0.5198827312) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9902068095), COEF_CONST(0.9749613872), COEF_CONST(0.9346538534), COEF_CONST(0.8921231300), COEF_CONST(0.8158851259), COEF_CONST(0.6495964302), COEF_CONST(0.3313370772) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9880510933), COEF_CONST(0.9694670261), COEF_CONST(0.9204347876), COEF_CONST(0.8688622825), COEF_CONST(0.7768516704), COEF_CONST(0.5782161800), COEF_CONST(0.2069970356) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9858996945), COEF_CONST(0.9639898866), COEF_CONST(0.9063034786), COEF_CONST(0.8458214608), COEF_CONST(0.7384262300), COEF_CONST(0.5089811277), COEF_CONST(0.0905465944) } -}; - -static const real_t sin_betas_normal[][8] = { - { COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.0287313368), COEF_CONST(-0.0459897147), COEF_CONST(-0.0745074328), COEF_CONST(-0.0960233266), COEF_CONST(-0.1261492408), COEF_CONST(-0.1762757894), COEF_CONST(-0.2502829383) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.0556601118), COEF_CONST(-0.0890412670), COEF_CONST(-0.1440264301), COEF_CONST(-0.1853028382), COEF_CONST(-0.2426823129), COEF_CONST(-0.3367058477), COEF_CONST(-0.4708550466) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.0900207420), COEF_CONST(-0.1438204281), COEF_CONST(-0.2318188366), COEF_CONST(-0.2971348264), COEF_CONST(-0.3864579191), COEF_CONST(-0.5276933461), COEF_CONST(-0.7128657193) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.1160639735), COEF_CONST(-0.1851663774), COEF_CONST(-0.2973353800), COEF_CONST(-0.3795605619), COEF_CONST(-0.4899577884), COEF_CONST(-0.6573882369), COEF_CONST(-0.8542376401) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.1396082894), COEF_CONST(-0.2223742196), COEF_CONST(-0.3555589603), COEF_CONST(-0.4517923427), COEF_CONST(-0.5782140273), COEF_CONST(-0.7602792104), COEF_CONST(-0.9435124489) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.1541266914), COEF_CONST(-0.2452217065), COEF_CONST(-0.3908961522), COEF_CONST(-0.4950538699), COEF_CONST(-0.6296836366), COEF_CONST(-0.8158836002), COEF_CONST(-0.9783415698) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.1673373610), COEF_CONST(-0.2659389001), COEF_CONST(-0.4226275012), COEF_CONST(-0.5334660781), COEF_CONST(-0.6743342664), COEF_CONST(-0.8607776784), COEF_CONST(-0.9958922202) } -}; - -static const real_t cos_betas_fine[][8] = { - { COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9995871699), COEF_CONST(0.9989419133), COEF_CONST(0.9972204583), COEF_CONST(0.9953790839), COEF_CONST(0.9920112747), COEF_CONST(0.9843408180), COEF_CONST(0.9681727381) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9984497744), COEF_CONST(0.9960279377), COEF_CONST(0.9895738413), COEF_CONST(0.9826814632), COEF_CONST(0.9701058164), COEF_CONST(0.9416098832), COEF_CONST(0.8822105900) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9968361371), COEF_CONST(0.9918968104), COEF_CONST(0.9787540479), COEF_CONST(0.9647515190), COEF_CONST(0.9392903010), COEF_CONST(0.8820167114), COEF_CONST(0.7645325390) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9950262915), COEF_CONST(0.9872675041), COEF_CONST(0.9666584578), COEF_CONST(0.9447588606), COEF_CONST(0.9050918405), COEF_CONST(0.8165997379), COEF_CONST(0.6383824796) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9932417400), COEF_CONST(0.9827071856), COEF_CONST(0.9547730996), COEF_CONST(0.9251668930), COEF_CONST(0.8717461589), COEF_CONST(0.7535520592), COEF_CONST(0.5198827312) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9908827998), COEF_CONST(0.9766855904), COEF_CONST(0.9391249214), COEF_CONST(0.8994531782), COEF_CONST(0.8282352693), COEF_CONST(0.6723983174), COEF_CONST(0.3719473225) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9890240165), COEF_CONST(0.9719459866), COEF_CONST(0.9268448110), COEF_CONST(0.8793388536), COEF_CONST(0.7944023271), COEF_CONST(0.6101812098), COEF_CONST(0.2621501145) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9876350461), COEF_CONST(0.9684073447), COEF_CONST(0.9176973944), COEF_CONST(0.8643930070), COEF_CONST(0.7693796058), COEF_CONST(0.5646720713), COEF_CONST(0.1838899556) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9866247085), COEF_CONST(0.9658349704), COEF_CONST(0.9110590761), COEF_CONST(0.8535668048), COEF_CONST(0.7513165426), COEF_CONST(0.5320914819), COEF_CONST(0.1289530943) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9858996945), COEF_CONST(0.9639898866), COEF_CONST(0.9063034786), COEF_CONST(0.8458214608), COEF_CONST(0.7384262300), COEF_CONST(0.5089811277), COEF_CONST(0.0905465944) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9851245614), COEF_CONST(0.9620180268), COEF_CONST(0.9012265590), COEF_CONST(0.8375623272), COEF_CONST(0.7247108045), COEF_CONST(0.4845204297), COEF_CONST(0.0504115003) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9846869856), COEF_CONST(0.9609052357), COEF_CONST(0.8983639533), COEF_CONST(0.8329098386), COEF_CONST(0.7169983441), COEF_CONST(0.4708245354), COEF_CONST(0.0281732509) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9844406325), COEF_CONST(0.9602788522), COEF_CONST(0.8967533934), COEF_CONST(0.8302936455), COEF_CONST(0.7126658102), COEF_CONST(0.4631492839), COEF_CONST(0.0157851140) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9843020502), COEF_CONST(0.9599265269), COEF_CONST(0.8958477331), COEF_CONST(0.8288229094), COEF_CONST(0.7102315840), COEF_CONST(0.4588429315), COEF_CONST(0.0088578059) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9842241136), COEF_CONST(0.9597283916), COEF_CONST(0.8953385094), COEF_CONST(0.8279961409), COEF_CONST(0.7088635748), COEF_CONST(0.4564246834), COEF_CONST(0.0049751355) } -}; - -static const real_t sin_betas_fine[][8] = { - { COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.0287313368), COEF_CONST(-0.0459897147), COEF_CONST(-0.0745074328), COEF_CONST(-0.0960233266), COEF_CONST(-0.1261492408), COEF_CONST(-0.1762757894), COEF_CONST(-0.2502829383) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.0556601118), COEF_CONST(-0.0890412670), COEF_CONST(-0.1440264301), COEF_CONST(-0.1853028382), COEF_CONST(-0.2426823129), COEF_CONST(-0.3367058477), COEF_CONST(-0.4708550466) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.0794840594), COEF_CONST(-0.1270461238), COEF_CONST(-0.2050378347), COEF_CONST(-0.2631625097), COEF_CONST(-0.3431234916), COEF_CONST(-0.4712181245), COEF_CONST(-0.6445851354) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.0996126459), COEF_CONST(-0.1590687758), COEF_CONST(-0.2560691819), COEF_CONST(-0.3277662204), COEF_CONST(-0.4252161335), COEF_CONST(-0.5772043556), COEF_CONST(-0.7697193058) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.1160639735), COEF_CONST(-0.1851663774), COEF_CONST(-0.2973353800), COEF_CONST(-0.3795605619), COEF_CONST(-0.4899577884), COEF_CONST(-0.6573882369), COEF_CONST(-0.8542376401) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.1347266752), COEF_CONST(-0.2146747714), COEF_CONST(-0.3435758752), COEF_CONST(-0.4370171396), COEF_CONST(-0.5603805303), COEF_CONST(-0.7401895046), COEF_CONST(-0.9282538388) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.1477548470), COEF_CONST(-0.2352041647), COEF_CONST(-0.3754446647), COEF_CONST(-0.4761965776), COEF_CONST(-0.6073919186), COEF_CONST(-0.7922618830), COEF_CONST(-0.9650271071) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.1567705832), COEF_CONST(-0.2493736450), COEF_CONST(-0.3972801182), COEF_CONST(-0.5028167951), COEF_CONST(-0.6387918458), COEF_CONST(-0.8253153651), COEF_CONST(-0.9829468369) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.1630082348), COEF_CONST(-0.2591578860), COEF_CONST(-0.4122758299), COEF_CONST(-0.5209834064), COEF_CONST(-0.6599420072), COEF_CONST(-0.8466868694), COEF_CONST(-0.9916506943) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.1673373610), COEF_CONST(-0.2659389001), COEF_CONST(-0.4226275012), COEF_CONST(-0.5334660781), COEF_CONST(-0.6743342664), COEF_CONST(-0.8607776784), COEF_CONST(-0.9958922202) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.1718417832), COEF_CONST(-0.2729859267), COEF_CONST(-0.4333482310), COEF_CONST(-0.5463417868), COEF_CONST(-0.6890531546), COEF_CONST(-0.8747799456), COEF_CONST(-0.9987285320) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.1743316967), COEF_CONST(-0.2768774604), COEF_CONST(-0.4392518725), COEF_CONST(-0.5534087104), COEF_CONST(-0.6970748701), COEF_CONST(-0.8822268738), COEF_CONST(-0.9996030552) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.1757175038), COEF_CONST(-0.2790421580), COEF_CONST(-0.4425306221), COEF_CONST(-0.5573261722), COEF_CONST(-0.7015037013), COEF_CONST(-0.8862802834), COEF_CONST(-0.9998754073) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.1764921355), COEF_CONST(-0.2802517850), COEF_CONST(-0.4443611583), COEF_CONST(-0.5595110229), COEF_CONST(-0.7039681080), COEF_CONST(-0.8885173967), COEF_CONST(-0.9999607689) }, - { COEF_CONST(0.0000000000), COEF_CONST(-0.1769262394), COEF_CONST(-0.2809295540), COEF_CONST(-0.4453862969), COEF_CONST(-0.5607337966), COEF_CONST(-0.7053456119), COEF_CONST(-0.8897620516), COEF_CONST(-0.9999876239) } -}; - -static const real_t sincos_alphas_B_normal[][8] = { - { COEF_CONST(0.0561454100), COEF_CONST(0.0526385859), COEF_CONST(0.0472937334), COEF_CONST(0.0338410641), COEF_CONST(0.0207261065), COEF_CONST(0.0028205635), COEF_CONST(0.0028205635), COEF_CONST(0.0028205635) }, - { COEF_CONST(0.1249065138), COEF_CONST(0.1173697697), COEF_CONST(0.1057888284), COEF_CONST(0.0761985131), COEF_CONST(0.0468732723), COEF_CONST(0.0063956103), COEF_CONST(0.0063956103), COEF_CONST(0.0063956103) }, - { COEF_CONST(0.1956693050), COEF_CONST(0.1846090179), COEF_CONST(0.1673645109), COEF_CONST(0.1220621836), COEF_CONST(0.0757362479), COEF_CONST(0.0103882630), COEF_CONST(0.0103882630), COEF_CONST(0.0103882630) }, - { COEF_CONST(0.3015113269), COEF_CONST(0.2870525790), COEF_CONST(0.2637738799), COEF_CONST(0.1984573949), COEF_CONST(0.1260749909), COEF_CONST(0.0175600126), COEF_CONST(0.0175600126), COEF_CONST(0.0175600126) }, - { COEF_CONST(0.4078449476), COEF_CONST(0.3929852420), COEF_CONST(0.3680589270), COEF_CONST(0.2911029124), COEF_CONST(0.1934512363), COEF_CONST(0.0278686716), COEF_CONST(0.0278686716), COEF_CONST(0.0278686716) }, - { COEF_CONST(0.5336171261), COEF_CONST(0.5226637762), COEF_CONST(0.5033652606), COEF_CONST(0.4349162672), COEF_CONST(0.3224682122), COEF_CONST(0.0521999036), COEF_CONST(0.0521999036), COEF_CONST(0.0521999036) }, - { COEF_CONST(0.6219832023), COEF_CONST(0.6161847276), COEF_CONST(0.6057251063), COEF_CONST(0.5654342668), COEF_CONST(0.4826149915), COEF_CONST(0.1058044758), COEF_CONST(0.1058044758), COEF_CONST(0.1058044758) }, - { COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657) }, - { COEF_CONST(0.7830305572), COEF_CONST(0.7876016373), COEF_CONST(0.7956739618), COEF_CONST(0.8247933372), COEF_CONST(0.8758325942), COEF_CONST(0.9943869542), COEF_CONST(0.9943869542), COEF_CONST(0.9943869542) }, - { COEF_CONST(0.8457261833), COEF_CONST(0.8525388778), COEF_CONST(0.8640737401), COEF_CONST(0.9004708933), COEF_CONST(0.9465802987), COEF_CONST(0.9986366532), COEF_CONST(0.9986366532), COEF_CONST(0.9986366532) }, - { COEF_CONST(0.9130511848), COEF_CONST(0.9195447612), COEF_CONST(0.9298024282), COEF_CONST(0.9566917233), COEF_CONST(0.9811098801), COEF_CONST(0.9996115928), COEF_CONST(0.9996115928), COEF_CONST(0.9996115928) }, - { COEF_CONST(0.9534625907), COEF_CONST(0.9579148236), COEF_CONST(0.9645845234), COEF_CONST(0.9801095128), COEF_CONST(0.9920207064), COEF_CONST(0.9998458099), COEF_CONST(0.9998458099), COEF_CONST(0.9998458099) }, - { COEF_CONST(0.9806699215), COEF_CONST(0.9828120260), COEF_CONST(0.9858950861), COEF_CONST(0.9925224431), COEF_CONST(0.9971278825), COEF_CONST(0.9999460406), COEF_CONST(0.9999460406), COEF_CONST(0.9999460406) }, - { COEF_CONST(0.9921685024), COEF_CONST(0.9930882705), COEF_CONST(0.9943886135), COEF_CONST(0.9970926648), COEF_CONST(0.9989008403), COEF_CONST(0.9999795479), COEF_CONST(0.9999795479), COEF_CONST(0.9999795479) }, - { COEF_CONST(0.9984226014), COEF_CONST(0.9986136287), COEF_CONST(0.9988810254), COEF_CONST(0.9994272242), COEF_CONST(0.9997851906), COEF_CONST(0.9999960221), COEF_CONST(0.9999960221), COEF_CONST(0.9999960221) } -}; - -static const real_t sincos_alphas_B_fine[][8] = { - { COEF_CONST(0.0031622158), COEF_CONST(0.0029630181), COEF_CONST(0.0026599892), COEF_CONST(0.0019002704), COEF_CONST(0.0011626042), COEF_CONST(0.0001580278), COEF_CONST(0.0001580278), COEF_CONST(0.0001580278) }, - { COEF_CONST(0.0056232673), COEF_CONST(0.0052689825), COEF_CONST(0.0047302825), COEF_CONST(0.0033791756), COEF_CONST(0.0020674015), COEF_CONST(0.0002811710), COEF_CONST(0.0002811710), COEF_CONST(0.0002811710) }, - { COEF_CONST(0.0099994225), COEF_CONST(0.0093696693), COEF_CONST(0.0084117414), COEF_CONST(0.0060093796), COEF_CONST(0.0036766009), COEF_CONST(0.0005000392), COEF_CONST(0.0005000392), COEF_CONST(0.0005000392) }, - { COEF_CONST(0.0177799194), COEF_CONST(0.0166607102), COEF_CONST(0.0149581377), COEF_CONST(0.0106875809), COEF_CONST(0.0065392545), COEF_CONST(0.0008893767), COEF_CONST(0.0008893767), COEF_CONST(0.0008893767) }, - { COEF_CONST(0.0316069684), COEF_CONST(0.0296211579), COEF_CONST(0.0265987295), COEF_CONST(0.0190113813), COEF_CONST(0.0116349973), COEF_CONST(0.0015826974), COEF_CONST(0.0015826974), COEF_CONST(0.0015826974) }, - { COEF_CONST(0.0561454100), COEF_CONST(0.0526385859), COEF_CONST(0.0472937334), COEF_CONST(0.0338410641), COEF_CONST(0.0207261065), COEF_CONST(0.0028205635), COEF_CONST(0.0028205635), COEF_CONST(0.0028205635) }, - { COEF_CONST(0.0791834041), COEF_CONST(0.0742798103), COEF_CONST(0.0667907269), COEF_CONST(0.0478705292), COEF_CONST(0.0293500747), COEF_CONST(0.0039966755), COEF_CONST(0.0039966755), COEF_CONST(0.0039966755) }, - { COEF_CONST(0.1115021177), COEF_CONST(0.1047141985), COEF_CONST(0.0943053154), COEF_CONST(0.0678120561), COEF_CONST(0.0416669150), COEF_CONST(0.0056813213), COEF_CONST(0.0056813213), COEF_CONST(0.0056813213) }, - { COEF_CONST(0.1565355066), COEF_CONST(0.1473258371), COEF_CONST(0.1330924027), COEF_CONST(0.0963282233), COEF_CONST(0.0594509113), COEF_CONST(0.0081277946), COEF_CONST(0.0081277946), COEF_CONST(0.0081277946) }, - { COEF_CONST(0.2184643682), COEF_CONST(0.2064579524), COEF_CONST(0.1876265439), COEF_CONST(0.1375744167), COEF_CONST(0.0856896681), COEF_CONST(0.0117817338), COEF_CONST(0.0117817338), COEF_CONST(0.0117817338) }, - { COEF_CONST(0.3015113269), COEF_CONST(0.2870525790), COEF_CONST(0.2637738799), COEF_CONST(0.1984573949), COEF_CONST(0.1260749909), COEF_CONST(0.0175600126), COEF_CONST(0.0175600126), COEF_CONST(0.0175600126) }, - { COEF_CONST(0.3698741335), COEF_CONST(0.3547727297), COEF_CONST(0.3298252076), COEF_CONST(0.2556265829), COEF_CONST(0.1665990017), COEF_CONST(0.0236344541), COEF_CONST(0.0236344541), COEF_CONST(0.0236344541) }, - { COEF_CONST(0.4480623975), COEF_CONST(0.4339410024), COEF_CONST(0.4098613774), COEF_CONST(0.3322709108), COEF_CONST(0.2266784729), COEF_CONST(0.0334094131), COEF_CONST(0.0334094131), COEF_CONST(0.0334094131) }, - { COEF_CONST(0.5336171261), COEF_CONST(0.5226637762), COEF_CONST(0.5033652606), COEF_CONST(0.4349162672), COEF_CONST(0.3224682122), COEF_CONST(0.0521999036), COEF_CONST(0.0521999036), COEF_CONST(0.0521999036) }, - { COEF_CONST(0.6219832023), COEF_CONST(0.6161847276), COEF_CONST(0.6057251063), COEF_CONST(0.5654342668), COEF_CONST(0.4826149915), COEF_CONST(0.1058044758), COEF_CONST(0.1058044758), COEF_CONST(0.1058044758) }, - { COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657) }, - { COEF_CONST(0.7830305572), COEF_CONST(0.7876016373), COEF_CONST(0.7956739618), COEF_CONST(0.8247933372), COEF_CONST(0.8758325942), COEF_CONST(0.9943869542), COEF_CONST(0.9943869542), COEF_CONST(0.9943869542) }, - { COEF_CONST(0.8457261833), COEF_CONST(0.8525388778), COEF_CONST(0.8640737401), COEF_CONST(0.9004708933), COEF_CONST(0.9465802987), COEF_CONST(0.9986366532), COEF_CONST(0.9986366532), COEF_CONST(0.9986366532) }, - { COEF_CONST(0.8940022267), COEF_CONST(0.9009412572), COEF_CONST(0.9121477564), COEF_CONST(0.9431839770), COEF_CONST(0.9739696219), COEF_CONST(0.9994417480), COEF_CONST(0.9994417480), COEF_CONST(0.9994417480) }, - { COEF_CONST(0.9290818561), COEF_CONST(0.9349525662), COEF_CONST(0.9440420138), COEF_CONST(0.9667755833), COEF_CONST(0.9860247275), COEF_CONST(0.9997206664), COEF_CONST(0.9997206664), COEF_CONST(0.9997206664) }, - { COEF_CONST(0.9534625907), COEF_CONST(0.9579148236), COEF_CONST(0.9645845234), COEF_CONST(0.9801095128), COEF_CONST(0.9920207064), COEF_CONST(0.9998458099), COEF_CONST(0.9998458099), COEF_CONST(0.9998458099) }, - { COEF_CONST(0.9758449068), COEF_CONST(0.9784554646), COEF_CONST(0.9822404252), COEF_CONST(0.9904914275), COEF_CONST(0.9963218730), COEF_CONST(0.9999305926), COEF_CONST(0.9999305926), COEF_CONST(0.9999305926) }, - { COEF_CONST(0.9876723320), COEF_CONST(0.9890880155), COEF_CONST(0.9911036356), COEF_CONST(0.9953496173), COEF_CONST(0.9982312259), COEF_CONST(0.9999669685), COEF_CONST(0.9999669685), COEF_CONST(0.9999669685) }, - { COEF_CONST(0.9937641889), COEF_CONST(0.9945023501), COEF_CONST(0.9955433130), COEF_CONST(0.9976981117), COEF_CONST(0.9991315558), COEF_CONST(0.9999838610), COEF_CONST(0.9999838610), COEF_CONST(0.9999838610) }, - { COEF_CONST(0.9968600642), COEF_CONST(0.9972374385), COEF_CONST(0.9977670024), COEF_CONST(0.9988535464), COEF_CONST(0.9995691924), COEF_CONST(0.9999920129), COEF_CONST(0.9999920129), COEF_CONST(0.9999920129) }, - { COEF_CONST(0.9984226014), COEF_CONST(0.9986136287), COEF_CONST(0.9988810254), COEF_CONST(0.9994272242), COEF_CONST(0.9997851906), COEF_CONST(0.9999960221), COEF_CONST(0.9999960221), COEF_CONST(0.9999960221) }, - { COEF_CONST(0.9995003746), COEF_CONST(0.9995611974), COEF_CONST(0.9996461891), COEF_CONST(0.9998192657), COEF_CONST(0.9999323103), COEF_CONST(0.9999987475), COEF_CONST(0.9999987475), COEF_CONST(0.9999987475) }, - { COEF_CONST(0.9998419236), COEF_CONST(0.9998611991), COEF_CONST(0.9998881193), COEF_CONST(0.9999428861), COEF_CONST(0.9999786185), COEF_CONST(0.9999996045), COEF_CONST(0.9999996045), COEF_CONST(0.9999996045) }, - { COEF_CONST(0.9999500038), COEF_CONST(0.9999561034), COEF_CONST(0.9999646206), COEF_CONST(0.9999819429), COEF_CONST(0.9999932409), COEF_CONST(0.9999998750), COEF_CONST(0.9999998750), COEF_CONST(0.9999998750) }, - { COEF_CONST(0.9999841890), COEF_CONST(0.9999861183), COEF_CONST(0.9999888121), COEF_CONST(0.9999942902), COEF_CONST(0.9999978628), COEF_CONST(0.9999999605), COEF_CONST(0.9999999605), COEF_CONST(0.9999999605) }, - { COEF_CONST(0.9999950000), COEF_CONST(0.9999956102), COEF_CONST(0.9999964621), COEF_CONST(0.9999981945), COEF_CONST(0.9999993242), COEF_CONST(0.9999999875), COEF_CONST(0.9999999875), COEF_CONST(0.9999999875) } -}; - -static const real_t cos_gammas_normal[][8] = { - { COEF_CONST(1.0000000000), COEF_CONST(0.9841239707), COEF_CONST(0.9594738226), COEF_CONST(0.8946843024), COEF_CONST(0.8269341029), COEF_CONST(0.7245688486), COEF_CONST(0.7245688486), COEF_CONST(0.7245688486) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9849690570), COEF_CONST(0.9617776789), COEF_CONST(0.9020941550), COEF_CONST(0.8436830391), COEF_CONST(0.7846832804), COEF_CONST(0.7846832804), COEF_CONST(0.7846832804) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9871656089), COEF_CONST(0.9676774734), COEF_CONST(0.9199102884), COEF_CONST(0.8785067015), COEF_CONST(0.8464232214), COEF_CONST(0.8464232214), COEF_CONST(0.8464232214) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9913533967), COEF_CONST(0.9786000177), COEF_CONST(0.9496063381), COEF_CONST(0.9277157252), COEF_CONST(0.9133354077), COEF_CONST(0.9133354077), COEF_CONST(0.9133354077) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9948924435), COEF_CONST(0.9875319180), COEF_CONST(0.9716329849), COEF_CONST(0.9604805241), COEF_CONST(0.9535949574), COEF_CONST(0.9535949574), COEF_CONST(0.9535949574) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9977406278), COEF_CONST(0.9945423840), COEF_CONST(0.9878736667), COEF_CONST(0.9833980494), COEF_CONST(0.9807207440), COEF_CONST(0.9807207440), COEF_CONST(0.9807207440) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9990607067), COEF_CONST(0.9977417734), COEF_CONST(0.9950323970), COEF_CONST(0.9932453273), COEF_CONST(0.9921884740), COEF_CONST(0.9921884740), COEF_CONST(0.9921884740) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9998081748), COEF_CONST(0.9995400312), COEF_CONST(0.9989936459), COEF_CONST(0.9986365356), COEF_CONST(0.9984265591), COEF_CONST(0.9984265591), COEF_CONST(0.9984265591) } -}; - -static const real_t cos_gammas_fine[][8] = { - { COEF_CONST(1.0000000000), COEF_CONST(0.9841239707), COEF_CONST(0.9594738226), COEF_CONST(0.8946843024), COEF_CONST(0.8269341029), COEF_CONST(0.7245688486), COEF_CONST(0.7245688486), COEF_CONST(0.7245688486) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9849690570), COEF_CONST(0.9617776789), COEF_CONST(0.9020941550), COEF_CONST(0.8436830391), COEF_CONST(0.7846832804), COEF_CONST(0.7846832804), COEF_CONST(0.7846832804) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9871656089), COEF_CONST(0.9676774734), COEF_CONST(0.9199102884), COEF_CONST(0.8785067015), COEF_CONST(0.8464232214), COEF_CONST(0.8464232214), COEF_CONST(0.8464232214) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9899597309), COEF_CONST(0.9750098690), COEF_CONST(0.9402333855), COEF_CONST(0.9129698759), COEF_CONST(0.8943765944), COEF_CONST(0.8943765944), COEF_CONST(0.8943765944) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9926607607), COEF_CONST(0.9819295710), COEF_CONST(0.9580160104), COEF_CONST(0.9404993670), COEF_CONST(0.9293004472), COEF_CONST(0.9293004472), COEF_CONST(0.9293004472) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9948924435), COEF_CONST(0.9875319180), COEF_CONST(0.9716329849), COEF_CONST(0.9604805241), COEF_CONST(0.9535949574), COEF_CONST(0.9535949574), COEF_CONST(0.9535949574) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9972074644), COEF_CONST(0.9932414270), COEF_CONST(0.9849197629), COEF_CONST(0.9792926592), COEF_CONST(0.9759092525), COEF_CONST(0.9759092525), COEF_CONST(0.9759092525) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9985361982), COEF_CONST(0.9964742028), COEF_CONST(0.9922136306), COEF_CONST(0.9893845420), COEF_CONST(0.9877041371), COEF_CONST(0.9877041371), COEF_CONST(0.9877041371) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9992494366), COEF_CONST(0.9981967170), COEF_CONST(0.9960386625), COEF_CONST(0.9946185834), COEF_CONST(0.9937800239), COEF_CONST(0.9937800239), COEF_CONST(0.9937800239) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9996194722), COEF_CONST(0.9990869422), COEF_CONST(0.9979996269), COEF_CONST(0.9972873651), COEF_CONST(0.9968679747), COEF_CONST(0.9968679747), COEF_CONST(0.9968679747) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9998081748), COEF_CONST(0.9995400312), COEF_CONST(0.9989936459), COEF_CONST(0.9986365356), COEF_CONST(0.9984265591), COEF_CONST(0.9984265591), COEF_CONST(0.9984265591) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9999390971), COEF_CONST(0.9998540271), COEF_CONST(0.9996809352), COEF_CONST(0.9995679735), COEF_CONST(0.9995016284), COEF_CONST(0.9995016284), COEF_CONST(0.9995016284) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9999807170), COEF_CONST(0.9999537862), COEF_CONST(0.9998990191), COEF_CONST(0.9998632947), COEF_CONST(0.9998423208), COEF_CONST(0.9998423208), COEF_CONST(0.9998423208) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9999938979), COEF_CONST(0.9999853814), COEF_CONST(0.9999680568), COEF_CONST(0.9999567596), COEF_CONST(0.9999501270), COEF_CONST(0.9999501270), COEF_CONST(0.9999501270) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9999980703), COEF_CONST(0.9999953731), COEF_CONST(0.9999898968), COEF_CONST(0.9999863277), COEF_CONST(0.9999842265), COEF_CONST(0.9999842265), COEF_CONST(0.9999842265) }, - { COEF_CONST(1.0000000000), COEF_CONST(0.9999993891), COEF_CONST(0.9999985397), COEF_CONST(0.9999968037), COEF_CONST(0.9999956786), COEF_CONST(0.9999950155), COEF_CONST(0.9999950155), COEF_CONST(0.9999950155) } -}; - -static const real_t sin_gammas_normal[][8] = { - { COEF_CONST(0.0000000000), COEF_CONST(0.1774824223), COEF_CONST(0.2817977711), COEF_CONST(0.4466990028), COEF_CONST(0.5622988435), COEF_CONST(0.6892024258), COEF_CONST(0.6892024258), COEF_CONST(0.6892024258) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.1727308798), COEF_CONST(0.2738315110), COEF_CONST(0.4315392630), COEF_CONST(0.5368416242), COEF_CONST(0.6198968861), COEF_CONST(0.6198968861), COEF_CONST(0.6198968861) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.1596999079), COEF_CONST(0.2521910140), COEF_CONST(0.3921288836), COEF_CONST(0.4777300236), COEF_CONST(0.5325107795), COEF_CONST(0.5325107795), COEF_CONST(0.5325107795) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.1312190642), COEF_CONST(0.2057717310), COEF_CONST(0.3134450552), COEF_CONST(0.3732874674), COEF_CONST(0.4072080955), COEF_CONST(0.4072080955), COEF_CONST(0.4072080955) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.1009407043), COEF_CONST(0.1574189028), COEF_CONST(0.2364938532), COEF_CONST(0.2783471983), COEF_CONST(0.3010924396), COEF_CONST(0.3010924396), COEF_CONST(0.3010924396) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.0671836269), COEF_CONST(0.1043333428), COEF_CONST(0.1552598422), COEF_CONST(0.1814615013), COEF_CONST(0.1954144885), COEF_CONST(0.1954144885), COEF_CONST(0.1954144885) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.0433324862), COEF_CONST(0.0671666110), COEF_CONST(0.0995516398), COEF_CONST(0.1160332699), COEF_CONST(0.1247478739), COEF_CONST(0.1247478739), COEF_CONST(0.1247478739) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.0195860576), COEF_CONST(0.0303269852), COEF_CONST(0.0448519274), COEF_CONST(0.0522022017), COEF_CONST(0.0560750040), COEF_CONST(0.0560750040), COEF_CONST(0.0560750040) } -}; - -static const real_t sin_gammas_fine[][8] = { - { COEF_CONST(0.0000000000), COEF_CONST(0.1774824223), COEF_CONST(0.2817977711), COEF_CONST(0.4466990028), COEF_CONST(0.5622988435), COEF_CONST(0.6892024258), COEF_CONST(0.6892024258), COEF_CONST(0.6892024258) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.1727308798), COEF_CONST(0.2738315110), COEF_CONST(0.4315392630), COEF_CONST(0.5368416242), COEF_CONST(0.6198968861), COEF_CONST(0.6198968861), COEF_CONST(0.6198968861) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.1596999079), COEF_CONST(0.2521910140), COEF_CONST(0.3921288836), COEF_CONST(0.4777300236), COEF_CONST(0.5325107795), COEF_CONST(0.5325107795), COEF_CONST(0.5325107795) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.1413496768), COEF_CONST(0.2221615526), COEF_CONST(0.3405307340), COEF_CONST(0.4080269669), COEF_CONST(0.4473147744), COEF_CONST(0.4473147744), COEF_CONST(0.4473147744) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.1209322714), COEF_CONST(0.1892467110), COEF_CONST(0.2867147079), COEF_CONST(0.3397954394), COEF_CONST(0.3693246252), COEF_CONST(0.3693246252), COEF_CONST(0.3693246252) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.1009407043), COEF_CONST(0.1574189028), COEF_CONST(0.2364938532), COEF_CONST(0.2783471983), COEF_CONST(0.3010924396), COEF_CONST(0.3010924396), COEF_CONST(0.3010924396) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.0746811420), COEF_CONST(0.1160666523), COEF_CONST(0.1730117353), COEF_CONST(0.2024497161), COEF_CONST(0.2181768341), COEF_CONST(0.2181768341), COEF_CONST(0.2181768341) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.0540875291), COEF_CONST(0.0838997203), COEF_CONST(0.1245476266), COEF_CONST(0.1453211203), COEF_CONST(0.1563346972), COEF_CONST(0.1563346972), COEF_CONST(0.1563346972) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.0387371058), COEF_CONST(0.0600276114), COEF_CONST(0.0889212171), COEF_CONST(0.1036044086), COEF_CONST(0.1113609634), COEF_CONST(0.1113609634), COEF_CONST(0.1113609634) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.0275846110), COEF_CONST(0.0427233177), COEF_CONST(0.0632198125), COEF_CONST(0.0736064637), COEF_CONST(0.0790837596), COEF_CONST(0.0790837596), COEF_CONST(0.0790837596) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.0195860576), COEF_CONST(0.0303269852), COEF_CONST(0.0448519274), COEF_CONST(0.0522022017), COEF_CONST(0.0560750040), COEF_CONST(0.0560750040), COEF_CONST(0.0560750040) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.0110363955), COEF_CONST(0.0170857974), COEF_CONST(0.0252592108), COEF_CONST(0.0293916021), COEF_CONST(0.0315673054), COEF_CONST(0.0315673054), COEF_CONST(0.0315673054) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.0062101284), COEF_CONST(0.0096138203), COEF_CONST(0.0142109649), COEF_CONST(0.0165345659), COEF_CONST(0.0177576316), COEF_CONST(0.0177576316), COEF_CONST(0.0177576316) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.0034934509), COEF_CONST(0.0054071189), COEF_CONST(0.0079928316), COEF_CONST(0.0092994041), COEF_CONST(0.0099871631), COEF_CONST(0.0099871631), COEF_CONST(0.0099871631) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.0019645397), COEF_CONST(0.0030419905), COEF_CONST(0.0044951511), COEF_CONST(0.0052291853), COEF_CONST(0.0056166498), COEF_CONST(0.0056166498), COEF_CONST(0.0056166498) }, - { COEF_CONST(0.0000000000), COEF_CONST(0.0011053943), COEF_CONST(0.0017089869), COEF_CONST(0.0025283670), COEF_CONST(0.0029398552), COEF_CONST(0.0031573685), COEF_CONST(0.0031573685), COEF_CONST(0.0031573685) } -}; - -static const real_t sf_iid_normal[] = { - COEF_CONST(1.4119827747), COEF_CONST(1.4031381607), COEF_CONST(1.3868767023), - COEF_CONST(1.3483997583), COEF_CONST(1.2912493944), COEF_CONST(1.1960374117), - COEF_CONST(1.1073724031), COEF_CONST(1.0000000000), COEF_CONST(0.8796171546), - COEF_CONST(0.7546485662), COEF_CONST(0.5767799020), COEF_CONST(0.4264014363), - COEF_CONST(0.2767182887), COEF_CONST(0.1766446233), COEF_CONST(0.0794016272) -}; - -static const real_t sf_iid_fine[] = { - COEF_CONST(1.4142065048), COEF_CONST(1.4141912460), COEF_CONST(1.4141428471), - COEF_CONST(1.4139900208), COEF_CONST(1.4135069847), COEF_CONST(1.4119827747), - COEF_CONST(1.4097729921), COEF_CONST(1.4053947926), COEF_CONST(1.3967796564), - COEF_CONST(1.3800530434), COEF_CONST(1.3483997583), COEF_CONST(1.3139201403), - COEF_CONST(1.2643101215), COEF_CONST(1.1960374117), COEF_CONST(1.1073724031), - COEF_CONST(1.0000000000), COEF_CONST(0.8796171546), COEF_CONST(0.7546485662), - COEF_CONST(0.6336560845), COEF_CONST(0.5230810642), COEF_CONST(0.4264014363), - COEF_CONST(0.3089554012), COEF_CONST(0.2213746458), COEF_CONST(0.1576878875), - COEF_CONST(0.1119822487), COEF_CONST(0.0794016272), COEF_CONST(0.0446990170), - COEF_CONST(0.0251446925), COEF_CONST(0.0141414283), COEF_CONST(0.0079525812), - COEF_CONST(0.0044721137) -}; - -#ifdef __cplusplus - -#endif -#endif - diff --git a/src/libfaad/pulse.c b/src/libfaad/pulse.c deleted file mode 100644 index 9e0a705e6..000000000 --- a/src/libfaad/pulse.c +++ /dev/null @@ -1,56 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: pulse.c,v 1.8 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include "syntax.h" -#include "pulse.h" - -uint8_t pulse_decode(ic_stream *ics, int16_t *spec_data, uint16_t framelen) -{ - uint8_t i; - uint16_t k; - pulse_info *pul = &(ics->pul); - - k = ics->swb_offset[pul->pulse_start_sfb]; - - for (i = 0; i <= pul->number_pulse; i++) - { - k += pul->pulse_offset[i]; - - if (k >= framelen) - return 15; /* should not be possible */ - - if (spec_data[k] > 0) - spec_data[k] += pul->pulse_amp[i]; - else - spec_data[k] -= pul->pulse_amp[i]; - } - - return 0; -} diff --git a/src/libfaad/pulse.h b/src/libfaad/pulse.h deleted file mode 100644 index a057c0d3b..000000000 --- a/src/libfaad/pulse.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: pulse.h,v 1.8 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __PULSE_H__ -#define __PULSE_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -uint8_t pulse_decode(ic_stream *ics, int16_t *spec_coef, uint16_t framelen); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/rvlc.c b/src/libfaad/rvlc.c deleted file mode 100644 index bad49a0c6..000000000 --- a/src/libfaad/rvlc.c +++ /dev/null @@ -1,530 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: rvlc.c,v 1.7 2005/10/29 23:57:07 tmmm Exp $ -**/ - -/* RVLC scalefactor decoding - * - * RVLC works like this: - * 1. Only symmetric huffman codewords are used - * 2. Total length of the scalefactor data is stored in the bitsream - * 3. Scalefactors are DPCM coded - * 4. Next to the starting value for DPCM the ending value is also stored - * - * With all this it is possible to read the scalefactor data from 2 sides. - * If there is a bit error in the scalefactor data it is possible to start - * decoding from the other end of the data, to find all but 1 scalefactor. - */ - -#include "common.h" -#include "structs.h" - -#include <stdlib.h> - -#include "syntax.h" -#include "bits.h" -#include "rvlc.h" - - -#ifdef ERROR_RESILIENCE - -//#define PRINT_RVLC - -/* static function declarations */ -static uint8_t rvlc_decode_sf_forward(ic_stream *ics, - bitfile *ld_sf, - bitfile *ld_esc, - uint8_t *is_used); -#if 0 -static uint8_t rvlc_decode_sf_reverse(ic_stream *ics, - bitfile *ld_sf, - bitfile *ld_esc, - uint8_t is_used); -#endif -static int8_t rvlc_huffman_sf(bitfile *ld_sf, bitfile *ld_esc, - int8_t direction); -static int8_t rvlc_huffman_esc(bitfile *ld_esc, int8_t direction); - - -uint8_t rvlc_scale_factor_data(ic_stream *ics, bitfile *ld) -{ - uint8_t bits = 9; - - ics->sf_concealment = faad_get1bit(ld - DEBUGVAR(1,149,"rvlc_scale_factor_data(): sf_concealment")); - ics->rev_global_gain = (uint8_t)faad_getbits(ld, 8 - DEBUGVAR(1,150,"rvlc_scale_factor_data(): rev_global_gain")); - - if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) - bits = 11; - - /* the number of bits used for the huffman codewords */ - ics->length_of_rvlc_sf = (uint16_t)faad_getbits(ld, bits - DEBUGVAR(1,151,"rvlc_scale_factor_data(): length_of_rvlc_sf")); - - if (ics->noise_used) - { - ics->dpcm_noise_nrg = (uint16_t)faad_getbits(ld, 9 - DEBUGVAR(1,152,"rvlc_scale_factor_data(): dpcm_noise_nrg")); - - ics->length_of_rvlc_sf -= 9; - } - - ics->sf_escapes_present = faad_get1bit(ld - DEBUGVAR(1,153,"rvlc_scale_factor_data(): sf_escapes_present")); - - if (ics->sf_escapes_present) - { - ics->length_of_rvlc_escapes = (uint8_t)faad_getbits(ld, 8 - DEBUGVAR(1,154,"rvlc_scale_factor_data(): length_of_rvlc_escapes")); - } - - if (ics->noise_used) - { - ics->dpcm_noise_last_position = (uint16_t)faad_getbits(ld, 9 - DEBUGVAR(1,155,"rvlc_scale_factor_data(): dpcm_noise_last_position")); - } - - return 0; -} - -uint8_t rvlc_decode_scale_factors(ic_stream *ics, bitfile *ld) -{ - uint8_t result; - uint8_t intensity_used = 0; - uint8_t *rvlc_sf_buffer = NULL; - uint8_t *rvlc_esc_buffer = NULL; - bitfile ld_rvlc_sf, ld_rvlc_esc; -// bitfile ld_rvlc_sf_rev, ld_rvlc_esc_rev; - - if (ics->length_of_rvlc_sf > 0) - { - /* We read length_of_rvlc_sf bits here to put it in a - seperate bitfile. - */ - rvlc_sf_buffer = faad_getbitbuffer(ld, ics->length_of_rvlc_sf - DEBUGVAR(1,156,"rvlc_decode_scale_factors(): bitbuffer: length_of_rvlc_sf")); - - faad_initbits(&ld_rvlc_sf, (void*)rvlc_sf_buffer, bit2byte(ics->length_of_rvlc_sf)); -// faad_initbits_rev(&ld_rvlc_sf_rev, (void*)rvlc_sf_buffer, -// ics->length_of_rvlc_sf); - } - - if (ics->sf_escapes_present) - { - /* We read length_of_rvlc_escapes bits here to put it in a - seperate bitfile. - */ - rvlc_esc_buffer = faad_getbitbuffer(ld, ics->length_of_rvlc_escapes - DEBUGVAR(1,157,"rvlc_decode_scale_factors(): bitbuffer: length_of_rvlc_escapes")); - - faad_initbits(&ld_rvlc_esc, (void*)rvlc_esc_buffer, bit2byte(ics->length_of_rvlc_escapes)); -// faad_initbits_rev(&ld_rvlc_esc_rev, (void*)rvlc_esc_buffer, -// ics->length_of_rvlc_escapes); - } - - /* decode the rvlc scale factors and escapes */ - result = rvlc_decode_sf_forward(ics, &ld_rvlc_sf, - &ld_rvlc_esc, &intensity_used); -// result = rvlc_decode_sf_reverse(ics, &ld_rvlc_sf_rev, -// &ld_rvlc_esc_rev, intensity_used); - - - if (rvlc_esc_buffer) faad_free(rvlc_esc_buffer); - if (rvlc_sf_buffer) faad_free(rvlc_sf_buffer); - - if (ics->length_of_rvlc_sf > 0) - faad_endbits(&ld_rvlc_sf); - if (ics->sf_escapes_present) - faad_endbits(&ld_rvlc_esc); - - return result; -} - -static uint8_t rvlc_decode_sf_forward(ic_stream *ics, bitfile *ld_sf, bitfile *ld_esc, - uint8_t *intensity_used) -{ - int8_t g, sfb; - int8_t t = 0; - int8_t error = 0; - int8_t noise_pcm_flag = 1; - - int16_t scale_factor = ics->global_gain; - int16_t is_position = 0; - int16_t noise_energy = ics->global_gain - 90 - 256; - -#ifdef PRINT_RVLC - printf("\nglobal_gain: %d\n", ics->global_gain); -#endif - - for (g = 0; g < ics->num_window_groups; g++) - { - for (sfb = 0; sfb < ics->max_sfb; sfb++) - { - if (error) - { - ics->scale_factors[g][sfb] = 0; - } else { - switch (ics->sfb_cb[g][sfb]) - { - case ZERO_HCB: /* zero book */ - ics->scale_factors[g][sfb] = 0; - break; - case INTENSITY_HCB: /* intensity books */ - case INTENSITY_HCB2: - - *intensity_used = 1; - - /* decode intensity position */ - t = rvlc_huffman_sf(ld_sf, ld_esc, +1); - - is_position += t; - ics->scale_factors[g][sfb] = is_position; - - break; - case NOISE_HCB: /* noise books */ - - /* decode noise energy */ - if (noise_pcm_flag) - { - int16_t n = ics->dpcm_noise_nrg; - noise_pcm_flag = 0; - noise_energy += n; - } else { - t = rvlc_huffman_sf(ld_sf, ld_esc, +1); - noise_energy += t; - } - - ics->scale_factors[g][sfb] = noise_energy; - - break; - default: /* spectral books */ - - /* decode scale factor */ - t = rvlc_huffman_sf(ld_sf, ld_esc, +1); - - scale_factor += t; - if (scale_factor < 0) - return 4; - - ics->scale_factors[g][sfb] = scale_factor; - - break; - } -#ifdef PRINT_RVLC - printf("%3d:%4d%4d\n", sfb, ics->sfb_cb[g][sfb], - ics->scale_factors[g][sfb]); -#endif - if (t == 99) - { - error = 1; - } - } - } - } -#ifdef PRINT_RVLC - printf("\n\n"); -#endif - - return 0; -} - -#if 0 // not used right now, doesn't work correctly yet -static uint8_t rvlc_decode_sf_reverse(ic_stream *ics, bitfile *ld_sf, bitfile *ld_esc, - uint8_t intensity_used) -{ - int8_t g, sfb; - int8_t t = 0; - int8_t error = 0; - int8_t noise_pcm_flag = 1, is_pcm_flag = 1, sf_pcm_flag = 1; - - int16_t scale_factor = ics->rev_global_gain; - int16_t is_position = 0; - int16_t noise_energy = ics->rev_global_gain; - -#ifdef PRINT_RVLC - printf("\nrev_global_gain: %d\n", ics->rev_global_gain); -#endif - - if (intensity_used) - { - is_position = rvlc_huffman_sf(ld_sf, ld_esc, -1); -#ifdef PRINT_RVLC - printf("is_position: %d\n", is_position); -#endif - } - - for (g = ics->num_window_groups-1; g >= 0; g--) - { - for (sfb = ics->max_sfb-1; sfb >= 0; sfb--) - { - if (error) - { - ics->scale_factors[g][sfb] = 0; - } else { - switch (ics->sfb_cb[g][sfb]) - { - case ZERO_HCB: /* zero book */ - ics->scale_factors[g][sfb] = 0; - break; - case INTENSITY_HCB: /* intensity books */ - case INTENSITY_HCB2: - - if (is_pcm_flag) - { - is_pcm_flag = 0; - ics->scale_factors[g][sfb] = is_position; - } else { - t = rvlc_huffman_sf(ld_sf, ld_esc, -1); - is_position -= t; - - ics->scale_factors[g][sfb] = (uint8_t)is_position; - } - break; - case NOISE_HCB: /* noise books */ - - /* decode noise energy */ - if (noise_pcm_flag) - { - noise_pcm_flag = 0; - noise_energy = ics->dpcm_noise_last_position; - } else { - t = rvlc_huffman_sf(ld_sf, ld_esc, -1); - noise_energy -= t; - } - - ics->scale_factors[g][sfb] = (uint8_t)noise_energy; - break; - default: /* spectral books */ - - if (sf_pcm_flag || (sfb == 0)) - { - sf_pcm_flag = 0; - if (sfb == 0) - scale_factor = ics->global_gain; - } else { - /* decode scale factor */ - t = rvlc_huffman_sf(ld_sf, ld_esc, -1); - scale_factor -= t; - } - - if (scale_factor < 0) - return 4; - - ics->scale_factors[g][sfb] = (uint8_t)scale_factor; - break; - } -#ifdef PRINT_RVLC - printf("%3d:%4d%4d\n", sfb, ics->sfb_cb[g][sfb], - ics->scale_factors[g][sfb]); -#endif - if (t == 99) - { - error = 1; - } - } - } - } - -#ifdef PRINT_RVLC - printf("\n\n"); -#endif - - return 0; -} -#endif - -/* index == 99 means not allowed codeword */ -static rvlc_huff_table book_rvlc[] = { - /*index length codeword */ - { 0, 1, 0 }, /* 0 */ - { -1, 3, 5 }, /* 101 */ - { 1, 3, 7 }, /* 111 */ - { -2, 4, 9 }, /* 1001 */ - { -3, 5, 17 }, /* 10001 */ - { 2, 5, 27 }, /* 11011 */ - { -4, 6, 33 }, /* 100001 */ - { 99, 6, 50 }, /* 110010 */ - { 3, 6, 51 }, /* 110011 */ - { 99, 6, 52 }, /* 110100 */ - { -7, 7, 65 }, /* 1000001 */ - { 99, 7, 96 }, /* 1100000 */ - { 99, 7, 98 }, /* 1100010 */ - { 7, 7, 99 }, /* 1100011 */ - { 4, 7, 107 }, /* 1101011 */ - { -5, 8, 129 }, /* 10000001 */ - { 99, 8, 194 }, /* 11000010 */ - { 5, 8, 195 }, /* 11000011 */ - { 99, 8, 212 }, /* 11010100 */ - { 99, 9, 256 }, /* 100000000 */ - { -6, 9, 257 }, /* 100000001 */ - { 99, 9, 426 }, /* 110101010 */ - { 6, 9, 427 }, /* 110101011 */ - { 99, 10, 0 } /* Shouldn't come this far */ -}; - -static rvlc_huff_table book_escape[] = { - /*index length codeword */ - { 1, 2, 0 }, - { 0, 2, 2 }, - { 3, 3, 2 }, - { 2, 3, 6 }, - { 4, 4, 14 }, - { 7, 5, 13 }, - { 6, 5, 15 }, - { 5, 5, 31 }, - { 11, 6, 24 }, - { 10, 6, 25 }, - { 9, 6, 29 }, - { 8, 6, 61 }, - { 13, 7, 56 }, - { 12, 7, 120 }, - { 15, 8, 114 }, - { 14, 8, 242 }, - { 17, 9, 230 }, - { 16, 9, 486 }, - { 19, 10, 463 }, - { 18, 10, 974 }, - { 22, 11, 925 }, - { 20, 11, 1950 }, - { 21, 11, 1951 }, - { 23, 12, 1848 }, - { 25, 13, 3698 }, - { 24, 14, 7399 }, - { 26, 15, 14797 }, - { 49, 19, 236736 }, - { 50, 19, 236737 }, - { 51, 19, 236738 }, - { 52, 19, 236739 }, - { 53, 19, 236740 }, - { 27, 20, 473482 }, - { 28, 20, 473483 }, - { 29, 20, 473484 }, - { 30, 20, 473485 }, - { 31, 20, 473486 }, - { 32, 20, 473487 }, - { 33, 20, 473488 }, - { 34, 20, 473489 }, - { 35, 20, 473490 }, - { 36, 20, 473491 }, - { 37, 20, 473492 }, - { 38, 20, 473493 }, - { 39, 20, 473494 }, - { 40, 20, 473495 }, - { 41, 20, 473496 }, - { 42, 20, 473497 }, - { 43, 20, 473498 }, - { 44, 20, 473499 }, - { 45, 20, 473500 }, - { 46, 20, 473501 }, - { 47, 20, 473502 }, - { 48, 20, 473503 }, - { 99, 21, 0 } /* Shouldn't come this far */ -}; - -static int8_t rvlc_huffman_sf(bitfile *ld_sf, bitfile *ld_esc, - int8_t direction) -{ - uint8_t i, j; - int8_t index; - uint32_t cw; - rvlc_huff_table *h = book_rvlc; - - i = h->len; - if (direction > 0) - cw = faad_getbits(ld_sf, i DEBUGVAR(1,0,"")); - else - cw = faad_getbits_rev(ld_sf, i DEBUGVAR(1,0,"")); - - while ((cw != h->cw) - && (i < 10)) - { - h++; - j = h->len-i; - i += j; - cw <<= j; - if (direction > 0) - cw |= faad_getbits(ld_sf, j DEBUGVAR(1,0,"")); - else - cw |= faad_getbits_rev(ld_sf, j DEBUGVAR(1,0,"")); - } - - index = h->index; - - if (index == +ESC_VAL) - { - int8_t esc = rvlc_huffman_esc(ld_esc, direction); - if (esc == 99) - return 99; - index += esc; -#ifdef PRINT_RVLC - printf("esc: %d - ", esc); -#endif - } - if (index == -ESC_VAL) - { - int8_t esc = rvlc_huffman_esc(ld_esc, direction); - if (esc == 99) - return 99; - index -= esc; -#ifdef PRINT_RVLC - printf("esc: %d - ", esc); -#endif - } - - return index; -} - -static int8_t rvlc_huffman_esc(bitfile *ld, - int8_t direction) -{ - uint8_t i, j; - uint32_t cw; - rvlc_huff_table *h = book_escape; - - i = h->len; - if (direction > 0) - cw = faad_getbits(ld, i DEBUGVAR(1,0,"")); - else - cw = faad_getbits_rev(ld, i DEBUGVAR(1,0,"")); - - while ((cw != h->cw) - && (i < 21)) - { - h++; - j = h->len-i; - i += j; - cw <<= j; - if (direction > 0) - cw |= faad_getbits(ld, j DEBUGVAR(1,0,"")); - else - cw |= faad_getbits_rev(ld, j DEBUGVAR(1,0,"")); - } - - return h->index; -} - -#endif - diff --git a/src/libfaad/rvlc.h b/src/libfaad/rvlc.h deleted file mode 100644 index 867468580..000000000 --- a/src/libfaad/rvlc.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: rvlc.h,v 1.6 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __RVLC_SCF_H__ -#define __RVLC_SCF_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct -{ - int8_t index; - uint8_t len; - uint32_t cw; -} rvlc_huff_table; - - -#define ESC_VAL 7 - - -uint8_t rvlc_scale_factor_data(ic_stream *ics, bitfile *ld); -uint8_t rvlc_decode_scale_factors(ic_stream *ics, bitfile *ld); - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/sbr_dct.c b/src/libfaad/sbr_dct.c deleted file mode 100644 index ba8bbaf9b..000000000 --- a/src/libfaad/sbr_dct.c +++ /dev/null @@ -1,2271 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_dct.c,v 1.5 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#include "common.h" - -#ifdef SBR_DEC - -#ifdef _MSC_VER -#pragma warning(disable:4305) -#pragma warning(disable:4244) -#endif - - -#include "sbr_dct.h" - -void DCT4_32(real_t *y, real_t *x) -{ - real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; - real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; - real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30; - real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40; - real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50; - real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60; - real_t f61, f62, f63, f64, f65, f66, f67, f68, f69, f70; - real_t f71, f72, f73, f74, f75, f76, f77, f78, f79, f80; - real_t f81, f82, f83, f84, f85, f86, f87, f88, f89, f90; - real_t f91, f92, f93, f94, f95, f96, f97, f98, f99, f100; - real_t f101, f102, f103, f104, f105, f106, f107, f108, f109, f110; - real_t f111, f112, f113, f114, f115, f116, f117, f118, f119, f120; - real_t f121, f122, f123, f124, f125, f126, f127, f128, f129, f130; - real_t f131, f132, f133, f134, f135, f136, f137, f138, f139, f140; - real_t f141, f142, f143, f144, f145, f146, f147, f148, f149, f150; - real_t f151, f152, f153, f154, f155, f156, f157, f158, f159, f160; - real_t f161, f162, f163, f164, f165, f166, f167, f168, f169, f170; - real_t f171, f172, f173, f174, f175, f176, f177, f178, f179, f180; - real_t f181, f182, f183, f184, f185, f186, f187, f188, f189, f190; - real_t f191, f192, f193, f194, f195, f196, f197, f198, f199, f200; - real_t f201, f202, f203, f204, f205, f206, f207, f208, f209, f210; - real_t f211, f212, f213, f214, f215, f216, f217, f218, f219, f220; - real_t f221, f222, f223, f224, f225, f226, f227, f228, f229, f230; - real_t f231, f232, f233, f234, f235, f236, f237, f238, f239, f240; - real_t f241, f242, f243, f244, f245, f246, f247, f248, f249, f250; - real_t f251, f252, f253, f254, f255, f256, f257, f258, f259, f260; - real_t f261, f262, f263, f264, f265, f266, f267, f268, f269, f270; - real_t f271, f272, f273, f274, f275, f276, f277, f278, f279, f280; - real_t f281, f282, f283, f284, f285, f286, f287, f288, f289, f290; - real_t f291, f292, f293, f294, f295, f296, f297, f298, f299, f300; - real_t f301, f302, f303, f304, f305, f306, f307, f310, f311, f312; - real_t f313, f316, f317, f318, f319, f322, f323, f324, f325, f328; - real_t f329, f330, f331, f334, f335, f336, f337, f340, f341, f342; - real_t f343, f346, f347, f348, f349, f352, f353, f354, f355, f358; - real_t f359, f360, f361, f364, f365, f366, f367, f370, f371, f372; - real_t f373, f376, f377, f378, f379, f382, f383, f384, f385, f388; - real_t f389, f390, f391, f394, f395, f396, f397; - - f0 = x[15] - x[16]; - f1 = x[15] + x[16]; - f2 = MUL_F(FRAC_CONST(0.7071067811865476), f1); - f3 = MUL_F(FRAC_CONST(0.7071067811865476), f0); - f4 = x[8] - x[23]; - f5 = x[8] + x[23]; - f6 = MUL_F(FRAC_CONST(0.7071067811865476), f5); - f7 = MUL_F(FRAC_CONST(0.7071067811865476), f4); - f8 = x[12] - x[19]; - f9 = x[12] + x[19]; - f10 = MUL_F(FRAC_CONST(0.7071067811865476), f9); - f11 = MUL_F(FRAC_CONST(0.7071067811865476), f8); - f12 = x[11] - x[20]; - f13 = x[11] + x[20]; - f14 = MUL_F(FRAC_CONST(0.7071067811865476), f13); - f15 = MUL_F(FRAC_CONST(0.7071067811865476), f12); - f16 = x[14] - x[17]; - f17 = x[14] + x[17]; - f18 = MUL_F(FRAC_CONST(0.7071067811865476), f17); - f19 = MUL_F(FRAC_CONST(0.7071067811865476), f16); - f20 = x[9] - x[22]; - f21 = x[9] + x[22]; - f22 = MUL_F(FRAC_CONST(0.7071067811865476), f21); - f23 = MUL_F(FRAC_CONST(0.7071067811865476), f20); - f24 = x[13] - x[18]; - f25 = x[13] + x[18]; - f26 = MUL_F(FRAC_CONST(0.7071067811865476), f25); - f27 = MUL_F(FRAC_CONST(0.7071067811865476), f24); - f28 = x[10] - x[21]; - f29 = x[10] + x[21]; - f30 = MUL_F(FRAC_CONST(0.7071067811865476), f29); - f31 = MUL_F(FRAC_CONST(0.7071067811865476), f28); - f32 = x[0] - f2; - f33 = x[0] + f2; - f34 = x[31] - f3; - f35 = x[31] + f3; - f36 = x[7] - f6; - f37 = x[7] + f6; - f38 = x[24] - f7; - f39 = x[24] + f7; - f40 = x[3] - f10; - f41 = x[3] + f10; - f42 = x[28] - f11; - f43 = x[28] + f11; - f44 = x[4] - f14; - f45 = x[4] + f14; - f46 = x[27] - f15; - f47 = x[27] + f15; - f48 = x[1] - f18; - f49 = x[1] + f18; - f50 = x[30] - f19; - f51 = x[30] + f19; - f52 = x[6] - f22; - f53 = x[6] + f22; - f54 = x[25] - f23; - f55 = x[25] + f23; - f56 = x[2] - f26; - f57 = x[2] + f26; - f58 = x[29] - f27; - f59 = x[29] + f27; - f60 = x[5] - f30; - f61 = x[5] + f30; - f62 = x[26] - f31; - f63 = x[26] + f31; - f64 = f39 + f37; - f65 = MUL_F(FRAC_CONST(-0.5411961001461969), f39); - f66 = MUL_F(FRAC_CONST(0.9238795325112867), f64); - f67 = MUL_C(COEF_CONST(1.3065629648763766), f37); - f68 = f65 + f66; - f69 = f67 - f66; - f70 = f38 + f36; - f71 = MUL_C(COEF_CONST(1.3065629648763770), f38); - f72 = MUL_F(FRAC_CONST(-0.3826834323650904), f70); - f73 = MUL_F(FRAC_CONST(0.5411961001461961), f36); - f74 = f71 + f72; - f75 = f73 - f72; - f76 = f47 + f45; - f77 = MUL_F(FRAC_CONST(-0.5411961001461969), f47); - f78 = MUL_F(FRAC_CONST(0.9238795325112867), f76); - f79 = MUL_C(COEF_CONST(1.3065629648763766), f45); - f80 = f77 + f78; - f81 = f79 - f78; - f82 = f46 + f44; - f83 = MUL_C(COEF_CONST(1.3065629648763770), f46); - f84 = MUL_F(FRAC_CONST(-0.3826834323650904), f82); - f85 = MUL_F(FRAC_CONST(0.5411961001461961), f44); - f86 = f83 + f84; - f87 = f85 - f84; - f88 = f55 + f53; - f89 = MUL_F(FRAC_CONST(-0.5411961001461969), f55); - f90 = MUL_F(FRAC_CONST(0.9238795325112867), f88); - f91 = MUL_C(COEF_CONST(1.3065629648763766), f53); - f92 = f89 + f90; - f93 = f91 - f90; - f94 = f54 + f52; - f95 = MUL_C(COEF_CONST(1.3065629648763770), f54); - f96 = MUL_F(FRAC_CONST(-0.3826834323650904), f94); - f97 = MUL_F(FRAC_CONST(0.5411961001461961), f52); - f98 = f95 + f96; - f99 = f97 - f96; - f100 = f63 + f61; - f101 = MUL_F(FRAC_CONST(-0.5411961001461969), f63); - f102 = MUL_F(FRAC_CONST(0.9238795325112867), f100); - f103 = MUL_C(COEF_CONST(1.3065629648763766), f61); - f104 = f101 + f102; - f105 = f103 - f102; - f106 = f62 + f60; - f107 = MUL_C(COEF_CONST(1.3065629648763770), f62); - f108 = MUL_F(FRAC_CONST(-0.3826834323650904), f106); - f109 = MUL_F(FRAC_CONST(0.5411961001461961), f60); - f110 = f107 + f108; - f111 = f109 - f108; - f112 = f33 - f68; - f113 = f33 + f68; - f114 = f35 - f69; - f115 = f35 + f69; - f116 = f32 - f74; - f117 = f32 + f74; - f118 = f34 - f75; - f119 = f34 + f75; - f120 = f41 - f80; - f121 = f41 + f80; - f122 = f43 - f81; - f123 = f43 + f81; - f124 = f40 - f86; - f125 = f40 + f86; - f126 = f42 - f87; - f127 = f42 + f87; - f128 = f49 - f92; - f129 = f49 + f92; - f130 = f51 - f93; - f131 = f51 + f93; - f132 = f48 - f98; - f133 = f48 + f98; - f134 = f50 - f99; - f135 = f50 + f99; - f136 = f57 - f104; - f137 = f57 + f104; - f138 = f59 - f105; - f139 = f59 + f105; - f140 = f56 - f110; - f141 = f56 + f110; - f142 = f58 - f111; - f143 = f58 + f111; - f144 = f123 + f121; - f145 = MUL_F(FRAC_CONST(-0.7856949583871021), f123); - f146 = MUL_F(FRAC_CONST(0.9807852804032304), f144); - f147 = MUL_C(COEF_CONST(1.1758756024193588), f121); - f148 = f145 + f146; - f149 = f147 - f146; - f150 = f127 + f125; - f151 = MUL_F(FRAC_CONST(0.2758993792829431), f127); - f152 = MUL_F(FRAC_CONST(0.5555702330196022), f150); - f153 = MUL_C(COEF_CONST(1.3870398453221475), f125); - f154 = f151 + f152; - f155 = f153 - f152; - f156 = f122 + f120; - f157 = MUL_C(COEF_CONST(1.1758756024193591), f122); - f158 = MUL_F(FRAC_CONST(-0.1950903220161287), f156); - f159 = MUL_F(FRAC_CONST(0.7856949583871016), f120); - f160 = f157 + f158; - f161 = f159 - f158; - f162 = f126 + f124; - f163 = MUL_C(COEF_CONST(1.3870398453221473), f126); - f164 = MUL_F(FRAC_CONST(-0.8314696123025455), f162); - f165 = MUL_F(FRAC_CONST(-0.2758993792829436), f124); - f166 = f163 + f164; - f167 = f165 - f164; - f168 = f139 + f137; - f169 = MUL_F(FRAC_CONST(-0.7856949583871021), f139); - f170 = MUL_F(FRAC_CONST(0.9807852804032304), f168); - f171 = MUL_C(COEF_CONST(1.1758756024193588), f137); - f172 = f169 + f170; - f173 = f171 - f170; - f174 = f143 + f141; - f175 = MUL_F(FRAC_CONST(0.2758993792829431), f143); - f176 = MUL_F(FRAC_CONST(0.5555702330196022), f174); - f177 = MUL_C(COEF_CONST(1.3870398453221475), f141); - f178 = f175 + f176; - f179 = f177 - f176; - f180 = f138 + f136; - f181 = MUL_C(COEF_CONST(1.1758756024193591), f138); - f182 = MUL_F(FRAC_CONST(-0.1950903220161287), f180); - f183 = MUL_F(FRAC_CONST(0.7856949583871016), f136); - f184 = f181 + f182; - f185 = f183 - f182; - f186 = f142 + f140; - f187 = MUL_C(COEF_CONST(1.3870398453221473), f142); - f188 = MUL_F(FRAC_CONST(-0.8314696123025455), f186); - f189 = MUL_F(FRAC_CONST(-0.2758993792829436), f140); - f190 = f187 + f188; - f191 = f189 - f188; - f192 = f113 - f148; - f193 = f113 + f148; - f194 = f115 - f149; - f195 = f115 + f149; - f196 = f117 - f154; - f197 = f117 + f154; - f198 = f119 - f155; - f199 = f119 + f155; - f200 = f112 - f160; - f201 = f112 + f160; - f202 = f114 - f161; - f203 = f114 + f161; - f204 = f116 - f166; - f205 = f116 + f166; - f206 = f118 - f167; - f207 = f118 + f167; - f208 = f129 - f172; - f209 = f129 + f172; - f210 = f131 - f173; - f211 = f131 + f173; - f212 = f133 - f178; - f213 = f133 + f178; - f214 = f135 - f179; - f215 = f135 + f179; - f216 = f128 - f184; - f217 = f128 + f184; - f218 = f130 - f185; - f219 = f130 + f185; - f220 = f132 - f190; - f221 = f132 + f190; - f222 = f134 - f191; - f223 = f134 + f191; - f224 = f211 + f209; - f225 = MUL_F(FRAC_CONST(-0.8971675863426361), f211); - f226 = MUL_F(FRAC_CONST(0.9951847266721968), f224); - f227 = MUL_C(COEF_CONST(1.0932018670017576), f209); - f228 = f225 + f226; - f229 = f227 - f226; - f230 = f215 + f213; - f231 = MUL_F(FRAC_CONST(-0.4105245275223571), f215); - f232 = MUL_F(FRAC_CONST(0.8819212643483549), f230); - f233 = MUL_C(COEF_CONST(1.3533180011743529), f213); - f234 = f231 + f232; - f235 = f233 - f232; - f236 = f219 + f217; - f237 = MUL_F(FRAC_CONST(0.1386171691990915), f219); - f238 = MUL_F(FRAC_CONST(0.6343932841636455), f236); - f239 = MUL_C(COEF_CONST(1.4074037375263826), f217); - f240 = f237 + f238; - f241 = f239 - f238; - f242 = f223 + f221; - f243 = MUL_F(FRAC_CONST(0.6666556584777466), f223); - f244 = MUL_F(FRAC_CONST(0.2902846772544623), f242); - f245 = MUL_C(COEF_CONST(1.2472250129866711), f221); - f246 = f243 + f244; - f247 = f245 - f244; - f248 = f210 + f208; - f249 = MUL_C(COEF_CONST(1.0932018670017574), f210); - f250 = MUL_F(FRAC_CONST(-0.0980171403295605), f248); - f251 = MUL_F(FRAC_CONST(0.8971675863426364), f208); - f252 = f249 + f250; - f253 = f251 - f250; - f254 = f214 + f212; - f255 = MUL_C(COEF_CONST(1.3533180011743529), f214); - f256 = MUL_F(FRAC_CONST(-0.4713967368259979), f254); - f257 = MUL_F(FRAC_CONST(0.4105245275223569), f212); - f258 = f255 + f256; - f259 = f257 - f256; - f260 = f218 + f216; - f261 = MUL_C(COEF_CONST(1.4074037375263826), f218); - f262 = MUL_F(FRAC_CONST(-0.7730104533627369), f260); - f263 = MUL_F(FRAC_CONST(-0.1386171691990913), f216); - f264 = f261 + f262; - f265 = f263 - f262; - f266 = f222 + f220; - f267 = MUL_C(COEF_CONST(1.2472250129866711), f222); - f268 = MUL_F(FRAC_CONST(-0.9569403357322089), f266); - f269 = MUL_F(FRAC_CONST(-0.6666556584777469), f220); - f270 = f267 + f268; - f271 = f269 - f268; - f272 = f193 - f228; - f273 = f193 + f228; - f274 = f195 - f229; - f275 = f195 + f229; - f276 = f197 - f234; - f277 = f197 + f234; - f278 = f199 - f235; - f279 = f199 + f235; - f280 = f201 - f240; - f281 = f201 + f240; - f282 = f203 - f241; - f283 = f203 + f241; - f284 = f205 - f246; - f285 = f205 + f246; - f286 = f207 - f247; - f287 = f207 + f247; - f288 = f192 - f252; - f289 = f192 + f252; - f290 = f194 - f253; - f291 = f194 + f253; - f292 = f196 - f258; - f293 = f196 + f258; - f294 = f198 - f259; - f295 = f198 + f259; - f296 = f200 - f264; - f297 = f200 + f264; - f298 = f202 - f265; - f299 = f202 + f265; - f300 = f204 - f270; - f301 = f204 + f270; - f302 = f206 - f271; - f303 = f206 + f271; - f304 = f275 + f273; - f305 = MUL_F(FRAC_CONST(-0.9751575901732920), f275); - f306 = MUL_F(FRAC_CONST(0.9996988186962043), f304); - f307 = MUL_C(COEF_CONST(1.0242400472191164), f273); - y[0] = f305 + f306; - y[31] = f307 - f306; - f310 = f279 + f277; - f311 = MUL_F(FRAC_CONST(-0.8700688593994936), f279); - f312 = MUL_F(FRAC_CONST(0.9924795345987100), f310); - f313 = MUL_C(COEF_CONST(1.1148902097979263), f277); - y[2] = f311 + f312; - y[29] = f313 - f312; - f316 = f283 + f281; - f317 = MUL_F(FRAC_CONST(-0.7566008898816587), f283); - f318 = MUL_F(FRAC_CONST(0.9757021300385286), f316); - f319 = MUL_C(COEF_CONST(1.1948033701953984), f281); - y[4] = f317 + f318; - y[27] = f319 - f318; - f322 = f287 + f285; - f323 = MUL_F(FRAC_CONST(-0.6358464401941451), f287); - f324 = MUL_F(FRAC_CONST(0.9495281805930367), f322); - f325 = MUL_C(COEF_CONST(1.2632099209919283), f285); - y[6] = f323 + f324; - y[25] = f325 - f324; - f328 = f291 + f289; - f329 = MUL_F(FRAC_CONST(-0.5089684416985408), f291); - f330 = MUL_F(FRAC_CONST(0.9142097557035307), f328); - f331 = MUL_C(COEF_CONST(1.3194510697085207), f289); - y[8] = f329 + f330; - y[23] = f331 - f330; - f334 = f295 + f293; - f335 = MUL_F(FRAC_CONST(-0.3771887988789273), f295); - f336 = MUL_F(FRAC_CONST(0.8700869911087114), f334); - f337 = MUL_C(COEF_CONST(1.3629851833384954), f293); - y[10] = f335 + f336; - y[21] = f337 - f336; - f340 = f299 + f297; - f341 = MUL_F(FRAC_CONST(-0.2417766217337384), f299); - f342 = MUL_F(FRAC_CONST(0.8175848131515837), f340); - f343 = MUL_C(COEF_CONST(1.3933930045694289), f297); - y[12] = f341 + f342; - y[19] = f343 - f342; - f346 = f303 + f301; - f347 = MUL_F(FRAC_CONST(-0.1040360035527077), f303); - f348 = MUL_F(FRAC_CONST(0.7572088465064845), f346); - f349 = MUL_C(COEF_CONST(1.4103816894602612), f301); - y[14] = f347 + f348; - y[17] = f349 - f348; - f352 = f274 + f272; - f353 = MUL_F(FRAC_CONST(0.0347065382144002), f274); - f354 = MUL_F(FRAC_CONST(0.6895405447370668), f352); - f355 = MUL_C(COEF_CONST(1.4137876276885337), f272); - y[16] = f353 + f354; - y[15] = f355 - f354; - f358 = f278 + f276; - f359 = MUL_F(FRAC_CONST(0.1731148370459795), f278); - f360 = MUL_F(FRAC_CONST(0.6152315905806268), f358); - f361 = MUL_C(COEF_CONST(1.4035780182072330), f276); - y[18] = f359 + f360; - y[13] = f361 - f360; - f364 = f282 + f280; - f365 = MUL_F(FRAC_CONST(0.3098559453626100), f282); - f366 = MUL_F(FRAC_CONST(0.5349976198870972), f364); - f367 = MUL_C(COEF_CONST(1.3798511851368043), f280); - y[20] = f365 + f366; - y[11] = f367 - f366; - f370 = f286 + f284; - f371 = MUL_F(FRAC_CONST(0.4436129715409088), f286); - f372 = MUL_F(FRAC_CONST(0.4496113296546065), f370); - f373 = MUL_C(COEF_CONST(1.3428356308501219), f284); - y[22] = f371 + f372; - y[9] = f373 - f372; - f376 = f290 + f288; - f377 = MUL_F(FRAC_CONST(0.5730977622997509), f290); - f378 = MUL_F(FRAC_CONST(0.3598950365349881), f376); - f379 = MUL_C(COEF_CONST(1.2928878353697271), f288); - y[24] = f377 + f378; - y[7] = f379 - f378; - f382 = f294 + f292; - f383 = MUL_F(FRAC_CONST(0.6970633083205415), f294); - f384 = MUL_F(FRAC_CONST(0.2667127574748984), f382); - f385 = MUL_C(COEF_CONST(1.2304888232703382), f292); - y[26] = f383 + f384; - y[5] = f385 - f384; - f388 = f298 + f296; - f389 = MUL_F(FRAC_CONST(0.8143157536286401), f298); - f390 = MUL_F(FRAC_CONST(0.1709618887603012), f388); - f391 = MUL_C(COEF_CONST(1.1562395311492424), f296); - y[28] = f389 + f390; - y[3] = f391 - f390; - f394 = f302 + f300; - f395 = MUL_F(FRAC_CONST(0.9237258930790228), f302); - f396 = MUL_F(FRAC_CONST(0.0735645635996674), f394); - f397 = MUL_C(COEF_CONST(1.0708550202783576), f300); - y[30] = f395 + f396; - y[1] = f397 - f396; -} - -#ifdef SBR_LOW_POWER - -void DCT2_16_unscaled(real_t *y, real_t *x) -{ - real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; - real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; - real_t f21, f22, f23, f24, f25, f26, f27, f28, f31, f32; - real_t f33, f34, f37, f38, f39, f40, f41, f42, f43, f44; - real_t f45, f46, f47, f48, f49, f51, f53, f54, f57, f58; - real_t f59, f60, f61, f62, f63, f64, f65, f66, f67, f68; - real_t f69, f70, f71, f72, f73, f74, f75, f76, f77, f78; - real_t f79, f80, f81, f82, f83, f84, f85, f86, f87, f88; - real_t f89, f90, f91, f92, f95, f96, f97, f98, f101, f102; - real_t f103, f104, f107, f108, f109, f110; - - f0 = x[0] - x[15]; - f1 = x[0] + x[15]; - f2 = x[1] - x[14]; - f3 = x[1] + x[14]; - f4 = x[2] - x[13]; - f5 = x[2] + x[13]; - f6 = x[3] - x[12]; - f7 = x[3] + x[12]; - f8 = x[4] - x[11]; - f9 = x[4] + x[11]; - f10 = x[5] - x[10]; - f11 = x[5] + x[10]; - f12 = x[6] - x[9]; - f13 = x[6] + x[9]; - f14 = x[7] - x[8]; - f15 = x[7] + x[8]; - f16 = f1 - f15; - f17 = f1 + f15; - f18 = f3 - f13; - f19 = f3 + f13; - f20 = f5 - f11; - f21 = f5 + f11; - f22 = f7 - f9; - f23 = f7 + f9; - f24 = f17 - f23; - f25 = f17 + f23; - f26 = f19 - f21; - f27 = f19 + f21; - f28 = f25 - f27; - y[0] = f25 + f27; - y[8] = MUL_F(f28, FRAC_CONST(0.7071067811865476)); - f31 = f24 + f26; - f32 = MUL_C(f24, COEF_CONST(1.3065629648763766)); - f33 = MUL_F(f31, FRAC_CONST(-0.9238795325112866)); - f34 = MUL_F(f26, FRAC_CONST(-0.5411961001461967)); - y[12] = f32 + f33; - y[4] = f34 - f33; - f37 = f16 + f22; - f38 = MUL_C(f16, COEF_CONST(1.1758756024193588)); - f39 = MUL_F(f37, FRAC_CONST(-0.9807852804032304)); - f40 = MUL_F(f22, FRAC_CONST(-0.7856949583871021)); - f41 = f38 + f39; - f42 = f40 - f39; - f43 = f18 + f20; - f44 = MUL_C(f18, COEF_CONST(1.3870398453221473)); - f45 = MUL_F(f43, FRAC_CONST(-0.8314696123025455)); - f46 = MUL_F(f20, FRAC_CONST(-0.2758993792829436)); - f47 = f44 + f45; - f48 = f46 - f45; - f49 = f42 - f48; - y[2] = f42 + f48; - f51 = MUL_F(f49, FRAC_CONST(0.7071067811865476)); - y[14] = f41 - f47; - f53 = f41 + f47; - f54 = MUL_F(f53, FRAC_CONST(0.7071067811865476)); - y[10] = f51 - f54; - y[6] = f51 + f54; - f57 = f2 - f4; - f58 = f2 + f4; - f59 = f6 - f8; - f60 = f6 + f8; - f61 = f10 - f12; - f62 = f10 + f12; - f63 = MUL_F(f60, FRAC_CONST(0.7071067811865476)); - f64 = f0 - f63; - f65 = f0 + f63; - f66 = f58 + f62; - f67 = MUL_C(f58, COEF_CONST(1.3065629648763766)); - f68 = MUL_F(f66, FRAC_CONST(-0.9238795325112866)); - f69 = MUL_F(f62, FRAC_CONST(-0.5411961001461967)); - f70 = f67 + f68; - f71 = f69 - f68; - f72 = f65 - f71; - f73 = f65 + f71; - f74 = f64 - f70; - f75 = f64 + f70; - f76 = MUL_F(f59, FRAC_CONST(0.7071067811865476)); - f77 = f14 - f76; - f78 = f14 + f76; - f79 = f61 + f57; - f80 = MUL_C(f61, COEF_CONST(1.3065629648763766)); - f81 = MUL_F(f79, FRAC_CONST(-0.9238795325112866)); - f82 = MUL_F(f57, FRAC_CONST(-0.5411961001461967)); - f83 = f80 + f81; - f84 = f82 - f81; - f85 = f78 - f84; - f86 = f78 + f84; - f87 = f77 - f83; - f88 = f77 + f83; - f89 = f86 + f73; - f90 = MUL_F(f86, FRAC_CONST(-0.8971675863426361)); - f91 = MUL_F(f89, FRAC_CONST(0.9951847266721968)); - f92 = MUL_C(f73, COEF_CONST(1.0932018670017576)); - y[1] = f90 + f91; - y[15] = f92 - f91; - f95 = f75 - f88; - f96 = MUL_F(f88, FRAC_CONST(-0.6666556584777466)); - f97 = MUL_F(f95, FRAC_CONST(0.9569403357322089)); - f98 = MUL_C(f75, COEF_CONST(1.2472250129866713)); - y[3] = f97 - f96; - y[13] = f98 - f97; - f101 = f87 + f74; - f102 = MUL_F(f87, FRAC_CONST(-0.4105245275223571)); - f103 = MUL_F(f101, FRAC_CONST(0.8819212643483549)); - f104 = MUL_C(f74, COEF_CONST(1.3533180011743529)); - y[5] = f102 + f103; - y[11] = f104 - f103; - f107 = f72 - f85; - f108 = MUL_F(f85, FRAC_CONST(-0.1386171691990915)); - f109 = MUL_F(f107, FRAC_CONST(0.7730104533627370)); - f110 = MUL_C(f72, COEF_CONST(1.4074037375263826)); - y[7] = f109 - f108; - y[9] = f110 - f109; -} - -void DCT4_16(real_t *y, real_t *x) -{ - real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; - real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; - real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30; - real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40; - real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50; - real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60; - real_t f61, f62, f63, f64, f65, f66, f67, f68, f69, f70; - real_t f71, f72, f73, f74, f75, f76, f77, f78, f79, f80; - real_t f81, f82, f83, f84, f85, f86, f87, f88, f89, f90; - real_t f91, f92, f93, f94, f95, f96, f97, f98, f99, f100; - real_t f101, f102, f103, f104, f105, f106, f107, f108, f109, f110; - real_t f111, f112, f113, f114, f115, f116, f117, f118, f119, f120; - real_t f121, f122, f123, f124, f125, f126, f127, f128, f130, f132; - real_t f134, f136, f138, f140, f142, f144, f145, f148, f149, f152; - real_t f153, f156, f157; - - f0 = x[0] + x[15]; - f1 = MUL_C(COEF_CONST(1.0478631305325901), x[0]); - f2 = MUL_F(FRAC_CONST(-0.9987954562051724), f0); - f3 = MUL_F(FRAC_CONST(-0.9497277818777548), x[15]); - f4 = f1 + f2; - f5 = f3 - f2; - f6 = x[2] + x[13]; - f7 = MUL_C(COEF_CONST(1.2130114330978077), x[2]); - f8 = MUL_F(FRAC_CONST(-0.9700312531945440), f6); - f9 = MUL_F(FRAC_CONST(-0.7270510732912803), x[13]); - f10 = f7 + f8; - f11 = f9 - f8; - f12 = x[4] + x[11]; - f13 = MUL_C(COEF_CONST(1.3315443865537255), x[4]); - f14 = MUL_F(FRAC_CONST(-0.9039892931234433), f12); - f15 = MUL_F(FRAC_CONST(-0.4764341996931612), x[11]); - f16 = f13 + f14; - f17 = f15 - f14; - f18 = x[6] + x[9]; - f19 = MUL_C(COEF_CONST(1.3989068359730781), x[6]); - f20 = MUL_F(FRAC_CONST(-0.8032075314806453), f18); - f21 = MUL_F(FRAC_CONST(-0.2075082269882124), x[9]); - f22 = f19 + f20; - f23 = f21 - f20; - f24 = x[8] + x[7]; - f25 = MUL_C(COEF_CONST(1.4125100802019777), x[8]); - f26 = MUL_F(FRAC_CONST(-0.6715589548470187), f24); - f27 = MUL_F(FRAC_CONST(0.0693921705079402), x[7]); - f28 = f25 + f26; - f29 = f27 - f26; - f30 = x[10] + x[5]; - f31 = MUL_C(COEF_CONST(1.3718313541934939), x[10]); - f32 = MUL_F(FRAC_CONST(-0.5141027441932219), f30); - f33 = MUL_F(FRAC_CONST(0.3436258658070501), x[5]); - f34 = f31 + f32; - f35 = f33 - f32; - f36 = x[12] + x[3]; - f37 = MUL_C(COEF_CONST(1.2784339185752409), x[12]); - f38 = MUL_F(FRAC_CONST(-0.3368898533922200), f36); - f39 = MUL_F(FRAC_CONST(0.6046542117908008), x[3]); - f40 = f37 + f38; - f41 = f39 - f38; - f42 = x[14] + x[1]; - f43 = MUL_C(COEF_CONST(1.1359069844201433), x[14]); - f44 = MUL_F(FRAC_CONST(-0.1467304744553624), f42); - f45 = MUL_F(FRAC_CONST(0.8424460355094185), x[1]); - f46 = f43 + f44; - f47 = f45 - f44; - f48 = f5 - f29; - f49 = f5 + f29; - f50 = f4 - f28; - f51 = f4 + f28; - f52 = f11 - f35; - f53 = f11 + f35; - f54 = f10 - f34; - f55 = f10 + f34; - f56 = f17 - f41; - f57 = f17 + f41; - f58 = f16 - f40; - f59 = f16 + f40; - f60 = f23 - f47; - f61 = f23 + f47; - f62 = f22 - f46; - f63 = f22 + f46; - f64 = f48 + f50; - f65 = MUL_C(COEF_CONST(1.1758756024193588), f48); - f66 = MUL_F(FRAC_CONST(-0.9807852804032304), f64); - f67 = MUL_F(FRAC_CONST(-0.7856949583871021), f50); - f68 = f65 + f66; - f69 = f67 - f66; - f70 = f52 + f54; - f71 = MUL_C(COEF_CONST(1.3870398453221475), f52); - f72 = MUL_F(FRAC_CONST(-0.5555702330196022), f70); - f73 = MUL_F(FRAC_CONST(0.2758993792829431), f54); - f74 = f71 + f72; - f75 = f73 - f72; - f76 = f56 + f58; - f77 = MUL_F(FRAC_CONST(0.7856949583871022), f56); - f78 = MUL_F(FRAC_CONST(0.1950903220161283), f76); - f79 = MUL_C(COEF_CONST(1.1758756024193586), f58); - f80 = f77 + f78; - f81 = f79 - f78; - f82 = f60 + f62; - f83 = MUL_F(FRAC_CONST(-0.2758993792829430), f60); - f84 = MUL_F(FRAC_CONST(0.8314696123025452), f82); - f85 = MUL_C(COEF_CONST(1.3870398453221475), f62); - f86 = f83 + f84; - f87 = f85 - f84; - f88 = f49 - f57; - f89 = f49 + f57; - f90 = f51 - f59; - f91 = f51 + f59; - f92 = f53 - f61; - f93 = f53 + f61; - f94 = f55 - f63; - f95 = f55 + f63; - f96 = f69 - f81; - f97 = f69 + f81; - f98 = f68 - f80; - f99 = f68 + f80; - f100 = f75 - f87; - f101 = f75 + f87; - f102 = f74 - f86; - f103 = f74 + f86; - f104 = f88 + f90; - f105 = MUL_C(COEF_CONST(1.3065629648763766), f88); - f106 = MUL_F(FRAC_CONST(-0.9238795325112866), f104); - f107 = MUL_F(FRAC_CONST(-0.5411961001461967), f90); - f108 = f105 + f106; - f109 = f107 - f106; - f110 = f92 + f94; - f111 = MUL_F(FRAC_CONST(0.5411961001461969), f92); - f112 = MUL_F(FRAC_CONST(0.3826834323650898), f110); - f113 = MUL_C(COEF_CONST(1.3065629648763766), f94); - f114 = f111 + f112; - f115 = f113 - f112; - f116 = f96 + f98; - f117 = MUL_C(COEF_CONST(1.3065629648763766), f96); - f118 = MUL_F(FRAC_CONST(-0.9238795325112866), f116); - f119 = MUL_F(FRAC_CONST(-0.5411961001461967), f98); - f120 = f117 + f118; - f121 = f119 - f118; - f122 = f100 + f102; - f123 = MUL_F(FRAC_CONST(0.5411961001461969), f100); - f124 = MUL_F(FRAC_CONST(0.3826834323650898), f122); - f125 = MUL_C(COEF_CONST(1.3065629648763766), f102); - f126 = f123 + f124; - f127 = f125 - f124; - f128 = f89 - f93; - y[0] = f89 + f93; - f130 = f91 - f95; - y[15] = f91 + f95; - f132 = f109 - f115; - y[3] = f109 + f115; - f134 = f108 - f114; - y[12] = f108 + f114; - f136 = f97 - f101; - y[1] = f97 + f101; - f138 = f99 - f103; - y[14] = f99 + f103; - f140 = f121 - f127; - y[2] = f121 + f127; - f142 = f120 - f126; - y[13] = f120 + f126; - f144 = f128 - f130; - f145 = f128 + f130; - y[8] = MUL_F(FRAC_CONST(0.7071067811865474), f144); - y[7] = MUL_F(FRAC_CONST(0.7071067811865474), f145); - f148 = f132 - f134; - f149 = f132 + f134; - y[11] = MUL_F(FRAC_CONST(0.7071067811865474), f148); - y[4] = MUL_F(FRAC_CONST(0.7071067811865474), f149); - f152 = f136 - f138; - f153 = f136 + f138; - y[9] = MUL_F(FRAC_CONST(0.7071067811865474), f152); - y[6] = MUL_F(FRAC_CONST(0.7071067811865474), f153); - f156 = f140 - f142; - f157 = f140 + f142; - y[10] = MUL_F(FRAC_CONST(0.7071067811865474), f156); - y[5] = MUL_F(FRAC_CONST(0.7071067811865474), f157); -} - -void DCT3_32_unscaled(real_t *y, real_t *x) -{ - real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; - real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; - real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30; - real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40; - real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50; - real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60; - real_t f61, f62, f63, f64, f65, f66, f67, f68, f69, f70; - real_t f71, f72, f73, f74, f75, f76, f77, f78, f79, f80; - real_t f81, f82, f83, f84, f85, f86, f87, f88, f89, f90; - real_t f91, f92, f93, f94, f95, f96, f97, f98, f99, f100; - real_t f101, f102, f103, f104, f105, f106, f107, f108, f109, f110; - real_t f111, f112, f113, f114, f115, f116, f117, f118, f119, f120; - real_t f121, f122, f123, f124, f125, f126, f127, f128, f129, f130; - real_t f131, f132, f133, f134, f135, f136, f137, f138, f139, f140; - real_t f141, f142, f143, f144, f145, f146, f147, f148, f149, f150; - real_t f151, f152, f153, f154, f155, f156, f157, f158, f159, f160; - real_t f161, f162, f163, f164, f165, f166, f167, f168, f169, f170; - real_t f171, f172, f173, f174, f175, f176, f177, f178, f179, f180; - real_t f181, f182, f183, f184, f185, f186, f187, f188, f189, f190; - real_t f191, f192, f193, f194, f195, f196, f197, f198, f199, f200; - real_t f201, f202, f203, f204, f205, f206, f207, f208, f209, f210; - real_t f211, f212, f213, f214, f215, f216, f217, f218, f219, f220; - real_t f221, f222, f223, f224, f225, f226, f227, f228, f229, f230; - real_t f231, f232, f233, f234, f235, f236, f237, f238, f239, f240; - real_t f241, f242, f243, f244, f245, f246, f247, f248, f249, f250; - real_t f251, f252, f253, f254, f255, f256, f257, f258, f259, f260; - real_t f261, f262, f263, f264, f265, f266, f267, f268, f269, f270; - real_t f271, f272; - - f0 = MUL_F(x[16], FRAC_CONST(0.7071067811865476)); - f1 = x[0] - f0; - f2 = x[0] + f0; - f3 = x[8] + x[24]; - f4 = MUL_C(x[8], COEF_CONST(1.3065629648763766)); - f5 = MUL_F(f3, FRAC_CONST((-0.9238795325112866))); - f6 = MUL_F(x[24], FRAC_CONST((-0.5411961001461967))); - f7 = f4 + f5; - f8 = f6 - f5; - f9 = f2 - f8; - f10 = f2 + f8; - f11 = f1 - f7; - f12 = f1 + f7; - f13 = x[4] + x[28]; - f14 = MUL_C(x[4], COEF_CONST(1.1758756024193588)); - f15 = MUL_F(f13, FRAC_CONST((-0.9807852804032304))); - f16 = MUL_F(x[28], FRAC_CONST((-0.7856949583871021))); - f17 = f14 + f15; - f18 = f16 - f15; - f19 = x[12] + x[20]; - f20 = MUL_C(x[12], COEF_CONST(1.3870398453221473)); - f21 = MUL_F(f19, FRAC_CONST((-0.8314696123025455))); - f22 = MUL_F(x[20], FRAC_CONST((-0.2758993792829436))); - f23 = f20 + f21; - f24 = f22 - f21; - f25 = f18 - f24; - f26 = f18 + f24; - f27 = MUL_F(f25, FRAC_CONST(0.7071067811865476)); - f28 = f17 - f23; - f29 = f17 + f23; - f30 = MUL_F(f29, FRAC_CONST(0.7071067811865476)); - f31 = f27 - f30; - f32 = f27 + f30; - f33 = f10 - f26; - f34 = f10 + f26; - f35 = f12 - f32; - f36 = f12 + f32; - f37 = f11 - f31; - f38 = f11 + f31; - f39 = f9 - f28; - f40 = f9 + f28; - f41 = x[2] + x[30]; - f42 = MUL_C(x[2], COEF_CONST(1.0932018670017569)); - f43 = MUL_F(f41, FRAC_CONST((-0.9951847266721969))); - f44 = MUL_F(x[30], FRAC_CONST((-0.8971675863426368))); - f45 = f42 + f43; - f46 = f44 - f43; - f47 = x[6] + x[26]; - f48 = MUL_C(x[6], COEF_CONST(1.2472250129866711)); - f49 = MUL_F(f47, FRAC_CONST((-0.9569403357322089))); - f50 = MUL_F(x[26], FRAC_CONST((-0.6666556584777469))); - f51 = f48 + f49; - f52 = f50 - f49; - f53 = x[10] + x[22]; - f54 = MUL_C(x[10], COEF_CONST(1.3533180011743526)); - f55 = MUL_F(f53, FRAC_CONST((-0.8819212643483551))); - f56 = MUL_F(x[22], FRAC_CONST((-0.4105245275223575))); - f57 = f54 + f55; - f58 = f56 - f55; - f59 = x[14] + x[18]; - f60 = MUL_C(x[14], COEF_CONST(1.4074037375263826)); - f61 = MUL_F(f59, FRAC_CONST((-0.7730104533627369))); - f62 = MUL_F(x[18], FRAC_CONST((-0.1386171691990913))); - f63 = f60 + f61; - f64 = f62 - f61; - f65 = f46 - f64; - f66 = f46 + f64; - f67 = f52 - f58; - f68 = f52 + f58; - f69 = f66 - f68; - f70 = f66 + f68; - f71 = MUL_F(f69, FRAC_CONST(0.7071067811865476)); - f72 = f65 + f67; - f73 = MUL_C(f65, COEF_CONST(1.3065629648763766)); - f74 = MUL_F(f72, FRAC_CONST((-0.9238795325112866))); - f75 = MUL_F(f67, FRAC_CONST((-0.5411961001461967))); - f76 = f73 + f74; - f77 = f75 - f74; - f78 = f45 - f63; - f79 = f45 + f63; - f80 = f51 - f57; - f81 = f51 + f57; - f82 = f79 + f81; - f83 = MUL_C(f79, COEF_CONST(1.3065629648763770)); - f84 = MUL_F(f82, FRAC_CONST((-0.3826834323650904))); - f85 = MUL_F(f81, FRAC_CONST(0.5411961001461961)); - f86 = f83 + f84; - f87 = f85 - f84; - f88 = f78 - f80; - f89 = f78 + f80; - f90 = MUL_F(f89, FRAC_CONST(0.7071067811865476)); - f91 = f77 - f87; - f92 = f77 + f87; - f93 = f71 - f90; - f94 = f71 + f90; - f95 = f76 - f86; - f96 = f76 + f86; - f97 = f34 - f70; - f98 = f34 + f70; - f99 = f36 - f92; - f100 = f36 + f92; - f101 = f38 - f91; - f102 = f38 + f91; - f103 = f40 - f94; - f104 = f40 + f94; - f105 = f39 - f93; - f106 = f39 + f93; - f107 = f37 - f96; - f108 = f37 + f96; - f109 = f35 - f95; - f110 = f35 + f95; - f111 = f33 - f88; - f112 = f33 + f88; - f113 = x[1] + x[31]; - f114 = MUL_C(x[1], COEF_CONST(1.0478631305325901)); - f115 = MUL_F(f113, FRAC_CONST((-0.9987954562051724))); - f116 = MUL_F(x[31], FRAC_CONST((-0.9497277818777548))); - f117 = f114 + f115; - f118 = f116 - f115; - f119 = x[5] + x[27]; - f120 = MUL_C(x[5], COEF_CONST(1.2130114330978077)); - f121 = MUL_F(f119, FRAC_CONST((-0.9700312531945440))); - f122 = MUL_F(x[27], FRAC_CONST((-0.7270510732912803))); - f123 = f120 + f121; - f124 = f122 - f121; - f125 = x[9] + x[23]; - f126 = MUL_C(x[9], COEF_CONST(1.3315443865537255)); - f127 = MUL_F(f125, FRAC_CONST((-0.9039892931234433))); - f128 = MUL_F(x[23], FRAC_CONST((-0.4764341996931612))); - f129 = f126 + f127; - f130 = f128 - f127; - f131 = x[13] + x[19]; - f132 = MUL_C(x[13], COEF_CONST(1.3989068359730781)); - f133 = MUL_F(f131, FRAC_CONST((-0.8032075314806453))); - f134 = MUL_F(x[19], FRAC_CONST((-0.2075082269882124))); - f135 = f132 + f133; - f136 = f134 - f133; - f137 = x[17] + x[15]; - f138 = MUL_C(x[17], COEF_CONST(1.4125100802019777)); - f139 = MUL_F(f137, FRAC_CONST((-0.6715589548470187))); - f140 = MUL_F(x[15], FRAC_CONST(0.0693921705079402)); - f141 = f138 + f139; - f142 = f140 - f139; - f143 = x[21] + x[11]; - f144 = MUL_C(x[21], COEF_CONST(1.3718313541934939)); - f145 = MUL_F(f143, FRAC_CONST((-0.5141027441932219))); - f146 = MUL_F(x[11], FRAC_CONST(0.3436258658070501)); - f147 = f144 + f145; - f148 = f146 - f145; - f149 = x[25] + x[7]; - f150 = MUL_C(x[25], COEF_CONST(1.2784339185752409)); - f151 = MUL_F(f149, FRAC_CONST((-0.3368898533922200))); - f152 = MUL_F(x[7], FRAC_CONST(0.6046542117908008)); - f153 = f150 + f151; - f154 = f152 - f151; - f155 = x[29] + x[3]; - f156 = MUL_C(x[29], COEF_CONST(1.1359069844201433)); - f157 = MUL_F(f155, FRAC_CONST((-0.1467304744553624))); - f158 = MUL_F(x[3], FRAC_CONST(0.8424460355094185)); - f159 = f156 + f157; - f160 = f158 - f157; - f161 = f118 - f142; - f162 = f118 + f142; - f163 = f117 - f141; - f164 = f117 + f141; - f165 = f124 - f148; - f166 = f124 + f148; - f167 = f123 - f147; - f168 = f123 + f147; - f169 = f130 - f154; - f170 = f130 + f154; - f171 = f129 - f153; - f172 = f129 + f153; - f173 = f136 - f160; - f174 = f136 + f160; - f175 = f135 - f159; - f176 = f135 + f159; - f177 = f161 + f163; - f178 = MUL_C(f161, COEF_CONST(1.1758756024193588)); - f179 = MUL_F(f177, FRAC_CONST((-0.9807852804032304))); - f180 = MUL_F(f163, FRAC_CONST((-0.7856949583871021))); - f181 = f178 + f179; - f182 = f180 - f179; - f183 = f165 + f167; - f184 = MUL_C(f165, COEF_CONST(1.3870398453221475)); - f185 = MUL_F(f183, FRAC_CONST((-0.5555702330196022))); - f186 = MUL_F(f167, FRAC_CONST(0.2758993792829431)); - f187 = f184 + f185; - f188 = f186 - f185; - f189 = f169 + f171; - f190 = MUL_F(f169, FRAC_CONST(0.7856949583871022)); - f191 = MUL_F(f189, FRAC_CONST(0.1950903220161283)); - f192 = MUL_C(f171, COEF_CONST(1.1758756024193586)); - f193 = f190 + f191; - f194 = f192 - f191; - f195 = f173 + f175; - f196 = MUL_F(f173, FRAC_CONST((-0.2758993792829430))); - f197 = MUL_F(f195, FRAC_CONST(0.8314696123025452)); - f198 = MUL_C(f175, COEF_CONST(1.3870398453221475)); - f199 = f196 + f197; - f200 = f198 - f197; - f201 = f162 - f170; - f202 = f162 + f170; - f203 = f164 - f172; - f204 = f164 + f172; - f205 = f166 - f174; - f206 = f166 + f174; - f207 = f168 - f176; - f208 = f168 + f176; - f209 = f182 - f194; - f210 = f182 + f194; - f211 = f181 - f193; - f212 = f181 + f193; - f213 = f188 - f200; - f214 = f188 + f200; - f215 = f187 - f199; - f216 = f187 + f199; - f217 = f201 + f203; - f218 = MUL_C(f201, COEF_CONST(1.3065629648763766)); - f219 = MUL_F(f217, FRAC_CONST((-0.9238795325112866))); - f220 = MUL_F(f203, FRAC_CONST((-0.5411961001461967))); - f221 = f218 + f219; - f222 = f220 - f219; - f223 = f205 + f207; - f224 = MUL_F(f205, FRAC_CONST(0.5411961001461969)); - f225 = MUL_F(f223, FRAC_CONST(0.3826834323650898)); - f226 = MUL_C(f207, COEF_CONST(1.3065629648763766)); - f227 = f224 + f225; - f228 = f226 - f225; - f229 = f209 + f211; - f230 = MUL_C(f209, COEF_CONST(1.3065629648763766)); - f231 = MUL_F(f229, FRAC_CONST((-0.9238795325112866))); - f232 = MUL_F(f211, FRAC_CONST((-0.5411961001461967))); - f233 = f230 + f231; - f234 = f232 - f231; - f235 = f213 + f215; - f236 = MUL_F(f213, FRAC_CONST(0.5411961001461969)); - f237 = MUL_F(f235, FRAC_CONST(0.3826834323650898)); - f238 = MUL_C(f215, COEF_CONST(1.3065629648763766)); - f239 = f236 + f237; - f240 = f238 - f237; - f241 = f202 - f206; - f242 = f202 + f206; - f243 = f204 - f208; - f244 = f204 + f208; - f245 = f222 - f228; - f246 = f222 + f228; - f247 = f221 - f227; - f248 = f221 + f227; - f249 = f210 - f214; - f250 = f210 + f214; - f251 = f212 - f216; - f252 = f212 + f216; - f253 = f234 - f240; - f254 = f234 + f240; - f255 = f233 - f239; - f256 = f233 + f239; - f257 = f241 - f243; - f258 = f241 + f243; - f259 = MUL_F(f257, FRAC_CONST(0.7071067811865474)); - f260 = MUL_F(f258, FRAC_CONST(0.7071067811865474)); - f261 = f245 - f247; - f262 = f245 + f247; - f263 = MUL_F(f261, FRAC_CONST(0.7071067811865474)); - f264 = MUL_F(f262, FRAC_CONST(0.7071067811865474)); - f265 = f249 - f251; - f266 = f249 + f251; - f267 = MUL_F(f265, FRAC_CONST(0.7071067811865474)); - f268 = MUL_F(f266, FRAC_CONST(0.7071067811865474)); - f269 = f253 - f255; - f270 = f253 + f255; - f271 = MUL_F(f269, FRAC_CONST(0.7071067811865474)); - f272 = MUL_F(f270, FRAC_CONST(0.7071067811865474)); - y[31] = f98 - f242; - y[0] = f98 + f242; - y[30] = f100 - f250; - y[1] = f100 + f250; - y[29] = f102 - f254; - y[2] = f102 + f254; - y[28] = f104 - f246; - y[3] = f104 + f246; - y[27] = f106 - f264; - y[4] = f106 + f264; - y[26] = f108 - f272; - y[5] = f108 + f272; - y[25] = f110 - f268; - y[6] = f110 + f268; - y[24] = f112 - f260; - y[7] = f112 + f260; - y[23] = f111 - f259; - y[8] = f111 + f259; - y[22] = f109 - f267; - y[9] = f109 + f267; - y[21] = f107 - f271; - y[10] = f107 + f271; - y[20] = f105 - f263; - y[11] = f105 + f263; - y[19] = f103 - f248; - y[12] = f103 + f248; - y[18] = f101 - f256; - y[13] = f101 + f256; - y[17] = f99 - f252; - y[14] = f99 + f252; - y[16] = f97 - f244; - y[15] = f97 + f244; -} - -void DCT2_32_unscaled(real_t *y, real_t *x) -{ - real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; - real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; - real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30; - real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40; - real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50; - real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60; - real_t f63, f64, f65, f66, f69, f70, f71, f72, f73, f74; - real_t f75, f76, f77, f78, f79, f80, f81, f83, f85, f86; - real_t f89, f90, f91, f92, f93, f94, f95, f96, f97, f98; - real_t f99, f100, f101, f102, f103, f104, f105, f106, f107, f108; - real_t f109, f110, f111, f112, f113, f114, f115, f116, f117, f118; - real_t f119, f120, f121, f122, f123, f124, f127, f128, f129, f130; - real_t f133, f134, f135, f136, f139, f140, f141, f142, f145, f146; - real_t f147, f148, f149, f150, f151, f152, f153, f154, f155, f156; - real_t f157, f158, f159, f160, f161, f162, f163, f164, f165, f166; - real_t f167, f168, f169, f170, f171, f172, f173, f174, f175, f176; - real_t f177, f178, f179, f180, f181, f182, f183, f184, f185, f186; - real_t f187, f188, f189, f190, f191, f192, f193, f194, f195, f196; - real_t f197, f198, f199, f200, f201, f202, f203, f204, f205, f206; - real_t f207, f208, f209, f210, f211, f212, f213, f214, f215, f216; - real_t f217, f218, f219, f220, f221, f222, f223, f224, f225, f226; - real_t f227, f228, f229, f230, f231, f232, f233, f234, f235, f236; - real_t f237, f238, f239, f240, f241, f242, f243, f244, f247, f248; - real_t f249, f250, f253, f254, f255, f256, f259, f260, f261, f262; - real_t f265, f266, f267, f268, f271, f272, f273, f274, f277, f278; - real_t f279, f280, f283, f284, f285, f286; - - f0 = x[0] - x[31]; - f1 = x[0] + x[31]; - f2 = x[1] - x[30]; - f3 = x[1] + x[30]; - f4 = x[2] - x[29]; - f5 = x[2] + x[29]; - f6 = x[3] - x[28]; - f7 = x[3] + x[28]; - f8 = x[4] - x[27]; - f9 = x[4] + x[27]; - f10 = x[5] - x[26]; - f11 = x[5] + x[26]; - f12 = x[6] - x[25]; - f13 = x[6] + x[25]; - f14 = x[7] - x[24]; - f15 = x[7] + x[24]; - f16 = x[8] - x[23]; - f17 = x[8] + x[23]; - f18 = x[9] - x[22]; - f19 = x[9] + x[22]; - f20 = x[10] - x[21]; - f21 = x[10] + x[21]; - f22 = x[11] - x[20]; - f23 = x[11] + x[20]; - f24 = x[12] - x[19]; - f25 = x[12] + x[19]; - f26 = x[13] - x[18]; - f27 = x[13] + x[18]; - f28 = x[14] - x[17]; - f29 = x[14] + x[17]; - f30 = x[15] - x[16]; - f31 = x[15] + x[16]; - f32 = f1 - f31; - f33 = f1 + f31; - f34 = f3 - f29; - f35 = f3 + f29; - f36 = f5 - f27; - f37 = f5 + f27; - f38 = f7 - f25; - f39 = f7 + f25; - f40 = f9 - f23; - f41 = f9 + f23; - f42 = f11 - f21; - f43 = f11 + f21; - f44 = f13 - f19; - f45 = f13 + f19; - f46 = f15 - f17; - f47 = f15 + f17; - f48 = f33 - f47; - f49 = f33 + f47; - f50 = f35 - f45; - f51 = f35 + f45; - f52 = f37 - f43; - f53 = f37 + f43; - f54 = f39 - f41; - f55 = f39 + f41; - f56 = f49 - f55; - f57 = f49 + f55; - f58 = f51 - f53; - f59 = f51 + f53; - f60 = f57 - f59; - y[0] = f57 + f59; - y[16] = MUL_F(FRAC_CONST(0.7071067811865476), f60); - f63 = f56 + f58; - f64 = MUL_C(COEF_CONST(1.3065629648763766), f56); - f65 = MUL_F(FRAC_CONST(-0.9238795325112866), f63); - f66 = MUL_F(FRAC_CONST(-0.5411961001461967), f58); - y[24] = f64 + f65; - y[8] = f66 - f65; - f69 = f48 + f54; - f70 = MUL_C(COEF_CONST(1.1758756024193588), f48); - f71 = MUL_F(FRAC_CONST(-0.9807852804032304), f69); - f72 = MUL_F(FRAC_CONST(-0.7856949583871021), f54); - f73 = f70 + f71; - f74 = f72 - f71; - f75 = f50 + f52; - f76 = MUL_C(COEF_CONST(1.3870398453221473), f50); - f77 = MUL_F(FRAC_CONST(-0.8314696123025455), f75); - f78 = MUL_F(FRAC_CONST(-0.2758993792829436), f52); - f79 = f76 + f77; - f80 = f78 - f77; - f81 = f74 - f80; - y[4] = f74 + f80; - f83 = MUL_F(FRAC_CONST(0.7071067811865476), f81); - y[28] = f73 - f79; - f85 = f73 + f79; - f86 = MUL_F(FRAC_CONST(0.7071067811865476), f85); - y[20] = f83 - f86; - y[12] = f83 + f86; - f89 = f34 - f36; - f90 = f34 + f36; - f91 = f38 - f40; - f92 = f38 + f40; - f93 = f42 - f44; - f94 = f42 + f44; - f95 = MUL_F(FRAC_CONST(0.7071067811865476), f92); - f96 = f32 - f95; - f97 = f32 + f95; - f98 = f90 + f94; - f99 = MUL_C(COEF_CONST(1.3065629648763766), f90); - f100 = MUL_F(FRAC_CONST(-0.9238795325112866), f98); - f101 = MUL_F(FRAC_CONST(-0.5411961001461967), f94); - f102 = f99 + f100; - f103 = f101 - f100; - f104 = f97 - f103; - f105 = f97 + f103; - f106 = f96 - f102; - f107 = f96 + f102; - f108 = MUL_F(FRAC_CONST(0.7071067811865476), f91); - f109 = f46 - f108; - f110 = f46 + f108; - f111 = f93 + f89; - f112 = MUL_C(COEF_CONST(1.3065629648763766), f93); - f113 = MUL_F(FRAC_CONST(-0.9238795325112866), f111); - f114 = MUL_F(FRAC_CONST(-0.5411961001461967), f89); - f115 = f112 + f113; - f116 = f114 - f113; - f117 = f110 - f116; - f118 = f110 + f116; - f119 = f109 - f115; - f120 = f109 + f115; - f121 = f118 + f105; - f122 = MUL_F(FRAC_CONST(-0.8971675863426361), f118); - f123 = MUL_F(FRAC_CONST(0.9951847266721968), f121); - f124 = MUL_C(COEF_CONST(1.0932018670017576), f105); - y[2] = f122 + f123; - y[30] = f124 - f123; - f127 = f107 - f120; - f128 = MUL_F(FRAC_CONST(-0.6666556584777466), f120); - f129 = MUL_F(FRAC_CONST(0.9569403357322089), f127); - f130 = MUL_C(COEF_CONST(1.2472250129866713), f107); - y[6] = f129 - f128; - y[26] = f130 - f129; - f133 = f119 + f106; - f134 = MUL_F(FRAC_CONST(-0.4105245275223571), f119); - f135 = MUL_F(FRAC_CONST(0.8819212643483549), f133); - f136 = MUL_C(COEF_CONST(1.3533180011743529), f106); - y[10] = f134 + f135; - y[22] = f136 - f135; - f139 = f104 - f117; - f140 = MUL_F(FRAC_CONST(-0.1386171691990915), f117); - f141 = MUL_F(FRAC_CONST(0.7730104533627370), f139); - f142 = MUL_C(COEF_CONST(1.4074037375263826), f104); - y[14] = f141 - f140; - y[18] = f142 - f141; - f145 = f2 - f4; - f146 = f2 + f4; - f147 = f6 - f8; - f148 = f6 + f8; - f149 = f10 - f12; - f150 = f10 + f12; - f151 = f14 - f16; - f152 = f14 + f16; - f153 = f18 - f20; - f154 = f18 + f20; - f155 = f22 - f24; - f156 = f22 + f24; - f157 = f26 - f28; - f158 = f26 + f28; - f159 = MUL_F(FRAC_CONST(0.7071067811865476), f152); - f160 = f0 - f159; - f161 = f0 + f159; - f162 = f148 + f156; - f163 = MUL_C(COEF_CONST(1.3065629648763766), f148); - f164 = MUL_F(FRAC_CONST(-0.9238795325112866), f162); - f165 = MUL_F(FRAC_CONST(-0.5411961001461967), f156); - f166 = f163 + f164; - f167 = f165 - f164; - f168 = f161 - f167; - f169 = f161 + f167; - f170 = f160 - f166; - f171 = f160 + f166; - f172 = f146 + f158; - f173 = MUL_C(COEF_CONST(1.1758756024193588), f146); - f174 = MUL_F(FRAC_CONST(-0.9807852804032304), f172); - f175 = MUL_F(FRAC_CONST(-0.7856949583871021), f158); - f176 = f173 + f174; - f177 = f175 - f174; - f178 = f150 + f154; - f179 = MUL_C(COEF_CONST(1.3870398453221473), f150); - f180 = MUL_F(FRAC_CONST(-0.8314696123025455), f178); - f181 = MUL_F(FRAC_CONST(-0.2758993792829436), f154); - f182 = f179 + f180; - f183 = f181 - f180; - f184 = f177 - f183; - f185 = f177 + f183; - f186 = MUL_F(FRAC_CONST(0.7071067811865476), f184); - f187 = f176 - f182; - f188 = f176 + f182; - f189 = MUL_F(FRAC_CONST(0.7071067811865476), f188); - f190 = f186 - f189; - f191 = f186 + f189; - f192 = f169 - f185; - f193 = f169 + f185; - f194 = f171 - f191; - f195 = f171 + f191; - f196 = f170 - f190; - f197 = f170 + f190; - f198 = f168 - f187; - f199 = f168 + f187; - f200 = MUL_F(FRAC_CONST(0.7071067811865476), f151); - f201 = f30 - f200; - f202 = f30 + f200; - f203 = f155 + f147; - f204 = MUL_C(COEF_CONST(1.3065629648763766), f155); - f205 = MUL_F(FRAC_CONST(-0.9238795325112866), f203); - f206 = MUL_F(FRAC_CONST(-0.5411961001461967), f147); - f207 = f204 + f205; - f208 = f206 - f205; - f209 = f202 - f208; - f210 = f202 + f208; - f211 = f201 - f207; - f212 = f201 + f207; - f213 = f157 + f145; - f214 = MUL_C(COEF_CONST(1.1758756024193588), f157); - f215 = MUL_F(FRAC_CONST(-0.9807852804032304), f213); - f216 = MUL_F(FRAC_CONST(-0.7856949583871021), f145); - f217 = f214 + f215; - f218 = f216 - f215; - f219 = f153 + f149; - f220 = MUL_C(COEF_CONST(1.3870398453221473), f153); - f221 = MUL_F(FRAC_CONST(-0.8314696123025455), f219); - f222 = MUL_F(FRAC_CONST(-0.2758993792829436), f149); - f223 = f220 + f221; - f224 = f222 - f221; - f225 = f218 - f224; - f226 = f218 + f224; - f227 = MUL_F(FRAC_CONST(0.7071067811865476), f225); - f228 = f217 - f223; - f229 = f217 + f223; - f230 = MUL_F(FRAC_CONST(0.7071067811865476), f229); - f231 = f227 - f230; - f232 = f227 + f230; - f233 = f210 - f226; - f234 = f210 + f226; - f235 = f212 - f232; - f236 = f212 + f232; - f237 = f211 - f231; - f238 = f211 + f231; - f239 = f209 - f228; - f240 = f209 + f228; - f241 = f234 + f193; - f242 = MUL_F(FRAC_CONST(-0.9497277818777543), f234); - f243 = MUL_F(FRAC_CONST(0.9987954562051724), f241); - f244 = MUL_C(COEF_CONST(1.0478631305325905), f193); - y[1] = f242 + f243; - y[31] = f244 - f243; - f247 = f195 - f236; - f248 = MUL_F(FRAC_CONST(-0.8424460355094192), f236); - f249 = MUL_F(FRAC_CONST(0.9891765099647810), f247); - f250 = MUL_C(COEF_CONST(1.1359069844201428), f195); - y[3] = f249 - f248; - y[29] = f250 - f249; - f253 = f238 + f197; - f254 = MUL_F(FRAC_CONST(-0.7270510732912801), f238); - f255 = MUL_F(FRAC_CONST(0.9700312531945440), f253); - f256 = MUL_C(COEF_CONST(1.2130114330978079), f197); - y[5] = f254 + f255; - y[27] = f256 - f255; - f259 = f199 - f240; - f260 = MUL_F(FRAC_CONST(-0.6046542117908007), f240); - f261 = MUL_F(FRAC_CONST(0.9415440651830208), f259); - f262 = MUL_C(COEF_CONST(1.2784339185752409), f199); - y[7] = f261 - f260; - y[25] = f262 - f261; - f265 = f239 + f198; - f266 = MUL_F(FRAC_CONST(-0.4764341996931611), f239); - f267 = MUL_F(FRAC_CONST(0.9039892931234433), f265); - f268 = MUL_C(COEF_CONST(1.3315443865537255), f198); - y[9] = f266 + f267; - y[23] = f268 - f267; - f271 = f196 - f237; - f272 = MUL_F(FRAC_CONST(-0.3436258658070505), f237); - f273 = MUL_F(FRAC_CONST(0.8577286100002721), f271); - f274 = MUL_C(COEF_CONST(1.3718313541934939), f196); - y[11] = f273 - f272; - y[21] = f274 - f273; - f277 = f235 + f194; - f278 = MUL_F(FRAC_CONST(-0.2075082269882114), f235); - f279 = MUL_F(FRAC_CONST(0.8032075314806448), f277); - f280 = MUL_C(COEF_CONST(1.3989068359730783), f194); - y[13] = f278 + f279; - y[19] = f280 - f279; - f283 = f192 - f233; - f284 = MUL_F(FRAC_CONST(-0.0693921705079408), f233); - f285 = MUL_F(FRAC_CONST(0.7409511253549591), f283); - f286 = MUL_C(COEF_CONST(1.4125100802019774), f192); - y[15] = f285 - f284; - y[17] = f286 - f285; -} - -#else - - -#define n 32 -#define log2n 5 - -// w_array_real[i] = cos(2*M_PI*i/32) -static const real_t w_array_real[] = { - FRAC_CONST(1.000000000000000), FRAC_CONST(0.980785279337272), - FRAC_CONST(0.923879528329380), FRAC_CONST(0.831469603195765), - FRAC_CONST(0.707106765732237), FRAC_CONST(0.555570210304169), - FRAC_CONST(0.382683402077046), FRAC_CONST(0.195090284503576), - FRAC_CONST(0.000000000000000), FRAC_CONST(-0.195090370246552), - FRAC_CONST(-0.382683482845162), FRAC_CONST(-0.555570282993553), - FRAC_CONST(-0.707106827549476), FRAC_CONST(-0.831469651765257), - FRAC_CONST(-0.923879561784627), FRAC_CONST(-0.980785296392607) -}; - -// w_array_imag[i] = sin(-2*M_PI*i/32) -static const real_t w_array_imag[] = { - FRAC_CONST(0.000000000000000), FRAC_CONST(-0.195090327375064), - FRAC_CONST(-0.382683442461104), FRAC_CONST(-0.555570246648862), - FRAC_CONST(-0.707106796640858), FRAC_CONST(-0.831469627480512), - FRAC_CONST(-0.923879545057005), FRAC_CONST(-0.980785287864940), - FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.980785270809601), - FRAC_CONST(-0.923879511601754), FRAC_CONST(-0.831469578911016), - FRAC_CONST(-0.707106734823616), FRAC_CONST(-0.555570173959476), - FRAC_CONST(-0.382683361692986), FRAC_CONST(-0.195090241632088) -}; - -// FFT decimation in frequency -// 4*16*2+16=128+16=144 multiplications -// 6*16*2+10*8+4*16*2=192+80+128=400 additions -static void fft_dif(real_t * Real, real_t * Imag) -{ - real_t w_real, w_imag; // For faster access - real_t point1_real, point1_imag, point2_real, point2_imag; // For faster access - uint32_t j, i, i2, w_index; // Counters - - // First 2 stages of 32 point FFT decimation in frequency - // 4*16*2=64*2=128 multiplications - // 6*16*2=96*2=192 additions - // Stage 1 of 32 point FFT decimation in frequency - for (i = 0; i < 16; i++) - { - point1_real = Real[i]; - point1_imag = Imag[i]; - i2 = i+16; - point2_real = Real[i2]; - point2_imag = Imag[i2]; - - w_real = w_array_real[i]; - w_imag = w_array_imag[i]; - - // temp1 = x[i] - x[i2] - point1_real -= point2_real; - point1_imag -= point2_imag; - - // x[i1] = x[i] + x[i2] - Real[i] += point2_real; - Imag[i] += point2_imag; - - // x[i2] = (x[i] - x[i2]) * w - Real[i2] = (MUL_F(point1_real,w_real) - MUL_F(point1_imag,w_imag)); - Imag[i2] = (MUL_F(point1_real,w_imag) + MUL_F(point1_imag,w_real)); - } - // Stage 2 of 32 point FFT decimation in frequency - for (j = 0, w_index = 0; j < 8; j++, w_index += 2) - { - w_real = w_array_real[w_index]; - w_imag = w_array_imag[w_index]; - - i = j; - point1_real = Real[i]; - point1_imag = Imag[i]; - i2 = i+8; - point2_real = Real[i2]; - point2_imag = Imag[i2]; - - // temp1 = x[i] - x[i2] - point1_real -= point2_real; - point1_imag -= point2_imag; - - // x[i1] = x[i] + x[i2] - Real[i] += point2_real; - Imag[i] += point2_imag; - - // x[i2] = (x[i] - x[i2]) * w - Real[i2] = (MUL_F(point1_real,w_real) - MUL_F(point1_imag,w_imag)); - Imag[i2] = (MUL_F(point1_real,w_imag) + MUL_F(point1_imag,w_real)); - - i = j+16; - point1_real = Real[i]; - point1_imag = Imag[i]; - i2 = i+8; - point2_real = Real[i2]; - point2_imag = Imag[i2]; - - // temp1 = x[i] - x[i2] - point1_real -= point2_real; - point1_imag -= point2_imag; - - // x[i1] = x[i] + x[i2] - Real[i] += point2_real; - Imag[i] += point2_imag; - - // x[i2] = (x[i] - x[i2]) * w - Real[i2] = (MUL_F(point1_real,w_real) - MUL_F(point1_imag,w_imag)); - Imag[i2] = (MUL_F(point1_real,w_imag) + MUL_F(point1_imag,w_real)); - } - - // Stage 3 of 32 point FFT decimation in frequency - // 2*4*2=16 multiplications - // 4*4*2+6*4*2=10*8=80 additions - for (i = 0; i < n; i += 8) - { - i2 = i+4; - point1_real = Real[i]; - point1_imag = Imag[i]; - - point2_real = Real[i2]; - point2_imag = Imag[i2]; - - // out[i1] = point1 + point2 - Real[i] += point2_real; - Imag[i] += point2_imag; - - // out[i2] = point1 - point2 - Real[i2] = point1_real - point2_real; - Imag[i2] = point1_imag - point2_imag; - } - w_real = w_array_real[4]; // = sqrt(2)/2 - // w_imag = -w_real; // = w_array_imag[4]; // = -sqrt(2)/2 - for (i = 1; i < n; i += 8) - { - i2 = i+4; - point1_real = Real[i]; - point1_imag = Imag[i]; - - point2_real = Real[i2]; - point2_imag = Imag[i2]; - - // temp1 = x[i] - x[i2] - point1_real -= point2_real; - point1_imag -= point2_imag; - - // x[i1] = x[i] + x[i2] - Real[i] += point2_real; - Imag[i] += point2_imag; - - // x[i2] = (x[i] - x[i2]) * w - Real[i2] = MUL_F(point1_real+point1_imag, w_real); - Imag[i2] = MUL_F(point1_imag-point1_real, w_real); - } - for (i = 2; i < n; i += 8) - { - i2 = i+4; - point1_real = Real[i]; - point1_imag = Imag[i]; - - point2_real = Real[i2]; - point2_imag = Imag[i2]; - - // x[i] = x[i] + x[i2] - Real[i] += point2_real; - Imag[i] += point2_imag; - - // x[i2] = (x[i] - x[i2]) * (-i) - Real[i2] = point1_imag - point2_imag; - Imag[i2] = point2_real - point1_real; - } - w_real = w_array_real[12]; // = -sqrt(2)/2 - // w_imag = w_real; // = w_array_imag[12]; // = -sqrt(2)/2 - for (i = 3; i < n; i += 8) - { - i2 = i+4; - point1_real = Real[i]; - point1_imag = Imag[i]; - - point2_real = Real[i2]; - point2_imag = Imag[i2]; - - // temp1 = x[i] - x[i2] - point1_real -= point2_real; - point1_imag -= point2_imag; - - // x[i1] = x[i] + x[i2] - Real[i] += point2_real; - Imag[i] += point2_imag; - - // x[i2] = (x[i] - x[i2]) * w - Real[i2] = MUL_F(point1_real-point1_imag, w_real); - Imag[i2] = MUL_F(point1_real+point1_imag, w_real); - } - - - // Stage 4 of 32 point FFT decimation in frequency (no multiplications) - // 16*4=64 additions - for (i = 0; i < n; i += 4) - { - i2 = i+2; - point1_real = Real[i]; - point1_imag = Imag[i]; - - point2_real = Real[i2]; - point2_imag = Imag[i2]; - - // x[i1] = x[i] + x[i2] - Real[i] += point2_real; - Imag[i] += point2_imag; - - // x[i2] = x[i] - x[i2] - Real[i2] = point1_real - point2_real; - Imag[i2] = point1_imag - point2_imag; - } - for (i = 1; i < n; i += 4) - { - i2 = i+2; - point1_real = Real[i]; - point1_imag = Imag[i]; - - point2_real = Real[i2]; - point2_imag = Imag[i2]; - - // x[i] = x[i] + x[i2] - Real[i] += point2_real; - Imag[i] += point2_imag; - - // x[i2] = (x[i] - x[i2]) * (-i) - Real[i2] = point1_imag - point2_imag; - Imag[i2] = point2_real - point1_real; - } - - // Stage 5 of 32 point FFT decimation in frequency (no multiplications) - // 16*4=64 additions - for (i = 0; i < n; i += 2) - { - i2 = i+1; - point1_real = Real[i]; - point1_imag = Imag[i]; - - point2_real = Real[i2]; - point2_imag = Imag[i2]; - - // out[i1] = point1 + point2 - Real[i] += point2_real; - Imag[i] += point2_imag; - - // out[i2] = point1 - point2 - Real[i2] = point1_real - point2_real; - Imag[i2] = point1_imag - point2_imag; - } - -#ifdef REORDER_IN_FFT - FFTReorder(Real, Imag); -#endif // #ifdef REORDER_IN_FFT -} -#undef n -#undef log2n - -static const real_t dct4_64_tab[] = { - COEF_CONST(0.999924719333649), COEF_CONST(0.998118102550507), - COEF_CONST(0.993906974792480), COEF_CONST(0.987301409244537), - COEF_CONST(0.978317379951477), COEF_CONST(0.966976463794708), - COEF_CONST(0.953306019306183), COEF_CONST(0.937339007854462), - COEF_CONST(0.919113874435425), COEF_CONST(0.898674488067627), - COEF_CONST(0.876070082187653), COEF_CONST(0.851355195045471), - COEF_CONST(0.824589252471924), COEF_CONST(0.795836925506592), - COEF_CONST(0.765167236328125), COEF_CONST(0.732654273509979), - COEF_CONST(0.698376238346100), COEF_CONST(0.662415742874146), - COEF_CONST(0.624859452247620), COEF_CONST(0.585797846317291), - COEF_CONST(0.545324981212616), COEF_CONST(0.503538429737091), - COEF_CONST(0.460538715124130), COEF_CONST(0.416429549455643), - COEF_CONST(0.371317148208618), COEF_CONST(0.325310230255127), - COEF_CONST(0.278519600629807), COEF_CONST(0.231058135628700), - COEF_CONST(0.183039888739586), COEF_CONST(0.134580686688423), - COEF_CONST(0.085797272622585), COEF_CONST(0.036807164549828), - COEF_CONST(-1.012196302413940), COEF_CONST(-1.059438824653626), - COEF_CONST(-1.104129195213318), COEF_CONST(-1.146159529685974), - COEF_CONST(-1.185428738594055), COEF_CONST(-1.221842169761658), - COEF_CONST(-1.255311965942383), COEF_CONST(-1.285757660865784), - COEF_CONST(-1.313105940818787), COEF_CONST(-1.337290763854981), - COEF_CONST(-1.358253836631775), COEF_CONST(-1.375944852828980), - COEF_CONST(-1.390321016311646), COEF_CONST(-1.401347875595093), - COEF_CONST(-1.408998727798462), COEF_CONST(-1.413255214691162), - COEF_CONST(-1.414107084274292), COEF_CONST(-1.411552190780640), - COEF_CONST(-1.405596733093262), COEF_CONST(-1.396255016326904), - COEF_CONST(-1.383549690246582), COEF_CONST(-1.367511272430420), - COEF_CONST(-1.348178386688232), COEF_CONST(-1.325597524642944), - COEF_CONST(-1.299823284149170), COEF_CONST(-1.270917654037476), - COEF_CONST(-1.238950133323669), COEF_CONST(-1.203998088836670), - COEF_CONST(-1.166145324707031), COEF_CONST(-1.125483393669128), - COEF_CONST(-1.082109928131104), COEF_CONST(-1.036129593849182), - COEF_CONST(-0.987653195858002), COEF_CONST(-0.936797380447388), - COEF_CONST(-0.883684754371643), COEF_CONST(-0.828443288803101), - COEF_CONST(-0.771206021308899), COEF_CONST(-0.712110757827759), - COEF_CONST(-0.651300072669983), COEF_CONST(-0.588920354843140), - COEF_CONST(-0.525121808052063), COEF_CONST(-0.460058242082596), - COEF_CONST(-0.393886327743530), COEF_CONST(-0.326765477657318), - COEF_CONST(-0.258857429027557), COEF_CONST(-0.190325915813446), - COEF_CONST(-0.121335685253143), COEF_CONST(-0.052053272724152), - COEF_CONST(0.017354607582092), COEF_CONST(0.086720645427704), - COEF_CONST(0.155877828598022), COEF_CONST(0.224659323692322), - COEF_CONST(0.292899727821350), COEF_CONST(0.360434412956238), - COEF_CONST(0.427100926637650), COEF_CONST(0.492738455533981), - COEF_CONST(0.557188928127289), COEF_CONST(0.620297133922577), - COEF_CONST(0.681910991668701), COEF_CONST(0.741881847381592), - COEF_CONST(0.800065577030182), COEF_CONST(0.856321990489960), - COEF_CONST(0.910515367984772), COEF_CONST(0.962515234947205), - COEF_CONST(1.000000000000000), COEF_CONST(0.998795449733734), - COEF_CONST(0.995184719562531), COEF_CONST(0.989176511764526), - COEF_CONST(0.980785250663757), COEF_CONST(0.970031261444092), - COEF_CONST(0.956940352916718), COEF_CONST(0.941544055938721), - COEF_CONST(0.923879504203796), COEF_CONST(0.903989315032959), - COEF_CONST(0.881921231746674), COEF_CONST(0.857728600502014), - COEF_CONST(0.831469595432281), COEF_CONST(0.803207516670227), - COEF_CONST(0.773010432720184), COEF_CONST(0.740951120853424), - COEF_CONST(0.707106769084930), COEF_CONST(0.671558916568756), - COEF_CONST(0.634393274784088), COEF_CONST(0.595699310302734), - COEF_CONST(0.555570185184479), COEF_CONST(0.514102697372437), - COEF_CONST(0.471396654844284), COEF_CONST(0.427555114030838), - COEF_CONST(0.382683426141739), COEF_CONST(0.336889833211899), - COEF_CONST(0.290284633636475), COEF_CONST(0.242980122566223), - COEF_CONST(0.195090234279633), COEF_CONST(0.146730497479439), - COEF_CONST(0.098017133772373), COEF_CONST(0.049067649990320), - COEF_CONST(-1.000000000000000), COEF_CONST(-1.047863125801086), - COEF_CONST(-1.093201875686646), COEF_CONST(-1.135906934738159), - COEF_CONST(-1.175875544548035), COEF_CONST(-1.213011503219605), - COEF_CONST(-1.247225046157837), COEF_CONST(-1.278433918952942), - COEF_CONST(-1.306562900543213), COEF_CONST(-1.331544399261475), - COEF_CONST(-1.353317975997925), COEF_CONST(-1.371831417083740), - COEF_CONST(-1.387039899826050), COEF_CONST(-1.398906826972961), - COEF_CONST(-1.407403707504273), COEF_CONST(-1.412510156631470), - COEF_CONST(0), COEF_CONST(-1.412510156631470), - COEF_CONST(-1.407403707504273), COEF_CONST(-1.398906826972961), - COEF_CONST(-1.387039899826050), COEF_CONST(-1.371831417083740), - COEF_CONST(-1.353317975997925), COEF_CONST(-1.331544399261475), - COEF_CONST(-1.306562900543213), COEF_CONST(-1.278433918952942), - COEF_CONST(-1.247225046157837), COEF_CONST(-1.213011384010315), - COEF_CONST(-1.175875544548035), COEF_CONST(-1.135907053947449), - COEF_CONST(-1.093201875686646), COEF_CONST(-1.047863125801086), - COEF_CONST(-1.000000000000000), COEF_CONST(-0.949727773666382), - COEF_CONST(-0.897167563438416), COEF_CONST(-0.842446029186249), - COEF_CONST(-0.785694956779480), COEF_CONST(-0.727051079273224), - COEF_CONST(-0.666655659675598), COEF_CONST(-0.604654192924500), - COEF_CONST(-0.541196048259735), COEF_CONST(-0.476434230804443), - COEF_CONST(-0.410524487495422), COEF_CONST(-0.343625843524933), - COEF_CONST(-0.275899350643158), COEF_CONST(-0.207508206367493), - COEF_CONST(-0.138617098331451), COEF_CONST(-0.069392144680023), - COEF_CONST(0), COEF_CONST(0.069392263889313), - COEF_CONST(0.138617157936096), COEF_CONST(0.207508206367493), - COEF_CONST(0.275899469852448), COEF_CONST(0.343625962734222), - COEF_CONST(0.410524636507034), COEF_CONST(0.476434201002121), - COEF_CONST(0.541196107864380), COEF_CONST(0.604654192924500), - COEF_CONST(0.666655719280243), COEF_CONST(0.727051138877869), - COEF_CONST(0.785695075988770), COEF_CONST(0.842446029186249), - COEF_CONST(0.897167563438416), COEF_CONST(0.949727773666382) -}; - -/* size 64 only! */ -void dct4_kernel(real_t * in_real, real_t * in_imag, real_t * out_real, real_t * out_imag) -{ - // Tables with bit reverse values for 5 bits, bit reverse of i at i-th position - const uint8_t bit_rev_tab[32] = { 0,16,8,24,4,20,12,28,2,18,10,26,6,22,14,30,1,17,9,25,5,21,13,29,3,19,11,27,7,23,15,31 }; - uint16_t i, i_rev; - - /* Step 2: modulate */ - // 3*32=96 multiplications - // 3*32=96 additions - for (i = 0; i < 32; i++) - { - real_t x_re, x_im, tmp; - x_re = in_real[i]; - x_im = in_imag[i]; - tmp = MUL_C(x_re + x_im, dct4_64_tab[i]); - in_real[i] = MUL_C(x_im, dct4_64_tab[i + 64]) + tmp; - in_imag[i] = MUL_C(x_re, dct4_64_tab[i + 32]) + tmp; - } - - /* Step 3: FFT, but with output in bit reverse order */ - fft_dif(in_real, in_imag); - - /* Step 4: modulate + bitreverse reordering */ - // 3*31+2=95 multiplications - // 3*31+2=95 additions - for (i = 0; i < 16; i++) - { - real_t x_re, x_im, tmp; - i_rev = bit_rev_tab[i]; - x_re = in_real[i_rev]; - x_im = in_imag[i_rev]; - - tmp = MUL_C(x_re + x_im, dct4_64_tab[i + 3*32]); - out_real[i] = MUL_C(x_im, dct4_64_tab[i + 5*32]) + tmp; - out_imag[i] = MUL_C(x_re, dct4_64_tab[i + 4*32]) + tmp; - } - // i = 16, i_rev = 1 = rev(16); - out_imag[16] = MUL_C(in_imag[1] - in_real[1], dct4_64_tab[16 + 3*32]); - out_real[16] = MUL_C(in_real[1] + in_imag[1], dct4_64_tab[16 + 3*32]); - for (i = 17; i < 32; i++) - { - real_t x_re, x_im, tmp; - i_rev = bit_rev_tab[i]; - x_re = in_real[i_rev]; - x_im = in_imag[i_rev]; - tmp = MUL_C(x_re + x_im, dct4_64_tab[i + 3*32]); - out_real[i] = MUL_C(x_im, dct4_64_tab[i + 5*32]) + tmp; - out_imag[i] = MUL_C(x_re, dct4_64_tab[i + 4*32]) + tmp; - } - -} - -void DST4_32(real_t *y, real_t *x) -{ - real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9; - real_t f10, f11, f12, f13, f14, f15, f16, f17, f18, f19; - real_t f20, f21, f22, f23, f24, f25, f26, f27, f28, f29; - real_t f30, f31, f32, f33, f34, f35, f36, f37, f38, f39; - real_t f40, f41, f42, f43, f44, f45, f46, f47, f48, f49; - real_t f50, f51, f52, f53, f54, f55, f56, f57, f58, f59; - real_t f60, f61, f62, f63, f64, f65, f66, f67, f68, f69; - real_t f70, f71, f72, f73, f74, f75, f76, f77, f78, f79; - real_t f80, f81, f82, f83, f84, f85, f86, f87, f88, f89; - real_t f90, f91, f92, f93, f94, f95, f96, f97, f98, f99; - real_t f100, f101, f102, f103, f104, f105, f106, f107, f108, f109; - real_t f110, f111, f112, f113, f114, f115, f116, f117, f118, f119; - real_t f120, f121, f122, f123, f124, f125, f126, f127, f128, f129; - real_t f130, f131, f132, f133, f134, f135, f136, f137, f138, f139; - real_t f140, f141, f142, f143, f144, f145, f146, f147, f148, f149; - real_t f150, f151, f152, f153, f154, f155, f156, f157, f158, f159; - real_t f160, f161, f162, f163, f164, f165, f166, f167, f168, f169; - real_t f170, f171, f172, f173, f174, f175, f176, f177, f178, f179; - real_t f180, f181, f182, f183, f184, f185, f186, f187, f188, f189; - real_t f190, f191, f192, f193, f194, f195, f196, f197, f198, f199; - real_t f200, f201, f202, f203, f204, f205, f206, f207, f208, f209; - real_t f210, f211, f212, f213, f214, f215, f216, f217, f218, f219; - real_t f220, f221, f222, f223, f224, f225, f226, f227, f228, f229; - real_t f230, f231, f232, f233, f234, f235, f236, f237, f238, f239; - real_t f240, f241, f242, f243, f244, f245, f246, f247, f248, f249; - real_t f250, f251, f252, f253, f254, f255, f256, f257, f258, f259; - real_t f260, f261, f262, f263, f264, f265, f266, f267, f268, f269; - real_t f270, f271, f272, f273, f274, f275, f276, f277, f278, f279; - real_t f280, f281, f282, f283, f284, f285, f286, f287, f288, f289; - real_t f290, f291, f292, f293, f294, f295, f296, f297, f298, f299; - real_t f300, f301, f302, f303, f304, f305, f306, f307, f308, f309; - real_t f310, f311, f312, f313, f314, f315, f316, f317, f318, f319; - real_t f320, f321, f322, f323, f324, f325, f326, f327, f328, f329; - real_t f330, f331, f332, f333, f334, f335; - - f0 = x[0] - x[1]; - f1 = x[2] - x[1]; - f2 = x[2] - x[3]; - f3 = x[4] - x[3]; - f4 = x[4] - x[5]; - f5 = x[6] - x[5]; - f6 = x[6] - x[7]; - f7 = x[8] - x[7]; - f8 = x[8] - x[9]; - f9 = x[10] - x[9]; - f10 = x[10] - x[11]; - f11 = x[12] - x[11]; - f12 = x[12] - x[13]; - f13 = x[14] - x[13]; - f14 = x[14] - x[15]; - f15 = x[16] - x[15]; - f16 = x[16] - x[17]; - f17 = x[18] - x[17]; - f18 = x[18] - x[19]; - f19 = x[20] - x[19]; - f20 = x[20] - x[21]; - f21 = x[22] - x[21]; - f22 = x[22] - x[23]; - f23 = x[24] - x[23]; - f24 = x[24] - x[25]; - f25 = x[26] - x[25]; - f26 = x[26] - x[27]; - f27 = x[28] - x[27]; - f28 = x[28] - x[29]; - f29 = x[30] - x[29]; - f30 = x[30] - x[31]; - f31 = MUL_F(FRAC_CONST(0.7071067811865476), f15); - f32 = x[0] - f31; - f33 = x[0] + f31; - f34 = f7 + f23; - f35 = MUL_C(COEF_CONST(1.3065629648763766), f7); - f36 = MUL_F(FRAC_CONST(-0.9238795325112866), f34); - f37 = MUL_F(FRAC_CONST(-0.5411961001461967), f23); - f38 = f35 + f36; - f39 = f37 - f36; - f40 = f33 - f39; - f41 = f33 + f39; - f42 = f32 - f38; - f43 = f32 + f38; - f44 = f11 - f19; - f45 = f11 + f19; - f46 = MUL_F(FRAC_CONST(0.7071067811865476), f45); - f47 = f3 - f46; - f48 = f3 + f46; - f49 = MUL_F(FRAC_CONST(0.7071067811865476), f44); - f50 = f49 - f27; - f51 = f49 + f27; - f52 = f51 + f48; - f53 = MUL_F(FRAC_CONST(-0.7856949583871021), f51); - f54 = MUL_F(FRAC_CONST(0.9807852804032304), f52); - f55 = MUL_C(COEF_CONST(1.1758756024193588), f48); - f56 = f53 + f54; - f57 = f55 - f54; - f58 = f50 + f47; - f59 = MUL_F(FRAC_CONST(-0.2758993792829430), f50); - f60 = MUL_F(FRAC_CONST(0.8314696123025452), f58); - f61 = MUL_C(COEF_CONST(1.3870398453221475), f47); - f62 = f59 + f60; - f63 = f61 - f60; - f64 = f41 - f56; - f65 = f41 + f56; - f66 = f43 - f62; - f67 = f43 + f62; - f68 = f42 - f63; - f69 = f42 + f63; - f70 = f40 - f57; - f71 = f40 + f57; - f72 = f5 - f9; - f73 = f5 + f9; - f74 = f13 - f17; - f75 = f13 + f17; - f76 = f21 - f25; - f77 = f21 + f25; - f78 = MUL_F(FRAC_CONST(0.7071067811865476), f75); - f79 = f1 - f78; - f80 = f1 + f78; - f81 = f73 + f77; - f82 = MUL_C(COEF_CONST(1.3065629648763766), f73); - f83 = MUL_F(FRAC_CONST(-0.9238795325112866), f81); - f84 = MUL_F(FRAC_CONST(-0.5411961001461967), f77); - f85 = f82 + f83; - f86 = f84 - f83; - f87 = f80 - f86; - f88 = f80 + f86; - f89 = f79 - f85; - f90 = f79 + f85; - f91 = MUL_F(FRAC_CONST(0.7071067811865476), f74); - f92 = f29 - f91; - f93 = f29 + f91; - f94 = f76 + f72; - f95 = MUL_C(COEF_CONST(1.3065629648763766), f76); - f96 = MUL_F(FRAC_CONST(-0.9238795325112866), f94); - f97 = MUL_F(FRAC_CONST(-0.5411961001461967), f72); - f98 = f95 + f96; - f99 = f97 - f96; - f100 = f93 - f99; - f101 = f93 + f99; - f102 = f92 - f98; - f103 = f92 + f98; - f104 = f101 + f88; - f105 = MUL_F(FRAC_CONST(-0.8971675863426361), f101); - f106 = MUL_F(FRAC_CONST(0.9951847266721968), f104); - f107 = MUL_C(COEF_CONST(1.0932018670017576), f88); - f108 = f105 + f106; - f109 = f107 - f106; - f110 = f90 - f103; - f111 = MUL_F(FRAC_CONST(-0.6666556584777466), f103); - f112 = MUL_F(FRAC_CONST(0.9569403357322089), f110); - f113 = MUL_C(COEF_CONST(1.2472250129866713), f90); - f114 = f112 - f111; - f115 = f113 - f112; - f116 = f102 + f89; - f117 = MUL_F(FRAC_CONST(-0.4105245275223571), f102); - f118 = MUL_F(FRAC_CONST(0.8819212643483549), f116); - f119 = MUL_C(COEF_CONST(1.3533180011743529), f89); - f120 = f117 + f118; - f121 = f119 - f118; - f122 = f87 - f100; - f123 = MUL_F(FRAC_CONST(-0.1386171691990915), f100); - f124 = MUL_F(FRAC_CONST(0.7730104533627370), f122); - f125 = MUL_C(COEF_CONST(1.4074037375263826), f87); - f126 = f124 - f123; - f127 = f125 - f124; - f128 = f65 - f108; - f129 = f65 + f108; - f130 = f67 - f114; - f131 = f67 + f114; - f132 = f69 - f120; - f133 = f69 + f120; - f134 = f71 - f126; - f135 = f71 + f126; - f136 = f70 - f127; - f137 = f70 + f127; - f138 = f68 - f121; - f139 = f68 + f121; - f140 = f66 - f115; - f141 = f66 + f115; - f142 = f64 - f109; - f143 = f64 + f109; - f144 = f0 + f30; - f145 = MUL_C(COEF_CONST(1.0478631305325901), f0); - f146 = MUL_F(FRAC_CONST(-0.9987954562051724), f144); - f147 = MUL_F(FRAC_CONST(-0.9497277818777548), f30); - f148 = f145 + f146; - f149 = f147 - f146; - f150 = f4 + f26; - f151 = MUL_F(FRAC_CONST(1.2130114330978077), f4); - f152 = MUL_F(FRAC_CONST(-0.9700312531945440), f150); - f153 = MUL_F(FRAC_CONST(-0.7270510732912803), f26); - f154 = f151 + f152; - f155 = f153 - f152; - f156 = f8 + f22; - f157 = MUL_C(COEF_CONST(1.3315443865537255), f8); - f158 = MUL_F(FRAC_CONST(-0.9039892931234433), f156); - f159 = MUL_F(FRAC_CONST(-0.4764341996931612), f22); - f160 = f157 + f158; - f161 = f159 - f158; - f162 = f12 + f18; - f163 = MUL_C(COEF_CONST(1.3989068359730781), f12); - f164 = MUL_F(FRAC_CONST(-0.8032075314806453), f162); - f165 = MUL_F(FRAC_CONST(-0.2075082269882124), f18); - f166 = f163 + f164; - f167 = f165 - f164; - f168 = f16 + f14; - f169 = MUL_C(COEF_CONST(1.4125100802019777), f16); - f170 = MUL_F(FRAC_CONST(-0.6715589548470187), f168); - f171 = MUL_F(FRAC_CONST(0.0693921705079402), f14); - f172 = f169 + f170; - f173 = f171 - f170; - f174 = f20 + f10; - f175 = MUL_C(COEF_CONST(1.3718313541934939), f20); - f176 = MUL_F(FRAC_CONST(-0.5141027441932219), f174); - f177 = MUL_F(FRAC_CONST(0.3436258658070501), f10); - f178 = f175 + f176; - f179 = f177 - f176; - f180 = f24 + f6; - f181 = MUL_C(COEF_CONST(1.2784339185752409), f24); - f182 = MUL_F(FRAC_CONST(-0.3368898533922200), f180); - f183 = MUL_F(FRAC_CONST(0.6046542117908008), f6); - f184 = f181 + f182; - f185 = f183 - f182; - f186 = f28 + f2; - f187 = MUL_C(COEF_CONST(1.1359069844201433), f28); - f188 = MUL_F(FRAC_CONST(-0.1467304744553624), f186); - f189 = MUL_F(FRAC_CONST(0.8424460355094185), f2); - f190 = f187 + f188; - f191 = f189 - f188; - f192 = f149 - f173; - f193 = f149 + f173; - f194 = f148 - f172; - f195 = f148 + f172; - f196 = f155 - f179; - f197 = f155 + f179; - f198 = f154 - f178; - f199 = f154 + f178; - f200 = f161 - f185; - f201 = f161 + f185; - f202 = f160 - f184; - f203 = f160 + f184; - f204 = f167 - f191; - f205 = f167 + f191; - f206 = f166 - f190; - f207 = f166 + f190; - f208 = f192 + f194; - f209 = MUL_C(COEF_CONST(1.1758756024193588), f192); - f210 = MUL_F(FRAC_CONST(-0.9807852804032304), f208); - f211 = MUL_F(FRAC_CONST(-0.7856949583871021), f194); - f212 = f209 + f210; - f213 = f211 - f210; - f214 = f196 + f198; - f215 = MUL_C(COEF_CONST(1.3870398453221475), f196); - f216 = MUL_F(FRAC_CONST(-0.5555702330196022), f214); - f217 = MUL_F(FRAC_CONST(0.2758993792829431), f198); - f218 = f215 + f216; - f219 = f217 - f216; - f220 = f200 + f202; - f221 = MUL_F(FRAC_CONST(0.7856949583871022), f200); - f222 = MUL_F(FRAC_CONST(0.1950903220161283), f220); - f223 = MUL_C(COEF_CONST(1.1758756024193586), f202); - f224 = f221 + f222; - f225 = f223 - f222; - f226 = f204 + f206; - f227 = MUL_F(FRAC_CONST(-0.2758993792829430), f204); - f228 = MUL_F(FRAC_CONST(0.8314696123025452), f226); - f229 = MUL_C(COEF_CONST(1.3870398453221475), f206); - f230 = f227 + f228; - f231 = f229 - f228; - f232 = f193 - f201; - f233 = f193 + f201; - f234 = f195 - f203; - f235 = f195 + f203; - f236 = f197 - f205; - f237 = f197 + f205; - f238 = f199 - f207; - f239 = f199 + f207; - f240 = f213 - f225; - f241 = f213 + f225; - f242 = f212 - f224; - f243 = f212 + f224; - f244 = f219 - f231; - f245 = f219 + f231; - f246 = f218 - f230; - f247 = f218 + f230; - f248 = f232 + f234; - f249 = MUL_C(COEF_CONST(1.3065629648763766), f232); - f250 = MUL_F(FRAC_CONST(-0.9238795325112866), f248); - f251 = MUL_F(FRAC_CONST(-0.5411961001461967), f234); - f252 = f249 + f250; - f253 = f251 - f250; - f254 = f236 + f238; - f255 = MUL_F(FRAC_CONST(0.5411961001461969), f236); - f256 = MUL_F(FRAC_CONST(0.3826834323650898), f254); - f257 = MUL_C(COEF_CONST(1.3065629648763766), f238); - f258 = f255 + f256; - f259 = f257 - f256; - f260 = f240 + f242; - f261 = MUL_C(COEF_CONST(1.3065629648763766), f240); - f262 = MUL_F(FRAC_CONST(-0.9238795325112866), f260); - f263 = MUL_F(FRAC_CONST(-0.5411961001461967), f242); - f264 = f261 + f262; - f265 = f263 - f262; - f266 = f244 + f246; - f267 = MUL_F(FRAC_CONST(0.5411961001461969), f244); - f268 = MUL_F(FRAC_CONST(0.3826834323650898), f266); - f269 = MUL_C(COEF_CONST(1.3065629648763766), f246); - f270 = f267 + f268; - f271 = f269 - f268; - f272 = f233 - f237; - f273 = f233 + f237; - f274 = f235 - f239; - f275 = f235 + f239; - f276 = f253 - f259; - f277 = f253 + f259; - f278 = f252 - f258; - f279 = f252 + f258; - f280 = f241 - f245; - f281 = f241 + f245; - f282 = f243 - f247; - f283 = f243 + f247; - f284 = f265 - f271; - f285 = f265 + f271; - f286 = f264 - f270; - f287 = f264 + f270; - f288 = f272 - f274; - f289 = f272 + f274; - f290 = MUL_F(FRAC_CONST(0.7071067811865474), f288); - f291 = MUL_F(FRAC_CONST(0.7071067811865474), f289); - f292 = f276 - f278; - f293 = f276 + f278; - f294 = MUL_F(FRAC_CONST(0.7071067811865474), f292); - f295 = MUL_F(FRAC_CONST(0.7071067811865474), f293); - f296 = f280 - f282; - f297 = f280 + f282; - f298 = MUL_F(FRAC_CONST(0.7071067811865474), f296); - f299 = MUL_F(FRAC_CONST(0.7071067811865474), f297); - f300 = f284 - f286; - f301 = f284 + f286; - f302 = MUL_F(FRAC_CONST(0.7071067811865474), f300); - f303 = MUL_F(FRAC_CONST(0.7071067811865474), f301); - f304 = f129 - f273; - f305 = f129 + f273; - f306 = f131 - f281; - f307 = f131 + f281; - f308 = f133 - f285; - f309 = f133 + f285; - f310 = f135 - f277; - f311 = f135 + f277; - f312 = f137 - f295; - f313 = f137 + f295; - f314 = f139 - f303; - f315 = f139 + f303; - f316 = f141 - f299; - f317 = f141 + f299; - f318 = f143 - f291; - f319 = f143 + f291; - f320 = f142 - f290; - f321 = f142 + f290; - f322 = f140 - f298; - f323 = f140 + f298; - f324 = f138 - f302; - f325 = f138 + f302; - f326 = f136 - f294; - f327 = f136 + f294; - f328 = f134 - f279; - f329 = f134 + f279; - f330 = f132 - f287; - f331 = f132 + f287; - f332 = f130 - f283; - f333 = f130 + f283; - f334 = f128 - f275; - f335 = f128 + f275; - y[31] = MUL_F(FRAC_CONST(0.5001506360206510), f305); - y[30] = MUL_F(FRAC_CONST(0.5013584524464084), f307); - y[29] = MUL_F(FRAC_CONST(0.5037887256810443), f309); - y[28] = MUL_F(FRAC_CONST(0.5074711720725553), f311); - y[27] = MUL_F(FRAC_CONST(0.5124514794082247), f313); - y[26] = MUL_F(FRAC_CONST(0.5187927131053328), f315); - y[25] = MUL_F(FRAC_CONST(0.5265773151542700), f317); - y[24] = MUL_F(FRAC_CONST(0.5359098169079920), f319); - y[23] = MUL_F(FRAC_CONST(0.5469204379855088), f321); - y[22] = MUL_F(FRAC_CONST(0.5597698129470802), f323); - y[21] = MUL_F(FRAC_CONST(0.5746551840326600), f325); - y[20] = MUL_F(FRAC_CONST(0.5918185358574165), f327); - y[19] = MUL_F(FRAC_CONST(0.6115573478825099), f329); - y[18] = MUL_F(FRAC_CONST(0.6342389366884031), f331); - y[17] = MUL_F(FRAC_CONST(0.6603198078137061), f333); - y[16] = MUL_F(FRAC_CONST(0.6903721282002123), f335); - y[15] = MUL_F(FRAC_CONST(0.7251205223771985), f334); - y[14] = MUL_F(FRAC_CONST(0.7654941649730891), f332); - y[13] = MUL_F(FRAC_CONST(0.8127020908144905), f330); - y[12] = MUL_F(FRAC_CONST(0.8683447152233481), f328); - y[11] = MUL_F(FRAC_CONST(0.9345835970364075), f326); - y[10] = MUL_C(COEF_CONST(1.0144082649970547), f324); - y[9] = MUL_C(COEF_CONST(1.1120716205797176), f322); - y[8] = MUL_C(COEF_CONST(1.2338327379765710), f320); - y[7] = MUL_C(COEF_CONST(1.3892939586328277), f318); - y[6] = MUL_C(COEF_CONST(1.5939722833856311), f316); - y[5] = MUL_C(COEF_CONST(1.8746759800084078), f314); - y[4] = MUL_C(COEF_CONST(2.2820500680051619), f312); - y[3] = MUL_C(COEF_CONST(2.9246284281582162), f310); - y[2] = MUL_C(COEF_CONST(4.0846110781292477), f308); - y[1] = MUL_C(COEF_CONST(6.7967507116736332), f306); - y[0] = MUL_R(REAL_CONST(20.3738781672314530), f304); -} - -#endif - -#endif diff --git a/src/libfaad/sbr_dct.h b/src/libfaad/sbr_dct.h deleted file mode 100644 index 6293486c7..000000000 --- a/src/libfaad/sbr_dct.h +++ /dev/null @@ -1,49 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_dct.h,v 1.5 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __SBR_DCT_H__ -#define __SBR_DCT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -void dct4_kernel(real_t * in_real, real_t * in_imag, real_t * out_real, real_t * out_imag); - -void DCT3_32_unscaled(real_t *y, real_t *x); -void DCT4_32(real_t *y, real_t *x); -void DST4_32(real_t *y, real_t *x); -void DCT2_32_unscaled(real_t *y, real_t *x); -void DCT4_16(real_t *y, real_t *x); -void DCT2_16_unscaled(real_t *y, real_t *x); - - -#ifdef __cplusplus -} -#endif -#endif - diff --git a/src/libfaad/sbr_dec.c b/src/libfaad/sbr_dec.c deleted file mode 100644 index 24c1f5031..000000000 --- a/src/libfaad/sbr_dec.c +++ /dev/null @@ -1,614 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_dec.c,v 1.9 2006/06/17 20:43:57 dgp85 Exp $ -**/ - - -#include "common.h" -#include "structs.h" - -#ifdef SBR_DEC - -#include <string.h> -#include <stdlib.h> - -#include "syntax.h" -#include "bits.h" -#include "sbr_syntax.h" -#include "sbr_qmf.h" -#include "sbr_hfgen.h" -#include "sbr_hfadj.h" - - -/* static function declarations */ -static uint8_t sbr_save_prev_data(sbr_info *sbr, uint8_t ch); -static void sbr_save_matrix(sbr_info *sbr, uint8_t ch); - - -sbr_info *sbrDecodeInit(uint16_t framelength, uint8_t id_aac, - uint32_t sample_rate, uint8_t downSampledSBR -#ifdef DRM - , uint8_t IsDRM -#endif - ) -{ - sbr_info *sbr = faad_malloc(sizeof(sbr_info)); - memset(sbr, 0, sizeof(sbr_info)); - - /* save id of the parent element */ - sbr->id_aac = id_aac; - sbr->sample_rate = sample_rate; - - sbr->bs_freq_scale = 2; - sbr->bs_alter_scale = 1; - sbr->bs_noise_bands = 2; - sbr->bs_limiter_bands = 2; - sbr->bs_limiter_gains = 2; - sbr->bs_interpol_freq = 1; - sbr->bs_smoothing_mode = 1; - sbr->bs_start_freq = 5; - sbr->bs_amp_res = 1; - sbr->bs_samplerate_mode = 1; - sbr->prevEnvIsShort[0] = -1; - sbr->prevEnvIsShort[1] = -1; - sbr->header_count = 0; - sbr->Reset = 1; - -#ifdef DRM - sbr->Is_DRM_SBR = IsDRM; -#endif - sbr->tHFGen = T_HFGEN; - sbr->tHFAdj = T_HFADJ; - - sbr->bsco = 0; - sbr->bsco_prev = 0; - sbr->M_prev = 0; - sbr->frame_len = framelength; - - /* force sbr reset */ - sbr->bs_start_freq_prev = -1; - - if (framelength == 960) - { - sbr->numTimeSlotsRate = RATE * NO_TIME_SLOTS_960; - sbr->numTimeSlots = NO_TIME_SLOTS_960; - } else { - sbr->numTimeSlotsRate = RATE * NO_TIME_SLOTS; - sbr->numTimeSlots = NO_TIME_SLOTS; - } - - sbr->GQ_ringbuf_index[0] = 0; - sbr->GQ_ringbuf_index[1] = 0; - - if (id_aac == ID_CPE) - { - /* stereo */ - uint8_t j; - sbr->qmfa[0] = qmfa_init(32); - sbr->qmfa[1] = qmfa_init(32); - sbr->qmfs[0] = qmfs_init((downSampledSBR)?32:64); - sbr->qmfs[1] = qmfs_init((downSampledSBR)?32:64); - - for (j = 0; j < 5; j++) - { - sbr->G_temp_prev[0][j] = faad_malloc(64*sizeof(real_t)); - sbr->G_temp_prev[1][j] = faad_malloc(64*sizeof(real_t)); - sbr->Q_temp_prev[0][j] = faad_malloc(64*sizeof(real_t)); - sbr->Q_temp_prev[1][j] = faad_malloc(64*sizeof(real_t)); - } - - memset(sbr->Xsbr[0], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t)); - memset(sbr->Xsbr[1], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t)); - } else { - /* mono */ - uint8_t j; - sbr->qmfa[0] = qmfa_init(32); - sbr->qmfs[0] = qmfs_init((downSampledSBR)?32:64); - sbr->qmfs[1] = NULL; - - for (j = 0; j < 5; j++) - { - sbr->G_temp_prev[0][j] = faad_malloc(64*sizeof(real_t)); - sbr->Q_temp_prev[0][j] = faad_malloc(64*sizeof(real_t)); - } - - memset(sbr->Xsbr[0], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t)); - } - - return sbr; -} - -void sbrDecodeEnd(sbr_info *sbr) -{ - uint8_t j; - - if (sbr) - { - qmfa_end(sbr->qmfa[0]); - qmfs_end(sbr->qmfs[0]); - if (sbr->qmfs[1] != NULL) - { - qmfa_end(sbr->qmfa[1]); - qmfs_end(sbr->qmfs[1]); - } - - for (j = 0; j < 5; j++) - { - if (sbr->G_temp_prev[0][j]) faad_free(sbr->G_temp_prev[0][j]); - if (sbr->Q_temp_prev[0][j]) faad_free(sbr->Q_temp_prev[0][j]); - if (sbr->G_temp_prev[1][j]) faad_free(sbr->G_temp_prev[1][j]); - if (sbr->Q_temp_prev[1][j]) faad_free(sbr->Q_temp_prev[1][j]); - } - -#ifdef PS_DEC - if (sbr->ps != NULL) - ps_free(sbr->ps); -#endif - -#ifdef DRM_PS - if (sbr->drm_ps != NULL) - drm_ps_free(sbr->drm_ps); -#endif - - faad_free(sbr); - } -} - -static uint8_t sbr_save_prev_data(sbr_info *sbr, uint8_t ch) -{ - uint8_t i; - - /* save data for next frame */ - sbr->kx_prev = sbr->kx; - sbr->M_prev = sbr->M; - sbr->bsco_prev = sbr->bsco; - - sbr->L_E_prev[ch] = sbr->L_E[ch]; - - /* sbr->L_E[ch] can become 0 on files with bit errors */ - if (sbr->L_E[ch] <= 0) - return 19; - - sbr->f_prev[ch] = sbr->f[ch][sbr->L_E[ch] - 1]; - for (i = 0; i < MAX_M; i++) - { - sbr->E_prev[ch][i] = sbr->E[ch][i][sbr->L_E[ch] - 1]; - sbr->Q_prev[ch][i] = sbr->Q[ch][i][sbr->L_Q[ch] - 1]; - } - - for (i = 0; i < MAX_M; i++) - { - sbr->bs_add_harmonic_prev[ch][i] = sbr->bs_add_harmonic[ch][i]; - } - sbr->bs_add_harmonic_flag_prev[ch] = sbr->bs_add_harmonic_flag[ch]; - - if (sbr->l_A[ch] == sbr->L_E[ch]) - sbr->prevEnvIsShort[ch] = 0; - else - sbr->prevEnvIsShort[ch] = -1; - - return 0; -} - -static void sbr_save_matrix(sbr_info *sbr, uint8_t ch) -{ - uint8_t i; - - for (i = 0; i < sbr->tHFGen; i++) - { - memmove(sbr->Xsbr[ch][i], sbr->Xsbr[ch][i+sbr->numTimeSlotsRate], 64 * sizeof(qmf_t)); - } - for (i = sbr->tHFGen; i < MAX_NTSRHFG; i++) - { - memset(sbr->Xsbr[ch][i], 0, 64 * sizeof(qmf_t)); - } -} - -static void sbr_process_channel(sbr_info *sbr, real_t *channel_buf, qmf_t X[MAX_NTSR][64], - uint8_t ch, uint8_t dont_process, - const uint8_t downSampledSBR) -{ - int16_t k, l; - -#ifdef SBR_LOW_POWER - ALIGN real_t deg[64]; -#endif - -#ifdef DRM - if (sbr->Is_DRM_SBR) - { - sbr->bsco = max((int32_t)sbr->maxAACLine*32/(int32_t)sbr->frame_len - (int32_t)sbr->kx, 0); - } else { -#endif - sbr->bsco = 0; -#ifdef DRM - } -#endif - - -//#define PRE_QMF_PRINT -#ifdef PRE_QMF_PRINT - { - int i; - for (i = 0; i < 1024; i++) - { - printf("%d\n", channel_buf[i]); - } - } -#endif - - - /* subband analysis */ - if (dont_process) - sbr_qmf_analysis_32(sbr, sbr->qmfa[ch], channel_buf, sbr->Xsbr[ch], sbr->tHFGen, 32); - else - sbr_qmf_analysis_32(sbr, sbr->qmfa[ch], channel_buf, sbr->Xsbr[ch], sbr->tHFGen, sbr->kx); - - if (!dont_process) - { -#if 1 - /* insert high frequencies here */ - /* hf generation using patching */ - hf_generation(sbr, sbr->Xsbr[ch], sbr->Xsbr[ch] -#ifdef SBR_LOW_POWER - ,deg -#endif - ,ch); -#endif - -#ifdef SBR_LOW_POWER - for (l = sbr->t_E[ch][0]; l < sbr->t_E[ch][sbr->L_E[ch]]; l++) - { - for (k = 0; k < sbr->kx; k++) - { - QMF_RE(sbr->Xsbr[ch][sbr->tHFAdj + l][k]) = 0; - } - } -#endif - -#if 1 - /* hf adjustment */ - hf_adjustment(sbr, sbr->Xsbr[ch] -#ifdef SBR_LOW_POWER - ,deg -#endif - ,ch); -#endif - } - - if ((sbr->just_seeked != 0) || dont_process) - { - for (l = 0; l < sbr->numTimeSlotsRate; l++) - { - for (k = 0; k < 32; k++) - { - QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); -#ifndef SBR_LOW_POWER - QMF_IM(X[l][k]) = QMF_IM(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); -#endif - } - for (k = 32; k < 64; k++) - { - QMF_RE(X[l][k]) = 0; -#ifndef SBR_LOW_POWER - QMF_IM(X[l][k]) = 0; -#endif - } - } - } else { - for (l = 0; l < sbr->numTimeSlotsRate; l++) - { - uint8_t kx_band, M_band, bsco_band; - - if (l < sbr->t_E[ch][0]) - { - kx_band = sbr->kx_prev; - M_band = sbr->M_prev; - bsco_band = sbr->bsco_prev; - } else { - kx_band = sbr->kx; - M_band = sbr->M; - bsco_band = sbr->bsco; - } - -#ifndef SBR_LOW_POWER - for (k = 0; k < kx_band + bsco_band; k++) - { - QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); - QMF_IM(X[l][k]) = QMF_IM(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); - } - for (k = kx_band + bsco_band; k < kx_band + M_band; k++) - { - QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); - QMF_IM(X[l][k]) = QMF_IM(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); - } - for (k = max(kx_band + bsco_band, kx_band + M_band); k < 64; k++) - { - QMF_RE(X[l][k]) = 0; - QMF_IM(X[l][k]) = 0; - } -#else - for (k = 0; k < kx_band + bsco_band; k++) - { - QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); - } - for (k = kx_band + bsco_band; k < min(kx_band + M_band, 63); k++) - { - QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); - } - for (k = max(kx_band + bsco_band, kx_band + M_band); k < 64; k++) - { - QMF_RE(X[l][k]) = 0; - } - QMF_RE(X[l][kx_band - 1 + bsco_band]) += - QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][kx_band - 1 + bsco_band]); -#endif - } - } -} - -uint8_t sbrDecodeCoupleFrame(sbr_info *sbr, real_t *left_chan, real_t *right_chan, - const uint8_t just_seeked, const uint8_t downSampledSBR) -{ - uint8_t dont_process = 0; - uint8_t ret = 0; - ALIGN qmf_t X[MAX_NTSR][64]; - - if (sbr == NULL) - return 20; - - /* case can occur due to bit errors */ - if (sbr->id_aac != ID_CPE) - return 21; - - if (sbr->ret || (sbr->header_count == 0)) - { - /* don't process just upsample */ - dont_process = 1; - - /* Re-activate reset for next frame */ - if (sbr->ret && sbr->Reset) - sbr->bs_start_freq_prev = -1; - } - - if (just_seeked) - { - sbr->just_seeked = 1; - } else { - sbr->just_seeked = 0; - } - - sbr_process_channel(sbr, left_chan, X, 0, dont_process, downSampledSBR); - /* subband synthesis */ - if (downSampledSBR) - { - sbr_qmf_synthesis_32(sbr, sbr->qmfs[0], X, left_chan); - } else { - sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X, left_chan); - } - - sbr_process_channel(sbr, right_chan, X, 1, dont_process, downSampledSBR); - /* subband synthesis */ - if (downSampledSBR) - { - sbr_qmf_synthesis_32(sbr, sbr->qmfs[1], X, right_chan); - } else { - sbr_qmf_synthesis_64(sbr, sbr->qmfs[1], X, right_chan); - } - - if (sbr->bs_header_flag) - sbr->just_seeked = 0; - - if (sbr->header_count != 0 && sbr->ret == 0) - { - ret = sbr_save_prev_data(sbr, 0); - if (ret) return ret; - ret = sbr_save_prev_data(sbr, 1); - if (ret) return ret; - } - - sbr_save_matrix(sbr, 0); - sbr_save_matrix(sbr, 1); - - sbr->frame++; - -//#define POST_QMF_PRINT -#ifdef POST_QMF_PRINT - { - int i; - for (i = 0; i < 2048; i++) - { - printf("%d\n", left_chan[i]); - } - for (i = 0; i < 2048; i++) - { - printf("%d\n", right_chan[i]); - } - } -#endif - - return 0; -} - -uint8_t sbrDecodeSingleFrame(sbr_info *sbr, real_t *channel, - const uint8_t just_seeked, const uint8_t downSampledSBR) -{ - uint8_t dont_process = 0; - uint8_t ret = 0; - ALIGN qmf_t X[MAX_NTSR][64]; - - if (sbr == NULL) - return 20; - - /* case can occur due to bit errors */ - if (sbr->id_aac != ID_SCE && sbr->id_aac != ID_LFE) - return 21; - - if (sbr->ret || (sbr->header_count == 0)) - { - /* don't process just upsample */ - dont_process = 1; - - /* Re-activate reset for next frame */ - if (sbr->ret && sbr->Reset) - sbr->bs_start_freq_prev = -1; - } - - if (just_seeked) - { - sbr->just_seeked = 1; - } else { - sbr->just_seeked = 0; - } - - sbr_process_channel(sbr, channel, X, 0, dont_process, downSampledSBR); - /* subband synthesis */ - if (downSampledSBR) - { - sbr_qmf_synthesis_32(sbr, sbr->qmfs[0], X, channel); - } else { - sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X, channel); - } - - if (sbr->bs_header_flag) - sbr->just_seeked = 0; - - if (sbr->header_count != 0 && sbr->ret == 0) - { - ret = sbr_save_prev_data(sbr, 0); - if (ret) return ret; - } - - sbr_save_matrix(sbr, 0); - - sbr->frame++; - -//#define POST_QMF_PRINT -#ifdef POST_QMF_PRINT - { - int i; - for (i = 0; i < 2048; i++) - { - printf("%d\n", channel[i]); - } - } -#endif - - return 0; -} - -#if (defined(PS_DEC) || defined(DRM_PS)) -uint8_t sbrDecodeSingleFramePS(sbr_info *sbr, real_t *left_channel, real_t *right_channel, - const uint8_t just_seeked, const uint8_t downSampledSBR) -{ - uint8_t l, k; - uint8_t dont_process = 0; - uint8_t ret = 0; - ALIGN qmf_t X_left[38][64] = {{{0}}}; - ALIGN qmf_t X_right[38][64] = {{{0}}}; /* must set this to 0 */ - - if (sbr == NULL) - return 20; - - /* case can occur due to bit errors */ - if (sbr->id_aac != ID_SCE && sbr->id_aac != ID_LFE) - return 21; - - if (sbr->ret || (sbr->header_count == 0)) - { - /* don't process just upsample */ - dont_process = 1; - - /* Re-activate reset for next frame */ - if (sbr->ret && sbr->Reset) - sbr->bs_start_freq_prev = -1; - } - - if (just_seeked) - { - sbr->just_seeked = 1; - } else { - sbr->just_seeked = 0; - } - - if (sbr->qmfs[1] == NULL) - { - sbr->qmfs[1] = qmfs_init((downSampledSBR)?32:64); - } - - sbr_process_channel(sbr, left_channel, X_left, 0, dont_process, downSampledSBR); - - /* copy some extra data for PS */ - for (l = 32; l < 38; l++) - { - for (k = 0; k < 5; k++) - { - QMF_RE(X_left[l][k]) = QMF_RE(sbr->Xsbr[0][sbr->tHFAdj+l][k]); - QMF_IM(X_left[l][k]) = QMF_IM(sbr->Xsbr[0][sbr->tHFAdj+l][k]); - } - } - - /* perform parametric stereo */ -#ifdef DRM_PS - if (sbr->Is_DRM_SBR) - { - drm_ps_decode(sbr->drm_ps, (sbr->ret > 0), sbr->sample_rate, X_left, X_right); - } else { -#endif -#ifdef PS_DEC - ps_decode(sbr->ps, X_left, X_right); -#endif -#ifdef DRM_PS - } -#endif - - /* subband synthesis */ - if (downSampledSBR) - { - sbr_qmf_synthesis_32(sbr, sbr->qmfs[0], X_left, left_channel); - sbr_qmf_synthesis_32(sbr, sbr->qmfs[1], X_right, right_channel); - } else { - sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X_left, left_channel); - sbr_qmf_synthesis_64(sbr, sbr->qmfs[1], X_right, right_channel); - } - - if (sbr->bs_header_flag) - sbr->just_seeked = 0; - - if (sbr->header_count != 0 && sbr->ret == 0) - { - ret = sbr_save_prev_data(sbr, 0); - if (ret) return ret; - } - - sbr_save_matrix(sbr, 0); - - sbr->frame++; - - return 0; -} -#endif - -#endif diff --git a/src/libfaad/sbr_dec.h b/src/libfaad/sbr_dec.h deleted file mode 100644 index 5efd5c5e0..000000000 --- a/src/libfaad/sbr_dec.h +++ /dev/null @@ -1,249 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_dec.h,v 1.7 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __SBR_DEC_H__ -#define __SBR_DEC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef PS_DEC -#include "ps_dec.h" -#endif -#ifdef DRM_PS -#include "drm_dec.h" -#endif - -/* MAX_NTSRHFG: maximum of number_time_slots * rate + HFGen. 16*2+8 */ -#define MAX_NTSRHFG 40 -#define MAX_NTSR 32 /* max number_time_slots * rate, ok for DRM and not DRM mode */ - -/* MAX_M: maximum value for M */ -#define MAX_M 49 -/* MAX_L_E: maximum value for L_E */ -#define MAX_L_E 5 - -typedef struct { - real_t *x; - int16_t x_index; - uint8_t channels; -} qmfa_info; - -typedef struct { - real_t *v; - int16_t v_index; - uint8_t channels; -} qmfs_info; - -typedef struct -{ - uint32_t sample_rate; - uint32_t maxAACLine; - - uint8_t rate; - uint8_t just_seeked; - uint8_t ret; - - uint8_t amp_res[2]; - - uint8_t k0; - uint8_t kx; - uint8_t M; - uint8_t N_master; - uint8_t N_high; - uint8_t N_low; - uint8_t N_Q; - uint8_t N_L[4]; - uint8_t n[2]; - - uint8_t f_master[64]; - uint8_t f_table_res[2][64]; - uint8_t f_table_noise[64]; - uint8_t f_table_lim[4][64]; -#ifdef SBR_LOW_POWER - uint8_t f_group[5][64]; - uint8_t N_G[5]; -#endif - - uint8_t table_map_k_to_g[64]; - - uint8_t abs_bord_lead[2]; - uint8_t abs_bord_trail[2]; - uint8_t n_rel_lead[2]; - uint8_t n_rel_trail[2]; - - uint8_t L_E[2]; - uint8_t L_E_prev[2]; - uint8_t L_Q[2]; - - uint8_t t_E[2][MAX_L_E+1]; - uint8_t t_Q[2][3]; - uint8_t f[2][MAX_L_E+1]; - uint8_t f_prev[2]; - - real_t *G_temp_prev[2][5]; - real_t *Q_temp_prev[2][5]; - int8_t GQ_ringbuf_index[2]; - - int16_t E[2][64][MAX_L_E]; - int16_t E_prev[2][64]; -#ifndef FIXED_POINT - real_t E_orig[2][64][MAX_L_E]; -#endif - real_t E_curr[2][64][MAX_L_E]; - int32_t Q[2][64][2]; -#ifndef FIXED_POINT - real_t Q_div[2][64][2]; - real_t Q_div2[2][64][2]; -#endif - int32_t Q_prev[2][64]; - - int8_t l_A[2]; - int8_t l_A_prev[2]; - - uint8_t bs_invf_mode[2][MAX_L_E]; - uint8_t bs_invf_mode_prev[2][MAX_L_E]; - real_t bwArray[2][64]; - real_t bwArray_prev[2][64]; - - uint8_t noPatches; - uint8_t patchNoSubbands[64]; - uint8_t patchStartSubband[64]; - - uint8_t bs_add_harmonic[2][64]; - uint8_t bs_add_harmonic_prev[2][64]; - - uint16_t index_noise_prev[2]; - uint8_t psi_is_prev[2]; - - uint8_t bs_start_freq_prev; - uint8_t bs_stop_freq_prev; - uint8_t bs_xover_band_prev; - uint8_t bs_freq_scale_prev; - uint8_t bs_alter_scale_prev; - uint8_t bs_noise_bands_prev; - - int8_t prevEnvIsShort[2]; - - int8_t kx_prev; - uint8_t bsco; - uint8_t bsco_prev; - uint8_t M_prev; - uint16_t frame_len; - - uint8_t Reset; - uint32_t frame; - uint32_t header_count; - - uint8_t id_aac; - qmfa_info *qmfa[2]; - qmfs_info *qmfs[2]; - - qmf_t Xsbr[2][MAX_NTSRHFG][64]; - -#ifdef DRM - uint8_t Is_DRM_SBR; -#ifdef DRM_PS - drm_ps_info *drm_ps; -#endif -#endif - - uint8_t numTimeSlotsRate; - uint8_t numTimeSlots; - uint8_t tHFGen; - uint8_t tHFAdj; - -#ifdef PS_DEC - ps_info *ps; -#endif -#if (defined(PS_DEC) || defined(DRM_PS)) - uint8_t ps_used; -#endif - - /* to get it compiling */ - /* we'll see during the coding of all the tools, whether - these are all used or not. - */ - uint8_t bs_header_flag; - uint8_t bs_crc_flag; - uint16_t bs_sbr_crc_bits; - uint8_t bs_protocol_version; - uint8_t bs_amp_res; - uint8_t bs_start_freq; - uint8_t bs_stop_freq; - uint8_t bs_xover_band; - uint8_t bs_freq_scale; - uint8_t bs_alter_scale; - uint8_t bs_noise_bands; - uint8_t bs_limiter_bands; - uint8_t bs_limiter_gains; - uint8_t bs_interpol_freq; - uint8_t bs_smoothing_mode; - uint8_t bs_samplerate_mode; - uint8_t bs_add_harmonic_flag[2]; - uint8_t bs_add_harmonic_flag_prev[2]; - uint8_t bs_extended_data; - uint8_t bs_extension_id; - uint8_t bs_extension_data; - uint8_t bs_coupling; - uint8_t bs_frame_class[2]; - uint8_t bs_rel_bord[2][9]; - uint8_t bs_rel_bord_0[2][9]; - uint8_t bs_rel_bord_1[2][9]; - uint8_t bs_pointer[2]; - uint8_t bs_abs_bord_0[2]; - uint8_t bs_abs_bord_1[2]; - uint8_t bs_num_rel_0[2]; - uint8_t bs_num_rel_1[2]; - uint8_t bs_df_env[2][9]; - uint8_t bs_df_noise[2][3]; -} sbr_info; - -sbr_info *sbrDecodeInit(uint16_t framelength, uint8_t id_aac, - uint32_t sample_rate, uint8_t downSampledSBR -#ifdef DRM - , uint8_t IsDRM -#endif - ); -void sbrDecodeEnd(sbr_info *sbr); - -uint8_t sbrDecodeCoupleFrame(sbr_info *sbr, real_t *left_chan, real_t *right_chan, - const uint8_t just_seeked, const uint8_t downSampledSBR); -uint8_t sbrDecodeSingleFrame(sbr_info *sbr, real_t *channel, - const uint8_t just_seeked, const uint8_t downSampledSBR); -#if (defined(PS_DEC) || defined(DRM_PS)) -uint8_t sbrDecodeSingleFramePS(sbr_info *sbr, real_t *left_channel, real_t *right_channel, - const uint8_t just_seeked, const uint8_t downSampledSBR); -#endif - - -#ifdef __cplusplus -} -#endif -#endif - diff --git a/src/libfaad/sbr_e_nf.c b/src/libfaad/sbr_e_nf.c deleted file mode 100644 index 2d2bf4f85..000000000 --- a/src/libfaad/sbr_e_nf.c +++ /dev/null @@ -1,507 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_e_nf.c,v 1.5 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#ifdef SBR_DEC - -#include <stdlib.h> - -#include "sbr_syntax.h" -#include "sbr_e_nf.h" - -void extract_envelope_data(sbr_info *sbr, uint8_t ch) -{ - uint8_t l, k; - - for (l = 0; l < sbr->L_E[ch]; l++) - { - if (sbr->bs_df_env[ch][l] == 0) - { - for (k = 1; k < sbr->n[sbr->f[ch][l]]; k++) - { - sbr->E[ch][k][l] = sbr->E[ch][k - 1][l] + sbr->E[ch][k][l]; - if (sbr->E[ch][k][l] < 0) - sbr->E[ch][k][l] = 0; - } - - } else { /* bs_df_env == 1 */ - - uint8_t g = (l == 0) ? sbr->f_prev[ch] : sbr->f[ch][l-1]; - int16_t E_prev; - - if (sbr->f[ch][l] == g) - { - for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) - { - if (l == 0) - E_prev = sbr->E_prev[ch][k]; - else - E_prev = sbr->E[ch][k][l - 1]; - - sbr->E[ch][k][l] = E_prev + sbr->E[ch][k][l]; - } - - } else if ((g == 1) && (sbr->f[ch][l] == 0)) { - uint8_t i; - - for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) - { - for (i = 0; i < sbr->N_high; i++) - { - if (sbr->f_table_res[HI_RES][i] == sbr->f_table_res[LO_RES][k]) - { - if (l == 0) - E_prev = sbr->E_prev[ch][i]; - else - E_prev = sbr->E[ch][i][l - 1]; - - sbr->E[ch][k][l] = E_prev + sbr->E[ch][k][l]; - } - } - } - - } else if ((g == 0) && (sbr->f[ch][l] == 1)) { - uint8_t i; - - for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) - { - for (i = 0; i < sbr->N_low; i++) - { - if ((sbr->f_table_res[LO_RES][i] <= sbr->f_table_res[HI_RES][k]) && - (sbr->f_table_res[HI_RES][k] < sbr->f_table_res[LO_RES][i + 1])) - { - if (l == 0) - E_prev = sbr->E_prev[ch][i]; - else - E_prev = sbr->E[ch][i][l - 1]; - - sbr->E[ch][k][l] = E_prev + sbr->E[ch][k][l]; - } - } - } - } - } - } -} - -void extract_noise_floor_data(sbr_info *sbr, uint8_t ch) -{ - uint8_t l, k; - - for (l = 0; l < sbr->L_Q[ch]; l++) - { - if (sbr->bs_df_noise[ch][l] == 0) - { - for (k = 1; k < sbr->N_Q; k++) - { - sbr->Q[ch][k][l] = sbr->Q[ch][k][l] + sbr->Q[ch][k-1][l]; - } - } else { - if (l == 0) - { - for (k = 0; k < sbr->N_Q; k++) - { - sbr->Q[ch][k][l] = sbr->Q_prev[ch][k] + sbr->Q[ch][k][0]; - } - } else { - for (k = 0; k < sbr->N_Q; k++) - { - sbr->Q[ch][k][l] = sbr->Q[ch][k][l - 1] + sbr->Q[ch][k][l]; - } - } - } - } -} - -#ifndef FIXED_POINT - -/* table for Q_div values when no coupling */ -static const real_t Q_div_tab[31] = { - FRAC_CONST(0.0153846), FRAC_CONST(0.030303), - FRAC_CONST(0.0588235), FRAC_CONST(0.111111), - FRAC_CONST(0.2), FRAC_CONST(0.333333), - FRAC_CONST(0.5), FRAC_CONST(0.666667), - FRAC_CONST(0.8), FRAC_CONST(0.888889), - FRAC_CONST(0.941176), FRAC_CONST(0.969697), - FRAC_CONST(0.984615), FRAC_CONST(0.992248), - FRAC_CONST(0.996109), FRAC_CONST(0.998051), - FRAC_CONST(0.999024), FRAC_CONST(0.999512), - FRAC_CONST(0.999756), FRAC_CONST(0.999878), - FRAC_CONST(0.999939), FRAC_CONST(0.999969), - FRAC_CONST(0.999985), FRAC_CONST(0.999992), - FRAC_CONST(0.999996), FRAC_CONST(0.999998), - FRAC_CONST(0.999999), FRAC_CONST(1), - FRAC_CONST(1), FRAC_CONST(1), - FRAC_CONST(1) -}; - -static const real_t Q_div_tab_left[31][13] = { - { FRAC_CONST(0.969704), FRAC_CONST(0.888985), FRAC_CONST(0.667532), FRAC_CONST(0.336788), FRAC_CONST(0.117241), FRAC_CONST(0.037594), FRAC_CONST(0.0153846), FRAC_CONST(0.00967118), FRAC_CONST(0.00823245), FRAC_CONST(0.00787211), FRAC_CONST(0.00778198), FRAC_CONST(0.00775945), FRAC_CONST(0.00775382) }, - { FRAC_CONST(0.984619), FRAC_CONST(0.94123), FRAC_CONST(0.800623), FRAC_CONST(0.503876), FRAC_CONST(0.209877), FRAC_CONST(0.0724638), FRAC_CONST(0.030303), FRAC_CONST(0.0191571), FRAC_CONST(0.0163305), FRAC_CONST(0.0156212), FRAC_CONST(0.0154438), FRAC_CONST(0.0153994), FRAC_CONST(0.0153883) }, - { FRAC_CONST(0.99225), FRAC_CONST(0.969726), FRAC_CONST(0.889273), FRAC_CONST(0.670103), FRAC_CONST(0.346939), FRAC_CONST(0.135135), FRAC_CONST(0.0588235), FRAC_CONST(0.037594), FRAC_CONST(0.0321361), FRAC_CONST(0.0307619), FRAC_CONST(0.0304178), FRAC_CONST(0.0303317), FRAC_CONST(0.0303102) }, - { FRAC_CONST(0.99611), FRAC_CONST(0.98463), FRAC_CONST(0.941392), FRAC_CONST(0.802469), FRAC_CONST(0.515152), FRAC_CONST(0.238095), FRAC_CONST(0.111111), FRAC_CONST(0.0724638), FRAC_CONST(0.0622711), FRAC_CONST(0.0596878), FRAC_CONST(0.0590397), FRAC_CONST(0.0588776), FRAC_CONST(0.058837) }, - { FRAC_CONST(0.998051), FRAC_CONST(0.992256), FRAC_CONST(0.969811), FRAC_CONST(0.890411), FRAC_CONST(0.68), FRAC_CONST(0.384615), FRAC_CONST(0.2), FRAC_CONST(0.135135), FRAC_CONST(0.117241), FRAC_CONST(0.112652), FRAC_CONST(0.111497), FRAC_CONST(0.111208), FRAC_CONST(0.111135) }, - { FRAC_CONST(0.999025), FRAC_CONST(0.996113), FRAC_CONST(0.984674), FRAC_CONST(0.942029), FRAC_CONST(0.809524), FRAC_CONST(0.555556), FRAC_CONST(0.333333), FRAC_CONST(0.238095), FRAC_CONST(0.209877), FRAC_CONST(0.202492), FRAC_CONST(0.200625), FRAC_CONST(0.200156), FRAC_CONST(0.200039) }, - { FRAC_CONST(0.999512), FRAC_CONST(0.998053), FRAC_CONST(0.992278), FRAC_CONST(0.970149), FRAC_CONST(0.894737), FRAC_CONST(0.714286), FRAC_CONST(0.5), FRAC_CONST(0.384615), FRAC_CONST(0.346939), FRAC_CONST(0.336788), FRAC_CONST(0.3342), FRAC_CONST(0.33355), FRAC_CONST(0.333388) }, - { FRAC_CONST(0.999756), FRAC_CONST(0.999025), FRAC_CONST(0.996124), FRAC_CONST(0.984848), FRAC_CONST(0.944444), FRAC_CONST(0.833333), FRAC_CONST(0.666667), FRAC_CONST(0.555556), FRAC_CONST(0.515152), FRAC_CONST(0.503876), FRAC_CONST(0.500975), FRAC_CONST(0.500244), FRAC_CONST(0.500061) }, - { FRAC_CONST(0.999878), FRAC_CONST(0.999512), FRAC_CONST(0.998058), FRAC_CONST(0.992366), FRAC_CONST(0.971429), FRAC_CONST(0.909091), FRAC_CONST(0.8), FRAC_CONST(0.714286), FRAC_CONST(0.68), FRAC_CONST(0.670103), FRAC_CONST(0.667532), FRAC_CONST(0.666884), FRAC_CONST(0.666721) }, - { FRAC_CONST(0.999939), FRAC_CONST(0.999756), FRAC_CONST(0.999028), FRAC_CONST(0.996169), FRAC_CONST(0.985507), FRAC_CONST(0.952381), FRAC_CONST(0.888889), FRAC_CONST(0.833333), FRAC_CONST(0.809524), FRAC_CONST(0.802469), FRAC_CONST(0.800623), FRAC_CONST(0.800156), FRAC_CONST(0.800039) }, - { FRAC_CONST(0.999969), FRAC_CONST(0.999878), FRAC_CONST(0.999514), FRAC_CONST(0.998081), FRAC_CONST(0.992701), FRAC_CONST(0.97561), FRAC_CONST(0.941176), FRAC_CONST(0.909091), FRAC_CONST(0.894737), FRAC_CONST(0.890411), FRAC_CONST(0.889273), FRAC_CONST(0.888985), FRAC_CONST(0.888913) }, - { FRAC_CONST(0.999985), FRAC_CONST(0.999939), FRAC_CONST(0.999757), FRAC_CONST(0.999039), FRAC_CONST(0.996337), FRAC_CONST(0.987654), FRAC_CONST(0.969697), FRAC_CONST(0.952381), FRAC_CONST(0.944444), FRAC_CONST(0.942029), FRAC_CONST(0.941392), FRAC_CONST(0.94123), FRAC_CONST(0.94119) }, - { FRAC_CONST(0.999992), FRAC_CONST(0.99997), FRAC_CONST(0.999878), FRAC_CONST(0.999519), FRAC_CONST(0.998165), FRAC_CONST(0.993789), FRAC_CONST(0.984615), FRAC_CONST(0.97561), FRAC_CONST(0.971429), FRAC_CONST(0.970149), FRAC_CONST(0.969811), FRAC_CONST(0.969726), FRAC_CONST(0.969704) }, - { FRAC_CONST(0.999996), FRAC_CONST(0.999985), FRAC_CONST(0.999939), FRAC_CONST(0.99976), FRAC_CONST(0.999082), FRAC_CONST(0.996885), FRAC_CONST(0.992248), FRAC_CONST(0.987654), FRAC_CONST(0.985507), FRAC_CONST(0.984848), FRAC_CONST(0.984674), FRAC_CONST(0.98463), FRAC_CONST(0.984619) }, - { FRAC_CONST(0.999998), FRAC_CONST(0.999992), FRAC_CONST(0.99997), FRAC_CONST(0.99988), FRAC_CONST(0.999541), FRAC_CONST(0.99844), FRAC_CONST(0.996109), FRAC_CONST(0.993789), FRAC_CONST(0.992701), FRAC_CONST(0.992366), FRAC_CONST(0.992278), FRAC_CONST(0.992256), FRAC_CONST(0.99225) }, - { FRAC_CONST(0.999999), FRAC_CONST(0.999996), FRAC_CONST(0.999985), FRAC_CONST(0.99994), FRAC_CONST(0.99977), FRAC_CONST(0.999219), FRAC_CONST(0.998051), FRAC_CONST(0.996885), FRAC_CONST(0.996337), FRAC_CONST(0.996169), FRAC_CONST(0.996124), FRAC_CONST(0.996113), FRAC_CONST(0.99611) }, - { FRAC_CONST(1), FRAC_CONST(0.999998), FRAC_CONST(0.999992), FRAC_CONST(0.99997), FRAC_CONST(0.999885), FRAC_CONST(0.99961), FRAC_CONST(0.999024), FRAC_CONST(0.99844), FRAC_CONST(0.998165), FRAC_CONST(0.998081), FRAC_CONST(0.998058), FRAC_CONST(0.998053), FRAC_CONST(0.998051) }, - { FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999996), FRAC_CONST(0.999985), FRAC_CONST(0.999943), FRAC_CONST(0.999805), FRAC_CONST(0.999512), FRAC_CONST(0.999219), FRAC_CONST(0.999082), FRAC_CONST(0.999039), FRAC_CONST(0.999028), FRAC_CONST(0.999025), FRAC_CONST(0.999025) }, - { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999998), FRAC_CONST(0.999992), FRAC_CONST(0.999971), FRAC_CONST(0.999902), FRAC_CONST(0.999756), FRAC_CONST(0.99961), FRAC_CONST(0.999541), FRAC_CONST(0.999519), FRAC_CONST(0.999514), FRAC_CONST(0.999512), FRAC_CONST(0.999512) }, - { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999996), FRAC_CONST(0.999986), FRAC_CONST(0.999951), FRAC_CONST(0.999878), FRAC_CONST(0.999805), FRAC_CONST(0.99977), FRAC_CONST(0.99976), FRAC_CONST(0.999757), FRAC_CONST(0.999756), FRAC_CONST(0.999756) }, - { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999998), FRAC_CONST(0.999993), FRAC_CONST(0.999976), FRAC_CONST(0.999939), FRAC_CONST(0.999902), FRAC_CONST(0.999885), FRAC_CONST(0.99988), FRAC_CONST(0.999878), FRAC_CONST(0.999878), FRAC_CONST(0.999878) }, - { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999996), FRAC_CONST(0.999988), FRAC_CONST(0.999969), FRAC_CONST(0.999951), FRAC_CONST(0.999943), FRAC_CONST(0.99994), FRAC_CONST(0.999939), FRAC_CONST(0.999939), FRAC_CONST(0.999939) }, - { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999998), FRAC_CONST(0.999994), FRAC_CONST(0.999985), FRAC_CONST(0.999976), FRAC_CONST(0.999971), FRAC_CONST(0.99997), FRAC_CONST(0.99997), FRAC_CONST(0.99997), FRAC_CONST(0.999969) }, - { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999997), FRAC_CONST(0.999992), FRAC_CONST(0.999988), FRAC_CONST(0.999986), FRAC_CONST(0.999985), FRAC_CONST(0.999985), FRAC_CONST(0.999985), FRAC_CONST(0.999985) }, - { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999998), FRAC_CONST(0.999996), FRAC_CONST(0.999994), FRAC_CONST(0.999993), FRAC_CONST(0.999992), FRAC_CONST(0.999992), FRAC_CONST(0.999992), FRAC_CONST(0.999992) }, - { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999998), FRAC_CONST(0.999997), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996) }, - { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998) }, - { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999) }, - { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, - { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, - { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) } -}; - -static const real_t Q_div_tab_right[31][13] = { - { FRAC_CONST(0.00775382), FRAC_CONST(0.00775945), FRAC_CONST(0.00778198), FRAC_CONST(0.00787211), FRAC_CONST(0.00823245), FRAC_CONST(0.00967118), FRAC_CONST(0.0153846), FRAC_CONST(0.037594), FRAC_CONST(0.117241), FRAC_CONST(0.336788), FRAC_CONST(0.667532), FRAC_CONST(0.888985), FRAC_CONST(0.969704) }, - { FRAC_CONST(0.0153883), FRAC_CONST(0.0153994), FRAC_CONST(0.0154438), FRAC_CONST(0.0156212), FRAC_CONST(0.0163305), FRAC_CONST(0.0191571), FRAC_CONST(0.030303), FRAC_CONST(0.0724638), FRAC_CONST(0.209877), FRAC_CONST(0.503876), FRAC_CONST(0.800623), FRAC_CONST(0.94123), FRAC_CONST(0.984619) }, - { FRAC_CONST(0.0303102), FRAC_CONST(0.0303317), FRAC_CONST(0.0304178), FRAC_CONST(0.0307619), FRAC_CONST(0.0321361), FRAC_CONST(0.037594), FRAC_CONST(0.0588235), FRAC_CONST(0.135135), FRAC_CONST(0.346939), FRAC_CONST(0.670103), FRAC_CONST(0.889273), FRAC_CONST(0.969726), FRAC_CONST(0.99225) }, - { FRAC_CONST(0.058837), FRAC_CONST(0.0588776), FRAC_CONST(0.0590397), FRAC_CONST(0.0596878), FRAC_CONST(0.0622711), FRAC_CONST(0.0724638), FRAC_CONST(0.111111), FRAC_CONST(0.238095), FRAC_CONST(0.515152), FRAC_CONST(0.802469), FRAC_CONST(0.941392), FRAC_CONST(0.98463), FRAC_CONST(0.99611) }, - { FRAC_CONST(0.111135), FRAC_CONST(0.111208), FRAC_CONST(0.111497), FRAC_CONST(0.112652), FRAC_CONST(0.117241), FRAC_CONST(0.135135), FRAC_CONST(0.2), FRAC_CONST(0.384615), FRAC_CONST(0.68), FRAC_CONST(0.890411), FRAC_CONST(0.969811), FRAC_CONST(0.992256), FRAC_CONST(0.998051) }, - { FRAC_CONST(0.200039), FRAC_CONST(0.200156), FRAC_CONST(0.200625), FRAC_CONST(0.202492), FRAC_CONST(0.209877), FRAC_CONST(0.238095), FRAC_CONST(0.333333), FRAC_CONST(0.555556), FRAC_CONST(0.809524), FRAC_CONST(0.942029), FRAC_CONST(0.984674), FRAC_CONST(0.996113), FRAC_CONST(0.999025) }, - { FRAC_CONST(0.333388), FRAC_CONST(0.33355), FRAC_CONST(0.3342), FRAC_CONST(0.336788), FRAC_CONST(0.346939), FRAC_CONST(0.384615), FRAC_CONST(0.5), FRAC_CONST(0.714286), FRAC_CONST(0.894737), FRAC_CONST(0.970149), FRAC_CONST(0.992278), FRAC_CONST(0.998053), FRAC_CONST(0.999512) }, - { FRAC_CONST(0.500061), FRAC_CONST(0.500244), FRAC_CONST(0.500975), FRAC_CONST(0.503876), FRAC_CONST(0.515152), FRAC_CONST(0.555556), FRAC_CONST(0.666667), FRAC_CONST(0.833333), FRAC_CONST(0.944444), FRAC_CONST(0.984848), FRAC_CONST(0.996124), FRAC_CONST(0.999025), FRAC_CONST(0.999756) }, - { FRAC_CONST(0.666721), FRAC_CONST(0.666884), FRAC_CONST(0.667532), FRAC_CONST(0.670103), FRAC_CONST(0.68), FRAC_CONST(0.714286), FRAC_CONST(0.8), FRAC_CONST(0.909091), FRAC_CONST(0.971429), FRAC_CONST(0.992366), FRAC_CONST(0.998058), FRAC_CONST(0.999512), FRAC_CONST(0.999878) }, - { FRAC_CONST(0.800039), FRAC_CONST(0.800156), FRAC_CONST(0.800623), FRAC_CONST(0.802469), FRAC_CONST(0.809524), FRAC_CONST(0.833333), FRAC_CONST(0.888889), FRAC_CONST(0.952381), FRAC_CONST(0.985507), FRAC_CONST(0.996169), FRAC_CONST(0.999028), FRAC_CONST(0.999756), FRAC_CONST(0.999939) }, - { FRAC_CONST(0.888913), FRAC_CONST(0.888985), FRAC_CONST(0.889273), FRAC_CONST(0.890411), FRAC_CONST(0.894737), FRAC_CONST(0.909091), FRAC_CONST(0.941176), FRAC_CONST(0.97561), FRAC_CONST(0.992701), FRAC_CONST(0.998081), FRAC_CONST(0.999514), FRAC_CONST(0.999878), FRAC_CONST(0.999969) }, - { FRAC_CONST(0.94119), FRAC_CONST(0.94123), FRAC_CONST(0.941392), FRAC_CONST(0.942029), FRAC_CONST(0.944444), FRAC_CONST(0.952381), FRAC_CONST(0.969697), FRAC_CONST(0.987654), FRAC_CONST(0.996337), FRAC_CONST(0.999039), FRAC_CONST(0.999757), FRAC_CONST(0.999939), FRAC_CONST(0.999985) }, - { FRAC_CONST(0.969704), FRAC_CONST(0.969726), FRAC_CONST(0.969811), FRAC_CONST(0.970149), FRAC_CONST(0.971429), FRAC_CONST(0.97561), FRAC_CONST(0.984615), FRAC_CONST(0.993789), FRAC_CONST(0.998165), FRAC_CONST(0.999519), FRAC_CONST(0.999878), FRAC_CONST(0.99997), FRAC_CONST(0.999992) }, - { FRAC_CONST(0.984619), FRAC_CONST(0.98463), FRAC_CONST(0.984674), FRAC_CONST(0.984848), FRAC_CONST(0.985507), FRAC_CONST(0.987654), FRAC_CONST(0.992248), FRAC_CONST(0.996885), FRAC_CONST(0.999082), FRAC_CONST(0.99976), FRAC_CONST(0.999939), FRAC_CONST(0.999985), FRAC_CONST(0.999996) }, - { FRAC_CONST(0.99225), FRAC_CONST(0.992256), FRAC_CONST(0.992278), FRAC_CONST(0.992366), FRAC_CONST(0.992701), FRAC_CONST(0.993789), FRAC_CONST(0.996109), FRAC_CONST(0.99844), FRAC_CONST(0.999541), FRAC_CONST(0.99988), FRAC_CONST(0.99997), FRAC_CONST(0.999992), FRAC_CONST(0.999998) }, - { FRAC_CONST(0.99611), FRAC_CONST(0.996113), FRAC_CONST(0.996124), FRAC_CONST(0.996169), FRAC_CONST(0.996337), FRAC_CONST(0.996885), FRAC_CONST(0.998051), FRAC_CONST(0.999219), FRAC_CONST(0.99977), FRAC_CONST(0.99994), FRAC_CONST(0.999985), FRAC_CONST(0.999996), FRAC_CONST(0.999999) }, - { FRAC_CONST(0.998051), FRAC_CONST(0.998053), FRAC_CONST(0.998058), FRAC_CONST(0.998081), FRAC_CONST(0.998165), FRAC_CONST(0.99844), FRAC_CONST(0.999024), FRAC_CONST(0.99961), FRAC_CONST(0.999885), FRAC_CONST(0.99997), FRAC_CONST(0.999992), FRAC_CONST(0.999998), FRAC_CONST(1) }, - { FRAC_CONST(0.999025), FRAC_CONST(0.999025), FRAC_CONST(0.999028), FRAC_CONST(0.999039), FRAC_CONST(0.999082), FRAC_CONST(0.999219), FRAC_CONST(0.999512), FRAC_CONST(0.999805), FRAC_CONST(0.999943), FRAC_CONST(0.999985), FRAC_CONST(0.999996), FRAC_CONST(0.999999), FRAC_CONST(1) }, - { FRAC_CONST(0.999512), FRAC_CONST(0.999512), FRAC_CONST(0.999514), FRAC_CONST(0.999519), FRAC_CONST(0.999541), FRAC_CONST(0.99961), FRAC_CONST(0.999756), FRAC_CONST(0.999902), FRAC_CONST(0.999971), FRAC_CONST(0.999992), FRAC_CONST(0.999998), FRAC_CONST(1), FRAC_CONST(1) }, - { FRAC_CONST(0.999756), FRAC_CONST(0.999756), FRAC_CONST(0.999757), FRAC_CONST(0.99976), FRAC_CONST(0.99977), FRAC_CONST(0.999805), FRAC_CONST(0.999878), FRAC_CONST(0.999951), FRAC_CONST(0.999986), FRAC_CONST(0.999996), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1) }, - { FRAC_CONST(0.999878), FRAC_CONST(0.999878), FRAC_CONST(0.999878), FRAC_CONST(0.99988), FRAC_CONST(0.999885), FRAC_CONST(0.999902), FRAC_CONST(0.999939), FRAC_CONST(0.999976), FRAC_CONST(0.999993), FRAC_CONST(0.999998), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, - { FRAC_CONST(0.999939), FRAC_CONST(0.999939), FRAC_CONST(0.999939), FRAC_CONST(0.99994), FRAC_CONST(0.999943), FRAC_CONST(0.999951), FRAC_CONST(0.999969), FRAC_CONST(0.999988), FRAC_CONST(0.999996), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, - { FRAC_CONST(0.999969), FRAC_CONST(0.99997), FRAC_CONST(0.99997), FRAC_CONST(0.99997), FRAC_CONST(0.999971), FRAC_CONST(0.999976), FRAC_CONST(0.999985), FRAC_CONST(0.999994), FRAC_CONST(0.999998), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, - { FRAC_CONST(0.999985), FRAC_CONST(0.999985), FRAC_CONST(0.999985), FRAC_CONST(0.999985), FRAC_CONST(0.999986), FRAC_CONST(0.999988), FRAC_CONST(0.999992), FRAC_CONST(0.999997), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, - { FRAC_CONST(0.999992), FRAC_CONST(0.999992), FRAC_CONST(0.999992), FRAC_CONST(0.999992), FRAC_CONST(0.999993), FRAC_CONST(0.999994), FRAC_CONST(0.999996), FRAC_CONST(0.999998), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, - { FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999997), FRAC_CONST(0.999998), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, - { FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, - { FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, - { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, - { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, - { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) } -}; - -/* calculates 1/(1+Q) */ -/* [0..1] */ -real_t calc_Q_div(sbr_info *sbr, uint8_t ch, uint8_t m, uint8_t l) -{ - if (sbr->bs_coupling) - { - /* left channel */ - if ((sbr->Q[0][m][l] < 0 || sbr->Q[0][m][l] > 30) || - (sbr->Q[1][m][l] < 0 || sbr->Q[1][m][l] > 24 /* 2*panOffset(1) */)) - { - return 0; - } else { - /* the pan parameter is always even */ - if (ch == 0) - { - return Q_div_tab_left[sbr->Q[0][m][l]][sbr->Q[1][m][l] >> 1]; - } else { - return Q_div_tab_right[sbr->Q[0][m][l]][sbr->Q[1][m][l] >> 1]; - } - } - } else { - /* no coupling */ - if (sbr->Q[ch][m][l] < 0 || sbr->Q[ch][m][l] > 30) - { - return 0; - } else { - return Q_div_tab[sbr->Q[ch][m][l]]; - } - } -} - -/* table for Q_div2 values when no coupling */ -static const real_t Q_div2_tab[31] = { - FRAC_CONST(0.984615), FRAC_CONST(0.969697), - FRAC_CONST(0.941176), FRAC_CONST(0.888889), - FRAC_CONST(0.8), FRAC_CONST(0.666667), - FRAC_CONST(0.5), FRAC_CONST(0.333333), - FRAC_CONST(0.2), FRAC_CONST(0.111111), - FRAC_CONST(0.0588235), FRAC_CONST(0.030303), - FRAC_CONST(0.0153846), FRAC_CONST(0.00775194), - FRAC_CONST(0.00389105), FRAC_CONST(0.00194932), - FRAC_CONST(0.00097561), FRAC_CONST(0.000488043), - FRAC_CONST(0.000244081), FRAC_CONST(0.000122055), - FRAC_CONST(6.10314E-005), FRAC_CONST(3.05166E-005), - FRAC_CONST(1.52586E-005), FRAC_CONST(7.62934E-006), - FRAC_CONST(3.81468E-006), FRAC_CONST(1.90734E-006), - FRAC_CONST(9.53673E-007), FRAC_CONST(4.76837E-007), - FRAC_CONST(2.38419E-007), FRAC_CONST(1.19209E-007), - FRAC_CONST(5.96046E-008) -}; - -static const real_t Q_div2_tab_left[31][13] = { - { FRAC_CONST(0.0302959), FRAC_CONST(0.111015), FRAC_CONST(0.332468), FRAC_CONST(0.663212), FRAC_CONST(0.882759), FRAC_CONST(0.962406), FRAC_CONST(0.984615), FRAC_CONST(0.990329), FRAC_CONST(0.991768), FRAC_CONST(0.992128), FRAC_CONST(0.992218), FRAC_CONST(0.992241), FRAC_CONST(0.992246) }, - { FRAC_CONST(0.0153809), FRAC_CONST(0.0587695), FRAC_CONST(0.199377), FRAC_CONST(0.496124), FRAC_CONST(0.790123), FRAC_CONST(0.927536), FRAC_CONST(0.969697), FRAC_CONST(0.980843), FRAC_CONST(0.98367), FRAC_CONST(0.984379), FRAC_CONST(0.984556), FRAC_CONST(0.984601), FRAC_CONST(0.984612) }, - { FRAC_CONST(0.00775006), FRAC_CONST(0.0302744), FRAC_CONST(0.110727), FRAC_CONST(0.329897), FRAC_CONST(0.653061), FRAC_CONST(0.864865), FRAC_CONST(0.941176), FRAC_CONST(0.962406), FRAC_CONST(0.967864), FRAC_CONST(0.969238), FRAC_CONST(0.969582), FRAC_CONST(0.969668), FRAC_CONST(0.96969) }, - { FRAC_CONST(0.0038901), FRAC_CONST(0.0153698), FRAC_CONST(0.0586081), FRAC_CONST(0.197531), FRAC_CONST(0.484848), FRAC_CONST(0.761905), FRAC_CONST(0.888889), FRAC_CONST(0.927536), FRAC_CONST(0.937729), FRAC_CONST(0.940312), FRAC_CONST(0.94096), FRAC_CONST(0.941122), FRAC_CONST(0.941163) }, - { FRAC_CONST(0.00194884), FRAC_CONST(0.00774443), FRAC_CONST(0.0301887), FRAC_CONST(0.109589), FRAC_CONST(0.32), FRAC_CONST(0.615385), FRAC_CONST(0.8), FRAC_CONST(0.864865), FRAC_CONST(0.882759), FRAC_CONST(0.887348), FRAC_CONST(0.888503), FRAC_CONST(0.888792), FRAC_CONST(0.888865) }, - { FRAC_CONST(0.000975372), FRAC_CONST(0.00388727), FRAC_CONST(0.0153257), FRAC_CONST(0.057971), FRAC_CONST(0.190476), FRAC_CONST(0.444444), FRAC_CONST(0.666667), FRAC_CONST(0.761905), FRAC_CONST(0.790123), FRAC_CONST(0.797508), FRAC_CONST(0.799375), FRAC_CONST(0.799844), FRAC_CONST(0.799961) }, - { FRAC_CONST(0.000487924), FRAC_CONST(0.00194742), FRAC_CONST(0.00772201), FRAC_CONST(0.0298507), FRAC_CONST(0.105263), FRAC_CONST(0.285714), FRAC_CONST(0.5), FRAC_CONST(0.615385), FRAC_CONST(0.653061), FRAC_CONST(0.663212), FRAC_CONST(0.6658), FRAC_CONST(0.66645), FRAC_CONST(0.666612) }, - { FRAC_CONST(0.000244021), FRAC_CONST(0.000974659), FRAC_CONST(0.00387597), FRAC_CONST(0.0151515), FRAC_CONST(0.0555556), FRAC_CONST(0.166667), FRAC_CONST(0.333333), FRAC_CONST(0.444444), FRAC_CONST(0.484848), FRAC_CONST(0.496124), FRAC_CONST(0.499025), FRAC_CONST(0.499756), FRAC_CONST(0.499939) }, - { FRAC_CONST(0.000122026), FRAC_CONST(0.000487567), FRAC_CONST(0.00194175), FRAC_CONST(0.00763359), FRAC_CONST(0.0285714), FRAC_CONST(0.0909091), FRAC_CONST(0.2), FRAC_CONST(0.285714), FRAC_CONST(0.32), FRAC_CONST(0.329897), FRAC_CONST(0.332468), FRAC_CONST(0.333116), FRAC_CONST(0.333279) }, - { FRAC_CONST(6.10165E-005), FRAC_CONST(0.000243843), FRAC_CONST(0.000971817), FRAC_CONST(0.00383142), FRAC_CONST(0.0144928), FRAC_CONST(0.047619), FRAC_CONST(0.111111), FRAC_CONST(0.166667), FRAC_CONST(0.190476), FRAC_CONST(0.197531), FRAC_CONST(0.199377), FRAC_CONST(0.199844), FRAC_CONST(0.199961) }, - { FRAC_CONST(3.05092E-005), FRAC_CONST(0.000121936), FRAC_CONST(0.000486145), FRAC_CONST(0.00191939), FRAC_CONST(0.00729927), FRAC_CONST(0.0243902), FRAC_CONST(0.0588235), FRAC_CONST(0.0909091), FRAC_CONST(0.105263), FRAC_CONST(0.109589), FRAC_CONST(0.110727), FRAC_CONST(0.111015), FRAC_CONST(0.111087) }, - { FRAC_CONST(1.52548E-005), FRAC_CONST(6.09719E-005), FRAC_CONST(0.000243132), FRAC_CONST(0.000960615), FRAC_CONST(0.003663), FRAC_CONST(0.0123457), FRAC_CONST(0.030303), FRAC_CONST(0.047619), FRAC_CONST(0.0555556), FRAC_CONST(0.057971), FRAC_CONST(0.0586081), FRAC_CONST(0.0587695), FRAC_CONST(0.05881) }, - { FRAC_CONST(7.62747E-006), FRAC_CONST(3.04869E-005), FRAC_CONST(0.000121581), FRAC_CONST(0.000480538), FRAC_CONST(0.00183486), FRAC_CONST(0.00621118), FRAC_CONST(0.0153846), FRAC_CONST(0.0243902), FRAC_CONST(0.0285714), FRAC_CONST(0.0298507), FRAC_CONST(0.0301887), FRAC_CONST(0.0302744), FRAC_CONST(0.0302959) }, - { FRAC_CONST(3.81375E-006), FRAC_CONST(1.52437E-005), FRAC_CONST(6.0794E-005), FRAC_CONST(0.000240327), FRAC_CONST(0.000918274), FRAC_CONST(0.00311526), FRAC_CONST(0.00775194), FRAC_CONST(0.0123457), FRAC_CONST(0.0144928), FRAC_CONST(0.0151515), FRAC_CONST(0.0153257), FRAC_CONST(0.0153698), FRAC_CONST(0.0153809) }, - { FRAC_CONST(1.90688E-006), FRAC_CONST(7.62189E-006), FRAC_CONST(3.03979E-005), FRAC_CONST(0.000120178), FRAC_CONST(0.000459348), FRAC_CONST(0.00156006), FRAC_CONST(0.00389105), FRAC_CONST(0.00621118), FRAC_CONST(0.00729927), FRAC_CONST(0.00763359), FRAC_CONST(0.00772201), FRAC_CONST(0.00774443), FRAC_CONST(0.00775006) }, - { FRAC_CONST(9.53441E-007), FRAC_CONST(3.81096E-006), FRAC_CONST(1.51992E-005), FRAC_CONST(6.00925E-005), FRAC_CONST(0.000229727), FRAC_CONST(0.00078064), FRAC_CONST(0.00194932), FRAC_CONST(0.00311526), FRAC_CONST(0.003663), FRAC_CONST(0.00383142), FRAC_CONST(0.00387597), FRAC_CONST(0.00388727), FRAC_CONST(0.0038901) }, - { FRAC_CONST(4.76721E-007), FRAC_CONST(1.90548E-006), FRAC_CONST(7.59965E-006), FRAC_CONST(3.00472E-005), FRAC_CONST(0.000114877), FRAC_CONST(0.000390472), FRAC_CONST(0.00097561), FRAC_CONST(0.00156006), FRAC_CONST(0.00183486), FRAC_CONST(0.00191939), FRAC_CONST(0.00194175), FRAC_CONST(0.00194742), FRAC_CONST(0.00194884) }, - { FRAC_CONST(2.3836E-007), FRAC_CONST(9.52743E-007), FRAC_CONST(3.79984E-006), FRAC_CONST(1.50238E-005), FRAC_CONST(5.74416E-005), FRAC_CONST(0.000195274), FRAC_CONST(0.000488043), FRAC_CONST(0.00078064), FRAC_CONST(0.000918274), FRAC_CONST(0.000960615), FRAC_CONST(0.000971817), FRAC_CONST(0.000974659), FRAC_CONST(0.000975372) }, - { FRAC_CONST(1.1918E-007), FRAC_CONST(4.76372E-007), FRAC_CONST(1.89992E-006), FRAC_CONST(7.51196E-006), FRAC_CONST(2.87216E-005), FRAC_CONST(9.76467E-005), FRAC_CONST(0.000244081), FRAC_CONST(0.000390472), FRAC_CONST(0.000459348), FRAC_CONST(0.000480538), FRAC_CONST(0.000486145), FRAC_CONST(0.000487567), FRAC_CONST(0.000487924) }, - { FRAC_CONST(5.95901E-008), FRAC_CONST(2.38186E-007), FRAC_CONST(9.49963E-007), FRAC_CONST(3.756E-006), FRAC_CONST(1.4361E-005), FRAC_CONST(4.88257E-005), FRAC_CONST(0.000122055), FRAC_CONST(0.000195274), FRAC_CONST(0.000229727), FRAC_CONST(0.000240327), FRAC_CONST(0.000243132), FRAC_CONST(0.000243843), FRAC_CONST(0.000244021) }, - { FRAC_CONST(2.9795E-008), FRAC_CONST(1.19093E-007), FRAC_CONST(4.74982E-007), FRAC_CONST(1.878E-006), FRAC_CONST(7.18056E-006), FRAC_CONST(2.44135E-005), FRAC_CONST(6.10314E-005), FRAC_CONST(9.76467E-005), FRAC_CONST(0.000114877), FRAC_CONST(0.000120178), FRAC_CONST(0.000121581), FRAC_CONST(0.000121936), FRAC_CONST(0.000122026) }, - { FRAC_CONST(1.48975E-008), FRAC_CONST(5.95465E-008), FRAC_CONST(2.37491E-007), FRAC_CONST(9.39002E-007), FRAC_CONST(3.59029E-006), FRAC_CONST(1.22069E-005), FRAC_CONST(3.05166E-005), FRAC_CONST(4.88257E-005), FRAC_CONST(5.74416E-005), FRAC_CONST(6.00925E-005), FRAC_CONST(6.0794E-005), FRAC_CONST(6.09719E-005), FRAC_CONST(6.10165E-005) }, - { FRAC_CONST(7.44876E-009), FRAC_CONST(2.97732E-008), FRAC_CONST(1.18745E-007), FRAC_CONST(4.69501E-007), FRAC_CONST(1.79515E-006), FRAC_CONST(6.10348E-006), FRAC_CONST(1.52586E-005), FRAC_CONST(2.44135E-005), FRAC_CONST(2.87216E-005), FRAC_CONST(3.00472E-005), FRAC_CONST(3.03979E-005), FRAC_CONST(3.04869E-005), FRAC_CONST(3.05092E-005) }, - { FRAC_CONST(3.72438E-009), FRAC_CONST(1.48866E-008), FRAC_CONST(5.93727E-008), FRAC_CONST(2.34751E-007), FRAC_CONST(8.97575E-007), FRAC_CONST(3.05175E-006), FRAC_CONST(7.62934E-006), FRAC_CONST(1.22069E-005), FRAC_CONST(1.4361E-005), FRAC_CONST(1.50238E-005), FRAC_CONST(1.51992E-005), FRAC_CONST(1.52437E-005), FRAC_CONST(1.52548E-005) }, - { FRAC_CONST(1.86219E-009), FRAC_CONST(7.44331E-009), FRAC_CONST(2.96864E-008), FRAC_CONST(1.17375E-007), FRAC_CONST(4.48788E-007), FRAC_CONST(1.52588E-006), FRAC_CONST(3.81468E-006), FRAC_CONST(6.10348E-006), FRAC_CONST(7.18056E-006), FRAC_CONST(7.51196E-006), FRAC_CONST(7.59965E-006), FRAC_CONST(7.62189E-006), FRAC_CONST(7.62747E-006) }, - { FRAC_CONST(9.31095E-010), FRAC_CONST(3.72166E-009), FRAC_CONST(1.48432E-008), FRAC_CONST(5.86876E-008), FRAC_CONST(2.24394E-007), FRAC_CONST(7.62939E-007), FRAC_CONST(1.90734E-006), FRAC_CONST(3.05175E-006), FRAC_CONST(3.59029E-006), FRAC_CONST(3.756E-006), FRAC_CONST(3.79984E-006), FRAC_CONST(3.81096E-006), FRAC_CONST(3.81375E-006) }, - { FRAC_CONST(4.65548E-010), FRAC_CONST(1.86083E-009), FRAC_CONST(7.42159E-009), FRAC_CONST(2.93438E-008), FRAC_CONST(1.12197E-007), FRAC_CONST(3.8147E-007), FRAC_CONST(9.53673E-007), FRAC_CONST(1.52588E-006), FRAC_CONST(1.79515E-006), FRAC_CONST(1.878E-006), FRAC_CONST(1.89992E-006), FRAC_CONST(1.90548E-006), FRAC_CONST(1.90688E-006) }, - { FRAC_CONST(2.32774E-010), FRAC_CONST(9.30414E-010), FRAC_CONST(3.71079E-009), FRAC_CONST(1.46719E-008), FRAC_CONST(5.60985E-008), FRAC_CONST(1.90735E-007), FRAC_CONST(4.76837E-007), FRAC_CONST(7.62939E-007), FRAC_CONST(8.97575E-007), FRAC_CONST(9.39002E-007), FRAC_CONST(9.49963E-007), FRAC_CONST(9.52743E-007), FRAC_CONST(9.53441E-007) }, - { FRAC_CONST(1.16387E-010), FRAC_CONST(4.65207E-010), FRAC_CONST(1.8554E-009), FRAC_CONST(7.33596E-009), FRAC_CONST(2.80492E-008), FRAC_CONST(9.53674E-008), FRAC_CONST(2.38419E-007), FRAC_CONST(3.8147E-007), FRAC_CONST(4.48788E-007), FRAC_CONST(4.69501E-007), FRAC_CONST(4.74982E-007), FRAC_CONST(4.76372E-007), FRAC_CONST(4.76721E-007) }, - { FRAC_CONST(5.81935E-011), FRAC_CONST(2.32603E-010), FRAC_CONST(9.27699E-010), FRAC_CONST(3.66798E-009), FRAC_CONST(1.40246E-008), FRAC_CONST(4.76837E-008), FRAC_CONST(1.19209E-007), FRAC_CONST(1.90735E-007), FRAC_CONST(2.24394E-007), FRAC_CONST(2.34751E-007), FRAC_CONST(2.37491E-007), FRAC_CONST(2.38186E-007), FRAC_CONST(2.3836E-007) }, - { FRAC_CONST(2.90967E-011), FRAC_CONST(1.16302E-010), FRAC_CONST(4.63849E-010), FRAC_CONST(1.83399E-009), FRAC_CONST(7.01231E-009), FRAC_CONST(2.38419E-008), FRAC_CONST(5.96046E-008), FRAC_CONST(9.53674E-008), FRAC_CONST(1.12197E-007), FRAC_CONST(1.17375E-007), FRAC_CONST(1.18745E-007), FRAC_CONST(1.19093E-007), FRAC_CONST(1.1918E-007) } -}; - -static const real_t Q_div2_tab_right[31][13] = { - { FRAC_CONST(0.992246), FRAC_CONST(0.992241), FRAC_CONST(0.992218), FRAC_CONST(0.992128), FRAC_CONST(0.991768), FRAC_CONST(0.990329), FRAC_CONST(0.984615), FRAC_CONST(0.962406), FRAC_CONST(0.882759), FRAC_CONST(0.663212), FRAC_CONST(0.332468), FRAC_CONST(0.111015), FRAC_CONST(0.0302959) }, - { FRAC_CONST(0.984612), FRAC_CONST(0.984601), FRAC_CONST(0.984556), FRAC_CONST(0.984379), FRAC_CONST(0.98367), FRAC_CONST(0.980843), FRAC_CONST(0.969697), FRAC_CONST(0.927536), FRAC_CONST(0.790123), FRAC_CONST(0.496124), FRAC_CONST(0.199377), FRAC_CONST(0.0587695), FRAC_CONST(0.0153809) }, - { FRAC_CONST(0.96969), FRAC_CONST(0.969668), FRAC_CONST(0.969582), FRAC_CONST(0.969238), FRAC_CONST(0.967864), FRAC_CONST(0.962406), FRAC_CONST(0.941176), FRAC_CONST(0.864865), FRAC_CONST(0.653061), FRAC_CONST(0.329897), FRAC_CONST(0.110727), FRAC_CONST(0.0302744), FRAC_CONST(0.00775006) }, - { FRAC_CONST(0.941163), FRAC_CONST(0.941122), FRAC_CONST(0.94096), FRAC_CONST(0.940312), FRAC_CONST(0.937729), FRAC_CONST(0.927536), FRAC_CONST(0.888889), FRAC_CONST(0.761905), FRAC_CONST(0.484848), FRAC_CONST(0.197531), FRAC_CONST(0.0586081), FRAC_CONST(0.0153698), FRAC_CONST(0.0038901) }, - { FRAC_CONST(0.888865), FRAC_CONST(0.888792), FRAC_CONST(0.888503), FRAC_CONST(0.887348), FRAC_CONST(0.882759), FRAC_CONST(0.864865), FRAC_CONST(0.8), FRAC_CONST(0.615385), FRAC_CONST(0.32), FRAC_CONST(0.109589), FRAC_CONST(0.0301887), FRAC_CONST(0.00774443), FRAC_CONST(0.00194884) }, - { FRAC_CONST(0.799961), FRAC_CONST(0.799844), FRAC_CONST(0.799375), FRAC_CONST(0.797508), FRAC_CONST(0.790123), FRAC_CONST(0.761905), FRAC_CONST(0.666667), FRAC_CONST(0.444444), FRAC_CONST(0.190476), FRAC_CONST(0.057971), FRAC_CONST(0.0153257), FRAC_CONST(0.00388727), FRAC_CONST(0.000975372) }, - { FRAC_CONST(0.666612), FRAC_CONST(0.66645), FRAC_CONST(0.6658), FRAC_CONST(0.663212), FRAC_CONST(0.653061), FRAC_CONST(0.615385), FRAC_CONST(0.5), FRAC_CONST(0.285714), FRAC_CONST(0.105263), FRAC_CONST(0.0298507), FRAC_CONST(0.00772201), FRAC_CONST(0.00194742), FRAC_CONST(0.000487924) }, - { FRAC_CONST(0.499939), FRAC_CONST(0.499756), FRAC_CONST(0.499025), FRAC_CONST(0.496124), FRAC_CONST(0.484848), FRAC_CONST(0.444444), FRAC_CONST(0.333333), FRAC_CONST(0.166667), FRAC_CONST(0.0555556), FRAC_CONST(0.0151515), FRAC_CONST(0.00387597), FRAC_CONST(0.000974659), FRAC_CONST(0.000244021) }, - { FRAC_CONST(0.333279), FRAC_CONST(0.333116), FRAC_CONST(0.332468), FRAC_CONST(0.329897), FRAC_CONST(0.32), FRAC_CONST(0.285714), FRAC_CONST(0.2), FRAC_CONST(0.0909091), FRAC_CONST(0.0285714), FRAC_CONST(0.00763359), FRAC_CONST(0.00194175), FRAC_CONST(0.000487567), FRAC_CONST(0.000122026) }, - { FRAC_CONST(0.199961), FRAC_CONST(0.199844), FRAC_CONST(0.199377), FRAC_CONST(0.197531), FRAC_CONST(0.190476), FRAC_CONST(0.166667), FRAC_CONST(0.111111), FRAC_CONST(0.047619), FRAC_CONST(0.0144928), FRAC_CONST(0.00383142), FRAC_CONST(0.000971817), FRAC_CONST(0.000243843), FRAC_CONST(6.10165E-005) }, - { FRAC_CONST(0.111087), FRAC_CONST(0.111015), FRAC_CONST(0.110727), FRAC_CONST(0.109589), FRAC_CONST(0.105263), FRAC_CONST(0.0909091), FRAC_CONST(0.0588235), FRAC_CONST(0.0243902), FRAC_CONST(0.00729927), FRAC_CONST(0.00191939), FRAC_CONST(0.000486145), FRAC_CONST(0.000121936), FRAC_CONST(3.05092E-005) }, - { FRAC_CONST(0.05881), FRAC_CONST(0.0587695), FRAC_CONST(0.0586081), FRAC_CONST(0.057971), FRAC_CONST(0.0555556), FRAC_CONST(0.047619), FRAC_CONST(0.030303), FRAC_CONST(0.0123457), FRAC_CONST(0.003663), FRAC_CONST(0.000960615), FRAC_CONST(0.000243132), FRAC_CONST(6.09719E-005), FRAC_CONST(1.52548E-005) }, - { FRAC_CONST(0.0302959), FRAC_CONST(0.0302744), FRAC_CONST(0.0301887), FRAC_CONST(0.0298507), FRAC_CONST(0.0285714), FRAC_CONST(0.0243902), FRAC_CONST(0.0153846), FRAC_CONST(0.00621118), FRAC_CONST(0.00183486), FRAC_CONST(0.000480538), FRAC_CONST(0.000121581), FRAC_CONST(3.04869E-005), FRAC_CONST(7.62747E-006) }, - { FRAC_CONST(0.0153809), FRAC_CONST(0.0153698), FRAC_CONST(0.0153257), FRAC_CONST(0.0151515), FRAC_CONST(0.0144928), FRAC_CONST(0.0123457), FRAC_CONST(0.00775194), FRAC_CONST(0.00311526), FRAC_CONST(0.000918274), FRAC_CONST(0.000240327), FRAC_CONST(6.0794E-005), FRAC_CONST(1.52437E-005), FRAC_CONST(3.81375E-006) }, - { FRAC_CONST(0.00775006), FRAC_CONST(0.00774443), FRAC_CONST(0.00772201), FRAC_CONST(0.00763359), FRAC_CONST(0.00729927), FRAC_CONST(0.00621118), FRAC_CONST(0.00389105), FRAC_CONST(0.00156006), FRAC_CONST(0.000459348), FRAC_CONST(0.000120178), FRAC_CONST(3.03979E-005), FRAC_CONST(7.62189E-006), FRAC_CONST(1.90688E-006) }, - { FRAC_CONST(0.0038901), FRAC_CONST(0.00388727), FRAC_CONST(0.00387597), FRAC_CONST(0.00383142), FRAC_CONST(0.003663), FRAC_CONST(0.00311526), FRAC_CONST(0.00194932), FRAC_CONST(0.00078064), FRAC_CONST(0.000229727), FRAC_CONST(6.00925E-005), FRAC_CONST(1.51992E-005), FRAC_CONST(3.81096E-006), FRAC_CONST(9.53441E-007) }, - { FRAC_CONST(0.00194884), FRAC_CONST(0.00194742), FRAC_CONST(0.00194175), FRAC_CONST(0.00191939), FRAC_CONST(0.00183486), FRAC_CONST(0.00156006), FRAC_CONST(0.00097561), FRAC_CONST(0.000390472), FRAC_CONST(0.000114877), FRAC_CONST(3.00472E-005), FRAC_CONST(7.59965E-006), FRAC_CONST(1.90548E-006), FRAC_CONST(4.76721E-007) }, - { FRAC_CONST(0.000975372), FRAC_CONST(0.000974659), FRAC_CONST(0.000971817), FRAC_CONST(0.000960615), FRAC_CONST(0.000918274), FRAC_CONST(0.00078064), FRAC_CONST(0.000488043), FRAC_CONST(0.000195274), FRAC_CONST(5.74416E-005), FRAC_CONST(1.50238E-005), FRAC_CONST(3.79984E-006), FRAC_CONST(9.52743E-007), FRAC_CONST(2.3836E-007) }, - { FRAC_CONST(0.000487924), FRAC_CONST(0.000487567), FRAC_CONST(0.000486145), FRAC_CONST(0.000480538), FRAC_CONST(0.000459348), FRAC_CONST(0.000390472), FRAC_CONST(0.000244081), FRAC_CONST(9.76467E-005), FRAC_CONST(2.87216E-005), FRAC_CONST(7.51196E-006), FRAC_CONST(1.89992E-006), FRAC_CONST(4.76372E-007), FRAC_CONST(1.1918E-007) }, - { FRAC_CONST(0.000244021), FRAC_CONST(0.000243843), FRAC_CONST(0.000243132), FRAC_CONST(0.000240327), FRAC_CONST(0.000229727), FRAC_CONST(0.000195274), FRAC_CONST(0.000122055), FRAC_CONST(4.88257E-005), FRAC_CONST(1.4361E-005), FRAC_CONST(3.756E-006), FRAC_CONST(9.49963E-007), FRAC_CONST(2.38186E-007), FRAC_CONST(5.95901E-008) }, - { FRAC_CONST(0.000122026), FRAC_CONST(0.000121936), FRAC_CONST(0.000121581), FRAC_CONST(0.000120178), FRAC_CONST(0.000114877), FRAC_CONST(9.76467E-005), FRAC_CONST(6.10314E-005), FRAC_CONST(2.44135E-005), FRAC_CONST(7.18056E-006), FRAC_CONST(1.878E-006), FRAC_CONST(4.74982E-007), FRAC_CONST(1.19093E-007), FRAC_CONST(2.9795E-008) }, - { FRAC_CONST(6.10165E-005), FRAC_CONST(6.09719E-005), FRAC_CONST(6.0794E-005), FRAC_CONST(6.00925E-005), FRAC_CONST(5.74416E-005), FRAC_CONST(4.88257E-005), FRAC_CONST(3.05166E-005), FRAC_CONST(1.22069E-005), FRAC_CONST(3.59029E-006), FRAC_CONST(9.39002E-007), FRAC_CONST(2.37491E-007), FRAC_CONST(5.95465E-008), FRAC_CONST(1.48975E-008) }, - { FRAC_CONST(3.05092E-005), FRAC_CONST(3.04869E-005), FRAC_CONST(3.03979E-005), FRAC_CONST(3.00472E-005), FRAC_CONST(2.87216E-005), FRAC_CONST(2.44135E-005), FRAC_CONST(1.52586E-005), FRAC_CONST(6.10348E-006), FRAC_CONST(1.79515E-006), FRAC_CONST(4.69501E-007), FRAC_CONST(1.18745E-007), FRAC_CONST(2.97732E-008), FRAC_CONST(7.44876E-009) }, - { FRAC_CONST(1.52548E-005), FRAC_CONST(1.52437E-005), FRAC_CONST(1.51992E-005), FRAC_CONST(1.50238E-005), FRAC_CONST(1.4361E-005), FRAC_CONST(1.22069E-005), FRAC_CONST(7.62934E-006), FRAC_CONST(3.05175E-006), FRAC_CONST(8.97575E-007), FRAC_CONST(2.34751E-007), FRAC_CONST(5.93727E-008), FRAC_CONST(1.48866E-008), FRAC_CONST(3.72438E-009) }, - { FRAC_CONST(7.62747E-006), FRAC_CONST(7.62189E-006), FRAC_CONST(7.59965E-006), FRAC_CONST(7.51196E-006), FRAC_CONST(7.18056E-006), FRAC_CONST(6.10348E-006), FRAC_CONST(3.81468E-006), FRAC_CONST(1.52588E-006), FRAC_CONST(4.48788E-007), FRAC_CONST(1.17375E-007), FRAC_CONST(2.96864E-008), FRAC_CONST(7.44331E-009), FRAC_CONST(1.86219E-009) }, - { FRAC_CONST(3.81375E-006), FRAC_CONST(3.81096E-006), FRAC_CONST(3.79984E-006), FRAC_CONST(3.756E-006), FRAC_CONST(3.59029E-006), FRAC_CONST(3.05175E-006), FRAC_CONST(1.90734E-006), FRAC_CONST(7.62939E-007), FRAC_CONST(2.24394E-007), FRAC_CONST(5.86876E-008), FRAC_CONST(1.48432E-008), FRAC_CONST(3.72166E-009), FRAC_CONST(9.31095E-010) }, - { FRAC_CONST(1.90688E-006), FRAC_CONST(1.90548E-006), FRAC_CONST(1.89992E-006), FRAC_CONST(1.878E-006), FRAC_CONST(1.79515E-006), FRAC_CONST(1.52588E-006), FRAC_CONST(9.53673E-007), FRAC_CONST(3.8147E-007), FRAC_CONST(1.12197E-007), FRAC_CONST(2.93438E-008), FRAC_CONST(7.42159E-009), FRAC_CONST(1.86083E-009), FRAC_CONST(4.65548E-010) }, - { FRAC_CONST(9.53441E-007), FRAC_CONST(9.52743E-007), FRAC_CONST(9.49963E-007), FRAC_CONST(9.39002E-007), FRAC_CONST(8.97575E-007), FRAC_CONST(7.62939E-007), FRAC_CONST(4.76837E-007), FRAC_CONST(1.90735E-007), FRAC_CONST(5.60985E-008), FRAC_CONST(1.46719E-008), FRAC_CONST(3.71079E-009), FRAC_CONST(9.30414E-010), FRAC_CONST(2.32774E-010) }, - { FRAC_CONST(4.76721E-007), FRAC_CONST(4.76372E-007), FRAC_CONST(4.74982E-007), FRAC_CONST(4.69501E-007), FRAC_CONST(4.48788E-007), FRAC_CONST(3.8147E-007), FRAC_CONST(2.38419E-007), FRAC_CONST(9.53674E-008), FRAC_CONST(2.80492E-008), FRAC_CONST(7.33596E-009), FRAC_CONST(1.8554E-009), FRAC_CONST(4.65207E-010), FRAC_CONST(1.16387E-010) }, - { FRAC_CONST(2.3836E-007), FRAC_CONST(2.38186E-007), FRAC_CONST(2.37491E-007), FRAC_CONST(2.34751E-007), FRAC_CONST(2.24394E-007), FRAC_CONST(1.90735E-007), FRAC_CONST(1.19209E-007), FRAC_CONST(4.76837E-008), FRAC_CONST(1.40246E-008), FRAC_CONST(3.66798E-009), FRAC_CONST(9.27699E-010), FRAC_CONST(2.32603E-010), FRAC_CONST(5.81935E-011) }, - { FRAC_CONST(1.1918E-007), FRAC_CONST(1.19093E-007), FRAC_CONST(1.18745E-007), FRAC_CONST(1.17375E-007), FRAC_CONST(1.12197E-007), FRAC_CONST(9.53674E-008), FRAC_CONST(5.96046E-008), FRAC_CONST(2.38419E-008), FRAC_CONST(7.01231E-009), FRAC_CONST(1.83399E-009), FRAC_CONST(4.63849E-010), FRAC_CONST(1.16302E-010), FRAC_CONST(2.90967E-011) } -}; - -/* calculates Q/(1+Q) */ -/* [0..1] */ -real_t calc_Q_div2(sbr_info *sbr, uint8_t ch, uint8_t m, uint8_t l) -{ - if (sbr->bs_coupling) - { - if ((sbr->Q[0][m][l] < 0 || sbr->Q[0][m][l] > 30) || - (sbr->Q[1][m][l] < 0 || sbr->Q[1][m][l] > 24 /* 2*panOffset(1) */)) - { - return 0; - } else { - /* the pan parameter is always even */ - if (ch == 0) - { - return Q_div2_tab_left[sbr->Q[0][m][l]][sbr->Q[1][m][l] >> 1]; - } else { - return Q_div2_tab_right[sbr->Q[0][m][l]][sbr->Q[1][m][l] >> 1]; - } - } - } else { - /* no coupling */ - if (sbr->Q[ch][m][l] < 0 || sbr->Q[ch][m][l] > 30) - { - return 0; - } else { - return Q_div2_tab[sbr->Q[ch][m][l]]; - } - } -} - -static const real_t E_deq_tab[64] = { - 64.0f, 128.0f, 256.0f, 512.0f, 1024.0f, 2048.0f, 4096.0f, 8192.0f, - 16384.0f, 32768.0f, 65536.0f, 131072.0f, 262144.0f, 524288.0f, 1.04858E+006f, 2.09715E+006f, - 4.1943E+006f, 8.38861E+006f, 1.67772E+007f, 3.35544E+007f, 6.71089E+007f, 1.34218E+008f, 2.68435E+008f, 5.36871E+008f, - 1.07374E+009f, 2.14748E+009f, 4.29497E+009f, 8.58993E+009f, 1.71799E+010f, 3.43597E+010f, 6.87195E+010f, 1.37439E+011f, - 2.74878E+011f, 5.49756E+011f, 1.09951E+012f, 2.19902E+012f, 4.39805E+012f, 8.79609E+012f, 1.75922E+013f, 3.51844E+013f, - 7.03687E+013f, 1.40737E+014f, 2.81475E+014f, 5.6295E+014f, 1.1259E+015f, 2.2518E+015f, 4.5036E+015f, 9.0072E+015f, - 1.80144E+016f, 3.60288E+016f, 7.20576E+016f, 1.44115E+017f, 2.8823E+017f, 5.76461E+017f, 1.15292E+018f, 2.30584E+018f, - 4.61169E+018f, 9.22337E+018f, 1.84467E+019f, 3.68935E+019f, 7.3787E+019f, 1.47574E+020f, 2.95148E+020f, 5.90296E+020f -}; - -void envelope_noise_dequantisation(sbr_info *sbr, uint8_t ch) -{ - if (sbr->bs_coupling == 0) - { - int16_t exp; - uint8_t l, k; - uint8_t amp = (sbr->amp_res[ch]) ? 0 : 1; - - for (l = 0; l < sbr->L_E[ch]; l++) - { - for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) - { - /* +6 for the *64 and -10 for the /32 in the synthesis QMF (fixed) - * since this is a energy value: (x/32)^2 = (x^2)/1024 - */ - /* exp = (sbr->E[ch][k][l] >> amp) + 6; */ - exp = (sbr->E[ch][k][l] >> amp); - - if ((exp < 0) || (exp >= 64)) - { - sbr->E_orig[ch][k][l] = 0; - } else { - sbr->E_orig[ch][k][l] = E_deq_tab[exp]; - - /* save half the table size at the cost of 1 multiply */ - if (amp && (sbr->E[ch][k][l] & 1)) - { - sbr->E_orig[ch][k][l] = MUL_C(sbr->E_orig[ch][k][l], COEF_CONST(1.414213562)); - } - } - } - } - - for (l = 0; l < sbr->L_Q[ch]; l++) - { - for (k = 0; k < sbr->N_Q; k++) - { - sbr->Q_div[ch][k][l] = calc_Q_div(sbr, ch, k, l); - sbr->Q_div2[ch][k][l] = calc_Q_div2(sbr, ch, k, l); - } - } - } -} - -static const real_t E_pan_tab[25] = { - FRAC_CONST(0.000244081), FRAC_CONST(0.000488043), - FRAC_CONST(0.00097561), FRAC_CONST(0.00194932), - FRAC_CONST(0.00389105), FRAC_CONST(0.00775194), - FRAC_CONST(0.0153846), FRAC_CONST(0.030303), - FRAC_CONST(0.0588235), FRAC_CONST(0.111111), - FRAC_CONST(0.2), FRAC_CONST(0.333333), - FRAC_CONST(0.5), FRAC_CONST(0.666667), - FRAC_CONST(0.8), FRAC_CONST(0.888889), - FRAC_CONST(0.941176), FRAC_CONST(0.969697), - FRAC_CONST(0.984615), FRAC_CONST(0.992248), - FRAC_CONST(0.996109), FRAC_CONST(0.998051), - FRAC_CONST(0.999024), FRAC_CONST(0.999512), - FRAC_CONST(0.999756) -}; - -void unmap_envelope_noise(sbr_info *sbr) -{ - real_t tmp; - int16_t exp0, exp1; - uint8_t l, k; - uint8_t amp0 = (sbr->amp_res[0]) ? 0 : 1; - uint8_t amp1 = (sbr->amp_res[1]) ? 0 : 1; - - for (l = 0; l < sbr->L_E[0]; l++) - { - for (k = 0; k < sbr->n[sbr->f[0][l]]; k++) - { - /* +6: * 64 ; +1: * 2 ; */ - exp0 = (sbr->E[0][k][l] >> amp0) + 1; - - /* UN_MAP removed: (x / 4096) same as (x >> 12) */ - /* E[1] is always even so no need for compensating the divide by 2 with - * an extra multiplication - */ - /* exp1 = (sbr->E[1][k][l] >> amp1) - 12; */ - exp1 = (sbr->E[1][k][l] >> amp1); - - if ((exp0 < 0) || (exp0 >= 64) || - (exp1 < 0) || (exp1 > 24)) - { - sbr->E_orig[1][k][l] = 0; - sbr->E_orig[0][k][l] = 0; - } else { - tmp = E_deq_tab[exp0]; - if (amp0 && (sbr->E[0][k][l] & 1)) - { - tmp = MUL_C(tmp, COEF_CONST(1.414213562)); - } - - /* panning */ - sbr->E_orig[0][k][l] = MUL_F(tmp, E_pan_tab[exp1]); - sbr->E_orig[1][k][l] = MUL_F(tmp, E_pan_tab[24 - exp1]); - } - } - } - - for (l = 0; l < sbr->L_Q[0]; l++) - { - for (k = 0; k < sbr->N_Q; k++) - { - sbr->Q_div[0][k][l] = calc_Q_div(sbr, 0, k, l); - sbr->Q_div[1][k][l] = calc_Q_div(sbr, 1, k, l); - sbr->Q_div2[0][k][l] = calc_Q_div2(sbr, 0, k, l); - sbr->Q_div2[1][k][l] = calc_Q_div2(sbr, 1, k, l); - } - } -} - -#endif - -#endif diff --git a/src/libfaad/sbr_e_nf.h b/src/libfaad/sbr_e_nf.h deleted file mode 100644 index 48874c125..000000000 --- a/src/libfaad/sbr_e_nf.h +++ /dev/null @@ -1,47 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_e_nf.h,v 1.5 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __SBR_E_NF_H__ -#define __SBR_E_NF_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -void extract_envelope_data(sbr_info *sbr, uint8_t ch); -void extract_noise_floor_data(sbr_info *sbr, uint8_t ch); -#ifndef FIXED_POINT -void envelope_noise_dequantisation(sbr_info *sbr, uint8_t ch); -void unmap_envelope_noise(sbr_info *sbr); -#endif - -#ifdef __cplusplus -} -#endif -#endif - diff --git a/src/libfaad/sbr_fbt.c b/src/libfaad/sbr_fbt.c deleted file mode 100644 index 511235863..000000000 --- a/src/libfaad/sbr_fbt.c +++ /dev/null @@ -1,761 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_fbt.c,v 1.5 2005/10/29 23:57:07 tmmm Exp $ -**/ - -/* Calculate frequency band tables */ - -#include "common.h" -#include "structs.h" - -#ifdef SBR_DEC - -#include <stdlib.h> - -#include "sbr_syntax.h" -#include "sbr_fbt.h" - -/* static function declarations */ -static int32_t find_bands(uint8_t warp, uint8_t bands, uint8_t a0, uint8_t a1); - - -/* calculate the start QMF channel for the master frequency band table */ -/* parameter is also called k0 */ -uint8_t qmf_start_channel(uint8_t bs_start_freq, uint8_t bs_samplerate_mode, - uint32_t sample_rate) -{ - static const uint8_t startMinTable[12] = { 7, 7, 10, 11, 12, 16, 16, - 17, 24, 32, 35, 48 }; - static const uint8_t offsetIndexTable[12] = { 5, 5, 4, 4, 4, 3, 2, 1, 0, - 6, 6, 6 }; - static const int8_t offset[7][16] = { - { -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7 }, - { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13 }, - { -5, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16 }, - { -6, -4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16 }, - { -4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20 }, - { -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24 }, - { 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24, 28, 33 } - }; - uint8_t startMin = startMinTable[get_sr_index(sample_rate)]; - uint8_t offsetIndex = offsetIndexTable[get_sr_index(sample_rate)]; - -#if 0 /* replaced with table (startMinTable) */ - if (sample_rate >= 64000) - { - startMin = (uint8_t)((5000.*128.)/(float)sample_rate + 0.5); - } else if (sample_rate < 32000) { - startMin = (uint8_t)((3000.*128.)/(float)sample_rate + 0.5); - } else { - startMin = (uint8_t)((4000.*128.)/(float)sample_rate + 0.5); - } -#endif - - if (bs_samplerate_mode) - { - return startMin + offset[offsetIndex][bs_start_freq]; - -#if 0 /* replaced by offsetIndexTable */ - switch (sample_rate) - { - case 16000: - return startMin + offset[0][bs_start_freq]; - case 22050: - return startMin + offset[1][bs_start_freq]; - case 24000: - return startMin + offset[2][bs_start_freq]; - case 32000: - return startMin + offset[3][bs_start_freq]; - default: - if (sample_rate > 64000) - { - return startMin + offset[5][bs_start_freq]; - } else { /* 44100 <= sample_rate <= 64000 */ - return startMin + offset[4][bs_start_freq]; - } - } -#endif - } else { - return startMin + offset[6][bs_start_freq]; - } -} - -static int longcmp(const void *a, const void *b) -{ - return ((int)(*(int32_t*)a - *(int32_t*)b)); -} - -/* calculate the stop QMF channel for the master frequency band table */ -/* parameter is also called k2 */ -uint8_t qmf_stop_channel(uint8_t bs_stop_freq, uint32_t sample_rate, - uint8_t k0) -{ - if (bs_stop_freq == 15) - { - return min(64, k0 * 3); - } else if (bs_stop_freq == 14) { - return min(64, k0 * 2); - } else { - static const uint8_t stopMinTable[12] = { 13, 15, 20, 21, 23, - 32, 32, 35, 48, 64, 70, 96 }; - static const int8_t offset[12][14] = { - { 0, 2, 4, 6, 8, 11, 14, 18, 22, 26, 31, 37, 44, 51 }, - { 0, 2, 4, 6, 8, 11, 14, 18, 22, 26, 31, 36, 42, 49 }, - { 0, 2, 4, 6, 8, 11, 14, 17, 21, 25, 29, 34, 39, 44 }, - { 0, 2, 4, 6, 8, 11, 14, 17, 20, 24, 28, 33, 38, 43 }, - { 0, 2, 4, 6, 8, 11, 14, 17, 20, 24, 28, 32, 36, 41 }, - { 0, 2, 4, 6, 8, 10, 12, 14, 17, 20, 23, 26, 29, 32 }, - { 0, 2, 4, 6, 8, 10, 12, 14, 17, 20, 23, 26, 29, 32 }, - { 0, 1, 3, 5, 7, 9, 11, 13, 15, 17, 20, 23, 26, 29 }, - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, -1, -2, -3, -4, -5, -6, -6, -6, -6, -6, -6, -6, -6 }, - { 0, -3, -6, -9, -12, -15, -18, -20, -22, -24, -26, -28, -30, -32 } - }; -#if 0 - uint8_t i; - int32_t stopDk[13], stopDk_t[14], k2; -#endif - uint8_t stopMin = stopMinTable[get_sr_index(sample_rate)]; - -#if 0 /* replaced by table lookup */ - if (sample_rate >= 64000) - { - stopMin = (uint8_t)((10000.*128.)/(float)sample_rate + 0.5); - } else if (sample_rate < 32000) { - stopMin = (uint8_t)((6000.*128.)/(float)sample_rate + 0.5); - } else { - stopMin = (uint8_t)((8000.*128.)/(float)sample_rate + 0.5); - } -#endif - -#if 0 /* replaced by table lookup */ - /* diverging power series */ - for (i = 0; i <= 13; i++) - { - stopDk_t[i] = (int32_t)(stopMin*pow(64.0/stopMin, i/13.0) + 0.5); - } - for (i = 0; i < 13; i++) - { - stopDk[i] = stopDk_t[i+1] - stopDk_t[i]; - } - - /* needed? */ - qsort(stopDk, 13, sizeof(stopDk[0]), longcmp); - - k2 = stopMin; - for (i = 0; i < bs_stop_freq; i++) - { - k2 += stopDk[i]; - } - return min(64, k2); -#endif - /* bs_stop_freq <= 13 */ - return min(64, stopMin + offset[get_sr_index(sample_rate)][min(bs_stop_freq, 13)]); - } - - return 0; -} - -/* calculate the master frequency table from k0, k2, bs_freq_scale - and bs_alter_scale - - version for bs_freq_scale = 0 -*/ -uint8_t master_frequency_table_fs0(sbr_info *sbr, uint8_t k0, uint8_t k2, - uint8_t bs_alter_scale) -{ - int8_t incr; - uint8_t k; - uint8_t dk; - uint32_t nrBands, k2Achieved; - int32_t k2Diff, vDk[64] = {0}; - - /* mft only defined for k2 > k0 */ - if (k2 <= k0) - { - sbr->N_master = 0; - return 1; - } - - dk = bs_alter_scale ? 2 : 1; - -#if 0 /* replaced by float-less design */ - nrBands = 2 * (int32_t)((float)(k2-k0)/(dk*2) + (-1+dk)/2.0f); -#else - if (bs_alter_scale) - { - nrBands = (((k2-k0+2)>>2)<<1); - } else { - nrBands = (((k2-k0)>>1)<<1); - } -#endif - nrBands = min(nrBands, 63); - if (nrBands <= 0) - return 1; - - k2Achieved = k0 + nrBands * dk; - k2Diff = k2 - k2Achieved; - for (k = 0; k < nrBands; k++) - vDk[k] = dk; - - if (k2Diff) - { - incr = (k2Diff > 0) ? -1 : 1; - k = (uint8_t) ((k2Diff > 0) ? (nrBands-1) : 0); - - while (k2Diff != 0) - { - vDk[k] -= incr; - k += incr; - k2Diff += incr; - } - } - - sbr->f_master[0] = k0; - for (k = 1; k <= nrBands; k++) - sbr->f_master[k] = (uint8_t)(sbr->f_master[k-1] + vDk[k-1]); - - sbr->N_master = (uint8_t)nrBands; - sbr->N_master = (min(sbr->N_master, 64)); - -#if 0 - printf("f_master[%d]: ", nrBands); - for (k = 0; k <= nrBands; k++) - { - printf("%d ", sbr->f_master[k]); - } - printf("\n"); -#endif - - return 0; -} - -/* - This function finds the number of bands using this formula: - bands * log(a1/a0)/log(2.0) + 0.5 -*/ -static int32_t find_bands(uint8_t warp, uint8_t bands, uint8_t a0, uint8_t a1) -{ -#ifdef FIXED_POINT - /* table with log2() values */ - static const real_t log2Table[65] = { - COEF_CONST(0.0), COEF_CONST(0.0), COEF_CONST(1.0000000000), COEF_CONST(1.5849625007), - COEF_CONST(2.0000000000), COEF_CONST(2.3219280949), COEF_CONST(2.5849625007), COEF_CONST(2.8073549221), - COEF_CONST(3.0000000000), COEF_CONST(3.1699250014), COEF_CONST(3.3219280949), COEF_CONST(3.4594316186), - COEF_CONST(3.5849625007), COEF_CONST(3.7004397181), COEF_CONST(3.8073549221), COEF_CONST(3.9068905956), - COEF_CONST(4.0000000000), COEF_CONST(4.0874628413), COEF_CONST(4.1699250014), COEF_CONST(4.2479275134), - COEF_CONST(4.3219280949), COEF_CONST(4.3923174228), COEF_CONST(4.4594316186), COEF_CONST(4.5235619561), - COEF_CONST(4.5849625007), COEF_CONST(4.6438561898), COEF_CONST(4.7004397181), COEF_CONST(4.7548875022), - COEF_CONST(4.8073549221), COEF_CONST(4.8579809951), COEF_CONST(4.9068905956), COEF_CONST(4.9541963104), - COEF_CONST(5.0000000000), COEF_CONST(5.0443941194), COEF_CONST(5.0874628413), COEF_CONST(5.1292830169), - COEF_CONST(5.1699250014), COEF_CONST(5.2094533656), COEF_CONST(5.2479275134), COEF_CONST(5.2854022189), - COEF_CONST(5.3219280949), COEF_CONST(5.3575520046), COEF_CONST(5.3923174228), COEF_CONST(5.4262647547), - COEF_CONST(5.4594316186), COEF_CONST(5.4918530963), COEF_CONST(5.5235619561), COEF_CONST(5.5545888517), - COEF_CONST(5.5849625007), COEF_CONST(5.6147098441), COEF_CONST(5.6438561898), COEF_CONST(5.6724253420), - COEF_CONST(5.7004397181), COEF_CONST(5.7279204546), COEF_CONST(5.7548875022), COEF_CONST(5.7813597135), - COEF_CONST(5.8073549221), COEF_CONST(5.8328900142), COEF_CONST(5.8579809951), COEF_CONST(5.8826430494), - COEF_CONST(5.9068905956), COEF_CONST(5.9307373376), COEF_CONST(5.9541963104), COEF_CONST(5.9772799235), - COEF_CONST(6.0) - }; - real_t r0 = log2Table[a0]; /* coef */ - real_t r1 = log2Table[a1]; /* coef */ - real_t r2 = (r1 - r0); /* coef */ - - if (warp) - r2 = MUL_C(r2, COEF_CONST(1.0/1.3)); - - /* convert r2 to real and then multiply and round */ - r2 = (r2 >> (COEF_BITS-REAL_BITS)) * bands + (1<<(REAL_BITS-1)); - - return (r2 >> REAL_BITS); -#else - real_t div = (real_t)log(2.0); - if (warp) div *= (real_t)1.3; - - return (int32_t)(bands * log((float)a1/(float)a0)/div + 0.5); -#endif -} - -static real_t find_initial_power(uint8_t bands, uint8_t a0, uint8_t a1) -{ -#ifdef FIXED_POINT - /* table with log() values */ - static const real_t logTable[65] = { - COEF_CONST(0.0), COEF_CONST(0.0), COEF_CONST(0.6931471806), COEF_CONST(1.0986122887), - COEF_CONST(1.3862943611), COEF_CONST(1.6094379124), COEF_CONST(1.7917594692), COEF_CONST(1.9459101491), - COEF_CONST(2.0794415417), COEF_CONST(2.1972245773), COEF_CONST(2.3025850930), COEF_CONST(2.3978952728), - COEF_CONST(2.4849066498), COEF_CONST(2.5649493575), COEF_CONST(2.6390573296), COEF_CONST(2.7080502011), - COEF_CONST(2.7725887222), COEF_CONST(2.8332133441), COEF_CONST(2.8903717579), COEF_CONST(2.9444389792), - COEF_CONST(2.9957322736), COEF_CONST(3.0445224377), COEF_CONST(3.0910424534), COEF_CONST(3.1354942159), - COEF_CONST(3.1780538303), COEF_CONST(3.2188758249), COEF_CONST(3.2580965380), COEF_CONST(3.2958368660), - COEF_CONST(3.3322045102), COEF_CONST(3.3672958300), COEF_CONST(3.4011973817), COEF_CONST(3.4339872045), - COEF_CONST(3.4657359028), COEF_CONST(3.4965075615), COEF_CONST(3.5263605246), COEF_CONST(3.5553480615), - COEF_CONST(3.5835189385), COEF_CONST(3.6109179126), COEF_CONST(3.6375861597), COEF_CONST(3.6635616461), - COEF_CONST(3.6888794541), COEF_CONST(3.7135720667), COEF_CONST(3.7376696183), COEF_CONST(3.7612001157), - COEF_CONST(3.7841896339), COEF_CONST(3.8066624898), COEF_CONST(3.8286413965), COEF_CONST(3.8501476017), - COEF_CONST(3.8712010109), COEF_CONST(3.8918202981), COEF_CONST(3.9120230054), COEF_CONST(3.9318256327), - COEF_CONST(3.9512437186), COEF_CONST(3.9702919136), COEF_CONST(3.9889840466), COEF_CONST(4.0073331852), - COEF_CONST(4.0253516907), COEF_CONST(4.0430512678), COEF_CONST(4.0604430105), COEF_CONST(4.0775374439), - COEF_CONST(4.0943445622), COEF_CONST(4.1108738642), COEF_CONST(4.1271343850), COEF_CONST(4.1431347264), - COEF_CONST(4.158883083) - }; - /* standard Taylor polynomial coefficients for exp(x) around 0 */ - /* a polynomial around x=1 is more precise, as most values are around 1.07, - but this is just fine already */ - static const real_t c1 = COEF_CONST(1.0); - static const real_t c2 = COEF_CONST(1.0/2.0); - static const real_t c3 = COEF_CONST(1.0/6.0); - static const real_t c4 = COEF_CONST(1.0/24.0); - - real_t r0 = logTable[a0]; /* coef */ - real_t r1 = logTable[a1]; /* coef */ - real_t r2 = (r1 - r0) / bands; /* coef */ - real_t rexp = c1 + MUL_C((c1 + MUL_C((c2 + MUL_C((c3 + MUL_C(c4,r2)), r2)), r2)), r2); - - return (rexp >> (COEF_BITS-REAL_BITS)); /* real */ -#else - return (real_t)pow((real_t)a1/(real_t)a0, 1.0/(real_t)bands); -#endif -} - -/* - version for bs_freq_scale > 0 -*/ -uint8_t master_frequency_table(sbr_info *sbr, uint8_t k0, uint8_t k2, - uint8_t bs_freq_scale, uint8_t bs_alter_scale) -{ - uint8_t k, bands, twoRegions; - uint8_t k1; - uint8_t nrBand0, nrBand1; - int32_t vDk0[64] = {0}, vDk1[64] = {0}; - int32_t vk0[64] = {0}, vk1[64] = {0}; - uint8_t temp1[] = { 6, 5, 4 }; - real_t q, qk; - int32_t A_1; -#ifdef FIXED_POINT - real_t rk2, rk0; -#endif - - /* mft only defined for k2 > k0 */ - if (k2 <= k0) - { - sbr->N_master = 0; - return 1; - } - - bands = temp1[bs_freq_scale-1]; - -#ifdef FIXED_POINT - rk0 = (real_t)k0 << REAL_BITS; - rk2 = (real_t)k2 << REAL_BITS; - if (rk2 > MUL_C(rk0, COEF_CONST(2.2449))) -#else - if ((float)k2/(float)k0 > 2.2449) -#endif - { - twoRegions = 1; - k1 = k0 << 1; - } else { - twoRegions = 0; - k1 = k2; - } - - nrBand0 = (uint8_t)(2 * find_bands(0, bands, k0, k1)); - nrBand0 = min(nrBand0, 63); - if (nrBand0 <= 0) - return 1; - - q = find_initial_power(nrBand0, k0, k1); -#ifdef FIXED_POINT - qk = (real_t)k0 << REAL_BITS; - //A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS); - A_1 = k0; -#else - qk = REAL_CONST(k0); - A_1 = (int32_t)(qk + .5); -#endif - for (k = 0; k <= nrBand0; k++) - { - int32_t A_0 = A_1; -#ifdef FIXED_POINT - qk = MUL_R(qk,q); - A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS); -#else - qk *= q; - A_1 = (int32_t)(qk + 0.5); -#endif - vDk0[k] = A_1 - A_0; - } - - /* needed? */ - qsort(vDk0, nrBand0, sizeof(vDk0[0]), longcmp); - - vk0[0] = k0; - for (k = 1; k <= nrBand0; k++) - { - vk0[k] = vk0[k-1] + vDk0[k-1]; - if (vDk0[k-1] == 0) - return 1; - } - - if (!twoRegions) - { - for (k = 0; k <= nrBand0; k++) - sbr->f_master[k] = (uint8_t) vk0[k]; - - sbr->N_master = nrBand0; - sbr->N_master = min(sbr->N_master, 64); - return 0; - } - - nrBand1 = (uint8_t)(2 * find_bands(1 /* warped */, bands, k1, k2)); - nrBand1 = min(nrBand1, 63); - - q = find_initial_power(nrBand1, k1, k2); -#ifdef FIXED_POINT - qk = (real_t)k1 << REAL_BITS; - //A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS); - A_1 = k1; -#else - qk = REAL_CONST(k1); - A_1 = (int32_t)(qk + .5); -#endif - for (k = 0; k <= nrBand1 - 1; k++) - { - int32_t A_0 = A_1; -#ifdef FIXED_POINT - qk = MUL_R(qk,q); - A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS); -#else - qk *= q; - A_1 = (int32_t)(qk + 0.5); -#endif - vDk1[k] = A_1 - A_0; - } - - if (vDk1[0] < vDk0[nrBand0 - 1]) - { - int32_t change; - - /* needed? */ - qsort(vDk1, nrBand1 + 1, sizeof(vDk1[0]), longcmp); - change = vDk0[nrBand0 - 1] - vDk1[0]; - vDk1[0] = vDk0[nrBand0 - 1]; - vDk1[nrBand1 - 1] = vDk1[nrBand1 - 1] - change; - } - - /* needed? */ - qsort(vDk1, nrBand1, sizeof(vDk1[0]), longcmp); - vk1[0] = k1; - for (k = 1; k <= nrBand1; k++) - { - vk1[k] = vk1[k-1] + vDk1[k-1]; - if (vDk1[k-1] == 0) - return 1; - } - - sbr->N_master = nrBand0 + nrBand1; - sbr->N_master = min(sbr->N_master, 64); - for (k = 0; k <= nrBand0; k++) - { - sbr->f_master[k] = (uint8_t) vk0[k]; - } - for (k = nrBand0 + 1; k <= sbr->N_master; k++) - { - sbr->f_master[k] = (uint8_t) vk1[k - nrBand0]; - } - -#if 0 - printf("f_master[%d]: ", sbr->N_master); - for (k = 0; k <= sbr->N_master; k++) - { - printf("%d ", sbr->f_master[k]); - } - printf("\n"); -#endif - - return 0; -} - -/* calculate the derived frequency border tables from f_master */ -uint8_t derived_frequency_table(sbr_info *sbr, uint8_t bs_xover_band, - uint8_t k2) -{ - uint8_t k, i; - uint32_t minus; - - /* The following relation shall be satisfied: bs_xover_band < N_Master */ - if (sbr->N_master <= bs_xover_band) - return 1; - - sbr->N_high = sbr->N_master - bs_xover_band; - sbr->N_low = (sbr->N_high>>1) + (sbr->N_high - ((sbr->N_high>>1)<<1)); - - sbr->n[0] = sbr->N_low; - sbr->n[1] = sbr->N_high; - - for (k = 0; k <= sbr->N_high; k++) - { - sbr->f_table_res[HI_RES][k] = sbr->f_master[k + bs_xover_band]; - } - - sbr->M = sbr->f_table_res[HI_RES][sbr->N_high] - sbr->f_table_res[HI_RES][0]; - sbr->kx = sbr->f_table_res[HI_RES][0]; - if (sbr->kx > 32) - return 1; - if (sbr->kx + sbr->M > 64) - return 1; - - minus = (sbr->N_high & 1) ? 1 : 0; - - for (k = 0; k <= sbr->N_low; k++) - { - if (k == 0) - i = 0; - else - i = (uint8_t)(2*k - minus); - sbr->f_table_res[LO_RES][k] = sbr->f_table_res[HI_RES][i]; - } - -#if 0 - printf("bs_freq_scale: %d\n", sbr->bs_freq_scale); - printf("bs_limiter_bands: %d\n", sbr->bs_limiter_bands); - printf("f_table_res[HI_RES][%d]: ", sbr->N_high); - for (k = 0; k <= sbr->N_high; k++) - { - printf("%d ", sbr->f_table_res[HI_RES][k]); - } - printf("\n"); -#endif -#if 0 - printf("f_table_res[LO_RES][%d]: ", sbr->N_low); - for (k = 0; k <= sbr->N_low; k++) - { - printf("%d ", sbr->f_table_res[LO_RES][k]); - } - printf("\n"); -#endif - - sbr->N_Q = 0; - if (sbr->bs_noise_bands == 0) - { - sbr->N_Q = 1; - } else { -#if 0 - sbr->N_Q = max(1, (int32_t)(sbr->bs_noise_bands*(log(k2/(float)sbr->kx)/log(2.0)) + 0.5)); -#else - sbr->N_Q = (uint8_t)(max(1, find_bands(0, sbr->bs_noise_bands, sbr->kx, k2))); -#endif - sbr->N_Q = min(5, sbr->N_Q); - } - - for (k = 0; k <= sbr->N_Q; k++) - { - if (k == 0) - { - i = 0; - } else { - /* i = i + (int32_t)((sbr->N_low - i)/(sbr->N_Q + 1 - k)); */ - i = i + (sbr->N_low - i)/(sbr->N_Q + 1 - k); - } - sbr->f_table_noise[k] = sbr->f_table_res[LO_RES][i]; - } - - /* build table for mapping k to g in hf patching */ - for (k = 0; k < 64; k++) - { - uint8_t g; - for (g = 0; g < sbr->N_Q; g++) - { - if ((sbr->f_table_noise[g] <= k) && - (k < sbr->f_table_noise[g+1])) - { - sbr->table_map_k_to_g[k] = g; - break; - } - } - } - -#if 0 - printf("f_table_noise[%d]: ", sbr->N_Q); - for (k = 0; k <= sbr->N_Q; k++) - { - printf("%d ", sbr->f_table_noise[k] - sbr->kx); - } - printf("\n"); -#endif - - return 0; -} - -/* TODO: blegh, ugly */ -/* Modified to calculate for all possible bs_limiter_bands always - * This reduces the number calls to this functions needed (now only on - * header reset) - */ -void limiter_frequency_table(sbr_info *sbr) -{ -#if 0 - static const real_t limiterBandsPerOctave[] = { REAL_CONST(1.2), - REAL_CONST(2), REAL_CONST(3) }; -#else - static const real_t limiterBandsCompare[] = { REAL_CONST(1.327152), - REAL_CONST(1.185093), REAL_CONST(1.119872) }; -#endif - uint8_t k, s; - int8_t nrLim; -#if 0 - real_t limBands; -#endif - - sbr->f_table_lim[0][0] = sbr->f_table_res[LO_RES][0] - sbr->kx; - sbr->f_table_lim[0][1] = sbr->f_table_res[LO_RES][sbr->N_low] - sbr->kx; - sbr->N_L[0] = 1; - -#if 0 - printf("f_table_lim[%d][%d]: ", 0, sbr->N_L[0]); - for (k = 0; k <= sbr->N_L[0]; k++) - { - printf("%d ", sbr->f_table_lim[0][k]); - } - printf("\n"); -#endif - - for (s = 1; s < 4; s++) - { - int32_t limTable[100 /*TODO*/] = {0}; - uint8_t patchBorders[64/*??*/] = {0}; - -#if 0 - limBands = limiterBandsPerOctave[s - 1]; -#endif - - patchBorders[0] = sbr->kx; - for (k = 1; k <= sbr->noPatches; k++) - { - patchBorders[k] = patchBorders[k-1] + sbr->patchNoSubbands[k-1]; - } - - for (k = 0; k <= sbr->N_low; k++) - { - limTable[k] = sbr->f_table_res[LO_RES][k]; - } - for (k = 1; k < sbr->noPatches; k++) - { - limTable[k+sbr->N_low] = patchBorders[k]; - } - - /* needed */ - qsort(limTable, sbr->noPatches + sbr->N_low, sizeof(limTable[0]), longcmp); - k = 1; - nrLim = sbr->noPatches + sbr->N_low - 1; - - if (nrLim < 0) // TODO: BIG FAT PROBLEM - return; - -restart: - if (k <= nrLim) - { - real_t nOctaves; - - if (limTable[k-1] != 0) -#if 0 - nOctaves = REAL_CONST(log((float)limTable[k]/(float)limTable[k-1])/log(2.0)); -#else -#ifdef FIXED_POINT - nOctaves = DIV_R((limTable[k]<<REAL_BITS),REAL_CONST(limTable[k-1])); -#else - nOctaves = (real_t)limTable[k]/(real_t)limTable[k-1]; -#endif -#endif - else - nOctaves = 0; - -#if 0 - if ((MUL_R(nOctaves,limBands)) < REAL_CONST(0.49)) -#else - if (nOctaves < limiterBandsCompare[s - 1]) -#endif - { - uint8_t i; - if (limTable[k] != limTable[k-1]) - { - uint8_t found = 0, found2 = 0; - for (i = 0; i <= sbr->noPatches; i++) - { - if (limTable[k] == patchBorders[i]) - found = 1; - } - if (found) - { - found2 = 0; - for (i = 0; i <= sbr->noPatches; i++) - { - if (limTable[k-1] == patchBorders[i]) - found2 = 1; - } - if (found2) - { - k++; - goto restart; - } else { - /* remove (k-1)th element */ - limTable[k-1] = sbr->f_table_res[LO_RES][sbr->N_low]; - qsort(limTable, sbr->noPatches + sbr->N_low, sizeof(limTable[0]), longcmp); - nrLim--; - goto restart; - } - } - } - /* remove kth element */ - limTable[k] = sbr->f_table_res[LO_RES][sbr->N_low]; - qsort(limTable, nrLim, sizeof(limTable[0]), longcmp); - nrLim--; - goto restart; - } else { - k++; - goto restart; - } - } - - sbr->N_L[s] = nrLim; - for (k = 0; k <= nrLim; k++) - { - sbr->f_table_lim[s][k] = limTable[k] - sbr->kx; - } - -#if 0 - printf("f_table_lim[%d][%d]: ", s, sbr->N_L[s]); - for (k = 0; k <= sbr->N_L[s]; k++) - { - printf("%d ", sbr->f_table_lim[s][k]); - } - printf("\n"); -#endif - } -} - -#endif diff --git a/src/libfaad/sbr_fbt.h b/src/libfaad/sbr_fbt.h deleted file mode 100644 index 26c580efe..000000000 --- a/src/libfaad/sbr_fbt.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_fbt.h,v 1.5 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __SBR_FBT_H__ -#define __SBR_FBT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -uint8_t qmf_start_channel(uint8_t bs_start_freq, uint8_t bs_samplerate_mode, - uint32_t sample_rate); -uint8_t qmf_stop_channel(uint8_t bs_stop_freq, uint32_t sample_rate, - uint8_t k0); -uint8_t master_frequency_table_fs0(sbr_info *sbr, uint8_t k0, uint8_t k2, - uint8_t bs_alter_scale); -uint8_t master_frequency_table(sbr_info *sbr, uint8_t k0, uint8_t k2, - uint8_t bs_freq_scale, uint8_t bs_alter_scale); -uint8_t derived_frequency_table(sbr_info *sbr, uint8_t bs_xover_band, - uint8_t k2); -void limiter_frequency_table(sbr_info *sbr); - - -#ifdef __cplusplus -} -#endif -#endif - diff --git a/src/libfaad/sbr_hfadj.c b/src/libfaad/sbr_hfadj.c deleted file mode 100644 index 081f731e9..000000000 --- a/src/libfaad/sbr_hfadj.c +++ /dev/null @@ -1,1720 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_hfadj.c,v 1.5 2005/10/29 23:57:07 tmmm Exp $ -**/ - -/* High Frequency adjustment */ - -#include "common.h" -#include "structs.h" - -#ifdef SBR_DEC - -#include "sbr_syntax.h" -#include "sbr_hfadj.h" - -#include "sbr_noise.h" - - -/* static function declarations */ -static void estimate_current_envelope(sbr_info *sbr, sbr_hfadj_info *adj, - qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch); -static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch); -#ifdef SBR_LOW_POWER -static void calc_gain_groups(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch); -static void aliasing_reduction(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch); -#endif -static void hf_assembly(sbr_info *sbr, sbr_hfadj_info *adj, qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch); - - -void hf_adjustment(sbr_info *sbr, qmf_t Xsbr[MAX_NTSRHFG][64] -#ifdef SBR_LOW_POWER - ,real_t *deg /* aliasing degree */ -#endif - ,uint8_t ch) -{ - ALIGN sbr_hfadj_info adj = {{{0}}}; - - if (sbr->bs_frame_class[ch] == FIXFIX) - { - sbr->l_A[ch] = -1; - } else if (sbr->bs_frame_class[ch] == VARFIX) { - if (sbr->bs_pointer[ch] > 1) - sbr->l_A[ch] = -1; - else - sbr->l_A[ch] = sbr->bs_pointer[ch] - 1; - } else { - if (sbr->bs_pointer[ch] == 0) - sbr->l_A[ch] = -1; - else - sbr->l_A[ch] = sbr->L_E[ch] + 1 - sbr->bs_pointer[ch]; - } - - estimate_current_envelope(sbr, &adj, Xsbr, ch); - - calculate_gain(sbr, &adj, ch); - -#ifdef SBR_LOW_POWER - calc_gain_groups(sbr, &adj, deg, ch); - aliasing_reduction(sbr, &adj, deg, ch); -#endif - - hf_assembly(sbr, &adj, Xsbr, ch); -} - -static uint8_t get_S_mapped(sbr_info *sbr, uint8_t ch, uint8_t l, uint8_t current_band) -{ - if (sbr->f[ch][l] == HI_RES) - { - /* in case of using f_table_high we just have 1 to 1 mapping - * from bs_add_harmonic[l][k] - */ - if ((l >= sbr->l_A[ch]) || - (sbr->bs_add_harmonic_prev[ch][current_band] && sbr->bs_add_harmonic_flag_prev[ch])) - { - return sbr->bs_add_harmonic[ch][current_band]; - } - } else { - uint8_t b, lb, ub; - - /* in case of f_table_low we check if any of the HI_RES bands - * within this LO_RES band has bs_add_harmonic[l][k] turned on - * (note that borders in the LO_RES table are also present in - * the HI_RES table) - */ - - /* find first HI_RES band in current LO_RES band */ - lb = 2*current_band - ((sbr->N_high & 1) ? 1 : 0); - /* find first HI_RES band in next LO_RES band */ - ub = 2*(current_band+1) - ((sbr->N_high & 1) ? 1 : 0); - - /* check all HI_RES bands in current LO_RES band for sinusoid */ - for (b = lb; b < ub; b++) - { - if ((l >= sbr->l_A[ch]) || - (sbr->bs_add_harmonic_prev[ch][b] && sbr->bs_add_harmonic_flag_prev[ch])) - { - if (sbr->bs_add_harmonic[ch][b] == 1) - return 1; - } - } - } - - return 0; -} - -static void estimate_current_envelope(sbr_info *sbr, sbr_hfadj_info *adj, - qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch) -{ - uint8_t m, l, j, k, k_l, k_h, p; - real_t nrg, div; - - if (sbr->bs_interpol_freq == 1) - { - for (l = 0; l < sbr->L_E[ch]; l++) - { - uint8_t i, l_i, u_i; - - l_i = sbr->t_E[ch][l]; - u_i = sbr->t_E[ch][l+1]; - - div = (real_t)(u_i - l_i); - - for (m = 0; m < sbr->M; m++) - { - nrg = 0; - - for (i = l_i + sbr->tHFAdj; i < u_i + sbr->tHFAdj; i++) - { -#ifdef FIXED_POINT -#ifdef SBR_LOW_POWER - nrg += ((QMF_RE(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_RE(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS); -#else - nrg += ((QMF_RE(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_RE(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS) + - ((QMF_IM(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_IM(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS); -#endif -#else - nrg += MUL_R(QMF_RE(Xsbr[i][m + sbr->kx]), QMF_RE(Xsbr[i][m + sbr->kx])) -#ifndef SBR_LOW_POWER - + MUL_R(QMF_IM(Xsbr[i][m + sbr->kx]), QMF_IM(Xsbr[i][m + sbr->kx])) -#endif - ; -#endif - } - - sbr->E_curr[ch][m][l] = nrg / div; -#ifdef SBR_LOW_POWER -#ifdef FIXED_POINT - sbr->E_curr[ch][m][l] <<= 1; -#else - sbr->E_curr[ch][m][l] *= 2; -#endif -#endif - } - } - } else { - for (l = 0; l < sbr->L_E[ch]; l++) - { - for (p = 0; p < sbr->n[sbr->f[ch][l]]; p++) - { - k_l = sbr->f_table_res[sbr->f[ch][l]][p]; - k_h = sbr->f_table_res[sbr->f[ch][l]][p+1]; - - for (k = k_l; k < k_h; k++) - { - uint8_t i, l_i, u_i; - nrg = 0; - - l_i = sbr->t_E[ch][l]; - u_i = sbr->t_E[ch][l+1]; - - div = (real_t)((u_i - l_i)*(k_h - k_l)); - - for (i = l_i + sbr->tHFAdj; i < u_i + sbr->tHFAdj; i++) - { - for (j = k_l; j < k_h; j++) - { -#ifdef FIXED_POINT -#ifdef SBR_LOW_POWER - nrg += ((QMF_RE(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_RE(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS); -#else - nrg += ((QMF_RE(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_RE(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS) + - ((QMF_IM(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_IM(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS); -#endif -#else - nrg += MUL_R(QMF_RE(Xsbr[i][j]), QMF_RE(Xsbr[i][j])) -#ifndef SBR_LOW_POWER - + MUL_R(QMF_IM(Xsbr[i][j]), QMF_IM(Xsbr[i][j])) -#endif - ; -#endif - } - } - - sbr->E_curr[ch][k - sbr->kx][l] = nrg / div; -#ifdef SBR_LOW_POWER -#ifdef FIXED_POINT - sbr->E_curr[ch][k - sbr->kx][l] <<= 1; -#else - sbr->E_curr[ch][k - sbr->kx][l] *= 2; -#endif -#endif - } - } - } - } -} - -#ifdef FIXED_POINT -#define EPS (1) /* smallest number available in fixed point */ -#else -#define EPS (1e-12) -#endif - - - -#ifdef FIXED_POINT - -/* log2 values of [0..63] */ -static const real_t log2_int_tab[] = { - LOG2_MIN_INF, REAL_CONST(0.000000000000000), REAL_CONST(1.000000000000000), REAL_CONST(1.584962500721156), - REAL_CONST(2.000000000000000), REAL_CONST(2.321928094887362), REAL_CONST(2.584962500721156), REAL_CONST(2.807354922057604), - REAL_CONST(3.000000000000000), REAL_CONST(3.169925001442313), REAL_CONST(3.321928094887363), REAL_CONST(3.459431618637297), - REAL_CONST(3.584962500721156), REAL_CONST(3.700439718141092), REAL_CONST(3.807354922057604), REAL_CONST(3.906890595608519), - REAL_CONST(4.000000000000000), REAL_CONST(4.087462841250339), REAL_CONST(4.169925001442312), REAL_CONST(4.247927513443585), - REAL_CONST(4.321928094887362), REAL_CONST(4.392317422778761), REAL_CONST(4.459431618637297), REAL_CONST(4.523561956057013), - REAL_CONST(4.584962500721156), REAL_CONST(4.643856189774724), REAL_CONST(4.700439718141093), REAL_CONST(4.754887502163468), - REAL_CONST(4.807354922057604), REAL_CONST(4.857980995127572), REAL_CONST(4.906890595608519), REAL_CONST(4.954196310386875), - REAL_CONST(5.000000000000000), REAL_CONST(5.044394119358453), REAL_CONST(5.087462841250340), REAL_CONST(5.129283016944966), - REAL_CONST(5.169925001442312), REAL_CONST(5.209453365628949), REAL_CONST(5.247927513443585), REAL_CONST(5.285402218862248), - REAL_CONST(5.321928094887363), REAL_CONST(5.357552004618084), REAL_CONST(5.392317422778761), REAL_CONST(5.426264754702098), - REAL_CONST(5.459431618637297), REAL_CONST(5.491853096329675), REAL_CONST(5.523561956057013), REAL_CONST(5.554588851677637), - REAL_CONST(5.584962500721156), REAL_CONST(5.614709844115208), REAL_CONST(5.643856189774724), REAL_CONST(5.672425341971495), - REAL_CONST(5.700439718141093), REAL_CONST(5.727920454563200), REAL_CONST(5.754887502163469), REAL_CONST(5.781359713524660), - REAL_CONST(5.807354922057605), REAL_CONST(5.832890014164742), REAL_CONST(5.857980995127572), REAL_CONST(5.882643049361842), - REAL_CONST(5.906890595608518), REAL_CONST(5.930737337562887), REAL_CONST(5.954196310386876), REAL_CONST(5.977279923499916) -}; - -static const real_t pan_log2_tab[] = { - REAL_CONST(1.000000000000000), REAL_CONST(0.584962500721156), REAL_CONST(0.321928094887362), REAL_CONST(0.169925001442312), REAL_CONST(0.087462841250339), - REAL_CONST(0.044394119358453), REAL_CONST(0.022367813028455), REAL_CONST(0.011227255423254), REAL_CONST(0.005624549193878), REAL_CONST(0.002815015607054), - REAL_CONST(0.001408194392808), REAL_CONST(0.000704269011247), REAL_CONST(0.000352177480301), REAL_CONST(0.000176099486443), REAL_CONST(0.000088052430122), - REAL_CONST(0.000044026886827), REAL_CONST(0.000022013611360), REAL_CONST(0.000011006847667) -}; - -static real_t find_log2_E(sbr_info *sbr, uint8_t k, uint8_t l, uint8_t ch) -{ - /* check for coupled energy/noise data */ - if (sbr->bs_coupling == 1) - { - uint8_t amp0 = (sbr->amp_res[0]) ? 0 : 1; - uint8_t amp1 = (sbr->amp_res[1]) ? 0 : 1; - real_t tmp = (7 << REAL_BITS) + (sbr->E[0][k][l] << (REAL_BITS-amp0)); - real_t pan; - - /* E[1] should always be even so shifting is OK */ - uint8_t E = sbr->E[1][k][l] >> amp1; - - if (ch == 0) - { - if (E > 12) - { - /* negative */ - pan = pan_log2_tab[-12 + E]; - } else { - /* positive */ - pan = pan_log2_tab[12 - E] + ((12 - E)<<REAL_BITS); - } - } else { - if (E < 12) - { - /* negative */ - pan = pan_log2_tab[-E + 12]; - } else { - /* positive */ - pan = pan_log2_tab[E - 12] + ((E - 12)<<REAL_BITS); - } - } - - /* tmp / pan in log2 */ - return tmp - pan; - } else { - uint8_t amp = (sbr->amp_res[ch]) ? 0 : 1; - - return (6 << REAL_BITS) + (sbr->E[ch][k][l] << (REAL_BITS-amp)); - } -} - -static real_t find_log2_Q(sbr_info *sbr, uint8_t k, uint8_t l, uint8_t ch) -{ - /* check for coupled energy/noise data */ - if (sbr->bs_coupling == 1) - { - real_t tmp = (7 << REAL_BITS) - (sbr->Q[0][k][l] << REAL_BITS); - real_t pan; - - uint8_t Q = sbr->Q[1][k][l]; - - if (ch == 0) - { - if (Q > 12) - { - /* negative */ - pan = pan_log2_tab[-12 + Q]; - } else { - /* positive */ - pan = pan_log2_tab[12 - Q] + ((12 - Q)<<REAL_BITS); - } - } else { - if (Q < 12) - { - /* negative */ - pan = pan_log2_tab[-Q + 12]; - } else { - /* positive */ - pan = pan_log2_tab[Q - 12] + ((Q - 12)<<REAL_BITS); - } - } - - /* tmp / pan in log2 */ - return tmp - pan; - } else { - return (6 << REAL_BITS) - (sbr->Q[ch][k][l] << REAL_BITS); - } -} - -static const real_t log_Qplus1_pan[31][13] = { - { REAL_CONST(0.044383447617292), REAL_CONST(0.169768601655960), REAL_CONST(0.583090126514435), REAL_CONST(1.570089221000671), REAL_CONST(3.092446088790894), REAL_CONST(4.733354568481445), REAL_CONST(6.022367954254150), REAL_CONST(6.692092418670654), REAL_CONST(6.924463272094727), REAL_CONST(6.989034175872803), REAL_CONST(7.005646705627441), REAL_CONST(7.009829998016357), REAL_CONST(7.010877609252930) }, - { REAL_CONST(0.022362394258380), REAL_CONST(0.087379962205887), REAL_CONST(0.320804953575134), REAL_CONST(0.988859415054321), REAL_CONST(2.252387046813965), REAL_CONST(3.786596298217773), REAL_CONST(5.044394016265869), REAL_CONST(5.705977916717529), REAL_CONST(5.936291694641113), REAL_CONST(6.000346660614014), REAL_CONST(6.016829967498779), REAL_CONST(6.020981311798096), REAL_CONST(6.022020816802979) }, - { REAL_CONST(0.011224525049329), REAL_CONST(0.044351425021887), REAL_CONST(0.169301137328148), REAL_CONST(0.577544987201691), REAL_CONST(1.527246952056885), REAL_CONST(2.887525320053101), REAL_CONST(4.087462902069092), REAL_CONST(4.733354568481445), REAL_CONST(4.959661006927490), REAL_CONST(5.022709369659424), REAL_CONST(5.038940429687500), REAL_CONST(5.043028831481934), REAL_CONST(5.044052600860596) }, - { REAL_CONST(0.005623178556561), REAL_CONST(0.022346137091517), REAL_CONST(0.087132595479488), REAL_CONST(0.317482173442841), REAL_CONST(0.956931233406067), REAL_CONST(2.070389270782471), REAL_CONST(3.169924974441528), REAL_CONST(3.786596298217773), REAL_CONST(4.005294322967529), REAL_CONST(4.066420555114746), REAL_CONST(4.082170009613037), REAL_CONST(4.086137294769287), REAL_CONST(4.087131500244141) }, - { REAL_CONST(0.002814328996465), REAL_CONST(0.011216334067285), REAL_CONST(0.044224001467228), REAL_CONST(0.167456731200218), REAL_CONST(0.556393325328827), REAL_CONST(1.378511548042297), REAL_CONST(2.321928024291992), REAL_CONST(2.887525320053101), REAL_CONST(3.092446088790894), REAL_CONST(3.150059700012207), REAL_CONST(3.164926528930664), REAL_CONST(3.168673276901245), REAL_CONST(3.169611930847168) }, - { REAL_CONST(0.001407850766554), REAL_CONST(0.005619067233056), REAL_CONST(0.022281449288130), REAL_CONST(0.086156636476517), REAL_CONST(0.304854571819305), REAL_CONST(0.847996890544891), REAL_CONST(1.584962487220764), REAL_CONST(2.070389270782471), REAL_CONST(2.252387046813965), REAL_CONST(2.304061651229858), REAL_CONST(2.317430257797241), REAL_CONST(2.320801734924316), REAL_CONST(2.321646213531494) }, - { REAL_CONST(0.000704097095877), REAL_CONST(0.002812269143760), REAL_CONST(0.011183738708496), REAL_CONST(0.043721374124289), REAL_CONST(0.160464659333229), REAL_CONST(0.485426813364029), REAL_CONST(1.000000000000000), REAL_CONST(1.378511548042297), REAL_CONST(1.527246952056885), REAL_CONST(1.570089221000671), REAL_CONST(1.581215262413025), REAL_CONST(1.584023833274841), REAL_CONST(1.584727644920349) }, - { REAL_CONST(0.000352177477907), REAL_CONST(0.001406819908880), REAL_CONST(0.005602621007711), REAL_CONST(0.022026389837265), REAL_CONST(0.082462236285210), REAL_CONST(0.263034462928772), REAL_CONST(0.584962487220764), REAL_CONST(0.847996890544891), REAL_CONST(0.956931233406067), REAL_CONST(0.988859415054321), REAL_CONST(0.997190535068512), REAL_CONST(0.999296069145203), REAL_CONST(0.999823868274689) }, - { REAL_CONST(0.000176099492819), REAL_CONST(0.000703581434209), REAL_CONST(0.002804030198604), REAL_CONST(0.011055230163038), REAL_CONST(0.041820213198662), REAL_CONST(0.137503549456596), REAL_CONST(0.321928083896637), REAL_CONST(0.485426813364029), REAL_CONST(0.556393325328827), REAL_CONST(0.577544987201691), REAL_CONST(0.583090126514435), REAL_CONST(0.584493279457092), REAL_CONST(0.584845066070557) }, - { REAL_CONST(0.000088052431238), REAL_CONST(0.000351833587047), REAL_CONST(0.001402696361765), REAL_CONST(0.005538204684854), REAL_CONST(0.021061634644866), REAL_CONST(0.070389263331890), REAL_CONST(0.169925004243851), REAL_CONST(0.263034462928772), REAL_CONST(0.304854571819305), REAL_CONST(0.317482173442841), REAL_CONST(0.320804953575134), REAL_CONST(0.321646571159363), REAL_CONST(0.321857661008835) }, - { REAL_CONST(0.000044026888645), REAL_CONST(0.000175927518285), REAL_CONST(0.000701518612914), REAL_CONST(0.002771759871393), REAL_CONST(0.010569252073765), REAL_CONST(0.035623874515295), REAL_CONST(0.087462842464447), REAL_CONST(0.137503549456596), REAL_CONST(0.160464659333229), REAL_CONST(0.167456731200218), REAL_CONST(0.169301137328148), REAL_CONST(0.169768601655960), REAL_CONST(0.169885858893394) }, - { REAL_CONST(0.000022013611670), REAL_CONST(0.000088052431238), REAL_CONST(0.000350801943569), REAL_CONST(0.001386545598507), REAL_CONST(0.005294219125062), REAL_CONST(0.017921976745129), REAL_CONST(0.044394120573997), REAL_CONST(0.070389263331890), REAL_CONST(0.082462236285210), REAL_CONST(0.086156636476517), REAL_CONST(0.087132595479488), REAL_CONST(0.087379962205887), REAL_CONST(0.087442122399807) }, - { REAL_CONST(0.000011006847672), REAL_CONST(0.000044026888645), REAL_CONST(0.000175411638338), REAL_CONST(0.000693439331371), REAL_CONST(0.002649537986144), REAL_CONST(0.008988817222416), REAL_CONST(0.022367812693119), REAL_CONST(0.035623874515295), REAL_CONST(0.041820213198662), REAL_CONST(0.043721374124289), REAL_CONST(0.044224001467228), REAL_CONST(0.044351425021887), REAL_CONST(0.044383447617292) }, - { REAL_CONST(0.000005503434295), REAL_CONST(0.000022013611670), REAL_CONST(0.000087708482170), REAL_CONST(0.000346675369656), REAL_CONST(0.001325377263129), REAL_CONST(0.004501323681325), REAL_CONST(0.011227255687118), REAL_CONST(0.017921976745129), REAL_CONST(0.021061634644866), REAL_CONST(0.022026389837265), REAL_CONST(0.022281449288130), REAL_CONST(0.022346137091517), REAL_CONST(0.022362394258380) }, - { REAL_CONST(0.000002751719876), REAL_CONST(0.000011006847672), REAL_CONST(0.000043854910473), REAL_CONST(0.000173348103999), REAL_CONST(0.000662840844598), REAL_CONST(0.002252417383716), REAL_CONST(0.005624548997730), REAL_CONST(0.008988817222416), REAL_CONST(0.010569252073765), REAL_CONST(0.011055230163038), REAL_CONST(0.011183738708496), REAL_CONST(0.011216334067285), REAL_CONST(0.011224525049329) }, - { REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000022013611670), REAL_CONST(0.000086676649516), REAL_CONST(0.000331544462824), REAL_CONST(0.001126734190620), REAL_CONST(0.002815015614033), REAL_CONST(0.004501323681325), REAL_CONST(0.005294219125062), REAL_CONST(0.005538204684854), REAL_CONST(0.005602621007711), REAL_CONST(0.005619067233056), REAL_CONST(0.005623178556561) }, - { REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000011006847672), REAL_CONST(0.000043338975956), REAL_CONST(0.000165781748365), REAL_CONST(0.000563477107789), REAL_CONST(0.001408194424585), REAL_CONST(0.002252417383716), REAL_CONST(0.002649537986144), REAL_CONST(0.002771759871393), REAL_CONST(0.002804030198604), REAL_CONST(0.002812269143760), REAL_CONST(0.002814328996465) }, - { REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000021669651687), REAL_CONST(0.000082893253420), REAL_CONST(0.000281680084299), REAL_CONST(0.000704268983100), REAL_CONST(0.001126734190620), REAL_CONST(0.001325377263129), REAL_CONST(0.001386545598507), REAL_CONST(0.001402696361765), REAL_CONST(0.001406819908880), REAL_CONST(0.001407850766554) }, - { REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000010834866771), REAL_CONST(0.000041447223339), REAL_CONST(0.000140846910654), REAL_CONST(0.000352177477907), REAL_CONST(0.000563477107789), REAL_CONST(0.000662840844598), REAL_CONST(0.000693439331371), REAL_CONST(0.000701518612914), REAL_CONST(0.000703581434209), REAL_CONST(0.000704097095877) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000020637769921), REAL_CONST(0.000070511166996), REAL_CONST(0.000176099492819), REAL_CONST(0.000281680084299), REAL_CONST(0.000331544462824), REAL_CONST(0.000346675369656), REAL_CONST(0.000350801943569), REAL_CONST(0.000351833587047), REAL_CONST(0.000352177477907) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000010318922250), REAL_CONST(0.000035256012779), REAL_CONST(0.000088052431238), REAL_CONST(0.000140846910654), REAL_CONST(0.000165781748365), REAL_CONST(0.000173348103999), REAL_CONST(0.000175411638338), REAL_CONST(0.000175927518285), REAL_CONST(0.000176099492819) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005159470220), REAL_CONST(0.000017542124624), REAL_CONST(0.000044026888645), REAL_CONST(0.000070511166996), REAL_CONST(0.000082893253420), REAL_CONST(0.000086676649516), REAL_CONST(0.000087708482170), REAL_CONST(0.000088052431238), REAL_CONST(0.000088052431238) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002579737384), REAL_CONST(0.000008771088687), REAL_CONST(0.000022013611670), REAL_CONST(0.000035256012779), REAL_CONST(0.000041447223339), REAL_CONST(0.000043338975956), REAL_CONST(0.000043854910473), REAL_CONST(0.000044026888645), REAL_CONST(0.000044026888645) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000004471542070), REAL_CONST(0.000011006847672), REAL_CONST(0.000017542124624), REAL_CONST(0.000020637769921), REAL_CONST(0.000021669651687), REAL_CONST(0.000022013611670), REAL_CONST(0.000022013611670), REAL_CONST(0.000022013611670) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002235772627), REAL_CONST(0.000005503434295), REAL_CONST(0.000008771088687), REAL_CONST(0.000010318922250), REAL_CONST(0.000010834866771), REAL_CONST(0.000011006847672), REAL_CONST(0.000011006847672), REAL_CONST(0.000011006847672) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001031895522), REAL_CONST(0.000002751719876), REAL_CONST(0.000004471542070), REAL_CONST(0.000005159470220), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000515947875), REAL_CONST(0.000001375860506), REAL_CONST(0.000002235772627), REAL_CONST(0.000002579737384), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000000687930424), REAL_CONST(0.000001031895522), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000343965269), REAL_CONST(0.000000515947875), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634) } -}; - -static const real_t log_Qplus1[31] = { - REAL_CONST(6.022367813028454), REAL_CONST(5.044394119358453), REAL_CONST(4.087462841250339), - REAL_CONST(3.169925001442313), REAL_CONST(2.321928094887362), REAL_CONST(1.584962500721156), - REAL_CONST(1.000000000000000), REAL_CONST(0.584962500721156), REAL_CONST(0.321928094887362), - REAL_CONST(0.169925001442312), REAL_CONST(0.087462841250339), REAL_CONST(0.044394119358453), - REAL_CONST(0.022367813028455), REAL_CONST(0.011227255423254), REAL_CONST(0.005624549193878), - REAL_CONST(0.002815015607054), REAL_CONST(0.001408194392808), REAL_CONST(0.000704269011247), - REAL_CONST(0.000352177480301), REAL_CONST(0.000176099486443), REAL_CONST(0.000088052430122), - REAL_CONST(0.000044026886827), REAL_CONST(0.000022013611360), REAL_CONST(0.000011006847667), - REAL_CONST(0.000005503434331), REAL_CONST(0.000002751719790), REAL_CONST(0.000001375860551), - REAL_CONST(0.000000687930439), REAL_CONST(0.000000343965261), REAL_CONST(0.000000171982641), - REAL_CONST(0.000000000000000) -}; - -static real_t find_log2_Qplus1(sbr_info *sbr, uint8_t k, uint8_t l, uint8_t ch) -{ - /* check for coupled energy/noise data */ - if (sbr->bs_coupling == 1) - { - if ((sbr->Q[0][k][l] >= 0) && (sbr->Q[0][k][l] <= 30) && - (sbr->Q[1][k][l] >= 0) && (sbr->Q[1][k][l] <= 24)) - { - if (ch == 0) - { - return log_Qplus1_pan[sbr->Q[0][k][l]][sbr->Q[1][k][l] >> 1]; - } else { - return log_Qplus1_pan[sbr->Q[0][k][l]][12 - (sbr->Q[1][k][l] >> 1)]; - } - } else { - return 0; - } - } else { - if (sbr->Q[ch][k][l] >= 0 && sbr->Q[ch][k][l] <= 30) - { - return log_Qplus1[sbr->Q[ch][k][l]]; - } else { - return 0; - } - } -} - -static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch) -{ - /* log2 values of limiter gains */ - static real_t limGain[] = { - REAL_CONST(-1.0), REAL_CONST(0.0), REAL_CONST(1.0), REAL_CONST(33.219) - }; - uint8_t m, l, k; - - uint8_t current_t_noise_band = 0; - uint8_t S_mapped; - - ALIGN real_t Q_M_lim[MAX_M]; - ALIGN real_t G_lim[MAX_M]; - ALIGN real_t G_boost; - ALIGN real_t S_M[MAX_M]; - - - for (l = 0; l < sbr->L_E[ch]; l++) - { - uint8_t current_f_noise_band = 0; - uint8_t current_res_band = 0; - uint8_t current_res_band2 = 0; - uint8_t current_hi_res_band = 0; - - real_t delta = (l == sbr->l_A[ch] || l == sbr->prevEnvIsShort[ch]) ? 0 : 1; - - S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); - - if (sbr->t_E[ch][l+1] > sbr->t_Q[ch][current_t_noise_band+1]) - { - current_t_noise_band++; - } - - for (k = 0; k < sbr->N_L[sbr->bs_limiter_bands]; k++) - { - real_t Q_M = 0; - real_t G_max; - real_t den = 0; - real_t acc1 = 0; - real_t acc2 = 0; - uint8_t current_res_band_size = 0; - uint8_t Q_M_size = 0; - - uint8_t ml1, ml2; - - /* bounds of current limiter bands */ - ml1 = sbr->f_table_lim[sbr->bs_limiter_bands][k]; - ml2 = sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; - - - /* calculate the accumulated E_orig and E_curr over the limiter band */ - for (m = ml1; m < ml2; m++) - { - if ((m + sbr->kx) < sbr->f_table_res[sbr->f[ch][l]][current_res_band+1]) - { - current_res_band_size++; - } else { - acc1 += pow2_int(-REAL_CONST(10) + log2_int_tab[current_res_band_size] + find_log2_E(sbr, current_res_band, l, ch)); - - current_res_band++; - current_res_band_size = 1; - } - - acc2 += sbr->E_curr[ch][m][l]; - } - acc1 += pow2_int(-REAL_CONST(10) + log2_int_tab[current_res_band_size] + find_log2_E(sbr, current_res_band, l, ch)); - - - if (acc1 == 0) - acc1 = LOG2_MIN_INF; - else - acc1 = log2_int(acc1); - - - /* calculate the maximum gain */ - /* ratio of the energy of the original signal and the energy - * of the HF generated signal - */ - G_max = acc1 - log2_int(acc2) + limGain[sbr->bs_limiter_gains]; - G_max = min(G_max, limGain[3]); - - - for (m = ml1; m < ml2; m++) - { - real_t G; - real_t E_curr, E_orig; - real_t Q_orig, Q_orig_plus1; - uint8_t S_index_mapped; - - - /* check if m is on a noise band border */ - if ((m + sbr->kx) == sbr->f_table_noise[current_f_noise_band+1]) - { - /* step to next noise band */ - current_f_noise_band++; - } - - - /* check if m is on a resolution band border */ - if ((m + sbr->kx) == sbr->f_table_res[sbr->f[ch][l]][current_res_band2+1]) - { - /* accumulate a whole range of equal Q_Ms */ - if (Q_M_size > 0) - den += pow2_int(log2_int_tab[Q_M_size] + Q_M); - Q_M_size = 0; - - /* step to next resolution band */ - current_res_band2++; - - /* if we move to a new resolution band, we should check if we are - * going to add a sinusoid in this band - */ - S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); - } - - - /* check if m is on a HI_RES band border */ - if ((m + sbr->kx) == sbr->f_table_res[HI_RES][current_hi_res_band+1]) - { - /* step to next HI_RES band */ - current_hi_res_band++; - } - - - /* find S_index_mapped - * S_index_mapped can only be 1 for the m in the middle of the - * current HI_RES band - */ - S_index_mapped = 0; - if ((l >= sbr->l_A[ch]) || - (sbr->bs_add_harmonic_prev[ch][current_hi_res_band] && sbr->bs_add_harmonic_flag_prev[ch])) - { - /* find the middle subband of the HI_RES frequency band */ - if ((m + sbr->kx) == (sbr->f_table_res[HI_RES][current_hi_res_band+1] + sbr->f_table_res[HI_RES][current_hi_res_band]) >> 1) - S_index_mapped = sbr->bs_add_harmonic[ch][current_hi_res_band]; - } - - - /* find bitstream parameters */ - if (sbr->E_curr[ch][m][l] == 0) - E_curr = LOG2_MIN_INF; - else - E_curr = log2_int(sbr->E_curr[ch][m][l]); - E_orig = -REAL_CONST(10) + find_log2_E(sbr, current_res_band2, l, ch); - - - Q_orig = find_log2_Q(sbr, current_f_noise_band, current_t_noise_band, ch); - Q_orig_plus1 = find_log2_Qplus1(sbr, current_f_noise_band, current_t_noise_band, ch); - - - /* Q_M only depends on E_orig and Q_div2: - * since N_Q <= N_Low <= N_High we only need to recalculate Q_M on - * a change of current res band (HI or LO) - */ - Q_M = E_orig + Q_orig - Q_orig_plus1; - - - /* S_M only depends on E_orig, Q_div and S_index_mapped: - * S_index_mapped can only be non-zero once per HI_RES band - */ - if (S_index_mapped == 0) - { - S_M[m] = LOG2_MIN_INF; /* -inf */ - } else { - S_M[m] = E_orig - Q_orig_plus1; - - /* accumulate sinusoid part of the total energy */ - den += pow2_int(S_M[m]); - } - - - /* calculate gain */ - /* ratio of the energy of the original signal and the energy - * of the HF generated signal - */ - /* E_curr here is officially E_curr+1 so the log2() of that can never be < 0 */ - /* scaled by -10 */ - G = E_orig - max(-REAL_CONST(10), E_curr); - if ((S_mapped == 0) && (delta == 1)) - { - /* G = G * 1/(1+Q) */ - G -= Q_orig_plus1; - } else if (S_mapped == 1) { - /* G = G * Q/(1+Q) */ - G += Q_orig - Q_orig_plus1; - } - - - /* limit the additional noise energy level */ - /* and apply the limiter */ - if (G_max > G) - { - Q_M_lim[m] = Q_M; - G_lim[m] = G; - - if ((S_index_mapped == 0) && (l != sbr->l_A[ch])) - { - Q_M_size++; - } - } else { - /* G > G_max */ - Q_M_lim[m] = Q_M + G_max - G; - G_lim[m] = G_max; - - /* accumulate limited Q_M */ - if ((S_index_mapped == 0) && (l != sbr->l_A[ch])) - { - den += pow2_int(Q_M_lim[m]); - } - } - - - /* accumulate the total energy */ - /* E_curr changes for every m so we do need to accumulate every m */ - den += pow2_int(E_curr + G_lim[m]); - } - - /* accumulate last range of equal Q_Ms */ - if (Q_M_size > 0) - { - den += pow2_int(log2_int_tab[Q_M_size] + Q_M); - } - - - /* calculate the final gain */ - /* G_boost: [0..2.51188643] */ - G_boost = acc1 - log2_int(den /*+ EPS*/); - G_boost = min(G_boost, REAL_CONST(1.328771237) /* log2(1.584893192 ^ 2) */); - - - for (m = ml1; m < ml2; m++) - { - /* apply compensation to gain, noise floor sf's and sinusoid levels */ -#ifndef SBR_LOW_POWER - adj->G_lim_boost[l][m] = pow2_fix((G_lim[m] + G_boost) >> 1); -#else - /* sqrt() will be done after the aliasing reduction to save a - * few multiplies - */ - adj->G_lim_boost[l][m] = pow2_fix(G_lim[m] + G_boost); -#endif - adj->Q_M_lim_boost[l][m] = pow2_fix((Q_M_lim[m] + G_boost) >> 1); - - if (S_M[m] != LOG2_MIN_INF) - { - adj->S_M_boost[l][m] = pow2_int((S_M[m] + G_boost) >> 1); - } else { - adj->S_M_boost[l][m] = 0; - } - } - } - } -} - -#else - -//#define LOG2_TEST - -#ifdef LOG2_TEST - -#define LOG2_MIN_INF -100000 - -__inline float pow2(float val) -{ - return pow(2.0, val); -} -__inline float log2(float val) -{ - return log(val)/log(2.0); -} - -#define RB 14 - -float QUANTISE2REAL(float val) -{ - __int32 ival = (__int32)(val * (1<<RB)); - return (float)ival / (float)((1<<RB)); -} - -float QUANTISE2INT(float val) -{ - return floor(val); -} - -/* log2 values of [0..63] */ -static const real_t log2_int_tab[] = { - LOG2_MIN_INF, 0.000000000000000, 1.000000000000000, 1.584962500721156, - 2.000000000000000, 2.321928094887362, 2.584962500721156, 2.807354922057604, - 3.000000000000000, 3.169925001442313, 3.321928094887363, 3.459431618637297, - 3.584962500721156, 3.700439718141092, 3.807354922057604, 3.906890595608519, - 4.000000000000000, 4.087462841250339, 4.169925001442312, 4.247927513443585, - 4.321928094887362, 4.392317422778761, 4.459431618637297, 4.523561956057013, - 4.584962500721156, 4.643856189774724, 4.700439718141093, 4.754887502163468, - 4.807354922057604, 4.857980995127572, 4.906890595608519, 4.954196310386875, - 5.000000000000000, 5.044394119358453, 5.087462841250340, 5.129283016944966, - 5.169925001442312, 5.209453365628949, 5.247927513443585, 5.285402218862248, - 5.321928094887363, 5.357552004618084, 5.392317422778761, 5.426264754702098, - 5.459431618637297, 5.491853096329675, 5.523561956057013, 5.554588851677637, - 5.584962500721156, 5.614709844115208, 5.643856189774724, 5.672425341971495, - 5.700439718141093, 5.727920454563200, 5.754887502163469, 5.781359713524660, - 5.807354922057605, 5.832890014164742, 5.857980995127572, 5.882643049361842, - 5.906890595608518, 5.930737337562887, 5.954196310386876, 5.977279923499916 -}; - -static const real_t pan_log2_tab[] = { - 1.000000000000000, 0.584962500721156, 0.321928094887362, 0.169925001442312, 0.087462841250339, - 0.044394119358453, 0.022367813028455, 0.011227255423254, 0.005624549193878, 0.002815015607054, - 0.001408194392808, 0.000704269011247, 0.000352177480301, 0.000176099486443, 0.000088052430122, - 0.000044026886827, 0.000022013611360, 0.000011006847667 -}; - -static real_t find_log2_E(sbr_info *sbr, uint8_t k, uint8_t l, uint8_t ch) -{ - /* check for coupled energy/noise data */ - if (sbr->bs_coupling == 1) - { - real_t amp0 = (sbr->amp_res[0]) ? 1.0 : 0.5; - real_t amp1 = (sbr->amp_res[1]) ? 1.0 : 0.5; - float tmp = QUANTISE2REAL(7.0 + (real_t)sbr->E[0][k][l] * amp0); - float pan; - - int E = (int)(sbr->E[1][k][l] * amp1); - - if (ch == 0) - { - if (E > 12) - { - /* negative */ - pan = QUANTISE2REAL(pan_log2_tab[-12 + E]); - } else { - /* positive */ - pan = QUANTISE2REAL(pan_log2_tab[12 - E] + (12 - E)); - } - } else { - if (E < 12) - { - /* negative */ - pan = QUANTISE2REAL(pan_log2_tab[-E + 12]); - } else { - /* positive */ - pan = QUANTISE2REAL(pan_log2_tab[E - 12] + (E - 12)); - } - } - - /* tmp / pan in log2 */ - return QUANTISE2REAL(tmp - pan); - } else { - real_t amp = (sbr->amp_res[ch]) ? 1.0 : 0.5; - - return QUANTISE2REAL(6.0 + (real_t)sbr->E[ch][k][l] * amp); - } -} - -static real_t find_log2_Q(sbr_info *sbr, uint8_t k, uint8_t l, uint8_t ch) -{ - /* check for coupled energy/noise data */ - if (sbr->bs_coupling == 1) - { - float tmp = QUANTISE2REAL(7.0 - (real_t)sbr->Q[0][k][l]); - float pan; - - int Q = (int)(sbr->Q[1][k][l]); - - if (ch == 0) - { - if (Q > 12) - { - /* negative */ - pan = QUANTISE2REAL(pan_log2_tab[-12 + Q]); - } else { - /* positive */ - pan = QUANTISE2REAL(pan_log2_tab[12 - Q] + (12 - Q)); - } - } else { - if (Q < 12) - { - /* negative */ - pan = QUANTISE2REAL(pan_log2_tab[-Q + 12]); - } else { - /* positive */ - pan = QUANTISE2REAL(pan_log2_tab[Q - 12] + (Q - 12)); - } - } - - /* tmp / pan in log2 */ - return QUANTISE2REAL(tmp - pan); - } else { - return QUANTISE2REAL(6.0 - (real_t)sbr->Q[ch][k][l]); - } -} - -static const real_t log_Qplus1_pan[31][13] = { - { REAL_CONST(0.044383447617292), REAL_CONST(0.169768601655960), REAL_CONST(0.583090126514435), REAL_CONST(1.570089221000671), REAL_CONST(3.092446088790894), REAL_CONST(4.733354568481445), REAL_CONST(6.022367954254150), REAL_CONST(6.692092418670654), REAL_CONST(6.924463272094727), REAL_CONST(6.989034175872803), REAL_CONST(7.005646705627441), REAL_CONST(7.009829998016357), REAL_CONST(7.010877609252930) }, - { REAL_CONST(0.022362394258380), REAL_CONST(0.087379962205887), REAL_CONST(0.320804953575134), REAL_CONST(0.988859415054321), REAL_CONST(2.252387046813965), REAL_CONST(3.786596298217773), REAL_CONST(5.044394016265869), REAL_CONST(5.705977916717529), REAL_CONST(5.936291694641113), REAL_CONST(6.000346660614014), REAL_CONST(6.016829967498779), REAL_CONST(6.020981311798096), REAL_CONST(6.022020816802979) }, - { REAL_CONST(0.011224525049329), REAL_CONST(0.044351425021887), REAL_CONST(0.169301137328148), REAL_CONST(0.577544987201691), REAL_CONST(1.527246952056885), REAL_CONST(2.887525320053101), REAL_CONST(4.087462902069092), REAL_CONST(4.733354568481445), REAL_CONST(4.959661006927490), REAL_CONST(5.022709369659424), REAL_CONST(5.038940429687500), REAL_CONST(5.043028831481934), REAL_CONST(5.044052600860596) }, - { REAL_CONST(0.005623178556561), REAL_CONST(0.022346137091517), REAL_CONST(0.087132595479488), REAL_CONST(0.317482173442841), REAL_CONST(0.956931233406067), REAL_CONST(2.070389270782471), REAL_CONST(3.169924974441528), REAL_CONST(3.786596298217773), REAL_CONST(4.005294322967529), REAL_CONST(4.066420555114746), REAL_CONST(4.082170009613037), REAL_CONST(4.086137294769287), REAL_CONST(4.087131500244141) }, - { REAL_CONST(0.002814328996465), REAL_CONST(0.011216334067285), REAL_CONST(0.044224001467228), REAL_CONST(0.167456731200218), REAL_CONST(0.556393325328827), REAL_CONST(1.378511548042297), REAL_CONST(2.321928024291992), REAL_CONST(2.887525320053101), REAL_CONST(3.092446088790894), REAL_CONST(3.150059700012207), REAL_CONST(3.164926528930664), REAL_CONST(3.168673276901245), REAL_CONST(3.169611930847168) }, - { REAL_CONST(0.001407850766554), REAL_CONST(0.005619067233056), REAL_CONST(0.022281449288130), REAL_CONST(0.086156636476517), REAL_CONST(0.304854571819305), REAL_CONST(0.847996890544891), REAL_CONST(1.584962487220764), REAL_CONST(2.070389270782471), REAL_CONST(2.252387046813965), REAL_CONST(2.304061651229858), REAL_CONST(2.317430257797241), REAL_CONST(2.320801734924316), REAL_CONST(2.321646213531494) }, - { REAL_CONST(0.000704097095877), REAL_CONST(0.002812269143760), REAL_CONST(0.011183738708496), REAL_CONST(0.043721374124289), REAL_CONST(0.160464659333229), REAL_CONST(0.485426813364029), REAL_CONST(1.000000000000000), REAL_CONST(1.378511548042297), REAL_CONST(1.527246952056885), REAL_CONST(1.570089221000671), REAL_CONST(1.581215262413025), REAL_CONST(1.584023833274841), REAL_CONST(1.584727644920349) }, - { REAL_CONST(0.000352177477907), REAL_CONST(0.001406819908880), REAL_CONST(0.005602621007711), REAL_CONST(0.022026389837265), REAL_CONST(0.082462236285210), REAL_CONST(0.263034462928772), REAL_CONST(0.584962487220764), REAL_CONST(0.847996890544891), REAL_CONST(0.956931233406067), REAL_CONST(0.988859415054321), REAL_CONST(0.997190535068512), REAL_CONST(0.999296069145203), REAL_CONST(0.999823868274689) }, - { REAL_CONST(0.000176099492819), REAL_CONST(0.000703581434209), REAL_CONST(0.002804030198604), REAL_CONST(0.011055230163038), REAL_CONST(0.041820213198662), REAL_CONST(0.137503549456596), REAL_CONST(0.321928083896637), REAL_CONST(0.485426813364029), REAL_CONST(0.556393325328827), REAL_CONST(0.577544987201691), REAL_CONST(0.583090126514435), REAL_CONST(0.584493279457092), REAL_CONST(0.584845066070557) }, - { REAL_CONST(0.000088052431238), REAL_CONST(0.000351833587047), REAL_CONST(0.001402696361765), REAL_CONST(0.005538204684854), REAL_CONST(0.021061634644866), REAL_CONST(0.070389263331890), REAL_CONST(0.169925004243851), REAL_CONST(0.263034462928772), REAL_CONST(0.304854571819305), REAL_CONST(0.317482173442841), REAL_CONST(0.320804953575134), REAL_CONST(0.321646571159363), REAL_CONST(0.321857661008835) }, - { REAL_CONST(0.000044026888645), REAL_CONST(0.000175927518285), REAL_CONST(0.000701518612914), REAL_CONST(0.002771759871393), REAL_CONST(0.010569252073765), REAL_CONST(0.035623874515295), REAL_CONST(0.087462842464447), REAL_CONST(0.137503549456596), REAL_CONST(0.160464659333229), REAL_CONST(0.167456731200218), REAL_CONST(0.169301137328148), REAL_CONST(0.169768601655960), REAL_CONST(0.169885858893394) }, - { REAL_CONST(0.000022013611670), REAL_CONST(0.000088052431238), REAL_CONST(0.000350801943569), REAL_CONST(0.001386545598507), REAL_CONST(0.005294219125062), REAL_CONST(0.017921976745129), REAL_CONST(0.044394120573997), REAL_CONST(0.070389263331890), REAL_CONST(0.082462236285210), REAL_CONST(0.086156636476517), REAL_CONST(0.087132595479488), REAL_CONST(0.087379962205887), REAL_CONST(0.087442122399807) }, - { REAL_CONST(0.000011006847672), REAL_CONST(0.000044026888645), REAL_CONST(0.000175411638338), REAL_CONST(0.000693439331371), REAL_CONST(0.002649537986144), REAL_CONST(0.008988817222416), REAL_CONST(0.022367812693119), REAL_CONST(0.035623874515295), REAL_CONST(0.041820213198662), REAL_CONST(0.043721374124289), REAL_CONST(0.044224001467228), REAL_CONST(0.044351425021887), REAL_CONST(0.044383447617292) }, - { REAL_CONST(0.000005503434295), REAL_CONST(0.000022013611670), REAL_CONST(0.000087708482170), REAL_CONST(0.000346675369656), REAL_CONST(0.001325377263129), REAL_CONST(0.004501323681325), REAL_CONST(0.011227255687118), REAL_CONST(0.017921976745129), REAL_CONST(0.021061634644866), REAL_CONST(0.022026389837265), REAL_CONST(0.022281449288130), REAL_CONST(0.022346137091517), REAL_CONST(0.022362394258380) }, - { REAL_CONST(0.000002751719876), REAL_CONST(0.000011006847672), REAL_CONST(0.000043854910473), REAL_CONST(0.000173348103999), REAL_CONST(0.000662840844598), REAL_CONST(0.002252417383716), REAL_CONST(0.005624548997730), REAL_CONST(0.008988817222416), REAL_CONST(0.010569252073765), REAL_CONST(0.011055230163038), REAL_CONST(0.011183738708496), REAL_CONST(0.011216334067285), REAL_CONST(0.011224525049329) }, - { REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000022013611670), REAL_CONST(0.000086676649516), REAL_CONST(0.000331544462824), REAL_CONST(0.001126734190620), REAL_CONST(0.002815015614033), REAL_CONST(0.004501323681325), REAL_CONST(0.005294219125062), REAL_CONST(0.005538204684854), REAL_CONST(0.005602621007711), REAL_CONST(0.005619067233056), REAL_CONST(0.005623178556561) }, - { REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000011006847672), REAL_CONST(0.000043338975956), REAL_CONST(0.000165781748365), REAL_CONST(0.000563477107789), REAL_CONST(0.001408194424585), REAL_CONST(0.002252417383716), REAL_CONST(0.002649537986144), REAL_CONST(0.002771759871393), REAL_CONST(0.002804030198604), REAL_CONST(0.002812269143760), REAL_CONST(0.002814328996465) }, - { REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000021669651687), REAL_CONST(0.000082893253420), REAL_CONST(0.000281680084299), REAL_CONST(0.000704268983100), REAL_CONST(0.001126734190620), REAL_CONST(0.001325377263129), REAL_CONST(0.001386545598507), REAL_CONST(0.001402696361765), REAL_CONST(0.001406819908880), REAL_CONST(0.001407850766554) }, - { REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000010834866771), REAL_CONST(0.000041447223339), REAL_CONST(0.000140846910654), REAL_CONST(0.000352177477907), REAL_CONST(0.000563477107789), REAL_CONST(0.000662840844598), REAL_CONST(0.000693439331371), REAL_CONST(0.000701518612914), REAL_CONST(0.000703581434209), REAL_CONST(0.000704097095877) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000020637769921), REAL_CONST(0.000070511166996), REAL_CONST(0.000176099492819), REAL_CONST(0.000281680084299), REAL_CONST(0.000331544462824), REAL_CONST(0.000346675369656), REAL_CONST(0.000350801943569), REAL_CONST(0.000351833587047), REAL_CONST(0.000352177477907) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000010318922250), REAL_CONST(0.000035256012779), REAL_CONST(0.000088052431238), REAL_CONST(0.000140846910654), REAL_CONST(0.000165781748365), REAL_CONST(0.000173348103999), REAL_CONST(0.000175411638338), REAL_CONST(0.000175927518285), REAL_CONST(0.000176099492819) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005159470220), REAL_CONST(0.000017542124624), REAL_CONST(0.000044026888645), REAL_CONST(0.000070511166996), REAL_CONST(0.000082893253420), REAL_CONST(0.000086676649516), REAL_CONST(0.000087708482170), REAL_CONST(0.000088052431238), REAL_CONST(0.000088052431238) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002579737384), REAL_CONST(0.000008771088687), REAL_CONST(0.000022013611670), REAL_CONST(0.000035256012779), REAL_CONST(0.000041447223339), REAL_CONST(0.000043338975956), REAL_CONST(0.000043854910473), REAL_CONST(0.000044026888645), REAL_CONST(0.000044026888645) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000004471542070), REAL_CONST(0.000011006847672), REAL_CONST(0.000017542124624), REAL_CONST(0.000020637769921), REAL_CONST(0.000021669651687), REAL_CONST(0.000022013611670), REAL_CONST(0.000022013611670), REAL_CONST(0.000022013611670) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002235772627), REAL_CONST(0.000005503434295), REAL_CONST(0.000008771088687), REAL_CONST(0.000010318922250), REAL_CONST(0.000010834866771), REAL_CONST(0.000011006847672), REAL_CONST(0.000011006847672), REAL_CONST(0.000011006847672) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001031895522), REAL_CONST(0.000002751719876), REAL_CONST(0.000004471542070), REAL_CONST(0.000005159470220), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000515947875), REAL_CONST(0.000001375860506), REAL_CONST(0.000002235772627), REAL_CONST(0.000002579737384), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000000687930424), REAL_CONST(0.000001031895522), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000343965269), REAL_CONST(0.000000515947875), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269) }, - { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634) } -}; - -static const real_t log_Qplus1[31] = { - REAL_CONST(6.022367813028454), REAL_CONST(5.044394119358453), REAL_CONST(4.087462841250339), - REAL_CONST(3.169925001442313), REAL_CONST(2.321928094887362), REAL_CONST(1.584962500721156), - REAL_CONST(1.000000000000000), REAL_CONST(0.584962500721156), REAL_CONST(0.321928094887362), - REAL_CONST(0.169925001442312), REAL_CONST(0.087462841250339), REAL_CONST(0.044394119358453), - REAL_CONST(0.022367813028455), REAL_CONST(0.011227255423254), REAL_CONST(0.005624549193878), - REAL_CONST(0.002815015607054), REAL_CONST(0.001408194392808), REAL_CONST(0.000704269011247), - REAL_CONST(0.000352177480301), REAL_CONST(0.000176099486443), REAL_CONST(0.000088052430122), - REAL_CONST(0.000044026886827), REAL_CONST(0.000022013611360), REAL_CONST(0.000011006847667), - REAL_CONST(0.000005503434331), REAL_CONST(0.000002751719790), REAL_CONST(0.000001375860551), - REAL_CONST(0.000000687930439), REAL_CONST(0.000000343965261), REAL_CONST(0.000000171982641), - REAL_CONST(0.000000000000000) -}; - -static real_t find_log2_Qplus1(sbr_info *sbr, uint8_t k, uint8_t l, uint8_t ch) -{ - /* check for coupled energy/noise data */ - if (sbr->bs_coupling == 1) - { - if ((sbr->Q[0][k][l] >= 0) && (sbr->Q[0][k][l] <= 30) && - (sbr->Q[1][k][l] >= 0) && (sbr->Q[1][k][l] <= 24)) - { - if (ch == 0) - { - return QUANTISE2REAL(log_Qplus1_pan[sbr->Q[0][k][l]][sbr->Q[1][k][l] >> 1]); - } else { - return QUANTISE2REAL(log_Qplus1_pan[sbr->Q[0][k][l]][12 - (sbr->Q[1][k][l] >> 1)]); - } - } else { - return 0; - } - } else { - if (sbr->Q[ch][k][l] >= 0 && sbr->Q[ch][k][l] <= 30) - { - return QUANTISE2REAL(log_Qplus1[sbr->Q[ch][k][l]]); - } else { - return 0; - } - } -} - -static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch) -{ - /* log2 values of limiter gains */ - static real_t limGain[] = { -1.0, 0.0, 1.0, 33.219 }; - uint8_t m, l, k; - - uint8_t current_t_noise_band = 0; - uint8_t S_mapped; - - ALIGN real_t Q_M_lim[MAX_M]; - ALIGN real_t G_lim[MAX_M]; - ALIGN real_t G_boost; - ALIGN real_t S_M[MAX_M]; - - - for (l = 0; l < sbr->L_E[ch]; l++) - { - uint8_t current_f_noise_band = 0; - uint8_t current_res_band = 0; - uint8_t current_res_band2 = 0; - uint8_t current_hi_res_band = 0; - - real_t delta = (l == sbr->l_A[ch] || l == sbr->prevEnvIsShort[ch]) ? 0 : 1; - - S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); - - if (sbr->t_E[ch][l+1] > sbr->t_Q[ch][current_t_noise_band+1]) - { - current_t_noise_band++; - } - - for (k = 0; k < sbr->N_L[sbr->bs_limiter_bands]; k++) - { - real_t Q_M = 0; - real_t G_max; - real_t den = 0; - real_t acc1 = 0; - real_t acc2 = 0; - uint8_t current_res_band_size = 0; - uint8_t Q_M_size = 0; - - uint8_t ml1, ml2; - - /* bounds of current limiter bands */ - ml1 = sbr->f_table_lim[sbr->bs_limiter_bands][k]; - ml2 = sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; - - - /* calculate the accumulated E_orig and E_curr over the limiter band */ - for (m = ml1; m < ml2; m++) - { - if ((m + sbr->kx) < sbr->f_table_res[sbr->f[ch][l]][current_res_band+1]) - { - current_res_band_size++; - } else { - acc1 += QUANTISE2INT(pow2(-10 + log2_int_tab[current_res_band_size] + find_log2_E(sbr, current_res_band, l, ch))); - - current_res_band++; - current_res_band_size = 1; - } - - acc2 += QUANTISE2INT(sbr->E_curr[ch][m][l]/1024.0); - } - acc1 += QUANTISE2INT(pow2(-10 + log2_int_tab[current_res_band_size] + find_log2_E(sbr, current_res_band, l, ch))); - - acc1 = QUANTISE2REAL( log2(EPS + acc1) ); - - - /* calculate the maximum gain */ - /* ratio of the energy of the original signal and the energy - * of the HF generated signal - */ - G_max = acc1 - QUANTISE2REAL(log2(EPS + acc2)) + QUANTISE2REAL(limGain[sbr->bs_limiter_gains]); - G_max = min(G_max, QUANTISE2REAL(limGain[3])); - - - for (m = ml1; m < ml2; m++) - { - real_t G; - real_t E_curr, E_orig; - real_t Q_orig, Q_orig_plus1; - uint8_t S_index_mapped; - - - /* check if m is on a noise band border */ - if ((m + sbr->kx) == sbr->f_table_noise[current_f_noise_band+1]) - { - /* step to next noise band */ - current_f_noise_band++; - } - - - /* check if m is on a resolution band border */ - if ((m + sbr->kx) == sbr->f_table_res[sbr->f[ch][l]][current_res_band2+1]) - { - /* accumulate a whole range of equal Q_Ms */ - if (Q_M_size > 0) - den += QUANTISE2INT(pow2(log2_int_tab[Q_M_size] + Q_M)); - Q_M_size = 0; - - /* step to next resolution band */ - current_res_band2++; - - /* if we move to a new resolution band, we should check if we are - * going to add a sinusoid in this band - */ - S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); - } - - - /* check if m is on a HI_RES band border */ - if ((m + sbr->kx) == sbr->f_table_res[HI_RES][current_hi_res_band+1]) - { - /* step to next HI_RES band */ - current_hi_res_band++; - } - - - /* find S_index_mapped - * S_index_mapped can only be 1 for the m in the middle of the - * current HI_RES band - */ - S_index_mapped = 0; - if ((l >= sbr->l_A[ch]) || - (sbr->bs_add_harmonic_prev[ch][current_hi_res_band] && sbr->bs_add_harmonic_flag_prev[ch])) - { - /* find the middle subband of the HI_RES frequency band */ - if ((m + sbr->kx) == (sbr->f_table_res[HI_RES][current_hi_res_band+1] + sbr->f_table_res[HI_RES][current_hi_res_band]) >> 1) - S_index_mapped = sbr->bs_add_harmonic[ch][current_hi_res_band]; - } - - - /* find bitstream parameters */ - if (sbr->E_curr[ch][m][l] == 0) - E_curr = LOG2_MIN_INF; - else - E_curr = -10 + log2(sbr->E_curr[ch][m][l]); - E_orig = -10 + find_log2_E(sbr, current_res_band2, l, ch); - - Q_orig = find_log2_Q(sbr, current_f_noise_band, current_t_noise_band, ch); - Q_orig_plus1 = find_log2_Qplus1(sbr, current_f_noise_band, current_t_noise_band, ch); - - - /* Q_M only depends on E_orig and Q_div2: - * since N_Q <= N_Low <= N_High we only need to recalculate Q_M on - * a change of current res band (HI or LO) - */ - Q_M = E_orig + Q_orig - Q_orig_plus1; - - - /* S_M only depends on E_orig, Q_div and S_index_mapped: - * S_index_mapped can only be non-zero once per HI_RES band - */ - if (S_index_mapped == 0) - { - S_M[m] = LOG2_MIN_INF; /* -inf */ - } else { - S_M[m] = E_orig - Q_orig_plus1; - - /* accumulate sinusoid part of the total energy */ - den += pow2(S_M[m]); - } - - - /* calculate gain */ - /* ratio of the energy of the original signal and the energy - * of the HF generated signal - */ - /* E_curr here is officially E_curr+1 so the log2() of that can never be < 0 */ - /* scaled by -10 */ - G = E_orig - max(-10, E_curr); - if ((S_mapped == 0) && (delta == 1)) - { - /* G = G * 1/(1+Q) */ - G -= Q_orig_plus1; - } else if (S_mapped == 1) { - /* G = G * Q/(1+Q) */ - G += Q_orig - Q_orig_plus1; - } - - - /* limit the additional noise energy level */ - /* and apply the limiter */ - if (G_max > G) - { - Q_M_lim[m] = QUANTISE2REAL(Q_M); - G_lim[m] = QUANTISE2REAL(G); - - if ((S_index_mapped == 0) && (l != sbr->l_A[ch])) - { - Q_M_size++; - } - } else { - /* G > G_max */ - Q_M_lim[m] = QUANTISE2REAL(Q_M) + G_max - QUANTISE2REAL(G); - G_lim[m] = G_max; - - /* accumulate limited Q_M */ - if ((S_index_mapped == 0) && (l != sbr->l_A[ch])) - { - den += QUANTISE2INT(pow2(Q_M_lim[m])); - } - } - - - /* accumulate the total energy */ - /* E_curr changes for every m so we do need to accumulate every m */ - den += QUANTISE2INT(pow2(E_curr + G_lim[m])); - } - - /* accumulate last range of equal Q_Ms */ - if (Q_M_size > 0) - { - den += QUANTISE2INT(pow2(log2_int_tab[Q_M_size] + Q_M)); - } - - - /* calculate the final gain */ - /* G_boost: [0..2.51188643] */ - G_boost = acc1 - QUANTISE2REAL(log2(den + EPS)); - G_boost = min(G_boost, QUANTISE2REAL(1.328771237) /* log2(1.584893192 ^ 2) */); - - - for (m = ml1; m < ml2; m++) - { - /* apply compensation to gain, noise floor sf's and sinusoid levels */ -#ifndef SBR_LOW_POWER - adj->G_lim_boost[l][m] = QUANTISE2REAL(pow2((G_lim[m] + G_boost) / 2.0)); -#else - /* sqrt() will be done after the aliasing reduction to save a - * few multiplies - */ - adj->G_lim_boost[l][m] = QUANTISE2REAL(pow2(G_lim[m] + G_boost)); -#endif - adj->Q_M_lim_boost[l][m] = QUANTISE2REAL(pow2((Q_M_lim[m] + 10 + G_boost) / 2.0)); - - if (S_M[m] != LOG2_MIN_INF) - { - adj->S_M_boost[l][m] = QUANTISE2REAL(pow2((S_M[m] + 10 + G_boost) / 2.0)); - } else { - adj->S_M_boost[l][m] = 0; - } - } - } - } -} - -#else - -static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch) -{ - static real_t limGain[] = { 0.5, 1.0, 2.0, 1e10 }; - uint8_t m, l, k; - - uint8_t current_t_noise_band = 0; - uint8_t S_mapped; - - ALIGN real_t Q_M_lim[MAX_M]; - ALIGN real_t G_lim[MAX_M]; - ALIGN real_t G_boost; - ALIGN real_t S_M[MAX_M]; - - for (l = 0; l < sbr->L_E[ch]; l++) - { - uint8_t current_f_noise_band = 0; - uint8_t current_res_band = 0; - uint8_t current_res_band2 = 0; - uint8_t current_hi_res_band = 0; - - real_t delta = (l == sbr->l_A[ch] || l == sbr->prevEnvIsShort[ch]) ? 0 : 1; - - S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); - - if (sbr->t_E[ch][l+1] > sbr->t_Q[ch][current_t_noise_band+1]) - { - current_t_noise_band++; - } - - for (k = 0; k < sbr->N_L[sbr->bs_limiter_bands]; k++) - { - real_t G_max; - real_t den = 0; - real_t acc1 = 0; - real_t acc2 = 0; - uint8_t current_res_band_size = 0; - - uint8_t ml1, ml2; - - ml1 = sbr->f_table_lim[sbr->bs_limiter_bands][k]; - ml2 = sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; - - - /* calculate the accumulated E_orig and E_curr over the limiter band */ - for (m = ml1; m < ml2; m++) - { - if ((m + sbr->kx) == sbr->f_table_res[sbr->f[ch][l]][current_res_band+1]) - { - current_res_band++; - } - acc1 += sbr->E_orig[ch][current_res_band][l]; - acc2 += sbr->E_curr[ch][m][l]; - } - - - /* calculate the maximum gain */ - /* ratio of the energy of the original signal and the energy - * of the HF generated signal - */ - G_max = ((EPS + acc1) / (EPS + acc2)) * limGain[sbr->bs_limiter_gains]; - G_max = min(G_max, 1e10); - - - for (m = ml1; m < ml2; m++) - { - real_t Q_M, G; - real_t Q_div, Q_div2; - uint8_t S_index_mapped; - - - /* check if m is on a noise band border */ - if ((m + sbr->kx) == sbr->f_table_noise[current_f_noise_band+1]) - { - /* step to next noise band */ - current_f_noise_band++; - } - - - /* check if m is on a resolution band border */ - if ((m + sbr->kx) == sbr->f_table_res[sbr->f[ch][l]][current_res_band2+1]) - { - /* step to next resolution band */ - current_res_band2++; - - /* if we move to a new resolution band, we should check if we are - * going to add a sinusoid in this band - */ - S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); - } - - - /* check if m is on a HI_RES band border */ - if ((m + sbr->kx) == sbr->f_table_res[HI_RES][current_hi_res_band+1]) - { - /* step to next HI_RES band */ - current_hi_res_band++; - } - - - /* find S_index_mapped - * S_index_mapped can only be 1 for the m in the middle of the - * current HI_RES band - */ - S_index_mapped = 0; - if ((l >= sbr->l_A[ch]) || - (sbr->bs_add_harmonic_prev[ch][current_hi_res_band] && sbr->bs_add_harmonic_flag_prev[ch])) - { - /* find the middle subband of the HI_RES frequency band */ - if ((m + sbr->kx) == (sbr->f_table_res[HI_RES][current_hi_res_band+1] + sbr->f_table_res[HI_RES][current_hi_res_band]) >> 1) - S_index_mapped = sbr->bs_add_harmonic[ch][current_hi_res_band]; - } - - - /* Q_div: [0..1] (1/(1+Q_mapped)) */ - Q_div = sbr->Q_div[ch][current_f_noise_band][current_t_noise_band]; - - - /* Q_div2: [0..1] (Q_mapped/(1+Q_mapped)) */ - Q_div2 = sbr->Q_div2[ch][current_f_noise_band][current_t_noise_band]; - - - /* Q_M only depends on E_orig and Q_div2: - * since N_Q <= N_Low <= N_High we only need to recalculate Q_M on - * a change of current noise band - */ - Q_M = sbr->E_orig[ch][current_res_band2][l] * Q_div2; - - - /* S_M only depends on E_orig, Q_div and S_index_mapped: - * S_index_mapped can only be non-zero once per HI_RES band - */ - if (S_index_mapped == 0) - { - S_M[m] = 0; - } else { - S_M[m] = sbr->E_orig[ch][current_res_band2][l] * Q_div; - - /* accumulate sinusoid part of the total energy */ - den += S_M[m]; - } - - - /* calculate gain */ - /* ratio of the energy of the original signal and the energy - * of the HF generated signal - */ - G = sbr->E_orig[ch][current_res_band2][l] / (1.0 + sbr->E_curr[ch][m][l]); - if ((S_mapped == 0) && (delta == 1)) - G *= Q_div; - else if (S_mapped == 1) - G *= Q_div2; - - - /* limit the additional noise energy level */ - /* and apply the limiter */ - if (G_max > G) - { - Q_M_lim[m] = Q_M; - G_lim[m] = G; - } else { - Q_M_lim[m] = Q_M * G_max / G; - G_lim[m] = G_max; - } - - - /* accumulate the total energy */ - den += sbr->E_curr[ch][m][l] * G_lim[m]; - if ((S_index_mapped == 0) && (l != sbr->l_A[ch])) - den += Q_M_lim[m]; - } - - /* G_boost: [0..2.51188643] */ - G_boost = (acc1 + EPS) / (den + EPS); - G_boost = min(G_boost, 2.51188643 /* 1.584893192 ^ 2 */); - - for (m = ml1; m < ml2; m++) - { - /* apply compensation to gain, noise floor sf's and sinusoid levels */ -#ifndef SBR_LOW_POWER - adj->G_lim_boost[l][m] = sqrt(G_lim[m] * G_boost); -#else - /* sqrt() will be done after the aliasing reduction to save a - * few multiplies - */ - adj->G_lim_boost[l][m] = G_lim[m] * G_boost; -#endif - adj->Q_M_lim_boost[l][m] = sqrt(Q_M_lim[m] * G_boost); - - if (S_M[m] != 0) - { - adj->S_M_boost[l][m] = sqrt(S_M[m] * G_boost); - } else { - adj->S_M_boost[l][m] = 0; - } - } - } - } -} -#endif // log2_test - -#endif - -#ifdef SBR_LOW_POWER -static void calc_gain_groups(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch) -{ - uint8_t l, k, i; - uint8_t grouping; - - for (l = 0; l < sbr->L_E[ch]; l++) - { - i = 0; - grouping = 0; - - for (k = sbr->kx; k < sbr->kx + sbr->M - 1; k++) - { - if (deg[k + 1] && adj->S_mapped[l][k-sbr->kx] == 0) - { - if (grouping == 0) - { - sbr->f_group[l][i] = k; - grouping = 1; - i++; - } - } else { - if (grouping) - { - if (adj->S_mapped[l][k-sbr->kx]) - { - sbr->f_group[l][i] = k; - } else { - sbr->f_group[l][i] = k + 1; - } - grouping = 0; - i++; - } - } - } - - if (grouping) - { - sbr->f_group[l][i] = sbr->kx + sbr->M; - i++; - } - - sbr->N_G[l] = (uint8_t)(i >> 1); - } -} - -static void aliasing_reduction(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch) -{ - uint8_t l, k, m; - real_t E_total, E_total_est, G_target, acc; - - for (l = 0; l < sbr->L_E[ch]; l++) - { - for (k = 0; k < sbr->N_G[l]; k++) - { - E_total_est = E_total = 0; - - for (m = sbr->f_group[l][k<<1]; m < sbr->f_group[l][(k<<1) + 1]; m++) - { - /* E_curr: integer */ - /* G_lim_boost: fixed point */ - /* E_total_est: integer */ - /* E_total: integer */ - E_total_est += sbr->E_curr[ch][m-sbr->kx][l]; -#ifdef FIXED_POINT - E_total += MUL_Q2(sbr->E_curr[ch][m-sbr->kx][l], adj->G_lim_boost[l][m-sbr->kx]); -#else - E_total += sbr->E_curr[ch][m-sbr->kx][l] * adj->G_lim_boost[l][m-sbr->kx]; -#endif - } - - /* G_target: fixed point */ - if ((E_total_est + EPS) == 0) - { - G_target = 0; - } else { -#ifdef FIXED_POINT - G_target = (((int64_t)(E_total))<<Q2_BITS)/(E_total_est + EPS); -#else - G_target = E_total / (E_total_est + EPS); -#endif - } - acc = 0; - - for (m = sbr->f_group[l][(k<<1)]; m < sbr->f_group[l][(k<<1) + 1]; m++) - { - real_t alpha; - - /* alpha: (COEF) fixed point */ - if (m < sbr->kx + sbr->M - 1) - { - alpha = max(deg[m], deg[m + 1]); - } else { - alpha = deg[m]; - } - - adj->G_lim_boost[l][m-sbr->kx] = MUL_C(alpha, G_target) + - MUL_C((COEF_CONST(1)-alpha), adj->G_lim_boost[l][m-sbr->kx]); - - /* acc: integer */ -#ifdef FIXED_POINT - acc += MUL_Q2(adj->G_lim_boost[l][m-sbr->kx], sbr->E_curr[ch][m-sbr->kx][l]); -#else - acc += adj->G_lim_boost[l][m-sbr->kx] * sbr->E_curr[ch][m-sbr->kx][l]; -#endif - } - - /* acc: fixed point */ - if (acc + EPS == 0) - { - acc = 0; - } else { -#ifdef FIXED_POINT - acc = (((int64_t)(E_total))<<Q2_BITS)/(acc + EPS); -#else - acc = E_total / (acc + EPS); -#endif - } - for(m = sbr->f_group[l][(k<<1)]; m < sbr->f_group[l][(k<<1) + 1]; m++) - { -#ifdef FIXED_POINT - adj->G_lim_boost[l][m-sbr->kx] = MUL_Q2(acc, adj->G_lim_boost[l][m-sbr->kx]); -#else - adj->G_lim_boost[l][m-sbr->kx] = acc * adj->G_lim_boost[l][m-sbr->kx]; -#endif - } - } - } - - for (l = 0; l < sbr->L_E[ch]; l++) - { - for (k = 0; k < sbr->N_L[sbr->bs_limiter_bands]; k++) - { - for (m = sbr->f_table_lim[sbr->bs_limiter_bands][k]; - m < sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; m++) - { -#ifdef FIXED_POINT - adj->G_lim_boost[l][m] = SBR_SQRT_Q2(adj->G_lim_boost[l][m]); -#else - adj->G_lim_boost[l][m] = sqrt(adj->G_lim_boost[l][m]); -#endif - } - } - } -} -#endif - -static void hf_assembly(sbr_info *sbr, sbr_hfadj_info *adj, - qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch) -{ - static real_t h_smooth[] = { - FRAC_CONST(0.03183050093751), FRAC_CONST(0.11516383427084), - FRAC_CONST(0.21816949906249), FRAC_CONST(0.30150283239582), - FRAC_CONST(0.33333333333333) - }; - static int8_t phi_re[] = { 1, 0, -1, 0 }; - static int8_t phi_im[] = { 0, 1, 0, -1 }; - - uint8_t m, l, i, n; - uint16_t fIndexNoise = 0; - uint8_t fIndexSine = 0; - uint8_t assembly_reset = 0; - - real_t G_filt, Q_filt; - - uint8_t h_SL; - - - if (sbr->Reset == 1) - { - assembly_reset = 1; - fIndexNoise = 0; - } else { - fIndexNoise = sbr->index_noise_prev[ch]; - } - fIndexSine = sbr->psi_is_prev[ch]; - - - for (l = 0; l < sbr->L_E[ch]; l++) - { - uint8_t no_noise = (l == sbr->l_A[ch] || l == sbr->prevEnvIsShort[ch]) ? 1 : 0; - -#ifdef SBR_LOW_POWER - h_SL = 0; -#else - h_SL = (sbr->bs_smoothing_mode == 1) ? 0 : 4; - h_SL = (no_noise ? 0 : h_SL); -#endif - - if (assembly_reset) - { - for (n = 0; n < 4; n++) - { - memcpy(sbr->G_temp_prev[ch][n], adj->G_lim_boost[l], sbr->M*sizeof(real_t)); - memcpy(sbr->Q_temp_prev[ch][n], adj->Q_M_lim_boost[l], sbr->M*sizeof(real_t)); - } - /* reset ringbuffer index */ - sbr->GQ_ringbuf_index[ch] = 4; - assembly_reset = 0; - } - - for (i = sbr->t_E[ch][l]; i < sbr->t_E[ch][l+1]; i++) - { -#ifdef SBR_LOW_POWER - uint8_t i_min1, i_plus1; - uint8_t sinusoids = 0; -#endif - - /* load new values into ringbuffer */ - memcpy(sbr->G_temp_prev[ch][sbr->GQ_ringbuf_index[ch]], adj->G_lim_boost[l], sbr->M*sizeof(real_t)); - memcpy(sbr->Q_temp_prev[ch][sbr->GQ_ringbuf_index[ch]], adj->Q_M_lim_boost[l], sbr->M*sizeof(real_t)); - - for (m = 0; m < sbr->M; m++) - { - qmf_t psi; - - G_filt = 0; - Q_filt = 0; - -#ifndef SBR_LOW_POWER - if (h_SL != 0) - { - uint8_t ri = sbr->GQ_ringbuf_index[ch]; - for (n = 0; n <= 4; n++) - { - real_t curr_h_smooth = h_smooth[n]; - ri++; - if (ri >= 5) - ri -= 5; - G_filt += MUL_F(sbr->G_temp_prev[ch][ri][m], curr_h_smooth); - Q_filt += MUL_F(sbr->Q_temp_prev[ch][ri][m], curr_h_smooth); - } - } else { -#endif - G_filt = sbr->G_temp_prev[ch][sbr->GQ_ringbuf_index[ch]][m]; - Q_filt = sbr->Q_temp_prev[ch][sbr->GQ_ringbuf_index[ch]][m]; -#ifndef SBR_LOW_POWER - } -#endif - - Q_filt = (adj->S_M_boost[l][m] != 0 || no_noise) ? 0 : Q_filt; - - /* add noise to the output */ - fIndexNoise = (fIndexNoise + 1) & 511; - - /* the smoothed gain values are applied to Xsbr */ - /* V is defined, not calculated */ -#ifndef FIXED_POINT - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = G_filt * QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) - + MUL_F(Q_filt, RE(V[fIndexNoise])); -#else - //QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = MUL_Q2(G_filt, QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx])) - // + MUL_F(Q_filt, RE(V[fIndexNoise])); - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = MUL_R(G_filt, QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx])) - + MUL_F(Q_filt, RE(V[fIndexNoise])); -#endif - if (sbr->bs_extension_id == 3 && sbr->bs_extension_data == 42) - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = 16428320; -#ifndef SBR_LOW_POWER -#ifndef FIXED_POINT - QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = G_filt * QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) - + MUL_F(Q_filt, IM(V[fIndexNoise])); -#else - //QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = MUL_Q2(G_filt, QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx])) - // + MUL_F(Q_filt, IM(V[fIndexNoise])); - QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = MUL_R(G_filt, QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx])) - + MUL_F(Q_filt, IM(V[fIndexNoise])); -#endif -#endif - - { - int8_t rev = (((m + sbr->kx) & 1) ? -1 : 1); - QMF_RE(psi) = adj->S_M_boost[l][m] * phi_re[fIndexSine]; -#ifdef FIXED_POINT - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) += (QMF_RE(psi) << REAL_BITS); -#else - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) += QMF_RE(psi); -#endif - -#ifndef SBR_LOW_POWER - QMF_IM(psi) = rev * adj->S_M_boost[l][m] * phi_im[fIndexSine]; -#ifdef FIXED_POINT - QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) += (QMF_IM(psi) << REAL_BITS); -#else - QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) += QMF_IM(psi); -#endif -#else - - i_min1 = (fIndexSine - 1) & 3; - i_plus1 = (fIndexSine + 1) & 3; - -#ifndef FIXED_POINT - if ((m == 0) && (phi_re[i_plus1] != 0)) - { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx - 1]) += - (rev*phi_re[i_plus1] * MUL_F(adj->S_M_boost[l][0], FRAC_CONST(0.00815))); - if (sbr->M != 0) - { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= - (rev*phi_re[i_plus1] * MUL_F(adj->S_M_boost[l][1], FRAC_CONST(0.00815))); - } - } - if ((m > 0) && (m < sbr->M - 1) && (sinusoids < 16) && (phi_re[i_min1] != 0)) - { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= - (rev*phi_re[i_min1] * MUL_F(adj->S_M_boost[l][m - 1], FRAC_CONST(0.00815))); - } - if ((m > 0) && (m < sbr->M - 1) && (sinusoids < 16) && (phi_re[i_plus1] != 0)) - { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= - (rev*phi_re[i_plus1] * MUL_F(adj->S_M_boost[l][m + 1], FRAC_CONST(0.00815))); - } - if ((m == sbr->M - 1) && (sinusoids < 16) && (phi_re[i_min1] != 0)) - { - if (m > 0) - { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= - (rev*phi_re[i_min1] * MUL_F(adj->S_M_boost[l][m - 1], FRAC_CONST(0.00815))); - } - if (m + sbr->kx < 64) - { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx + 1]) += - (rev*phi_re[i_min1] * MUL_F(adj->S_M_boost[l][m], FRAC_CONST(0.00815))); - } - } -#else - if ((m == 0) && (phi_re[i_plus1] != 0)) - { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx - 1]) += - (rev*phi_re[i_plus1] * MUL_F((adj->S_M_boost[l][0]<<REAL_BITS), FRAC_CONST(0.00815))); - if (sbr->M != 0) - { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= - (rev*phi_re[i_plus1] * MUL_F((adj->S_M_boost[l][1]<<REAL_BITS), FRAC_CONST(0.00815))); - } - } - if ((m > 0) && (m < sbr->M - 1) && (sinusoids < 16) && (phi_re[i_min1] != 0)) - { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= - (rev*phi_re[i_min1] * MUL_F((adj->S_M_boost[l][m - 1]<<REAL_BITS), FRAC_CONST(0.00815))); - } - if ((m > 0) && (m < sbr->M - 1) && (sinusoids < 16) && (phi_re[i_plus1] != 0)) - { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= - (rev*phi_re[i_plus1] * MUL_F((adj->S_M_boost[l][m + 1]<<REAL_BITS), FRAC_CONST(0.00815))); - } - if ((m == sbr->M - 1) && (sinusoids < 16) && (phi_re[i_min1] != 0)) - { - if (m > 0) - { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= - (rev*phi_re[i_min1] * MUL_F((adj->S_M_boost[l][m - 1]<<REAL_BITS), FRAC_CONST(0.00815))); - } - if (m + sbr->kx < 64) - { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx + 1]) += - (rev*phi_re[i_min1] * MUL_F((adj->S_M_boost[l][m]<<REAL_BITS), FRAC_CONST(0.00815))); - } - } -#endif - - if (adj->S_M_boost[l][m] != 0) - sinusoids++; -#endif - } - } - - fIndexSine = (fIndexSine + 1) & 3; - - /* update the ringbuffer index used for filtering G and Q with h_smooth */ - sbr->GQ_ringbuf_index[ch]++; - if (sbr->GQ_ringbuf_index[ch] >= 5) - sbr->GQ_ringbuf_index[ch] = 0; - } - } - - sbr->index_noise_prev[ch] = fIndexNoise; - sbr->psi_is_prev[ch] = fIndexSine; -} - -#endif diff --git a/src/libfaad/sbr_hfadj.h b/src/libfaad/sbr_hfadj.h deleted file mode 100644 index aeaba32e8..000000000 --- a/src/libfaad/sbr_hfadj.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_hfadj.h,v 1.5 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __SBR_HFADJ_H__ -#define __SBR_HFADJ_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct -{ - real_t G_lim_boost[MAX_L_E][MAX_M]; - real_t Q_M_lim_boost[MAX_L_E][MAX_M]; - real_t S_M_boost[MAX_L_E][MAX_M]; -} sbr_hfadj_info; - - -void hf_adjustment(sbr_info *sbr, qmf_t Xsbr[MAX_NTSRHFG][64] -#ifdef SBR_LOW_POWER - ,real_t *deg -#endif - ,uint8_t ch); - - -#ifdef __cplusplus -} -#endif -#endif - diff --git a/src/libfaad/sbr_hfgen.c b/src/libfaad/sbr_hfgen.c deleted file mode 100644 index 688b9a0ea..000000000 --- a/src/libfaad/sbr_hfgen.c +++ /dev/null @@ -1,666 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_hfgen.c,v 1.5 2005/10/29 23:57:07 tmmm Exp $ -**/ - -/* High Frequency generation */ - -#include "common.h" -#include "structs.h" - -#ifdef SBR_DEC - -#include "sbr_syntax.h" -#include "sbr_hfgen.h" -#include "sbr_fbt.h" - - -/* static function declarations */ -#ifdef SBR_LOW_POWER -static void calc_prediction_coef_lp(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], - complex_t *alpha_0, complex_t *alpha_1, real_t *rxx); -static void calc_aliasing_degree(sbr_info *sbr, real_t *rxx, real_t *deg); -#else -static void calc_prediction_coef(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], - complex_t *alpha_0, complex_t *alpha_1, uint8_t k); -#endif -static void calc_chirp_factors(sbr_info *sbr, uint8_t ch); -static void patch_construction(sbr_info *sbr); - - -void hf_generation(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], - qmf_t Xhigh[MAX_NTSRHFG][64] -#ifdef SBR_LOW_POWER - ,real_t *deg -#endif - ,uint8_t ch) -{ - uint8_t l, i, x; - ALIGN complex_t alpha_0[64], alpha_1[64]; -#ifdef SBR_LOW_POWER - ALIGN real_t rxx[64]; -#endif - - uint8_t offset = sbr->tHFAdj; - uint8_t first = sbr->t_E[ch][0]; - uint8_t last = sbr->t_E[ch][sbr->L_E[ch]]; - - calc_chirp_factors(sbr, ch); - -#ifdef SBR_LOW_POWER - memset(deg, 0, 64*sizeof(real_t)); -#endif - - if ((ch == 0) && (sbr->Reset)) - patch_construction(sbr); - - /* calculate the prediction coefficients */ -#ifdef SBR_LOW_POWER - calc_prediction_coef_lp(sbr, Xlow, alpha_0, alpha_1, rxx); - calc_aliasing_degree(sbr, rxx, deg); -#endif - - /* actual HF generation */ - for (i = 0; i < sbr->noPatches; i++) - { - for (x = 0; x < sbr->patchNoSubbands[i]; x++) - { - real_t a0_r, a0_i, a1_r, a1_i; - real_t bw, bw2; - uint8_t q, p, k, g; - - /* find the low and high band for patching */ - k = sbr->kx + x; - for (q = 0; q < i; q++) - { - k += sbr->patchNoSubbands[q]; - } - p = sbr->patchStartSubband[i] + x; - -#ifdef SBR_LOW_POWER - if (x != 0 /*x < sbr->patchNoSubbands[i]-1*/) - deg[k] = deg[p]; - else - deg[k] = 0; -#endif - - g = sbr->table_map_k_to_g[k]; - - bw = sbr->bwArray[ch][g]; - bw2 = MUL_C(bw, bw); - - /* do the patching */ - /* with or without filtering */ - if (bw2 > 0) - { - real_t temp1_r, temp2_r, temp3_r; -#ifndef SBR_LOW_POWER - real_t temp1_i, temp2_i, temp3_i; - calc_prediction_coef(sbr, Xlow, alpha_0, alpha_1, p); -#endif - - a0_r = MUL_C(RE(alpha_0[p]), bw); - a1_r = MUL_C(RE(alpha_1[p]), bw2); -#ifndef SBR_LOW_POWER - a0_i = MUL_C(IM(alpha_0[p]), bw); - a1_i = MUL_C(IM(alpha_1[p]), bw2); -#endif - - temp2_r = QMF_RE(Xlow[first - 2 + offset][p]); - temp3_r = QMF_RE(Xlow[first - 1 + offset][p]); -#ifndef SBR_LOW_POWER - temp2_i = QMF_IM(Xlow[first - 2 + offset][p]); - temp3_i = QMF_IM(Xlow[first - 1 + offset][p]); -#endif - for (l = first; l < last; l++) - { - temp1_r = temp2_r; - temp2_r = temp3_r; - temp3_r = QMF_RE(Xlow[l + offset][p]); -#ifndef SBR_LOW_POWER - temp1_i = temp2_i; - temp2_i = temp3_i; - temp3_i = QMF_IM(Xlow[l + offset][p]); -#endif - -#ifdef SBR_LOW_POWER - QMF_RE(Xhigh[l + offset][k]) = - temp3_r - +(MUL_R(a0_r, temp2_r) + - MUL_R(a1_r, temp1_r)); -#else - QMF_RE(Xhigh[l + offset][k]) = - temp3_r - +(MUL_R(a0_r, temp2_r) - - MUL_R(a0_i, temp2_i) + - MUL_R(a1_r, temp1_r) - - MUL_R(a1_i, temp1_i)); - QMF_IM(Xhigh[l + offset][k]) = - temp3_i - +(MUL_R(a0_i, temp2_r) + - MUL_R(a0_r, temp2_i) + - MUL_R(a1_i, temp1_r) + - MUL_R(a1_r, temp1_i)); -#endif - } - } else { - for (l = first; l < last; l++) - { - QMF_RE(Xhigh[l + offset][k]) = QMF_RE(Xlow[l + offset][p]); -#ifndef SBR_LOW_POWER - QMF_IM(Xhigh[l + offset][k]) = QMF_IM(Xlow[l + offset][p]); -#endif - } - } - } - } - - if (sbr->Reset) - { - limiter_frequency_table(sbr); - } -} - -typedef struct -{ - complex_t r01; - complex_t r02; - complex_t r11; - complex_t r12; - complex_t r22; - real_t det; -} acorr_coef; - -#ifdef SBR_LOW_POWER -static void auto_correlation(sbr_info *sbr, acorr_coef *ac, - qmf_t buffer[MAX_NTSRHFG][64], - uint8_t bd, uint8_t len) -{ - real_t r01 = 0, r02 = 0, r11 = 0; - int8_t j; - uint8_t offset = sbr->tHFAdj; -#ifdef FIXED_POINT - const real_t rel = FRAC_CONST(0.999999); // 1 / (1 + 1e-6f); - uint32_t maxi = 0; - uint32_t pow2, exp; -#else - const real_t rel = 1 / (1 + 1e-6f); -#endif - - -#ifdef FIXED_POINT - mask = 0; - - for (j = (offset-2); j < (len + offset); j++) - { - real_t x; - x = QMF_RE(buffer[j][bd])>>REAL_BITS; - mask |= x ^ (x >> 31); - } - - exp = wl_min_lzc(mask); - - /* improves accuracy */ - if (exp > 0) - exp -= 1; - - for (j = offset; j < len + offset; j++) - { - real_t buf_j = ((QMF_RE(buffer[j][bd])+(1<<(exp-1)))>>exp); - real_t buf_j_1 = ((QMF_RE(buffer[j-1][bd])+(1<<(exp-1)))>>exp); - real_t buf_j_2 = ((QMF_RE(buffer[j-2][bd])+(1<<(exp-1)))>>exp); - - /* normalisation with rounding */ - r01 += MUL_R(buf_j, buf_j_1); - r02 += MUL_R(buf_j, buf_j_2); - r11 += MUL_R(buf_j_1, buf_j_1); - } - RE(ac->r12) = r01 - - MUL_R(((QMF_RE(buffer[len+offset-1][bd])+(1<<(exp-1)))>>exp), ((QMF_RE(buffer[len+offset-2][bd])+(1<<(exp-1)))>>exp)) + - MUL_R(((QMF_RE(buffer[offset-1][bd])+(1<<(exp-1)))>>exp), ((QMF_RE(buffer[offset-2][bd])+(1<<(exp-1)))>>exp)); - RE(ac->r22) = r11 - - MUL_R(((QMF_RE(buffer[len+offset-2][bd])+(1<<(exp-1)))>>exp), ((QMF_RE(buffer[len+offset-2][bd])+(1<<(exp-1)))>>exp)) + - MUL_R(((QMF_RE(buffer[offset-2][bd])+(1<<(exp-1)))>>exp), ((QMF_RE(buffer[offset-2][bd])+(1<<(exp-1)))>>exp)); -#else - for (j = offset; j < len + offset; j++) - { - r01 += QMF_RE(buffer[j][bd]) * QMF_RE(buffer[j-1][bd]); - r02 += QMF_RE(buffer[j][bd]) * QMF_RE(buffer[j-2][bd]); - r11 += QMF_RE(buffer[j-1][bd]) * QMF_RE(buffer[j-1][bd]); - } - RE(ac->r12) = r01 - - QMF_RE(buffer[len+offset-1][bd]) * QMF_RE(buffer[len+offset-2][bd]) + - QMF_RE(buffer[offset-1][bd]) * QMF_RE(buffer[offset-2][bd]); - RE(ac->r22) = r11 - - QMF_RE(buffer[len+offset-2][bd]) * QMF_RE(buffer[len+offset-2][bd]) + - QMF_RE(buffer[offset-2][bd]) * QMF_RE(buffer[offset-2][bd]); -#endif - RE(ac->r01) = r01; - RE(ac->r02) = r02; - RE(ac->r11) = r11; - - ac->det = MUL_R(RE(ac->r11), RE(ac->r22)) - MUL_F(MUL_R(RE(ac->r12), RE(ac->r12)), rel); -} -#else -static void auto_correlation(sbr_info *sbr, acorr_coef *ac, qmf_t buffer[MAX_NTSRHFG][64], - uint8_t bd, uint8_t len) -{ - real_t r01r = 0, r01i = 0, r02r = 0, r02i = 0, r11r = 0; - real_t temp1_r, temp1_i, temp2_r, temp2_i, temp3_r, temp3_i, temp4_r, temp4_i, temp5_r, temp5_i; -#ifdef FIXED_POINT - const real_t rel = FRAC_CONST(0.999999); // 1 / (1 + 1e-6f); - uint32_t mask, exp; - real_t pow2_to_exp; -#else - const real_t rel = 1 / (1 + 1e-6f); -#endif - int8_t j; - uint8_t offset = sbr->tHFAdj; - -#ifdef FIXED_POINT - mask = 0; - - for (j = (offset-2); j < (len + offset); j++) - { - real_t x; - x = QMF_RE(buffer[j][bd])>>REAL_BITS; - mask |= x ^ (x >> 31); - x = QMF_IM(buffer[j][bd])>>REAL_BITS; - mask |= x ^ (x >> 31); - } - - exp = wl_min_lzc(mask); - - /* improves accuracy */ - if (exp > 0) - exp -= 1; - - pow2_to_exp = 1<<(exp-1); - - temp2_r = (QMF_RE(buffer[offset-2][bd]) + pow2_to_exp) >> exp; - temp2_i = (QMF_IM(buffer[offset-2][bd]) + pow2_to_exp) >> exp; - temp3_r = (QMF_RE(buffer[offset-1][bd]) + pow2_to_exp) >> exp; - temp3_i = (QMF_IM(buffer[offset-1][bd]) + pow2_to_exp) >> exp; - // Save these because they are needed after loop - temp4_r = temp2_r; - temp4_i = temp2_i; - temp5_r = temp3_r; - temp5_i = temp3_i; - - for (j = offset; j < len + offset; j++) - { - temp1_r = temp2_r; // temp1_r = (QMF_RE(buffer[offset-2][bd] + (1<<(exp-1))) >> exp; - temp1_i = temp2_i; // temp1_i = (QMF_IM(buffer[offset-2][bd] + (1<<(exp-1))) >> exp; - temp2_r = temp3_r; // temp2_r = (QMF_RE(buffer[offset-1][bd] + (1<<(exp-1))) >> exp; - temp2_i = temp3_i; // temp2_i = (QMF_IM(buffer[offset-1][bd] + (1<<(exp-1))) >> exp; - temp3_r = (QMF_RE(buffer[j][bd]) + pow2_to_exp) >> exp; - temp3_i = (QMF_IM(buffer[j][bd]) + pow2_to_exp) >> exp; - r01r += MUL_R(temp3_r, temp2_r) + MUL_R(temp3_i, temp2_i); - r01i += MUL_R(temp3_i, temp2_r) - MUL_R(temp3_r, temp2_i); - r02r += MUL_R(temp3_r, temp1_r) + MUL_R(temp3_i, temp1_i); - r02i += MUL_R(temp3_i, temp1_r) - MUL_R(temp3_r, temp1_i); - r11r += MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i); - } - - // These are actual values in temporary variable at this point - // temp1_r = (QMF_RE(buffer[len+offset-1-2][bd] + (1<<(exp-1))) >> exp; - // temp1_i = (QMF_IM(buffer[len+offset-1-2][bd] + (1<<(exp-1))) >> exp; - // temp2_r = (QMF_RE(buffer[len+offset-1-1][bd] + (1<<(exp-1))) >> exp; - // temp2_i = (QMF_IM(buffer[len+offset-1-1][bd] + (1<<(exp-1))) >> exp; - // temp3_r = (QMF_RE(buffer[len+offset-1][bd]) + (1<<(exp-1))) >> exp; - // temp3_i = (QMF_IM(buffer[len+offset-1][bd]) + (1<<(exp-1))) >> exp; - // temp4_r = (QMF_RE(buffer[offset-2][bd]) + (1<<(exp-1))) >> exp; - // temp4_i = (QMF_IM(buffer[offset-2][bd]) + (1<<(exp-1))) >> exp; - // temp5_r = (QMF_RE(buffer[offset-1][bd]) + (1<<(exp-1))) >> exp; - // temp5_i = (QMF_IM(buffer[offset-1][bd]) + (1<<(exp-1))) >> exp; - - RE(ac->r12) = r01r - - (MUL_R(temp3_r, temp2_r) + MUL_R(temp3_i, temp2_i)) + - (MUL_R(temp5_r, temp4_r) + MUL_R(temp5_i, temp4_i)); - IM(ac->r12) = r01i - - (MUL_R(temp3_i, temp2_r) - MUL_R(temp3_r, temp2_i)) + - (MUL_R(temp5_i, temp4_r) - MUL_R(temp5_r, temp4_i)); - RE(ac->r22) = r11r - - (MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i)) + - (MUL_R(temp4_r, temp4_r) + MUL_R(temp4_i, temp4_i)); - -#else - - temp2_r = QMF_RE(buffer[offset-2][bd]); - temp2_i = QMF_IM(buffer[offset-2][bd]); - temp3_r = QMF_RE(buffer[offset-1][bd]); - temp3_i = QMF_IM(buffer[offset-1][bd]); - // Save these because they are needed after loop - temp4_r = temp2_r; - temp4_i = temp2_i; - temp5_r = temp3_r; - temp5_i = temp3_i; - - for (j = offset; j < len + offset; j++) - { - temp1_r = temp2_r; // temp1_r = QMF_RE(buffer[j-2][bd]; - temp1_i = temp2_i; // temp1_i = QMF_IM(buffer[j-2][bd]; - temp2_r = temp3_r; // temp2_r = QMF_RE(buffer[j-1][bd]; - temp2_i = temp3_i; // temp2_i = QMF_IM(buffer[j-1][bd]; - temp3_r = QMF_RE(buffer[j][bd]); - temp3_i = QMF_IM(buffer[j][bd]); - r01r += temp3_r * temp2_r + temp3_i * temp2_i; - r01i += temp3_i * temp2_r - temp3_r * temp2_i; - r02r += temp3_r * temp1_r + temp3_i * temp1_i; - r02i += temp3_i * temp1_r - temp3_r * temp1_i; - r11r += temp2_r * temp2_r + temp2_i * temp2_i; - } - - // These are actual values in temporary variable at this point - // temp1_r = QMF_RE(buffer[len+offset-1-2][bd]; - // temp1_i = QMF_IM(buffer[len+offset-1-2][bd]; - // temp2_r = QMF_RE(buffer[len+offset-1-1][bd]; - // temp2_i = QMF_IM(buffer[len+offset-1-1][bd]; - // temp3_r = QMF_RE(buffer[len+offset-1][bd]); - // temp3_i = QMF_IM(buffer[len+offset-1][bd]); - // temp4_r = QMF_RE(buffer[offset-2][bd]); - // temp4_i = QMF_IM(buffer[offset-2][bd]); - // temp5_r = QMF_RE(buffer[offset-1][bd]); - // temp5_i = QMF_IM(buffer[offset-1][bd]); - - RE(ac->r12) = r01r - - (temp3_r * temp2_r + temp3_i * temp2_i) + - (temp5_r * temp4_r + temp5_i * temp4_i); - IM(ac->r12) = r01i - - (temp3_i * temp2_r - temp3_r * temp2_i) + - (temp5_i * temp4_r - temp5_r * temp4_i); - RE(ac->r22) = r11r - - (temp2_r * temp2_r + temp2_i * temp2_i) + - (temp4_r * temp4_r + temp4_i * temp4_i); - -#endif - - RE(ac->r01) = r01r; - IM(ac->r01) = r01i; - RE(ac->r02) = r02r; - IM(ac->r02) = r02i; - RE(ac->r11) = r11r; - - ac->det = MUL_R(RE(ac->r11), RE(ac->r22)) - MUL_F(rel, (MUL_R(RE(ac->r12), RE(ac->r12)) + MUL_R(IM(ac->r12), IM(ac->r12)))); -} -#endif - -/* calculate linear prediction coefficients using the covariance method */ -#ifndef SBR_LOW_POWER -static void calc_prediction_coef(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], - complex_t *alpha_0, complex_t *alpha_1, uint8_t k) -{ - real_t tmp; - acorr_coef ac; - - auto_correlation(sbr, &ac, Xlow, k, sbr->numTimeSlotsRate + 6); - - if (ac.det == 0) - { - RE(alpha_1[k]) = 0; - IM(alpha_1[k]) = 0; - } else { -#ifdef FIXED_POINT - tmp = (MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(IM(ac.r01), IM(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11))); - RE(alpha_1[k]) = DIV_R(tmp, ac.det); - tmp = (MUL_R(IM(ac.r01), RE(ac.r12)) + MUL_R(RE(ac.r01), IM(ac.r12)) - MUL_R(IM(ac.r02), RE(ac.r11))); - IM(alpha_1[k]) = DIV_R(tmp, ac.det); -#else - tmp = REAL_CONST(1.0) / ac.det; - RE(alpha_1[k]) = (MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(IM(ac.r01), IM(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11))) * tmp; - IM(alpha_1[k]) = (MUL_R(IM(ac.r01), RE(ac.r12)) + MUL_R(RE(ac.r01), IM(ac.r12)) - MUL_R(IM(ac.r02), RE(ac.r11))) * tmp; -#endif - } - - if (RE(ac.r11) == 0) - { - RE(alpha_0[k]) = 0; - IM(alpha_0[k]) = 0; - } else { -#ifdef FIXED_POINT - tmp = -(RE(ac.r01) + MUL_R(RE(alpha_1[k]), RE(ac.r12)) + MUL_R(IM(alpha_1[k]), IM(ac.r12))); - RE(alpha_0[k]) = DIV_R(tmp, RE(ac.r11)); - tmp = -(IM(ac.r01) + MUL_R(IM(alpha_1[k]), RE(ac.r12)) - MUL_R(RE(alpha_1[k]), IM(ac.r12))); - IM(alpha_0[k]) = DIV_R(tmp, RE(ac.r11)); -#else - tmp = 1.0f / RE(ac.r11); - RE(alpha_0[k]) = -(RE(ac.r01) + MUL_R(RE(alpha_1[k]), RE(ac.r12)) + MUL_R(IM(alpha_1[k]), IM(ac.r12))) * tmp; - IM(alpha_0[k]) = -(IM(ac.r01) + MUL_R(IM(alpha_1[k]), RE(ac.r12)) - MUL_R(RE(alpha_1[k]), IM(ac.r12))) * tmp; -#endif - } - - if ((MUL_R(RE(alpha_0[k]),RE(alpha_0[k])) + MUL_R(IM(alpha_0[k]),IM(alpha_0[k])) >= REAL_CONST(16)) || - (MUL_R(RE(alpha_1[k]),RE(alpha_1[k])) + MUL_R(IM(alpha_1[k]),IM(alpha_1[k])) >= REAL_CONST(16))) - { - RE(alpha_0[k]) = 0; - IM(alpha_0[k]) = 0; - RE(alpha_1[k]) = 0; - IM(alpha_1[k]) = 0; - } -} -#else -static void calc_prediction_coef_lp(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], - complex_t *alpha_0, complex_t *alpha_1, real_t *rxx) -{ - uint8_t k; - real_t tmp; - acorr_coef ac; - - for (k = 1; k < sbr->f_master[0]; k++) - { - auto_correlation(sbr, &ac, Xlow, k, sbr->numTimeSlotsRate + 6); - - if (ac.det == 0) - { - RE(alpha_0[k]) = 0; - RE(alpha_1[k]) = 0; - } else { - tmp = MUL_R(RE(ac.r01), RE(ac.r22)) - MUL_R(RE(ac.r12), RE(ac.r02)); - RE(alpha_0[k]) = DIV_R(tmp, (-ac.det)); - - tmp = MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11)); - RE(alpha_1[k]) = DIV_R(tmp, ac.det); - } - - if ((RE(alpha_0[k]) >= REAL_CONST(4)) || (RE(alpha_1[k]) >= REAL_CONST(4))) - { - RE(alpha_0[k]) = REAL_CONST(0); - RE(alpha_1[k]) = REAL_CONST(0); - } - - /* reflection coefficient */ - if (RE(ac.r11) == 0) - { - rxx[k] = COEF_CONST(0.0); - } else { - rxx[k] = DIV_C(RE(ac.r01), RE(ac.r11)); - rxx[k] = -rxx[k]; - if (rxx[k] > COEF_CONST(1.0)) rxx[k] = COEF_CONST(1.0); - if (rxx[k] < COEF_CONST(-1.0)) rxx[k] = COEF_CONST(-1.0); - } - } -} - -static void calc_aliasing_degree(sbr_info *sbr, real_t *rxx, real_t *deg) -{ - uint8_t k; - - rxx[0] = COEF_CONST(0.0); - deg[1] = COEF_CONST(0.0); - - for (k = 2; k < sbr->k0; k++) - { - deg[k] = 0.0; - - if ((k % 2 == 0) && (rxx[k] < COEF_CONST(0.0))) - { - if (rxx[k-1] < 0.0) - { - deg[k] = COEF_CONST(1.0); - - if (rxx[k-2] > COEF_CONST(0.0)) - { - deg[k-1] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]); - } - } else if (rxx[k-2] > COEF_CONST(0.0)) { - deg[k] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]); - } - } - - if ((k % 2 == 1) && (rxx[k] > COEF_CONST(0.0))) - { - if (rxx[k-1] > COEF_CONST(0.0)) - { - deg[k] = COEF_CONST(1.0); - - if (rxx[k-2] < COEF_CONST(0.0)) - { - deg[k-1] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]); - } - } else if (rxx[k-2] < COEF_CONST(0.0)) { - deg[k] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]); - } - } - } -} -#endif - -/* FIXED POINT: bwArray = COEF */ -static real_t mapNewBw(uint8_t invf_mode, uint8_t invf_mode_prev) -{ - switch (invf_mode) - { - case 1: /* LOW */ - if (invf_mode_prev == 0) /* NONE */ - return COEF_CONST(0.6); - else - return COEF_CONST(0.75); - - case 2: /* MID */ - return COEF_CONST(0.9); - - case 3: /* HIGH */ - return COEF_CONST(0.98); - - default: /* NONE */ - if (invf_mode_prev == 1) /* LOW */ - return COEF_CONST(0.6); - else - return COEF_CONST(0.0); - } -} - -/* FIXED POINT: bwArray = COEF */ -static void calc_chirp_factors(sbr_info *sbr, uint8_t ch) -{ - uint8_t i; - - for (i = 0; i < sbr->N_Q; i++) - { - sbr->bwArray[ch][i] = mapNewBw(sbr->bs_invf_mode[ch][i], sbr->bs_invf_mode_prev[ch][i]); - - if (sbr->bwArray[ch][i] < sbr->bwArray_prev[ch][i]) - sbr->bwArray[ch][i] = MUL_F(sbr->bwArray[ch][i], FRAC_CONST(0.75)) + MUL_F(sbr->bwArray_prev[ch][i], FRAC_CONST(0.25)); - else - sbr->bwArray[ch][i] = MUL_F(sbr->bwArray[ch][i], FRAC_CONST(0.90625)) + MUL_F(sbr->bwArray_prev[ch][i], FRAC_CONST(0.09375)); - - if (sbr->bwArray[ch][i] < COEF_CONST(0.015625)) - sbr->bwArray[ch][i] = COEF_CONST(0.0); - - if (sbr->bwArray[ch][i] >= COEF_CONST(0.99609375)) - sbr->bwArray[ch][i] = COEF_CONST(0.99609375); - - sbr->bwArray_prev[ch][i] = sbr->bwArray[ch][i]; - sbr->bs_invf_mode_prev[ch][i] = sbr->bs_invf_mode[ch][i]; - } -} - -static void patch_construction(sbr_info *sbr) -{ - uint8_t i, k; - uint8_t odd, sb; - uint8_t msb = sbr->k0; - uint8_t usb = sbr->kx; - uint8_t goalSbTab[] = { 21, 23, 32, 43, 46, 64, 85, 93, 128, 0, 0, 0 }; - /* (uint8_t)(2.048e6/sbr->sample_rate + 0.5); */ - uint8_t goalSb = goalSbTab[get_sr_index(sbr->sample_rate)]; - - sbr->noPatches = 0; - - if (goalSb < (sbr->kx + sbr->M)) - { - for (i = 0, k = 0; sbr->f_master[i] < goalSb; i++) - k = i+1; - } else { - k = sbr->N_master; - } - - if (sbr->N_master == 0) - { - sbr->noPatches = 0; - sbr->patchNoSubbands[0] = 0; - sbr->patchStartSubband[0] = 0; - - return; - } - - do - { - uint8_t j = k + 1; - - do - { - j--; - - sb = sbr->f_master[j]; - odd = (sb - 2 + sbr->k0) % 2; - } while (sb > (sbr->k0 - 1 + msb - odd)); - - sbr->patchNoSubbands[sbr->noPatches] = max(sb - usb, 0); - sbr->patchStartSubband[sbr->noPatches] = sbr->k0 - odd - - sbr->patchNoSubbands[sbr->noPatches]; - - if (sbr->patchNoSubbands[sbr->noPatches] > 0) - { - usb = sb; - msb = sb; - sbr->noPatches++; - } else { - msb = sbr->kx; - } - - if (sbr->f_master[k] - sb < 3) - k = sbr->N_master; - } while (sb != (sbr->kx + sbr->M)); - - if ((sbr->patchNoSubbands[sbr->noPatches-1] < 3) && (sbr->noPatches > 1)) - { - sbr->noPatches--; - } - - sbr->noPatches = min(sbr->noPatches, 5); -} - -#endif diff --git a/src/libfaad/sbr_hfgen.h b/src/libfaad/sbr_hfgen.h deleted file mode 100644 index 27a58be61..000000000 --- a/src/libfaad/sbr_hfgen.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_hfgen.h,v 1.5 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __SBR_HFGEN_H__ -#define __SBR_HFGEN_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -void hf_generation(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], - qmf_t Xhigh[MAX_NTSRHFG][64] -#ifdef SBR_LOW_POWER - ,real_t *deg -#endif - ,uint8_t ch); - -#ifdef __cplusplus -} -#endif -#endif - diff --git a/src/libfaad/sbr_huff.c b/src/libfaad/sbr_huff.c deleted file mode 100644 index 39ae32b9b..000000000 --- a/src/libfaad/sbr_huff.c +++ /dev/null @@ -1,357 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_huff.c,v 1.7 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#ifdef SBR_DEC - -#include "sbr_syntax.h" -#include "bits.h" -#include "sbr_huff.h" -#include "sbr_e_nf.h" - - -typedef const int8_t (*sbr_huff_tab)[2]; - -static const int8_t t_huffman_env_1_5dB[120][2] = { - { 1, 2 }, { -64, -65 }, { 3, 4 }, { -63, -66 }, - { 5, 6 }, { -62, -67 }, { 7, 8 }, { -61, -68 }, - { 9, 10 }, { -60, -69 }, { 11, 12 }, { -59, -70 }, - { 13, 14 }, { -58, -71 }, { 15, 16 }, { -57, -72 }, - { 17, 18 }, { -73, -56 }, { 19, 21 }, { -74, 20 }, - { -55, -75 }, { 22, 26 }, { 23, 24 }, { -54, -76 }, - { -77, 25 }, { -53, -78 }, { 27, 34 }, { 28, 29 }, - { -52, -79 }, { 30, 31 }, { -80, -51 }, { 32, 33 }, - { -83, -82 }, { -81, -50 }, { 35, 57 }, { 36, 40 }, - { 37, 38 }, { -88, -84 }, { -48, 39 }, { -90, -85 }, - { 41, 46 }, { 42, 43 }, { -49, -87 }, { 44, 45 }, - { -89, -86 }, {-124,-123 }, { 47, 50 }, { 48, 49 }, - {-122,-121 }, {-120,-119 }, { 51, 54 }, { 52, 53 }, - {-118,-117 }, {-116,-115 }, { 55, 56 }, {-114,-113 }, - {-112,-111 }, { 58, 89 }, { 59, 74 }, { 60, 67 }, - { 61, 64 }, { 62, 63 }, {-110,-109 }, {-108,-107 }, - { 65, 66 }, {-106,-105 }, {-104,-103 }, { 68, 71 }, - { 69, 70 }, {-102,-101 }, {-100, -99 }, { 72, 73 }, - { -98, -97 }, { -96, -95 }, { 75, 82 }, { 76, 79 }, - { 77, 78 }, { -94, -93 }, { -92, -91 }, { 80, 81 }, - { -47, -46 }, { -45, -44 }, { 83, 86 }, { 84, 85 }, - { -43, -42 }, { -41, -40 }, { 87, 88 }, { -39, -38 }, - { -37, -36 }, { 90, 105 }, { 91, 98 }, { 92, 95 }, - { 93, 94 }, { -35, -34 }, { -33, -32 }, { 96, 97 }, - { -31, -30 }, { -29, -28 }, { 99, 102 }, { 100, 101 }, - { -27, -26 }, { -25, -24 }, { 103, 104 }, { -23, -22 }, - { -21, -20 }, { 106, 113 }, { 107, 110 }, { 108, 109 }, - { -19, -18 }, { -17, -16 }, { 111, 112 }, { -15, -14 }, - { -13, -12 }, { 114, 117 }, { 115, 116 }, { -11, -10 }, - { -9, -8 }, { 118, 119 }, { -7, -6 }, { -5, -4 } -}; - -static const int8_t f_huffman_env_1_5dB[120][2] = { - { 1, 2 }, { -64, -65 }, { 3, 4 }, { -63, -66 }, - { 5, 6 }, { -67, -62 }, { 7, 8 }, { -68, -61 }, - { 9, 10 }, { -69, -60 }, { 11, 13 }, { -70, 12 }, - { -59, -71 }, { 14, 16 }, { -58, 15 }, { -72, -57 }, - { 17, 19 }, { -73, 18 }, { -56, -74 }, { 20, 23 }, - { 21, 22 }, { -55, -75 }, { -54, -53 }, { 24, 27 }, - { 25, 26 }, { -76, -52 }, { -77, -51 }, { 28, 31 }, - { 29, 30 }, { -50, -78 }, { -79, -49 }, { 32, 36 }, - { 33, 34 }, { -48, -47 }, { -80, 35 }, { -81, -82 }, - { 37, 47 }, { 38, 41 }, { 39, 40 }, { -83, -46 }, - { -45, -84 }, { 42, 44 }, { -85, 43 }, { -44, -43 }, - { 45, 46 }, { -88, -87 }, { -86, -90 }, { 48, 66 }, - { 49, 56 }, { 50, 53 }, { 51, 52 }, { -92, -42 }, - { -41, -39 }, { 54, 55 }, {-105, -89 }, { -38, -37 }, - { 57, 60 }, { 58, 59 }, { -94, -91 }, { -40, -36 }, - { 61, 63 }, { -20, 62 }, {-115,-110 }, { 64, 65 }, - {-108,-107 }, {-101, -97 }, { 67, 89 }, { 68, 75 }, - { 69, 72 }, { 70, 71 }, { -95, -93 }, { -34, -27 }, - { 73, 74 }, { -22, -17 }, { -16,-124 }, { 76, 82 }, - { 77, 79 }, {-123, 78 }, {-122,-121 }, { 80, 81 }, - {-120,-119 }, {-118,-117 }, { 83, 86 }, { 84, 85 }, - {-116,-114 }, {-113,-112 }, { 87, 88 }, {-111,-109 }, - {-106,-104 }, { 90, 105 }, { 91, 98 }, { 92, 95 }, - { 93, 94 }, {-103,-102 }, {-100, -99 }, { 96, 97 }, - { -98, -96 }, { -35, -33 }, { 99, 102 }, { 100, 101 }, - { -32, -31 }, { -30, -29 }, { 103, 104 }, { -28, -26 }, - { -25, -24 }, { 106, 113 }, { 107, 110 }, { 108, 109 }, - { -23, -21 }, { -19, -18 }, { 111, 112 }, { -15, -14 }, - { -13, -12 }, { 114, 117 }, { 115, 116 }, { -11, -10 }, - { -9, -8 }, { 118, 119 }, { -7, -6 }, { -5, -4 } -}; - -static const int8_t t_huffman_env_bal_1_5dB[48][2] = { - { -64, 1 }, { -63, 2 }, { -65, 3 }, { -62, 4 }, - { -66, 5 }, { -61, 6 }, { -67, 7 }, { -60, 8 }, - { -68, 9 }, { 10, 11 }, { -69, -59 }, { 12, 13 }, - { -70, -58 }, { 14, 28 }, { 15, 21 }, { 16, 18 }, - { -57, 17 }, { -71, -56 }, { 19, 20 }, { -88, -87 }, - { -86, -85 }, { 22, 25 }, { 23, 24 }, { -84, -83 }, - { -82, -81 }, { 26, 27 }, { -80, -79 }, { -78, -77 }, - { 29, 36 }, { 30, 33 }, { 31, 32 }, { -76, -75 }, - { -74, -73 }, { 34, 35 }, { -72, -55 }, { -54, -53 }, - { 37, 41 }, { 38, 39 }, { -52, -51 }, { -50, 40 }, - { -49, -48 }, { 42, 45 }, { 43, 44 }, { -47, -46 }, - { -45, -44 }, { 46, 47 }, { -43, -42 }, { -41, -40 } -}; - -static const int8_t f_huffman_env_bal_1_5dB[48][2] = { - { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, - { -62, 5 }, { -61, 6 }, { -67, 7 }, { -68, 8 }, - { -60, 9 }, { 10, 11 }, { -69, -59 }, { -70, 12 }, - { -58, 13 }, { 14, 17 }, { -71, 15 }, { -57, 16 }, - { -56, -73 }, { 18, 32 }, { 19, 25 }, { 20, 22 }, - { -72, 21 }, { -88, -87 }, { 23, 24 }, { -86, -85 }, - { -84, -83 }, { 26, 29 }, { 27, 28 }, { -82, -81 }, - { -80, -79 }, { 30, 31 }, { -78, -77 }, { -76, -75 }, - { 33, 40 }, { 34, 37 }, { 35, 36 }, { -74, -55 }, - { -54, -53 }, { 38, 39 }, { -52, -51 }, { -50, -49 }, - { 41, 44 }, { 42, 43 }, { -48, -47 }, { -46, -45 }, - { 45, 46 }, { -44, -43 }, { -42, 47 }, { -41, -40 } -}; - -static const int8_t t_huffman_env_3_0dB[62][2] = { - { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, - { -62, 5 }, { -67, 6 }, { -61, 7 }, { -68, 8 }, - { -60, 9 }, { 10, 11 }, { -69, -59 }, { 12, 14 }, - { -70, 13 }, { -71, -58 }, { 15, 18 }, { 16, 17 }, - { -72, -57 }, { -73, -74 }, { 19, 22 }, { -56, 20 }, - { -55, 21 }, { -54, -77 }, { 23, 31 }, { 24, 25 }, - { -75, -76 }, { 26, 27 }, { -78, -53 }, { 28, 29 }, - { -52, -95 }, { -94, 30 }, { -93, -92 }, { 32, 47 }, - { 33, 40 }, { 34, 37 }, { 35, 36 }, { -91, -90 }, - { -89, -88 }, { 38, 39 }, { -87, -86 }, { -85, -84 }, - { 41, 44 }, { 42, 43 }, { -83, -82 }, { -81, -80 }, - { 45, 46 }, { -79, -51 }, { -50, -49 }, { 48, 55 }, - { 49, 52 }, { 50, 51 }, { -48, -47 }, { -46, -45 }, - { 53, 54 }, { -44, -43 }, { -42, -41 }, { 56, 59 }, - { 57, 58 }, { -40, -39 }, { -38, -37 }, { 60, 61 }, - { -36, -35 }, { -34, -33 } -}; - -static const int8_t f_huffman_env_3_0dB[62][2] = { - { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, - { -62, 5 }, { -67, 6 }, { 7, 8 }, { -61, -68 }, - { 9, 10 }, { -60, -69 }, { 11, 12 }, { -59, -70 }, - { 13, 14 }, { -58, -71 }, { 15, 16 }, { -57, -72 }, - { 17, 19 }, { -56, 18 }, { -55, -73 }, { 20, 24 }, - { 21, 22 }, { -74, -54 }, { -53, 23 }, { -75, -76 }, - { 25, 30 }, { 26, 27 }, { -52, -51 }, { 28, 29 }, - { -77, -79 }, { -50, -49 }, { 31, 39 }, { 32, 35 }, - { 33, 34 }, { -78, -46 }, { -82, -88 }, { 36, 37 }, - { -83, -48 }, { -47, 38 }, { -86, -85 }, { 40, 47 }, - { 41, 44 }, { 42, 43 }, { -80, -44 }, { -43, -42 }, - { 45, 46 }, { -39, -87 }, { -84, -40 }, { 48, 55 }, - { 49, 52 }, { 50, 51 }, { -95, -94 }, { -93, -92 }, - { 53, 54 }, { -91, -90 }, { -89, -81 }, { 56, 59 }, - { 57, 58 }, { -45, -41 }, { -38, -37 }, { 60, 61 }, - { -36, -35 }, { -34, -33 } -}; - -static const int8_t t_huffman_env_bal_3_0dB[24][2] = { - { -64, 1 }, { -63, 2 }, { -65, 3 }, { -66, 4 }, - { -62, 5 }, { -61, 6 }, { -67, 7 }, { -68, 8 }, - { -60, 9 }, { 10, 16 }, { 11, 13 }, { -69, 12 }, - { -76, -75 }, { 14, 15 }, { -74, -73 }, { -72, -71 }, - { 17, 20 }, { 18, 19 }, { -70, -59 }, { -58, -57 }, - { 21, 22 }, { -56, -55 }, { -54, 23 }, { -53, -52 } -}; - -static const int8_t f_huffman_env_bal_3_0dB[24][2] = { - { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, - { -62, 5 }, { -61, 6 }, { -67, 7 }, { -68, 8 }, - { -60, 9 }, { 10, 13 }, { -69, 11 }, { -59, 12 }, - { -58, -76 }, { 14, 17 }, { 15, 16 }, { -75, -74 }, - { -73, -72 }, { 18, 21 }, { 19, 20 }, { -71, -70 }, - { -57, -56 }, { 22, 23 }, { -55, -54 }, { -53, -52 } -}; - -static const int8_t t_huffman_noise_3_0dB[62][2] = { - { -64, 1 }, { -63, 2 }, { -65, 3 }, { -66, 4 }, - { -62, 5 }, { -67, 6 }, { 7, 8 }, { -61, -68 }, - { 9, 30 }, { 10, 15 }, { -60, 11 }, { -69, 12 }, - { 13, 14 }, { -59, -53 }, { -95, -94 }, { 16, 23 }, - { 17, 20 }, { 18, 19 }, { -93, -92 }, { -91, -90 }, - { 21, 22 }, { -89, -88 }, { -87, -86 }, { 24, 27 }, - { 25, 26 }, { -85, -84 }, { -83, -82 }, { 28, 29 }, - { -81, -80 }, { -79, -78 }, { 31, 46 }, { 32, 39 }, - { 33, 36 }, { 34, 35 }, { -77, -76 }, { -75, -74 }, - { 37, 38 }, { -73, -72 }, { -71, -70 }, { 40, 43 }, - { 41, 42 }, { -58, -57 }, { -56, -55 }, { 44, 45 }, - { -54, -52 }, { -51, -50 }, { 47, 54 }, { 48, 51 }, - { 49, 50 }, { -49, -48 }, { -47, -46 }, { 52, 53 }, - { -45, -44 }, { -43, -42 }, { 55, 58 }, { 56, 57 }, - { -41, -40 }, { -39, -38 }, { 59, 60 }, { -37, -36 }, - { -35, 61 }, { -34, -33 } -}; - -static const int8_t t_huffman_noise_bal_3_0dB[24][2] = { - { -64, 1 }, { -65, 2 }, { -63, 3 }, { 4, 9 }, - { -66, 5 }, { -62, 6 }, { 7, 8 }, { -76, -75 }, - { -74, -73 }, { 10, 17 }, { 11, 14 }, { 12, 13 }, - { -72, -71 }, { -70, -69 }, { 15, 16 }, { -68, -67 }, - { -61, -60 }, { 18, 21 }, { 19, 20 }, { -59, -58 }, - { -57, -56 }, { 22, 23 }, { -55, -54 }, { -53, -52 } -}; - - -static INLINE int16_t sbr_huff_dec(bitfile *ld, sbr_huff_tab t_huff) -{ - uint8_t bit; - int16_t index = 0; - - while (index >= 0) - { - bit = (uint8_t)faad_get1bit(ld); - index = t_huff[index][bit]; - } - - return index + 64; -} - -/* table 10 */ -void sbr_envelope(bitfile *ld, sbr_info *sbr, uint8_t ch) -{ - uint8_t env, band; - int8_t delta = 0; - sbr_huff_tab t_huff, f_huff; - - if ((sbr->L_E[ch] == 1) && (sbr->bs_frame_class[ch] == FIXFIX)) - sbr->amp_res[ch] = 0; - else - sbr->amp_res[ch] = sbr->bs_amp_res; - - if ((sbr->bs_coupling) && (ch == 1)) - { - delta = 1; - if (sbr->amp_res[ch]) - { - t_huff = t_huffman_env_bal_3_0dB; - f_huff = f_huffman_env_bal_3_0dB; - } else { - t_huff = t_huffman_env_bal_1_5dB; - f_huff = f_huffman_env_bal_1_5dB; - } - } else { - delta = 0; - if (sbr->amp_res[ch]) - { - t_huff = t_huffman_env_3_0dB; - f_huff = f_huffman_env_3_0dB; - } else { - t_huff = t_huffman_env_1_5dB; - f_huff = f_huffman_env_1_5dB; - } - } - - for (env = 0; env < sbr->L_E[ch]; env++) - { - if (sbr->bs_df_env[ch][env] == 0) - { - if ((sbr->bs_coupling == 1) && (ch == 1)) - { - if (sbr->amp_res[ch]) - { - sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 5 - DEBUGVAR(1,272,"sbr_envelope(): bs_data_env")) << delta); - } else { - sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 6 - DEBUGVAR(1,273,"sbr_envelope(): bs_data_env")) << delta); - } - } else { - if (sbr->amp_res[ch]) - { - sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 6 - DEBUGVAR(1,274,"sbr_envelope(): bs_data_env")) << delta); - } else { - sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 7 - DEBUGVAR(1,275,"sbr_envelope(): bs_data_env")) << delta); - } - } - - for (band = 1; band < sbr->n[sbr->f[ch][env]]; band++) - { - sbr->E[ch][band][env] = (sbr_huff_dec(ld, f_huff) << delta); - } - - } else { - for (band = 0; band < sbr->n[sbr->f[ch][env]]; band++) - { - sbr->E[ch][band][env] = (sbr_huff_dec(ld, t_huff) << delta); - } - } - } - - extract_envelope_data(sbr, ch); -} - -/* table 11 */ -void sbr_noise(bitfile *ld, sbr_info *sbr, uint8_t ch) -{ - uint8_t noise, band; - int8_t delta = 0; - sbr_huff_tab t_huff, f_huff; - - if ((sbr->bs_coupling == 1) && (ch == 1)) - { - delta = 1; - t_huff = t_huffman_noise_bal_3_0dB; - f_huff = f_huffman_env_bal_3_0dB; - } else { - delta = 0; - t_huff = t_huffman_noise_3_0dB; - f_huff = f_huffman_env_3_0dB; - } - - for (noise = 0; noise < sbr->L_Q[ch]; noise++) - { - if(sbr->bs_df_noise[ch][noise] == 0) - { - if ((sbr->bs_coupling == 1) && (ch == 1)) - { - sbr->Q[ch][0][noise] = (faad_getbits(ld, 5 - DEBUGVAR(1,276,"sbr_noise(): bs_data_noise")) << delta); - } else { - sbr->Q[ch][0][noise] = (faad_getbits(ld, 5 - DEBUGVAR(1,277,"sbr_noise(): bs_data_noise")) << delta); - } - for (band = 1; band < sbr->N_Q; band++) - { - sbr->Q[ch][band][noise] = (sbr_huff_dec(ld, f_huff) << delta); - } - } else { - for (band = 0; band < sbr->N_Q; band++) - { - sbr->Q[ch][band][noise] = (sbr_huff_dec(ld, t_huff) << delta); - } - } - } - - extract_noise_floor_data(sbr, ch); -} - -#endif diff --git a/src/libfaad/sbr_huff.h b/src/libfaad/sbr_huff.h deleted file mode 100644 index 631a43a8d..000000000 --- a/src/libfaad/sbr_huff.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_huff.h,v 1.7 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __SBR_HUFF_H__ -#define __SBR_HUFF_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -void sbr_envelope(bitfile *ld, sbr_info *sbr, uint8_t ch); -void sbr_noise(bitfile *ld, sbr_info *sbr, uint8_t ch); - -#ifdef __cplusplus -} -#endif -#endif - diff --git a/src/libfaad/sbr_noise.h b/src/libfaad/sbr_noise.h deleted file mode 100644 index a25fbf3cd..000000000 --- a/src/libfaad/sbr_noise.h +++ /dev/null @@ -1,561 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_noise.h,v 1.5 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __SBR_NOISE_H__ -#define __SBR_NOISE_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _MSC_VER -#pragma warning(disable:4305) -#pragma warning(disable:4244) -#endif - - -/* Table 1.A.13 Noise table V */ -ALIGN static const complex_t V[] = { - { FRAC_CONST(-0.99948155879974), FRAC_CONST(-0.59483414888382) }, - { FRAC_CONST(0.97113454341888), FRAC_CONST(-0.67528516054153) }, - { FRAC_CONST(0.14130051434040), FRAC_CONST(-0.95090985298157) }, - { FRAC_CONST(-0.47005495429039), FRAC_CONST(-0.37340548634529) }, - { FRAC_CONST(0.80705064535141), FRAC_CONST(0.29653668403625) }, - { FRAC_CONST(-0.38981479406357), FRAC_CONST(0.89572608470917) }, - { FRAC_CONST(-0.01053049881011), FRAC_CONST(-0.66959059238434) }, - { FRAC_CONST(-0.91266369819641), FRAC_CONST(-0.11522938311100) }, - { FRAC_CONST(0.54840421676636), FRAC_CONST(0.75221365690231) }, - { FRAC_CONST(0.40009254217148), FRAC_CONST(-0.98929399251938) }, - { FRAC_CONST(-0.99867975711823), FRAC_CONST(-0.88147068023682) }, - { FRAC_CONST(-0.95531076192856), FRAC_CONST(0.90908759832382) }, - { FRAC_CONST(-0.45725932717323), FRAC_CONST(-0.56716322898865) }, - { FRAC_CONST(-0.72929674386978), FRAC_CONST(-0.98008275032043) }, - { FRAC_CONST(0.75622802972794), FRAC_CONST(0.20950329303741) }, - { FRAC_CONST(0.07069442421198), FRAC_CONST(-0.78247898817062) }, - { FRAC_CONST(0.74496251344681), FRAC_CONST(-0.91169005632401) }, - { FRAC_CONST(-0.96440184116364), FRAC_CONST(-0.94739919900894) }, - { FRAC_CONST(0.30424630641937), FRAC_CONST(-0.49438267946243) }, - { FRAC_CONST(0.66565030813217), FRAC_CONST(0.64652937650681) }, - { FRAC_CONST(0.91697007417679), FRAC_CONST(0.17514097690582) }, - { FRAC_CONST(-0.70774918794632), FRAC_CONST(0.52548652887344) }, - { FRAC_CONST(-0.70051413774490), FRAC_CONST(-0.45340028405190) }, - { FRAC_CONST(-0.99496513605118), FRAC_CONST(-0.90071910619736) }, - { FRAC_CONST(0.98164492845535), FRAC_CONST(-0.77463155984879) }, - { FRAC_CONST(-0.54671579599380), FRAC_CONST(-0.02570928446949) }, - { FRAC_CONST(-0.01689629070461), FRAC_CONST(0.00287506449968) }, - { FRAC_CONST(-0.86110347509384), FRAC_CONST(0.42548584938049) }, - { FRAC_CONST(-0.98892980813980), FRAC_CONST(-0.87881129980087) }, - { FRAC_CONST(0.51756626367569), FRAC_CONST(0.66926783323288) }, - { FRAC_CONST(-0.99635028839111), FRAC_CONST(-0.58107727766037) }, - { FRAC_CONST(-0.99969369173050), FRAC_CONST(0.98369991779327) }, - { FRAC_CONST(0.55266261100769), FRAC_CONST(0.59449058771133) }, - { FRAC_CONST(0.34581178426743), FRAC_CONST(0.94879418611526) }, - { FRAC_CONST(0.62664210796356), FRAC_CONST(-0.74402970075607) }, - { FRAC_CONST(-0.77149701118469), FRAC_CONST(-0.33883658051491) }, - { FRAC_CONST(-0.91592246294022), FRAC_CONST(0.03687901422381) }, - { FRAC_CONST(-0.76285493373871), FRAC_CONST(-0.91371870040894) }, - { FRAC_CONST(0.79788339138031), FRAC_CONST(-0.93180972337723) }, - { FRAC_CONST(0.54473078250885), FRAC_CONST(-0.11919206380844) }, - { FRAC_CONST(-0.85639280080795), FRAC_CONST(0.42429855465889) }, - { FRAC_CONST(-0.92882400751114), FRAC_CONST(0.27871808409691) }, - { FRAC_CONST(-0.11708371341228), FRAC_CONST(-0.99800843000412) }, - { FRAC_CONST(0.21356749534607), FRAC_CONST(-0.90716296434402) }, - { FRAC_CONST(-0.76191693544388), FRAC_CONST(0.99768120050430) }, - { FRAC_CONST(0.98111045360565), FRAC_CONST(-0.95854461193085) }, - { FRAC_CONST(-0.85913270711899), FRAC_CONST(0.95766568183899) }, - { FRAC_CONST(-0.93307244777679), FRAC_CONST(0.49431759119034) }, - { FRAC_CONST(0.30485755205154), FRAC_CONST(-0.70540034770966) }, - { FRAC_CONST(0.85289651155472), FRAC_CONST(0.46766132116318) }, - { FRAC_CONST(0.91328084468842), FRAC_CONST(-0.99839597940445) }, - { FRAC_CONST(-0.05890199914575), FRAC_CONST(0.70741826295853) }, - { FRAC_CONST(0.28398686647415), FRAC_CONST(0.34633556008339) }, - { FRAC_CONST(0.95258164405823), FRAC_CONST(-0.54893416166306) }, - { FRAC_CONST(-0.78566324710846), FRAC_CONST(-0.75568538904190) }, - { FRAC_CONST(-0.95789498090744), FRAC_CONST(-0.20423194766045) }, - { FRAC_CONST(0.82411158084869), FRAC_CONST(0.96654617786407) }, - { FRAC_CONST(-0.65185445547104), FRAC_CONST(-0.88734990358353) }, - { FRAC_CONST(-0.93643605709076), FRAC_CONST(0.99870789051056) }, - { FRAC_CONST(0.91427159309387), FRAC_CONST(-0.98290503025055) }, - { FRAC_CONST(-0.70395684242249), FRAC_CONST(0.58796799182892) }, - { FRAC_CONST(0.00563771976158), FRAC_CONST(0.61768198013306) }, - { FRAC_CONST(0.89065051078796), FRAC_CONST(0.52783352136612) }, - { FRAC_CONST(-0.68683707714081), FRAC_CONST(0.80806946754456) }, - { FRAC_CONST(0.72165340185165), FRAC_CONST(-0.69259858131409) }, - { FRAC_CONST(-0.62928247451782), FRAC_CONST(0.13627037405968) }, - { FRAC_CONST(0.29938435554504), FRAC_CONST(-0.46051329374313) }, - { FRAC_CONST(-0.91781955957413), FRAC_CONST(-0.74012714624405) }, - { FRAC_CONST(0.99298715591431), FRAC_CONST(0.40816611051559) }, - { FRAC_CONST(0.82368296384811), FRAC_CONST(-0.74036049842834) }, - { FRAC_CONST(-0.98512834310532), FRAC_CONST(-0.99972331523895) }, - { FRAC_CONST(-0.95915371179581), FRAC_CONST(-0.99237799644470) }, - { FRAC_CONST(-0.21411126852036), FRAC_CONST(-0.93424820899963) }, - { FRAC_CONST(-0.68821477890015), FRAC_CONST(-0.26892307400703) }, - { FRAC_CONST(0.91851997375488), FRAC_CONST(0.09358228743076) }, - { FRAC_CONST(-0.96062767505646), FRAC_CONST(0.36099094152451) }, - { FRAC_CONST(0.51646184921265), FRAC_CONST(-0.71373331546783) }, - { FRAC_CONST(0.61130720376968), FRAC_CONST(0.46950140595436) }, - { FRAC_CONST(0.47336128354073), FRAC_CONST(-0.27333179116249) }, - { FRAC_CONST(0.90998309850693), FRAC_CONST(0.96715664863586) }, - { FRAC_CONST(0.44844800233841), FRAC_CONST(0.99211573600769) }, - { FRAC_CONST(0.66614890098572), FRAC_CONST(0.96590173244476) }, - { FRAC_CONST(0.74922239780426), FRAC_CONST(-0.89879858493805) }, - { FRAC_CONST(-0.99571585655212), FRAC_CONST(0.52785521745682) }, - { FRAC_CONST(0.97401082515717), FRAC_CONST(-0.16855870187283) }, - { FRAC_CONST(0.72683745622635), FRAC_CONST(-0.48060774803162) }, - { FRAC_CONST(0.95432192087173), FRAC_CONST(0.68849605321884) }, - { FRAC_CONST(-0.72962206602097), FRAC_CONST(-0.76608443260193) }, - { FRAC_CONST(-0.85359477996826), FRAC_CONST(0.88738125562668) }, - { FRAC_CONST(-0.81412428617477), FRAC_CONST(-0.97480767965317) }, - { FRAC_CONST(-0.87930774688721), FRAC_CONST(0.74748307466507) }, - { FRAC_CONST(-0.71573328971863), FRAC_CONST(-0.98570609092712) }, - { FRAC_CONST(0.83524298667908), FRAC_CONST(0.83702534437180) }, - { FRAC_CONST(-0.48086065053940), FRAC_CONST(-0.98848503828049) }, - { FRAC_CONST(0.97139126062393), FRAC_CONST(0.80093622207642) }, - { FRAC_CONST(0.51992827653885), FRAC_CONST(0.80247628688812) }, - { FRAC_CONST(-0.00848591234535), FRAC_CONST(-0.76670128107071) }, - { FRAC_CONST(-0.70294374227524), FRAC_CONST(0.55359911918640) }, - { FRAC_CONST(-0.95894426107407), FRAC_CONST(-0.43265503644943) }, - { FRAC_CONST(0.97079253196716), FRAC_CONST(0.09325857460499) }, - { FRAC_CONST(-0.92404294013977), FRAC_CONST(0.85507702827454) }, - { FRAC_CONST(-0.69506472349167), FRAC_CONST(0.98633414506912) }, - { FRAC_CONST(0.26559203863144), FRAC_CONST(0.73314309120178) }, - { FRAC_CONST(0.28038442134857), FRAC_CONST(0.14537914097309) }, - { FRAC_CONST(-0.74138122797012), FRAC_CONST(0.99310338497162) }, - { FRAC_CONST(-0.01752796024084), FRAC_CONST(-0.82616633176804) }, - { FRAC_CONST(-0.55126774311066), FRAC_CONST(-0.98898541927338) }, - { FRAC_CONST(0.97960901260376), FRAC_CONST(-0.94021445512772) }, - { FRAC_CONST(-0.99196308851242), FRAC_CONST(0.67019015550613) }, - { FRAC_CONST(-0.67684930562973), FRAC_CONST(0.12631492316723) }, - { FRAC_CONST(0.09140039235353), FRAC_CONST(-0.20537731051445) }, - { FRAC_CONST(-0.71658962965012), FRAC_CONST(-0.97788202762604) }, - { FRAC_CONST(0.81014639139175), FRAC_CONST(0.53722649812698) }, - { FRAC_CONST(0.40616992115974), FRAC_CONST(-0.26469007134438) }, - { FRAC_CONST(-0.67680186033249), FRAC_CONST(0.94502049684525) }, - { FRAC_CONST(0.86849772930145), FRAC_CONST(-0.18333598971367) }, - { FRAC_CONST(-0.99500381946564), FRAC_CONST(-0.02634122036397) }, - { FRAC_CONST(0.84329187870026), FRAC_CONST(0.10406957566738) }, - { FRAC_CONST(-0.09215968847275), FRAC_CONST(0.69540011882782) }, - { FRAC_CONST(0.99956172704697), FRAC_CONST(-0.12358541786671) }, - { FRAC_CONST(-0.79732781648636), FRAC_CONST(-0.91582524776459) }, - { FRAC_CONST(0.96349972486496), FRAC_CONST(0.96640455722809) }, - { FRAC_CONST(-0.79942780733109), FRAC_CONST(0.64323902130127) }, - { FRAC_CONST(-0.11566039919853), FRAC_CONST(0.28587844967842) }, - { FRAC_CONST(-0.39922955632210), FRAC_CONST(0.94129604101181) }, - { FRAC_CONST(0.99089199304581), FRAC_CONST(-0.92062628269196) }, - { FRAC_CONST(0.28631284832954), FRAC_CONST(-0.91035044193268) }, - { FRAC_CONST(-0.83302724361420), FRAC_CONST(-0.67330408096313) }, - { FRAC_CONST(0.95404446125031), FRAC_CONST(0.49162766337395) }, - { FRAC_CONST(-0.06449863314629), FRAC_CONST(0.03250560909510) }, - { FRAC_CONST(-0.99575054645538), FRAC_CONST(0.42389783263206) }, - { FRAC_CONST(-0.65501141548157), FRAC_CONST(0.82546114921570) }, - { FRAC_CONST(-0.81254440546036), FRAC_CONST(-0.51627236604691) }, - { FRAC_CONST(-0.99646371603012), FRAC_CONST(0.84490531682968) }, - { FRAC_CONST(0.00287840608507), FRAC_CONST(0.64768260717392) }, - { FRAC_CONST(0.70176988840103), FRAC_CONST(-0.20453028380871) }, - { FRAC_CONST(0.96361881494522), FRAC_CONST(0.40706968307495) }, - { FRAC_CONST(-0.68883758783340), FRAC_CONST(0.91338956356049) }, - { FRAC_CONST(-0.34875586628914), FRAC_CONST(0.71472293138504) }, - { FRAC_CONST(0.91980081796646), FRAC_CONST(0.66507452726364) }, - { FRAC_CONST(-0.99009048938751), FRAC_CONST(0.85868018865585) }, - { FRAC_CONST(0.68865793943405), FRAC_CONST(0.55660319328308) }, - { FRAC_CONST(-0.99484401941299), FRAC_CONST(-0.20052559673786) }, - { FRAC_CONST(0.94214510917664), FRAC_CONST(-0.99696427583694) }, - { FRAC_CONST(-0.67414629459381), FRAC_CONST(0.49548220634460) }, - { FRAC_CONST(-0.47339352965355), FRAC_CONST(-0.85904330015182) }, - { FRAC_CONST(0.14323651790619), FRAC_CONST(-0.94145596027374) }, - { FRAC_CONST(-0.29268294572830), FRAC_CONST(0.05759225040674) }, - { FRAC_CONST(0.43793860077858), FRAC_CONST(-0.78904968500137) }, - { FRAC_CONST(-0.36345127224922), FRAC_CONST(0.64874434471130) }, - { FRAC_CONST(-0.08750604838133), FRAC_CONST(0.97686946392059) }, - { FRAC_CONST(-0.96495270729065), FRAC_CONST(-0.53960305452347) }, - { FRAC_CONST(0.55526942014694), FRAC_CONST(0.78891521692276) }, - { FRAC_CONST(0.73538213968277), FRAC_CONST(0.96452075242996) }, - { FRAC_CONST(-0.30889773368835), FRAC_CONST(-0.80664390325546) }, - { FRAC_CONST(0.03574995696545), FRAC_CONST(-0.97325617074966) }, - { FRAC_CONST(0.98720687627792), FRAC_CONST(0.48409134149551) }, - { FRAC_CONST(-0.81689298152924), FRAC_CONST(-0.90827703475952) }, - { FRAC_CONST(0.67866861820221), FRAC_CONST(0.81284505128860) }, - { FRAC_CONST(-0.15808570384979), FRAC_CONST(0.85279554128647) }, - { FRAC_CONST(0.80723392963409), FRAC_CONST(-0.24717418849468) }, - { FRAC_CONST(0.47788757085800), FRAC_CONST(-0.46333149075508) }, - { FRAC_CONST(0.96367555856705), FRAC_CONST(0.38486748933792) }, - { FRAC_CONST(-0.99143874645233), FRAC_CONST(-0.24945276975632) }, - { FRAC_CONST(0.83081877231598), FRAC_CONST(-0.94780850410461) }, - { FRAC_CONST(-0.58753192424774), FRAC_CONST(0.01290772389621) }, - { FRAC_CONST(0.95538109540939), FRAC_CONST(-0.85557049512863) }, - { FRAC_CONST(-0.96490919589996), FRAC_CONST(-0.64020973443985) }, - { FRAC_CONST(-0.97327101230621), FRAC_CONST(0.12378127872944) }, - { FRAC_CONST(0.91400367021561), FRAC_CONST(0.57972472906113) }, - { FRAC_CONST(-0.99925839900970), FRAC_CONST(0.71084845066071) }, - { FRAC_CONST(-0.86875903606415), FRAC_CONST(-0.20291699469090) }, - { FRAC_CONST(-0.26240035891533), FRAC_CONST(-0.68264555931091) }, - { FRAC_CONST(-0.24664412438869), FRAC_CONST(-0.87642270326614) }, - { FRAC_CONST(0.02416275814176), FRAC_CONST(0.27192914485931) }, - { FRAC_CONST(0.82068622112274), FRAC_CONST(-0.85087788105011) }, - { FRAC_CONST(0.88547372817993), FRAC_CONST(-0.89636802673340) }, - { FRAC_CONST(-0.18173077702522), FRAC_CONST(-0.26152145862579) }, - { FRAC_CONST(0.09355476498604), FRAC_CONST(0.54845124483109) }, - { FRAC_CONST(-0.54668414592743), FRAC_CONST(0.95980775356293) }, - { FRAC_CONST(0.37050989270210), FRAC_CONST(-0.59910142421722) }, - { FRAC_CONST(-0.70373594760895), FRAC_CONST(0.91227668523788) }, - { FRAC_CONST(-0.34600785374641), FRAC_CONST(-0.99441426992416) }, - { FRAC_CONST(-0.68774479627609), FRAC_CONST(-0.30238837003708) }, - { FRAC_CONST(-0.26843291521072), FRAC_CONST(0.83115667104721) }, - { FRAC_CONST(0.49072334170341), FRAC_CONST(-0.45359709858894) }, - { FRAC_CONST(0.38975992798805), FRAC_CONST(0.95515358448029) }, - { FRAC_CONST(-0.97757124900818), FRAC_CONST(0.05305894464254) }, - { FRAC_CONST(-0.17325553297997), FRAC_CONST(-0.92770671844482) }, - { FRAC_CONST(0.99948036670685), FRAC_CONST(0.58285546302795) }, - { FRAC_CONST(-0.64946246147156), FRAC_CONST(0.68645507097244) }, - { FRAC_CONST(-0.12016920745373), FRAC_CONST(-0.57147324085236) }, - { FRAC_CONST(-0.58947455883026), FRAC_CONST(-0.34847131371498) }, - { FRAC_CONST(-0.41815140843391), FRAC_CONST(0.16276422142982) }, - { FRAC_CONST(0.99885648488998), FRAC_CONST(0.11136095225811) }, - { FRAC_CONST(-0.56649613380432), FRAC_CONST(-0.90494865179062) }, - { FRAC_CONST(0.94138020277023), FRAC_CONST(0.35281917452812) }, - { FRAC_CONST(-0.75725078582764), FRAC_CONST(0.53650552034378) }, - { FRAC_CONST(0.20541973412037), FRAC_CONST(-0.94435143470764) }, - { FRAC_CONST(0.99980372190475), FRAC_CONST(0.79835915565491) }, - { FRAC_CONST(0.29078277945518), FRAC_CONST(0.35393777489662) }, - { FRAC_CONST(-0.62858772277832), FRAC_CONST(0.38765692710876) }, - { FRAC_CONST(0.43440905213356), FRAC_CONST(-0.98546332120895) }, - { FRAC_CONST(-0.98298585414886), FRAC_CONST(0.21021524071693) }, - { FRAC_CONST(0.19513028860092), FRAC_CONST(-0.94239830970764) }, - { FRAC_CONST(-0.95476663112640), FRAC_CONST(0.98364555835724) }, - { FRAC_CONST(0.93379634618759), FRAC_CONST(-0.70881992578506) }, - { FRAC_CONST(-0.85235410928726), FRAC_CONST(-0.08342348039150) }, - { FRAC_CONST(-0.86425095796585), FRAC_CONST(-0.45795026421547) }, - { FRAC_CONST(0.38879778981209), FRAC_CONST(0.97274428606033) }, - { FRAC_CONST(0.92045122385025), FRAC_CONST(-0.62433654069901) }, - { FRAC_CONST(0.89162534475327), FRAC_CONST(0.54950958490372) }, - { FRAC_CONST(-0.36834338307381), FRAC_CONST(0.96458297967911) }, - { FRAC_CONST(0.93891763687134), FRAC_CONST(-0.89968353509903) }, - { FRAC_CONST(0.99267655611038), FRAC_CONST(-0.03757034242153) }, - { FRAC_CONST(-0.94063472747803), FRAC_CONST(0.41332337260246) }, - { FRAC_CONST(0.99740225076675), FRAC_CONST(-0.16830494999886) }, - { FRAC_CONST(-0.35899412631989), FRAC_CONST(-0.46633225679398) }, - { FRAC_CONST(0.05237237364054), FRAC_CONST(-0.25640362501144) }, - { FRAC_CONST(0.36703583598137), FRAC_CONST(-0.38653266429901) }, - { FRAC_CONST(0.91653180122375), FRAC_CONST(-0.30587628483772) }, - { FRAC_CONST(0.69000804424286), FRAC_CONST(0.90952169895172) }, - { FRAC_CONST(-0.38658750057220), FRAC_CONST(0.99501574039459) }, - { FRAC_CONST(-0.29250815510750), FRAC_CONST(0.37444993853569) }, - { FRAC_CONST(-0.60182201862335), FRAC_CONST(0.86779648065567) }, - { FRAC_CONST(-0.97418588399887), FRAC_CONST(0.96468526124954) }, - { FRAC_CONST(0.88461571931839), FRAC_CONST(0.57508403062820) }, - { FRAC_CONST(0.05198933184147), FRAC_CONST(0.21269661188126) }, - { FRAC_CONST(-0.53499621152878), FRAC_CONST(0.97241556644440) }, - { FRAC_CONST(-0.49429559707642), FRAC_CONST(0.98183864355087) }, - { FRAC_CONST(-0.98935145139694), FRAC_CONST(-0.40249159932137) }, - { FRAC_CONST(-0.98081380128860), FRAC_CONST(-0.72856897115707) }, - { FRAC_CONST(-0.27338150143623), FRAC_CONST(0.99950921535492) }, - { FRAC_CONST(0.06310802698135), FRAC_CONST(-0.54539585113525) }, - { FRAC_CONST(-0.20461677014828), FRAC_CONST(-0.14209978282452) }, - { FRAC_CONST(0.66223841905594), FRAC_CONST(0.72528582811356) }, - { FRAC_CONST(-0.84764343500137), FRAC_CONST(0.02372316829860) }, - { FRAC_CONST(-0.89039862155914), FRAC_CONST(0.88866579532623) }, - { FRAC_CONST(0.95903307199478), FRAC_CONST(0.76744925975800) }, - { FRAC_CONST(0.73504126071930), FRAC_CONST(-0.03747203201056) }, - { FRAC_CONST(-0.31744435429573), FRAC_CONST(-0.36834111809731) }, - { FRAC_CONST(-0.34110826253891), FRAC_CONST(0.40211221575737) }, - { FRAC_CONST(0.47803884744644), FRAC_CONST(-0.39423218369484) }, - { FRAC_CONST(0.98299193382263), FRAC_CONST(0.01989791356027) }, - { FRAC_CONST(-0.30963072180748), FRAC_CONST(-0.18076720833778) }, - { FRAC_CONST(0.99992591142654), FRAC_CONST(-0.26281872391701) }, - { FRAC_CONST(-0.93149733543396), FRAC_CONST(-0.98313164710999) }, - { FRAC_CONST(0.99923473596573), FRAC_CONST(-0.80142992734909) }, - { FRAC_CONST(-0.26024168729782), FRAC_CONST(-0.75999760627747) }, - { FRAC_CONST(-0.35712513327599), FRAC_CONST(0.19298963248730) }, - { FRAC_CONST(-0.99899083375931), FRAC_CONST(0.74645155668259) }, - { FRAC_CONST(0.86557173728943), FRAC_CONST(0.55593866109848) }, - { FRAC_CONST(0.33408042788506), FRAC_CONST(0.86185956001282) }, - { FRAC_CONST(0.99010735750198), FRAC_CONST(0.04602397605777) }, - { FRAC_CONST(-0.66694271564484), FRAC_CONST(-0.91643613576889) }, - { FRAC_CONST(0.64016789197922), FRAC_CONST(0.15649530291557) }, - { FRAC_CONST(0.99570536613464), FRAC_CONST(0.45844584703445) }, - { FRAC_CONST(-0.63431465625763), FRAC_CONST(0.21079117059708) }, - { FRAC_CONST(-0.07706847041845), FRAC_CONST(-0.89581435918808) }, - { FRAC_CONST(0.98590087890625), FRAC_CONST(0.88241720199585) }, - { FRAC_CONST(0.80099332332611), FRAC_CONST(-0.36851897835732) }, - { FRAC_CONST(0.78368133306503), FRAC_CONST(0.45506998896599) }, - { FRAC_CONST(0.08707806468010), FRAC_CONST(0.80938994884491) }, - { FRAC_CONST(-0.86811882257462), FRAC_CONST(0.39347308874130) }, - { FRAC_CONST(-0.39466530084610), FRAC_CONST(-0.66809433698654) }, - { FRAC_CONST(0.97875326871872), FRAC_CONST(-0.72467839717865) }, - { FRAC_CONST(-0.95038563013077), FRAC_CONST(0.89563220739365) }, - { FRAC_CONST(0.17005239427090), FRAC_CONST(0.54683053493500) }, - { FRAC_CONST(-0.76910793781281), FRAC_CONST(-0.96226614713669) }, - { FRAC_CONST(0.99743282794952), FRAC_CONST(0.42697158455849) }, - { FRAC_CONST(0.95437383651733), FRAC_CONST(0.97002321481705) }, - { FRAC_CONST(0.99578905105591), FRAC_CONST(-0.54106825590134) }, - { FRAC_CONST(0.28058260679245), FRAC_CONST(-0.85361421108246) }, - { FRAC_CONST(0.85256522893906), FRAC_CONST(-0.64567607641220) }, - { FRAC_CONST(-0.50608539581299), FRAC_CONST(-0.65846014022827) }, - { FRAC_CONST(-0.97210735082626), FRAC_CONST(-0.23095212876797) }, - { FRAC_CONST(0.95424050092697), FRAC_CONST(-0.99240148067474) }, - { FRAC_CONST(-0.96926569938660), FRAC_CONST(0.73775655031204) }, - { FRAC_CONST(0.30872163176537), FRAC_CONST(0.41514959931374) }, - { FRAC_CONST(-0.24523839354515), FRAC_CONST(0.63206630945206) }, - { FRAC_CONST(-0.33813264966011), FRAC_CONST(-0.38661777973175) }, - { FRAC_CONST(-0.05826828256249), FRAC_CONST(-0.06940773874521) }, - { FRAC_CONST(-0.22898460924625), FRAC_CONST(0.97054851055145) }, - { FRAC_CONST(-0.18509915471077), FRAC_CONST(0.47565764188766) }, - { FRAC_CONST(-0.10488238185644), FRAC_CONST(-0.87769949436188) }, - { FRAC_CONST(-0.71886587142944), FRAC_CONST(0.78030979633331) }, - { FRAC_CONST(0.99793875217438), FRAC_CONST(0.90041309595108) }, - { FRAC_CONST(0.57563304901123), FRAC_CONST(-0.91034334897995) }, - { FRAC_CONST(0.28909647464752), FRAC_CONST(0.96307784318924) }, - { FRAC_CONST(0.42188999056816), FRAC_CONST(0.48148649930954) }, - { FRAC_CONST(0.93335050344467), FRAC_CONST(-0.43537023663521) }, - { FRAC_CONST(-0.97087377309799), FRAC_CONST(0.86636447906494) }, - { FRAC_CONST(0.36722871661186), FRAC_CONST(0.65291655063629) }, - { FRAC_CONST(-0.81093025207520), FRAC_CONST(0.08778370171785) }, - { FRAC_CONST(-0.26240602135658), FRAC_CONST(-0.92774093151093) }, - { FRAC_CONST(0.83996498584747), FRAC_CONST(0.55839848518372) }, - { FRAC_CONST(-0.99909615516663), FRAC_CONST(-0.96024608612061) }, - { FRAC_CONST(0.74649465084076), FRAC_CONST(0.12144893407822) }, - { FRAC_CONST(-0.74774593114853), FRAC_CONST(-0.26898062229156) }, - { FRAC_CONST(0.95781666040421), FRAC_CONST(-0.79047924280167) }, - { FRAC_CONST(0.95472306013107), FRAC_CONST(-0.08588775992393) }, - { FRAC_CONST(0.48708331584930), FRAC_CONST(0.99999040365219) }, - { FRAC_CONST(0.46332037448883), FRAC_CONST(0.10964126139879) }, - { FRAC_CONST(-0.76497006416321), FRAC_CONST(0.89210927486420) }, - { FRAC_CONST(0.57397389411926), FRAC_CONST(0.35289704799652) }, - { FRAC_CONST(0.75374317169189), FRAC_CONST(0.96705216169357) }, - { FRAC_CONST(-0.59174400568008), FRAC_CONST(-0.89405369758606) }, - { FRAC_CONST(0.75087904930115), FRAC_CONST(-0.29612672328949) }, - { FRAC_CONST(-0.98607856035233), FRAC_CONST(0.25034910440445) }, - { FRAC_CONST(-0.40761056542397), FRAC_CONST(-0.90045571327209) }, - { FRAC_CONST(0.66929268836975), FRAC_CONST(0.98629492521286) }, - { FRAC_CONST(-0.97463697195053), FRAC_CONST(-0.00190223299433) }, - { FRAC_CONST(0.90145510435104), FRAC_CONST(0.99781388044357) }, - { FRAC_CONST(-0.87259286642075), FRAC_CONST(0.99233585596085) }, - { FRAC_CONST(-0.91529458761215), FRAC_CONST(-0.15698707103729) }, - { FRAC_CONST(-0.03305738791823), FRAC_CONST(-0.37205263972282) }, - { FRAC_CONST(0.07223051041365), FRAC_CONST(-0.88805001974106) }, - { FRAC_CONST(0.99498009681702), FRAC_CONST(0.97094357013702) }, - { FRAC_CONST(-0.74904936552048), FRAC_CONST(0.99985486268997) }, - { FRAC_CONST(0.04585228487849), FRAC_CONST(0.99812334775925) }, - { FRAC_CONST(-0.89054954051971), FRAC_CONST(-0.31791913509369) }, - { FRAC_CONST(-0.83782142400742), FRAC_CONST(0.97637635469437) }, - { FRAC_CONST(0.33454805612564), FRAC_CONST(-0.86231517791748) }, - { FRAC_CONST(-0.99707579612732), FRAC_CONST(0.93237990140915) }, - { FRAC_CONST(-0.22827528417110), FRAC_CONST(0.18874759972095) }, - { FRAC_CONST(0.67248046398163), FRAC_CONST(-0.03646211326122) }, - { FRAC_CONST(-0.05146538093686), FRAC_CONST(-0.92599701881409) }, - { FRAC_CONST(0.99947297573090), FRAC_CONST(0.93625229597092) }, - { FRAC_CONST(0.66951125860214), FRAC_CONST(0.98905825614929) }, - { FRAC_CONST(-0.99602955579758), FRAC_CONST(-0.44654715061188) }, - { FRAC_CONST(0.82104903459549), FRAC_CONST(0.99540740251541) }, - { FRAC_CONST(0.99186509847641), FRAC_CONST(0.72022998332977) }, - { FRAC_CONST(-0.65284591913223), FRAC_CONST(0.52186721563339) }, - { FRAC_CONST(0.93885445594788), FRAC_CONST(-0.74895310401917) }, - { FRAC_CONST(0.96735250949860), FRAC_CONST(0.90891814231873) }, - { FRAC_CONST(-0.22225968539715), FRAC_CONST(0.57124030590057) }, - { FRAC_CONST(-0.44132784008980), FRAC_CONST(-0.92688840627670) }, - { FRAC_CONST(-0.85694974660873), FRAC_CONST(0.88844531774521) }, - { FRAC_CONST(0.91783040761948), FRAC_CONST(-0.46356892585754) }, - { FRAC_CONST(0.72556972503662), FRAC_CONST(-0.99899554252625) }, - { FRAC_CONST(-0.99711579084396), FRAC_CONST(0.58211559057236) }, - { FRAC_CONST(0.77638977766037), FRAC_CONST(0.94321835041046) }, - { FRAC_CONST(0.07717324048281), FRAC_CONST(0.58638399839401) }, - { FRAC_CONST(-0.56049829721451), FRAC_CONST(0.82522302865982) }, - { FRAC_CONST(0.98398894071579), FRAC_CONST(0.39467439055443) }, - { FRAC_CONST(0.47546947002411), FRAC_CONST(0.68613046407700) }, - { FRAC_CONST(0.65675091743469), FRAC_CONST(0.18331636488438) }, - { FRAC_CONST(0.03273375332355), FRAC_CONST(-0.74933111667633) }, - { FRAC_CONST(-0.38684144616127), FRAC_CONST(0.51337349414825) }, - { FRAC_CONST(-0.97346270084381), FRAC_CONST(-0.96549361944199) }, - { FRAC_CONST(-0.53282153606415), FRAC_CONST(-0.91423267126083) }, - { FRAC_CONST(0.99817311763763), FRAC_CONST(0.61133575439453) }, - { FRAC_CONST(-0.50254499912262), FRAC_CONST(-0.88829338550568) }, - { FRAC_CONST(0.01995873264968), FRAC_CONST(0.85223513841629) }, - { FRAC_CONST(0.99930381774902), FRAC_CONST(0.94578897953033) }, - { FRAC_CONST(0.82907766103745), FRAC_CONST(-0.06323442608118) }, - { FRAC_CONST(-0.58660709857941), FRAC_CONST(0.96840775012970) }, - { FRAC_CONST(-0.17573736608028), FRAC_CONST(-0.48166921734810) }, - { FRAC_CONST(0.83434289693832), FRAC_CONST(-0.13023450970650) }, - { FRAC_CONST(0.05946491286159), FRAC_CONST(0.20511047542095) }, - { FRAC_CONST(0.81505483388901), FRAC_CONST(-0.94685947895050) }, - { FRAC_CONST(-0.44976380467415), FRAC_CONST(0.40894573926926) }, - { FRAC_CONST(-0.89746475219727), FRAC_CONST(0.99846577644348) }, - { FRAC_CONST(0.39677256345749), FRAC_CONST(-0.74854665994644) }, - { FRAC_CONST(-0.07588948309422), FRAC_CONST(0.74096214771271) }, - { FRAC_CONST(0.76343196630478), FRAC_CONST(0.41746628284454) }, - { FRAC_CONST(-0.74490106105804), FRAC_CONST(0.94725912809372) }, - { FRAC_CONST(0.64880120754242), FRAC_CONST(0.41336661577225) }, - { FRAC_CONST(0.62319535017014), FRAC_CONST(-0.93098312616348) }, - { FRAC_CONST(0.42215818166733), FRAC_CONST(-0.07712787389755) }, - { FRAC_CONST(0.02704554051161), FRAC_CONST(-0.05417517945170) }, - { FRAC_CONST(0.80001771450043), FRAC_CONST(0.91542196273804) }, - { FRAC_CONST(-0.79351830482483), FRAC_CONST(-0.36208897829056) }, - { FRAC_CONST(0.63872361183167), FRAC_CONST(0.08128252625465) }, - { FRAC_CONST(0.52890521287918), FRAC_CONST(0.60048872232437) }, - { FRAC_CONST(0.74238550662994), FRAC_CONST(0.04491915181279) }, - { FRAC_CONST(0.99096131324768), FRAC_CONST(-0.19451183080673) }, - { FRAC_CONST(-0.80412328243256), FRAC_CONST(-0.88513815402985) }, - { FRAC_CONST(-0.64612615108490), FRAC_CONST(0.72198677062988) }, - { FRAC_CONST(0.11657770723104), FRAC_CONST(-0.83662831783295) }, - { FRAC_CONST(-0.95053184032440), FRAC_CONST(-0.96939903497696) }, - { FRAC_CONST(-0.62228870391846), FRAC_CONST(0.82767260074615) }, - { FRAC_CONST(0.03004475869238), FRAC_CONST(-0.99738895893097) }, - { FRAC_CONST(-0.97987216711044), FRAC_CONST(0.36526128649712) }, - { FRAC_CONST(-0.99986982345581), FRAC_CONST(-0.36021611094475) }, - { FRAC_CONST(0.89110648632050), FRAC_CONST(-0.97894251346588) }, - { FRAC_CONST(0.10407960414886), FRAC_CONST(0.77357792854309) }, - { FRAC_CONST(0.95964735746384), FRAC_CONST(-0.35435819625854) }, - { FRAC_CONST(0.50843232870102), FRAC_CONST(0.96107691526413) }, - { FRAC_CONST(0.17006334662437), FRAC_CONST(-0.76854026317596) }, - { FRAC_CONST(0.25872674584389), FRAC_CONST(0.99893301725388) }, - { FRAC_CONST(-0.01115998718888), FRAC_CONST(0.98496019840240) }, - { FRAC_CONST(-0.79598701000214), FRAC_CONST(0.97138410806656) }, - { FRAC_CONST(-0.99264711141586), FRAC_CONST(-0.99542820453644) }, - { FRAC_CONST(-0.99829661846161), FRAC_CONST(0.01877138763666) }, - { FRAC_CONST(-0.70801013708115), FRAC_CONST(0.33680686354637) }, - { FRAC_CONST(-0.70467054843903), FRAC_CONST(0.93272775411606) }, - { FRAC_CONST(0.99846023321152), FRAC_CONST(-0.98725748062134) }, - { FRAC_CONST(-0.63364970684052), FRAC_CONST(-0.16473594307899) }, - { FRAC_CONST(-0.16258217394352), FRAC_CONST(-0.95939123630524) }, - { FRAC_CONST(-0.43645593523979), FRAC_CONST(-0.94805032014847) }, - { FRAC_CONST(-0.99848473072052), FRAC_CONST(0.96245169639587) }, - { FRAC_CONST(-0.16796459257603), FRAC_CONST(-0.98987513780594) }, - { FRAC_CONST(-0.87979227304459), FRAC_CONST(-0.71725726127625) }, - { FRAC_CONST(0.44183099269867), FRAC_CONST(-0.93568974733353) }, - { FRAC_CONST(0.93310177326202), FRAC_CONST(-0.99913311004639) }, - { FRAC_CONST(-0.93941932916641), FRAC_CONST(-0.56409376859665) }, - { FRAC_CONST(-0.88590002059937), FRAC_CONST(0.47624599933624) }, - { FRAC_CONST(0.99971461296082), FRAC_CONST(-0.83889955282211) }, - { FRAC_CONST(-0.75376385450363), FRAC_CONST(0.00814643409103) }, - { FRAC_CONST(0.93887686729431), FRAC_CONST(-0.11284527927637) }, - { FRAC_CONST(0.85126435756683), FRAC_CONST(0.52349251508713) }, - { FRAC_CONST(0.39701420068741), FRAC_CONST(0.81779634952545) }, - { FRAC_CONST(-0.37024465203285), FRAC_CONST(-0.87071657180786) }, - { FRAC_CONST(-0.36024826765060), FRAC_CONST(0.34655734896660) }, - { FRAC_CONST(-0.93388813734055), FRAC_CONST(-0.84476542472839) }, - { FRAC_CONST(-0.65298801660538), FRAC_CONST(-0.18439576029778) }, - { FRAC_CONST(0.11960318684578), FRAC_CONST(0.99899345636368) }, - { FRAC_CONST(0.94292563199997), FRAC_CONST(0.83163905143738) }, - { FRAC_CONST(0.75081145763397), FRAC_CONST(-0.35533222556114) }, - { FRAC_CONST(0.56721979379654), FRAC_CONST(-0.24076835811138) }, - { FRAC_CONST(0.46857765316963), FRAC_CONST(-0.30140233039856) }, - { FRAC_CONST(0.97312313318253), FRAC_CONST(-0.99548190832138) }, - { FRAC_CONST(-0.38299977779388), FRAC_CONST(0.98516911268234) }, - { FRAC_CONST(0.41025799512863), FRAC_CONST(0.02116736955941) }, - { FRAC_CONST(0.09638062119484), FRAC_CONST(0.04411984235048) }, - { FRAC_CONST(-0.85283249616623), FRAC_CONST(0.91475564241409) }, - { FRAC_CONST(0.88866806030273), FRAC_CONST(-0.99735265970230) }, - { FRAC_CONST(-0.48202428221703), FRAC_CONST(-0.96805608272552) }, - { FRAC_CONST(0.27572581171989), FRAC_CONST(0.58634752035141) }, - { FRAC_CONST(-0.65889132022858), FRAC_CONST(0.58835631608963) }, - { FRAC_CONST(0.98838084936142), FRAC_CONST(0.99994349479675) }, - { FRAC_CONST(-0.20651349425316), FRAC_CONST(0.54593044519424) }, - { FRAC_CONST(-0.62126415967941), FRAC_CONST(-0.59893679618835) }, - { FRAC_CONST(0.20320105552673), FRAC_CONST(-0.86879181861877) }, - { FRAC_CONST(-0.97790551185608), FRAC_CONST(0.96290808916092) }, - { FRAC_CONST(0.11112534999847), FRAC_CONST(0.21484763920307) }, - { FRAC_CONST(-0.41368338465691), FRAC_CONST(0.28216838836670) }, - { FRAC_CONST(0.24133038520813), FRAC_CONST(0.51294362545013) }, - { FRAC_CONST(-0.66393411159515), FRAC_CONST(-0.08249679952860) }, - { FRAC_CONST(-0.53697830438614), FRAC_CONST(-0.97649902105331) }, - { FRAC_CONST(-0.97224736213684), FRAC_CONST(0.22081333398819) }, - { FRAC_CONST(0.87392479181290), FRAC_CONST(-0.12796173989773) }, - { FRAC_CONST(0.19050361216068), FRAC_CONST(0.01602615416050) }, - { FRAC_CONST(-0.46353441476822), FRAC_CONST(-0.95249038934708) }, - { FRAC_CONST(-0.07064096629620), FRAC_CONST(-0.94479805231094) }, - { FRAC_CONST(-0.92444086074829), FRAC_CONST(-0.10457590222359) }, - { FRAC_CONST(-0.83822596073151), FRAC_CONST(-0.01695043221116) }, - { FRAC_CONST(0.75214684009552), FRAC_CONST(-0.99955683946609) }, - { FRAC_CONST(-0.42102998495102), FRAC_CONST(0.99720942974091) }, - { FRAC_CONST(-0.72094786167145), FRAC_CONST(-0.35008960962296) }, - { FRAC_CONST(0.78843313455582), FRAC_CONST(0.52851396799088) }, - { FRAC_CONST(0.97394025325775), FRAC_CONST(-0.26695942878723) }, - { FRAC_CONST(0.99206465482712), FRAC_CONST(-0.57010120153427) }, - { FRAC_CONST(0.76789611577988), FRAC_CONST(-0.76519358158112) }, - { FRAC_CONST(-0.82002419233322), FRAC_CONST(-0.73530179262161) }, - { FRAC_CONST(0.81924992799759), FRAC_CONST(0.99698424339294) }, - { FRAC_CONST(-0.26719850301743), FRAC_CONST(0.68903368711472) }, - { FRAC_CONST(-0.43311259150505), FRAC_CONST(0.85321813821793) }, - { FRAC_CONST(0.99194979667664), FRAC_CONST(0.91876250505447) }, - { FRAC_CONST(-0.80691999197006), FRAC_CONST(-0.32627540826797) }, - { FRAC_CONST(0.43080005049706), FRAC_CONST(-0.21919095516205) }, - { FRAC_CONST(0.67709493637085), FRAC_CONST(-0.95478075742722) }, - { FRAC_CONST(0.56151771545410), FRAC_CONST(-0.70693808794022) }, - { FRAC_CONST(0.10831862688065), FRAC_CONST(-0.08628837019205) }, - { FRAC_CONST(0.91229414939880), FRAC_CONST(-0.65987348556519) }, - { FRAC_CONST(-0.48972892761230), FRAC_CONST(0.56289243698120) }, - { FRAC_CONST(-0.89033657312393), FRAC_CONST(-0.71656566858292) }, - { FRAC_CONST(0.65269446372986), FRAC_CONST(0.65916007757187) }, - { FRAC_CONST(0.67439478635788), FRAC_CONST(-0.81684380769730) }, - { FRAC_CONST(-0.47770830988884), FRAC_CONST(-0.16789555549622) }, - { FRAC_CONST(-0.99715977907181), FRAC_CONST(-0.93565785884857) }, - { FRAC_CONST(-0.90889590978622), FRAC_CONST(0.62034398317337) }, - { FRAC_CONST(-0.06618622690439), FRAC_CONST(-0.23812216520309) }, - { FRAC_CONST(0.99430269002914), FRAC_CONST(0.18812555074692) }, - { FRAC_CONST(0.97686403989792), FRAC_CONST(-0.28664535284042) }, - { FRAC_CONST(0.94813650846481), FRAC_CONST(-0.97506642341614) }, - { FRAC_CONST(-0.95434498786926), FRAC_CONST(-0.79607981443405) }, - { FRAC_CONST(-0.49104782938957), FRAC_CONST(0.32895213365555) }, - { FRAC_CONST(0.99881172180176), FRAC_CONST(0.88993984460831) }, - { FRAC_CONST(0.50449168682098), FRAC_CONST(-0.85995072126389) }, - { FRAC_CONST(0.47162890434265), FRAC_CONST(-0.18680204451084) }, - { FRAC_CONST(-0.62081581354141), FRAC_CONST(0.75000673532486) }, - { FRAC_CONST(-0.43867015838623), FRAC_CONST(0.99998068809509) }, - { FRAC_CONST(0.98630565404892), FRAC_CONST(-0.53578901290894) }, - { FRAC_CONST(-0.61510360240936), FRAC_CONST(-0.89515018463135) }, - { FRAC_CONST(-0.03841517493129), FRAC_CONST(-0.69888818264008) }, - { FRAC_CONST(-0.30102157592773), FRAC_CONST(-0.07667808979750) }, - { FRAC_CONST(0.41881284117699), FRAC_CONST(0.02188098989427) }, - { FRAC_CONST(-0.86135452985764), FRAC_CONST(0.98947483301163) }, - { FRAC_CONST(0.67226862907410), FRAC_CONST(-0.13494388759136) }, - { FRAC_CONST(-0.70737397670746), FRAC_CONST(-0.76547348499298) }, - { FRAC_CONST(0.94044947624207), FRAC_CONST(0.09026201069355) }, - { FRAC_CONST(-0.82386350631714), FRAC_CONST(0.08924768865108) }, - { FRAC_CONST(-0.32070666551590), FRAC_CONST(0.50143420696259) }, - { FRAC_CONST(0.57593160867691), FRAC_CONST(-0.98966425657272) }, - { FRAC_CONST(-0.36326017975807), FRAC_CONST(0.07440242916346) }, - { FRAC_CONST(0.99979043006897), FRAC_CONST(-0.14130286872387) }, - { FRAC_CONST(-0.92366021871567), FRAC_CONST(-0.97979295253754) }, - { FRAC_CONST(-0.44607177376747), FRAC_CONST(-0.54233253002167) }, - { FRAC_CONST(0.44226801395416), FRAC_CONST(0.71326756477356) }, - { FRAC_CONST(0.03671907261014), FRAC_CONST(0.63606387376785) }, - { FRAC_CONST(0.52175426483154), FRAC_CONST(-0.85396826267242) }, - { FRAC_CONST(-0.94701141119003), FRAC_CONST(-0.01826348155737) }, - { FRAC_CONST(-0.98759609460831), FRAC_CONST(0.82288712263107) }, - { FRAC_CONST(0.87434792518616), FRAC_CONST(0.89399492740631) }, - { FRAC_CONST(-0.93412041664124), FRAC_CONST(0.41374051570892) }, - { FRAC_CONST(0.96063941717148), FRAC_CONST(0.93116706609726) }, - { FRAC_CONST(0.97534251213074), FRAC_CONST(0.86150932312012) }, - { FRAC_CONST(0.99642467498779), FRAC_CONST(0.70190042257309) }, - { FRAC_CONST(-0.94705086946487), FRAC_CONST(-0.29580041766167) }, - { FRAC_CONST(0.91599804162979), FRAC_CONST(-0.98147833347321) } -}; - -#ifdef __cplusplus - -#endif -#endif - diff --git a/src/libfaad/sbr_qmf.c b/src/libfaad/sbr_qmf.c deleted file mode 100644 index d534a0442..000000000 --- a/src/libfaad/sbr_qmf.c +++ /dev/null @@ -1,633 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_qmf.c,v 1.7 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#ifdef SBR_DEC - - -#include <stdlib.h> -#include <string.h> -#include "sbr_dct.h" -#include "sbr_qmf.h" -#include "sbr_qmf_c.h" -#include "sbr_syntax.h" - -qmfa_info *qmfa_init(uint8_t channels) -{ - qmfa_info *qmfa = (qmfa_info*)faad_malloc(sizeof(qmfa_info)); - - /* x is implemented as double ringbuffer */ - qmfa->x = (real_t*)faad_malloc(2 * channels * 10 * sizeof(real_t)); - memset(qmfa->x, 0, 2 * channels * 10 * sizeof(real_t)); - - /* ringbuffer index */ - qmfa->x_index = 0; - - qmfa->channels = channels; - - return qmfa; -} - -void qmfa_end(qmfa_info *qmfa) -{ - if (qmfa) - { - if (qmfa->x) faad_free(qmfa->x); - faad_free(qmfa); - } -} - -void sbr_qmf_analysis_32(sbr_info *sbr, qmfa_info *qmfa, const real_t *input, - qmf_t X[MAX_NTSRHFG][64], uint8_t offset, uint8_t kx) -{ - ALIGN real_t u[64]; -#ifndef SBR_LOW_POWER - ALIGN real_t in_real[32], in_imag[32], out_real[32], out_imag[32]; -#else - ALIGN real_t y[32]; -#endif - uint16_t in = 0; - uint8_t l; - - /* qmf subsample l */ - for (l = 0; l < sbr->numTimeSlotsRate; l++) - { - int16_t n; - - /* shift input buffer x */ - /* input buffer is not shifted anymore, x is implemented as double ringbuffer */ - //memmove(qmfa->x + 32, qmfa->x, (320-32)*sizeof(real_t)); - - /* add new samples to input buffer x */ - for (n = 32 - 1; n >= 0; n--) - { -#ifdef FIXED_POINT - qmfa->x[qmfa->x_index + n] = qmfa->x[qmfa->x_index + n + 320] = (input[in++]) >> 4; -#else - qmfa->x[qmfa->x_index + n] = qmfa->x[qmfa->x_index + n + 320] = input[in++]; -#endif - } - - /* window and summation to create array u */ - for (n = 0; n < 64; n++) - { - u[n] = MUL_F(qmfa->x[qmfa->x_index + n], qmf_c[2*n]) + - MUL_F(qmfa->x[qmfa->x_index + n + 64], qmf_c[2*(n + 64)]) + - MUL_F(qmfa->x[qmfa->x_index + n + 128], qmf_c[2*(n + 128)]) + - MUL_F(qmfa->x[qmfa->x_index + n + 192], qmf_c[2*(n + 192)]) + - MUL_F(qmfa->x[qmfa->x_index + n + 256], qmf_c[2*(n + 256)]); - } - - /* update ringbuffer index */ - qmfa->x_index -= 32; - if (qmfa->x_index < 0) - qmfa->x_index = (320-32); - - /* calculate 32 subband samples by introducing X */ -#ifdef SBR_LOW_POWER - y[0] = u[48]; - for (n = 1; n < 16; n++) - y[n] = u[n+48] + u[48-n]; - for (n = 16; n < 32; n++) - y[n] = -u[n-16] + u[48-n]; - - DCT3_32_unscaled(u, y); - - for (n = 0; n < 32; n++) - { - if (n < kx) - { -#ifdef FIXED_POINT - QMF_RE(X[l + offset][n]) = u[n] /*<< 1*/; -#else - QMF_RE(X[l + offset][n]) = 2. * u[n]; -#endif - } else { - QMF_RE(X[l + offset][n]) = 0; - } - } -#else - - // Reordering of data moved from DCT_IV to here - in_imag[31] = u[1]; - in_real[0] = u[0]; - for (n = 1; n < 31; n++) - { - in_imag[31 - n] = u[n+1]; - in_real[n] = -u[64-n]; - } - in_imag[0] = u[32]; - in_real[31] = -u[33]; - - // dct4_kernel is DCT_IV without reordering which is done before and after FFT - dct4_kernel(in_real, in_imag, out_real, out_imag); - - // Reordering of data moved from DCT_IV to here - for (n = 0; n < 16; n++) { - if (2*n+1 < kx) { -#ifdef FIXED_POINT - QMF_RE(X[l + offset][2*n]) = out_real[n]; - QMF_IM(X[l + offset][2*n]) = out_imag[n]; - QMF_RE(X[l + offset][2*n+1]) = -out_imag[31-n]; - QMF_IM(X[l + offset][2*n+1]) = -out_real[31-n]; -#else - QMF_RE(X[l + offset][2*n]) = 2. * out_real[n]; - QMF_IM(X[l + offset][2*n]) = 2. * out_imag[n]; - QMF_RE(X[l + offset][2*n+1]) = -2. * out_imag[31-n]; - QMF_IM(X[l + offset][2*n+1]) = -2. * out_real[31-n]; -#endif - } else { - if (2*n < kx) { -#ifdef FIXED_POINT - QMF_RE(X[l + offset][2*n]) = out_real[n]; - QMF_IM(X[l + offset][2*n]) = out_imag[n]; -#else - QMF_RE(X[l + offset][2*n]) = 2. * out_real[n]; - QMF_IM(X[l + offset][2*n]) = 2. * out_imag[n]; -#endif - } - else { - QMF_RE(X[l + offset][2*n]) = 0; - QMF_IM(X[l + offset][2*n]) = 0; - } - QMF_RE(X[l + offset][2*n+1]) = 0; - QMF_IM(X[l + offset][2*n+1]) = 0; - } - } -#endif - } -} - -static const complex_t qmf32_pre_twiddle[] = -{ - { FRAC_CONST(0.999924701839145), FRAC_CONST(-0.012271538285720) }, - { FRAC_CONST(0.999322384588350), FRAC_CONST(-0.036807222941359) }, - { FRAC_CONST(0.998118112900149), FRAC_CONST(-0.061320736302209) }, - { FRAC_CONST(0.996312612182778), FRAC_CONST(-0.085797312344440) }, - { FRAC_CONST(0.993906970002356), FRAC_CONST(-0.110222207293883) }, - { FRAC_CONST(0.990902635427780), FRAC_CONST(-0.134580708507126) }, - { FRAC_CONST(0.987301418157858), FRAC_CONST(-0.158858143333861) }, - { FRAC_CONST(0.983105487431216), FRAC_CONST(-0.183039887955141) }, - { FRAC_CONST(0.978317370719628), FRAC_CONST(-0.207111376192219) }, - { FRAC_CONST(0.972939952205560), FRAC_CONST(-0.231058108280671) }, - { FRAC_CONST(0.966976471044852), FRAC_CONST(-0.254865659604515) }, - { FRAC_CONST(0.960430519415566), FRAC_CONST(-0.278519689385053) }, - { FRAC_CONST(0.953306040354194), FRAC_CONST(-0.302005949319228) }, - { FRAC_CONST(0.945607325380521), FRAC_CONST(-0.325310292162263) }, - { FRAC_CONST(0.937339011912575), FRAC_CONST(-0.348418680249435) }, - { FRAC_CONST(0.928506080473216), FRAC_CONST(-0.371317193951838) }, - { FRAC_CONST(0.919113851690058), FRAC_CONST(-0.393992040061048) }, - { FRAC_CONST(0.909167983090522), FRAC_CONST(-0.416429560097637) }, - { FRAC_CONST(0.898674465693954), FRAC_CONST(-0.438616238538528) }, - { FRAC_CONST(0.887639620402854), FRAC_CONST(-0.460538710958240) }, - { FRAC_CONST(0.876070094195407), FRAC_CONST(-0.482183772079123) }, - { FRAC_CONST(0.863972856121587), FRAC_CONST(-0.503538383725718) }, - { FRAC_CONST(0.851355193105265), FRAC_CONST(-0.524589682678469) }, - { FRAC_CONST(0.838224705554838), FRAC_CONST(-0.545324988422046) }, - { FRAC_CONST(0.824589302785025), FRAC_CONST(-0.565731810783613) }, - { FRAC_CONST(0.810457198252595), FRAC_CONST(-0.585797857456439) }, - { FRAC_CONST(0.795836904608884), FRAC_CONST(-0.605511041404326) }, - { FRAC_CONST(0.780737228572094), FRAC_CONST(-0.624859488142386) }, - { FRAC_CONST(0.765167265622459), FRAC_CONST(-0.643831542889791) }, - { FRAC_CONST(0.749136394523459), FRAC_CONST(-0.662415777590172) }, - { FRAC_CONST(0.732654271672413), FRAC_CONST(-0.680600997795453) }, - { FRAC_CONST(0.715730825283819), FRAC_CONST(-0.698376249408973) } -}; - -qmfs_info *qmfs_init(uint8_t channels) -{ - qmfs_info *qmfs = (qmfs_info*)faad_malloc(sizeof(qmfs_info)); - - /* v is a double ringbuffer */ - qmfs->v = (real_t*)faad_malloc(2 * channels * 20 * sizeof(real_t)); - memset(qmfs->v, 0, 2 * channels * 20 * sizeof(real_t)); - - qmfs->v_index = 0; - - qmfs->channels = channels; - - return qmfs; -} - -void qmfs_end(qmfs_info *qmfs) -{ - if (qmfs) - { - if (qmfs->v) faad_free(qmfs->v); - faad_free(qmfs); - } -} - -#ifdef SBR_LOW_POWER - -void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], - real_t *output) -{ - ALIGN real_t x[16]; - ALIGN real_t y[16]; - int16_t n, k, out = 0; - uint8_t l; - - /* qmf subsample l */ - for (l = 0; l < sbr->numTimeSlotsRate; l++) - { - /* shift buffers */ - /* we are not shifting v, it is a double ringbuffer */ - //memmove(qmfs->v + 64, qmfs->v, (640-64)*sizeof(real_t)); - - /* calculate 64 samples */ - for (k = 0; k < 16; k++) - { -#ifdef FIXED_POINT - y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][31 - k])); - x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][31 - k])); -#else - y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][31 - k])) / 32.0; - x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][31 - k])) / 32.0; -#endif - } - - /* even n samples */ - DCT2_16_unscaled(x, x); - /* odd n samples */ - DCT4_16(y, y); - - for (n = 8; n < 24; n++) - { - qmfs->v[qmfs->v_index + n*2] = qmfs->v[qmfs->v_index + 640 + n*2] = x[n-8]; - qmfs->v[qmfs->v_index + n*2+1] = qmfs->v[qmfs->v_index + 640 + n*2+1] = y[n-8]; - } - for (n = 0; n < 16; n++) - { - qmfs->v[qmfs->v_index + n] = qmfs->v[qmfs->v_index + 640 + n] = qmfs->v[qmfs->v_index + 32-n]; - } - qmfs->v[qmfs->v_index + 48] = qmfs->v[qmfs->v_index + 640 + 48] = 0; - for (n = 1; n < 16; n++) - { - qmfs->v[qmfs->v_index + 48+n] = qmfs->v[qmfs->v_index + 640 + 48+n] = -qmfs->v[qmfs->v_index + 48-n]; - } - - /* calculate 32 output samples and window */ - for (k = 0; k < 32; k++) - { - output[out++] = MUL_F(qmfs->v[qmfs->v_index + k], qmf_c[2*k]) + - MUL_F(qmfs->v[qmfs->v_index + 96 + k], qmf_c[64 + 2*k]) + - MUL_F(qmfs->v[qmfs->v_index + 128 + k], qmf_c[128 + 2*k]) + - MUL_F(qmfs->v[qmfs->v_index + 224 + k], qmf_c[192 + 2*k]) + - MUL_F(qmfs->v[qmfs->v_index + 256 + k], qmf_c[256 + 2*k]) + - MUL_F(qmfs->v[qmfs->v_index + 352 + k], qmf_c[320 + 2*k]) + - MUL_F(qmfs->v[qmfs->v_index + 384 + k], qmf_c[384 + 2*k]) + - MUL_F(qmfs->v[qmfs->v_index + 480 + k], qmf_c[448 + 2*k]) + - MUL_F(qmfs->v[qmfs->v_index + 512 + k], qmf_c[512 + 2*k]) + - MUL_F(qmfs->v[qmfs->v_index + 608 + k], qmf_c[576 + 2*k]); - } - - /* update the ringbuffer index */ - qmfs->v_index -= 64; - if (qmfs->v_index < 0) - qmfs->v_index = (640-64); - } -} - -void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], - real_t *output) -{ - ALIGN real_t x[64]; - ALIGN real_t y[64]; - int16_t n, k, out = 0; - uint8_t l; - - - /* qmf subsample l */ - for (l = 0; l < sbr->numTimeSlotsRate; l++) - { - /* shift buffers */ - /* we are not shifting v, it is a double ringbuffer */ - //memmove(qmfs->v + 128, qmfs->v, (1280-128)*sizeof(real_t)); - - /* calculate 128 samples */ - for (k = 0; k < 32; k++) - { -#ifdef FIXED_POINT - y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][63 - k])); - x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][63 - k])); -#else - y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][63 - k])) / 32.0; - x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][63 - k])) / 32.0; -#endif - } - - /* even n samples */ - DCT2_32_unscaled(x, x); - /* odd n samples */ - DCT4_32(y, y); - - for (n = 16; n < 48; n++) - { - qmfs->v[qmfs->v_index + n*2] = qmfs->v[qmfs->v_index + 1280 + n*2] = x[n-16]; - qmfs->v[qmfs->v_index + n*2+1] = qmfs->v[qmfs->v_index + 1280 + n*2+1] = y[n-16]; - } - for (n = 0; n < 32; n++) - { - qmfs->v[qmfs->v_index + n] = qmfs->v[qmfs->v_index + 1280 + n] = qmfs->v[qmfs->v_index + 64-n]; - } - qmfs->v[qmfs->v_index + 96] = qmfs->v[qmfs->v_index + 1280 + 96] = 0; - for (n = 1; n < 32; n++) - { - qmfs->v[qmfs->v_index + 96+n] = qmfs->v[qmfs->v_index + 1280 + 96+n] = -qmfs->v[qmfs->v_index + 96-n]; - } - - /* calculate 64 output samples and window */ - for (k = 0; k < 64; k++) - { - output[out++] = MUL_F(qmfs->v[qmfs->v_index + k], qmf_c[k]) + - MUL_F(qmfs->v[qmfs->v_index + 192 + k], qmf_c[64 + k]) + - MUL_F(qmfs->v[qmfs->v_index + 256 + k], qmf_c[128 + k]) + - MUL_F(qmfs->v[qmfs->v_index + 256 + 192 + k], qmf_c[128 + 64 + k]) + - MUL_F(qmfs->v[qmfs->v_index + 512 + k], qmf_c[256 + k]) + - MUL_F(qmfs->v[qmfs->v_index + 512 + 192 + k], qmf_c[256 + 64 + k]) + - MUL_F(qmfs->v[qmfs->v_index + 768 + k], qmf_c[384 + k]) + - MUL_F(qmfs->v[qmfs->v_index + 768 + 192 + k], qmf_c[384 + 64 + k]) + - MUL_F(qmfs->v[qmfs->v_index + 1024 + k], qmf_c[512 + k]) + - MUL_F(qmfs->v[qmfs->v_index + 1024 + 192 + k], qmf_c[512 + 64 + k]); - } - - /* update the ringbuffer index */ - qmfs->v_index -= 128; - if (qmfs->v_index < 0) - qmfs->v_index = (1280-128); - } -} -#else -void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], - real_t *output) -{ - ALIGN real_t x1[32], x2[32]; -#ifndef FIXED_POINT - real_t scale = 1.f/64.f; -#endif - int16_t n, k, out = 0; - uint8_t l; - - - /* qmf subsample l */ - for (l = 0; l < sbr->numTimeSlotsRate; l++) - { - /* shift buffer v */ - /* buffer is not shifted, we are using a ringbuffer */ - //memmove(qmfs->v + 64, qmfs->v, (640-64)*sizeof(real_t)); - - /* calculate 64 samples */ - /* complex pre-twiddle */ - for (k = 0; k < 32; k++) - { - x1[k] = MUL_F(QMF_RE(X[l][k]), RE(qmf32_pre_twiddle[k])) - MUL_F(QMF_IM(X[l][k]), IM(qmf32_pre_twiddle[k])); - x2[k] = MUL_F(QMF_IM(X[l][k]), RE(qmf32_pre_twiddle[k])) + MUL_F(QMF_RE(X[l][k]), IM(qmf32_pre_twiddle[k])); - -#ifndef FIXED_POINT - x1[k] *= scale; - x2[k] *= scale; -#else - x1[k] >>= 1; - x2[k] >>= 1; -#endif - } - - /* transform */ - DCT4_32(x1, x1); - DST4_32(x2, x2); - - for (n = 0; n < 32; n++) - { - qmfs->v[qmfs->v_index + n] = qmfs->v[qmfs->v_index + 640 + n] = -x1[n] + x2[n]; - qmfs->v[qmfs->v_index + 63 - n] = qmfs->v[qmfs->v_index + 640 + 63 - n] = x1[n] + x2[n]; - } - - /* calculate 32 output samples and window */ - for (k = 0; k < 32; k++) - { - output[out++] = MUL_F(qmfs->v[qmfs->v_index + k], qmf_c[2*k]) + - MUL_F(qmfs->v[qmfs->v_index + 96 + k], qmf_c[64 + 2*k]) + - MUL_F(qmfs->v[qmfs->v_index + 128 + k], qmf_c[128 + 2*k]) + - MUL_F(qmfs->v[qmfs->v_index + 224 + k], qmf_c[192 + 2*k]) + - MUL_F(qmfs->v[qmfs->v_index + 256 + k], qmf_c[256 + 2*k]) + - MUL_F(qmfs->v[qmfs->v_index + 352 + k], qmf_c[320 + 2*k]) + - MUL_F(qmfs->v[qmfs->v_index + 384 + k], qmf_c[384 + 2*k]) + - MUL_F(qmfs->v[qmfs->v_index + 480 + k], qmf_c[448 + 2*k]) + - MUL_F(qmfs->v[qmfs->v_index + 512 + k], qmf_c[512 + 2*k]) + - MUL_F(qmfs->v[qmfs->v_index + 608 + k], qmf_c[576 + 2*k]); - } - - /* update ringbuffer index */ - qmfs->v_index -= 64; - if (qmfs->v_index < 0) - qmfs->v_index = (640 - 64); - } -} - -void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], - real_t *output) -{ -// ALIGN real_t x1[64], x2[64]; -#ifndef SBR_LOW_POWER - ALIGN real_t in_real1[32], in_imag1[32], out_real1[32], out_imag1[32]; - ALIGN real_t in_real2[32], in_imag2[32], out_real2[32], out_imag2[32]; -#endif - qmf_t * pX; - real_t * pring_buffer_1, * pring_buffer_3; -// real_t * ptemp_1, * ptemp_2; -#ifdef PREFER_POINTERS - // These pointers are used if target platform has autoinc address generators - real_t * pring_buffer_2, * pring_buffer_4; - real_t * pring_buffer_5, * pring_buffer_6; - real_t * pring_buffer_7, * pring_buffer_8; - real_t * pring_buffer_9, * pring_buffer_10; - const real_t * pqmf_c_1, * pqmf_c_2, * pqmf_c_3, * pqmf_c_4; - const real_t * pqmf_c_5, * pqmf_c_6, * pqmf_c_7, * pqmf_c_8; - const real_t * pqmf_c_9, * pqmf_c_10; -#endif // #ifdef PREFER_POINTERS -#ifndef FIXED_POINT - real_t scale = 1.f/64.f; -#endif - int16_t n, k, out = 0; - uint8_t l; - - - /* qmf subsample l */ - for (l = 0; l < sbr->numTimeSlotsRate; l++) - { - /* shift buffer v */ - /* buffer is not shifted, we use double ringbuffer */ - //memmove(qmfs->v + 128, qmfs->v, (1280-128)*sizeof(real_t)); - - /* calculate 128 samples */ -#ifndef FIXED_POINT - - pX = X[l]; - - in_imag1[31] = scale*QMF_RE(pX[1]); - in_real1[0] = scale*QMF_RE(pX[0]); - in_imag2[31] = scale*QMF_IM(pX[63-1]); - in_real2[0] = scale*QMF_IM(pX[63-0]); - for (k = 1; k < 31; k++) - { - in_imag1[31 - k] = scale*QMF_RE(pX[2*k + 1]); - in_real1[ k] = scale*QMF_RE(pX[2*k ]); - in_imag2[31 - k] = scale*QMF_IM(pX[63 - (2*k + 1)]); - in_real2[ k] = scale*QMF_IM(pX[63 - (2*k )]); - } - in_imag1[0] = scale*QMF_RE(pX[63]); - in_real1[31] = scale*QMF_RE(pX[62]); - in_imag2[0] = scale*QMF_IM(pX[63-63]); - in_real2[31] = scale*QMF_IM(pX[63-62]); - -#else - - pX = X[l]; - - in_imag1[31] = QMF_RE(pX[1]) >> 1; - in_real1[0] = QMF_RE(pX[0]) >> 1; - in_imag2[31] = QMF_IM(pX[62]) >> 1; - in_real2[0] = QMF_IM(pX[63]) >> 1; - for (k = 1; k < 31; k++) - { - in_imag1[31 - k] = QMF_RE(pX[2*k + 1]) >> 1; - in_real1[ k] = QMF_RE(pX[2*k ]) >> 1; - in_imag2[31 - k] = QMF_IM(pX[63 - (2*k + 1)]) >> 1; - in_real2[ k] = QMF_IM(pX[63 - (2*k )]) >> 1; - } - in_imag1[0] = QMF_RE(pX[63]) >> 1; - in_real1[31] = QMF_RE(pX[62]) >> 1; - in_imag2[0] = QMF_IM(pX[0]) >> 1; - in_real2[31] = QMF_IM(pX[1]) >> 1; - -#endif - - - // dct4_kernel is DCT_IV without reordering which is done before and after FFT - dct4_kernel(in_real1, in_imag1, out_real1, out_imag1); - dct4_kernel(in_real2, in_imag2, out_real2, out_imag2); - - - pring_buffer_1 = qmfs->v + qmfs->v_index; - pring_buffer_3 = pring_buffer_1 + 1280; -#ifdef PREFER_POINTERS - pring_buffer_2 = pring_buffer_1 + 127; - pring_buffer_4 = pring_buffer_1 + (1280 + 127); -#endif // #ifdef PREFER_POINTERS -// ptemp_1 = x1; -// ptemp_2 = x2; -#ifdef PREFER_POINTERS - for (n = 0; n < 32; n ++) - { - //real_t x1 = *ptemp_1++; - //real_t x2 = *ptemp_2++; - // pring_buffer_3 and pring_buffer_4 are needed only for double ring buffer - *pring_buffer_1++ = *pring_buffer_3++ = out_real2[n] - out_real1[n]; - *pring_buffer_2-- = *pring_buffer_4-- = out_real2[n] + out_real1[n]; - //x1 = *ptemp_1++; - //x2 = *ptemp_2++; - *pring_buffer_1++ = *pring_buffer_3++ = out_imag2[31-n] + out_imag1[31-n]; - *pring_buffer_2-- = *pring_buffer_4-- = out_imag2[31-n] - out_imag1[31-n]; - } -#else // #ifdef PREFER_POINTERS - - for (n = 0; n < 32; n++) - { - // pring_buffer_3 and pring_buffer_4 are needed only for double ring buffer - pring_buffer_1[2*n] = pring_buffer_3[2*n] = out_real2[n] - out_real1[n]; - pring_buffer_1[127-2*n] = pring_buffer_3[127-2*n] = out_real2[n] + out_real1[n]; - pring_buffer_1[2*n+1] = pring_buffer_3[2*n+1] = out_imag2[31-n] + out_imag1[31-n]; - pring_buffer_1[127-(2*n+1)] = pring_buffer_3[127-(2*n+1)] = out_imag2[31-n] - out_imag1[31-n]; - } - -#endif // #ifdef PREFER_POINTERS - - pring_buffer_1 = qmfs->v + qmfs->v_index; -#ifdef PREFER_POINTERS - pring_buffer_2 = pring_buffer_1 + 192; - pring_buffer_3 = pring_buffer_1 + 256; - pring_buffer_4 = pring_buffer_1 + (256 + 192); - pring_buffer_5 = pring_buffer_1 + 512; - pring_buffer_6 = pring_buffer_1 + (512 + 192); - pring_buffer_7 = pring_buffer_1 + 768; - pring_buffer_8 = pring_buffer_1 + (768 + 192); - pring_buffer_9 = pring_buffer_1 + 1024; - pring_buffer_10 = pring_buffer_1 + (1024 + 192); - pqmf_c_1 = qmf_c; - pqmf_c_2 = qmf_c + 64; - pqmf_c_3 = qmf_c + 128; - pqmf_c_4 = qmf_c + 192; - pqmf_c_5 = qmf_c + 256; - pqmf_c_6 = qmf_c + 320; - pqmf_c_7 = qmf_c + 384; - pqmf_c_8 = qmf_c + 448; - pqmf_c_9 = qmf_c + 512; - pqmf_c_10 = qmf_c + 576; -#endif // #ifdef PREFER_POINTERS - - /* calculate 64 output samples and window */ - for (k = 0; k < 64; k++) - { -#ifdef PREFER_POINTERS - output[out++] = - MUL_F(*pring_buffer_1++, *pqmf_c_1++) + - MUL_F(*pring_buffer_2++, *pqmf_c_2++) + - MUL_F(*pring_buffer_3++, *pqmf_c_3++) + - MUL_F(*pring_buffer_4++, *pqmf_c_4++) + - MUL_F(*pring_buffer_5++, *pqmf_c_5++) + - MUL_F(*pring_buffer_6++, *pqmf_c_6++) + - MUL_F(*pring_buffer_7++, *pqmf_c_7++) + - MUL_F(*pring_buffer_8++, *pqmf_c_8++) + - MUL_F(*pring_buffer_9++, *pqmf_c_9++) + - MUL_F(*pring_buffer_10++, *pqmf_c_10++); -#else // #ifdef PREFER_POINTERS - output[out++] = - MUL_F(pring_buffer_1[k+0], qmf_c[k+0]) + - MUL_F(pring_buffer_1[k+192], qmf_c[k+64]) + - MUL_F(pring_buffer_1[k+256], qmf_c[k+128]) + - MUL_F(pring_buffer_1[k+(256+192)], qmf_c[k+192]) + - MUL_F(pring_buffer_1[k+512], qmf_c[k+256]) + - MUL_F(pring_buffer_1[k+(512+192)], qmf_c[k+320]) + - MUL_F(pring_buffer_1[k+768], qmf_c[k+384]) + - MUL_F(pring_buffer_1[k+(768+192)], qmf_c[k+448]) + - MUL_F(pring_buffer_1[k+1024], qmf_c[k+512]) + - MUL_F(pring_buffer_1[k+(1024+192)], qmf_c[k+576]); -#endif // #ifdef PREFER_POINTERS - } - - /* update ringbuffer index */ - qmfs->v_index -= 128; - if (qmfs->v_index < 0) - qmfs->v_index = (1280 - 128); - } -} -#endif - -#endif diff --git a/src/libfaad/sbr_qmf.h b/src/libfaad/sbr_qmf.h deleted file mode 100644 index b1d673d9c..000000000 --- a/src/libfaad/sbr_qmf.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_qmf.h,v 1.7 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __SBR_QMF_H__ -#define __SBR_QMF_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -qmfa_info *qmfa_init(uint8_t channels); -void qmfa_end(qmfa_info *qmfa); -qmfs_info *qmfs_init(uint8_t channels); -void qmfs_end(qmfs_info *qmfs); - -void sbr_qmf_analysis_32(sbr_info *sbr, qmfa_info *qmfa, const real_t *input, - qmf_t X[MAX_NTSRHFG][64], uint8_t offset, uint8_t kx); -void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], - real_t *output); -void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], - real_t *output); - - -#ifdef __cplusplus -} -#endif -#endif - diff --git a/src/libfaad/sbr_qmf_c.h b/src/libfaad/sbr_qmf_c.h deleted file mode 100644 index d9c079520..000000000 --- a/src/libfaad/sbr_qmf_c.h +++ /dev/null @@ -1,365 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_qmf_c.h,v 1.5 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __SBR_QMF_C_H__ -#define __SBR_QMF_C_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -#ifdef _MSC_VER -#pragma warning(disable:4305) -#pragma warning(disable:4244) -#endif - -ALIGN static const real_t qmf_c[640] = { - FRAC_CONST(0), FRAC_CONST(-0.00055252865047), - FRAC_CONST(-0.00056176925738), FRAC_CONST(-0.00049475180896), - FRAC_CONST(-0.00048752279712), FRAC_CONST(-0.00048937912498), - FRAC_CONST(-0.00050407143497), FRAC_CONST(-0.00052265642972), - FRAC_CONST(-0.00054665656337), FRAC_CONST(-0.00056778025613), - FRAC_CONST(-0.00058709304852), FRAC_CONST(-0.00061327473938), - FRAC_CONST(-0.00063124935319), FRAC_CONST(-0.00065403333621), - FRAC_CONST(-0.00067776907764), FRAC_CONST(-0.00069416146273), - FRAC_CONST(-0.00071577364744), FRAC_CONST(-0.00072550431222), - FRAC_CONST(-0.00074409418541), FRAC_CONST(-0.00074905980532), - FRAC_CONST(-0.0007681371927), FRAC_CONST(-0.00077248485949), - FRAC_CONST(-0.00078343322877), FRAC_CONST(-0.00077798694927), - FRAC_CONST(-0.000780366471), FRAC_CONST(-0.00078014496257), - FRAC_CONST(-0.0007757977331), FRAC_CONST(-0.00076307935757), - FRAC_CONST(-0.00075300014201), FRAC_CONST(-0.00073193571525), - FRAC_CONST(-0.00072153919876), FRAC_CONST(-0.00069179375372), - FRAC_CONST(-0.00066504150893), FRAC_CONST(-0.00063415949025), - FRAC_CONST(-0.0005946118933), FRAC_CONST(-0.00055645763906), - FRAC_CONST(-0.00051455722108), FRAC_CONST(-0.00046063254803), - FRAC_CONST(-0.00040951214522), FRAC_CONST(-0.00035011758756), - FRAC_CONST(-0.00028969811748), FRAC_CONST(-0.0002098337344), - FRAC_CONST(-0.00014463809349), FRAC_CONST(-6.173344072E-005), - FRAC_CONST(1.349497418E-005), FRAC_CONST(0.00010943831274), - FRAC_CONST(0.00020430170688), FRAC_CONST(0.00029495311041), - FRAC_CONST(0.0004026540216), FRAC_CONST(0.00051073884952), - FRAC_CONST(0.00062393761391), FRAC_CONST(0.00074580258865), - FRAC_CONST(0.00086084433262), FRAC_CONST(0.00098859883015), - FRAC_CONST(0.00112501551307), FRAC_CONST(0.00125778846475), - FRAC_CONST(0.00139024948272), FRAC_CONST(0.00154432198471), - FRAC_CONST(0.00168680832531), FRAC_CONST(0.00183482654224), - FRAC_CONST(0.00198411407369), FRAC_CONST(0.00214615835557), - FRAC_CONST(0.00230172547746), FRAC_CONST(0.00246256169126), - FRAC_CONST(0.00262017586902), FRAC_CONST(0.00278704643465), - FRAC_CONST(0.00294694477165), FRAC_CONST(0.00311254206525), - FRAC_CONST(0.00327396134847), FRAC_CONST(0.00344188741828), - FRAC_CONST(0.00360082681231), FRAC_CONST(0.00376039229104), - FRAC_CONST(0.00392074323703), FRAC_CONST(0.00408197531935), - FRAC_CONST(0.0042264269227), FRAC_CONST(0.00437307196781), - FRAC_CONST(0.00452098527825), FRAC_CONST(0.00466064606118), - FRAC_CONST(0.00479325608498), FRAC_CONST(0.00491376035745), - FRAC_CONST(0.00503930226013), FRAC_CONST(0.00514073539032), - FRAC_CONST(0.00524611661324), FRAC_CONST(0.00534716811982), - FRAC_CONST(0.00541967759307), FRAC_CONST(0.00548760401507), - FRAC_CONST(0.00554757145088), FRAC_CONST(0.00559380230045), - FRAC_CONST(0.00562206432097), FRAC_CONST(0.00564551969164), - FRAC_CONST(0.00563891995151), FRAC_CONST(0.00562661141932), - FRAC_CONST(0.0055917128663), FRAC_CONST(0.005540436394), - FRAC_CONST(0.0054753783077), FRAC_CONST(0.0053838975897), - FRAC_CONST(0.00527157587272), FRAC_CONST(0.00513822754514), - FRAC_CONST(0.00498396877629), FRAC_CONST(0.004810946906), - FRAC_CONST(0.00460395301471), FRAC_CONST(0.00438018617447), - FRAC_CONST(0.0041251642327), FRAC_CONST(0.00384564081246), - FRAC_CONST(0.00354012465507), FRAC_CONST(0.00320918858098), - FRAC_CONST(0.00284467578623), FRAC_CONST(0.00245085400321), - FRAC_CONST(0.0020274176185), FRAC_CONST(0.00157846825768), - FRAC_CONST(0.00109023290512), FRAC_CONST(0.0005832264248), - FRAC_CONST(2.760451905E-005), FRAC_CONST(-0.00054642808664), - FRAC_CONST(-0.00115681355227), FRAC_CONST(-0.00180394725893), - FRAC_CONST(-0.00248267236449), FRAC_CONST(-0.003193377839), - FRAC_CONST(-0.00394011240522), FRAC_CONST(-0.004722259624), - FRAC_CONST(-0.00553372111088), FRAC_CONST(-0.00637922932685), - FRAC_CONST(-0.00726158168517), FRAC_CONST(-0.00817982333726), - FRAC_CONST(-0.00913253296085), FRAC_CONST(-0.01011502154986), - FRAC_CONST(-0.01113155480321), FRAC_CONST(-0.01218499959508), - FRAC_CONST(0.01327182200351), FRAC_CONST(0.01439046660792), - FRAC_CONST(0.01554055533423), FRAC_CONST(0.01673247129989), - FRAC_CONST(0.01794333813443), FRAC_CONST(0.01918724313698), - FRAC_CONST(0.02045317933555), FRAC_CONST(0.02174675502535), - FRAC_CONST(0.02306801692862), FRAC_CONST(0.02441609920285), - FRAC_CONST(0.02578758475467), FRAC_CONST(0.02718594296329), - FRAC_CONST(0.02860721736385), FRAC_CONST(0.03005026574279), - FRAC_CONST(0.03150176087389), FRAC_CONST(0.03297540810337), - FRAC_CONST(0.03446209487686), FRAC_CONST(0.03596975605542), - FRAC_CONST(0.03748128504252), FRAC_CONST(0.03900536794745), - FRAC_CONST(0.04053491705584), FRAC_CONST(0.04206490946367), - FRAC_CONST(0.04360975421304), FRAC_CONST(0.04514884056413), - FRAC_CONST(0.04668430272642), FRAC_CONST(0.04821657200672), - FRAC_CONST(0.04973857556014), FRAC_CONST(0.05125561555216), - FRAC_CONST(0.05276307465207), FRAC_CONST(0.05424527683589), - FRAC_CONST(0.05571736482138), FRAC_CONST(0.05716164501299), - FRAC_CONST(0.0585915683626), FRAC_CONST(0.05998374801761), - FRAC_CONST(0.06134551717207), FRAC_CONST(0.06268578081172), - FRAC_CONST(0.06397158980681), FRAC_CONST(0.0652247106438), - FRAC_CONST(0.06643675122104), FRAC_CONST(0.06760759851228), - FRAC_CONST(0.06870438283512), FRAC_CONST(0.06976302447127), - FRAC_CONST(0.07076287107266), FRAC_CONST(0.07170026731102), - FRAC_CONST(0.07256825833083), FRAC_CONST(0.07336202550803), - FRAC_CONST(0.07410036424342), FRAC_CONST(0.07474525581194), - FRAC_CONST(0.07531373362019), FRAC_CONST(0.07580083586584), - FRAC_CONST(0.07619924793396), FRAC_CONST(0.07649921704119), - FRAC_CONST(0.07670934904245), FRAC_CONST(0.07681739756964), - FRAC_CONST(0.07682300113923), FRAC_CONST(0.07672049241746), - FRAC_CONST(0.07650507183194), FRAC_CONST(0.07617483218536), - FRAC_CONST(0.07573057565061), FRAC_CONST(0.0751576255287), - FRAC_CONST(0.07446643947564), FRAC_CONST(0.0736406005762), - FRAC_CONST(0.07267746427299), FRAC_CONST(0.07158263647903), - FRAC_CONST(0.07035330735093), FRAC_CONST(0.06896640131951), - FRAC_CONST(0.06745250215166), FRAC_CONST(0.06576906686508), - FRAC_CONST(0.06394448059633), FRAC_CONST(0.06196027790387), - FRAC_CONST(0.0598166570809), FRAC_CONST(0.05751526919867), - FRAC_CONST(0.05504600343009), FRAC_CONST(0.05240938217366), - FRAC_CONST(0.04959786763445), FRAC_CONST(0.04663033051701), - FRAC_CONST(0.04347687821958), FRAC_CONST(0.04014582784127), - FRAC_CONST(0.03664181168133), FRAC_CONST(0.03295839306691), - FRAC_CONST(0.02908240060125), FRAC_CONST(0.02503075618909), - FRAC_CONST(0.02079970728622), FRAC_CONST(0.01637012582228), - FRAC_CONST(0.01176238327857), FRAC_CONST(0.00696368621617), - FRAC_CONST(0.00197656014503), FRAC_CONST(-0.00320868968304), - FRAC_CONST(-0.00857117491366), FRAC_CONST(-0.01412888273558), - FRAC_CONST(-0.01988341292573), FRAC_CONST(-0.02582272888064), - FRAC_CONST(-0.03195312745332), FRAC_CONST(-0.03827765720822), - FRAC_CONST(-0.04478068215856), FRAC_CONST(-0.05148041767934), - FRAC_CONST(-0.05837053268336), FRAC_CONST(-0.06544098531359), - FRAC_CONST(-0.07269433008129), FRAC_CONST(-0.08013729344279), - FRAC_CONST(-0.08775475365593), FRAC_CONST(-0.09555333528914), - FRAC_CONST(-0.10353295311463), FRAC_CONST(-0.1116826931773), - FRAC_CONST(-0.120007798468), FRAC_CONST(-0.12850028503878), - FRAC_CONST(-0.13715517611934), FRAC_CONST(-0.1459766491187), - FRAC_CONST(-0.15496070710605), FRAC_CONST(-0.16409588556669), - FRAC_CONST(-0.17338081721706), FRAC_CONST(-0.18281725485142), - FRAC_CONST(-0.19239667457267), FRAC_CONST(-0.20212501768103), - FRAC_CONST(-0.21197358538056), FRAC_CONST(-0.22196526964149), - FRAC_CONST(-0.23206908706791), FRAC_CONST(-0.24230168845974), - FRAC_CONST(-0.25264803095722), FRAC_CONST(-0.26310532994603), - FRAC_CONST(-0.27366340405625), FRAC_CONST(-0.28432141891085), - FRAC_CONST(-0.29507167170646), FRAC_CONST(-0.30590985751916), - FRAC_CONST(-0.31682789136456), FRAC_CONST(-0.32781137272105), - FRAC_CONST(-0.33887226938665), FRAC_CONST(-0.3499914122931), - FRAC_CONST(0.36115899031355), FRAC_CONST(0.37237955463061), - FRAC_CONST(0.38363500139043), FRAC_CONST(0.39492117615675), - FRAC_CONST(0.40623176767625), FRAC_CONST(0.41756968968409), - FRAC_CONST(0.42891199207373), FRAC_CONST(0.44025537543665), - FRAC_CONST(0.45159965356824), FRAC_CONST(0.46293080852757), - FRAC_CONST(0.47424532146115), FRAC_CONST(0.48552530911099), - FRAC_CONST(0.49677082545707), FRAC_CONST(0.50798175000434), - FRAC_CONST(0.51912349702391), FRAC_CONST(0.53022408956855), - FRAC_CONST(0.54125534487322), FRAC_CONST(0.55220512585061), - FRAC_CONST(0.5630789140137), FRAC_CONST(0.57385241316923), - FRAC_CONST(0.58454032354679), FRAC_CONST(0.59511230862496), - FRAC_CONST(0.6055783538918), FRAC_CONST(0.61591099320291), - FRAC_CONST(0.62612426956055), FRAC_CONST(0.63619801077286), - FRAC_CONST(0.64612696959461), FRAC_CONST(0.65590163024671), - FRAC_CONST(0.66551398801627), FRAC_CONST(0.67496631901712), - FRAC_CONST(0.68423532934598), FRAC_CONST(0.69332823767032), - FRAC_CONST(0.70223887193539), FRAC_CONST(0.71094104263095), - FRAC_CONST(0.71944626349561), FRAC_CONST(0.72774489002994), - FRAC_CONST(0.73582117582769), FRAC_CONST(0.74368278636488), - FRAC_CONST(0.75131374561237), FRAC_CONST(0.75870807608242), - FRAC_CONST(0.76586748650939), FRAC_CONST(0.77277808813327), - FRAC_CONST(0.77942875190216), FRAC_CONST(0.7858353120392), - FRAC_CONST(0.79197358416424), FRAC_CONST(0.797846641377), - FRAC_CONST(0.80344857518505), FRAC_CONST(0.80876950044491), - FRAC_CONST(0.81381912706217), FRAC_CONST(0.81857760046468), - FRAC_CONST(0.82304198905409), FRAC_CONST(0.8272275347336), - FRAC_CONST(0.8311038457152), FRAC_CONST(0.83469373618402), - FRAC_CONST(0.83797173378865), FRAC_CONST(0.84095413924722), - FRAC_CONST(0.84362382812005), FRAC_CONST(0.84598184698206), - FRAC_CONST(0.84803157770763), FRAC_CONST(0.84978051984268), - FRAC_CONST(0.85119715249343), FRAC_CONST(0.85230470352147), - FRAC_CONST(0.85310209497017), FRAC_CONST(0.85357205739107), - FRAC_CONST(0.85373856005937 /*max*/), FRAC_CONST(0.85357205739107), - FRAC_CONST(0.85310209497017), FRAC_CONST(0.85230470352147), - FRAC_CONST(0.85119715249343), FRAC_CONST(0.84978051984268), - FRAC_CONST(0.84803157770763), FRAC_CONST(0.84598184698206), - FRAC_CONST(0.84362382812005), FRAC_CONST(0.84095413924722), - FRAC_CONST(0.83797173378865), FRAC_CONST(0.83469373618402), - FRAC_CONST(0.8311038457152), FRAC_CONST(0.8272275347336), - FRAC_CONST(0.82304198905409), FRAC_CONST(0.81857760046468), - FRAC_CONST(0.81381912706217), FRAC_CONST(0.80876950044491), - FRAC_CONST(0.80344857518505), FRAC_CONST(0.797846641377), - FRAC_CONST(0.79197358416424), FRAC_CONST(0.7858353120392), - FRAC_CONST(0.77942875190216), FRAC_CONST(0.77277808813327), - FRAC_CONST(0.76586748650939), FRAC_CONST(0.75870807608242), - FRAC_CONST(0.75131374561237), FRAC_CONST(0.74368278636488), - FRAC_CONST(0.73582117582769), FRAC_CONST(0.72774489002994), - FRAC_CONST(0.71944626349561), FRAC_CONST(0.71094104263095), - FRAC_CONST(0.70223887193539), FRAC_CONST(0.69332823767032), - FRAC_CONST(0.68423532934598), FRAC_CONST(0.67496631901712), - FRAC_CONST(0.66551398801627), FRAC_CONST(0.65590163024671), - FRAC_CONST(0.64612696959461), FRAC_CONST(0.63619801077286), - FRAC_CONST(0.62612426956055), FRAC_CONST(0.61591099320291), - FRAC_CONST(0.6055783538918), FRAC_CONST(0.59511230862496), - FRAC_CONST(0.58454032354679), FRAC_CONST(0.57385241316923), - FRAC_CONST(0.5630789140137), FRAC_CONST(0.55220512585061), - FRAC_CONST(0.54125534487322), FRAC_CONST(0.53022408956855), - FRAC_CONST(0.51912349702391), FRAC_CONST(0.50798175000434), - FRAC_CONST(0.49677082545707), FRAC_CONST(0.48552530911099), - FRAC_CONST(0.47424532146115), FRAC_CONST(0.46293080852757), - FRAC_CONST(0.45159965356824), FRAC_CONST(0.44025537543665), - FRAC_CONST(0.42891199207373), FRAC_CONST(0.41756968968409), - FRAC_CONST(0.40623176767625), FRAC_CONST(0.39492117615675), - FRAC_CONST(0.38363500139043), FRAC_CONST(0.37237955463061), - FRAC_CONST(-0.36115899031355), FRAC_CONST(-0.3499914122931), - FRAC_CONST(-0.33887226938665), FRAC_CONST(-0.32781137272105), - FRAC_CONST(-0.31682789136456), FRAC_CONST(-0.30590985751916), - FRAC_CONST(-0.29507167170646), FRAC_CONST(-0.28432141891085), - FRAC_CONST(-0.27366340405625), FRAC_CONST(-0.26310532994603), - FRAC_CONST(-0.25264803095722), FRAC_CONST(-0.24230168845974), - FRAC_CONST(-0.23206908706791), FRAC_CONST(-0.22196526964149), - FRAC_CONST(-0.21197358538056), FRAC_CONST(-0.20212501768103), - FRAC_CONST(-0.19239667457267), FRAC_CONST(-0.18281725485142), - FRAC_CONST(-0.17338081721706), FRAC_CONST(-0.16409588556669), - FRAC_CONST(-0.15496070710605), FRAC_CONST(-0.1459766491187), - FRAC_CONST(-0.13715517611934), FRAC_CONST(-0.12850028503878), - FRAC_CONST(-0.120007798468), FRAC_CONST(-0.1116826931773), - FRAC_CONST(-0.10353295311463), FRAC_CONST(-0.09555333528914), - FRAC_CONST(-0.08775475365593), FRAC_CONST(-0.08013729344279), - FRAC_CONST(-0.07269433008129), FRAC_CONST(-0.06544098531359), - FRAC_CONST(-0.05837053268336), FRAC_CONST(-0.05148041767934), - FRAC_CONST(-0.04478068215856), FRAC_CONST(-0.03827765720822), - FRAC_CONST(-0.03195312745332), FRAC_CONST(-0.02582272888064), - FRAC_CONST(-0.01988341292573), FRAC_CONST(-0.01412888273558), - FRAC_CONST(-0.00857117491366), FRAC_CONST(-0.00320868968304), - FRAC_CONST(0.00197656014503), FRAC_CONST(0.00696368621617), - FRAC_CONST(0.01176238327857), FRAC_CONST(0.01637012582228), - FRAC_CONST(0.02079970728622), FRAC_CONST(0.02503075618909), - FRAC_CONST(0.02908240060125), FRAC_CONST(0.03295839306691), - FRAC_CONST(0.03664181168133), FRAC_CONST(0.04014582784127), - FRAC_CONST(0.04347687821958), FRAC_CONST(0.04663033051701), - FRAC_CONST(0.04959786763445), FRAC_CONST(0.05240938217366), - FRAC_CONST(0.05504600343009), FRAC_CONST(0.05751526919867), - FRAC_CONST(0.0598166570809), FRAC_CONST(0.06196027790387), - FRAC_CONST(0.06394448059633), FRAC_CONST(0.06576906686508), - FRAC_CONST(0.06745250215166), FRAC_CONST(0.06896640131951), - FRAC_CONST(0.07035330735093), FRAC_CONST(0.07158263647903), - FRAC_CONST(0.07267746427299), FRAC_CONST(0.0736406005762), - FRAC_CONST(0.07446643947564), FRAC_CONST(0.0751576255287), - FRAC_CONST(0.07573057565061), FRAC_CONST(0.07617483218536), - FRAC_CONST(0.07650507183194), FRAC_CONST(0.07672049241746), - FRAC_CONST(0.07682300113923), FRAC_CONST(0.07681739756964), - FRAC_CONST(0.07670934904245), FRAC_CONST(0.07649921704119), - FRAC_CONST(0.07619924793396), FRAC_CONST(0.07580083586584), - FRAC_CONST(0.07531373362019), FRAC_CONST(0.07474525581194), - FRAC_CONST(0.07410036424342), FRAC_CONST(0.07336202550803), - FRAC_CONST(0.07256825833083), FRAC_CONST(0.07170026731102), - FRAC_CONST(0.07076287107266), FRAC_CONST(0.06976302447127), - FRAC_CONST(0.06870438283512), FRAC_CONST(0.06760759851228), - FRAC_CONST(0.06643675122104), FRAC_CONST(0.0652247106438), - FRAC_CONST(0.06397158980681), FRAC_CONST(0.06268578081172), - FRAC_CONST(0.06134551717207), FRAC_CONST(0.05998374801761), - FRAC_CONST(0.0585915683626), FRAC_CONST(0.05716164501299), - FRAC_CONST(0.05571736482138), FRAC_CONST(0.05424527683589), - FRAC_CONST(0.05276307465207), FRAC_CONST(0.05125561555216), - FRAC_CONST(0.04973857556014), FRAC_CONST(0.04821657200672), - FRAC_CONST(0.04668430272642), FRAC_CONST(0.04514884056413), - FRAC_CONST(0.04360975421304), FRAC_CONST(0.04206490946367), - FRAC_CONST(0.04053491705584), FRAC_CONST(0.03900536794745), - FRAC_CONST(0.03748128504252), FRAC_CONST(0.03596975605542), - FRAC_CONST(0.03446209487686), FRAC_CONST(0.03297540810337), - FRAC_CONST(0.03150176087389), FRAC_CONST(0.03005026574279), - FRAC_CONST(0.02860721736385), FRAC_CONST(0.02718594296329), - FRAC_CONST(0.02578758475467), FRAC_CONST(0.02441609920285), - FRAC_CONST(0.02306801692862), FRAC_CONST(0.02174675502535), - FRAC_CONST(0.02045317933555), FRAC_CONST(0.01918724313698), - FRAC_CONST(0.01794333813443), FRAC_CONST(0.01673247129989), - FRAC_CONST(0.01554055533423), FRAC_CONST(0.01439046660792), - FRAC_CONST(-0.01327182200351), FRAC_CONST(-0.01218499959508), - FRAC_CONST(-0.01113155480321), FRAC_CONST(-0.01011502154986), - FRAC_CONST(-0.00913253296085), FRAC_CONST(-0.00817982333726), - FRAC_CONST(-0.00726158168517), FRAC_CONST(-0.00637922932685), - FRAC_CONST(-0.00553372111088), FRAC_CONST(-0.004722259624), - FRAC_CONST(-0.00394011240522), FRAC_CONST(-0.003193377839), - FRAC_CONST(-0.00248267236449), FRAC_CONST(-0.00180394725893), - FRAC_CONST(-0.00115681355227), FRAC_CONST(-0.00054642808664), - FRAC_CONST(2.760451905E-005), FRAC_CONST(0.0005832264248), - FRAC_CONST(0.00109023290512), FRAC_CONST(0.00157846825768), - FRAC_CONST(0.0020274176185), FRAC_CONST(0.00245085400321), - FRAC_CONST(0.00284467578623), FRAC_CONST(0.00320918858098), - FRAC_CONST(0.00354012465507), FRAC_CONST(0.00384564081246), - FRAC_CONST(0.0041251642327), FRAC_CONST(0.00438018617447), - FRAC_CONST(0.00460395301471), FRAC_CONST(0.004810946906), - FRAC_CONST(0.00498396877629), FRAC_CONST(0.00513822754514), - FRAC_CONST(0.00527157587272), FRAC_CONST(0.0053838975897), - FRAC_CONST(0.0054753783077), FRAC_CONST(0.005540436394), - FRAC_CONST(0.0055917128663), FRAC_CONST(0.00562661141932), - FRAC_CONST(0.00563891995151), FRAC_CONST(0.00564551969164), - FRAC_CONST(0.00562206432097), FRAC_CONST(0.00559380230045), - FRAC_CONST(0.00554757145088), FRAC_CONST(0.00548760401507), - FRAC_CONST(0.00541967759307), FRAC_CONST(0.00534716811982), - FRAC_CONST(0.00524611661324), FRAC_CONST(0.00514073539032), - FRAC_CONST(0.00503930226013), FRAC_CONST(0.00491376035745), - FRAC_CONST(0.00479325608498), FRAC_CONST(0.00466064606118), - FRAC_CONST(0.00452098527825), FRAC_CONST(0.00437307196781), - FRAC_CONST(0.0042264269227), FRAC_CONST(0.00408197531935), - FRAC_CONST(0.00392074323703), FRAC_CONST(0.00376039229104), - FRAC_CONST(0.00360082681231), FRAC_CONST(0.00344188741828), - FRAC_CONST(0.00327396134847), FRAC_CONST(0.00311254206525), - FRAC_CONST(0.00294694477165), FRAC_CONST(0.00278704643465), - FRAC_CONST(0.00262017586902), FRAC_CONST(0.00246256169126), - FRAC_CONST(0.00230172547746), FRAC_CONST(0.00214615835557), - FRAC_CONST(0.00198411407369), FRAC_CONST(0.00183482654224), - FRAC_CONST(0.00168680832531), FRAC_CONST(0.00154432198471), - FRAC_CONST(0.00139024948272), FRAC_CONST(0.00125778846475), - FRAC_CONST(0.00112501551307), FRAC_CONST(0.00098859883015), - FRAC_CONST(0.00086084433262), FRAC_CONST(0.00074580258865), - FRAC_CONST(0.00062393761391), FRAC_CONST(0.00051073884952), - FRAC_CONST(0.0004026540216), FRAC_CONST(0.00029495311041), - FRAC_CONST(0.00020430170688), FRAC_CONST(0.00010943831274), - FRAC_CONST(1.349497418E-005), FRAC_CONST(-6.173344072E-005), - FRAC_CONST(-0.00014463809349), FRAC_CONST(-0.0002098337344), - FRAC_CONST(-0.00028969811748), FRAC_CONST(-0.00035011758756), - FRAC_CONST(-0.00040951214522), FRAC_CONST(-0.00046063254803), - FRAC_CONST(-0.00051455722108), FRAC_CONST(-0.00055645763906), - FRAC_CONST(-0.0005946118933), FRAC_CONST(-0.00063415949025), - FRAC_CONST(-0.00066504150893), FRAC_CONST(-0.00069179375372), - FRAC_CONST(-0.00072153919876), FRAC_CONST(-0.00073193571525), - FRAC_CONST(-0.00075300014201), FRAC_CONST(-0.00076307935757), - FRAC_CONST(-0.0007757977331), FRAC_CONST(-0.00078014496257), - FRAC_CONST(-0.000780366471), FRAC_CONST(-0.00077798694927), - FRAC_CONST(-0.00078343322877), FRAC_CONST(-0.00077248485949), - FRAC_CONST(-0.0007681371927), FRAC_CONST(-0.00074905980532), - FRAC_CONST(-0.00074409418541), FRAC_CONST(-0.00072550431222), - FRAC_CONST(-0.00071577364744), FRAC_CONST(-0.00069416146273), - FRAC_CONST(-0.00067776907764), FRAC_CONST(-0.00065403333621), - FRAC_CONST(-0.00063124935319), FRAC_CONST(-0.00061327473938), - FRAC_CONST(-0.00058709304852), FRAC_CONST(-0.00056778025613), - FRAC_CONST(-0.00054665656337), FRAC_CONST(-0.00052265642972), - FRAC_CONST(-0.00050407143497), FRAC_CONST(-0.00048937912498), - FRAC_CONST(-0.00048752279712), FRAC_CONST(-0.00049475180896), - FRAC_CONST(-0.00056176925738), FRAC_CONST(-0.00055252865047) -}; - -#endif - diff --git a/src/libfaad/sbr_syntax.c b/src/libfaad/sbr_syntax.c deleted file mode 100644 index 19cb1b5c2..000000000 --- a/src/libfaad/sbr_syntax.c +++ /dev/null @@ -1,871 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_syntax.c,v 1.7 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#ifdef SBR_DEC - -#include "sbr_syntax.h" -#include "syntax.h" -#include "sbr_huff.h" -#include "sbr_fbt.h" -#include "sbr_tf_grid.h" -#include "sbr_e_nf.h" -#include "bits.h" -#ifdef PS_DEC -#include "ps_dec.h" -#endif -#ifdef DRM_PS -#include "drm_dec.h" -#endif -#include "analysis.h" - -/* static function declarations */ -static void sbr_header(bitfile *ld, sbr_info *sbr); -static uint8_t calc_sbr_tables(sbr_info *sbr, uint8_t start_freq, uint8_t stop_freq, - uint8_t samplerate_mode, uint8_t freq_scale, - uint8_t alter_scale, uint8_t xover_band); -static uint8_t sbr_data(bitfile *ld, sbr_info *sbr); -static uint16_t sbr_extension(bitfile *ld, sbr_info *sbr, - uint8_t bs_extension_id, uint16_t num_bits_left); -static uint8_t sbr_single_channel_element(bitfile *ld, sbr_info *sbr); -static uint8_t sbr_channel_pair_element(bitfile *ld, sbr_info *sbr); -static uint8_t sbr_grid(bitfile *ld, sbr_info *sbr, uint8_t ch); -static void sbr_dtdf(bitfile *ld, sbr_info *sbr, uint8_t ch); -static void invf_mode(bitfile *ld, sbr_info *sbr, uint8_t ch); -static void sinusoidal_coding(bitfile *ld, sbr_info *sbr, uint8_t ch); - - -static void sbr_reset(sbr_info *sbr) -{ -#if 0 - printf("%d\n", sbr->bs_start_freq_prev); - printf("%d\n", sbr->bs_stop_freq_prev); - printf("%d\n", sbr->bs_freq_scale_prev); - printf("%d\n", sbr->bs_alter_scale_prev); - printf("%d\n", sbr->bs_xover_band_prev); - printf("%d\n\n", sbr->bs_noise_bands_prev); -#endif - - /* if these are different from the previous frame: Reset = 1 */ - if ((sbr->bs_start_freq != sbr->bs_start_freq_prev) || - (sbr->bs_stop_freq != sbr->bs_stop_freq_prev) || - (sbr->bs_freq_scale != sbr->bs_freq_scale_prev) || - (sbr->bs_alter_scale != sbr->bs_alter_scale_prev) || - (sbr->bs_xover_band != sbr->bs_xover_band_prev) || - (sbr->bs_noise_bands != sbr->bs_noise_bands_prev)) - { - sbr->Reset = 1; - } else { - sbr->Reset = 0; - } - - sbr->bs_start_freq_prev = sbr->bs_start_freq; - sbr->bs_stop_freq_prev = sbr->bs_stop_freq; - sbr->bs_freq_scale_prev = sbr->bs_freq_scale; - sbr->bs_alter_scale_prev = sbr->bs_alter_scale; - sbr->bs_xover_band_prev = sbr->bs_xover_band; - sbr->bs_noise_bands_prev = sbr->bs_noise_bands; -} - -static uint8_t calc_sbr_tables(sbr_info *sbr, uint8_t start_freq, uint8_t stop_freq, - uint8_t samplerate_mode, uint8_t freq_scale, - uint8_t alter_scale, uint8_t xover_band) -{ - uint8_t result = 0; - uint8_t k2; - - /* calculate the Master Frequency Table */ - sbr->k0 = qmf_start_channel(start_freq, samplerate_mode, sbr->sample_rate); - k2 = qmf_stop_channel(stop_freq, sbr->sample_rate, sbr->k0); - - /* check k0 and k2 */ - if (sbr->sample_rate >= 48000) - { - if ((k2 - sbr->k0) > 32) - result += 1; - } else if (sbr->sample_rate <= 32000) { - if ((k2 - sbr->k0) > 48) - result += 1; - } else { /* (sbr->sample_rate == 44100) */ - if ((k2 - sbr->k0) > 45) - result += 1; - } - - if (freq_scale == 0) - { - result += master_frequency_table_fs0(sbr, sbr->k0, k2, alter_scale); - } else { - result += master_frequency_table(sbr, sbr->k0, k2, freq_scale, alter_scale); - } - result += derived_frequency_table(sbr, xover_band, k2); - - result = (result > 0) ? 1 : 0; - - return result; -} - -/* table 2 */ -uint8_t sbr_extension_data(bitfile *ld, sbr_info *sbr, uint16_t cnt) -{ - uint8_t result = 0; - uint16_t num_align_bits = 0; - uint16_t num_sbr_bits = (uint16_t)faad_get_processed_bits(ld); - - uint8_t saved_start_freq, saved_samplerate_mode; - uint8_t saved_stop_freq, saved_freq_scale; - uint8_t saved_alter_scale, saved_xover_band; - -#ifdef DRM - if (!sbr->Is_DRM_SBR) -#endif - { - uint8_t bs_extension_type = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,198,"sbr_bitstream(): bs_extension_type")); - - if (bs_extension_type == EXT_SBR_DATA_CRC) - { - sbr->bs_sbr_crc_bits = (uint16_t)faad_getbits(ld, 10 - DEBUGVAR(1,199,"sbr_bitstream(): bs_sbr_crc_bits")); - } - } - - /* save old header values, in case the new ones are corrupted */ - saved_start_freq = sbr->bs_start_freq; - saved_samplerate_mode = sbr->bs_samplerate_mode; - saved_stop_freq = sbr->bs_stop_freq; - saved_freq_scale = sbr->bs_freq_scale; - saved_alter_scale = sbr->bs_alter_scale; - saved_xover_band = sbr->bs_xover_band; - - sbr->bs_header_flag = faad_get1bit(ld - DEBUGVAR(1,200,"sbr_bitstream(): bs_header_flag")); - - if (sbr->bs_header_flag) - sbr_header(ld, sbr); - - /* Reset? */ - sbr_reset(sbr); - - /* first frame should have a header */ - //if (!(sbr->frame == 0 && sbr->bs_header_flag == 0)) - if (sbr->header_count != 0) - { - if (sbr->Reset || (sbr->bs_header_flag && sbr->just_seeked)) - { - uint8_t rt = calc_sbr_tables(sbr, sbr->bs_start_freq, sbr->bs_stop_freq, - sbr->bs_samplerate_mode, sbr->bs_freq_scale, - sbr->bs_alter_scale, sbr->bs_xover_band); - - /* if an error occured with the new header values revert to the old ones */ - if (rt > 0) - { - calc_sbr_tables(sbr, saved_start_freq, saved_stop_freq, - saved_samplerate_mode, saved_freq_scale, - saved_alter_scale, saved_xover_band); - } - } - - if (result == 0) - { - result = sbr_data(ld, sbr); - - /* sbr_data() returning an error means that there was an error in - envelope_time_border_vector(). - In this case the old time border vector is saved and all the previous - data normally read after sbr_grid() is saved. - */ - /* to be on the safe side, calculate old sbr tables in case of error */ - if ((result > 0) && - (sbr->Reset || (sbr->bs_header_flag && sbr->just_seeked))) - { - calc_sbr_tables(sbr, saved_start_freq, saved_stop_freq, - saved_samplerate_mode, saved_freq_scale, - saved_alter_scale, saved_xover_band); - } - - /* we should be able to safely set result to 0 now */ - result = 0; - } - } else { - result = 1; - } - -#ifdef DRM - if (!sbr->Is_DRM_SBR) -#endif - { - num_sbr_bits = (uint16_t)faad_get_processed_bits(ld) - num_sbr_bits; - - /* check if we read more bits then were available for sbr */ - if (8*cnt < num_sbr_bits) - return 1; - - /* -4 does not apply, bs_extension_type is re-read in this function */ - num_align_bits = 8*cnt /*- 4*/ - num_sbr_bits; - - while (num_align_bits > 7) - { - faad_getbits(ld, 8 - DEBUGVAR(1,999,"sbr_bitstream(): num_align_bits")); - num_align_bits -= 8; - } - faad_getbits(ld, num_align_bits - DEBUGVAR(1,999,"sbr_bitstream(): num_align_bits")); - } - - return result; -} - -/* table 3 */ -static void sbr_header(bitfile *ld, sbr_info *sbr) -{ - uint8_t bs_header_extra_1, bs_header_extra_2; - - sbr->header_count++; - - sbr->bs_amp_res = faad_get1bit(ld - DEBUGVAR(1,203,"sbr_header(): bs_amp_res")); - - /* bs_start_freq and bs_stop_freq must define a fequency band that does - not exceed 48 channels */ - sbr->bs_start_freq = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,204,"sbr_header(): bs_start_freq")); - sbr->bs_stop_freq = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,205,"sbr_header(): bs_stop_freq")); - sbr->bs_xover_band = (uint8_t)faad_getbits(ld, 3 - DEBUGVAR(1,206,"sbr_header(): bs_xover_band")); - faad_getbits(ld, 2 - DEBUGVAR(1,207,"sbr_header(): bs_reserved_bits_hdr")); - bs_header_extra_1 = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,208,"sbr_header(): bs_header_extra_1")); - bs_header_extra_2 = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,209,"sbr_header(): bs_header_extra_2")); - - if (bs_header_extra_1) - { - sbr->bs_freq_scale = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,211,"sbr_header(): bs_freq_scale")); - sbr->bs_alter_scale = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,212,"sbr_header(): bs_alter_scale")); - sbr->bs_noise_bands = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,213,"sbr_header(): bs_noise_bands")); - } else { - /* Default values */ - sbr->bs_freq_scale = 2; - sbr->bs_alter_scale = 1; - sbr->bs_noise_bands = 2; - } - - if (bs_header_extra_2) - { - sbr->bs_limiter_bands = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,214,"sbr_header(): bs_limiter_bands")); - sbr->bs_limiter_gains = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,215,"sbr_header(): bs_limiter_gains")); - sbr->bs_interpol_freq = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,216,"sbr_header(): bs_interpol_freq")); - sbr->bs_smoothing_mode = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,217,"sbr_header(): bs_smoothing_mode")); - } else { - /* Default values */ - sbr->bs_limiter_bands = 2; - sbr->bs_limiter_gains = 2; - sbr->bs_interpol_freq = 1; - sbr->bs_smoothing_mode = 1; - } - -#if 0 - /* print the header to screen */ - printf("bs_amp_res: %d\n", sbr->bs_amp_res); - printf("bs_start_freq: %d\n", sbr->bs_start_freq); - printf("bs_stop_freq: %d\n", sbr->bs_stop_freq); - printf("bs_xover_band: %d\n", sbr->bs_xover_band); - if (bs_header_extra_1) - { - printf("bs_freq_scale: %d\n", sbr->bs_freq_scale); - printf("bs_alter_scale: %d\n", sbr->bs_alter_scale); - printf("bs_noise_bands: %d\n", sbr->bs_noise_bands); - } - if (bs_header_extra_2) - { - printf("bs_limiter_bands: %d\n", sbr->bs_limiter_bands); - printf("bs_limiter_gains: %d\n", sbr->bs_limiter_gains); - printf("bs_interpol_freq: %d\n", sbr->bs_interpol_freq); - printf("bs_smoothing_mode: %d\n", sbr->bs_smoothing_mode); - } - printf("\n"); -#endif -} - -/* table 4 */ -static uint8_t sbr_data(bitfile *ld, sbr_info *sbr) -{ - uint8_t result; -#if 0 - sbr->bs_samplerate_mode = faad_get1bit(ld - DEBUGVAR(1,219,"sbr_data(): bs_samplerate_mode")); -#endif - - sbr->rate = (sbr->bs_samplerate_mode) ? 2 : 1; - - switch (sbr->id_aac) - { - case ID_SCE: - if ((result = sbr_single_channel_element(ld, sbr)) > 0) - return result; - break; - case ID_CPE: - if ((result = sbr_channel_pair_element(ld, sbr)) > 0) - return result; - break; - } - - return 0; -} - -/* table 5 */ -static uint8_t sbr_single_channel_element(bitfile *ld, sbr_info *sbr) -{ - uint8_t result; - - if (faad_get1bit(ld - DEBUGVAR(1,220,"sbr_single_channel_element(): bs_data_extra"))) - { - faad_getbits(ld, 4 - DEBUGVAR(1,221,"sbr_single_channel_element(): bs_reserved_bits_data")); - } - -#ifdef DRM - /* bs_coupling, from sbr_channel_pair_base_element(bs_amp_res) */ - if (sbr->Is_DRM_SBR) - faad_get1bit(ld); -#endif - - if ((result = sbr_grid(ld, sbr, 0)) > 0) - return result; - sbr_dtdf(ld, sbr, 0); - invf_mode(ld, sbr, 0); - sbr_envelope(ld, sbr, 0); - sbr_noise(ld, sbr, 0); - -#ifndef FIXED_POINT - envelope_noise_dequantisation(sbr, 0); -#endif - - memset(sbr->bs_add_harmonic[0], 0, 64*sizeof(uint8_t)); - - sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld - DEBUGVAR(1,223,"sbr_single_channel_element(): bs_add_harmonic_flag[0]")); - if (sbr->bs_add_harmonic_flag[0]) - sinusoidal_coding(ld, sbr, 0); - - sbr->bs_extended_data = faad_get1bit(ld - DEBUGVAR(1,224,"sbr_single_channel_element(): bs_extended_data[0]")); - - if (sbr->bs_extended_data) - { - uint16_t nr_bits_left; -#if (defined(PS_DEC) || defined(DRM_PS)) - uint8_t ps_ext_read = 0; -#endif - uint16_t cnt = (uint16_t)faad_getbits(ld, 4 - DEBUGVAR(1,225,"sbr_single_channel_element(): bs_extension_size")); - if (cnt == 15) - { - cnt += (uint16_t)faad_getbits(ld, 8 - DEBUGVAR(1,226,"sbr_single_channel_element(): bs_esc_count")); - } - - nr_bits_left = 8 * cnt; - while (nr_bits_left > 7) - { - uint16_t tmp_nr_bits = 0; - - sbr->bs_extension_id = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,227,"sbr_single_channel_element(): bs_extension_id")); - tmp_nr_bits += 2; - - /* allow only 1 PS extension element per extension data */ -#if (defined(PS_DEC) || defined(DRM_PS)) -#if (defined(PS_DEC) && defined(DRM_PS)) - if (sbr->bs_extension_id == EXTENSION_ID_PS || sbr->bs_extension_id == DRM_PARAMETRIC_STEREO) -#else -#ifdef PS_DEC - if (sbr->bs_extension_id == EXTENSION_ID_PS) -#else -#ifdef DRM_PS - if (sbr->bs_extension_id == DRM_PARAMETRIC_STEREO) -#endif -#endif -#endif - { - if (ps_ext_read == 0) - { - ps_ext_read = 1; - } else { - /* to be safe make it 3, will switch to "default" - * in sbr_extension() */ - sbr->bs_extension_id = 3; - } - } -#endif - - tmp_nr_bits += sbr_extension(ld, sbr, sbr->bs_extension_id, nr_bits_left); - - /* check if the data read is bigger than the number of available bits */ - if (tmp_nr_bits > nr_bits_left) - return 1; - - nr_bits_left -= tmp_nr_bits; - } - - /* Corrigendum */ - if (nr_bits_left > 0) - { - faad_getbits(ld, nr_bits_left - DEBUGVAR(1,280,"sbr_single_channel_element(): nr_bits_left")); - } - } - - return 0; -} - -/* table 6 */ -static uint8_t sbr_channel_pair_element(bitfile *ld, sbr_info *sbr) -{ - uint8_t n, result; - - if (faad_get1bit(ld - DEBUGVAR(1,228,"sbr_single_channel_element(): bs_data_extra"))) - { - faad_getbits(ld, 4 - DEBUGVAR(1,228,"sbr_channel_pair_element(): bs_reserved_bits_data")); - faad_getbits(ld, 4 - DEBUGVAR(1,228,"sbr_channel_pair_element(): bs_reserved_bits_data")); - } - - sbr->bs_coupling = faad_get1bit(ld - DEBUGVAR(1,228,"sbr_channel_pair_element(): bs_coupling")); - - if (sbr->bs_coupling) - { - if ((result = sbr_grid(ld, sbr, 0)) > 0) - return result; - - /* need to copy some data from left to right */ - sbr->bs_frame_class[1] = sbr->bs_frame_class[0]; - sbr->L_E[1] = sbr->L_E[0]; - sbr->L_Q[1] = sbr->L_Q[0]; - sbr->bs_pointer[1] = sbr->bs_pointer[0]; - - for (n = 0; n <= sbr->L_E[0]; n++) - { - sbr->t_E[1][n] = sbr->t_E[0][n]; - sbr->f[1][n] = sbr->f[0][n]; - } - for (n = 0; n <= sbr->L_Q[0]; n++) - sbr->t_Q[1][n] = sbr->t_Q[0][n]; - - sbr_dtdf(ld, sbr, 0); - sbr_dtdf(ld, sbr, 1); - invf_mode(ld, sbr, 0); - - /* more copying */ - for (n = 0; n < sbr->N_Q; n++) - sbr->bs_invf_mode[1][n] = sbr->bs_invf_mode[0][n]; - - sbr_envelope(ld, sbr, 0); - sbr_noise(ld, sbr, 0); - sbr_envelope(ld, sbr, 1); - sbr_noise(ld, sbr, 1); - - memset(sbr->bs_add_harmonic[0], 0, 64*sizeof(uint8_t)); - memset(sbr->bs_add_harmonic[1], 0, 64*sizeof(uint8_t)); - - sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld - DEBUGVAR(1,231,"sbr_channel_pair_element(): bs_add_harmonic_flag[0]")); - if (sbr->bs_add_harmonic_flag[0]) - sinusoidal_coding(ld, sbr, 0); - - sbr->bs_add_harmonic_flag[1] = faad_get1bit(ld - DEBUGVAR(1,232,"sbr_channel_pair_element(): bs_add_harmonic_flag[1]")); - if (sbr->bs_add_harmonic_flag[1]) - sinusoidal_coding(ld, sbr, 1); - } else { - uint8_t saved_t_E[6] = {0}, saved_t_Q[3] = {0}; - uint8_t saved_L_E = sbr->L_E[0]; - uint8_t saved_L_Q = sbr->L_Q[0]; - uint8_t saved_frame_class = sbr->bs_frame_class[0]; - - for (n = 0; n < saved_L_E; n++) - saved_t_E[n] = sbr->t_E[0][n]; - for (n = 0; n < saved_L_Q; n++) - saved_t_Q[n] = sbr->t_Q[0][n]; - - if ((result = sbr_grid(ld, sbr, 0)) > 0) - return result; - if ((result = sbr_grid(ld, sbr, 1)) > 0) - { - /* restore first channel data as well */ - sbr->bs_frame_class[0] = saved_frame_class; - sbr->L_E[0] = saved_L_E; - sbr->L_Q[0] = saved_L_Q; - for (n = 0; n < 6; n++) - sbr->t_E[0][n] = saved_t_E[n]; - for (n = 0; n < 3; n++) - sbr->t_Q[0][n] = saved_t_Q[n]; - - return result; - } - sbr_dtdf(ld, sbr, 0); - sbr_dtdf(ld, sbr, 1); - invf_mode(ld, sbr, 0); - invf_mode(ld, sbr, 1); - sbr_envelope(ld, sbr, 0); - sbr_envelope(ld, sbr, 1); - sbr_noise(ld, sbr, 0); - sbr_noise(ld, sbr, 1); - - memset(sbr->bs_add_harmonic[0], 0, 64*sizeof(uint8_t)); - memset(sbr->bs_add_harmonic[1], 0, 64*sizeof(uint8_t)); - - sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld - DEBUGVAR(1,239,"sbr_channel_pair_element(): bs_add_harmonic_flag[0]")); - if (sbr->bs_add_harmonic_flag[0]) - sinusoidal_coding(ld, sbr, 0); - - sbr->bs_add_harmonic_flag[1] = faad_get1bit(ld - DEBUGVAR(1,240,"sbr_channel_pair_element(): bs_add_harmonic_flag[1]")); - if (sbr->bs_add_harmonic_flag[1]) - sinusoidal_coding(ld, sbr, 1); - } -#ifndef FIXED_POINT - envelope_noise_dequantisation(sbr, 0); - envelope_noise_dequantisation(sbr, 1); - - if (sbr->bs_coupling) - unmap_envelope_noise(sbr); -#endif - - sbr->bs_extended_data = faad_get1bit(ld - DEBUGVAR(1,233,"sbr_channel_pair_element(): bs_extended_data[0]")); - if (sbr->bs_extended_data) - { - uint16_t nr_bits_left; - uint16_t cnt = (uint16_t)faad_getbits(ld, 4 - DEBUGVAR(1,234,"sbr_channel_pair_element(): bs_extension_size")); - if (cnt == 15) - { - cnt += (uint16_t)faad_getbits(ld, 8 - DEBUGVAR(1,235,"sbr_channel_pair_element(): bs_esc_count")); - } - - nr_bits_left = 8 * cnt; - while (nr_bits_left > 7) - { - uint16_t tmp_nr_bits = 0; - - sbr->bs_extension_id = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,236,"sbr_channel_pair_element(): bs_extension_id")); - tmp_nr_bits += 2; - tmp_nr_bits += sbr_extension(ld, sbr, sbr->bs_extension_id, nr_bits_left); - - /* check if the data read is bigger than the number of available bits */ - if (tmp_nr_bits > nr_bits_left) - return 1; - - nr_bits_left -= tmp_nr_bits; - } - - /* Corrigendum */ - if (nr_bits_left > 0) - { - faad_getbits(ld, nr_bits_left - DEBUGVAR(1,280,"sbr_channel_pair_element(): nr_bits_left")); - } - } - - return 0; -} - -/* integer log[2](x): input range [0,10) */ -static int8_t sbr_log2(const int8_t val) -{ - int8_t log2tab[] = { 0, 0, 1, 2, 2, 3, 3, 3, 3, 4 }; - if (val < 10 && val >= 0) - return log2tab[val]; - else - return 0; -} - - -/* table 7 */ -static uint8_t sbr_grid(bitfile *ld, sbr_info *sbr, uint8_t ch) -{ - uint8_t i, env, rel, result; - uint8_t bs_abs_bord, bs_abs_bord_1; - uint8_t bs_num_env = 0; - uint8_t saved_L_E = sbr->L_E[ch]; - uint8_t saved_L_Q = sbr->L_Q[ch]; - uint8_t saved_frame_class = sbr->bs_frame_class[ch]; - - sbr->bs_frame_class[ch] = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,248,"sbr_grid(): bs_frame_class")); - - switch (sbr->bs_frame_class[ch]) - { - case FIXFIX: - i = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,249,"sbr_grid(): bs_num_env_raw")); - - bs_num_env = min(1 << i, 5); - - i = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,250,"sbr_grid(): bs_freq_res_flag")); - for (env = 0; env < bs_num_env; env++) - sbr->f[ch][env] = i; - - sbr->abs_bord_lead[ch] = 0; - sbr->abs_bord_trail[ch] = sbr->numTimeSlots; - sbr->n_rel_lead[ch] = bs_num_env - 1; - sbr->n_rel_trail[ch] = 0; - break; - - case FIXVAR: - bs_abs_bord = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,251,"sbr_grid(): bs_abs_bord")) + sbr->numTimeSlots; - bs_num_env = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,252,"sbr_grid(): bs_num_env")) + 1; - - for (rel = 0; rel < bs_num_env-1; rel++) - { - sbr->bs_rel_bord[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,253,"sbr_grid(): bs_rel_bord")) + 2; - } - i = sbr_log2(bs_num_env + 1); - sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i - DEBUGVAR(1,254,"sbr_grid(): bs_pointer")); - - for (env = 0; env < bs_num_env; env++) - { - sbr->f[ch][bs_num_env - env - 1] = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,255,"sbr_grid(): bs_freq_res")); - } - - sbr->abs_bord_lead[ch] = 0; - sbr->abs_bord_trail[ch] = bs_abs_bord; - sbr->n_rel_lead[ch] = 0; - sbr->n_rel_trail[ch] = bs_num_env - 1; - break; - - case VARFIX: - bs_abs_bord = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,256,"sbr_grid(): bs_abs_bord")); - bs_num_env = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,257,"sbr_grid(): bs_num_env")) + 1; - - for (rel = 0; rel < bs_num_env-1; rel++) - { - sbr->bs_rel_bord[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,258,"sbr_grid(): bs_rel_bord")) + 2; - } - i = sbr_log2(bs_num_env + 1); - sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i - DEBUGVAR(1,259,"sbr_grid(): bs_pointer")); - - for (env = 0; env < bs_num_env; env++) - { - sbr->f[ch][env] = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,260,"sbr_grid(): bs_freq_res")); - } - - sbr->abs_bord_lead[ch] = bs_abs_bord; - sbr->abs_bord_trail[ch] = sbr->numTimeSlots; - sbr->n_rel_lead[ch] = bs_num_env - 1; - sbr->n_rel_trail[ch] = 0; - break; - - case VARVAR: - bs_abs_bord = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,261,"sbr_grid(): bs_abs_bord_0")); - bs_abs_bord_1 = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,262,"sbr_grid(): bs_abs_bord_1")) + sbr->numTimeSlots; - sbr->bs_num_rel_0[ch] = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,263,"sbr_grid(): bs_num_rel_0")); - sbr->bs_num_rel_1[ch] = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,264,"sbr_grid(): bs_num_rel_1")); - - bs_num_env = min(5, sbr->bs_num_rel_0[ch] + sbr->bs_num_rel_1[ch] + 1); - - for (rel = 0; rel < sbr->bs_num_rel_0[ch]; rel++) - { - sbr->bs_rel_bord_0[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,265,"sbr_grid(): bs_rel_bord")) + 2; - } - for(rel = 0; rel < sbr->bs_num_rel_1[ch]; rel++) - { - sbr->bs_rel_bord_1[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,266,"sbr_grid(): bs_rel_bord")) + 2; - } - i = sbr_log2(sbr->bs_num_rel_0[ch] + sbr->bs_num_rel_1[ch] + 2); - sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i - DEBUGVAR(1,267,"sbr_grid(): bs_pointer")); - - for (env = 0; env < bs_num_env; env++) - { - sbr->f[ch][env] = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,268,"sbr_grid(): bs_freq_res")); - } - - sbr->abs_bord_lead[ch] = bs_abs_bord; - sbr->abs_bord_trail[ch] = bs_abs_bord_1; - sbr->n_rel_lead[ch] = sbr->bs_num_rel_0[ch]; - sbr->n_rel_trail[ch] = sbr->bs_num_rel_1[ch]; - break; - } - - if (sbr->bs_frame_class[ch] == VARVAR) - sbr->L_E[ch] = min(bs_num_env, 5); - else - sbr->L_E[ch] = min(bs_num_env, 4); - - if (sbr->L_E[ch] <= 0) - return 1; - - if (sbr->L_E[ch] > 1) - sbr->L_Q[ch] = 2; - else - sbr->L_Q[ch] = 1; - - /* TODO: this code can probably be integrated into the code above! */ - if ((result = envelope_time_border_vector(sbr, ch)) > 0) - { - sbr->bs_frame_class[ch] = saved_frame_class; - sbr->L_E[ch] = saved_L_E; - sbr->L_Q[ch] = saved_L_Q; - return result; - } - noise_floor_time_border_vector(sbr, ch); - -#if 0 - for (env = 0; env < bs_num_env; env++) - { - printf("freq_res[ch:%d][env:%d]: %d\n", ch, env, sbr->f[ch][env]); - } -#endif - - return 0; -} - -/* table 8 */ -static void sbr_dtdf(bitfile *ld, sbr_info *sbr, uint8_t ch) -{ - uint8_t i; - - for (i = 0; i < sbr->L_E[ch]; i++) - { - sbr->bs_df_env[ch][i] = faad_get1bit(ld - DEBUGVAR(1,269,"sbr_dtdf(): bs_df_env")); - } - - for (i = 0; i < sbr->L_Q[ch]; i++) - { - sbr->bs_df_noise[ch][i] = faad_get1bit(ld - DEBUGVAR(1,270,"sbr_dtdf(): bs_df_noise")); - } -} - -/* table 9 */ -static void invf_mode(bitfile *ld, sbr_info *sbr, uint8_t ch) -{ - uint8_t n; - - for (n = 0; n < sbr->N_Q; n++) - { - sbr->bs_invf_mode[ch][n] = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,271,"invf_mode(): bs_invf_mode")); - } -} - -static uint16_t sbr_extension(bitfile *ld, sbr_info *sbr, - uint8_t bs_extension_id, uint16_t num_bits_left) -{ -#ifdef PS_DEC - uint8_t header; - uint16_t ret; -#endif - - switch (bs_extension_id) - { -#ifdef PS_DEC - case EXTENSION_ID_PS: - if (!sbr->ps) - { - sbr->ps = ps_init(get_sr_index(sbr->sample_rate)); - } - ret = ps_data(sbr->ps, ld, &header); - - /* enable PS if and only if: a header has been decoded */ - if (sbr->ps_used == 0 && header == 1) - { - sbr->ps_used = 1; - } - - return ret; -#endif -#ifdef DRM_PS - case DRM_PARAMETRIC_STEREO: - sbr->ps_used = 1; - if (!sbr->drm_ps) - { - sbr->drm_ps = drm_ps_init(); - } - return drm_ps_data(sbr->drm_ps, ld); -#endif - default: - sbr->bs_extension_data = (uint8_t)faad_getbits(ld, 6 - DEBUGVAR(1,279,"sbr_single_channel_element(): bs_extension_data")); - return 6; - } -} - -/* table 12 */ -static void sinusoidal_coding(bitfile *ld, sbr_info *sbr, uint8_t ch) -{ - uint8_t n; - - for (n = 0; n < sbr->N_high; n++) - { - sbr->bs_add_harmonic[ch][n] = faad_get1bit(ld - DEBUGVAR(1,278,"sinusoidal_coding(): bs_add_harmonic")); - } -} - - -#endif /* SBR_DEC */ diff --git a/src/libfaad/sbr_syntax.h b/src/libfaad/sbr_syntax.h deleted file mode 100644 index 1baa5fec3..000000000 --- a/src/libfaad/sbr_syntax.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_syntax.h,v 1.7 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __SBR_SYNTAX_H__ -#define __SBR_SYNTAX_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "bits.h" - -#define T_HFGEN 8 -#define T_HFADJ 2 - -#define EXT_SBR_DATA 13 -#define EXT_SBR_DATA_CRC 14 - -#define FIXFIX 0 -#define FIXVAR 1 -#define VARFIX 2 -#define VARVAR 3 - -#define LO_RES 0 -#define HI_RES 1 - -#define NO_TIME_SLOTS_960 15 -#define NO_TIME_SLOTS 16 -#define RATE 2 - -#define NOISE_FLOOR_OFFSET 6 - - -uint8_t sbr_extension_data(bitfile *ld, sbr_info *sbr, uint16_t cnt); - -#ifdef __cplusplus -} -#endif -#endif /* __SBR_SYNTAX_H__ */ - diff --git a/src/libfaad/sbr_tf_grid.c b/src/libfaad/sbr_tf_grid.c deleted file mode 100644 index ae741c256..000000000 --- a/src/libfaad/sbr_tf_grid.c +++ /dev/null @@ -1,258 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_tf_grid.c,v 1.5 2005/10/29 23:57:07 tmmm Exp $ -**/ - -/* Time/Frequency grid */ - -#include "common.h" -#include "structs.h" - -#ifdef SBR_DEC - -#include <stdlib.h> - -#include "sbr_syntax.h" -#include "sbr_tf_grid.h" - - -/* static function declarations */ -#if 0 -static int16_t rel_bord_lead(sbr_info *sbr, uint8_t ch, uint8_t l); -static int16_t rel_bord_trail(sbr_info *sbr, uint8_t ch, uint8_t l); -#endif -static uint8_t middleBorder(sbr_info *sbr, uint8_t ch); - - -/* function constructs new time border vector */ -/* first build into temp vector to be able to use previous vector on error */ -uint8_t envelope_time_border_vector(sbr_info *sbr, uint8_t ch) -{ - uint8_t l, border, temp; - uint8_t t_E_temp[6] = {0}; - - t_E_temp[0] = sbr->rate * sbr->abs_bord_lead[ch]; - t_E_temp[sbr->L_E[ch]] = sbr->rate * sbr->abs_bord_trail[ch]; - - switch (sbr->bs_frame_class[ch]) - { - case FIXFIX: - switch (sbr->L_E[ch]) - { - case 4: - temp = (int) (sbr->numTimeSlots / 4); - t_E_temp[3] = sbr->rate * 3 * temp; - t_E_temp[2] = sbr->rate * 2 * temp; - t_E_temp[1] = sbr->rate * temp; - break; - case 2: - t_E_temp[1] = sbr->rate * (int) (sbr->numTimeSlots / 2); - break; - default: - break; - } - break; - - case FIXVAR: - if (sbr->L_E[ch] > 1) - { - int8_t i = sbr->L_E[ch]; - border = sbr->abs_bord_trail[ch]; - - for (l = 0; l < (sbr->L_E[ch] - 1); l++) - { - if (border < sbr->bs_rel_bord[ch][l]) - return 1; - - border -= sbr->bs_rel_bord[ch][l]; - t_E_temp[--i] = sbr->rate * border; - } - } - break; - - case VARFIX: - if (sbr->L_E[ch] > 1) - { - int8_t i = 1; - border = sbr->abs_bord_lead[ch]; - - for (l = 0; l < (sbr->L_E[ch] - 1); l++) - { - border += sbr->bs_rel_bord[ch][l]; - - if (sbr->rate * border + sbr->tHFAdj > sbr->numTimeSlotsRate+sbr->tHFGen) - return 1; - - t_E_temp[i++] = sbr->rate * border; - } - } - break; - - case VARVAR: - if (sbr->bs_num_rel_0[ch]) - { - int8_t i = 1; - border = sbr->abs_bord_lead[ch]; - - for (l = 0; l < sbr->bs_num_rel_0[ch]; l++) - { - border += sbr->bs_rel_bord_0[ch][l]; - - if (sbr->rate * border + sbr->tHFAdj > sbr->numTimeSlotsRate+sbr->tHFGen) - return 1; - - t_E_temp[i++] = sbr->rate * border; - } - } - - if (sbr->bs_num_rel_1[ch]) - { - int8_t i = sbr->L_E[ch]; - border = sbr->abs_bord_trail[ch]; - - for (l = 0; l < sbr->bs_num_rel_1[ch]; l++) - { - if (border < sbr->bs_rel_bord_1[ch][l]) - return 1; - - border -= sbr->bs_rel_bord_1[ch][l]; - t_E_temp[--i] = sbr->rate * border; - } - } - break; - } - - /* no error occured, we can safely use this t_E vector */ - for (l = 0; l < 6; l++) - { - sbr->t_E[ch][l] = t_E_temp[l]; - } - - return 0; -} - -void noise_floor_time_border_vector(sbr_info *sbr, uint8_t ch) -{ - sbr->t_Q[ch][0] = sbr->t_E[ch][0]; - - if (sbr->L_E[ch] == 1) - { - sbr->t_Q[ch][1] = sbr->t_E[ch][1]; - sbr->t_Q[ch][2] = 0; - } else { - uint8_t index = middleBorder(sbr, ch); - sbr->t_Q[ch][1] = sbr->t_E[ch][index]; - sbr->t_Q[ch][2] = sbr->t_E[ch][sbr->L_E[ch]]; - } -} - -#if 0 -static int16_t rel_bord_lead(sbr_info *sbr, uint8_t ch, uint8_t l) -{ - uint8_t i; - int16_t acc = 0; - - switch (sbr->bs_frame_class[ch]) - { - case FIXFIX: - return sbr->numTimeSlots/sbr->L_E[ch]; - case FIXVAR: - return 0; - case VARFIX: - for (i = 0; i < l; i++) - { - acc += sbr->bs_rel_bord[ch][i]; - } - return acc; - case VARVAR: - for (i = 0; i < l; i++) - { - acc += sbr->bs_rel_bord_0[ch][i]; - } - return acc; - } - - return 0; -} - -static int16_t rel_bord_trail(sbr_info *sbr, uint8_t ch, uint8_t l) -{ - uint8_t i; - int16_t acc = 0; - - switch (sbr->bs_frame_class[ch]) - { - case FIXFIX: - case VARFIX: - return 0; - case FIXVAR: - for (i = 0; i < l; i++) - { - acc += sbr->bs_rel_bord[ch][i]; - } - return acc; - case VARVAR: - for (i = 0; i < l; i++) - { - acc += sbr->bs_rel_bord_1[ch][i]; - } - return acc; - } - - return 0; -} -#endif - -static uint8_t middleBorder(sbr_info *sbr, uint8_t ch) -{ - int8_t retval = 0; - - switch (sbr->bs_frame_class[ch]) - { - case FIXFIX: - retval = sbr->L_E[ch]/2; - break; - case VARFIX: - if (sbr->bs_pointer[ch] == 0) - retval = 1; - else if (sbr->bs_pointer[ch] == 1) - retval = sbr->L_E[ch] - 1; - else - retval = sbr->bs_pointer[ch] - 1; - break; - case FIXVAR: - case VARVAR: - if (sbr->bs_pointer[ch] > 1) - retval = sbr->L_E[ch] + 1 - sbr->bs_pointer[ch]; - else - retval = sbr->L_E[ch] - 1; - break; - } - - return (retval > 0) ? retval : 0; -} - - -#endif diff --git a/src/libfaad/sbr_tf_grid.h b/src/libfaad/sbr_tf_grid.h deleted file mode 100644 index 8772a384a..000000000 --- a/src/libfaad/sbr_tf_grid.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sbr_tf_grid.h,v 1.5 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __SBR_TF_GRID_H__ -#define __SBR_TF_GRID_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -uint8_t envelope_time_border_vector(sbr_info *sbr, uint8_t ch); -void noise_floor_time_border_vector(sbr_info *sbr, uint8_t ch); - - -#ifdef __cplusplus -} -#endif -#endif - diff --git a/src/libfaad/sine_win.h b/src/libfaad/sine_win.h deleted file mode 100644 index c7e6ecd6e..000000000 --- a/src/libfaad/sine_win.h +++ /dev/null @@ -1,4301 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: sine_win.h,v 1.6 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __SINE_WIN_H__ -#define __SINE_WIN_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _MSC_VER -#pragma warning(disable:4305) -#pragma warning(disable:4244) -#endif - -ALIGN static const real_t sine_long_1024[] = -{ - FRAC_CONST(0.00076699031874270449), - FRAC_CONST(0.002300969151425805), - FRAC_CONST(0.0038349425697062275), - FRAC_CONST(0.0053689069639963425), - FRAC_CONST(0.0069028587247297558), - FRAC_CONST(0.0084367942423697988), - FRAC_CONST(0.0099707099074180308), - FRAC_CONST(0.011504602110422714), - FRAC_CONST(0.013038467241987334), - FRAC_CONST(0.014572301692779064), - FRAC_CONST(0.016106101853537287), - FRAC_CONST(0.017639864115082053), - FRAC_CONST(0.019173584868322623), - FRAC_CONST(0.020707260504265895), - FRAC_CONST(0.022240887414024961), - FRAC_CONST(0.023774461988827555), - FRAC_CONST(0.025307980620024571), - FRAC_CONST(0.026841439699098531), - FRAC_CONST(0.028374835617672099), - FRAC_CONST(0.029908164767516555), - FRAC_CONST(0.031441423540560301), - FRAC_CONST(0.032974608328897335), - FRAC_CONST(0.03450771552479575), - FRAC_CONST(0.036040741520706229), - FRAC_CONST(0.037573682709270494), - FRAC_CONST(0.039106535483329888), - FRAC_CONST(0.040639296235933736), - FRAC_CONST(0.042171961360347947), - FRAC_CONST(0.043704527250063421), - FRAC_CONST(0.04523699029880459), - FRAC_CONST(0.046769346900537863), - FRAC_CONST(0.048301593449480144), - FRAC_CONST(0.049833726340107277), - FRAC_CONST(0.051365741967162593), - FRAC_CONST(0.052897636725665324), - FRAC_CONST(0.054429407010919133), - FRAC_CONST(0.055961049218520569), - FRAC_CONST(0.057492559744367566), - FRAC_CONST(0.059023934984667931), - FRAC_CONST(0.060555171335947788), - FRAC_CONST(0.062086265195060088), - FRAC_CONST(0.063617212959193106), - FRAC_CONST(0.065148011025878833), - FRAC_CONST(0.066678655793001557), - FRAC_CONST(0.068209143658806329), - FRAC_CONST(0.069739471021907307), - FRAC_CONST(0.071269634281296401), - FRAC_CONST(0.072799629836351673), - FRAC_CONST(0.074329454086845756), - FRAC_CONST(0.075859103432954447), - FRAC_CONST(0.077388574275265049), - FRAC_CONST(0.078917863014784942), - FRAC_CONST(0.080446966052950014), - FRAC_CONST(0.081975879791633066), - FRAC_CONST(0.083504600633152432), - FRAC_CONST(0.085033124980280275), - FRAC_CONST(0.08656144923625117), - FRAC_CONST(0.088089569804770507), - FRAC_CONST(0.089617483090022959), - FRAC_CONST(0.091145185496681005), - FRAC_CONST(0.09267267342991331), - FRAC_CONST(0.094199943295393204), - FRAC_CONST(0.095726991499307162), - FRAC_CONST(0.097253814448363271), - FRAC_CONST(0.098780408549799623), - FRAC_CONST(0.10030677021139286), - FRAC_CONST(0.10183289584146653), - FRAC_CONST(0.10335878184889961), - FRAC_CONST(0.10488442464313497), - FRAC_CONST(0.10640982063418768), - FRAC_CONST(0.10793496623265365), - FRAC_CONST(0.10945985784971798), - FRAC_CONST(0.11098449189716339), - FRAC_CONST(0.11250886478737869), - FRAC_CONST(0.1140329729333672), - FRAC_CONST(0.11555681274875526), - FRAC_CONST(0.11708038064780059), - FRAC_CONST(0.11860367304540072), - FRAC_CONST(0.1201266863571015), - FRAC_CONST(0.12164941699910553), - FRAC_CONST(0.12317186138828048), - FRAC_CONST(0.12469401594216764), - FRAC_CONST(0.12621587707899035), - FRAC_CONST(0.12773744121766231), - FRAC_CONST(0.12925870477779614), - FRAC_CONST(0.13077966417971171), - FRAC_CONST(0.13230031584444465), - FRAC_CONST(0.13382065619375472), - FRAC_CONST(0.13534068165013421), - FRAC_CONST(0.13686038863681638), - FRAC_CONST(0.13837977357778389), - FRAC_CONST(0.13989883289777721), - FRAC_CONST(0.14141756302230302), - FRAC_CONST(0.14293596037764267), - FRAC_CONST(0.14445402139086047), - FRAC_CONST(0.14597174248981221), - FRAC_CONST(0.14748912010315357), - FRAC_CONST(0.14900615066034845), - FRAC_CONST(0.1505228305916774), - FRAC_CONST(0.15203915632824605), - FRAC_CONST(0.15355512430199345), - FRAC_CONST(0.15507073094570051), - FRAC_CONST(0.15658597269299843), - FRAC_CONST(0.15810084597837698), - FRAC_CONST(0.15961534723719306), - FRAC_CONST(0.16112947290567881), - FRAC_CONST(0.16264321942095031), - FRAC_CONST(0.16415658322101581), - FRAC_CONST(0.16566956074478412), - FRAC_CONST(0.16718214843207294), - FRAC_CONST(0.16869434272361733), - FRAC_CONST(0.17020614006107807), - FRAC_CONST(0.17171753688704997), - FRAC_CONST(0.17322852964507032), - FRAC_CONST(0.1747391147796272), - FRAC_CONST(0.17624928873616788), - FRAC_CONST(0.17775904796110717), - FRAC_CONST(0.17926838890183575), - FRAC_CONST(0.18077730800672859), - FRAC_CONST(0.1822858017251533), - FRAC_CONST(0.18379386650747845), - FRAC_CONST(0.1853014988050819), - FRAC_CONST(0.18680869507035927), - FRAC_CONST(0.18831545175673212), - FRAC_CONST(0.18982176531865641), - FRAC_CONST(0.1913276322116309), - FRAC_CONST(0.19283304889220523), - FRAC_CONST(0.1943380118179886), - FRAC_CONST(0.19584251744765785), - FRAC_CONST(0.19734656224096592), - FRAC_CONST(0.19885014265875009), - FRAC_CONST(0.20035325516294045), - FRAC_CONST(0.20185589621656805), - FRAC_CONST(0.20335806228377332), - FRAC_CONST(0.20485974982981442), - FRAC_CONST(0.20636095532107551), - FRAC_CONST(0.20786167522507507), - FRAC_CONST(0.20936190601047416), - FRAC_CONST(0.21086164414708486), - FRAC_CONST(0.21236088610587842), - FRAC_CONST(0.21385962835899375), - FRAC_CONST(0.21535786737974555), - FRAC_CONST(0.21685559964263262), - FRAC_CONST(0.21835282162334632), - FRAC_CONST(0.2198495297987787), - FRAC_CONST(0.22134572064703081), - FRAC_CONST(0.22284139064742112), - FRAC_CONST(0.2243365362804936), - FRAC_CONST(0.22583115402802617), - FRAC_CONST(0.22732524037303886), - FRAC_CONST(0.22881879179980222), - FRAC_CONST(0.23031180479384544), - FRAC_CONST(0.23180427584196478), - FRAC_CONST(0.23329620143223159), - FRAC_CONST(0.23478757805400097), - FRAC_CONST(0.23627840219791957), - FRAC_CONST(0.23776867035593419), - FRAC_CONST(0.23925837902129998), - FRAC_CONST(0.24074752468858843), - FRAC_CONST(0.24223610385369601), - FRAC_CONST(0.24372411301385216), - FRAC_CONST(0.24521154866762754), - FRAC_CONST(0.24669840731494241), - FRAC_CONST(0.24818468545707478), - FRAC_CONST(0.24967037959666857), - FRAC_CONST(0.25115548623774192), - FRAC_CONST(0.25264000188569552), - FRAC_CONST(0.25412392304732062), - FRAC_CONST(0.25560724623080738), - FRAC_CONST(0.25708996794575312), - FRAC_CONST(0.25857208470317034), - FRAC_CONST(0.26005359301549519), - FRAC_CONST(0.26153448939659552), - FRAC_CONST(0.263014770361779), - FRAC_CONST(0.26449443242780163), - FRAC_CONST(0.26597347211287559), - FRAC_CONST(0.26745188593667762), - FRAC_CONST(0.26892967042035726), - FRAC_CONST(0.27040682208654482), - FRAC_CONST(0.27188333745935972), - FRAC_CONST(0.27335921306441868), - FRAC_CONST(0.27483444542884394), - FRAC_CONST(0.27630903108127108), - FRAC_CONST(0.27778296655185769), - FRAC_CONST(0.27925624837229118), - FRAC_CONST(0.28072887307579719), - FRAC_CONST(0.28220083719714756), - FRAC_CONST(0.28367213727266843), - FRAC_CONST(0.28514276984024867), - FRAC_CONST(0.28661273143934779), - FRAC_CONST(0.28808201861100413), - FRAC_CONST(0.28955062789784303), - FRAC_CONST(0.29101855584408509), - FRAC_CONST(0.29248579899555388), - FRAC_CONST(0.29395235389968466), - FRAC_CONST(0.29541821710553201), - FRAC_CONST(0.29688338516377827), - FRAC_CONST(0.2983478546267414), - FRAC_CONST(0.29981162204838335), - FRAC_CONST(0.30127468398431795), - FRAC_CONST(0.30273703699181914), - FRAC_CONST(0.30419867762982911), - FRAC_CONST(0.30565960245896612), - FRAC_CONST(0.3071198080415331), - FRAC_CONST(0.30857929094152509), - FRAC_CONST(0.31003804772463789), - FRAC_CONST(0.31149607495827591), - FRAC_CONST(0.3129533692115602), - FRAC_CONST(0.31440992705533666), - FRAC_CONST(0.31586574506218396), - FRAC_CONST(0.31732081980642174), - FRAC_CONST(0.31877514786411848), - FRAC_CONST(0.32022872581309986), - FRAC_CONST(0.32168155023295658), - FRAC_CONST(0.32313361770505233), - FRAC_CONST(0.32458492481253215), - FRAC_CONST(0.32603546814033024), - FRAC_CONST(0.327485244275178), - FRAC_CONST(0.3289342498056122), - FRAC_CONST(0.33038248132198278), - FRAC_CONST(0.33182993541646111), - FRAC_CONST(0.33327660868304793), - FRAC_CONST(0.33472249771758122), - FRAC_CONST(0.33616759911774452), - FRAC_CONST(0.33761190948307462), - FRAC_CONST(0.33905542541496964), - FRAC_CONST(0.34049814351669716), - FRAC_CONST(0.34194006039340219), - FRAC_CONST(0.34338117265211504), - FRAC_CONST(0.34482147690175929), - FRAC_CONST(0.34626096975316001), - FRAC_CONST(0.34769964781905138), - FRAC_CONST(0.34913750771408497), - FRAC_CONST(0.35057454605483751), - FRAC_CONST(0.35201075945981908), - FRAC_CONST(0.35344614454948081), - FRAC_CONST(0.35488069794622279), - FRAC_CONST(0.35631441627440241), - FRAC_CONST(0.3577472961603419), - FRAC_CONST(0.3591793342323365), - FRAC_CONST(0.36061052712066227), - FRAC_CONST(0.36204087145758418), - FRAC_CONST(0.36347036387736376), - FRAC_CONST(0.36489900101626732), - FRAC_CONST(0.36632677951257359), - FRAC_CONST(0.36775369600658198), - FRAC_CONST(0.36917974714062002), - FRAC_CONST(0.37060492955905167), - FRAC_CONST(0.37202923990828501), - FRAC_CONST(0.3734526748367803), - FRAC_CONST(0.37487523099505754), - FRAC_CONST(0.37629690503570479), - FRAC_CONST(0.37771769361338564), - FRAC_CONST(0.37913759338484732), - FRAC_CONST(0.38055660100892852), - FRAC_CONST(0.38197471314656722), - FRAC_CONST(0.38339192646080866), - FRAC_CONST(0.38480823761681288), - FRAC_CONST(0.38622364328186298), - FRAC_CONST(0.38763814012537273), - FRAC_CONST(0.38905172481889438), - FRAC_CONST(0.39046439403612659), - FRAC_CONST(0.39187614445292235), - FRAC_CONST(0.3932869727472964), - FRAC_CONST(0.39469687559943356), - FRAC_CONST(0.39610584969169627), - FRAC_CONST(0.39751389170863233), - FRAC_CONST(0.39892099833698291), - FRAC_CONST(0.40032716626569009), - FRAC_CONST(0.40173239218590501), - FRAC_CONST(0.4031366727909953), - FRAC_CONST(0.404540004776553), - FRAC_CONST(0.40594238484040251), - FRAC_CONST(0.40734380968260797), - FRAC_CONST(0.40874427600548136), - FRAC_CONST(0.41014378051359024), - FRAC_CONST(0.41154231991376522), - FRAC_CONST(0.41293989091510808), - FRAC_CONST(0.4143364902289991), - FRAC_CONST(0.41573211456910536), - FRAC_CONST(0.41712676065138787), - FRAC_CONST(0.4185204251941097), - FRAC_CONST(0.41991310491784362), - FRAC_CONST(0.42130479654547964), - FRAC_CONST(0.42269549680223295), - FRAC_CONST(0.42408520241565156), - FRAC_CONST(0.4254739101156238), - FRAC_CONST(0.42686161663438643), - FRAC_CONST(0.42824831870653196), - FRAC_CONST(0.42963401306901638), - FRAC_CONST(0.43101869646116703), - FRAC_CONST(0.43240236562469014), - FRAC_CONST(0.43378501730367852), - FRAC_CONST(0.43516664824461926), - FRAC_CONST(0.4365472551964012), - FRAC_CONST(0.43792683491032286), - FRAC_CONST(0.43930538414009995), - FRAC_CONST(0.4406828996418729), - FRAC_CONST(0.4420593781742147), - FRAC_CONST(0.44343481649813848), - FRAC_CONST(0.44480921137710488), - FRAC_CONST(0.44618255957703007), - FRAC_CONST(0.44755485786629301), - FRAC_CONST(0.44892610301574326), - FRAC_CONST(0.45029629179870861), - FRAC_CONST(0.45166542099100249), - FRAC_CONST(0.45303348737093158), - FRAC_CONST(0.45440048771930358), - FRAC_CONST(0.45576641881943464), - FRAC_CONST(0.45713127745715698), - FRAC_CONST(0.45849506042082627), - FRAC_CONST(0.45985776450132954), - FRAC_CONST(0.46121938649209238), - FRAC_CONST(0.46257992318908681), - FRAC_CONST(0.46393937139083852), - FRAC_CONST(0.4652977278984346), - FRAC_CONST(0.46665498951553092), - FRAC_CONST(0.46801115304835983), - FRAC_CONST(0.46936621530573752), - FRAC_CONST(0.4707201730990716), - FRAC_CONST(0.47207302324236866), - FRAC_CONST(0.47342476255224153), - FRAC_CONST(0.47477538784791712), - FRAC_CONST(0.47612489595124358), - FRAC_CONST(0.47747328368669806), - FRAC_CONST(0.47882054788139389), - FRAC_CONST(0.48016668536508839), - FRAC_CONST(0.48151169297018986), - FRAC_CONST(0.48285556753176567), - FRAC_CONST(0.48419830588754903), - FRAC_CONST(0.48553990487794696), - FRAC_CONST(0.48688036134604734), - FRAC_CONST(0.48821967213762679), - FRAC_CONST(0.48955783410115744), - FRAC_CONST(0.49089484408781509), - FRAC_CONST(0.49223069895148602), - FRAC_CONST(0.49356539554877477), - FRAC_CONST(0.49489893073901126), - FRAC_CONST(0.49623130138425825), - FRAC_CONST(0.49756250434931915), - FRAC_CONST(0.49889253650174459), - FRAC_CONST(0.50022139471184068), - FRAC_CONST(0.50154907585267539), - FRAC_CONST(0.50287557680008699), - FRAC_CONST(0.50420089443269034), - FRAC_CONST(0.50552502563188539), - FRAC_CONST(0.50684796728186321), - FRAC_CONST(0.5081697162696146), - FRAC_CONST(0.50949026948493636), - FRAC_CONST(0.51080962382043904), - FRAC_CONST(0.51212777617155469), - FRAC_CONST(0.51344472343654346), - FRAC_CONST(0.5147604625165012), - FRAC_CONST(0.51607499031536663), - FRAC_CONST(0.51738830373992906), - FRAC_CONST(0.51870039969983495), - FRAC_CONST(0.52001127510759604), - FRAC_CONST(0.52132092687859566), - FRAC_CONST(0.52262935193109661), - FRAC_CONST(0.5239365471862486), - FRAC_CONST(0.52524250956809471), - FRAC_CONST(0.52654723600357944), - FRAC_CONST(0.52785072342255523), - FRAC_CONST(0.52915296875779061), - FRAC_CONST(0.53045396894497632), - FRAC_CONST(0.53175372092273332), - FRAC_CONST(0.53305222163261945), - FRAC_CONST(0.53434946801913752), - FRAC_CONST(0.53564545702974109), - FRAC_CONST(0.53694018561484291), - FRAC_CONST(0.5382336507278217), - FRAC_CONST(0.53952584932502889), - FRAC_CONST(0.54081677836579667), - FRAC_CONST(0.54210643481244392), - FRAC_CONST(0.5433948156302848), - FRAC_CONST(0.54468191778763453), - FRAC_CONST(0.54596773825581757), - FRAC_CONST(0.54725227400917409), - FRAC_CONST(0.54853552202506739), - FRAC_CONST(0.54981747928389091), - FRAC_CONST(0.55109814276907543), - FRAC_CONST(0.55237750946709607), - FRAC_CONST(0.55365557636747931), - FRAC_CONST(0.55493234046281037), - FRAC_CONST(0.55620779874873993), - FRAC_CONST(0.55748194822399155), - FRAC_CONST(0.55875478589036831), - FRAC_CONST(0.56002630875276038), - FRAC_CONST(0.56129651381915147), - FRAC_CONST(0.56256539810062656), - FRAC_CONST(0.56383295861137817), - FRAC_CONST(0.56509919236871398), - FRAC_CONST(0.56636409639306384), - FRAC_CONST(0.56762766770798623), - FRAC_CONST(0.56888990334017586), - FRAC_CONST(0.5701508003194703), - FRAC_CONST(0.57141035567885723), - FRAC_CONST(0.57266856645448116), - FRAC_CONST(0.57392542968565075), - FRAC_CONST(0.57518094241484508), - FRAC_CONST(0.57643510168772183), - FRAC_CONST(0.5776879045531228), - FRAC_CONST(0.57893934806308178), - FRAC_CONST(0.58018942927283168), - FRAC_CONST(0.58143814524081017), - FRAC_CONST(0.58268549302866846), - FRAC_CONST(0.58393146970127618), - FRAC_CONST(0.58517607232673041), - FRAC_CONST(0.5864192979763605), - FRAC_CONST(0.58766114372473666), - FRAC_CONST(0.58890160664967572), - FRAC_CONST(0.59014068383224882), - FRAC_CONST(0.59137837235678758), - FRAC_CONST(0.59261466931089113), - FRAC_CONST(0.59384957178543363), - FRAC_CONST(0.59508307687456996), - FRAC_CONST(0.59631518167574371), - FRAC_CONST(0.59754588328969316), - FRAC_CONST(0.59877517882045872), - FRAC_CONST(0.60000306537538894), - FRAC_CONST(0.6012295400651485), - FRAC_CONST(0.60245460000372375), - FRAC_CONST(0.60367824230843037), - FRAC_CONST(0.60490046409991982), - FRAC_CONST(0.60612126250218612), - FRAC_CONST(0.60734063464257293), - FRAC_CONST(0.60855857765177945), - FRAC_CONST(0.60977508866386843), - FRAC_CONST(0.61099016481627166), - FRAC_CONST(0.61220380324979795), - FRAC_CONST(0.61341600110863859), - FRAC_CONST(0.61462675554037505), - FRAC_CONST(0.61583606369598509), - FRAC_CONST(0.61704392272984976), - FRAC_CONST(0.61825032979976025), - FRAC_CONST(0.61945528206692402), - FRAC_CONST(0.62065877669597214), - FRAC_CONST(0.62186081085496536), - FRAC_CONST(0.62306138171540126), - FRAC_CONST(0.62426048645222065), - FRAC_CONST(0.62545812224381436), - FRAC_CONST(0.62665428627202935), - FRAC_CONST(0.62784897572217646), - FRAC_CONST(0.629042187783036), - FRAC_CONST(0.63023391964686437), - FRAC_CONST(0.63142416850940186), - FRAC_CONST(0.63261293156987741), - FRAC_CONST(0.63380020603101728), - FRAC_CONST(0.63498598909904946), - FRAC_CONST(0.63617027798371217), - FRAC_CONST(0.63735306989825913), - FRAC_CONST(0.63853436205946679), - FRAC_CONST(0.63971415168764045), - FRAC_CONST(0.64089243600662138), - FRAC_CONST(0.64206921224379254), - FRAC_CONST(0.64324447763008585), - FRAC_CONST(0.64441822939998838), - FRAC_CONST(0.64559046479154869), - FRAC_CONST(0.64676118104638392), - FRAC_CONST(0.64793037540968534), - FRAC_CONST(0.64909804513022595), - FRAC_CONST(0.65026418746036585), - FRAC_CONST(0.65142879965605982), - FRAC_CONST(0.65259187897686244), - FRAC_CONST(0.65375342268593606), - FRAC_CONST(0.65491342805005603), - FRAC_CONST(0.6560718923396176), - FRAC_CONST(0.65722881282864254), - FRAC_CONST(0.65838418679478505), - FRAC_CONST(0.65953801151933866), - FRAC_CONST(0.6606902842872423), - FRAC_CONST(0.66184100238708687), - FRAC_CONST(0.66299016311112147), - FRAC_CONST(0.66413776375526001), - FRAC_CONST(0.66528380161908718), - FRAC_CONST(0.66642827400586524), - FRAC_CONST(0.66757117822254031), - FRAC_CONST(0.66871251157974798), - FRAC_CONST(0.66985227139182102), - FRAC_CONST(0.67099045497679422), - FRAC_CONST(0.67212705965641173), - FRAC_CONST(0.67326208275613297), - FRAC_CONST(0.67439552160513905), - FRAC_CONST(0.67552737353633852), - FRAC_CONST(0.67665763588637495), - FRAC_CONST(0.6777863059956315), - FRAC_CONST(0.67891338120823841), - FRAC_CONST(0.68003885887207893), - FRAC_CONST(0.68116273633879543), - FRAC_CONST(0.68228501096379557), - FRAC_CONST(0.68340568010625868), - FRAC_CONST(0.6845247411291423), - FRAC_CONST(0.68564219139918747), - FRAC_CONST(0.68675802828692589), - FRAC_CONST(0.68787224916668555), - FRAC_CONST(0.68898485141659704), - FRAC_CONST(0.69009583241859995), - FRAC_CONST(0.69120518955844845), - FRAC_CONST(0.69231292022571822), - FRAC_CONST(0.69341902181381176), - FRAC_CONST(0.69452349171996552), - FRAC_CONST(0.69562632734525487), - FRAC_CONST(0.6967275260946012), - FRAC_CONST(0.69782708537677729), - FRAC_CONST(0.69892500260441415), - FRAC_CONST(0.70002127519400625), - FRAC_CONST(0.70111590056591866), - FRAC_CONST(0.70220887614439187), - FRAC_CONST(0.70330019935754873), - FRAC_CONST(0.70438986763740041), - FRAC_CONST(0.7054778784198521), - FRAC_CONST(0.70656422914470951), - FRAC_CONST(0.70764891725568435), - FRAC_CONST(0.70873194020040065), - FRAC_CONST(0.70981329543040084), - FRAC_CONST(0.71089298040115168), - FRAC_CONST(0.71197099257204999), - FRAC_CONST(0.71304732940642923), - FRAC_CONST(0.71412198837156471), - FRAC_CONST(0.71519496693868001), - FRAC_CONST(0.71626626258295312), - FRAC_CONST(0.71733587278352173), - FRAC_CONST(0.71840379502348972), - FRAC_CONST(0.71947002678993299), - FRAC_CONST(0.72053456557390527), - FRAC_CONST(0.72159740887044366), - FRAC_CONST(0.72265855417857561), - FRAC_CONST(0.72371799900132339), - FRAC_CONST(0.72477574084571128), - FRAC_CONST(0.72583177722277037), - FRAC_CONST(0.72688610564754497), - FRAC_CONST(0.72793872363909862), - FRAC_CONST(0.72898962872051931), - FRAC_CONST(0.73003881841892615), - FRAC_CONST(0.73108629026547423), - FRAC_CONST(0.73213204179536129), - FRAC_CONST(0.73317607054783274), - FRAC_CONST(0.73421837406618817), - FRAC_CONST(0.73525894989778673), - FRAC_CONST(0.73629779559405306), - FRAC_CONST(0.73733490871048279), - FRAC_CONST(0.73837028680664851), - FRAC_CONST(0.73940392744620576), - FRAC_CONST(0.74043582819689802), - FRAC_CONST(0.74146598663056329), - FRAC_CONST(0.74249440032313918), - FRAC_CONST(0.74352106685466912), - FRAC_CONST(0.74454598380930725), - FRAC_CONST(0.74556914877532543), - FRAC_CONST(0.74659055934511731), - FRAC_CONST(0.74761021311520515), - FRAC_CONST(0.74862810768624533), - FRAC_CONST(0.74964424066303348), - FRAC_CONST(0.75065860965451059), - FRAC_CONST(0.75167121227376843), - FRAC_CONST(0.75268204613805523), - FRAC_CONST(0.75369110886878121), - FRAC_CONST(0.75469839809152439), - FRAC_CONST(0.75570391143603588), - FRAC_CONST(0.75670764653624567), - FRAC_CONST(0.75770960103026808), - FRAC_CONST(0.75870977256040739), - FRAC_CONST(0.75970815877316344), - FRAC_CONST(0.76070475731923692), - FRAC_CONST(0.76169956585353527), - FRAC_CONST(0.76269258203517787), - FRAC_CONST(0.76368380352750187), - FRAC_CONST(0.76467322799806714), - FRAC_CONST(0.76566085311866239), - FRAC_CONST(0.76664667656531038), - FRAC_CONST(0.76763069601827327), - FRAC_CONST(0.76861290916205827), - FRAC_CONST(0.76959331368542294), - FRAC_CONST(0.7705719072813807), - FRAC_CONST(0.7715486876472063), - FRAC_CONST(0.77252365248444133), - FRAC_CONST(0.77349679949889905), - FRAC_CONST(0.77446812640067086), - FRAC_CONST(0.77543763090413043), - FRAC_CONST(0.77640531072794039), - FRAC_CONST(0.7773711635950562), - FRAC_CONST(0.77833518723273309), - FRAC_CONST(0.7792973793725303), - FRAC_CONST(0.78025773775031659), - FRAC_CONST(0.78121626010627609), - FRAC_CONST(0.7821729441849129), - FRAC_CONST(0.78312778773505731), - FRAC_CONST(0.78408078850986995), - FRAC_CONST(0.78503194426684808), - FRAC_CONST(0.78598125276783015), - FRAC_CONST(0.7869287117790017), - FRAC_CONST(0.78787431907090011), - FRAC_CONST(0.78881807241842017), - FRAC_CONST(0.78975996960081907), - FRAC_CONST(0.79070000840172161), - FRAC_CONST(0.79163818660912577), - FRAC_CONST(0.79257450201540758), - FRAC_CONST(0.79350895241732666), - FRAC_CONST(0.79444153561603059), - FRAC_CONST(0.79537224941706119), - FRAC_CONST(0.79630109163035911), - FRAC_CONST(0.7972280600702687), - FRAC_CONST(0.79815315255554375), - FRAC_CONST(0.79907636690935235), - FRAC_CONST(0.79999770095928191), - FRAC_CONST(0.8009171525373443), - FRAC_CONST(0.80183471947998131), - FRAC_CONST(0.80275039962806916), - FRAC_CONST(0.80366419082692409), - FRAC_CONST(0.804576090926307), - FRAC_CONST(0.80548609778042912), - FRAC_CONST(0.80639420924795624), - FRAC_CONST(0.80730042319201445), - FRAC_CONST(0.80820473748019472), - FRAC_CONST(0.80910714998455813), - FRAC_CONST(0.81000765858164114), - FRAC_CONST(0.81090626115245967), - FRAC_CONST(0.81180295558251536), - FRAC_CONST(0.81269773976179949), - FRAC_CONST(0.81359061158479851), - FRAC_CONST(0.81448156895049861), - FRAC_CONST(0.81537060976239129), - FRAC_CONST(0.81625773192847739), - FRAC_CONST(0.81714293336127297), - FRAC_CONST(0.81802621197781344), - FRAC_CONST(0.81890756569965895), - FRAC_CONST(0.81978699245289899), - FRAC_CONST(0.82066449016815746), - FRAC_CONST(0.82154005678059761), - FRAC_CONST(0.82241369022992639), - FRAC_CONST(0.82328538846040011), - FRAC_CONST(0.82415514942082857), - FRAC_CONST(0.82502297106458022), - FRAC_CONST(0.82588885134958678), - FRAC_CONST(0.82675278823834852), - FRAC_CONST(0.8276147796979384), - FRAC_CONST(0.82847482370000713), - FRAC_CONST(0.82933291822078825), - FRAC_CONST(0.83018906124110237), - FRAC_CONST(0.83104325074636232), - FRAC_CONST(0.83189548472657759), - FRAC_CONST(0.83274576117635946), - FRAC_CONST(0.83359407809492514), - FRAC_CONST(0.83444043348610319), - FRAC_CONST(0.83528482535833737), - FRAC_CONST(0.83612725172469216), - FRAC_CONST(0.83696771060285702), - FRAC_CONST(0.83780620001515094), - FRAC_CONST(0.8386427179885273), - FRAC_CONST(0.83947726255457855), - FRAC_CONST(0.84030983174954077), - FRAC_CONST(0.84114042361429808), - FRAC_CONST(0.84196903619438768), - FRAC_CONST(0.84279566754000412), - FRAC_CONST(0.84362031570600404), - FRAC_CONST(0.84444297875191066), - FRAC_CONST(0.84526365474191822), - FRAC_CONST(0.84608234174489694), - FRAC_CONST(0.84689903783439735), - FRAC_CONST(0.84771374108865427), - FRAC_CONST(0.84852644959059265), - FRAC_CONST(0.84933716142783067), - FRAC_CONST(0.85014587469268521), - FRAC_CONST(0.85095258748217573), - FRAC_CONST(0.85175729789802912), - FRAC_CONST(0.85256000404668397), - FRAC_CONST(0.85336070403929543), - FRAC_CONST(0.85415939599173873), - FRAC_CONST(0.85495607802461482), - FRAC_CONST(0.85575074826325392), - FRAC_CONST(0.85654340483771996), - FRAC_CONST(0.85733404588281559), - FRAC_CONST(0.85812266953808602), - FRAC_CONST(0.8589092739478239), - FRAC_CONST(0.85969385726107261), - FRAC_CONST(0.86047641763163207), - FRAC_CONST(0.86125695321806206), - FRAC_CONST(0.86203546218368721), - FRAC_CONST(0.86281194269660033), - FRAC_CONST(0.86358639292966799), - FRAC_CONST(0.86435881106053403), - FRAC_CONST(0.86512919527162369), - FRAC_CONST(0.86589754375014882), - FRAC_CONST(0.86666385468811102), - FRAC_CONST(0.86742812628230692), - FRAC_CONST(0.86819035673433131), - FRAC_CONST(0.86895054425058238), - FRAC_CONST(0.86970868704226556), - FRAC_CONST(0.87046478332539767), - FRAC_CONST(0.8712188313208109), - FRAC_CONST(0.8719708292541577), - FRAC_CONST(0.8727207753559143), - FRAC_CONST(0.87346866786138488), - FRAC_CONST(0.8742145050107063), - FRAC_CONST(0.87495828504885154), - FRAC_CONST(0.8757000062256346), - FRAC_CONST(0.87643966679571361), - FRAC_CONST(0.87717726501859594), - FRAC_CONST(0.87791279915864173), - FRAC_CONST(0.87864626748506813), - FRAC_CONST(0.87937766827195318), - FRAC_CONST(0.88010699979824036), - FRAC_CONST(0.88083426034774204), - FRAC_CONST(0.88155944820914378), - FRAC_CONST(0.8822825616760086), - FRAC_CONST(0.88300359904678072), - FRAC_CONST(0.88372255862478966), - FRAC_CONST(0.8844394387182537), - FRAC_CONST(0.88515423764028511), - FRAC_CONST(0.88586695370889279), - FRAC_CONST(0.88657758524698704), - FRAC_CONST(0.88728613058238315), - FRAC_CONST(0.88799258804780556), - FRAC_CONST(0.88869695598089171), - FRAC_CONST(0.88939923272419552), - FRAC_CONST(0.89009941662519221), - FRAC_CONST(0.89079750603628149), - FRAC_CONST(0.89149349931479138), - FRAC_CONST(0.89218739482298248), - FRAC_CONST(0.89287919092805168), - FRAC_CONST(0.89356888600213602), - FRAC_CONST(0.89425647842231604), - FRAC_CONST(0.89494196657062075), - FRAC_CONST(0.89562534883403), - FRAC_CONST(0.89630662360447966), - FRAC_CONST(0.89698578927886397), - FRAC_CONST(0.89766284425904075), - FRAC_CONST(0.89833778695183419), - FRAC_CONST(0.89901061576903907), - FRAC_CONST(0.89968132912742393), - FRAC_CONST(0.9003499254487356), - FRAC_CONST(0.90101640315970233), - FRAC_CONST(0.90168076069203773), - FRAC_CONST(0.9023429964824442), - FRAC_CONST(0.90300310897261704), - FRAC_CONST(0.90366109660924798), - FRAC_CONST(0.90431695784402832), - FRAC_CONST(0.90497069113365325), - FRAC_CONST(0.90562229493982516), - FRAC_CONST(0.90627176772925766), - FRAC_CONST(0.90691910797367803), - FRAC_CONST(0.90756431414983252), - FRAC_CONST(0.9082073847394887), - FRAC_CONST(0.90884831822943912), - FRAC_CONST(0.90948711311150543), - FRAC_CONST(0.91012376788254157), - FRAC_CONST(0.91075828104443757), - FRAC_CONST(0.91139065110412232), - FRAC_CONST(0.91202087657356823), - FRAC_CONST(0.9126489559697939), - FRAC_CONST(0.91327488781486776), - FRAC_CONST(0.91389867063591168), - FRAC_CONST(0.91452030296510445), - FRAC_CONST(0.91513978333968526), - FRAC_CONST(0.91575711030195672), - FRAC_CONST(0.91637228239928914), - FRAC_CONST(0.91698529818412289), - FRAC_CONST(0.91759615621397295), - FRAC_CONST(0.9182048550514309), - FRAC_CONST(0.91881139326416994), - FRAC_CONST(0.91941576942494696), - FRAC_CONST(0.92001798211160657), - FRAC_CONST(0.92061802990708386), - FRAC_CONST(0.92121591139940873), - FRAC_CONST(0.92181162518170812), - FRAC_CONST(0.92240516985220988), - FRAC_CONST(0.92299654401424625), - FRAC_CONST(0.92358574627625656), - FRAC_CONST(0.9241727752517912), - FRAC_CONST(0.92475762955951391), - FRAC_CONST(0.9253403078232062), - FRAC_CONST(0.92592080867176996), - FRAC_CONST(0.92649913073923051), - FRAC_CONST(0.9270752726647401), - FRAC_CONST(0.92764923309258118), - FRAC_CONST(0.92822101067216944), - FRAC_CONST(0.92879060405805702), - FRAC_CONST(0.9293580119099355), - FRAC_CONST(0.92992323289263956), - FRAC_CONST(0.93048626567614978), - FRAC_CONST(0.93104710893559517), - FRAC_CONST(0.93160576135125783), - FRAC_CONST(0.93216222160857432), - FRAC_CONST(0.93271648839814025), - FRAC_CONST(0.93326856041571205), - FRAC_CONST(0.93381843636221096), - FRAC_CONST(0.9343661149437259), - FRAC_CONST(0.93491159487151609), - FRAC_CONST(0.93545487486201462), - FRAC_CONST(0.9359959536368313), - FRAC_CONST(0.9365348299227555), - FRAC_CONST(0.93707150245175919), - FRAC_CONST(0.93760596996099999), - FRAC_CONST(0.93813823119282436), - FRAC_CONST(0.93866828489477017), - FRAC_CONST(0.9391961298195699), - FRAC_CONST(0.93972176472515334), - FRAC_CONST(0.94024518837465088), - FRAC_CONST(0.94076639953639607), - FRAC_CONST(0.94128539698392866), - FRAC_CONST(0.94180217949599765), - FRAC_CONST(0.94231674585656378), - FRAC_CONST(0.94282909485480271), - FRAC_CONST(0.94333922528510772), - FRAC_CONST(0.94384713594709269), - FRAC_CONST(0.94435282564559475), - FRAC_CONST(0.94485629319067721), - FRAC_CONST(0.94535753739763229), - FRAC_CONST(0.94585655708698391), - FRAC_CONST(0.94635335108449059), - FRAC_CONST(0.946847918221148), - FRAC_CONST(0.94734025733319194), - FRAC_CONST(0.94783036726210101), - FRAC_CONST(0.94831824685459909), - FRAC_CONST(0.94880389496265838), - FRAC_CONST(0.94928731044350201), - FRAC_CONST(0.94976849215960668), - FRAC_CONST(0.95024743897870523), - FRAC_CONST(0.95072414977378961), - FRAC_CONST(0.95119862342311323), - FRAC_CONST(0.95167085881019386), - FRAC_CONST(0.95214085482381583), - FRAC_CONST(0.95260861035803324), - FRAC_CONST(0.9530741243121722), - FRAC_CONST(0.95353739559083328), - FRAC_CONST(0.95399842310389449), - FRAC_CONST(0.95445720576651349), - FRAC_CONST(0.95491374249913052), - FRAC_CONST(0.95536803222747024), - FRAC_CONST(0.95582007388254542), - FRAC_CONST(0.95626986640065814), - FRAC_CONST(0.95671740872340305), - FRAC_CONST(0.9571626997976701), - FRAC_CONST(0.95760573857564624), - FRAC_CONST(0.9580465240148186), - FRAC_CONST(0.9584850550779761), - FRAC_CONST(0.95892133073321306), - FRAC_CONST(0.95935534995393079), - FRAC_CONST(0.9597871117188399), - FRAC_CONST(0.96021661501196343), - FRAC_CONST(0.96064385882263847), - FRAC_CONST(0.96106884214551935), - FRAC_CONST(0.961491563980579), - FRAC_CONST(0.9619120233331121), - FRAC_CONST(0.9623302192137374), - FRAC_CONST(0.96274615063839941), - FRAC_CONST(0.96315981662837136), - FRAC_CONST(0.96357121621025721), - FRAC_CONST(0.96398034841599411), - FRAC_CONST(0.96438721228285429), - FRAC_CONST(0.9647918068534479), - FRAC_CONST(0.96519413117572472), - FRAC_CONST(0.96559418430297683), - FRAC_CONST(0.96599196529384057), - FRAC_CONST(0.96638747321229879), - FRAC_CONST(0.96678070712768327), - FRAC_CONST(0.96717166611467664), - FRAC_CONST(0.96756034925331436), - FRAC_CONST(0.9679467556289878), - FRAC_CONST(0.9683308843324453), - FRAC_CONST(0.96871273445979478), - FRAC_CONST(0.9690923051125061), - FRAC_CONST(0.96946959539741295), - FRAC_CONST(0.96984460442671483), - FRAC_CONST(0.97021733131797916), - FRAC_CONST(0.97058777519414363), - FRAC_CONST(0.97095593518351797), - FRAC_CONST(0.97132181041978616), - FRAC_CONST(0.97168540004200854), - FRAC_CONST(0.9720467031946235), - FRAC_CONST(0.97240571902744977), - FRAC_CONST(0.97276244669568857), - FRAC_CONST(0.97311688535992513), - FRAC_CONST(0.97346903418613095), - FRAC_CONST(0.9738188923456661), - FRAC_CONST(0.97416645901528032), - FRAC_CONST(0.97451173337711572), - FRAC_CONST(0.97485471461870843), - FRAC_CONST(0.97519540193299037), - FRAC_CONST(0.97553379451829136), - FRAC_CONST(0.97586989157834103), - FRAC_CONST(0.97620369232227056), - FRAC_CONST(0.97653519596461447), - FRAC_CONST(0.97686440172531264), - FRAC_CONST(0.97719130882971228), - FRAC_CONST(0.97751591650856928), - FRAC_CONST(0.97783822399805043), - FRAC_CONST(0.97815823053973505), - FRAC_CONST(0.97847593538061683), - FRAC_CONST(0.97879133777310567), - FRAC_CONST(0.97910443697502925), - FRAC_CONST(0.97941523224963478), - FRAC_CONST(0.97972372286559117), - FRAC_CONST(0.98002990809698998), - FRAC_CONST(0.98033378722334796), - FRAC_CONST(0.98063535952960812), - FRAC_CONST(0.98093462430614164), - FRAC_CONST(0.98123158084874973), - FRAC_CONST(0.98152622845866466), - FRAC_CONST(0.9818185664425525), - FRAC_CONST(0.98210859411251361), - FRAC_CONST(0.98239631078608469), - FRAC_CONST(0.98268171578624086), - FRAC_CONST(0.98296480844139644), - FRAC_CONST(0.98324558808540707), - FRAC_CONST(0.98352405405757126), - FRAC_CONST(0.98380020570263149), - FRAC_CONST(0.98407404237077645), - FRAC_CONST(0.9843455634176419), - FRAC_CONST(0.9846147682043126), - FRAC_CONST(0.9848816560973237), - FRAC_CONST(0.98514622646866223), - FRAC_CONST(0.98540847869576842), - FRAC_CONST(0.98566841216153755), - FRAC_CONST(0.98592602625432113), - FRAC_CONST(0.98618132036792827), - FRAC_CONST(0.98643429390162707), - FRAC_CONST(0.98668494626014669), - FRAC_CONST(0.98693327685367771), - FRAC_CONST(0.98717928509787434), - FRAC_CONST(0.98742297041385541), - FRAC_CONST(0.98766433222820571), - FRAC_CONST(0.98790336997297779), - FRAC_CONST(0.98814008308569257), - FRAC_CONST(0.98837447100934128), - FRAC_CONST(0.98860653319238645), - FRAC_CONST(0.98883626908876354), - FRAC_CONST(0.98906367815788154), - FRAC_CONST(0.98928875986462517), - FRAC_CONST(0.98951151367935519), - FRAC_CONST(0.98973193907791057), - FRAC_CONST(0.98995003554160899), - FRAC_CONST(0.9901658025572484), - FRAC_CONST(0.99037923961710816), - FRAC_CONST(0.99059034621895015), - FRAC_CONST(0.99079912186602037), - FRAC_CONST(0.99100556606704937), - FRAC_CONST(0.99120967833625406), - FRAC_CONST(0.99141145819333854), - FRAC_CONST(0.99161090516349537), - FRAC_CONST(0.99180801877740643), - FRAC_CONST(0.99200279857124452), - FRAC_CONST(0.99219524408667392), - FRAC_CONST(0.99238535487085167), - FRAC_CONST(0.99257313047642881), - FRAC_CONST(0.99275857046155114), - FRAC_CONST(0.99294167438986047), - FRAC_CONST(0.99312244183049558), - FRAC_CONST(0.99330087235809328), - FRAC_CONST(0.99347696555278919), - FRAC_CONST(0.99365072100021912), - FRAC_CONST(0.99382213829151966), - FRAC_CONST(0.99399121702332938), - FRAC_CONST(0.99415795679778973), - FRAC_CONST(0.99432235722254581), - FRAC_CONST(0.9944844179107476), - FRAC_CONST(0.99464413848105071), - FRAC_CONST(0.99480151855761711), - FRAC_CONST(0.99495655777011638), - FRAC_CONST(0.99510925575372611), - FRAC_CONST(0.99525961214913339), - FRAC_CONST(0.9954076266025349), - FRAC_CONST(0.99555329876563847), - FRAC_CONST(0.99569662829566352), - FRAC_CONST(0.99583761485534161), - FRAC_CONST(0.99597625811291779), - FRAC_CONST(0.99611255774215113), - FRAC_CONST(0.99624651342231552), - FRAC_CONST(0.99637812483820021), - FRAC_CONST(0.99650739168011082), - FRAC_CONST(0.9966343136438699), - FRAC_CONST(0.996758890430818), - FRAC_CONST(0.99688112174781385), - FRAC_CONST(0.99700100730723529), - FRAC_CONST(0.99711854682697998), - FRAC_CONST(0.99723374003046616), - FRAC_CONST(0.99734658664663323), - FRAC_CONST(0.99745708640994191), - FRAC_CONST(0.99756523906037575), - FRAC_CONST(0.997671044343441), - FRAC_CONST(0.99777450201016782), - FRAC_CONST(0.99787561181711015), - FRAC_CONST(0.99797437352634699), - FRAC_CONST(0.99807078690548234), - FRAC_CONST(0.99816485172764624), - FRAC_CONST(0.99825656777149518), - FRAC_CONST(0.99834593482121237), - FRAC_CONST(0.99843295266650844), - FRAC_CONST(0.99851762110262221), - FRAC_CONST(0.99859993993032037), - FRAC_CONST(0.99867990895589909), - FRAC_CONST(0.99875752799118334), - FRAC_CONST(0.99883279685352799), - FRAC_CONST(0.99890571536581829), - FRAC_CONST(0.99897628335646982), - FRAC_CONST(0.99904450065942929), - FRAC_CONST(0.99911036711417489), - FRAC_CONST(0.99917388256571638), - FRAC_CONST(0.99923504686459585), - FRAC_CONST(0.99929385986688779), - FRAC_CONST(0.99935032143419944), - FRAC_CONST(0.9994044314336713), - FRAC_CONST(0.99945618973797734), - FRAC_CONST(0.99950559622532531), - FRAC_CONST(0.99955265077945699), - FRAC_CONST(0.99959735328964838), - FRAC_CONST(0.9996397036507102), - FRAC_CONST(0.99967970176298793), - FRAC_CONST(0.99971734753236219), - FRAC_CONST(0.99975264087024884), - FRAC_CONST(0.99978558169359921), - FRAC_CONST(0.99981616992490041), - FRAC_CONST(0.99984440549217524), - FRAC_CONST(0.99987028832898295), - FRAC_CONST(0.99989381837441849), - FRAC_CONST(0.99991499557311347), - FRAC_CONST(0.999933819875236), - FRAC_CONST(0.99995029123649048), - FRAC_CONST(0.99996440961811828), - FRAC_CONST(0.99997617498689761), - FRAC_CONST(0.9999855873151432), - FRAC_CONST(0.99999264658070719), - FRAC_CONST(0.99999735276697821), - FRAC_CONST(0.99999970586288223) -}; - -#ifdef ALLOW_SMALL_FRAMELENGTH -ALIGN static const real_t sine_long_960[] = -{ - FRAC_CONST(0.00081812299560725323), - FRAC_CONST(0.0024543667964602917), - FRAC_CONST(0.0040906040262347889), - FRAC_CONST(0.0057268303042312674), - FRAC_CONST(0.0073630412497795667), - FRAC_CONST(0.0089992324822505774), - FRAC_CONST(0.010635399621067975), - FRAC_CONST(0.012271538285719924), - FRAC_CONST(0.013907644095770845), - FRAC_CONST(0.015543712670873098), - FRAC_CONST(0.017179739630778748), - FRAC_CONST(0.018815720595351273), - FRAC_CONST(0.020451651184577292), - FRAC_CONST(0.022087527018578291), - FRAC_CONST(0.023723343717622358), - FRAC_CONST(0.025359096902135895), - FRAC_CONST(0.02699478219271537), - FRAC_CONST(0.028630395210139003), - FRAC_CONST(0.030265931575378519), - FRAC_CONST(0.031901386909610863), - FRAC_CONST(0.033536756834229922), - FRAC_CONST(0.035172036970858266), - FRAC_CONST(0.036807222941358832), - FRAC_CONST(0.038442310367846677), - FRAC_CONST(0.040077294872700696), - FRAC_CONST(0.041712172078575326), - FRAC_CONST(0.043346937608412288), - FRAC_CONST(0.044981587085452281), - FRAC_CONST(0.046616116133246711), - FRAC_CONST(0.048250520375669431), - FRAC_CONST(0.049884795436928406), - FRAC_CONST(0.051518936941577477), - FRAC_CONST(0.053152940514528055), - FRAC_CONST(0.05478680178106083), - FRAC_CONST(0.056420516366837495), - FRAC_CONST(0.05805407989791244), - FRAC_CONST(0.059687488000744485), - FRAC_CONST(0.061320736302208578), - FRAC_CONST(0.062953820429607482), - FRAC_CONST(0.064586736010683557), - FRAC_CONST(0.066219478673630344), - FRAC_CONST(0.06785204404710439), - FRAC_CONST(0.069484427760236861), - FRAC_CONST(0.071116625442645326), - FRAC_CONST(0.072748632724445372), - FRAC_CONST(0.07438044523626236), - FRAC_CONST(0.076012058609243122), - FRAC_CONST(0.077643468475067631), - FRAC_CONST(0.079274670465960706), - FRAC_CONST(0.080905660214703745), - FRAC_CONST(0.082536433354646319), - FRAC_CONST(0.084166985519717977), - FRAC_CONST(0.085797312344439894), - FRAC_CONST(0.08742740946393647), - FRAC_CONST(0.089057272513947183), - FRAC_CONST(0.090686897130838162), - FRAC_CONST(0.092316278951613845), - FRAC_CONST(0.093945413613928788), - FRAC_CONST(0.095574296756099186), - FRAC_CONST(0.097202924017114667), - FRAC_CONST(0.098831291036649963), - FRAC_CONST(0.10045939345507648), - FRAC_CONST(0.10208722691347409), - FRAC_CONST(0.10371478705364276), - FRAC_CONST(0.10534206951811415), - FRAC_CONST(0.10696906995016341), - FRAC_CONST(0.10859578399382072), - FRAC_CONST(0.11022220729388306), - FRAC_CONST(0.11184833549592579), - FRAC_CONST(0.11347416424631435), - FRAC_CONST(0.11509968919221586), - FRAC_CONST(0.11672490598161089), - FRAC_CONST(0.11834981026330495), - FRAC_CONST(0.11997439768694031), - FRAC_CONST(0.12159866390300751), - FRAC_CONST(0.12322260456285709), - FRAC_CONST(0.12484621531871121), - FRAC_CONST(0.12646949182367517), - FRAC_CONST(0.12809242973174936), - FRAC_CONST(0.12971502469784052), - FRAC_CONST(0.13133727237777362), - FRAC_CONST(0.13295916842830346), - FRAC_CONST(0.13458070850712617), - FRAC_CONST(0.13620188827289101), - FRAC_CONST(0.1378227033852118), - FRAC_CONST(0.13944314950467873), - FRAC_CONST(0.14106322229286994), - FRAC_CONST(0.14268291741236291), - FRAC_CONST(0.14430223052674654), - FRAC_CONST(0.1459211573006321), - FRAC_CONST(0.14753969339966552), - FRAC_CONST(0.14915783449053857), - FRAC_CONST(0.15077557624100058), - FRAC_CONST(0.15239291431987001), - FRAC_CONST(0.1540098443970461), - FRAC_CONST(0.15562636214352044), - FRAC_CONST(0.15724246323138855), - FRAC_CONST(0.15885814333386142), - FRAC_CONST(0.16047339812527725), - FRAC_CONST(0.16208822328111283), - FRAC_CONST(0.16370261447799525), - FRAC_CONST(0.16531656739371339), - FRAC_CONST(0.16693007770722967), - FRAC_CONST(0.16854314109869134), - FRAC_CONST(0.17015575324944232), - FRAC_CONST(0.17176790984203447), - FRAC_CONST(0.17337960656023954), - FRAC_CONST(0.1749908390890603), - FRAC_CONST(0.17660160311474243), - FRAC_CONST(0.17821189432478593), - FRAC_CONST(0.17982170840795647), - FRAC_CONST(0.18143104105429744), - FRAC_CONST(0.18303988795514095), - FRAC_CONST(0.1846482448031197), - FRAC_CONST(0.18625610729217834), - FRAC_CONST(0.1878634711175852), - FRAC_CONST(0.18947033197594348), - FRAC_CONST(0.19107668556520319), - FRAC_CONST(0.19268252758467228), - FRAC_CONST(0.19428785373502844), - FRAC_CONST(0.19589265971833042), - FRAC_CONST(0.19749694123802966), - FRAC_CONST(0.19910069399898173), - FRAC_CONST(0.20070391370745785), - FRAC_CONST(0.20230659607115639), - FRAC_CONST(0.20390873679921437), - FRAC_CONST(0.20551033160221882), - FRAC_CONST(0.20711137619221856), - FRAC_CONST(0.2087118662827353), - FRAC_CONST(0.21031179758877552), - FRAC_CONST(0.21191116582684155), - FRAC_CONST(0.21350996671494335), - FRAC_CONST(0.21510819597260972), - FRAC_CONST(0.21670584932089998), - FRAC_CONST(0.2183029224824154), - FRAC_CONST(0.21989941118131037), - FRAC_CONST(0.22149531114330431), - FRAC_CONST(0.22309061809569264), - FRAC_CONST(0.22468532776735861), - FRAC_CONST(0.22627943588878449), - FRAC_CONST(0.22787293819206314), - FRAC_CONST(0.22946583041090929), - FRAC_CONST(0.23105810828067114), - FRAC_CONST(0.23264976753834157), - FRAC_CONST(0.23424080392256985), - FRAC_CONST(0.2358312131736727), - FRAC_CONST(0.23742099103364595), - FRAC_CONST(0.23901013324617584), - FRAC_CONST(0.24059863555665045), - FRAC_CONST(0.24218649371217096), - FRAC_CONST(0.24377370346156332), - FRAC_CONST(0.24536026055538934), - FRAC_CONST(0.24694616074595824), - FRAC_CONST(0.24853139978733788), - FRAC_CONST(0.25011597343536629), - FRAC_CONST(0.25169987744766298), - FRAC_CONST(0.25328310758364025), - FRAC_CONST(0.25486565960451457), - FRAC_CONST(0.25644752927331788), - FRAC_CONST(0.25802871235490898), - FRAC_CONST(0.25960920461598508), - FRAC_CONST(0.26118900182509258), - FRAC_CONST(0.26276809975263904), - FRAC_CONST(0.264346494170904), - FRAC_CONST(0.26592418085405067), - FRAC_CONST(0.26750115557813692), - FRAC_CONST(0.2690774141211269), - FRAC_CONST(0.27065295226290209), - FRAC_CONST(0.2722277657852728), - FRAC_CONST(0.27380185047198918), - FRAC_CONST(0.27537520210875299), - FRAC_CONST(0.2769478164832283), - FRAC_CONST(0.27851968938505312), - FRAC_CONST(0.28009081660585067), - FRAC_CONST(0.28166119393924061), - FRAC_CONST(0.28323081718085019), - FRAC_CONST(0.28479968212832563), - FRAC_CONST(0.28636778458134327), - FRAC_CONST(0.28793512034162105), - FRAC_CONST(0.2895016852129294), - FRAC_CONST(0.29106747500110264), - FRAC_CONST(0.29263248551405047), - FRAC_CONST(0.2941967125617686), - FRAC_CONST(0.29576015195635058), - FRAC_CONST(0.29732279951199847), - FRAC_CONST(0.29888465104503475), - FRAC_CONST(0.30044570237391266), - FRAC_CONST(0.30200594931922808), - FRAC_CONST(0.30356538770373032), - FRAC_CONST(0.30512401335233358), - FRAC_CONST(0.30668182209212791), - FRAC_CONST(0.3082388097523906), - FRAC_CONST(0.30979497216459695), - FRAC_CONST(0.31135030516243201), - FRAC_CONST(0.3129048045818012), - FRAC_CONST(0.31445846626084178), - FRAC_CONST(0.31601128603993378), - FRAC_CONST(0.31756325976171151), - FRAC_CONST(0.31911438327107416), - FRAC_CONST(0.32066465241519732), - FRAC_CONST(0.32221406304354389), - FRAC_CONST(0.3237626110078754), - FRAC_CONST(0.32531029216226293), - FRAC_CONST(0.32685710236309828), - FRAC_CONST(0.32840303746910487), - FRAC_CONST(0.32994809334134939), - FRAC_CONST(0.3314922658432522), - FRAC_CONST(0.33303555084059877), - FRAC_CONST(0.33457794420155085), - FRAC_CONST(0.33611944179665709), - FRAC_CONST(0.33766003949886464), - FRAC_CONST(0.33919973318352969), - FRAC_CONST(0.34073851872842903), - FRAC_CONST(0.34227639201377064), - FRAC_CONST(0.34381334892220483), - FRAC_CONST(0.34534938533883547), - FRAC_CONST(0.34688449715123082), - FRAC_CONST(0.34841868024943456), - FRAC_CONST(0.34995193052597684), - FRAC_CONST(0.35148424387588523), - FRAC_CONST(0.3530156161966958), - FRAC_CONST(0.35454604338846402), - FRAC_CONST(0.35607552135377557), - FRAC_CONST(0.35760404599775775), - FRAC_CONST(0.35913161322809023), - FRAC_CONST(0.36065821895501554), - FRAC_CONST(0.36218385909135092), - FRAC_CONST(0.36370852955249849), - FRAC_CONST(0.36523222625645668), - FRAC_CONST(0.36675494512383078), - FRAC_CONST(0.36827668207784414), - FRAC_CONST(0.36979743304434909), - FRAC_CONST(0.37131719395183754), - FRAC_CONST(0.37283596073145214), - FRAC_CONST(0.37435372931699717), - FRAC_CONST(0.37587049564494951), - FRAC_CONST(0.37738625565446909), - FRAC_CONST(0.37890100528741022), - FRAC_CONST(0.38041474048833229), - FRAC_CONST(0.38192745720451066), - FRAC_CONST(0.38343915138594736), - FRAC_CONST(0.38494981898538222), - FRAC_CONST(0.38645945595830333), - FRAC_CONST(0.38796805826295838), - FRAC_CONST(0.38947562186036483), - FRAC_CONST(0.39098214271432141), - FRAC_CONST(0.39248761679141814), - FRAC_CONST(0.3939920400610481), - FRAC_CONST(0.39549540849541737), - FRAC_CONST(0.39699771806955625), - FRAC_CONST(0.39849896476132979), - FRAC_CONST(0.39999914455144892), - FRAC_CONST(0.40149825342348083), - FRAC_CONST(0.4029962873638599), - FRAC_CONST(0.40449324236189854), - FRAC_CONST(0.40598911440979762), - FRAC_CONST(0.40748389950265762), - FRAC_CONST(0.40897759363848879), - FRAC_CONST(0.41047019281822261), - FRAC_CONST(0.41196169304572178), - FRAC_CONST(0.4134520903277914), - FRAC_CONST(0.41494138067418929), - FRAC_CONST(0.41642956009763715), - FRAC_CONST(0.41791662461383078), - FRAC_CONST(0.41940257024145089), - FRAC_CONST(0.42088739300217382), - FRAC_CONST(0.42237108892068231), - FRAC_CONST(0.42385365402467584), - FRAC_CONST(0.42533508434488143), - FRAC_CONST(0.42681537591506419), - FRAC_CONST(0.42829452477203828), - FRAC_CONST(0.42977252695567697), - FRAC_CONST(0.43124937850892364), - FRAC_CONST(0.4327250754778022), - FRAC_CONST(0.43419961391142781), - FRAC_CONST(0.43567298986201736), - FRAC_CONST(0.43714519938489987), - FRAC_CONST(0.43861623853852766), - FRAC_CONST(0.44008610338448595), - FRAC_CONST(0.44155478998750436), - FRAC_CONST(0.44302229441546676), - FRAC_CONST(0.4444886127394222), - FRAC_CONST(0.44595374103359531), - FRAC_CONST(0.44741767537539667), - FRAC_CONST(0.44888041184543348), - FRAC_CONST(0.45034194652752002), - FRAC_CONST(0.45180227550868812), - FRAC_CONST(0.45326139487919759), - FRAC_CONST(0.45471930073254679), - FRAC_CONST(0.45617598916548296), - FRAC_CONST(0.45763145627801283), - FRAC_CONST(0.45908569817341294), - FRAC_CONST(0.46053871095824001), - FRAC_CONST(0.46199049074234161), - FRAC_CONST(0.46344103363886635), - FRAC_CONST(0.46489033576427435), - FRAC_CONST(0.46633839323834758), - FRAC_CONST(0.46778520218420055), - FRAC_CONST(0.46923075872829029), - FRAC_CONST(0.47067505900042683), - FRAC_CONST(0.47211809913378361), - FRAC_CONST(0.47355987526490806), - FRAC_CONST(0.47500038353373153), - FRAC_CONST(0.47643962008357982), - FRAC_CONST(0.47787758106118372), - FRAC_CONST(0.47931426261668875), - FRAC_CONST(0.48074966090366611), - FRAC_CONST(0.48218377207912272), - FRAC_CONST(0.48361659230351117), - FRAC_CONST(0.48504811774074069), - FRAC_CONST(0.48647834455818684), - FRAC_CONST(0.48790726892670194), - FRAC_CONST(0.48933488702062544), - FRAC_CONST(0.49076119501779414), - FRAC_CONST(0.49218618909955225), - FRAC_CONST(0.4936098654507618), - FRAC_CONST(0.49503222025981269), - FRAC_CONST(0.49645324971863303), - FRAC_CONST(0.49787295002269943), - FRAC_CONST(0.49929131737104687), - FRAC_CONST(0.50070834796627917), - FRAC_CONST(0.50212403801457872), - FRAC_CONST(0.50353838372571758), - FRAC_CONST(0.50495138131306638), - FRAC_CONST(0.50636302699360547), - FRAC_CONST(0.50777331698793449), - FRAC_CONST(0.50918224752028263), - FRAC_CONST(0.51058981481851906), - FRAC_CONST(0.51199601511416237), - FRAC_CONST(0.51340084464239111), - FRAC_CONST(0.51480429964205421), - FRAC_CONST(0.51620637635567967), - FRAC_CONST(0.51760707102948678), - FRAC_CONST(0.51900637991339404), - FRAC_CONST(0.5204042992610306), - FRAC_CONST(0.52180082532974559), - FRAC_CONST(0.5231959543806185), - FRAC_CONST(0.52458968267846895), - FRAC_CONST(0.52598200649186677), - FRAC_CONST(0.52737292209314235), - FRAC_CONST(0.52876242575839572), - FRAC_CONST(0.53015051376750777), - FRAC_CONST(0.53153718240414882), - FRAC_CONST(0.53292242795578992), - FRAC_CONST(0.53430624671371152), - FRAC_CONST(0.53568863497301467), - FRAC_CONST(0.5370695890326298), - FRAC_CONST(0.5384491051953274), - FRAC_CONST(0.53982717976772743), - FRAC_CONST(0.54120380906030963), - FRAC_CONST(0.54257898938742311), - FRAC_CONST(0.54395271706729609), - FRAC_CONST(0.54532498842204646), - FRAC_CONST(0.54669579977769045), - FRAC_CONST(0.54806514746415402), - FRAC_CONST(0.54943302781528081), - FRAC_CONST(0.55079943716884383), - FRAC_CONST(0.55216437186655387), - FRAC_CONST(0.55352782825406999), - FRAC_CONST(0.55488980268100907), - FRAC_CONST(0.55625029150095584), - FRAC_CONST(0.55760929107147217), - FRAC_CONST(0.55896679775410718), - FRAC_CONST(0.56032280791440714), - FRAC_CONST(0.56167731792192455), - FRAC_CONST(0.56303032415022869), - FRAC_CONST(0.56438182297691453), - FRAC_CONST(0.56573181078361312), - FRAC_CONST(0.56708028395600085), - FRAC_CONST(0.56842723888380908), - FRAC_CONST(0.56977267196083425), - FRAC_CONST(0.57111657958494688), - FRAC_CONST(0.5724589581581021), - FRAC_CONST(0.57379980408634845), - FRAC_CONST(0.57513911377983773), - FRAC_CONST(0.57647688365283478), - FRAC_CONST(0.57781311012372738), - FRAC_CONST(0.57914778961503466), - FRAC_CONST(0.58048091855341843), - FRAC_CONST(0.5818124933696911), - FRAC_CONST(0.58314251049882604), - FRAC_CONST(0.58447096637996743), - FRAC_CONST(0.58579785745643886), - FRAC_CONST(0.5871231801757536), - FRAC_CONST(0.58844693098962408), - FRAC_CONST(0.58976910635397084), - FRAC_CONST(0.59108970272893235), - FRAC_CONST(0.59240871657887517), - FRAC_CONST(0.59372614437240179), - FRAC_CONST(0.59504198258236196), - FRAC_CONST(0.5963562276858605), - FRAC_CONST(0.59766887616426767), - FRAC_CONST(0.5989799245032289), - FRAC_CONST(0.60028936919267273), - FRAC_CONST(0.60159720672682204), - FRAC_CONST(0.60290343360420195), - FRAC_CONST(0.60420804632765002), - FRAC_CONST(0.60551104140432543), - FRAC_CONST(0.60681241534571839), - FRAC_CONST(0.60811216466765883), - FRAC_CONST(0.60941028589032709), - FRAC_CONST(0.61070677553826169), - FRAC_CONST(0.61200163014036979), - FRAC_CONST(0.61329484622993602), - FRAC_CONST(0.6145864203446314), - FRAC_CONST(0.61587634902652377), - FRAC_CONST(0.61716462882208556), - FRAC_CONST(0.61845125628220421), - FRAC_CONST(0.61973622796219074), - FRAC_CONST(0.6210195404217892), - FRAC_CONST(0.62230119022518593), - FRAC_CONST(0.62358117394101897), - FRAC_CONST(0.62485948814238634), - FRAC_CONST(0.62613612940685637), - FRAC_CONST(0.62741109431647646), - FRAC_CONST(0.62868437945778133), - FRAC_CONST(0.62995598142180387), - FRAC_CONST(0.6312258968040827), - FRAC_CONST(0.63249412220467238), - FRAC_CONST(0.63376065422815175), - FRAC_CONST(0.63502548948363347), - FRAC_CONST(0.63628862458477287), - FRAC_CONST(0.63755005614977711), - FRAC_CONST(0.63880978080141437), - FRAC_CONST(0.6400677951670225), - FRAC_CONST(0.6413240958785188), - FRAC_CONST(0.64257867957240766), - FRAC_CONST(0.6438315428897915), - FRAC_CONST(0.64508268247637779), - FRAC_CONST(0.64633209498248945), - FRAC_CONST(0.64757977706307335), - FRAC_CONST(0.64882572537770888), - FRAC_CONST(0.65006993659061751), - FRAC_CONST(0.65131240737067142), - FRAC_CONST(0.65255313439140239), - FRAC_CONST(0.65379211433101081), - FRAC_CONST(0.65502934387237444), - FRAC_CONST(0.6562648197030575), - FRAC_CONST(0.65749853851531959), - FRAC_CONST(0.65873049700612374), - FRAC_CONST(0.65996069187714679), - FRAC_CONST(0.66118911983478657), - FRAC_CONST(0.66241577759017178), - FRAC_CONST(0.66364066185917048), - FRAC_CONST(0.66486376936239888), - FRAC_CONST(0.66608509682523009), - FRAC_CONST(0.66730464097780284), - FRAC_CONST(0.66852239855503071), - FRAC_CONST(0.66973836629660977), - FRAC_CONST(0.67095254094702894), - FRAC_CONST(0.67216491925557675), - FRAC_CONST(0.67337549797635199), - FRAC_CONST(0.67458427386827102), - FRAC_CONST(0.67579124369507693), - FRAC_CONST(0.67699640422534846), - FRAC_CONST(0.67819975223250772), - FRAC_CONST(0.6794012844948305), - FRAC_CONST(0.68060099779545302), - FRAC_CONST(0.68179888892238183), - FRAC_CONST(0.6829949546685018), - FRAC_CONST(0.68418919183158522), - FRAC_CONST(0.68538159721429948), - FRAC_CONST(0.6865721676242168), - FRAC_CONST(0.68776089987382172), - FRAC_CONST(0.68894779078052026), - FRAC_CONST(0.69013283716664853), - FRAC_CONST(0.69131603585948032), - FRAC_CONST(0.69249738369123692), - FRAC_CONST(0.69367687749909468), - FRAC_CONST(0.69485451412519361), - FRAC_CONST(0.69603029041664599), - FRAC_CONST(0.6972042032255451), - FRAC_CONST(0.6983762494089728), - FRAC_CONST(0.69954642582900894), - FRAC_CONST(0.70071472935273893), - FRAC_CONST(0.70188115685226271), - FRAC_CONST(0.703045705204703), - FRAC_CONST(0.70420837129221303), - FRAC_CONST(0.70536915200198613), - FRAC_CONST(0.70652804422626281), - FRAC_CONST(0.70768504486233985), - FRAC_CONST(0.70884015081257845), - FRAC_CONST(0.70999335898441229), - FRAC_CONST(0.711144666290356), - FRAC_CONST(0.71229406964801356), - FRAC_CONST(0.71344156598008623), - FRAC_CONST(0.71458715221438096), - FRAC_CONST(0.71573082528381871), - FRAC_CONST(0.71687258212644234), - FRAC_CONST(0.7180124196854254), - FRAC_CONST(0.71915033490907943), - FRAC_CONST(0.72028632475086318), - FRAC_CONST(0.72142038616938997), - FRAC_CONST(0.72255251612843596), - FRAC_CONST(0.72368271159694852), - FRAC_CONST(0.72481096954905444), - FRAC_CONST(0.72593728696406756), - FRAC_CONST(0.72706166082649704), - FRAC_CONST(0.72818408812605595), - FRAC_CONST(0.72930456585766834), - FRAC_CONST(0.73042309102147851), - FRAC_CONST(0.73153966062285747), - FRAC_CONST(0.73265427167241282), - FRAC_CONST(0.73376692118599507), - FRAC_CONST(0.73487760618470677), - FRAC_CONST(0.73598632369490979), - FRAC_CONST(0.73709307074823405), - FRAC_CONST(0.73819784438158409), - FRAC_CONST(0.73930064163714881), - FRAC_CONST(0.74040145956240788), - FRAC_CONST(0.74150029521014049), - FRAC_CONST(0.74259714563843304), - FRAC_CONST(0.74369200791068657), - FRAC_CONST(0.74478487909562552), - FRAC_CONST(0.74587575626730485), - FRAC_CONST(0.74696463650511791), - FRAC_CONST(0.74805151689380456), - FRAC_CONST(0.74913639452345926), - FRAC_CONST(0.75021926648953785), - FRAC_CONST(0.75130012989286621), - FRAC_CONST(0.7523789818396478), - FRAC_CONST(0.75345581944147111), - FRAC_CONST(0.75453063981531809), - FRAC_CONST(0.75560344008357094), - FRAC_CONST(0.75667421737402052), - FRAC_CONST(0.7577429688198738), - FRAC_CONST(0.75880969155976163), - FRAC_CONST(0.75987438273774599), - FRAC_CONST(0.76093703950332836), - FRAC_CONST(0.76199765901145666), - FRAC_CONST(0.76305623842253345), - FRAC_CONST(0.76411277490242291), - FRAC_CONST(0.76516726562245885), - FRAC_CONST(0.76621970775945258), - FRAC_CONST(0.76727009849569949), - FRAC_CONST(0.76831843501898767), - FRAC_CONST(0.76936471452260458), - FRAC_CONST(0.77040893420534517), - FRAC_CONST(0.77145109127151923), - FRAC_CONST(0.77249118293095853), - FRAC_CONST(0.77352920639902467), - FRAC_CONST(0.77456515889661659), - FRAC_CONST(0.77559903765017746), - FRAC_CONST(0.7766308398917029), - FRAC_CONST(0.77766056285874774), - FRAC_CONST(0.77868820379443371), - FRAC_CONST(0.77971375994745684), - FRAC_CONST(0.78073722857209438), - FRAC_CONST(0.7817586069282132), - FRAC_CONST(0.78277789228127592), - FRAC_CONST(0.78379508190234881), - FRAC_CONST(0.78481017306810918), - FRAC_CONST(0.78582316306085265), - FRAC_CONST(0.78683404916849986), - FRAC_CONST(0.78784282868460476), - FRAC_CONST(0.78884949890836087), - FRAC_CONST(0.78985405714460888), - FRAC_CONST(0.7908565007038445), - FRAC_CONST(0.79185682690222425), - FRAC_CONST(0.79285503306157412), - FRAC_CONST(0.79385111650939566), - FRAC_CONST(0.79484507457887377), - FRAC_CONST(0.79583690460888357), - FRAC_CONST(0.79682660394399751), - FRAC_CONST(0.79781416993449272), - FRAC_CONST(0.79879959993635785), - FRAC_CONST(0.7997828913113002), - FRAC_CONST(0.80076404142675273), - FRAC_CONST(0.80174304765588156), - FRAC_CONST(0.80271990737759213), - FRAC_CONST(0.80369461797653707), - FRAC_CONST(0.80466717684312306), - FRAC_CONST(0.80563758137351682), - FRAC_CONST(0.80660582896965372), - FRAC_CONST(0.80757191703924336), - FRAC_CONST(0.80853584299577752), - FRAC_CONST(0.80949760425853612), - FRAC_CONST(0.81045719825259477), - FRAC_CONST(0.81141462240883167), - FRAC_CONST(0.81236987416393436), - FRAC_CONST(0.81332295096040608), - FRAC_CONST(0.81427385024657373), - FRAC_CONST(0.81522256947659355), - FRAC_CONST(0.81616910611045879), - FRAC_CONST(0.817113457614006), - FRAC_CONST(0.81805562145892186), - FRAC_CONST(0.81899559512275044), - FRAC_CONST(0.81993337608889916), - FRAC_CONST(0.82086896184664637), - FRAC_CONST(0.8218023498911472), - FRAC_CONST(0.82273353772344116), - FRAC_CONST(0.82366252285045805), - FRAC_CONST(0.82458930278502529), - FRAC_CONST(0.82551387504587381), - FRAC_CONST(0.82643623715764558), - FRAC_CONST(0.82735638665089983), - FRAC_CONST(0.82827432106211907), - FRAC_CONST(0.82919003793371693), - FRAC_CONST(0.83010353481404364), - FRAC_CONST(0.83101480925739324), - FRAC_CONST(0.83192385882400965), - FRAC_CONST(0.83283068108009373), - FRAC_CONST(0.8337352735978093), - FRAC_CONST(0.83463763395529011), - FRAC_CONST(0.83553775973664579), - FRAC_CONST(0.83643564853196872), - FRAC_CONST(0.83733129793734051), - FRAC_CONST(0.83822470555483797), - FRAC_CONST(0.83911586899254031), - FRAC_CONST(0.84000478586453453), - FRAC_CONST(0.84089145379092289), - FRAC_CONST(0.84177587039782842), - FRAC_CONST(0.84265803331740163), - FRAC_CONST(0.84353794018782702), - FRAC_CONST(0.844415588653329), - FRAC_CONST(0.8452909763641786), - FRAC_CONST(0.84616410097669936), - FRAC_CONST(0.84703496015327406), - FRAC_CONST(0.84790355156235053), - FRAC_CONST(0.84876987287844818), - FRAC_CONST(0.8496339217821639), - FRAC_CONST(0.85049569596017938), - FRAC_CONST(0.85135519310526508), - FRAC_CONST(0.85221241091628896), - FRAC_CONST(0.85306734709822085), - FRAC_CONST(0.85391999936213903), - FRAC_CONST(0.85477036542523732), - FRAC_CONST(0.85561844301082923), - FRAC_CONST(0.85646422984835635), - FRAC_CONST(0.85730772367339259), - FRAC_CONST(0.85814892222765116), - FRAC_CONST(0.85898782325899026), - FRAC_CONST(0.85982442452141961), - FRAC_CONST(0.86065872377510555), - FRAC_CONST(0.86149071878637817), - FRAC_CONST(0.8623204073277364), - FRAC_CONST(0.86314778717785412), - FRAC_CONST(0.8639728561215867), - FRAC_CONST(0.86479561194997623), - FRAC_CONST(0.86561605246025763), - FRAC_CONST(0.86643417545586487), - FRAC_CONST(0.8672499787464365), - FRAC_CONST(0.86806346014782154), - FRAC_CONST(0.8688746174820855), - FRAC_CONST(0.86968344857751589), - FRAC_CONST(0.87048995126862883), - FRAC_CONST(0.87129412339617363), - FRAC_CONST(0.87209596280713941), - FRAC_CONST(0.8728954673547612), - FRAC_CONST(0.87369263489852422), - FRAC_CONST(0.87448746330417149), - FRAC_CONST(0.87527995044370765), - FRAC_CONST(0.8760700941954066), - FRAC_CONST(0.87685789244381551), - FRAC_CONST(0.87764334307976144), - FRAC_CONST(0.87842644400035663), - FRAC_CONST(0.8792071931090043), - FRAC_CONST(0.87998558831540408), - FRAC_CONST(0.88076162753555787), - FRAC_CONST(0.88153530869177488), - FRAC_CONST(0.88230662971267804), - FRAC_CONST(0.88307558853320878), - FRAC_CONST(0.88384218309463292), - FRAC_CONST(0.8846064113445461), - FRAC_CONST(0.88536827123687933), - FRAC_CONST(0.88612776073190425), - FRAC_CONST(0.88688487779623937), - FRAC_CONST(0.88763962040285393), - FRAC_CONST(0.8883919865310751), - FRAC_CONST(0.88914197416659235), - FRAC_CONST(0.88988958130146301), - FRAC_CONST(0.8906348059341177), - FRAC_CONST(0.89137764606936609), - FRAC_CONST(0.89211809971840139), - FRAC_CONST(0.89285616489880615), - FRAC_CONST(0.89359183963455813), - FRAC_CONST(0.89432512195603453), - FRAC_CONST(0.89505600990001799), - FRAC_CONST(0.89578450150970124), - FRAC_CONST(0.8965105948346932), - FRAC_CONST(0.89723428793102367), - FRAC_CONST(0.89795557886114807), - FRAC_CONST(0.89867446569395382), - FRAC_CONST(0.89939094650476448), - FRAC_CONST(0.90010501937534515), - FRAC_CONST(0.900816682393908), - FRAC_CONST(0.90152593365511691), - FRAC_CONST(0.90223277126009283), - FRAC_CONST(0.90293719331641886), - FRAC_CONST(0.90363919793814496), - FRAC_CONST(0.90433878324579353), - FRAC_CONST(0.90503594736636439), - FRAC_CONST(0.90573068843333915), - FRAC_CONST(0.90642300458668679), - FRAC_CONST(0.90711289397286898), - FRAC_CONST(0.90780035474484411), - FRAC_CONST(0.90848538506207266), - FRAC_CONST(0.90916798309052227), - FRAC_CONST(0.90984814700267291), - FRAC_CONST(0.9105258749775208), - FRAC_CONST(0.91120116520058425), - FRAC_CONST(0.91187401586390815), - FRAC_CONST(0.91254442516606893), - FRAC_CONST(0.9132123913121788), - FRAC_CONST(0.91387791251389161), - FRAC_CONST(0.91454098698940678), - FRAC_CONST(0.91520161296347435), - FRAC_CONST(0.91585978866739981), - FRAC_CONST(0.91651551233904871), - FRAC_CONST(0.91716878222285148), - FRAC_CONST(0.91781959656980805), - FRAC_CONST(0.91846795363749245), - FRAC_CONST(0.91911385169005766), - FRAC_CONST(0.9197572889982405), - FRAC_CONST(0.9203982638393654), - FRAC_CONST(0.92103677449734989), - FRAC_CONST(0.92167281926270861), - FRAC_CONST(0.92230639643255874), - FRAC_CONST(0.92293750431062316), - FRAC_CONST(0.92356614120723612), - FRAC_CONST(0.92419230543934783), - FRAC_CONST(0.92481599533052783), - FRAC_CONST(0.92543720921097061), - FRAC_CONST(0.92605594541749991), - FRAC_CONST(0.92667220229357261), - FRAC_CONST(0.92728597818928349), - FRAC_CONST(0.9278972714613698), - FRAC_CONST(0.92850608047321548), - FRAC_CONST(0.9291124035948557), - FRAC_CONST(0.92971623920298097), - FRAC_CONST(0.93031758568094147), - FRAC_CONST(0.93091644141875196), - FRAC_CONST(0.93151280481309506), - FRAC_CONST(0.93210667426732674), - FRAC_CONST(0.93269804819147983), - FRAC_CONST(0.93328692500226818), - FRAC_CONST(0.93387330312309147), - FRAC_CONST(0.93445718098403896), - FRAC_CONST(0.93503855702189376), - FRAC_CONST(0.9356174296801375), - FRAC_CONST(0.93619379740895381), - FRAC_CONST(0.93676765866523259), - FRAC_CONST(0.93733901191257496), - FRAC_CONST(0.93790785562129597), - FRAC_CONST(0.93847418826842988), - FRAC_CONST(0.93903800833773399), - FRAC_CONST(0.93959931431969212), - FRAC_CONST(0.94015810471151917), - FRAC_CONST(0.94071437801716529), - FRAC_CONST(0.94126813274731924), - FRAC_CONST(0.94181936741941319), - FRAC_CONST(0.94236808055762578), - FRAC_CONST(0.94291427069288691), - FRAC_CONST(0.94345793636288133), - FRAC_CONST(0.94399907611205225), - FRAC_CONST(0.9445376884916058), - FRAC_CONST(0.94507377205951448), - FRAC_CONST(0.94560732538052128), - FRAC_CONST(0.94613834702614352), - FRAC_CONST(0.94666683557467624), - FRAC_CONST(0.94719278961119657), - FRAC_CONST(0.94771620772756759), - FRAC_CONST(0.94823708852244104), - FRAC_CONST(0.94875543060126255), - FRAC_CONST(0.94927123257627433), - FRAC_CONST(0.94978449306651924), - FRAC_CONST(0.95029521069784428), - FRAC_CONST(0.9508033841029051), - FRAC_CONST(0.95130901192116835), - FRAC_CONST(0.9518120927989161), - FRAC_CONST(0.95231262538924943), - FRAC_CONST(0.95281060835209208), - FRAC_CONST(0.95330604035419386), - FRAC_CONST(0.95379892006913403), - FRAC_CONST(0.95428924617732525), - FRAC_CONST(0.95477701736601728), - FRAC_CONST(0.95526223232929941), - FRAC_CONST(0.95574488976810545), - FRAC_CONST(0.95622498839021619), - FRAC_CONST(0.95670252691026292), - FRAC_CONST(0.95717750404973156), - FRAC_CONST(0.95764991853696524), - FRAC_CONST(0.95811976910716812), - FRAC_CONST(0.95858705450240911), - FRAC_CONST(0.95905177347162429), - FRAC_CONST(0.95951392477062125), - FRAC_CONST(0.95997350716208196), - FRAC_CONST(0.96043051941556579), - FRAC_CONST(0.96088496030751369), - FRAC_CONST(0.96133682862125036), - FRAC_CONST(0.96178612314698864), - FRAC_CONST(0.96223284268183173), - FRAC_CONST(0.9626769860297768), - FRAC_CONST(0.96311855200171881), - FRAC_CONST(0.96355753941545252), - FRAC_CONST(0.96399394709567654), - FRAC_CONST(0.96442777387399625), - FRAC_CONST(0.96485901858892686), - FRAC_CONST(0.96528768008589627), - FRAC_CONST(0.96571375721724895), - FRAC_CONST(0.96613724884224783), - FRAC_CONST(0.96655815382707866), - FRAC_CONST(0.96697647104485207), - FRAC_CONST(0.96739219937560694), - FRAC_CONST(0.96780533770631338), - FRAC_CONST(0.96821588493087585), - FRAC_CONST(0.9686238399501359), - FRAC_CONST(0.96902920167187501), - FRAC_CONST(0.96943196901081796), - FRAC_CONST(0.96983214088863534), - FRAC_CONST(0.9702297162339466), - FRAC_CONST(0.97062469398232287), - FRAC_CONST(0.97101707307629004), - FRAC_CONST(0.97140685246533098), - FRAC_CONST(0.97179403110588902), - FRAC_CONST(0.97217860796137046), - FRAC_CONST(0.97256058200214734), - FRAC_CONST(0.97293995220556007), - FRAC_CONST(0.97331671755592064), - FRAC_CONST(0.97369087704451474), - FRAC_CONST(0.97406242966960455), - FRAC_CONST(0.97443137443643235), - FRAC_CONST(0.97479771035722163), - FRAC_CONST(0.97516143645118103), - FRAC_CONST(0.97552255174450631), - FRAC_CONST(0.97588105527038305), - FRAC_CONST(0.97623694606898959), - FRAC_CONST(0.97659022318749911), - FRAC_CONST(0.97694088568008242), - FRAC_CONST(0.97728893260791039), - FRAC_CONST(0.97763436303915685), - FRAC_CONST(0.97797717604900047), - FRAC_CONST(0.97831737071962765), - FRAC_CONST(0.97865494614023485), - FRAC_CONST(0.97898990140703124), - FRAC_CONST(0.97932223562324061), - FRAC_CONST(0.97965194789910426), - FRAC_CONST(0.9799790373518833), - FRAC_CONST(0.98030350310586067), - FRAC_CONST(0.98062534429234405), - FRAC_CONST(0.98094456004966768), - FRAC_CONST(0.98126114952319499), - FRAC_CONST(0.98157511186532054), - FRAC_CONST(0.98188644623547261), - FRAC_CONST(0.98219515180011563), - FRAC_CONST(0.98250122773275184), - FRAC_CONST(0.98280467321392362), - FRAC_CONST(0.98310548743121629), - FRAC_CONST(0.98340366957925973), - FRAC_CONST(0.98369921885973044), - FRAC_CONST(0.98399213448135414), - FRAC_CONST(0.98428241565990748), - FRAC_CONST(0.98457006161822058), - FRAC_CONST(0.98485507158617835), - FRAC_CONST(0.98513744480072363), - FRAC_CONST(0.98541718050585803), - FRAC_CONST(0.98569427795264519), - FRAC_CONST(0.98596873639921168), - FRAC_CONST(0.98624055511074971), - FRAC_CONST(0.98650973335951875), - FRAC_CONST(0.98677627042484772), - FRAC_CONST(0.98704016559313645), - FRAC_CONST(0.98730141815785832), - FRAC_CONST(0.98756002741956173), - FRAC_CONST(0.9878159926858715), - FRAC_CONST(0.98806931327149194), - FRAC_CONST(0.98831998849820735), - FRAC_CONST(0.98856801769488489), - FRAC_CONST(0.98881340019747566), - FRAC_CONST(0.98905613534901682), - FRAC_CONST(0.98929622249963345), - FRAC_CONST(0.98953366100653983), - FRAC_CONST(0.98976845023404181), - FRAC_CONST(0.99000058955353776), - FRAC_CONST(0.99023007834352106), - FRAC_CONST(0.99045691598958097), - FRAC_CONST(0.99068110188440506), - FRAC_CONST(0.99090263542778001), - FRAC_CONST(0.99112151602659404), - FRAC_CONST(0.99133774309483769), - FRAC_CONST(0.99155131605360625), - FRAC_CONST(0.99176223433110056), - FRAC_CONST(0.99197049736262888), - FRAC_CONST(0.99217610459060845), - FRAC_CONST(0.99237905546456673), - FRAC_CONST(0.99257934944114334), - FRAC_CONST(0.99277698598409092), - FRAC_CONST(0.99297196456427694), - FRAC_CONST(0.99316428465968509), - FRAC_CONST(0.99335394575541669), - FRAC_CONST(0.99354094734369169), - FRAC_CONST(0.99372528892385081), - FRAC_CONST(0.99390697000235606), - FRAC_CONST(0.99408599009279242), - FRAC_CONST(0.99426234871586938), - FRAC_CONST(0.99443604539942176), - FRAC_CONST(0.99460707967841133), - FRAC_CONST(0.99477545109492771), - FRAC_CONST(0.99494115919819004), - FRAC_CONST(0.99510420354454787), - FRAC_CONST(0.99526458369748239), - FRAC_CONST(0.99542229922760772), - FRAC_CONST(0.99557734971267187), - FRAC_CONST(0.9957297347375581), - FRAC_CONST(0.99587945389428578), - FRAC_CONST(0.99602650678201154), - FRAC_CONST(0.99617089300703077), - FRAC_CONST(0.996312612182778), - FRAC_CONST(0.99645166392982831), - FRAC_CONST(0.99658804787589839), - FRAC_CONST(0.99672176365584741), - FRAC_CONST(0.99685281091167788), - FRAC_CONST(0.99698118929253687), - FRAC_CONST(0.99710689845471678), - FRAC_CONST(0.99722993806165661), - FRAC_CONST(0.99735030778394196), - FRAC_CONST(0.99746800729930707), - FRAC_CONST(0.99758303629263489), - FRAC_CONST(0.99769539445595812), - FRAC_CONST(0.99780508148846014), - FRAC_CONST(0.99791209709647588), - FRAC_CONST(0.99801644099349218), - FRAC_CONST(0.99811811290014918), - FRAC_CONST(0.9982171125442405), - FRAC_CONST(0.9983134396607144), - FRAC_CONST(0.99840709399167404), - FRAC_CONST(0.99849807528637868), - FRAC_CONST(0.99858638330124405), - FRAC_CONST(0.99867201779984294), - FRAC_CONST(0.99875497855290607), - FRAC_CONST(0.99883526533832245), - FRAC_CONST(0.99891287794114036), - FRAC_CONST(0.99898781615356746), - FRAC_CONST(0.99906007977497147), - FRAC_CONST(0.99912966861188113), - FRAC_CONST(0.99919658247798593), - FRAC_CONST(0.99926082119413751), - FRAC_CONST(0.99932238458834954), - FRAC_CONST(0.999381272495798), - FRAC_CONST(0.99943748475882255), - FRAC_CONST(0.9994910212269259), - FRAC_CONST(0.99954188175677483), - FRAC_CONST(0.99959006621220048), - FRAC_CONST(0.99963557446419837), - FRAC_CONST(0.99967840639092931), - FRAC_CONST(0.99971856187771946), - FRAC_CONST(0.99975604081706027), - FRAC_CONST(0.99979084310860955), - FRAC_CONST(0.99982296865919107), - FRAC_CONST(0.99985241738279484), - FRAC_CONST(0.99987918920057806), - FRAC_CONST(0.99990328404086426), - FRAC_CONST(0.9999247018391445), - FRAC_CONST(0.99994344253807688), - FRAC_CONST(0.99995950608748674), - FRAC_CONST(0.99997289244436727), - FRAC_CONST(0.99998360157287902), - FRAC_CONST(0.9999916334443506), - FRAC_CONST(0.99999698803727821), - FRAC_CONST(0.99999966533732598) -}; -#endif - -ALIGN static const real_t sine_short_128[] = -{ - FRAC_CONST(0.0061358846491544753), - FRAC_CONST(0.01840672990580482), - FRAC_CONST(0.030674803176636626), - FRAC_CONST(0.04293825693494082), - FRAC_CONST(0.055195244349689934), - FRAC_CONST(0.067443919563664051), - FRAC_CONST(0.079682437971430126), - FRAC_CONST(0.091908956497132724), - FRAC_CONST(0.10412163387205459), - FRAC_CONST(0.11631863091190475), - FRAC_CONST(0.12849811079379317), - FRAC_CONST(0.14065823933284921), - FRAC_CONST(0.15279718525844344), - FRAC_CONST(0.16491312048996989), - FRAC_CONST(0.17700422041214875), - FRAC_CONST(0.18906866414980619), - FRAC_CONST(0.2011046348420919), - FRAC_CONST(0.21311031991609136), - FRAC_CONST(0.22508391135979283), - FRAC_CONST(0.2370236059943672), - FRAC_CONST(0.24892760574572015), - FRAC_CONST(0.26079411791527551), - FRAC_CONST(0.27262135544994898), - FRAC_CONST(0.28440753721127188), - FRAC_CONST(0.29615088824362379), - FRAC_CONST(0.30784964004153487), - FRAC_CONST(0.31950203081601569), - FRAC_CONST(0.33110630575987643), - FRAC_CONST(0.34266071731199438), - FRAC_CONST(0.35416352542049034), - FRAC_CONST(0.36561299780477385), - FRAC_CONST(0.37700741021641826), - FRAC_CONST(0.38834504669882625), - FRAC_CONST(0.39962419984564679), - FRAC_CONST(0.41084317105790391), - FRAC_CONST(0.42200027079979968), - FRAC_CONST(0.43309381885315196), - FRAC_CONST(0.4441221445704292), - FRAC_CONST(0.45508358712634384), - FRAC_CONST(0.46597649576796618), - FRAC_CONST(0.47679923006332209), - FRAC_CONST(0.487550160148436), - FRAC_CONST(0.49822766697278187), - FRAC_CONST(0.50883014254310699), - FRAC_CONST(0.51935599016558964), - FRAC_CONST(0.52980362468629461), - FRAC_CONST(0.54017147272989285), - FRAC_CONST(0.55045797293660481), - FRAC_CONST(0.56066157619733603), - FRAC_CONST(0.57078074588696726), - FRAC_CONST(0.58081395809576453), - FRAC_CONST(0.59075970185887416), - FRAC_CONST(0.60061647938386897), - FRAC_CONST(0.61038280627630948), - FRAC_CONST(0.6200572117632891), - FRAC_CONST(0.62963823891492698), - FRAC_CONST(0.63912444486377573), - FRAC_CONST(0.64851440102211244), - FRAC_CONST(0.65780669329707864), - FRAC_CONST(0.66699992230363747), - FRAC_CONST(0.67609270357531592), - FRAC_CONST(0.68508366777270036), - FRAC_CONST(0.693971460889654), - FRAC_CONST(0.7027547444572253), - FRAC_CONST(0.71143219574521643), - FRAC_CONST(0.72000250796138165), - FRAC_CONST(0.7284643904482252), - FRAC_CONST(0.73681656887736979), - FRAC_CONST(0.74505778544146595), - FRAC_CONST(0.75318679904361241), - FRAC_CONST(0.76120238548426178), - FRAC_CONST(0.76910333764557959), - FRAC_CONST(0.77688846567323244), - FRAC_CONST(0.78455659715557524), - FRAC_CONST(0.79210657730021239), - FRAC_CONST(0.79953726910790501), - FRAC_CONST(0.80684755354379922), - FRAC_CONST(0.8140363297059483), - FRAC_CONST(0.82110251499110465), - FRAC_CONST(0.8280450452577558), - FRAC_CONST(0.83486287498638001), - FRAC_CONST(0.84155497743689833), - FRAC_CONST(0.84812034480329712), - FRAC_CONST(0.85455798836540053), - FRAC_CONST(0.86086693863776731), - FRAC_CONST(0.86704624551569265), - FRAC_CONST(0.87309497841829009), - FRAC_CONST(0.87901222642863341), - FRAC_CONST(0.88479709843093779), - FRAC_CONST(0.89044872324475788), - FRAC_CONST(0.89596624975618511), - FRAC_CONST(0.90134884704602203), - FRAC_CONST(0.90659570451491533), - FRAC_CONST(0.91170603200542988), - FRAC_CONST(0.9166790599210427), - FRAC_CONST(0.9215140393420419), - FRAC_CONST(0.92621024213831127), - FRAC_CONST(0.93076696107898371), - FRAC_CONST(0.9351835099389475), - FRAC_CONST(0.93945922360218992), - FRAC_CONST(0.94359345816196039), - FRAC_CONST(0.94758559101774109), - FRAC_CONST(0.95143502096900834), - FRAC_CONST(0.95514116830577067), - FRAC_CONST(0.9587034748958716), - FRAC_CONST(0.96212140426904158), - FRAC_CONST(0.9653944416976894), - FRAC_CONST(0.96852209427441727), - FRAC_CONST(0.97150389098625178), - FRAC_CONST(0.97433938278557586), - FRAC_CONST(0.97702814265775439), - FRAC_CONST(0.97956976568544052), - FRAC_CONST(0.98196386910955524), - FRAC_CONST(0.98421009238692903), - FRAC_CONST(0.98630809724459867), - FRAC_CONST(0.98825756773074946), - FRAC_CONST(0.99005821026229712), - FRAC_CONST(0.99170975366909953), - FRAC_CONST(0.9932119492347945), - FRAC_CONST(0.99456457073425542), - FRAC_CONST(0.99576741446765982), - FRAC_CONST(0.99682029929116567), - FRAC_CONST(0.99772306664419164), - FRAC_CONST(0.99847558057329477), - FRAC_CONST(0.99907772775264536), - FRAC_CONST(0.99952941750109314), - FRAC_CONST(0.9998305817958234), - FRAC_CONST(0.99998117528260111) -}; - -#ifdef ALLOW_SMALL_FRAMELENGTH -ALIGN static const real_t sine_short_120[] = -{ - FRAC_CONST(0.0065449379673518581), - FRAC_CONST(0.019633692460628301), - FRAC_CONST(0.032719082821776137), - FRAC_CONST(0.045798866936520771), - FRAC_CONST(0.058870803651189033), - FRAC_CONST(0.071932653156719387), - FRAC_CONST(0.084982177372441667), - FRAC_CONST(0.09801714032956059), - FRAC_CONST(0.11103530855427769), - FRAC_CONST(0.12403445145048532), - FRAC_CONST(0.13701234168196802), - FRAC_CONST(0.14996675555404498), - FRAC_CONST(0.16289547339458874), - FRAC_CONST(0.17579627993435451), - FRAC_CONST(0.18866696468655525), - FRAC_CONST(0.2015053223256171), - FRAC_CONST(0.21430915306505074), - FRAC_CONST(0.2270762630343732), - FRAC_CONST(0.23980446465501654), - FRAC_CONST(0.25249157701515795), - FRAC_CONST(0.26513542624340797), - FRAC_CONST(0.27773384588129219), - FRAC_CONST(0.29028467725446233), - FRAC_CONST(0.3027857698425746), - FRAC_CONST(0.31523498164776964), - FRAC_CONST(0.32763017956169349), - FRAC_CONST(0.33996923973099424), - FRAC_CONST(0.35225004792123354), - FRAC_CONST(0.36447049987914965), - FRAC_CONST(0.37662850169321077), - FRAC_CONST(0.38872197015239557), - FRAC_CONST(0.40074883310314097), - FRAC_CONST(0.41270702980439467), - FRAC_CONST(0.42459451128071307), - FRAC_CONST(0.43640924067334208), - FRAC_CONST(0.44814919358922256), - FRAC_CONST(0.45981235844785984), - FRAC_CONST(0.47139673682599764), - FRAC_CONST(0.48290034380003727), - FRAC_CONST(0.49432120828614462), - FRAC_CONST(0.50565737337798455), - FRAC_CONST(0.51690689668202761), - FRAC_CONST(0.52806785065036799), - FRAC_CONST(0.53913832291100017), - FRAC_CONST(0.55011641659549337), - FRAC_CONST(0.56100025066400983), - FRAC_CONST(0.57178796022761225), - FRAC_CONST(0.58247769686780215), - FRAC_CONST(0.59306762895323706), - FRAC_CONST(0.60355594195357143), - FRAC_CONST(0.61394083875036642), - FRAC_CONST(0.62422053994501758), - FRAC_CONST(0.63439328416364549), - FRAC_CONST(0.64445732835889735), - FRAC_CONST(0.65441094810861034), - FRAC_CONST(0.66425243791128175), - FRAC_CONST(0.67398011147829784), - FRAC_CONST(0.68359230202287125), - FRAC_CONST(0.69308736254563585), - FRAC_CONST(0.70246366611685174), - FRAC_CONST(0.71171960615517138), - FRAC_CONST(0.72085359670291882), - FRAC_CONST(0.7298640726978356), - FRAC_CONST(0.73874949024124625), - FRAC_CONST(0.74750832686259672), - FRAC_CONST(0.75613908178032285), - FRAC_CONST(0.76464027615900032), - FRAC_CONST(0.77301045336273699), - FRAC_CONST(0.78124817920475853), - FRAC_CONST(0.78935204219315003), - FRAC_CONST(0.79732065377270711), - FRAC_CONST(0.80515264856285829), - FRAC_CONST(0.81284668459161513), - FRAC_CONST(0.82040144352551359), - FRAC_CONST(0.82781563089550203), - FRAC_CONST(0.83508797631874299), - FRAC_CONST(0.84221723371628654), - FRAC_CONST(0.84920218152657889), - FRAC_CONST(0.85604162291477137), - FRAC_CONST(0.86273438597779184), - FRAC_CONST(0.86927932394514362), - FRAC_CONST(0.87567531537539967), - FRAC_CONST(0.88192126434835494), - FRAC_CONST(0.88801610065280734), - FRAC_CONST(0.89395877996993212), - FRAC_CONST(0.8997482840522214), - FRAC_CONST(0.90538362089795521), - FRAC_CONST(0.91086382492117568), - FRAC_CONST(0.91618795711713596), - FRAC_CONST(0.92135510522319242), - FRAC_CONST(0.9263643838751181), - FRAC_CONST(0.93121493475880346), - FRAC_CONST(0.93590592675732565), - FRAC_CONST(0.94043655609335486), - FRAC_CONST(0.94480604646687805), - FRAC_CONST(0.94901364918821385), - FRAC_CONST(0.95305864330629697), - FRAC_CONST(0.95694033573220882), - FRAC_CONST(0.9606580613579353), - FRAC_CONST(0.96421118317032928), - FRAC_CONST(0.96759909236025976), - FRAC_CONST(0.9708212084269281), - FRAC_CONST(0.97387697927733363), - FRAC_CONST(0.97676588132087239), - FRAC_CONST(0.97948741955905139), - FRAC_CONST(0.98204112767030394), - FRAC_CONST(0.98442656808989171), - FRAC_CONST(0.98664333208487898), - FRAC_CONST(0.98869103982416728), - FRAC_CONST(0.99056934044357725), - FRAC_CONST(0.99227791210596705), - FRAC_CONST(0.99381646205637808), - FRAC_CONST(0.99518472667219682), - FRAC_CONST(0.99638247150832537), - FRAC_CONST(0.99740949133735191), - FRAC_CONST(0.99826561018471593), - FRAC_CONST(0.99895068135886012), - FRAC_CONST(0.99946458747636568), - FRAC_CONST(0.99980724048206482), - FRAC_CONST(0.99997858166412923) -}; -#endif - -#ifdef LD_DEC -ALIGN static const real_t sine_mid_512[] = -{ - FRAC_CONST(0.0015339801862847655), - FRAC_CONST(0.0046019261204485705), - FRAC_CONST(0.007669828739531097), - FRAC_CONST(0.010737659167264491), - FRAC_CONST(0.013805388528060391), - FRAC_CONST(0.01687298794728171), - FRAC_CONST(0.019940428551514441), - FRAC_CONST(0.023007681468839369), - FRAC_CONST(0.026074717829103901), - FRAC_CONST(0.029141508764193722), - FRAC_CONST(0.032208025408304586), - FRAC_CONST(0.035274238898213947), - FRAC_CONST(0.038340120373552694), - FRAC_CONST(0.041405640977076739), - FRAC_CONST(0.044470771854938668), - FRAC_CONST(0.047535484156959303), - FRAC_CONST(0.050599749036899282), - FRAC_CONST(0.05366353765273052), - FRAC_CONST(0.056726821166907748), - FRAC_CONST(0.059789570746639868), - FRAC_CONST(0.062851757564161406), - FRAC_CONST(0.065913352797003805), - FRAC_CONST(0.068974327628266746), - FRAC_CONST(0.072034653246889332), - FRAC_CONST(0.075094300847921305), - FRAC_CONST(0.078153241632794232), - FRAC_CONST(0.081211446809592441), - FRAC_CONST(0.084268887593324071), - FRAC_CONST(0.087325535206192059), - FRAC_CONST(0.090381360877864983), - FRAC_CONST(0.093436335845747787), - FRAC_CONST(0.096490431355252593), - FRAC_CONST(0.099543618660069319), - FRAC_CONST(0.10259586902243628), - FRAC_CONST(0.10564715371341062), - FRAC_CONST(0.10869744401313872), - FRAC_CONST(0.11174671121112659), - FRAC_CONST(0.11479492660651008), - FRAC_CONST(0.11784206150832498), - FRAC_CONST(0.12088808723577708), - FRAC_CONST(0.12393297511851216), - FRAC_CONST(0.12697669649688587), - FRAC_CONST(0.13001922272223335), - FRAC_CONST(0.13306052515713906), - FRAC_CONST(0.1361005751757062), - FRAC_CONST(0.1391393441638262), - FRAC_CONST(0.14217680351944803), - FRAC_CONST(0.14521292465284746), - FRAC_CONST(0.14824767898689603), - FRAC_CONST(0.15128103795733022), - FRAC_CONST(0.1543129730130201), - FRAC_CONST(0.15734345561623825), - FRAC_CONST(0.16037245724292828), - FRAC_CONST(0.16339994938297323), - FRAC_CONST(0.1664259035404641), - FRAC_CONST(0.16945029123396796), - FRAC_CONST(0.17247308399679595), - FRAC_CONST(0.17549425337727143), - FRAC_CONST(0.17851377093899751), - FRAC_CONST(0.18153160826112497), - FRAC_CONST(0.18454773693861962), - FRAC_CONST(0.1875621285825296), - FRAC_CONST(0.19057475482025274), - FRAC_CONST(0.19358558729580361), - FRAC_CONST(0.19659459767008022), - FRAC_CONST(0.19960175762113097), - FRAC_CONST(0.20260703884442113), - FRAC_CONST(0.20561041305309924), - FRAC_CONST(0.20861185197826349), - FRAC_CONST(0.21161132736922755), - FRAC_CONST(0.21460881099378676), - FRAC_CONST(0.21760427463848364), - FRAC_CONST(0.22059769010887351), - FRAC_CONST(0.22358902922978999), - FRAC_CONST(0.22657826384561), - FRAC_CONST(0.22956536582051887), - FRAC_CONST(0.23255030703877524), - FRAC_CONST(0.23553305940497549), - FRAC_CONST(0.23851359484431842), - FRAC_CONST(0.24149188530286933), - FRAC_CONST(0.24446790274782415), - FRAC_CONST(0.24744161916777327), - FRAC_CONST(0.25041300657296522), - FRAC_CONST(0.25338203699557016), - FRAC_CONST(0.25634868248994291), - FRAC_CONST(0.25931291513288623), - FRAC_CONST(0.26227470702391359), - FRAC_CONST(0.26523403028551179), - FRAC_CONST(0.26819085706340318), - FRAC_CONST(0.27114515952680801), - FRAC_CONST(0.27409690986870638), - FRAC_CONST(0.2770460803060999), - FRAC_CONST(0.27999264308027322), - FRAC_CONST(0.28293657045705539), - FRAC_CONST(0.28587783472708062), - FRAC_CONST(0.28881640820604948), - FRAC_CONST(0.29175226323498926), - FRAC_CONST(0.29468537218051433), - FRAC_CONST(0.2976157074350862), - FRAC_CONST(0.30054324141727345), - FRAC_CONST(0.30346794657201132), - FRAC_CONST(0.30638979537086092), - FRAC_CONST(0.30930876031226873), - FRAC_CONST(0.31222481392182488), - FRAC_CONST(0.31513792875252244), - FRAC_CONST(0.31804807738501495), - FRAC_CONST(0.32095523242787521), - FRAC_CONST(0.32385936651785285), - FRAC_CONST(0.32676045232013173), - FRAC_CONST(0.32965846252858749), - FRAC_CONST(0.33255336986604422), - FRAC_CONST(0.3354451470845316), - FRAC_CONST(0.33833376696554113), - FRAC_CONST(0.34121920232028236), - FRAC_CONST(0.34410142598993881), - FRAC_CONST(0.34698041084592368), - FRAC_CONST(0.34985612979013492), - FRAC_CONST(0.35272855575521073), - FRAC_CONST(0.35559766170478385), - FRAC_CONST(0.35846342063373654), - FRAC_CONST(0.36132580556845428), - FRAC_CONST(0.36418478956707989), - FRAC_CONST(0.36704034571976718), - FRAC_CONST(0.3698924471489341), - FRAC_CONST(0.37274106700951576), - FRAC_CONST(0.37558617848921722), - FRAC_CONST(0.37842775480876556), - FRAC_CONST(0.38126576922216238), - FRAC_CONST(0.38410019501693504), - FRAC_CONST(0.38693100551438858), - FRAC_CONST(0.38975817406985641), - FRAC_CONST(0.39258167407295147), - FRAC_CONST(0.39540147894781635), - FRAC_CONST(0.39821756215337356), - FRAC_CONST(0.40102989718357562), - FRAC_CONST(0.40383845756765407), - FRAC_CONST(0.40664321687036903), - FRAC_CONST(0.40944414869225759), - FRAC_CONST(0.41224122666988289), - FRAC_CONST(0.41503442447608163), - FRAC_CONST(0.41782371582021227), - FRAC_CONST(0.42060907444840251), - FRAC_CONST(0.42339047414379605), - FRAC_CONST(0.42616788872679962), - FRAC_CONST(0.42894129205532949), - FRAC_CONST(0.43171065802505726), - FRAC_CONST(0.43447596056965565), - FRAC_CONST(0.43723717366104409), - FRAC_CONST(0.43999427130963326), - FRAC_CONST(0.44274722756457002), - FRAC_CONST(0.44549601651398174), - FRAC_CONST(0.44824061228521989), - FRAC_CONST(0.45098098904510386), - FRAC_CONST(0.45371712100016387), - FRAC_CONST(0.45644898239688392), - FRAC_CONST(0.45917654752194409), - FRAC_CONST(0.46189979070246273), - FRAC_CONST(0.46461868630623782), - FRAC_CONST(0.46733320874198842), - FRAC_CONST(0.47004333245959562), - FRAC_CONST(0.47274903195034279), - FRAC_CONST(0.47545028174715587), - FRAC_CONST(0.47814705642484301), - FRAC_CONST(0.48083933060033396), - FRAC_CONST(0.48352707893291874), - FRAC_CONST(0.48621027612448642), - FRAC_CONST(0.48888889691976317), - FRAC_CONST(0.4915629161065499), - FRAC_CONST(0.49423230851595967), - FRAC_CONST(0.49689704902265447), - FRAC_CONST(0.49955711254508184), - FRAC_CONST(0.50221247404571079), - FRAC_CONST(0.50486310853126759), - FRAC_CONST(0.50750899105297087), - FRAC_CONST(0.51015009670676681), - FRAC_CONST(0.51278640063356296), - FRAC_CONST(0.51541787801946293), - FRAC_CONST(0.51804450409599934), - FRAC_CONST(0.52066625414036716), - FRAC_CONST(0.52328310347565643), - FRAC_CONST(0.52589502747108463), - FRAC_CONST(0.52850200154222848), - FRAC_CONST(0.531104001151255), - FRAC_CONST(0.53370100180715296), - FRAC_CONST(0.53629297906596318), - FRAC_CONST(0.53887990853100842), - FRAC_CONST(0.54146176585312344), - FRAC_CONST(0.54403852673088382), - FRAC_CONST(0.54661016691083486), - FRAC_CONST(0.54917666218771966), - FRAC_CONST(0.55173798840470734), - FRAC_CONST(0.55429412145362), - FRAC_CONST(0.5568450372751601), - FRAC_CONST(0.55939071185913614), - FRAC_CONST(0.56193112124468947), - FRAC_CONST(0.5644662415205195), - FRAC_CONST(0.56699604882510868), - FRAC_CONST(0.56952051934694714), - FRAC_CONST(0.57203962932475705), - FRAC_CONST(0.57455335504771576), - FRAC_CONST(0.57706167285567944), - FRAC_CONST(0.57956455913940563), - FRAC_CONST(0.58206199034077544), - FRAC_CONST(0.58455394295301533), - FRAC_CONST(0.58704039352091797), - FRAC_CONST(0.58952131864106394), - FRAC_CONST(0.59199669496204099), - FRAC_CONST(0.59446649918466443), - FRAC_CONST(0.5969307080621965), - FRAC_CONST(0.59938929840056454), - FRAC_CONST(0.60184224705858003), - FRAC_CONST(0.60428953094815596), - FRAC_CONST(0.60673112703452448), - FRAC_CONST(0.60916701233645321), - FRAC_CONST(0.61159716392646191), - FRAC_CONST(0.61402155893103838), - FRAC_CONST(0.61644017453085365), - FRAC_CONST(0.61885298796097632), - FRAC_CONST(0.62125997651108755), - FRAC_CONST(0.62366111752569453), - FRAC_CONST(0.62605638840434352), - FRAC_CONST(0.62844576660183271), - FRAC_CONST(0.63082922962842447), - FRAC_CONST(0.63320675505005719), - FRAC_CONST(0.63557832048855611), - FRAC_CONST(0.63794390362184406), - FRAC_CONST(0.64030348218415167), - FRAC_CONST(0.64265703396622686), - FRAC_CONST(0.64500453681554393), - FRAC_CONST(0.64734596863651206), - FRAC_CONST(0.64968130739068319), - FRAC_CONST(0.6520105310969595), - FRAC_CONST(0.65433361783180044), - FRAC_CONST(0.65665054572942894), - FRAC_CONST(0.65896129298203732), - FRAC_CONST(0.66126583783999227), - FRAC_CONST(0.66356415861203977), - FRAC_CONST(0.66585623366550972), - FRAC_CONST(0.66814204142651845), - FRAC_CONST(0.67042156038017309), - FRAC_CONST(0.67269476907077286), - FRAC_CONST(0.67496164610201193), - FRAC_CONST(0.67722217013718033), - FRAC_CONST(0.67947631989936497), - FRAC_CONST(0.68172407417164971), - FRAC_CONST(0.6839654117973154), - FRAC_CONST(0.68620031168003859), - FRAC_CONST(0.68842875278409044), - FRAC_CONST(0.6906507141345346), - FRAC_CONST(0.69286617481742463), - FRAC_CONST(0.69507511398000088), - FRAC_CONST(0.69727751083088652), - FRAC_CONST(0.69947334464028377), - FRAC_CONST(0.70166259474016845), - FRAC_CONST(0.70384524052448494), - FRAC_CONST(0.70602126144933974), - FRAC_CONST(0.70819063703319529), - FRAC_CONST(0.71035334685706231), - FRAC_CONST(0.71250937056469232), - FRAC_CONST(0.71465868786276898), - FRAC_CONST(0.71680127852109954), - FRAC_CONST(0.71893712237280438), - FRAC_CONST(0.72106619931450811), - FRAC_CONST(0.72318848930652735), - FRAC_CONST(0.72530397237306066), - FRAC_CONST(0.72741262860237577), - FRAC_CONST(0.7295144381469969), - FRAC_CONST(0.73160938122389252), - FRAC_CONST(0.73369743811466026), - FRAC_CONST(0.73577858916571348), - FRAC_CONST(0.73785281478846598), - FRAC_CONST(0.73992009545951609), - FRAC_CONST(0.74198041172083096), - FRAC_CONST(0.74403374417992918), - FRAC_CONST(0.74608007351006378), - FRAC_CONST(0.74811938045040349), - FRAC_CONST(0.75015164580621496), - FRAC_CONST(0.7521768504490427), - FRAC_CONST(0.75419497531688917), - FRAC_CONST(0.75620600141439454), - FRAC_CONST(0.75820990981301528), - FRAC_CONST(0.76020668165120242), - FRAC_CONST(0.7621962981345789), - FRAC_CONST(0.76417874053611667), - FRAC_CONST(0.76615399019631281), - FRAC_CONST(0.76812202852336531), - FRAC_CONST(0.7700828369933479), - FRAC_CONST(0.77203639715038441), - FRAC_CONST(0.77398269060682279), - FRAC_CONST(0.77592169904340758), - FRAC_CONST(0.77785340420945304), - FRAC_CONST(0.77977778792301444), - FRAC_CONST(0.78169483207105939), - FRAC_CONST(0.7836045186096382), - FRAC_CONST(0.78550682956405393), - FRAC_CONST(0.78740174702903132), - FRAC_CONST(0.78928925316888565), - FRAC_CONST(0.79116933021769009), - FRAC_CONST(0.79304196047944364), - FRAC_CONST(0.79490712632823701), - FRAC_CONST(0.79676481020841872), - FRAC_CONST(0.79861499463476082), - FRAC_CONST(0.80045766219262271), - FRAC_CONST(0.80229279553811572), - FRAC_CONST(0.8041203773982657), - FRAC_CONST(0.80594039057117628), - FRAC_CONST(0.80775281792619036), - FRAC_CONST(0.80955764240405126), - FRAC_CONST(0.81135484701706373), - FRAC_CONST(0.81314441484925359), - FRAC_CONST(0.81492632905652662), - FRAC_CONST(0.81670057286682785), - FRAC_CONST(0.81846712958029866), - FRAC_CONST(0.82022598256943469), - FRAC_CONST(0.82197711527924155), - FRAC_CONST(0.82372051122739132), - FRAC_CONST(0.82545615400437744), - FRAC_CONST(0.82718402727366902), - FRAC_CONST(0.82890411477186487), - FRAC_CONST(0.8306164003088462), - FRAC_CONST(0.83232086776792968), - FRAC_CONST(0.83401750110601813), - FRAC_CONST(0.8357062843537526), - FRAC_CONST(0.83738720161566194), - FRAC_CONST(0.83906023707031263), - FRAC_CONST(0.84072537497045807), - FRAC_CONST(0.84238259964318596), - FRAC_CONST(0.84403189549006641), - FRAC_CONST(0.84567324698729907), - FRAC_CONST(0.84730663868585832), - FRAC_CONST(0.84893205521163961), - FRAC_CONST(0.85054948126560337), - FRAC_CONST(0.85215890162391983), - FRAC_CONST(0.8537603011381113), - FRAC_CONST(0.85535366473519603), - FRAC_CONST(0.85693897741782865), - FRAC_CONST(0.85851622426444274), - FRAC_CONST(0.86008539042939014), - FRAC_CONST(0.8616464611430813), - FRAC_CONST(0.86319942171212416), - FRAC_CONST(0.86474425751946238), - FRAC_CONST(0.86628095402451299), - FRAC_CONST(0.86780949676330321), - FRAC_CONST(0.86932987134860673), - FRAC_CONST(0.87084206347007886), - FRAC_CONST(0.87234605889439154), - FRAC_CONST(0.87384184346536675), - FRAC_CONST(0.87532940310411078), - FRAC_CONST(0.87680872380914576), - FRAC_CONST(0.87827979165654146), - FRAC_CONST(0.87974259280004741), - FRAC_CONST(0.88119711347122198), - FRAC_CONST(0.88264333997956279), - FRAC_CONST(0.88408125871263499), - FRAC_CONST(0.88551085613619995), - FRAC_CONST(0.88693211879434208), - FRAC_CONST(0.88834503330959624), - FRAC_CONST(0.88974958638307289), - FRAC_CONST(0.89114576479458318), - FRAC_CONST(0.89253355540276469), - FRAC_CONST(0.89391294514520325), - FRAC_CONST(0.89528392103855758), - FRAC_CONST(0.89664647017868015), - FRAC_CONST(0.89800057974073988), - FRAC_CONST(0.89934623697934146), - FRAC_CONST(0.90068342922864686), - FRAC_CONST(0.90201214390249307), - FRAC_CONST(0.90333236849451182), - FRAC_CONST(0.90464409057824624), - FRAC_CONST(0.90594729780726846), - FRAC_CONST(0.90724197791529593), - FRAC_CONST(0.90852811871630612), - FRAC_CONST(0.90980570810465222), - FRAC_CONST(0.91107473405517625), - FRAC_CONST(0.91233518462332275), - FRAC_CONST(0.91358704794525081), - FRAC_CONST(0.91483031223794609), - FRAC_CONST(0.91606496579933161), - FRAC_CONST(0.91729099700837791), - FRAC_CONST(0.91850839432521225), - FRAC_CONST(0.91971714629122736), - FRAC_CONST(0.92091724152918952), - FRAC_CONST(0.92210866874334507), - FRAC_CONST(0.92329141671952764), - FRAC_CONST(0.9244654743252626), - FRAC_CONST(0.92563083050987272), - FRAC_CONST(0.92678747430458175), - FRAC_CONST(0.92793539482261789), - FRAC_CONST(0.92907458125931575), - FRAC_CONST(0.93020502289221907), - FRAC_CONST(0.93132670908118043), - FRAC_CONST(0.93243962926846236), - FRAC_CONST(0.93354377297883617), - FRAC_CONST(0.93463912981968078), - FRAC_CONST(0.93572568948108037), - FRAC_CONST(0.93680344173592156), - FRAC_CONST(0.93787237643998989), - FRAC_CONST(0.93893248353206449), - FRAC_CONST(0.93998375303401394), - FRAC_CONST(0.94102617505088926), - FRAC_CONST(0.94205973977101731), - FRAC_CONST(0.94308443746609349), - FRAC_CONST(0.94410025849127266), - FRAC_CONST(0.94510719328526061), - FRAC_CONST(0.94610523237040334), - FRAC_CONST(0.94709436635277722), - FRAC_CONST(0.94807458592227623), - FRAC_CONST(0.94904588185270056), - FRAC_CONST(0.950008245001843), - FRAC_CONST(0.95096166631157508), - FRAC_CONST(0.95190613680793223), - FRAC_CONST(0.95284164760119872), - FRAC_CONST(0.95376818988599033), - FRAC_CONST(0.95468575494133834), - FRAC_CONST(0.95559433413077111), - FRAC_CONST(0.95649391890239499), - FRAC_CONST(0.95738450078897586), - FRAC_CONST(0.95826607140801767), - FRAC_CONST(0.95913862246184189), - FRAC_CONST(0.96000214573766585), - FRAC_CONST(0.96085663310767966), - FRAC_CONST(0.96170207652912254), - FRAC_CONST(0.96253846804435916), - FRAC_CONST(0.96336579978095405), - FRAC_CONST(0.96418406395174572), - FRAC_CONST(0.96499325285492032), - FRAC_CONST(0.96579335887408357), - FRAC_CONST(0.96658437447833312), - FRAC_CONST(0.96736629222232851), - FRAC_CONST(0.96813910474636233), - FRAC_CONST(0.96890280477642887), - FRAC_CONST(0.96965738512429245), - FRAC_CONST(0.9704028386875555), - FRAC_CONST(0.97113915844972509), - FRAC_CONST(0.9718663374802794), - FRAC_CONST(0.97258436893473221), - FRAC_CONST(0.97329324605469825), - FRAC_CONST(0.97399296216795583), - FRAC_CONST(0.97468351068851067), - FRAC_CONST(0.97536488511665687), - FRAC_CONST(0.97603707903903902), - FRAC_CONST(0.97670008612871184), - FRAC_CONST(0.97735390014519996), - FRAC_CONST(0.97799851493455714), - FRAC_CONST(0.9786339244294231), - FRAC_CONST(0.97926012264908202), - FRAC_CONST(0.97987710369951764), - FRAC_CONST(0.98048486177346938), - FRAC_CONST(0.98108339115048659), - FRAC_CONST(0.98167268619698311), - FRAC_CONST(0.98225274136628937), - FRAC_CONST(0.98282355119870524), - FRAC_CONST(0.98338511032155118), - FRAC_CONST(0.98393741344921892), - FRAC_CONST(0.98448045538322093), - FRAC_CONST(0.98501423101223984), - FRAC_CONST(0.98553873531217606), - FRAC_CONST(0.98605396334619544), - FRAC_CONST(0.98655991026477541), - FRAC_CONST(0.98705657130575097), - FRAC_CONST(0.98754394179435923), - FRAC_CONST(0.98802201714328353), - FRAC_CONST(0.98849079285269659), - FRAC_CONST(0.98895026451030299), - FRAC_CONST(0.98940042779138038), - FRAC_CONST(0.98984127845882053), - FRAC_CONST(0.99027281236316911), - FRAC_CONST(0.99069502544266463), - FRAC_CONST(0.99110791372327678), - FRAC_CONST(0.9915114733187439), - FRAC_CONST(0.99190570043060933), - FRAC_CONST(0.99229059134825737), - FRAC_CONST(0.99266614244894802), - FRAC_CONST(0.99303235019785141), - FRAC_CONST(0.99338921114808065), - FRAC_CONST(0.9937367219407246), - FRAC_CONST(0.99407487930487937), - FRAC_CONST(0.9944036800576791), - FRAC_CONST(0.9947231211043257), - FRAC_CONST(0.99503319943811863), - FRAC_CONST(0.99533391214048228), - FRAC_CONST(0.99562525638099431), - FRAC_CONST(0.99590722941741172), - FRAC_CONST(0.99617982859569687), - FRAC_CONST(0.99644305135004263), - FRAC_CONST(0.99669689520289606), - FRAC_CONST(0.99694135776498216), - FRAC_CONST(0.99717643673532619), - FRAC_CONST(0.9974021299012753), - FRAC_CONST(0.99761843513851955), - FRAC_CONST(0.99782535041111164), - FRAC_CONST(0.99802287377148624), - FRAC_CONST(0.99821100336047819), - FRAC_CONST(0.99838973740734016), - FRAC_CONST(0.99855907422975931), - FRAC_CONST(0.99871901223387294), - FRAC_CONST(0.99886954991428356), - FRAC_CONST(0.99901068585407338), - FRAC_CONST(0.99914241872481691), - FRAC_CONST(0.99926474728659442), - FRAC_CONST(0.99937767038800285), - FRAC_CONST(0.99948118696616695), - FRAC_CONST(0.99957529604674922), - FRAC_CONST(0.99965999674395922), - FRAC_CONST(0.99973528826056168), - FRAC_CONST(0.99980116988788426), - FRAC_CONST(0.99985764100582386), - FRAC_CONST(0.9999047010828529), - FRAC_CONST(0.99994234967602391), - FRAC_CONST(0.99997058643097414), - FRAC_CONST(0.9999894110819284), - FRAC_CONST(0.99999882345170188) -}; - -#ifdef ALLOW_SMALL_FRAMELENGTH -ALIGN static const real_t sine_mid_480[] = -{ - FRAC_CONST(0.0016362454436240478), - FRAC_CONST(0.00490871880799799), - FRAC_CONST(0.0081811396039371282), - FRAC_CONST(0.011453472786443779), - FRAC_CONST(0.014725683311458524), - FRAC_CONST(0.017997736136235509), - FRAC_CONST(0.021269596219717739), - FRAC_CONST(0.024541228522912285), - FRAC_CONST(0.027812598009265607), - FRAC_CONST(0.03108366964503869), - FRAC_CONST(0.034354408399682276), - FRAC_CONST(0.037624779246211978), - FRAC_CONST(0.04089474716158345), - FRAC_CONST(0.044164277127067358), - FRAC_CONST(0.047433334128624507), - FRAC_CONST(0.050701883157280733), - FRAC_CONST(0.053969889209501881), - FRAC_CONST(0.057237317287568618), - FRAC_CONST(0.060504132399951269), - FRAC_CONST(0.063770299561684493), - FRAC_CONST(0.06703578379474201), - FRAC_CONST(0.070300550128411174), - FRAC_CONST(0.073564563599667426), - FRAC_CONST(0.076827789253548759), - FRAC_CONST(0.080090192143530081), - FRAC_CONST(0.083351737331897449), - FRAC_CONST(0.086612389890122182), - FRAC_CONST(0.089872114899234967), - FRAC_CONST(0.093130877450199795), - FRAC_CONST(0.096388642644287828), - FRAC_CONST(0.09964537559345106), - FRAC_CONST(0.1029010414206961), - FRAC_CONST(0.10615560526045748), - FRAC_CONST(0.10940903225897117), - FRAC_CONST(0.11266128757464781), - FRAC_CONST(0.11591233637844581), - FRAC_CONST(0.11916214385424433), - FRAC_CONST(0.1224106751992162), - FRAC_CONST(0.12565789562420052), - FRAC_CONST(0.12890377035407541), - FRAC_CONST(0.13214826462813015), - FRAC_CONST(0.13539134370043773), - FRAC_CONST(0.13863297284022669), - FRAC_CONST(0.14187311733225325), - FRAC_CONST(0.14511174247717309), - FRAC_CONST(0.14834881359191271), - FRAC_CONST(0.15158429601004111), - FRAC_CONST(0.15481815508214106), - FRAC_CONST(0.1580503561761798), - FRAC_CONST(0.16128086467788047), - FRAC_CONST(0.16450964599109233), - FRAC_CONST(0.16773666553816149), - FRAC_CONST(0.17096188876030122), - FRAC_CONST(0.17418528111796186), - FRAC_CONST(0.17740680809120093), - FRAC_CONST(0.18062643518005275), - FRAC_CONST(0.18384412790489776), - FRAC_CONST(0.18705985180683199), - FRAC_CONST(0.19027357244803589), - FRAC_CONST(0.19348525541214331), - FRAC_CONST(0.19669486630460997), - FRAC_CONST(0.19990237075308173), - FRAC_CONST(0.20310773440776286), - FRAC_CONST(0.20631092294178383), - FRAC_CONST(0.20951190205156878), - FRAC_CONST(0.21271063745720317), - FRAC_CONST(0.21590709490280058), - FRAC_CONST(0.2191012401568698), - FRAC_CONST(0.22229303901268133), - FRAC_CONST(0.22548245728863364), - FRAC_CONST(0.22866946082861941), - FRAC_CONST(0.23185401550239115), - FRAC_CONST(0.23503608720592667), - FRAC_CONST(0.23821564186179459), - FRAC_CONST(0.24139264541951888), - FRAC_CONST(0.24456706385594387), - FRAC_CONST(0.24773886317559846), - FRAC_CONST(0.25090800941106001), - FRAC_CONST(0.25407446862331851), - FRAC_CONST(0.25723820690213967), - FRAC_CONST(0.26039919036642817), - FRAC_CONST(0.26355738516459076), - FRAC_CONST(0.26671275747489837), - FRAC_CONST(0.2698652735058486), - FRAC_CONST(0.27301489949652735), - FRAC_CONST(0.27616160171697068), - FRAC_CONST(0.27930534646852595), - FRAC_CONST(0.28244610008421245), - FRAC_CONST(0.2855838289290823), - FRAC_CONST(0.28871849940058025), - FRAC_CONST(0.29185007792890405), - FRAC_CONST(0.29497853097736348), - FRAC_CONST(0.2981038250427398), - FRAC_CONST(0.30122592665564446), - FRAC_CONST(0.30434480238087736), - FRAC_CONST(0.30746041881778519), - FRAC_CONST(0.31057274260061901), - FRAC_CONST(0.31368174039889146), - FRAC_CONST(0.31678737891773395), - FRAC_CONST(0.31988962489825296), - FRAC_CONST(0.32298844511788638), - FRAC_CONST(0.32608380639075912), - FRAC_CONST(0.32917567556803889), - FRAC_CONST(0.33226401953829071), - FRAC_CONST(0.33534880522783189), - FRAC_CONST(0.33842999960108583), - FRAC_CONST(0.34150756966093632), - FRAC_CONST(0.34458148244908043), - FRAC_CONST(0.34765170504638188), - FRAC_CONST(0.35071820457322322), - FRAC_CONST(0.35378094818985806), - FRAC_CONST(0.35683990309676283), - FRAC_CONST(0.35989503653498811), - FRAC_CONST(0.36294631578650921), - FRAC_CONST(0.36599370817457672), - FRAC_CONST(0.36903718106406647), - FRAC_CONST(0.37207670186182878), - FRAC_CONST(0.37511223801703802), - FRAC_CONST(0.37814375702154046), - FRAC_CONST(0.38117122641020335), - FRAC_CONST(0.38419461376126157), - FRAC_CONST(0.38721388669666562), - FRAC_CONST(0.39022901288242801), - FRAC_CONST(0.39323996002896966), - FRAC_CONST(0.39624669589146555), - FRAC_CONST(0.39924918827019029), - FRAC_CONST(0.40224740501086254), - FRAC_CONST(0.40524131400498986), - FRAC_CONST(0.40823088319021217), - FRAC_CONST(0.41121608055064529), - FRAC_CONST(0.41419687411722372), - FRAC_CONST(0.41717323196804335), - FRAC_CONST(0.42014512222870243), - FRAC_CONST(0.42311251307264408), - FRAC_CONST(0.42607537272149631), - FRAC_CONST(0.4290336694454126), - FRAC_CONST(0.43198737156341183), - FRAC_CONST(0.43493644744371707), - FRAC_CONST(0.43788086550409511), - FRAC_CONST(0.44082059421219388), - FRAC_CONST(0.44375560208588088), - FRAC_CONST(0.44668585769357955), - FRAC_CONST(0.4496113296546066), - FRAC_CONST(0.45253198663950756), - FRAC_CONST(0.45544779737039259), - FRAC_CONST(0.45835873062127125), - FRAC_CONST(0.46126475521838717), - FRAC_CONST(0.46416584004055156), - FRAC_CONST(0.46706195401947659), - FRAC_CONST(0.46995306614010829), - FRAC_CONST(0.47283914544095862), - FRAC_CONST(0.47572016101443682), - FRAC_CONST(0.47859608200718085), - FRAC_CONST(0.4814668776203872), - FRAC_CONST(0.48433251711014125), - FRAC_CONST(0.4871929697877464), - FRAC_CONST(0.49004820502005247), - FRAC_CONST(0.49289819222978404), - FRAC_CONST(0.49574290089586776), - FRAC_CONST(0.49858230055375902), - FRAC_CONST(0.50141636079576901), - FRAC_CONST(0.50424505127138919), - FRAC_CONST(0.50706834168761705), - FRAC_CONST(0.50988620180928057), - FRAC_CONST(0.51269860145936175), - FRAC_CONST(0.51550551051931948), - FRAC_CONST(0.51830689892941317), - FRAC_CONST(0.5211027366890234), - FRAC_CONST(0.52389299385697385), - FRAC_CONST(0.52667764055185196), - FRAC_CONST(0.52945664695232897), - FRAC_CONST(0.53222998329747884), - FRAC_CONST(0.53499761988709726), - FRAC_CONST(0.53775952708201991), - FRAC_CONST(0.54051567530443978), - FRAC_CONST(0.54326603503822357), - FRAC_CONST(0.54601057682922816), - FRAC_CONST(0.54874927128561579), - FRAC_CONST(0.55148208907816942), - FRAC_CONST(0.55420900094060566), - FRAC_CONST(0.55692997766988939), - FRAC_CONST(0.559644990126546), - FRAC_CONST(0.56235400923497314), - FRAC_CONST(0.56505700598375252), - FRAC_CONST(0.56775395142596052), - FRAC_CONST(0.57044481667947822), - FRAC_CONST(0.57312957292730071), - FRAC_CONST(0.57580819141784534), - FRAC_CONST(0.57848064346525996), - FRAC_CONST(0.58114690044973039), - FRAC_CONST(0.58380693381778626), - FRAC_CONST(0.58646071508260733), - FRAC_CONST(0.58910821582432815), - FRAC_CONST(0.5917494076903429), - FRAC_CONST(0.5943842623956086), - FRAC_CONST(0.59701275172294799), - FRAC_CONST(0.59963484752335228), - FRAC_CONST(0.60225052171628191), - FRAC_CONST(0.60485974628996786), - FRAC_CONST(0.60746249330171098), - FRAC_CONST(0.61005873487818185), - FRAC_CONST(0.61264844321571899), - FRAC_CONST(0.61523159058062682), - FRAC_CONST(0.61780814930947225), - FRAC_CONST(0.62037809180938108), - FRAC_CONST(0.62294139055833397), - FRAC_CONST(0.6254980181054608), - FRAC_CONST(0.62804794707133416), - FRAC_CONST(0.63059115014826372), - FRAC_CONST(0.63312760010058777), - FRAC_CONST(0.63565726976496484), - FRAC_CONST(0.63818013205066515), - FRAC_CONST(0.64069615993986073), - FRAC_CONST(0.64320532648791406), - FRAC_CONST(0.64570760482366729), - FRAC_CONST(0.64820296814972966), - FRAC_CONST(0.65069138974276486), - FRAC_CONST(0.65317284295377676), - FRAC_CONST(0.65564730120839498), - FRAC_CONST(0.65811473800715958), - FRAC_CONST(0.660575126925805), - FRAC_CONST(0.66302844161554231), - FRAC_CONST(0.6654746558033422), - FRAC_CONST(0.66791374329221598), - FRAC_CONST(0.67034567796149647), - FRAC_CONST(0.67277043376711676), - FRAC_CONST(0.67518798474189046), - FRAC_CONST(0.67759830499578866), - FRAC_CONST(0.68000136871621808), - FRAC_CONST(0.68239715016829683), - FRAC_CONST(0.6847856236951303), - FRAC_CONST(0.68716676371808583), - FRAC_CONST(0.68954054473706683), - FRAC_CONST(0.69190694133078579), - FRAC_CONST(0.69426592815703603), - FRAC_CONST(0.69661747995296419), - FRAC_CONST(0.69896157153533944), - FRAC_CONST(0.70129817780082437), - FRAC_CONST(0.7036272737262429), - FRAC_CONST(0.70594883436884903), - FRAC_CONST(0.70826283486659336), - FRAC_CONST(0.71056925043838959), - FRAC_CONST(0.71286805638437978), - FRAC_CONST(0.71515922808619936), - FRAC_CONST(0.71744274100723993), - FRAC_CONST(0.71971857069291278), - FRAC_CONST(0.7219866927709101), - FRAC_CONST(0.72424708295146689), - FRAC_CONST(0.72649971702762028), - FRAC_CONST(0.72874457087546896), - FRAC_CONST(0.73098162045443171), - FRAC_CONST(0.73321084180750484), - FRAC_CONST(0.73543221106151868), - FRAC_CONST(0.73764570442739286), - FRAC_CONST(0.73985129820039208), - FRAC_CONST(0.74204896876037885), - FRAC_CONST(0.7442386925720671), - FRAC_CONST(0.74642044618527381), - FRAC_CONST(0.74859420623517081), - FRAC_CONST(0.75075994944253421), - FRAC_CONST(0.75291765261399446), - FRAC_CONST(0.75506729264228367), - FRAC_CONST(0.75720884650648446), - FRAC_CONST(0.75934229127227548), - FRAC_CONST(0.76146760409217706), - FRAC_CONST(0.76358476220579641), - FRAC_CONST(0.7656937429400712), - FRAC_CONST(0.76779452370951196), - FRAC_CONST(0.76988708201644451), - FRAC_CONST(0.77197139545125026), - FRAC_CONST(0.7740474416926072), - FRAC_CONST(0.77611519850772781), - FRAC_CONST(0.77817464375259782), - FRAC_CONST(0.78022575537221317), - FRAC_CONST(0.78226851140081632), - FRAC_CONST(0.78430288996213138), - FRAC_CONST(0.78632886926959822), - FRAC_CONST(0.78834642762660623), - FRAC_CONST(0.79035554342672631), - FRAC_CONST(0.79235619515394229), - FRAC_CONST(0.79434836138288134), - FRAC_CONST(0.79633202077904397), - FRAC_CONST(0.79830715209903147), - FRAC_CONST(0.8002737341907743), - FRAC_CONST(0.80223174599375802), - FRAC_CONST(0.80418116653924954), - FRAC_CONST(0.80612197495052085), - FRAC_CONST(0.80805415044307316), - FRAC_CONST(0.80997767232485907), - FRAC_CONST(0.81189251999650469), - FRAC_CONST(0.81379867295152986), - FRAC_CONST(0.81569611077656778), - FRAC_CONST(0.81758481315158371), - FRAC_CONST(0.81946475985009259), - FRAC_CONST(0.82133593073937561), - FRAC_CONST(0.82319830578069586), - FRAC_CONST(0.82505186502951278), - FRAC_CONST(0.82689658863569615), - FRAC_CONST(0.82873245684373809), - FRAC_CONST(0.83055944999296494), - FRAC_CONST(0.83237754851774781), - FRAC_CONST(0.83418673294771239), - FRAC_CONST(0.83598698390794668), - FRAC_CONST(0.83777828211920935), - FRAC_CONST(0.83956060839813562), - FRAC_CONST(0.84133394365744296), - FRAC_CONST(0.84309826890613537), - FRAC_CONST(0.84485356524970701), - FRAC_CONST(0.84659981389034411), - FRAC_CONST(0.84833699612712676), - FRAC_CONST(0.85006509335622882), - FRAC_CONST(0.8517840870711173), - FRAC_CONST(0.85349395886275037), - FRAC_CONST(0.85519469041977514), - FRAC_CONST(0.85688626352872277), - FRAC_CONST(0.85856866007420429), - FRAC_CONST(0.86024186203910447), - FRAC_CONST(0.86190585150477417), - FRAC_CONST(0.86356061065122347), - FRAC_CONST(0.86520612175731115), - FRAC_CONST(0.86684236720093533), - FRAC_CONST(0.86846932945922151), - FRAC_CONST(0.87008699110871135), - FRAC_CONST(0.87169533482554817), - FRAC_CONST(0.87329434338566281), - FRAC_CONST(0.87488399966495822), - FRAC_CONST(0.87646428663949283), - FRAC_CONST(0.87803518738566277), - FRAC_CONST(0.87959668508038291), - FRAC_CONST(0.88114876300126743), - FRAC_CONST(0.88269140452680916), - FRAC_CONST(0.8842245931365561), - FRAC_CONST(0.88574831241129048), - FRAC_CONST(0.88726254603320276), - FRAC_CONST(0.88876727778606746), - FRAC_CONST(0.89026249155541637), - FRAC_CONST(0.8917481713287112), - FRAC_CONST(0.89322430119551532), - FRAC_CONST(0.89469086534766362), - FRAC_CONST(0.89614784807943237), - FRAC_CONST(0.89759523378770689), - FRAC_CONST(0.89903300697214927), - FRAC_CONST(0.9004611522353636), - FRAC_CONST(0.90187965428306172), - FRAC_CONST(0.90328849792422594), - FRAC_CONST(0.90468766807127299), - FRAC_CONST(0.90607714974021469), - FRAC_CONST(0.90745692805081868), - FRAC_CONST(0.90882698822676755), - FRAC_CONST(0.91018731559581767), - FRAC_CONST(0.91153789558995579), - FRAC_CONST(0.91287871374555518), - FRAC_CONST(0.91420975570353069), - FRAC_CONST(0.9155310072094921), - FRAC_CONST(0.91684245411389753), - FRAC_CONST(0.91814408237220391), - FRAC_CONST(0.91943587804501858), - FRAC_CONST(0.92071782729824769), - FRAC_CONST(0.92198991640324446), - FRAC_CONST(0.92325213173695675), - FRAC_CONST(0.92450445978207241), - FRAC_CONST(0.92574688712716402), - FRAC_CONST(0.92697940046683291), - FRAC_CONST(0.92820198660185149), - FRAC_CONST(0.92941463243930444), - FRAC_CONST(0.93061732499272909), - FRAC_CONST(0.93181005138225426), - FRAC_CONST(0.93299279883473885), - FRAC_CONST(0.93416555468390772), - FRAC_CONST(0.93532830637048769), - FRAC_CONST(0.93648104144234268), - FRAC_CONST(0.93762374755460598), - FRAC_CONST(0.93875641246981323), - FRAC_CONST(0.93987902405803303), - FRAC_CONST(0.94099157029699743), - FRAC_CONST(0.94209403927222979), - FRAC_CONST(0.94318641917717327), - FRAC_CONST(0.9442686983133165), - FRAC_CONST(0.94534086509031956), - FRAC_CONST(0.9464029080261378), - FRAC_CONST(0.94745481574714419), - FRAC_CONST(0.94849657698825252), - FRAC_CONST(0.94952818059303667), - FRAC_CONST(0.95054961551385087), - FRAC_CONST(0.95156087081194762), - FRAC_CONST(0.95256193565759528), - FRAC_CONST(0.95355279933019343), - FRAC_CONST(0.9545334512183884), - FRAC_CONST(0.95550388082018611), - FRAC_CONST(0.95646407774306541), - FRAC_CONST(0.95741403170408834), - FRAC_CONST(0.95835373253001133), - FRAC_CONST(0.95928317015739362), - FRAC_CONST(0.96020233463270466), - FRAC_CONST(0.96111121611243155), - FRAC_CONST(0.96200980486318388), - FRAC_CONST(0.96289809126179782), - FRAC_CONST(0.96377606579543984), - FRAC_CONST(0.96464371906170809), - FRAC_CONST(0.96550104176873297), - FRAC_CONST(0.96634802473527726), - FRAC_CONST(0.96718465889083372), - FRAC_CONST(0.96801093527572268), - FRAC_CONST(0.96882684504118799), - FRAC_CONST(0.96963237944949143), - FRAC_CONST(0.97042752987400682), - FRAC_CONST(0.97121228779931179), - FRAC_CONST(0.97198664482127939), - FRAC_CONST(0.97275059264716823), - FRAC_CONST(0.97350412309571066), - FRAC_CONST(0.97424722809720088), - FRAC_CONST(0.97497989969358168), - FRAC_CONST(0.97570213003852857), - FRAC_CONST(0.97641391139753486), - FRAC_CONST(0.97711523614799412), - FRAC_CONST(0.97780609677928154), - FRAC_CONST(0.97848648589283505), - FRAC_CONST(0.97915639620223371), - FRAC_CONST(0.9798158205332762), - FRAC_CONST(0.98046475182405801), - FRAC_CONST(0.98110318312504607), - FRAC_CONST(0.98173110759915416), - FRAC_CONST(0.98234851852181571), - FRAC_CONST(0.98295540928105563), - FRAC_CONST(0.9835517733775615), - FRAC_CONST(0.98413760442475307), - FRAC_CONST(0.98471289614885038), - FRAC_CONST(0.98527764238894122), - FRAC_CONST(0.98583183709704714), - FRAC_CONST(0.98637547433818806), - FRAC_CONST(0.98690854829044583), - FRAC_CONST(0.98743105324502667), - FRAC_CONST(0.98794298360632238), - FRAC_CONST(0.98844433389196995), - FRAC_CONST(0.98893509873291074), - FRAC_CONST(0.98941527287344755), - FRAC_CONST(0.98988485117130098), - FRAC_CONST(0.99034382859766479), - FRAC_CONST(0.99079220023725967), - FRAC_CONST(0.99122996128838525), - FRAC_CONST(0.9916571070629725), - FRAC_CONST(0.99207363298663342), - FRAC_CONST(0.99247953459870997), - FRAC_CONST(0.99287480755232194), - FRAC_CONST(0.99325944761441354), - FRAC_CONST(0.99363345066579889), - FRAC_CONST(0.99399681270120555), - FRAC_CONST(0.99434952982931812), - FRAC_CONST(0.9946915982728195), - FRAC_CONST(0.99502301436843166), - FRAC_CONST(0.99534377456695422), - FRAC_CONST(0.9956538754333033), - FRAC_CONST(0.99595331364654771), - FRAC_CONST(0.99624208599994479), - FRAC_CONST(0.99652018940097464), - FRAC_CONST(0.99678762087137318), - FRAC_CONST(0.99704437754716424), - FRAC_CONST(0.99729045667869021), - FRAC_CONST(0.99752585563064111), - FRAC_CONST(0.99775057188208349), - FRAC_CONST(0.9979646030264866), - FRAC_CONST(0.99816794677174903), - FRAC_CONST(0.9983606009402225), - FRAC_CONST(0.99854256346873571), - FRAC_CONST(0.99871383240861611), - FRAC_CONST(0.99887440592571108), - FRAC_CONST(0.99902428230040718), - FRAC_CONST(0.99916345992764877), - FRAC_CONST(0.99929193731695531), - FRAC_CONST(0.99940971309243731), - FRAC_CONST(0.99951678599281069), - FRAC_CONST(0.99961315487141078), - FRAC_CONST(0.99969881869620425), - FRAC_CONST(0.99977377654980037), - FRAC_CONST(0.99983802762946083), - FRAC_CONST(0.99989157124710804), - FRAC_CONST(0.9999344068293331), - FRAC_CONST(0.99996653391740109), - FRAC_CONST(0.99998795216725689), - FRAC_CONST(0.99999866134952808) -}; -#endif - -ALIGN static const real_t ld_mid_512[] = -{ - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0.0061358846491544753), - FRAC_CONST(0.01840672990580482), - FRAC_CONST(0.030674803176636626), - FRAC_CONST(0.04293825693494082), - FRAC_CONST(0.055195244349689934), - FRAC_CONST(0.067443919563664051), - FRAC_CONST(0.079682437971430126), - FRAC_CONST(0.091908956497132724), - FRAC_CONST(0.10412163387205459), - FRAC_CONST(0.11631863091190475), - FRAC_CONST(0.12849811079379317), - FRAC_CONST(0.14065823933284921), - FRAC_CONST(0.15279718525844344), - FRAC_CONST(0.16491312048996989), - FRAC_CONST(0.17700422041214875), - FRAC_CONST(0.18906866414980619), - FRAC_CONST(0.2011046348420919), - FRAC_CONST(0.21311031991609136), - FRAC_CONST(0.22508391135979283), - FRAC_CONST(0.2370236059943672), - FRAC_CONST(0.24892760574572015), - FRAC_CONST(0.26079411791527551), - FRAC_CONST(0.27262135544994898), - FRAC_CONST(0.28440753721127188), - FRAC_CONST(0.29615088824362379), - FRAC_CONST(0.30784964004153487), - FRAC_CONST(0.31950203081601569), - FRAC_CONST(0.33110630575987643), - FRAC_CONST(0.34266071731199438), - FRAC_CONST(0.35416352542049034), - FRAC_CONST(0.36561299780477385), - FRAC_CONST(0.37700741021641826), - FRAC_CONST(0.38834504669882625), - FRAC_CONST(0.39962419984564679), - FRAC_CONST(0.41084317105790391), - FRAC_CONST(0.42200027079979968), - FRAC_CONST(0.43309381885315196), - FRAC_CONST(0.4441221445704292), - FRAC_CONST(0.45508358712634384), - FRAC_CONST(0.46597649576796618), - FRAC_CONST(0.47679923006332209), - FRAC_CONST(0.487550160148436), - FRAC_CONST(0.49822766697278187), - FRAC_CONST(0.50883014254310699), - FRAC_CONST(0.51935599016558964), - FRAC_CONST(0.52980362468629461), - FRAC_CONST(0.54017147272989285), - FRAC_CONST(0.55045797293660481), - FRAC_CONST(0.56066157619733603), - FRAC_CONST(0.57078074588696726), - FRAC_CONST(0.58081395809576453), - FRAC_CONST(0.59075970185887416), - FRAC_CONST(0.60061647938386897), - FRAC_CONST(0.61038280627630948), - FRAC_CONST(0.6200572117632891), - FRAC_CONST(0.62963823891492698), - FRAC_CONST(0.63912444486377573), - FRAC_CONST(0.64851440102211244), - FRAC_CONST(0.65780669329707864), - FRAC_CONST(0.66699992230363747), - FRAC_CONST(0.67609270357531592), - FRAC_CONST(0.68508366777270036), - FRAC_CONST(0.693971460889654), - FRAC_CONST(0.7027547444572253), - FRAC_CONST(0.71143219574521643), - FRAC_CONST(0.72000250796138165), - FRAC_CONST(0.7284643904482252), - FRAC_CONST(0.73681656887736979), - FRAC_CONST(0.74505778544146595), - FRAC_CONST(0.75318679904361241), - FRAC_CONST(0.76120238548426178), - FRAC_CONST(0.76910333764557959), - FRAC_CONST(0.77688846567323244), - FRAC_CONST(0.78455659715557524), - FRAC_CONST(0.79210657730021239), - FRAC_CONST(0.79953726910790501), - FRAC_CONST(0.80684755354379922), - FRAC_CONST(0.8140363297059483), - FRAC_CONST(0.82110251499110465), - FRAC_CONST(0.8280450452577558), - FRAC_CONST(0.83486287498638001), - FRAC_CONST(0.84155497743689833), - FRAC_CONST(0.84812034480329712), - FRAC_CONST(0.85455798836540053), - FRAC_CONST(0.86086693863776731), - FRAC_CONST(0.86704624551569265), - FRAC_CONST(0.87309497841829009), - FRAC_CONST(0.87901222642863341), - FRAC_CONST(0.88479709843093779), - FRAC_CONST(0.89044872324475788), - FRAC_CONST(0.89596624975618511), - FRAC_CONST(0.90134884704602203), - FRAC_CONST(0.90659570451491533), - FRAC_CONST(0.91170603200542988), - FRAC_CONST(0.9166790599210427), - FRAC_CONST(0.9215140393420419), - FRAC_CONST(0.92621024213831127), - FRAC_CONST(0.93076696107898371), - FRAC_CONST(0.9351835099389475), - FRAC_CONST(0.93945922360218992), - FRAC_CONST(0.94359345816196039), - FRAC_CONST(0.94758559101774109), - FRAC_CONST(0.95143502096900834), - FRAC_CONST(0.95514116830577067), - FRAC_CONST(0.9587034748958716), - FRAC_CONST(0.96212140426904158), - FRAC_CONST(0.9653944416976894), - FRAC_CONST(0.96852209427441727), - FRAC_CONST(0.97150389098625178), - FRAC_CONST(0.97433938278557586), - FRAC_CONST(0.97702814265775439), - FRAC_CONST(0.97956976568544052), - FRAC_CONST(0.98196386910955524), - FRAC_CONST(0.98421009238692903), - FRAC_CONST(0.98630809724459867), - FRAC_CONST(0.98825756773074946), - FRAC_CONST(0.99005821026229712), - FRAC_CONST(0.99170975366909953), - FRAC_CONST(0.9932119492347945), - FRAC_CONST(0.99456457073425542), - FRAC_CONST(0.99576741446765982), - FRAC_CONST(0.99682029929116567), - FRAC_CONST(0.99772306664419164), - FRAC_CONST(0.99847558057329477), - FRAC_CONST(0.99907772775264536), - FRAC_CONST(0.99952941750109314), - FRAC_CONST(0.9998305817958234), - FRAC_CONST(0.99998117528260111), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1) -}; - -#ifdef ALLOW_SMALL_FRAMELENGTH -ALIGN static const real_t ld_mid_480[] = -{ - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0.0065449379673518581), - FRAC_CONST(0.019633692460628301), - FRAC_CONST(0.032719082821776137), - FRAC_CONST(0.045798866936520771), - FRAC_CONST(0.058870803651189033), - FRAC_CONST(0.071932653156719387), - FRAC_CONST(0.084982177372441667), - FRAC_CONST(0.09801714032956059), - FRAC_CONST(0.11103530855427769), - FRAC_CONST(0.12403445145048532), - FRAC_CONST(0.13701234168196802), - FRAC_CONST(0.14996675555404498), - FRAC_CONST(0.16289547339458874), - FRAC_CONST(0.17579627993435451), - FRAC_CONST(0.18866696468655525), - FRAC_CONST(0.2015053223256171), - FRAC_CONST(0.21430915306505074), - FRAC_CONST(0.2270762630343732), - FRAC_CONST(0.23980446465501654), - FRAC_CONST(0.25249157701515795), - FRAC_CONST(0.26513542624340797), - FRAC_CONST(0.27773384588129219), - FRAC_CONST(0.29028467725446233), - FRAC_CONST(0.3027857698425746), - FRAC_CONST(0.31523498164776964), - FRAC_CONST(0.32763017956169349), - FRAC_CONST(0.33996923973099424), - FRAC_CONST(0.35225004792123354), - FRAC_CONST(0.36447049987914965), - FRAC_CONST(0.37662850169321077), - FRAC_CONST(0.38872197015239557), - FRAC_CONST(0.40074883310314097), - FRAC_CONST(0.41270702980439467), - FRAC_CONST(0.42459451128071307), - FRAC_CONST(0.43640924067334208), - FRAC_CONST(0.44814919358922256), - FRAC_CONST(0.45981235844785984), - FRAC_CONST(0.47139673682599764), - FRAC_CONST(0.48290034380003727), - FRAC_CONST(0.49432120828614462), - FRAC_CONST(0.50565737337798455), - FRAC_CONST(0.51690689668202761), - FRAC_CONST(0.52806785065036799), - FRAC_CONST(0.53913832291100017), - FRAC_CONST(0.55011641659549337), - FRAC_CONST(0.56100025066400983), - FRAC_CONST(0.57178796022761225), - FRAC_CONST(0.58247769686780215), - FRAC_CONST(0.59306762895323706), - FRAC_CONST(0.60355594195357143), - FRAC_CONST(0.61394083875036642), - FRAC_CONST(0.62422053994501758), - FRAC_CONST(0.63439328416364549), - FRAC_CONST(0.64445732835889735), - FRAC_CONST(0.65441094810861034), - FRAC_CONST(0.66425243791128175), - FRAC_CONST(0.67398011147829784), - FRAC_CONST(0.68359230202287125), - FRAC_CONST(0.69308736254563585), - FRAC_CONST(0.70246366611685174), - FRAC_CONST(0.71171960615517138), - FRAC_CONST(0.72085359670291882), - FRAC_CONST(0.7298640726978356), - FRAC_CONST(0.73874949024124625), - FRAC_CONST(0.74750832686259672), - FRAC_CONST(0.75613908178032285), - FRAC_CONST(0.76464027615900032), - FRAC_CONST(0.77301045336273699), - FRAC_CONST(0.78124817920475853), - FRAC_CONST(0.78935204219315003), - FRAC_CONST(0.79732065377270711), - FRAC_CONST(0.80515264856285829), - FRAC_CONST(0.81284668459161513), - FRAC_CONST(0.82040144352551359), - FRAC_CONST(0.82781563089550203), - FRAC_CONST(0.83508797631874299), - FRAC_CONST(0.84221723371628654), - FRAC_CONST(0.84920218152657889), - FRAC_CONST(0.85604162291477137), - FRAC_CONST(0.86273438597779184), - FRAC_CONST(0.86927932394514362), - FRAC_CONST(0.87567531537539967), - FRAC_CONST(0.88192126434835494), - FRAC_CONST(0.88801610065280734), - FRAC_CONST(0.89395877996993212), - FRAC_CONST(0.8997482840522214), - FRAC_CONST(0.90538362089795521), - FRAC_CONST(0.91086382492117568), - FRAC_CONST(0.91618795711713596), - FRAC_CONST(0.92135510522319242), - FRAC_CONST(0.9263643838751181), - FRAC_CONST(0.93121493475880346), - FRAC_CONST(0.93590592675732565), - FRAC_CONST(0.94043655609335486), - FRAC_CONST(0.94480604646687805), - FRAC_CONST(0.94901364918821385), - FRAC_CONST(0.95305864330629697), - FRAC_CONST(0.95694033573220882), - FRAC_CONST(0.9606580613579353), - FRAC_CONST(0.96421118317032928), - FRAC_CONST(0.96759909236025976), - FRAC_CONST(0.9708212084269281), - FRAC_CONST(0.97387697927733363), - FRAC_CONST(0.97676588132087239), - FRAC_CONST(0.97948741955905139), - FRAC_CONST(0.98204112767030394), - FRAC_CONST(0.98442656808989171), - FRAC_CONST(0.98664333208487898), - FRAC_CONST(0.98869103982416728), - FRAC_CONST(0.99056934044357725), - FRAC_CONST(0.99227791210596705), - FRAC_CONST(0.99381646205637808), - FRAC_CONST(0.99518472667219682), - FRAC_CONST(0.99638247150832537), - FRAC_CONST(0.99740949133735191), - FRAC_CONST(0.99826561018471593), - FRAC_CONST(0.99895068135886012), - FRAC_CONST(0.99946458747636568), - FRAC_CONST(0.99980724048206482), - FRAC_CONST(0.99997858166412923), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1) -}; -#endif -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/specrec.c b/src/libfaad/specrec.c deleted file mode 100644 index fd4b0653c..000000000 --- a/src/libfaad/specrec.c +++ /dev/null @@ -1,1241 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: specrec.c,v 1.10 2006/06/17 20:43:57 dgp85 Exp $ -**/ - -/* - Spectral reconstruction: - - grouping/sectioning - - inverse quantization - - applying scalefactors -*/ - -#include "common.h" -#include "structs.h" - -#include <string.h> -#include <stdlib.h> -#include "specrec.h" -#include "filtbank.h" -#include "syntax.h" -#include "iq_table.h" -#include "ms.h" -#include "is.h" -#include "pns.h" -#include "tns.h" -#include "drc.h" -#include "lt_predict.h" -#include "ic_predict.h" -#ifdef SSR_DEC -#include "ssr.h" -#include "ssr_fb.h" -#endif - - -/* static function declarations */ -static uint8_t quant_to_spec(NeAACDecHandle hDecoder, - ic_stream *ics, int16_t *quant_data, - real_t *spec_data, uint16_t frame_len); - - -#ifdef LD_DEC -ALIGN static const uint8_t num_swb_512_window[] = -{ - 0, 0, 0, 36, 36, 37, 31, 31, 0, 0, 0, 0 -}; -ALIGN static const uint8_t num_swb_480_window[] = -{ - 0, 0, 0, 35, 35, 37, 30, 30, 0, 0, 0, 0 -}; -#endif - -ALIGN static const uint8_t num_swb_960_window[] = -{ - 40, 40, 45, 49, 49, 49, 46, 46, 42, 42, 42, 40 -}; - -ALIGN static const uint8_t num_swb_1024_window[] = -{ - 41, 41, 47, 49, 49, 51, 47, 47, 43, 43, 43, 40 -}; - -ALIGN static const uint8_t num_swb_128_window[] = -{ - 12, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15 -}; - -ALIGN static const uint16_t swb_offset_1024_96[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, - 64, 72, 80, 88, 96, 108, 120, 132, 144, 156, 172, 188, 212, 240, - 276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024 -}; - -ALIGN static const uint16_t swb_offset_128_96[] = -{ - 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128 -}; - -ALIGN static const uint16_t swb_offset_1024_64[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, - 64, 72, 80, 88, 100, 112, 124, 140, 156, 172, 192, 216, 240, 268, - 304, 344, 384, 424, 464, 504, 544, 584, 624, 664, 704, 744, 784, 824, - 864, 904, 944, 984, 1024 -}; - -ALIGN static const uint16_t swb_offset_128_64[] = -{ - 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128 -}; - -ALIGN static const uint16_t swb_offset_1024_48[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, - 80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, - 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, - 768, 800, 832, 864, 896, 928, 1024 -}; - -#ifdef LD_DEC -ALIGN static const uint16_t swb_offset_512_48[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 68, 76, 84, - 92, 100, 112, 124, 136, 148, 164, 184, 208, 236, 268, 300, 332, 364, 396, - 428, 460, 512 -}; - -ALIGN static const uint16_t swb_offset_480_48[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72 ,80 ,88, - 96, 108, 120, 132, 144, 156, 172, 188, 212, 240, 272, 304, 336, 368, 400, - 432, 480 -}; -#endif - -ALIGN static const uint16_t swb_offset_128_48[] = -{ - 0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128 -}; - -ALIGN static const uint16_t swb_offset_1024_32[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, - 80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, - 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, - 768, 800, 832, 864, 896, 928, 960, 992, 1024 -}; - -#ifdef LD_DEC -ALIGN static const uint16_t swb_offset_512_32[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80, - 88, 96, 108, 120, 132, 144, 160, 176, 192, 212, 236, 260, 288, 320, 352, - 384, 416, 448, 480, 512 -}; - -ALIGN static const uint16_t swb_offset_480_32[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 72, 80, - 88, 96, 104, 112, 124, 136, 148, 164, 180, 200, 224, 256, 288, 320, 352, - 384, 416, 448, 480 -}; -#endif - -ALIGN static const uint16_t swb_offset_1024_24[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, - 76, 84, 92, 100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220, - 240, 260, 284, 308, 336, 364, 396, 432, 468, 508, 552, 600, 652, 704, - 768, 832, 896, 960, 1024 -}; - -#ifdef LD_DEC -ALIGN static const uint16_t swb_offset_512_24[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, - 80, 92, 104, 120, 140, 164, 192, 224, 256, 288, 320, 352, 384, 416, - 448, 480, 512 -}; - -ALIGN static const uint16_t swb_offset_480_24[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 80, 92, 104, 120, - 140, 164, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480 -}; -#endif - -ALIGN static const uint16_t swb_offset_128_24[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128 -}; - -ALIGN static const uint16_t swb_offset_1024_16[] = -{ - 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124, - 136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344, - 368, 396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024 -}; - -ALIGN static const uint16_t swb_offset_128_16[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128 -}; - -ALIGN static const uint16_t swb_offset_1024_8[] = -{ - 0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 172, - 188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, 448, - 476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 1024 -}; - -ALIGN static const uint16_t swb_offset_128_8[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128 -}; - -ALIGN static const uint16_t *swb_offset_1024_window[] = -{ - swb_offset_1024_96, /* 96000 */ - swb_offset_1024_96, /* 88200 */ - swb_offset_1024_64, /* 64000 */ - swb_offset_1024_48, /* 48000 */ - swb_offset_1024_48, /* 44100 */ - swb_offset_1024_32, /* 32000 */ - swb_offset_1024_24, /* 24000 */ - swb_offset_1024_24, /* 22050 */ - swb_offset_1024_16, /* 16000 */ - swb_offset_1024_16, /* 12000 */ - swb_offset_1024_16, /* 11025 */ - swb_offset_1024_8 /* 8000 */ -}; - -#ifdef LD_DEC -ALIGN static const uint16_t *swb_offset_512_window[] = -{ - 0, /* 96000 */ - 0, /* 88200 */ - 0, /* 64000 */ - swb_offset_512_48, /* 48000 */ - swb_offset_512_48, /* 44100 */ - swb_offset_512_32, /* 32000 */ - swb_offset_512_24, /* 24000 */ - swb_offset_512_24, /* 22050 */ - 0, /* 16000 */ - 0, /* 12000 */ - 0, /* 11025 */ - 0 /* 8000 */ -}; - -ALIGN static const uint16_t *swb_offset_480_window[] = -{ - 0, /* 96000 */ - 0, /* 88200 */ - 0, /* 64000 */ - swb_offset_480_48, /* 48000 */ - swb_offset_480_48, /* 44100 */ - swb_offset_480_32, /* 32000 */ - swb_offset_480_24, /* 24000 */ - swb_offset_480_24, /* 22050 */ - 0, /* 16000 */ - 0, /* 12000 */ - 0, /* 11025 */ - 0 /* 8000 */ -}; -#endif - -ALIGN static const uint16_t *swb_offset_128_window[] = -{ - swb_offset_128_96, /* 96000 */ - swb_offset_128_96, /* 88200 */ - swb_offset_128_64, /* 64000 */ - swb_offset_128_48, /* 48000 */ - swb_offset_128_48, /* 44100 */ - swb_offset_128_48, /* 32000 */ - swb_offset_128_24, /* 24000 */ - swb_offset_128_24, /* 22050 */ - swb_offset_128_16, /* 16000 */ - swb_offset_128_16, /* 12000 */ - swb_offset_128_16, /* 11025 */ - swb_offset_128_8 /* 8000 */ -}; - -#define bit_set(A, B) ((A) & (1<<(B))) - -/* 4.5.2.3.4 */ -/* - - determine the number of windows in a window_sequence named num_windows - - determine the number of window_groups named num_window_groups - - determine the number of windows in each group named window_group_length[g] - - determine the total number of scalefactor window bands named num_swb for - the actual window type - - determine swb_offset[swb], the offset of the first coefficient in - scalefactor window band named swb of the window actually used - - determine sect_sfb_offset[g][section],the offset of the first coefficient - in section named section. This offset depends on window_sequence and - scale_factor_grouping and is needed to decode the spectral_data(). -*/ -uint8_t window_grouping_info(NeAACDecHandle hDecoder, ic_stream *ics) -{ - uint8_t i, g; - - uint8_t sf_index = hDecoder->sf_index; - - switch (ics->window_sequence) { - case ONLY_LONG_SEQUENCE: - case LONG_START_SEQUENCE: - case LONG_STOP_SEQUENCE: - ics->num_windows = 1; - ics->num_window_groups = 1; - ics->window_group_length[ics->num_window_groups-1] = 1; -#ifdef LD_DEC - if (hDecoder->object_type == LD) - { - if (hDecoder->frameLength == 512) - ics->num_swb = num_swb_512_window[sf_index]; - else /* if (hDecoder->frameLength == 480) */ - ics->num_swb = num_swb_480_window[sf_index]; - } else { -#endif - if (hDecoder->frameLength == 1024) - ics->num_swb = num_swb_1024_window[sf_index]; - else /* if (hDecoder->frameLength == 960) */ - ics->num_swb = num_swb_960_window[sf_index]; -#ifdef LD_DEC - } -#endif - - /* preparation of sect_sfb_offset for long blocks */ - /* also copy the last value! */ -#ifdef LD_DEC - if (hDecoder->object_type == LD) - { - if (hDecoder->frameLength == 512) - { - for (i = 0; i < ics->num_swb; i++) - { - ics->sect_sfb_offset[0][i] = swb_offset_512_window[sf_index][i]; - ics->swb_offset[i] = swb_offset_512_window[sf_index][i]; - } - } else /* if (hDecoder->frameLength == 480) */ { - for (i = 0; i < ics->num_swb; i++) - { - ics->sect_sfb_offset[0][i] = swb_offset_480_window[sf_index][i]; - ics->swb_offset[i] = swb_offset_480_window[sf_index][i]; - } - } - ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; - ics->swb_offset[ics->num_swb] = hDecoder->frameLength; - } else { -#endif - for (i = 0; i < ics->num_swb; i++) - { - ics->sect_sfb_offset[0][i] = swb_offset_1024_window[sf_index][i]; - ics->swb_offset[i] = swb_offset_1024_window[sf_index][i]; - } - ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; - ics->swb_offset[ics->num_swb] = hDecoder->frameLength; -#ifdef LD_DEC - } -#endif - return 0; - case EIGHT_SHORT_SEQUENCE: - ics->num_windows = 8; - ics->num_window_groups = 1; - ics->window_group_length[ics->num_window_groups-1] = 1; - ics->num_swb = num_swb_128_window[sf_index]; - - for (i = 0; i < ics->num_swb; i++) - ics->swb_offset[i] = swb_offset_128_window[sf_index][i]; - ics->swb_offset[ics->num_swb] = hDecoder->frameLength/8; - - for (i = 0; i < ics->num_windows-1; i++) { - if (bit_set(ics->scale_factor_grouping, 6-i) == 0) - { - ics->num_window_groups += 1; - ics->window_group_length[ics->num_window_groups-1] = 1; - } else { - ics->window_group_length[ics->num_window_groups-1] += 1; - } - } - - /* preparation of sect_sfb_offset for short blocks */ - for (g = 0; g < ics->num_window_groups; g++) - { - uint16_t width; - uint8_t sect_sfb = 0; - uint16_t offset = 0; - - for (i = 0; i < ics->num_swb; i++) - { - if (i+1 == ics->num_swb) - { - width = (hDecoder->frameLength/8) - swb_offset_128_window[sf_index][i]; - } else { - width = swb_offset_128_window[sf_index][i+1] - - swb_offset_128_window[sf_index][i]; - } - width *= ics->window_group_length[g]; - ics->sect_sfb_offset[g][sect_sfb++] = offset; - offset += width; - } - ics->sect_sfb_offset[g][sect_sfb] = offset; - } - return 0; - default: - return 1; - } -} - -/* iquant() * -/* output = sign(input)*abs(input)^(4/3) */ -/**/ -static INLINE real_t iquant(int16_t q, const real_t *tab, uint8_t *error) -{ -#ifdef FIXED_POINT -/* For FIXED_POINT the iq_table is prescaled by 3 bits (iq_table[]/8) */ -/* BIG_IQ_TABLE allows you to use the full 8192 value table, if this is not - * defined a 1026 value table and interpolation will be used - */ -#ifndef BIG_IQ_TABLE - static const real_t errcorr[] = { - REAL_CONST(0), REAL_CONST(1.0/8.0), REAL_CONST(2.0/8.0), REAL_CONST(3.0/8.0), - REAL_CONST(4.0/8.0), REAL_CONST(5.0/8.0), REAL_CONST(6.0/8.0), REAL_CONST(7.0/8.0), - REAL_CONST(0) - }; - real_t x1, x2; -#endif - int16_t sgn = 1; - - if (q < 0) - { - q = -q; - sgn = -1; - } - - if (q < IQ_TABLE_SIZE) - { -//#define IQUANT_PRINT -#ifdef IQUANT_PRINT - //printf("0x%.8X\n", sgn * tab[q]); - printf("%d\n", sgn * tab[q]); -#endif - return sgn * tab[q]; - } - -#ifndef BIG_IQ_TABLE - if (q >= 8192) - { - *error = 17; - return 0; - } - - /* linear interpolation */ - x1 = tab[q>>3]; - x2 = tab[(q>>3) + 1]; - return sgn * 16 * (MUL_R(errcorr[q&7],(x2-x1)) + x1); -#else - *error = 17; - return 0; -#endif - -#else - if (q < 0) - { - /* tab contains a value for all possible q [0,8192] */ - if (-q < IQ_TABLE_SIZE) - return -tab[-q]; - - *error = 17; - return 0; - } else { - /* tab contains a value for all possible q [0,8192] */ - if (q < IQ_TABLE_SIZE) - return tab[q]; - - *error = 17; - return 0; - } -#endif -} - -#ifndef FIXED_POINT -ALIGN static const real_t pow2sf_tab[] = { - 2.9802322387695313E-008, 5.9604644775390625E-008, 1.1920928955078125E-007, - 2.384185791015625E-007, 4.76837158203125E-007, 9.5367431640625E-007, - 1.9073486328125E-006, 3.814697265625E-006, 7.62939453125E-006, - 1.52587890625E-005, 3.0517578125E-005, 6.103515625E-005, - 0.0001220703125, 0.000244140625, 0.00048828125, - 0.0009765625, 0.001953125, 0.00390625, - 0.0078125, 0.015625, 0.03125, - 0.0625, 0.125, 0.25, - 0.5, 1.0, 2.0, - 4.0, 8.0, 16.0, 32.0, - 64.0, 128.0, 256.0, - 512.0, 1024.0, 2048.0, - 4096.0, 8192.0, 16384.0, - 32768.0, 65536.0, 131072.0, - 262144.0, 524288.0, 1048576.0, - 2097152.0, 4194304.0, 8388608.0, - 16777216.0, 33554432.0, 67108864.0, - 134217728.0, 268435456.0, 536870912.0, - 1073741824.0, 2147483648.0, 4294967296.0, - 8589934592.0, 17179869184.0, 34359738368.0, - 68719476736.0, 137438953472.0, 274877906944.0 -}; -#endif - -/* quant_to_spec: perform dequantisation and scaling - * and in case of short block it also does the deinterleaving - */ -/* - For ONLY_LONG_SEQUENCE windows (num_window_groups = 1, - window_group_length[0] = 1) the spectral data is in ascending spectral - order. - For the EIGHT_SHORT_SEQUENCE window, the spectral order depends on the - grouping in the following manner: - - Groups are ordered sequentially - - Within a group, a scalefactor band consists of the spectral data of all - grouped SHORT_WINDOWs for the associated scalefactor window band. To - clarify via example, the length of a group is in the range of one to eight - SHORT_WINDOWs. - - If there are eight groups each with length one (num_window_groups = 8, - window_group_length[0..7] = 1), the result is a sequence of eight spectra, - each in ascending spectral order. - - If there is only one group with length eight (num_window_groups = 1, - window_group_length[0] = 8), the result is that spectral data of all eight - SHORT_WINDOWs is interleaved by scalefactor window bands. - - Within a scalefactor window band, the coefficients are in ascending - spectral order. -*/ -static uint8_t quant_to_spec(NeAACDecHandle hDecoder, - ic_stream *ics, int16_t *quant_data, - real_t *spec_data, uint16_t frame_len) -{ - ALIGN static const real_t pow2_table[] = - { - COEF_CONST(1.0), - COEF_CONST(1.1892071150027210667174999705605), /* 2^0.25 */ - COEF_CONST(1.4142135623730950488016887242097), /* 2^0.5 */ - COEF_CONST(1.6817928305074290860622509524664) /* 2^0.75 */ - }; - const real_t *tab = iq_table; - - uint8_t g, sfb, win; - uint16_t width, bin, k, gindex, wa, wb; - uint8_t error = 0; /* Init error flag */ -#ifndef FIXED_POINT - real_t scf; -#endif - - k = 0; - gindex = 0; - - for (g = 0; g < ics->num_window_groups; g++) - { - uint16_t j = 0; - uint16_t gincrease = 0; - uint16_t win_inc = ics->swb_offset[ics->num_swb]; - - for (sfb = 0; sfb < ics->num_swb; sfb++) - { - int32_t exp, frac; - - width = ics->swb_offset[sfb+1] - ics->swb_offset[sfb]; - - /* this could be scalefactor for IS or PNS, those can be negative or bigger then 255 */ - /* just ignore them */ - if (ics->scale_factors[g][sfb] < 0 || ics->scale_factors[g][sfb] > 255) - { - exp = 0; - frac = 0; - } else { - /* ics->scale_factors[g][sfb] must be between 0 and 255 */ - exp = (ics->scale_factors[g][sfb] /* - 100 */) >> 2; - /* frac must always be > 0 */ - frac = (ics->scale_factors[g][sfb] /* - 100 */) & 3; - } - -#ifdef FIXED_POINT - exp -= 25; - /* IMDCT pre-scaling */ - if (hDecoder->object_type == LD) - { - exp -= 6 /*9*/; - } else { - if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) - exp -= 4 /*7*/; - else - exp -= 7 /*10*/; - } -#endif - - wa = gindex + j; - -#ifndef FIXED_POINT - scf = pow2sf_tab[exp/*+25*/] * pow2_table[frac]; -#endif - - for (win = 0; win < ics->window_group_length[g]; win++) - { - for (bin = 0; bin < width; bin += 4) - { -#ifndef FIXED_POINT - wb = wa + bin; - - spec_data[wb+0] = iquant(quant_data[k+0], tab, &error) * scf; - spec_data[wb+1] = iquant(quant_data[k+1], tab, &error) * scf; - spec_data[wb+2] = iquant(quant_data[k+2], tab, &error) * scf; - spec_data[wb+3] = iquant(quant_data[k+3], tab, &error) * scf; - -#else - real_t iq0 = iquant(quant_data[k+0], tab, &error); - real_t iq1 = iquant(quant_data[k+1], tab, &error); - real_t iq2 = iquant(quant_data[k+2], tab, &error); - real_t iq3 = iquant(quant_data[k+3], tab, &error); - - wb = wa + bin; - - if (exp < 0) - { - spec_data[wb+0] = iq0 >>= -exp; - spec_data[wb+1] = iq1 >>= -exp; - spec_data[wb+2] = iq2 >>= -exp; - spec_data[wb+3] = iq3 >>= -exp; - } else { - spec_data[wb+0] = iq0 <<= exp; - spec_data[wb+1] = iq1 <<= exp; - spec_data[wb+2] = iq2 <<= exp; - spec_data[wb+3] = iq3 <<= exp; - } - if (frac != 0) - { - spec_data[wb+0] = MUL_C(spec_data[wb+0],pow2_table[frac]); - spec_data[wb+1] = MUL_C(spec_data[wb+1],pow2_table[frac]); - spec_data[wb+2] = MUL_C(spec_data[wb+2],pow2_table[frac]); - spec_data[wb+3] = MUL_C(spec_data[wb+3],pow2_table[frac]); - } - -//#define SCFS_PRINT -#ifdef SCFS_PRINT - printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+0]); - printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+1]); - printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+2]); - printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+3]); - //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+0]); - //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+1]); - //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+2]); - //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+3]); -#endif -#endif - - gincrease += 4; - k += 4; - } - wa += win_inc; - } - j += width; - } - gindex += gincrease; - } - - return error; -} - -static uint8_t allocate_single_channel(NeAACDecHandle hDecoder, uint8_t channel, - uint8_t output_channels) -{ - uint8_t mul = 1; - -#ifdef MAIN_DEC - /* MAIN object type prediction */ - if (hDecoder->object_type == MAIN) - { - hDecoder->pred_stat[channel] = (pred_state*)realloc(hDecoder->pred_stat[channel], hDecoder->frameLength * sizeof(pred_state)); - reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); - } -#endif - -#ifdef LTP_DEC - if (is_ltp_ot(hDecoder->object_type)) - { - hDecoder->lt_pred_stat[channel] = (int16_t*)realloc(hDecoder->lt_pred_stat[channel], hDecoder->frameLength*4 * sizeof(int16_t)); - memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); - } -#endif - - mul = 1; -#ifdef SBR_DEC - hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; - if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) - { - /* SBR requires 2 times as much output data */ - mul = 2; - hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; - } -#endif - hDecoder->time_out[channel] = (real_t*)realloc(hDecoder->time_out[channel], mul*hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); -#if (defined(PS_DEC) || defined(DRM_PS)) - if (output_channels == 2) - { - hDecoder->time_out[channel+1] = (real_t*)realloc(hDecoder->time_out[channel+1], mul*hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->time_out[channel+1], 0, mul*hDecoder->frameLength*sizeof(real_t)); - } -#endif - - hDecoder->fb_intermed[channel] = (real_t*)realloc(hDecoder->fb_intermed[channel], hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); - -#ifdef SSR_DEC - if (hDecoder->object_type == SSR) - { - uint16_t k; - hDecoder->ssr_overlap[channel] = (real_t*)realloc(hDecoder->ssr_overlap[channel], 2*hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->ssr_overlap[channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); - hDecoder->prev_fmd[channel] = (real_t*)realloc(hDecoder->prev_fmd[channel], 2*hDecoder->frameLength*sizeof(real_t)); - for (k = 0; k < 2*hDecoder->frameLength; k++) - hDecoder->prev_fmd[channel][k] = REAL_CONST(-1); - } -#endif - - return 0; -} - -static uint8_t allocate_channel_pair(NeAACDecHandle hDecoder, - uint8_t channel, uint8_t paired_channel) -{ - uint8_t mul = 1; - -#ifdef MAIN_DEC - /* MAIN object type prediction */ - if (hDecoder->object_type == MAIN) - { - /* allocate the state only when needed */ - if (hDecoder->pred_stat[channel] == NULL) - { - hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); - reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); - } - if (hDecoder->pred_stat[paired_channel] == NULL) - { - hDecoder->pred_stat[paired_channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); - reset_all_predictors(hDecoder->pred_stat[paired_channel], hDecoder->frameLength); - } - } -#endif - -#ifdef LTP_DEC - if (is_ltp_ot(hDecoder->object_type)) - { - /* allocate the state only when needed */ - if (hDecoder->lt_pred_stat[channel] == NULL) - { - hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); - memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); - } - if (hDecoder->lt_pred_stat[paired_channel] == NULL) - { - hDecoder->lt_pred_stat[paired_channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); - memset(hDecoder->lt_pred_stat[paired_channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); - } - } -#endif - - if (hDecoder->time_out[channel] == NULL) - { - mul = 1; -#ifdef SBR_DEC - hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; - if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) - { - /* SBR requires 2 times as much output data */ - mul = 2; - hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; - } -#endif - hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); - } - if (hDecoder->time_out[paired_channel] == NULL) - { - hDecoder->time_out[paired_channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->time_out[paired_channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); - } - - if (hDecoder->fb_intermed[channel] == NULL) - { - hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); - } - if (hDecoder->fb_intermed[paired_channel] == NULL) - { - hDecoder->fb_intermed[paired_channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->fb_intermed[paired_channel], 0, hDecoder->frameLength*sizeof(real_t)); - } - -#ifdef SSR_DEC - if (hDecoder->object_type == SSR) - { - if (hDecoder->ssr_overlap[cpe->channel] == NULL) - { - hDecoder->ssr_overlap[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->ssr_overlap[cpe->channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); - } - if (hDecoder->ssr_overlap[cpe->paired_channel] == NULL) - { - hDecoder->ssr_overlap[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->ssr_overlap[cpe->paired_channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); - } - if (hDecoder->prev_fmd[cpe->channel] == NULL) - { - uint16_t k; - hDecoder->prev_fmd[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); - for (k = 0; k < 2*hDecoder->frameLength; k++) - hDecoder->prev_fmd[cpe->channel][k] = REAL_CONST(-1); - } - if (hDecoder->prev_fmd[cpe->paired_channel] == NULL) - { - uint16_t k; - hDecoder->prev_fmd[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); - for (k = 0; k < 2*hDecoder->frameLength; k++) - hDecoder->prev_fmd[cpe->paired_channel][k] = REAL_CONST(-1); - } - } -#endif - - return 0; -} - -uint8_t reconstruct_single_channel(NeAACDecHandle hDecoder, ic_stream *ics, - element *sce, int16_t *spec_data) -{ - uint8_t retval, output_channels; - ALIGN real_t spec_coef[1024]; - -#ifdef PROFILE - int64_t count = faad_get_ts(); -#endif - - - /* always allocate 2 channels, PS can always "suddenly" turn up */ -#if (defined(PS_DEC) || defined(DRM_PS)) - output_channels = hDecoder->ps_used[hDecoder->fr_ch_ele] ? 2 : 1; -#else - output_channels = 1; -#endif - - if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] < output_channels) - { - hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; - retval = allocate_single_channel(hDecoder, sce->channel, output_channels); - if (retval > 0) - return retval; - - hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; - } - - - /* dequantisation and scaling */ - retval = quant_to_spec(hDecoder, ics, spec_data, spec_coef, hDecoder->frameLength); - if (retval > 0) - return retval; - -#ifdef PROFILE - count = faad_get_ts() - count; - hDecoder->requant_cycles += count; -#endif - - - /* pns decoding */ - pns_decode(ics, NULL, spec_coef, NULL, hDecoder->frameLength, 0, hDecoder->object_type); - -#ifdef MAIN_DEC - /* MAIN object type prediction */ - if (hDecoder->object_type == MAIN) - { - /* intra channel prediction */ - ic_prediction(ics, spec_coef, hDecoder->pred_stat[sce->channel], hDecoder->frameLength, - hDecoder->sf_index); - - /* In addition, for scalefactor bands coded by perceptual - noise substitution the predictors belonging to the - corresponding spectral coefficients are reset. - */ - pns_reset_pred_state(ics, hDecoder->pred_stat[sce->channel]); - } -#endif - -#ifdef LTP_DEC - if (is_ltp_ot(hDecoder->object_type)) - { -#ifdef LD_DEC - if (hDecoder->object_type == LD) - { - if (ics->ltp.data_present) - { - if (ics->ltp.lag_update) - hDecoder->ltp_lag[sce->channel] = ics->ltp.lag; - } - ics->ltp.lag = hDecoder->ltp_lag[sce->channel]; - } -#endif - - /* long term prediction */ - lt_prediction(ics, &(ics->ltp), spec_coef, hDecoder->lt_pred_stat[sce->channel], hDecoder->fb, - ics->window_shape, hDecoder->window_shape_prev[sce->channel], - hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); - } -#endif - - /* tns decoding */ - tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type, - spec_coef, hDecoder->frameLength); - - /* drc decoding */ - if (hDecoder->drc->present) - { - if (!hDecoder->drc->exclude_mask[sce->channel] || !hDecoder->drc->excluded_chns_present) - drc_decode(hDecoder->drc, spec_coef); - } - - /* filter bank */ -#ifdef SSR_DEC - if (hDecoder->object_type != SSR) - { -#endif - ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape, - hDecoder->window_shape_prev[sce->channel], spec_coef, - hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel], - hDecoder->object_type, hDecoder->frameLength); -#ifdef SSR_DEC - } else { - ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape, - hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel], - hDecoder->ssr_overlap[sce->channel], hDecoder->ipqf_buffer[sce->channel], hDecoder->prev_fmd[sce->channel], - hDecoder->frameLength); - } -#endif - - /* save window shape for next frame */ - hDecoder->window_shape_prev[sce->channel] = ics->window_shape; - -#ifdef LTP_DEC - if (is_ltp_ot(hDecoder->object_type)) - { - lt_update_state(hDecoder->lt_pred_stat[sce->channel], hDecoder->time_out[sce->channel], - hDecoder->fb_intermed[sce->channel], hDecoder->frameLength, hDecoder->object_type); - } -#endif - -#ifdef SBR_DEC - if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) - && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) - { - uint8_t ele = hDecoder->fr_ch_ele; - uint8_t ch = sce->channel; - - /* following case can happen when forceUpSampling == 1 */ - if (hDecoder->sbr[ele] == NULL) - { - hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, - hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), - hDecoder->downSampledSBR -#ifdef DRM - , 0 -#endif - ); - } - - if (sce->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) - hDecoder->sbr[ele]->maxAACLine = 8*sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)]; - else - hDecoder->sbr[ele]->maxAACLine = sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)]; - - /* check if any of the PS tools is used */ -#if (defined(PS_DEC) || defined(DRM_PS)) - if (hDecoder->ps_used[ele] == 0) - { -#endif - retval = sbrDecodeSingleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch], - hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); -#if (defined(PS_DEC) || defined(DRM_PS)) - } else { - retval = sbrDecodeSingleFramePS(hDecoder->sbr[ele], hDecoder->time_out[ch], - hDecoder->time_out[ch+1], hDecoder->postSeekResetFlag, - hDecoder->downSampledSBR); - } -#endif - if (retval > 0) - return retval; - } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) - && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) - { - return 23; - } - - /* copy L to R when no PS is used */ -#if (defined(PS_DEC) || defined(DRM_PS)) - if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0) && (output_channels == 2)) - { - uint8_t ele = hDecoder->fr_ch_ele; - uint8_t ch = sce->channel; - uint16_t frame_size = (hDecoder->sbr_alloced[ele]) ? 2 : 1; - frame_size *= hDecoder->frameLength*sizeof(real_t); - - memcpy(hDecoder->time_out[ch+1], hDecoder->time_out[ch], frame_size); - } -#endif -#endif - - return 0; -} - -uint8_t reconstruct_channel_pair(NeAACDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2, - element *cpe, int16_t *spec_data1, int16_t *spec_data2) -{ - uint8_t retval; - ALIGN real_t spec_coef1[1024]; - ALIGN real_t spec_coef2[1024]; - -#ifdef PROFILE - int64_t count = faad_get_ts(); -#endif - if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) - { - retval = allocate_channel_pair(hDecoder, cpe->channel, (uint8_t)cpe->paired_channel); - if (retval > 0) - return retval; - - hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; - } - - /* dequantisation and scaling */ - retval = quant_to_spec(hDecoder, ics1, spec_data1, spec_coef1, hDecoder->frameLength); - if (retval > 0) - return retval; - retval = quant_to_spec(hDecoder, ics2, spec_data2, spec_coef2, hDecoder->frameLength); - if (retval > 0) - return retval; - -#ifdef PROFILE - count = faad_get_ts() - count; - hDecoder->requant_cycles += count; -#endif - - - /* pns decoding */ - if (ics1->ms_mask_present) - { - pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 1, hDecoder->object_type); - } else { - pns_decode(ics1, NULL, spec_coef1, NULL, hDecoder->frameLength, 0, hDecoder->object_type); - pns_decode(ics2, NULL, spec_coef2, NULL, hDecoder->frameLength, 0, hDecoder->object_type); - } - - /* mid/side decoding */ - ms_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); - -#if 0 - { - int i; - for (i = 0; i < 1024; i++) - { - //printf("%d\n", spec_coef1[i]); - printf("0x%.8X\n", spec_coef1[i]); - } - for (i = 0; i < 1024; i++) - { - //printf("%d\n", spec_coef2[i]); - printf("0x%.8X\n", spec_coef2[i]); - } - } -#endif - - /* intensity stereo decoding */ - is_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); - -#if 0 - { - int i; - for (i = 0; i < 1024; i++) - { - printf("%d\n", spec_coef1[i]); - //printf("0x%.8X\n", spec_coef1[i]); - } - for (i = 0; i < 1024; i++) - { - printf("%d\n", spec_coef2[i]); - //printf("0x%.8X\n", spec_coef2[i]); - } - } -#endif - -#ifdef MAIN_DEC - /* MAIN object type prediction */ - if (hDecoder->object_type == MAIN) - { - /* intra channel prediction */ - ic_prediction(ics1, spec_coef1, hDecoder->pred_stat[cpe->channel], hDecoder->frameLength, - hDecoder->sf_index); - ic_prediction(ics2, spec_coef2, hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength, - hDecoder->sf_index); - - /* In addition, for scalefactor bands coded by perceptual - noise substitution the predictors belonging to the - corresponding spectral coefficients are reset. - */ - pns_reset_pred_state(ics1, hDecoder->pred_stat[cpe->channel]); - pns_reset_pred_state(ics2, hDecoder->pred_stat[cpe->paired_channel]); - } -#endif - -#ifdef LTP_DEC - if (is_ltp_ot(hDecoder->object_type)) - { - ltp_info *ltp1 = &(ics1->ltp); - ltp_info *ltp2 = (cpe->common_window) ? &(ics2->ltp2) : &(ics2->ltp); -#ifdef LD_DEC - if (hDecoder->object_type == LD) - { - if (ltp1->data_present) - { - if (ltp1->lag_update) - hDecoder->ltp_lag[cpe->channel] = ltp1->lag; - } - ltp1->lag = hDecoder->ltp_lag[cpe->channel]; - if (ltp2->data_present) - { - if (ltp2->lag_update) - hDecoder->ltp_lag[cpe->paired_channel] = ltp2->lag; - } - ltp2->lag = hDecoder->ltp_lag[cpe->paired_channel]; - } -#endif - - /* long term prediction */ - lt_prediction(ics1, ltp1, spec_coef1, hDecoder->lt_pred_stat[cpe->channel], hDecoder->fb, - ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], - hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); - lt_prediction(ics2, ltp2, spec_coef2, hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->fb, - ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], - hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); - } -#endif - - /* tns decoding */ - tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type, - spec_coef1, hDecoder->frameLength); - tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type, - spec_coef2, hDecoder->frameLength); - - /* drc decoding */ - if (hDecoder->drc->present) - { - if (!hDecoder->drc->exclude_mask[cpe->channel] || !hDecoder->drc->excluded_chns_present) - drc_decode(hDecoder->drc, spec_coef1); - if (!hDecoder->drc->exclude_mask[cpe->paired_channel] || !hDecoder->drc->excluded_chns_present) - drc_decode(hDecoder->drc, spec_coef2); - } - - /* filter bank */ -#ifdef SSR_DEC - if (hDecoder->object_type != SSR) - { -#endif - ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape, - hDecoder->window_shape_prev[cpe->channel], spec_coef1, - hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel], - hDecoder->object_type, hDecoder->frameLength); - ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape, - hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, - hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel], - hDecoder->object_type, hDecoder->frameLength); -#ifdef SSR_DEC - } else { - ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape, - hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel], - hDecoder->ssr_overlap[cpe->channel], hDecoder->ipqf_buffer[cpe->channel], - hDecoder->prev_fmd[cpe->channel], hDecoder->frameLength); - ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape, - hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel], - hDecoder->ssr_overlap[cpe->paired_channel], hDecoder->ipqf_buffer[cpe->paired_channel], - hDecoder->prev_fmd[cpe->paired_channel], hDecoder->frameLength); - } -#endif - - /* save window shape for next frame */ - hDecoder->window_shape_prev[cpe->channel] = ics1->window_shape; - hDecoder->window_shape_prev[cpe->paired_channel] = ics2->window_shape; - -#ifdef LTP_DEC - if (is_ltp_ot(hDecoder->object_type)) - { - lt_update_state(hDecoder->lt_pred_stat[cpe->channel], hDecoder->time_out[cpe->channel], - hDecoder->fb_intermed[cpe->channel], hDecoder->frameLength, hDecoder->object_type); - lt_update_state(hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->time_out[cpe->paired_channel], - hDecoder->fb_intermed[cpe->paired_channel], hDecoder->frameLength, hDecoder->object_type); - } -#endif - -#ifdef SBR_DEC - if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) - && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) - { - uint8_t ele = hDecoder->fr_ch_ele; - uint8_t ch0 = cpe->channel; - uint8_t ch1 = cpe->paired_channel; - - /* following case can happen when forceUpSampling == 1 */ - if (hDecoder->sbr[ele] == NULL) - { - hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, - hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), - hDecoder->downSampledSBR -#ifdef DRM - , 0 -#endif - ); - } - - if (cpe->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) - hDecoder->sbr[ele]->maxAACLine = 8*cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)]; - else - hDecoder->sbr[ele]->maxAACLine = cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)]; - - retval = sbrDecodeCoupleFrame(hDecoder->sbr[ele], - hDecoder->time_out[ch0], hDecoder->time_out[ch1], - hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); - if (retval > 0) - return retval; - } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) - && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) - { - return 23; - } -#endif - - return 0; -} diff --git a/src/libfaad/specrec.h b/src/libfaad/specrec.h deleted file mode 100644 index da174abe8..000000000 --- a/src/libfaad/specrec.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: specrec.h,v 1.7 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __SPECREC_H__ -#define __SPECREC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "syntax.h" - -uint8_t window_grouping_info(NeAACDecHandle hDecoder, ic_stream *ics); -uint8_t reconstruct_channel_pair(NeAACDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2, - element *cpe, int16_t *spec_data1, int16_t *spec_data2); -uint8_t reconstruct_single_channel(NeAACDecHandle hDecoder, ic_stream *ics, element *sce, - int16_t *spec_data); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/ssr.c b/src/libfaad/ssr.c deleted file mode 100644 index 46517d0c8..000000000 --- a/src/libfaad/ssr.c +++ /dev/null @@ -1,172 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: ssr.c,v 1.6 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#ifdef SSR_DEC - -#include "syntax.h" -#include "filtbank.h" -#include "ssr.h" -#include "ssr_fb.h" - -void ssr_decode(ssr_info *ssr, fb_info *fb, uint8_t window_sequence, - uint8_t window_shape, uint8_t window_shape_prev, - real_t *freq_in, real_t *time_out, real_t *overlap, - real_t ipqf_buffer[SSR_BANDS][96/4], - real_t *prev_fmd, uint16_t frame_len) -{ - uint8_t band; - uint16_t ssr_frame_len = frame_len/SSR_BANDS; - real_t time_tmp[2048] = {0}; - real_t output[1024] = {0}; - - for (band = 0; band < SSR_BANDS; band++) - { - int16_t j; - - /* uneven bands have inverted frequency scale */ - if (band == 1 || band == 3) - { - for (j = 0; j < ssr_frame_len/2; j++) - { - real_t tmp; - tmp = freq_in[j + ssr_frame_len*band]; - freq_in[j + ssr_frame_len*band] = - freq_in[ssr_frame_len - j - 1 + ssr_frame_len*band]; - freq_in[ssr_frame_len - j - 1 + ssr_frame_len*band] = tmp; - } - } - - /* non-overlapping inverse filterbank for SSR */ - ssr_ifilter_bank(fb, window_sequence, window_shape, window_shape_prev, - freq_in + band*ssr_frame_len, time_tmp + band*ssr_frame_len, - ssr_frame_len); - - /* gain control */ - ssr_gain_control(ssr, time_tmp, output, overlap, prev_fmd, - band, window_sequence, ssr_frame_len); - } - - /* inverse pqf to bring subbands together again */ - ssr_ipqf(ssr, output, time_out, ipqf_buffer, frame_len, SSR_BANDS); -} - -static void ssr_gain_control(ssr_info *ssr, real_t *data, real_t *output, - real_t *overlap, real_t *prev_fmd, uint8_t band, - uint8_t window_sequence, uint16_t frame_len) -{ - uint16_t i; - real_t gc_function[2*1024/SSR_BANDS]; - - if (window_sequence != EIGHT_SHORT_SEQUENCE) - { - ssr_gc_function(ssr, &prev_fmd[band * frame_len*2], - gc_function, window_sequence, band, frame_len); - - for (i = 0; i < frame_len*2; i++) - data[band * frame_len*2 + i] *= gc_function[i]; - for (i = 0; i < frame_len; i++) - { - output[band*frame_len + i] = overlap[band*frame_len + i] + - data[band*frame_len*2 + i]; - } - for (i = 0; i < frame_len; i++) - { - overlap[band*frame_len + i] = - data[band*frame_len*2 + frame_len + i]; - } - } else { - uint8_t w; - for (w = 0; w < 8; w++) - { - uint16_t frame_len8 = frame_len/8; - uint16_t frame_len16 = frame_len/16; - - ssr_gc_function(ssr, &prev_fmd[band*frame_len*2 + w*frame_len*2/8], - gc_function, window_sequence, frame_len); - - for (i = 0; i < frame_len8*2; i++) - data[band*frame_len*2 + w*frame_len8*2+i] *= gc_function[i]; - for (i = 0; i < frame_len8; i++) - { - overlap[band*frame_len + i + 7*frame_len16 + w*frame_len8] += - data[band*frame_len*2 + 2*w*frame_len8 + i]; - } - for (i = 0; i < frame_len8; i++) - { - overlap[band*frame_len + i + 7*frame_len16 + (w+1)*frame_len8] = - data[band*frame_len*2 + 2*w*frame_len8 + frame_len8 + i]; - } - } - for (i = 0; i < frame_len; i++) - output[band*frame_len + i] = overlap[band*frame_len + i]; - for (i = 0; i < frame_len; i++) - overlap[band*frame_len + i] = overlap[band*frame_len + i + frame_len]; - } -} - -static void ssr_gc_function(ssr_info *ssr, real_t *prev_fmd, - real_t *gc_function, uint8_t window_sequence, - uint8_t band, uint16_t frame_len) -{ - uint16_t i; - uint16_t len_area1, len_area2; - int32_t aloc[10]; - real_t alev[10]; - - switch (window_sequence) - { - case ONLY_LONG_SEQUENCE: - len_area1 = frame_len/SSR_BANDS; - len_area2 = 0; - break; - case LONG_START_SEQUENCE: - len_area1 = (frame_len/SSR_BANDS)*7/32; - len_area2 = (frame_len/SSR_BANDS)/16; - break; - case EIGHT_SHORT_SEQUENCE: - len_area1 = (frame_len/8)/SSR_BANDS; - len_area2 = 0; - break; - case LONG_STOP_SEQUENCE: - len_area1 = (frame_len/SSR_BANDS); - len_area2 = 0; - break; - } - - /* decode bitstream information */ - - /* build array M */ - - - for (i = 0; i < frame_len*2; i++) - gc_function[i] = 1; -} - -#endif diff --git a/src/libfaad/ssr.h b/src/libfaad/ssr.h deleted file mode 100644 index d1defdc45..000000000 --- a/src/libfaad/ssr.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: ssr.h,v 1.6 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __SSR_H__ -#define __SSR_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define SSR_BANDS 4 -#define PQFTAPS 96 - -void ssr_decode(ssr_info *ssr, fb_info *fb, uint8_t window_sequence, - uint8_t window_shape, uint8_t window_shape_prev, - real_t *freq_in, real_t *time_out, real_t *overlap, - real_t ipqf_buffer[SSR_BANDS][96/4], - real_t *prev_fmd, uint16_t frame_len); - - -static void ssr_gain_control(ssr_info *ssr, real_t *data, real_t *output, - real_t *overlap, real_t *prev_fmd, uint8_t band, - uint8_t window_sequence, uint16_t frame_len); -static void ssr_gc_function(ssr_info *ssr, real_t *prev_fmd, - real_t *gc_function, uint8_t window_sequence, - uint16_t frame_len); - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/ssr_fb.c b/src/libfaad/ssr_fb.c deleted file mode 100644 index fb62c90c6..000000000 --- a/src/libfaad/ssr_fb.c +++ /dev/null @@ -1,182 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: ssr_fb.c,v 1.6 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#ifdef SSR_DEC - -#include <string.h> -#include <stdlib.h> -#include "syntax.h" -#include "filtbank.h" -#include "mdct.h" -#include "ssr_fb.h" -#include "ssr_win.h" - -fb_info *ssr_filter_bank_init(uint16_t frame_len) -{ - uint16_t nshort = frame_len/8; - - fb_info *fb = (fb_info*)faad_malloc(sizeof(fb_info)); - memset(fb, 0, sizeof(fb_info)); - - /* normal */ - fb->mdct256 = faad_mdct_init(2*nshort); - fb->mdct2048 = faad_mdct_init(2*frame_len); - - fb->long_window[0] = sine_long_256; - fb->short_window[0] = sine_short_32; - fb->long_window[1] = kbd_long_256; - fb->short_window[1] = kbd_short_32; - - return fb; -} - -void ssr_filter_bank_end(fb_info *fb) -{ - faad_mdct_end(fb->mdct256); - faad_mdct_end(fb->mdct2048); - - if (fb) faad_free(fb); -} - -static INLINE void imdct_ssr(fb_info *fb, real_t *in_data, - real_t *out_data, uint16_t len) -{ - mdct_info *mdct; - - switch (len) - { - case 512: - mdct = fb->mdct2048; - break; - case 64: - mdct = fb->mdct256; - break; - } - - faad_imdct(mdct, in_data, out_data); -} - -/* NON-overlapping inverse filterbank for use with SSR */ -void ssr_ifilter_bank(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, - uint8_t window_shape_prev, real_t *freq_in, - real_t *time_out, uint16_t frame_len) -{ - int16_t i; - real_t *transf_buf; - - real_t *window_long; - real_t *window_long_prev; - real_t *window_short; - real_t *window_short_prev; - - uint16_t nlong = frame_len; - uint16_t nshort = frame_len/8; - uint16_t trans = nshort/2; - - uint16_t nflat_ls = (nlong-nshort)/2; - - transf_buf = (real_t*)faad_malloc(2*nlong*sizeof(real_t)); - - window_long = fb->long_window[window_shape]; - window_long_prev = fb->long_window[window_shape_prev]; - window_short = fb->short_window[window_shape]; - window_short_prev = fb->short_window[window_shape_prev]; - - switch (window_sequence) - { - case ONLY_LONG_SEQUENCE: - imdct_ssr(fb, freq_in, transf_buf, 2*nlong); - for (i = nlong-1; i >= 0; i--) - { - time_out[i] = MUL_R_C(transf_buf[i],window_long_prev[i]); - time_out[nlong+i] = MUL_R_C(transf_buf[nlong+i],window_long[nlong-1-i]); - } - break; - - case LONG_START_SEQUENCE: - imdct_ssr(fb, freq_in, transf_buf, 2*nlong); - for (i = 0; i < nlong; i++) - time_out[i] = MUL_R_C(transf_buf[i],window_long_prev[i]); - for (i = 0; i < nflat_ls; i++) - time_out[nlong+i] = transf_buf[nlong+i]; - for (i = 0; i < nshort; i++) - time_out[nlong+nflat_ls+i] = MUL_R_C(transf_buf[nlong+nflat_ls+i],window_short[nshort-i-1]); - for (i = 0; i < nflat_ls; i++) - time_out[nlong+nflat_ls+nshort+i] = 0; - break; - - case EIGHT_SHORT_SEQUENCE: - imdct_ssr(fb, freq_in+0*nshort, transf_buf+2*nshort*0, 2*nshort); - imdct_ssr(fb, freq_in+1*nshort, transf_buf+2*nshort*1, 2*nshort); - imdct_ssr(fb, freq_in+2*nshort, transf_buf+2*nshort*2, 2*nshort); - imdct_ssr(fb, freq_in+3*nshort, transf_buf+2*nshort*3, 2*nshort); - imdct_ssr(fb, freq_in+4*nshort, transf_buf+2*nshort*4, 2*nshort); - imdct_ssr(fb, freq_in+5*nshort, transf_buf+2*nshort*5, 2*nshort); - imdct_ssr(fb, freq_in+6*nshort, transf_buf+2*nshort*6, 2*nshort); - imdct_ssr(fb, freq_in+7*nshort, transf_buf+2*nshort*7, 2*nshort); - for(i = nshort-1; i >= 0; i--) - { - time_out[i+0*nshort] = MUL_R_C(transf_buf[nshort*0+i],window_short_prev[i]); - time_out[i+1*nshort] = MUL_R_C(transf_buf[nshort*1+i],window_short[i]); - time_out[i+2*nshort] = MUL_R_C(transf_buf[nshort*2+i],window_short_prev[i]); - time_out[i+3*nshort] = MUL_R_C(transf_buf[nshort*3+i],window_short[i]); - time_out[i+4*nshort] = MUL_R_C(transf_buf[nshort*4+i],window_short_prev[i]); - time_out[i+5*nshort] = MUL_R_C(transf_buf[nshort*5+i],window_short[i]); - time_out[i+6*nshort] = MUL_R_C(transf_buf[nshort*6+i],window_short_prev[i]); - time_out[i+7*nshort] = MUL_R_C(transf_buf[nshort*7+i],window_short[i]); - time_out[i+8*nshort] = MUL_R_C(transf_buf[nshort*8+i],window_short_prev[i]); - time_out[i+9*nshort] = MUL_R_C(transf_buf[nshort*9+i],window_short[i]); - time_out[i+10*nshort] = MUL_R_C(transf_buf[nshort*10+i],window_short_prev[i]); - time_out[i+11*nshort] = MUL_R_C(transf_buf[nshort*11+i],window_short[i]); - time_out[i+12*nshort] = MUL_R_C(transf_buf[nshort*12+i],window_short_prev[i]); - time_out[i+13*nshort] = MUL_R_C(transf_buf[nshort*13+i],window_short[i]); - time_out[i+14*nshort] = MUL_R_C(transf_buf[nshort*14+i],window_short_prev[i]); - time_out[i+15*nshort] = MUL_R_C(transf_buf[nshort*15+i],window_short[i]); - } - break; - - case LONG_STOP_SEQUENCE: - imdct_ssr(fb, freq_in, transf_buf, 2*nlong); - for (i = 0; i < nflat_ls; i++) - time_out[i] = 0; - for (i = 0; i < nshort; i++) - time_out[nflat_ls+i] = MUL_R_C(transf_buf[nflat_ls+i],window_short_prev[i]); - for (i = 0; i < nflat_ls; i++) - time_out[nflat_ls+nshort+i] = transf_buf[nflat_ls+nshort+i]; - for (i = 0; i < nlong; i++) - time_out[nlong+i] = MUL_R_C(transf_buf[nlong+i],window_long[nlong-1-i]); - break; - } - - faad_free(transf_buf); -} - - -#endif diff --git a/src/libfaad/ssr_fb.h b/src/libfaad/ssr_fb.h deleted file mode 100644 index 739a4dfbb..000000000 --- a/src/libfaad/ssr_fb.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -** FAAD - Freeware Advanced Audio Decoder -** Copyright (C) 2002 M. Bakker -** -** 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: ssr_fb.h,v 1.5 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __SSR_FB_H__ -#define __SSR_FB_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -fb_info *ssr_filter_bank_init(uint16_t frame_len); -void ssr_filter_bank_end(fb_info *fb); - -/*non overlapping inverse filterbank */ -void ssr_ifilter_bank(fb_info *fb, - uint8_t window_sequence, - uint8_t window_shape, - uint8_t window_shape_prev, - real_t *freq_in, - real_t *time_out, - uint16_t frame_len); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/ssr_ipqf.c b/src/libfaad/ssr_ipqf.c deleted file mode 100644 index 3064285de..000000000 --- a/src/libfaad/ssr_ipqf.c +++ /dev/null @@ -1,188 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: ssr_ipqf.c,v 1.6 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#ifdef SSR_DEC - -#include "ssr.h" -#include "ssr_ipqf.h" - -static real_t **app_pqfbuf; -static real_t **pp_q0, **pp_t0, **pp_t1; - -void gc_set_protopqf(real_t *p_proto) -{ - int j; - static real_t a_half[48] = - { - 1.2206911375946939E-05, 1.7261986723798209E-05, 1.2300093657077942E-05, - -1.0833943097791965E-05, -5.7772498639901686E-05, -1.2764767618947719E-04, - -2.0965186675013334E-04, -2.8166673689263850E-04, -3.1234860429017460E-04, - -2.6738519958452353E-04, -1.1949424681824722E-04, 1.3965139412648678E-04, - 4.8864136409185725E-04, 8.7044629275148344E-04, 1.1949430269934793E-03, - 1.3519708175026700E-03, 1.2346314373964412E-03, 7.6953209114159191E-04, - -5.2242432579537141E-05, -1.1516092887213454E-03, -2.3538469841711277E-03, - -3.4033123072127277E-03, -4.0028551071986133E-03, -3.8745415659693259E-03, - -2.8321073426874310E-03, -8.5038892323704195E-04, 1.8856751185350931E-03, - 4.9688741735340923E-03, 7.8056704536795926E-03, 9.7027909685901654E-03, - 9.9960423120166159E-03, 8.2019366335594487E-03, 4.1642072876103365E-03, - -1.8364453822737758E-03, -9.0384863094167686E-03, -1.6241528177129844E-02, - -2.1939551286300665E-02, -2.4533179947088161E-02, -2.2591663337768787E-02, - -1.5122066420044672E-02, -1.7971713448186293E-03, 1.6903413428575379E-02, - 3.9672315874127042E-02, 6.4487527248102796E-02, 8.8850025474701726E-02, - 0.1101132906105560 , 0.1258540205143761 , 0.1342239368467012 - }; - - for (j = 0; j < 48; ++j) - { - p_proto[j] = p_proto[95-j] = a_half[j]; - } -} - -void gc_setcoef_eff_pqfsyn(int mm, - int kk, - real_t *p_proto, - real_t ***ppp_q0, - real_t ***ppp_t0, - real_t ***ppp_t1) -{ - int i, k, n; - real_t w; - - /* Set 1st Mul&Acc Coef's */ - *ppp_q0 = (real_t **) calloc(mm, sizeof(real_t *)); - for (n = 0; n < mm; ++n) - { - (*ppp_q0)[n] = (real_t *) calloc(mm, sizeof(real_t)); - } - for (n = 0; n < mm/2; ++n) - { - for (i = 0; i < mm; ++i) - { - w = (2*i+1)*(2*n+1-mm)*M_PI/(4*mm); - (*ppp_q0)[n][i] = 2.0 * cos((real_t) w); - - w = (2*i+1)*(2*(mm+n)+1-mm)*M_PI/(4*mm); - (*ppp_q0)[n + mm/2][i] = 2.0 * cos((real_t) w); - } - } - - /* Set 2nd Mul&Acc Coef's */ - *ppp_t0 = (real_t **) calloc(mm, sizeof(real_t *)); - *ppp_t1 = (real_t **) calloc(mm, sizeof(real_t *)); - for (n = 0; n < mm; ++n) - { - (*ppp_t0)[n] = (real_t *) calloc(kk, sizeof(real_t)); - (*ppp_t1)[n] = (real_t *) calloc(kk, sizeof(real_t)); - } - for (n = 0; n < mm; ++n) - { - for (k = 0; k < kk; ++k) - { - (*ppp_t0)[n][k] = mm * p_proto[2*k *mm + n]; - (*ppp_t1)[n][k] = mm * p_proto[(2*k+1)*mm + n]; - - if (k%2 != 0) - { - (*ppp_t0)[n][k] = -(*ppp_t0)[n][k]; - (*ppp_t1)[n][k] = -(*ppp_t1)[n][k]; - } - } - } -} - -void ssr_ipqf(ssr_info *ssr, real_t *in_data, real_t *out_data, - real_t buffer[SSR_BANDS][96/4], - uint16_t frame_len, uint8_t bands) -{ - static int initFlag = 0; - real_t a_pqfproto[PQFTAPS]; - - int i; - - if (initFlag == 0) - { - gc_set_protopqf(a_pqfproto); - gc_setcoef_eff_pqfsyn(SSR_BANDS, PQFTAPS/(2*SSR_BANDS), a_pqfproto, - &pp_q0, &pp_t0, &pp_t1); - initFlag = 1; - } - - for (i = 0; i < frame_len / SSR_BANDS; i++) - { - int l, n, k; - int mm = SSR_BANDS; - int kk = PQFTAPS/(2*SSR_BANDS); - - for (n = 0; n < mm; n++) - { - for (k = 0; k < 2*kk-1; k++) - { - buffer[n][k] = buffer[n][k+1]; - } - } - - for (n = 0; n < mm; n++) - { - real_t acc = 0.0; - for (l = 0; l < mm; l++) - { - acc += pp_q0[n][l] * in_data[l*frame_len/SSR_BANDS + i]; - } - buffer[n][2*kk-1] = acc; - } - - for (n = 0; n < mm/2; n++) - { - real_t acc = 0.0; - for (k = 0; k < kk; k++) - { - acc += pp_t0[n][k] * buffer[n][2*kk-1-2*k]; - } - for (k = 0; k < kk; ++k) - { - acc += pp_t1[n][k] * buffer[n + mm/2][2*kk-2-2*k]; - } - out_data[i*SSR_BANDS + n] = acc; - - acc = 0.0; - for (k = 0; k < kk; k++) - { - acc += pp_t0[mm-1-n][k] * buffer[n][2*kk-1-2*k]; - } - for (k = 0; k < kk; k++) - { - acc -= pp_t1[mm-1-n][k] * buffer[n + mm/2][2*kk-2-2*k]; - } - out_data[i*SSR_BANDS + mm-1-n] = acc; - } - } -} - -#endif diff --git a/src/libfaad/ssr_ipqf.h b/src/libfaad/ssr_ipqf.h deleted file mode 100644 index 360db978b..000000000 --- a/src/libfaad/ssr_ipqf.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -** FAAD - Freeware Advanced Audio Decoder -** Copyright (C) 2002 M. Bakker -** -** 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: ssr_ipqf.h,v 1.5 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __SSR_IPQF_H__ -#define __SSR_IPQF_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -void ssr_ipqf(ssr_info *ssr, real_t *in_data, real_t *out_data, - real_t buffer[SSR_BANDS][96/4], - uint16_t frame_len, uint8_t bands); - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/ssr_win.h b/src/libfaad/ssr_win.h deleted file mode 100644 index ddbb3086e..000000000 --- a/src/libfaad/ssr_win.h +++ /dev/null @@ -1,626 +0,0 @@ -/* -** FAAD - Freeware Advanced Audio Decoder -** Copyright (C) 2002 M. Bakker -** -** 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: ssr_win.h,v 1.5 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __SSR_WIN_H__ -#define __SSR_WIN_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _MSC_VER -#pragma warning(disable:4305) -#pragma warning(disable:4244) -#endif - -static real_t sine_short_32[] = { - 0.0245412290, - 0.0735645667, - 0.1224106774, - 0.1709618866, - 0.2191012502, - 0.2667127550, - 0.3136817515, - 0.3598950505, - 0.4052413106, - 0.4496113360, - 0.4928981960, - 0.5349976420, - 0.5758082271, - 0.6152316332, - 0.6531728506, - 0.6895405650, - 0.7242470980, - 0.7572088838, - 0.7883464694, - 0.8175848126, - 0.8448535800, - 0.8700870275, - 0.8932242990, - 0.9142097831, - 0.9329928160, - 0.9495282173, - 0.9637760520, - 0.9757021666, - 0.9852776527, - 0.9924795628, - 0.9972904325, - 0.9996988177 -}; - -static real_t sine_long_256[] = { - 0.0030679568, - 0.0092037553, - 0.0153392069, - 0.0214740802, - 0.0276081469, - 0.0337411724, - 0.0398729295, - 0.0460031852, - 0.0521317050, - 0.0582582653, - 0.0643826351, - 0.0705045760, - 0.0766238645, - 0.0827402696, - 0.0888535529, - 0.0949634984, - 0.1010698676, - 0.1071724296, - 0.1132709533, - 0.1193652153, - 0.1254549921, - 0.1315400302, - 0.1376201212, - 0.1436950415, - 0.1497645378, - 0.1558284014, - 0.1618863940, - 0.1679383069, - 0.1739838719, - 0.1800229102, - 0.1860551536, - 0.1920804083, - 0.1980984211, - 0.2041089684, - 0.2101118416, - 0.2161068022, - 0.2220936269, - 0.2280720919, - 0.2340419590, - 0.2400030345, - 0.2459550500, - 0.2518978119, - 0.2578310966, - 0.2637546957, - 0.2696683407, - 0.2755718231, - 0.2814649343, - 0.2873474658, - 0.2932191789, - 0.2990798354, - 0.3049292266, - 0.3107671738, - 0.3165933788, - 0.3224076927, - 0.3282098472, - 0.3339996636, - 0.3397769034, - 0.3455413282, - 0.3512927592, - 0.3570309579, - 0.3627557456, - 0.3684668541, - 0.3741640747, - 0.3798472285, - 0.3855160773, - 0.3911703825, - 0.3968099952, - 0.4024346471, - 0.4080441594, - 0.4136383235, - 0.4192169011, - 0.4247796834, - 0.4303264916, - 0.4358570874, - 0.4413712919, - 0.4468688369, - 0.4523496032, - 0.4578133225, - 0.4632597864, - 0.4686888456, - 0.4741002321, - 0.4794937670, - 0.4848692715, - 0.4902265072, - 0.4955652654, - 0.5008853674, - 0.5061866641, - 0.5114688873, - 0.5167317986, - 0.5219752789, - 0.5271991491, - 0.5324031115, - 0.5375871062, - 0.5427507758, - 0.5478940606, - 0.5530167222, - 0.5581185222, - 0.5631993413, - 0.5682589412, - 0.5732972026, - 0.5783138275, - 0.5833086967, - 0.5882815719, - 0.5932323337, - 0.5981607437, - 0.6030666232, - 0.6079497933, - 0.6128100753, - 0.6176473498, - 0.6224613190, - 0.6272518039, - 0.6320187449, - 0.6367619038, - 0.6414810419, - 0.6461760402, - 0.6508467197, - 0.6554928422, - 0.6601143479, - 0.6647109985, - 0.6692826152, - 0.6738290191, - 0.6783500314, - 0.6828455329, - 0.6873153448, - 0.6917592883, - 0.6961771250, - 0.7005687952, - 0.7049341202, - 0.7092728615, - 0.7135848999, - 0.7178700566, - 0.7221282125, - 0.7263591886, - 0.7305628061, - 0.7347388864, - 0.7388873696, - 0.7430079579, - 0.7471006513, - 0.7511651516, - 0.7552013993, - 0.7592092156, - 0.7631884217, - 0.7671388984, - 0.7710605264, - 0.7749531269, - 0.7788165212, - 0.7826505899, - 0.7864552140, - 0.7902302146, - 0.7939754725, - 0.7976908684, - 0.8013761640, - 0.8050313592, - 0.8086562157, - 0.8122506142, - 0.8158144355, - 0.8193475604, - 0.8228498101, - 0.8263210654, - 0.8297612667, - 0.8331701756, - 0.8365477324, - 0.8398938179, - 0.8432082534, - 0.8464909792, - 0.8497417569, - 0.8529606462, - 0.8561473489, - 0.8593018055, - 0.8624239564, - 0.8655136228, - 0.8685707450, - 0.8715950847, - 0.8745866418, - 0.8775452971, - 0.8804709315, - 0.8833633661, - 0.8862225413, - 0.8890483975, - 0.8918406963, - 0.8945994973, - 0.8973246217, - 0.9000158906, - 0.9026733041, - 0.9052967429, - 0.9078861475, - 0.9104412794, - 0.9129621983, - 0.9154487252, - 0.9179008007, - 0.9203183055, - 0.9227011204, - 0.9250492454, - 0.9273625612, - 0.9296408892, - 0.9318842888, - 0.9340925813, - 0.9362657070, - 0.9384035468, - 0.9405061007, - 0.9425731897, - 0.9446048737, - 0.9466009140, - 0.9485613704, - 0.9504860640, - 0.9523749948, - 0.9542281032, - 0.9560452700, - 0.9578264356, - 0.9595715404, - 0.9612805247, - 0.9629532695, - 0.9645897746, - 0.9661900401, - 0.9677538276, - 0.9692812562, - 0.9707721472, - 0.9722265005, - 0.9736442566, - 0.9750253558, - 0.9763697386, - 0.9776773453, - 0.9789481759, - 0.9801821709, - 0.9813792109, - 0.9825392962, - 0.9836624265, - 0.9847484827, - 0.9857975245, - 0.9868094325, - 0.9877841473, - 0.9887216687, - 0.9896219969, - 0.9904850721, - 0.9913108945, - 0.9920993447, - 0.9928504229, - 0.9935641289, - 0.9942404628, - 0.9948793054, - 0.9954807758, - 0.9960446954, - 0.9965711236, - 0.9970600605, - 0.9975114465, - 0.9979252815, - 0.9983015656, - 0.9986402392, - 0.9989413023, - 0.9992047548, - 0.9994305968, - 0.9996188283, - 0.9997693896, - 0.9998823404, - 0.9999576211, - 0.9999952912 -}; - -static real_t kbd_short_32[] = { - 0.0000875914060105, - 0.0009321760265333, - 0.0032114611466596, - 0.0081009893216786, - 0.0171240286619181, - 0.0320720743527833, - 0.0548307856028528, - 0.0871361822564870, - 0.1302923415174603, - 0.1848955425508276, - 0.2506163195331889, - 0.3260874142923209, - 0.4089316830907141, - 0.4959414909423747, - 0.5833939894958904, - 0.6674601983218376, - 0.7446454751465113, - 0.8121892962974020, - 0.8683559394406505, - 0.9125649996381605, - 0.9453396205809574, - 0.9680864942677585, - 0.9827581789763112, - 0.9914756203467121, - 0.9961964092194694, - 0.9984956609571091, - 0.9994855586984285, - 0.9998533730714648, - 0.9999671864476404, - 0.9999948432453556, - 0.9999995655238333, - 0.9999999961638728 -}; - - -static real_t kbd_long_256[] = { - 0.0005851230124487, - 0.0009642149851497, - 0.0013558207534965, - 0.0017771849644394, - 0.0022352533849672, - 0.0027342299070304, - 0.0032773001022195, - 0.0038671998069216, - 0.0045064443384152, - 0.0051974336885144, - 0.0059425050016407, - 0.0067439602523141, - 0.0076040812644888, - 0.0085251378135895, - 0.0095093917383048, - 0.0105590986429280, - 0.0116765080854300, - 0.0128638627792770, - 0.0141233971318631, - 0.0154573353235409, - 0.0168678890600951, - 0.0183572550877256, - 0.0199276125319803, - 0.0215811201042484, - 0.0233199132076965, - 0.0251461009666641, - 0.0270617631981826, - 0.0290689473405856, - 0.0311696653515848, - 0.0333658905863535, - 0.0356595546648444, - 0.0380525443366107, - 0.0405466983507029, - 0.0431438043376910, - 0.0458455957104702, - 0.0486537485902075, - 0.0515698787635492, - 0.0545955386770205, - 0.0577322144743916, - 0.0609813230826460, - 0.0643442093520723, - 0.0678221432558827, - 0.0714163171546603, - 0.0751278431308314, - 0.0789577503982528, - 0.0829069827918993, - 0.0869763963425241, - 0.0911667569410503, - 0.0954787380973307, - 0.0999129187977865, - 0.1044697814663005, - 0.1091497100326053, - 0.1139529881122542, - 0.1188797973021148, - 0.1239302155951605, - 0.1291042159181728, - 0.1344016647957880, - 0.1398223211441467, - 0.1453658351972151, - 0.1510317475686540, - 0.1568194884519144, - 0.1627283769610327, - 0.1687576206143887, - 0.1749063149634756, - 0.1811734433685097, - 0.1875578769224857, - 0.1940583745250518, - 0.2006735831073503, - 0.2074020380087318, - 0.2142421635060113, - 0.2211922734956977, - 0.2282505723293797, - 0.2354151558022098, - 0.2426840122941792, - 0.2500550240636293, - 0.2575259686921987, - 0.2650945206801527, - 0.2727582531907993, - 0.2805146399424422, - 0.2883610572460804, - 0.2962947861868143, - 0.3043130149466800, - 0.3124128412663888, - 0.3205912750432127, - 0.3288452410620226, - 0.3371715818562547, - 0.3455670606953511, - 0.3540283646950029, - 0.3625521080463003, - 0.3711348353596863, - 0.3797730251194006, - 0.3884630932439016, - 0.3972013967475546, - 0.4059842374986933, - 0.4148078660689724, - 0.4236684856687616, - 0.4325622561631607, - 0.4414852981630577, - 0.4504336971855032, - 0.4594035078775303, - 0.4683907582974173, - 0.4773914542472655, - 0.4864015836506502, - 0.4954171209689973, - 0.5044340316502417, - 0.5134482766032377, - 0.5224558166913167, - 0.5314526172383208, - 0.5404346525403849, - 0.5493979103766972, - 0.5583383965124314, - 0.5672521391870222, - 0.5761351935809411, - 0.5849836462541291, - 0.5937936195492526, - 0.6025612759529649, - 0.6112828224083939, - 0.6199545145721097, - 0.6285726610088878, - 0.6371336273176413, - 0.6456338401819751, - 0.6540697913388968, - 0.6624380414593221, - 0.6707352239341151, - 0.6789580485595255, - 0.6871033051160131, - 0.6951678668345944, - 0.7031486937449871, - 0.7110428359000029, - 0.7188474364707993, - 0.7265597347077880, - 0.7341770687621900, - 0.7416968783634273, - 0.7491167073477523, - 0.7564342060337386, - 0.7636471334404891, - 0.7707533593446514, - 0.7777508661725849, - 0.7846377507242818, - 0.7914122257259034, - 0.7980726212080798, - 0.8046173857073919, - 0.8110450872887550, - 0.8173544143867162, - 0.8235441764639875, - 0.8296133044858474, - 0.8355608512093652, - 0.8413859912867303, - 0.8470880211822968, - 0.8526663589032990, - 0.8581205435445334, - 0.8634502346476508, - 0.8686552113760616, - 0.8737353715068081, - 0.8786907302411250, - 0.8835214188357692, - 0.8882276830575707, - 0.8928098814640207, - 0.8972684835130879, - 0.9016040675058185, - 0.9058173183656508, - 0.9099090252587376, - 0.9138800790599416, - 0.9177314696695282, - 0.9214642831859411, - 0.9250796989403991, - 0.9285789863994010, - 0.9319635019415643, - 0.9352346855155568, - 0.9383940571861993, - 0.9414432135761304, - 0.9443838242107182, - 0.9472176277741918, - 0.9499464282852282, - 0.9525720912004834, - 0.9550965394547873, - 0.9575217494469370, - 0.9598497469802043, - 0.9620826031668507, - 0.9642224303060783, - 0.9662713777449607, - 0.9682316277319895, - 0.9701053912729269, - 0.9718949039986892, - 0.9736024220549734, - 0.9752302180233160, - 0.9767805768831932, - 0.9782557920246753, - 0.9796581613210076, - 0.9809899832703159, - 0.9822535532154261, - 0.9834511596505429, - 0.9845850806232530, - 0.9856575802399989, - 0.9866709052828243, - 0.9876272819448033, - 0.9885289126911557, - 0.9893779732525968, - 0.9901766097569984, - 0.9909269360049311, - 0.9916310308941294, - 0.9922909359973702, - 0.9929086532976777, - 0.9934861430841844, - 0.9940253220113651, - 0.9945280613237534, - 0.9949961852476154, - 0.9954314695504363, - 0.9958356402684387, - 0.9962103726017252, - 0.9965572899760172, - 0.9968779632693499, - 0.9971739102014799, - 0.9974465948831872, - 0.9976974275220812, - 0.9979277642809907, - 0.9981389072844972, - 0.9983321047686901, - 0.9985085513687731, - 0.9986693885387259, - 0.9988157050968516, - 0.9989485378906924, - 0.9990688725744943, - 0.9991776444921379, - 0.9992757396582338, - 0.9993639958299003, - 0.9994432036616085, - 0.9995141079353859, - 0.9995774088586188, - 0.9996337634216871, - 0.9996837868076957, - 0.9997280538466377, - 0.9997671005064359, - 0.9998014254134544, - 0.9998314913952471, - 0.9998577270385304, - 0.9998805282555989, - 0.9999002598526793, - 0.9999172570940037, - 0.9999318272557038, - 0.9999442511639580, - 0.9999547847121726, - 0.9999636603523446, - 0.9999710885561258, - 0.9999772592414866, - 0.9999823431612708, - 0.9999864932503106, - 0.9999898459281599, - 0.9999925223548691, - 0.9999946296375997, - 0.9999962619864214, - 0.9999975018180320, - 0.9999984208055542, - 0.9999990808746198, - 0.9999995351446231, - 0.9999998288155155 -}; - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/structs.h b/src/libfaad/structs.h deleted file mode 100644 index db6361a5c..000000000 --- a/src/libfaad/structs.h +++ /dev/null @@ -1,473 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: structs.h,v 1.7 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __STRUCTS_H__ -#define __STRUCTS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "cfft.h" -#ifdef SBR_DEC -#include "sbr_dec.h" -#endif - -#define MAX_CHANNELS 64 -#define MAX_SYNTAX_ELEMENTS 48 -#define MAX_WINDOW_GROUPS 8 -#define MAX_SFB 51 -#define MAX_LTP_SFB 40 -#define MAX_LTP_SFB_S 8 - -/* used to save the prediction state */ -typedef struct { - int16_t r[2]; - int16_t COR[2]; - int16_t VAR[2]; -} pred_state; - -typedef struct { - uint16_t N; - cfft_info *cfft; - complex_t *sincos; -#ifdef PROFILE - int64_t cycles; - int64_t fft_cycles; -#endif -} mdct_info; - -typedef struct -{ - const real_t *long_window[2]; - const real_t *short_window[2]; -#ifdef LD_DEC - const real_t *ld_window[2]; -#endif - - mdct_info *mdct256; -#ifdef LD_DEC - mdct_info *mdct1024; -#endif - mdct_info *mdct2048; -#ifdef PROFILE - int64_t cycles; -#endif -} fb_info; - -typedef struct -{ - uint8_t present; - - uint8_t num_bands; - uint8_t pce_instance_tag; - uint8_t excluded_chns_present; - uint8_t band_top[17]; - uint8_t prog_ref_level; - uint8_t dyn_rng_sgn[17]; - uint8_t dyn_rng_ctl[17]; - uint8_t exclude_mask[MAX_CHANNELS]; - uint8_t additional_excluded_chns[MAX_CHANNELS]; - - real_t ctrl1; - real_t ctrl2; -} drc_info; - -typedef struct -{ - uint8_t element_instance_tag; - uint8_t object_type; - uint8_t sf_index; - uint8_t num_front_channel_elements; - uint8_t num_side_channel_elements; - uint8_t num_back_channel_elements; - uint8_t num_lfe_channel_elements; - uint8_t num_assoc_data_elements; - uint8_t num_valid_cc_elements; - uint8_t mono_mixdown_present; - uint8_t mono_mixdown_element_number; - uint8_t stereo_mixdown_present; - uint8_t stereo_mixdown_element_number; - uint8_t matrix_mixdown_idx_present; - uint8_t pseudo_surround_enable; - uint8_t matrix_mixdown_idx; - uint8_t front_element_is_cpe[16]; - uint8_t front_element_tag_select[16]; - uint8_t side_element_is_cpe[16]; - uint8_t side_element_tag_select[16]; - uint8_t back_element_is_cpe[16]; - uint8_t back_element_tag_select[16]; - uint8_t lfe_element_tag_select[16]; - uint8_t assoc_data_element_tag_select[16]; - uint8_t cc_element_is_ind_sw[16]; - uint8_t valid_cc_element_tag_select[16]; - - uint8_t channels; - - uint8_t comment_field_bytes; - uint8_t comment_field_data[257]; - - /* extra added values */ - uint8_t num_front_channels; - uint8_t num_side_channels; - uint8_t num_back_channels; - uint8_t num_lfe_channels; - uint8_t sce_channel[16]; - uint8_t cpe_channel[16]; -} program_config; - -typedef struct -{ - uint16_t syncword; - uint8_t id; - uint8_t layer; - uint8_t protection_absent; - uint8_t profile; - uint8_t sf_index; - uint8_t private_bit; - uint8_t channel_configuration; - uint8_t original; - uint8_t home; - uint8_t emphasis; - uint8_t copyright_identification_bit; - uint8_t copyright_identification_start; - uint16_t aac_frame_length; - uint16_t adts_buffer_fullness; - uint8_t no_raw_data_blocks_in_frame; - uint16_t crc_check; - - /* control param */ - uint8_t old_format; -} adts_header; - -typedef struct -{ - uint8_t copyright_id_present; - int8_t copyright_id[10]; - uint8_t original_copy; - uint8_t home; - uint8_t bitstream_type; - uint32_t bitrate; - uint8_t num_program_config_elements; - uint32_t adif_buffer_fullness; - - /* maximum of 16 PCEs */ - program_config pce[16]; -} adif_header; - -#ifdef LTP_DEC -typedef struct -{ - uint8_t last_band; - uint8_t data_present; - uint16_t lag; - uint8_t lag_update; - uint8_t coef; - uint8_t long_used[MAX_SFB]; - uint8_t short_used[8]; - uint8_t short_lag_present[8]; - uint8_t short_lag[8]; -} ltp_info; -#endif - -#ifdef MAIN_DEC -typedef struct -{ - uint8_t limit; - uint8_t predictor_reset; - uint8_t predictor_reset_group_number; - uint8_t prediction_used[MAX_SFB]; -} pred_info; -#endif - -typedef struct -{ - uint8_t number_pulse; - uint8_t pulse_start_sfb; - uint8_t pulse_offset[4]; - uint8_t pulse_amp[4]; -} pulse_info; - -typedef struct -{ - uint8_t n_filt[8]; - uint8_t coef_res[8]; - uint8_t length[8][4]; - uint8_t order[8][4]; - uint8_t direction[8][4]; - uint8_t coef_compress[8][4]; - uint8_t coef[8][4][32]; -} tns_info; - -#ifdef SSR_DEC -typedef struct -{ - uint8_t max_band; - - uint8_t adjust_num[4][8]; - uint8_t alevcode[4][8][8]; - uint8_t aloccode[4][8][8]; -} ssr_info; -#endif - -typedef struct -{ - uint8_t max_sfb; - - uint8_t num_swb; - uint8_t num_window_groups; - uint8_t num_windows; - uint8_t window_sequence; - uint8_t window_group_length[8]; - uint8_t window_shape; - uint8_t scale_factor_grouping; - uint16_t sect_sfb_offset[8][15*8]; - uint16_t swb_offset[52]; - - uint8_t sect_cb[8][15*8]; - uint16_t sect_start[8][15*8]; - uint16_t sect_end[8][15*8]; - uint8_t sfb_cb[8][8*15]; - uint8_t num_sec[8]; /* number of sections in a group */ - - uint8_t global_gain; - int16_t scale_factors[8][51]; /* [0..255] */ - - uint8_t ms_mask_present; - uint8_t ms_used[MAX_WINDOW_GROUPS][MAX_SFB]; - - uint8_t noise_used; - - uint8_t pulse_data_present; - uint8_t tns_data_present; - uint8_t gain_control_data_present; - uint8_t predictor_data_present; - - pulse_info pul; - tns_info tns; -#ifdef MAIN_DEC - pred_info pred; -#endif -#ifdef LTP_DEC - ltp_info ltp; - ltp_info ltp2; -#endif -#ifdef SSR_DEC - ssr_info ssr; -#endif - -#ifdef ERROR_RESILIENCE - /* ER HCR data */ - uint16_t length_of_reordered_spectral_data; - uint8_t length_of_longest_codeword; - /* ER RLVC data */ - uint8_t sf_concealment; - uint8_t rev_global_gain; - uint16_t length_of_rvlc_sf; - uint16_t dpcm_noise_nrg; - uint8_t sf_escapes_present; - uint8_t length_of_rvlc_escapes; - uint16_t dpcm_noise_last_position; -#endif -} ic_stream; /* individual channel stream */ - -typedef struct -{ - uint8_t channel; - int16_t paired_channel; - - uint8_t element_instance_tag; - uint8_t common_window; - - ic_stream ics1; - ic_stream ics2; -} element; /* syntax element (SCE, CPE, LFE) */ - -typedef struct mp4AudioSpecificConfig -{ - /* Audio Specific Info */ - /*uint8_t*/ unsigned char objectTypeIndex; - /*uint8_t*/ unsigned char samplingFrequencyIndex; - /*uint32_t*/ unsigned long samplingFrequency; - /*uint8_t*/ unsigned char channelsConfiguration; - - /* GA Specific Info */ - /*uint8_t*/ unsigned char frameLengthFlag; - /*uint8_t*/ unsigned char dependsOnCoreCoder; - /*uint16_t*/ unsigned short coreCoderDelay; - /*uint8_t*/ unsigned char extensionFlag; - /*uint8_t*/ unsigned char aacSectionDataResilienceFlag; - /*uint8_t*/ unsigned char aacScalefactorDataResilienceFlag; - /*uint8_t*/ unsigned char aacSpectralDataResilienceFlag; - /*uint8_t*/ unsigned char epConfig; - - /*uint8_t*/ char sbr_present_flag; - /*uint8_t*/ char forceUpSampling; - /*uint8_t*/ char downSampledSBR; -} mp4AudioSpecificConfig; - -typedef struct NeAACDecConfiguration -{ - /*uint8_t*/ unsigned char defObjectType; - /*uint32_t*/ unsigned long defSampleRate; - /*uint8_t*/ unsigned char outputFormat; - /*uint8_t*/ unsigned char downMatrix; - /*uint8_t*/ unsigned char useOldADTSFormat; - /*uint8_t*/ unsigned char dontUpSampleImplicitSBR; -} NeAACDecConfiguration, *NeAACDecConfigurationPtr; - -typedef struct NeAACDecFrameInfo -{ - /*uint32_t*/ unsigned long bytesconsumed; - /*uint32_t*/ unsigned long samples; - /*uint8_t*/ unsigned char channels; - /*uint8_t*/ unsigned char error; - /*uint32_t*/ unsigned long samplerate; - - /* SBR: 0: off, 1: on; normal, 2: on; downsampled */ - /*uint8_t*/ unsigned char sbr; - - /* MPEG-4 ObjectType */ - /*uint8_t*/ unsigned char object_type; - - /* AAC header type; MP4 will be signalled as RAW also */ - /*uint8_t*/ unsigned char header_type; - - /* multichannel configuration */ - /*uint8_t*/ unsigned char num_front_channels; - /*uint8_t*/ unsigned char num_side_channels; - /*uint8_t*/ unsigned char num_back_channels; - /*uint8_t*/ unsigned char num_lfe_channels; - /*uint8_t*/ unsigned char channel_position[MAX_CHANNELS]; - - /* PS: 0: off, 1: on */ - /*uint8_t*/ unsigned char ps; -} NeAACDecFrameInfo; - -typedef struct -{ - uint8_t adts_header_present; - uint8_t adif_header_present; - uint8_t sf_index; - uint8_t object_type; - uint8_t channelConfiguration; -#ifdef ERROR_RESILIENCE - uint8_t aacSectionDataResilienceFlag; - uint8_t aacScalefactorDataResilienceFlag; - uint8_t aacSpectralDataResilienceFlag; -#endif - uint16_t frameLength; - uint8_t postSeekResetFlag; - - uint32_t frame; - - uint8_t downMatrix; - uint8_t upMatrix; - uint8_t first_syn_ele; - uint8_t has_lfe; - /* number of channels in current frame */ - uint8_t fr_channels; - /* number of elements in current frame */ - uint8_t fr_ch_ele; - - /* element_output_channels: - determines the number of channels the element will output - */ - uint8_t element_output_channels[MAX_SYNTAX_ELEMENTS]; - /* element_alloced: - determines whether the data needed for the element is allocated or not - */ - uint8_t element_alloced[MAX_SYNTAX_ELEMENTS]; - /* alloced_channels: - determines the number of channels where output data is allocated for - */ - uint8_t alloced_channels; - - /* output data buffer */ - void *sample_buffer; - - uint8_t window_shape_prev[MAX_CHANNELS]; -#ifdef LTP_DEC - uint16_t ltp_lag[MAX_CHANNELS]; -#endif - fb_info *fb; - drc_info *drc; - - real_t *time_out[MAX_CHANNELS]; - real_t *fb_intermed[MAX_CHANNELS]; - -#ifdef SBR_DEC - int8_t sbr_present_flag; - int8_t forceUpSampling; - int8_t downSampledSBR; - /* determines whether SBR data is allocated for the gives element */ - uint8_t sbr_alloced[MAX_SYNTAX_ELEMENTS]; - - sbr_info *sbr[MAX_SYNTAX_ELEMENTS]; -#endif -#if (defined(PS_DEC) || defined(DRM_PS)) - uint8_t ps_used[MAX_SYNTAX_ELEMENTS]; - uint8_t ps_used_global; -#endif - -#ifdef SSR_DEC - real_t *ssr_overlap[MAX_CHANNELS]; - real_t *prev_fmd[MAX_CHANNELS]; - real_t ipqf_buffer[MAX_CHANNELS][4][96/4]; -#endif - -#ifdef MAIN_DEC - pred_state *pred_stat[MAX_CHANNELS]; -#endif -#ifdef LTP_DEC - int16_t *lt_pred_stat[MAX_CHANNELS]; -#endif - - /* Program Config Element */ - uint8_t pce_set; - program_config pce; - uint8_t element_id[MAX_CHANNELS]; - uint8_t internal_channel[MAX_CHANNELS]; - - /* Configuration data */ - NeAACDecConfiguration config; - -#ifdef PROFILE - int64_t cycles; - int64_t spectral_cycles; - int64_t output_cycles; - int64_t scalefac_cycles; - int64_t requant_cycles; -#endif -} NeAACDecStruct, *NeAACDecHandle; - - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/syntax.c b/src/libfaad/syntax.c deleted file mode 100644 index 6dc9fc57d..000000000 --- a/src/libfaad/syntax.c +++ /dev/null @@ -1,2330 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: syntax.c,v 1.10 2006/09/26 17:48:24 dgp85 Exp $ -**/ - -/* - Reads the AAC bitstream as defined in 14496-3 (MPEG-4 Audio) -*/ - -#include "common.h" -#include "structs.h" - -#include <stdlib.h> -#include <string.h> - -#include "decoder.h" -#include "syntax.h" -#include "specrec.h" -#include "huffman.h" -#include "bits.h" -#include "pulse.h" -#include "analysis.h" -#include "drc.h" -#ifdef ERROR_RESILIENCE -#include "rvlc.h" -#endif -#ifdef SBR_DEC -#include "sbr_syntax.h" -#endif - - -/* static function declarations */ -static void decode_sce_lfe(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, - uint8_t id_syn_ele); -static void decode_cpe(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, - uint8_t id_syn_ele); -static uint8_t single_lfe_channel_element(NeAACDecHandle hDecoder, bitfile *ld, - uint8_t channel, uint8_t *tag); -static uint8_t channel_pair_element(NeAACDecHandle hDecoder, bitfile *ld, - uint8_t channel, uint8_t *tag); -#ifdef COUPLING_DEC -static uint8_t coupling_channel_element(NeAACDecHandle hDecoder, bitfile *ld); -#endif -static uint16_t data_stream_element(NeAACDecHandle hDecoder, bitfile *ld); -static uint8_t program_config_element(program_config *pce, bitfile *ld); -static uint8_t fill_element(NeAACDecHandle hDecoder, bitfile *ld, drc_info *drc -#ifdef SBR_DEC - ,uint8_t sbr_ele -#endif - ); -static uint8_t individual_channel_stream(NeAACDecHandle hDecoder, element *ele, - bitfile *ld, ic_stream *ics, uint8_t scal_flag, - int16_t *spec_data); -static uint8_t ics_info(NeAACDecHandle hDecoder, ic_stream *ics, bitfile *ld, - uint8_t common_window); -static uint8_t section_data(NeAACDecHandle hDecoder, ic_stream *ics, bitfile *ld); -static uint8_t scale_factor_data(NeAACDecHandle hDecoder, ic_stream *ics, bitfile *ld); -#ifdef SSR_DEC -static void gain_control_data(bitfile *ld, ic_stream *ics); -#endif -static uint8_t spectral_data(NeAACDecHandle hDecoder, ic_stream *ics, bitfile *ld, - int16_t *spectral_data); -static uint16_t extension_payload(bitfile *ld, drc_info *drc, uint16_t count); -static uint8_t pulse_data(ic_stream *ics, pulse_info *pul, bitfile *ld); -static void tns_data(ic_stream *ics, tns_info *tns, bitfile *ld); -#ifdef LTP_DEC -static uint8_t ltp_data(NeAACDecHandle hDecoder, ic_stream *ics, ltp_info *ltp, bitfile *ld); -#endif -static uint8_t adts_fixed_header(adts_header *adts, bitfile *ld); -static void adts_variable_header(adts_header *adts, bitfile *ld); -static void adts_error_check(adts_header *adts, bitfile *ld); -static uint8_t dynamic_range_info(bitfile *ld, drc_info *drc); -static uint8_t excluded_channels(bitfile *ld, drc_info *drc); -#ifdef SCALABLE_DEC -static int8_t aac_scalable_main_header(NeAACDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2, - bitfile *ld, uint8_t this_layer_stereo); -#endif - - -/* Table 4.4.1 */ -int8_t GASpecificConfig(bitfile *ld, mp4AudioSpecificConfig *mp4ASC, - program_config *pce_out) -{ - program_config pce; - - /* 1024 or 960 */ - mp4ASC->frameLengthFlag = faad_get1bit(ld - DEBUGVAR(1,138,"GASpecificConfig(): FrameLengthFlag")); -#ifndef ALLOW_SMALL_FRAMELENGTH - if (mp4ASC->frameLengthFlag == 1) - return -3; -#endif - - mp4ASC->dependsOnCoreCoder = faad_get1bit(ld - DEBUGVAR(1,139,"GASpecificConfig(): DependsOnCoreCoder")); - if (mp4ASC->dependsOnCoreCoder == 1) - { - mp4ASC->coreCoderDelay = (uint16_t)faad_getbits(ld, 14 - DEBUGVAR(1,140,"GASpecificConfig(): CoreCoderDelay")); - } - - mp4ASC->extensionFlag = faad_get1bit(ld DEBUGVAR(1,141,"GASpecificConfig(): ExtensionFlag")); - if (mp4ASC->channelsConfiguration == 0) - { - if (program_config_element(&pce, ld)) - return -3; - //mp4ASC->channelsConfiguration = pce.channels; - - if (pce_out != NULL) - memcpy(pce_out, &pce, sizeof(program_config)); - - /* - if (pce.num_valid_cc_elements) - return -3; - */ - } - -#ifdef ERROR_RESILIENCE - if (mp4ASC->extensionFlag == 1) - { - /* Error resilience not supported yet */ - if (mp4ASC->objectTypeIndex >= ER_OBJECT_START) - { - mp4ASC->aacSectionDataResilienceFlag = faad_get1bit(ld - DEBUGVAR(1,144,"GASpecificConfig(): aacSectionDataResilienceFlag")); - mp4ASC->aacScalefactorDataResilienceFlag = faad_get1bit(ld - DEBUGVAR(1,145,"GASpecificConfig(): aacScalefactorDataResilienceFlag")); - mp4ASC->aacSpectralDataResilienceFlag = faad_get1bit(ld - DEBUGVAR(1,146,"GASpecificConfig(): aacSpectralDataResilienceFlag")); - - /* 1 bit: extensionFlag3 */ - } - } -#endif - - return 0; -} - -/* Table 4.4.2 */ -/* An MPEG-4 Audio decoder is only required to follow the Program - Configuration Element in GASpecificConfig(). The decoder shall ignore - any Program Configuration Elements that may occur in raw data blocks. - PCEs transmitted in raw data blocks cannot be used to convey decoder - configuration information. -*/ -static uint8_t program_config_element(program_config *pce, bitfile *ld) -{ - uint8_t i; - - memset(pce, 0, sizeof(program_config)); - - pce->channels = 0; - - pce->element_instance_tag = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,10,"program_config_element(): element_instance_tag")); - - pce->object_type = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,11,"program_config_element(): object_type")); - pce->sf_index = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,12,"program_config_element(): sf_index")); - pce->num_front_channel_elements = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,13,"program_config_element(): num_front_channel_elements")); - pce->num_side_channel_elements = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,14,"program_config_element(): num_side_channel_elements")); - pce->num_back_channel_elements = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,15,"program_config_element(): num_back_channel_elements")); - pce->num_lfe_channel_elements = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,16,"program_config_element(): num_lfe_channel_elements")); - pce->num_assoc_data_elements = (uint8_t)faad_getbits(ld, 3 - DEBUGVAR(1,17,"program_config_element(): num_assoc_data_elements")); - pce->num_valid_cc_elements = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,18,"program_config_element(): num_valid_cc_elements")); - - pce->mono_mixdown_present = faad_get1bit(ld - DEBUGVAR(1,19,"program_config_element(): mono_mixdown_present")); - if (pce->mono_mixdown_present == 1) - { - pce->mono_mixdown_element_number = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,20,"program_config_element(): mono_mixdown_element_number")); - } - - pce->stereo_mixdown_present = faad_get1bit(ld - DEBUGVAR(1,21,"program_config_element(): stereo_mixdown_present")); - if (pce->stereo_mixdown_present == 1) - { - pce->stereo_mixdown_element_number = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,22,"program_config_element(): stereo_mixdown_element_number")); - } - - pce->matrix_mixdown_idx_present = faad_get1bit(ld - DEBUGVAR(1,23,"program_config_element(): matrix_mixdown_idx_present")); - if (pce->matrix_mixdown_idx_present == 1) - { - pce->matrix_mixdown_idx = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,24,"program_config_element(): matrix_mixdown_idx")); - pce->pseudo_surround_enable = faad_get1bit(ld - DEBUGVAR(1,25,"program_config_element(): pseudo_surround_enable")); - } - - for (i = 0; i < pce->num_front_channel_elements; i++) - { - pce->front_element_is_cpe[i] = faad_get1bit(ld - DEBUGVAR(1,26,"program_config_element(): front_element_is_cpe")); - pce->front_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,27,"program_config_element(): front_element_tag_select")); - - if (pce->front_element_is_cpe[i] & 1) - { - pce->cpe_channel[pce->front_element_tag_select[i]] = pce->channels; - pce->num_front_channels += 2; - pce->channels += 2; - } else { - pce->sce_channel[pce->front_element_tag_select[i]] = pce->channels; - pce->num_front_channels++; - pce->channels++; - } - } - - for (i = 0; i < pce->num_side_channel_elements; i++) - { - pce->side_element_is_cpe[i] = faad_get1bit(ld - DEBUGVAR(1,28,"program_config_element(): side_element_is_cpe")); - pce->side_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,29,"program_config_element(): side_element_tag_select")); - - if (pce->side_element_is_cpe[i] & 1) - { - pce->cpe_channel[pce->side_element_tag_select[i]] = pce->channels; - pce->num_side_channels += 2; - pce->channels += 2; - } else { - pce->sce_channel[pce->side_element_tag_select[i]] = pce->channels; - pce->num_side_channels++; - pce->channels++; - } - } - - for (i = 0; i < pce->num_back_channel_elements; i++) - { - pce->back_element_is_cpe[i] = faad_get1bit(ld - DEBUGVAR(1,30,"program_config_element(): back_element_is_cpe")); - pce->back_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,31,"program_config_element(): back_element_tag_select")); - - if (pce->back_element_is_cpe[i] & 1) - { - pce->cpe_channel[pce->back_element_tag_select[i]] = pce->channels; - pce->channels += 2; - pce->num_back_channels += 2; - } else { - pce->sce_channel[pce->back_element_tag_select[i]] = pce->channels; - pce->num_back_channels++; - pce->channels++; - } - } - - for (i = 0; i < pce->num_lfe_channel_elements; i++) - { - pce->lfe_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,32,"program_config_element(): lfe_element_tag_select")); - - pce->sce_channel[pce->lfe_element_tag_select[i]] = pce->channels; - pce->num_lfe_channels++; - pce->channels++; - } - - for (i = 0; i < pce->num_assoc_data_elements; i++) - pce->assoc_data_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,33,"program_config_element(): assoc_data_element_tag_select")); - - for (i = 0; i < pce->num_valid_cc_elements; i++) - { - pce->cc_element_is_ind_sw[i] = faad_get1bit(ld - DEBUGVAR(1,34,"program_config_element(): cc_element_is_ind_sw")); - pce->valid_cc_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,35,"program_config_element(): valid_cc_element_tag_select")); - } - - faad_byte_align(ld); - - pce->comment_field_bytes = (uint8_t)faad_getbits(ld, 8 - DEBUGVAR(1,36,"program_config_element(): comment_field_bytes")); - - for (i = 0; i < pce->comment_field_bytes; i++) - { - pce->comment_field_data[i] = (uint8_t)faad_getbits(ld, 8 - DEBUGVAR(1,37,"program_config_element(): comment_field_data")); - } - pce->comment_field_data[i] = 0; - - if (pce->channels > MAX_CHANNELS) - return 22; - - return 0; -} - -static void decode_sce_lfe(NeAACDecHandle hDecoder, - NeAACDecFrameInfo *hInfo, bitfile *ld, - uint8_t id_syn_ele) -{ - uint8_t channels = hDecoder->fr_channels; - uint8_t tag = 0; - - if (channels+1 >= MAX_CHANNELS) - { - hInfo->error = 12; - return; - } - if (hDecoder->fr_ch_ele+1 > MAX_SYNTAX_ELEMENTS) - { - hInfo->error = 13; - return; - } - - /* for SCE hDecoder->element_output_channels[] is not set here because this - can become 2 when some form of Parametric Stereo coding is used - */ - - /* save the syntax element id */ - hDecoder->element_id[hDecoder->fr_ch_ele] = id_syn_ele; - - /* decode the element */ - hInfo->error = single_lfe_channel_element(hDecoder, ld, channels, &tag); - - /* map output channels position to internal data channels */ - if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2) - { - /* this might be faulty when pce_set is true */ - hDecoder->internal_channel[channels] = channels; - hDecoder->internal_channel[channels+1] = channels+1; - } else { - if (hDecoder->pce_set) - hDecoder->internal_channel[hDecoder->pce.sce_channel[tag]] = channels; - else - hDecoder->internal_channel[channels] = channels; - } - - hDecoder->fr_channels += hDecoder->element_output_channels[hDecoder->fr_ch_ele]; - hDecoder->fr_ch_ele++; -} - -static void decode_cpe(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, - uint8_t id_syn_ele) -{ - uint8_t channels = hDecoder->fr_channels; - uint8_t tag = 0; - - if (channels+2 > MAX_CHANNELS) - { - hInfo->error = 12; - return; - } - if (hDecoder->fr_ch_ele+1 > MAX_SYNTAX_ELEMENTS) - { - hInfo->error = 13; - return; - } - - /* for CPE the number of output channels is always 2 */ - if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) - { - /* element_output_channels not set yet */ - hDecoder->element_output_channels[hDecoder->fr_ch_ele] = 2; - } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != 2) { - /* element inconsistency */ - hInfo->error = 21; - return; - } - - /* save the syntax element id */ - hDecoder->element_id[hDecoder->fr_ch_ele] = id_syn_ele; - - /* decode the element */ - hInfo->error = channel_pair_element(hDecoder, ld, channels, &tag); - - /* map output channel position to internal data channels */ - if (hDecoder->pce_set) - { - hDecoder->internal_channel[hDecoder->pce.cpe_channel[tag]] = channels; - hDecoder->internal_channel[hDecoder->pce.cpe_channel[tag]+1] = channels+1; - } else { - hDecoder->internal_channel[channels] = channels; - hDecoder->internal_channel[channels+1] = channels+1; - } - - hDecoder->fr_channels += 2; - hDecoder->fr_ch_ele++; -} - -void raw_data_block(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, - bitfile *ld, program_config *pce, drc_info *drc) -{ - uint8_t id_syn_ele; - - hDecoder->fr_channels = 0; - hDecoder->fr_ch_ele = 0; - hDecoder->first_syn_ele = 25; - hDecoder->has_lfe = 0; - -#ifdef ERROR_RESILIENCE - if (hDecoder->object_type < ER_OBJECT_START) - { -#endif - /* Table 4.4.3: raw_data_block() */ - while ((id_syn_ele = (uint8_t)faad_getbits(ld, LEN_SE_ID - DEBUGVAR(1,4,"NeAACDecDecode(): id_syn_ele"))) != ID_END) - { - switch (id_syn_ele) { - case ID_SCE: - if (hDecoder->first_syn_ele == 25) hDecoder->first_syn_ele = id_syn_ele; - decode_sce_lfe(hDecoder, hInfo, ld, id_syn_ele); - if (hInfo->error > 0) - return; - break; - case ID_CPE: - if (hDecoder->first_syn_ele == 25) hDecoder->first_syn_ele = id_syn_ele; - decode_cpe(hDecoder, hInfo, ld, id_syn_ele); - if (hInfo->error > 0) - return; - break; - case ID_LFE: - hDecoder->has_lfe++; - decode_sce_lfe(hDecoder, hInfo, ld, id_syn_ele); - if (hInfo->error > 0) - return; - break; - case ID_CCE: /* not implemented yet, but skip the bits */ -#ifdef COUPLING_DEC - hInfo->error = coupling_channel_element(hDecoder, ld); -#else - hInfo->error = 6; -#endif - if (hInfo->error > 0) - return; - break; - case ID_DSE: - data_stream_element(hDecoder, ld); - break; - case ID_PCE: - /* 14496-4: 5.6.4.1.2.1.3: */ - /* program_configuration_element()'s in access units shall be ignored */ - program_config_element(pce, ld); - //if ((hInfo->error = program_config_element(pce, ld)) > 0) - // return; - //hDecoder->pce_set = 1; - break; - case ID_FIL: - /* one sbr_info describes a channel_element not a channel! */ - /* if we encounter SBR data here: error */ - /* SBR data will be read directly in the SCE/LFE/CPE element */ - if ((hInfo->error = fill_element(hDecoder, ld, drc -#ifdef SBR_DEC - , INVALID_SBR_ELEMENT -#endif - )) > 0) - return; - break; - } - } -#ifdef ERROR_RESILIENCE - } else { - /* Table 262: er_raw_data_block() */ - switch (hDecoder->channelConfiguration) - { - case 1: - decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); - if (hInfo->error > 0) - return; - break; - case 2: - decode_cpe(hDecoder, hInfo, ld, ID_CPE); - if (hInfo->error > 0) - return; - break; - case 3: - decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); - decode_cpe(hDecoder, hInfo, ld, ID_CPE); - if (hInfo->error > 0) - return; - break; - case 4: - decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); - decode_cpe(hDecoder, hInfo, ld, ID_CPE); - decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); - if (hInfo->error > 0) - return; - break; - case 5: - decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); - decode_cpe(hDecoder, hInfo, ld, ID_CPE); - decode_cpe(hDecoder, hInfo, ld, ID_CPE); - if (hInfo->error > 0) - return; - break; - case 6: - decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); - decode_cpe(hDecoder, hInfo, ld, ID_CPE); - decode_cpe(hDecoder, hInfo, ld, ID_CPE); - decode_sce_lfe(hDecoder, hInfo, ld, ID_LFE); - if (hInfo->error > 0) - return; - break; - case 7: /* 8 channels */ - decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); - decode_cpe(hDecoder, hInfo, ld, ID_CPE); - decode_cpe(hDecoder, hInfo, ld, ID_CPE); - decode_cpe(hDecoder, hInfo, ld, ID_CPE); - decode_sce_lfe(hDecoder, hInfo, ld, ID_LFE); - if (hInfo->error > 0) - return; - break; - default: - hInfo->error = 7; - return; - } -#if 0 - cnt = bits_to_decode() / 8; - while (cnt >= 1) - { - cnt -= extension_payload(cnt); - } -#endif - } -#endif - - /* new in corrigendum 14496-3:2002 */ -#ifdef DRM - if (hDecoder->object_type != DRM_ER_LC) -#endif - { - faad_byte_align(ld); - } - - return; -} - -/* Table 4.4.4 and */ -/* Table 4.4.9 */ -static uint8_t single_lfe_channel_element(NeAACDecHandle hDecoder, bitfile *ld, - uint8_t channel, uint8_t *tag) -{ - uint8_t retval = 0; - element sce = {0}; - ic_stream *ics = &(sce.ics1); - ALIGN int16_t spec_data[1024] = {0}; - - sce.element_instance_tag = (uint8_t)faad_getbits(ld, LEN_TAG - DEBUGVAR(1,38,"single_lfe_channel_element(): element_instance_tag")); - - *tag = sce.element_instance_tag; - sce.channel = channel; - sce.paired_channel = -1; - - retval = individual_channel_stream(hDecoder, &sce, ld, ics, 0, spec_data); - if (retval > 0) - return retval; - -#ifdef SBR_DEC - /* check if next bitstream element is a fill element */ - /* if so, read it now so SBR decoding can be done in case of a file with SBR */ - if (faad_showbits(ld, LEN_SE_ID) == ID_FIL) - { - faad_flushbits(ld, LEN_SE_ID); - - /* one sbr_info describes a channel_element not a channel! */ - if ((retval = fill_element(hDecoder, ld, hDecoder->drc, hDecoder->fr_ch_ele)) > 0) - { - return retval; - } - } -#endif - - /* noiseless coding is done, spectral reconstruction is done now */ - retval = reconstruct_single_channel(hDecoder, ics, &sce, spec_data); - if (retval > 0) - return retval; - - return 0; -} - -/* Table 4.4.5 */ -static uint8_t channel_pair_element(NeAACDecHandle hDecoder, bitfile *ld, - uint8_t channels, uint8_t *tag) -{ - ALIGN int16_t spec_data1[1024] = {0}; - ALIGN int16_t spec_data2[1024] = {0}; - element cpe = {0}; - ic_stream *ics1 = &(cpe.ics1); - ic_stream *ics2 = &(cpe.ics2); - uint8_t result; - - cpe.channel = channels; - cpe.paired_channel = channels+1; - - cpe.element_instance_tag = (uint8_t)faad_getbits(ld, LEN_TAG - DEBUGVAR(1,39,"channel_pair_element(): element_instance_tag")); - *tag = cpe.element_instance_tag; - - if ((cpe.common_window = faad_get1bit(ld - DEBUGVAR(1,40,"channel_pair_element(): common_window"))) & 1) - { - /* both channels have common ics information */ - if ((result = ics_info(hDecoder, ics1, ld, cpe.common_window)) > 0) - return result; - - ics1->ms_mask_present = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,41,"channel_pair_element(): ms_mask_present")); - if (ics1->ms_mask_present == 1) - { - uint8_t g, sfb; - for (g = 0; g < ics1->num_window_groups; g++) - { - for (sfb = 0; sfb < ics1->max_sfb; sfb++) - { - ics1->ms_used[g][sfb] = faad_get1bit(ld - DEBUGVAR(1,42,"channel_pair_element(): faad_get1bit")); - } - } - } - -#ifdef ERROR_RESILIENCE - if ((hDecoder->object_type >= ER_OBJECT_START) && (ics1->predictor_data_present)) - { - if (( -#ifdef LTP_DEC - ics1->ltp.data_present = -#endif - faad_get1bit(ld DEBUGVAR(1,50,"channel_pair_element(): ltp.data_present"))) & 1) - { -#ifdef LTP_DEC - if ((result = ltp_data(hDecoder, ics1, &(ics1->ltp), ld)) > 0) - { - return result; - } -#else - return 26; -#endif - } - } -#endif - - memcpy(ics2, ics1, sizeof(ic_stream)); - } else { - ics1->ms_mask_present = 0; - } - - if ((result = individual_channel_stream(hDecoder, &cpe, ld, ics1, - 0, spec_data1)) > 0) - { - return result; - } - -#ifdef ERROR_RESILIENCE - if (cpe.common_window && (hDecoder->object_type >= ER_OBJECT_START) && - (ics1->predictor_data_present)) - { - if (( -#ifdef LTP_DEC - ics1->ltp2.data_present = -#endif - faad_get1bit(ld DEBUGVAR(1,50,"channel_pair_element(): ltp.data_present"))) & 1) - { -#ifdef LTP_DEC - if ((result = ltp_data(hDecoder, ics1, &(ics1->ltp2), ld)) > 0) - { - return result; - } -#else - return 26; -#endif - } - } -#endif - - if ((result = individual_channel_stream(hDecoder, &cpe, ld, ics2, - 0, spec_data2)) > 0) - { - return result; - } - -#ifdef SBR_DEC - /* check if next bitstream element is a fill element */ - /* if so, read it now so SBR decoding can be done in case of a file with SBR */ - if (faad_showbits(ld, LEN_SE_ID) == ID_FIL) - { - faad_flushbits(ld, LEN_SE_ID); - - /* one sbr_info describes a channel_element not a channel! */ - if ((result = fill_element(hDecoder, ld, hDecoder->drc, hDecoder->fr_ch_ele)) > 0) - { - return result; - } - } -#endif - - /* noiseless coding is done, spectral reconstruction is done now */ - if ((result = reconstruct_channel_pair(hDecoder, ics1, ics2, &cpe, - spec_data1, spec_data2)) > 0) - { - return result; - } - - return 0; -} - -/* Table 4.4.6 */ -static uint8_t ics_info(NeAACDecHandle hDecoder, ic_stream *ics, bitfile *ld, - uint8_t common_window) -{ - uint8_t retval = 0; - - /* ics->ics_reserved_bit = */ faad_get1bit(ld - DEBUGVAR(1,43,"ics_info(): ics_reserved_bit")); - ics->window_sequence = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,44,"ics_info(): window_sequence")); - ics->window_shape = faad_get1bit(ld - DEBUGVAR(1,45,"ics_info(): window_shape")); - - if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) - { - ics->max_sfb = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,46,"ics_info(): max_sfb (short)")); - ics->scale_factor_grouping = (uint8_t)faad_getbits(ld, 7 - DEBUGVAR(1,47,"ics_info(): scale_factor_grouping")); - } else { - ics->max_sfb = (uint8_t)faad_getbits(ld, 6 - DEBUGVAR(1,48,"ics_info(): max_sfb (long)")); - } - - /* get the grouping information */ - if ((retval = window_grouping_info(hDecoder, ics)) > 0) - return retval; - - /* should be an error */ - /* check the range of max_sfb */ - if (ics->max_sfb > ics->num_swb) - return 16; - - if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) - { - if ((ics->predictor_data_present = faad_get1bit(ld - DEBUGVAR(1,49,"ics_info(): predictor_data_present"))) & 1) - { - if (hDecoder->object_type == MAIN) /* MPEG2 style AAC predictor */ - { - uint8_t sfb; - - uint8_t limit = min(ics->max_sfb, max_pred_sfb(hDecoder->sf_index)); -#ifdef MAIN_DEC - ics->pred.limit = limit; -#endif - - if (( -#ifdef MAIN_DEC - ics->pred.predictor_reset = -#endif - faad_get1bit(ld DEBUGVAR(1,53,"ics_info(): pred.predictor_reset"))) & 1) - { -#ifdef MAIN_DEC - ics->pred.predictor_reset_group_number = -#endif - (uint8_t)faad_getbits(ld, 5 DEBUGVAR(1,54,"ics_info(): pred.predictor_reset_group_number")); - } - - for (sfb = 0; sfb < limit; sfb++) - { -#ifdef MAIN_DEC - ics->pred.prediction_used[sfb] = -#endif - faad_get1bit(ld DEBUGVAR(1,55,"ics_info(): pred.prediction_used")); - } - } -#ifdef LTP_DEC - else { /* Long Term Prediction */ - if (hDecoder->object_type < ER_OBJECT_START) - { - if ((ics->ltp.data_present = faad_get1bit(ld - DEBUGVAR(1,50,"ics_info(): ltp.data_present"))) & 1) - { - if ((retval = ltp_data(hDecoder, ics, &(ics->ltp), ld)) > 0) - { - return retval; - } - } - if (common_window) - { - if ((ics->ltp2.data_present = faad_get1bit(ld - DEBUGVAR(1,51,"ics_info(): ltp2.data_present"))) & 1) - { - if ((retval = ltp_data(hDecoder, ics, &(ics->ltp2), ld)) > 0) - { - return retval; - } - } - } - } -#ifdef ERROR_RESILIENCE - if (!common_window && (hDecoder->object_type >= ER_OBJECT_START)) - { - if ((ics->ltp.data_present = faad_get1bit(ld - DEBUGVAR(1,50,"ics_info(): ltp.data_present"))) & 1) - { - ltp_data(hDecoder, ics, &(ics->ltp), ld); - } - } -#endif - } -#endif - } - } - - return retval; -} - -/* Table 4.4.7 */ -static uint8_t pulse_data(ic_stream *ics, pulse_info *pul, bitfile *ld) -{ - uint8_t i; - - pul->number_pulse = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,56,"pulse_data(): number_pulse")); - pul->pulse_start_sfb = (uint8_t)faad_getbits(ld, 6 - DEBUGVAR(1,57,"pulse_data(): pulse_start_sfb")); - - /* check the range of pulse_start_sfb */ - if (pul->pulse_start_sfb > ics->num_swb) - return 16; - - for (i = 0; i < pul->number_pulse+1; i++) - { - pul->pulse_offset[i] = (uint8_t)faad_getbits(ld, 5 - DEBUGVAR(1,58,"pulse_data(): pulse_offset")); -#if 0 - printf("%d\n", pul->pulse_offset[i]); -#endif - pul->pulse_amp[i] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,59,"pulse_data(): pulse_amp")); -#if 0 - printf("%d\n", pul->pulse_amp[i]); -#endif - } - - return 0; -} - -#ifdef COUPLING_DEC -/* Table 4.4.8: Currently just for skipping the bits... */ -static uint8_t coupling_channel_element(NeAACDecHandle hDecoder, bitfile *ld) -{ - uint8_t c, result = 0; - uint8_t ind_sw_cce_flag = 0; - uint8_t num_gain_element_lists = 0; - uint8_t num_coupled_elements = 0; - - element el_empty = {0}; - ic_stream ics_empty = {0}; - int16_t sh_data[1024]; - - c = faad_getbits(ld, LEN_TAG - DEBUGVAR(1,900,"coupling_channel_element(): element_instance_tag")); - - ind_sw_cce_flag = faad_get1bit(ld - DEBUGVAR(1,901,"coupling_channel_element(): ind_sw_cce_flag")); - num_coupled_elements = faad_getbits(ld, 3 - DEBUGVAR(1,902,"coupling_channel_element(): num_coupled_elements")); - - for (c = 0; c < num_coupled_elements + 1; c++) - { - uint8_t cc_target_is_cpe, cc_target_tag_select; - - num_gain_element_lists++; - - cc_target_is_cpe = faad_get1bit(ld - DEBUGVAR(1,903,"coupling_channel_element(): cc_target_is_cpe")); - cc_target_tag_select = faad_getbits(ld, 4 - DEBUGVAR(1,904,"coupling_channel_element(): cc_target_tag_select")); - - if (cc_target_is_cpe) - { - uint8_t cc_l = faad_get1bit(ld - DEBUGVAR(1,905,"coupling_channel_element(): cc_l")); - uint8_t cc_r = faad_get1bit(ld - DEBUGVAR(1,906,"coupling_channel_element(): cc_r")); - - if (cc_l && cc_r) - num_gain_element_lists++; - } - } - - faad_get1bit(ld - DEBUGVAR(1,907,"coupling_channel_element(): cc_domain")); - faad_get1bit(ld - DEBUGVAR(1,908,"coupling_channel_element(): gain_element_sign")); - faad_getbits(ld, 2 - DEBUGVAR(1,909,"coupling_channel_element(): gain_element_scale")); - - if ((result = individual_channel_stream(hDecoder, &el_empty, ld, &ics_empty, - 0, sh_data)) > 0) - { - return result; - } - - for (c = 1; c < num_gain_element_lists; c++) - { - uint8_t cge; - - if (ind_sw_cce_flag) - { - cge = 1; - } else { - cge = faad_get1bit(ld - DEBUGVAR(1,910,"coupling_channel_element(): common_gain_element_present")); - } - - if (cge) - { - huffman_scale_factor(ld); - } else { - uint8_t g, sfb; - - for (g = 0; g < ics_empty.num_window_groups; g++) - { - for (sfb = 0; sfb < ics_empty.max_sfb; sfb++) - { - if (ics_empty.sfb_cb[g][sfb] != ZERO_HCB) - huffman_scale_factor(ld); - } - } - } - } - - return 0; -} -#endif - -/* Table 4.4.10 */ -static uint16_t data_stream_element(NeAACDecHandle hDecoder, bitfile *ld) -{ - uint8_t byte_aligned; - uint16_t i, count; - - /* element_instance_tag = */ faad_getbits(ld, LEN_TAG - DEBUGVAR(1,60,"data_stream_element(): element_instance_tag")); - byte_aligned = faad_get1bit(ld - DEBUGVAR(1,61,"data_stream_element(): byte_aligned")); - count = (uint16_t)faad_getbits(ld, 8 - DEBUGVAR(1,62,"data_stream_element(): count")); - if (count == 255) - { - count += (uint16_t)faad_getbits(ld, 8 - DEBUGVAR(1,63,"data_stream_element(): extra count")); - } - if (byte_aligned) - faad_byte_align(ld); - - for (i = 0; i < count; i++) - { - faad_getbits(ld, LEN_BYTE - DEBUGVAR(1,64,"data_stream_element(): data_stream_byte")); - } - - return count; -} - -/* Table 4.4.11 */ -static uint8_t fill_element(NeAACDecHandle hDecoder, bitfile *ld, drc_info *drc -#ifdef SBR_DEC - ,uint8_t sbr_ele -#endif - ) -{ - uint16_t count; -#ifdef SBR_DEC - uint8_t bs_extension_type; -#endif - - count = (uint16_t)faad_getbits(ld, 4 - DEBUGVAR(1,65,"fill_element(): count")); - if (count == 15) - { - count += (uint16_t)faad_getbits(ld, 8 - DEBUGVAR(1,66,"fill_element(): extra count")) - 1; - } - - if (count > 0) - { -#ifdef SBR_DEC - bs_extension_type = (uint8_t)faad_showbits(ld, 4); - - if ((bs_extension_type == EXT_SBR_DATA) || - (bs_extension_type == EXT_SBR_DATA_CRC)) - { - if (sbr_ele == INVALID_SBR_ELEMENT) - return 24; - - if (!hDecoder->sbr[sbr_ele]) - { - hDecoder->sbr[sbr_ele] = sbrDecodeInit(hDecoder->frameLength, - hDecoder->element_id[sbr_ele], 2*get_sample_rate(hDecoder->sf_index), - hDecoder->downSampledSBR -#ifdef DRM - , 0 -#endif - ); - } - - hDecoder->sbr_present_flag = 1; - - /* parse the SBR data */ - hDecoder->sbr[sbr_ele]->ret = sbr_extension_data(ld, hDecoder->sbr[sbr_ele], count); - -#if 0 - if (hDecoder->sbr[sbr_ele]->ret > 0) - { - printf("%s\n", NeAACDecGetErrorMessage(hDecoder->sbr[sbr_ele]->ret)); - } -#endif - -#if (defined(PS_DEC) || defined(DRM_PS)) - if (hDecoder->sbr[sbr_ele]->ps_used) - { - hDecoder->ps_used[sbr_ele] = 1; - - /* set element independent flag to 1 as well */ - hDecoder->ps_used_global = 1; - } -#endif - } else { -#endif - while (count > 0) - { - count -= extension_payload(ld, drc, count); - } -#ifdef SBR_DEC - } -#endif - } - - return 0; -} - -/* Table 4.4.12 */ -#ifdef SSR_DEC -static void gain_control_data(bitfile *ld, ic_stream *ics) -{ - uint8_t bd, wd, ad; - ssr_info *ssr = &(ics->ssr); - - ssr->max_band = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,1000,"gain_control_data(): max_band")); - - if (ics->window_sequence == ONLY_LONG_SEQUENCE) - { - for (bd = 1; bd <= ssr->max_band; bd++) - { - for (wd = 0; wd < 1; wd++) - { - ssr->adjust_num[bd][wd] = (uint8_t)faad_getbits(ld, 3 - DEBUGVAR(1,1001,"gain_control_data(): adjust_num")); - - for (ad = 0; ad < ssr->adjust_num[bd][wd]; ad++) - { - ssr->alevcode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,1002,"gain_control_data(): alevcode")); - ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 5 - DEBUGVAR(1,1003,"gain_control_data(): aloccode")); - } - } - } - } else if (ics->window_sequence == LONG_START_SEQUENCE) { - for (bd = 1; bd <= ssr->max_band; bd++) - { - for (wd = 0; wd < 2; wd++) - { - ssr->adjust_num[bd][wd] = (uint8_t)faad_getbits(ld, 3 - DEBUGVAR(1,1001,"gain_control_data(): adjust_num")); - - for (ad = 0; ad < ssr->adjust_num[bd][wd]; ad++) - { - ssr->alevcode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,1002,"gain_control_data(): alevcode")); - if (wd == 0) - { - ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,1003,"gain_control_data(): aloccode")); - } else { - ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,1003,"gain_control_data(): aloccode")); - } - } - } - } - } else if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) { - for (bd = 1; bd <= ssr->max_band; bd++) - { - for (wd = 0; wd < 8; wd++) - { - ssr->adjust_num[bd][wd] = (uint8_t)faad_getbits(ld, 3 - DEBUGVAR(1,1001,"gain_control_data(): adjust_num")); - - for (ad = 0; ad < ssr->adjust_num[bd][wd]; ad++) - { - ssr->alevcode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,1002,"gain_control_data(): alevcode")); - ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,1003,"gain_control_data(): aloccode")); - } - } - } - } else if (ics->window_sequence == LONG_STOP_SEQUENCE) { - for (bd = 1; bd <= ssr->max_band; bd++) - { - for (wd = 0; wd < 2; wd++) - { - ssr->adjust_num[bd][wd] = (uint8_t)faad_getbits(ld, 3 - DEBUGVAR(1,1001,"gain_control_data(): adjust_num")); - - for (ad = 0; ad < ssr->adjust_num[bd][wd]; ad++) - { - ssr->alevcode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,1002,"gain_control_data(): alevcode")); - - if (wd == 0) - { - ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,1003,"gain_control_data(): aloccode")); - } else { - ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 5 - DEBUGVAR(1,1003,"gain_control_data(): aloccode")); - } - } - } - } - } -} -#endif - -#ifdef SCALABLE_DEC -/* Table 4.4.13 ASME */ -void aac_scalable_main_element(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, - bitfile *ld, program_config *pce, drc_info *drc) -{ - uint8_t retval = 0; - uint8_t channels = hDecoder->fr_channels = 0; - uint8_t ch; - uint8_t this_layer_stereo = (hDecoder->channelConfiguration > 1) ? 1 : 0; - element cpe = {0}; - ic_stream *ics1 = &(cpe.ics1); - ic_stream *ics2 = &(cpe.ics2); - int16_t *spec_data; - ALIGN int16_t spec_data1[1024] = {0}; - ALIGN int16_t spec_data2[1024] = {0}; - - hDecoder->fr_ch_ele = 0; - - hInfo->error = aac_scalable_main_header(hDecoder, ics1, ics2, ld, this_layer_stereo); - if (hInfo->error > 0) - return; - - cpe.common_window = 1; - if (this_layer_stereo) - { - hDecoder->element_id[0] = ID_CPE; - if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) - hDecoder->element_output_channels[hDecoder->fr_ch_ele] = 2; - } else { - hDecoder->element_id[0] = ID_SCE; - } - - for (ch = 0; ch < (this_layer_stereo ? 2 : 1); ch++) - { - ic_stream *ics; - if (ch == 0) - { - ics = ics1; - spec_data = spec_data1; - } else { - ics = ics2; - spec_data = spec_data2; - } - - hInfo->error = individual_channel_stream(hDecoder, &cpe, ld, ics, 1, spec_data); - if (hInfo->error > 0) - return; - } - -#ifdef DRM -#ifdef SBR_DEC - /* In case of DRM we need to read the SBR info before channel reconstruction */ - if ((hDecoder->sbr_present_flag == 1) && (hDecoder->object_type == DRM_ER_LC)) - { - bitfile ld_sbr = {0}; - uint32_t i; - uint16_t count = 0; - uint8_t *revbuffer; - uint8_t *prevbufstart; - uint8_t *pbufend; - - /* all forward bitreading should be finished at this point */ - uint32_t bitsconsumed = faad_get_processed_bits(ld); - uint32_t buffer_size = faad_origbitbuffer_size(ld); - uint8_t *buffer = (uint8_t*)faad_origbitbuffer(ld); - - if (bitsconsumed + 8 > buffer_size*8) - { - hInfo->error = 14; - return; - } - - if (!hDecoder->sbr[0]) - { - hDecoder->sbr[0] = sbrDecodeInit(hDecoder->frameLength, hDecoder->element_id[0], - 2*get_sample_rate(hDecoder->sf_index), 0 /* ds SBR */, 1); - } - - /* Reverse bit reading of SBR data in DRM audio frame */ - revbuffer = (uint8_t*)faad_malloc(buffer_size*sizeof(uint8_t)); - prevbufstart = revbuffer; - pbufend = &buffer[buffer_size - 1]; - for (i = 0; i < buffer_size; i++) - *prevbufstart++ = tabFlipbits[*pbufend--]; - - /* Set SBR data */ - /* consider 8 bits from AAC-CRC */ - count = (uint16_t)bit2byte(buffer_size*8 - bitsconsumed); - faad_initbits(&ld_sbr, revbuffer, count); - - hDecoder->sbr[0]->sample_rate = get_sample_rate(hDecoder->sf_index); - hDecoder->sbr[0]->sample_rate *= 2; - - faad_getbits(&ld_sbr, 8); /* Skip 8-bit CRC */ - - hDecoder->sbr[0]->ret = sbr_extension_data(&ld_sbr, hDecoder->sbr[0], count); -#if (defined(PS_DEC) || defined(DRM_PS)) - if (hDecoder->sbr[0]->ps_used) - { - hDecoder->ps_used[0] = 1; - hDecoder->ps_used_global = 1; - } -#endif - - /* check CRC */ - /* no need to check it if there was already an error */ - if (hDecoder->sbr[0]->ret == 0) - hDecoder->sbr[0]->ret = (uint8_t)faad_check_CRC(&ld_sbr, (uint16_t)faad_get_processed_bits(&ld_sbr) - 8); - - /* SBR data was corrupted, disable it until the next header */ - if (hDecoder->sbr[0]->ret != 0) - { - hDecoder->sbr[0]->header_count = 0; - } - - faad_endbits(&ld_sbr); - - if (revbuffer) - faad_free(revbuffer); - } -#endif -#endif - - if (this_layer_stereo) - { - hInfo->error = reconstruct_channel_pair(hDecoder, ics1, ics2, &cpe, spec_data1, spec_data2); - if (hInfo->error > 0) - return; - } else { - hInfo->error = reconstruct_single_channel(hDecoder, ics1, &cpe, spec_data1); - if (hInfo->error > 0) - return; - } - - /* map output channels position to internal data channels */ - if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2) - { - /* this might be faulty when pce_set is true */ - hDecoder->internal_channel[channels] = channels; - hDecoder->internal_channel[channels+1] = channels+1; - } else { - hDecoder->internal_channel[channels] = channels; - } - - hDecoder->fr_channels += hDecoder->element_output_channels[hDecoder->fr_ch_ele]; - hDecoder->fr_ch_ele++; - - return; -} - -/* Table 4.4.15 */ -static int8_t aac_scalable_main_header(NeAACDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2, - bitfile *ld, uint8_t this_layer_stereo) -{ - uint8_t retval = 0; - uint8_t ch; - ic_stream *ics; - - /* ics1->ics_reserved_bit = */ faad_get1bit(ld - DEBUGVAR(1,300,"aac_scalable_main_header(): ics_reserved_bits")); - ics1->window_sequence = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,301,"aac_scalable_main_header(): window_sequence")); - ics1->window_shape = faad_get1bit(ld - DEBUGVAR(1,302,"aac_scalable_main_header(): window_shape")); - - if (ics1->window_sequence == EIGHT_SHORT_SEQUENCE) - { - ics1->max_sfb = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,303,"aac_scalable_main_header(): max_sfb (short)")); - ics1->scale_factor_grouping = (uint8_t)faad_getbits(ld, 7 - DEBUGVAR(1,304,"aac_scalable_main_header(): scale_factor_grouping")); - } else { - ics1->max_sfb = (uint8_t)faad_getbits(ld, 6 - DEBUGVAR(1,305,"aac_scalable_main_header(): max_sfb (long)")); - } - - /* get the grouping information */ - if ((retval = window_grouping_info(hDecoder, ics1)) > 0) - return retval; - - /* should be an error */ - /* check the range of max_sfb */ - if (ics1->max_sfb > ics1->num_swb) - return 16; - - if (this_layer_stereo) - { - ics1->ms_mask_present = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,306,"aac_scalable_main_header(): ms_mask_present")); - if (ics1->ms_mask_present == 1) - { - uint8_t g, sfb; - for (g = 0; g < ics1->num_window_groups; g++) - { - for (sfb = 0; sfb < ics1->max_sfb; sfb++) - { - ics1->ms_used[g][sfb] = faad_get1bit(ld - DEBUGVAR(1,307,"aac_scalable_main_header(): faad_get1bit")); - } - } - } - - memcpy(ics2, ics1, sizeof(ic_stream)); - } else { - ics1->ms_mask_present = 0; - } - - if (0) - { - faad_get1bit(ld - DEBUGVAR(1,308,"aac_scalable_main_header(): tns_channel_mono_layer")); - } - - for (ch = 0; ch < (this_layer_stereo ? 2 : 1); ch++) - { - if (ch == 0) - ics = ics1; - else - ics = ics2; - - if ( 1 /*!tvq_layer_pesent || (tns_aac_tvq_en[ch] == 1)*/) - { - if ((ics->tns_data_present = faad_get1bit(ld - DEBUGVAR(1,309,"aac_scalable_main_header(): tns_data_present"))) & 1) - { -#ifdef DRM - /* different order of data units in DRM */ - if (hDecoder->object_type != DRM_ER_LC) -#endif - { - tns_data(ics, &(ics->tns), ld); - } - } - } -#if 0 - if (0 /*core_flag || tvq_layer_pesent*/) - { - if ((ch==0) || ((ch==1) && (core_stereo || tvq_stereo)) - diff_control_data(); - if (mono_stereo_flag) - diff_control_data_lr(); - } else { -#endif - if (( -#ifdef LTP_DEC - ics->ltp.data_present = -#endif - faad_get1bit(ld DEBUGVAR(1,310,"aac_scalable_main_header(): ltp.data_present"))) & 1) - { -#ifdef LTP_DEC - if ((retval = ltp_data(hDecoder, ics, &(ics->ltp), ld)) > 0) - { - return retval; - } -#else - return 26; -#endif - } -#if 0 - } -#endif - } - - return 0; -} -#endif - -/* Table 4.4.24 */ -static uint8_t individual_channel_stream(NeAACDecHandle hDecoder, element *ele, - bitfile *ld, ic_stream *ics, uint8_t scal_flag, - int16_t *spec_data) -{ - uint8_t result; - - ics->global_gain = (uint8_t)faad_getbits(ld, 8 - DEBUGVAR(1,67,"individual_channel_stream(): global_gain")); - - if (!ele->common_window && !scal_flag) - { - if ((result = ics_info(hDecoder, ics, ld, ele->common_window)) > 0) - return result; - } - - if ((result = section_data(hDecoder, ics, ld)) > 0) - return result; - - if ((result = scale_factor_data(hDecoder, ics, ld)) > 0) - return result; - - if (!scal_flag) - { - /** - ** NOTE: It could be that pulse data is available in scalable AAC too, - ** as said in Amendment 1, this could be only the case for ER AAC, - ** though. (have to check this out later) - **/ - /* get pulse data */ - if ((ics->pulse_data_present = faad_get1bit(ld - DEBUGVAR(1,68,"individual_channel_stream(): pulse_data_present"))) & 1) - { - if ((result = pulse_data(ics, &(ics->pul), ld)) > 0) - return result; - } - - /* get tns data */ - if ((ics->tns_data_present = faad_get1bit(ld - DEBUGVAR(1,69,"individual_channel_stream(): tns_data_present"))) & 1) - { -#ifdef ERROR_RESILIENCE - if (hDecoder->object_type < ER_OBJECT_START) -#endif - tns_data(ics, &(ics->tns), ld); - } - - /* get gain control data */ - if ((ics->gain_control_data_present = faad_get1bit(ld - DEBUGVAR(1,70,"individual_channel_stream(): gain_control_data_present"))) & 1) - { -#ifdef SSR_DEC - if (hDecoder->object_type != SSR) - return 1; - else - gain_control_data(ld, ics); -#else - return 1; -#endif - } - } - -#ifdef ERROR_RESILIENCE - if (hDecoder->aacSpectralDataResilienceFlag) - { - ics->length_of_reordered_spectral_data = (uint16_t)faad_getbits(ld, 14 - DEBUGVAR(1,147,"individual_channel_stream(): length_of_reordered_spectral_data")); - - if (hDecoder->channelConfiguration == 2) - { - if (ics->length_of_reordered_spectral_data > 6144) - ics->length_of_reordered_spectral_data = 6144; - } else { - if (ics->length_of_reordered_spectral_data > 12288) - ics->length_of_reordered_spectral_data = 12288; - } - - ics->length_of_longest_codeword = (uint8_t)faad_getbits(ld, 6 - DEBUGVAR(1,148,"individual_channel_stream(): length_of_longest_codeword")); - if (ics->length_of_longest_codeword >= 49) - ics->length_of_longest_codeword = 49; - } - - /* RVLC spectral data is put here */ - if (hDecoder->aacScalefactorDataResilienceFlag) - { - if ((result = rvlc_decode_scale_factors(ics, ld)) > 0) - return result; - } - - if (hDecoder->object_type >= ER_OBJECT_START) - { - if (ics->tns_data_present) - tns_data(ics, &(ics->tns), ld); - } - -#ifdef DRM - /* CRC check */ - if (hDecoder->object_type == DRM_ER_LC) - if ((result = (uint8_t)faad_check_CRC(ld, (uint16_t)faad_get_processed_bits(ld) - 8)) > 0) - return result; -#endif - - if (hDecoder->aacSpectralDataResilienceFlag) - { - /* error resilient spectral data decoding */ - if ((result = reordered_spectral_data(hDecoder, ics, ld, spec_data)) > 0) - { - return result; - } - } else { -#endif - /* decode the spectral data */ - if ((result = spectral_data(hDecoder, ics, ld, spec_data)) > 0) - { - return result; - } -#ifdef ERROR_RESILIENCE - } -#endif - - /* pulse coding reconstruction */ - if (ics->pulse_data_present) - { - if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) - { - if ((result = pulse_decode(ics, spec_data, hDecoder->frameLength)) > 0) - return result; - } else { - return 2; /* pulse coding not allowed for short blocks */ - } - } - - return 0; -} - -/* Table 4.4.25 */ -static uint8_t section_data(NeAACDecHandle hDecoder, ic_stream *ics, bitfile *ld) -{ - uint8_t g; - uint8_t sect_esc_val, sect_bits; - - if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) - sect_bits = 3; - else - sect_bits = 5; - sect_esc_val = (1<<sect_bits) - 1; - -#if 0 - printf("\ntotal sfb %d\n", ics->max_sfb); - printf(" sect top cb\n"); -#endif - - for (g = 0; g < ics->num_window_groups; g++) - { - uint8_t k = 0; - uint8_t i = 0; - - while (k < ics->max_sfb) - { -#ifdef ERROR_RESILIENCE - uint8_t vcb11 = 0; -#endif - uint8_t sfb; - uint8_t sect_len_incr; - uint16_t sect_len = 0; - uint8_t sect_cb_bits = 4; - - /* if "faad_getbits" detects error and returns "0", "k" is never - incremented and we cannot leave the while loop */ - if ((ld->error != 0) || (ld->no_more_reading)) - return 14; - -#ifdef ERROR_RESILIENCE - if (hDecoder->aacSectionDataResilienceFlag) - sect_cb_bits = 5; -#endif - - ics->sect_cb[g][i] = (uint8_t)faad_getbits(ld, sect_cb_bits - DEBUGVAR(1,71,"section_data(): sect_cb")); - -#if 0 - printf("%d\n", ics->sect_cb[g][i]); -#endif - - if (ics->sect_cb[g][i] == NOISE_HCB) - ics->noise_used = 1; - -#ifdef ERROR_RESILIENCE - if (hDecoder->aacSectionDataResilienceFlag) - { - if ((ics->sect_cb[g][i] == 11) || - ((ics->sect_cb[g][i] >= 16) && (ics->sect_cb[g][i] <= 32))) - { - vcb11 = 1; - } - } - if (vcb11) - { - sect_len_incr = 1; - } else { -#endif - sect_len_incr = (uint8_t)faad_getbits(ld, sect_bits - DEBUGVAR(1,72,"section_data(): sect_len_incr")); -#ifdef ERROR_RESILIENCE - } -#endif - while ((sect_len_incr == sect_esc_val) /* && - (k+sect_len < ics->max_sfb)*/) - { - sect_len += sect_len_incr; - sect_len_incr = (uint8_t)faad_getbits(ld, sect_bits - DEBUGVAR(1,72,"section_data(): sect_len_incr")); - } - - sect_len += sect_len_incr; - - ics->sect_start[g][i] = k; - ics->sect_end[g][i] = k + sect_len; - -#if 0 - printf("%d\n", ics->sect_start[g][i]); -#endif -#if 0 - printf("%d\n", ics->sect_end[g][i]); -#endif - - if (k + sect_len >= 8*15) - return 15; - if (i >= 8*15) - return 15; - - for (sfb = k; sfb < k + sect_len; sfb++) - { - ics->sfb_cb[g][sfb] = ics->sect_cb[g][i]; -#if 0 - printf("%d\n", ics->sfb_cb[g][sfb]); -#endif - } - -#if 0 - printf(" %6d %6d %6d\n", - i, - ics->sect_end[g][i], - ics->sect_cb[g][i]); -#endif - - k += sect_len; - i++; - } - ics->num_sec[g] = i; -#if 0 - printf("%d\n", ics->num_sec[g]); -#endif - } - -#if 0 - printf("\n"); -#endif - - return 0; -} - -/* - * decode_scale_factors() - * decodes the scalefactors from the bitstream - */ -/* - * All scalefactors (and also the stereo positions and pns energies) are - * transmitted using Huffman coded DPCM relative to the previous active - * scalefactor (respectively previous stereo position or previous pns energy, - * see subclause 4.6.2 and 4.6.3). The first active scalefactor is - * differentially coded relative to the global gain. - */ -static uint8_t decode_scale_factors(ic_stream *ics, bitfile *ld) -{ - uint8_t g, sfb; - int16_t t; - int8_t noise_pcm_flag = 1; - - int16_t scale_factor = ics->global_gain; - int16_t is_position = 0; - int16_t noise_energy = ics->global_gain - 90; - - for (g = 0; g < ics->num_window_groups; g++) - { - for (sfb = 0; sfb < ics->max_sfb; sfb++) - { - switch (ics->sfb_cb[g][sfb]) - { - case ZERO_HCB: /* zero book */ - ics->scale_factors[g][sfb] = 0; -//#define SF_PRINT -#ifdef SF_PRINT - printf("%d\n", ics->scale_factors[g][sfb]); -#endif - break; - case INTENSITY_HCB: /* intensity books */ - case INTENSITY_HCB2: - - /* decode intensity position */ - t = huffman_scale_factor(ld); - is_position += (t - 60); - ics->scale_factors[g][sfb] = is_position; -#ifdef SF_PRINT - printf("%d\n", ics->scale_factors[g][sfb]); -#endif - - break; - case NOISE_HCB: /* noise books */ - - /* decode noise energy */ - if (noise_pcm_flag) - { - noise_pcm_flag = 0; - t = (int16_t)faad_getbits(ld, 9 - DEBUGVAR(1,73,"scale_factor_data(): first noise")) - 256; - } else { - t = huffman_scale_factor(ld); - t -= 60; - } - noise_energy += t; - ics->scale_factors[g][sfb] = noise_energy; -#ifdef SF_PRINT - printf("%d\n", ics->scale_factors[g][sfb]); -#endif - - break; - default: /* spectral books */ - - /* ics->scale_factors[g][sfb] must be between 0 and 255 */ - - ics->scale_factors[g][sfb] = 0; - - /* decode scale factor */ - t = huffman_scale_factor(ld); - scale_factor += (t - 60); - if (scale_factor < 0 || scale_factor > 255) - return 4; - ics->scale_factors[g][sfb] = scale_factor; -#ifdef SF_PRINT - printf("%d\n", ics->scale_factors[g][sfb]); -#endif - - break; - } - } - } - - return 0; -} - -/* Table 4.4.26 */ -static uint8_t scale_factor_data(NeAACDecHandle hDecoder, ic_stream *ics, bitfile *ld) -{ - uint8_t ret = 0; -#ifdef PROFILE - int64_t count = faad_get_ts(); -#endif - -#ifdef ERROR_RESILIENCE - if (!hDecoder->aacScalefactorDataResilienceFlag) - { -#endif - ret = decode_scale_factors(ics, ld); -#ifdef ERROR_RESILIENCE - } else { - /* In ER AAC the parameters for RVLC are seperated from the actual - data that holds the scale_factors. - Strangely enough, 2 parameters for HCR are put inbetween them. - */ - ret = rvlc_scale_factor_data(ics, ld); - } -#endif - -#ifdef PROFILE - count = faad_get_ts() - count; - hDecoder->scalefac_cycles += count; -#endif - - return ret; -} - -/* Table 4.4.27 */ -static void tns_data(ic_stream *ics, tns_info *tns, bitfile *ld) -{ - uint8_t w, filt, i, start_coef_bits, coef_bits; - uint8_t n_filt_bits = 2; - uint8_t length_bits = 6; - uint8_t order_bits = 5; - - if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) - { - n_filt_bits = 1; - length_bits = 4; - order_bits = 3; - } - - for (w = 0; w < ics->num_windows; w++) - { - tns->n_filt[w] = (uint8_t)faad_getbits(ld, n_filt_bits - DEBUGVAR(1,74,"tns_data(): n_filt")); -#if 0 - printf("%d\n", tns->n_filt[w]); -#endif - - if (tns->n_filt[w]) - { - if ((tns->coef_res[w] = faad_get1bit(ld - DEBUGVAR(1,75,"tns_data(): coef_res"))) & 1) - { - start_coef_bits = 4; - } else { - start_coef_bits = 3; - } -#if 0 - printf("%d\n", tns->coef_res[w]); -#endif - } - - for (filt = 0; filt < tns->n_filt[w]; filt++) - { - tns->length[w][filt] = (uint8_t)faad_getbits(ld, length_bits - DEBUGVAR(1,76,"tns_data(): length")); -#if 0 - printf("%d\n", tns->length[w][filt]); -#endif - tns->order[w][filt] = (uint8_t)faad_getbits(ld, order_bits - DEBUGVAR(1,77,"tns_data(): order")); -#if 0 - printf("%d\n", tns->order[w][filt]); -#endif - if (tns->order[w][filt]) - { - tns->direction[w][filt] = faad_get1bit(ld - DEBUGVAR(1,78,"tns_data(): direction")); -#if 0 - printf("%d\n", tns->direction[w][filt]); -#endif - tns->coef_compress[w][filt] = faad_get1bit(ld - DEBUGVAR(1,79,"tns_data(): coef_compress")); -#if 0 - printf("%d\n", tns->coef_compress[w][filt]); -#endif - - coef_bits = start_coef_bits - tns->coef_compress[w][filt]; - for (i = 0; i < tns->order[w][filt]; i++) - { - tns->coef[w][filt][i] = (uint8_t)faad_getbits(ld, coef_bits - DEBUGVAR(1,80,"tns_data(): coef")); -#if 0 - printf("%d\n", tns->coef[w][filt][i]); -#endif - } - } - } - } -} - -#ifdef LTP_DEC -/* Table 4.4.28 */ -static uint8_t ltp_data(NeAACDecHandle hDecoder, ic_stream *ics, ltp_info *ltp, bitfile *ld) -{ - uint8_t sfb, w; - - ltp->lag = 0; - -#ifdef LD_DEC - if (hDecoder->object_type == LD) - { - ltp->lag_update = (uint8_t)faad_getbits(ld, 1 - DEBUGVAR(1,142,"ltp_data(): lag_update")); - - if (ltp->lag_update) - { - ltp->lag = (uint16_t)faad_getbits(ld, 10 - DEBUGVAR(1,81,"ltp_data(): lag")); - } - } else { -#endif - ltp->lag = (uint16_t)faad_getbits(ld, 11 - DEBUGVAR(1,81,"ltp_data(): lag")); -#ifdef LD_DEC - } -#endif - - /* Check length of lag */ - if (ltp->lag > (hDecoder->frameLength << 1)) - return 18; - - ltp->coef = (uint8_t)faad_getbits(ld, 3 - DEBUGVAR(1,82,"ltp_data(): coef")); - - if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) - { - for (w = 0; w < ics->num_windows; w++) - { - if ((ltp->short_used[w] = faad_get1bit(ld - DEBUGVAR(1,83,"ltp_data(): short_used"))) & 1) - { - ltp->short_lag_present[w] = faad_get1bit(ld - DEBUGVAR(1,84,"ltp_data(): short_lag_present")); - if (ltp->short_lag_present[w]) - { - ltp->short_lag[w] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,85,"ltp_data(): short_lag")); - } - } - } - } else { - ltp->last_band = (ics->max_sfb < MAX_LTP_SFB ? ics->max_sfb : MAX_LTP_SFB); - - for (sfb = 0; sfb < ltp->last_band; sfb++) - { - ltp->long_used[sfb] = faad_get1bit(ld - DEBUGVAR(1,86,"ltp_data(): long_used")); - } - } - - return 0; -} -#endif - -/* Table 4.4.29 */ -static uint8_t spectral_data(NeAACDecHandle hDecoder, ic_stream *ics, bitfile *ld, - int16_t *spectral_data) -{ - int8_t i; - uint8_t g; - uint16_t inc, k, p = 0; - uint8_t groups = 0; - uint8_t sect_cb; - uint8_t result; - uint16_t nshort = hDecoder->frameLength/8; - -#ifdef PROFILE - int64_t count = faad_get_ts(); -#endif - - for(g = 0; g < ics->num_window_groups; g++) - { - p = groups*nshort; - - for (i = 0; i < ics->num_sec[g]; i++) - { - sect_cb = ics->sect_cb[g][i]; - - inc = (sect_cb >= FIRST_PAIR_HCB) ? 2 : 4; - - switch (sect_cb) - { - case ZERO_HCB: - case NOISE_HCB: - case INTENSITY_HCB: - case INTENSITY_HCB2: -//#define SD_PRINT -#ifdef SD_PRINT - { - int j; - for (j = ics->sect_sfb_offset[g][ics->sect_start[g][i]]; j < ics->sect_sfb_offset[g][ics->sect_end[g][i]]; j++) - { - printf("%d\n", 0); - } - } -#endif -//#define SFBO_PRINT -#ifdef SFBO_PRINT - printf("%d\n", ics->sect_sfb_offset[g][ics->sect_start[g][i]]); -#endif - p += (ics->sect_sfb_offset[g][ics->sect_end[g][i]] - - ics->sect_sfb_offset[g][ics->sect_start[g][i]]); - break; - default: -#ifdef SFBO_PRINT - printf("%d\n", ics->sect_sfb_offset[g][ics->sect_start[g][i]]); -#endif - for (k = ics->sect_sfb_offset[g][ics->sect_start[g][i]]; - k < ics->sect_sfb_offset[g][ics->sect_end[g][i]]; k += inc) - { - if ((result = huffman_spectral_data(sect_cb, ld, &spectral_data[p])) > 0) - return result; -#ifdef SD_PRINT - { - int j; - for (j = p; j < p+inc; j++) - { - printf("%d\n", spectral_data[j]); - } - } -#endif - p += inc; - } - break; - } - } - groups += ics->window_group_length[g]; - } - -#ifdef PROFILE - count = faad_get_ts() - count; - hDecoder->spectral_cycles += count; -#endif - - return 0; -} - -/* Table 4.4.30 */ -static uint16_t extension_payload(bitfile *ld, drc_info *drc, uint16_t count) -{ - uint16_t i, n, dataElementLength; - uint8_t dataElementLengthPart; - uint8_t align = 4, data_element_version, loopCounter; - - uint8_t extension_type = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,87,"extension_payload(): extension_type")); - - switch (extension_type) - { - case EXT_DYNAMIC_RANGE: - drc->present = 1; - n = dynamic_range_info(ld, drc); - return n; - case EXT_FILL_DATA: - /* fill_nibble = */ faad_getbits(ld, 4 - DEBUGVAR(1,136,"extension_payload(): fill_nibble")); /* must be '0000' */ - for (i = 0; i < count-1; i++) - { - /* fill_byte[i] = */ faad_getbits(ld, 8 - DEBUGVAR(1,88,"extension_payload(): fill_byte")); /* must be '10100101' */ - } - return count; - case EXT_DATA_ELEMENT: - data_element_version = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,400,"extension_payload(): data_element_version")); - switch (data_element_version) - { - case ANC_DATA: - loopCounter = 0; - dataElementLength = 0; - do { - dataElementLengthPart = (uint8_t)faad_getbits(ld, 8 - DEBUGVAR(1,401,"extension_payload(): dataElementLengthPart")); - dataElementLength += dataElementLengthPart; - loopCounter++; - } while (dataElementLengthPart == 255); - - for (i = 0; i < dataElementLength; i++) - { - /* data_element_byte[i] = */ faad_getbits(ld, 8 - DEBUGVAR(1,402,"extension_payload(): data_element_byte")); - return (dataElementLength+loopCounter+1); - } - default: - align = 0; - } - case EXT_FIL: - default: - faad_getbits(ld, align - DEBUGVAR(1,88,"extension_payload(): fill_nibble")); - for (i = 0; i < count-1; i++) - { - /* other_bits[i] = */ faad_getbits(ld, 8 - DEBUGVAR(1,89,"extension_payload(): fill_bit")); - } - return count; - } -} - -/* Table 4.4.31 */ -static uint8_t dynamic_range_info(bitfile *ld, drc_info *drc) -{ - uint8_t i, n = 1; - uint8_t band_incr; - - drc->num_bands = 1; - - if (faad_get1bit(ld - DEBUGVAR(1,90,"dynamic_range_info(): has instance_tag")) & 1) - { - drc->pce_instance_tag = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,91,"dynamic_range_info(): pce_instance_tag")); - /* drc->drc_tag_reserved_bits = */ faad_getbits(ld, 4 - DEBUGVAR(1,92,"dynamic_range_info(): drc_tag_reserved_bits")); - n++; - } - - drc->excluded_chns_present = faad_get1bit(ld - DEBUGVAR(1,93,"dynamic_range_info(): excluded_chns_present")); - if (drc->excluded_chns_present == 1) - { - n += excluded_channels(ld, drc); - } - - if (faad_get1bit(ld - DEBUGVAR(1,94,"dynamic_range_info(): has bands data")) & 1) - { - band_incr = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,95,"dynamic_range_info(): band_incr")); - /* drc->drc_bands_reserved_bits = */ faad_getbits(ld, 4 - DEBUGVAR(1,96,"dynamic_range_info(): drc_bands_reserved_bits")); - n++; - drc->num_bands += band_incr; - - for (i = 0; i < drc->num_bands; i++); - { - drc->band_top[i] = (uint8_t)faad_getbits(ld, 8 - DEBUGVAR(1,97,"dynamic_range_info(): band_top")); - n++; - } - } - - if (faad_get1bit(ld - DEBUGVAR(1,98,"dynamic_range_info(): has prog_ref_level")) & 1) - { - drc->prog_ref_level = (uint8_t)faad_getbits(ld, 7 - DEBUGVAR(1,99,"dynamic_range_info(): prog_ref_level")); - /* drc->prog_ref_level_reserved_bits = */ faad_get1bit(ld - DEBUGVAR(1,100,"dynamic_range_info(): prog_ref_level_reserved_bits")); - n++; - } - - for (i = 0; i < drc->num_bands; i++) - { - drc->dyn_rng_sgn[i] = faad_get1bit(ld - DEBUGVAR(1,101,"dynamic_range_info(): dyn_rng_sgn")); - drc->dyn_rng_ctl[i] = (uint8_t)faad_getbits(ld, 7 - DEBUGVAR(1,102,"dynamic_range_info(): dyn_rng_ctl")); - n++; - } - - return n; -} - -/* Table 4.4.32 */ -static uint8_t excluded_channels(bitfile *ld, drc_info *drc) -{ - uint8_t i, n = 0; - uint8_t num_excl_chan = 7; - - for (i = 0; i < 7; i++) - { - drc->exclude_mask[i] = faad_get1bit(ld - DEBUGVAR(1,103,"excluded_channels(): exclude_mask")); - } - n++; - - while ((drc->additional_excluded_chns[n-1] = faad_get1bit(ld - DEBUGVAR(1,104,"excluded_channels(): additional_excluded_chns"))) == 1) - { - for (i = num_excl_chan; i < num_excl_chan+7; i++) - { - drc->exclude_mask[i] = faad_get1bit(ld - DEBUGVAR(1,105,"excluded_channels(): exclude_mask")); - } - n++; - num_excl_chan += 7; - } - - return n; -} - -/* Annex A: Audio Interchange Formats */ - -/* Table 1.A.2 */ -void get_adif_header(adif_header *adif, bitfile *ld) -{ - uint8_t i; - - /* adif_id[0] = */ faad_getbits(ld, 8 - DEBUGVAR(1,106,"get_adif_header(): adif_id[0]")); - /* adif_id[1] = */ faad_getbits(ld, 8 - DEBUGVAR(1,107,"get_adif_header(): adif_id[1]")); - /* adif_id[2] = */ faad_getbits(ld, 8 - DEBUGVAR(1,108,"get_adif_header(): adif_id[2]")); - /* adif_id[3] = */ faad_getbits(ld, 8 - DEBUGVAR(1,109,"get_adif_header(): adif_id[3]")); - adif->copyright_id_present = faad_get1bit(ld - DEBUGVAR(1,110,"get_adif_header(): copyright_id_present")); - if(adif->copyright_id_present) - { - for (i = 0; i < 72/8; i++) - { - adif->copyright_id[i] = (int8_t)faad_getbits(ld, 8 - DEBUGVAR(1,111,"get_adif_header(): copyright_id")); - } - adif->copyright_id[i] = 0; - } - adif->original_copy = faad_get1bit(ld - DEBUGVAR(1,112,"get_adif_header(): original_copy")); - adif->home = faad_get1bit(ld - DEBUGVAR(1,113,"get_adif_header(): home")); - adif->bitstream_type = faad_get1bit(ld - DEBUGVAR(1,114,"get_adif_header(): bitstream_type")); - adif->bitrate = faad_getbits(ld, 23 - DEBUGVAR(1,115,"get_adif_header(): bitrate")); - adif->num_program_config_elements = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,116,"get_adif_header(): num_program_config_elements")); - - for (i = 0; i < adif->num_program_config_elements + 1; i++) - { - if(adif->bitstream_type == 0) - { - adif->adif_buffer_fullness = faad_getbits(ld, 20 - DEBUGVAR(1,117,"get_adif_header(): adif_buffer_fullness")); - } else { - adif->adif_buffer_fullness = 0; - } - - program_config_element(&adif->pce[i], ld); - } -} - -/* Table 1.A.5 */ -uint8_t adts_frame(adts_header *adts, bitfile *ld) -{ - /* faad_byte_align(ld); */ - if (adts_fixed_header(adts, ld)) - return 5; - adts_variable_header(adts, ld); - adts_error_check(adts, ld); - - return 0; -} - -/* Table 1.A.6 */ -static uint8_t adts_fixed_header(adts_header *adts, bitfile *ld) -{ - uint16_t i; - uint8_t sync_err = 1; - - /* try to recover from sync errors */ - for (i = 0; i < 768; i++) - { - adts->syncword = (uint16_t)faad_showbits(ld, 12); - if (adts->syncword != 0xFFF) - { - faad_getbits(ld, 8 - DEBUGVAR(0,0,"")); - } else { - sync_err = 0; - faad_getbits(ld, 12 - DEBUGVAR(1,118,"adts_fixed_header(): syncword")); - break; - } - } - if (sync_err) - return 5; - - adts->id = faad_get1bit(ld - DEBUGVAR(1,119,"adts_fixed_header(): id")); - adts->layer = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,120,"adts_fixed_header(): layer")); - adts->protection_absent = faad_get1bit(ld - DEBUGVAR(1,121,"adts_fixed_header(): protection_absent")); - adts->profile = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,122,"adts_fixed_header(): profile")); - adts->sf_index = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,123,"adts_fixed_header(): sf_index")); - adts->private_bit = faad_get1bit(ld - DEBUGVAR(1,124,"adts_fixed_header(): private_bit")); - adts->channel_configuration = (uint8_t)faad_getbits(ld, 3 - DEBUGVAR(1,125,"adts_fixed_header(): channel_configuration")); - adts->original = faad_get1bit(ld - DEBUGVAR(1,126,"adts_fixed_header(): original")); - adts->home = faad_get1bit(ld - DEBUGVAR(1,127,"adts_fixed_header(): home")); - - if (adts->old_format == 1) - { - /* Removed in corrigendum 14496-3:2002 */ - if (adts->id == 0) - { - adts->emphasis = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,128,"adts_fixed_header(): emphasis")); - } - } - - return 0; -} - -/* Table 1.A.7 */ -static void adts_variable_header(adts_header *adts, bitfile *ld) -{ - adts->copyright_identification_bit = faad_get1bit(ld - DEBUGVAR(1,129,"adts_variable_header(): copyright_identification_bit")); - adts->copyright_identification_start = faad_get1bit(ld - DEBUGVAR(1,130,"adts_variable_header(): copyright_identification_start")); - adts->aac_frame_length = (uint16_t)faad_getbits(ld, 13 - DEBUGVAR(1,131,"adts_variable_header(): aac_frame_length")); - adts->adts_buffer_fullness = (uint16_t)faad_getbits(ld, 11 - DEBUGVAR(1,132,"adts_variable_header(): adts_buffer_fullness")); - adts->no_raw_data_blocks_in_frame = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,133,"adts_variable_header(): no_raw_data_blocks_in_frame")); -} - -/* Table 1.A.8 */ -static void adts_error_check(adts_header *adts, bitfile *ld) -{ - if (adts->protection_absent == 0) - { - adts->crc_check = (uint16_t)faad_getbits(ld, 16 - DEBUGVAR(1,134,"adts_error_check(): crc_check")); - } -} diff --git a/src/libfaad/syntax.h b/src/libfaad/syntax.h deleted file mode 100644 index a047dd644..000000000 --- a/src/libfaad/syntax.h +++ /dev/null @@ -1,124 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: syntax.h,v 1.10 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __SYNTAX_H__ -#define __SYNTAX_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "decoder.h" -#include "bits.h" - -#define MAIN 1 -#define LC 2 -#define SSR 3 -#define LTP 4 -#define HE_AAC 5 -#define LD 23 -#define ER_LC 17 -#define ER_LTP 19 -#define DRM_ER_LC 27 /* special object type for DRM */ - -/* header types */ -#define RAW 0 -#define ADIF 1 -#define ADTS 2 - -/* SBR signalling */ -#define NO_SBR 0 -#define SBR_UPSAMPLED 1 -#define SBR_DOWNSAMPLED 2 -#define NO_SBR_UPSAMPLED 3 - -/* DRM channel definitions */ -#define DRMCH_MONO 1 -#define DRMCH_STEREO 2 -#define DRMCH_SBR_MONO 3 -#define DRMCH_SBR_STEREO 4 -#define DRMCH_SBR_PS_STEREO 5 - - -/* First object type that has ER */ -#define ER_OBJECT_START 17 - - -/* Bitstream */ -#define LEN_SE_ID 3 -#define LEN_TAG 4 -#define LEN_BYTE 8 - -#define EXT_FIL 0 -#define EXT_FILL_DATA 1 -#define EXT_DATA_ELEMENT 2 -#define EXT_DYNAMIC_RANGE 11 -#define ANC_DATA 0 - -/* Syntax elements */ -#define ID_SCE 0x0 -#define ID_CPE 0x1 -#define ID_CCE 0x2 -#define ID_LFE 0x3 -#define ID_DSE 0x4 -#define ID_PCE 0x5 -#define ID_FIL 0x6 -#define ID_END 0x7 - -#define ONLY_LONG_SEQUENCE 0x0 -#define LONG_START_SEQUENCE 0x1 -#define EIGHT_SHORT_SEQUENCE 0x2 -#define LONG_STOP_SEQUENCE 0x3 - -#define ZERO_HCB 0 -#define FIRST_PAIR_HCB 5 -#define ESC_HCB 11 -#define QUAD_LEN 4 -#define PAIR_LEN 2 -#define NOISE_HCB 13 -#define INTENSITY_HCB2 14 -#define INTENSITY_HCB 15 - -#define INVALID_SBR_ELEMENT 255 - -int8_t GASpecificConfig(bitfile *ld, mp4AudioSpecificConfig *mp4ASC, - program_config *pce); - -uint8_t adts_frame(adts_header *adts, bitfile *ld); -void get_adif_header(adif_header *adif, bitfile *ld); -void raw_data_block(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, - bitfile *ld, program_config *pce, drc_info *drc); -uint8_t reordered_spectral_data(NeAACDecHandle hDecoder, ic_stream *ics, bitfile *ld, - int16_t *spectral_data); -void aac_scalable_main_element(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, - bitfile *ld, program_config *pce, drc_info *drc); - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libfaad/tns.c b/src/libfaad/tns.c deleted file mode 100644 index bb4db731a..000000000 --- a/src/libfaad/tns.c +++ /dev/null @@ -1,306 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: tns.c,v 1.8 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include "syntax.h" -#include "tns.h" - - -/* static function declarations */ -static void tns_decode_coef(uint8_t order, uint8_t coef_res_bits, uint8_t coef_compress, - uint8_t *coef, real_t *a); -static void tns_ar_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, - uint8_t order); -static void tns_ma_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, - uint8_t order); - - -#ifdef _MSC_VER -#pragma warning(disable:4305) -#pragma warning(disable:4244) -#endif -static real_t tns_coef_0_3[] = -{ - COEF_CONST(0.0), COEF_CONST(0.4338837391), COEF_CONST(0.7818314825), COEF_CONST(0.9749279122), - COEF_CONST(-0.9848077530), COEF_CONST(-0.8660254038), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433), - COEF_CONST(-0.4338837391), COEF_CONST(-0.7818314825), COEF_CONST(-0.9749279122), COEF_CONST(-0.9749279122), - COEF_CONST(-0.9848077530), COEF_CONST(-0.8660254038), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433) -}; -static real_t tns_coef_0_4[] = -{ - COEF_CONST(0.0), COEF_CONST(0.2079116908), COEF_CONST(0.4067366431), COEF_CONST(0.5877852523), - COEF_CONST(0.7431448255), COEF_CONST(0.8660254038), COEF_CONST(0.9510565163), COEF_CONST(0.9945218954), - COEF_CONST(-0.9957341763), COEF_CONST(-0.9618256432), COEF_CONST(-0.8951632914), COEF_CONST(-0.7980172273), - COEF_CONST(-0.6736956436), COEF_CONST(-0.5264321629), COEF_CONST(-0.3612416662), COEF_CONST(-0.1837495178) -}; -static real_t tns_coef_1_3[] = -{ - COEF_CONST(0.0), COEF_CONST(0.4338837391), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433), - COEF_CONST(0.9749279122), COEF_CONST(0.7818314825), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433), - COEF_CONST(-0.4338837391), COEF_CONST(-0.7818314825), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433), - COEF_CONST(-0.7818314825), COEF_CONST(-0.4338837391), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433) -}; -static real_t tns_coef_1_4[] = -{ - COEF_CONST(0.0), COEF_CONST(0.2079116908), COEF_CONST(0.4067366431), COEF_CONST(0.5877852523), - COEF_CONST(-0.6736956436), COEF_CONST(-0.5264321629), COEF_CONST(-0.3612416662), COEF_CONST(-0.1837495178), - COEF_CONST(0.9945218954), COEF_CONST(0.9510565163), COEF_CONST(0.8660254038), COEF_CONST(0.7431448255), - COEF_CONST(-0.6736956436), COEF_CONST(-0.5264321629), COEF_CONST(-0.3612416662), COEF_CONST(-0.1837495178) -}; - - -/* TNS decoding for one channel and frame */ -void tns_decode_frame(ic_stream *ics, tns_info *tns, uint8_t sr_index, - uint8_t object_type, real_t *spec, uint16_t frame_len) -{ - uint8_t w, f, tns_order; - int8_t inc; - int16_t size; - uint16_t bottom, top, start, end; - uint16_t nshort = frame_len/8; - real_t lpc[TNS_MAX_ORDER+1]; - - if (!ics->tns_data_present) - return; - - for (w = 0; w < ics->num_windows; w++) - { - bottom = ics->num_swb; - - for (f = 0; f < tns->n_filt[w]; f++) - { - top = bottom; - bottom = max(top - tns->length[w][f], 0); - tns_order = min(tns->order[w][f], TNS_MAX_ORDER); - if (!tns_order) - continue; - - tns_decode_coef(tns_order, tns->coef_res[w]+3, - tns->coef_compress[w][f], tns->coef[w][f], lpc); - - start = min(bottom, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); - start = min(start, ics->max_sfb); - start = ics->swb_offset[start]; - - end = min(top, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); - end = min(end, ics->max_sfb); - end = ics->swb_offset[end]; - - size = end - start; - if (size <= 0) - continue; - - if (tns->direction[w][f]) - { - inc = -1; - start = end - 1; - } else { - inc = 1; - } - - tns_ar_filter(&spec[(w*nshort)+start], size, inc, lpc, tns_order); - } - } -} - -/* TNS encoding for one channel and frame */ -void tns_encode_frame(ic_stream *ics, tns_info *tns, uint8_t sr_index, - uint8_t object_type, real_t *spec, uint16_t frame_len) -{ - uint8_t w, f, tns_order; - int8_t inc; - int16_t size; - uint16_t bottom, top, start, end; - uint16_t nshort = frame_len/8; - real_t lpc[TNS_MAX_ORDER+1]; - - if (!ics->tns_data_present) - return; - - for (w = 0; w < ics->num_windows; w++) - { - bottom = ics->num_swb; - - for (f = 0; f < tns->n_filt[w]; f++) - { - top = bottom; - bottom = max(top - tns->length[w][f], 0); - tns_order = min(tns->order[w][f], TNS_MAX_ORDER); - if (!tns_order) - continue; - - tns_decode_coef(tns_order, tns->coef_res[w]+3, - tns->coef_compress[w][f], tns->coef[w][f], lpc); - - start = min(bottom, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); - start = min(start, ics->max_sfb); - start = ics->swb_offset[start]; - - end = min(top, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); - end = min(end, ics->max_sfb); - end = ics->swb_offset[end]; - - size = end - start; - if (size <= 0) - continue; - - if (tns->direction[w][f]) - { - inc = -1; - start = end - 1; - } else { - inc = 1; - } - - tns_ma_filter(&spec[(w*nshort)+start], size, inc, lpc, tns_order); - } - } -} - -/* Decoder transmitted coefficients for one TNS filter */ -static void tns_decode_coef(uint8_t order, uint8_t coef_res_bits, uint8_t coef_compress, - uint8_t *coef, real_t *a) -{ - uint8_t i, m; - real_t tmp2[TNS_MAX_ORDER+1], b[TNS_MAX_ORDER+1]; - - /* Conversion to signed integer */ - for (i = 0; i < order; i++) - { - if (coef_compress == 0) - { - if (coef_res_bits == 3) - { - tmp2[i] = tns_coef_0_3[coef[i]]; - } else { - tmp2[i] = tns_coef_0_4[coef[i]]; - } - } else { - if (coef_res_bits == 3) - { - tmp2[i] = tns_coef_1_3[coef[i]]; - } else { - tmp2[i] = tns_coef_1_4[coef[i]]; - } - } - } - - /* Conversion to LPC coefficients */ - a[0] = COEF_CONST(1.0); - for (m = 1; m <= order; m++) - { - for (i = 1; i < m; i++) /* loop only while i<m */ - b[i] = a[i] + MUL_C(tmp2[m-1], a[m-i]); - - for (i = 1; i < m; i++) /* loop only while i<m */ - a[i] = b[i]; - - a[m] = tmp2[m-1]; /* changed */ - } -} - -static void tns_ar_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, - uint8_t order) -{ - /* - - Simple all-pole filter of order "order" defined by - y(n) = x(n) - lpc[1]*y(n-1) - ... - lpc[order]*y(n-order) - - The state variables of the filter are initialized to zero every time - - The output data is written over the input data ("in-place operation") - - An input vector of "size" samples is processed and the index increment - to the next data sample is given by "inc" - */ - - uint8_t j; - uint16_t i; - real_t y; - /* state is stored as a double ringbuffer */ - real_t state[2*TNS_MAX_ORDER] = {0}; - int8_t state_index = 0; - - for (i = 0; i < size; i++) - { - y = *spectrum; - - for (j = 0; j < order; j++) - y -= MUL_C(state[state_index+j], lpc[j+1]); - - /* double ringbuffer state */ - state_index--; - if (state_index < 0) - state_index = order-1; - state[state_index] = state[state_index + order] = y; - - *spectrum = y; - spectrum += inc; - -//#define TNS_PRINT -#ifdef TNS_PRINT - //printf("%d\n", y); - printf("0x%.8X\n", y); -#endif - } -} - -static void tns_ma_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, - uint8_t order) -{ - /* - - Simple all-zero filter of order "order" defined by - y(n) = x(n) + a(2)*x(n-1) + ... + a(order+1)*x(n-order) - - The state variables of the filter are initialized to zero every time - - The output data is written over the input data ("in-place operation") - - An input vector of "size" samples is processed and the index increment - to the next data sample is given by "inc" - */ - - uint8_t j; - uint16_t i; - real_t y; - /* state is stored as a double ringbuffer */ - real_t state[2*TNS_MAX_ORDER] = {0}; - int8_t state_index = 0; - - for (i = 0; i < size; i++) - { - y = *spectrum; - - for (j = 0; j < order; j++) - y += MUL_C(state[j], lpc[j+1]); - - /* double ringbuffer state */ - state_index--; - if (state_index < 0) - state_index = order-1; - state[state_index] = state[state_index + order] = *spectrum; - - *spectrum = y; - spectrum += inc; - } -} diff --git a/src/libfaad/tns.h b/src/libfaad/tns.h deleted file mode 100644 index fc77894d8..000000000 --- a/src/libfaad/tns.h +++ /dev/null @@ -1,48 +0,0 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com -** -** 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. -** -** Any non-GPL usage of this software or parts of this software is strictly -** forbidden. -** -** Commercial non-GPL licensing of this software is possible. -** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. -** -** $Id: tns.h,v 1.8 2005/10/29 23:57:07 tmmm Exp $ -**/ - -#ifndef __TNS_H__ -#define __TNS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -#define TNS_MAX_ORDER 20 - - -void tns_decode_frame(ic_stream *ics, tns_info *tns, uint8_t sr_index, - uint8_t object_type, real_t *spec, uint16_t frame_len); -void tns_encode_frame(ic_stream *ics, tns_info *tns, uint8_t sr_index, - uint8_t object_type, real_t *spec, uint16_t frame_len); - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/libmad/D.dat b/src/libmad/D.dat deleted file mode 100644 index 31c6cd4fa..000000000 --- a/src/libmad/D.dat +++ /dev/null @@ -1,607 +0,0 @@ -/* - * 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: D.dat,v 1.3 2004/04/22 00:22:33 miguelfreitas Exp $ - */ - -/* - * These are the coefficients for the subband synthesis window. This is a - * reordered version of Table B.3 from ISO/IEC 11172-3. - * - * Every value is parameterized so that shift optimizations can be made at - * compile-time. For example, every value can be right-shifted 12 bits to - * minimize multiply instruction times without any loss of accuracy. - */ - - { PRESHIFT(0x00000000) /* 0.000000000 */, /* 0 */ - -PRESHIFT(0x0001d000) /* -0.000442505 */, - PRESHIFT(0x000d5000) /* 0.003250122 */, - -PRESHIFT(0x001cb000) /* -0.007003784 */, - PRESHIFT(0x007f5000) /* 0.031082153 */, - -PRESHIFT(0x01421000) /* -0.078628540 */, - PRESHIFT(0x019ae000) /* 0.100311279 */, - -PRESHIFT(0x09271000) /* -0.572036743 */, - PRESHIFT(0x1251e000) /* 1.144989014 */, - PRESHIFT(0x09271000) /* 0.572036743 */, - PRESHIFT(0x019ae000) /* 0.100311279 */, - PRESHIFT(0x01421000) /* 0.078628540 */, - PRESHIFT(0x007f5000) /* 0.031082153 */, - PRESHIFT(0x001cb000) /* 0.007003784 */, - PRESHIFT(0x000d5000) /* 0.003250122 */, - PRESHIFT(0x0001d000) /* 0.000442505 */, - - PRESHIFT(0x00000000) /* 0.000000000 */, - -PRESHIFT(0x0001d000) /* -0.000442505 */, - PRESHIFT(0x000d5000) /* 0.003250122 */, - -PRESHIFT(0x001cb000) /* -0.007003784 */, - PRESHIFT(0x007f5000) /* 0.031082153 */, - -PRESHIFT(0x01421000) /* -0.078628540 */, - PRESHIFT(0x019ae000) /* 0.100311279 */, - -PRESHIFT(0x09271000) /* -0.572036743 */, - PRESHIFT(0x1251e000) /* 1.144989014 */, - PRESHIFT(0x09271000) /* 0.572036743 */, - PRESHIFT(0x019ae000) /* 0.100311279 */, - PRESHIFT(0x01421000) /* 0.078628540 */, - PRESHIFT(0x007f5000) /* 0.031082153 */, - PRESHIFT(0x001cb000) /* 0.007003784 */, - PRESHIFT(0x000d5000) /* 0.003250122 */, - PRESHIFT(0x0001d000) /* 0.000442505 */ }, - - { -PRESHIFT(0x00001000) /* -0.000015259 */, /* 1 */ - -PRESHIFT(0x0001f000) /* -0.000473022 */, - PRESHIFT(0x000da000) /* 0.003326416 */, - -PRESHIFT(0x00207000) /* -0.007919312 */, - PRESHIFT(0x007d0000) /* 0.030517578 */, - -PRESHIFT(0x0158d000) /* -0.084182739 */, - PRESHIFT(0x01747000) /* 0.090927124 */, - -PRESHIFT(0x099a8000) /* -0.600219727 */, - PRESHIFT(0x124f0000) /* 1.144287109 */, - PRESHIFT(0x08b38000) /* 0.543823242 */, - PRESHIFT(0x01bde000) /* 0.108856201 */, - PRESHIFT(0x012b4000) /* 0.073059082 */, - PRESHIFT(0x0080f000) /* 0.031478882 */, - PRESHIFT(0x00191000) /* 0.006118774 */, - PRESHIFT(0x000d0000) /* 0.003173828 */, - PRESHIFT(0x0001a000) /* 0.000396729 */, - - -PRESHIFT(0x00001000) /* -0.000015259 */, - -PRESHIFT(0x0001f000) /* -0.000473022 */, - PRESHIFT(0x000da000) /* 0.003326416 */, - -PRESHIFT(0x00207000) /* -0.007919312 */, - PRESHIFT(0x007d0000) /* 0.030517578 */, - -PRESHIFT(0x0158d000) /* -0.084182739 */, - PRESHIFT(0x01747000) /* 0.090927124 */, - -PRESHIFT(0x099a8000) /* -0.600219727 */, - PRESHIFT(0x124f0000) /* 1.144287109 */, - PRESHIFT(0x08b38000) /* 0.543823242 */, - PRESHIFT(0x01bde000) /* 0.108856201 */, - PRESHIFT(0x012b4000) /* 0.073059082 */, - PRESHIFT(0x0080f000) /* 0.031478882 */, - PRESHIFT(0x00191000) /* 0.006118774 */, - PRESHIFT(0x000d0000) /* 0.003173828 */, - PRESHIFT(0x0001a000) /* 0.000396729 */ }, - - { -PRESHIFT(0x00001000) /* -0.000015259 */, /* 2 */ - -PRESHIFT(0x00023000) /* -0.000534058 */, - PRESHIFT(0x000de000) /* 0.003387451 */, - -PRESHIFT(0x00245000) /* -0.008865356 */, - PRESHIFT(0x007a0000) /* 0.029785156 */, - -PRESHIFT(0x016f7000) /* -0.089706421 */, - PRESHIFT(0x014a8000) /* 0.080688477 */, - -PRESHIFT(0x0a0d8000) /* -0.628295898 */, - PRESHIFT(0x12468000) /* 1.142211914 */, - PRESHIFT(0x083ff000) /* 0.515609741 */, - PRESHIFT(0x01dd8000) /* 0.116577148 */, - PRESHIFT(0x01149000) /* 0.067520142 */, - PRESHIFT(0x00820000) /* 0.031738281 */, - PRESHIFT(0x0015b000) /* 0.005294800 */, - PRESHIFT(0x000ca000) /* 0.003082275 */, - PRESHIFT(0x00018000) /* 0.000366211 */, - - -PRESHIFT(0x00001000) /* -0.000015259 */, - -PRESHIFT(0x00023000) /* -0.000534058 */, - PRESHIFT(0x000de000) /* 0.003387451 */, - -PRESHIFT(0x00245000) /* -0.008865356 */, - PRESHIFT(0x007a0000) /* 0.029785156 */, - -PRESHIFT(0x016f7000) /* -0.089706421 */, - PRESHIFT(0x014a8000) /* 0.080688477 */, - -PRESHIFT(0x0a0d8000) /* -0.628295898 */, - PRESHIFT(0x12468000) /* 1.142211914 */, - PRESHIFT(0x083ff000) /* 0.515609741 */, - PRESHIFT(0x01dd8000) /* 0.116577148 */, - PRESHIFT(0x01149000) /* 0.067520142 */, - PRESHIFT(0x00820000) /* 0.031738281 */, - PRESHIFT(0x0015b000) /* 0.005294800 */, - PRESHIFT(0x000ca000) /* 0.003082275 */, - PRESHIFT(0x00018000) /* 0.000366211 */ }, - - { -PRESHIFT(0x00001000) /* -0.000015259 */, /* 3 */ - -PRESHIFT(0x00026000) /* -0.000579834 */, - PRESHIFT(0x000e1000) /* 0.003433228 */, - -PRESHIFT(0x00285000) /* -0.009841919 */, - PRESHIFT(0x00765000) /* 0.028884888 */, - -PRESHIFT(0x0185d000) /* -0.095169067 */, - PRESHIFT(0x011d1000) /* 0.069595337 */, - -PRESHIFT(0x0a7fe000) /* -0.656219482 */, - PRESHIFT(0x12386000) /* 1.138763428 */, - PRESHIFT(0x07ccb000) /* 0.487472534 */, - PRESHIFT(0x01f9c000) /* 0.123474121 */, - PRESHIFT(0x00fdf000) /* 0.061996460 */, - PRESHIFT(0x00827000) /* 0.031845093 */, - PRESHIFT(0x00126000) /* 0.004486084 */, - PRESHIFT(0x000c4000) /* 0.002990723 */, - PRESHIFT(0x00015000) /* 0.000320435 */, - - -PRESHIFT(0x00001000) /* -0.000015259 */, - -PRESHIFT(0x00026000) /* -0.000579834 */, - PRESHIFT(0x000e1000) /* 0.003433228 */, - -PRESHIFT(0x00285000) /* -0.009841919 */, - PRESHIFT(0x00765000) /* 0.028884888 */, - -PRESHIFT(0x0185d000) /* -0.095169067 */, - PRESHIFT(0x011d1000) /* 0.069595337 */, - -PRESHIFT(0x0a7fe000) /* -0.656219482 */, - PRESHIFT(0x12386000) /* 1.138763428 */, - PRESHIFT(0x07ccb000) /* 0.487472534 */, - PRESHIFT(0x01f9c000) /* 0.123474121 */, - PRESHIFT(0x00fdf000) /* 0.061996460 */, - PRESHIFT(0x00827000) /* 0.031845093 */, - PRESHIFT(0x00126000) /* 0.004486084 */, - PRESHIFT(0x000c4000) /* 0.002990723 */, - PRESHIFT(0x00015000) /* 0.000320435 */ }, - - { -PRESHIFT(0x00001000) /* -0.000015259 */, /* 4 */ - -PRESHIFT(0x00029000) /* -0.000625610 */, - PRESHIFT(0x000e3000) /* 0.003463745 */, - -PRESHIFT(0x002c7000) /* -0.010848999 */, - PRESHIFT(0x0071e000) /* 0.027801514 */, - -PRESHIFT(0x019bd000) /* -0.100540161 */, - PRESHIFT(0x00ec0000) /* 0.057617187 */, - -PRESHIFT(0x0af15000) /* -0.683914185 */, - PRESHIFT(0x12249000) /* 1.133926392 */, - PRESHIFT(0x075a0000) /* 0.459472656 */, - PRESHIFT(0x0212c000) /* 0.129577637 */, - PRESHIFT(0x00e79000) /* 0.056533813 */, - PRESHIFT(0x00825000) /* 0.031814575 */, - PRESHIFT(0x000f4000) /* 0.003723145 */, - PRESHIFT(0x000be000) /* 0.002899170 */, - PRESHIFT(0x00013000) /* 0.000289917 */, - - -PRESHIFT(0x00001000) /* -0.000015259 */, - -PRESHIFT(0x00029000) /* -0.000625610 */, - PRESHIFT(0x000e3000) /* 0.003463745 */, - -PRESHIFT(0x002c7000) /* -0.010848999 */, - PRESHIFT(0x0071e000) /* 0.027801514 */, - -PRESHIFT(0x019bd000) /* -0.100540161 */, - PRESHIFT(0x00ec0000) /* 0.057617187 */, - -PRESHIFT(0x0af15000) /* -0.683914185 */, - PRESHIFT(0x12249000) /* 1.133926392 */, - PRESHIFT(0x075a0000) /* 0.459472656 */, - PRESHIFT(0x0212c000) /* 0.129577637 */, - PRESHIFT(0x00e79000) /* 0.056533813 */, - PRESHIFT(0x00825000) /* 0.031814575 */, - PRESHIFT(0x000f4000) /* 0.003723145 */, - PRESHIFT(0x000be000) /* 0.002899170 */, - PRESHIFT(0x00013000) /* 0.000289917 */ }, - - { -PRESHIFT(0x00001000) /* -0.000015259 */, /* 5 */ - -PRESHIFT(0x0002d000) /* -0.000686646 */, - PRESHIFT(0x000e4000) /* 0.003479004 */, - -PRESHIFT(0x0030b000) /* -0.011886597 */, - PRESHIFT(0x006cb000) /* 0.026535034 */, - -PRESHIFT(0x01b17000) /* -0.105819702 */, - PRESHIFT(0x00b77000) /* 0.044784546 */, - -PRESHIFT(0x0b619000) /* -0.711318970 */, - PRESHIFT(0x120b4000) /* 1.127746582 */, - PRESHIFT(0x06e81000) /* 0.431655884 */, - PRESHIFT(0x02288000) /* 0.134887695 */, - PRESHIFT(0x00d17000) /* 0.051132202 */, - PRESHIFT(0x0081b000) /* 0.031661987 */, - PRESHIFT(0x000c5000) /* 0.003005981 */, - PRESHIFT(0x000b7000) /* 0.002792358 */, - PRESHIFT(0x00011000) /* 0.000259399 */, - - -PRESHIFT(0x00001000) /* -0.000015259 */, - -PRESHIFT(0x0002d000) /* -0.000686646 */, - PRESHIFT(0x000e4000) /* 0.003479004 */, - -PRESHIFT(0x0030b000) /* -0.011886597 */, - PRESHIFT(0x006cb000) /* 0.026535034 */, - -PRESHIFT(0x01b17000) /* -0.105819702 */, - PRESHIFT(0x00b77000) /* 0.044784546 */, - -PRESHIFT(0x0b619000) /* -0.711318970 */, - PRESHIFT(0x120b4000) /* 1.127746582 */, - PRESHIFT(0x06e81000) /* 0.431655884 */, - PRESHIFT(0x02288000) /* 0.134887695 */, - PRESHIFT(0x00d17000) /* 0.051132202 */, - PRESHIFT(0x0081b000) /* 0.031661987 */, - PRESHIFT(0x000c5000) /* 0.003005981 */, - PRESHIFT(0x000b7000) /* 0.002792358 */, - PRESHIFT(0x00011000) /* 0.000259399 */ }, - - { -PRESHIFT(0x00001000) /* -0.000015259 */, /* 6 */ - -PRESHIFT(0x00031000) /* -0.000747681 */, - PRESHIFT(0x000e4000) /* 0.003479004 */, - -PRESHIFT(0x00350000) /* -0.012939453 */, - PRESHIFT(0x0066c000) /* 0.025085449 */, - -PRESHIFT(0x01c67000) /* -0.110946655 */, - PRESHIFT(0x007f5000) /* 0.031082153 */, - -PRESHIFT(0x0bd06000) /* -0.738372803 */, - PRESHIFT(0x11ec7000) /* 1.120223999 */, - PRESHIFT(0x06772000) /* 0.404083252 */, - PRESHIFT(0x023b3000) /* 0.139450073 */, - PRESHIFT(0x00bbc000) /* 0.045837402 */, - PRESHIFT(0x00809000) /* 0.031387329 */, - PRESHIFT(0x00099000) /* 0.002334595 */, - PRESHIFT(0x000b0000) /* 0.002685547 */, - PRESHIFT(0x00010000) /* 0.000244141 */, - - -PRESHIFT(0x00001000) /* -0.000015259 */, - -PRESHIFT(0x00031000) /* -0.000747681 */, - PRESHIFT(0x000e4000) /* 0.003479004 */, - -PRESHIFT(0x00350000) /* -0.012939453 */, - PRESHIFT(0x0066c000) /* 0.025085449 */, - -PRESHIFT(0x01c67000) /* -0.110946655 */, - PRESHIFT(0x007f5000) /* 0.031082153 */, - -PRESHIFT(0x0bd06000) /* -0.738372803 */, - PRESHIFT(0x11ec7000) /* 1.120223999 */, - PRESHIFT(0x06772000) /* 0.404083252 */, - PRESHIFT(0x023b3000) /* 0.139450073 */, - PRESHIFT(0x00bbc000) /* 0.045837402 */, - PRESHIFT(0x00809000) /* 0.031387329 */, - PRESHIFT(0x00099000) /* 0.002334595 */, - PRESHIFT(0x000b0000) /* 0.002685547 */, - PRESHIFT(0x00010000) /* 0.000244141 */ }, - - { -PRESHIFT(0x00002000) /* -0.000030518 */, /* 7 */ - -PRESHIFT(0x00035000) /* -0.000808716 */, - PRESHIFT(0x000e3000) /* 0.003463745 */, - -PRESHIFT(0x00397000) /* -0.014022827 */, - PRESHIFT(0x005ff000) /* 0.023422241 */, - -PRESHIFT(0x01dad000) /* -0.115921021 */, - PRESHIFT(0x0043a000) /* 0.016510010 */, - -PRESHIFT(0x0c3d9000) /* -0.765029907 */, - PRESHIFT(0x11c83000) /* 1.111373901 */, - PRESHIFT(0x06076000) /* 0.376800537 */, - PRESHIFT(0x024ad000) /* 0.143264771 */, - PRESHIFT(0x00a67000) /* 0.040634155 */, - PRESHIFT(0x007f0000) /* 0.031005859 */, - PRESHIFT(0x0006f000) /* 0.001693726 */, - PRESHIFT(0x000a9000) /* 0.002578735 */, - PRESHIFT(0x0000e000) /* 0.000213623 */, - - -PRESHIFT(0x00002000) /* -0.000030518 */, - -PRESHIFT(0x00035000) /* -0.000808716 */, - PRESHIFT(0x000e3000) /* 0.003463745 */, - -PRESHIFT(0x00397000) /* -0.014022827 */, - PRESHIFT(0x005ff000) /* 0.023422241 */, - -PRESHIFT(0x01dad000) /* -0.115921021 */, - PRESHIFT(0x0043a000) /* 0.016510010 */, - -PRESHIFT(0x0c3d9000) /* -0.765029907 */, - PRESHIFT(0x11c83000) /* 1.111373901 */, - PRESHIFT(0x06076000) /* 0.376800537 */, - PRESHIFT(0x024ad000) /* 0.143264771 */, - PRESHIFT(0x00a67000) /* 0.040634155 */, - PRESHIFT(0x007f0000) /* 0.031005859 */, - PRESHIFT(0x0006f000) /* 0.001693726 */, - PRESHIFT(0x000a9000) /* 0.002578735 */, - PRESHIFT(0x0000e000) /* 0.000213623 */ }, - - { -PRESHIFT(0x00002000) /* -0.000030518 */, /* 8 */ - -PRESHIFT(0x0003a000) /* -0.000885010 */, - PRESHIFT(0x000e0000) /* 0.003417969 */, - -PRESHIFT(0x003df000) /* -0.015121460 */, - PRESHIFT(0x00586000) /* 0.021575928 */, - -PRESHIFT(0x01ee6000) /* -0.120697021 */, - PRESHIFT(0x00046000) /* 0.001068115 */, - -PRESHIFT(0x0ca8d000) /* -0.791213989 */, - PRESHIFT(0x119e9000) /* 1.101211548 */, - PRESHIFT(0x05991000) /* 0.349868774 */, - PRESHIFT(0x02578000) /* 0.146362305 */, - PRESHIFT(0x0091a000) /* 0.035552979 */, - PRESHIFT(0x007d1000) /* 0.030532837 */, - PRESHIFT(0x00048000) /* 0.001098633 */, - PRESHIFT(0x000a1000) /* 0.002456665 */, - PRESHIFT(0x0000d000) /* 0.000198364 */, - - -PRESHIFT(0x00002000) /* -0.000030518 */, - -PRESHIFT(0x0003a000) /* -0.000885010 */, - PRESHIFT(0x000e0000) /* 0.003417969 */, - -PRESHIFT(0x003df000) /* -0.015121460 */, - PRESHIFT(0x00586000) /* 0.021575928 */, - -PRESHIFT(0x01ee6000) /* -0.120697021 */, - PRESHIFT(0x00046000) /* 0.001068115 */, - -PRESHIFT(0x0ca8d000) /* -0.791213989 */, - PRESHIFT(0x119e9000) /* 1.101211548 */, - PRESHIFT(0x05991000) /* 0.349868774 */, - PRESHIFT(0x02578000) /* 0.146362305 */, - PRESHIFT(0x0091a000) /* 0.035552979 */, - PRESHIFT(0x007d1000) /* 0.030532837 */, - PRESHIFT(0x00048000) /* 0.001098633 */, - PRESHIFT(0x000a1000) /* 0.002456665 */, - PRESHIFT(0x0000d000) /* 0.000198364 */ }, - - { -PRESHIFT(0x00002000) /* -0.000030518 */, /* 9 */ - -PRESHIFT(0x0003f000) /* -0.000961304 */, - PRESHIFT(0x000dd000) /* 0.003372192 */, - -PRESHIFT(0x00428000) /* -0.016235352 */, - PRESHIFT(0x00500000) /* 0.019531250 */, - -PRESHIFT(0x02011000) /* -0.125259399 */, - -PRESHIFT(0x003e6000) /* -0.015228271 */, - -PRESHIFT(0x0d11e000) /* -0.816864014 */, - PRESHIFT(0x116fc000) /* 1.089782715 */, - PRESHIFT(0x052c5000) /* 0.323318481 */, - PRESHIFT(0x02616000) /* 0.148773193 */, - PRESHIFT(0x007d6000) /* 0.030609131 */, - PRESHIFT(0x007aa000) /* 0.029937744 */, - PRESHIFT(0x00024000) /* 0.000549316 */, - PRESHIFT(0x0009a000) /* 0.002349854 */, - PRESHIFT(0x0000b000) /* 0.000167847 */, - - -PRESHIFT(0x00002000) /* -0.000030518 */, - -PRESHIFT(0x0003f000) /* -0.000961304 */, - PRESHIFT(0x000dd000) /* 0.003372192 */, - -PRESHIFT(0x00428000) /* -0.016235352 */, - PRESHIFT(0x00500000) /* 0.019531250 */, - -PRESHIFT(0x02011000) /* -0.125259399 */, - -PRESHIFT(0x003e6000) /* -0.015228271 */, - -PRESHIFT(0x0d11e000) /* -0.816864014 */, - PRESHIFT(0x116fc000) /* 1.089782715 */, - PRESHIFT(0x052c5000) /* 0.323318481 */, - PRESHIFT(0x02616000) /* 0.148773193 */, - PRESHIFT(0x007d6000) /* 0.030609131 */, - PRESHIFT(0x007aa000) /* 0.029937744 */, - PRESHIFT(0x00024000) /* 0.000549316 */, - PRESHIFT(0x0009a000) /* 0.002349854 */, - PRESHIFT(0x0000b000) /* 0.000167847 */ }, - - { -PRESHIFT(0x00002000) /* -0.000030518 */, /* 10 */ - -PRESHIFT(0x00044000) /* -0.001037598 */, - PRESHIFT(0x000d7000) /* 0.003280640 */, - -PRESHIFT(0x00471000) /* -0.017349243 */, - PRESHIFT(0x0046b000) /* 0.017257690 */, - -PRESHIFT(0x0212b000) /* -0.129562378 */, - -PRESHIFT(0x0084a000) /* -0.032379150 */, - -PRESHIFT(0x0d78a000) /* -0.841949463 */, - PRESHIFT(0x113be000) /* 1.077117920 */, - PRESHIFT(0x04c16000) /* 0.297210693 */, - PRESHIFT(0x02687000) /* 0.150497437 */, - PRESHIFT(0x0069c000) /* 0.025817871 */, - PRESHIFT(0x0077f000) /* 0.029281616 */, - PRESHIFT(0x00002000) /* 0.000030518 */, - PRESHIFT(0x00093000) /* 0.002243042 */, - PRESHIFT(0x0000a000) /* 0.000152588 */, - - -PRESHIFT(0x00002000) /* -0.000030518 */, - -PRESHIFT(0x00044000) /* -0.001037598 */, - PRESHIFT(0x000d7000) /* 0.003280640 */, - -PRESHIFT(0x00471000) /* -0.017349243 */, - PRESHIFT(0x0046b000) /* 0.017257690 */, - -PRESHIFT(0x0212b000) /* -0.129562378 */, - -PRESHIFT(0x0084a000) /* -0.032379150 */, - -PRESHIFT(0x0d78a000) /* -0.841949463 */, - PRESHIFT(0x113be000) /* 1.077117920 */, - PRESHIFT(0x04c16000) /* 0.297210693 */, - PRESHIFT(0x02687000) /* 0.150497437 */, - PRESHIFT(0x0069c000) /* 0.025817871 */, - PRESHIFT(0x0077f000) /* 0.029281616 */, - PRESHIFT(0x00002000) /* 0.000030518 */, - PRESHIFT(0x00093000) /* 0.002243042 */, - PRESHIFT(0x0000a000) /* 0.000152588 */ }, - - { -PRESHIFT(0x00003000) /* -0.000045776 */, /* 11 */ - -PRESHIFT(0x00049000) /* -0.001113892 */, - PRESHIFT(0x000d0000) /* 0.003173828 */, - -PRESHIFT(0x004ba000) /* -0.018463135 */, - PRESHIFT(0x003ca000) /* 0.014801025 */, - -PRESHIFT(0x02233000) /* -0.133590698 */, - -PRESHIFT(0x00ce4000) /* -0.050354004 */, - -PRESHIFT(0x0ddca000) /* -0.866363525 */, - PRESHIFT(0x1102f000) /* 1.063217163 */, - PRESHIFT(0x04587000) /* 0.271591187 */, - PRESHIFT(0x026cf000) /* 0.151596069 */, - PRESHIFT(0x0056c000) /* 0.021179199 */, - PRESHIFT(0x0074e000) /* 0.028533936 */, - -PRESHIFT(0x0001d000) /* -0.000442505 */, - PRESHIFT(0x0008b000) /* 0.002120972 */, - PRESHIFT(0x00009000) /* 0.000137329 */, - - -PRESHIFT(0x00003000) /* -0.000045776 */, - -PRESHIFT(0x00049000) /* -0.001113892 */, - PRESHIFT(0x000d0000) /* 0.003173828 */, - -PRESHIFT(0x004ba000) /* -0.018463135 */, - PRESHIFT(0x003ca000) /* 0.014801025 */, - -PRESHIFT(0x02233000) /* -0.133590698 */, - -PRESHIFT(0x00ce4000) /* -0.050354004 */, - -PRESHIFT(0x0ddca000) /* -0.866363525 */, - PRESHIFT(0x1102f000) /* 1.063217163 */, - PRESHIFT(0x04587000) /* 0.271591187 */, - PRESHIFT(0x026cf000) /* 0.151596069 */, - PRESHIFT(0x0056c000) /* 0.021179199 */, - PRESHIFT(0x0074e000) /* 0.028533936 */, - -PRESHIFT(0x0001d000) /* -0.000442505 */, - PRESHIFT(0x0008b000) /* 0.002120972 */, - PRESHIFT(0x00009000) /* 0.000137329 */ }, - - { -PRESHIFT(0x00003000) /* -0.000045776 */, /* 12 */ - -PRESHIFT(0x0004f000) /* -0.001205444 */, - PRESHIFT(0x000c8000) /* 0.003051758 */, - -PRESHIFT(0x00503000) /* -0.019577026 */, - PRESHIFT(0x0031a000) /* 0.012115479 */, - -PRESHIFT(0x02326000) /* -0.137298584 */, - -PRESHIFT(0x011b5000) /* -0.069168091 */, - -PRESHIFT(0x0e3dd000) /* -0.890090942 */, - PRESHIFT(0x10c54000) /* 1.048156738 */, - PRESHIFT(0x03f1b000) /* 0.246505737 */, - PRESHIFT(0x026ee000) /* 0.152069092 */, - PRESHIFT(0x00447000) /* 0.016708374 */, - PRESHIFT(0x00719000) /* 0.027725220 */, - -PRESHIFT(0x00039000) /* -0.000869751 */, - PRESHIFT(0x00084000) /* 0.002014160 */, - PRESHIFT(0x00008000) /* 0.000122070 */, - - -PRESHIFT(0x00003000) /* -0.000045776 */, - -PRESHIFT(0x0004f000) /* -0.001205444 */, - PRESHIFT(0x000c8000) /* 0.003051758 */, - -PRESHIFT(0x00503000) /* -0.019577026 */, - PRESHIFT(0x0031a000) /* 0.012115479 */, - -PRESHIFT(0x02326000) /* -0.137298584 */, - -PRESHIFT(0x011b5000) /* -0.069168091 */, - -PRESHIFT(0x0e3dd000) /* -0.890090942 */, - PRESHIFT(0x10c54000) /* 1.048156738 */, - PRESHIFT(0x03f1b000) /* 0.246505737 */, - PRESHIFT(0x026ee000) /* 0.152069092 */, - PRESHIFT(0x00447000) /* 0.016708374 */, - PRESHIFT(0x00719000) /* 0.027725220 */, - -PRESHIFT(0x00039000) /* -0.000869751 */, - PRESHIFT(0x00084000) /* 0.002014160 */, - PRESHIFT(0x00008000) /* 0.000122070 */ }, - - { -PRESHIFT(0x00004000) /* -0.000061035 */, /* 13 */ - -PRESHIFT(0x00055000) /* -0.001296997 */, - PRESHIFT(0x000bd000) /* 0.002883911 */, - -PRESHIFT(0x0054c000) /* -0.020690918 */, - PRESHIFT(0x0025d000) /* 0.009231567 */, - -PRESHIFT(0x02403000) /* -0.140670776 */, - -PRESHIFT(0x016ba000) /* -0.088775635 */, - -PRESHIFT(0x0e9be000) /* -0.913055420 */, - PRESHIFT(0x1082d000) /* 1.031936646 */, - PRESHIFT(0x038d4000) /* 0.221984863 */, - PRESHIFT(0x026e7000) /* 0.151962280 */, - PRESHIFT(0x0032e000) /* 0.012420654 */, - PRESHIFT(0x006df000) /* 0.026840210 */, - -PRESHIFT(0x00053000) /* -0.001266479 */, - PRESHIFT(0x0007d000) /* 0.001907349 */, - PRESHIFT(0x00007000) /* 0.000106812 */, - - -PRESHIFT(0x00004000) /* -0.000061035 */, - -PRESHIFT(0x00055000) /* -0.001296997 */, - PRESHIFT(0x000bd000) /* 0.002883911 */, - -PRESHIFT(0x0054c000) /* -0.020690918 */, - PRESHIFT(0x0025d000) /* 0.009231567 */, - -PRESHIFT(0x02403000) /* -0.140670776 */, - -PRESHIFT(0x016ba000) /* -0.088775635 */, - -PRESHIFT(0x0e9be000) /* -0.913055420 */, - PRESHIFT(0x1082d000) /* 1.031936646 */, - PRESHIFT(0x038d4000) /* 0.221984863 */, - PRESHIFT(0x026e7000) /* 0.151962280 */, - PRESHIFT(0x0032e000) /* 0.012420654 */, - PRESHIFT(0x006df000) /* 0.026840210 */, - -PRESHIFT(0x00053000) /* -0.001266479 */, - PRESHIFT(0x0007d000) /* 0.001907349 */, - PRESHIFT(0x00007000) /* 0.000106812 */ }, - - { -PRESHIFT(0x00004000) /* -0.000061035 */, /* 14 */ - -PRESHIFT(0x0005b000) /* -0.001388550 */, - PRESHIFT(0x000b1000) /* 0.002700806 */, - -PRESHIFT(0x00594000) /* -0.021789551 */, - PRESHIFT(0x00192000) /* 0.006134033 */, - -PRESHIFT(0x024c8000) /* -0.143676758 */, - -PRESHIFT(0x01bf2000) /* -0.109161377 */, - -PRESHIFT(0x0ef69000) /* -0.935195923 */, - PRESHIFT(0x103be000) /* 1.014617920 */, - PRESHIFT(0x032b4000) /* 0.198059082 */, - PRESHIFT(0x026bc000) /* 0.151306152 */, - PRESHIFT(0x00221000) /* 0.008316040 */, - PRESHIFT(0x006a2000) /* 0.025909424 */, - -PRESHIFT(0x0006a000) /* -0.001617432 */, - PRESHIFT(0x00075000) /* 0.001785278 */, - PRESHIFT(0x00007000) /* 0.000106812 */, - - -PRESHIFT(0x00004000) /* -0.000061035 */, - -PRESHIFT(0x0005b000) /* -0.001388550 */, - PRESHIFT(0x000b1000) /* 0.002700806 */, - -PRESHIFT(0x00594000) /* -0.021789551 */, - PRESHIFT(0x00192000) /* 0.006134033 */, - -PRESHIFT(0x024c8000) /* -0.143676758 */, - -PRESHIFT(0x01bf2000) /* -0.109161377 */, - -PRESHIFT(0x0ef69000) /* -0.935195923 */, - PRESHIFT(0x103be000) /* 1.014617920 */, - PRESHIFT(0x032b4000) /* 0.198059082 */, - PRESHIFT(0x026bc000) /* 0.151306152 */, - PRESHIFT(0x00221000) /* 0.008316040 */, - PRESHIFT(0x006a2000) /* 0.025909424 */, - -PRESHIFT(0x0006a000) /* -0.001617432 */, - PRESHIFT(0x00075000) /* 0.001785278 */, - PRESHIFT(0x00007000) /* 0.000106812 */ }, - - { -PRESHIFT(0x00005000) /* -0.000076294 */, /* 15 */ - -PRESHIFT(0x00061000) /* -0.001480103 */, - PRESHIFT(0x000a3000) /* 0.002487183 */, - -PRESHIFT(0x005da000) /* -0.022857666 */, - PRESHIFT(0x000b9000) /* 0.002822876 */, - -PRESHIFT(0x02571000) /* -0.146255493 */, - -PRESHIFT(0x0215c000) /* -0.130310059 */, - -PRESHIFT(0x0f4dc000) /* -0.956481934 */, - PRESHIFT(0x0ff0a000) /* 0.996246338 */, - PRESHIFT(0x02cbf000) /* 0.174789429 */, - PRESHIFT(0x0266e000) /* 0.150115967 */, - PRESHIFT(0x00120000) /* 0.004394531 */, - PRESHIFT(0x00662000) /* 0.024932861 */, - -PRESHIFT(0x0007f000) /* -0.001937866 */, - PRESHIFT(0x0006f000) /* 0.001693726 */, - PRESHIFT(0x00006000) /* 0.000091553 */, - - -PRESHIFT(0x00005000) /* -0.000076294 */, - -PRESHIFT(0x00061000) /* -0.001480103 */, - PRESHIFT(0x000a3000) /* 0.002487183 */, - -PRESHIFT(0x005da000) /* -0.022857666 */, - PRESHIFT(0x000b9000) /* 0.002822876 */, - -PRESHIFT(0x02571000) /* -0.146255493 */, - -PRESHIFT(0x0215c000) /* -0.130310059 */, - -PRESHIFT(0x0f4dc000) /* -0.956481934 */, - PRESHIFT(0x0ff0a000) /* 0.996246338 */, - PRESHIFT(0x02cbf000) /* 0.174789429 */, - PRESHIFT(0x0266e000) /* 0.150115967 */, - PRESHIFT(0x00120000) /* 0.004394531 */, - PRESHIFT(0x00662000) /* 0.024932861 */, - -PRESHIFT(0x0007f000) /* -0.001937866 */, - PRESHIFT(0x0006f000) /* 0.001693726 */, - PRESHIFT(0x00006000) /* 0.000091553 */ }, - - { -PRESHIFT(0x00005000) /* -0.000076294 */, /* 16 */ - -PRESHIFT(0x00068000) /* -0.001586914 */, - PRESHIFT(0x00092000) /* 0.002227783 */, - -PRESHIFT(0x0061f000) /* -0.023910522 */, - -PRESHIFT(0x0002d000) /* -0.000686646 */, - -PRESHIFT(0x025ff000) /* -0.148422241 */, - -PRESHIFT(0x026f7000) /* -0.152206421 */, - -PRESHIFT(0x0fa13000) /* -0.976852417 */, - PRESHIFT(0x0fa13000) /* 0.976852417 */, - PRESHIFT(0x026f7000) /* 0.152206421 */, - PRESHIFT(0x025ff000) /* 0.148422241 */, - PRESHIFT(0x0002d000) /* 0.000686646 */, - PRESHIFT(0x0061f000) /* 0.023910522 */, - -PRESHIFT(0x00092000) /* -0.002227783 */, - PRESHIFT(0x00068000) /* 0.001586914 */, - PRESHIFT(0x00005000) /* 0.000076294 */, - - -PRESHIFT(0x00005000) /* -0.000076294 */, - -PRESHIFT(0x00068000) /* -0.001586914 */, - PRESHIFT(0x00092000) /* 0.002227783 */, - -PRESHIFT(0x0061f000) /* -0.023910522 */, - -PRESHIFT(0x0002d000) /* -0.000686646 */, - -PRESHIFT(0x025ff000) /* -0.148422241 */, - -PRESHIFT(0x026f7000) /* -0.152206421 */, - -PRESHIFT(0x0fa13000) /* -0.976852417 */, - PRESHIFT(0x0fa13000) /* 0.976852417 */, - PRESHIFT(0x026f7000) /* 0.152206421 */, - PRESHIFT(0x025ff000) /* 0.148422241 */, - PRESHIFT(0x0002d000) /* 0.000686646 */, - PRESHIFT(0x0061f000) /* 0.023910522 */, - -PRESHIFT(0x00092000) /* -0.002227783 */, - PRESHIFT(0x00068000) /* 0.001586914 */, - PRESHIFT(0x00005000) /* 0.000076294 */ } diff --git a/src/libmad/Makefile.am b/src/libmad/Makefile.am deleted file mode 100644 index 482d68bb3..000000000 --- a/src/libmad/Makefile.am +++ /dev/null @@ -1,51 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -AM_CFLAGS = $(DEFAULT_OCFLAGS) $(VISIBILITY_FLAG) -AM_CPPFLAGS = -DOPT_SPEED -AM_LDFLAGS = $(xineplug_ldflags) - -EXTRA_DIST = imdct_l_arm.S - -noinst_HEADERS = \ - D.dat \ - imdct_s.dat \ - qc_table.dat \ - rq_table.dat \ - sf_table.dat \ - bit.h \ - fixed.h \ - frame.h \ - global.h \ - huffman.h \ - layer12.h \ - layer3.h \ - stream.h \ - synth.h \ - timer.h \ - version.h - -if ENABLE_MAD -xineplug_LTLIBRARIES = xineplug_decode_mad.la -endif - -if WITH_EXTERNAL_MAD -internal_sources = -external_libs = $(LIBMAD_LIBS) -else -internal_sources = \ - bit.c \ - fixed.c \ - frame.c \ - huffman.c \ - layer12.c \ - layer3.c \ - stream.c \ - synth.c \ - timer.c \ - version.c -external_libs = -endif - -xineplug_decode_mad_la_SOURCES = xine_mad_decoder.c $(internal_sources) -xineplug_decode_mad_la_LIBADD = $(XINE_LIB) $(external_libs) -xineplug_decode_mad_la_CFLAGS = $(AM_CFLAGS) $(LIBMAD_CFLAGS) diff --git a/src/libmad/bit.c b/src/libmad/bit.c deleted file mode 100755 index 8d9571e8f..000000000 --- a/src/libmad/bit.c +++ /dev/null @@ -1,237 +0,0 @@ -/* - * 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: bit.c,v 1.3 2004/04/22 00:22:35 miguelfreitas Exp $ - */ - -# ifdef HAVE_CONFIG_H -# include "config.h" -# endif - -# include "global.h" - -# ifdef HAVE_LIMITS_H -# include <limits.h> -# else -# define CHAR_BIT 8 -# endif - -# include "bit.h" - -/* - * This is the lookup table for computing the CRC-check word. - * As described in section 2.4.3.1 and depicted in Figure A.9 - * of ISO/IEC 11172-3, the generator polynomial is: - * - * G(X) = X^16 + X^15 + X^2 + 1 - */ -static -unsigned short const crc_table[256] = { - 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011, - 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022, - 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072, - 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041, - 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2, - 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1, - 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1, - 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082, - - 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192, - 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1, - 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1, - 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2, - 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151, - 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162, - 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132, - 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101, - - 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312, - 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321, - 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371, - 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342, - 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1, - 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2, - 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2, - 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381, - - 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291, - 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2, - 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2, - 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1, - 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252, - 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261, - 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231, - 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202 -}; - -# define CRC_POLY 0x8005 - -/* - * NAME: bit->init() - * DESCRIPTION: initialize bit pointer struct - */ -void mad_bit_init(struct mad_bitptr *bitptr, unsigned char const *byte) -{ - bitptr->byte = byte; - bitptr->cache = 0; - bitptr->left = CHAR_BIT; -} - -/* - * NAME: bit->length() - * DESCRIPTION: return number of bits between start and end points - */ -unsigned int mad_bit_length(struct mad_bitptr const *begin, - struct mad_bitptr const *end) -{ - return begin->left + - CHAR_BIT * (end->byte - (begin->byte + 1)) + (CHAR_BIT - end->left); -} - -/* - * NAME: bit->nextbyte() - * DESCRIPTION: return pointer to next unprocessed byte - */ -unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *bitptr) -{ - return bitptr->left == CHAR_BIT ? bitptr->byte : bitptr->byte + 1; -} - -/* - * NAME: bit->skip() - * DESCRIPTION: advance bit pointer - */ -void mad_bit_skip(struct mad_bitptr *bitptr, unsigned int len) -{ - bitptr->byte += len / CHAR_BIT; - bitptr->left -= len % CHAR_BIT; - - if (bitptr->left > CHAR_BIT) { - bitptr->byte++; - bitptr->left += CHAR_BIT; - } - - if (bitptr->left < CHAR_BIT) - bitptr->cache = *bitptr->byte; -} - -/* - * NAME: bit->read() - * DESCRIPTION: read an arbitrary number of bits and return their UIMSBF value - */ -unsigned long mad_bit_read(struct mad_bitptr *bitptr, unsigned int len) -{ - register unsigned long value; - - if (bitptr->left == CHAR_BIT) - bitptr->cache = *bitptr->byte; - - if (len < bitptr->left) { - value = (bitptr->cache & ((1 << bitptr->left) - 1)) >> - (bitptr->left - len); - bitptr->left -= len; - - return value; - } - - /* remaining bits in current byte */ - - value = bitptr->cache & ((1 << bitptr->left) - 1); - len -= bitptr->left; - - bitptr->byte++; - bitptr->left = CHAR_BIT; - - /* more bytes */ - - while (len >= CHAR_BIT) { - value = (value << CHAR_BIT) | *bitptr->byte++; - len -= CHAR_BIT; - } - - if (len > 0) { - bitptr->cache = *bitptr->byte; - - value = (value << len) | (bitptr->cache >> (CHAR_BIT - len)); - bitptr->left -= len; - } - - return value; -} - -# if 0 -/* - * NAME: bit->write() - * DESCRIPTION: write an arbitrary number of bits - */ -void mad_bit_write(struct mad_bitptr *bitptr, unsigned int len, - unsigned long value) -{ - unsigned char *ptr; - - ptr = (unsigned char *) bitptr->byte; - - /* ... */ -} -# endif - -/* - * NAME: bit->crc() - * DESCRIPTION: compute CRC-check word - */ -unsigned short mad_bit_crc(struct mad_bitptr bitptr, unsigned int len, - unsigned short init) -{ - register unsigned int crc; - - for (crc = init; len >= 32; len -= 32) { - register unsigned long data; - - data = mad_bit_read(&bitptr, 32); - - crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 24)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 16)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 8)) & 0xff]; - crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 0)) & 0xff]; - } - - switch (len / 8) { - case 3: crc = (crc << 8) ^ - crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff]; - case 2: crc = (crc << 8) ^ - crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff]; - case 1: crc = (crc << 8) ^ - crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff]; - - len %= 8; - - case 0: break; - } - - while (len--) { - register unsigned int msb; - - msb = mad_bit_read(&bitptr, 1) ^ (crc >> 15); - - crc <<= 1; - if (msb & 1) - crc ^= CRC_POLY; - } - - return crc & 0xffff; -} diff --git a/src/libmad/bit.h b/src/libmad/bit.h deleted file mode 100644 index 6c09d5493..000000000 --- a/src/libmad/bit.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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: bit.h,v 1.3 2004/04/22 00:22:36 miguelfreitas Exp $ - */ - -# ifndef LIBMAD_BIT_H -# define LIBMAD_BIT_H - -struct mad_bitptr { - unsigned char const *byte; - unsigned short cache; - unsigned short left; -}; - -void mad_bit_init(struct mad_bitptr *, unsigned char const *); - -# define mad_bit_finish(bitptr) /* nothing */ - -unsigned int mad_bit_length(struct mad_bitptr const *, - struct mad_bitptr const *); - -# define mad_bit_bitsleft(bitptr) ((bitptr)->left) -unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *); - -void mad_bit_skip(struct mad_bitptr *, unsigned int); -unsigned long mad_bit_read(struct mad_bitptr *, unsigned int); -void mad_bit_write(struct mad_bitptr *, unsigned int, unsigned long); - -unsigned short mad_bit_crc(struct mad_bitptr, unsigned int, unsigned short); - -# endif diff --git a/src/libmad/fixed.c b/src/libmad/fixed.c deleted file mode 100644 index ae02360ca..000000000 --- a/src/libmad/fixed.c +++ /dev/null @@ -1,81 +0,0 @@ -/* - * 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: fixed.c,v 1.3 2004/04/22 00:22:36 miguelfreitas Exp $ - */ - -# ifdef HAVE_CONFIG_H -# include "config.h" -# endif - -# include "global.h" - -# include "fixed.h" - -/* - * NAME: fixed->abs() - * DESCRIPTION: return absolute value of a fixed-point number - */ -mad_fixed_t mad_f_abs(mad_fixed_t x) -{ - return x < 0 ? -x : x; -} - -/* - * NAME: fixed->div() - * DESCRIPTION: perform division using fixed-point math - */ -mad_fixed_t mad_f_div(mad_fixed_t x, mad_fixed_t y) -{ - mad_fixed_t q, r; - unsigned int bits; - - q = mad_f_abs(x / y); - - if (x < 0) { - x = -x; - y = -y; - } - - r = x % y; - - if (y < 0) { - x = -x; - y = -y; - } - - if (q > mad_f_intpart(MAD_F_MAX) && - !(q == -mad_f_intpart(MAD_F_MIN) && r == 0 && (x < 0) != (y < 0))) - return 0; - - for (bits = MAD_F_FRACBITS; bits && r; --bits) { - q <<= 1, r <<= 1; - if (r >= y) - r -= y, ++q; - } - - /* round */ - if (2 * r >= y) - ++q; - - /* fix sign */ - if ((x < 0) != (y < 0)) - q = -q; - - return q << bits; -} diff --git a/src/libmad/fixed.h b/src/libmad/fixed.h deleted file mode 100755 index 658b3399e..000000000 --- a/src/libmad/fixed.h +++ /dev/null @@ -1,499 +0,0 @@ -/* - * 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: fixed.h,v 1.3 2004/04/28 19:57:40 mroi Exp $ - */ - -# ifndef LIBMAD_FIXED_H -# define LIBMAD_FIXED_H - -# if SIZEOF_INT >= 4 -typedef signed int mad_fixed_t; - -typedef signed int mad_fixed64hi_t; -typedef unsigned int mad_fixed64lo_t; -# else -typedef signed long mad_fixed_t; - -typedef signed long mad_fixed64hi_t; -typedef unsigned long mad_fixed64lo_t; -# endif - -# if defined(_MSC_VER) -# define mad_fixed64_t signed __int64 -# elif 1 || defined(__GNUC__) -# define mad_fixed64_t signed long long -# endif - -# if defined(FPM_FLOAT) -typedef double mad_sample_t; -# else -typedef mad_fixed_t mad_sample_t; -# endif - -/* - * Fixed-point format: 0xABBBBBBB - * A == whole part (sign + 3 bits) - * B == fractional part (28 bits) - * - * Values are signed two's complement, so the effective range is: - * 0x80000000 to 0x7fffffff - * -8.0 to +7.9999999962747097015380859375 - * - * The smallest representable value is: - * 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9) - * - * 28 bits of fractional accuracy represent about - * 8.6 digits of decimal accuracy. - * - * Fixed-point numbers can be added or subtracted as normal - * integers, but multiplication requires shifting the 64-bit result - * from 56 fractional bits back to 28 (and rounding.) - * - * Changing the definition of MAD_F_FRACBITS is only partially - * supported, and must be done with care. - */ - -# define MAD_F_FRACBITS 28 - -# if MAD_F_FRACBITS == 28 -# define MAD_F(x) ((mad_fixed_t) (x##L)) -# else -# if MAD_F_FRACBITS < 28 -# warning "MAD_F_FRACBITS < 28" -# define MAD_F(x) ((mad_fixed_t) \ - (((x##L) + \ - (1L << (28 - MAD_F_FRACBITS - 1))) >> \ - (28 - MAD_F_FRACBITS))) -# elif MAD_F_FRACBITS > 28 -# error "MAD_F_FRACBITS > 28 not currently supported" -# define MAD_F(x) ((mad_fixed_t) \ - ((x##L) << (MAD_F_FRACBITS - 28))) -# endif -# endif - -# define MAD_F_MIN ((mad_fixed_t) -0x80000000L) -# define MAD_F_MAX ((mad_fixed_t) +0x7fffffffL) - -# define MAD_F_ONE MAD_F(0x10000000) - -# define mad_f_tofixed(x) ((mad_fixed_t) \ - ((x) * (double) (1L << MAD_F_FRACBITS) + 0.5)) -# define mad_f_todouble(x) ((double) \ - ((x) / (double) (1L << MAD_F_FRACBITS))) - -# define mad_f_intpart(x) ((x) >> MAD_F_FRACBITS) -# define mad_f_fracpart(x) ((x) & ((1L << MAD_F_FRACBITS) - 1)) - /* (x should be positive) */ - -# define mad_f_fromint(x) ((x) << MAD_F_FRACBITS) - -# define mad_f_add(x, y) ((x) + (y)) -# define mad_f_sub(x, y) ((x) - (y)) - -# if defined(FPM_FLOAT) -# error "FPM_FLOAT not yet supported" - -# undef MAD_F -# define MAD_F(x) mad_f_todouble(x) - -# define mad_f_mul(x, y) ((x) * (y)) -# define mad_f_scale64 - -# undef ASO_ZEROCHECK - -# elif defined(FPM_64BIT) - -/* - * This version should be the most accurate if 64-bit types are supported by - * the compiler, although it may not be the most efficient. - */ -# if defined(OPT_ACCURACY) -# define mad_f_mul(x, y) \ - ((mad_fixed_t) \ - ((((mad_fixed64_t) (x) * (y)) + \ - (1L << (MAD_F_SCALEBITS - 1))) >> MAD_F_SCALEBITS)) -# else -# define mad_f_mul(x, y) \ - ((mad_fixed_t) (((mad_fixed64_t) (x) * (y)) >> MAD_F_SCALEBITS)) -# endif - -# define MAD_F_SCALEBITS MAD_F_FRACBITS - -/* --- Intel --------------------------------------------------------------- */ - -# elif defined(FPM_INTEL) - -# if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable: 4035) /* no return value */ -static __forceinline -mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) -{ - enum { - fracbits = MAD_F_FRACBITS - }; - - __asm { - mov eax, x - imul y - shrd eax, edx, fracbits - } - - /* implicit return of eax */ -} -# pragma warning(pop) - -# define mad_f_mul mad_f_mul_inline -# define mad_f_scale64 -# else -/* - * This Intel version is fast and accurate; the disposition of the least - * significant bit depends on OPT_ACCURACY via mad_f_scale64(). - */ -# define MAD_F_MLX(hi, lo, x, y) \ - asm ("imull %3" \ - : "=a" (lo), "=d" (hi) \ - : "%a" (x), "rm" (y) \ - : "cc") - -# if defined(OPT_ACCURACY) -/* - * This gives best accuracy but is not very fast. - */ -# define MAD_F_MLA(hi, lo, x, y) \ - ({ mad_fixed64hi_t __hi; \ - mad_fixed64lo_t __lo; \ - MAD_F_MLX(__hi, __lo, (x), (y)); \ - asm ("addl %2,%0\n\t" \ - "adcl %3,%1" \ - : "=rm" (lo), "=rm" (hi) \ - : "r" (__lo), "r" (__hi), "0" (lo), "1" (hi) \ - : "cc"); \ - }) -# endif /* OPT_ACCURACY */ - -# if defined(OPT_ACCURACY) -/* - * Surprisingly, this is faster than SHRD followed by ADC. - */ -# define mad_f_scale64(hi, lo) \ - ({ mad_fixed64hi_t __hi_; \ - mad_fixed64lo_t __lo_; \ - mad_fixed_t __result; \ - asm ("addl %4,%2\n\t" \ - "adcl %5,%3" \ - : "=rm" (__lo_), "=rm" (__hi_) \ - : "0" (lo), "1" (hi), \ - "ir" (1L << (MAD_F_SCALEBITS - 1)), "ir" (0) \ - : "cc"); \ - asm ("shrdl %3,%2,%1" \ - : "=rm" (__result) \ - : "0" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS) \ - : "cc"); \ - __result; \ - }) -# elif defined(OPT_INTEL) -/* - * Alternate Intel scaling that may or may not perform better. - */ -# define mad_f_scale64(hi, lo) \ - ({ mad_fixed_t __result; \ - asm ("shrl %3,%1\n\t" \ - "shll %4,%2\n\t" \ - "orl %2,%1" \ - : "=rm" (__result) \ - : "0" (lo), "r" (hi), \ - "I" (MAD_F_SCALEBITS), "I" (32 - MAD_F_SCALEBITS) \ - : "cc"); \ - __result; \ - }) -# else -# define mad_f_scale64(hi, lo) \ - ({ mad_fixed_t __result; \ - asm ("shrdl %3,%2,%1" \ - : "=rm" (__result) \ - : "0" (lo), "r" (hi), "I" (MAD_F_SCALEBITS) \ - : "cc"); \ - __result; \ - }) -# endif /* OPT_ACCURACY */ - -# define MAD_F_SCALEBITS MAD_F_FRACBITS -# endif - -/* --- ARM ----------------------------------------------------------------- */ - -# elif defined(FPM_ARM) - -/* - * This ARM V4 version is as accurate as FPM_64BIT but much faster. The - * least significant bit is properly rounded at no CPU cycle cost! - */ -# if 1 -/* - * This is faster than the default implementation via MAD_F_MLX() and - * mad_f_scale64(). - */ -# define mad_f_mul(x, y) \ - ({ mad_fixed64hi_t __hi; \ - mad_fixed64lo_t __lo; \ - mad_fixed_t __result; \ - asm ("smull %0, %1, %3, %4\n\t" \ - "movs %0, %0, lsr %5\n\t" \ - "adc %2, %0, %1, lsl %6" \ - : "=&r" (__lo), "=&r" (__hi), "=r" (__result) \ - : "%r" (x), "r" (y), \ - "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \ - : "cc"); \ - __result; \ - }) -# endif - -# define MAD_F_MLX(hi, lo, x, y) \ - asm ("smull %0, %1, %2, %3" \ - : "=&r" (lo), "=&r" (hi) \ - : "%r" (x), "r" (y)) - -# define MAD_F_MLA(hi, lo, x, y) \ - asm ("smlal %0, %1, %2, %3" \ - : "+r" (lo), "+r" (hi) \ - : "%r" (x), "r" (y)) - -# define MAD_F_MLN(hi, lo) \ - asm ("rsbs %0, %2, #0\n\t" \ - "rsc %1, %3, #0" \ - : "=r" (lo), "=r" (hi) \ - : "0" (lo), "1" (hi) \ - : "cc") - -# define mad_f_scale64(hi, lo) \ - ({ mad_fixed_t __result; \ - asm ("movs %0, %1, lsr %3\n\t" \ - "adc %0, %0, %2, lsl %4" \ - : "=&r" (__result) \ - : "r" (lo), "r" (hi), \ - "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \ - : "cc"); \ - __result; \ - }) - -# define MAD_F_SCALEBITS MAD_F_FRACBITS - -/* --- MIPS ---------------------------------------------------------------- */ - -# elif defined(FPM_MIPS) - -/* - * This MIPS version is fast and accurate; the disposition of the least - * significant bit depends on OPT_ACCURACY via mad_f_scale64(). - */ -# define MAD_F_MLX(hi, lo, x, y) \ - asm ("mult %2,%3" \ - : "=l" (lo), "=h" (hi) \ - : "%r" (x), "r" (y)) - -# if defined(HAVE_MADD_ASM) -# define MAD_F_MLA(hi, lo, x, y) \ - asm ("madd %2,%3" \ - : "+l" (lo), "+h" (hi) \ - : "%r" (x), "r" (y)) -# elif defined(HAVE_MADD16_ASM) -/* - * This loses significant accuracy due to the 16-bit integer limit in the - * multiply/accumulate instruction. - */ -# define MAD_F_ML0(hi, lo, x, y) \ - asm ("mult %2,%3" \ - : "=l" (lo), "=h" (hi) \ - : "%r" ((x) >> 12), "r" ((y) >> 16)) -# define MAD_F_MLA(hi, lo, x, y) \ - asm ("madd16 %2,%3" \ - : "+l" (lo), "+h" (hi) \ - : "%r" ((x) >> 12), "r" ((y) >> 16)) -# define MAD_F_MLZ(hi, lo) ((mad_fixed_t) (lo)) -# endif - -# if defined(OPT_SPEED) -# define mad_f_scale64(hi, lo) \ - ((mad_fixed_t) ((hi) << (32 - MAD_F_SCALEBITS))) -# define MAD_F_SCALEBITS MAD_F_FRACBITS -# endif - -/* --- SPARC --------------------------------------------------------------- */ - -# elif defined(FPM_SPARC) - -/* - * This SPARC V8 version is fast and accurate; the disposition of the least - * significant bit depends on OPT_ACCURACY via mad_f_scale64(). - */ -# define MAD_F_MLX(hi, lo, x, y) \ - asm ("smul %2, %3, %0\n\t" \ - "rd %%y, %1" \ - : "=r" (lo), "=r" (hi) \ - : "%r" (x), "rI" (y)) - -/* --- PowerPC ------------------------------------------------------------- */ - -# elif defined(FPM_PPC) - -/* - * This PowerPC version is fast and accurate; the disposition of the least - * significant bit depends on OPT_ACCURACY via mad_f_scale64(). - */ -# define MAD_F_MLX(hi, lo, x, y) \ - do { \ - asm ("mullw %0,%1,%2" \ - : "=r" (lo) \ - : "%r" (x), "r" (y)); \ - asm ("mulhw %0,%1,%2" \ - : "=r" (hi) \ - : "%r" (x), "r" (y)); \ - } \ - while (0) - -# if defined(OPT_ACCURACY) -/* - * This gives best accuracy but is not very fast. - */ -# define MAD_F_MLA(hi, lo, x, y) \ - ({ mad_fixed64hi_t __hi; \ - mad_fixed64lo_t __lo; \ - MAD_F_MLX(__hi, __lo, (x), (y)); \ - asm ("addc %0,%2,%3\n\t" \ - "adde %1,%4,%5" \ - : "=r" (lo), "=r" (hi) \ - : "%r" (lo), "r" (__lo), \ - "%r" (hi), "r" (__hi) \ - : "xer"); \ - }) -# endif - -# if defined(OPT_ACCURACY) -/* - * This is slower than the truncating version below it. - */ -# define mad_f_scale64(hi, lo) \ - ({ mad_fixed_t __result, __round; \ - asm ("rotrwi %0,%1,%2" \ - : "=r" (__result) \ - : "r" (lo), "i" (MAD_F_SCALEBITS)); \ - asm ("extrwi %0,%1,1,0" \ - : "=r" (__round) \ - : "r" (__result)); \ - asm ("insrwi %0,%1,%2,0" \ - : "+r" (__result) \ - : "r" (hi), "i" (MAD_F_SCALEBITS)); \ - asm ("add %0,%1,%2" \ - : "=r" (__result) \ - : "%r" (__result), "r" (__round)); \ - __result; \ - }) -# else -# define mad_f_scale64(hi, lo) \ - ({ mad_fixed_t __result; \ - asm ("rotrwi %0,%1,%2" \ - : "=r" (__result) \ - : "r" (lo), "i" (MAD_F_SCALEBITS)); \ - asm ("insrwi %0,%1,%2,0" \ - : "+r" (__result) \ - : "r" (hi), "i" (MAD_F_SCALEBITS)); \ - __result; \ - }) -# endif - -# define MAD_F_SCALEBITS MAD_F_FRACBITS - -/* --- Default ------------------------------------------------------------- */ - -# elif defined(FPM_DEFAULT) - -/* - * This version is the most portable but it loses significant accuracy. - * Furthermore, accuracy is biased against the second argument, so care - * should be taken when ordering operands. - * - * The scale factors are constant as this is not used with SSO. - * - * Pre-rounding is required to stay within the limits of compliance. - */ -# if defined(OPT_SPEED) -# define mad_f_mul(x, y) (((x) >> 12) * ((y) >> 16)) -# else -# define mad_f_mul(x, y) ((((x) + (1L << 11)) >> 12) * \ - (((y) + (1L << 15)) >> 16)) -# endif - -/* ------------------------------------------------------------------------- */ - -# else -# error "no FPM selected" -# endif - -/* default implementations */ - -# if !defined(mad_f_mul) -# define mad_f_mul(x, y) \ - ({ register mad_fixed64hi_t __hi; \ - register mad_fixed64lo_t __lo; \ - MAD_F_MLX(__hi, __lo, (x), (y)); \ - mad_f_scale64(__hi, __lo); \ - }) -# endif - -# if !defined(MAD_F_MLA) -# define MAD_F_ML0(hi, lo, x, y) ((lo) = mad_f_mul((x), (y))) -# define MAD_F_MLA(hi, lo, x, y) ((lo) += mad_f_mul((x), (y))) -# define MAD_F_MLN(hi, lo) ((lo) = -(lo)) -# define MAD_F_MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo)) -# endif - -# if !defined(MAD_F_ML0) -# define MAD_F_ML0(hi, lo, x, y) MAD_F_MLX((hi), (lo), (x), (y)) -# endif - -# if !defined(MAD_F_MLN) -# define MAD_F_MLN(hi, lo) ((hi) = ((lo) = -(lo)) ? ~(hi) : -(hi)) -# endif - -# if !defined(MAD_F_MLZ) -# define MAD_F_MLZ(hi, lo) mad_f_scale64((hi), (lo)) -# endif - -# if !defined(mad_f_scale64) -# if defined(OPT_ACCURACY) -# define mad_f_scale64(hi, lo) \ - ((((mad_fixed_t) \ - (((hi) << (32 - (MAD_F_SCALEBITS - 1))) | \ - ((lo) >> (MAD_F_SCALEBITS - 1)))) + 1) >> 1) -# else -# define mad_f_scale64(hi, lo) \ - ((mad_fixed_t) \ - (((hi) << (32 - MAD_F_SCALEBITS)) | \ - ((lo) >> MAD_F_SCALEBITS))) -# endif -# define MAD_F_SCALEBITS MAD_F_FRACBITS -# endif - -/* C routines */ - -mad_fixed_t mad_f_abs(mad_fixed_t); -mad_fixed_t mad_f_div(mad_fixed_t, mad_fixed_t); - -# endif diff --git a/src/libmad/frame.c b/src/libmad/frame.c deleted file mode 100755 index 6fe1970c0..000000000 --- a/src/libmad/frame.c +++ /dev/null @@ -1,503 +0,0 @@ -/* - * 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: frame.c,v 1.3 2004/04/22 00:22:36 miguelfreitas Exp $ - */ - -# ifdef HAVE_CONFIG_H -# include "config.h" -# endif - -# include "global.h" - -# include <stdlib.h> - -# include "bit.h" -# include "stream.h" -# include "frame.h" -# include "timer.h" -# include "layer12.h" -# include "layer3.h" - -static -unsigned long const bitrate_table[5][15] = { - /* MPEG-1 */ - { 0, 32000, 64000, 96000, 128000, 160000, 192000, 224000, /* Layer I */ - 256000, 288000, 320000, 352000, 384000, 416000, 448000 }, - { 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, /* Layer II */ - 128000, 160000, 192000, 224000, 256000, 320000, 384000 }, - { 0, 32000, 40000, 48000, 56000, 64000, 80000, 96000, /* Layer III */ - 112000, 128000, 160000, 192000, 224000, 256000, 320000 }, - - /* MPEG-2 LSF */ - { 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, /* Layer I */ - 128000, 144000, 160000, 176000, 192000, 224000, 256000 }, - { 0, 8000, 16000, 24000, 32000, 40000, 48000, 56000, /* Layers */ - 64000, 80000, 96000, 112000, 128000, 144000, 160000 } /* II & III */ -}; - -static -unsigned int const samplerate_table[3] = { 44100, 48000, 32000 }; - -static -int (*const decoder_table[3])(struct mad_stream *, struct mad_frame *) = { - mad_layer_I, - mad_layer_II, - mad_layer_III -}; - -/* - * NAME: header->init() - * DESCRIPTION: initialize header struct - */ -void mad_header_init(struct mad_header *header) -{ - header->layer = 0; - header->mode = 0; - header->mode_extension = 0; - header->emphasis = 0; - - header->bitrate = 0; - header->samplerate = 0; - - header->crc_check = 0; - header->crc_target = 0; - - header->flags = 0; - header->private_bits = 0; - - header->duration = mad_timer_zero; -} - -/* - * NAME: frame->init() - * DESCRIPTION: initialize frame struct - */ -void mad_frame_init(struct mad_frame *frame) -{ - mad_header_init(&frame->header); - - frame->options = 0; - - frame->overlap = 0; - mad_frame_mute(frame); -} - -/* - * NAME: frame->finish() - * DESCRIPTION: deallocate any dynamic memory associated with frame - */ -void mad_frame_finish(struct mad_frame *frame) -{ - mad_header_finish(&frame->header); - - if (frame->overlap) { - free(frame->overlap); - frame->overlap = 0; - } -} - -/* - * NAME: decode_header() - * DESCRIPTION: read header data and following CRC word - */ -static -int decode_header(struct mad_header *header, struct mad_stream *stream) -{ - unsigned int index; - - header->flags = 0; - header->private_bits = 0; - - /* header() */ - - /* syncword */ - mad_bit_skip(&stream->ptr, 11); - - /* MPEG 2.5 indicator (really part of syncword) */ - if (mad_bit_read(&stream->ptr, 1) == 0) - header->flags |= MAD_FLAG_MPEG_2_5_EXT; - - /* ID */ - if (mad_bit_read(&stream->ptr, 1) == 0) - header->flags |= MAD_FLAG_LSF_EXT; - else if (header->flags & MAD_FLAG_MPEG_2_5_EXT) { - stream->error = MAD_ERROR_LOSTSYNC; - return -1; - } - - /* layer */ - header->layer = 4 - mad_bit_read(&stream->ptr, 2); - - if (header->layer == 4) { - stream->error = MAD_ERROR_BADLAYER; - return -1; - } - - /* protection_bit */ - if (mad_bit_read(&stream->ptr, 1) == 0) { - header->flags |= MAD_FLAG_PROTECTION; - header->crc_check = mad_bit_crc(stream->ptr, 16, 0xffff); - } - - /* bitrate_index */ - index = mad_bit_read(&stream->ptr, 4); - - if (index == 15) { - stream->error = MAD_ERROR_BADBITRATE; - return -1; - } - - if (header->flags & MAD_FLAG_LSF_EXT) - header->bitrate = bitrate_table[3 + (header->layer >> 1)][index]; - else - header->bitrate = bitrate_table[header->layer - 1][index]; - - /* sampling_frequency */ - index = mad_bit_read(&stream->ptr, 2); - - if (index == 3) { - stream->error = MAD_ERROR_BADSAMPLERATE; - return -1; - } - - header->samplerate = samplerate_table[index]; - - if (header->flags & MAD_FLAG_LSF_EXT) { - header->samplerate /= 2; - - if (header->flags & MAD_FLAG_MPEG_2_5_EXT) - header->samplerate /= 2; - } - - /* padding_bit */ - if (mad_bit_read(&stream->ptr, 1)) - header->flags |= MAD_FLAG_PADDING; - - /* private_bit */ - if (mad_bit_read(&stream->ptr, 1)) - header->private_bits |= MAD_PRIVATE_HEADER; - - /* mode */ - header->mode = 3 - mad_bit_read(&stream->ptr, 2); - - /* mode_extension */ - header->mode_extension = mad_bit_read(&stream->ptr, 2); - - /* copyright */ - if (mad_bit_read(&stream->ptr, 1)) - header->flags |= MAD_FLAG_COPYRIGHT; - - /* original/copy */ - if (mad_bit_read(&stream->ptr, 1)) - header->flags |= MAD_FLAG_ORIGINAL; - - /* emphasis */ - header->emphasis = mad_bit_read(&stream->ptr, 2); - -# if defined(OPT_STRICT) - /* - * ISO/IEC 11172-3 says this is a reserved emphasis value, but - * streams exist which use it anyway. Since the value is not important - * to the decoder proper, we allow it unless OPT_STRICT is defined. - */ - if (header->emphasis == MAD_EMPHASIS_RESERVED) { - stream->error = MAD_ERROR_BADEMPHASIS; - return -1; - } -# endif - - /* error_check() */ - - /* crc_check */ - if (header->flags & MAD_FLAG_PROTECTION) - header->crc_target = mad_bit_read(&stream->ptr, 16); - - return 0; -} - -/* - * NAME: free_bitrate() - * DESCRIPTION: attempt to discover the bitstream's free bitrate - */ -static -int free_bitrate(struct mad_stream *stream, struct mad_header const *header) -{ - struct mad_bitptr keep_ptr; - unsigned long rate = 0; - unsigned int pad_slot, slots_per_frame; - unsigned char const *ptr = 0; - - keep_ptr = stream->ptr; - - pad_slot = (header->flags & MAD_FLAG_PADDING) ? 1 : 0; - slots_per_frame = (header->layer == MAD_LAYER_III && - (header->flags & MAD_FLAG_LSF_EXT)) ? 72 : 144; - - while (mad_stream_sync(stream) == 0) { - struct mad_stream peek_stream; - struct mad_header peek_header; - - peek_stream = *stream; - peek_header = *header; - - if (decode_header(&peek_header, &peek_stream) == 0 && - peek_header.layer == header->layer && - peek_header.samplerate == header->samplerate) { - unsigned int N; - - ptr = mad_bit_nextbyte(&stream->ptr); - - N = ptr - stream->this_frame; - - if (header->layer == MAD_LAYER_I) { - rate = (unsigned long) header->samplerate * - (N - 4 * pad_slot + 4) / 48 / 1000; - } - else { - rate = (unsigned long) header->samplerate * - (N - pad_slot + 1) / slots_per_frame / 1000; - } - - if (rate >= 8) - break; - } - - mad_bit_skip(&stream->ptr, 8); - } - - stream->ptr = keep_ptr; - - if (rate < 8 || (header->layer == MAD_LAYER_III && rate > 640)) { - stream->error = MAD_ERROR_LOSTSYNC; - return -1; - } - - stream->freerate = rate * 1000; - - return 0; -} - -/* - * NAME: header->decode() - * DESCRIPTION: read the next frame header from the stream - */ -int mad_header_decode(struct mad_header *header, struct mad_stream *stream) -{ - register unsigned char const *ptr, *end; - unsigned int pad_slot, N; - - ptr = stream->next_frame; - end = stream->bufend; - - if (ptr == 0) { - stream->error = MAD_ERROR_BUFPTR; - goto fail; - } - - /* stream skip */ - if (stream->skiplen) { - if (!stream->sync) - ptr = stream->this_frame; - - if (end - ptr < stream->skiplen) { - stream->skiplen -= end - ptr; - stream->next_frame = end; - - stream->error = MAD_ERROR_BUFLEN; - goto fail; - } - - ptr += stream->skiplen; - stream->skiplen = 0; - - stream->sync = 1; - } - - sync: - /* synchronize */ - if (stream->sync) { - if (end - ptr < MAD_BUFFER_GUARD) { - stream->next_frame = ptr; - - stream->error = MAD_ERROR_BUFLEN; - goto fail; - } - else if (!(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) { - /* mark point where frame sync word was expected */ - stream->this_frame = ptr; - stream->next_frame = ptr + 1; - - stream->error = MAD_ERROR_LOSTSYNC; - goto fail; - } - } - else { - mad_bit_init(&stream->ptr, ptr); - - if (mad_stream_sync(stream) == -1) { - if (end - stream->next_frame >= MAD_BUFFER_GUARD) - stream->next_frame = end - MAD_BUFFER_GUARD; - - stream->error = MAD_ERROR_BUFLEN; - goto fail; - } - - ptr = mad_bit_nextbyte(&stream->ptr); - } - - /* begin processing */ - stream->this_frame = ptr; - stream->next_frame = ptr + 1; /* possibly bogus sync word */ - - mad_bit_init(&stream->ptr, stream->this_frame); - - if (decode_header(header, stream) == -1) - goto fail; - - /* calculate frame duration */ - mad_timer_set(&header->duration, 0, - 32 * MAD_NSBSAMPLES(header), header->samplerate); - - /* calculate free bit rate */ - if (header->bitrate == 0) { - if ((stream->freerate == 0 || !stream->sync || - (header->layer == MAD_LAYER_III && stream->freerate > 640000)) && - free_bitrate(stream, header) == -1) - goto fail; - - header->bitrate = stream->freerate; - header->flags |= MAD_FLAG_FREEFORMAT; - } - - /* calculate beginning of next frame */ - pad_slot = (header->flags & MAD_FLAG_PADDING) ? 1 : 0; - - if (header->layer == MAD_LAYER_I) - N = ((12 * header->bitrate / header->samplerate) + pad_slot) * 4; - else { - unsigned int slots_per_frame; - - slots_per_frame = (header->layer == MAD_LAYER_III && - (header->flags & MAD_FLAG_LSF_EXT)) ? 72 : 144; - - N = (slots_per_frame * header->bitrate / header->samplerate) + pad_slot; - } - - /* verify there is enough data left in buffer to decode this frame */ - if (N + MAD_BUFFER_GUARD > end - stream->this_frame) { - stream->next_frame = stream->this_frame; - - stream->error = MAD_ERROR_BUFLEN; - goto fail; - } - - stream->next_frame = stream->this_frame + N; - - if (!stream->sync) { - /* check that a valid frame header follows this frame */ - - ptr = stream->next_frame; - if (!(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) { - ptr = stream->next_frame = stream->this_frame + 1; - goto sync; - } - - stream->sync = 1; - } - - header->flags |= MAD_FLAG_INCOMPLETE; - - return 0; - - fail: - stream->sync = 0; - - return -1; -} - -/* - * NAME: frame->decode() - * DESCRIPTION: decode a single frame from a bitstream - */ -int mad_frame_decode(struct mad_frame *frame, struct mad_stream *stream) -{ - frame->options = stream->options; - - /* header() */ - /* error_check() */ - - if (!(frame->header.flags & MAD_FLAG_INCOMPLETE) && - mad_header_decode(&frame->header, stream) == -1) - goto fail; - - /* audio_data() */ - - frame->header.flags &= ~MAD_FLAG_INCOMPLETE; - - if (decoder_table[frame->header.layer - 1](stream, frame) == -1) { - if (!MAD_RECOVERABLE(stream->error)) - stream->next_frame = stream->this_frame; - - goto fail; - } - - /* ancillary_data() */ - - if (frame->header.layer != MAD_LAYER_III) { - struct mad_bitptr next_frame; - - mad_bit_init(&next_frame, stream->next_frame); - - stream->anc_ptr = stream->ptr; - stream->anc_bitlen = mad_bit_length(&stream->ptr, &next_frame); - - mad_bit_finish(&next_frame); - } - - return 0; - - fail: - stream->anc_bitlen = 0; - return -1; -} - -/* - * NAME: frame->mute() - * DESCRIPTION: zero all subband values so the frame becomes silent - */ -void mad_frame_mute(struct mad_frame *frame) -{ - unsigned int s, sb; - - for (s = 0; s < 36; ++s) { - for (sb = 0; sb < 32; ++sb) { - frame->sbsample[0][s][sb] = - frame->sbsample[1][s][sb] = 0; - } - } - - if (frame->overlap) { - for (s = 0; s < 18; ++s) { - for (sb = 0; sb < 32; ++sb) { - (*frame->overlap)[0][sb][s] = - (*frame->overlap)[1][sb][s] = 0; - } - } - } -} diff --git a/src/libmad/frame.h b/src/libmad/frame.h deleted file mode 100755 index 270420ab8..000000000 --- a/src/libmad/frame.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - * 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: frame.h,v 1.3 2004/04/22 00:22:36 miguelfreitas Exp $ - */ - -# ifndef LIBMAD_FRAME_H -# define LIBMAD_FRAME_H - -# include "fixed.h" -# include "timer.h" -# include "stream.h" - -enum mad_layer { - MAD_LAYER_I = 1, /* Layer I */ - MAD_LAYER_II = 2, /* Layer II */ - MAD_LAYER_III = 3 /* Layer III */ -}; - -enum mad_mode { - MAD_MODE_SINGLE_CHANNEL = 0, /* single channel */ - MAD_MODE_DUAL_CHANNEL = 1, /* dual channel */ - MAD_MODE_JOINT_STEREO = 2, /* joint (MS/intensity) stereo */ - MAD_MODE_STEREO = 3 /* normal LR stereo */ -}; - -enum mad_emphasis { - MAD_EMPHASIS_NONE = 0, /* no emphasis */ - MAD_EMPHASIS_50_15_US = 1, /* 50/15 microseconds emphasis */ - MAD_EMPHASIS_CCITT_J_17 = 3, /* CCITT J.17 emphasis */ - MAD_EMPHASIS_RESERVED = 2 /* unknown emphasis */ -}; - -struct mad_header { - enum mad_layer layer; /* audio layer (1, 2, or 3) */ - enum mad_mode mode; /* channel mode (see above) */ - int mode_extension; /* additional mode info */ - enum mad_emphasis emphasis; /* de-emphasis to use (see above) */ - - unsigned long bitrate; /* stream bitrate (bps) */ - unsigned int samplerate; /* sampling frequency (Hz) */ - - unsigned short crc_check; /* frame CRC accumulator */ - unsigned short crc_target; /* final target CRC checksum */ - - int flags; /* flags (see below) */ - int private_bits; /* private bits (see below) */ - - mad_timer_t duration; /* audio playing time of frame */ -}; - -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 */ - mad_fixed_t (*overlap)[2][32][18]; /* Layer III block overlap data */ -}; - -# define MAD_NCHANNELS(header) ((header)->mode ? 2 : 1) -# define MAD_NSBSAMPLES(header) \ - ((header)->layer == MAD_LAYER_I ? 12 : \ - (((header)->layer == MAD_LAYER_III && \ - ((header)->flags & MAD_FLAG_LSF_EXT)) ? 18 : 36)) - -enum { - MAD_FLAG_NPRIVATE_III = 0x0007, /* number of Layer III private bits */ - MAD_FLAG_INCOMPLETE = 0x0008, /* header but not data is decoded */ - - MAD_FLAG_PROTECTION = 0x0010, /* frame has CRC protection */ - MAD_FLAG_COPYRIGHT = 0x0020, /* frame is copyright */ - MAD_FLAG_ORIGINAL = 0x0040, /* frame is original (else copy) */ - MAD_FLAG_PADDING = 0x0080, /* frame has additional slot */ - - MAD_FLAG_I_STEREO = 0x0100, /* uses intensity joint stereo */ - MAD_FLAG_MS_STEREO = 0x0200, /* uses middle/side joint stereo */ - MAD_FLAG_FREEFORMAT = 0x0400, /* uses free format bitrate */ - - MAD_FLAG_LSF_EXT = 0x1000, /* lower sampling freq. extension */ - MAD_FLAG_MC_EXT = 0x2000, /* multichannel audio extension */ - MAD_FLAG_MPEG_2_5_EXT = 0x4000 /* MPEG 2.5 (unofficial) extension */ -}; - -enum { - MAD_PRIVATE_HEADER = 0x0100, /* header private bit */ - MAD_PRIVATE_III = 0x001f /* Layer III private bits (up to 5) */ -}; - -void mad_header_init(struct mad_header *); - -# define mad_header_finish(header) /* nothing */ - -int mad_header_decode(struct mad_header *, struct mad_stream *); - -void mad_frame_init(struct mad_frame *); -void mad_frame_finish(struct mad_frame *); - -int mad_frame_decode(struct mad_frame *, struct mad_stream *); - -void mad_frame_mute(struct mad_frame *); - -# endif diff --git a/src/libmad/global.h b/src/libmad/global.h deleted file mode 100644 index 2f4b41db5..000000000 --- a/src/libmad/global.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * 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: global.h,v 1.4 2004/04/22 00:22:36 miguelfreitas Exp $ - */ - -# ifndef LIBMAD_GLOBAL_H -# define LIBMAD_GLOBAL_H - -/* conditional debugging */ - -# if defined(DEBUG) && defined(NDEBUG) -# error "cannot define both DEBUG and NDEBUG" -# endif - -# if defined(DEBUG) -# include <stdio.h> -# endif - -/* conditional features */ - -# if defined(OPT_SPEED) && defined(OPT_ACCURACY) -# error "cannot optimize for both speed and accuracy" -# endif - -# if defined(OPT_SPEED) && !defined(OPT_SSO) -# define OPT_SSO -# endif - -# if defined(HAVE_UNISTD_H) && defined(HAVE_WAITPID) && \ - defined(HAVE_FCNTL) && defined(HAVE_PIPE) && defined(HAVE_FORK) -# define USE_ASYNC -# endif - -# if !defined(HAVE_ASSERT_H) -# if defined(NDEBUG) -# define assert(x) /* nothing */ -# else -# define assert(x) do { if (!(x)) abort(); } while (0) -# endif -# endif - -# endif diff --git a/src/libmad/huffman.c b/src/libmad/huffman.c deleted file mode 100644 index 5d34c0142..000000000 --- a/src/libmad/huffman.c +++ /dev/null @@ -1,3109 +0,0 @@ -/* - * 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: huffman.c,v 1.4 2004/04/22 00:22:36 miguelfreitas Exp $ - */ - -# ifdef HAVE_CONFIG_H -# include "config.h" -# endif - -# include "global.h" - -# include "huffman.h" - -/* - * These are the Huffman code words for Layer III. - * The data for these tables are derived from Table B.7 of ISO/IEC 11172-3. - * - * These tables support decoding up to 4 Huffman code bits at a time. - */ - -# if defined(__GNUC__) || \ - (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901) -# define PTR(offs, bits) { .ptr = { 0, bits, offs } } -# define V(v, w, x, y, hlen) { .value = { 1, hlen, v, w, x, y } } -# else -# define PTR(offs, bits) { { 0, bits, offs } } -# if defined(WORDS_BIGENDIAN) -# define V(v, w, x, y, hlen) { { 1, hlen, (v << 11) | (w << 10) | \ - (x << 9) | (y << 8) } } -# else -# define V(v, w, x, y, hlen) { { 1, hlen, (v << 0) | (w << 1) | \ - (x << 2) | (y << 3) } } -# endif -# endif - -static -union huffquad const hufftabA[] = { - /* 0000 */ PTR(16, 2), - /* 0001 */ PTR(20, 2), - /* 0010 */ PTR(24, 1), - /* 0011 */ PTR(26, 1), - /* 0100 */ V(0, 0, 1, 0, 4), - /* 0101 */ V(0, 0, 0, 1, 4), - /* 0110 */ V(0, 1, 0, 0, 4), - /* 0111 */ V(1, 0, 0, 0, 4), - /* 1000 */ V(0, 0, 0, 0, 1), - /* 1001 */ V(0, 0, 0, 0, 1), - /* 1010 */ V(0, 0, 0, 0, 1), - /* 1011 */ V(0, 0, 0, 0, 1), - /* 1100 */ V(0, 0, 0, 0, 1), - /* 1101 */ V(0, 0, 0, 0, 1), - /* 1110 */ V(0, 0, 0, 0, 1), - /* 1111 */ V(0, 0, 0, 0, 1), - - /* 0000 ... */ - /* 00 */ V(1, 0, 1, 1, 2), /* 16 */ - /* 01 */ V(1, 1, 1, 1, 2), - /* 10 */ V(1, 1, 0, 1, 2), - /* 11 */ V(1, 1, 1, 0, 2), - - /* 0001 ... */ - /* 00 */ V(0, 1, 1, 1, 2), /* 20 */ - /* 01 */ V(0, 1, 0, 1, 2), - /* 10 */ V(1, 0, 0, 1, 1), - /* 11 */ V(1, 0, 0, 1, 1), - - /* 0010 ... */ - /* 0 */ V(0, 1, 1, 0, 1), /* 24 */ - /* 1 */ V(0, 0, 1, 1, 1), - - /* 0011 ... */ - /* 0 */ V(1, 0, 1, 0, 1), /* 26 */ - /* 1 */ V(1, 1, 0, 0, 1) -}; - -static -union huffquad const hufftabB[] = { - /* 0000 */ V(1, 1, 1, 1, 4), - /* 0001 */ V(1, 1, 1, 0, 4), - /* 0010 */ V(1, 1, 0, 1, 4), - /* 0011 */ V(1, 1, 0, 0, 4), - /* 0100 */ V(1, 0, 1, 1, 4), - /* 0101 */ V(1, 0, 1, 0, 4), - /* 0110 */ V(1, 0, 0, 1, 4), - /* 0111 */ V(1, 0, 0, 0, 4), - /* 1000 */ V(0, 1, 1, 1, 4), - /* 1001 */ V(0, 1, 1, 0, 4), - /* 1010 */ V(0, 1, 0, 1, 4), - /* 1011 */ V(0, 1, 0, 0, 4), - /* 1100 */ V(0, 0, 1, 1, 4), - /* 1101 */ V(0, 0, 1, 0, 4), - /* 1110 */ V(0, 0, 0, 1, 4), - /* 1111 */ V(0, 0, 0, 0, 4) -}; - -# undef V -# undef PTR - -# if defined(__GNUC__) || \ - (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901) -# define PTR(offs, bits) { .ptr = { 0, bits, offs } } -# define V(x, y, hlen) { .value = { 1, hlen, x, y } } -# else -# define PTR(offs, bits) { { 0, bits, offs } } -# if defined(WORDS_BIGENDIAN) -# define V(x, y, hlen) { { 1, hlen, (x << 8) | (y << 4) } } -# else -# define V(x, y, hlen) { { 1, hlen, (x << 0) | (y << 4) } } -# endif -# endif - -static -union huffpair const hufftab0[] = { - /* */ V(0, 0, 0) -}; - -static -union huffpair const hufftab1[] = { - /* 000 */ V(1, 1, 3), - /* 001 */ V(0, 1, 3), - /* 010 */ V(1, 0, 2), - /* 011 */ V(1, 0, 2), - /* 100 */ V(0, 0, 1), - /* 101 */ V(0, 0, 1), - /* 110 */ V(0, 0, 1), - /* 111 */ V(0, 0, 1) -}; - -static -union huffpair const hufftab2[] = { - /* 000 */ PTR(8, 3), - /* 001 */ V(1, 1, 3), - /* 010 */ V(0, 1, 3), - /* 011 */ V(1, 0, 3), - /* 100 */ V(0, 0, 1), - /* 101 */ V(0, 0, 1), - /* 110 */ V(0, 0, 1), - /* 111 */ V(0, 0, 1), - - /* 000 ... */ - /* 000 */ V(2, 2, 3), /* 8 */ - /* 001 */ V(0, 2, 3), - /* 010 */ V(1, 2, 2), - /* 011 */ V(1, 2, 2), - /* 100 */ V(2, 1, 2), - /* 101 */ V(2, 1, 2), - /* 110 */ V(2, 0, 2), - /* 111 */ V(2, 0, 2) -}; - -static -union huffpair const hufftab3[] = { - /* 000 */ PTR(8, 3), - /* 001 */ V(1, 0, 3), - /* 010 */ V(1, 1, 2), - /* 011 */ V(1, 1, 2), - /* 100 */ V(0, 1, 2), - /* 101 */ V(0, 1, 2), - /* 110 */ V(0, 0, 2), - /* 111 */ V(0, 0, 2), - - /* 000 ... */ - /* 000 */ V(2, 2, 3), /* 8 */ - /* 001 */ V(0, 2, 3), - /* 010 */ V(1, 2, 2), - /* 011 */ V(1, 2, 2), - /* 100 */ V(2, 1, 2), - /* 101 */ V(2, 1, 2), - /* 110 */ V(2, 0, 2), - /* 111 */ V(2, 0, 2) -}; - -static -union huffpair const hufftab5[] = { - /* 000 */ PTR(8, 4), - /* 001 */ V(1, 1, 3), - /* 010 */ V(0, 1, 3), - /* 011 */ V(1, 0, 3), - /* 100 */ V(0, 0, 1), - /* 101 */ V(0, 0, 1), - /* 110 */ V(0, 0, 1), - /* 111 */ V(0, 0, 1), - - /* 000 ... */ - /* 0000 */ PTR(24, 1), /* 8 */ - /* 0001 */ V(3, 2, 4), - /* 0010 */ V(3, 1, 3), - /* 0011 */ V(3, 1, 3), - /* 0100 */ V(1, 3, 4), - /* 0101 */ V(0, 3, 4), - /* 0110 */ V(3, 0, 4), - /* 0111 */ V(2, 2, 4), - /* 1000 */ V(1, 2, 3), - /* 1001 */ V(1, 2, 3), - /* 1010 */ V(2, 1, 3), - /* 1011 */ V(2, 1, 3), - /* 1100 */ V(0, 2, 3), - /* 1101 */ V(0, 2, 3), - /* 1110 */ V(2, 0, 3), - /* 1111 */ V(2, 0, 3), - - /* 000 0000 ... */ - /* 0 */ V(3, 3, 1), /* 24 */ - /* 1 */ V(2, 3, 1) -}; - -static -union huffpair const hufftab6[] = { - /* 0000 */ PTR(16, 3), - /* 0001 */ PTR(24, 1), - /* 0010 */ PTR(26, 1), - /* 0011 */ V(1, 2, 4), - /* 0100 */ V(2, 1, 4), - /* 0101 */ V(2, 0, 4), - /* 0110 */ V(0, 1, 3), - /* 0111 */ V(0, 1, 3), - /* 1000 */ V(1, 1, 2), - /* 1001 */ V(1, 1, 2), - /* 1010 */ V(1, 1, 2), - /* 1011 */ V(1, 1, 2), - /* 1100 */ V(1, 0, 3), - /* 1101 */ V(1, 0, 3), - /* 1110 */ V(0, 0, 3), - /* 1111 */ V(0, 0, 3), - - /* 0000 ... */ - /* 000 */ V(3, 3, 3), /* 16 */ - /* 001 */ V(0, 3, 3), - /* 010 */ V(2, 3, 2), - /* 011 */ V(2, 3, 2), - /* 100 */ V(3, 2, 2), - /* 101 */ V(3, 2, 2), - /* 110 */ V(3, 0, 2), - /* 111 */ V(3, 0, 2), - - /* 0001 ... */ - /* 0 */ V(1, 3, 1), /* 24 */ - /* 1 */ V(3, 1, 1), - - /* 0010 ... */ - /* 0 */ V(2, 2, 1), /* 26 */ - /* 1 */ V(0, 2, 1) -}; - -static -union huffpair const hufftab7[] = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 4), - /* 0010 */ PTR(48, 2), - /* 0011 */ V(1, 1, 4), - /* 0100 */ V(0, 1, 3), - /* 0101 */ V(0, 1, 3), - /* 0110 */ V(1, 0, 3), - /* 0111 */ V(1, 0, 3), - /* 1000 */ V(0, 0, 1), - /* 1001 */ V(0, 0, 1), - /* 1010 */ V(0, 0, 1), - /* 1011 */ V(0, 0, 1), - /* 1100 */ V(0, 0, 1), - /* 1101 */ V(0, 0, 1), - /* 1110 */ V(0, 0, 1), - /* 1111 */ V(0, 0, 1), - - /* 0000 ... */ - /* 0000 */ PTR(52, 2), /* 16 */ - /* 0001 */ PTR(56, 1), - /* 0010 */ PTR(58, 1), - /* 0011 */ V(1, 5, 4), - /* 0100 */ V(5, 1, 4), - /* 0101 */ PTR(60, 1), - /* 0110 */ V(5, 0, 4), - /* 0111 */ PTR(62, 1), - /* 1000 */ V(2, 4, 4), - /* 1001 */ V(4, 2, 4), - /* 1010 */ V(1, 4, 3), - /* 1011 */ V(1, 4, 3), - /* 1100 */ V(4, 1, 3), - /* 1101 */ V(4, 1, 3), - /* 1110 */ V(4, 0, 3), - /* 1111 */ V(4, 0, 3), - - /* 0001 ... */ - /* 0000 */ V(0, 4, 4), /* 32 */ - /* 0001 */ V(2, 3, 4), - /* 0010 */ V(3, 2, 4), - /* 0011 */ V(0, 3, 4), - /* 0100 */ V(1, 3, 3), - /* 0101 */ V(1, 3, 3), - /* 0110 */ V(3, 1, 3), - /* 0111 */ V(3, 1, 3), - /* 1000 */ V(3, 0, 3), - /* 1001 */ V(3, 0, 3), - /* 1010 */ V(2, 2, 3), - /* 1011 */ V(2, 2, 3), - /* 1100 */ V(1, 2, 2), - /* 1101 */ V(1, 2, 2), - /* 1110 */ V(1, 2, 2), - /* 1111 */ V(1, 2, 2), - - /* 0010 ... */ - /* 00 */ V(2, 1, 1), /* 48 */ - /* 01 */ V(2, 1, 1), - /* 10 */ V(0, 2, 2), - /* 11 */ V(2, 0, 2), - - /* 0000 0000 ... */ - /* 00 */ V(5, 5, 2), /* 52 */ - /* 01 */ V(4, 5, 2), - /* 10 */ V(5, 4, 2), - /* 11 */ V(5, 3, 2), - - /* 0000 0001 ... */ - /* 0 */ V(3, 5, 1), /* 56 */ - /* 1 */ V(4, 4, 1), - - /* 0000 0010 ... */ - /* 0 */ V(2, 5, 1), /* 58 */ - /* 1 */ V(5, 2, 1), - - /* 0000 0101 ... */ - /* 0 */ V(0, 5, 1), /* 60 */ - /* 1 */ V(3, 4, 1), - - /* 0000 0111 ... */ - /* 0 */ V(4, 3, 1), /* 62 */ - /* 1 */ V(3, 3, 1) -}; - -# if 0 -/* this version saves 8 entries (16 bytes) at the expense of - an extra lookup in 4 out of 36 cases */ -static -union huffpair const hufftab8[] = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 2), - /* 0010 */ V(1, 2, 4), - /* 0011 */ V(2, 1, 4), - /* 0100 */ V(1, 1, 2), - /* 0101 */ V(1, 1, 2), - /* 0110 */ V(1, 1, 2), - /* 0111 */ V(1, 1, 2), - /* 1000 */ V(0, 1, 3), - /* 1001 */ V(0, 1, 3), - /* 1010 */ V(1, 0, 3), - /* 1011 */ V(1, 0, 3), - /* 1100 */ V(0, 0, 2), - /* 1101 */ V(0, 0, 2), - /* 1110 */ V(0, 0, 2), - /* 1111 */ V(0, 0, 2), - - /* 0000 ... */ - /* 0000 */ PTR(36, 3), /* 16 */ - /* 0001 */ PTR(44, 2), - /* 0010 */ PTR(48, 1), - /* 0011 */ V(1, 5, 4), - /* 0100 */ V(5, 1, 4), - /* 0101 */ PTR(50, 1), - /* 0110 */ PTR(52, 1), - /* 0111 */ V(2, 4, 4), - /* 1000 */ V(4, 2, 4), - /* 1001 */ V(1, 4, 4), - /* 1010 */ V(4, 1, 3), - /* 1011 */ V(4, 1, 3), - /* 1100 */ V(0, 4, 4), - /* 1101 */ V(4, 0, 4), - /* 1110 */ V(2, 3, 4), - /* 1111 */ V(3, 2, 4), - - /* 0001 ... */ - /* 00 */ PTR(54, 2), /* 32 */ - /* 01 */ V(2, 2, 2), - /* 10 */ V(0, 2, 2), - /* 11 */ V(2, 0, 2), - - /* 0000 0000 ... */ - /* 000 */ V(5, 5, 3), /* 36 */ - /* 001 */ V(5, 4, 3), - /* 010 */ V(4, 5, 2), - /* 011 */ V(4, 5, 2), - /* 100 */ V(5, 3, 1), - /* 101 */ V(5, 3, 1), - /* 110 */ V(5, 3, 1), - /* 111 */ V(5, 3, 1), - - /* 0000 0001 ... */ - /* 00 */ V(3, 5, 2), /* 44 */ - /* 01 */ V(4, 4, 2), - /* 10 */ V(2, 5, 1), - /* 11 */ V(2, 5, 1), - - /* 0000 0010 ... */ - /* 0 */ V(5, 2, 1), /* 48 */ - /* 1 */ V(0, 5, 1), - - /* 0000 0101 ... */ - /* 0 */ V(3, 4, 1), /* 50 */ - /* 1 */ V(4, 3, 1), - - /* 0000 0110 ... */ - /* 0 */ V(5, 0, 1), /* 52 */ - /* 1 */ V(3, 3, 1), - - /* 0001 00 ... */ - /* 00 */ V(1, 3, 2), /* 54 */ - /* 01 */ V(3, 1, 2), - /* 10 */ V(0, 3, 2), - /* 11 */ V(3, 0, 2), -}; -# else -static -union huffpair const hufftab8[] = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 4), - /* 0010 */ V(1, 2, 4), - /* 0011 */ V(2, 1, 4), - /* 0100 */ V(1, 1, 2), - /* 0101 */ V(1, 1, 2), - /* 0110 */ V(1, 1, 2), - /* 0111 */ V(1, 1, 2), - /* 1000 */ V(0, 1, 3), - /* 1001 */ V(0, 1, 3), - /* 1010 */ V(1, 0, 3), - /* 1011 */ V(1, 0, 3), - /* 1100 */ V(0, 0, 2), - /* 1101 */ V(0, 0, 2), - /* 1110 */ V(0, 0, 2), - /* 1111 */ V(0, 0, 2), - - /* 0000 ... */ - /* 0000 */ PTR(48, 3), /* 16 */ - /* 0001 */ PTR(56, 2), - /* 0010 */ PTR(60, 1), - /* 0011 */ V(1, 5, 4), - /* 0100 */ V(5, 1, 4), - /* 0101 */ PTR(62, 1), - /* 0110 */ PTR(64, 1), - /* 0111 */ V(2, 4, 4), - /* 1000 */ V(4, 2, 4), - /* 1001 */ V(1, 4, 4), - /* 1010 */ V(4, 1, 3), - /* 1011 */ V(4, 1, 3), - /* 1100 */ V(0, 4, 4), - /* 1101 */ V(4, 0, 4), - /* 1110 */ V(2, 3, 4), - /* 1111 */ V(3, 2, 4), - - /* 0001 ... */ - /* 0000 */ V(1, 3, 4), /* 32 */ - /* 0001 */ V(3, 1, 4), - /* 0010 */ V(0, 3, 4), - /* 0011 */ V(3, 0, 4), - /* 0100 */ V(2, 2, 2), - /* 0101 */ V(2, 2, 2), - /* 0110 */ V(2, 2, 2), - /* 0111 */ V(2, 2, 2), - /* 1000 */ V(0, 2, 2), - /* 1001 */ V(0, 2, 2), - /* 1010 */ V(0, 2, 2), - /* 1011 */ V(0, 2, 2), - /* 1100 */ V(2, 0, 2), - /* 1101 */ V(2, 0, 2), - /* 1110 */ V(2, 0, 2), - /* 1111 */ V(2, 0, 2), - - /* 0000 0000 ... */ - /* 000 */ V(5, 5, 3), /* 48 */ - /* 001 */ V(5, 4, 3), - /* 010 */ V(4, 5, 2), - /* 011 */ V(4, 5, 2), - /* 100 */ V(5, 3, 1), - /* 101 */ V(5, 3, 1), - /* 110 */ V(5, 3, 1), - /* 111 */ V(5, 3, 1), - - /* 0000 0001 ... */ - /* 00 */ V(3, 5, 2), /* 56 */ - /* 01 */ V(4, 4, 2), - /* 10 */ V(2, 5, 1), - /* 11 */ V(2, 5, 1), - - /* 0000 0010 ... */ - /* 0 */ V(5, 2, 1), /* 60 */ - /* 1 */ V(0, 5, 1), - - /* 0000 0101 ... */ - /* 0 */ V(3, 4, 1), /* 62 */ - /* 1 */ V(4, 3, 1), - - /* 0000 0110 ... */ - /* 0 */ V(5, 0, 1), /* 64 */ - /* 1 */ V(3, 3, 1) -}; -# endif - -static -union huffpair const hufftab9[] = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 3), - /* 0010 */ PTR(40, 2), - /* 0011 */ PTR(44, 2), - /* 0100 */ PTR(48, 1), - /* 0101 */ V(1, 2, 4), - /* 0110 */ V(2, 1, 4), - /* 0111 */ V(2, 0, 4), - /* 1000 */ V(1, 1, 3), - /* 1001 */ V(1, 1, 3), - /* 1010 */ V(0, 1, 3), - /* 1011 */ V(0, 1, 3), - /* 1100 */ V(1, 0, 3), - /* 1101 */ V(1, 0, 3), - /* 1110 */ V(0, 0, 3), - /* 1111 */ V(0, 0, 3), - - /* 0000 ... */ - /* 0000 */ PTR(50, 1), /* 16 */ - /* 0001 */ V(3, 5, 4), - /* 0010 */ V(5, 3, 4), - /* 0011 */ PTR(52, 1), - /* 0100 */ V(4, 4, 4), - /* 0101 */ V(2, 5, 4), - /* 0110 */ V(5, 2, 4), - /* 0111 */ V(1, 5, 4), - /* 1000 */ V(5, 1, 3), - /* 1001 */ V(5, 1, 3), - /* 1010 */ V(3, 4, 3), - /* 1011 */ V(3, 4, 3), - /* 1100 */ V(4, 3, 3), - /* 1101 */ V(4, 3, 3), - /* 1110 */ V(5, 0, 4), - /* 1111 */ V(0, 4, 4), - - /* 0001 ... */ - /* 000 */ V(2, 4, 3), /* 32 */ - /* 001 */ V(4, 2, 3), - /* 010 */ V(3, 3, 3), - /* 011 */ V(4, 0, 3), - /* 100 */ V(1, 4, 2), - /* 101 */ V(1, 4, 2), - /* 110 */ V(4, 1, 2), - /* 111 */ V(4, 1, 2), - - /* 0010 ... */ - /* 00 */ V(2, 3, 2), /* 40 */ - /* 01 */ V(3, 2, 2), - /* 10 */ V(1, 3, 1), - /* 11 */ V(1, 3, 1), - - /* 0011 ... */ - /* 00 */ V(3, 1, 1), /* 44 */ - /* 01 */ V(3, 1, 1), - /* 10 */ V(0, 3, 2), - /* 11 */ V(3, 0, 2), - - /* 0100 ... */ - /* 0 */ V(2, 2, 1), /* 48 */ - /* 1 */ V(0, 2, 1), - - /* 0000 0000 ... */ - /* 0 */ V(5, 5, 1), /* 50 */ - /* 1 */ V(4, 5, 1), - - /* 0000 0011 ... */ - /* 0 */ V(5, 4, 1), /* 52 */ - /* 1 */ V(0, 5, 1) -}; - -static -union huffpair const hufftab10[] = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 4), - /* 0010 */ PTR(48, 2), - /* 0011 */ V(1, 1, 4), - /* 0100 */ V(0, 1, 3), - /* 0101 */ V(0, 1, 3), - /* 0110 */ V(1, 0, 3), - /* 0111 */ V(1, 0, 3), - /* 1000 */ V(0, 0, 1), - /* 1001 */ V(0, 0, 1), - /* 1010 */ V(0, 0, 1), - /* 1011 */ V(0, 0, 1), - /* 1100 */ V(0, 0, 1), - /* 1101 */ V(0, 0, 1), - /* 1110 */ V(0, 0, 1), - /* 1111 */ V(0, 0, 1), - - /* 0000 ... */ - /* 0000 */ PTR(52, 3), /* 16 */ - /* 0001 */ PTR(60, 2), - /* 0010 */ PTR(64, 3), - /* 0011 */ PTR(72, 1), - /* 0100 */ PTR(74, 2), - /* 0101 */ PTR(78, 2), - /* 0110 */ PTR(82, 2), - /* 0111 */ V(1, 7, 4), - /* 1000 */ V(7, 1, 4), - /* 1001 */ PTR(86, 1), - /* 1010 */ PTR(88, 2), - /* 1011 */ PTR(92, 2), - /* 1100 */ V(1, 6, 4), - /* 1101 */ V(6, 1, 4), - /* 1110 */ V(6, 0, 4), - /* 1111 */ PTR(96, 1), - - /* 0001 ... */ - /* 0000 */ PTR(98, 1), /* 32 */ - /* 0001 */ PTR(100, 1), - /* 0010 */ V(1, 4, 4), - /* 0011 */ V(4, 1, 4), - /* 0100 */ V(4, 0, 4), - /* 0101 */ V(2, 3, 4), - /* 0110 */ V(3, 2, 4), - /* 0111 */ V(0, 3, 4), - /* 1000 */ V(1, 3, 3), - /* 1001 */ V(1, 3, 3), - /* 1010 */ V(3, 1, 3), - /* 1011 */ V(3, 1, 3), - /* 1100 */ V(3, 0, 3), - /* 1101 */ V(3, 0, 3), - /* 1110 */ V(2, 2, 3), - /* 1111 */ V(2, 2, 3), - - /* 0010 ... */ - /* 00 */ V(1, 2, 2), /* 48 */ - /* 01 */ V(2, 1, 2), - /* 10 */ V(0, 2, 2), - /* 11 */ V(2, 0, 2), - - /* 0000 0000 ... */ - /* 000 */ V(7, 7, 3), /* 52 */ - /* 001 */ V(6, 7, 3), - /* 010 */ V(7, 6, 3), - /* 011 */ V(5, 7, 3), - /* 100 */ V(7, 5, 3), - /* 101 */ V(6, 6, 3), - /* 110 */ V(4, 7, 2), - /* 111 */ V(4, 7, 2), - - /* 0000 0001 ... */ - /* 00 */ V(7, 4, 2), /* 60 */ - /* 01 */ V(5, 6, 2), - /* 10 */ V(6, 5, 2), - /* 11 */ V(3, 7, 2), - - /* 0000 0010 ... */ - /* 000 */ V(7, 3, 2), /* 64 */ - /* 001 */ V(7, 3, 2), - /* 010 */ V(4, 6, 2), - /* 011 */ V(4, 6, 2), - /* 100 */ V(5, 5, 3), - /* 101 */ V(5, 4, 3), - /* 110 */ V(6, 3, 2), - /* 111 */ V(6, 3, 2), - - /* 0000 0011 ... */ - /* 0 */ V(2, 7, 1), /* 72 */ - /* 1 */ V(7, 2, 1), - - /* 0000 0100 ... */ - /* 00 */ V(6, 4, 2), /* 74 */ - /* 01 */ V(0, 7, 2), - /* 10 */ V(7, 0, 1), - /* 11 */ V(7, 0, 1), - - /* 0000 0101 ... */ - /* 00 */ V(6, 2, 1), /* 78 */ - /* 01 */ V(6, 2, 1), - /* 10 */ V(4, 5, 2), - /* 11 */ V(3, 5, 2), - - /* 0000 0110 ... */ - /* 00 */ V(0, 6, 1), /* 82 */ - /* 01 */ V(0, 6, 1), - /* 10 */ V(5, 3, 2), - /* 11 */ V(4, 4, 2), - - /* 0000 1001 ... */ - /* 0 */ V(3, 6, 1), /* 86 */ - /* 1 */ V(2, 6, 1), - - /* 0000 1010 ... */ - /* 00 */ V(2, 5, 2), /* 88 */ - /* 01 */ V(5, 2, 2), - /* 10 */ V(1, 5, 1), - /* 11 */ V(1, 5, 1), - - /* 0000 1011 ... */ - /* 00 */ V(5, 1, 1), /* 92 */ - /* 01 */ V(5, 1, 1), - /* 10 */ V(3, 4, 2), - /* 11 */ V(4, 3, 2), - - /* 0000 1111 ... */ - /* 0 */ V(0, 5, 1), /* 96 */ - /* 1 */ V(5, 0, 1), - - /* 0001 0000 ... */ - /* 0 */ V(2, 4, 1), /* 98 */ - /* 1 */ V(4, 2, 1), - - /* 0001 0001 ... */ - /* 0 */ V(3, 3, 1), /* 100 */ - /* 1 */ V(0, 4, 1) -}; - -static -union huffpair const hufftab11[] = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 4), - /* 0010 */ PTR(48, 4), - /* 0011 */ PTR(64, 3), - /* 0100 */ V(1, 2, 4), - /* 0101 */ PTR(72, 1), - /* 0110 */ V(1, 1, 3), - /* 0111 */ V(1, 1, 3), - /* 1000 */ V(0, 1, 3), - /* 1001 */ V(0, 1, 3), - /* 1010 */ V(1, 0, 3), - /* 1011 */ V(1, 0, 3), - /* 1100 */ V(0, 0, 2), - /* 1101 */ V(0, 0, 2), - /* 1110 */ V(0, 0, 2), - /* 1111 */ V(0, 0, 2), - - /* 0000 ... */ - /* 0000 */ PTR(74, 2), /* 16 */ - /* 0001 */ PTR(78, 3), - /* 0010 */ PTR(86, 2), - /* 0011 */ PTR(90, 1), - /* 0100 */ PTR(92, 2), - /* 0101 */ V(2, 7, 4), - /* 0110 */ V(7, 2, 4), - /* 0111 */ PTR(96, 1), - /* 1000 */ V(7, 1, 3), - /* 1001 */ V(7, 1, 3), - /* 1010 */ V(1, 7, 4), - /* 1011 */ V(7, 0, 4), - /* 1100 */ V(3, 6, 4), - /* 1101 */ V(6, 3, 4), - /* 1110 */ V(6, 0, 4), - /* 1111 */ PTR(98, 1), - - /* 0001 ... */ - /* 0000 */ PTR(100, 1), /* 32 */ - /* 0001 */ V(1, 5, 4), - /* 0010 */ V(6, 2, 3), - /* 0011 */ V(6, 2, 3), - /* 0100 */ V(2, 6, 4), - /* 0101 */ V(0, 6, 4), - /* 0110 */ V(1, 6, 3), - /* 0111 */ V(1, 6, 3), - /* 1000 */ V(6, 1, 3), - /* 1001 */ V(6, 1, 3), - /* 1010 */ V(5, 1, 4), - /* 1011 */ V(3, 4, 4), - /* 1100 */ V(5, 0, 4), - /* 1101 */ PTR(102, 1), - /* 1110 */ V(2, 4, 4), - /* 1111 */ V(4, 2, 4), - - /* 0010 ... */ - /* 0000 */ V(1, 4, 4), /* 48 */ - /* 0001 */ V(4, 1, 4), - /* 0010 */ V(0, 4, 4), - /* 0011 */ V(4, 0, 4), - /* 0100 */ V(2, 3, 3), - /* 0101 */ V(2, 3, 3), - /* 0110 */ V(3, 2, 3), - /* 0111 */ V(3, 2, 3), - /* 1000 */ V(1, 3, 2), - /* 1001 */ V(1, 3, 2), - /* 1010 */ V(1, 3, 2), - /* 1011 */ V(1, 3, 2), - /* 1100 */ V(3, 1, 2), - /* 1101 */ V(3, 1, 2), - /* 1110 */ V(3, 1, 2), - /* 1111 */ V(3, 1, 2), - - /* 0011 ... */ - /* 000 */ V(0, 3, 3), /* 64 */ - /* 001 */ V(3, 0, 3), - /* 010 */ V(2, 2, 2), - /* 011 */ V(2, 2, 2), - /* 100 */ V(2, 1, 1), - /* 101 */ V(2, 1, 1), - /* 110 */ V(2, 1, 1), - /* 111 */ V(2, 1, 1), - - /* 0101 ... */ - /* 0 */ V(0, 2, 1), /* 72 */ - /* 1 */ V(2, 0, 1), - - /* 0000 0000 ... */ - /* 00 */ V(7, 7, 2), /* 74 */ - /* 01 */ V(6, 7, 2), - /* 10 */ V(7, 6, 2), - /* 11 */ V(7, 5, 2), - - /* 0000 0001 ... */ - /* 000 */ V(6, 6, 2), /* 78 */ - /* 001 */ V(6, 6, 2), - /* 010 */ V(4, 7, 2), - /* 011 */ V(4, 7, 2), - /* 100 */ V(7, 4, 2), - /* 101 */ V(7, 4, 2), - /* 110 */ V(5, 7, 3), - /* 111 */ V(5, 5, 3), - - /* 0000 0010 ... */ - /* 00 */ V(5, 6, 2), /* 86 */ - /* 01 */ V(6, 5, 2), - /* 10 */ V(3, 7, 1), - /* 11 */ V(3, 7, 1), - - /* 0000 0011 ... */ - /* 0 */ V(7, 3, 1), /* 90 */ - /* 1 */ V(4, 6, 1), - - /* 0000 0100 ... */ - /* 00 */ V(4, 5, 2), /* 92 */ - /* 01 */ V(5, 4, 2), - /* 10 */ V(3, 5, 2), - /* 11 */ V(5, 3, 2), - - /* 0000 0111 ... */ - /* 0 */ V(6, 4, 1), /* 96 */ - /* 1 */ V(0, 7, 1), - - /* 0000 1111 ... */ - /* 0 */ V(4, 4, 1), /* 98 */ - /* 1 */ V(2, 5, 1), - - /* 0001 0000 ... */ - /* 0 */ V(5, 2, 1), /* 100 */ - /* 1 */ V(0, 5, 1), - - /* 0001 1101 ... */ - /* 0 */ V(4, 3, 1), /* 102 */ - /* 1 */ V(3, 3, 1) -}; - -static -union huffpair const hufftab12[] = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 4), - /* 0010 */ PTR(48, 4), - /* 0011 */ PTR(64, 2), - /* 0100 */ PTR(68, 3), - /* 0101 */ PTR(76, 1), - /* 0110 */ V(1, 2, 4), - /* 0111 */ V(2, 1, 4), - /* 1000 */ PTR(78, 1), - /* 1001 */ V(0, 0, 4), - /* 1010 */ V(1, 1, 3), - /* 1011 */ V(1, 1, 3), - /* 1100 */ V(0, 1, 3), - /* 1101 */ V(0, 1, 3), - /* 1110 */ V(1, 0, 3), - /* 1111 */ V(1, 0, 3), - - /* 0000 ... */ - /* 0000 */ PTR(80, 2), /* 16 */ - /* 0001 */ PTR(84, 1), - /* 0010 */ PTR(86, 1), - /* 0011 */ PTR(88, 1), - /* 0100 */ V(5, 6, 4), - /* 0101 */ V(3, 7, 4), - /* 0110 */ PTR(90, 1), - /* 0111 */ V(2, 7, 4), - /* 1000 */ V(7, 2, 4), - /* 1001 */ V(4, 6, 4), - /* 1010 */ V(6, 4, 4), - /* 1011 */ V(1, 7, 4), - /* 1100 */ V(7, 1, 4), - /* 1101 */ PTR(92, 1), - /* 1110 */ V(3, 6, 4), - /* 1111 */ V(6, 3, 4), - - /* 0001 ... */ - /* 0000 */ V(4, 5, 4), /* 32 */ - /* 0001 */ V(5, 4, 4), - /* 0010 */ V(4, 4, 4), - /* 0011 */ PTR(94, 1), - /* 0100 */ V(2, 6, 3), - /* 0101 */ V(2, 6, 3), - /* 0110 */ V(6, 2, 3), - /* 0111 */ V(6, 2, 3), - /* 1000 */ V(6, 1, 3), - /* 1001 */ V(6, 1, 3), - /* 1010 */ V(1, 6, 4), - /* 1011 */ V(6, 0, 4), - /* 1100 */ V(3, 5, 4), - /* 1101 */ V(5, 3, 4), - /* 1110 */ V(2, 5, 4), - /* 1111 */ V(5, 2, 4), - - /* 0010 ... */ - /* 0000 */ V(1, 5, 3), /* 48 */ - /* 0001 */ V(1, 5, 3), - /* 0010 */ V(5, 1, 3), - /* 0011 */ V(5, 1, 3), - /* 0100 */ V(3, 4, 3), - /* 0101 */ V(3, 4, 3), - /* 0110 */ V(4, 3, 3), - /* 0111 */ V(4, 3, 3), - /* 1000 */ V(5, 0, 4), - /* 1001 */ V(0, 4, 4), - /* 1010 */ V(2, 4, 3), - /* 1011 */ V(2, 4, 3), - /* 1100 */ V(4, 2, 3), - /* 1101 */ V(4, 2, 3), - /* 1110 */ V(1, 4, 3), - /* 1111 */ V(1, 4, 3), - - /* 0011 ... */ - /* 00 */ V(3, 3, 2), /* 64 */ - /* 01 */ V(4, 1, 2), - /* 10 */ V(2, 3, 2), - /* 11 */ V(3, 2, 2), - - /* 0100 ... */ - /* 000 */ V(4, 0, 3), /* 68 */ - /* 001 */ V(0, 3, 3), - /* 010 */ V(3, 0, 2), - /* 011 */ V(3, 0, 2), - /* 100 */ V(1, 3, 1), - /* 101 */ V(1, 3, 1), - /* 110 */ V(1, 3, 1), - /* 111 */ V(1, 3, 1), - - /* 0101 ... */ - /* 0 */ V(3, 1, 1), /* 76 */ - /* 1 */ V(2, 2, 1), - - /* 1000 ... */ - /* 0 */ V(0, 2, 1), /* 78 */ - /* 1 */ V(2, 0, 1), - - /* 0000 0000 ... */ - /* 00 */ V(7, 7, 2), /* 80 */ - /* 01 */ V(6, 7, 2), - /* 10 */ V(7, 6, 1), - /* 11 */ V(7, 6, 1), - - /* 0000 0001 ... */ - /* 0 */ V(5, 7, 1), /* 84 */ - /* 1 */ V(7, 5, 1), - - /* 0000 0010 ... */ - /* 0 */ V(6, 6, 1), /* 86 */ - /* 1 */ V(4, 7, 1), - - /* 0000 0011 ... */ - /* 0 */ V(7, 4, 1), /* 88 */ - /* 1 */ V(6, 5, 1), - - /* 0000 0110 ... */ - /* 0 */ V(7, 3, 1), /* 90 */ - /* 1 */ V(5, 5, 1), - - /* 0000 1101 ... */ - /* 0 */ V(0, 7, 1), /* 92 */ - /* 1 */ V(7, 0, 1), - - /* 0001 0011 ... */ - /* 0 */ V(0, 6, 1), /* 94 */ - /* 1 */ V(0, 5, 1) -}; - -static -union huffpair const hufftab13[] = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 4), - /* 0010 */ PTR(48, 4), - /* 0011 */ PTR(64, 2), - /* 0100 */ V(1, 1, 4), - /* 0101 */ V(0, 1, 4), - /* 0110 */ V(1, 0, 3), - /* 0111 */ V(1, 0, 3), - /* 1000 */ V(0, 0, 1), - /* 1001 */ V(0, 0, 1), - /* 1010 */ V(0, 0, 1), - /* 1011 */ V(0, 0, 1), - /* 1100 */ V(0, 0, 1), - /* 1101 */ V(0, 0, 1), - /* 1110 */ V(0, 0, 1), - /* 1111 */ V(0, 0, 1), - - /* 0000 ... */ - /* 0000 */ PTR(68, 4), /* 16 */ - /* 0001 */ PTR(84, 4), - /* 0010 */ PTR(100, 4), - /* 0011 */ PTR(116, 4), - /* 0100 */ PTR(132, 4), - /* 0101 */ PTR(148, 4), - /* 0110 */ PTR(164, 3), - /* 0111 */ PTR(172, 3), - /* 1000 */ PTR(180, 3), - /* 1001 */ PTR(188, 3), - /* 1010 */ PTR(196, 3), - /* 1011 */ PTR(204, 3), - /* 1100 */ PTR(212, 1), - /* 1101 */ PTR(214, 2), - /* 1110 */ PTR(218, 3), - /* 1111 */ PTR(226, 1), - - /* 0001 ... */ - /* 0000 */ PTR(228, 2), /* 32 */ - /* 0001 */ PTR(232, 2), - /* 0010 */ PTR(236, 2), - /* 0011 */ PTR(240, 2), - /* 0100 */ V(8, 1, 4), - /* 0101 */ PTR(244, 1), - /* 0110 */ PTR(246, 1), - /* 0111 */ PTR(248, 1), - /* 1000 */ PTR(250, 2), - /* 1001 */ PTR(254, 1), - /* 1010 */ V(1, 5, 4), - /* 1011 */ V(5, 1, 4), - /* 1100 */ PTR(256, 1), - /* 1101 */ PTR(258, 1), - /* 1110 */ PTR(260, 1), - /* 1111 */ V(1, 4, 4), - - /* 0010 ... */ - /* 0000 */ V(4, 1, 3), /* 48 */ - /* 0001 */ V(4, 1, 3), - /* 0010 */ V(0, 4, 4), - /* 0011 */ V(4, 0, 4), - /* 0100 */ V(2, 3, 4), - /* 0101 */ V(3, 2, 4), - /* 0110 */ V(1, 3, 3), - /* 0111 */ V(1, 3, 3), - /* 1000 */ V(3, 1, 3), - /* 1001 */ V(3, 1, 3), - /* 1010 */ V(0, 3, 3), - /* 1011 */ V(0, 3, 3), - /* 1100 */ V(3, 0, 3), - /* 1101 */ V(3, 0, 3), - /* 1110 */ V(2, 2, 3), - /* 1111 */ V(2, 2, 3), - - /* 0011 ... */ - /* 00 */ V(1, 2, 2), /* 64 */ - /* 01 */ V(2, 1, 2), - /* 10 */ V(0, 2, 2), - /* 11 */ V(2, 0, 2), - - /* 0000 0000 ... */ - /* 0000 */ PTR(262, 4), /* 68 */ - /* 0001 */ PTR(278, 4), - /* 0010 */ PTR(294, 4), - /* 0011 */ PTR(310, 3), - /* 0100 */ PTR(318, 2), - /* 0101 */ PTR(322, 2), - /* 0110 */ PTR(326, 3), - /* 0111 */ PTR(334, 2), - /* 1000 */ PTR(338, 1), - /* 1001 */ PTR(340, 2), - /* 1010 */ PTR(344, 2), - /* 1011 */ PTR(348, 2), - /* 1100 */ PTR(352, 2), - /* 1101 */ PTR(356, 2), - /* 1110 */ V(1, 15, 4), - /* 1111 */ V(15, 1, 4), - - /* 0000 0001 ... */ - /* 0000 */ V(15, 0, 4), /* 84 */ - /* 0001 */ PTR(360, 1), - /* 0010 */ PTR(362, 1), - /* 0011 */ PTR(364, 1), - /* 0100 */ V(14, 2, 4), - /* 0101 */ PTR(366, 1), - /* 0110 */ V(1, 14, 4), - /* 0111 */ V(14, 1, 4), - /* 1000 */ PTR(368, 1), - /* 1001 */ PTR(370, 1), - /* 1010 */ PTR(372, 1), - /* 1011 */ PTR(374, 1), - /* 1100 */ PTR(376, 1), - /* 1101 */ PTR(378, 1), - /* 1110 */ V(12, 6, 4), - /* 1111 */ V(3, 13, 4), - - /* 0000 0010 ... */ - /* 0000 */ PTR(380, 1), /* 100 */ - /* 0001 */ V(2, 13, 4), - /* 0010 */ V(13, 2, 4), - /* 0011 */ V(1, 13, 4), - /* 0100 */ V(11, 7, 4), - /* 0101 */ PTR(382, 1), - /* 0110 */ PTR(384, 1), - /* 0111 */ V(12, 3, 4), - /* 1000 */ PTR(386, 1), - /* 1001 */ V(4, 11, 4), - /* 1010 */ V(13, 1, 3), - /* 1011 */ V(13, 1, 3), - /* 1100 */ V(0, 13, 4), - /* 1101 */ V(13, 0, 4), - /* 1110 */ V(8, 10, 4), - /* 1111 */ V(10, 8, 4), - - /* 0000 0011 ... */ - /* 0000 */ V(4, 12, 4), /* 116 */ - /* 0001 */ V(12, 4, 4), - /* 0010 */ V(6, 11, 4), - /* 0011 */ V(11, 6, 4), - /* 0100 */ V(3, 12, 3), - /* 0101 */ V(3, 12, 3), - /* 0110 */ V(2, 12, 3), - /* 0111 */ V(2, 12, 3), - /* 1000 */ V(12, 2, 3), - /* 1001 */ V(12, 2, 3), - /* 1010 */ V(5, 11, 3), - /* 1011 */ V(5, 11, 3), - /* 1100 */ V(11, 5, 4), - /* 1101 */ V(8, 9, 4), - /* 1110 */ V(1, 12, 3), - /* 1111 */ V(1, 12, 3), - - /* 0000 0100 ... */ - /* 0000 */ V(12, 1, 3), /* 132 */ - /* 0001 */ V(12, 1, 3), - /* 0010 */ V(9, 8, 4), - /* 0011 */ V(0, 12, 4), - /* 0100 */ V(12, 0, 3), - /* 0101 */ V(12, 0, 3), - /* 0110 */ V(11, 4, 4), - /* 0111 */ V(6, 10, 4), - /* 1000 */ V(10, 6, 4), - /* 1001 */ V(7, 9, 4), - /* 1010 */ V(3, 11, 3), - /* 1011 */ V(3, 11, 3), - /* 1100 */ V(11, 3, 3), - /* 1101 */ V(11, 3, 3), - /* 1110 */ V(8, 8, 4), - /* 1111 */ V(5, 10, 4), - - /* 0000 0101 ... */ - /* 0000 */ V(2, 11, 3), /* 148 */ - /* 0001 */ V(2, 11, 3), - /* 0010 */ V(10, 5, 4), - /* 0011 */ V(6, 9, 4), - /* 0100 */ V(10, 4, 3), - /* 0101 */ V(10, 4, 3), - /* 0110 */ V(7, 8, 4), - /* 0111 */ V(8, 7, 4), - /* 1000 */ V(9, 4, 3), - /* 1001 */ V(9, 4, 3), - /* 1010 */ V(7, 7, 4), - /* 1011 */ V(7, 6, 4), - /* 1100 */ V(11, 2, 2), - /* 1101 */ V(11, 2, 2), - /* 1110 */ V(11, 2, 2), - /* 1111 */ V(11, 2, 2), - - /* 0000 0110 ... */ - /* 000 */ V(1, 11, 2), /* 164 */ - /* 001 */ V(1, 11, 2), - /* 010 */ V(11, 1, 2), - /* 011 */ V(11, 1, 2), - /* 100 */ V(0, 11, 3), - /* 101 */ V(11, 0, 3), - /* 110 */ V(9, 6, 3), - /* 111 */ V(4, 10, 3), - - /* 0000 0111 ... */ - /* 000 */ V(3, 10, 3), /* 172 */ - /* 001 */ V(10, 3, 3), - /* 010 */ V(5, 9, 3), - /* 011 */ V(9, 5, 3), - /* 100 */ V(2, 10, 2), - /* 101 */ V(2, 10, 2), - /* 110 */ V(10, 2, 2), - /* 111 */ V(10, 2, 2), - - /* 0000 1000 ... */ - /* 000 */ V(1, 10, 2), /* 180 */ - /* 001 */ V(1, 10, 2), - /* 010 */ V(10, 1, 2), - /* 011 */ V(10, 1, 2), - /* 100 */ V(0, 10, 3), - /* 101 */ V(6, 8, 3), - /* 110 */ V(10, 0, 2), - /* 111 */ V(10, 0, 2), - - /* 0000 1001 ... */ - /* 000 */ V(8, 6, 3), /* 188 */ - /* 001 */ V(4, 9, 3), - /* 010 */ V(9, 3, 2), - /* 011 */ V(9, 3, 2), - /* 100 */ V(3, 9, 3), - /* 101 */ V(5, 8, 3), - /* 110 */ V(8, 5, 3), - /* 111 */ V(6, 7, 3), - - /* 0000 1010 ... */ - /* 000 */ V(2, 9, 2), /* 196 */ - /* 001 */ V(2, 9, 2), - /* 010 */ V(9, 2, 2), - /* 011 */ V(9, 2, 2), - /* 100 */ V(5, 7, 3), - /* 101 */ V(7, 5, 3), - /* 110 */ V(3, 8, 2), - /* 111 */ V(3, 8, 2), - - /* 0000 1011 ... */ - /* 000 */ V(8, 3, 2), /* 204 */ - /* 001 */ V(8, 3, 2), - /* 010 */ V(6, 6, 3), - /* 011 */ V(4, 7, 3), - /* 100 */ V(7, 4, 3), - /* 101 */ V(5, 6, 3), - /* 110 */ V(6, 5, 3), - /* 111 */ V(7, 3, 3), - - /* 0000 1100 ... */ - /* 0 */ V(1, 9, 1), /* 212 */ - /* 1 */ V(9, 1, 1), - - /* 0000 1101 ... */ - /* 00 */ V(0, 9, 2), /* 214 */ - /* 01 */ V(9, 0, 2), - /* 10 */ V(4, 8, 2), - /* 11 */ V(8, 4, 2), - - /* 0000 1110 ... */ - /* 000 */ V(7, 2, 2), /* 218 */ - /* 001 */ V(7, 2, 2), - /* 010 */ V(4, 6, 3), - /* 011 */ V(6, 4, 3), - /* 100 */ V(2, 8, 1), - /* 101 */ V(2, 8, 1), - /* 110 */ V(2, 8, 1), - /* 111 */ V(2, 8, 1), - - /* 0000 1111 ... */ - /* 0 */ V(8, 2, 1), /* 226 */ - /* 1 */ V(1, 8, 1), - - /* 0001 0000 ... */ - /* 00 */ V(3, 7, 2), /* 228 */ - /* 01 */ V(2, 7, 2), - /* 10 */ V(1, 7, 1), - /* 11 */ V(1, 7, 1), - - /* 0001 0001 ... */ - /* 00 */ V(7, 1, 1), /* 232 */ - /* 01 */ V(7, 1, 1), - /* 10 */ V(5, 5, 2), - /* 11 */ V(0, 7, 2), - - /* 0001 0010 ... */ - /* 00 */ V(7, 0, 2), /* 236 */ - /* 01 */ V(3, 6, 2), - /* 10 */ V(6, 3, 2), - /* 11 */ V(4, 5, 2), - - /* 0001 0011 ... */ - /* 00 */ V(5, 4, 2), /* 240 */ - /* 01 */ V(2, 6, 2), - /* 10 */ V(6, 2, 2), - /* 11 */ V(3, 5, 2), - - /* 0001 0101 ... */ - /* 0 */ V(0, 8, 1), /* 244 */ - /* 1 */ V(8, 0, 1), - - /* 0001 0110 ... */ - /* 0 */ V(1, 6, 1), /* 246 */ - /* 1 */ V(6, 1, 1), - - /* 0001 0111 ... */ - /* 0 */ V(0, 6, 1), /* 248 */ - /* 1 */ V(6, 0, 1), - - /* 0001 1000 ... */ - /* 00 */ V(5, 3, 2), /* 250 */ - /* 01 */ V(4, 4, 2), - /* 10 */ V(2, 5, 1), - /* 11 */ V(2, 5, 1), - - /* 0001 1001 ... */ - /* 0 */ V(5, 2, 1), /* 254 */ - /* 1 */ V(0, 5, 1), - - /* 0001 1100 ... */ - /* 0 */ V(3, 4, 1), /* 256 */ - /* 1 */ V(4, 3, 1), - - /* 0001 1101 ... */ - /* 0 */ V(5, 0, 1), /* 258 */ - /* 1 */ V(2, 4, 1), - - /* 0001 1110 ... */ - /* 0 */ V(4, 2, 1), /* 260 */ - /* 1 */ V(3, 3, 1), - - /* 0000 0000 0000 ... */ - /* 0000 */ PTR(388, 3), /* 262 */ - /* 0001 */ V(15, 15, 4), - /* 0010 */ V(14, 15, 4), - /* 0011 */ V(13, 15, 4), - /* 0100 */ V(14, 14, 4), - /* 0101 */ V(12, 15, 4), - /* 0110 */ V(13, 14, 4), - /* 0111 */ V(11, 15, 4), - /* 1000 */ V(15, 11, 4), - /* 1001 */ V(12, 14, 4), - /* 1010 */ V(13, 12, 4), - /* 1011 */ PTR(396, 1), - /* 1100 */ V(14, 12, 3), - /* 1101 */ V(14, 12, 3), - /* 1110 */ V(13, 13, 3), - /* 1111 */ V(13, 13, 3), - - /* 0000 0000 0001 ... */ - /* 0000 */ V(15, 10, 4), /* 278 */ - /* 0001 */ V(12, 13, 4), - /* 0010 */ V(11, 14, 3), - /* 0011 */ V(11, 14, 3), - /* 0100 */ V(14, 11, 3), - /* 0101 */ V(14, 11, 3), - /* 0110 */ V(9, 15, 3), - /* 0111 */ V(9, 15, 3), - /* 1000 */ V(15, 9, 3), - /* 1001 */ V(15, 9, 3), - /* 1010 */ V(14, 10, 3), - /* 1011 */ V(14, 10, 3), - /* 1100 */ V(11, 13, 3), - /* 1101 */ V(11, 13, 3), - /* 1110 */ V(13, 11, 3), - /* 1111 */ V(13, 11, 3), - - /* 0000 0000 0010 ... */ - /* 0000 */ V(8, 15, 3), /* 294 */ - /* 0001 */ V(8, 15, 3), - /* 0010 */ V(15, 8, 3), - /* 0011 */ V(15, 8, 3), - /* 0100 */ V(12, 12, 3), - /* 0101 */ V(12, 12, 3), - /* 0110 */ V(10, 14, 4), - /* 0111 */ V(9, 14, 4), - /* 1000 */ V(8, 14, 3), - /* 1001 */ V(8, 14, 3), - /* 1010 */ V(7, 15, 4), - /* 1011 */ V(7, 14, 4), - /* 1100 */ V(15, 7, 2), - /* 1101 */ V(15, 7, 2), - /* 1110 */ V(15, 7, 2), - /* 1111 */ V(15, 7, 2), - - /* 0000 0000 0011 ... */ - /* 000 */ V(13, 10, 2), /* 310 */ - /* 001 */ V(13, 10, 2), - /* 010 */ V(10, 13, 3), - /* 011 */ V(11, 12, 3), - /* 100 */ V(12, 11, 3), - /* 101 */ V(15, 6, 3), - /* 110 */ V(6, 15, 2), - /* 111 */ V(6, 15, 2), - - /* 0000 0000 0100 ... */ - /* 00 */ V(14, 8, 2), /* 318 */ - /* 01 */ V(5, 15, 2), - /* 10 */ V(9, 13, 2), - /* 11 */ V(13, 9, 2), - - /* 0000 0000 0101 ... */ - /* 00 */ V(15, 5, 2), /* 322 */ - /* 01 */ V(14, 7, 2), - /* 10 */ V(10, 12, 2), - /* 11 */ V(11, 11, 2), - - /* 0000 0000 0110 ... */ - /* 000 */ V(4, 15, 2), /* 326 */ - /* 001 */ V(4, 15, 2), - /* 010 */ V(15, 4, 2), - /* 011 */ V(15, 4, 2), - /* 100 */ V(12, 10, 3), - /* 101 */ V(14, 6, 3), - /* 110 */ V(15, 3, 2), - /* 111 */ V(15, 3, 2), - - /* 0000 0000 0111 ... */ - /* 00 */ V(3, 15, 1), /* 334 */ - /* 01 */ V(3, 15, 1), - /* 10 */ V(8, 13, 2), - /* 11 */ V(13, 8, 2), - - /* 0000 0000 1000 ... */ - /* 0 */ V(2, 15, 1), /* 338 */ - /* 1 */ V(15, 2, 1), - - /* 0000 0000 1001 ... */ - /* 00 */ V(6, 14, 2), /* 340 */ - /* 01 */ V(9, 12, 2), - /* 10 */ V(0, 15, 1), - /* 11 */ V(0, 15, 1), - - /* 0000 0000 1010 ... */ - /* 00 */ V(12, 9, 2), /* 344 */ - /* 01 */ V(5, 14, 2), - /* 10 */ V(10, 11, 1), - /* 11 */ V(10, 11, 1), - - /* 0000 0000 1011 ... */ - /* 00 */ V(7, 13, 2), /* 348 */ - /* 01 */ V(13, 7, 2), - /* 10 */ V(4, 14, 1), - /* 11 */ V(4, 14, 1), - - /* 0000 0000 1100 ... */ - /* 00 */ V(12, 8, 2), /* 352 */ - /* 01 */ V(13, 6, 2), - /* 10 */ V(3, 14, 1), - /* 11 */ V(3, 14, 1), - - /* 0000 0000 1101 ... */ - /* 00 */ V(11, 9, 1), /* 356 */ - /* 01 */ V(11, 9, 1), - /* 10 */ V(9, 11, 2), - /* 11 */ V(10, 10, 2), - - /* 0000 0001 0001 ... */ - /* 0 */ V(11, 10, 1), /* 360 */ - /* 1 */ V(14, 5, 1), - - /* 0000 0001 0010 ... */ - /* 0 */ V(14, 4, 1), /* 362 */ - /* 1 */ V(8, 12, 1), - - /* 0000 0001 0011 ... */ - /* 0 */ V(6, 13, 1), /* 364 */ - /* 1 */ V(14, 3, 1), - - /* 0000 0001 0101 ... */ - /* 0 */ V(2, 14, 1), /* 366 */ - /* 1 */ V(0, 14, 1), - - /* 0000 0001 1000 ... */ - /* 0 */ V(14, 0, 1), /* 368 */ - /* 1 */ V(5, 13, 1), - - /* 0000 0001 1001 ... */ - /* 0 */ V(13, 5, 1), /* 370 */ - /* 1 */ V(7, 12, 1), - - /* 0000 0001 1010 ... */ - /* 0 */ V(12, 7, 1), /* 372 */ - /* 1 */ V(4, 13, 1), - - /* 0000 0001 1011 ... */ - /* 0 */ V(8, 11, 1), /* 374 */ - /* 1 */ V(11, 8, 1), - - /* 0000 0001 1100 ... */ - /* 0 */ V(13, 4, 1), /* 376 */ - /* 1 */ V(9, 10, 1), - - /* 0000 0001 1101 ... */ - /* 0 */ V(10, 9, 1), /* 378 */ - /* 1 */ V(6, 12, 1), - - /* 0000 0010 0000 ... */ - /* 0 */ V(13, 3, 1), /* 380 */ - /* 1 */ V(7, 11, 1), - - /* 0000 0010 0101 ... */ - /* 0 */ V(5, 12, 1), /* 382 */ - /* 1 */ V(12, 5, 1), - - /* 0000 0010 0110 ... */ - /* 0 */ V(9, 9, 1), /* 384 */ - /* 1 */ V(7, 10, 1), - - /* 0000 0010 1000 ... */ - /* 0 */ V(10, 7, 1), /* 386 */ - /* 1 */ V(9, 7, 1), - - /* 0000 0000 0000 0000 ... */ - /* 000 */ V(15, 14, 3), /* 388 */ - /* 001 */ V(15, 12, 3), - /* 010 */ V(15, 13, 2), - /* 011 */ V(15, 13, 2), - /* 100 */ V(14, 13, 1), - /* 101 */ V(14, 13, 1), - /* 110 */ V(14, 13, 1), - /* 111 */ V(14, 13, 1), - - /* 0000 0000 0000 1011 ... */ - /* 0 */ V(10, 15, 1), /* 396 */ - /* 1 */ V(14, 9, 1) -}; - -static -union huffpair const hufftab15[] = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 4), - /* 0010 */ PTR(48, 4), - /* 0011 */ PTR(64, 4), - /* 0100 */ PTR(80, 4), - /* 0101 */ PTR(96, 3), - /* 0110 */ PTR(104, 3), - /* 0111 */ PTR(112, 2), - /* 1000 */ PTR(116, 1), - /* 1001 */ PTR(118, 1), - /* 1010 */ V(1, 1, 3), - /* 1011 */ V(1, 1, 3), - /* 1100 */ V(0, 1, 4), - /* 1101 */ V(1, 0, 4), - /* 1110 */ V(0, 0, 3), - /* 1111 */ V(0, 0, 3), - - /* 0000 ... */ - /* 0000 */ PTR(120, 4), /* 16 */ - /* 0001 */ PTR(136, 4), - /* 0010 */ PTR(152, 4), - /* 0011 */ PTR(168, 4), - /* 0100 */ PTR(184, 4), - /* 0101 */ PTR(200, 3), - /* 0110 */ PTR(208, 3), - /* 0111 */ PTR(216, 4), - /* 1000 */ PTR(232, 3), - /* 1001 */ PTR(240, 3), - /* 1010 */ PTR(248, 3), - /* 1011 */ PTR(256, 3), - /* 1100 */ PTR(264, 2), - /* 1101 */ PTR(268, 3), - /* 1110 */ PTR(276, 3), - /* 1111 */ PTR(284, 2), - - /* 0001 ... */ - /* 0000 */ PTR(288, 2), /* 32 */ - /* 0001 */ PTR(292, 2), - /* 0010 */ PTR(296, 2), - /* 0011 */ PTR(300, 2), - /* 0100 */ PTR(304, 2), - /* 0101 */ PTR(308, 2), - /* 0110 */ PTR(312, 2), - /* 0111 */ PTR(316, 2), - /* 1000 */ PTR(320, 1), - /* 1001 */ PTR(322, 1), - /* 1010 */ PTR(324, 1), - /* 1011 */ PTR(326, 2), - /* 1100 */ PTR(330, 1), - /* 1101 */ PTR(332, 1), - /* 1110 */ PTR(334, 2), - /* 1111 */ PTR(338, 1), - - /* 0010 ... */ - /* 0000 */ PTR(340, 1), /* 48 */ - /* 0001 */ PTR(342, 1), - /* 0010 */ V(9, 1, 4), - /* 0011 */ PTR(344, 1), - /* 0100 */ PTR(346, 1), - /* 0101 */ PTR(348, 1), - /* 0110 */ PTR(350, 1), - /* 0111 */ PTR(352, 1), - /* 1000 */ V(2, 8, 4), - /* 1001 */ V(8, 2, 4), - /* 1010 */ V(1, 8, 4), - /* 1011 */ V(8, 1, 4), - /* 1100 */ PTR(354, 1), - /* 1101 */ PTR(356, 1), - /* 1110 */ PTR(358, 1), - /* 1111 */ PTR(360, 1), - - /* 0011 ... */ - /* 0000 */ V(2, 7, 4), /* 64 */ - /* 0001 */ V(7, 2, 4), - /* 0010 */ V(6, 4, 4), - /* 0011 */ V(1, 7, 4), - /* 0100 */ V(5, 5, 4), - /* 0101 */ V(7, 1, 4), - /* 0110 */ PTR(362, 1), - /* 0111 */ V(3, 6, 4), - /* 1000 */ V(6, 3, 4), - /* 1001 */ V(4, 5, 4), - /* 1010 */ V(5, 4, 4), - /* 1011 */ V(2, 6, 4), - /* 1100 */ V(6, 2, 4), - /* 1101 */ V(1, 6, 4), - /* 1110 */ PTR(364, 1), - /* 1111 */ V(3, 5, 4), - - /* 0100 ... */ - /* 0000 */ V(6, 1, 3), /* 80 */ - /* 0001 */ V(6, 1, 3), - /* 0010 */ V(5, 3, 4), - /* 0011 */ V(4, 4, 4), - /* 0100 */ V(2, 5, 3), - /* 0101 */ V(2, 5, 3), - /* 0110 */ V(5, 2, 3), - /* 0111 */ V(5, 2, 3), - /* 1000 */ V(1, 5, 3), - /* 1001 */ V(1, 5, 3), - /* 1010 */ V(5, 1, 3), - /* 1011 */ V(5, 1, 3), - /* 1100 */ V(0, 5, 4), - /* 1101 */ V(5, 0, 4), - /* 1110 */ V(3, 4, 3), - /* 1111 */ V(3, 4, 3), - - /* 0101 ... */ - /* 000 */ V(4, 3, 3), /* 96 */ - /* 001 */ V(2, 4, 3), - /* 010 */ V(4, 2, 3), - /* 011 */ V(3, 3, 3), - /* 100 */ V(4, 1, 2), - /* 101 */ V(4, 1, 2), - /* 110 */ V(1, 4, 3), - /* 111 */ V(0, 4, 3), - - /* 0110 ... */ - /* 000 */ V(2, 3, 2), /* 104 */ - /* 001 */ V(2, 3, 2), - /* 010 */ V(3, 2, 2), - /* 011 */ V(3, 2, 2), - /* 100 */ V(4, 0, 3), - /* 101 */ V(0, 3, 3), - /* 110 */ V(1, 3, 2), - /* 111 */ V(1, 3, 2), - - /* 0111 ... */ - /* 00 */ V(3, 1, 2), /* 112 */ - /* 01 */ V(3, 0, 2), - /* 10 */ V(2, 2, 1), - /* 11 */ V(2, 2, 1), - - /* 1000 ... */ - /* 0 */ V(1, 2, 1), /* 116 */ - /* 1 */ V(2, 1, 1), - - /* 1001 ... */ - /* 0 */ V(0, 2, 1), /* 118 */ - /* 1 */ V(2, 0, 1), - - /* 0000 0000 ... */ - /* 0000 */ PTR(366, 1), /* 120 */ - /* 0001 */ PTR(368, 1), - /* 0010 */ V(14, 14, 4), - /* 0011 */ PTR(370, 1), - /* 0100 */ PTR(372, 1), - /* 0101 */ PTR(374, 1), - /* 0110 */ V(15, 11, 4), - /* 0111 */ PTR(376, 1), - /* 1000 */ V(13, 13, 4), - /* 1001 */ V(10, 15, 4), - /* 1010 */ V(15, 10, 4), - /* 1011 */ V(11, 14, 4), - /* 1100 */ V(14, 11, 4), - /* 1101 */ V(12, 13, 4), - /* 1110 */ V(13, 12, 4), - /* 1111 */ V(9, 15, 4), - - /* 0000 0001 ... */ - /* 0000 */ V(15, 9, 4), /* 136 */ - /* 0001 */ V(14, 10, 4), - /* 0010 */ V(11, 13, 4), - /* 0011 */ V(13, 11, 4), - /* 0100 */ V(8, 15, 4), - /* 0101 */ V(15, 8, 4), - /* 0110 */ V(12, 12, 4), - /* 0111 */ V(9, 14, 4), - /* 1000 */ V(14, 9, 4), - /* 1001 */ V(7, 15, 4), - /* 1010 */ V(15, 7, 4), - /* 1011 */ V(10, 13, 4), - /* 1100 */ V(13, 10, 4), - /* 1101 */ V(11, 12, 4), - /* 1110 */ V(6, 15, 4), - /* 1111 */ PTR(378, 1), - - /* 0000 0010 ... */ - /* 0000 */ V(12, 11, 3), /* 152 */ - /* 0001 */ V(12, 11, 3), - /* 0010 */ V(15, 6, 3), - /* 0011 */ V(15, 6, 3), - /* 0100 */ V(8, 14, 4), - /* 0101 */ V(14, 8, 4), - /* 0110 */ V(5, 15, 4), - /* 0111 */ V(9, 13, 4), - /* 1000 */ V(15, 5, 3), - /* 1001 */ V(15, 5, 3), - /* 1010 */ V(7, 14, 3), - /* 1011 */ V(7, 14, 3), - /* 1100 */ V(14, 7, 3), - /* 1101 */ V(14, 7, 3), - /* 1110 */ V(10, 12, 3), - /* 1111 */ V(10, 12, 3), - - /* 0000 0011 ... */ - /* 0000 */ V(12, 10, 3), /* 168 */ - /* 0001 */ V(12, 10, 3), - /* 0010 */ V(11, 11, 3), - /* 0011 */ V(11, 11, 3), - /* 0100 */ V(13, 9, 4), - /* 0101 */ V(8, 13, 4), - /* 0110 */ V(4, 15, 3), - /* 0111 */ V(4, 15, 3), - /* 1000 */ V(15, 4, 3), - /* 1001 */ V(15, 4, 3), - /* 1010 */ V(3, 15, 3), - /* 1011 */ V(3, 15, 3), - /* 1100 */ V(15, 3, 3), - /* 1101 */ V(15, 3, 3), - /* 1110 */ V(13, 8, 3), - /* 1111 */ V(13, 8, 3), - - /* 0000 0100 ... */ - /* 0000 */ V(14, 6, 3), /* 184 */ - /* 0001 */ V(14, 6, 3), - /* 0010 */ V(2, 15, 3), - /* 0011 */ V(2, 15, 3), - /* 0100 */ V(15, 2, 3), - /* 0101 */ V(15, 2, 3), - /* 0110 */ V(6, 14, 4), - /* 0111 */ V(15, 0, 4), - /* 1000 */ V(1, 15, 3), - /* 1001 */ V(1, 15, 3), - /* 1010 */ V(15, 1, 3), - /* 1011 */ V(15, 1, 3), - /* 1100 */ V(9, 12, 3), - /* 1101 */ V(9, 12, 3), - /* 1110 */ V(12, 9, 3), - /* 1111 */ V(12, 9, 3), - - /* 0000 0101 ... */ - /* 000 */ V(5, 14, 3), /* 200 */ - /* 001 */ V(10, 11, 3), - /* 010 */ V(11, 10, 3), - /* 011 */ V(14, 5, 3), - /* 100 */ V(7, 13, 3), - /* 101 */ V(13, 7, 3), - /* 110 */ V(4, 14, 3), - /* 111 */ V(14, 4, 3), - - /* 0000 0110 ... */ - /* 000 */ V(8, 12, 3), /* 208 */ - /* 001 */ V(12, 8, 3), - /* 010 */ V(3, 14, 3), - /* 011 */ V(6, 13, 3), - /* 100 */ V(13, 6, 3), - /* 101 */ V(14, 3, 3), - /* 110 */ V(9, 11, 3), - /* 111 */ V(11, 9, 3), - - /* 0000 0111 ... */ - /* 0000 */ V(2, 14, 3), /* 216 */ - /* 0001 */ V(2, 14, 3), - /* 0010 */ V(10, 10, 3), - /* 0011 */ V(10, 10, 3), - /* 0100 */ V(14, 2, 3), - /* 0101 */ V(14, 2, 3), - /* 0110 */ V(1, 14, 3), - /* 0111 */ V(1, 14, 3), - /* 1000 */ V(14, 1, 3), - /* 1001 */ V(14, 1, 3), - /* 1010 */ V(0, 14, 4), - /* 1011 */ V(14, 0, 4), - /* 1100 */ V(5, 13, 3), - /* 1101 */ V(5, 13, 3), - /* 1110 */ V(13, 5, 3), - /* 1111 */ V(13, 5, 3), - - /* 0000 1000 ... */ - /* 000 */ V(7, 12, 3), /* 232 */ - /* 001 */ V(12, 7, 3), - /* 010 */ V(4, 13, 3), - /* 011 */ V(8, 11, 3), - /* 100 */ V(13, 4, 2), - /* 101 */ V(13, 4, 2), - /* 110 */ V(11, 8, 3), - /* 111 */ V(9, 10, 3), - - /* 0000 1001 ... */ - /* 000 */ V(10, 9, 3), /* 240 */ - /* 001 */ V(6, 12, 3), - /* 010 */ V(12, 6, 3), - /* 011 */ V(3, 13, 3), - /* 100 */ V(13, 3, 2), - /* 101 */ V(13, 3, 2), - /* 110 */ V(13, 2, 2), - /* 111 */ V(13, 2, 2), - - /* 0000 1010 ... */ - /* 000 */ V(2, 13, 3), /* 248 */ - /* 001 */ V(0, 13, 3), - /* 010 */ V(1, 13, 2), - /* 011 */ V(1, 13, 2), - /* 100 */ V(7, 11, 2), - /* 101 */ V(7, 11, 2), - /* 110 */ V(11, 7, 2), - /* 111 */ V(11, 7, 2), - - /* 0000 1011 ... */ - /* 000 */ V(13, 1, 2), /* 256 */ - /* 001 */ V(13, 1, 2), - /* 010 */ V(5, 12, 3), - /* 011 */ V(13, 0, 3), - /* 100 */ V(12, 5, 2), - /* 101 */ V(12, 5, 2), - /* 110 */ V(8, 10, 2), - /* 111 */ V(8, 10, 2), - - /* 0000 1100 ... */ - /* 00 */ V(10, 8, 2), /* 264 */ - /* 01 */ V(4, 12, 2), - /* 10 */ V(12, 4, 2), - /* 11 */ V(6, 11, 2), - - /* 0000 1101 ... */ - /* 000 */ V(11, 6, 2), /* 268 */ - /* 001 */ V(11, 6, 2), - /* 010 */ V(9, 9, 3), - /* 011 */ V(0, 12, 3), - /* 100 */ V(3, 12, 2), - /* 101 */ V(3, 12, 2), - /* 110 */ V(12, 3, 2), - /* 111 */ V(12, 3, 2), - - /* 0000 1110 ... */ - /* 000 */ V(7, 10, 2), /* 276 */ - /* 001 */ V(7, 10, 2), - /* 010 */ V(10, 7, 2), - /* 011 */ V(10, 7, 2), - /* 100 */ V(10, 6, 2), - /* 101 */ V(10, 6, 2), - /* 110 */ V(12, 0, 3), - /* 111 */ V(0, 11, 3), - - /* 0000 1111 ... */ - /* 00 */ V(12, 2, 1), /* 284 */ - /* 01 */ V(12, 2, 1), - /* 10 */ V(2, 12, 2), - /* 11 */ V(5, 11, 2), - - /* 0001 0000 ... */ - /* 00 */ V(11, 5, 2), /* 288 */ - /* 01 */ V(1, 12, 2), - /* 10 */ V(8, 9, 2), - /* 11 */ V(9, 8, 2), - - /* 0001 0001 ... */ - /* 00 */ V(12, 1, 2), /* 292 */ - /* 01 */ V(4, 11, 2), - /* 10 */ V(11, 4, 2), - /* 11 */ V(6, 10, 2), - - /* 0001 0010 ... */ - /* 00 */ V(3, 11, 2), /* 296 */ - /* 01 */ V(7, 9, 2), - /* 10 */ V(11, 3, 1), - /* 11 */ V(11, 3, 1), - - /* 0001 0011 ... */ - /* 00 */ V(9, 7, 2), /* 300 */ - /* 01 */ V(8, 8, 2), - /* 10 */ V(2, 11, 2), - /* 11 */ V(5, 10, 2), - - /* 0001 0100 ... */ - /* 00 */ V(11, 2, 1), /* 304 */ - /* 01 */ V(11, 2, 1), - /* 10 */ V(10, 5, 2), - /* 11 */ V(1, 11, 2), - - /* 0001 0101 ... */ - /* 00 */ V(11, 1, 1), /* 308 */ - /* 01 */ V(11, 1, 1), - /* 10 */ V(11, 0, 2), - /* 11 */ V(6, 9, 2), - - /* 0001 0110 ... */ - /* 00 */ V(9, 6, 2), /* 312 */ - /* 01 */ V(4, 10, 2), - /* 10 */ V(10, 4, 2), - /* 11 */ V(7, 8, 2), - - /* 0001 0111 ... */ - /* 00 */ V(8, 7, 2), /* 316 */ - /* 01 */ V(3, 10, 2), - /* 10 */ V(10, 3, 1), - /* 11 */ V(10, 3, 1), - - /* 0001 1000 ... */ - /* 0 */ V(5, 9, 1), /* 320 */ - /* 1 */ V(9, 5, 1), - - /* 0001 1001 ... */ - /* 0 */ V(2, 10, 1), /* 322 */ - /* 1 */ V(10, 2, 1), - - /* 0001 1010 ... */ - /* 0 */ V(1, 10, 1), /* 324 */ - /* 1 */ V(10, 1, 1), - - /* 0001 1011 ... */ - /* 00 */ V(0, 10, 2), /* 326 */ - /* 01 */ V(10, 0, 2), - /* 10 */ V(6, 8, 1), - /* 11 */ V(6, 8, 1), - - /* 0001 1100 ... */ - /* 0 */ V(8, 6, 1), /* 330 */ - /* 1 */ V(4, 9, 1), - - /* 0001 1101 ... */ - /* 0 */ V(9, 4, 1), /* 332 */ - /* 1 */ V(3, 9, 1), - - /* 0001 1110 ... */ - /* 00 */ V(9, 3, 1), /* 334 */ - /* 01 */ V(9, 3, 1), - /* 10 */ V(7, 7, 2), - /* 11 */ V(0, 9, 2), - - /* 0001 1111 ... */ - /* 0 */ V(5, 8, 1), /* 338 */ - /* 1 */ V(8, 5, 1), - - /* 0010 0000 ... */ - /* 0 */ V(2, 9, 1), /* 340 */ - /* 1 */ V(6, 7, 1), - - /* 0010 0001 ... */ - /* 0 */ V(7, 6, 1), /* 342 */ - /* 1 */ V(9, 2, 1), - - /* 0010 0011 ... */ - /* 0 */ V(1, 9, 1), /* 344 */ - /* 1 */ V(9, 0, 1), - - /* 0010 0100 ... */ - /* 0 */ V(4, 8, 1), /* 346 */ - /* 1 */ V(8, 4, 1), - - /* 0010 0101 ... */ - /* 0 */ V(5, 7, 1), /* 348 */ - /* 1 */ V(7, 5, 1), - - /* 0010 0110 ... */ - /* 0 */ V(3, 8, 1), /* 350 */ - /* 1 */ V(8, 3, 1), - - /* 0010 0111 ... */ - /* 0 */ V(6, 6, 1), /* 352 */ - /* 1 */ V(4, 7, 1), - - /* 0010 1100 ... */ - /* 0 */ V(7, 4, 1), /* 354 */ - /* 1 */ V(0, 8, 1), - - /* 0010 1101 ... */ - /* 0 */ V(8, 0, 1), /* 356 */ - /* 1 */ V(5, 6, 1), - - /* 0010 1110 ... */ - /* 0 */ V(6, 5, 1), /* 358 */ - /* 1 */ V(3, 7, 1), - - /* 0010 1111 ... */ - /* 0 */ V(7, 3, 1), /* 360 */ - /* 1 */ V(4, 6, 1), - - /* 0011 0110 ... */ - /* 0 */ V(0, 7, 1), /* 362 */ - /* 1 */ V(7, 0, 1), - - /* 0011 1110 ... */ - /* 0 */ V(0, 6, 1), /* 364 */ - /* 1 */ V(6, 0, 1), - - /* 0000 0000 0000 ... */ - /* 0 */ V(15, 15, 1), /* 366 */ - /* 1 */ V(14, 15, 1), - - /* 0000 0000 0001 ... */ - /* 0 */ V(15, 14, 1), /* 368 */ - /* 1 */ V(13, 15, 1), - - /* 0000 0000 0011 ... */ - /* 0 */ V(15, 13, 1), /* 370 */ - /* 1 */ V(12, 15, 1), - - /* 0000 0000 0100 ... */ - /* 0 */ V(15, 12, 1), /* 372 */ - /* 1 */ V(13, 14, 1), - - /* 0000 0000 0101 ... */ - /* 0 */ V(14, 13, 1), /* 374 */ - /* 1 */ V(11, 15, 1), - - /* 0000 0000 0111 ... */ - /* 0 */ V(12, 14, 1), /* 376 */ - /* 1 */ V(14, 12, 1), - - /* 0000 0001 1111 ... */ - /* 0 */ V(10, 14, 1), /* 378 */ - /* 1 */ V(0, 15, 1) -}; - -static -union huffpair const hufftab16[] = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 4), - /* 0010 */ PTR(48, 4), - /* 0011 */ PTR(64, 2), - /* 0100 */ V(1, 1, 4), - /* 0101 */ V(0, 1, 4), - /* 0110 */ V(1, 0, 3), - /* 0111 */ V(1, 0, 3), - /* 1000 */ V(0, 0, 1), - /* 1001 */ V(0, 0, 1), - /* 1010 */ V(0, 0, 1), - /* 1011 */ V(0, 0, 1), - /* 1100 */ V(0, 0, 1), - /* 1101 */ V(0, 0, 1), - /* 1110 */ V(0, 0, 1), - /* 1111 */ V(0, 0, 1), - - /* 0000 ... */ - /* 0000 */ PTR(68, 3), /* 16 */ - /* 0001 */ PTR(76, 3), - /* 0010 */ PTR(84, 2), - /* 0011 */ V(15, 15, 4), - /* 0100 */ PTR(88, 2), - /* 0101 */ PTR(92, 1), - /* 0110 */ PTR(94, 4), - /* 0111 */ V(15, 2, 4), - /* 1000 */ PTR(110, 1), - /* 1001 */ V(1, 15, 4), - /* 1010 */ V(15, 1, 4), - /* 1011 */ PTR(112, 4), - /* 1100 */ PTR(128, 4), - /* 1101 */ PTR(144, 4), - /* 1110 */ PTR(160, 4), - /* 1111 */ PTR(176, 4), - - /* 0001 ... */ - /* 0000 */ PTR(192, 4), /* 32 */ - /* 0001 */ PTR(208, 3), - /* 0010 */ PTR(216, 3), - /* 0011 */ PTR(224, 3), - /* 0100 */ PTR(232, 3), - /* 0101 */ PTR(240, 3), - /* 0110 */ PTR(248, 3), - /* 0111 */ PTR(256, 3), - /* 1000 */ PTR(264, 2), - /* 1001 */ PTR(268, 2), - /* 1010 */ PTR(272, 1), - /* 1011 */ PTR(274, 2), - /* 1100 */ PTR(278, 2), - /* 1101 */ PTR(282, 1), - /* 1110 */ V(5, 1, 4), - /* 1111 */ PTR(284, 1), - - /* 0010 ... */ - /* 0000 */ PTR(286, 1), /* 48 */ - /* 0001 */ PTR(288, 1), - /* 0010 */ PTR(290, 1), - /* 0011 */ V(1, 4, 4), - /* 0100 */ V(4, 1, 4), - /* 0101 */ PTR(292, 1), - /* 0110 */ V(2, 3, 4), - /* 0111 */ V(3, 2, 4), - /* 1000 */ V(1, 3, 3), - /* 1001 */ V(1, 3, 3), - /* 1010 */ V(3, 1, 3), - /* 1011 */ V(3, 1, 3), - /* 1100 */ V(0, 3, 4), - /* 1101 */ V(3, 0, 4), - /* 1110 */ V(2, 2, 3), - /* 1111 */ V(2, 2, 3), - - /* 0011 ... */ - /* 00 */ V(1, 2, 2), /* 64 */ - /* 01 */ V(2, 1, 2), - /* 10 */ V(0, 2, 2), - /* 11 */ V(2, 0, 2), - - /* 0000 0000 ... */ - /* 000 */ V(14, 15, 3), /* 68 */ - /* 001 */ V(15, 14, 3), - /* 010 */ V(13, 15, 3), - /* 011 */ V(15, 13, 3), - /* 100 */ V(12, 15, 3), - /* 101 */ V(15, 12, 3), - /* 110 */ V(11, 15, 3), - /* 111 */ V(15, 11, 3), - - /* 0000 0001 ... */ - /* 000 */ V(10, 15, 2), /* 76 */ - /* 001 */ V(10, 15, 2), - /* 010 */ V(15, 10, 3), - /* 011 */ V(9, 15, 3), - /* 100 */ V(15, 9, 3), - /* 101 */ V(15, 8, 3), - /* 110 */ V(8, 15, 2), - /* 111 */ V(8, 15, 2), - - /* 0000 0010 ... */ - /* 00 */ V(7, 15, 2), /* 84 */ - /* 01 */ V(15, 7, 2), - /* 10 */ V(6, 15, 2), - /* 11 */ V(15, 6, 2), - - /* 0000 0100 ... */ - /* 00 */ V(5, 15, 2), /* 88 */ - /* 01 */ V(15, 5, 2), - /* 10 */ V(4, 15, 1), - /* 11 */ V(4, 15, 1), - - /* 0000 0101 ... */ - /* 0 */ V(15, 4, 1), /* 92 */ - /* 1 */ V(15, 3, 1), - - /* 0000 0110 ... */ - /* 0000 */ V(15, 0, 1), /* 94 */ - /* 0001 */ V(15, 0, 1), - /* 0010 */ V(15, 0, 1), - /* 0011 */ V(15, 0, 1), - /* 0100 */ V(15, 0, 1), - /* 0101 */ V(15, 0, 1), - /* 0110 */ V(15, 0, 1), - /* 0111 */ V(15, 0, 1), - /* 1000 */ V(3, 15, 2), - /* 1001 */ V(3, 15, 2), - /* 1010 */ V(3, 15, 2), - /* 1011 */ V(3, 15, 2), - /* 1100 */ PTR(294, 4), - /* 1101 */ PTR(310, 3), - /* 1110 */ PTR(318, 3), - /* 1111 */ PTR(326, 3), - - /* 0000 1000 ... */ - /* 0 */ V(2, 15, 1), /* 110 */ - /* 1 */ V(0, 15, 1), - - /* 0000 1011 ... */ - /* 0000 */ PTR(334, 2), /* 112 */ - /* 0001 */ PTR(338, 2), - /* 0010 */ PTR(342, 2), - /* 0011 */ PTR(346, 1), - /* 0100 */ PTR(348, 2), - /* 0101 */ PTR(352, 2), - /* 0110 */ PTR(356, 1), - /* 0111 */ PTR(358, 2), - /* 1000 */ PTR(362, 2), - /* 1001 */ PTR(366, 2), - /* 1010 */ PTR(370, 2), - /* 1011 */ V(14, 3, 4), - /* 1100 */ PTR(374, 1), - /* 1101 */ PTR(376, 1), - /* 1110 */ PTR(378, 1), - /* 1111 */ PTR(380, 1), - - /* 0000 1100 ... */ - /* 0000 */ PTR(382, 1), /* 128 */ - /* 0001 */ PTR(384, 1), - /* 0010 */ PTR(386, 1), - /* 0011 */ V(0, 13, 4), - /* 0100 */ PTR(388, 1), - /* 0101 */ PTR(390, 1), - /* 0110 */ PTR(392, 1), - /* 0111 */ V(3, 12, 4), - /* 1000 */ PTR(394, 1), - /* 1001 */ V(1, 12, 4), - /* 1010 */ V(12, 0, 4), - /* 1011 */ PTR(396, 1), - /* 1100 */ V(14, 2, 3), - /* 1101 */ V(14, 2, 3), - /* 1110 */ V(2, 14, 4), - /* 1111 */ V(1, 14, 4), - - /* 0000 1101 ... */ - /* 0000 */ V(13, 3, 4), /* 144 */ - /* 0001 */ V(2, 13, 4), - /* 0010 */ V(13, 2, 4), - /* 0011 */ V(13, 1, 4), - /* 0100 */ V(3, 11, 4), - /* 0101 */ PTR(398, 1), - /* 0110 */ V(1, 13, 3), - /* 0111 */ V(1, 13, 3), - /* 1000 */ V(12, 4, 4), - /* 1001 */ V(6, 11, 4), - /* 1010 */ V(12, 3, 4), - /* 1011 */ V(10, 7, 4), - /* 1100 */ V(2, 12, 3), - /* 1101 */ V(2, 12, 3), - /* 1110 */ V(12, 2, 4), - /* 1111 */ V(11, 5, 4), - - /* 0000 1110 ... */ - /* 0000 */ V(12, 1, 4), /* 160 */ - /* 0001 */ V(0, 12, 4), - /* 0010 */ V(4, 11, 4), - /* 0011 */ V(11, 4, 4), - /* 0100 */ V(6, 10, 4), - /* 0101 */ V(10, 6, 4), - /* 0110 */ V(11, 3, 3), - /* 0111 */ V(11, 3, 3), - /* 1000 */ V(5, 10, 4), - /* 1001 */ V(10, 5, 4), - /* 1010 */ V(2, 11, 3), - /* 1011 */ V(2, 11, 3), - /* 1100 */ V(11, 2, 3), - /* 1101 */ V(11, 2, 3), - /* 1110 */ V(1, 11, 3), - /* 1111 */ V(1, 11, 3), - - /* 0000 1111 ... */ - /* 0000 */ V(11, 1, 3), /* 176 */ - /* 0001 */ V(11, 1, 3), - /* 0010 */ V(0, 11, 4), - /* 0011 */ V(11, 0, 4), - /* 0100 */ V(6, 9, 4), - /* 0101 */ V(9, 6, 4), - /* 0110 */ V(4, 10, 4), - /* 0111 */ V(10, 4, 4), - /* 1000 */ V(7, 8, 4), - /* 1001 */ V(8, 7, 4), - /* 1010 */ V(10, 3, 3), - /* 1011 */ V(10, 3, 3), - /* 1100 */ V(3, 10, 4), - /* 1101 */ V(5, 9, 4), - /* 1110 */ V(2, 10, 3), - /* 1111 */ V(2, 10, 3), - - /* 0001 0000 ... */ - /* 0000 */ V(9, 5, 4), /* 192 */ - /* 0001 */ V(6, 8, 4), - /* 0010 */ V(10, 1, 3), - /* 0011 */ V(10, 1, 3), - /* 0100 */ V(8, 6, 4), - /* 0101 */ V(7, 7, 4), - /* 0110 */ V(9, 4, 3), - /* 0111 */ V(9, 4, 3), - /* 1000 */ V(4, 9, 4), - /* 1001 */ V(5, 7, 4), - /* 1010 */ V(6, 7, 3), - /* 1011 */ V(6, 7, 3), - /* 1100 */ V(10, 2, 2), - /* 1101 */ V(10, 2, 2), - /* 1110 */ V(10, 2, 2), - /* 1111 */ V(10, 2, 2), - - /* 0001 0001 ... */ - /* 000 */ V(1, 10, 2), /* 208 */ - /* 001 */ V(1, 10, 2), - /* 010 */ V(0, 10, 3), - /* 011 */ V(10, 0, 3), - /* 100 */ V(3, 9, 3), - /* 101 */ V(9, 3, 3), - /* 110 */ V(5, 8, 3), - /* 111 */ V(8, 5, 3), - - /* 0001 0010 ... */ - /* 000 */ V(2, 9, 2), /* 216 */ - /* 001 */ V(2, 9, 2), - /* 010 */ V(9, 2, 2), - /* 011 */ V(9, 2, 2), - /* 100 */ V(7, 6, 3), - /* 101 */ V(0, 9, 3), - /* 110 */ V(1, 9, 2), - /* 111 */ V(1, 9, 2), - - /* 0001 0011 ... */ - /* 000 */ V(9, 1, 2), /* 224 */ - /* 001 */ V(9, 1, 2), - /* 010 */ V(9, 0, 3), - /* 011 */ V(4, 8, 3), - /* 100 */ V(8, 4, 3), - /* 101 */ V(7, 5, 3), - /* 110 */ V(3, 8, 3), - /* 111 */ V(8, 3, 3), - - /* 0001 0100 ... */ - /* 000 */ V(6, 6, 3), /* 232 */ - /* 001 */ V(2, 8, 3), - /* 010 */ V(8, 2, 2), - /* 011 */ V(8, 2, 2), - /* 100 */ V(4, 7, 3), - /* 101 */ V(7, 4, 3), - /* 110 */ V(1, 8, 2), - /* 111 */ V(1, 8, 2), - - /* 0001 0101 ... */ - /* 000 */ V(8, 1, 2), /* 240 */ - /* 001 */ V(8, 1, 2), - /* 010 */ V(8, 0, 2), - /* 011 */ V(8, 0, 2), - /* 100 */ V(0, 8, 3), - /* 101 */ V(5, 6, 3), - /* 110 */ V(3, 7, 2), - /* 111 */ V(3, 7, 2), - - /* 0001 0110 ... */ - /* 000 */ V(7, 3, 2), /* 248 */ - /* 001 */ V(7, 3, 2), - /* 010 */ V(6, 5, 3), - /* 011 */ V(4, 6, 3), - /* 100 */ V(2, 7, 2), - /* 101 */ V(2, 7, 2), - /* 110 */ V(7, 2, 2), - /* 111 */ V(7, 2, 2), - - /* 0001 0111 ... */ - /* 000 */ V(6, 4, 3), /* 256 */ - /* 001 */ V(5, 5, 3), - /* 010 */ V(0, 7, 2), - /* 011 */ V(0, 7, 2), - /* 100 */ V(1, 7, 1), - /* 101 */ V(1, 7, 1), - /* 110 */ V(1, 7, 1), - /* 111 */ V(1, 7, 1), - - /* 0001 1000 ... */ - /* 00 */ V(7, 1, 1), /* 264 */ - /* 01 */ V(7, 1, 1), - /* 10 */ V(7, 0, 2), - /* 11 */ V(3, 6, 2), - - /* 0001 1001 ... */ - /* 00 */ V(6, 3, 2), /* 268 */ - /* 01 */ V(4, 5, 2), - /* 10 */ V(5, 4, 2), - /* 11 */ V(2, 6, 2), - - /* 0001 1010 ... */ - /* 0 */ V(6, 2, 1), /* 272 */ - /* 1 */ V(1, 6, 1), - - /* 0001 1011 ... */ - /* 00 */ V(6, 1, 1), /* 274 */ - /* 01 */ V(6, 1, 1), - /* 10 */ V(0, 6, 2), - /* 11 */ V(6, 0, 2), - - /* 0001 1100 ... */ - /* 00 */ V(5, 3, 1), /* 278 */ - /* 01 */ V(5, 3, 1), - /* 10 */ V(3, 5, 2), - /* 11 */ V(4, 4, 2), - - /* 0001 1101 ... */ - /* 0 */ V(2, 5, 1), /* 282 */ - /* 1 */ V(5, 2, 1), - - /* 0001 1111 ... */ - /* 0 */ V(1, 5, 1), /* 284 */ - /* 1 */ V(0, 5, 1), - - /* 0010 0000 ... */ - /* 0 */ V(3, 4, 1), /* 286 */ - /* 1 */ V(4, 3, 1), - - /* 0010 0001 ... */ - /* 0 */ V(5, 0, 1), /* 288 */ - /* 1 */ V(2, 4, 1), - - /* 0010 0010 ... */ - /* 0 */ V(4, 2, 1), /* 290 */ - /* 1 */ V(3, 3, 1), - - /* 0010 0101 ... */ - /* 0 */ V(0, 4, 1), /* 292 */ - /* 1 */ V(4, 0, 1), - - /* 0000 0110 1100 ... */ - /* 0000 */ V(12, 14, 4), /* 294 */ - /* 0001 */ PTR(400, 1), - /* 0010 */ V(13, 14, 3), - /* 0011 */ V(13, 14, 3), - /* 0100 */ V(14, 9, 3), - /* 0101 */ V(14, 9, 3), - /* 0110 */ V(14, 10, 4), - /* 0111 */ V(13, 9, 4), - /* 1000 */ V(14, 14, 2), - /* 1001 */ V(14, 14, 2), - /* 1010 */ V(14, 14, 2), - /* 1011 */ V(14, 14, 2), - /* 1100 */ V(14, 13, 3), - /* 1101 */ V(14, 13, 3), - /* 1110 */ V(14, 11, 3), - /* 1111 */ V(14, 11, 3), - - /* 0000 0110 1101 ... */ - /* 000 */ V(11, 14, 2), /* 310 */ - /* 001 */ V(11, 14, 2), - /* 010 */ V(12, 13, 2), - /* 011 */ V(12, 13, 2), - /* 100 */ V(13, 12, 3), - /* 101 */ V(13, 11, 3), - /* 110 */ V(10, 14, 2), - /* 111 */ V(10, 14, 2), - - /* 0000 0110 1110 ... */ - /* 000 */ V(12, 12, 2), /* 318 */ - /* 001 */ V(12, 12, 2), - /* 010 */ V(10, 13, 3), - /* 011 */ V(13, 10, 3), - /* 100 */ V(7, 14, 3), - /* 101 */ V(10, 12, 3), - /* 110 */ V(12, 10, 2), - /* 111 */ V(12, 10, 2), - - /* 0000 0110 1111 ... */ - /* 000 */ V(12, 9, 3), /* 326 */ - /* 001 */ V(7, 13, 3), - /* 010 */ V(5, 14, 2), - /* 011 */ V(5, 14, 2), - /* 100 */ V(11, 13, 1), - /* 101 */ V(11, 13, 1), - /* 110 */ V(11, 13, 1), - /* 111 */ V(11, 13, 1), - - /* 0000 1011 0000 ... */ - /* 00 */ V(9, 14, 1), /* 334 */ - /* 01 */ V(9, 14, 1), - /* 10 */ V(11, 12, 2), - /* 11 */ V(12, 11, 2), - - /* 0000 1011 0001 ... */ - /* 00 */ V(8, 14, 2), /* 338 */ - /* 01 */ V(14, 8, 2), - /* 10 */ V(9, 13, 2), - /* 11 */ V(14, 7, 2), - - /* 0000 1011 0010 ... */ - /* 00 */ V(11, 11, 2), /* 342 */ - /* 01 */ V(8, 13, 2), - /* 10 */ V(13, 8, 2), - /* 11 */ V(6, 14, 2), - - /* 0000 1011 0011 ... */ - /* 0 */ V(14, 6, 1), /* 346 */ - /* 1 */ V(9, 12, 1), - - /* 0000 1011 0100 ... */ - /* 00 */ V(10, 11, 2), /* 348 */ - /* 01 */ V(11, 10, 2), - /* 10 */ V(14, 5, 2), - /* 11 */ V(13, 7, 2), - - /* 0000 1011 0101 ... */ - /* 00 */ V(4, 14, 1), /* 352 */ - /* 01 */ V(4, 14, 1), - /* 10 */ V(14, 4, 2), - /* 11 */ V(8, 12, 2), - - /* 0000 1011 0110 ... */ - /* 0 */ V(12, 8, 1), /* 356 */ - /* 1 */ V(3, 14, 1), - - /* 0000 1011 0111 ... */ - /* 00 */ V(6, 13, 1), /* 358 */ - /* 01 */ V(6, 13, 1), - /* 10 */ V(13, 6, 2), - /* 11 */ V(9, 11, 2), - - /* 0000 1011 1000 ... */ - /* 00 */ V(11, 9, 2), /* 362 */ - /* 01 */ V(10, 10, 2), - /* 10 */ V(14, 1, 1), - /* 11 */ V(14, 1, 1), - - /* 0000 1011 1001 ... */ - /* 00 */ V(13, 4, 1), /* 366 */ - /* 01 */ V(13, 4, 1), - /* 10 */ V(11, 8, 2), - /* 11 */ V(10, 9, 2), - - /* 0000 1011 1010 ... */ - /* 00 */ V(7, 11, 1), /* 370 */ - /* 01 */ V(7, 11, 1), - /* 10 */ V(11, 7, 2), - /* 11 */ V(13, 0, 2), - - /* 0000 1011 1100 ... */ - /* 0 */ V(0, 14, 1), /* 374 */ - /* 1 */ V(14, 0, 1), - - /* 0000 1011 1101 ... */ - /* 0 */ V(5, 13, 1), /* 376 */ - /* 1 */ V(13, 5, 1), - - /* 0000 1011 1110 ... */ - /* 0 */ V(7, 12, 1), /* 378 */ - /* 1 */ V(12, 7, 1), - - /* 0000 1011 1111 ... */ - /* 0 */ V(4, 13, 1), /* 380 */ - /* 1 */ V(8, 11, 1), - - /* 0000 1100 0000 ... */ - /* 0 */ V(9, 10, 1), /* 382 */ - /* 1 */ V(6, 12, 1), - - /* 0000 1100 0001 ... */ - /* 0 */ V(12, 6, 1), /* 384 */ - /* 1 */ V(3, 13, 1), - - /* 0000 1100 0010 ... */ - /* 0 */ V(5, 12, 1), /* 386 */ - /* 1 */ V(12, 5, 1), - - /* 0000 1100 0100 ... */ - /* 0 */ V(8, 10, 1), /* 388 */ - /* 1 */ V(10, 8, 1), - - /* 0000 1100 0101 ... */ - /* 0 */ V(9, 9, 1), /* 390 */ - /* 1 */ V(4, 12, 1), - - /* 0000 1100 0110 ... */ - /* 0 */ V(11, 6, 1), /* 392 */ - /* 1 */ V(7, 10, 1), - - /* 0000 1100 1000 ... */ - /* 0 */ V(5, 11, 1), /* 394 */ - /* 1 */ V(8, 9, 1), - - /* 0000 1100 1011 ... */ - /* 0 */ V(9, 8, 1), /* 396 */ - /* 1 */ V(7, 9, 1), - - /* 0000 1101 0101 ... */ - /* 0 */ V(9, 7, 1), /* 398 */ - /* 1 */ V(8, 8, 1), - - /* 0000 0110 1100 0001 ... */ - /* 0 */ V(14, 12, 1), /* 400 */ - /* 1 */ V(13, 13, 1) -}; - -static -union huffpair const hufftab24[] = { - /* 0000 */ PTR(16, 4), - /* 0001 */ PTR(32, 4), - /* 0010 */ PTR(48, 4), - /* 0011 */ V(15, 15, 4), - /* 0100 */ PTR(64, 4), - /* 0101 */ PTR(80, 4), - /* 0110 */ PTR(96, 4), - /* 0111 */ PTR(112, 4), - /* 1000 */ PTR(128, 4), - /* 1001 */ PTR(144, 4), - /* 1010 */ PTR(160, 3), - /* 1011 */ PTR(168, 2), - /* 1100 */ V(1, 1, 4), - /* 1101 */ V(0, 1, 4), - /* 1110 */ V(1, 0, 4), - /* 1111 */ V(0, 0, 4), - - /* 0000 ... */ - /* 0000 */ V(14, 15, 4), /* 16 */ - /* 0001 */ V(15, 14, 4), - /* 0010 */ V(13, 15, 4), - /* 0011 */ V(15, 13, 4), - /* 0100 */ V(12, 15, 4), - /* 0101 */ V(15, 12, 4), - /* 0110 */ V(11, 15, 4), - /* 0111 */ V(15, 11, 4), - /* 1000 */ V(15, 10, 3), - /* 1001 */ V(15, 10, 3), - /* 1010 */ V(10, 15, 4), - /* 1011 */ V(9, 15, 4), - /* 1100 */ V(15, 9, 3), - /* 1101 */ V(15, 9, 3), - /* 1110 */ V(15, 8, 3), - /* 1111 */ V(15, 8, 3), - - /* 0001 ... */ - /* 0000 */ V(8, 15, 4), /* 32 */ - /* 0001 */ V(7, 15, 4), - /* 0010 */ V(15, 7, 3), - /* 0011 */ V(15, 7, 3), - /* 0100 */ V(6, 15, 3), - /* 0101 */ V(6, 15, 3), - /* 0110 */ V(15, 6, 3), - /* 0111 */ V(15, 6, 3), - /* 1000 */ V(5, 15, 3), - /* 1001 */ V(5, 15, 3), - /* 1010 */ V(15, 5, 3), - /* 1011 */ V(15, 5, 3), - /* 1100 */ V(4, 15, 3), - /* 1101 */ V(4, 15, 3), - /* 1110 */ V(15, 4, 3), - /* 1111 */ V(15, 4, 3), - - /* 0010 ... */ - /* 0000 */ V(3, 15, 3), /* 48 */ - /* 0001 */ V(3, 15, 3), - /* 0010 */ V(15, 3, 3), - /* 0011 */ V(15, 3, 3), - /* 0100 */ V(2, 15, 3), - /* 0101 */ V(2, 15, 3), - /* 0110 */ V(15, 2, 3), - /* 0111 */ V(15, 2, 3), - /* 1000 */ V(15, 1, 3), - /* 1001 */ V(15, 1, 3), - /* 1010 */ V(1, 15, 4), - /* 1011 */ V(15, 0, 4), - /* 1100 */ PTR(172, 3), - /* 1101 */ PTR(180, 3), - /* 1110 */ PTR(188, 3), - /* 1111 */ PTR(196, 3), - - /* 0100 ... */ - /* 0000 */ PTR(204, 4), /* 64 */ - /* 0001 */ PTR(220, 3), - /* 0010 */ PTR(228, 3), - /* 0011 */ PTR(236, 3), - /* 0100 */ PTR(244, 2), - /* 0101 */ PTR(248, 2), - /* 0110 */ PTR(252, 2), - /* 0111 */ PTR(256, 2), - /* 1000 */ PTR(260, 2), - /* 1001 */ PTR(264, 2), - /* 1010 */ PTR(268, 2), - /* 1011 */ PTR(272, 2), - /* 1100 */ PTR(276, 2), - /* 1101 */ PTR(280, 3), - /* 1110 */ PTR(288, 2), - /* 1111 */ PTR(292, 2), - - /* 0101 ... */ - /* 0000 */ PTR(296, 2), /* 80 */ - /* 0001 */ PTR(300, 3), - /* 0010 */ PTR(308, 2), - /* 0011 */ PTR(312, 3), - /* 0100 */ PTR(320, 1), - /* 0101 */ PTR(322, 2), - /* 0110 */ PTR(326, 2), - /* 0111 */ PTR(330, 1), - /* 1000 */ PTR(332, 2), - /* 1001 */ PTR(336, 1), - /* 1010 */ PTR(338, 1), - /* 1011 */ PTR(340, 1), - /* 1100 */ PTR(342, 1), - /* 1101 */ PTR(344, 1), - /* 1110 */ PTR(346, 1), - /* 1111 */ PTR(348, 1), - - /* 0110 ... */ - /* 0000 */ PTR(350, 1), /* 96 */ - /* 0001 */ PTR(352, 1), - /* 0010 */ PTR(354, 1), - /* 0011 */ PTR(356, 1), - /* 0100 */ PTR(358, 1), - /* 0101 */ PTR(360, 1), - /* 0110 */ PTR(362, 1), - /* 0111 */ PTR(364, 1), - /* 1000 */ PTR(366, 1), - /* 1001 */ PTR(368, 1), - /* 1010 */ PTR(370, 2), - /* 1011 */ PTR(374, 1), - /* 1100 */ PTR(376, 2), - /* 1101 */ V(7, 3, 4), - /* 1110 */ PTR(380, 1), - /* 1111 */ V(7, 2, 4), - - /* 0111 ... */ - /* 0000 */ V(4, 6, 4), /* 112 */ - /* 0001 */ V(6, 4, 4), - /* 0010 */ V(5, 5, 4), - /* 0011 */ V(7, 1, 4), - /* 0100 */ V(3, 6, 4), - /* 0101 */ V(6, 3, 4), - /* 0110 */ V(4, 5, 4), - /* 0111 */ V(5, 4, 4), - /* 1000 */ V(2, 6, 4), - /* 1001 */ V(6, 2, 4), - /* 1010 */ V(1, 6, 4), - /* 1011 */ V(6, 1, 4), - /* 1100 */ PTR(382, 1), - /* 1101 */ V(3, 5, 4), - /* 1110 */ V(5, 3, 4), - /* 1111 */ V(4, 4, 4), - - /* 1000 ... */ - /* 0000 */ V(2, 5, 4), /* 128 */ - /* 0001 */ V(5, 2, 4), - /* 0010 */ V(1, 5, 4), - /* 0011 */ PTR(384, 1), - /* 0100 */ V(5, 1, 3), - /* 0101 */ V(5, 1, 3), - /* 0110 */ V(3, 4, 4), - /* 0111 */ V(4, 3, 4), - /* 1000 */ V(2, 4, 3), - /* 1001 */ V(2, 4, 3), - /* 1010 */ V(4, 2, 3), - /* 1011 */ V(4, 2, 3), - /* 1100 */ V(3, 3, 3), - /* 1101 */ V(3, 3, 3), - /* 1110 */ V(1, 4, 3), - /* 1111 */ V(1, 4, 3), - - /* 1001 ... */ - /* 0000 */ V(4, 1, 3), /* 144 */ - /* 0001 */ V(4, 1, 3), - /* 0010 */ V(0, 4, 4), - /* 0011 */ V(4, 0, 4), - /* 0100 */ V(2, 3, 3), - /* 0101 */ V(2, 3, 3), - /* 0110 */ V(3, 2, 3), - /* 0111 */ V(3, 2, 3), - /* 1000 */ V(1, 3, 2), - /* 1001 */ V(1, 3, 2), - /* 1010 */ V(1, 3, 2), - /* 1011 */ V(1, 3, 2), - /* 1100 */ V(3, 1, 2), - /* 1101 */ V(3, 1, 2), - /* 1110 */ V(3, 1, 2), - /* 1111 */ V(3, 1, 2), - - /* 1010 ... */ - /* 000 */ V(0, 3, 3), /* 160 */ - /* 001 */ V(3, 0, 3), - /* 010 */ V(2, 2, 2), - /* 011 */ V(2, 2, 2), - /* 100 */ V(1, 2, 1), - /* 101 */ V(1, 2, 1), - /* 110 */ V(1, 2, 1), - /* 111 */ V(1, 2, 1), - - /* 1011 ... */ - /* 00 */ V(2, 1, 1), /* 168 */ - /* 01 */ V(2, 1, 1), - /* 10 */ V(0, 2, 2), - /* 11 */ V(2, 0, 2), - - /* 0010 1100 ... */ - /* 000 */ V(0, 15, 1), /* 172 */ - /* 001 */ V(0, 15, 1), - /* 010 */ V(0, 15, 1), - /* 011 */ V(0, 15, 1), - /* 100 */ V(14, 14, 3), - /* 101 */ V(13, 14, 3), - /* 110 */ V(14, 13, 3), - /* 111 */ V(12, 14, 3), - - /* 0010 1101 ... */ - /* 000 */ V(14, 12, 3), /* 180 */ - /* 001 */ V(13, 13, 3), - /* 010 */ V(11, 14, 3), - /* 011 */ V(14, 11, 3), - /* 100 */ V(12, 13, 3), - /* 101 */ V(13, 12, 3), - /* 110 */ V(10, 14, 3), - /* 111 */ V(14, 10, 3), - - /* 0010 1110 ... */ - /* 000 */ V(11, 13, 3), /* 188 */ - /* 001 */ V(13, 11, 3), - /* 010 */ V(12, 12, 3), - /* 011 */ V(9, 14, 3), - /* 100 */ V(14, 9, 3), - /* 101 */ V(10, 13, 3), - /* 110 */ V(13, 10, 3), - /* 111 */ V(11, 12, 3), - - /* 0010 1111 ... */ - /* 000 */ V(12, 11, 3), /* 196 */ - /* 001 */ V(8, 14, 3), - /* 010 */ V(14, 8, 3), - /* 011 */ V(9, 13, 3), - /* 100 */ V(13, 9, 3), - /* 101 */ V(7, 14, 3), - /* 110 */ V(14, 7, 3), - /* 111 */ V(10, 12, 3), - - /* 0100 0000 ... */ - /* 0000 */ V(12, 10, 3), /* 204 */ - /* 0001 */ V(12, 10, 3), - /* 0010 */ V(11, 11, 3), - /* 0011 */ V(11, 11, 3), - /* 0100 */ V(8, 13, 3), - /* 0101 */ V(8, 13, 3), - /* 0110 */ V(13, 8, 3), - /* 0111 */ V(13, 8, 3), - /* 1000 */ V(0, 14, 4), - /* 1001 */ V(14, 0, 4), - /* 1010 */ V(0, 13, 3), - /* 1011 */ V(0, 13, 3), - /* 1100 */ V(14, 6, 2), - /* 1101 */ V(14, 6, 2), - /* 1110 */ V(14, 6, 2), - /* 1111 */ V(14, 6, 2), - - /* 0100 0001 ... */ - /* 000 */ V(6, 14, 3), /* 220 */ - /* 001 */ V(9, 12, 3), - /* 010 */ V(12, 9, 2), - /* 011 */ V(12, 9, 2), - /* 100 */ V(5, 14, 2), - /* 101 */ V(5, 14, 2), - /* 110 */ V(11, 10, 2), - /* 111 */ V(11, 10, 2), - - /* 0100 0010 ... */ - /* 000 */ V(14, 5, 2), /* 228 */ - /* 001 */ V(14, 5, 2), - /* 010 */ V(10, 11, 3), - /* 011 */ V(7, 13, 3), - /* 100 */ V(13, 7, 2), - /* 101 */ V(13, 7, 2), - /* 110 */ V(14, 4, 2), - /* 111 */ V(14, 4, 2), - - /* 0100 0011 ... */ - /* 000 */ V(8, 12, 2), /* 236 */ - /* 001 */ V(8, 12, 2), - /* 010 */ V(12, 8, 2), - /* 011 */ V(12, 8, 2), - /* 100 */ V(4, 14, 3), - /* 101 */ V(2, 14, 3), - /* 110 */ V(3, 14, 2), - /* 111 */ V(3, 14, 2), - - /* 0100 0100 ... */ - /* 00 */ V(6, 13, 2), /* 244 */ - /* 01 */ V(13, 6, 2), - /* 10 */ V(14, 3, 2), - /* 11 */ V(9, 11, 2), - - /* 0100 0101 ... */ - /* 00 */ V(11, 9, 2), /* 248 */ - /* 01 */ V(10, 10, 2), - /* 10 */ V(14, 2, 2), - /* 11 */ V(1, 14, 2), - - /* 0100 0110 ... */ - /* 00 */ V(14, 1, 2), /* 252 */ - /* 01 */ V(5, 13, 2), - /* 10 */ V(13, 5, 2), - /* 11 */ V(7, 12, 2), - - /* 0100 0111 ... */ - /* 00 */ V(12, 7, 2), /* 256 */ - /* 01 */ V(4, 13, 2), - /* 10 */ V(8, 11, 2), - /* 11 */ V(11, 8, 2), - - /* 0100 1000 ... */ - /* 00 */ V(13, 4, 2), /* 260 */ - /* 01 */ V(9, 10, 2), - /* 10 */ V(10, 9, 2), - /* 11 */ V(6, 12, 2), - - /* 0100 1001 ... */ - /* 00 */ V(12, 6, 2), /* 264 */ - /* 01 */ V(3, 13, 2), - /* 10 */ V(13, 3, 2), - /* 11 */ V(2, 13, 2), - - /* 0100 1010 ... */ - /* 00 */ V(13, 2, 2), /* 268 */ - /* 01 */ V(1, 13, 2), - /* 10 */ V(7, 11, 2), - /* 11 */ V(11, 7, 2), - - /* 0100 1011 ... */ - /* 00 */ V(13, 1, 2), /* 272 */ - /* 01 */ V(5, 12, 2), - /* 10 */ V(12, 5, 2), - /* 11 */ V(8, 10, 2), - - /* 0100 1100 ... */ - /* 00 */ V(10, 8, 2), /* 276 */ - /* 01 */ V(9, 9, 2), - /* 10 */ V(4, 12, 2), - /* 11 */ V(12, 4, 2), - - /* 0100 1101 ... */ - /* 000 */ V(6, 11, 2), /* 280 */ - /* 001 */ V(6, 11, 2), - /* 010 */ V(11, 6, 2), - /* 011 */ V(11, 6, 2), - /* 100 */ V(13, 0, 3), - /* 101 */ V(0, 12, 3), - /* 110 */ V(3, 12, 2), - /* 111 */ V(3, 12, 2), - - /* 0100 1110 ... */ - /* 00 */ V(12, 3, 2), /* 288 */ - /* 01 */ V(7, 10, 2), - /* 10 */ V(10, 7, 2), - /* 11 */ V(2, 12, 2), - - /* 0100 1111 ... */ - /* 00 */ V(12, 2, 2), /* 292 */ - /* 01 */ V(5, 11, 2), - /* 10 */ V(11, 5, 2), - /* 11 */ V(1, 12, 2), - - /* 0101 0000 ... */ - /* 00 */ V(8, 9, 2), /* 296 */ - /* 01 */ V(9, 8, 2), - /* 10 */ V(12, 1, 2), - /* 11 */ V(4, 11, 2), - - /* 0101 0001 ... */ - /* 000 */ V(12, 0, 3), /* 300 */ - /* 001 */ V(0, 11, 3), - /* 010 */ V(3, 11, 2), - /* 011 */ V(3, 11, 2), - /* 100 */ V(11, 0, 3), - /* 101 */ V(0, 10, 3), - /* 110 */ V(1, 10, 2), - /* 111 */ V(1, 10, 2), - - /* 0101 0010 ... */ - /* 00 */ V(11, 4, 1), /* 308 */ - /* 01 */ V(11, 4, 1), - /* 10 */ V(6, 10, 2), - /* 11 */ V(10, 6, 2), - - /* 0101 0011 ... */ - /* 000 */ V(7, 9, 2), /* 312 */ - /* 001 */ V(7, 9, 2), - /* 010 */ V(9, 7, 2), - /* 011 */ V(9, 7, 2), - /* 100 */ V(10, 0, 3), - /* 101 */ V(0, 9, 3), - /* 110 */ V(9, 0, 2), - /* 111 */ V(9, 0, 2), - - /* 0101 0100 ... */ - /* 0 */ V(11, 3, 1), /* 320 */ - /* 1 */ V(8, 8, 1), - - /* 0101 0101 ... */ - /* 00 */ V(2, 11, 2), /* 322 */ - /* 01 */ V(5, 10, 2), - /* 10 */ V(11, 2, 1), - /* 11 */ V(11, 2, 1), - - /* 0101 0110 ... */ - /* 00 */ V(10, 5, 2), /* 326 */ - /* 01 */ V(1, 11, 2), - /* 10 */ V(11, 1, 2), - /* 11 */ V(6, 9, 2), - - /* 0101 0111 ... */ - /* 0 */ V(9, 6, 1), /* 330 */ - /* 1 */ V(10, 4, 1), - - /* 0101 1000 ... */ - /* 00 */ V(4, 10, 2), /* 332 */ - /* 01 */ V(7, 8, 2), - /* 10 */ V(8, 7, 1), - /* 11 */ V(8, 7, 1), - - /* 0101 1001 ... */ - /* 0 */ V(3, 10, 1), /* 336 */ - /* 1 */ V(10, 3, 1), - - /* 0101 1010 ... */ - /* 0 */ V(5, 9, 1), /* 338 */ - /* 1 */ V(9, 5, 1), - - /* 0101 1011 ... */ - /* 0 */ V(2, 10, 1), /* 340 */ - /* 1 */ V(10, 2, 1), - - /* 0101 1100 ... */ - /* 0 */ V(10, 1, 1), /* 342 */ - /* 1 */ V(6, 8, 1), - - /* 0101 1101 ... */ - /* 0 */ V(8, 6, 1), /* 344 */ - /* 1 */ V(7, 7, 1), - - /* 0101 1110 ... */ - /* 0 */ V(4, 9, 1), /* 346 */ - /* 1 */ V(9, 4, 1), - - /* 0101 1111 ... */ - /* 0 */ V(3, 9, 1), /* 348 */ - /* 1 */ V(9, 3, 1), - - /* 0110 0000 ... */ - /* 0 */ V(5, 8, 1), /* 350 */ - /* 1 */ V(8, 5, 1), - - /* 0110 0001 ... */ - /* 0 */ V(2, 9, 1), /* 352 */ - /* 1 */ V(6, 7, 1), - - /* 0110 0010 ... */ - /* 0 */ V(7, 6, 1), /* 354 */ - /* 1 */ V(9, 2, 1), - - /* 0110 0011 ... */ - /* 0 */ V(1, 9, 1), /* 356 */ - /* 1 */ V(9, 1, 1), - - /* 0110 0100 ... */ - /* 0 */ V(4, 8, 1), /* 358 */ - /* 1 */ V(8, 4, 1), - - /* 0110 0101 ... */ - /* 0 */ V(5, 7, 1), /* 360 */ - /* 1 */ V(7, 5, 1), - - /* 0110 0110 ... */ - /* 0 */ V(3, 8, 1), /* 362 */ - /* 1 */ V(8, 3, 1), - - /* 0110 0111 ... */ - /* 0 */ V(6, 6, 1), /* 364 */ - /* 1 */ V(2, 8, 1), - - /* 0110 1000 ... */ - /* 0 */ V(8, 2, 1), /* 366 */ - /* 1 */ V(1, 8, 1), - - /* 0110 1001 ... */ - /* 0 */ V(4, 7, 1), /* 368 */ - /* 1 */ V(7, 4, 1), - - /* 0110 1010 ... */ - /* 00 */ V(8, 1, 1), /* 370 */ - /* 01 */ V(8, 1, 1), - /* 10 */ V(0, 8, 2), - /* 11 */ V(8, 0, 2), - - /* 0110 1011 ... */ - /* 0 */ V(5, 6, 1), /* 374 */ - /* 1 */ V(6, 5, 1), - - /* 0110 1100 ... */ - /* 00 */ V(1, 7, 1), /* 376 */ - /* 01 */ V(1, 7, 1), - /* 10 */ V(0, 7, 2), - /* 11 */ V(7, 0, 2), - - /* 0110 1110 ... */ - /* 0 */ V(3, 7, 1), /* 380 */ - /* 1 */ V(2, 7, 1), - - /* 0111 1100 ... */ - /* 0 */ V(0, 6, 1), /* 382 */ - /* 1 */ V(6, 0, 1), - - /* 1000 0011 ... */ - /* 0 */ V(0, 5, 1), /* 384 */ - /* 1 */ V(5, 0, 1) -}; - -# undef V -# undef PTR - -/* external tables */ - -union huffquad const *const mad_huff_quad_table[2] = { hufftabA, hufftabB }; - -struct hufftable const mad_huff_pair_table[32] = { - /* 0 */ { hufftab0, 0, 0 }, - /* 1 */ { hufftab1, 0, 3 }, - /* 2 */ { hufftab2, 0, 3 }, - /* 3 */ { hufftab3, 0, 3 }, - /* 4 */ { 0 /* not used */ }, - /* 5 */ { hufftab5, 0, 3 }, - /* 6 */ { hufftab6, 0, 4 }, - /* 7 */ { hufftab7, 0, 4 }, - /* 8 */ { hufftab8, 0, 4 }, - /* 9 */ { hufftab9, 0, 4 }, - /* 10 */ { hufftab10, 0, 4 }, - /* 11 */ { hufftab11, 0, 4 }, - /* 12 */ { hufftab12, 0, 4 }, - /* 13 */ { hufftab13, 0, 4 }, - /* 14 */ { 0 /* not used */ }, - /* 15 */ { hufftab15, 0, 4 }, - /* 16 */ { hufftab16, 1, 4 }, - /* 17 */ { hufftab16, 2, 4 }, - /* 18 */ { hufftab16, 3, 4 }, - /* 19 */ { hufftab16, 4, 4 }, - /* 20 */ { hufftab16, 6, 4 }, - /* 21 */ { hufftab16, 8, 4 }, - /* 22 */ { hufftab16, 10, 4 }, - /* 23 */ { hufftab16, 13, 4 }, - /* 24 */ { hufftab24, 4, 4 }, - /* 25 */ { hufftab24, 5, 4 }, - /* 26 */ { hufftab24, 6, 4 }, - /* 27 */ { hufftab24, 7, 4 }, - /* 28 */ { hufftab24, 8, 4 }, - /* 29 */ { hufftab24, 9, 4 }, - /* 30 */ { hufftab24, 11, 4 }, - /* 31 */ { hufftab24, 13, 4 } -}; diff --git a/src/libmad/huffman.h b/src/libmad/huffman.h deleted file mode 100644 index 2f00c00a1..000000000 --- a/src/libmad/huffman.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * 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: huffman.h,v 1.4 2004/04/22 00:22:41 miguelfreitas Exp $ - */ - -# ifndef LIBMAD_HUFFMAN_H -# define LIBMAD_HUFFMAN_H - -union huffquad { - struct { - unsigned short final : 1; - unsigned short bits : 3; - unsigned short offset : 12; - } ptr; - struct { - unsigned short final : 1; - unsigned short hlen : 3; - unsigned short v : 1; - unsigned short w : 1; - unsigned short x : 1; - unsigned short y : 1; - } value; - unsigned short final : 1; -}; - -union huffpair { - struct { - unsigned short final : 1; - unsigned short bits : 3; - unsigned short offset : 12; - } ptr; - struct { - unsigned short final : 1; - unsigned short hlen : 3; - unsigned short x : 4; - unsigned short y : 4; - } value; - unsigned short final : 1; -}; - -struct hufftable { - union huffpair const *table; - unsigned short linbits; - unsigned short startbits; -}; - -extern union huffquad const *const mad_huff_quad_table[2]; -extern struct hufftable const mad_huff_pair_table[32]; - -# endif diff --git a/src/libmad/imdct_l_arm.S b/src/libmad/imdct_l_arm.S deleted file mode 100644 index 35b2e2626..000000000 --- a/src/libmad/imdct_l_arm.S +++ /dev/null @@ -1,1000 +0,0 @@ -/***************************************************************************** -* Copyright (C) 2000-2001 Andre McCurdy <armccurdy@yahoo.co.uk> -* -* 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 -* -***************************************************************************** -* -* Notes: -* -* -***************************************************************************** -* -* $Id: imdct_l_arm.S,v 1.1 2002/04/30 18:46:58 miguelfreitas Exp $ -* -* 2001/03/24: Andre McCurdy <armccurdy@yahoo.co.uk> -* - Corrected PIC unsafe loading of address of 'imdct36_long_karray' -* -* 2000/09/20: Robert Leslie <rob@mars.org> -* - Added a global symbol with leading underscore per suggestion of -* Simon Burge to support linking with the a.out format. -* -* 2000/09/15: Robert Leslie <rob@mars.org> -* - Fixed a small bug where flags were changed before a conditional branch. -* -* 2000/09/15: Andre McCurdy <armccurdy@yahoo.co.uk> -* - Applied Nicolas Pitre's rounding optimisation in all remaining places. -* -* 2000/09/09: Nicolas Pitre <nico@cam.org> -* - Optimized rounding + scaling operations. -* -* 2000/08/09: Andre McCurdy <armccurdy@yahoo.co.uk> -* - Original created. -* -****************************************************************************/ - - -/* - On entry: - - r0 = pointer to 18 element input array - r1 = pointer to 36 element output array - r2 = windowing block type - - - Stack frame created during execution of the function: - - Initial Holds: - Stack - pointer - minus: - - 0 - 4 lr - 8 r11 - 12 r10 - 16 r9 - 20 r8 - 24 r7 - 28 r6 - 32 r5 - 36 r4 - - 40 r2 : windowing block type - - 44 ct00 high - 48 ct00 low - 52 ct01 high - 56 ct01 low - 60 ct04 high - 64 ct04 low - 68 ct06 high - 72 ct06 low - 76 ct05 high - 80 ct05 low - 84 ct03 high - 88 ct03 low - 92 -ct05 high - 96 -ct05 low - 100 -ct07 high - 104 -ct07 low - 108 ct07 high - 112 ct07 low - 116 ct02 high - 120 ct02 low -*/ - -#define BLOCK_MODE_NORMAL 0 -#define BLOCK_MODE_START 1 -#define BLOCK_MODE_STOP 3 - - -#define X0 0x00 -#define X1 0x04 -#define X2 0x08 -#define X3 0x0C -#define X4 0x10 -#define X5 0x14 -#define X6 0x18 -#define X7 0x1c -#define X8 0x20 -#define X9 0x24 -#define X10 0x28 -#define X11 0x2c -#define X12 0x30 -#define X13 0x34 -#define X14 0x38 -#define X15 0x3c -#define X16 0x40 -#define X17 0x44 - -#define x0 0x00 -#define x1 0x04 -#define x2 0x08 -#define x3 0x0C -#define x4 0x10 -#define x5 0x14 -#define x6 0x18 -#define x7 0x1c -#define x8 0x20 -#define x9 0x24 -#define x10 0x28 -#define x11 0x2c -#define x12 0x30 -#define x13 0x34 -#define x14 0x38 -#define x15 0x3c -#define x16 0x40 -#define x17 0x44 -#define x18 0x48 -#define x19 0x4c -#define x20 0x50 -#define x21 0x54 -#define x22 0x58 -#define x23 0x5c -#define x24 0x60 -#define x25 0x64 -#define x26 0x68 -#define x27 0x6c -#define x28 0x70 -#define x29 0x74 -#define x30 0x78 -#define x31 0x7c -#define x32 0x80 -#define x33 0x84 -#define x34 0x88 -#define x35 0x8c - -#define K00 0x0ffc19fd -#define K01 0x00b2aa3e -#define K02 0x0fdcf549 -#define K03 0x0216a2a2 -#define K04 0x0f9ee890 -#define K05 0x03768962 -#define K06 0x0f426cb5 -#define K07 0x04cfb0e2 -#define K08 0x0ec835e8 -#define K09 0x061f78aa -#define K10 0x0e313245 -#define K11 0x07635284 -#define K12 0x0d7e8807 -#define K13 0x0898c779 -#define K14 0x0cb19346 -#define K15 0x09bd7ca0 -#define K16 0x0bcbe352 -#define K17 0x0acf37ad - -#define minus_K02 0xf0230ab7 - -#define WL0 0x00b2aa3e -#define WL1 0x0216a2a2 -#define WL2 0x03768962 -#define WL3 0x04cfb0e2 -#define WL4 0x061f78aa -#define WL5 0x07635284 -#define WL6 0x0898c779 -#define WL7 0x09bd7ca0 -#define WL8 0x0acf37ad -#define WL9 0x0bcbe352 -#define WL10 0x0cb19346 -#define WL11 0x0d7e8807 -#define WL12 0x0e313245 -#define WL13 0x0ec835e8 -#define WL14 0x0f426cb5 -#define WL15 0x0f9ee890 -#define WL16 0x0fdcf549 -#define WL17 0x0ffc19fd - - -@***************************************************************************** - - - .text - .align - - .global III_imdct_l - .global _III_imdct_l - -III_imdct_l: -_III_imdct_l: - - stmdb sp!, { r2, r4 - r11, lr } @ all callee saved regs, plus arg3 - - ldr r4, =K08 @ r4 = K08 - ldr r5, =K09 @ r5 = K09 - ldr r8, [r0, #X4] @ r8 = X4 - ldr r9, [r0, #X13] @ r9 = X13 - rsb r6, r4, #0 @ r6 = -K08 - rsb r7, r5, #0 @ r7 = -K09 - - smull r2, r3, r4, r8 @ r2..r3 = (X4 * K08) - smlal r2, r3, r5, r9 @ r2..r3 = (X4 * K08) + (X13 * K09) = ct01 - - smull r10, lr, r8, r5 @ r10..lr = (X4 * K09) - smlal r10, lr, r9, r6 @ r10..lr = (X4 * K09) + (X13 * -K08) = ct00 - - ldr r8, [r0, #X7] @ r8 = X7 - ldr r9, [r0, #X16] @ r9 = X16 - - stmdb sp!, { r2, r3, r10, lr } @ stack ct00_h, ct00_l, ct01_h, ct01_l - - add r8, r8, r9 @ r8 = (X7 + X16) - ldr r9, [r0, #X1] @ r9 = X1 - - smlal r2, r3, r6, r8 @ r2..r3 = ct01 + ((X7 + X16) * -K08) - smlal r2, r3, r7, r9 @ r2..r3 += (X1 * -K09) - - ldr r7, [r0, #X10] @ r7 = X10 - - rsbs r10, r10, #0 - rsc lr, lr, #0 @ r10..lr = -ct00 - - smlal r2, r3, r5, r7 @ r2..r3 += (X10 * K09) = ct06 - - smlal r10, lr, r9, r6 @ r10..lr = -ct00 + ( X1 * -K08) - smlal r10, lr, r8, r5 @ r10..lr += ((X7 + X16) * K09) - smlal r10, lr, r7, r4 @ r10..lr += ( X10 * K08) = ct04 - - stmdb sp!, { r2, r3, r10, lr } @ stack ct04_h, ct04_l, ct06_h, ct06_l - - @---- - - ldr r7, [r0, #X0] - ldr r8, [r0, #X11] - ldr r9, [r0, #X12] - sub r7, r7, r8 - sub r7, r7, r9 @ r7 = (X0 - X11 -X12) = ct14 - - ldr r9, [r0, #X3] - ldr r8, [r0, #X8] - ldr r11, [r0, #X15] - sub r8, r8, r9 - add r8, r8, r11 @ r8 = (X8 - X3 + X15) = ct16 - - add r11, r7, r8 @ r11 = ct14 + ct16 = ct18 - - smlal r2, r3, r6, r11 @ r2..r3 = ct06 + ((X0 - X11 - X3 + X15 + X8 - X12) * -K08) - - ldr r6, [r0, #X2] - ldr r9, [r0, #X9] - ldr r12, [r0, #X14] - sub r6, r6, r9 - sub r6, r6, r12 @ r6 = (X2 - X9 - X14) = ct15 - - ldr r9, [r0, #X5] - ldr r12, [r0, #X6] - sub r9, r9, r12 - ldr r12, [r0, #X17] - sub r9, r9, r12 @ r9 = (X5 - X6 - X17) = ct17 - - add r12, r9, r6 @ r12 = ct15 + ct17 = ct19 - - smlal r2, r3, r5, r12 @ r2..r3 += ((X2 - X9 + X5 - X6 - X17 - X14) * K09) - - smlal r10, lr, r11, r5 @ r10..lr = ct04 + (ct18 * K09) - smlal r10, lr, r12, r4 @ r10..lr = ct04 + (ct18 * K09) + (ct19 * K08) - - movs r2, r2, lsr #28 - adc r2, r2, r3, lsl #4 @ r2 = bits[59..28] of r2..r3 - str r2, [r1, #x22] @ store result x22 - - movs r10, r10, lsr #28 - adc r10, r10, lr, lsl #4 @ r10 = bits[59..28] of r10..lr - str r10, [r1, #x4] @ store result x4 - - @---- - - ldmia sp, { r2, r3, r4, r5 } @ r2..r3 = ct06, r4..r5 = ct04 (dont update sp) - - @ r2..r3 = ct06 - @ r4..r5 = ct04 - @ r6 = ct15 - @ r7 = ct14 - @ r8 = ct16 - @ r9 = ct17 - @ r10 = . - @ r11 = . - @ r12 = . - @ lr = . - - ldr r10, =K03 @ r10 = K03 - ldr lr, =K15 @ lr = K15 - - smlal r2, r3, r10, r7 @ r2..r3 = ct06 + (ct14 * K03) - smlal r4, r5, lr, r7 @ r4..r5 = ct04 + (ct14 * K15) - - ldr r12, =K14 @ r12 = K14 - rsb r10, r10, #0 @ r10 = -K03 - - smlal r2, r3, lr, r6 @ r2..r3 += (ct15 * K15) - smlal r4, r5, r10, r6 @ r4..r5 += (ct15 * -K03) - smlal r2, r3, r12, r8 @ r2..r3 += (ct16 * K14) - - ldr r11, =minus_K02 @ r11 = -K02 - rsb r12, r12, #0 @ r12 = -K14 - - smlal r4, r5, r12, r9 @ r4..r5 += (ct17 * -K14) - smlal r2, r3, r11, r9 @ r2..r3 += (ct17 * -K02) - smlal r4, r5, r11, r8 @ r4..r5 += (ct16 * -K02) - - movs r2, r2, lsr #28 - adc r2, r2, r3, lsl #4 @ r2 = bits[59..28] of r2..r3 - str r2, [r1, #x7] @ store result x7 - - movs r4, r4, lsr #28 - adc r4, r4, r5, lsl #4 @ r4 = bits[59..28] of r4..r5 - str r4, [r1, #x1] @ store result x1 - - @---- - - ldmia sp, { r2, r3, r4, r5 } @ r2..r3 = ct06, r4..r5 = ct04 (dont update sp) - - @ r2..r3 = ct06 - @ r4..r5 = ct04 - @ r6 = ct15 - @ r7 = ct14 - @ r8 = ct16 - @ r9 = ct17 - @ r10 = -K03 - @ r11 = -K02 - @ r12 = -K14 - @ lr = K15 - - rsbs r2, r2, #0 - rsc r3, r3, #0 @ r2..r3 = -ct06 - - smlal r2, r3, r12, r7 @ r2..r3 = -ct06 + (ct14 * -K14) - smlal r2, r3, r10, r8 @ r2..r3 += (ct16 * -K03) - - smlal r4, r5, r12, r6 @ r4..r5 = ct04 + (ct15 * -K14) - smlal r4, r5, r10, r9 @ r4..r5 += (ct17 * -K03) - smlal r4, r5, lr, r8 @ r4..r5 += (ct16 * K15) - smlal r4, r5, r11, r7 @ r4..r5 += (ct14 * -K02) - - rsb lr, lr, #0 @ lr = -K15 - rsb r11, r11, #0 @ r11 = K02 - - smlal r2, r3, lr, r9 @ r2..r3 += (ct17 * -K15) - smlal r2, r3, r11, r6 @ r2..r3 += (ct15 * K02) - - movs r4, r4, lsr #28 - adc r4, r4, r5, lsl #4 @ r4 = bits[59..28] of r4..r5 - str r4, [r1, #x25] @ store result x25 - - movs r2, r2, lsr #28 - adc r2, r2, r3, lsl #4 @ r2 = bits[59..28] of r2..r3 - str r2, [r1, #x19] @ store result x19 - - @---- - - ldr r2, [sp, #16] @ r2 = ct01_l - ldr r3, [sp, #20] @ r3 = ct01_h - - ldr r6, [r0, #X1] - ldr r8, [r0, #X7] - ldr r9, [r0, #X10] - ldr r7, [r0, #X16] - - rsbs r2, r2, #0 - rsc r3, r3, #0 @ r2..r3 = -ct01 - - mov r4, r2 - mov r5, r3 @ r4..r5 = -ct01 - - @ r2..r3 = -ct01 - @ r4..r5 = -ct01 - @ r6 = X1 - @ r7 = X16 - @ r8 = X7 - @ r9 = X10 - @ r10 = -K03 - @ r11 = K02 - @ r12 = -K14 - @ lr = -K15 - - smlal r4, r5, r12, r7 @ r4..r5 = -ct01 + (X16 * -K14) - smlal r2, r3, lr, r9 @ r2..r3 = -ct01 + (X10 * -K15) - - smlal r4, r5, r10, r8 @ r4..r5 += (X7 * -K03) - smlal r2, r3, r10, r7 @ r2..r3 += (X16 * -K03) - - smlal r4, r5, r11, r9 @ r4..r5 += (X10 * K02) - smlal r2, r3, r12, r8 @ r2..r3 += (X7 * -K14) - - rsb lr, lr, #0 @ lr = K15 - rsb r11, r11, #0 @ r11 = -K02 - - smlal r4, r5, lr, r6 @ r4..r5 += (X1 * K15) = ct05 - smlal r2, r3, r11, r6 @ r2..r3 += (X1 * -K02) = ct03 - - stmdb sp!, { r2, r3, r4, r5 } @ stack ct05_h, ct05_l, ct03_h, ct03_l - - rsbs r4, r4, #0 - rsc r5, r5, #0 @ r4..r5 = -ct05 - - stmdb sp!, { r4, r5 } @ stack -ct05_h, -ct05_l - - ldr r2, [sp, #48] @ r2 = ct00_l - ldr r3, [sp, #52] @ r3 = ct00_h - - rsb r10, r10, #0 @ r10 = K03 - - rsbs r4, r2, #0 - rsc r5, r3, #0 @ r4..r5 = -ct00 - - @ r2..r3 = ct00 - @ r4..r5 = -ct00 - @ r6 = X1 - @ r7 = X16 - @ r8 = X7 - @ r9 = X10 - @ r10 = K03 - @ r11 = -K02 - @ r12 = -K14 - @ lr = K15 - - smlal r4, r5, r10, r6 @ r4..r5 = -ct00 + (X1 * K03) - smlal r2, r3, r10, r9 @ r2..r3 = ct00 + (X10 * K03) - - smlal r4, r5, r12, r9 @ r4..r5 += (X10 * -K14) - smlal r2, r3, r12, r6 @ r2..r3 += (X1 * -K14) - - smlal r4, r5, r11, r7 @ r4..r5 += (X16 * -K02) - smlal r4, r5, lr, r8 @ r4..r5 += (X7 * K15) = ct07 - - rsb lr, lr, #0 @ lr = -K15 - rsb r11, r11, #0 @ r11 = K02 - - smlal r2, r3, r11, r8 @ r2..r3 += (X7 * K02) - smlal r2, r3, lr, r7 @ r2..r3 += (X16 * -K15) = ct02 - - rsbs r6, r4, #0 - rsc r7, r5, #0 @ r6..r7 = -ct07 - - stmdb sp!, { r2 - r7 } @ stack -ct07_h, -ct07_l, ct07_h, ct07_l, ct02_h, ct02_l - - - @---- - - add r2, pc, #(imdct36_long_karray-.-8) @ r2 = base address of Knn array (PIC safe ?) - - -loop: - ldr r12, [r0, #X0] - - ldmia r2!, { r5 - r11 } @ first 7 words from Karray element - - smull r3, r4, r5, r12 @ sum = (Kxx * X0) - ldr r12, [r0, #X2] - ldr r5, [r0, #X3] - smlal r3, r4, r6, r12 @ sum += (Kxx * X2) - ldr r12, [r0, #X5] - ldr r6, [r0, #X6] - smlal r3, r4, r7, r5 @ sum += (Kxx * X3) - smlal r3, r4, r8, r12 @ sum += (Kxx * X5) - ldr r12, [r0, #X8] - ldr r5, [r0, #X9] - smlal r3, r4, r9, r6 @ sum += (Kxx * X6) - smlal r3, r4, r10, r12 @ sum += (Kxx * X8) - smlal r3, r4, r11, r5 @ sum += (Kxx * X9) - - ldmia r2!, { r5 - r10 } @ final 6 words from Karray element - - ldr r11, [r0, #X11] - ldr r12, [r0, #X12] - smlal r3, r4, r5, r11 @ sum += (Kxx * X11) - ldr r11, [r0, #X14] - ldr r5, [r0, #X15] - smlal r3, r4, r6, r12 @ sum += (Kxx * X12) - smlal r3, r4, r7, r11 @ sum += (Kxx * X14) - ldr r11, [r0, #X17] - smlal r3, r4, r8, r5 @ sum += (Kxx * X15) - smlal r3, r4, r9, r11 @ sum += (Kxx * X17) - - add r5, sp, r10, lsr #16 @ create index back into stack for required ctxx - - ldmia r5, { r6, r7 } @ r6..r7 = ctxx - - mov r8, r10, lsl #16 @ push ctxx index off the top end - - adds r3, r3, r6 @ add low words - adc r4, r4, r7 @ add high words, with carry - movs r3, r3, lsr #28 - adc r3, r3, r4, lsl #4 @ r3 = bits[59..28] of r3..r4 - - str r3, [r1, r8, lsr #24] @ push completion flag off the bottom end - - movs r8, r8, lsl #8 @ push result location index off the top end - beq loop @ loop back if completion flag not set - b imdct_l_windowing @ branch to windowing stage if looping finished - -imdct36_long_karray: - - .word K17, -K13, K10, -K06, -K05, K01, -K00, K04, -K07, K11, K12, -K16, 0x00000000 - .word K13, K07, K16, K01, K10, -K05, K04, -K11, K00, -K17, K06, -K12, 0x00200800 - .word K11, K17, K05, K12, -K01, K06, -K07, K00, -K13, K04, -K16, K10, 0x00200c00 - .word K07, K00, -K12, K05, -K16, -K10, K11, -K17, K04, K13, K01, K06, 0x00001400 - .word K05, K10, -K00, -K17, K07, -K13, K12, K06, -K16, K01, -K11, -K04, 0x00181800 - .word K01, K05, -K07, -K11, K13, K17, -K16, -K12, K10, K06, -K04, -K00, 0x00102000 - .word -K16, K12, -K11, K07, K04, -K00, -K01, K05, -K06, K10, K13, -K17, 0x00284800 - .word -K12, K06, K17, -K00, -K11, K04, K05, -K10, K01, K16, -K07, -K13, 0x00085000 - .word -K10, K16, K04, -K13, -K00, K07, K06, -K01, -K12, -K05, K17, K11, 0x00105400 - .word -K06, -K01, K13, K04, K17, -K11, -K10, -K16, -K05, K12, K00, K07, 0x00185c00 - .word -K04, -K11, -K01, K16, K06, K12, K13, -K07, -K17, -K00, -K10, -K05, 0x00006000 - .word -K00, -K04, -K06, -K10, -K12, -K16, -K17, -K13, -K11, -K07, -K05, -K01, 0x00206801 - - - @---- - @------------------------------------------------------------------------- - @---- - -imdct_l_windowing: - - ldr r11, [sp, #80] @ fetch function parameter 3 from out of the stack - ldmia r1!, { r0, r2 - r9 } @ load 9 words from x0, update pointer - - @ r0 = x0 - @ r1 = &x[9] - @ r2 = x1 - @ r3 = x2 - @ r4 = x3 - @ r5 = x4 - @ r6 = x5 - @ r7 = x6 - @ r8 = x7 - @ r9 = x8 - @ r10 = . - @ r11 = window mode: (0 == normal), (1 == start block), (3 == stop block) - @ r12 = . - @ lr = . - - cmp r11, #BLOCK_MODE_STOP @ setup flags - rsb r10, r0, #0 @ r10 = -x0 (DONT change flags !!) - beq stop_block_x0_to_x17 - - - @ start and normal blocks are treated the same for x[0]..x[17] - -normal_block_x0_to_x17: - - ldr r12, =WL9 @ r12 = window_l[9] - - rsb r0, r9, #0 @ r0 = -x8 - rsb r9, r2, #0 @ r9 = -x1 - rsb r2, r8, #0 @ r2 = -x7 - rsb r8, r3, #0 @ r8 = -x2 - rsb r3, r7, #0 @ r3 = -x6 - rsb r7, r4, #0 @ r7 = -x3 - rsb r4, r6, #0 @ r4 = -x5 - rsb r6, r5, #0 @ r6 = -x4 - - @ r0 = -x8 - @ r1 = &x[9] - @ r2 = -x7 - @ r3 = -x6 - @ r4 = -x5 - @ r5 = . - @ r6 = -x4 - @ r7 = -x3 - @ r8 = -x2 - @ r9 = -x1 - @ r10 = -x0 - @ r11 = window mode: (0 == normal), (1 == start block), (3 == stop block) - @ r12 = window_l[9] - @ lr = . - - smull r5, lr, r12, r0 @ r5..lr = (window_l[9] * (x[9] == -x[8])) - ldr r12, =WL10 @ r12 = window_l[10] - movs r5, r5, lsr #28 - adc r0, r5, lr, lsl #4 @ r0 = bits[59..28] of windowed x9 - - smull r5, lr, r12, r2 @ r5..lr = (window_l[10] * (x[10] == -x[7])) - ldr r12, =WL11 @ r12 = window_l[11] - movs r5, r5, lsr #28 - adc r2, r5, lr, lsl #4 @ r2 = bits[59..28] of windowed x10 - - smull r5, lr, r12, r3 @ r5..lr = (window_l[11] * (x[11] == -x[6])) - ldr r12, =WL12 @ r12 = window_l[12] - movs r5, r5, lsr #28 - adc r3, r5, lr, lsl #4 @ r3 = bits[59..28] of windowed x11 - - smull r5, lr, r12, r4 @ r5..lr = (window_l[12] * (x[12] == -x[5])) - ldr r12, =WL13 @ r12 = window_l[13] - movs r5, r5, lsr #28 - adc r4, r5, lr, lsl #4 @ r4 = bits[59..28] of windowed x12 - - smull r5, lr, r12, r6 @ r5..lr = (window_l[13] * (x[13] == -x[4])) - ldr r12, =WL14 @ r12 = window_l[14] - movs r5, r5, lsr #28 - adc r6, r5, lr, lsl #4 @ r6 = bits[59..28] of windowed x13 - - smull r5, lr, r12, r7 @ r5..lr = (window_l[14] * (x[14] == -x[3])) - ldr r12, =WL15 @ r12 = window_l[15] - movs r5, r5, lsr #28 - adc r7, r5, lr, lsl #4 @ r7 = bits[59..28] of windowed x14 - - smull r5, lr, r12, r8 @ r5..lr = (window_l[15] * (x[15] == -x[2])) - ldr r12, =WL16 @ r12 = window_l[16] - movs r5, r5, lsr #28 - adc r8, r5, lr, lsl #4 @ r8 = bits[59..28] of windowed x15 - - smull r5, lr, r12, r9 @ r5..lr = (window_l[16] * (x[16] == -x[1])) - ldr r12, =WL17 @ r12 = window_l[17] - movs r5, r5, lsr #28 - adc r9, r5, lr, lsl #4 @ r9 = bits[59..28] of windowed x16 - - smull r5, lr, r12, r10 @ r5..lr = (window_l[17] * (x[17] == -x[0])) - ldr r12, =WL0 @ r12 = window_l[0] - movs r5, r5, lsr #28 - adc r10, r5, lr, lsl #4 @ r10 = bits[59..28] of windowed x17 - - - stmia r1, { r0, r2 - r4, r6 - r10 } @ store windowed x[9] .. x[17] - ldmdb r1!, { r0, r2 - r9 } @ load 9 words downto (and including) x0 - - - smull r10, lr, r12, r0 @ r10..lr = (window_l[0] * x[0]) - ldr r12, =WL1 @ r12 = window_l[1] - movs r10, r10, lsr #28 - adc r0, r10, lr, lsl #4 @ r0 = bits[59..28] of windowed x0 - - smull r10, lr, r12, r2 @ r10..lr = (window_l[1] * x[1]) - ldr r12, =WL2 @ r12 = window_l[2] - movs r10, r10, lsr #28 - adc r2, r10, lr, lsl #4 @ r2 = bits[59..28] of windowed x1 - - smull r10, lr, r12, r3 @ r10..lr = (window_l[2] * x[2]) - ldr r12, =WL3 @ r12 = window_l[3] - movs r10, r10, lsr #28 - adc r3, r10, lr, lsl #4 @ r3 = bits[59..28] of windowed x2 - - smull r10, lr, r12, r4 @ r10..lr = (window_l[3] * x[3]) - ldr r12, =WL4 @ r12 = window_l[4] - movs r10, r10, lsr #28 - adc r4, r10, lr, lsl #4 @ r4 = bits[59..28] of windowed x3 - - smull r10, lr, r12, r5 @ r10..lr = (window_l[4] * x[4]) - ldr r12, =WL5 @ r12 = window_l[5] - movs r10, r10, lsr #28 - adc r5, r10, lr, lsl #4 @ r5 = bits[59..28] of windowed x4 - - smull r10, lr, r12, r6 @ r10..lr = (window_l[5] * x[5]) - ldr r12, =WL6 @ r12 = window_l[6] - movs r10, r10, lsr #28 - adc r6, r10, lr, lsl #4 @ r6 = bits[59..28] of windowed x5 - - smull r10, lr, r12, r7 @ r10..lr = (window_l[6] * x[6]) - ldr r12, =WL7 @ r12 = window_l[7] - movs r10, r10, lsr #28 - adc r7, r10, lr, lsl #4 @ r7 = bits[59..28] of windowed x6 - - smull r10, lr, r12, r8 @ r10..lr = (window_l[7] * x[7]) - ldr r12, =WL8 @ r12 = window_l[8] - movs r10, r10, lsr #28 - adc r8, r10, lr, lsl #4 @ r8 = bits[59..28] of windowed x7 - - smull r10, lr, r12, r9 @ r10..lr = (window_l[8] * x[8]) - movs r10, r10, lsr #28 - adc r9, r10, lr, lsl #4 @ r9 = bits[59..28] of windowed x8 - - stmia r1, { r0, r2 - r9 } @ store windowed x[0] .. x[8] - - cmp r11, #BLOCK_MODE_START - beq start_block_x18_to_x35 - - - @---- - - -normal_block_x18_to_x35: - - ldr r11, =WL3 @ r11 = window_l[3] - ldr r12, =WL4 @ r12 = window_l[4] - - add r1, r1, #(18*4) @ r1 = &x[18] - - ldmia r1!, { r0, r2 - r4, r6 - r10 } @ load 9 words from x18, update pointer - - @ r0 = x18 - @ r1 = &x[27] - @ r2 = x19 - @ r3 = x20 - @ r4 = x21 - @ r5 = . - @ r6 = x22 - @ r7 = x23 - @ r8 = x24 - @ r9 = x25 - @ r10 = x26 - @ r11 = window_l[3] - @ r12 = window_l[4] - @ lr = . - - smull r5, lr, r12, r6 @ r5..lr = (window_l[4] * (x[22] == x[31])) - movs r5, r5, lsr #28 - adc r5, r5, lr, lsl #4 @ r5 = bits[59..28] of windowed x31 - - smull r6, lr, r11, r4 @ r5..lr = (window_l[3] * (x[21] == x[32])) - ldr r12, =WL5 @ r12 = window_l[5] - movs r6, r6, lsr #28 - adc r6, r6, lr, lsl #4 @ r6 = bits[59..28] of windowed x32 - - smull r4, lr, r12, r7 @ r4..lr = (window_l[5] * (x[23] == x[30])) - ldr r11, =WL1 @ r11 = window_l[1] - ldr r12, =WL2 @ r12 = window_l[2] - movs r4, r4, lsr #28 - adc r4, r4, lr, lsl #4 @ r4 = bits[59..28] of windowed x30 - - smull r7, lr, r12, r3 @ r7..lr = (window_l[2] * (x[20] == x[33])) - ldr r12, =WL6 @ r12 = window_l[6] - movs r7, r7, lsr #28 - adc r7, r7, lr, lsl #4 @ r7 = bits[59..28] of windowed x33 - - smull r3, lr, r12, r8 @ r3..lr = (window_l[6] * (x[24] == x[29])) - movs r3, r3, lsr #28 - adc r3, r3, lr, lsl #4 @ r3 = bits[59..28] of windowed x29 - - smull r8, lr, r11, r2 @ r7..lr = (window_l[1] * (x[19] == x[34])) - ldr r12, =WL7 @ r12 = window_l[7] - ldr r11, =WL8 @ r11 = window_l[8] - movs r8, r8, lsr #28 - adc r8, r8, lr, lsl #4 @ r8 = bits[59..28] of windowed x34 - - smull r2, lr, r12, r9 @ r7..lr = (window_l[7] * (x[25] == x[28])) - ldr r12, =WL0 @ r12 = window_l[0] - movs r2, r2, lsr #28 - adc r2, r2, lr, lsl #4 @ r2 = bits[59..28] of windowed x28 - - smull r9, lr, r12, r0 @ r3..lr = (window_l[0] * (x[18] == x[35])) - movs r9, r9, lsr #28 - adc r9, r9, lr, lsl #4 @ r9 = bits[59..28] of windowed x35 - - smull r0, lr, r11, r10 @ r7..lr = (window_l[8] * (x[26] == x[27])) - ldr r11, =WL16 @ r11 = window_l[16] - ldr r12, =WL17 @ r12 = window_l[17] - movs r0, r0, lsr #28 - adc r0, r0, lr, lsl #4 @ r0 = bits[59..28] of windowed x27 - - - stmia r1, { r0, r2 - r9 } @ store windowed x[27] .. x[35] - ldmdb r1!, { r0, r2 - r9 } @ load 9 words downto (and including) x18 - - - smull r10, lr, r12, r0 @ r10..lr = (window_l[17] * x[18]) - movs r10, r10, lsr #28 - adc r0, r10, lr, lsl #4 @ r0 = bits[59..28] of windowed x0 - - smull r10, lr, r11, r2 @ r10..lr = (window_l[16] * x[19]) - ldr r11, =WL14 @ r11 = window_l[14] - ldr r12, =WL15 @ r12 = window_l[15] - movs r10, r10, lsr #28 - adc r2, r10, lr, lsl #4 @ r2 = bits[59..28] of windowed x1 - - smull r10, lr, r12, r3 @ r10..lr = (window_l[15] * x[20]) - movs r10, r10, lsr #28 - adc r3, r10, lr, lsl #4 @ r3 = bits[59..28] of windowed x2 - - smull r10, lr, r11, r4 @ r10..lr = (window_l[14] * x[21]) - ldr r11, =WL12 @ r11 = window_l[12] - ldr r12, =WL13 @ r12 = window_l[13] - movs r10, r10, lsr #28 - adc r4, r10, lr, lsl #4 @ r4 = bits[59..28] of windowed x3 - - smull r10, lr, r12, r5 @ r10..lr = (window_l[13] * x[22]) - movs r10, r10, lsr #28 - adc r5, r10, lr, lsl #4 @ r5 = bits[59..28] of windowed x4 - - smull r10, lr, r11, r6 @ r10..lr = (window_l[12] * x[23]) - ldr r11, =WL10 @ r12 = window_l[10] - ldr r12, =WL11 @ r12 = window_l[11] - movs r10, r10, lsr #28 - adc r6, r10, lr, lsl #4 @ r6 = bits[59..28] of windowed x5 - - smull r10, lr, r12, r7 @ r10..lr = (window_l[11] * x[24]) - movs r10, r10, lsr #28 - adc r7, r10, lr, lsl #4 @ r7 = bits[59..28] of windowed x6 - - smull r10, lr, r11, r8 @ r10..lr = (window_l[10] * x[25]) - ldr r12, =WL9 @ r12 = window_l[9] - movs r10, r10, lsr #28 - adc r8, r10, lr, lsl #4 @ r8 = bits[59..28] of windowed x7 - - smull r10, lr, r12, r9 @ r10..lr = (window_l[9] * x[26]) - - movs r10, r10, lsr #28 - adc r9, r10, lr, lsl #4 @ r9 = bits[59..28] of windowed x8 - - stmia r1, { r0, r2 - r9 } @ store windowed x[18] .. x[26] - - @---- - @ NB there are 2 possible exits from this function - this is only one of them - @---- - - add sp, sp, #(21*4) @ return stack frame - ldmia sp!, { r4 - r11, pc } @ restore callee saved regs, and return - - @---- - - -stop_block_x0_to_x17: - - @ r0 = x0 - @ r1 = &x[9] - @ r2 = x1 - @ r3 = x2 - @ r4 = x3 - @ r5 = x4 - @ r6 = x5 - @ r7 = x6 - @ r8 = x7 - @ r9 = x8 - @ r10 = -x0 - @ r11 = window mode: (0 == normal), (1 == start block), (3 == stop block) - @ r12 = . - @ lr = . - - rsb r0, r6, #0 @ r0 = -x5 - rsb r6, r2, #0 @ r6 = -x1 - rsb r2, r5, #0 @ r2 = -x4 - rsb r5, r3, #0 @ r5 = -x2 - rsb r3, r4, #0 @ r3 = -x3 - - add r1, r1, #(3*4) @ r1 = &x[12] - stmia r1, { r0, r2, r3, r5, r6, r10 } @ store unchanged x[12] .. x[17] - - ldr r0, =WL1 @ r0 = window_l[1] == window_s[0] - - rsb r10, r9, #0 @ r10 = -x8 - rsb r12, r8, #0 @ r12 = -x7 - rsb lr, r7, #0 @ lr = -x6 - - @ r0 = WL1 - @ r1 = &x[12] - @ r2 = . - @ r3 = . - @ r4 = . - @ r5 = . - @ r6 = . - @ r7 = x6 - @ r8 = x7 - @ r9 = x8 - @ r10 = -x8 - @ r11 = window mode: (0 == normal), (1 == start block), (3 == stop block) - @ r12 = -x7 - @ lr = -x6 - - smull r5, r6, r0, r7 @ r5..r6 = (window_l[1] * x[6]) - ldr r2, =WL4 @ r2 = window_l[4] == window_s[1] - movs r5, r5, lsr #28 - adc r7, r5, r6, lsl #4 @ r7 = bits[59..28] of windowed x6 - - smull r5, r6, r2, r8 @ r5..r6 = (window_l[4] * x[7]) - ldr r3, =WL7 @ r3 = window_l[7] == window_s[2] - movs r5, r5, lsr #28 - adc r8, r5, r6, lsl #4 @ r8 = bits[59..28] of windowed x7 - - smull r5, r6, r3, r9 @ r5..r6 = (window_l[7] * x[8]) - ldr r4, =WL10 @ r4 = window_l[10] == window_s[3] - movs r5, r5, lsr #28 - adc r9, r5, r6, lsl #4 @ r9 = bits[59..28] of windowed x8 - - smull r5, r6, r4, r10 @ r5..r6 = (window_l[10] * (x[9] == -x[8])) - ldr r0, =WL13 @ r0 = window_l[13] == window_s[4] - movs r5, r5, lsr #28 - adc r10, r5, r6, lsl #4 @ r10 = bits[59..28] of windowed x9 - - smull r5, r6, r0, r12 @ r5..r6 = (window_l[13] * (x[10] == -x[7])) - ldr r2, =WL16 @ r2 = window_l[16] == window_s[5] - movs r5, r5, lsr #28 - adc r12, r5, r6, lsl #4 @ r10 = bits[59..28] of windowed x9 - - smull r5, r6, r2, lr @ r5..r6 = (window_l[16] * (x[11] == -x[6])) - - ldr r0, =0x00 - - movs r5, r5, lsr #28 - adc lr, r5, r6, lsl #4 @ r10 = bits[59..28] of windowed x9 - - stmdb r1!, { r7 - r10, r12, lr } @ store windowed x[6] .. x[11] - - ldr r5, =0x00 - ldr r6, =0x00 - ldr r2, =0x00 - ldr r3, =0x00 - ldr r4, =0x00 - - stmdb r1!, { r0, r2 - r6 } @ store windowed x[0] .. x[5] - - b normal_block_x18_to_x35 - - - @---- - - -start_block_x18_to_x35: - - ldr r4, =WL1 @ r0 = window_l[1] == window_s[0] - - add r1, r1, #(24*4) @ r1 = &x[24] - - ldmia r1, { r0, r2, r3 } @ load 3 words from x24, dont update pointer - - @ r0 = x24 - @ r1 = &x[24] - @ r2 = x25 - @ r3 = x26 - @ r4 = WL1 - @ r5 = WL4 - @ r6 = WL7 - @ r7 = WL10 - @ r8 = WL13 - @ r9 = WL16 - @ r10 = . - @ r11 = . - @ r12 = . - @ lr = . - - ldr r5, =WL4 @ r5 = window_l[4] == window_s[1] - - smull r10, r11, r4, r0 @ r10..r11 = (window_l[1] * (x[24] == x[29])) - ldr r6, =WL7 @ r6 = window_l[7] == window_s[2] - movs r10, r10, lsr #28 - adc lr, r10, r11, lsl #4 @ lr = bits[59..28] of windowed x29 - - smull r10, r11, r5, r2 @ r10..r11 = (window_l[4] * (x[25] == x[28])) - ldr r7, =WL10 @ r7 = window_l[10] == window_s[3] - movs r10, r10, lsr #28 - adc r12, r10, r11, lsl #4 @ r12 = bits[59..28] of windowed x28 - - smull r10, r11, r6, r3 @ r10..r11 = (window_l[7] * (x[26] == x[27])) - ldr r8, =WL13 @ r8 = window_l[13] == window_s[4] - movs r10, r10, lsr #28 - adc r4, r10, r11, lsl #4 @ r4 = bits[59..28] of windowed x27 - - smull r10, r11, r7, r3 @ r10..r11 = (window_l[10] * x[26]) - ldr r9, =WL16 @ r9 = window_l[16] == window_s[5] - movs r10, r10, lsr #28 - adc r3, r10, r11, lsl #4 @ r3 = bits[59..28] of windowed x26 - - smull r10, r11, r8, r2 @ r10..r11 = (window_l[13] * x[25]) - ldr r5, =0x00 - movs r10, r10, lsr #28 - adc r2, r10, r11, lsl #4 @ r2 = bits[59..28] of windowed x25 - - smull r10, r11, r9, r0 @ r10..r11 = (window_l[16] * x[24]) - ldr r6, =0x00 - movs r10, r10, lsr #28 - adc r0, r10, r11, lsl #4 @ r0 = bits[59..28] of windowed x24 - - stmia r1!, { r0, r2, r3, r4, r12, lr } @ store windowed x[24] .. x[29] - - ldr r7, =0x00 - ldr r8, =0x00 - ldr r9, =0x00 - ldr r10, =0x00 - - stmia r1!, { r5 - r10 } @ store windowed x[30] .. x[35] - - @---- - @ NB there are 2 possible exits from this function - this is only one of them - @---- - - add sp, sp, #(21*4) @ return stack frame - ldmia sp!, { r4 - r11, pc } @ restore callee saved regs, and return - - @---- - @END - @---- - diff --git a/src/libmad/imdct_s.dat b/src/libmad/imdct_s.dat deleted file mode 100644 index c938859e0..000000000 --- a/src/libmad/imdct_s.dat +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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: imdct_s.dat,v 1.3 2004/04/22 00:22:41 miguelfreitas Exp $ - */ - - /* 0 */ { MAD_F(0x09bd7ca0) /* 0.608761429 */, - -MAD_F(0x0ec835e8) /* -0.923879533 */, - -MAD_F(0x0216a2a2) /* -0.130526192 */, - MAD_F(0x0fdcf549) /* 0.991444861 */, - -MAD_F(0x061f78aa) /* -0.382683432 */, - -MAD_F(0x0cb19346) /* -0.793353340 */ }, - - /* 6 */ { -MAD_F(0x0cb19346) /* -0.793353340 */, - MAD_F(0x061f78aa) /* 0.382683432 */, - MAD_F(0x0fdcf549) /* 0.991444861 */, - MAD_F(0x0216a2a2) /* 0.130526192 */, - -MAD_F(0x0ec835e8) /* -0.923879533 */, - -MAD_F(0x09bd7ca0) /* -0.608761429 */ }, - - /* 1 */ { MAD_F(0x061f78aa) /* 0.382683432 */, - -MAD_F(0x0ec835e8) /* -0.923879533 */, - MAD_F(0x0ec835e8) /* 0.923879533 */, - -MAD_F(0x061f78aa) /* -0.382683432 */, - -MAD_F(0x061f78aa) /* -0.382683432 */, - MAD_F(0x0ec835e8) /* 0.923879533 */ }, - - /* 7 */ { -MAD_F(0x0ec835e8) /* -0.923879533 */, - -MAD_F(0x061f78aa) /* -0.382683432 */, - MAD_F(0x061f78aa) /* 0.382683432 */, - MAD_F(0x0ec835e8) /* 0.923879533 */, - MAD_F(0x0ec835e8) /* 0.923879533 */, - MAD_F(0x061f78aa) /* 0.382683432 */ }, - - /* 2 */ { MAD_F(0x0216a2a2) /* 0.130526192 */, - -MAD_F(0x061f78aa) /* -0.382683432 */, - MAD_F(0x09bd7ca0) /* 0.608761429 */, - -MAD_F(0x0cb19346) /* -0.793353340 */, - MAD_F(0x0ec835e8) /* 0.923879533 */, - -MAD_F(0x0fdcf549) /* -0.991444861 */ }, - - /* 8 */ { -MAD_F(0x0fdcf549) /* -0.991444861 */, - -MAD_F(0x0ec835e8) /* -0.923879533 */, - -MAD_F(0x0cb19346) /* -0.793353340 */, - -MAD_F(0x09bd7ca0) /* -0.608761429 */, - -MAD_F(0x061f78aa) /* -0.382683432 */, - -MAD_F(0x0216a2a2) /* -0.130526192 */ } diff --git a/src/libmad/layer12.c b/src/libmad/layer12.c deleted file mode 100755 index 25fd04d70..000000000 --- a/src/libmad/layer12.c +++ /dev/null @@ -1,534 +0,0 @@ -/* - * 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: layer12.c,v 1.3 2004/04/22 00:22:41 miguelfreitas Exp $ - */ - -# ifdef HAVE_CONFIG_H -# include "config.h" -# endif - -# include "global.h" - -# ifdef HAVE_LIMITS_H -# include <limits.h> -# else -# define CHAR_BIT 8 -# endif - -# include "fixed.h" -# include "bit.h" -# include "stream.h" -# include "frame.h" -# include "layer12.h" - -/* - * scalefactor table - * used in both Layer I and Layer II decoding - */ -static -mad_fixed_t const sf_table[64] = { -# include "sf_table.dat" -}; - -/* --- Layer I ------------------------------------------------------------- */ - -/* linear scaling table */ -static -mad_fixed_t const linear_table[14] = { - MAD_F(0x15555555), /* 2^2 / (2^2 - 1) == 1.33333333333333 */ - MAD_F(0x12492492), /* 2^3 / (2^3 - 1) == 1.14285714285714 */ - MAD_F(0x11111111), /* 2^4 / (2^4 - 1) == 1.06666666666667 */ - MAD_F(0x10842108), /* 2^5 / (2^5 - 1) == 1.03225806451613 */ - MAD_F(0x10410410), /* 2^6 / (2^6 - 1) == 1.01587301587302 */ - MAD_F(0x10204081), /* 2^7 / (2^7 - 1) == 1.00787401574803 */ - MAD_F(0x10101010), /* 2^8 / (2^8 - 1) == 1.00392156862745 */ - MAD_F(0x10080402), /* 2^9 / (2^9 - 1) == 1.00195694716243 */ - MAD_F(0x10040100), /* 2^10 / (2^10 - 1) == 1.00097751710655 */ - MAD_F(0x10020040), /* 2^11 / (2^11 - 1) == 1.00048851978505 */ - MAD_F(0x10010010), /* 2^12 / (2^12 - 1) == 1.00024420024420 */ - MAD_F(0x10008004), /* 2^13 / (2^13 - 1) == 1.00012208521548 */ - MAD_F(0x10004001), /* 2^14 / (2^14 - 1) == 1.00006103888177 */ - MAD_F(0x10002000) /* 2^15 / (2^15 - 1) == 1.00003051850948 */ -}; - -/* - * NAME: I_sample() - * DESCRIPTION: decode one requantized Layer I sample from a bitstream - */ -static -mad_fixed_t I_sample(struct mad_bitptr *ptr, unsigned int nb) -{ - mad_fixed_t sample; - - sample = mad_bit_read(ptr, nb); - - /* invert most significant bit, extend sign, then scale to fixed format */ - - sample ^= 1 << (nb - 1); - sample |= -(sample & (1 << (nb - 1))); - - sample <<= MAD_F_FRACBITS - (nb - 1); - - /* requantize the sample */ - - /* s'' = (2^nb / (2^nb - 1)) * (s''' + 2^(-nb + 1)) */ - - sample += MAD_F_ONE >> (nb - 1); - - return mad_f_mul(sample, linear_table[nb - 2]); - - /* s' = factor * s'' */ - /* (to be performed by caller) */ -} - -/* - * NAME: layer->I() - * DESCRIPTION: decode a single Layer I frame - */ -int mad_layer_I(struct mad_stream *stream, struct mad_frame *frame) -{ - struct mad_header *header = &frame->header; - unsigned int nch, bound, ch, s, sb, nb; - unsigned char allocation[2][32], scalefactor[2][32]; - - nch = MAD_NCHANNELS(header); - - bound = 32; - if (header->mode == MAD_MODE_JOINT_STEREO) { - header->flags |= MAD_FLAG_I_STEREO; - bound = 4 + header->mode_extension * 4; - } - - /* check CRC word */ - - if (header->flags & MAD_FLAG_PROTECTION) { - header->crc_check = - mad_bit_crc(stream->ptr, 4 * (bound * nch + (32 - bound)), - header->crc_check); - - if (header->crc_check != header->crc_target && - !(frame->options & MAD_OPTION_IGNORECRC)) { - stream->error = MAD_ERROR_BADCRC; - return -1; - } - } - - /* decode bit allocations */ - - for (sb = 0; sb < bound; ++sb) { - for (ch = 0; ch < nch; ++ch) { - nb = mad_bit_read(&stream->ptr, 4); - - if (nb == 15) { - stream->error = MAD_ERROR_BADBITALLOC; - return -1; - } - - allocation[ch][sb] = nb ? nb + 1 : 0; - } - } - - for (sb = bound; sb < 32; ++sb) { - nb = mad_bit_read(&stream->ptr, 4); - - if (nb == 15) { - stream->error = MAD_ERROR_BADBITALLOC; - return -1; - } - - allocation[0][sb] = - allocation[1][sb] = nb ? nb + 1 : 0; - } - - /* decode scalefactors */ - - for (sb = 0; sb < 32; ++sb) { - for (ch = 0; ch < nch; ++ch) { - if (allocation[ch][sb]) { - scalefactor[ch][sb] = mad_bit_read(&stream->ptr, 6); - -# if defined(OPT_STRICT) - /* - * Scalefactor index 63 does not appear in Table B.1 of - * ISO/IEC 11172-3. Nonetheless, other implementations accept it, - * so we only reject it if OPT_STRICT is defined. - */ - if (scalefactor[ch][sb] == 63) { - stream->error = MAD_ERROR_BADSCALEFACTOR; - return -1; - } -# endif - } - } - } - - /* decode samples */ - - for (s = 0; s < 12; ++s) { - for (sb = 0; sb < bound; ++sb) { - for (ch = 0; ch < nch; ++ch) { - nb = allocation[ch][sb]; - frame->sbsample[ch][s][sb] = nb ? - mad_f_mul(I_sample(&stream->ptr, nb), - sf_table[scalefactor[ch][sb]]) : 0; - } - } - - for (sb = bound; sb < 32; ++sb) { - if ((nb = allocation[0][sb])) { - mad_fixed_t sample; - - sample = I_sample(&stream->ptr, nb); - - for (ch = 0; ch < nch; ++ch) { - frame->sbsample[ch][s][sb] = - mad_f_mul(sample, sf_table[scalefactor[ch][sb]]); - } - } - else { - for (ch = 0; ch < nch; ++ch) - frame->sbsample[ch][s][sb] = 0; - } - } - } - - return 0; -} - -/* --- Layer II ------------------------------------------------------------ */ - -/* possible quantization per subband table */ -static -struct { - unsigned int sblimit; - unsigned char const offsets[30]; -} const sbquant_table[5] = { - /* ISO/IEC 11172-3 Table B.2a */ - { 27, { 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, /* 0 */ - 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0 } }, - /* ISO/IEC 11172-3 Table B.2b */ - { 30, { 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, /* 1 */ - 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0 } }, - /* ISO/IEC 11172-3 Table B.2c */ - { 8, { 5, 5, 2, 2, 2, 2, 2, 2 } }, /* 2 */ - /* ISO/IEC 11172-3 Table B.2d */ - { 12, { 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 } }, /* 3 */ - /* ISO/IEC 13818-3 Table B.1 */ - { 30, { 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, /* 4 */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } } -}; - -/* bit allocation table */ -static -struct { - unsigned short nbal; - unsigned short offset; -} const bitalloc_table[8] = { - { 2, 0 }, /* 0 */ - { 2, 3 }, /* 1 */ - { 3, 3 }, /* 2 */ - { 3, 1 }, /* 3 */ - { 4, 2 }, /* 4 */ - { 4, 3 }, /* 5 */ - { 4, 4 }, /* 6 */ - { 4, 5 } /* 7 */ -}; - -/* offsets into quantization class table */ -static -unsigned char const offset_table[6][15] = { - { 0, 1, 16 }, /* 0 */ - { 0, 1, 2, 3, 4, 5, 16 }, /* 1 */ - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }, /* 2 */ - { 0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, /* 3 */ - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16 }, /* 4 */ - { 0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 } /* 5 */ -}; - -/* quantization class table */ -static -struct quantclass { - unsigned short nlevels; - unsigned char group; - unsigned char bits; - mad_fixed_t C; - mad_fixed_t D; -} const qc_table[17] = { -# include "qc_table.dat" -}; - -/* - * NAME: II_samples() - * DESCRIPTION: decode three requantized Layer II samples from a bitstream - */ -static -void II_samples(struct mad_bitptr *ptr, - struct quantclass const *quantclass, - mad_fixed_t output[3]) -{ - unsigned int nb, s, sample[3]; - - if ((nb = quantclass->group)) { - unsigned int c, nlevels; - - /* degrouping */ - c = mad_bit_read(ptr, quantclass->bits); - nlevels = quantclass->nlevels; - - for (s = 0; s < 3; ++s) { - sample[s] = c % nlevels; - c /= nlevels; - } - } - else { - nb = quantclass->bits; - - for (s = 0; s < 3; ++s) - sample[s] = mad_bit_read(ptr, nb); - } - - for (s = 0; s < 3; ++s) { - mad_fixed_t requantized; - - /* invert most significant bit, extend sign, then scale to fixed format */ - - requantized = sample[s] ^ (1 << (nb - 1)); - requantized |= -(requantized & (1 << (nb - 1))); - - requantized <<= MAD_F_FRACBITS - (nb - 1); - - /* requantize the sample */ - - /* s'' = C * (s''' + D) */ - - output[s] = mad_f_mul(requantized + quantclass->D, quantclass->C); - - /* s' = factor * s'' */ - /* (to be performed by caller) */ - } -} - -/* - * NAME: layer->II() - * DESCRIPTION: decode a single Layer II frame - */ -int mad_layer_II(struct mad_stream *stream, struct mad_frame *frame) -{ - struct mad_header *header = &frame->header; - struct mad_bitptr start; - unsigned int index, sblimit, nbal, nch, bound, gr, ch, s, sb; - unsigned char const *offsets; - unsigned char allocation[2][32], scfsi[2][32], scalefactor[2][32][3]; - mad_fixed_t samples[3]; - - nch = MAD_NCHANNELS(header); - - if (header->flags & MAD_FLAG_LSF_EXT) - index = 4; - else if (header->flags & MAD_FLAG_FREEFORMAT) - goto freeformat; - else { - unsigned long bitrate_per_channel; - - bitrate_per_channel = header->bitrate; - if (nch == 2) { - bitrate_per_channel /= 2; - -# if defined(OPT_STRICT) - /* - * ISO/IEC 11172-3 allows only single channel mode for 32, 48, 56, and - * 80 kbps bitrates in Layer II, but some encoders ignore this - * restriction. We enforce it if OPT_STRICT is defined. - */ - if (bitrate_per_channel <= 28000 || bitrate_per_channel == 40000) { - stream->error = MAD_ERROR_BADMODE; - return -1; - } -# endif - } - else { /* nch == 1 */ - if (bitrate_per_channel > 192000) { - /* - * ISO/IEC 11172-3 does not allow single channel mode for 224, 256, - * 320, or 384 kbps bitrates in Layer II. - */ - stream->error = MAD_ERROR_BADMODE; - return -1; - } - } - - if (bitrate_per_channel <= 48000) - index = (header->samplerate == 32000) ? 3 : 2; - else if (bitrate_per_channel <= 80000) - index = 0; - else { - freeformat: - index = (header->samplerate == 48000) ? 0 : 1; - } - } - - sblimit = sbquant_table[index].sblimit; - offsets = sbquant_table[index].offsets; - - bound = 32; - if (header->mode == MAD_MODE_JOINT_STEREO) { - header->flags |= MAD_FLAG_I_STEREO; - bound = 4 + header->mode_extension * 4; - } - - if (bound > sblimit) - bound = sblimit; - - start = stream->ptr; - - /* decode bit allocations */ - - for (sb = 0; sb < bound; ++sb) { - nbal = bitalloc_table[offsets[sb]].nbal; - - for (ch = 0; ch < nch; ++ch) - allocation[ch][sb] = mad_bit_read(&stream->ptr, nbal); - } - - for (sb = bound; sb < sblimit; ++sb) { - nbal = bitalloc_table[offsets[sb]].nbal; - - allocation[0][sb] = - allocation[1][sb] = mad_bit_read(&stream->ptr, nbal); - } - - /* decode scalefactor selection info */ - - for (sb = 0; sb < sblimit; ++sb) { - for (ch = 0; ch < nch; ++ch) { - if (allocation[ch][sb]) - scfsi[ch][sb] = mad_bit_read(&stream->ptr, 2); - } - } - - /* check CRC word */ - - if (header->flags & MAD_FLAG_PROTECTION) { - header->crc_check = - mad_bit_crc(start, mad_bit_length(&start, &stream->ptr), - header->crc_check); - - if (header->crc_check != header->crc_target && - !(frame->options & MAD_OPTION_IGNORECRC)) { - stream->error = MAD_ERROR_BADCRC; - return -1; - } - } - - /* decode scalefactors */ - - for (sb = 0; sb < sblimit; ++sb) { - for (ch = 0; ch < nch; ++ch) { - if (allocation[ch][sb]) { - scalefactor[ch][sb][0] = mad_bit_read(&stream->ptr, 6); - - switch (scfsi[ch][sb]) { - case 2: - scalefactor[ch][sb][2] = - scalefactor[ch][sb][1] = - scalefactor[ch][sb][0]; - break; - - case 0: - scalefactor[ch][sb][1] = mad_bit_read(&stream->ptr, 6); - /* fall through */ - - case 1: - case 3: - scalefactor[ch][sb][2] = mad_bit_read(&stream->ptr, 6); - } - - if (scfsi[ch][sb] & 1) - scalefactor[ch][sb][1] = scalefactor[ch][sb][scfsi[ch][sb] - 1]; - -# if defined(OPT_STRICT) - /* - * Scalefactor index 63 does not appear in Table B.1 of - * ISO/IEC 11172-3. Nonetheless, other implementations accept it, - * so we only reject it if OPT_STRICT is defined. - */ - if (scalefactor[ch][sb][0] == 63 || - scalefactor[ch][sb][1] == 63 || - scalefactor[ch][sb][2] == 63) { - stream->error = MAD_ERROR_BADSCALEFACTOR; - return -1; - } -# endif - } - } - } - - /* decode samples */ - - for (gr = 0; gr < 12; ++gr) { - for (sb = 0; sb < bound; ++sb) { - for (ch = 0; ch < nch; ++ch) { - if ((index = allocation[ch][sb])) { - index = offset_table[bitalloc_table[offsets[sb]].offset][index - 1]; - - II_samples(&stream->ptr, &qc_table[index], samples); - - for (s = 0; s < 3; ++s) { - frame->sbsample[ch][3 * gr + s][sb] = - mad_f_mul(samples[s], sf_table[scalefactor[ch][sb][gr / 4]]); - } - } - else { - for (s = 0; s < 3; ++s) - frame->sbsample[ch][3 * gr + s][sb] = 0; - } - } - } - - for (sb = bound; sb < sblimit; ++sb) { - if ((index = allocation[0][sb])) { - index = offset_table[bitalloc_table[offsets[sb]].offset][index - 1]; - - II_samples(&stream->ptr, &qc_table[index], samples); - - for (ch = 0; ch < nch; ++ch) { - for (s = 0; s < 3; ++s) { - frame->sbsample[ch][3 * gr + s][sb] = - mad_f_mul(samples[s], sf_table[scalefactor[ch][sb][gr / 4]]); - } - } - } - else { - for (ch = 0; ch < nch; ++ch) { - for (s = 0; s < 3; ++s) - frame->sbsample[ch][3 * gr + s][sb] = 0; - } - } - } - - for (ch = 0; ch < nch; ++ch) { - for (s = 0; s < 3; ++s) { - for (sb = sblimit; sb < 32; ++sb) - frame->sbsample[ch][3 * gr + s][sb] = 0; - } - } - } - - return 0; -} diff --git a/src/libmad/layer12.h b/src/libmad/layer12.h deleted file mode 100644 index 645bb6405..000000000 --- a/src/libmad/layer12.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * 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: layer12.h,v 1.3 2004/04/22 00:22:49 miguelfreitas Exp $ - */ - -# ifndef LIBMAD_LAYER12_H -# define LIBMAD_LAYER12_H - -# include "stream.h" -# include "frame.h" - -int mad_layer_I(struct mad_stream *, struct mad_frame *); -int mad_layer_II(struct mad_stream *, struct mad_frame *); - -# endif diff --git a/src/libmad/layer3.c b/src/libmad/layer3.c deleted file mode 100755 index c5d46e8d1..000000000 --- a/src/libmad/layer3.c +++ /dev/null @@ -1,2698 +0,0 @@ -/* - * 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: layer3.c,v 1.7 2006/09/26 00:12:20 dgp85 Exp $ - */ - -# ifdef HAVE_CONFIG_H -# include "config.h" -# endif - -# include "global.h" - -# include <stdlib.h> -# include <string.h> - -# ifdef HAVE_ASSERT_H -# include <assert.h> -# endif - -# ifdef HAVE_LIMITS_H -# include <limits.h> -# else -# define CHAR_BIT 8 -# endif - -# include "fixed.h" -# include "bit.h" -# include "stream.h" -# include "frame.h" -# include "huffman.h" -# include "layer3.h" - -/* --- Layer III ----------------------------------------------------------- */ - -enum { - count1table_select = 0x01, - scalefac_scale = 0x02, - preflag = 0x04, - mixed_block_flag = 0x08 -}; - -enum { - I_STEREO = 0x1, - MS_STEREO = 0x2 -}; - -struct sideinfo { - unsigned int main_data_begin; - unsigned int private_bits; - - unsigned char scfsi[2]; - - struct granule { - struct channel { - /* from side info */ - unsigned short part2_3_length; - unsigned short big_values; - unsigned short global_gain; - unsigned short scalefac_compress; - - unsigned char flags; - unsigned char block_type; - unsigned char table_select[3]; - unsigned char subblock_gain[3]; - unsigned char region0_count; - unsigned char region1_count; - - /* from main_data */ - unsigned char scalefac[39]; /* scalefac_l and/or scalefac_s */ - } ch[2]; - } gr[2]; -}; - -/* - * scalefactor bit lengths - * derived from section 2.4.2.7 of ISO/IEC 11172-3 - */ -static -struct { - unsigned char slen1; - unsigned char slen2; -} const sflen_table[16] = { - { 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 }, - { 3, 0 }, { 1, 1 }, { 1, 2 }, { 1, 3 }, - { 2, 1 }, { 2, 2 }, { 2, 3 }, { 3, 1 }, - { 3, 2 }, { 3, 3 }, { 4, 2 }, { 4, 3 } -}; - -/* - * number of LSF scalefactor band values - * derived from section 2.4.3.2 of ISO/IEC 13818-3 - */ -static -unsigned char const nsfb_table[6][3][4] = { - { { 6, 5, 5, 5 }, - { 9, 9, 9, 9 }, - { 6, 9, 9, 9 } }, - - { { 6, 5, 7, 3 }, - { 9, 9, 12, 6 }, - { 6, 9, 12, 6 } }, - - { { 11, 10, 0, 0 }, - { 18, 18, 0, 0 }, - { 15, 18, 0, 0 } }, - - { { 7, 7, 7, 0 }, - { 12, 12, 12, 0 }, - { 6, 15, 12, 0 } }, - - { { 6, 6, 6, 3 }, - { 12, 9, 9, 6 }, - { 6, 12, 9, 6 } }, - - { { 8, 8, 5, 0 }, - { 15, 12, 9, 0 }, - { 6, 18, 9, 0 } } -}; - -/* - * MPEG-1 scalefactor band widths - * derived from Table B.8 of ISO/IEC 11172-3 - */ -static -unsigned char const sfb_48000_long[] = { - 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10, - 12, 16, 18, 22, 28, 34, 40, 46, 54, 54, 192 -}; - -static -unsigned char const sfb_44100_long[] = { - 4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10, - 12, 16, 20, 24, 28, 34, 42, 50, 54, 76, 158 -}; - -static -unsigned char const sfb_32000_long[] = { - 4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12, - 16, 20, 24, 30, 38, 46, 56, 68, 84, 102, 26 -}; - -static -unsigned char const sfb_48000_short[] = { - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, - 6, 6, 6, 6, 6, 10, 10, 10, 12, 12, 12, 14, 14, - 14, 16, 16, 16, 20, 20, 20, 26, 26, 26, 66, 66, 66 -}; - -static -unsigned char const sfb_44100_short[] = { - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, - 6, 6, 8, 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, - 14, 18, 18, 18, 22, 22, 22, 30, 30, 30, 56, 56, 56 -}; - -static -unsigned char const sfb_32000_short[] = { - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, - 6, 6, 8, 8, 8, 12, 12, 12, 16, 16, 16, 20, 20, - 20, 26, 26, 26, 34, 34, 34, 42, 42, 42, 12, 12, 12 -}; - -static -unsigned char const sfb_48000_mixed[] = { - /* long */ 4, 4, 4, 4, 4, 4, 6, 6, - /* short */ 4, 4, 4, 6, 6, 6, 6, 6, 6, 10, - 10, 10, 12, 12, 12, 14, 14, 14, 16, 16, - 16, 20, 20, 20, 26, 26, 26, 66, 66, 66 -}; - -static -unsigned char const sfb_44100_mixed[] = { - /* long */ 4, 4, 4, 4, 4, 4, 6, 6, - /* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 10, - 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, - 18, 22, 22, 22, 30, 30, 30, 56, 56, 56 -}; - -static -unsigned char const sfb_32000_mixed[] = { - /* long */ 4, 4, 4, 4, 4, 4, 6, 6, - /* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 12, - 12, 12, 16, 16, 16, 20, 20, 20, 26, 26, - 26, 34, 34, 34, 42, 42, 42, 12, 12, 12 -}; - -/* - * MPEG-2 scalefactor band widths - * derived from Table B.2 of ISO/IEC 13818-3 - */ -static -unsigned char const sfb_24000_long[] = { - 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, - 18, 22, 26, 32, 38, 46, 54, 62, 70, 76, 36 -}; - -static -unsigned char const sfb_22050_long[] = { - 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, - 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54 -}; - -# define sfb_16000_long sfb_22050_long - -static -unsigned char const sfb_24000_short[] = { - 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, - 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, - 18, 24, 24, 24, 32, 32, 32, 44, 44, 44, 12, 12, 12 -}; - -static -unsigned char const sfb_22050_short[] = { - 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, - 6, 6, 8, 8, 8, 10, 10, 10, 14, 14, 14, 18, 18, - 18, 26, 26, 26, 32, 32, 32, 42, 42, 42, 18, 18, 18 -}; - -static -unsigned char const sfb_16000_short[] = { - 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, - 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, - 18, 24, 24, 24, 30, 30, 30, 40, 40, 40, 18, 18, 18 -}; - -static -unsigned char const sfb_24000_mixed[] = { - /* long */ 6, 6, 6, 6, 6, 6, - /* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12, - 12, 12, 14, 14, 14, 18, 18, 18, 24, 24, - 24, 32, 32, 32, 44, 44, 44, 12, 12, 12 -}; - -static -unsigned char const sfb_22050_mixed[] = { - /* long */ 6, 6, 6, 6, 6, 6, - /* short */ 6, 6, 6, 6, 6, 6, 8, 8, 8, 10, - 10, 10, 14, 14, 14, 18, 18, 18, 26, 26, - 26, 32, 32, 32, 42, 42, 42, 18, 18, 18 -}; - -static -unsigned char const sfb_16000_mixed[] = { - /* long */ 6, 6, 6, 6, 6, 6, - /* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12, - 12, 12, 14, 14, 14, 18, 18, 18, 24, 24, - 24, 30, 30, 30, 40, 40, 40, 18, 18, 18 -}; - -/* - * MPEG 2.5 scalefactor band widths - * derived from public sources - */ -# define sfb_12000_long sfb_16000_long -# define sfb_11025_long sfb_12000_long - -static -unsigned char const sfb_8000_long[] = { - 12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32, - 40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2 -}; - -# define sfb_12000_short sfb_16000_short -# define sfb_11025_short sfb_12000_short - -static -unsigned char const sfb_8000_short[] = { - 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 16, - 16, 16, 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, - 36, 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26 -}; - -# define sfb_12000_mixed sfb_16000_mixed -# define sfb_11025_mixed sfb_12000_mixed - -/* the 8000 Hz short block scalefactor bands do not break after - the first 36 frequency lines, so this is probably wrong */ -static -unsigned char const sfb_8000_mixed[] = { - /* long */ 12, 12, 12, - /* short */ 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16, - 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, 36, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26 -}; - -static -struct { - unsigned char const *l; - unsigned char const *s; - unsigned char const *m; -} const sfbwidth_table[9] = { - { sfb_48000_long, sfb_48000_short, sfb_48000_mixed }, - { sfb_44100_long, sfb_44100_short, sfb_44100_mixed }, - { sfb_32000_long, sfb_32000_short, sfb_32000_mixed }, - { sfb_24000_long, sfb_24000_short, sfb_24000_mixed }, - { sfb_22050_long, sfb_22050_short, sfb_22050_mixed }, - { sfb_16000_long, sfb_16000_short, sfb_16000_mixed }, - { sfb_12000_long, sfb_12000_short, sfb_12000_mixed }, - { sfb_11025_long, sfb_11025_short, sfb_11025_mixed }, - { sfb_8000_long, sfb_8000_short, sfb_8000_mixed } -}; - -/* - * scalefactor band preemphasis (used only when preflag is set) - * derived from Table B.6 of ISO/IEC 11172-3 - */ -static -unsigned char const pretab[22] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 -}; - -/* - * table for requantization - * - * rq_table[x].mantissa * 2^(rq_table[x].exponent) = x^(4/3) - */ -static -struct fixedfloat { - unsigned long mantissa : 27; - unsigned short exponent : 5; -} const rq_table[8207] = { -# include "rq_table.dat" -}; - -/* - * fractional powers of two - * used for requantization and joint stereo decoding - * - * root_table[3 + x] = 2^(x/4) - */ -static -mad_fixed_t const root_table[7] = { - MAD_F(0x09837f05) /* 2^(-3/4) == 0.59460355750136 */, - MAD_F(0x0b504f33) /* 2^(-2/4) == 0.70710678118655 */, - MAD_F(0x0d744fcd) /* 2^(-1/4) == 0.84089641525371 */, - MAD_F(0x10000000) /* 2^( 0/4) == 1.00000000000000 */, - MAD_F(0x1306fe0a) /* 2^(+1/4) == 1.18920711500272 */, - MAD_F(0x16a09e66) /* 2^(+2/4) == 1.41421356237310 */, - MAD_F(0x1ae89f99) /* 2^(+3/4) == 1.68179283050743 */ -}; - -/* - * coefficients for aliasing reduction - * derived from Table B.9 of ISO/IEC 11172-3 - * - * c[] = { -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037 } - * cs[i] = 1 / sqrt(1 + c[i]^2) - * ca[i] = c[i] / sqrt(1 + c[i]^2) - */ -static -mad_fixed_t const cs[8] = { - +MAD_F(0x0db84a81) /* +0.857492926 */, +MAD_F(0x0e1b9d7f) /* +0.881741997 */, - +MAD_F(0x0f31adcf) /* +0.949628649 */, +MAD_F(0x0fbba815) /* +0.983314592 */, - +MAD_F(0x0feda417) /* +0.995517816 */, +MAD_F(0x0ffc8fc8) /* +0.999160558 */, - +MAD_F(0x0fff964c) /* +0.999899195 */, +MAD_F(0x0ffff8d3) /* +0.999993155 */ -}; - -static -mad_fixed_t const ca[8] = { - -MAD_F(0x083b5fe7) /* -0.514495755 */, -MAD_F(0x078c36d2) /* -0.471731969 */, - -MAD_F(0x05039814) /* -0.313377454 */, -MAD_F(0x02e91dd1) /* -0.181913200 */, - -MAD_F(0x0183603a) /* -0.094574193 */, -MAD_F(0x00a7cb87) /* -0.040965583 */, - -MAD_F(0x003a2847) /* -0.014198569 */, -MAD_F(0x000f27b4) /* -0.003699975 */ -}; - -/* - * IMDCT coefficients for short blocks - * derived from section 2.4.3.4.10.2 of ISO/IEC 11172-3 - * - * imdct_s[i/even][k] = cos((PI / 24) * (2 * (i / 2) + 7) * (2 * k + 1)) - * imdct_s[i /odd][k] = cos((PI / 24) * (2 * (6 + (i-1)/2) + 7) * (2 * k + 1)) - */ -static -mad_fixed_t const imdct_s[6][6] = { -# include "imdct_s.dat" -}; - -# if !defined(ASO_IMDCT) -/* - * windowing coefficients for long blocks - * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3 - * - * window_l[i] = sin((PI / 36) * (i + 1/2)) - */ -static -mad_fixed_t const window_l[36] = { - MAD_F(0x00b2aa3e) /* 0.043619387 */, MAD_F(0x0216a2a2) /* 0.130526192 */, - MAD_F(0x03768962) /* 0.216439614 */, MAD_F(0x04cfb0e2) /* 0.300705800 */, - MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x07635284) /* 0.461748613 */, - MAD_F(0x0898c779) /* 0.537299608 */, MAD_F(0x09bd7ca0) /* 0.608761429 */, - MAD_F(0x0acf37ad) /* 0.675590208 */, MAD_F(0x0bcbe352) /* 0.737277337 */, - MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x0d7e8807) /* 0.843391446 */, - - MAD_F(0x0e313245) /* 0.887010833 */, MAD_F(0x0ec835e8) /* 0.923879533 */, - MAD_F(0x0f426cb5) /* 0.953716951 */, MAD_F(0x0f9ee890) /* 0.976296007 */, - MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ffc19fd) /* 0.999048222 */, - MAD_F(0x0ffc19fd) /* 0.999048222 */, MAD_F(0x0fdcf549) /* 0.991444861 */, - MAD_F(0x0f9ee890) /* 0.976296007 */, MAD_F(0x0f426cb5) /* 0.953716951 */, - MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0e313245) /* 0.887010833 */, - - MAD_F(0x0d7e8807) /* 0.843391446 */, MAD_F(0x0cb19346) /* 0.793353340 */, - MAD_F(0x0bcbe352) /* 0.737277337 */, MAD_F(0x0acf37ad) /* 0.675590208 */, - MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0898c779) /* 0.537299608 */, - MAD_F(0x07635284) /* 0.461748613 */, MAD_F(0x061f78aa) /* 0.382683432 */, - MAD_F(0x04cfb0e2) /* 0.300705800 */, MAD_F(0x03768962) /* 0.216439614 */, - MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x00b2aa3e) /* 0.043619387 */, -}; -# endif /* ASO_IMDCT */ - -/* - * windowing coefficients for short blocks - * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3 - * - * window_s[i] = sin((PI / 12) * (i + 1/2)) - */ -static -mad_fixed_t const window_s[12] = { - MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x061f78aa) /* 0.382683432 */, - MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0cb19346) /* 0.793353340 */, - MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0fdcf549) /* 0.991444861 */, - MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ec835e8) /* 0.923879533 */, - MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x09bd7ca0) /* 0.608761429 */, - MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x0216a2a2) /* 0.130526192 */, -}; - -/* - * coefficients for intensity stereo processing - * derived from section 2.4.3.4.9.3 of ISO/IEC 11172-3 - * - * is_ratio[i] = tan(i * (PI / 12)) - * is_table[i] = is_ratio[i] / (1 + is_ratio[i]) - */ -static -mad_fixed_t const is_table[7] = { - MAD_F(0x00000000) /* 0.000000000 */, - MAD_F(0x0361962f) /* 0.211324865 */, - MAD_F(0x05db3d74) /* 0.366025404 */, - MAD_F(0x08000000) /* 0.500000000 */, - MAD_F(0x0a24c28c) /* 0.633974596 */, - MAD_F(0x0c9e69d1) /* 0.788675135 */, - MAD_F(0x10000000) /* 1.000000000 */ -}; - -/* - * coefficients for LSF intensity stereo processing - * derived from section 2.4.3.2 of ISO/IEC 13818-3 - * - * is_lsf_table[0][i] = (1 / sqrt(sqrt(2)))^(i + 1) - * is_lsf_table[1][i] = (1 / sqrt(2)) ^(i + 1) - */ -static -mad_fixed_t const is_lsf_table[2][15] = { - { - MAD_F(0x0d744fcd) /* 0.840896415 */, - MAD_F(0x0b504f33) /* 0.707106781 */, - MAD_F(0x09837f05) /* 0.594603558 */, - MAD_F(0x08000000) /* 0.500000000 */, - MAD_F(0x06ba27e6) /* 0.420448208 */, - MAD_F(0x05a8279a) /* 0.353553391 */, - MAD_F(0x04c1bf83) /* 0.297301779 */, - MAD_F(0x04000000) /* 0.250000000 */, - MAD_F(0x035d13f3) /* 0.210224104 */, - MAD_F(0x02d413cd) /* 0.176776695 */, - MAD_F(0x0260dfc1) /* 0.148650889 */, - MAD_F(0x02000000) /* 0.125000000 */, - MAD_F(0x01ae89fa) /* 0.105112052 */, - MAD_F(0x016a09e6) /* 0.088388348 */, - MAD_F(0x01306fe1) /* 0.074325445 */ - }, { - MAD_F(0x0b504f33) /* 0.707106781 */, - MAD_F(0x08000000) /* 0.500000000 */, - MAD_F(0x05a8279a) /* 0.353553391 */, - MAD_F(0x04000000) /* 0.250000000 */, - MAD_F(0x02d413cd) /* 0.176776695 */, - MAD_F(0x02000000) /* 0.125000000 */, - MAD_F(0x016a09e6) /* 0.088388348 */, - MAD_F(0x01000000) /* 0.062500000 */, - MAD_F(0x00b504f3) /* 0.044194174 */, - MAD_F(0x00800000) /* 0.031250000 */, - MAD_F(0x005a827a) /* 0.022097087 */, - MAD_F(0x00400000) /* 0.015625000 */, - MAD_F(0x002d413d) /* 0.011048543 */, - MAD_F(0x00200000) /* 0.007812500 */, - MAD_F(0x0016a09e) /* 0.005524272 */ - } -}; - -/* - * NAME: III_sideinfo() - * DESCRIPTION: decode frame side information from a bitstream - */ -static -enum mad_error III_sideinfo(struct mad_bitptr *ptr, unsigned int nch, - int lsf, struct sideinfo *si, - unsigned int *data_bitlen, - unsigned int *priv_bitlen) -{ - unsigned int ngr, gr, ch, i; - enum mad_error result = MAD_ERROR_NONE; - - *data_bitlen = 0; - *priv_bitlen = lsf ? ((nch == 1) ? 1 : 2) : ((nch == 1) ? 5 : 3); - - si->main_data_begin = mad_bit_read(ptr, lsf ? 8 : 9); - si->private_bits = mad_bit_read(ptr, *priv_bitlen); - - ngr = 1; - if (!lsf) { - ngr = 2; - - for (ch = 0; ch < nch; ++ch) - si->scfsi[ch] = mad_bit_read(ptr, 4); - } - - for (gr = 0; gr < ngr; ++gr) { - struct granule *granule = &si->gr[gr]; - - for (ch = 0; ch < nch; ++ch) { - struct channel *channel = &granule->ch[ch]; - - channel->part2_3_length = mad_bit_read(ptr, 12); - channel->big_values = mad_bit_read(ptr, 9); - channel->global_gain = mad_bit_read(ptr, 8); - channel->scalefac_compress = mad_bit_read(ptr, lsf ? 9 : 4); - - *data_bitlen += channel->part2_3_length; - - if (channel->big_values > 288 && result == 0) - result = MAD_ERROR_BADBIGVALUES; - - channel->flags = 0; - - /* window_switching_flag */ - if (mad_bit_read(ptr, 1)) { - channel->block_type = mad_bit_read(ptr, 2); - - if (channel->block_type == 0 && result == 0) - result = MAD_ERROR_BADBLOCKTYPE; - - if (!lsf && channel->block_type == 2 && si->scfsi[ch] && result == 0) - result = MAD_ERROR_BADSCFSI; - - channel->region0_count = 7; - channel->region1_count = 36; - - if (mad_bit_read(ptr, 1)) - channel->flags |= mixed_block_flag; - else if (channel->block_type == 2) - channel->region0_count = 8; - - for (i = 0; i < 2; ++i) - channel->table_select[i] = mad_bit_read(ptr, 5); - -# if defined(DEBUG) - channel->table_select[2] = 4; /* not used */ -# endif - - for (i = 0; i < 3; ++i) - channel->subblock_gain[i] = mad_bit_read(ptr, 3); - } - else { - channel->block_type = 0; - - for (i = 0; i < 3; ++i) - channel->table_select[i] = mad_bit_read(ptr, 5); - - channel->region0_count = mad_bit_read(ptr, 4); - channel->region1_count = mad_bit_read(ptr, 3); - } - - /* [preflag,] scalefac_scale, count1table_select */ - channel->flags |= mad_bit_read(ptr, lsf ? 2 : 3); - } - } - - return result; -} - -/* - * NAME: III_scalefactors_lsf() - * DESCRIPTION: decode channel scalefactors for LSF from a bitstream - */ -static -unsigned int III_scalefactors_lsf(struct mad_bitptr *ptr, - struct channel *channel, - struct channel *gr1ch, int mode_extension) -{ - struct mad_bitptr start; - unsigned int scalefac_compress, index, slen[4], part, n, i; - unsigned char const *nsfb; - - start = *ptr; - - scalefac_compress = channel->scalefac_compress; - index = (channel->block_type == 2) ? - ((channel->flags & mixed_block_flag) ? 2 : 1) : 0; - - if (!((mode_extension & I_STEREO) && gr1ch)) { - if (scalefac_compress < 400) { - slen[0] = (scalefac_compress >> 4) / 5; - slen[1] = (scalefac_compress >> 4) % 5; - slen[2] = (scalefac_compress % 16) >> 2; - slen[3] = scalefac_compress % 4; - - nsfb = nsfb_table[0][index]; - } - else if (scalefac_compress < 500) { - scalefac_compress -= 400; - - slen[0] = (scalefac_compress >> 2) / 5; - slen[1] = (scalefac_compress >> 2) % 5; - slen[2] = scalefac_compress % 4; - slen[3] = 0; - - nsfb = nsfb_table[1][index]; - } - else { - scalefac_compress -= 500; - - slen[0] = scalefac_compress / 3; - slen[1] = scalefac_compress % 3; - slen[2] = 0; - slen[3] = 0; - - channel->flags |= preflag; - - nsfb = nsfb_table[2][index]; - } - - n = 0; - for (part = 0; part < 4; ++part) { - for (i = 0; i < nsfb[part]; ++i) - channel->scalefac[n++] = mad_bit_read(ptr, slen[part]); - } - - while (n < 39) - channel->scalefac[n++] = 0; - } - else { /* (mode_extension & I_STEREO) && gr1ch (i.e. ch == 1) */ - scalefac_compress >>= 1; - - if (scalefac_compress < 180) { - slen[0] = scalefac_compress / 36; - slen[1] = (scalefac_compress % 36) / 6; - slen[2] = (scalefac_compress % 36) % 6; - slen[3] = 0; - - nsfb = nsfb_table[3][index]; - } - else if (scalefac_compress < 244) { - scalefac_compress -= 180; - - slen[0] = (scalefac_compress % 64) >> 4; - slen[1] = (scalefac_compress % 16) >> 2; - slen[2] = scalefac_compress % 4; - slen[3] = 0; - - nsfb = nsfb_table[4][index]; - } - else { - scalefac_compress -= 244; - - slen[0] = scalefac_compress / 3; - slen[1] = scalefac_compress % 3; - slen[2] = 0; - slen[3] = 0; - - nsfb = nsfb_table[5][index]; - } - - n = 0; - for (part = 0; part < 4; ++part) { - unsigned int max, is_pos; - - max = (1 << slen[part]) - 1; - - for (i = 0; i < nsfb[part]; ++i) { - is_pos = mad_bit_read(ptr, slen[part]); - - channel->scalefac[n] = is_pos; - gr1ch->scalefac[n++] = (is_pos == max); - } - } - - while (n < 39) { - channel->scalefac[n] = 0; - gr1ch->scalefac[n++] = 0; /* apparently not illegal */ - } - } - - return mad_bit_length(&start, ptr); -} - -/* - * NAME: III_scalefactors() - * DESCRIPTION: decode channel scalefactors of one granule from a bitstream - */ -static -unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel, - struct channel const *gr0ch, unsigned int scfsi) -{ - struct mad_bitptr start; - unsigned int slen1, slen2, sfbi; - - start = *ptr; - - slen1 = sflen_table[channel->scalefac_compress].slen1; - slen2 = sflen_table[channel->scalefac_compress].slen2; - - if (channel->block_type == 2) { - unsigned int nsfb; - - sfbi = 0; - - nsfb = (channel->flags & mixed_block_flag) ? 8 + 3 * 3 : 6 * 3; - while (nsfb--) - channel->scalefac[sfbi++] = mad_bit_read(ptr, slen1); - - nsfb = 6 * 3; - while (nsfb--) - channel->scalefac[sfbi++] = mad_bit_read(ptr, slen2); - - nsfb = 1 * 3; - while (nsfb--) - channel->scalefac[sfbi++] = 0; - } - else { /* channel->block_type != 2 */ - if (scfsi & 0x8) { - for (sfbi = 0; sfbi < 6; ++sfbi) - channel->scalefac[sfbi] = gr0ch->scalefac[sfbi]; - } - else { - for (sfbi = 0; sfbi < 6; ++sfbi) - channel->scalefac[sfbi] = mad_bit_read(ptr, slen1); - } - - if (scfsi & 0x4) { - for (sfbi = 6; sfbi < 11; ++sfbi) - channel->scalefac[sfbi] = gr0ch->scalefac[sfbi]; - } - else { - for (sfbi = 6; sfbi < 11; ++sfbi) - channel->scalefac[sfbi] = mad_bit_read(ptr, slen1); - } - - if (scfsi & 0x2) { - for (sfbi = 11; sfbi < 16; ++sfbi) - channel->scalefac[sfbi] = gr0ch->scalefac[sfbi]; - } - else { - for (sfbi = 11; sfbi < 16; ++sfbi) - channel->scalefac[sfbi] = mad_bit_read(ptr, slen2); - } - - if (scfsi & 0x1) { - for (sfbi = 16; sfbi < 21; ++sfbi) - channel->scalefac[sfbi] = gr0ch->scalefac[sfbi]; - } - else { - for (sfbi = 16; sfbi < 21; ++sfbi) - channel->scalefac[sfbi] = mad_bit_read(ptr, slen2); - } - - channel->scalefac[21] = 0; - } - - return mad_bit_length(&start, ptr); -} - -/* - * The Layer III formula for requantization and scaling is defined by - * section 2.4.3.4.7.1 of ISO/IEC 11172-3, as follows: - * - * long blocks: - * xr[i] = sign(is[i]) * abs(is[i])^(4/3) * - * 2^((1/4) * (global_gain - 210)) * - * 2^-(scalefac_multiplier * - * (scalefac_l[sfb] + preflag * pretab[sfb])) - * - * short blocks: - * xr[i] = sign(is[i]) * abs(is[i])^(4/3) * - * 2^((1/4) * (global_gain - 210 - 8 * subblock_gain[w])) * - * 2^-(scalefac_multiplier * scalefac_s[sfb][w]) - * - * where: - * scalefac_multiplier = (scalefac_scale + 1) / 2 - * - * The routines III_exponents() and III_requantize() facilitate this - * calculation. - */ - -/* - * NAME: III_exponents() - * DESCRIPTION: calculate scalefactor exponents - */ -static -void III_exponents(struct channel const *channel, - unsigned char const *sfbwidth, signed int exponents[39]) -{ - signed int gain; - unsigned int scalefac_multiplier, sfbi; - - gain = (signed int) channel->global_gain - 210; - scalefac_multiplier = (channel->flags & scalefac_scale) ? 2 : 1; - - if (channel->block_type == 2) { - unsigned int l; - signed int gain0, gain1, gain2; - - sfbi = l = 0; - - if (channel->flags & mixed_block_flag) { - unsigned int premask; - - premask = (channel->flags & preflag) ? ~0 : 0; - - /* long block subbands 0-1 */ - - while (l < 36) { - exponents[sfbi] = gain - - (signed int) ((channel->scalefac[sfbi] + (pretab[sfbi] & premask)) << - scalefac_multiplier); - - l += sfbwidth[sfbi++]; - } - } - - /* this is probably wrong for 8000 Hz short/mixed blocks */ - - gain0 = gain - 8 * (signed int) channel->subblock_gain[0]; - gain1 = gain - 8 * (signed int) channel->subblock_gain[1]; - gain2 = gain - 8 * (signed int) channel->subblock_gain[2]; - - while (l < 576) { - exponents[sfbi + 0] = gain0 - - (signed int) (channel->scalefac[sfbi + 0] << scalefac_multiplier); - exponents[sfbi + 1] = gain1 - - (signed int) (channel->scalefac[sfbi + 1] << scalefac_multiplier); - exponents[sfbi + 2] = gain2 - - (signed int) (channel->scalefac[sfbi + 2] << scalefac_multiplier); - - l += 3 * sfbwidth[sfbi]; - sfbi += 3; - } - } - else { /* channel->block_type != 2 */ - if (channel->flags & preflag) { - for (sfbi = 0; sfbi < 22; ++sfbi) { - exponents[sfbi] = gain - - (signed int) ((channel->scalefac[sfbi] + pretab[sfbi]) << - scalefac_multiplier); - } - } - else { - for (sfbi = 0; sfbi < 22; ++sfbi) { - exponents[sfbi] = gain - - (signed int) (channel->scalefac[sfbi] << scalefac_multiplier); - } - } - } -} - -/* - * NAME: III_requantize() - * DESCRIPTION: requantize one (positive) value - */ -static -mad_fixed_t III_requantize(unsigned int value, signed int exp) -{ - mad_fixed_t requantized; - signed int frac; - struct fixedfloat const *power; - - frac = exp % 4; /* assumes sign(frac) == sign(exp) */ - exp /= 4; - - power = &rq_table[value]; - requantized = power->mantissa; - exp += power->exponent; - - if (exp < 0) { - if (-exp >= sizeof(mad_fixed_t) * CHAR_BIT) { - /* underflow */ - requantized = 0; - } - else { - requantized += 1L << (-exp - 1); - requantized >>= -exp; - } - } - else { - if (exp >= 5) { - /* overflow */ -# if defined(DEBUG) - fprintf(stderr, "requantize overflow (%f * 2^%d)\n", - mad_f_todouble(requantized), exp); -# endif - requantized = MAD_F_MAX; - } - else - requantized <<= exp; - } - - return frac ? mad_f_mul(requantized, root_table[3 + frac]) : requantized; -} - -/* we must take care that sz >= bits and sz < sizeof(long) lest bits == 0 */ -# define MASK(cache, sz, bits) \ - (((cache) >> ((sz) - (bits))) & ((1 << (bits)) - 1)) -# define MASK1BIT(cache, sz) \ - ((cache) & (1 << ((sz) - 1))) - -/* - * NAME: III_huffdecode() - * DESCRIPTION: decode Huffman code words of one channel of one granule - */ -static -enum mad_error III_huffdecode(struct mad_bitptr *ptr, mad_fixed_t xr[576], - struct channel *channel, - unsigned char const *sfbwidth, - unsigned int part2_length) -{ - signed int exponents[39], exp; - signed int const *expptr; - struct mad_bitptr peek; - signed int bits_left, cachesz; - register mad_fixed_t *xrptr; - mad_fixed_t const *sfbound; - register unsigned long bitcache; - - bits_left = (signed) channel->part2_3_length - (signed) part2_length; - if (bits_left < 0) - return MAD_ERROR_BADPART3LEN; - - III_exponents(channel, sfbwidth, exponents); - - peek = *ptr; - mad_bit_skip(ptr, bits_left); - - /* align bit reads to byte boundaries */ - cachesz = mad_bit_bitsleft(&peek); - cachesz += ((32 - 1 - 24) + (24 - cachesz)) & ~7; - - bitcache = mad_bit_read(&peek, cachesz); - bits_left -= cachesz; - - xrptr = &xr[0]; - - /* big_values */ - { - unsigned int region, rcount; - struct hufftable const *entry; - union huffpair const *table; - unsigned int linbits, startbits, big_values, reqhits; - mad_fixed_t reqcache[16]; - - sfbound = xrptr + *sfbwidth++; - rcount = channel->region0_count + 1; - - entry = &mad_huff_pair_table[channel->table_select[region = 0]]; - table = entry->table; - linbits = entry->linbits; - startbits = entry->startbits; - - if (table == 0) - return MAD_ERROR_BADHUFFTABLE; - - expptr = &exponents[0]; - exp = *expptr++; - reqhits = 0; - - big_values = channel->big_values; - - while (big_values-- && cachesz + bits_left > 0) { - union huffpair const *pair; - unsigned int clumpsz, value; - register mad_fixed_t requantized; - - if (xrptr == sfbound) { - sfbound += *sfbwidth++; - - /* change table if region boundary */ - - if (--rcount == 0) { - if (region == 0) - rcount = channel->region1_count + 1; - else - rcount = 0; /* all remaining */ - - entry = &mad_huff_pair_table[channel->table_select[++region]]; - table = entry->table; - linbits = entry->linbits; - startbits = entry->startbits; - - if (table == 0) - return MAD_ERROR_BADHUFFTABLE; - } - - if (exp != *expptr) { - exp = *expptr; - reqhits = 0; - } - - ++expptr; - } - - if (cachesz < 21) { - unsigned int bits; - - bits = ((32 - 1 - 21) + (21 - cachesz)) & ~7; - bitcache = (bitcache << bits) | mad_bit_read(&peek, bits); - cachesz += bits; - bits_left -= bits; - } - - /* hcod (0..19) */ - - clumpsz = startbits; - pair = &table[MASK(bitcache, cachesz, clumpsz)]; - - while (!pair->final) { - cachesz -= clumpsz; - - clumpsz = pair->ptr.bits; - pair = &table[pair->ptr.offset + MASK(bitcache, cachesz, clumpsz)]; - } - - cachesz -= pair->value.hlen; - - if (linbits) { - /* x (0..14) */ - - value = pair->value.x; - - switch (value) { - case 0: - xrptr[0] = 0; - break; - - case 15: - if (cachesz < linbits + 2) { - bitcache = (bitcache << 16) | mad_bit_read(&peek, 16); - cachesz += 16; - bits_left -= 16; - } - - value += MASK(bitcache, cachesz, linbits); - cachesz -= linbits; - - requantized = III_requantize(value, exp); - goto x_final; - - default: - if (reqhits & (1 << value)) - requantized = reqcache[value]; - else { - reqhits |= (1 << value); - requantized = reqcache[value] = III_requantize(value, exp); - } - - x_final: - xrptr[0] = MASK1BIT(bitcache, cachesz--) ? - -requantized : requantized; - } - - /* y (0..14) */ - - value = pair->value.y; - - switch (value) { - case 0: - xrptr[1] = 0; - break; - - case 15: - if (cachesz < linbits + 1) { - bitcache = (bitcache << 16) | mad_bit_read(&peek, 16); - cachesz += 16; - bits_left -= 16; - } - - value += MASK(bitcache, cachesz, linbits); - cachesz -= linbits; - - requantized = III_requantize(value, exp); - goto y_final; - - default: - if (reqhits & (1 << value)) - requantized = reqcache[value]; - else { - reqhits |= (1 << value); - requantized = reqcache[value] = III_requantize(value, exp); - } - - y_final: - xrptr[1] = MASK1BIT(bitcache, cachesz--) ? - -requantized : requantized; - } - } - else { - /* x (0..1) */ - - value = pair->value.x; - - if (value == 0) - xrptr[0] = 0; - else { - if (reqhits & (1 << value)) - requantized = reqcache[value]; - else { - reqhits |= (1 << value); - requantized = reqcache[value] = III_requantize(value, exp); - } - - xrptr[0] = MASK1BIT(bitcache, cachesz--) ? - -requantized : requantized; - } - - /* y (0..1) */ - - value = pair->value.y; - - if (value == 0) - xrptr[1] = 0; - else { - if (reqhits & (1 << value)) - requantized = reqcache[value]; - else { - reqhits |= (1 << value); - requantized = reqcache[value] = III_requantize(value, exp); - } - - xrptr[1] = MASK1BIT(bitcache, cachesz--) ? - -requantized : requantized; - } - } - - xrptr += 2; - } - } - - if (cachesz + bits_left < 0) - return MAD_ERROR_BADHUFFDATA; /* big_values overrun */ - - /* count1 */ - { - union huffquad const *table; - register mad_fixed_t requantized; - - table = mad_huff_quad_table[channel->flags & count1table_select]; - - requantized = III_requantize(1, exp); - - while (cachesz + bits_left > 0 && xrptr <= &xr[572]) { - union huffquad const *quad; - - /* hcod (1..6) */ - - if (cachesz < 10) { - bitcache = (bitcache << 16) | mad_bit_read(&peek, 16); - cachesz += 16; - bits_left -= 16; - } - - quad = &table[MASK(bitcache, cachesz, 4)]; - - /* quad tables guaranteed to have at most one extra lookup */ - if (!quad->final) { - cachesz -= 4; - - quad = &table[quad->ptr.offset + - MASK(bitcache, cachesz, quad->ptr.bits)]; - } - - cachesz -= quad->value.hlen; - - if (xrptr == sfbound) { - sfbound += *sfbwidth++; - - if (exp != *expptr) { - exp = *expptr; - requantized = III_requantize(1, exp); - } - - ++expptr; - } - - /* v (0..1) */ - - xrptr[0] = quad->value.v ? - (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0; - - /* w (0..1) */ - - xrptr[1] = quad->value.w ? - (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0; - - xrptr += 2; - - if (xrptr == sfbound) { - sfbound += *sfbwidth++; - - if (exp != *expptr) { - exp = *expptr; - requantized = III_requantize(1, exp); - } - - ++expptr; - } - - /* x (0..1) */ - - xrptr[0] = quad->value.x ? - (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0; - - /* y (0..1) */ - - xrptr[1] = quad->value.y ? - (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0; - - xrptr += 2; - } - - if (cachesz + bits_left < 0) { -# if 0 && defined(DEBUG) - fprintf(stderr, "huffman count1 overrun (%d bits)\n", - -(cachesz + bits_left)); -# endif - - /* technically the bitstream is misformatted, but apparently - some encoders are just a bit sloppy with stuffing bits */ - - xrptr -= 4; - } - } - - assert(-bits_left <= MAD_BUFFER_GUARD * CHAR_BIT); - -# if 0 && defined(DEBUG) - if (bits_left < 0) - fprintf(stderr, "read %d bits too many\n", -bits_left); - else if (cachesz + bits_left > 0) - fprintf(stderr, "%d stuffing bits\n", cachesz + bits_left); -# endif - - /* rzero */ - while (xrptr < &xr[576]) { - xrptr[0] = 0; - xrptr[1] = 0; - - xrptr += 2; - } - - return MAD_ERROR_NONE; -} - -# undef MASK -# undef MASK1BIT - -/* - * NAME: III_reorder() - * DESCRIPTION: reorder frequency lines of a short block into subband order - */ -static -void III_reorder(mad_fixed_t xr[576], struct channel const *channel, - unsigned char const sfbwidth[39]) -{ - mad_fixed_t tmp[32][3][6]; - unsigned int sb, l, f, w, sbw[3], sw[3]; - - /* this is probably wrong for 8000 Hz mixed blocks */ - - sb = 0; - if (channel->flags & mixed_block_flag) { - sb = 2; - - l = 0; - while (l < 36) - l += *sfbwidth++; - } - - for (w = 0; w < 3; ++w) { - sbw[w] = sb; - sw[w] = 0; - } - - f = *sfbwidth++; - w = 0; - - for (l = 18 * sb; l < 576; ++l) { - if (f-- == 0) { - f = *sfbwidth++ - 1; - w = (w + 1) % 3; - } - - tmp[sbw[w]][w][sw[w]++] = xr[l]; - - if (sw[w] == 6) { - sw[w] = 0; - ++sbw[w]; - } - } - - memcpy(&xr[18 * sb], &tmp[sb], (576 - 18 * sb) * sizeof(mad_fixed_t)); -} - -/* - * NAME: III_stereo() - * DESCRIPTION: perform joint stereo processing on a granule - */ -static -enum mad_error III_stereo(mad_fixed_t xr[2][576], - struct granule const *granule, - struct mad_header *header, - unsigned char const *sfbwidth) -{ - short modes[39]; - unsigned int sfbi, l, n, i; - - if (granule->ch[0].block_type != - granule->ch[1].block_type || - (granule->ch[0].flags & mixed_block_flag) != - (granule->ch[1].flags & mixed_block_flag)) - return MAD_ERROR_BADSTEREO; - - for (i = 0; i < 39; ++i) - modes[i] = header->mode_extension; - - /* intensity stereo */ - - if (header->mode_extension & I_STEREO) { - struct channel const *right_ch = &granule->ch[1]; - mad_fixed_t const *right_xr = xr[1]; - unsigned int is_pos; - - header->flags |= MAD_FLAG_I_STEREO; - - /* first determine which scalefactor bands are to be processed */ - - if (right_ch->block_type == 2) { - unsigned int lower, start, max, bound[3], w; - - lower = start = max = bound[0] = bound[1] = bound[2] = 0; - - sfbi = l = 0; - - if (right_ch->flags & mixed_block_flag) { - while (l < 36) { - n = sfbwidth[sfbi++]; - - for (i = 0; i < n; ++i) { - if (right_xr[i]) { - lower = sfbi; - break; - } - } - - right_xr += n; - l += n; - } - - start = sfbi; - } - - w = 0; - while (l < 576) { - n = sfbwidth[sfbi++]; - - for (i = 0; i < n; ++i) { - if (right_xr[i]) { - max = bound[w] = sfbi; - break; - } - } - - right_xr += n; - l += n; - w = (w + 1) % 3; - } - - if (max) - lower = start; - - /* long blocks */ - - for (i = 0; i < lower; ++i) - modes[i] = header->mode_extension & ~I_STEREO; - - /* short blocks */ - - w = 0; - for (i = start; i < max; ++i) { - if (i < bound[w]) - modes[i] = header->mode_extension & ~I_STEREO; - - w = (w + 1) % 3; - } - } - else { /* right_ch->block_type != 2 */ - unsigned int bound; - - bound = 0; - for (sfbi = l = 0; l < 576; l += n) { - n = sfbwidth[sfbi++]; - - for (i = 0; i < n; ++i) { - if (right_xr[i]) { - bound = sfbi; - break; - } - } - - right_xr += n; - } - - for (i = 0; i < bound; ++i) - modes[i] = header->mode_extension & ~I_STEREO; - } - - /* now do the actual processing */ - - if (header->flags & MAD_FLAG_LSF_EXT) { - unsigned char const *illegal_pos = granule[1].ch[1].scalefac; - mad_fixed_t const *lsf_scale; - - /* intensity_scale */ - lsf_scale = is_lsf_table[right_ch->scalefac_compress & 0x1]; - - for (sfbi = l = 0; l < 576; ++sfbi, l += n) { - n = sfbwidth[sfbi]; - - if (!(modes[sfbi] & I_STEREO)) - continue; - - if (illegal_pos[sfbi]) { - modes[sfbi] &= ~I_STEREO; - continue; - } - - is_pos = right_ch->scalefac[sfbi]; - - for (i = 0; i < n; ++i) { - register mad_fixed_t left; - - left = xr[0][l + i]; - - if (is_pos == 0) - xr[1][l + i] = left; - else { - register mad_fixed_t opposite; - - opposite = mad_f_mul(left, lsf_scale[(is_pos - 1) / 2]); - - if (is_pos & 1) { - xr[0][l + i] = opposite; - xr[1][l + i] = left; - } - else - xr[1][l + i] = opposite; - } - } - } - } - else { /* !(header->flags & MAD_FLAG_LSF_EXT) */ - for (sfbi = l = 0; l < 576; ++sfbi, l += n) { - n = sfbwidth[sfbi]; - - if (!(modes[sfbi] & I_STEREO)) - continue; - - is_pos = right_ch->scalefac[sfbi]; - - if (is_pos >= 7) { /* illegal intensity position */ - modes[sfbi] &= ~I_STEREO; - continue; - } - - for (i = 0; i < n; ++i) { - register mad_fixed_t left; - - left = xr[0][l + i]; - - xr[0][l + i] = mad_f_mul(left, is_table[ is_pos]); - xr[1][l + i] = mad_f_mul(left, is_table[6 - is_pos]); - } - } - } - } - - /* middle/side stereo */ - - if (header->mode_extension & MS_STEREO) { - register mad_fixed_t invsqrt2; - - header->flags |= MAD_FLAG_MS_STEREO; - - invsqrt2 = root_table[3 + -2]; - - for (sfbi = l = 0; l < 576; ++sfbi, l += n) { - n = sfbwidth[sfbi]; - - if (modes[sfbi] != MS_STEREO) - continue; - - for (i = 0; i < n; ++i) { - register mad_fixed_t m, s; - - m = xr[0][l + i]; - s = xr[1][l + i]; - - xr[0][l + i] = mad_f_mul(m + s, invsqrt2); /* l = (m + s) / sqrt(2) */ - xr[1][l + i] = mad_f_mul(m - s, invsqrt2); /* r = (m - s) / sqrt(2) */ - } - } - } - - return MAD_ERROR_NONE; -} - -/* - * NAME: III_aliasreduce() - * DESCRIPTION: perform frequency line alias reduction - */ -static -void III_aliasreduce(mad_fixed_t xr[576], int lines) -{ - mad_fixed_t const *bound; - int i; - - bound = &xr[lines]; - for (xr += 18; xr < bound; xr += 18) { - for (i = 0; i < 8; ++i) { - register mad_fixed_t a, b; - register mad_fixed64hi_t hi = 0; - register mad_fixed64lo_t lo = 0; - - a = xr[-1 - i]; - b = xr[ i]; - -# if defined(ASO_ZEROCHECK) - if (a | b) { -# endif - MAD_F_ML0(hi, lo, a, cs[i]); - MAD_F_MLA(hi, lo, -b, ca[i]); - - xr[-1 - i] = MAD_F_MLZ(hi, lo); - - MAD_F_ML0(hi, lo, b, cs[i]); - MAD_F_MLA(hi, lo, a, ca[i]); - - xr[ i] = MAD_F_MLZ(hi, lo); -# if defined(ASO_ZEROCHECK) - } -# endif - } - } -} - -# if defined(ASO_IMDCT) -void III_imdct_l(mad_fixed_t const [18], mad_fixed_t [36], unsigned int); -# else -# if 1 -static -void fastsdct(mad_fixed_t const x[9], mad_fixed_t y[18]) -{ - mad_fixed_t a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12; - mad_fixed_t a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25; - mad_fixed_t m0, m1, m2, m3, m4, m5, m6, m7; - - enum { - c0 = MAD_F(0x1f838b8d), /* 2 * cos( 1 * PI / 18) */ - c1 = MAD_F(0x1bb67ae8), /* 2 * cos( 3 * PI / 18) */ - c2 = MAD_F(0x18836fa3), /* 2 * cos( 4 * PI / 18) */ - c3 = MAD_F(0x1491b752), /* 2 * cos( 5 * PI / 18) */ - c4 = MAD_F(0x0af1d43a), /* 2 * cos( 7 * PI / 18) */ - c5 = MAD_F(0x058e86a0), /* 2 * cos( 8 * PI / 18) */ - c6 = -MAD_F(0x1e11f642) /* 2 * cos(16 * PI / 18) */ - }; - - a0 = x[3] + x[5]; - a1 = x[3] - x[5]; - a2 = x[6] + x[2]; - a3 = x[6] - x[2]; - a4 = x[1] + x[7]; - a5 = x[1] - x[7]; - a6 = x[8] + x[0]; - a7 = x[8] - x[0]; - - a8 = a0 + a2; - a9 = a0 - a2; - a10 = a0 - a6; - a11 = a2 - a6; - a12 = a8 + a6; - a13 = a1 - a3; - a14 = a13 + a7; - a15 = a3 + a7; - a16 = a1 - a7; - a17 = a1 + a3; - - m0 = mad_f_mul(a17, -c3); - m1 = mad_f_mul(a16, -c0); - m2 = mad_f_mul(a15, -c4); - m3 = mad_f_mul(a14, -c1); - m4 = mad_f_mul(a5, -c1); - m5 = mad_f_mul(a11, -c6); - m6 = mad_f_mul(a10, -c5); - m7 = mad_f_mul(a9, -c2); - - a18 = x[4] + a4; - a19 = 2 * x[4] - a4; - a20 = a19 + m5; - a21 = a19 - m5; - a22 = a19 + m6; - a23 = m4 + m2; - a24 = m4 - m2; - a25 = m4 + m1; - - /* output to every other slot for convenience */ - - y[ 0] = a18 + a12; - y[ 2] = m0 - a25; - y[ 4] = m7 - a20; - y[ 6] = m3; - y[ 8] = a21 - m6; - y[10] = a24 - m1; - y[12] = a12 - 2 * a18; - y[14] = a23 + m0; - y[16] = a22 + m7; -} - -static inline -void sdctII(mad_fixed_t const x[18], mad_fixed_t X[18]) -{ - mad_fixed_t tmp[9]; - int i; - - /* scale[i] = 2 * cos(PI * (2 * i + 1) / (2 * 18)) */ - static mad_fixed_t const scale[9] = { - MAD_F(0x1fe0d3b4), MAD_F(0x1ee8dd47), MAD_F(0x1d007930), - MAD_F(0x1a367e59), MAD_F(0x16a09e66), MAD_F(0x125abcf8), - MAD_F(0x0d8616bc), MAD_F(0x08483ee1), MAD_F(0x02c9fad7) - }; - - /* divide the 18-point SDCT-II into two 9-point SDCT-IIs */ - - /* even input butterfly */ - - for (i = 0; i < 9; i += 3) { - tmp[i + 0] = x[i + 0] + x[18 - (i + 0) - 1]; - tmp[i + 1] = x[i + 1] + x[18 - (i + 1) - 1]; - tmp[i + 2] = x[i + 2] + x[18 - (i + 2) - 1]; - } - - fastsdct(tmp, &X[0]); - - /* odd input butterfly and scaling */ - - for (i = 0; i < 9; i += 3) { - tmp[i + 0] = mad_f_mul(x[i + 0] - x[18 - (i + 0) - 1], scale[i + 0]); - tmp[i + 1] = mad_f_mul(x[i + 1] - x[18 - (i + 1) - 1], scale[i + 1]); - tmp[i + 2] = mad_f_mul(x[i + 2] - x[18 - (i + 2) - 1], scale[i + 2]); - } - - fastsdct(tmp, &X[1]); - - /* output accumulation */ - - for (i = 3; i < 18; i += 8) { - X[i + 0] -= X[(i + 0) - 2]; - X[i + 2] -= X[(i + 2) - 2]; - X[i + 4] -= X[(i + 4) - 2]; - X[i + 6] -= X[(i + 6) - 2]; - } -} - -static inline -void dctIV(mad_fixed_t const y[18], mad_fixed_t X[18]) -{ - mad_fixed_t tmp[18]; - int i; - - /* scale[i] = 2 * cos(PI * (2 * i + 1) / (4 * 18)) */ - static mad_fixed_t const scale[18] = { - MAD_F(0x1ff833fa), MAD_F(0x1fb9ea93), MAD_F(0x1f3dd120), - MAD_F(0x1e84d969), MAD_F(0x1d906bcf), MAD_F(0x1c62648b), - MAD_F(0x1afd100f), MAD_F(0x1963268b), MAD_F(0x1797c6a4), - MAD_F(0x159e6f5b), MAD_F(0x137af940), MAD_F(0x11318ef3), - MAD_F(0x0ec6a507), MAD_F(0x0c3ef153), MAD_F(0x099f61c5), - MAD_F(0x06ed12c5), MAD_F(0x042d4544), MAD_F(0x0165547c) - }; - - /* scaling */ - - for (i = 0; i < 18; i += 3) { - tmp[i + 0] = mad_f_mul(y[i + 0], scale[i + 0]); - tmp[i + 1] = mad_f_mul(y[i + 1], scale[i + 1]); - tmp[i + 2] = mad_f_mul(y[i + 2], scale[i + 2]); - } - - /* SDCT-II */ - - sdctII(tmp, X); - - /* scale reduction and output accumulation */ - - X[0] /= 2; - for (i = 1; i < 17; i += 4) { - X[i + 0] = X[i + 0] / 2 - X[(i + 0) - 1]; - X[i + 1] = X[i + 1] / 2 - X[(i + 1) - 1]; - X[i + 2] = X[i + 2] / 2 - X[(i + 2) - 1]; - X[i + 3] = X[i + 3] / 2 - X[(i + 3) - 1]; - } - X[17] = X[17] / 2 - X[16]; -} - -/* - * NAME: imdct36 - * DESCRIPTION: perform X[18]->x[36] IMDCT using Szu-Wei Lee's fast algorithm - */ -static inline -void imdct36(mad_fixed_t const x[18], mad_fixed_t y[36]) -{ - mad_fixed_t tmp[18]; - int i; - - /* DCT-IV */ - - dctIV(x, tmp); - - /* convert 18-point DCT-IV to 36-point IMDCT */ - - for (i = 0; i < 9; i += 3) { - y[i + 0] = tmp[9 + (i + 0)]; - y[i + 1] = tmp[9 + (i + 1)]; - y[i + 2] = tmp[9 + (i + 2)]; - } - for (i = 9; i < 27; i += 3) { - y[i + 0] = -tmp[36 - (9 + (i + 0)) - 1]; - y[i + 1] = -tmp[36 - (9 + (i + 1)) - 1]; - y[i + 2] = -tmp[36 - (9 + (i + 2)) - 1]; - } - for (i = 27; i < 36; i += 3) { - y[i + 0] = -tmp[(i + 0) - 27]; - y[i + 1] = -tmp[(i + 1) - 27]; - y[i + 2] = -tmp[(i + 2) - 27]; - } -} -# else -/* - * NAME: imdct36 - * DESCRIPTION: perform X[18]->x[36] IMDCT - */ -static inline -void imdct36(mad_fixed_t const X[18], mad_fixed_t x[36]) -{ - mad_fixed_t t0, t1, t2, t3, t4, t5, t6, t7; - mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15; - register mad_fixed64hi_t hi; - register mad_fixed64lo_t lo; - - MAD_F_ML0(hi, lo, X[4], MAD_F(0x0ec835e8)); - MAD_F_MLA(hi, lo, X[13], MAD_F(0x061f78aa)); - - t6 = MAD_F_MLZ(hi, lo); - - MAD_F_MLA(hi, lo, (t14 = X[1] - X[10]), -MAD_F(0x061f78aa)); - MAD_F_MLA(hi, lo, (t15 = X[7] + X[16]), -MAD_F(0x0ec835e8)); - - t0 = MAD_F_MLZ(hi, lo); - - MAD_F_MLA(hi, lo, (t8 = X[0] - X[11] - X[12]), MAD_F(0x0216a2a2)); - MAD_F_MLA(hi, lo, (t9 = X[2] - X[9] - X[14]), MAD_F(0x09bd7ca0)); - MAD_F_MLA(hi, lo, (t10 = X[3] - X[8] - X[15]), -MAD_F(0x0cb19346)); - MAD_F_MLA(hi, lo, (t11 = X[5] - X[6] - X[17]), -MAD_F(0x0fdcf549)); - - x[7] = MAD_F_MLZ(hi, lo); - x[10] = -x[7]; - - MAD_F_ML0(hi, lo, t8, -MAD_F(0x0cb19346)); - MAD_F_MLA(hi, lo, t9, MAD_F(0x0fdcf549)); - MAD_F_MLA(hi, lo, t10, MAD_F(0x0216a2a2)); - MAD_F_MLA(hi, lo, t11, -MAD_F(0x09bd7ca0)); - - x[19] = x[34] = MAD_F_MLZ(hi, lo) - t0; - - t12 = X[0] - X[3] + X[8] - X[11] - X[12] + X[15]; - t13 = X[2] + X[5] - X[6] - X[9] - X[14] - X[17]; - - MAD_F_ML0(hi, lo, t12, -MAD_F(0x0ec835e8)); - MAD_F_MLA(hi, lo, t13, MAD_F(0x061f78aa)); - - x[22] = x[31] = MAD_F_MLZ(hi, lo) + t0; - - MAD_F_ML0(hi, lo, X[1], -MAD_F(0x09bd7ca0)); - MAD_F_MLA(hi, lo, X[7], MAD_F(0x0216a2a2)); - MAD_F_MLA(hi, lo, X[10], -MAD_F(0x0fdcf549)); - MAD_F_MLA(hi, lo, X[16], MAD_F(0x0cb19346)); - - t1 = MAD_F_MLZ(hi, lo) + t6; - - MAD_F_ML0(hi, lo, X[0], MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[2], MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[6], MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[9], MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[14], MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[15], -MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0f9ee890)); - - x[6] = MAD_F_MLZ(hi, lo) + t1; - x[11] = -x[6]; - - MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[2], -MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[3], MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[5], MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[6], MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[8], -MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[12], -MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[14], MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[15], MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[17], MAD_F(0x04cfb0e2)); - - x[23] = x[30] = MAD_F_MLZ(hi, lo) + t1; - - MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[2], MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[3], -MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[5], MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[9], -MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[11], MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[14], MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[15], MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0acf37ad)); - - x[18] = x[35] = MAD_F_MLZ(hi, lo) - t1; - - MAD_F_ML0(hi, lo, X[4], MAD_F(0x061f78aa)); - MAD_F_MLA(hi, lo, X[13], -MAD_F(0x0ec835e8)); - - t7 = MAD_F_MLZ(hi, lo); - - MAD_F_MLA(hi, lo, X[1], -MAD_F(0x0cb19346)); - MAD_F_MLA(hi, lo, X[7], MAD_F(0x0fdcf549)); - MAD_F_MLA(hi, lo, X[10], MAD_F(0x0216a2a2)); - MAD_F_MLA(hi, lo, X[16], -MAD_F(0x09bd7ca0)); - - t2 = MAD_F_MLZ(hi, lo); - - MAD_F_MLA(hi, lo, X[0], MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[2], MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[5], MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[9], MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[12], MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[14], MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[15], MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[17], MAD_F(0x0f426cb5)); - - x[5] = MAD_F_MLZ(hi, lo); - x[12] = -x[5]; - - MAD_F_ML0(hi, lo, X[0], MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[3], MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[6], -MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[8], MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[12], -MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[14], MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[15], MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0bcbe352)); - - x[0] = MAD_F_MLZ(hi, lo) + t2; - x[17] = -x[0]; - - MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[2], -MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[3], -MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[5], MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[8], MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[9], MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[11], -MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[17], -MAD_F(0x03768962)); - - x[24] = x[29] = MAD_F_MLZ(hi, lo) + t2; - - MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0216a2a2)); - MAD_F_MLA(hi, lo, X[7], -MAD_F(0x09bd7ca0)); - MAD_F_MLA(hi, lo, X[10], MAD_F(0x0cb19346)); - MAD_F_MLA(hi, lo, X[16], MAD_F(0x0fdcf549)); - - t3 = MAD_F_MLZ(hi, lo) + t7; - - MAD_F_ML0(hi, lo, X[0], MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[2], MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[3], -MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[5], -MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[6], MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[8], MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[12], MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0ffc19fd)); - - x[8] = MAD_F_MLZ(hi, lo) + t3; - x[9] = -x[8]; - - MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[2], MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[3], MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[8], MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[11], -MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[14], -MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[15], MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[17], MAD_F(0x07635284)); - - x[21] = x[32] = MAD_F_MLZ(hi, lo) + t3; - - MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[2], MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[3], MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[6], -MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[9], MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[12], MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[14], MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[15], -MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0898c779)); - - x[20] = x[33] = MAD_F_MLZ(hi, lo) - t3; - - MAD_F_ML0(hi, lo, t14, -MAD_F(0x0ec835e8)); - MAD_F_MLA(hi, lo, t15, MAD_F(0x061f78aa)); - - t4 = MAD_F_MLZ(hi, lo) - t7; - - MAD_F_ML0(hi, lo, t12, MAD_F(0x061f78aa)); - MAD_F_MLA(hi, lo, t13, MAD_F(0x0ec835e8)); - - x[4] = MAD_F_MLZ(hi, lo) + t4; - x[13] = -x[4]; - - MAD_F_ML0(hi, lo, t8, MAD_F(0x09bd7ca0)); - MAD_F_MLA(hi, lo, t9, -MAD_F(0x0216a2a2)); - MAD_F_MLA(hi, lo, t10, MAD_F(0x0fdcf549)); - MAD_F_MLA(hi, lo, t11, -MAD_F(0x0cb19346)); - - x[1] = MAD_F_MLZ(hi, lo) + t4; - x[16] = -x[1]; - - MAD_F_ML0(hi, lo, t8, -MAD_F(0x0fdcf549)); - MAD_F_MLA(hi, lo, t9, -MAD_F(0x0cb19346)); - MAD_F_MLA(hi, lo, t10, -MAD_F(0x09bd7ca0)); - MAD_F_MLA(hi, lo, t11, -MAD_F(0x0216a2a2)); - - x[25] = x[28] = MAD_F_MLZ(hi, lo) + t4; - - MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0fdcf549)); - MAD_F_MLA(hi, lo, X[7], -MAD_F(0x0cb19346)); - MAD_F_MLA(hi, lo, X[10], -MAD_F(0x09bd7ca0)); - MAD_F_MLA(hi, lo, X[16], -MAD_F(0x0216a2a2)); - - t5 = MAD_F_MLZ(hi, lo) - t6; - - MAD_F_ML0(hi, lo, X[0], MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[2], MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[3], MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[5], MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[6], MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[8], -MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[11], -MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[12], MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[15], MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0d7e8807)); - - x[2] = MAD_F_MLZ(hi, lo) + t5; - x[15] = -x[2]; - - MAD_F_ML0(hi, lo, X[0], MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[2], MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[3], MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[5], MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[6], -MAD_F(0x00b2aa3e)); - MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[9], -MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[11], MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[17], MAD_F(0x0e313245)); - - x[3] = MAD_F_MLZ(hi, lo) + t5; - x[14] = -x[3]; - - MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0ffc19fd)); - MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0f9ee890)); - MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0f426cb5)); - MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0e313245)); - MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0d7e8807)); - MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0bcbe352)); - MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0acf37ad)); - MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0898c779)); - MAD_F_MLA(hi, lo, X[12], -MAD_F(0x07635284)); - MAD_F_MLA(hi, lo, X[14], -MAD_F(0x04cfb0e2)); - MAD_F_MLA(hi, lo, X[15], -MAD_F(0x03768962)); - MAD_F_MLA(hi, lo, X[17], -MAD_F(0x00b2aa3e)); - - x[26] = x[27] = MAD_F_MLZ(hi, lo) + t5; -} -# endif - -/* - * NAME: III_imdct_l() - * DESCRIPTION: perform IMDCT and windowing for long blocks - */ -static -void III_imdct_l(mad_fixed_t const X[18], mad_fixed_t z[36], - unsigned int block_type) -{ - unsigned int i; - - /* IMDCT */ - - imdct36(X, z); - - /* windowing */ - - switch (block_type) { - case 0: /* normal window */ -# if defined(ASO_INTERLEAVE1) - { - register mad_fixed_t tmp1, tmp2; - - tmp1 = window_l[0]; - tmp2 = window_l[1]; - - for (i = 0; i < 34; i += 2) { - z[i + 0] = mad_f_mul(z[i + 0], tmp1); - tmp1 = window_l[i + 2]; - z[i + 1] = mad_f_mul(z[i + 1], tmp2); - tmp2 = window_l[i + 3]; - } - - z[34] = mad_f_mul(z[34], tmp1); - z[35] = mad_f_mul(z[35], tmp2); - } -# elif defined(ASO_INTERLEAVE2) - { - register mad_fixed_t tmp1, tmp2; - - tmp1 = z[0]; - tmp2 = window_l[0]; - - for (i = 0; i < 35; ++i) { - z[i] = mad_f_mul(tmp1, tmp2); - tmp1 = z[i + 1]; - tmp2 = window_l[i + 1]; - } - - z[35] = mad_f_mul(tmp1, tmp2); - } -# elif 1 - for (i = 0; i < 36; i += 4) { - z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]); - z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]); - z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]); - z[i + 3] = mad_f_mul(z[i + 3], window_l[i + 3]); - } -# else - for (i = 0; i < 36; ++i) z[i] = mad_f_mul(z[i], window_l[i]); -# endif - break; - - case 1: /* start block */ - for (i = 0; i < 18; i += 3) { - z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]); - z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]); - z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]); - } - /* (i = 18; i < 24; ++i) z[i] unchanged */ - for (i = 24; i < 30; ++i) z[i] = mad_f_mul(z[i], window_s[i - 18]); - for (i = 30; i < 36; ++i) z[i] = 0; - break; - - case 3: /* stop block */ - for (i = 0; i < 6; ++i) z[i] = 0; - for (i = 6; i < 12; ++i) z[i] = mad_f_mul(z[i], window_s[i - 6]); - /* (i = 12; i < 18; ++i) z[i] unchanged */ - for (i = 18; i < 36; i += 3) { - z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]); - z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]); - z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]); - } - break; - } -} -# endif /* ASO_IMDCT */ - -/* - * NAME: III_imdct_s() - * DESCRIPTION: perform IMDCT and windowing for short blocks - */ -static -void III_imdct_s(mad_fixed_t const X[18], mad_fixed_t z[36]) -{ - mad_fixed_t y[36], *yptr; - mad_fixed_t const *wptr; - int w, i; - register mad_fixed64hi_t hi; - register mad_fixed64lo_t lo; - - /* IMDCT */ - - yptr = &y[0]; - - for (w = 0; w < 3; ++w) { - register mad_fixed_t const (*s)[6]; - - s = imdct_s; - - for (i = 0; i < 3; ++i) { - MAD_F_ML0(hi, lo, X[0], (*s)[0]); - MAD_F_MLA(hi, lo, X[1], (*s)[1]); - MAD_F_MLA(hi, lo, X[2], (*s)[2]); - MAD_F_MLA(hi, lo, X[3], (*s)[3]); - MAD_F_MLA(hi, lo, X[4], (*s)[4]); - MAD_F_MLA(hi, lo, X[5], (*s)[5]); - - yptr[i + 0] = MAD_F_MLZ(hi, lo); - yptr[5 - i] = -yptr[i + 0]; - - ++s; - - MAD_F_ML0(hi, lo, X[0], (*s)[0]); - MAD_F_MLA(hi, lo, X[1], (*s)[1]); - MAD_F_MLA(hi, lo, X[2], (*s)[2]); - MAD_F_MLA(hi, lo, X[3], (*s)[3]); - MAD_F_MLA(hi, lo, X[4], (*s)[4]); - MAD_F_MLA(hi, lo, X[5], (*s)[5]); - - yptr[ i + 6] = MAD_F_MLZ(hi, lo); - yptr[11 - i] = yptr[i + 6]; - - ++s; - } - - yptr += 12; - X += 6; - } - - /* windowing, overlapping and concatenation */ - - yptr = &y[0]; - wptr = &window_s[0]; - - for (i = 0; i < 6; ++i) { - z[i + 0] = 0; - z[i + 6] = mad_f_mul(yptr[ 0 + 0], wptr[0]); - - MAD_F_ML0(hi, lo, yptr[ 0 + 6], wptr[6]); - MAD_F_MLA(hi, lo, yptr[12 + 0], wptr[0]); - - z[i + 12] = MAD_F_MLZ(hi, lo); - - MAD_F_ML0(hi, lo, yptr[12 + 6], wptr[6]); - MAD_F_MLA(hi, lo, yptr[24 + 0], wptr[0]); - - z[i + 18] = MAD_F_MLZ(hi, lo); - - z[i + 24] = mad_f_mul(yptr[24 + 6], wptr[6]); - z[i + 30] = 0; - - ++yptr; - ++wptr; - } -} - -/* - * NAME: III_overlap() - * DESCRIPTION: perform overlap-add of windowed IMDCT outputs - */ -static -void III_overlap(mad_fixed_t const output[36], mad_fixed_t overlap[18], - mad_fixed_t sample[18][32], unsigned int sb) -{ - unsigned int i; - -# if defined(ASO_INTERLEAVE2) - { - register mad_fixed_t tmp1, tmp2; - - tmp1 = overlap[0]; - tmp2 = overlap[1]; - - for (i = 0; i < 16; i += 2) { - sample[i + 0][sb] = output[i + 0 + 0] + tmp1; - overlap[i + 0] = output[i + 0 + 18]; - tmp1 = overlap[i + 2]; - - sample[i + 1][sb] = output[i + 1 + 0] + tmp2; - overlap[i + 1] = output[i + 1 + 18]; - tmp2 = overlap[i + 3]; - } - - sample[16][sb] = output[16 + 0] + tmp1; - overlap[16] = output[16 + 18]; - sample[17][sb] = output[17 + 0] + tmp2; - overlap[17] = output[17 + 18]; - } -# elif 0 - for (i = 0; i < 18; i += 2) { - sample[i + 0][sb] = output[i + 0 + 0] + overlap[i + 0]; - overlap[i + 0] = output[i + 0 + 18]; - - sample[i + 1][sb] = output[i + 1 + 0] + overlap[i + 1]; - overlap[i + 1] = output[i + 1 + 18]; - } -# else - for (i = 0; i < 18; ++i) { - sample[i][sb] = output[i + 0] + overlap[i]; - overlap[i] = output[i + 18]; - } -# endif -} - -/* - * NAME: III_overlap_z() - * DESCRIPTION: perform "overlap-add" of zero IMDCT outputs - */ -static inline -void III_overlap_z(mad_fixed_t overlap[18], - mad_fixed_t sample[18][32], unsigned int sb) -{ - unsigned int i; - -# if defined(ASO_INTERLEAVE2) - { - register mad_fixed_t tmp1, tmp2; - - tmp1 = overlap[0]; - tmp2 = overlap[1]; - - for (i = 0; i < 16; i += 2) { - sample[i + 0][sb] = tmp1; - overlap[i + 0] = 0; - tmp1 = overlap[i + 2]; - - sample[i + 1][sb] = tmp2; - overlap[i + 1] = 0; - tmp2 = overlap[i + 3]; - } - - sample[16][sb] = tmp1; - overlap[16] = 0; - sample[17][sb] = tmp2; - overlap[17] = 0; - } -# else - for (i = 0; i < 18; ++i) { - sample[i][sb] = overlap[i]; - overlap[i] = 0; - } -# endif -} - -/* - * NAME: III_freqinver() - * DESCRIPTION: perform subband frequency inversion for odd sample lines - */ -static -void III_freqinver(mad_fixed_t sample[18][32], unsigned int sb) -{ - unsigned int i; - -# if 1 || defined(ASO_INTERLEAVE1) || defined(ASO_INTERLEAVE2) - { - register mad_fixed_t tmp1, tmp2; - - tmp1 = sample[1][sb]; - tmp2 = sample[3][sb]; - - for (i = 1; i < 13; i += 4) { - sample[i + 0][sb] = -tmp1; - tmp1 = sample[i + 4][sb]; - sample[i + 2][sb] = -tmp2; - tmp2 = sample[i + 6][sb]; - } - - sample[13][sb] = -tmp1; - tmp1 = sample[17][sb]; - sample[15][sb] = -tmp2; - sample[17][sb] = -tmp1; - } -# else - for (i = 1; i < 18; i += 2) - sample[i][sb] = -sample[i][sb]; -# endif -} - -/* - * NAME: III_decode() - * DESCRIPTION: decode frame main_data - */ -static -enum mad_error III_decode(struct mad_bitptr *ptr, struct mad_frame *frame, - struct sideinfo *si, unsigned int nch) -{ - struct mad_header *header = &frame->header; - unsigned int sfreqi, ngr, gr; - - { - unsigned int sfreq; - - sfreq = header->samplerate; - if (header->flags & MAD_FLAG_MPEG_2_5_EXT) - sfreq *= 2; - - /* 48000 => 0, 44100 => 1, 32000 => 2, - 24000 => 3, 22050 => 4, 16000 => 5 */ - sfreqi = ((sfreq >> 7) & 0x000f) + - ((sfreq >> 15) & 0x0001) - 8; - - if (header->flags & MAD_FLAG_MPEG_2_5_EXT) - sfreqi += 3; - } - - /* scalefactors, Huffman decoding, requantization */ - - ngr = (header->flags & MAD_FLAG_LSF_EXT) ? 1 : 2; - - for (gr = 0; gr < ngr; ++gr) { - struct granule *granule = &si->gr[gr]; - unsigned char const *sfbwidth[2]; - mad_fixed_t xr[2][576]; - unsigned int ch; - enum mad_error error; - - for (ch = 0; ch < nch; ++ch) { - struct channel *channel = &granule->ch[ch]; - unsigned int part2_length; - - sfbwidth[ch] = sfbwidth_table[sfreqi].l; - if (channel->block_type == 2) { - sfbwidth[ch] = (channel->flags & mixed_block_flag) ? - sfbwidth_table[sfreqi].m : sfbwidth_table[sfreqi].s; - } - - if (header->flags & MAD_FLAG_LSF_EXT) { - part2_length = III_scalefactors_lsf(ptr, channel, - ch == 0 ? 0 : &si->gr[1].ch[1], - header->mode_extension); - } - else { - part2_length = III_scalefactors(ptr, channel, &si->gr[0].ch[ch], - gr == 0 ? 0 : si->scfsi[ch]); - } - - error = III_huffdecode(ptr, xr[ch], channel, sfbwidth[ch], part2_length); - if (error) - return error; - } - - /* joint stereo processing */ - - if (header->mode == MAD_MODE_JOINT_STEREO && header->mode_extension) { - error = III_stereo(xr, granule, header, sfbwidth[0]); - if (error) - return error; - } - - /* reordering, alias reduction, IMDCT, overlap-add, frequency inversion */ - - for (ch = 0; ch < nch; ++ch) { - struct channel const *channel = &granule->ch[ch]; - mad_fixed_t (*sample)[32] = &frame->sbsample[ch][18 * gr]; - unsigned int sb, l, i, sblimit; - mad_fixed_t output[36]; - - if (channel->block_type == 2) { - III_reorder(xr[ch], channel, sfbwidth[ch]); - -# if !defined(OPT_STRICT) - /* - * According to ISO/IEC 11172-3, "Alias reduction is not applied for - * granules with block_type == 2 (short block)." However, other - * sources suggest alias reduction should indeed be performed on the - * lower two subbands of mixed blocks. Most other implementations do - * this, so by default we will too. - */ - if (channel->flags & mixed_block_flag) - III_aliasreduce(xr[ch], 36); -# endif - } - else - III_aliasreduce(xr[ch], 576); - - l = 0; - - /* subbands 0-1 */ - - if (channel->block_type != 2 || (channel->flags & mixed_block_flag)) { - unsigned int block_type; - - block_type = channel->block_type; - if (channel->flags & mixed_block_flag) - block_type = 0; - - /* long blocks */ - for (sb = 0; sb < 2; ++sb, l += 18) { - III_imdct_l(&xr[ch][l], output, block_type); - III_overlap(output, (*frame->overlap)[ch][sb], sample, sb); - } - } - else { - /* short blocks */ - for (sb = 0; sb < 2; ++sb, l += 18) { - III_imdct_s(&xr[ch][l], output); - III_overlap(output, (*frame->overlap)[ch][sb], sample, sb); - } - } - - III_freqinver(sample, 1); - - /* (nonzero) subbands 2-31 */ - - i = 576; - while (i > 36 && xr[ch][i - 1] == 0) - --i; - - sblimit = 32 - (576 - i) / 18; - - if (channel->block_type != 2) { - /* long blocks */ - for (sb = 2; sb < sblimit; ++sb, l += 18) { - III_imdct_l(&xr[ch][l], output, channel->block_type); - III_overlap(output, (*frame->overlap)[ch][sb], sample, sb); - - if (sb & 1) - III_freqinver(sample, sb); - } - } - else { - /* short blocks */ - for (sb = 2; sb < sblimit; ++sb, l += 18) { - III_imdct_s(&xr[ch][l], output); - III_overlap(output, (*frame->overlap)[ch][sb], sample, sb); - - if (sb & 1) - III_freqinver(sample, sb); - } - } - - /* remaining (zero) subbands */ - - for (sb = sblimit; sb < 32; ++sb) { - III_overlap_z((*frame->overlap)[ch][sb], sample, sb); - - if (sb & 1) - III_freqinver(sample, sb); - } - } - } - - return MAD_ERROR_NONE; -} - -/* - * NAME: layer->III() - * DESCRIPTION: decode a single Layer III frame - */ -int mad_layer_III(struct mad_stream *stream, struct mad_frame *frame) -{ - struct mad_header *header = &frame->header; - unsigned int nch, priv_bitlen, next_md_begin = 0; - unsigned int si_len, data_bitlen, md_len; - unsigned int frame_space, frame_used, frame_free; - struct mad_bitptr ptr; - struct sideinfo si; - enum mad_error error; - int result = 0; - - /* allocate Layer III dynamic structures */ - - if (stream->main_data == 0) { - stream->main_data = malloc(MAD_BUFFER_MDLEN); - if (stream->main_data == 0) { - stream->error = MAD_ERROR_NOMEM; - return -1; - } - } - - if (frame->overlap == 0) { - frame->overlap = calloc(2 * 32 * 18, sizeof(mad_fixed_t)); - if (frame->overlap == 0) { - stream->error = MAD_ERROR_NOMEM; - return -1; - } - } - - nch = MAD_NCHANNELS(header); - si_len = (header->flags & MAD_FLAG_LSF_EXT) ? - (nch == 1 ? 9 : 17) : (nch == 1 ? 17 : 32); - - /* check frame sanity */ - - if (stream->next_frame - mad_bit_nextbyte(&stream->ptr) < - (signed int) si_len) { - stream->error = MAD_ERROR_BADFRAMELEN; - stream->md_len = 0; - return -1; - } - - /* check CRC word */ - - if (header->flags & MAD_FLAG_PROTECTION) { - header->crc_check = - mad_bit_crc(stream->ptr, si_len * CHAR_BIT, header->crc_check); - - if (header->crc_check != header->crc_target && - !(frame->options & MAD_OPTION_IGNORECRC)) { - stream->error = MAD_ERROR_BADCRC; - result = -1; - } - } - - /* decode frame side information */ - - error = III_sideinfo(&stream->ptr, nch, header->flags & MAD_FLAG_LSF_EXT, - &si, &data_bitlen, &priv_bitlen); - if (error && result == 0) { - stream->error = error; - result = -1; - } - - header->flags |= priv_bitlen; - header->private_bits |= si.private_bits; - - /* find main_data of next frame */ - - { - struct mad_bitptr peek; - unsigned long header; - - mad_bit_init(&peek, stream->next_frame); - - header = mad_bit_read(&peek, 32); - if ((header & 0xffe60000L) /* syncword | layer */ == 0xffe20000L) { - if (!(header & 0x00010000L)) /* protection_bit */ - mad_bit_skip(&peek, 16); /* crc_check */ - - next_md_begin = - mad_bit_read(&peek, (header & 0x00080000L) /* ID */ ? 9 : 8); - } - - mad_bit_finish(&peek); - } - - /* find main_data of this frame */ - - frame_space = stream->next_frame - mad_bit_nextbyte(&stream->ptr); - - if (next_md_begin > si.main_data_begin + frame_space) - next_md_begin = 0; - - md_len = si.main_data_begin + frame_space - next_md_begin; - - frame_used = 0; - - if (si.main_data_begin == 0) { - ptr = stream->ptr; - stream->md_len = 0; - - frame_used = md_len; - } - else { - if (si.main_data_begin > stream->md_len) { - if (result == 0) { - stream->error = MAD_ERROR_BADDATAPTR; - result = -1; - } - } - else { - mad_bit_init(&ptr, - *stream->main_data + stream->md_len - si.main_data_begin); - - if (md_len > si.main_data_begin) { - assert(stream->md_len + md_len - - si.main_data_begin <= MAD_BUFFER_MDLEN); - - memcpy(*stream->main_data + stream->md_len, - mad_bit_nextbyte(&stream->ptr), - frame_used = md_len - si.main_data_begin); - stream->md_len += frame_used; - } - } - } - - frame_free = frame_space - frame_used; - - /* decode main_data */ - - if (result == 0) { - error = III_decode(&ptr, frame, &si, nch); - if (error) { - stream->error = error; - result = -1; - } - - /* designate ancillary bits */ - - stream->anc_ptr = ptr; - stream->anc_bitlen = md_len * CHAR_BIT - data_bitlen; - } - -# if 0 && defined(DEBUG) - fprintf(stderr, - "main_data_begin:%u, md_len:%u, frame_free:%u, " - "data_bitlen:%u, anc_bitlen: %u\n", - si.main_data_begin, md_len, frame_free, - data_bitlen, stream->anc_bitlen); -# endif - - /* preload main_data buffer with up to 511 bytes for next frame(s) */ - - if (frame_free >= next_md_begin) { - memcpy(*stream->main_data, - stream->next_frame - next_md_begin, next_md_begin); - stream->md_len = next_md_begin; - } - else { - if (md_len < si.main_data_begin) { - unsigned int extra; - - extra = si.main_data_begin - md_len; - if (extra + frame_free > next_md_begin) - extra = next_md_begin - frame_free; - - if (extra < stream->md_len) { - memmove(*stream->main_data, - *stream->main_data + stream->md_len - extra, extra); - stream->md_len = extra; - } - } - else - stream->md_len = 0; - - memcpy(*stream->main_data + stream->md_len, - stream->next_frame - frame_free, frame_free); - stream->md_len += frame_free; - } - - return result; -} diff --git a/src/libmad/layer3.h b/src/libmad/layer3.h deleted file mode 100644 index 3dca5b3b8..000000000 --- a/src/libmad/layer3.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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: layer3.h,v 1.3 2004/04/22 00:23:06 miguelfreitas Exp $ - */ - -# ifndef LIBMAD_LAYER3_H -# define LIBMAD_LAYER3_H - -# include "stream.h" -# include "frame.h" - -int mad_layer_III(struct mad_stream *, struct mad_frame *); - -# endif diff --git a/src/libmad/qc_table.dat b/src/libmad/qc_table.dat deleted file mode 100644 index 1848e0011..000000000 --- a/src/libmad/qc_table.dat +++ /dev/null @@ -1,77 +0,0 @@ -/* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2001 Robert Leslie - * - * 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: qc_table.dat,v 1.2 2002/04/30 18:46:58 miguelfreitas Exp $ - */ - -/* - * These are the Layer II classes of quantization. - * The table is derived from Table B.4 of ISO/IEC 11172-3. - */ - - { 3, 2, 5, - MAD_F(0x15555555) /* 1.33333333333 => 1.33333333209, e 0.00000000124 */, - MAD_F(0x08000000) /* 0.50000000000 => 0.50000000000, e 0.00000000000 */ }, - { 5, 3, 7, - MAD_F(0x1999999a) /* 1.60000000000 => 1.60000000149, e -0.00000000149 */, - MAD_F(0x08000000) /* 0.50000000000 => 0.50000000000, e 0.00000000000 */ }, - { 7, 0, 3, - MAD_F(0x12492492) /* 1.14285714286 => 1.14285714179, e 0.00000000107 */, - MAD_F(0x04000000) /* 0.25000000000 => 0.25000000000, e 0.00000000000 */ }, - { 9, 4, 10, - MAD_F(0x1c71c71c) /* 1.77777777777 => 1.77777777612, e 0.00000000165 */, - MAD_F(0x08000000) /* 0.50000000000 => 0.50000000000, e 0.00000000000 */ }, - { 15, 0, 4, - MAD_F(0x11111111) /* 1.06666666666 => 1.06666666642, e 0.00000000024 */, - MAD_F(0x02000000) /* 0.12500000000 => 0.12500000000, e 0.00000000000 */ }, - { 31, 0, 5, - MAD_F(0x10842108) /* 1.03225806452 => 1.03225806355, e 0.00000000097 */, - MAD_F(0x01000000) /* 0.06250000000 => 0.06250000000, e 0.00000000000 */ }, - { 63, 0, 6, - MAD_F(0x10410410) /* 1.01587301587 => 1.01587301493, e 0.00000000094 */, - MAD_F(0x00800000) /* 0.03125000000 => 0.03125000000, e 0.00000000000 */ }, - { 127, 0, 7, - MAD_F(0x10204081) /* 1.00787401575 => 1.00787401572, e 0.00000000003 */, - MAD_F(0x00400000) /* 0.01562500000 => 0.01562500000, e 0.00000000000 */ }, - { 255, 0, 8, - MAD_F(0x10101010) /* 1.00392156863 => 1.00392156839, e 0.00000000024 */, - MAD_F(0x00200000) /* 0.00781250000 => 0.00781250000, e 0.00000000000 */ }, - { 511, 0, 9, - MAD_F(0x10080402) /* 1.00195694716 => 1.00195694715, e 0.00000000001 */, - MAD_F(0x00100000) /* 0.00390625000 => 0.00390625000, e 0.00000000000 */ }, - { 1023, 0, 10, - MAD_F(0x10040100) /* 1.00097751711 => 1.00097751617, e 0.00000000094 */, - MAD_F(0x00080000) /* 0.00195312500 => 0.00195312500, e 0.00000000000 */ }, - { 2047, 0, 11, - MAD_F(0x10020040) /* 1.00048851979 => 1.00048851967, e 0.00000000012 */, - MAD_F(0x00040000) /* 0.00097656250 => 0.00097656250, e 0.00000000000 */ }, - { 4095, 0, 12, - MAD_F(0x10010010) /* 1.00024420024 => 1.00024420023, e 0.00000000001 */, - MAD_F(0x00020000) /* 0.00048828125 => 0.00048828125, e 0.00000000000 */ }, - { 8191, 0, 13, - MAD_F(0x10008004) /* 1.00012208522 => 1.00012208521, e 0.00000000001 */, - MAD_F(0x00010000) /* 0.00024414063 => 0.00024414062, e 0.00000000000 */ }, - { 16383, 0, 14, - MAD_F(0x10004001) /* 1.00006103888 => 1.00006103888, e -0.00000000000 */, - MAD_F(0x00008000) /* 0.00012207031 => 0.00012207031, e -0.00000000000 */ }, - { 32767, 0, 15, - MAD_F(0x10002000) /* 1.00003051851 => 1.00003051758, e 0.00000000093 */, - MAD_F(0x00004000) /* 0.00006103516 => 0.00006103516, e 0.00000000000 */ }, - { 65535, 0, 16, - MAD_F(0x10001000) /* 1.00001525902 => 1.00001525879, e 0.00000000023 */, - MAD_F(0x00002000) /* 0.00003051758 => 0.00003051758, e 0.00000000000 */ } diff --git a/src/libmad/rq_table.dat b/src/libmad/rq_table.dat deleted file mode 100644 index 7db10fd33..000000000 --- a/src/libmad/rq_table.dat +++ /dev/null @@ -1,8747 +0,0 @@ -/* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2001 Robert Leslie - * - * 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: rq_table.dat,v 1.2 2002/04/30 18:46:58 miguelfreitas Exp $ - */ - -/* - * This is the lookup table used to compute x^(4/3) for Layer III - * requantization. To maintain the best possible accuracy, the value is - * stored as a normalized mantissa with exponent. The requantization - * algorithm recombines these parts with appropriate scaling. - */ - - /* 0 */ { MAD_F(0x00000000) /* 0.000000000 */, 0 }, - /* 1 */ { MAD_F(0x04000000) /* 0.250000000 */, 2 }, - /* 2 */ { MAD_F(0x050a28be) /* 0.314980262 */, 3 }, - /* 3 */ { MAD_F(0x0453a5cd) /* 0.270421794 */, 4 }, - /* 4 */ { MAD_F(0x06597fa9) /* 0.396850263 */, 4 }, - /* 5 */ { MAD_F(0x04466275) /* 0.267183742 */, 5 }, - /* 6 */ { MAD_F(0x05738c72) /* 0.340710111 */, 5 }, - /* 7 */ { MAD_F(0x06b1fc81) /* 0.418453696 */, 5 }, - /* 8 */ { MAD_F(0x04000000) /* 0.250000000 */, 6 }, - /* 9 */ { MAD_F(0x04ae20d7) /* 0.292511788 */, 6 }, - /* 10 */ { MAD_F(0x0562d694) /* 0.336630420 */, 6 }, - /* 11 */ { MAD_F(0x061dae96) /* 0.382246578 */, 6 }, - /* 12 */ { MAD_F(0x06de47f4) /* 0.429267841 */, 6 }, - /* 13 */ { MAD_F(0x07a44f7a) /* 0.477614858 */, 6 }, - /* 14 */ { MAD_F(0x0437be65) /* 0.263609310 */, 7 }, - /* 15 */ { MAD_F(0x049fc824) /* 0.289009227 */, 7 }, - - /* 16 */ { MAD_F(0x050a28be) /* 0.314980262 */, 7 }, - /* 17 */ { MAD_F(0x0576c6f5) /* 0.341498336 */, 7 }, - /* 18 */ { MAD_F(0x05e58c0b) /* 0.368541759 */, 7 }, - /* 19 */ { MAD_F(0x06566361) /* 0.396090870 */, 7 }, - /* 20 */ { MAD_F(0x06c93a2e) /* 0.424127753 */, 7 }, - /* 21 */ { MAD_F(0x073dff3e) /* 0.452635998 */, 7 }, - /* 22 */ { MAD_F(0x07b4a2bc) /* 0.481600510 */, 7 }, - /* 23 */ { MAD_F(0x04168b05) /* 0.255503674 */, 8 }, - /* 24 */ { MAD_F(0x0453a5cd) /* 0.270421794 */, 8 }, - /* 25 */ { MAD_F(0x04919b6a) /* 0.285548607 */, 8 }, - /* 26 */ { MAD_F(0x04d065fb) /* 0.300878507 */, 8 }, - /* 27 */ { MAD_F(0x05100000) /* 0.316406250 */, 8 }, - /* 28 */ { MAD_F(0x05506451) /* 0.332126919 */, 8 }, - /* 29 */ { MAD_F(0x05918e15) /* 0.348035890 */, 8 }, - /* 30 */ { MAD_F(0x05d378bb) /* 0.364128809 */, 8 }, - /* 31 */ { MAD_F(0x06161ff3) /* 0.380401563 */, 8 }, - - /* 32 */ { MAD_F(0x06597fa9) /* 0.396850263 */, 8 }, - /* 33 */ { MAD_F(0x069d9400) /* 0.413471222 */, 8 }, - /* 34 */ { MAD_F(0x06e2594c) /* 0.430260942 */, 8 }, - /* 35 */ { MAD_F(0x0727cc11) /* 0.447216097 */, 8 }, - /* 36 */ { MAD_F(0x076de8fc) /* 0.464333519 */, 8 }, - /* 37 */ { MAD_F(0x07b4ace3) /* 0.481610189 */, 8 }, - /* 38 */ { MAD_F(0x07fc14bf) /* 0.499043224 */, 8 }, - /* 39 */ { MAD_F(0x04220ed7) /* 0.258314934 */, 9 }, - /* 40 */ { MAD_F(0x04466275) /* 0.267183742 */, 9 }, - /* 41 */ { MAD_F(0x046b03e7) /* 0.276126771 */, 9 }, - /* 42 */ { MAD_F(0x048ff1e8) /* 0.285142811 */, 9 }, - /* 43 */ { MAD_F(0x04b52b3f) /* 0.294230696 */, 9 }, - /* 44 */ { MAD_F(0x04daaec0) /* 0.303389310 */, 9 }, - /* 45 */ { MAD_F(0x05007b49) /* 0.312617576 */, 9 }, - /* 46 */ { MAD_F(0x05268fc6) /* 0.321914457 */, 9 }, - /* 47 */ { MAD_F(0x054ceb2a) /* 0.331278957 */, 9 }, - - /* 48 */ { MAD_F(0x05738c72) /* 0.340710111 */, 9 }, - /* 49 */ { MAD_F(0x059a72a5) /* 0.350206992 */, 9 }, - /* 50 */ { MAD_F(0x05c19cd3) /* 0.359768701 */, 9 }, - /* 51 */ { MAD_F(0x05e90a12) /* 0.369394372 */, 9 }, - /* 52 */ { MAD_F(0x0610b982) /* 0.379083164 */, 9 }, - /* 53 */ { MAD_F(0x0638aa48) /* 0.388834268 */, 9 }, - /* 54 */ { MAD_F(0x0660db91) /* 0.398646895 */, 9 }, - /* 55 */ { MAD_F(0x06894c90) /* 0.408520284 */, 9 }, - /* 56 */ { MAD_F(0x06b1fc81) /* 0.418453696 */, 9 }, - /* 57 */ { MAD_F(0x06daeaa1) /* 0.428446415 */, 9 }, - /* 58 */ { MAD_F(0x07041636) /* 0.438497744 */, 9 }, - /* 59 */ { MAD_F(0x072d7e8b) /* 0.448607009 */, 9 }, - /* 60 */ { MAD_F(0x075722ef) /* 0.458773552 */, 9 }, - /* 61 */ { MAD_F(0x078102b8) /* 0.468996735 */, 9 }, - /* 62 */ { MAD_F(0x07ab1d3e) /* 0.479275937 */, 9 }, - /* 63 */ { MAD_F(0x07d571e0) /* 0.489610555 */, 9 }, - - /* 64 */ { MAD_F(0x04000000) /* 0.250000000 */, 10 }, - /* 65 */ { MAD_F(0x04156381) /* 0.255221850 */, 10 }, - /* 66 */ { MAD_F(0x042ae32a) /* 0.260470548 */, 10 }, - /* 67 */ { MAD_F(0x04407eb1) /* 0.265745823 */, 10 }, - /* 68 */ { MAD_F(0x045635cf) /* 0.271047409 */, 10 }, - /* 69 */ { MAD_F(0x046c083e) /* 0.276375048 */, 10 }, - /* 70 */ { MAD_F(0x0481f5bb) /* 0.281728487 */, 10 }, - /* 71 */ { MAD_F(0x0497fe03) /* 0.287107481 */, 10 }, - /* 72 */ { MAD_F(0x04ae20d7) /* 0.292511788 */, 10 }, - /* 73 */ { MAD_F(0x04c45df6) /* 0.297941173 */, 10 }, - /* 74 */ { MAD_F(0x04dab524) /* 0.303395408 */, 10 }, - /* 75 */ { MAD_F(0x04f12624) /* 0.308874267 */, 10 }, - /* 76 */ { MAD_F(0x0507b0bc) /* 0.314377532 */, 10 }, - /* 77 */ { MAD_F(0x051e54b1) /* 0.319904987 */, 10 }, - /* 78 */ { MAD_F(0x053511cb) /* 0.325456423 */, 10 }, - /* 79 */ { MAD_F(0x054be7d4) /* 0.331031635 */, 10 }, - - /* 80 */ { MAD_F(0x0562d694) /* 0.336630420 */, 10 }, - /* 81 */ { MAD_F(0x0579ddd8) /* 0.342252584 */, 10 }, - /* 82 */ { MAD_F(0x0590fd6c) /* 0.347897931 */, 10 }, - /* 83 */ { MAD_F(0x05a8351c) /* 0.353566275 */, 10 }, - /* 84 */ { MAD_F(0x05bf84b8) /* 0.359257429 */, 10 }, - /* 85 */ { MAD_F(0x05d6ec0e) /* 0.364971213 */, 10 }, - /* 86 */ { MAD_F(0x05ee6aef) /* 0.370707448 */, 10 }, - /* 87 */ { MAD_F(0x0606012b) /* 0.376465960 */, 10 }, - /* 88 */ { MAD_F(0x061dae96) /* 0.382246578 */, 10 }, - /* 89 */ { MAD_F(0x06357302) /* 0.388049134 */, 10 }, - /* 90 */ { MAD_F(0x064d4e43) /* 0.393873464 */, 10 }, - /* 91 */ { MAD_F(0x0665402d) /* 0.399719406 */, 10 }, - /* 92 */ { MAD_F(0x067d4896) /* 0.405586801 */, 10 }, - /* 93 */ { MAD_F(0x06956753) /* 0.411475493 */, 10 }, - /* 94 */ { MAD_F(0x06ad9c3d) /* 0.417385331 */, 10 }, - /* 95 */ { MAD_F(0x06c5e72b) /* 0.423316162 */, 10 }, - - /* 96 */ { MAD_F(0x06de47f4) /* 0.429267841 */, 10 }, - /* 97 */ { MAD_F(0x06f6be73) /* 0.435240221 */, 10 }, - /* 98 */ { MAD_F(0x070f4a80) /* 0.441233161 */, 10 }, - /* 99 */ { MAD_F(0x0727ebf7) /* 0.447246519 */, 10 }, - /* 100 */ { MAD_F(0x0740a2b2) /* 0.453280160 */, 10 }, - /* 101 */ { MAD_F(0x07596e8d) /* 0.459333946 */, 10 }, - /* 102 */ { MAD_F(0x07724f64) /* 0.465407744 */, 10 }, - /* 103 */ { MAD_F(0x078b4514) /* 0.471501425 */, 10 }, - /* 104 */ { MAD_F(0x07a44f7a) /* 0.477614858 */, 10 }, - /* 105 */ { MAD_F(0x07bd6e75) /* 0.483747918 */, 10 }, - /* 106 */ { MAD_F(0x07d6a1e2) /* 0.489900479 */, 10 }, - /* 107 */ { MAD_F(0x07efe9a1) /* 0.496072418 */, 10 }, - /* 108 */ { MAD_F(0x0404a2c9) /* 0.251131807 */, 11 }, - /* 109 */ { MAD_F(0x04115aca) /* 0.254236974 */, 11 }, - /* 110 */ { MAD_F(0x041e1cc4) /* 0.257351652 */, 11 }, - /* 111 */ { MAD_F(0x042ae8a7) /* 0.260475783 */, 11 }, - - /* 112 */ { MAD_F(0x0437be65) /* 0.263609310 */, 11 }, - /* 113 */ { MAD_F(0x04449dee) /* 0.266752177 */, 11 }, - /* 114 */ { MAD_F(0x04518733) /* 0.269904329 */, 11 }, - /* 115 */ { MAD_F(0x045e7a26) /* 0.273065710 */, 11 }, - /* 116 */ { MAD_F(0x046b76b9) /* 0.276236269 */, 11 }, - /* 117 */ { MAD_F(0x04787cdc) /* 0.279415952 */, 11 }, - /* 118 */ { MAD_F(0x04858c83) /* 0.282604707 */, 11 }, - /* 119 */ { MAD_F(0x0492a59f) /* 0.285802482 */, 11 }, - /* 120 */ { MAD_F(0x049fc824) /* 0.289009227 */, 11 }, - /* 121 */ { MAD_F(0x04acf402) /* 0.292224893 */, 11 }, - /* 122 */ { MAD_F(0x04ba292e) /* 0.295449429 */, 11 }, - /* 123 */ { MAD_F(0x04c7679a) /* 0.298682788 */, 11 }, - /* 124 */ { MAD_F(0x04d4af3a) /* 0.301924921 */, 11 }, - /* 125 */ { MAD_F(0x04e20000) /* 0.305175781 */, 11 }, - /* 126 */ { MAD_F(0x04ef59e0) /* 0.308435322 */, 11 }, - /* 127 */ { MAD_F(0x04fcbcce) /* 0.311703498 */, 11 }, - - /* 128 */ { MAD_F(0x050a28be) /* 0.314980262 */, 11 }, - /* 129 */ { MAD_F(0x05179da4) /* 0.318265572 */, 11 }, - /* 130 */ { MAD_F(0x05251b73) /* 0.321559381 */, 11 }, - /* 131 */ { MAD_F(0x0532a220) /* 0.324861647 */, 11 }, - /* 132 */ { MAD_F(0x054031a0) /* 0.328172327 */, 11 }, - /* 133 */ { MAD_F(0x054dc9e7) /* 0.331491377 */, 11 }, - /* 134 */ { MAD_F(0x055b6ae9) /* 0.334818756 */, 11 }, - /* 135 */ { MAD_F(0x0569149c) /* 0.338154423 */, 11 }, - /* 136 */ { MAD_F(0x0576c6f5) /* 0.341498336 */, 11 }, - /* 137 */ { MAD_F(0x058481e9) /* 0.344850455 */, 11 }, - /* 138 */ { MAD_F(0x0592456d) /* 0.348210741 */, 11 }, - /* 139 */ { MAD_F(0x05a01176) /* 0.351579152 */, 11 }, - /* 140 */ { MAD_F(0x05ade5fa) /* 0.354955651 */, 11 }, - /* 141 */ { MAD_F(0x05bbc2ef) /* 0.358340200 */, 11 }, - /* 142 */ { MAD_F(0x05c9a84a) /* 0.361732758 */, 11 }, - /* 143 */ { MAD_F(0x05d79601) /* 0.365133291 */, 11 }, - - /* 144 */ { MAD_F(0x05e58c0b) /* 0.368541759 */, 11 }, - /* 145 */ { MAD_F(0x05f38a5d) /* 0.371958126 */, 11 }, - /* 146 */ { MAD_F(0x060190ee) /* 0.375382356 */, 11 }, - /* 147 */ { MAD_F(0x060f9fb3) /* 0.378814413 */, 11 }, - /* 148 */ { MAD_F(0x061db6a5) /* 0.382254261 */, 11 }, - /* 149 */ { MAD_F(0x062bd5b8) /* 0.385701865 */, 11 }, - /* 150 */ { MAD_F(0x0639fce4) /* 0.389157191 */, 11 }, - /* 151 */ { MAD_F(0x06482c1f) /* 0.392620204 */, 11 }, - /* 152 */ { MAD_F(0x06566361) /* 0.396090870 */, 11 }, - /* 153 */ { MAD_F(0x0664a2a0) /* 0.399569155 */, 11 }, - /* 154 */ { MAD_F(0x0672e9d4) /* 0.403055027 */, 11 }, - /* 155 */ { MAD_F(0x068138f3) /* 0.406548452 */, 11 }, - /* 156 */ { MAD_F(0x068f8ff5) /* 0.410049398 */, 11 }, - /* 157 */ { MAD_F(0x069deed1) /* 0.413557833 */, 11 }, - /* 158 */ { MAD_F(0x06ac557f) /* 0.417073724 */, 11 }, - /* 159 */ { MAD_F(0x06bac3f6) /* 0.420597041 */, 11 }, - - /* 160 */ { MAD_F(0x06c93a2e) /* 0.424127753 */, 11 }, - /* 161 */ { MAD_F(0x06d7b81f) /* 0.427665827 */, 11 }, - /* 162 */ { MAD_F(0x06e63dc0) /* 0.431211234 */, 11 }, - /* 163 */ { MAD_F(0x06f4cb09) /* 0.434763944 */, 11 }, - /* 164 */ { MAD_F(0x07035ff3) /* 0.438323927 */, 11 }, - /* 165 */ { MAD_F(0x0711fc75) /* 0.441891153 */, 11 }, - /* 166 */ { MAD_F(0x0720a087) /* 0.445465593 */, 11 }, - /* 167 */ { MAD_F(0x072f4c22) /* 0.449047217 */, 11 }, - /* 168 */ { MAD_F(0x073dff3e) /* 0.452635998 */, 11 }, - /* 169 */ { MAD_F(0x074cb9d3) /* 0.456231906 */, 11 }, - /* 170 */ { MAD_F(0x075b7bdb) /* 0.459834914 */, 11 }, - /* 171 */ { MAD_F(0x076a454c) /* 0.463444993 */, 11 }, - /* 172 */ { MAD_F(0x07791620) /* 0.467062117 */, 11 }, - /* 173 */ { MAD_F(0x0787ee50) /* 0.470686258 */, 11 }, - /* 174 */ { MAD_F(0x0796cdd4) /* 0.474317388 */, 11 }, - /* 175 */ { MAD_F(0x07a5b4a5) /* 0.477955481 */, 11 }, - - /* 176 */ { MAD_F(0x07b4a2bc) /* 0.481600510 */, 11 }, - /* 177 */ { MAD_F(0x07c39812) /* 0.485252449 */, 11 }, - /* 178 */ { MAD_F(0x07d294a0) /* 0.488911273 */, 11 }, - /* 179 */ { MAD_F(0x07e1985f) /* 0.492576954 */, 11 }, - /* 180 */ { MAD_F(0x07f0a348) /* 0.496249468 */, 11 }, - /* 181 */ { MAD_F(0x07ffb554) /* 0.499928790 */, 11 }, - /* 182 */ { MAD_F(0x0407673f) /* 0.251807447 */, 12 }, - /* 183 */ { MAD_F(0x040ef75e) /* 0.253653877 */, 12 }, - /* 184 */ { MAD_F(0x04168b05) /* 0.255503674 */, 12 }, - /* 185 */ { MAD_F(0x041e2230) /* 0.257356825 */, 12 }, - /* 186 */ { MAD_F(0x0425bcdd) /* 0.259213318 */, 12 }, - /* 187 */ { MAD_F(0x042d5b07) /* 0.261073141 */, 12 }, - /* 188 */ { MAD_F(0x0434fcad) /* 0.262936282 */, 12 }, - /* 189 */ { MAD_F(0x043ca1c9) /* 0.264802730 */, 12 }, - /* 190 */ { MAD_F(0x04444a5a) /* 0.266672472 */, 12 }, - /* 191 */ { MAD_F(0x044bf65d) /* 0.268545497 */, 12 }, - - /* 192 */ { MAD_F(0x0453a5cd) /* 0.270421794 */, 12 }, - /* 193 */ { MAD_F(0x045b58a9) /* 0.272301352 */, 12 }, - /* 194 */ { MAD_F(0x04630eed) /* 0.274184158 */, 12 }, - /* 195 */ { MAD_F(0x046ac896) /* 0.276070203 */, 12 }, - /* 196 */ { MAD_F(0x047285a2) /* 0.277959474 */, 12 }, - /* 197 */ { MAD_F(0x047a460c) /* 0.279851960 */, 12 }, - /* 198 */ { MAD_F(0x048209d3) /* 0.281747652 */, 12 }, - /* 199 */ { MAD_F(0x0489d0f4) /* 0.283646538 */, 12 }, - /* 200 */ { MAD_F(0x04919b6a) /* 0.285548607 */, 12 }, - /* 201 */ { MAD_F(0x04996935) /* 0.287453849 */, 12 }, - /* 202 */ { MAD_F(0x04a13a50) /* 0.289362253 */, 12 }, - /* 203 */ { MAD_F(0x04a90eba) /* 0.291273810 */, 12 }, - /* 204 */ { MAD_F(0x04b0e66e) /* 0.293188507 */, 12 }, - /* 205 */ { MAD_F(0x04b8c16c) /* 0.295106336 */, 12 }, - /* 206 */ { MAD_F(0x04c09faf) /* 0.297027285 */, 12 }, - /* 207 */ { MAD_F(0x04c88135) /* 0.298951346 */, 12 }, - - /* 208 */ { MAD_F(0x04d065fb) /* 0.300878507 */, 12 }, - /* 209 */ { MAD_F(0x04d84dff) /* 0.302808759 */, 12 }, - /* 210 */ { MAD_F(0x04e0393e) /* 0.304742092 */, 12 }, - /* 211 */ { MAD_F(0x04e827b6) /* 0.306678497 */, 12 }, - /* 212 */ { MAD_F(0x04f01963) /* 0.308617963 */, 12 }, - /* 213 */ { MAD_F(0x04f80e44) /* 0.310560480 */, 12 }, - /* 214 */ { MAD_F(0x05000655) /* 0.312506041 */, 12 }, - /* 215 */ { MAD_F(0x05080195) /* 0.314454634 */, 12 }, - /* 216 */ { MAD_F(0x05100000) /* 0.316406250 */, 12 }, - /* 217 */ { MAD_F(0x05180194) /* 0.318360880 */, 12 }, - /* 218 */ { MAD_F(0x0520064f) /* 0.320318516 */, 12 }, - /* 219 */ { MAD_F(0x05280e2d) /* 0.322279147 */, 12 }, - /* 220 */ { MAD_F(0x0530192e) /* 0.324242764 */, 12 }, - /* 221 */ { MAD_F(0x0538274e) /* 0.326209359 */, 12 }, - /* 222 */ { MAD_F(0x0540388a) /* 0.328178922 */, 12 }, - /* 223 */ { MAD_F(0x05484ce2) /* 0.330151445 */, 12 }, - - /* 224 */ { MAD_F(0x05506451) /* 0.332126919 */, 12 }, - /* 225 */ { MAD_F(0x05587ed5) /* 0.334105334 */, 12 }, - /* 226 */ { MAD_F(0x05609c6e) /* 0.336086683 */, 12 }, - /* 227 */ { MAD_F(0x0568bd17) /* 0.338070956 */, 12 }, - /* 228 */ { MAD_F(0x0570e0cf) /* 0.340058145 */, 12 }, - /* 229 */ { MAD_F(0x05790793) /* 0.342048241 */, 12 }, - /* 230 */ { MAD_F(0x05813162) /* 0.344041237 */, 12 }, - /* 231 */ { MAD_F(0x05895e39) /* 0.346037122 */, 12 }, - /* 232 */ { MAD_F(0x05918e15) /* 0.348035890 */, 12 }, - /* 233 */ { MAD_F(0x0599c0f4) /* 0.350037532 */, 12 }, - /* 234 */ { MAD_F(0x05a1f6d5) /* 0.352042040 */, 12 }, - /* 235 */ { MAD_F(0x05aa2fb5) /* 0.354049405 */, 12 }, - /* 236 */ { MAD_F(0x05b26b92) /* 0.356059619 */, 12 }, - /* 237 */ { MAD_F(0x05baaa69) /* 0.358072674 */, 12 }, - /* 238 */ { MAD_F(0x05c2ec39) /* 0.360088563 */, 12 }, - /* 239 */ { MAD_F(0x05cb3100) /* 0.362107278 */, 12 }, - - /* 240 */ { MAD_F(0x05d378bb) /* 0.364128809 */, 12 }, - /* 241 */ { MAD_F(0x05dbc368) /* 0.366153151 */, 12 }, - /* 242 */ { MAD_F(0x05e41105) /* 0.368180294 */, 12 }, - /* 243 */ { MAD_F(0x05ec6190) /* 0.370210231 */, 12 }, - /* 244 */ { MAD_F(0x05f4b507) /* 0.372242955 */, 12 }, - /* 245 */ { MAD_F(0x05fd0b68) /* 0.374278458 */, 12 }, - /* 246 */ { MAD_F(0x060564b1) /* 0.376316732 */, 12 }, - /* 247 */ { MAD_F(0x060dc0e0) /* 0.378357769 */, 12 }, - /* 248 */ { MAD_F(0x06161ff3) /* 0.380401563 */, 12 }, - /* 249 */ { MAD_F(0x061e81e8) /* 0.382448106 */, 12 }, - /* 250 */ { MAD_F(0x0626e6bc) /* 0.384497391 */, 12 }, - /* 251 */ { MAD_F(0x062f4e6f) /* 0.386549409 */, 12 }, - /* 252 */ { MAD_F(0x0637b8fd) /* 0.388604155 */, 12 }, - /* 253 */ { MAD_F(0x06402666) /* 0.390661620 */, 12 }, - /* 254 */ { MAD_F(0x064896a7) /* 0.392721798 */, 12 }, - /* 255 */ { MAD_F(0x065109be) /* 0.394784681 */, 12 }, - - /* 256 */ { MAD_F(0x06597fa9) /* 0.396850263 */, 12 }, - /* 257 */ { MAD_F(0x0661f867) /* 0.398918536 */, 12 }, - /* 258 */ { MAD_F(0x066a73f5) /* 0.400989493 */, 12 }, - /* 259 */ { MAD_F(0x0672f252) /* 0.403063128 */, 12 }, - /* 260 */ { MAD_F(0x067b737c) /* 0.405139433 */, 12 }, - /* 261 */ { MAD_F(0x0683f771) /* 0.407218402 */, 12 }, - /* 262 */ { MAD_F(0x068c7e2f) /* 0.409300027 */, 12 }, - /* 263 */ { MAD_F(0x069507b5) /* 0.411384303 */, 12 }, - /* 264 */ { MAD_F(0x069d9400) /* 0.413471222 */, 12 }, - /* 265 */ { MAD_F(0x06a6230f) /* 0.415560778 */, 12 }, - /* 266 */ { MAD_F(0x06aeb4e0) /* 0.417652964 */, 12 }, - /* 267 */ { MAD_F(0x06b74971) /* 0.419747773 */, 12 }, - /* 268 */ { MAD_F(0x06bfe0c0) /* 0.421845199 */, 12 }, - /* 269 */ { MAD_F(0x06c87acc) /* 0.423945235 */, 12 }, - /* 270 */ { MAD_F(0x06d11794) /* 0.426047876 */, 12 }, - /* 271 */ { MAD_F(0x06d9b714) /* 0.428153114 */, 12 }, - - /* 272 */ { MAD_F(0x06e2594c) /* 0.430260942 */, 12 }, - /* 273 */ { MAD_F(0x06eafe3a) /* 0.432371356 */, 12 }, - /* 274 */ { MAD_F(0x06f3a5dc) /* 0.434484348 */, 12 }, - /* 275 */ { MAD_F(0x06fc5030) /* 0.436599912 */, 12 }, - /* 276 */ { MAD_F(0x0704fd35) /* 0.438718042 */, 12 }, - /* 277 */ { MAD_F(0x070dacea) /* 0.440838732 */, 12 }, - /* 278 */ { MAD_F(0x07165f4b) /* 0.442961975 */, 12 }, - /* 279 */ { MAD_F(0x071f1459) /* 0.445087765 */, 12 }, - /* 280 */ { MAD_F(0x0727cc11) /* 0.447216097 */, 12 }, - /* 281 */ { MAD_F(0x07308671) /* 0.449346964 */, 12 }, - /* 282 */ { MAD_F(0x07394378) /* 0.451480360 */, 12 }, - /* 283 */ { MAD_F(0x07420325) /* 0.453616280 */, 12 }, - /* 284 */ { MAD_F(0x074ac575) /* 0.455754717 */, 12 }, - /* 285 */ { MAD_F(0x07538a67) /* 0.457895665 */, 12 }, - /* 286 */ { MAD_F(0x075c51fa) /* 0.460039119 */, 12 }, - /* 287 */ { MAD_F(0x07651c2c) /* 0.462185072 */, 12 }, - - /* 288 */ { MAD_F(0x076de8fc) /* 0.464333519 */, 12 }, - /* 289 */ { MAD_F(0x0776b867) /* 0.466484455 */, 12 }, - /* 290 */ { MAD_F(0x077f8a6d) /* 0.468637872 */, 12 }, - /* 291 */ { MAD_F(0x07885f0b) /* 0.470793767 */, 12 }, - /* 292 */ { MAD_F(0x07913641) /* 0.472952132 */, 12 }, - /* 293 */ { MAD_F(0x079a100c) /* 0.475112962 */, 12 }, - /* 294 */ { MAD_F(0x07a2ec6c) /* 0.477276252 */, 12 }, - /* 295 */ { MAD_F(0x07abcb5f) /* 0.479441997 */, 12 }, - /* 296 */ { MAD_F(0x07b4ace3) /* 0.481610189 */, 12 }, - /* 297 */ { MAD_F(0x07bd90f6) /* 0.483780825 */, 12 }, - /* 298 */ { MAD_F(0x07c67798) /* 0.485953899 */, 12 }, - /* 299 */ { MAD_F(0x07cf60c7) /* 0.488129404 */, 12 }, - /* 300 */ { MAD_F(0x07d84c81) /* 0.490307336 */, 12 }, - /* 301 */ { MAD_F(0x07e13ac5) /* 0.492487690 */, 12 }, - /* 302 */ { MAD_F(0x07ea2b92) /* 0.494670459 */, 12 }, - /* 303 */ { MAD_F(0x07f31ee6) /* 0.496855639 */, 12 }, - - /* 304 */ { MAD_F(0x07fc14bf) /* 0.499043224 */, 12 }, - /* 305 */ { MAD_F(0x0402868e) /* 0.250616605 */, 13 }, - /* 306 */ { MAD_F(0x040703ff) /* 0.251712795 */, 13 }, - /* 307 */ { MAD_F(0x040b82b0) /* 0.252810180 */, 13 }, - /* 308 */ { MAD_F(0x041002a1) /* 0.253908756 */, 13 }, - /* 309 */ { MAD_F(0x041483d1) /* 0.255008523 */, 13 }, - /* 310 */ { MAD_F(0x04190640) /* 0.256109476 */, 13 }, - /* 311 */ { MAD_F(0x041d89ed) /* 0.257211614 */, 13 }, - /* 312 */ { MAD_F(0x04220ed7) /* 0.258314934 */, 13 }, - /* 313 */ { MAD_F(0x042694fe) /* 0.259419433 */, 13 }, - /* 314 */ { MAD_F(0x042b1c60) /* 0.260525110 */, 13 }, - /* 315 */ { MAD_F(0x042fa4fe) /* 0.261631960 */, 13 }, - /* 316 */ { MAD_F(0x04342ed7) /* 0.262739982 */, 13 }, - /* 317 */ { MAD_F(0x0438b9e9) /* 0.263849174 */, 13 }, - /* 318 */ { MAD_F(0x043d4635) /* 0.264959533 */, 13 }, - /* 319 */ { MAD_F(0x0441d3b9) /* 0.266071056 */, 13 }, - - /* 320 */ { MAD_F(0x04466275) /* 0.267183742 */, 13 }, - /* 321 */ { MAD_F(0x044af269) /* 0.268297587 */, 13 }, - /* 322 */ { MAD_F(0x044f8393) /* 0.269412589 */, 13 }, - /* 323 */ { MAD_F(0x045415f3) /* 0.270528746 */, 13 }, - /* 324 */ { MAD_F(0x0458a989) /* 0.271646056 */, 13 }, - /* 325 */ { MAD_F(0x045d3e53) /* 0.272764515 */, 13 }, - /* 326 */ { MAD_F(0x0461d451) /* 0.273884123 */, 13 }, - /* 327 */ { MAD_F(0x04666b83) /* 0.275004875 */, 13 }, - /* 328 */ { MAD_F(0x046b03e7) /* 0.276126771 */, 13 }, - /* 329 */ { MAD_F(0x046f9d7e) /* 0.277249808 */, 13 }, - /* 330 */ { MAD_F(0x04743847) /* 0.278373983 */, 13 }, - /* 331 */ { MAD_F(0x0478d440) /* 0.279499294 */, 13 }, - /* 332 */ { MAD_F(0x047d716a) /* 0.280625739 */, 13 }, - /* 333 */ { MAD_F(0x04820fc3) /* 0.281753315 */, 13 }, - /* 334 */ { MAD_F(0x0486af4c) /* 0.282882021 */, 13 }, - /* 335 */ { MAD_F(0x048b5003) /* 0.284011853 */, 13 }, - - /* 336 */ { MAD_F(0x048ff1e8) /* 0.285142811 */, 13 }, - /* 337 */ { MAD_F(0x049494fb) /* 0.286274891 */, 13 }, - /* 338 */ { MAD_F(0x0499393a) /* 0.287408091 */, 13 }, - /* 339 */ { MAD_F(0x049ddea5) /* 0.288542409 */, 13 }, - /* 340 */ { MAD_F(0x04a2853c) /* 0.289677844 */, 13 }, - /* 341 */ { MAD_F(0x04a72cfe) /* 0.290814392 */, 13 }, - /* 342 */ { MAD_F(0x04abd5ea) /* 0.291952051 */, 13 }, - /* 343 */ { MAD_F(0x04b08000) /* 0.293090820 */, 13 }, - /* 344 */ { MAD_F(0x04b52b3f) /* 0.294230696 */, 13 }, - /* 345 */ { MAD_F(0x04b9d7a7) /* 0.295371678 */, 13 }, - /* 346 */ { MAD_F(0x04be8537) /* 0.296513762 */, 13 }, - /* 347 */ { MAD_F(0x04c333ee) /* 0.297656947 */, 13 }, - /* 348 */ { MAD_F(0x04c7e3cc) /* 0.298801231 */, 13 }, - /* 349 */ { MAD_F(0x04cc94d1) /* 0.299946611 */, 13 }, - /* 350 */ { MAD_F(0x04d146fb) /* 0.301093085 */, 13 }, - /* 351 */ { MAD_F(0x04d5fa4b) /* 0.302240653 */, 13 }, - - /* 352 */ { MAD_F(0x04daaec0) /* 0.303389310 */, 13 }, - /* 353 */ { MAD_F(0x04df6458) /* 0.304539056 */, 13 }, - /* 354 */ { MAD_F(0x04e41b14) /* 0.305689888 */, 13 }, - /* 355 */ { MAD_F(0x04e8d2f3) /* 0.306841804 */, 13 }, - /* 356 */ { MAD_F(0x04ed8bf5) /* 0.307994802 */, 13 }, - /* 357 */ { MAD_F(0x04f24618) /* 0.309148880 */, 13 }, - /* 358 */ { MAD_F(0x04f7015d) /* 0.310304037 */, 13 }, - /* 359 */ { MAD_F(0x04fbbdc3) /* 0.311460269 */, 13 }, - /* 360 */ { MAD_F(0x05007b49) /* 0.312617576 */, 13 }, - /* 361 */ { MAD_F(0x050539ef) /* 0.313775954 */, 13 }, - /* 362 */ { MAD_F(0x0509f9b4) /* 0.314935403 */, 13 }, - /* 363 */ { MAD_F(0x050eba98) /* 0.316095920 */, 13 }, - /* 364 */ { MAD_F(0x05137c9a) /* 0.317257503 */, 13 }, - /* 365 */ { MAD_F(0x05183fba) /* 0.318420150 */, 13 }, - /* 366 */ { MAD_F(0x051d03f7) /* 0.319583859 */, 13 }, - /* 367 */ { MAD_F(0x0521c950) /* 0.320748629 */, 13 }, - - /* 368 */ { MAD_F(0x05268fc6) /* 0.321914457 */, 13 }, - /* 369 */ { MAD_F(0x052b5757) /* 0.323081342 */, 13 }, - /* 370 */ { MAD_F(0x05302003) /* 0.324249281 */, 13 }, - /* 371 */ { MAD_F(0x0534e9ca) /* 0.325418273 */, 13 }, - /* 372 */ { MAD_F(0x0539b4ab) /* 0.326588316 */, 13 }, - /* 373 */ { MAD_F(0x053e80a6) /* 0.327759407 */, 13 }, - /* 374 */ { MAD_F(0x05434db9) /* 0.328931546 */, 13 }, - /* 375 */ { MAD_F(0x05481be5) /* 0.330104730 */, 13 }, - /* 376 */ { MAD_F(0x054ceb2a) /* 0.331278957 */, 13 }, - /* 377 */ { MAD_F(0x0551bb85) /* 0.332454225 */, 13 }, - /* 378 */ { MAD_F(0x05568cf8) /* 0.333630533 */, 13 }, - /* 379 */ { MAD_F(0x055b5f81) /* 0.334807879 */, 13 }, - /* 380 */ { MAD_F(0x05603321) /* 0.335986261 */, 13 }, - /* 381 */ { MAD_F(0x056507d6) /* 0.337165677 */, 13 }, - /* 382 */ { MAD_F(0x0569dda0) /* 0.338346125 */, 13 }, - /* 383 */ { MAD_F(0x056eb47f) /* 0.339527604 */, 13 }, - - /* 384 */ { MAD_F(0x05738c72) /* 0.340710111 */, 13 }, - /* 385 */ { MAD_F(0x05786578) /* 0.341893646 */, 13 }, - /* 386 */ { MAD_F(0x057d3f92) /* 0.343078205 */, 13 }, - /* 387 */ { MAD_F(0x05821abf) /* 0.344263788 */, 13 }, - /* 388 */ { MAD_F(0x0586f6fd) /* 0.345450393 */, 13 }, - /* 389 */ { MAD_F(0x058bd44e) /* 0.346638017 */, 13 }, - /* 390 */ { MAD_F(0x0590b2b0) /* 0.347826659 */, 13 }, - /* 391 */ { MAD_F(0x05959222) /* 0.349016318 */, 13 }, - /* 392 */ { MAD_F(0x059a72a5) /* 0.350206992 */, 13 }, - /* 393 */ { MAD_F(0x059f5438) /* 0.351398678 */, 13 }, - /* 394 */ { MAD_F(0x05a436da) /* 0.352591376 */, 13 }, - /* 395 */ { MAD_F(0x05a91a8c) /* 0.353785083 */, 13 }, - /* 396 */ { MAD_F(0x05adff4c) /* 0.354979798 */, 13 }, - /* 397 */ { MAD_F(0x05b2e51a) /* 0.356175519 */, 13 }, - /* 398 */ { MAD_F(0x05b7cbf5) /* 0.357372244 */, 13 }, - /* 399 */ { MAD_F(0x05bcb3de) /* 0.358569972 */, 13 }, - - /* 400 */ { MAD_F(0x05c19cd3) /* 0.359768701 */, 13 }, - /* 401 */ { MAD_F(0x05c686d5) /* 0.360968429 */, 13 }, - /* 402 */ { MAD_F(0x05cb71e2) /* 0.362169156 */, 13 }, - /* 403 */ { MAD_F(0x05d05dfb) /* 0.363370878 */, 13 }, - /* 404 */ { MAD_F(0x05d54b1f) /* 0.364573594 */, 13 }, - /* 405 */ { MAD_F(0x05da394d) /* 0.365777304 */, 13 }, - /* 406 */ { MAD_F(0x05df2885) /* 0.366982004 */, 13 }, - /* 407 */ { MAD_F(0x05e418c7) /* 0.368187694 */, 13 }, - /* 408 */ { MAD_F(0x05e90a12) /* 0.369394372 */, 13 }, - /* 409 */ { MAD_F(0x05edfc66) /* 0.370602036 */, 13 }, - /* 410 */ { MAD_F(0x05f2efc2) /* 0.371810684 */, 13 }, - /* 411 */ { MAD_F(0x05f7e426) /* 0.373020316 */, 13 }, - /* 412 */ { MAD_F(0x05fcd992) /* 0.374230929 */, 13 }, - /* 413 */ { MAD_F(0x0601d004) /* 0.375442522 */, 13 }, - /* 414 */ { MAD_F(0x0606c77d) /* 0.376655093 */, 13 }, - /* 415 */ { MAD_F(0x060bbffd) /* 0.377868641 */, 13 }, - - /* 416 */ { MAD_F(0x0610b982) /* 0.379083164 */, 13 }, - /* 417 */ { MAD_F(0x0615b40c) /* 0.380298661 */, 13 }, - /* 418 */ { MAD_F(0x061aaf9c) /* 0.381515130 */, 13 }, - /* 419 */ { MAD_F(0x061fac2f) /* 0.382732569 */, 13 }, - /* 420 */ { MAD_F(0x0624a9c7) /* 0.383950977 */, 13 }, - /* 421 */ { MAD_F(0x0629a863) /* 0.385170352 */, 13 }, - /* 422 */ { MAD_F(0x062ea802) /* 0.386390694 */, 13 }, - /* 423 */ { MAD_F(0x0633a8a3) /* 0.387611999 */, 13 }, - /* 424 */ { MAD_F(0x0638aa48) /* 0.388834268 */, 13 }, - /* 425 */ { MAD_F(0x063dacee) /* 0.390057497 */, 13 }, - /* 426 */ { MAD_F(0x0642b096) /* 0.391281687 */, 13 }, - /* 427 */ { MAD_F(0x0647b53f) /* 0.392506834 */, 13 }, - /* 428 */ { MAD_F(0x064cbae9) /* 0.393732939 */, 13 }, - /* 429 */ { MAD_F(0x0651c193) /* 0.394959999 */, 13 }, - /* 430 */ { MAD_F(0x0656c93d) /* 0.396188012 */, 13 }, - /* 431 */ { MAD_F(0x065bd1e7) /* 0.397416978 */, 13 }, - - /* 432 */ { MAD_F(0x0660db91) /* 0.398646895 */, 13 }, - /* 433 */ { MAD_F(0x0665e639) /* 0.399877761 */, 13 }, - /* 434 */ { MAD_F(0x066af1df) /* 0.401109575 */, 13 }, - /* 435 */ { MAD_F(0x066ffe84) /* 0.402342335 */, 13 }, - /* 436 */ { MAD_F(0x06750c26) /* 0.403576041 */, 13 }, - /* 437 */ { MAD_F(0x067a1ac6) /* 0.404810690 */, 13 }, - /* 438 */ { MAD_F(0x067f2a62) /* 0.406046281 */, 13 }, - /* 439 */ { MAD_F(0x06843afb) /* 0.407282813 */, 13 }, - /* 440 */ { MAD_F(0x06894c90) /* 0.408520284 */, 13 }, - /* 441 */ { MAD_F(0x068e5f21) /* 0.409758693 */, 13 }, - /* 442 */ { MAD_F(0x069372ae) /* 0.410998038 */, 13 }, - /* 443 */ { MAD_F(0x06988735) /* 0.412238319 */, 13 }, - /* 444 */ { MAD_F(0x069d9cb7) /* 0.413479532 */, 13 }, - /* 445 */ { MAD_F(0x06a2b333) /* 0.414721679 */, 13 }, - /* 446 */ { MAD_F(0x06a7caa9) /* 0.415964756 */, 13 }, - /* 447 */ { MAD_F(0x06ace318) /* 0.417208762 */, 13 }, - - /* 448 */ { MAD_F(0x06b1fc81) /* 0.418453696 */, 13 }, - /* 449 */ { MAD_F(0x06b716e2) /* 0.419699557 */, 13 }, - /* 450 */ { MAD_F(0x06bc323b) /* 0.420946343 */, 13 }, - /* 451 */ { MAD_F(0x06c14e8d) /* 0.422194054 */, 13 }, - /* 452 */ { MAD_F(0x06c66bd6) /* 0.423442686 */, 13 }, - /* 453 */ { MAD_F(0x06cb8a17) /* 0.424692240 */, 13 }, - /* 454 */ { MAD_F(0x06d0a94e) /* 0.425942714 */, 13 }, - /* 455 */ { MAD_F(0x06d5c97c) /* 0.427194106 */, 13 }, - /* 456 */ { MAD_F(0x06daeaa1) /* 0.428446415 */, 13 }, - /* 457 */ { MAD_F(0x06e00cbb) /* 0.429699640 */, 13 }, - /* 458 */ { MAD_F(0x06e52fca) /* 0.430953779 */, 13 }, - /* 459 */ { MAD_F(0x06ea53cf) /* 0.432208832 */, 13 }, - /* 460 */ { MAD_F(0x06ef78c8) /* 0.433464796 */, 13 }, - /* 461 */ { MAD_F(0x06f49eb6) /* 0.434721671 */, 13 }, - /* 462 */ { MAD_F(0x06f9c597) /* 0.435979455 */, 13 }, - /* 463 */ { MAD_F(0x06feed6d) /* 0.437238146 */, 13 }, - - /* 464 */ { MAD_F(0x07041636) /* 0.438497744 */, 13 }, - /* 465 */ { MAD_F(0x07093ff2) /* 0.439758248 */, 13 }, - /* 466 */ { MAD_F(0x070e6aa0) /* 0.441019655 */, 13 }, - /* 467 */ { MAD_F(0x07139641) /* 0.442281965 */, 13 }, - /* 468 */ { MAD_F(0x0718c2d3) /* 0.443545176 */, 13 }, - /* 469 */ { MAD_F(0x071df058) /* 0.444809288 */, 13 }, - /* 470 */ { MAD_F(0x07231ecd) /* 0.446074298 */, 13 }, - /* 471 */ { MAD_F(0x07284e34) /* 0.447340205 */, 13 }, - /* 472 */ { MAD_F(0x072d7e8b) /* 0.448607009 */, 13 }, - /* 473 */ { MAD_F(0x0732afd2) /* 0.449874708 */, 13 }, - /* 474 */ { MAD_F(0x0737e209) /* 0.451143300 */, 13 }, - /* 475 */ { MAD_F(0x073d1530) /* 0.452412785 */, 13 }, - /* 476 */ { MAD_F(0x07424946) /* 0.453683161 */, 13 }, - /* 477 */ { MAD_F(0x07477e4b) /* 0.454954427 */, 13 }, - /* 478 */ { MAD_F(0x074cb43e) /* 0.456226581 */, 13 }, - /* 479 */ { MAD_F(0x0751eb20) /* 0.457499623 */, 13 }, - - /* 480 */ { MAD_F(0x075722ef) /* 0.458773552 */, 13 }, - /* 481 */ { MAD_F(0x075c5bac) /* 0.460048365 */, 13 }, - /* 482 */ { MAD_F(0x07619557) /* 0.461324062 */, 13 }, - /* 483 */ { MAD_F(0x0766cfee) /* 0.462600642 */, 13 }, - /* 484 */ { MAD_F(0x076c0b72) /* 0.463878102 */, 13 }, - /* 485 */ { MAD_F(0x077147e2) /* 0.465156443 */, 13 }, - /* 486 */ { MAD_F(0x0776853e) /* 0.466435663 */, 13 }, - /* 487 */ { MAD_F(0x077bc385) /* 0.467715761 */, 13 }, - /* 488 */ { MAD_F(0x078102b8) /* 0.468996735 */, 13 }, - /* 489 */ { MAD_F(0x078642d6) /* 0.470278584 */, 13 }, - /* 490 */ { MAD_F(0x078b83de) /* 0.471561307 */, 13 }, - /* 491 */ { MAD_F(0x0790c5d1) /* 0.472844904 */, 13 }, - /* 492 */ { MAD_F(0x079608ae) /* 0.474129372 */, 13 }, - /* 493 */ { MAD_F(0x079b4c74) /* 0.475414710 */, 13 }, - /* 494 */ { MAD_F(0x07a09124) /* 0.476700918 */, 13 }, - /* 495 */ { MAD_F(0x07a5d6bd) /* 0.477987994 */, 13 }, - - /* 496 */ { MAD_F(0x07ab1d3e) /* 0.479275937 */, 13 }, - /* 497 */ { MAD_F(0x07b064a8) /* 0.480564746 */, 13 }, - /* 498 */ { MAD_F(0x07b5acfb) /* 0.481854420 */, 13 }, - /* 499 */ { MAD_F(0x07baf635) /* 0.483144957 */, 13 }, - /* 500 */ { MAD_F(0x07c04056) /* 0.484436356 */, 13 }, - /* 501 */ { MAD_F(0x07c58b5f) /* 0.485728617 */, 13 }, - /* 502 */ { MAD_F(0x07cad74e) /* 0.487021738 */, 13 }, - /* 503 */ { MAD_F(0x07d02424) /* 0.488315717 */, 13 }, - /* 504 */ { MAD_F(0x07d571e0) /* 0.489610555 */, 13 }, - /* 505 */ { MAD_F(0x07dac083) /* 0.490906249 */, 13 }, - /* 506 */ { MAD_F(0x07e0100a) /* 0.492202799 */, 13 }, - /* 507 */ { MAD_F(0x07e56078) /* 0.493500203 */, 13 }, - /* 508 */ { MAD_F(0x07eab1ca) /* 0.494798460 */, 13 }, - /* 509 */ { MAD_F(0x07f00401) /* 0.496097570 */, 13 }, - /* 510 */ { MAD_F(0x07f5571d) /* 0.497397530 */, 13 }, - /* 511 */ { MAD_F(0x07faab1c) /* 0.498698341 */, 13 }, - - /* 512 */ { MAD_F(0x04000000) /* 0.250000000 */, 14 }, - /* 513 */ { MAD_F(0x0402aae3) /* 0.250651254 */, 14 }, - /* 514 */ { MAD_F(0x04055638) /* 0.251302930 */, 14 }, - /* 515 */ { MAD_F(0x040801ff) /* 0.251955030 */, 14 }, - /* 516 */ { MAD_F(0x040aae37) /* 0.252607552 */, 14 }, - /* 517 */ { MAD_F(0x040d5ae0) /* 0.253260495 */, 14 }, - /* 518 */ { MAD_F(0x041007fa) /* 0.253913860 */, 14 }, - /* 519 */ { MAD_F(0x0412b586) /* 0.254567645 */, 14 }, - /* 520 */ { MAD_F(0x04156381) /* 0.255221850 */, 14 }, - /* 521 */ { MAD_F(0x041811ee) /* 0.255876475 */, 14 }, - /* 522 */ { MAD_F(0x041ac0cb) /* 0.256531518 */, 14 }, - /* 523 */ { MAD_F(0x041d7018) /* 0.257186980 */, 14 }, - /* 524 */ { MAD_F(0x04201fd5) /* 0.257842860 */, 14 }, - /* 525 */ { MAD_F(0x0422d003) /* 0.258499157 */, 14 }, - /* 526 */ { MAD_F(0x042580a0) /* 0.259155872 */, 14 }, - /* 527 */ { MAD_F(0x042831ad) /* 0.259813002 */, 14 }, - - /* 528 */ { MAD_F(0x042ae32a) /* 0.260470548 */, 14 }, - /* 529 */ { MAD_F(0x042d9516) /* 0.261128510 */, 14 }, - /* 530 */ { MAD_F(0x04304772) /* 0.261786886 */, 14 }, - /* 531 */ { MAD_F(0x0432fa3d) /* 0.262445676 */, 14 }, - /* 532 */ { MAD_F(0x0435ad76) /* 0.263104880 */, 14 }, - /* 533 */ { MAD_F(0x0438611f) /* 0.263764497 */, 14 }, - /* 534 */ { MAD_F(0x043b1536) /* 0.264424527 */, 14 }, - /* 535 */ { MAD_F(0x043dc9bc) /* 0.265084969 */, 14 }, - /* 536 */ { MAD_F(0x04407eb1) /* 0.265745823 */, 14 }, - /* 537 */ { MAD_F(0x04433414) /* 0.266407088 */, 14 }, - /* 538 */ { MAD_F(0x0445e9e5) /* 0.267068763 */, 14 }, - /* 539 */ { MAD_F(0x0448a024) /* 0.267730848 */, 14 }, - /* 540 */ { MAD_F(0x044b56d1) /* 0.268393343 */, 14 }, - /* 541 */ { MAD_F(0x044e0dec) /* 0.269056248 */, 14 }, - /* 542 */ { MAD_F(0x0450c575) /* 0.269719560 */, 14 }, - /* 543 */ { MAD_F(0x04537d6b) /* 0.270383281 */, 14 }, - - /* 544 */ { MAD_F(0x045635cf) /* 0.271047409 */, 14 }, - /* 545 */ { MAD_F(0x0458ee9f) /* 0.271711944 */, 14 }, - /* 546 */ { MAD_F(0x045ba7dd) /* 0.272376886 */, 14 }, - /* 547 */ { MAD_F(0x045e6188) /* 0.273042234 */, 14 }, - /* 548 */ { MAD_F(0x04611ba0) /* 0.273707988 */, 14 }, - /* 549 */ { MAD_F(0x0463d625) /* 0.274374147 */, 14 }, - /* 550 */ { MAD_F(0x04669116) /* 0.275040710 */, 14 }, - /* 551 */ { MAD_F(0x04694c74) /* 0.275707677 */, 14 }, - /* 552 */ { MAD_F(0x046c083e) /* 0.276375048 */, 14 }, - /* 553 */ { MAD_F(0x046ec474) /* 0.277042822 */, 14 }, - /* 554 */ { MAD_F(0x04718116) /* 0.277710999 */, 14 }, - /* 555 */ { MAD_F(0x04743e25) /* 0.278379578 */, 14 }, - /* 556 */ { MAD_F(0x0476fb9f) /* 0.279048558 */, 14 }, - /* 557 */ { MAD_F(0x0479b984) /* 0.279717940 */, 14 }, - /* 558 */ { MAD_F(0x047c77d6) /* 0.280387722 */, 14 }, - /* 559 */ { MAD_F(0x047f3693) /* 0.281057905 */, 14 }, - - /* 560 */ { MAD_F(0x0481f5bb) /* 0.281728487 */, 14 }, - /* 561 */ { MAD_F(0x0484b54e) /* 0.282399469 */, 14 }, - /* 562 */ { MAD_F(0x0487754c) /* 0.283070849 */, 14 }, - /* 563 */ { MAD_F(0x048a35b6) /* 0.283742628 */, 14 }, - /* 564 */ { MAD_F(0x048cf68a) /* 0.284414805 */, 14 }, - /* 565 */ { MAD_F(0x048fb7c8) /* 0.285087379 */, 14 }, - /* 566 */ { MAD_F(0x04927972) /* 0.285760350 */, 14 }, - /* 567 */ { MAD_F(0x04953b85) /* 0.286433717 */, 14 }, - /* 568 */ { MAD_F(0x0497fe03) /* 0.287107481 */, 14 }, - /* 569 */ { MAD_F(0x049ac0eb) /* 0.287781640 */, 14 }, - /* 570 */ { MAD_F(0x049d843e) /* 0.288456194 */, 14 }, - /* 571 */ { MAD_F(0x04a047fa) /* 0.289131142 */, 14 }, - /* 572 */ { MAD_F(0x04a30c20) /* 0.289806485 */, 14 }, - /* 573 */ { MAD_F(0x04a5d0af) /* 0.290482221 */, 14 }, - /* 574 */ { MAD_F(0x04a895a8) /* 0.291158351 */, 14 }, - /* 575 */ { MAD_F(0x04ab5b0b) /* 0.291834873 */, 14 }, - - /* 576 */ { MAD_F(0x04ae20d7) /* 0.292511788 */, 14 }, - /* 577 */ { MAD_F(0x04b0e70c) /* 0.293189094 */, 14 }, - /* 578 */ { MAD_F(0x04b3adaa) /* 0.293866792 */, 14 }, - /* 579 */ { MAD_F(0x04b674b1) /* 0.294544881 */, 14 }, - /* 580 */ { MAD_F(0x04b93c21) /* 0.295223360 */, 14 }, - /* 581 */ { MAD_F(0x04bc03fa) /* 0.295902229 */, 14 }, - /* 582 */ { MAD_F(0x04becc3b) /* 0.296581488 */, 14 }, - /* 583 */ { MAD_F(0x04c194e4) /* 0.297261136 */, 14 }, - /* 584 */ { MAD_F(0x04c45df6) /* 0.297941173 */, 14 }, - /* 585 */ { MAD_F(0x04c72771) /* 0.298621598 */, 14 }, - /* 586 */ { MAD_F(0x04c9f153) /* 0.299302411 */, 14 }, - /* 587 */ { MAD_F(0x04ccbb9d) /* 0.299983611 */, 14 }, - /* 588 */ { MAD_F(0x04cf864f) /* 0.300665198 */, 14 }, - /* 589 */ { MAD_F(0x04d25169) /* 0.301347172 */, 14 }, - /* 590 */ { MAD_F(0x04d51ceb) /* 0.302029532 */, 14 }, - /* 591 */ { MAD_F(0x04d7e8d4) /* 0.302712277 */, 14 }, - - /* 592 */ { MAD_F(0x04dab524) /* 0.303395408 */, 14 }, - /* 593 */ { MAD_F(0x04dd81dc) /* 0.304078923 */, 14 }, - /* 594 */ { MAD_F(0x04e04efb) /* 0.304762823 */, 14 }, - /* 595 */ { MAD_F(0x04e31c81) /* 0.305447106 */, 14 }, - /* 596 */ { MAD_F(0x04e5ea6e) /* 0.306131773 */, 14 }, - /* 597 */ { MAD_F(0x04e8b8c2) /* 0.306816823 */, 14 }, - /* 598 */ { MAD_F(0x04eb877c) /* 0.307502256 */, 14 }, - /* 599 */ { MAD_F(0x04ee569d) /* 0.308188071 */, 14 }, - /* 600 */ { MAD_F(0x04f12624) /* 0.308874267 */, 14 }, - /* 601 */ { MAD_F(0x04f3f612) /* 0.309560845 */, 14 }, - /* 602 */ { MAD_F(0x04f6c666) /* 0.310247804 */, 14 }, - /* 603 */ { MAD_F(0x04f99721) /* 0.310935143 */, 14 }, - /* 604 */ { MAD_F(0x04fc6841) /* 0.311622862 */, 14 }, - /* 605 */ { MAD_F(0x04ff39c7) /* 0.312310961 */, 14 }, - /* 606 */ { MAD_F(0x05020bb3) /* 0.312999439 */, 14 }, - /* 607 */ { MAD_F(0x0504de05) /* 0.313688296 */, 14 }, - - /* 608 */ { MAD_F(0x0507b0bc) /* 0.314377532 */, 14 }, - /* 609 */ { MAD_F(0x050a83d8) /* 0.315067145 */, 14 }, - /* 610 */ { MAD_F(0x050d575b) /* 0.315757136 */, 14 }, - /* 611 */ { MAD_F(0x05102b42) /* 0.316447504 */, 14 }, - /* 612 */ { MAD_F(0x0512ff8e) /* 0.317138249 */, 14 }, - /* 613 */ { MAD_F(0x0515d440) /* 0.317829370 */, 14 }, - /* 614 */ { MAD_F(0x0518a956) /* 0.318520867 */, 14 }, - /* 615 */ { MAD_F(0x051b7ed1) /* 0.319212739 */, 14 }, - /* 616 */ { MAD_F(0x051e54b1) /* 0.319904987 */, 14 }, - /* 617 */ { MAD_F(0x05212af5) /* 0.320597609 */, 14 }, - /* 618 */ { MAD_F(0x0524019e) /* 0.321290606 */, 14 }, - /* 619 */ { MAD_F(0x0526d8ab) /* 0.321983976 */, 14 }, - /* 620 */ { MAD_F(0x0529b01d) /* 0.322677720 */, 14 }, - /* 621 */ { MAD_F(0x052c87f2) /* 0.323371837 */, 14 }, - /* 622 */ { MAD_F(0x052f602c) /* 0.324066327 */, 14 }, - /* 623 */ { MAD_F(0x053238ca) /* 0.324761189 */, 14 }, - - /* 624 */ { MAD_F(0x053511cb) /* 0.325456423 */, 14 }, - /* 625 */ { MAD_F(0x0537eb30) /* 0.326152028 */, 14 }, - /* 626 */ { MAD_F(0x053ac4f9) /* 0.326848005 */, 14 }, - /* 627 */ { MAD_F(0x053d9f25) /* 0.327544352 */, 14 }, - /* 628 */ { MAD_F(0x054079b5) /* 0.328241070 */, 14 }, - /* 629 */ { MAD_F(0x054354a8) /* 0.328938157 */, 14 }, - /* 630 */ { MAD_F(0x05462ffe) /* 0.329635614 */, 14 }, - /* 631 */ { MAD_F(0x05490bb7) /* 0.330333440 */, 14 }, - /* 632 */ { MAD_F(0x054be7d4) /* 0.331031635 */, 14 }, - /* 633 */ { MAD_F(0x054ec453) /* 0.331730198 */, 14 }, - /* 634 */ { MAD_F(0x0551a134) /* 0.332429129 */, 14 }, - /* 635 */ { MAD_F(0x05547e79) /* 0.333128427 */, 14 }, - /* 636 */ { MAD_F(0x05575c20) /* 0.333828093 */, 14 }, - /* 637 */ { MAD_F(0x055a3a2a) /* 0.334528126 */, 14 }, - /* 638 */ { MAD_F(0x055d1896) /* 0.335228525 */, 14 }, - /* 639 */ { MAD_F(0x055ff764) /* 0.335929290 */, 14 }, - - /* 640 */ { MAD_F(0x0562d694) /* 0.336630420 */, 14 }, - /* 641 */ { MAD_F(0x0565b627) /* 0.337331916 */, 14 }, - /* 642 */ { MAD_F(0x0568961b) /* 0.338033777 */, 14 }, - /* 643 */ { MAD_F(0x056b7671) /* 0.338736002 */, 14 }, - /* 644 */ { MAD_F(0x056e5729) /* 0.339438592 */, 14 }, - /* 645 */ { MAD_F(0x05713843) /* 0.340141545 */, 14 }, - /* 646 */ { MAD_F(0x057419be) /* 0.340844862 */, 14 }, - /* 647 */ { MAD_F(0x0576fb9a) /* 0.341548541 */, 14 }, - /* 648 */ { MAD_F(0x0579ddd8) /* 0.342252584 */, 14 }, - /* 649 */ { MAD_F(0x057cc077) /* 0.342956988 */, 14 }, - /* 650 */ { MAD_F(0x057fa378) /* 0.343661754 */, 14 }, - /* 651 */ { MAD_F(0x058286d9) /* 0.344366882 */, 14 }, - /* 652 */ { MAD_F(0x05856a9b) /* 0.345072371 */, 14 }, - /* 653 */ { MAD_F(0x05884ebe) /* 0.345778221 */, 14 }, - /* 654 */ { MAD_F(0x058b3342) /* 0.346484431 */, 14 }, - /* 655 */ { MAD_F(0x058e1827) /* 0.347191002 */, 14 }, - - /* 656 */ { MAD_F(0x0590fd6c) /* 0.347897931 */, 14 }, - /* 657 */ { MAD_F(0x0593e311) /* 0.348605221 */, 14 }, - /* 658 */ { MAD_F(0x0596c917) /* 0.349312869 */, 14 }, - /* 659 */ { MAD_F(0x0599af7d) /* 0.350020876 */, 14 }, - /* 660 */ { MAD_F(0x059c9643) /* 0.350729240 */, 14 }, - /* 661 */ { MAD_F(0x059f7d6a) /* 0.351437963 */, 14 }, - /* 662 */ { MAD_F(0x05a264f0) /* 0.352147044 */, 14 }, - /* 663 */ { MAD_F(0x05a54cd6) /* 0.352856481 */, 14 }, - /* 664 */ { MAD_F(0x05a8351c) /* 0.353566275 */, 14 }, - /* 665 */ { MAD_F(0x05ab1dc2) /* 0.354276426 */, 14 }, - /* 666 */ { MAD_F(0x05ae06c7) /* 0.354986932 */, 14 }, - /* 667 */ { MAD_F(0x05b0f02b) /* 0.355697795 */, 14 }, - /* 668 */ { MAD_F(0x05b3d9f0) /* 0.356409012 */, 14 }, - /* 669 */ { MAD_F(0x05b6c413) /* 0.357120585 */, 14 }, - /* 670 */ { MAD_F(0x05b9ae95) /* 0.357832512 */, 14 }, - /* 671 */ { MAD_F(0x05bc9977) /* 0.358544794 */, 14 }, - - /* 672 */ { MAD_F(0x05bf84b8) /* 0.359257429 */, 14 }, - /* 673 */ { MAD_F(0x05c27057) /* 0.359970419 */, 14 }, - /* 674 */ { MAD_F(0x05c55c56) /* 0.360683761 */, 14 }, - /* 675 */ { MAD_F(0x05c848b3) /* 0.361397456 */, 14 }, - /* 676 */ { MAD_F(0x05cb356e) /* 0.362111504 */, 14 }, - /* 677 */ { MAD_F(0x05ce2289) /* 0.362825904 */, 14 }, - /* 678 */ { MAD_F(0x05d11001) /* 0.363540655 */, 14 }, - /* 679 */ { MAD_F(0x05d3fdd8) /* 0.364255759 */, 14 }, - /* 680 */ { MAD_F(0x05d6ec0e) /* 0.364971213 */, 14 }, - /* 681 */ { MAD_F(0x05d9daa1) /* 0.365687018 */, 14 }, - /* 682 */ { MAD_F(0x05dcc993) /* 0.366403174 */, 14 }, - /* 683 */ { MAD_F(0x05dfb8e2) /* 0.367119680 */, 14 }, - /* 684 */ { MAD_F(0x05e2a890) /* 0.367836535 */, 14 }, - /* 685 */ { MAD_F(0x05e5989b) /* 0.368553740 */, 14 }, - /* 686 */ { MAD_F(0x05e88904) /* 0.369271294 */, 14 }, - /* 687 */ { MAD_F(0x05eb79cb) /* 0.369989197 */, 14 }, - - /* 688 */ { MAD_F(0x05ee6aef) /* 0.370707448 */, 14 }, - /* 689 */ { MAD_F(0x05f15c70) /* 0.371426047 */, 14 }, - /* 690 */ { MAD_F(0x05f44e4f) /* 0.372144994 */, 14 }, - /* 691 */ { MAD_F(0x05f7408b) /* 0.372864289 */, 14 }, - /* 692 */ { MAD_F(0x05fa3324) /* 0.373583930 */, 14 }, - /* 693 */ { MAD_F(0x05fd261b) /* 0.374303918 */, 14 }, - /* 694 */ { MAD_F(0x0600196e) /* 0.375024253 */, 14 }, - /* 695 */ { MAD_F(0x06030d1e) /* 0.375744934 */, 14 }, - /* 696 */ { MAD_F(0x0606012b) /* 0.376465960 */, 14 }, - /* 697 */ { MAD_F(0x0608f595) /* 0.377187332 */, 14 }, - /* 698 */ { MAD_F(0x060bea5c) /* 0.377909049 */, 14 }, - /* 699 */ { MAD_F(0x060edf7f) /* 0.378631110 */, 14 }, - /* 700 */ { MAD_F(0x0611d4fe) /* 0.379353516 */, 14 }, - /* 701 */ { MAD_F(0x0614cada) /* 0.380076266 */, 14 }, - /* 702 */ { MAD_F(0x0617c112) /* 0.380799360 */, 14 }, - /* 703 */ { MAD_F(0x061ab7a6) /* 0.381522798 */, 14 }, - - /* 704 */ { MAD_F(0x061dae96) /* 0.382246578 */, 14 }, - /* 705 */ { MAD_F(0x0620a5e3) /* 0.382970701 */, 14 }, - /* 706 */ { MAD_F(0x06239d8b) /* 0.383695167 */, 14 }, - /* 707 */ { MAD_F(0x0626958f) /* 0.384419975 */, 14 }, - /* 708 */ { MAD_F(0x06298def) /* 0.385145124 */, 14 }, - /* 709 */ { MAD_F(0x062c86aa) /* 0.385870615 */, 14 }, - /* 710 */ { MAD_F(0x062f7fc1) /* 0.386596448 */, 14 }, - /* 711 */ { MAD_F(0x06327934) /* 0.387322621 */, 14 }, - /* 712 */ { MAD_F(0x06357302) /* 0.388049134 */, 14 }, - /* 713 */ { MAD_F(0x06386d2b) /* 0.388775988 */, 14 }, - /* 714 */ { MAD_F(0x063b67b0) /* 0.389503182 */, 14 }, - /* 715 */ { MAD_F(0x063e6290) /* 0.390230715 */, 14 }, - /* 716 */ { MAD_F(0x06415dcb) /* 0.390958588 */, 14 }, - /* 717 */ { MAD_F(0x06445960) /* 0.391686799 */, 14 }, - /* 718 */ { MAD_F(0x06475551) /* 0.392415349 */, 14 }, - /* 719 */ { MAD_F(0x064a519c) /* 0.393144238 */, 14 }, - - /* 720 */ { MAD_F(0x064d4e43) /* 0.393873464 */, 14 }, - /* 721 */ { MAD_F(0x06504b44) /* 0.394603028 */, 14 }, - /* 722 */ { MAD_F(0x0653489f) /* 0.395332930 */, 14 }, - /* 723 */ { MAD_F(0x06564655) /* 0.396063168 */, 14 }, - /* 724 */ { MAD_F(0x06594465) /* 0.396793743 */, 14 }, - /* 725 */ { MAD_F(0x065c42d0) /* 0.397524655 */, 14 }, - /* 726 */ { MAD_F(0x065f4195) /* 0.398255903 */, 14 }, - /* 727 */ { MAD_F(0x066240b4) /* 0.398987487 */, 14 }, - /* 728 */ { MAD_F(0x0665402d) /* 0.399719406 */, 14 }, - /* 729 */ { MAD_F(0x06684000) /* 0.400451660 */, 14 }, - /* 730 */ { MAD_F(0x066b402d) /* 0.401184249 */, 14 }, - /* 731 */ { MAD_F(0x066e40b3) /* 0.401917173 */, 14 }, - /* 732 */ { MAD_F(0x06714194) /* 0.402650431 */, 14 }, - /* 733 */ { MAD_F(0x067442ce) /* 0.403384024 */, 14 }, - /* 734 */ { MAD_F(0x06774462) /* 0.404117949 */, 14 }, - /* 735 */ { MAD_F(0x067a464f) /* 0.404852209 */, 14 }, - - /* 736 */ { MAD_F(0x067d4896) /* 0.405586801 */, 14 }, - /* 737 */ { MAD_F(0x06804b36) /* 0.406321726 */, 14 }, - /* 738 */ { MAD_F(0x06834e2f) /* 0.407056983 */, 14 }, - /* 739 */ { MAD_F(0x06865181) /* 0.407792573 */, 14 }, - /* 740 */ { MAD_F(0x0689552c) /* 0.408528495 */, 14 }, - /* 741 */ { MAD_F(0x068c5931) /* 0.409264748 */, 14 }, - /* 742 */ { MAD_F(0x068f5d8e) /* 0.410001332 */, 14 }, - /* 743 */ { MAD_F(0x06926245) /* 0.410738247 */, 14 }, - /* 744 */ { MAD_F(0x06956753) /* 0.411475493 */, 14 }, - /* 745 */ { MAD_F(0x06986cbb) /* 0.412213070 */, 14 }, - /* 746 */ { MAD_F(0x069b727b) /* 0.412950976 */, 14 }, - /* 747 */ { MAD_F(0x069e7894) /* 0.413689213 */, 14 }, - /* 748 */ { MAD_F(0x06a17f05) /* 0.414427779 */, 14 }, - /* 749 */ { MAD_F(0x06a485cf) /* 0.415166674 */, 14 }, - /* 750 */ { MAD_F(0x06a78cf1) /* 0.415905897 */, 14 }, - /* 751 */ { MAD_F(0x06aa946b) /* 0.416645450 */, 14 }, - - /* 752 */ { MAD_F(0x06ad9c3d) /* 0.417385331 */, 14 }, - /* 753 */ { MAD_F(0x06b0a468) /* 0.418125540 */, 14 }, - /* 754 */ { MAD_F(0x06b3acea) /* 0.418866076 */, 14 }, - /* 755 */ { MAD_F(0x06b6b5c4) /* 0.419606940 */, 14 }, - /* 756 */ { MAD_F(0x06b9bef6) /* 0.420348132 */, 14 }, - /* 757 */ { MAD_F(0x06bcc880) /* 0.421089650 */, 14 }, - /* 758 */ { MAD_F(0x06bfd261) /* 0.421831494 */, 14 }, - /* 759 */ { MAD_F(0x06c2dc9a) /* 0.422573665 */, 14 }, - /* 760 */ { MAD_F(0x06c5e72b) /* 0.423316162 */, 14 }, - /* 761 */ { MAD_F(0x06c8f213) /* 0.424058985 */, 14 }, - /* 762 */ { MAD_F(0x06cbfd52) /* 0.424802133 */, 14 }, - /* 763 */ { MAD_F(0x06cf08e9) /* 0.425545607 */, 14 }, - /* 764 */ { MAD_F(0x06d214d7) /* 0.426289405 */, 14 }, - /* 765 */ { MAD_F(0x06d5211c) /* 0.427033528 */, 14 }, - /* 766 */ { MAD_F(0x06d82db8) /* 0.427777975 */, 14 }, - /* 767 */ { MAD_F(0x06db3aaa) /* 0.428522746 */, 14 }, - - /* 768 */ { MAD_F(0x06de47f4) /* 0.429267841 */, 14 }, - /* 769 */ { MAD_F(0x06e15595) /* 0.430013259 */, 14 }, - /* 770 */ { MAD_F(0x06e4638d) /* 0.430759001 */, 14 }, - /* 771 */ { MAD_F(0x06e771db) /* 0.431505065 */, 14 }, - /* 772 */ { MAD_F(0x06ea807f) /* 0.432251452 */, 14 }, - /* 773 */ { MAD_F(0x06ed8f7b) /* 0.432998162 */, 14 }, - /* 774 */ { MAD_F(0x06f09ecc) /* 0.433745193 */, 14 }, - /* 775 */ { MAD_F(0x06f3ae75) /* 0.434492546 */, 14 }, - /* 776 */ { MAD_F(0x06f6be73) /* 0.435240221 */, 14 }, - /* 777 */ { MAD_F(0x06f9cec8) /* 0.435988217 */, 14 }, - /* 778 */ { MAD_F(0x06fcdf72) /* 0.436736534 */, 14 }, - /* 779 */ { MAD_F(0x06fff073) /* 0.437485172 */, 14 }, - /* 780 */ { MAD_F(0x070301ca) /* 0.438234130 */, 14 }, - /* 781 */ { MAD_F(0x07061377) /* 0.438983408 */, 14 }, - /* 782 */ { MAD_F(0x0709257a) /* 0.439733006 */, 14 }, - /* 783 */ { MAD_F(0x070c37d2) /* 0.440482924 */, 14 }, - - /* 784 */ { MAD_F(0x070f4a80) /* 0.441233161 */, 14 }, - /* 785 */ { MAD_F(0x07125d84) /* 0.441983717 */, 14 }, - /* 786 */ { MAD_F(0x071570de) /* 0.442734592 */, 14 }, - /* 787 */ { MAD_F(0x0718848d) /* 0.443485785 */, 14 }, - /* 788 */ { MAD_F(0x071b9891) /* 0.444237296 */, 14 }, - /* 789 */ { MAD_F(0x071eaceb) /* 0.444989126 */, 14 }, - /* 790 */ { MAD_F(0x0721c19a) /* 0.445741273 */, 14 }, - /* 791 */ { MAD_F(0x0724d69e) /* 0.446493738 */, 14 }, - /* 792 */ { MAD_F(0x0727ebf7) /* 0.447246519 */, 14 }, - /* 793 */ { MAD_F(0x072b01a6) /* 0.447999618 */, 14 }, - /* 794 */ { MAD_F(0x072e17a9) /* 0.448753033 */, 14 }, - /* 795 */ { MAD_F(0x07312e01) /* 0.449506765 */, 14 }, - /* 796 */ { MAD_F(0x073444ae) /* 0.450260813 */, 14 }, - /* 797 */ { MAD_F(0x07375bb0) /* 0.451015176 */, 14 }, - /* 798 */ { MAD_F(0x073a7307) /* 0.451769856 */, 14 }, - /* 799 */ { MAD_F(0x073d8ab2) /* 0.452524850 */, 14 }, - - /* 800 */ { MAD_F(0x0740a2b2) /* 0.453280160 */, 14 }, - /* 801 */ { MAD_F(0x0743bb06) /* 0.454035784 */, 14 }, - /* 802 */ { MAD_F(0x0746d3af) /* 0.454791723 */, 14 }, - /* 803 */ { MAD_F(0x0749ecac) /* 0.455547976 */, 14 }, - /* 804 */ { MAD_F(0x074d05fe) /* 0.456304543 */, 14 }, - /* 805 */ { MAD_F(0x07501fa3) /* 0.457061423 */, 14 }, - /* 806 */ { MAD_F(0x0753399d) /* 0.457818618 */, 14 }, - /* 807 */ { MAD_F(0x075653eb) /* 0.458576125 */, 14 }, - /* 808 */ { MAD_F(0x07596e8d) /* 0.459333946 */, 14 }, - /* 809 */ { MAD_F(0x075c8983) /* 0.460092079 */, 14 }, - /* 810 */ { MAD_F(0x075fa4cc) /* 0.460850524 */, 14 }, - /* 811 */ { MAD_F(0x0762c06a) /* 0.461609282 */, 14 }, - /* 812 */ { MAD_F(0x0765dc5b) /* 0.462368352 */, 14 }, - /* 813 */ { MAD_F(0x0768f8a0) /* 0.463127733 */, 14 }, - /* 814 */ { MAD_F(0x076c1538) /* 0.463887426 */, 14 }, - /* 815 */ { MAD_F(0x076f3224) /* 0.464647430 */, 14 }, - - /* 816 */ { MAD_F(0x07724f64) /* 0.465407744 */, 14 }, - /* 817 */ { MAD_F(0x07756cf7) /* 0.466168370 */, 14 }, - /* 818 */ { MAD_F(0x07788add) /* 0.466929306 */, 14 }, - /* 819 */ { MAD_F(0x077ba916) /* 0.467690552 */, 14 }, - /* 820 */ { MAD_F(0x077ec7a3) /* 0.468452108 */, 14 }, - /* 821 */ { MAD_F(0x0781e683) /* 0.469213973 */, 14 }, - /* 822 */ { MAD_F(0x078505b5) /* 0.469976148 */, 14 }, - /* 823 */ { MAD_F(0x0788253b) /* 0.470738632 */, 14 }, - /* 824 */ { MAD_F(0x078b4514) /* 0.471501425 */, 14 }, - /* 825 */ { MAD_F(0x078e653f) /* 0.472264527 */, 14 }, - /* 826 */ { MAD_F(0x079185be) /* 0.473027937 */, 14 }, - /* 827 */ { MAD_F(0x0794a68f) /* 0.473791655 */, 14 }, - /* 828 */ { MAD_F(0x0797c7b2) /* 0.474555681 */, 14 }, - /* 829 */ { MAD_F(0x079ae929) /* 0.475320014 */, 14 }, - /* 830 */ { MAD_F(0x079e0af1) /* 0.476084655 */, 14 }, - /* 831 */ { MAD_F(0x07a12d0c) /* 0.476849603 */, 14 }, - - /* 832 */ { MAD_F(0x07a44f7a) /* 0.477614858 */, 14 }, - /* 833 */ { MAD_F(0x07a7723a) /* 0.478380420 */, 14 }, - /* 834 */ { MAD_F(0x07aa954c) /* 0.479146288 */, 14 }, - /* 835 */ { MAD_F(0x07adb8b0) /* 0.479912463 */, 14 }, - /* 836 */ { MAD_F(0x07b0dc67) /* 0.480678943 */, 14 }, - /* 837 */ { MAD_F(0x07b4006f) /* 0.481445729 */, 14 }, - /* 838 */ { MAD_F(0x07b724ca) /* 0.482212820 */, 14 }, - /* 839 */ { MAD_F(0x07ba4976) /* 0.482980216 */, 14 }, - /* 840 */ { MAD_F(0x07bd6e75) /* 0.483747918 */, 14 }, - /* 841 */ { MAD_F(0x07c093c5) /* 0.484515924 */, 14 }, - /* 842 */ { MAD_F(0x07c3b967) /* 0.485284235 */, 14 }, - /* 843 */ { MAD_F(0x07c6df5a) /* 0.486052849 */, 14 }, - /* 844 */ { MAD_F(0x07ca059f) /* 0.486821768 */, 14 }, - /* 845 */ { MAD_F(0x07cd2c36) /* 0.487590991 */, 14 }, - /* 846 */ { MAD_F(0x07d0531e) /* 0.488360517 */, 14 }, - /* 847 */ { MAD_F(0x07d37a57) /* 0.489130346 */, 14 }, - - /* 848 */ { MAD_F(0x07d6a1e2) /* 0.489900479 */, 14 }, - /* 849 */ { MAD_F(0x07d9c9be) /* 0.490670914 */, 14 }, - /* 850 */ { MAD_F(0x07dcf1ec) /* 0.491441651 */, 14 }, - /* 851 */ { MAD_F(0x07e01a6a) /* 0.492212691 */, 14 }, - /* 852 */ { MAD_F(0x07e3433a) /* 0.492984033 */, 14 }, - /* 853 */ { MAD_F(0x07e66c5a) /* 0.493755677 */, 14 }, - /* 854 */ { MAD_F(0x07e995cc) /* 0.494527623 */, 14 }, - /* 855 */ { MAD_F(0x07ecbf8e) /* 0.495299870 */, 14 }, - /* 856 */ { MAD_F(0x07efe9a1) /* 0.496072418 */, 14 }, - /* 857 */ { MAD_F(0x07f31405) /* 0.496845266 */, 14 }, - /* 858 */ { MAD_F(0x07f63eba) /* 0.497618416 */, 14 }, - /* 859 */ { MAD_F(0x07f969c0) /* 0.498391866 */, 14 }, - /* 860 */ { MAD_F(0x07fc9516) /* 0.499165616 */, 14 }, - /* 861 */ { MAD_F(0x07ffc0bc) /* 0.499939666 */, 14 }, - /* 862 */ { MAD_F(0x04017659) /* 0.250357008 */, 15 }, - /* 863 */ { MAD_F(0x04030c7d) /* 0.250744333 */, 15 }, - - /* 864 */ { MAD_F(0x0404a2c9) /* 0.251131807 */, 15 }, - /* 865 */ { MAD_F(0x0406393d) /* 0.251519431 */, 15 }, - /* 866 */ { MAD_F(0x0407cfd9) /* 0.251907204 */, 15 }, - /* 867 */ { MAD_F(0x0409669d) /* 0.252295127 */, 15 }, - /* 868 */ { MAD_F(0x040afd89) /* 0.252683198 */, 15 }, - /* 869 */ { MAD_F(0x040c949e) /* 0.253071419 */, 15 }, - /* 870 */ { MAD_F(0x040e2bda) /* 0.253459789 */, 15 }, - /* 871 */ { MAD_F(0x040fc33e) /* 0.253848307 */, 15 }, - /* 872 */ { MAD_F(0x04115aca) /* 0.254236974 */, 15 }, - /* 873 */ { MAD_F(0x0412f27e) /* 0.254625790 */, 15 }, - /* 874 */ { MAD_F(0x04148a5a) /* 0.255014755 */, 15 }, - /* 875 */ { MAD_F(0x0416225d) /* 0.255403867 */, 15 }, - /* 876 */ { MAD_F(0x0417ba89) /* 0.255793128 */, 15 }, - /* 877 */ { MAD_F(0x041952dc) /* 0.256182537 */, 15 }, - /* 878 */ { MAD_F(0x041aeb57) /* 0.256572095 */, 15 }, - /* 879 */ { MAD_F(0x041c83fa) /* 0.256961800 */, 15 }, - - /* 880 */ { MAD_F(0x041e1cc4) /* 0.257351652 */, 15 }, - /* 881 */ { MAD_F(0x041fb5b6) /* 0.257741653 */, 15 }, - /* 882 */ { MAD_F(0x04214ed0) /* 0.258131801 */, 15 }, - /* 883 */ { MAD_F(0x0422e811) /* 0.258522097 */, 15 }, - /* 884 */ { MAD_F(0x04248179) /* 0.258912540 */, 15 }, - /* 885 */ { MAD_F(0x04261b0a) /* 0.259303130 */, 15 }, - /* 886 */ { MAD_F(0x0427b4c2) /* 0.259693868 */, 15 }, - /* 887 */ { MAD_F(0x04294ea1) /* 0.260084752 */, 15 }, - /* 888 */ { MAD_F(0x042ae8a7) /* 0.260475783 */, 15 }, - /* 889 */ { MAD_F(0x042c82d6) /* 0.260866961 */, 15 }, - /* 890 */ { MAD_F(0x042e1d2b) /* 0.261258286 */, 15 }, - /* 891 */ { MAD_F(0x042fb7a8) /* 0.261649758 */, 15 }, - /* 892 */ { MAD_F(0x0431524c) /* 0.262041376 */, 15 }, - /* 893 */ { MAD_F(0x0432ed17) /* 0.262433140 */, 15 }, - /* 894 */ { MAD_F(0x0434880a) /* 0.262825051 */, 15 }, - /* 895 */ { MAD_F(0x04362324) /* 0.263217107 */, 15 }, - - /* 896 */ { MAD_F(0x0437be65) /* 0.263609310 */, 15 }, - /* 897 */ { MAD_F(0x043959cd) /* 0.264001659 */, 15 }, - /* 898 */ { MAD_F(0x043af55d) /* 0.264394153 */, 15 }, - /* 899 */ { MAD_F(0x043c9113) /* 0.264786794 */, 15 }, - /* 900 */ { MAD_F(0x043e2cf1) /* 0.265179580 */, 15 }, - /* 901 */ { MAD_F(0x043fc8f6) /* 0.265572511 */, 15 }, - /* 902 */ { MAD_F(0x04416522) /* 0.265965588 */, 15 }, - /* 903 */ { MAD_F(0x04430174) /* 0.266358810 */, 15 }, - /* 904 */ { MAD_F(0x04449dee) /* 0.266752177 */, 15 }, - /* 905 */ { MAD_F(0x04463a8f) /* 0.267145689 */, 15 }, - /* 906 */ { MAD_F(0x0447d756) /* 0.267539347 */, 15 }, - /* 907 */ { MAD_F(0x04497445) /* 0.267933149 */, 15 }, - /* 908 */ { MAD_F(0x044b115a) /* 0.268327096 */, 15 }, - /* 909 */ { MAD_F(0x044cae96) /* 0.268721187 */, 15 }, - /* 910 */ { MAD_F(0x044e4bf9) /* 0.269115423 */, 15 }, - /* 911 */ { MAD_F(0x044fe983) /* 0.269509804 */, 15 }, - - /* 912 */ { MAD_F(0x04518733) /* 0.269904329 */, 15 }, - /* 913 */ { MAD_F(0x0453250a) /* 0.270298998 */, 15 }, - /* 914 */ { MAD_F(0x0454c308) /* 0.270693811 */, 15 }, - /* 915 */ { MAD_F(0x0456612d) /* 0.271088768 */, 15 }, - /* 916 */ { MAD_F(0x0457ff78) /* 0.271483869 */, 15 }, - /* 917 */ { MAD_F(0x04599dea) /* 0.271879114 */, 15 }, - /* 918 */ { MAD_F(0x045b3c82) /* 0.272274503 */, 15 }, - /* 919 */ { MAD_F(0x045cdb41) /* 0.272670035 */, 15 }, - /* 920 */ { MAD_F(0x045e7a26) /* 0.273065710 */, 15 }, - /* 921 */ { MAD_F(0x04601932) /* 0.273461530 */, 15 }, - /* 922 */ { MAD_F(0x0461b864) /* 0.273857492 */, 15 }, - /* 923 */ { MAD_F(0x046357bd) /* 0.274253597 */, 15 }, - /* 924 */ { MAD_F(0x0464f73c) /* 0.274649846 */, 15 }, - /* 925 */ { MAD_F(0x046696e2) /* 0.275046238 */, 15 }, - /* 926 */ { MAD_F(0x046836ae) /* 0.275442772 */, 15 }, - /* 927 */ { MAD_F(0x0469d6a0) /* 0.275839449 */, 15 }, - - /* 928 */ { MAD_F(0x046b76b9) /* 0.276236269 */, 15 }, - /* 929 */ { MAD_F(0x046d16f7) /* 0.276633232 */, 15 }, - /* 930 */ { MAD_F(0x046eb75c) /* 0.277030337 */, 15 }, - /* 931 */ { MAD_F(0x047057e8) /* 0.277427584 */, 15 }, - /* 932 */ { MAD_F(0x0471f899) /* 0.277824973 */, 15 }, - /* 933 */ { MAD_F(0x04739971) /* 0.278222505 */, 15 }, - /* 934 */ { MAD_F(0x04753a6f) /* 0.278620179 */, 15 }, - /* 935 */ { MAD_F(0x0476db92) /* 0.279017995 */, 15 }, - /* 936 */ { MAD_F(0x04787cdc) /* 0.279415952 */, 15 }, - /* 937 */ { MAD_F(0x047a1e4c) /* 0.279814051 */, 15 }, - /* 938 */ { MAD_F(0x047bbfe2) /* 0.280212292 */, 15 }, - /* 939 */ { MAD_F(0x047d619e) /* 0.280610675 */, 15 }, - /* 940 */ { MAD_F(0x047f0380) /* 0.281009199 */, 15 }, - /* 941 */ { MAD_F(0x0480a588) /* 0.281407864 */, 15 }, - /* 942 */ { MAD_F(0x048247b6) /* 0.281806670 */, 15 }, - /* 943 */ { MAD_F(0x0483ea0a) /* 0.282205618 */, 15 }, - - /* 944 */ { MAD_F(0x04858c83) /* 0.282604707 */, 15 }, - /* 945 */ { MAD_F(0x04872f22) /* 0.283003936 */, 15 }, - /* 946 */ { MAD_F(0x0488d1e8) /* 0.283403307 */, 15 }, - /* 947 */ { MAD_F(0x048a74d3) /* 0.283802818 */, 15 }, - /* 948 */ { MAD_F(0x048c17e3) /* 0.284202470 */, 15 }, - /* 949 */ { MAD_F(0x048dbb1a) /* 0.284602263 */, 15 }, - /* 950 */ { MAD_F(0x048f5e76) /* 0.285002195 */, 15 }, - /* 951 */ { MAD_F(0x049101f8) /* 0.285402269 */, 15 }, - /* 952 */ { MAD_F(0x0492a59f) /* 0.285802482 */, 15 }, - /* 953 */ { MAD_F(0x0494496c) /* 0.286202836 */, 15 }, - /* 954 */ { MAD_F(0x0495ed5f) /* 0.286603329 */, 15 }, - /* 955 */ { MAD_F(0x04979177) /* 0.287003963 */, 15 }, - /* 956 */ { MAD_F(0x049935b5) /* 0.287404737 */, 15 }, - /* 957 */ { MAD_F(0x049ada19) /* 0.287805650 */, 15 }, - /* 958 */ { MAD_F(0x049c7ea1) /* 0.288206703 */, 15 }, - /* 959 */ { MAD_F(0x049e2350) /* 0.288607895 */, 15 }, - - /* 960 */ { MAD_F(0x049fc824) /* 0.289009227 */, 15 }, - /* 961 */ { MAD_F(0x04a16d1d) /* 0.289410699 */, 15 }, - /* 962 */ { MAD_F(0x04a3123b) /* 0.289812309 */, 15 }, - /* 963 */ { MAD_F(0x04a4b77f) /* 0.290214059 */, 15 }, - /* 964 */ { MAD_F(0x04a65ce8) /* 0.290615948 */, 15 }, - /* 965 */ { MAD_F(0x04a80277) /* 0.291017976 */, 15 }, - /* 966 */ { MAD_F(0x04a9a82b) /* 0.291420143 */, 15 }, - /* 967 */ { MAD_F(0x04ab4e04) /* 0.291822449 */, 15 }, - /* 968 */ { MAD_F(0x04acf402) /* 0.292224893 */, 15 }, - /* 969 */ { MAD_F(0x04ae9a26) /* 0.292627476 */, 15 }, - /* 970 */ { MAD_F(0x04b0406e) /* 0.293030197 */, 15 }, - /* 971 */ { MAD_F(0x04b1e6dc) /* 0.293433057 */, 15 }, - /* 972 */ { MAD_F(0x04b38d6f) /* 0.293836055 */, 15 }, - /* 973 */ { MAD_F(0x04b53427) /* 0.294239192 */, 15 }, - /* 974 */ { MAD_F(0x04b6db05) /* 0.294642466 */, 15 }, - /* 975 */ { MAD_F(0x04b88207) /* 0.295045879 */, 15 }, - - /* 976 */ { MAD_F(0x04ba292e) /* 0.295449429 */, 15 }, - /* 977 */ { MAD_F(0x04bbd07a) /* 0.295853118 */, 15 }, - /* 978 */ { MAD_F(0x04bd77ec) /* 0.296256944 */, 15 }, - /* 979 */ { MAD_F(0x04bf1f82) /* 0.296660907 */, 15 }, - /* 980 */ { MAD_F(0x04c0c73d) /* 0.297065009 */, 15 }, - /* 981 */ { MAD_F(0x04c26f1d) /* 0.297469248 */, 15 }, - /* 982 */ { MAD_F(0x04c41722) /* 0.297873624 */, 15 }, - /* 983 */ { MAD_F(0x04c5bf4c) /* 0.298278137 */, 15 }, - /* 984 */ { MAD_F(0x04c7679a) /* 0.298682788 */, 15 }, - /* 985 */ { MAD_F(0x04c9100d) /* 0.299087576 */, 15 }, - /* 986 */ { MAD_F(0x04cab8a6) /* 0.299492500 */, 15 }, - /* 987 */ { MAD_F(0x04cc6163) /* 0.299897562 */, 15 }, - /* 988 */ { MAD_F(0x04ce0a44) /* 0.300302761 */, 15 }, - /* 989 */ { MAD_F(0x04cfb34b) /* 0.300708096 */, 15 }, - /* 990 */ { MAD_F(0x04d15c76) /* 0.301113568 */, 15 }, - /* 991 */ { MAD_F(0x04d305c5) /* 0.301519176 */, 15 }, - - /* 992 */ { MAD_F(0x04d4af3a) /* 0.301924921 */, 15 }, - /* 993 */ { MAD_F(0x04d658d2) /* 0.302330802 */, 15 }, - /* 994 */ { MAD_F(0x04d80290) /* 0.302736820 */, 15 }, - /* 995 */ { MAD_F(0x04d9ac72) /* 0.303142973 */, 15 }, - /* 996 */ { MAD_F(0x04db5679) /* 0.303549263 */, 15 }, - /* 997 */ { MAD_F(0x04dd00a4) /* 0.303955689 */, 15 }, - /* 998 */ { MAD_F(0x04deaaf3) /* 0.304362251 */, 15 }, - /* 999 */ { MAD_F(0x04e05567) /* 0.304768948 */, 15 }, - /* 1000 */ { MAD_F(0x04e20000) /* 0.305175781 */, 15 }, - /* 1001 */ { MAD_F(0x04e3aabd) /* 0.305582750 */, 15 }, - /* 1002 */ { MAD_F(0x04e5559e) /* 0.305989854 */, 15 }, - /* 1003 */ { MAD_F(0x04e700a3) /* 0.306397094 */, 15 }, - /* 1004 */ { MAD_F(0x04e8abcd) /* 0.306804470 */, 15 }, - /* 1005 */ { MAD_F(0x04ea571c) /* 0.307211980 */, 15 }, - /* 1006 */ { MAD_F(0x04ec028e) /* 0.307619626 */, 15 }, - /* 1007 */ { MAD_F(0x04edae25) /* 0.308027406 */, 15 }, - - /* 1008 */ { MAD_F(0x04ef59e0) /* 0.308435322 */, 15 }, - /* 1009 */ { MAD_F(0x04f105bf) /* 0.308843373 */, 15 }, - /* 1010 */ { MAD_F(0x04f2b1c3) /* 0.309251558 */, 15 }, - /* 1011 */ { MAD_F(0x04f45dea) /* 0.309659879 */, 15 }, - /* 1012 */ { MAD_F(0x04f60a36) /* 0.310068333 */, 15 }, - /* 1013 */ { MAD_F(0x04f7b6a6) /* 0.310476923 */, 15 }, - /* 1014 */ { MAD_F(0x04f9633a) /* 0.310885647 */, 15 }, - /* 1015 */ { MAD_F(0x04fb0ff2) /* 0.311294505 */, 15 }, - /* 1016 */ { MAD_F(0x04fcbcce) /* 0.311703498 */, 15 }, - /* 1017 */ { MAD_F(0x04fe69ce) /* 0.312112625 */, 15 }, - /* 1018 */ { MAD_F(0x050016f3) /* 0.312521885 */, 15 }, - /* 1019 */ { MAD_F(0x0501c43b) /* 0.312931280 */, 15 }, - /* 1020 */ { MAD_F(0x050371a7) /* 0.313340809 */, 15 }, - /* 1021 */ { MAD_F(0x05051f37) /* 0.313750472 */, 15 }, - /* 1022 */ { MAD_F(0x0506cceb) /* 0.314160269 */, 15 }, - /* 1023 */ { MAD_F(0x05087ac2) /* 0.314570199 */, 15 }, - - /* 1024 */ { MAD_F(0x050a28be) /* 0.314980262 */, 15 }, - /* 1025 */ { MAD_F(0x050bd6de) /* 0.315390460 */, 15 }, - /* 1026 */ { MAD_F(0x050d8521) /* 0.315800790 */, 15 }, - /* 1027 */ { MAD_F(0x050f3388) /* 0.316211255 */, 15 }, - /* 1028 */ { MAD_F(0x0510e213) /* 0.316621852 */, 15 }, - /* 1029 */ { MAD_F(0x051290c2) /* 0.317032582 */, 15 }, - /* 1030 */ { MAD_F(0x05143f94) /* 0.317443446 */, 15 }, - /* 1031 */ { MAD_F(0x0515ee8a) /* 0.317854442 */, 15 }, - /* 1032 */ { MAD_F(0x05179da4) /* 0.318265572 */, 15 }, - /* 1033 */ { MAD_F(0x05194ce1) /* 0.318676834 */, 15 }, - /* 1034 */ { MAD_F(0x051afc42) /* 0.319088229 */, 15 }, - /* 1035 */ { MAD_F(0x051cabc7) /* 0.319499756 */, 15 }, - /* 1036 */ { MAD_F(0x051e5b6f) /* 0.319911417 */, 15 }, - /* 1037 */ { MAD_F(0x05200b3a) /* 0.320323209 */, 15 }, - /* 1038 */ { MAD_F(0x0521bb2a) /* 0.320735134 */, 15 }, - /* 1039 */ { MAD_F(0x05236b3d) /* 0.321147192 */, 15 }, - - /* 1040 */ { MAD_F(0x05251b73) /* 0.321559381 */, 15 }, - /* 1041 */ { MAD_F(0x0526cbcd) /* 0.321971703 */, 15 }, - /* 1042 */ { MAD_F(0x05287c4a) /* 0.322384156 */, 15 }, - /* 1043 */ { MAD_F(0x052a2cea) /* 0.322796742 */, 15 }, - /* 1044 */ { MAD_F(0x052bddae) /* 0.323209460 */, 15 }, - /* 1045 */ { MAD_F(0x052d8e96) /* 0.323622309 */, 15 }, - /* 1046 */ { MAD_F(0x052f3fa1) /* 0.324035290 */, 15 }, - /* 1047 */ { MAD_F(0x0530f0cf) /* 0.324448403 */, 15 }, - /* 1048 */ { MAD_F(0x0532a220) /* 0.324861647 */, 15 }, - /* 1049 */ { MAD_F(0x05345395) /* 0.325275023 */, 15 }, - /* 1050 */ { MAD_F(0x0536052d) /* 0.325688530 */, 15 }, - /* 1051 */ { MAD_F(0x0537b6e8) /* 0.326102168 */, 15 }, - /* 1052 */ { MAD_F(0x053968c6) /* 0.326515938 */, 15 }, - /* 1053 */ { MAD_F(0x053b1ac8) /* 0.326929839 */, 15 }, - /* 1054 */ { MAD_F(0x053ccced) /* 0.327343870 */, 15 }, - /* 1055 */ { MAD_F(0x053e7f35) /* 0.327758033 */, 15 }, - - /* 1056 */ { MAD_F(0x054031a0) /* 0.328172327 */, 15 }, - /* 1057 */ { MAD_F(0x0541e42e) /* 0.328586751 */, 15 }, - /* 1058 */ { MAD_F(0x054396df) /* 0.329001306 */, 15 }, - /* 1059 */ { MAD_F(0x054549b4) /* 0.329415992 */, 15 }, - /* 1060 */ { MAD_F(0x0546fcab) /* 0.329830808 */, 15 }, - /* 1061 */ { MAD_F(0x0548afc6) /* 0.330245755 */, 15 }, - /* 1062 */ { MAD_F(0x054a6303) /* 0.330660832 */, 15 }, - /* 1063 */ { MAD_F(0x054c1663) /* 0.331076039 */, 15 }, - /* 1064 */ { MAD_F(0x054dc9e7) /* 0.331491377 */, 15 }, - /* 1065 */ { MAD_F(0x054f7d8d) /* 0.331906845 */, 15 }, - /* 1066 */ { MAD_F(0x05513156) /* 0.332322443 */, 15 }, - /* 1067 */ { MAD_F(0x0552e542) /* 0.332738170 */, 15 }, - /* 1068 */ { MAD_F(0x05549951) /* 0.333154028 */, 15 }, - /* 1069 */ { MAD_F(0x05564d83) /* 0.333570016 */, 15 }, - /* 1070 */ { MAD_F(0x055801d8) /* 0.333986133 */, 15 }, - /* 1071 */ { MAD_F(0x0559b64f) /* 0.334402380 */, 15 }, - - /* 1072 */ { MAD_F(0x055b6ae9) /* 0.334818756 */, 15 }, - /* 1073 */ { MAD_F(0x055d1fa6) /* 0.335235262 */, 15 }, - /* 1074 */ { MAD_F(0x055ed486) /* 0.335651898 */, 15 }, - /* 1075 */ { MAD_F(0x05608988) /* 0.336068662 */, 15 }, - /* 1076 */ { MAD_F(0x05623ead) /* 0.336485556 */, 15 }, - /* 1077 */ { MAD_F(0x0563f3f5) /* 0.336902579 */, 15 }, - /* 1078 */ { MAD_F(0x0565a960) /* 0.337319732 */, 15 }, - /* 1079 */ { MAD_F(0x05675eed) /* 0.337737013 */, 15 }, - /* 1080 */ { MAD_F(0x0569149c) /* 0.338154423 */, 15 }, - /* 1081 */ { MAD_F(0x056aca6f) /* 0.338571962 */, 15 }, - /* 1082 */ { MAD_F(0x056c8064) /* 0.338989630 */, 15 }, - /* 1083 */ { MAD_F(0x056e367b) /* 0.339407426 */, 15 }, - /* 1084 */ { MAD_F(0x056fecb5) /* 0.339825351 */, 15 }, - /* 1085 */ { MAD_F(0x0571a311) /* 0.340243405 */, 15 }, - /* 1086 */ { MAD_F(0x05735990) /* 0.340661587 */, 15 }, - /* 1087 */ { MAD_F(0x05751032) /* 0.341079898 */, 15 }, - - /* 1088 */ { MAD_F(0x0576c6f5) /* 0.341498336 */, 15 }, - /* 1089 */ { MAD_F(0x05787ddc) /* 0.341916903 */, 15 }, - /* 1090 */ { MAD_F(0x057a34e4) /* 0.342335598 */, 15 }, - /* 1091 */ { MAD_F(0x057bec0f) /* 0.342754421 */, 15 }, - /* 1092 */ { MAD_F(0x057da35d) /* 0.343173373 */, 15 }, - /* 1093 */ { MAD_F(0x057f5acc) /* 0.343592452 */, 15 }, - /* 1094 */ { MAD_F(0x0581125e) /* 0.344011659 */, 15 }, - /* 1095 */ { MAD_F(0x0582ca12) /* 0.344430993 */, 15 }, - /* 1096 */ { MAD_F(0x058481e9) /* 0.344850455 */, 15 }, - /* 1097 */ { MAD_F(0x058639e2) /* 0.345270045 */, 15 }, - /* 1098 */ { MAD_F(0x0587f1fd) /* 0.345689763 */, 15 }, - /* 1099 */ { MAD_F(0x0589aa3a) /* 0.346109608 */, 15 }, - /* 1100 */ { MAD_F(0x058b629a) /* 0.346529580 */, 15 }, - /* 1101 */ { MAD_F(0x058d1b1b) /* 0.346949679 */, 15 }, - /* 1102 */ { MAD_F(0x058ed3bf) /* 0.347369906 */, 15 }, - /* 1103 */ { MAD_F(0x05908c85) /* 0.347790260 */, 15 }, - - /* 1104 */ { MAD_F(0x0592456d) /* 0.348210741 */, 15 }, - /* 1105 */ { MAD_F(0x0593fe77) /* 0.348631348 */, 15 }, - /* 1106 */ { MAD_F(0x0595b7a3) /* 0.349052083 */, 15 }, - /* 1107 */ { MAD_F(0x059770f1) /* 0.349472945 */, 15 }, - /* 1108 */ { MAD_F(0x05992a61) /* 0.349893933 */, 15 }, - /* 1109 */ { MAD_F(0x059ae3f3) /* 0.350315048 */, 15 }, - /* 1110 */ { MAD_F(0x059c9da8) /* 0.350736290 */, 15 }, - /* 1111 */ { MAD_F(0x059e577e) /* 0.351157658 */, 15 }, - /* 1112 */ { MAD_F(0x05a01176) /* 0.351579152 */, 15 }, - /* 1113 */ { MAD_F(0x05a1cb90) /* 0.352000773 */, 15 }, - /* 1114 */ { MAD_F(0x05a385cc) /* 0.352422520 */, 15 }, - /* 1115 */ { MAD_F(0x05a5402a) /* 0.352844394 */, 15 }, - /* 1116 */ { MAD_F(0x05a6faa9) /* 0.353266393 */, 15 }, - /* 1117 */ { MAD_F(0x05a8b54b) /* 0.353688519 */, 15 }, - /* 1118 */ { MAD_F(0x05aa700e) /* 0.354110771 */, 15 }, - /* 1119 */ { MAD_F(0x05ac2af3) /* 0.354533148 */, 15 }, - - /* 1120 */ { MAD_F(0x05ade5fa) /* 0.354955651 */, 15 }, - /* 1121 */ { MAD_F(0x05afa123) /* 0.355378281 */, 15 }, - /* 1122 */ { MAD_F(0x05b15c6d) /* 0.355801035 */, 15 }, - /* 1123 */ { MAD_F(0x05b317d9) /* 0.356223916 */, 15 }, - /* 1124 */ { MAD_F(0x05b4d367) /* 0.356646922 */, 15 }, - /* 1125 */ { MAD_F(0x05b68f16) /* 0.357070053 */, 15 }, - /* 1126 */ { MAD_F(0x05b84ae7) /* 0.357493310 */, 15 }, - /* 1127 */ { MAD_F(0x05ba06da) /* 0.357916692 */, 15 }, - /* 1128 */ { MAD_F(0x05bbc2ef) /* 0.358340200 */, 15 }, - /* 1129 */ { MAD_F(0x05bd7f25) /* 0.358763832 */, 15 }, - /* 1130 */ { MAD_F(0x05bf3b7c) /* 0.359187590 */, 15 }, - /* 1131 */ { MAD_F(0x05c0f7f5) /* 0.359611472 */, 15 }, - /* 1132 */ { MAD_F(0x05c2b490) /* 0.360035480 */, 15 }, - /* 1133 */ { MAD_F(0x05c4714c) /* 0.360459613 */, 15 }, - /* 1134 */ { MAD_F(0x05c62e2a) /* 0.360883870 */, 15 }, - /* 1135 */ { MAD_F(0x05c7eb29) /* 0.361308252 */, 15 }, - - /* 1136 */ { MAD_F(0x05c9a84a) /* 0.361732758 */, 15 }, - /* 1137 */ { MAD_F(0x05cb658c) /* 0.362157390 */, 15 }, - /* 1138 */ { MAD_F(0x05cd22ef) /* 0.362582145 */, 15 }, - /* 1139 */ { MAD_F(0x05cee074) /* 0.363007026 */, 15 }, - /* 1140 */ { MAD_F(0x05d09e1b) /* 0.363432030 */, 15 }, - /* 1141 */ { MAD_F(0x05d25be2) /* 0.363857159 */, 15 }, - /* 1142 */ { MAD_F(0x05d419cb) /* 0.364282412 */, 15 }, - /* 1143 */ { MAD_F(0x05d5d7d5) /* 0.364707789 */, 15 }, - /* 1144 */ { MAD_F(0x05d79601) /* 0.365133291 */, 15 }, - /* 1145 */ { MAD_F(0x05d9544e) /* 0.365558916 */, 15 }, - /* 1146 */ { MAD_F(0x05db12bc) /* 0.365984665 */, 15 }, - /* 1147 */ { MAD_F(0x05dcd14c) /* 0.366410538 */, 15 }, - /* 1148 */ { MAD_F(0x05de8ffc) /* 0.366836535 */, 15 }, - /* 1149 */ { MAD_F(0x05e04ece) /* 0.367262655 */, 15 }, - /* 1150 */ { MAD_F(0x05e20dc1) /* 0.367688900 */, 15 }, - /* 1151 */ { MAD_F(0x05e3ccd5) /* 0.368115267 */, 15 }, - - /* 1152 */ { MAD_F(0x05e58c0b) /* 0.368541759 */, 15 }, - /* 1153 */ { MAD_F(0x05e74b61) /* 0.368968373 */, 15 }, - /* 1154 */ { MAD_F(0x05e90ad9) /* 0.369395111 */, 15 }, - /* 1155 */ { MAD_F(0x05eaca72) /* 0.369821973 */, 15 }, - /* 1156 */ { MAD_F(0x05ec8a2b) /* 0.370248957 */, 15 }, - /* 1157 */ { MAD_F(0x05ee4a06) /* 0.370676065 */, 15 }, - /* 1158 */ { MAD_F(0x05f00a02) /* 0.371103295 */, 15 }, - /* 1159 */ { MAD_F(0x05f1ca1f) /* 0.371530649 */, 15 }, - /* 1160 */ { MAD_F(0x05f38a5d) /* 0.371958126 */, 15 }, - /* 1161 */ { MAD_F(0x05f54abc) /* 0.372385725 */, 15 }, - /* 1162 */ { MAD_F(0x05f70b3c) /* 0.372813448 */, 15 }, - /* 1163 */ { MAD_F(0x05f8cbdc) /* 0.373241292 */, 15 }, - /* 1164 */ { MAD_F(0x05fa8c9e) /* 0.373669260 */, 15 }, - /* 1165 */ { MAD_F(0x05fc4d81) /* 0.374097350 */, 15 }, - /* 1166 */ { MAD_F(0x05fe0e84) /* 0.374525563 */, 15 }, - /* 1167 */ { MAD_F(0x05ffcfa8) /* 0.374953898 */, 15 }, - - /* 1168 */ { MAD_F(0x060190ee) /* 0.375382356 */, 15 }, - /* 1169 */ { MAD_F(0x06035254) /* 0.375810936 */, 15 }, - /* 1170 */ { MAD_F(0x060513da) /* 0.376239638 */, 15 }, - /* 1171 */ { MAD_F(0x0606d582) /* 0.376668462 */, 15 }, - /* 1172 */ { MAD_F(0x0608974a) /* 0.377097408 */, 15 }, - /* 1173 */ { MAD_F(0x060a5934) /* 0.377526476 */, 15 }, - /* 1174 */ { MAD_F(0x060c1b3d) /* 0.377955667 */, 15 }, - /* 1175 */ { MAD_F(0x060ddd68) /* 0.378384979 */, 15 }, - /* 1176 */ { MAD_F(0x060f9fb3) /* 0.378814413 */, 15 }, - /* 1177 */ { MAD_F(0x0611621f) /* 0.379243968 */, 15 }, - /* 1178 */ { MAD_F(0x061324ac) /* 0.379673646 */, 15 }, - /* 1179 */ { MAD_F(0x0614e759) /* 0.380103444 */, 15 }, - /* 1180 */ { MAD_F(0x0616aa27) /* 0.380533365 */, 15 }, - /* 1181 */ { MAD_F(0x06186d16) /* 0.380963407 */, 15 }, - /* 1182 */ { MAD_F(0x061a3025) /* 0.381393570 */, 15 }, - /* 1183 */ { MAD_F(0x061bf354) /* 0.381823855 */, 15 }, - - /* 1184 */ { MAD_F(0x061db6a5) /* 0.382254261 */, 15 }, - /* 1185 */ { MAD_F(0x061f7a15) /* 0.382684788 */, 15 }, - /* 1186 */ { MAD_F(0x06213da7) /* 0.383115436 */, 15 }, - /* 1187 */ { MAD_F(0x06230158) /* 0.383546205 */, 15 }, - /* 1188 */ { MAD_F(0x0624c52a) /* 0.383977096 */, 15 }, - /* 1189 */ { MAD_F(0x0626891d) /* 0.384408107 */, 15 }, - /* 1190 */ { MAD_F(0x06284d30) /* 0.384839239 */, 15 }, - /* 1191 */ { MAD_F(0x062a1164) /* 0.385270492 */, 15 }, - /* 1192 */ { MAD_F(0x062bd5b8) /* 0.385701865 */, 15 }, - /* 1193 */ { MAD_F(0x062d9a2c) /* 0.386133359 */, 15 }, - /* 1194 */ { MAD_F(0x062f5ec1) /* 0.386564974 */, 15 }, - /* 1195 */ { MAD_F(0x06312376) /* 0.386996709 */, 15 }, - /* 1196 */ { MAD_F(0x0632e84b) /* 0.387428565 */, 15 }, - /* 1197 */ { MAD_F(0x0634ad41) /* 0.387860541 */, 15 }, - /* 1198 */ { MAD_F(0x06367257) /* 0.388292637 */, 15 }, - /* 1199 */ { MAD_F(0x0638378d) /* 0.388724854 */, 15 }, - - /* 1200 */ { MAD_F(0x0639fce4) /* 0.389157191 */, 15 }, - /* 1201 */ { MAD_F(0x063bc25b) /* 0.389589648 */, 15 }, - /* 1202 */ { MAD_F(0x063d87f2) /* 0.390022225 */, 15 }, - /* 1203 */ { MAD_F(0x063f4da9) /* 0.390454922 */, 15 }, - /* 1204 */ { MAD_F(0x06411380) /* 0.390887739 */, 15 }, - /* 1205 */ { MAD_F(0x0642d978) /* 0.391320675 */, 15 }, - /* 1206 */ { MAD_F(0x06449f8f) /* 0.391753732 */, 15 }, - /* 1207 */ { MAD_F(0x064665c7) /* 0.392186908 */, 15 }, - /* 1208 */ { MAD_F(0x06482c1f) /* 0.392620204 */, 15 }, - /* 1209 */ { MAD_F(0x0649f297) /* 0.393053619 */, 15 }, - /* 1210 */ { MAD_F(0x064bb92f) /* 0.393487154 */, 15 }, - /* 1211 */ { MAD_F(0x064d7fe8) /* 0.393920808 */, 15 }, - /* 1212 */ { MAD_F(0x064f46c0) /* 0.394354582 */, 15 }, - /* 1213 */ { MAD_F(0x06510db8) /* 0.394788475 */, 15 }, - /* 1214 */ { MAD_F(0x0652d4d0) /* 0.395222488 */, 15 }, - /* 1215 */ { MAD_F(0x06549c09) /* 0.395656619 */, 15 }, - - /* 1216 */ { MAD_F(0x06566361) /* 0.396090870 */, 15 }, - /* 1217 */ { MAD_F(0x06582ad9) /* 0.396525239 */, 15 }, - /* 1218 */ { MAD_F(0x0659f271) /* 0.396959728 */, 15 }, - /* 1219 */ { MAD_F(0x065bba29) /* 0.397394336 */, 15 }, - /* 1220 */ { MAD_F(0x065d8201) /* 0.397829062 */, 15 }, - /* 1221 */ { MAD_F(0x065f49f9) /* 0.398263907 */, 15 }, - /* 1222 */ { MAD_F(0x06611211) /* 0.398698871 */, 15 }, - /* 1223 */ { MAD_F(0x0662da49) /* 0.399133954 */, 15 }, - /* 1224 */ { MAD_F(0x0664a2a0) /* 0.399569155 */, 15 }, - /* 1225 */ { MAD_F(0x06666b17) /* 0.400004475 */, 15 }, - /* 1226 */ { MAD_F(0x066833ae) /* 0.400439913 */, 15 }, - /* 1227 */ { MAD_F(0x0669fc65) /* 0.400875470 */, 15 }, - /* 1228 */ { MAD_F(0x066bc53c) /* 0.401311145 */, 15 }, - /* 1229 */ { MAD_F(0x066d8e32) /* 0.401746938 */, 15 }, - /* 1230 */ { MAD_F(0x066f5748) /* 0.402182850 */, 15 }, - /* 1231 */ { MAD_F(0x0671207e) /* 0.402618879 */, 15 }, - - /* 1232 */ { MAD_F(0x0672e9d4) /* 0.403055027 */, 15 }, - /* 1233 */ { MAD_F(0x0674b349) /* 0.403491293 */, 15 }, - /* 1234 */ { MAD_F(0x06767cde) /* 0.403927676 */, 15 }, - /* 1235 */ { MAD_F(0x06784692) /* 0.404364178 */, 15 }, - /* 1236 */ { MAD_F(0x067a1066) /* 0.404800797 */, 15 }, - /* 1237 */ { MAD_F(0x067bda5a) /* 0.405237535 */, 15 }, - /* 1238 */ { MAD_F(0x067da46d) /* 0.405674390 */, 15 }, - /* 1239 */ { MAD_F(0x067f6ea0) /* 0.406111362 */, 15 }, - /* 1240 */ { MAD_F(0x068138f3) /* 0.406548452 */, 15 }, - /* 1241 */ { MAD_F(0x06830365) /* 0.406985660 */, 15 }, - /* 1242 */ { MAD_F(0x0684cdf6) /* 0.407422985 */, 15 }, - /* 1243 */ { MAD_F(0x068698a8) /* 0.407860427 */, 15 }, - /* 1244 */ { MAD_F(0x06886378) /* 0.408297987 */, 15 }, - /* 1245 */ { MAD_F(0x068a2e68) /* 0.408735664 */, 15 }, - /* 1246 */ { MAD_F(0x068bf978) /* 0.409173458 */, 15 }, - /* 1247 */ { MAD_F(0x068dc4a7) /* 0.409611370 */, 15 }, - - /* 1248 */ { MAD_F(0x068f8ff5) /* 0.410049398 */, 15 }, - /* 1249 */ { MAD_F(0x06915b63) /* 0.410487544 */, 15 }, - /* 1250 */ { MAD_F(0x069326f0) /* 0.410925806 */, 15 }, - /* 1251 */ { MAD_F(0x0694f29c) /* 0.411364185 */, 15 }, - /* 1252 */ { MAD_F(0x0696be68) /* 0.411802681 */, 15 }, - /* 1253 */ { MAD_F(0x06988a54) /* 0.412241294 */, 15 }, - /* 1254 */ { MAD_F(0x069a565e) /* 0.412680024 */, 15 }, - /* 1255 */ { MAD_F(0x069c2288) /* 0.413118870 */, 15 }, - /* 1256 */ { MAD_F(0x069deed1) /* 0.413557833 */, 15 }, - /* 1257 */ { MAD_F(0x069fbb3a) /* 0.413996912 */, 15 }, - /* 1258 */ { MAD_F(0x06a187c1) /* 0.414436108 */, 15 }, - /* 1259 */ { MAD_F(0x06a35468) /* 0.414875420 */, 15 }, - /* 1260 */ { MAD_F(0x06a5212f) /* 0.415314849 */, 15 }, - /* 1261 */ { MAD_F(0x06a6ee14) /* 0.415754393 */, 15 }, - /* 1262 */ { MAD_F(0x06a8bb18) /* 0.416194054 */, 15 }, - /* 1263 */ { MAD_F(0x06aa883c) /* 0.416633831 */, 15 }, - - /* 1264 */ { MAD_F(0x06ac557f) /* 0.417073724 */, 15 }, - /* 1265 */ { MAD_F(0x06ae22e1) /* 0.417513734 */, 15 }, - /* 1266 */ { MAD_F(0x06aff062) /* 0.417953859 */, 15 }, - /* 1267 */ { MAD_F(0x06b1be03) /* 0.418394100 */, 15 }, - /* 1268 */ { MAD_F(0x06b38bc2) /* 0.418834457 */, 15 }, - /* 1269 */ { MAD_F(0x06b559a1) /* 0.419274929 */, 15 }, - /* 1270 */ { MAD_F(0x06b7279e) /* 0.419715518 */, 15 }, - /* 1271 */ { MAD_F(0x06b8f5bb) /* 0.420156222 */, 15 }, - /* 1272 */ { MAD_F(0x06bac3f6) /* 0.420597041 */, 15 }, - /* 1273 */ { MAD_F(0x06bc9251) /* 0.421037977 */, 15 }, - /* 1274 */ { MAD_F(0x06be60cb) /* 0.421479027 */, 15 }, - /* 1275 */ { MAD_F(0x06c02f63) /* 0.421920193 */, 15 }, - /* 1276 */ { MAD_F(0x06c1fe1b) /* 0.422361475 */, 15 }, - /* 1277 */ { MAD_F(0x06c3ccf1) /* 0.422802871 */, 15 }, - /* 1278 */ { MAD_F(0x06c59be7) /* 0.423244383 */, 15 }, - /* 1279 */ { MAD_F(0x06c76afb) /* 0.423686010 */, 15 }, - - /* 1280 */ { MAD_F(0x06c93a2e) /* 0.424127753 */, 15 }, - /* 1281 */ { MAD_F(0x06cb0981) /* 0.424569610 */, 15 }, - /* 1282 */ { MAD_F(0x06ccd8f2) /* 0.425011582 */, 15 }, - /* 1283 */ { MAD_F(0x06cea881) /* 0.425453669 */, 15 }, - /* 1284 */ { MAD_F(0x06d07830) /* 0.425895871 */, 15 }, - /* 1285 */ { MAD_F(0x06d247fe) /* 0.426338188 */, 15 }, - /* 1286 */ { MAD_F(0x06d417ea) /* 0.426780620 */, 15 }, - /* 1287 */ { MAD_F(0x06d5e7f5) /* 0.427223166 */, 15 }, - /* 1288 */ { MAD_F(0x06d7b81f) /* 0.427665827 */, 15 }, - /* 1289 */ { MAD_F(0x06d98868) /* 0.428108603 */, 15 }, - /* 1290 */ { MAD_F(0x06db58cf) /* 0.428551493 */, 15 }, - /* 1291 */ { MAD_F(0x06dd2955) /* 0.428994497 */, 15 }, - /* 1292 */ { MAD_F(0x06def9fa) /* 0.429437616 */, 15 }, - /* 1293 */ { MAD_F(0x06e0cabe) /* 0.429880849 */, 15 }, - /* 1294 */ { MAD_F(0x06e29ba0) /* 0.430324197 */, 15 }, - /* 1295 */ { MAD_F(0x06e46ca1) /* 0.430767659 */, 15 }, - - /* 1296 */ { MAD_F(0x06e63dc0) /* 0.431211234 */, 15 }, - /* 1297 */ { MAD_F(0x06e80efe) /* 0.431654924 */, 15 }, - /* 1298 */ { MAD_F(0x06e9e05b) /* 0.432098728 */, 15 }, - /* 1299 */ { MAD_F(0x06ebb1d6) /* 0.432542647 */, 15 }, - /* 1300 */ { MAD_F(0x06ed8370) /* 0.432986678 */, 15 }, - /* 1301 */ { MAD_F(0x06ef5529) /* 0.433430824 */, 15 }, - /* 1302 */ { MAD_F(0x06f12700) /* 0.433875084 */, 15 }, - /* 1303 */ { MAD_F(0x06f2f8f5) /* 0.434319457 */, 15 }, - /* 1304 */ { MAD_F(0x06f4cb09) /* 0.434763944 */, 15 }, - /* 1305 */ { MAD_F(0x06f69d3c) /* 0.435208545 */, 15 }, - /* 1306 */ { MAD_F(0x06f86f8d) /* 0.435653259 */, 15 }, - /* 1307 */ { MAD_F(0x06fa41fd) /* 0.436098087 */, 15 }, - /* 1308 */ { MAD_F(0x06fc148b) /* 0.436543029 */, 15 }, - /* 1309 */ { MAD_F(0x06fde737) /* 0.436988083 */, 15 }, - /* 1310 */ { MAD_F(0x06ffba02) /* 0.437433251 */, 15 }, - /* 1311 */ { MAD_F(0x07018ceb) /* 0.437878533 */, 15 }, - - /* 1312 */ { MAD_F(0x07035ff3) /* 0.438323927 */, 15 }, - /* 1313 */ { MAD_F(0x07053319) /* 0.438769435 */, 15 }, - /* 1314 */ { MAD_F(0x0707065d) /* 0.439215056 */, 15 }, - /* 1315 */ { MAD_F(0x0708d9c0) /* 0.439660790 */, 15 }, - /* 1316 */ { MAD_F(0x070aad41) /* 0.440106636 */, 15 }, - /* 1317 */ { MAD_F(0x070c80e1) /* 0.440552596 */, 15 }, - /* 1318 */ { MAD_F(0x070e549f) /* 0.440998669 */, 15 }, - /* 1319 */ { MAD_F(0x0710287b) /* 0.441444855 */, 15 }, - /* 1320 */ { MAD_F(0x0711fc75) /* 0.441891153 */, 15 }, - /* 1321 */ { MAD_F(0x0713d08d) /* 0.442337564 */, 15 }, - /* 1322 */ { MAD_F(0x0715a4c4) /* 0.442784088 */, 15 }, - /* 1323 */ { MAD_F(0x07177919) /* 0.443230724 */, 15 }, - /* 1324 */ { MAD_F(0x07194d8c) /* 0.443677473 */, 15 }, - /* 1325 */ { MAD_F(0x071b221e) /* 0.444124334 */, 15 }, - /* 1326 */ { MAD_F(0x071cf6ce) /* 0.444571308 */, 15 }, - /* 1327 */ { MAD_F(0x071ecb9b) /* 0.445018394 */, 15 }, - - /* 1328 */ { MAD_F(0x0720a087) /* 0.445465593 */, 15 }, - /* 1329 */ { MAD_F(0x07227591) /* 0.445912903 */, 15 }, - /* 1330 */ { MAD_F(0x07244ab9) /* 0.446360326 */, 15 }, - /* 1331 */ { MAD_F(0x07262000) /* 0.446807861 */, 15 }, - /* 1332 */ { MAD_F(0x0727f564) /* 0.447255509 */, 15 }, - /* 1333 */ { MAD_F(0x0729cae7) /* 0.447703268 */, 15 }, - /* 1334 */ { MAD_F(0x072ba087) /* 0.448151139 */, 15 }, - /* 1335 */ { MAD_F(0x072d7646) /* 0.448599122 */, 15 }, - /* 1336 */ { MAD_F(0x072f4c22) /* 0.449047217 */, 15 }, - /* 1337 */ { MAD_F(0x0731221d) /* 0.449495424 */, 15 }, - /* 1338 */ { MAD_F(0x0732f835) /* 0.449943742 */, 15 }, - /* 1339 */ { MAD_F(0x0734ce6c) /* 0.450392173 */, 15 }, - /* 1340 */ { MAD_F(0x0736a4c1) /* 0.450840715 */, 15 }, - /* 1341 */ { MAD_F(0x07387b33) /* 0.451289368 */, 15 }, - /* 1342 */ { MAD_F(0x073a51c4) /* 0.451738133 */, 15 }, - /* 1343 */ { MAD_F(0x073c2872) /* 0.452187010 */, 15 }, - - /* 1344 */ { MAD_F(0x073dff3e) /* 0.452635998 */, 15 }, - /* 1345 */ { MAD_F(0x073fd628) /* 0.453085097 */, 15 }, - /* 1346 */ { MAD_F(0x0741ad30) /* 0.453534308 */, 15 }, - /* 1347 */ { MAD_F(0x07438456) /* 0.453983630 */, 15 }, - /* 1348 */ { MAD_F(0x07455b9a) /* 0.454433063 */, 15 }, - /* 1349 */ { MAD_F(0x074732fc) /* 0.454882607 */, 15 }, - /* 1350 */ { MAD_F(0x07490a7b) /* 0.455332262 */, 15 }, - /* 1351 */ { MAD_F(0x074ae218) /* 0.455782029 */, 15 }, - /* 1352 */ { MAD_F(0x074cb9d3) /* 0.456231906 */, 15 }, - /* 1353 */ { MAD_F(0x074e91ac) /* 0.456681894 */, 15 }, - /* 1354 */ { MAD_F(0x075069a3) /* 0.457131993 */, 15 }, - /* 1355 */ { MAD_F(0x075241b7) /* 0.457582203 */, 15 }, - /* 1356 */ { MAD_F(0x075419e9) /* 0.458032524 */, 15 }, - /* 1357 */ { MAD_F(0x0755f239) /* 0.458482956 */, 15 }, - /* 1358 */ { MAD_F(0x0757caa7) /* 0.458933498 */, 15 }, - /* 1359 */ { MAD_F(0x0759a332) /* 0.459384151 */, 15 }, - - /* 1360 */ { MAD_F(0x075b7bdb) /* 0.459834914 */, 15 }, - /* 1361 */ { MAD_F(0x075d54a1) /* 0.460285788 */, 15 }, - /* 1362 */ { MAD_F(0x075f2d85) /* 0.460736772 */, 15 }, - /* 1363 */ { MAD_F(0x07610687) /* 0.461187867 */, 15 }, - /* 1364 */ { MAD_F(0x0762dfa6) /* 0.461639071 */, 15 }, - /* 1365 */ { MAD_F(0x0764b8e3) /* 0.462090387 */, 15 }, - /* 1366 */ { MAD_F(0x0766923e) /* 0.462541812 */, 15 }, - /* 1367 */ { MAD_F(0x07686bb6) /* 0.462993348 */, 15 }, - /* 1368 */ { MAD_F(0x076a454c) /* 0.463444993 */, 15 }, - /* 1369 */ { MAD_F(0x076c1eff) /* 0.463896749 */, 15 }, - /* 1370 */ { MAD_F(0x076df8d0) /* 0.464348615 */, 15 }, - /* 1371 */ { MAD_F(0x076fd2be) /* 0.464800591 */, 15 }, - /* 1372 */ { MAD_F(0x0771acca) /* 0.465252676 */, 15 }, - /* 1373 */ { MAD_F(0x077386f3) /* 0.465704872 */, 15 }, - /* 1374 */ { MAD_F(0x0775613a) /* 0.466157177 */, 15 }, - /* 1375 */ { MAD_F(0x07773b9e) /* 0.466609592 */, 15 }, - - /* 1376 */ { MAD_F(0x07791620) /* 0.467062117 */, 15 }, - /* 1377 */ { MAD_F(0x077af0bf) /* 0.467514751 */, 15 }, - /* 1378 */ { MAD_F(0x077ccb7c) /* 0.467967495 */, 15 }, - /* 1379 */ { MAD_F(0x077ea656) /* 0.468420349 */, 15 }, - /* 1380 */ { MAD_F(0x0780814d) /* 0.468873312 */, 15 }, - /* 1381 */ { MAD_F(0x07825c62) /* 0.469326384 */, 15 }, - /* 1382 */ { MAD_F(0x07843794) /* 0.469779566 */, 15 }, - /* 1383 */ { MAD_F(0x078612e3) /* 0.470232857 */, 15 }, - /* 1384 */ { MAD_F(0x0787ee50) /* 0.470686258 */, 15 }, - /* 1385 */ { MAD_F(0x0789c9da) /* 0.471139767 */, 15 }, - /* 1386 */ { MAD_F(0x078ba581) /* 0.471593386 */, 15 }, - /* 1387 */ { MAD_F(0x078d8146) /* 0.472047114 */, 15 }, - /* 1388 */ { MAD_F(0x078f5d28) /* 0.472500951 */, 15 }, - /* 1389 */ { MAD_F(0x07913927) /* 0.472954896 */, 15 }, - /* 1390 */ { MAD_F(0x07931543) /* 0.473408951 */, 15 }, - /* 1391 */ { MAD_F(0x0794f17d) /* 0.473863115 */, 15 }, - - /* 1392 */ { MAD_F(0x0796cdd4) /* 0.474317388 */, 15 }, - /* 1393 */ { MAD_F(0x0798aa48) /* 0.474771769 */, 15 }, - /* 1394 */ { MAD_F(0x079a86d9) /* 0.475226259 */, 15 }, - /* 1395 */ { MAD_F(0x079c6388) /* 0.475680858 */, 15 }, - /* 1396 */ { MAD_F(0x079e4053) /* 0.476135565 */, 15 }, - /* 1397 */ { MAD_F(0x07a01d3c) /* 0.476590381 */, 15 }, - /* 1398 */ { MAD_F(0x07a1fa42) /* 0.477045306 */, 15 }, - /* 1399 */ { MAD_F(0x07a3d765) /* 0.477500339 */, 15 }, - /* 1400 */ { MAD_F(0x07a5b4a5) /* 0.477955481 */, 15 }, - /* 1401 */ { MAD_F(0x07a79202) /* 0.478410731 */, 15 }, - /* 1402 */ { MAD_F(0x07a96f7d) /* 0.478866089 */, 15 }, - /* 1403 */ { MAD_F(0x07ab4d14) /* 0.479321555 */, 15 }, - /* 1404 */ { MAD_F(0x07ad2ac8) /* 0.479777130 */, 15 }, - /* 1405 */ { MAD_F(0x07af089a) /* 0.480232813 */, 15 }, - /* 1406 */ { MAD_F(0x07b0e688) /* 0.480688604 */, 15 }, - /* 1407 */ { MAD_F(0x07b2c494) /* 0.481144503 */, 15 }, - - /* 1408 */ { MAD_F(0x07b4a2bc) /* 0.481600510 */, 15 }, - /* 1409 */ { MAD_F(0x07b68102) /* 0.482056625 */, 15 }, - /* 1410 */ { MAD_F(0x07b85f64) /* 0.482512848 */, 15 }, - /* 1411 */ { MAD_F(0x07ba3de4) /* 0.482969179 */, 15 }, - /* 1412 */ { MAD_F(0x07bc1c80) /* 0.483425618 */, 15 }, - /* 1413 */ { MAD_F(0x07bdfb39) /* 0.483882164 */, 15 }, - /* 1414 */ { MAD_F(0x07bfda0f) /* 0.484338818 */, 15 }, - /* 1415 */ { MAD_F(0x07c1b902) /* 0.484795580 */, 15 }, - /* 1416 */ { MAD_F(0x07c39812) /* 0.485252449 */, 15 }, - /* 1417 */ { MAD_F(0x07c5773f) /* 0.485709426 */, 15 }, - /* 1418 */ { MAD_F(0x07c75689) /* 0.486166511 */, 15 }, - /* 1419 */ { MAD_F(0x07c935ef) /* 0.486623703 */, 15 }, - /* 1420 */ { MAD_F(0x07cb1573) /* 0.487081002 */, 15 }, - /* 1421 */ { MAD_F(0x07ccf513) /* 0.487538409 */, 15 }, - /* 1422 */ { MAD_F(0x07ced4d0) /* 0.487995923 */, 15 }, - /* 1423 */ { MAD_F(0x07d0b4aa) /* 0.488453544 */, 15 }, - - /* 1424 */ { MAD_F(0x07d294a0) /* 0.488911273 */, 15 }, - /* 1425 */ { MAD_F(0x07d474b3) /* 0.489369108 */, 15 }, - /* 1426 */ { MAD_F(0x07d654e4) /* 0.489827051 */, 15 }, - /* 1427 */ { MAD_F(0x07d83530) /* 0.490285101 */, 15 }, - /* 1428 */ { MAD_F(0x07da159a) /* 0.490743258 */, 15 }, - /* 1429 */ { MAD_F(0x07dbf620) /* 0.491201522 */, 15 }, - /* 1430 */ { MAD_F(0x07ddd6c3) /* 0.491659892 */, 15 }, - /* 1431 */ { MAD_F(0x07dfb783) /* 0.492118370 */, 15 }, - /* 1432 */ { MAD_F(0x07e1985f) /* 0.492576954 */, 15 }, - /* 1433 */ { MAD_F(0x07e37958) /* 0.493035645 */, 15 }, - /* 1434 */ { MAD_F(0x07e55a6e) /* 0.493494443 */, 15 }, - /* 1435 */ { MAD_F(0x07e73ba0) /* 0.493953348 */, 15 }, - /* 1436 */ { MAD_F(0x07e91cef) /* 0.494412359 */, 15 }, - /* 1437 */ { MAD_F(0x07eafe5a) /* 0.494871476 */, 15 }, - /* 1438 */ { MAD_F(0x07ecdfe2) /* 0.495330701 */, 15 }, - /* 1439 */ { MAD_F(0x07eec187) /* 0.495790031 */, 15 }, - - /* 1440 */ { MAD_F(0x07f0a348) /* 0.496249468 */, 15 }, - /* 1441 */ { MAD_F(0x07f28526) /* 0.496709012 */, 15 }, - /* 1442 */ { MAD_F(0x07f46720) /* 0.497168662 */, 15 }, - /* 1443 */ { MAD_F(0x07f64937) /* 0.497628418 */, 15 }, - /* 1444 */ { MAD_F(0x07f82b6a) /* 0.498088280 */, 15 }, - /* 1445 */ { MAD_F(0x07fa0dba) /* 0.498548248 */, 15 }, - /* 1446 */ { MAD_F(0x07fbf026) /* 0.499008323 */, 15 }, - /* 1447 */ { MAD_F(0x07fdd2af) /* 0.499468503 */, 15 }, - /* 1448 */ { MAD_F(0x07ffb554) /* 0.499928790 */, 15 }, - /* 1449 */ { MAD_F(0x0400cc0b) /* 0.250194591 */, 16 }, - /* 1450 */ { MAD_F(0x0401bd7a) /* 0.250424840 */, 16 }, - /* 1451 */ { MAD_F(0x0402aef7) /* 0.250655143 */, 16 }, - /* 1452 */ { MAD_F(0x0403a083) /* 0.250885498 */, 16 }, - /* 1453 */ { MAD_F(0x0404921c) /* 0.251115906 */, 16 }, - /* 1454 */ { MAD_F(0x040583c4) /* 0.251346367 */, 16 }, - /* 1455 */ { MAD_F(0x0406757a) /* 0.251576880 */, 16 }, - - /* 1456 */ { MAD_F(0x0407673f) /* 0.251807447 */, 16 }, - /* 1457 */ { MAD_F(0x04085911) /* 0.252038066 */, 16 }, - /* 1458 */ { MAD_F(0x04094af1) /* 0.252268738 */, 16 }, - /* 1459 */ { MAD_F(0x040a3ce0) /* 0.252499463 */, 16 }, - /* 1460 */ { MAD_F(0x040b2edd) /* 0.252730240 */, 16 }, - /* 1461 */ { MAD_F(0x040c20e8) /* 0.252961071 */, 16 }, - /* 1462 */ { MAD_F(0x040d1301) /* 0.253191953 */, 16 }, - /* 1463 */ { MAD_F(0x040e0529) /* 0.253422889 */, 16 }, - /* 1464 */ { MAD_F(0x040ef75e) /* 0.253653877 */, 16 }, - /* 1465 */ { MAD_F(0x040fe9a1) /* 0.253884918 */, 16 }, - /* 1466 */ { MAD_F(0x0410dbf3) /* 0.254116011 */, 16 }, - /* 1467 */ { MAD_F(0x0411ce53) /* 0.254347157 */, 16 }, - /* 1468 */ { MAD_F(0x0412c0c1) /* 0.254578356 */, 16 }, - /* 1469 */ { MAD_F(0x0413b33d) /* 0.254809606 */, 16 }, - /* 1470 */ { MAD_F(0x0414a5c7) /* 0.255040910 */, 16 }, - /* 1471 */ { MAD_F(0x0415985f) /* 0.255272266 */, 16 }, - - /* 1472 */ { MAD_F(0x04168b05) /* 0.255503674 */, 16 }, - /* 1473 */ { MAD_F(0x04177db9) /* 0.255735135 */, 16 }, - /* 1474 */ { MAD_F(0x0418707c) /* 0.255966648 */, 16 }, - /* 1475 */ { MAD_F(0x0419634c) /* 0.256198213 */, 16 }, - /* 1476 */ { MAD_F(0x041a562a) /* 0.256429831 */, 16 }, - /* 1477 */ { MAD_F(0x041b4917) /* 0.256661501 */, 16 }, - /* 1478 */ { MAD_F(0x041c3c11) /* 0.256893223 */, 16 }, - /* 1479 */ { MAD_F(0x041d2f1a) /* 0.257124998 */, 16 }, - /* 1480 */ { MAD_F(0x041e2230) /* 0.257356825 */, 16 }, - /* 1481 */ { MAD_F(0x041f1555) /* 0.257588704 */, 16 }, - /* 1482 */ { MAD_F(0x04200888) /* 0.257820635 */, 16 }, - /* 1483 */ { MAD_F(0x0420fbc8) /* 0.258052619 */, 16 }, - /* 1484 */ { MAD_F(0x0421ef17) /* 0.258284654 */, 16 }, - /* 1485 */ { MAD_F(0x0422e273) /* 0.258516742 */, 16 }, - /* 1486 */ { MAD_F(0x0423d5de) /* 0.258748882 */, 16 }, - /* 1487 */ { MAD_F(0x0424c956) /* 0.258981074 */, 16 }, - - /* 1488 */ { MAD_F(0x0425bcdd) /* 0.259213318 */, 16 }, - /* 1489 */ { MAD_F(0x0426b071) /* 0.259445614 */, 16 }, - /* 1490 */ { MAD_F(0x0427a414) /* 0.259677962 */, 16 }, - /* 1491 */ { MAD_F(0x042897c4) /* 0.259910362 */, 16 }, - /* 1492 */ { MAD_F(0x04298b83) /* 0.260142814 */, 16 }, - /* 1493 */ { MAD_F(0x042a7f4f) /* 0.260375318 */, 16 }, - /* 1494 */ { MAD_F(0x042b7329) /* 0.260607874 */, 16 }, - /* 1495 */ { MAD_F(0x042c6711) /* 0.260840481 */, 16 }, - /* 1496 */ { MAD_F(0x042d5b07) /* 0.261073141 */, 16 }, - /* 1497 */ { MAD_F(0x042e4f0b) /* 0.261305852 */, 16 }, - /* 1498 */ { MAD_F(0x042f431d) /* 0.261538616 */, 16 }, - /* 1499 */ { MAD_F(0x0430373d) /* 0.261771431 */, 16 }, - /* 1500 */ { MAD_F(0x04312b6b) /* 0.262004297 */, 16 }, - /* 1501 */ { MAD_F(0x04321fa6) /* 0.262237216 */, 16 }, - /* 1502 */ { MAD_F(0x043313f0) /* 0.262470186 */, 16 }, - /* 1503 */ { MAD_F(0x04340847) /* 0.262703208 */, 16 }, - - /* 1504 */ { MAD_F(0x0434fcad) /* 0.262936282 */, 16 }, - /* 1505 */ { MAD_F(0x0435f120) /* 0.263169407 */, 16 }, - /* 1506 */ { MAD_F(0x0436e5a1) /* 0.263402584 */, 16 }, - /* 1507 */ { MAD_F(0x0437da2f) /* 0.263635813 */, 16 }, - /* 1508 */ { MAD_F(0x0438cecc) /* 0.263869093 */, 16 }, - /* 1509 */ { MAD_F(0x0439c377) /* 0.264102425 */, 16 }, - /* 1510 */ { MAD_F(0x043ab82f) /* 0.264335808 */, 16 }, - /* 1511 */ { MAD_F(0x043bacf5) /* 0.264569243 */, 16 }, - /* 1512 */ { MAD_F(0x043ca1c9) /* 0.264802730 */, 16 }, - /* 1513 */ { MAD_F(0x043d96ab) /* 0.265036267 */, 16 }, - /* 1514 */ { MAD_F(0x043e8b9b) /* 0.265269857 */, 16 }, - /* 1515 */ { MAD_F(0x043f8098) /* 0.265503498 */, 16 }, - /* 1516 */ { MAD_F(0x044075a3) /* 0.265737190 */, 16 }, - /* 1517 */ { MAD_F(0x04416abc) /* 0.265970933 */, 16 }, - /* 1518 */ { MAD_F(0x04425fe3) /* 0.266204728 */, 16 }, - /* 1519 */ { MAD_F(0x04435518) /* 0.266438574 */, 16 }, - - /* 1520 */ { MAD_F(0x04444a5a) /* 0.266672472 */, 16 }, - /* 1521 */ { MAD_F(0x04453fab) /* 0.266906421 */, 16 }, - /* 1522 */ { MAD_F(0x04463508) /* 0.267140421 */, 16 }, - /* 1523 */ { MAD_F(0x04472a74) /* 0.267374472 */, 16 }, - /* 1524 */ { MAD_F(0x04481fee) /* 0.267608575 */, 16 }, - /* 1525 */ { MAD_F(0x04491575) /* 0.267842729 */, 16 }, - /* 1526 */ { MAD_F(0x044a0b0a) /* 0.268076934 */, 16 }, - /* 1527 */ { MAD_F(0x044b00ac) /* 0.268311190 */, 16 }, - /* 1528 */ { MAD_F(0x044bf65d) /* 0.268545497 */, 16 }, - /* 1529 */ { MAD_F(0x044cec1b) /* 0.268779856 */, 16 }, - /* 1530 */ { MAD_F(0x044de1e7) /* 0.269014265 */, 16 }, - /* 1531 */ { MAD_F(0x044ed7c0) /* 0.269248726 */, 16 }, - /* 1532 */ { MAD_F(0x044fcda8) /* 0.269483238 */, 16 }, - /* 1533 */ { MAD_F(0x0450c39c) /* 0.269717800 */, 16 }, - /* 1534 */ { MAD_F(0x0451b99f) /* 0.269952414 */, 16 }, - /* 1535 */ { MAD_F(0x0452afaf) /* 0.270187079 */, 16 }, - - /* 1536 */ { MAD_F(0x0453a5cd) /* 0.270421794 */, 16 }, - /* 1537 */ { MAD_F(0x04549bf9) /* 0.270656561 */, 16 }, - /* 1538 */ { MAD_F(0x04559232) /* 0.270891379 */, 16 }, - /* 1539 */ { MAD_F(0x04568879) /* 0.271126247 */, 16 }, - /* 1540 */ { MAD_F(0x04577ece) /* 0.271361166 */, 16 }, - /* 1541 */ { MAD_F(0x04587530) /* 0.271596136 */, 16 }, - /* 1542 */ { MAD_F(0x04596ba0) /* 0.271831157 */, 16 }, - /* 1543 */ { MAD_F(0x045a621e) /* 0.272066229 */, 16 }, - /* 1544 */ { MAD_F(0x045b58a9) /* 0.272301352 */, 16 }, - /* 1545 */ { MAD_F(0x045c4f42) /* 0.272536525 */, 16 }, - /* 1546 */ { MAD_F(0x045d45e9) /* 0.272771749 */, 16 }, - /* 1547 */ { MAD_F(0x045e3c9d) /* 0.273007024 */, 16 }, - /* 1548 */ { MAD_F(0x045f335e) /* 0.273242350 */, 16 }, - /* 1549 */ { MAD_F(0x04602a2e) /* 0.273477726 */, 16 }, - /* 1550 */ { MAD_F(0x0461210b) /* 0.273713153 */, 16 }, - /* 1551 */ { MAD_F(0x046217f5) /* 0.273948630 */, 16 }, - - /* 1552 */ { MAD_F(0x04630eed) /* 0.274184158 */, 16 }, - /* 1553 */ { MAD_F(0x046405f3) /* 0.274419737 */, 16 }, - /* 1554 */ { MAD_F(0x0464fd06) /* 0.274655366 */, 16 }, - /* 1555 */ { MAD_F(0x0465f427) /* 0.274891046 */, 16 }, - /* 1556 */ { MAD_F(0x0466eb55) /* 0.275126776 */, 16 }, - /* 1557 */ { MAD_F(0x0467e291) /* 0.275362557 */, 16 }, - /* 1558 */ { MAD_F(0x0468d9db) /* 0.275598389 */, 16 }, - /* 1559 */ { MAD_F(0x0469d132) /* 0.275834270 */, 16 }, - /* 1560 */ { MAD_F(0x046ac896) /* 0.276070203 */, 16 }, - /* 1561 */ { MAD_F(0x046bc009) /* 0.276306185 */, 16 }, - /* 1562 */ { MAD_F(0x046cb788) /* 0.276542218 */, 16 }, - /* 1563 */ { MAD_F(0x046daf15) /* 0.276778302 */, 16 }, - /* 1564 */ { MAD_F(0x046ea6b0) /* 0.277014435 */, 16 }, - /* 1565 */ { MAD_F(0x046f9e58) /* 0.277250619 */, 16 }, - /* 1566 */ { MAD_F(0x0470960e) /* 0.277486854 */, 16 }, - /* 1567 */ { MAD_F(0x04718dd1) /* 0.277723139 */, 16 }, - - /* 1568 */ { MAD_F(0x047285a2) /* 0.277959474 */, 16 }, - /* 1569 */ { MAD_F(0x04737d80) /* 0.278195859 */, 16 }, - /* 1570 */ { MAD_F(0x0474756c) /* 0.278432294 */, 16 }, - /* 1571 */ { MAD_F(0x04756d65) /* 0.278668780 */, 16 }, - /* 1572 */ { MAD_F(0x0476656b) /* 0.278905316 */, 16 }, - /* 1573 */ { MAD_F(0x04775d7f) /* 0.279141902 */, 16 }, - /* 1574 */ { MAD_F(0x047855a1) /* 0.279378538 */, 16 }, - /* 1575 */ { MAD_F(0x04794dd0) /* 0.279615224 */, 16 }, - /* 1576 */ { MAD_F(0x047a460c) /* 0.279851960 */, 16 }, - /* 1577 */ { MAD_F(0x047b3e56) /* 0.280088747 */, 16 }, - /* 1578 */ { MAD_F(0x047c36ae) /* 0.280325583 */, 16 }, - /* 1579 */ { MAD_F(0x047d2f12) /* 0.280562470 */, 16 }, - /* 1580 */ { MAD_F(0x047e2784) /* 0.280799406 */, 16 }, - /* 1581 */ { MAD_F(0x047f2004) /* 0.281036393 */, 16 }, - /* 1582 */ { MAD_F(0x04801891) /* 0.281273429 */, 16 }, - /* 1583 */ { MAD_F(0x0481112b) /* 0.281510516 */, 16 }, - - /* 1584 */ { MAD_F(0x048209d3) /* 0.281747652 */, 16 }, - /* 1585 */ { MAD_F(0x04830288) /* 0.281984838 */, 16 }, - /* 1586 */ { MAD_F(0x0483fb4b) /* 0.282222075 */, 16 }, - /* 1587 */ { MAD_F(0x0484f41b) /* 0.282459361 */, 16 }, - /* 1588 */ { MAD_F(0x0485ecf8) /* 0.282696697 */, 16 }, - /* 1589 */ { MAD_F(0x0486e5e3) /* 0.282934082 */, 16 }, - /* 1590 */ { MAD_F(0x0487dedb) /* 0.283171518 */, 16 }, - /* 1591 */ { MAD_F(0x0488d7e1) /* 0.283409003 */, 16 }, - /* 1592 */ { MAD_F(0x0489d0f4) /* 0.283646538 */, 16 }, - /* 1593 */ { MAD_F(0x048aca14) /* 0.283884123 */, 16 }, - /* 1594 */ { MAD_F(0x048bc341) /* 0.284121757 */, 16 }, - /* 1595 */ { MAD_F(0x048cbc7c) /* 0.284359441 */, 16 }, - /* 1596 */ { MAD_F(0x048db5c4) /* 0.284597175 */, 16 }, - /* 1597 */ { MAD_F(0x048eaf1a) /* 0.284834959 */, 16 }, - /* 1598 */ { MAD_F(0x048fa87d) /* 0.285072792 */, 16 }, - /* 1599 */ { MAD_F(0x0490a1ed) /* 0.285310675 */, 16 }, - - /* 1600 */ { MAD_F(0x04919b6a) /* 0.285548607 */, 16 }, - /* 1601 */ { MAD_F(0x049294f5) /* 0.285786589 */, 16 }, - /* 1602 */ { MAD_F(0x04938e8d) /* 0.286024621 */, 16 }, - /* 1603 */ { MAD_F(0x04948833) /* 0.286262702 */, 16 }, - /* 1604 */ { MAD_F(0x049581e5) /* 0.286500832 */, 16 }, - /* 1605 */ { MAD_F(0x04967ba5) /* 0.286739012 */, 16 }, - /* 1606 */ { MAD_F(0x04977573) /* 0.286977242 */, 16 }, - /* 1607 */ { MAD_F(0x04986f4d) /* 0.287215521 */, 16 }, - /* 1608 */ { MAD_F(0x04996935) /* 0.287453849 */, 16 }, - /* 1609 */ { MAD_F(0x049a632a) /* 0.287692227 */, 16 }, - /* 1610 */ { MAD_F(0x049b5d2c) /* 0.287930654 */, 16 }, - /* 1611 */ { MAD_F(0x049c573c) /* 0.288169131 */, 16 }, - /* 1612 */ { MAD_F(0x049d5159) /* 0.288407657 */, 16 }, - /* 1613 */ { MAD_F(0x049e4b83) /* 0.288646232 */, 16 }, - /* 1614 */ { MAD_F(0x049f45ba) /* 0.288884857 */, 16 }, - /* 1615 */ { MAD_F(0x04a03ffe) /* 0.289123530 */, 16 }, - - /* 1616 */ { MAD_F(0x04a13a50) /* 0.289362253 */, 16 }, - /* 1617 */ { MAD_F(0x04a234af) /* 0.289601026 */, 16 }, - /* 1618 */ { MAD_F(0x04a32f1b) /* 0.289839847 */, 16 }, - /* 1619 */ { MAD_F(0x04a42995) /* 0.290078718 */, 16 }, - /* 1620 */ { MAD_F(0x04a5241b) /* 0.290317638 */, 16 }, - /* 1621 */ { MAD_F(0x04a61eaf) /* 0.290556607 */, 16 }, - /* 1622 */ { MAD_F(0x04a71950) /* 0.290795626 */, 16 }, - /* 1623 */ { MAD_F(0x04a813fe) /* 0.291034693 */, 16 }, - /* 1624 */ { MAD_F(0x04a90eba) /* 0.291273810 */, 16 }, - /* 1625 */ { MAD_F(0x04aa0982) /* 0.291512975 */, 16 }, - /* 1626 */ { MAD_F(0x04ab0458) /* 0.291752190 */, 16 }, - /* 1627 */ { MAD_F(0x04abff3b) /* 0.291991453 */, 16 }, - /* 1628 */ { MAD_F(0x04acfa2b) /* 0.292230766 */, 16 }, - /* 1629 */ { MAD_F(0x04adf528) /* 0.292470128 */, 16 }, - /* 1630 */ { MAD_F(0x04aef032) /* 0.292709539 */, 16 }, - /* 1631 */ { MAD_F(0x04afeb4a) /* 0.292948998 */, 16 }, - - /* 1632 */ { MAD_F(0x04b0e66e) /* 0.293188507 */, 16 }, - /* 1633 */ { MAD_F(0x04b1e1a0) /* 0.293428065 */, 16 }, - /* 1634 */ { MAD_F(0x04b2dcdf) /* 0.293667671 */, 16 }, - /* 1635 */ { MAD_F(0x04b3d82b) /* 0.293907326 */, 16 }, - /* 1636 */ { MAD_F(0x04b4d384) /* 0.294147031 */, 16 }, - /* 1637 */ { MAD_F(0x04b5ceea) /* 0.294386784 */, 16 }, - /* 1638 */ { MAD_F(0x04b6ca5e) /* 0.294626585 */, 16 }, - /* 1639 */ { MAD_F(0x04b7c5de) /* 0.294866436 */, 16 }, - /* 1640 */ { MAD_F(0x04b8c16c) /* 0.295106336 */, 16 }, - /* 1641 */ { MAD_F(0x04b9bd06) /* 0.295346284 */, 16 }, - /* 1642 */ { MAD_F(0x04bab8ae) /* 0.295586281 */, 16 }, - /* 1643 */ { MAD_F(0x04bbb463) /* 0.295826327 */, 16 }, - /* 1644 */ { MAD_F(0x04bcb024) /* 0.296066421 */, 16 }, - /* 1645 */ { MAD_F(0x04bdabf3) /* 0.296306564 */, 16 }, - /* 1646 */ { MAD_F(0x04bea7cf) /* 0.296546756 */, 16 }, - /* 1647 */ { MAD_F(0x04bfa3b8) /* 0.296786996 */, 16 }, - - /* 1648 */ { MAD_F(0x04c09faf) /* 0.297027285 */, 16 }, - /* 1649 */ { MAD_F(0x04c19bb2) /* 0.297267623 */, 16 }, - /* 1650 */ { MAD_F(0x04c297c2) /* 0.297508009 */, 16 }, - /* 1651 */ { MAD_F(0x04c393df) /* 0.297748444 */, 16 }, - /* 1652 */ { MAD_F(0x04c49009) /* 0.297988927 */, 16 }, - /* 1653 */ { MAD_F(0x04c58c41) /* 0.298229459 */, 16 }, - /* 1654 */ { MAD_F(0x04c68885) /* 0.298470039 */, 16 }, - /* 1655 */ { MAD_F(0x04c784d6) /* 0.298710668 */, 16 }, - /* 1656 */ { MAD_F(0x04c88135) /* 0.298951346 */, 16 }, - /* 1657 */ { MAD_F(0x04c97da0) /* 0.299192071 */, 16 }, - /* 1658 */ { MAD_F(0x04ca7a18) /* 0.299432846 */, 16 }, - /* 1659 */ { MAD_F(0x04cb769e) /* 0.299673668 */, 16 }, - /* 1660 */ { MAD_F(0x04cc7330) /* 0.299914539 */, 16 }, - /* 1661 */ { MAD_F(0x04cd6fcf) /* 0.300155459 */, 16 }, - /* 1662 */ { MAD_F(0x04ce6c7b) /* 0.300396426 */, 16 }, - /* 1663 */ { MAD_F(0x04cf6935) /* 0.300637443 */, 16 }, - - /* 1664 */ { MAD_F(0x04d065fb) /* 0.300878507 */, 16 }, - /* 1665 */ { MAD_F(0x04d162ce) /* 0.301119620 */, 16 }, - /* 1666 */ { MAD_F(0x04d25fae) /* 0.301360781 */, 16 }, - /* 1667 */ { MAD_F(0x04d35c9b) /* 0.301601990 */, 16 }, - /* 1668 */ { MAD_F(0x04d45995) /* 0.301843247 */, 16 }, - /* 1669 */ { MAD_F(0x04d5569c) /* 0.302084553 */, 16 }, - /* 1670 */ { MAD_F(0x04d653b0) /* 0.302325907 */, 16 }, - /* 1671 */ { MAD_F(0x04d750d1) /* 0.302567309 */, 16 }, - /* 1672 */ { MAD_F(0x04d84dff) /* 0.302808759 */, 16 }, - /* 1673 */ { MAD_F(0x04d94b3a) /* 0.303050257 */, 16 }, - /* 1674 */ { MAD_F(0x04da4881) /* 0.303291804 */, 16 }, - /* 1675 */ { MAD_F(0x04db45d6) /* 0.303533399 */, 16 }, - /* 1676 */ { MAD_F(0x04dc4337) /* 0.303775041 */, 16 }, - /* 1677 */ { MAD_F(0x04dd40a6) /* 0.304016732 */, 16 }, - /* 1678 */ { MAD_F(0x04de3e21) /* 0.304258471 */, 16 }, - /* 1679 */ { MAD_F(0x04df3ba9) /* 0.304500257 */, 16 }, - - /* 1680 */ { MAD_F(0x04e0393e) /* 0.304742092 */, 16 }, - /* 1681 */ { MAD_F(0x04e136e0) /* 0.304983975 */, 16 }, - /* 1682 */ { MAD_F(0x04e2348f) /* 0.305225906 */, 16 }, - /* 1683 */ { MAD_F(0x04e3324b) /* 0.305467885 */, 16 }, - /* 1684 */ { MAD_F(0x04e43013) /* 0.305709911 */, 16 }, - /* 1685 */ { MAD_F(0x04e52de9) /* 0.305951986 */, 16 }, - /* 1686 */ { MAD_F(0x04e62bcb) /* 0.306194108 */, 16 }, - /* 1687 */ { MAD_F(0x04e729ba) /* 0.306436279 */, 16 }, - /* 1688 */ { MAD_F(0x04e827b6) /* 0.306678497 */, 16 }, - /* 1689 */ { MAD_F(0x04e925bf) /* 0.306920763 */, 16 }, - /* 1690 */ { MAD_F(0x04ea23d4) /* 0.307163077 */, 16 }, - /* 1691 */ { MAD_F(0x04eb21f7) /* 0.307405438 */, 16 }, - /* 1692 */ { MAD_F(0x04ec2026) /* 0.307647848 */, 16 }, - /* 1693 */ { MAD_F(0x04ed1e62) /* 0.307890305 */, 16 }, - /* 1694 */ { MAD_F(0x04ee1cab) /* 0.308132810 */, 16 }, - /* 1695 */ { MAD_F(0x04ef1b01) /* 0.308375362 */, 16 }, - - /* 1696 */ { MAD_F(0x04f01963) /* 0.308617963 */, 16 }, - /* 1697 */ { MAD_F(0x04f117d3) /* 0.308860611 */, 16 }, - /* 1698 */ { MAD_F(0x04f2164f) /* 0.309103306 */, 16 }, - /* 1699 */ { MAD_F(0x04f314d8) /* 0.309346050 */, 16 }, - /* 1700 */ { MAD_F(0x04f4136d) /* 0.309588841 */, 16 }, - /* 1701 */ { MAD_F(0x04f51210) /* 0.309831679 */, 16 }, - /* 1702 */ { MAD_F(0x04f610bf) /* 0.310074565 */, 16 }, - /* 1703 */ { MAD_F(0x04f70f7b) /* 0.310317499 */, 16 }, - /* 1704 */ { MAD_F(0x04f80e44) /* 0.310560480 */, 16 }, - /* 1705 */ { MAD_F(0x04f90d19) /* 0.310803509 */, 16 }, - /* 1706 */ { MAD_F(0x04fa0bfc) /* 0.311046586 */, 16 }, - /* 1707 */ { MAD_F(0x04fb0aeb) /* 0.311289710 */, 16 }, - /* 1708 */ { MAD_F(0x04fc09e7) /* 0.311532881 */, 16 }, - /* 1709 */ { MAD_F(0x04fd08ef) /* 0.311776100 */, 16 }, - /* 1710 */ { MAD_F(0x04fe0805) /* 0.312019366 */, 16 }, - /* 1711 */ { MAD_F(0x04ff0727) /* 0.312262680 */, 16 }, - - /* 1712 */ { MAD_F(0x05000655) /* 0.312506041 */, 16 }, - /* 1713 */ { MAD_F(0x05010591) /* 0.312749449 */, 16 }, - /* 1714 */ { MAD_F(0x050204d9) /* 0.312992905 */, 16 }, - /* 1715 */ { MAD_F(0x0503042e) /* 0.313236408 */, 16 }, - /* 1716 */ { MAD_F(0x0504038f) /* 0.313479959 */, 16 }, - /* 1717 */ { MAD_F(0x050502fe) /* 0.313723556 */, 16 }, - /* 1718 */ { MAD_F(0x05060279) /* 0.313967202 */, 16 }, - /* 1719 */ { MAD_F(0x05070200) /* 0.314210894 */, 16 }, - /* 1720 */ { MAD_F(0x05080195) /* 0.314454634 */, 16 }, - /* 1721 */ { MAD_F(0x05090136) /* 0.314698420 */, 16 }, - /* 1722 */ { MAD_F(0x050a00e3) /* 0.314942255 */, 16 }, - /* 1723 */ { MAD_F(0x050b009e) /* 0.315186136 */, 16 }, - /* 1724 */ { MAD_F(0x050c0065) /* 0.315430064 */, 16 }, - /* 1725 */ { MAD_F(0x050d0039) /* 0.315674040 */, 16 }, - /* 1726 */ { MAD_F(0x050e0019) /* 0.315918063 */, 16 }, - /* 1727 */ { MAD_F(0x050f0006) /* 0.316162133 */, 16 }, - - /* 1728 */ { MAD_F(0x05100000) /* 0.316406250 */, 16 }, - /* 1729 */ { MAD_F(0x05110006) /* 0.316650414 */, 16 }, - /* 1730 */ { MAD_F(0x05120019) /* 0.316894625 */, 16 }, - /* 1731 */ { MAD_F(0x05130039) /* 0.317138884 */, 16 }, - /* 1732 */ { MAD_F(0x05140065) /* 0.317383189 */, 16 }, - /* 1733 */ { MAD_F(0x0515009e) /* 0.317627541 */, 16 }, - /* 1734 */ { MAD_F(0x051600e3) /* 0.317871941 */, 16 }, - /* 1735 */ { MAD_F(0x05170135) /* 0.318116387 */, 16 }, - /* 1736 */ { MAD_F(0x05180194) /* 0.318360880 */, 16 }, - /* 1737 */ { MAD_F(0x051901ff) /* 0.318605421 */, 16 }, - /* 1738 */ { MAD_F(0x051a0277) /* 0.318850008 */, 16 }, - /* 1739 */ { MAD_F(0x051b02fc) /* 0.319094642 */, 16 }, - /* 1740 */ { MAD_F(0x051c038d) /* 0.319339323 */, 16 }, - /* 1741 */ { MAD_F(0x051d042a) /* 0.319584051 */, 16 }, - /* 1742 */ { MAD_F(0x051e04d4) /* 0.319828826 */, 16 }, - /* 1743 */ { MAD_F(0x051f058b) /* 0.320073647 */, 16 }, - - /* 1744 */ { MAD_F(0x0520064f) /* 0.320318516 */, 16 }, - /* 1745 */ { MAD_F(0x0521071f) /* 0.320563431 */, 16 }, - /* 1746 */ { MAD_F(0x052207fb) /* 0.320808393 */, 16 }, - /* 1747 */ { MAD_F(0x052308e4) /* 0.321053402 */, 16 }, - /* 1748 */ { MAD_F(0x052409da) /* 0.321298457 */, 16 }, - /* 1749 */ { MAD_F(0x05250adc) /* 0.321543560 */, 16 }, - /* 1750 */ { MAD_F(0x05260bea) /* 0.321788709 */, 16 }, - /* 1751 */ { MAD_F(0x05270d06) /* 0.322033904 */, 16 }, - /* 1752 */ { MAD_F(0x05280e2d) /* 0.322279147 */, 16 }, - /* 1753 */ { MAD_F(0x05290f62) /* 0.322524436 */, 16 }, - /* 1754 */ { MAD_F(0x052a10a3) /* 0.322769771 */, 16 }, - /* 1755 */ { MAD_F(0x052b11f0) /* 0.323015154 */, 16 }, - /* 1756 */ { MAD_F(0x052c134a) /* 0.323260583 */, 16 }, - /* 1757 */ { MAD_F(0x052d14b0) /* 0.323506058 */, 16 }, - /* 1758 */ { MAD_F(0x052e1623) /* 0.323751580 */, 16 }, - /* 1759 */ { MAD_F(0x052f17a2) /* 0.323997149 */, 16 }, - - /* 1760 */ { MAD_F(0x0530192e) /* 0.324242764 */, 16 }, - /* 1761 */ { MAD_F(0x05311ac6) /* 0.324488426 */, 16 }, - /* 1762 */ { MAD_F(0x05321c6b) /* 0.324734134 */, 16 }, - /* 1763 */ { MAD_F(0x05331e1c) /* 0.324979889 */, 16 }, - /* 1764 */ { MAD_F(0x05341fda) /* 0.325225690 */, 16 }, - /* 1765 */ { MAD_F(0x053521a4) /* 0.325471538 */, 16 }, - /* 1766 */ { MAD_F(0x0536237b) /* 0.325717432 */, 16 }, - /* 1767 */ { MAD_F(0x0537255e) /* 0.325963372 */, 16 }, - /* 1768 */ { MAD_F(0x0538274e) /* 0.326209359 */, 16 }, - /* 1769 */ { MAD_F(0x0539294a) /* 0.326455392 */, 16 }, - /* 1770 */ { MAD_F(0x053a2b52) /* 0.326701472 */, 16 }, - /* 1771 */ { MAD_F(0x053b2d67) /* 0.326947598 */, 16 }, - /* 1772 */ { MAD_F(0x053c2f89) /* 0.327193770 */, 16 }, - /* 1773 */ { MAD_F(0x053d31b6) /* 0.327439989 */, 16 }, - /* 1774 */ { MAD_F(0x053e33f1) /* 0.327686254 */, 16 }, - /* 1775 */ { MAD_F(0x053f3637) /* 0.327932565 */, 16 }, - - /* 1776 */ { MAD_F(0x0540388a) /* 0.328178922 */, 16 }, - /* 1777 */ { MAD_F(0x05413aea) /* 0.328425326 */, 16 }, - /* 1778 */ { MAD_F(0x05423d56) /* 0.328671776 */, 16 }, - /* 1779 */ { MAD_F(0x05433fce) /* 0.328918272 */, 16 }, - /* 1780 */ { MAD_F(0x05444253) /* 0.329164814 */, 16 }, - /* 1781 */ { MAD_F(0x054544e4) /* 0.329411403 */, 16 }, - /* 1782 */ { MAD_F(0x05464781) /* 0.329658038 */, 16 }, - /* 1783 */ { MAD_F(0x05474a2b) /* 0.329904718 */, 16 }, - /* 1784 */ { MAD_F(0x05484ce2) /* 0.330151445 */, 16 }, - /* 1785 */ { MAD_F(0x05494fa4) /* 0.330398218 */, 16 }, - /* 1786 */ { MAD_F(0x054a5273) /* 0.330645037 */, 16 }, - /* 1787 */ { MAD_F(0x054b554e) /* 0.330891903 */, 16 }, - /* 1788 */ { MAD_F(0x054c5836) /* 0.331138814 */, 16 }, - /* 1789 */ { MAD_F(0x054d5b2a) /* 0.331385771 */, 16 }, - /* 1790 */ { MAD_F(0x054e5e2b) /* 0.331632774 */, 16 }, - /* 1791 */ { MAD_F(0x054f6138) /* 0.331879824 */, 16 }, - - /* 1792 */ { MAD_F(0x05506451) /* 0.332126919 */, 16 }, - /* 1793 */ { MAD_F(0x05516776) /* 0.332374060 */, 16 }, - /* 1794 */ { MAD_F(0x05526aa8) /* 0.332621247 */, 16 }, - /* 1795 */ { MAD_F(0x05536de6) /* 0.332868480 */, 16 }, - /* 1796 */ { MAD_F(0x05547131) /* 0.333115759 */, 16 }, - /* 1797 */ { MAD_F(0x05557487) /* 0.333363084 */, 16 }, - /* 1798 */ { MAD_F(0x055677ea) /* 0.333610455 */, 16 }, - /* 1799 */ { MAD_F(0x05577b5a) /* 0.333857872 */, 16 }, - /* 1800 */ { MAD_F(0x05587ed5) /* 0.334105334 */, 16 }, - /* 1801 */ { MAD_F(0x0559825e) /* 0.334352843 */, 16 }, - /* 1802 */ { MAD_F(0x055a85f2) /* 0.334600397 */, 16 }, - /* 1803 */ { MAD_F(0x055b8992) /* 0.334847997 */, 16 }, - /* 1804 */ { MAD_F(0x055c8d3f) /* 0.335095642 */, 16 }, - /* 1805 */ { MAD_F(0x055d90f9) /* 0.335343334 */, 16 }, - /* 1806 */ { MAD_F(0x055e94be) /* 0.335591071 */, 16 }, - /* 1807 */ { MAD_F(0x055f9890) /* 0.335838854 */, 16 }, - - /* 1808 */ { MAD_F(0x05609c6e) /* 0.336086683 */, 16 }, - /* 1809 */ { MAD_F(0x0561a058) /* 0.336334557 */, 16 }, - /* 1810 */ { MAD_F(0x0562a44f) /* 0.336582477 */, 16 }, - /* 1811 */ { MAD_F(0x0563a851) /* 0.336830443 */, 16 }, - /* 1812 */ { MAD_F(0x0564ac60) /* 0.337078454 */, 16 }, - /* 1813 */ { MAD_F(0x0565b07c) /* 0.337326511 */, 16 }, - /* 1814 */ { MAD_F(0x0566b4a3) /* 0.337574614 */, 16 }, - /* 1815 */ { MAD_F(0x0567b8d7) /* 0.337822762 */, 16 }, - /* 1816 */ { MAD_F(0x0568bd17) /* 0.338070956 */, 16 }, - /* 1817 */ { MAD_F(0x0569c163) /* 0.338319195 */, 16 }, - /* 1818 */ { MAD_F(0x056ac5bc) /* 0.338567480 */, 16 }, - /* 1819 */ { MAD_F(0x056bca20) /* 0.338815811 */, 16 }, - /* 1820 */ { MAD_F(0x056cce91) /* 0.339064186 */, 16 }, - /* 1821 */ { MAD_F(0x056dd30e) /* 0.339312608 */, 16 }, - /* 1822 */ { MAD_F(0x056ed798) /* 0.339561075 */, 16 }, - /* 1823 */ { MAD_F(0x056fdc2d) /* 0.339809587 */, 16 }, - - /* 1824 */ { MAD_F(0x0570e0cf) /* 0.340058145 */, 16 }, - /* 1825 */ { MAD_F(0x0571e57d) /* 0.340306748 */, 16 }, - /* 1826 */ { MAD_F(0x0572ea37) /* 0.340555397 */, 16 }, - /* 1827 */ { MAD_F(0x0573eefd) /* 0.340804091 */, 16 }, - /* 1828 */ { MAD_F(0x0574f3d0) /* 0.341052830 */, 16 }, - /* 1829 */ { MAD_F(0x0575f8ae) /* 0.341301615 */, 16 }, - /* 1830 */ { MAD_F(0x0576fd99) /* 0.341550445 */, 16 }, - /* 1831 */ { MAD_F(0x05780290) /* 0.341799321 */, 16 }, - /* 1832 */ { MAD_F(0x05790793) /* 0.342048241 */, 16 }, - /* 1833 */ { MAD_F(0x057a0ca3) /* 0.342297207 */, 16 }, - /* 1834 */ { MAD_F(0x057b11be) /* 0.342546219 */, 16 }, - /* 1835 */ { MAD_F(0x057c16e6) /* 0.342795275 */, 16 }, - /* 1836 */ { MAD_F(0x057d1c1a) /* 0.343044377 */, 16 }, - /* 1837 */ { MAD_F(0x057e2159) /* 0.343293524 */, 16 }, - /* 1838 */ { MAD_F(0x057f26a6) /* 0.343542717 */, 16 }, - /* 1839 */ { MAD_F(0x05802bfe) /* 0.343791954 */, 16 }, - - /* 1840 */ { MAD_F(0x05813162) /* 0.344041237 */, 16 }, - /* 1841 */ { MAD_F(0x058236d2) /* 0.344290564 */, 16 }, - /* 1842 */ { MAD_F(0x05833c4f) /* 0.344539937 */, 16 }, - /* 1843 */ { MAD_F(0x058441d8) /* 0.344789356 */, 16 }, - /* 1844 */ { MAD_F(0x0585476c) /* 0.345038819 */, 16 }, - /* 1845 */ { MAD_F(0x05864d0d) /* 0.345288327 */, 16 }, - /* 1846 */ { MAD_F(0x058752ba) /* 0.345537880 */, 16 }, - /* 1847 */ { MAD_F(0x05885873) /* 0.345787479 */, 16 }, - /* 1848 */ { MAD_F(0x05895e39) /* 0.346037122 */, 16 }, - /* 1849 */ { MAD_F(0x058a640a) /* 0.346286811 */, 16 }, - /* 1850 */ { MAD_F(0x058b69e7) /* 0.346536545 */, 16 }, - /* 1851 */ { MAD_F(0x058c6fd1) /* 0.346786323 */, 16 }, - /* 1852 */ { MAD_F(0x058d75c6) /* 0.347036147 */, 16 }, - /* 1853 */ { MAD_F(0x058e7bc8) /* 0.347286015 */, 16 }, - /* 1854 */ { MAD_F(0x058f81d5) /* 0.347535929 */, 16 }, - /* 1855 */ { MAD_F(0x059087ef) /* 0.347785887 */, 16 }, - - /* 1856 */ { MAD_F(0x05918e15) /* 0.348035890 */, 16 }, - /* 1857 */ { MAD_F(0x05929447) /* 0.348285939 */, 16 }, - /* 1858 */ { MAD_F(0x05939a84) /* 0.348536032 */, 16 }, - /* 1859 */ { MAD_F(0x0594a0ce) /* 0.348786170 */, 16 }, - /* 1860 */ { MAD_F(0x0595a724) /* 0.349036353 */, 16 }, - /* 1861 */ { MAD_F(0x0596ad86) /* 0.349286580 */, 16 }, - /* 1862 */ { MAD_F(0x0597b3f4) /* 0.349536853 */, 16 }, - /* 1863 */ { MAD_F(0x0598ba6e) /* 0.349787170 */, 16 }, - /* 1864 */ { MAD_F(0x0599c0f4) /* 0.350037532 */, 16 }, - /* 1865 */ { MAD_F(0x059ac786) /* 0.350287939 */, 16 }, - /* 1866 */ { MAD_F(0x059bce25) /* 0.350538391 */, 16 }, - /* 1867 */ { MAD_F(0x059cd4cf) /* 0.350788887 */, 16 }, - /* 1868 */ { MAD_F(0x059ddb85) /* 0.351039428 */, 16 }, - /* 1869 */ { MAD_F(0x059ee247) /* 0.351290014 */, 16 }, - /* 1870 */ { MAD_F(0x059fe915) /* 0.351540645 */, 16 }, - /* 1871 */ { MAD_F(0x05a0efef) /* 0.351791320 */, 16 }, - - /* 1872 */ { MAD_F(0x05a1f6d5) /* 0.352042040 */, 16 }, - /* 1873 */ { MAD_F(0x05a2fdc7) /* 0.352292804 */, 16 }, - /* 1874 */ { MAD_F(0x05a404c5) /* 0.352543613 */, 16 }, - /* 1875 */ { MAD_F(0x05a50bcf) /* 0.352794467 */, 16 }, - /* 1876 */ { MAD_F(0x05a612e5) /* 0.353045365 */, 16 }, - /* 1877 */ { MAD_F(0x05a71a07) /* 0.353296308 */, 16 }, - /* 1878 */ { MAD_F(0x05a82135) /* 0.353547296 */, 16 }, - /* 1879 */ { MAD_F(0x05a9286f) /* 0.353798328 */, 16 }, - /* 1880 */ { MAD_F(0x05aa2fb5) /* 0.354049405 */, 16 }, - /* 1881 */ { MAD_F(0x05ab3707) /* 0.354300526 */, 16 }, - /* 1882 */ { MAD_F(0x05ac3e65) /* 0.354551691 */, 16 }, - /* 1883 */ { MAD_F(0x05ad45ce) /* 0.354802901 */, 16 }, - /* 1884 */ { MAD_F(0x05ae4d44) /* 0.355054156 */, 16 }, - /* 1885 */ { MAD_F(0x05af54c6) /* 0.355305455 */, 16 }, - /* 1886 */ { MAD_F(0x05b05c53) /* 0.355556799 */, 16 }, - /* 1887 */ { MAD_F(0x05b163ed) /* 0.355808187 */, 16 }, - - /* 1888 */ { MAD_F(0x05b26b92) /* 0.356059619 */, 16 }, - /* 1889 */ { MAD_F(0x05b37343) /* 0.356311096 */, 16 }, - /* 1890 */ { MAD_F(0x05b47b00) /* 0.356562617 */, 16 }, - /* 1891 */ { MAD_F(0x05b582c9) /* 0.356814182 */, 16 }, - /* 1892 */ { MAD_F(0x05b68a9e) /* 0.357065792 */, 16 }, - /* 1893 */ { MAD_F(0x05b7927f) /* 0.357317446 */, 16 }, - /* 1894 */ { MAD_F(0x05b89a6c) /* 0.357569145 */, 16 }, - /* 1895 */ { MAD_F(0x05b9a265) /* 0.357820887 */, 16 }, - /* 1896 */ { MAD_F(0x05baaa69) /* 0.358072674 */, 16 }, - /* 1897 */ { MAD_F(0x05bbb27a) /* 0.358324506 */, 16 }, - /* 1898 */ { MAD_F(0x05bcba96) /* 0.358576381 */, 16 }, - /* 1899 */ { MAD_F(0x05bdc2be) /* 0.358828301 */, 16 }, - /* 1900 */ { MAD_F(0x05becaf2) /* 0.359080265 */, 16 }, - /* 1901 */ { MAD_F(0x05bfd332) /* 0.359332273 */, 16 }, - /* 1902 */ { MAD_F(0x05c0db7e) /* 0.359584326 */, 16 }, - /* 1903 */ { MAD_F(0x05c1e3d6) /* 0.359836423 */, 16 }, - - /* 1904 */ { MAD_F(0x05c2ec39) /* 0.360088563 */, 16 }, - /* 1905 */ { MAD_F(0x05c3f4a9) /* 0.360340748 */, 16 }, - /* 1906 */ { MAD_F(0x05c4fd24) /* 0.360592977 */, 16 }, - /* 1907 */ { MAD_F(0x05c605ab) /* 0.360845251 */, 16 }, - /* 1908 */ { MAD_F(0x05c70e3e) /* 0.361097568 */, 16 }, - /* 1909 */ { MAD_F(0x05c816dd) /* 0.361349929 */, 16 }, - /* 1910 */ { MAD_F(0x05c91f87) /* 0.361602335 */, 16 }, - /* 1911 */ { MAD_F(0x05ca283e) /* 0.361854784 */, 16 }, - /* 1912 */ { MAD_F(0x05cb3100) /* 0.362107278 */, 16 }, - /* 1913 */ { MAD_F(0x05cc39ce) /* 0.362359815 */, 16 }, - /* 1914 */ { MAD_F(0x05cd42a8) /* 0.362612397 */, 16 }, - /* 1915 */ { MAD_F(0x05ce4b8d) /* 0.362865022 */, 16 }, - /* 1916 */ { MAD_F(0x05cf547f) /* 0.363117692 */, 16 }, - /* 1917 */ { MAD_F(0x05d05d7c) /* 0.363370405 */, 16 }, - /* 1918 */ { MAD_F(0x05d16685) /* 0.363623163 */, 16 }, - /* 1919 */ { MAD_F(0x05d26f9a) /* 0.363875964 */, 16 }, - - /* 1920 */ { MAD_F(0x05d378bb) /* 0.364128809 */, 16 }, - /* 1921 */ { MAD_F(0x05d481e7) /* 0.364381698 */, 16 }, - /* 1922 */ { MAD_F(0x05d58b1f) /* 0.364634632 */, 16 }, - /* 1923 */ { MAD_F(0x05d69463) /* 0.364887608 */, 16 }, - /* 1924 */ { MAD_F(0x05d79db3) /* 0.365140629 */, 16 }, - /* 1925 */ { MAD_F(0x05d8a70f) /* 0.365393694 */, 16 }, - /* 1926 */ { MAD_F(0x05d9b076) /* 0.365646802 */, 16 }, - /* 1927 */ { MAD_F(0x05dab9e9) /* 0.365899955 */, 16 }, - /* 1928 */ { MAD_F(0x05dbc368) /* 0.366153151 */, 16 }, - /* 1929 */ { MAD_F(0x05dcccf2) /* 0.366406390 */, 16 }, - /* 1930 */ { MAD_F(0x05ddd689) /* 0.366659674 */, 16 }, - /* 1931 */ { MAD_F(0x05dee02b) /* 0.366913001 */, 16 }, - /* 1932 */ { MAD_F(0x05dfe9d8) /* 0.367166372 */, 16 }, - /* 1933 */ { MAD_F(0x05e0f392) /* 0.367419787 */, 16 }, - /* 1934 */ { MAD_F(0x05e1fd57) /* 0.367673246 */, 16 }, - /* 1935 */ { MAD_F(0x05e30728) /* 0.367926748 */, 16 }, - - /* 1936 */ { MAD_F(0x05e41105) /* 0.368180294 */, 16 }, - /* 1937 */ { MAD_F(0x05e51aed) /* 0.368433883 */, 16 }, - /* 1938 */ { MAD_F(0x05e624e1) /* 0.368687517 */, 16 }, - /* 1939 */ { MAD_F(0x05e72ee1) /* 0.368941193 */, 16 }, - /* 1940 */ { MAD_F(0x05e838ed) /* 0.369194914 */, 16 }, - /* 1941 */ { MAD_F(0x05e94304) /* 0.369448678 */, 16 }, - /* 1942 */ { MAD_F(0x05ea4d27) /* 0.369702485 */, 16 }, - /* 1943 */ { MAD_F(0x05eb5756) /* 0.369956336 */, 16 }, - /* 1944 */ { MAD_F(0x05ec6190) /* 0.370210231 */, 16 }, - /* 1945 */ { MAD_F(0x05ed6bd6) /* 0.370464169 */, 16 }, - /* 1946 */ { MAD_F(0x05ee7628) /* 0.370718151 */, 16 }, - /* 1947 */ { MAD_F(0x05ef8085) /* 0.370972177 */, 16 }, - /* 1948 */ { MAD_F(0x05f08aee) /* 0.371226245 */, 16 }, - /* 1949 */ { MAD_F(0x05f19563) /* 0.371480358 */, 16 }, - /* 1950 */ { MAD_F(0x05f29fe3) /* 0.371734513 */, 16 }, - /* 1951 */ { MAD_F(0x05f3aa6f) /* 0.371988712 */, 16 }, - - /* 1952 */ { MAD_F(0x05f4b507) /* 0.372242955 */, 16 }, - /* 1953 */ { MAD_F(0x05f5bfab) /* 0.372497241 */, 16 }, - /* 1954 */ { MAD_F(0x05f6ca5a) /* 0.372751570 */, 16 }, - /* 1955 */ { MAD_F(0x05f7d514) /* 0.373005943 */, 16 }, - /* 1956 */ { MAD_F(0x05f8dfdb) /* 0.373260359 */, 16 }, - /* 1957 */ { MAD_F(0x05f9eaad) /* 0.373514819 */, 16 }, - /* 1958 */ { MAD_F(0x05faf58a) /* 0.373769322 */, 16 }, - /* 1959 */ { MAD_F(0x05fc0073) /* 0.374023868 */, 16 }, - /* 1960 */ { MAD_F(0x05fd0b68) /* 0.374278458 */, 16 }, - /* 1961 */ { MAD_F(0x05fe1669) /* 0.374533091 */, 16 }, - /* 1962 */ { MAD_F(0x05ff2175) /* 0.374787767 */, 16 }, - /* 1963 */ { MAD_F(0x06002c8d) /* 0.375042486 */, 16 }, - /* 1964 */ { MAD_F(0x060137b0) /* 0.375297249 */, 16 }, - /* 1965 */ { MAD_F(0x060242df) /* 0.375552055 */, 16 }, - /* 1966 */ { MAD_F(0x06034e19) /* 0.375806904 */, 16 }, - /* 1967 */ { MAD_F(0x0604595f) /* 0.376061796 */, 16 }, - - /* 1968 */ { MAD_F(0x060564b1) /* 0.376316732 */, 16 }, - /* 1969 */ { MAD_F(0x0606700f) /* 0.376571710 */, 16 }, - /* 1970 */ { MAD_F(0x06077b77) /* 0.376826732 */, 16 }, - /* 1971 */ { MAD_F(0x060886ec) /* 0.377081797 */, 16 }, - /* 1972 */ { MAD_F(0x0609926c) /* 0.377336905 */, 16 }, - /* 1973 */ { MAD_F(0x060a9df8) /* 0.377592057 */, 16 }, - /* 1974 */ { MAD_F(0x060ba98f) /* 0.377847251 */, 16 }, - /* 1975 */ { MAD_F(0x060cb532) /* 0.378102489 */, 16 }, - /* 1976 */ { MAD_F(0x060dc0e0) /* 0.378357769 */, 16 }, - /* 1977 */ { MAD_F(0x060ecc9a) /* 0.378613093 */, 16 }, - /* 1978 */ { MAD_F(0x060fd860) /* 0.378868460 */, 16 }, - /* 1979 */ { MAD_F(0x0610e431) /* 0.379123870 */, 16 }, - /* 1980 */ { MAD_F(0x0611f00d) /* 0.379379322 */, 16 }, - /* 1981 */ { MAD_F(0x0612fbf5) /* 0.379634818 */, 16 }, - /* 1982 */ { MAD_F(0x061407e9) /* 0.379890357 */, 16 }, - /* 1983 */ { MAD_F(0x061513e8) /* 0.380145939 */, 16 }, - - /* 1984 */ { MAD_F(0x06161ff3) /* 0.380401563 */, 16 }, - /* 1985 */ { MAD_F(0x06172c09) /* 0.380657231 */, 16 }, - /* 1986 */ { MAD_F(0x0618382b) /* 0.380912942 */, 16 }, - /* 1987 */ { MAD_F(0x06194458) /* 0.381168695 */, 16 }, - /* 1988 */ { MAD_F(0x061a5091) /* 0.381424492 */, 16 }, - /* 1989 */ { MAD_F(0x061b5cd5) /* 0.381680331 */, 16 }, - /* 1990 */ { MAD_F(0x061c6925) /* 0.381936213 */, 16 }, - /* 1991 */ { MAD_F(0x061d7581) /* 0.382192138 */, 16 }, - /* 1992 */ { MAD_F(0x061e81e8) /* 0.382448106 */, 16 }, - /* 1993 */ { MAD_F(0x061f8e5a) /* 0.382704117 */, 16 }, - /* 1994 */ { MAD_F(0x06209ad8) /* 0.382960171 */, 16 }, - /* 1995 */ { MAD_F(0x0621a761) /* 0.383216267 */, 16 }, - /* 1996 */ { MAD_F(0x0622b3f6) /* 0.383472406 */, 16 }, - /* 1997 */ { MAD_F(0x0623c096) /* 0.383728588 */, 16 }, - /* 1998 */ { MAD_F(0x0624cd42) /* 0.383984813 */, 16 }, - /* 1999 */ { MAD_F(0x0625d9f9) /* 0.384241080 */, 16 }, - - /* 2000 */ { MAD_F(0x0626e6bc) /* 0.384497391 */, 16 }, - /* 2001 */ { MAD_F(0x0627f38a) /* 0.384753744 */, 16 }, - /* 2002 */ { MAD_F(0x06290064) /* 0.385010139 */, 16 }, - /* 2003 */ { MAD_F(0x062a0d49) /* 0.385266578 */, 16 }, - /* 2004 */ { MAD_F(0x062b1a3a) /* 0.385523059 */, 16 }, - /* 2005 */ { MAD_F(0x062c2736) /* 0.385779582 */, 16 }, - /* 2006 */ { MAD_F(0x062d343d) /* 0.386036149 */, 16 }, - /* 2007 */ { MAD_F(0x062e4150) /* 0.386292758 */, 16 }, - /* 2008 */ { MAD_F(0x062f4e6f) /* 0.386549409 */, 16 }, - /* 2009 */ { MAD_F(0x06305b99) /* 0.386806104 */, 16 }, - /* 2010 */ { MAD_F(0x063168ce) /* 0.387062840 */, 16 }, - /* 2011 */ { MAD_F(0x0632760f) /* 0.387319620 */, 16 }, - /* 2012 */ { MAD_F(0x0633835b) /* 0.387576442 */, 16 }, - /* 2013 */ { MAD_F(0x063490b2) /* 0.387833306 */, 16 }, - /* 2014 */ { MAD_F(0x06359e15) /* 0.388090213 */, 16 }, - /* 2015 */ { MAD_F(0x0636ab83) /* 0.388347163 */, 16 }, - - /* 2016 */ { MAD_F(0x0637b8fd) /* 0.388604155 */, 16 }, - /* 2017 */ { MAD_F(0x0638c682) /* 0.388861190 */, 16 }, - /* 2018 */ { MAD_F(0x0639d413) /* 0.389118267 */, 16 }, - /* 2019 */ { MAD_F(0x063ae1af) /* 0.389375386 */, 16 }, - /* 2020 */ { MAD_F(0x063bef56) /* 0.389632548 */, 16 }, - /* 2021 */ { MAD_F(0x063cfd09) /* 0.389889752 */, 16 }, - /* 2022 */ { MAD_F(0x063e0ac7) /* 0.390146999 */, 16 }, - /* 2023 */ { MAD_F(0x063f1891) /* 0.390404289 */, 16 }, - /* 2024 */ { MAD_F(0x06402666) /* 0.390661620 */, 16 }, - /* 2025 */ { MAD_F(0x06413446) /* 0.390918994 */, 16 }, - /* 2026 */ { MAD_F(0x06424232) /* 0.391176411 */, 16 }, - /* 2027 */ { MAD_F(0x06435029) /* 0.391433869 */, 16 }, - /* 2028 */ { MAD_F(0x06445e2b) /* 0.391691371 */, 16 }, - /* 2029 */ { MAD_F(0x06456c39) /* 0.391948914 */, 16 }, - /* 2030 */ { MAD_F(0x06467a52) /* 0.392206500 */, 16 }, - /* 2031 */ { MAD_F(0x06478877) /* 0.392464128 */, 16 }, - - /* 2032 */ { MAD_F(0x064896a7) /* 0.392721798 */, 16 }, - /* 2033 */ { MAD_F(0x0649a4e2) /* 0.392979511 */, 16 }, - /* 2034 */ { MAD_F(0x064ab328) /* 0.393237266 */, 16 }, - /* 2035 */ { MAD_F(0x064bc17a) /* 0.393495063 */, 16 }, - /* 2036 */ { MAD_F(0x064ccfd8) /* 0.393752902 */, 16 }, - /* 2037 */ { MAD_F(0x064dde40) /* 0.394010784 */, 16 }, - /* 2038 */ { MAD_F(0x064eecb4) /* 0.394268707 */, 16 }, - /* 2039 */ { MAD_F(0x064ffb33) /* 0.394526673 */, 16 }, - /* 2040 */ { MAD_F(0x065109be) /* 0.394784681 */, 16 }, - /* 2041 */ { MAD_F(0x06521854) /* 0.395042732 */, 16 }, - /* 2042 */ { MAD_F(0x065326f5) /* 0.395300824 */, 16 }, - /* 2043 */ { MAD_F(0x065435a1) /* 0.395558959 */, 16 }, - /* 2044 */ { MAD_F(0x06554459) /* 0.395817135 */, 16 }, - /* 2045 */ { MAD_F(0x0656531c) /* 0.396075354 */, 16 }, - /* 2046 */ { MAD_F(0x065761ea) /* 0.396333615 */, 16 }, - /* 2047 */ { MAD_F(0x065870c4) /* 0.396591918 */, 16 }, - - /* 2048 */ { MAD_F(0x06597fa9) /* 0.396850263 */, 16 }, - /* 2049 */ { MAD_F(0x065a8e99) /* 0.397108650 */, 16 }, - /* 2050 */ { MAD_F(0x065b9d95) /* 0.397367079 */, 16 }, - /* 2051 */ { MAD_F(0x065cac9c) /* 0.397625550 */, 16 }, - /* 2052 */ { MAD_F(0x065dbbae) /* 0.397884063 */, 16 }, - /* 2053 */ { MAD_F(0x065ecacb) /* 0.398142619 */, 16 }, - /* 2054 */ { MAD_F(0x065fd9f4) /* 0.398401216 */, 16 }, - /* 2055 */ { MAD_F(0x0660e928) /* 0.398659855 */, 16 }, - /* 2056 */ { MAD_F(0x0661f867) /* 0.398918536 */, 16 }, - /* 2057 */ { MAD_F(0x066307b1) /* 0.399177259 */, 16 }, - /* 2058 */ { MAD_F(0x06641707) /* 0.399436024 */, 16 }, - /* 2059 */ { MAD_F(0x06652668) /* 0.399694831 */, 16 }, - /* 2060 */ { MAD_F(0x066635d4) /* 0.399953679 */, 16 }, - /* 2061 */ { MAD_F(0x0667454c) /* 0.400212570 */, 16 }, - /* 2062 */ { MAD_F(0x066854ce) /* 0.400471503 */, 16 }, - /* 2063 */ { MAD_F(0x0669645c) /* 0.400730477 */, 16 }, - - /* 2064 */ { MAD_F(0x066a73f5) /* 0.400989493 */, 16 }, - /* 2065 */ { MAD_F(0x066b839a) /* 0.401248551 */, 16 }, - /* 2066 */ { MAD_F(0x066c9349) /* 0.401507651 */, 16 }, - /* 2067 */ { MAD_F(0x066da304) /* 0.401766793 */, 16 }, - /* 2068 */ { MAD_F(0x066eb2ca) /* 0.402025976 */, 16 }, - /* 2069 */ { MAD_F(0x066fc29b) /* 0.402285202 */, 16 }, - /* 2070 */ { MAD_F(0x0670d278) /* 0.402544469 */, 16 }, - /* 2071 */ { MAD_F(0x0671e25f) /* 0.402803777 */, 16 }, - /* 2072 */ { MAD_F(0x0672f252) /* 0.403063128 */, 16 }, - /* 2073 */ { MAD_F(0x06740250) /* 0.403322520 */, 16 }, - /* 2074 */ { MAD_F(0x0675125a) /* 0.403581954 */, 16 }, - /* 2075 */ { MAD_F(0x0676226e) /* 0.403841430 */, 16 }, - /* 2076 */ { MAD_F(0x0677328e) /* 0.404100947 */, 16 }, - /* 2077 */ { MAD_F(0x067842b9) /* 0.404360506 */, 16 }, - /* 2078 */ { MAD_F(0x067952ef) /* 0.404620107 */, 16 }, - /* 2079 */ { MAD_F(0x067a6330) /* 0.404879749 */, 16 }, - - /* 2080 */ { MAD_F(0x067b737c) /* 0.405139433 */, 16 }, - /* 2081 */ { MAD_F(0x067c83d4) /* 0.405399159 */, 16 }, - /* 2082 */ { MAD_F(0x067d9436) /* 0.405658926 */, 16 }, - /* 2083 */ { MAD_F(0x067ea4a4) /* 0.405918735 */, 16 }, - /* 2084 */ { MAD_F(0x067fb51d) /* 0.406178585 */, 16 }, - /* 2085 */ { MAD_F(0x0680c5a2) /* 0.406438477 */, 16 }, - /* 2086 */ { MAD_F(0x0681d631) /* 0.406698410 */, 16 }, - /* 2087 */ { MAD_F(0x0682e6cb) /* 0.406958385 */, 16 }, - /* 2088 */ { MAD_F(0x0683f771) /* 0.407218402 */, 16 }, - /* 2089 */ { MAD_F(0x06850822) /* 0.407478460 */, 16 }, - /* 2090 */ { MAD_F(0x068618de) /* 0.407738559 */, 16 }, - /* 2091 */ { MAD_F(0x068729a5) /* 0.407998700 */, 16 }, - /* 2092 */ { MAD_F(0x06883a77) /* 0.408258883 */, 16 }, - /* 2093 */ { MAD_F(0x06894b55) /* 0.408519107 */, 16 }, - /* 2094 */ { MAD_F(0x068a5c3d) /* 0.408779372 */, 16 }, - /* 2095 */ { MAD_F(0x068b6d31) /* 0.409039679 */, 16 }, - - /* 2096 */ { MAD_F(0x068c7e2f) /* 0.409300027 */, 16 }, - /* 2097 */ { MAD_F(0x068d8f39) /* 0.409560417 */, 16 }, - /* 2098 */ { MAD_F(0x068ea04e) /* 0.409820848 */, 16 }, - /* 2099 */ { MAD_F(0x068fb16e) /* 0.410081321 */, 16 }, - /* 2100 */ { MAD_F(0x0690c299) /* 0.410341834 */, 16 }, - /* 2101 */ { MAD_F(0x0691d3cf) /* 0.410602390 */, 16 }, - /* 2102 */ { MAD_F(0x0692e511) /* 0.410862986 */, 16 }, - /* 2103 */ { MAD_F(0x0693f65d) /* 0.411123624 */, 16 }, - /* 2104 */ { MAD_F(0x069507b5) /* 0.411384303 */, 16 }, - /* 2105 */ { MAD_F(0x06961917) /* 0.411645024 */, 16 }, - /* 2106 */ { MAD_F(0x06972a85) /* 0.411905785 */, 16 }, - /* 2107 */ { MAD_F(0x06983bfe) /* 0.412166588 */, 16 }, - /* 2108 */ { MAD_F(0x06994d82) /* 0.412427433 */, 16 }, - /* 2109 */ { MAD_F(0x069a5f11) /* 0.412688318 */, 16 }, - /* 2110 */ { MAD_F(0x069b70ab) /* 0.412949245 */, 16 }, - /* 2111 */ { MAD_F(0x069c8250) /* 0.413210213 */, 16 }, - - /* 2112 */ { MAD_F(0x069d9400) /* 0.413471222 */, 16 }, - /* 2113 */ { MAD_F(0x069ea5bb) /* 0.413732273 */, 16 }, - /* 2114 */ { MAD_F(0x069fb781) /* 0.413993364 */, 16 }, - /* 2115 */ { MAD_F(0x06a0c953) /* 0.414254497 */, 16 }, - /* 2116 */ { MAD_F(0x06a1db2f) /* 0.414515671 */, 16 }, - /* 2117 */ { MAD_F(0x06a2ed16) /* 0.414776886 */, 16 }, - /* 2118 */ { MAD_F(0x06a3ff09) /* 0.415038142 */, 16 }, - /* 2119 */ { MAD_F(0x06a51106) /* 0.415299440 */, 16 }, - /* 2120 */ { MAD_F(0x06a6230f) /* 0.415560778 */, 16 }, - /* 2121 */ { MAD_F(0x06a73522) /* 0.415822157 */, 16 }, - /* 2122 */ { MAD_F(0x06a84741) /* 0.416083578 */, 16 }, - /* 2123 */ { MAD_F(0x06a9596a) /* 0.416345040 */, 16 }, - /* 2124 */ { MAD_F(0x06aa6b9f) /* 0.416606542 */, 16 }, - /* 2125 */ { MAD_F(0x06ab7ddf) /* 0.416868086 */, 16 }, - /* 2126 */ { MAD_F(0x06ac9029) /* 0.417129671 */, 16 }, - /* 2127 */ { MAD_F(0x06ada27f) /* 0.417391297 */, 16 }, - - /* 2128 */ { MAD_F(0x06aeb4e0) /* 0.417652964 */, 16 }, - /* 2129 */ { MAD_F(0x06afc74b) /* 0.417914672 */, 16 }, - /* 2130 */ { MAD_F(0x06b0d9c2) /* 0.418176420 */, 16 }, - /* 2131 */ { MAD_F(0x06b1ec43) /* 0.418438210 */, 16 }, - /* 2132 */ { MAD_F(0x06b2fed0) /* 0.418700041 */, 16 }, - /* 2133 */ { MAD_F(0x06b41168) /* 0.418961912 */, 16 }, - /* 2134 */ { MAD_F(0x06b5240a) /* 0.419223825 */, 16 }, - /* 2135 */ { MAD_F(0x06b636b8) /* 0.419485778 */, 16 }, - /* 2136 */ { MAD_F(0x06b74971) /* 0.419747773 */, 16 }, - /* 2137 */ { MAD_F(0x06b85c34) /* 0.420009808 */, 16 }, - /* 2138 */ { MAD_F(0x06b96f03) /* 0.420271884 */, 16 }, - /* 2139 */ { MAD_F(0x06ba81dc) /* 0.420534001 */, 16 }, - /* 2140 */ { MAD_F(0x06bb94c1) /* 0.420796159 */, 16 }, - /* 2141 */ { MAD_F(0x06bca7b0) /* 0.421058358 */, 16 }, - /* 2142 */ { MAD_F(0x06bdbaaa) /* 0.421320597 */, 16 }, - /* 2143 */ { MAD_F(0x06becdb0) /* 0.421582878 */, 16 }, - - /* 2144 */ { MAD_F(0x06bfe0c0) /* 0.421845199 */, 16 }, - /* 2145 */ { MAD_F(0x06c0f3db) /* 0.422107561 */, 16 }, - /* 2146 */ { MAD_F(0x06c20702) /* 0.422369964 */, 16 }, - /* 2147 */ { MAD_F(0x06c31a33) /* 0.422632407 */, 16 }, - /* 2148 */ { MAD_F(0x06c42d6f) /* 0.422894891 */, 16 }, - /* 2149 */ { MAD_F(0x06c540b6) /* 0.423157416 */, 16 }, - /* 2150 */ { MAD_F(0x06c65408) /* 0.423419982 */, 16 }, - /* 2151 */ { MAD_F(0x06c76765) /* 0.423682588 */, 16 }, - /* 2152 */ { MAD_F(0x06c87acc) /* 0.423945235 */, 16 }, - /* 2153 */ { MAD_F(0x06c98e3f) /* 0.424207923 */, 16 }, - /* 2154 */ { MAD_F(0x06caa1bd) /* 0.424470652 */, 16 }, - /* 2155 */ { MAD_F(0x06cbb545) /* 0.424733421 */, 16 }, - /* 2156 */ { MAD_F(0x06ccc8d9) /* 0.424996230 */, 16 }, - /* 2157 */ { MAD_F(0x06cddc77) /* 0.425259081 */, 16 }, - /* 2158 */ { MAD_F(0x06cef020) /* 0.425521972 */, 16 }, - /* 2159 */ { MAD_F(0x06d003d4) /* 0.425784903 */, 16 }, - - /* 2160 */ { MAD_F(0x06d11794) /* 0.426047876 */, 16 }, - /* 2161 */ { MAD_F(0x06d22b5e) /* 0.426310889 */, 16 }, - /* 2162 */ { MAD_F(0x06d33f32) /* 0.426573942 */, 16 }, - /* 2163 */ { MAD_F(0x06d45312) /* 0.426837036 */, 16 }, - /* 2164 */ { MAD_F(0x06d566fd) /* 0.427100170 */, 16 }, - /* 2165 */ { MAD_F(0x06d67af2) /* 0.427363345 */, 16 }, - /* 2166 */ { MAD_F(0x06d78ef3) /* 0.427626561 */, 16 }, - /* 2167 */ { MAD_F(0x06d8a2fe) /* 0.427889817 */, 16 }, - /* 2168 */ { MAD_F(0x06d9b714) /* 0.428153114 */, 16 }, - /* 2169 */ { MAD_F(0x06dacb35) /* 0.428416451 */, 16 }, - /* 2170 */ { MAD_F(0x06dbdf61) /* 0.428679828 */, 16 }, - /* 2171 */ { MAD_F(0x06dcf398) /* 0.428943246 */, 16 }, - /* 2172 */ { MAD_F(0x06de07d9) /* 0.429206704 */, 16 }, - /* 2173 */ { MAD_F(0x06df1c26) /* 0.429470203 */, 16 }, - /* 2174 */ { MAD_F(0x06e0307d) /* 0.429733743 */, 16 }, - /* 2175 */ { MAD_F(0x06e144df) /* 0.429997322 */, 16 }, - - /* 2176 */ { MAD_F(0x06e2594c) /* 0.430260942 */, 16 }, - /* 2177 */ { MAD_F(0x06e36dc4) /* 0.430524603 */, 16 }, - /* 2178 */ { MAD_F(0x06e48246) /* 0.430788304 */, 16 }, - /* 2179 */ { MAD_F(0x06e596d4) /* 0.431052045 */, 16 }, - /* 2180 */ { MAD_F(0x06e6ab6c) /* 0.431315826 */, 16 }, - /* 2181 */ { MAD_F(0x06e7c00f) /* 0.431579648 */, 16 }, - /* 2182 */ { MAD_F(0x06e8d4bd) /* 0.431843511 */, 16 }, - /* 2183 */ { MAD_F(0x06e9e976) /* 0.432107413 */, 16 }, - /* 2184 */ { MAD_F(0x06eafe3a) /* 0.432371356 */, 16 }, - /* 2185 */ { MAD_F(0x06ec1308) /* 0.432635339 */, 16 }, - /* 2186 */ { MAD_F(0x06ed27e2) /* 0.432899362 */, 16 }, - /* 2187 */ { MAD_F(0x06ee3cc6) /* 0.433163426 */, 16 }, - /* 2188 */ { MAD_F(0x06ef51b4) /* 0.433427530 */, 16 }, - /* 2189 */ { MAD_F(0x06f066ae) /* 0.433691674 */, 16 }, - /* 2190 */ { MAD_F(0x06f17bb3) /* 0.433955859 */, 16 }, - /* 2191 */ { MAD_F(0x06f290c2) /* 0.434220083 */, 16 }, - - /* 2192 */ { MAD_F(0x06f3a5dc) /* 0.434484348 */, 16 }, - /* 2193 */ { MAD_F(0x06f4bb01) /* 0.434748653 */, 16 }, - /* 2194 */ { MAD_F(0x06f5d030) /* 0.435012998 */, 16 }, - /* 2195 */ { MAD_F(0x06f6e56b) /* 0.435277383 */, 16 }, - /* 2196 */ { MAD_F(0x06f7fab0) /* 0.435541809 */, 16 }, - /* 2197 */ { MAD_F(0x06f91000) /* 0.435806274 */, 16 }, - /* 2198 */ { MAD_F(0x06fa255a) /* 0.436070780 */, 16 }, - /* 2199 */ { MAD_F(0x06fb3ac0) /* 0.436335326 */, 16 }, - /* 2200 */ { MAD_F(0x06fc5030) /* 0.436599912 */, 16 }, - /* 2201 */ { MAD_F(0x06fd65ab) /* 0.436864538 */, 16 }, - /* 2202 */ { MAD_F(0x06fe7b31) /* 0.437129204 */, 16 }, - /* 2203 */ { MAD_F(0x06ff90c2) /* 0.437393910 */, 16 }, - /* 2204 */ { MAD_F(0x0700a65d) /* 0.437658657 */, 16 }, - /* 2205 */ { MAD_F(0x0701bc03) /* 0.437923443 */, 16 }, - /* 2206 */ { MAD_F(0x0702d1b4) /* 0.438188269 */, 16 }, - /* 2207 */ { MAD_F(0x0703e76f) /* 0.438453136 */, 16 }, - - /* 2208 */ { MAD_F(0x0704fd35) /* 0.438718042 */, 16 }, - /* 2209 */ { MAD_F(0x07061306) /* 0.438982988 */, 16 }, - /* 2210 */ { MAD_F(0x070728e2) /* 0.439247975 */, 16 }, - /* 2211 */ { MAD_F(0x07083ec9) /* 0.439513001 */, 16 }, - /* 2212 */ { MAD_F(0x070954ba) /* 0.439778067 */, 16 }, - /* 2213 */ { MAD_F(0x070a6ab6) /* 0.440043173 */, 16 }, - /* 2214 */ { MAD_F(0x070b80bc) /* 0.440308320 */, 16 }, - /* 2215 */ { MAD_F(0x070c96ce) /* 0.440573506 */, 16 }, - /* 2216 */ { MAD_F(0x070dacea) /* 0.440838732 */, 16 }, - /* 2217 */ { MAD_F(0x070ec310) /* 0.441103997 */, 16 }, - /* 2218 */ { MAD_F(0x070fd942) /* 0.441369303 */, 16 }, - /* 2219 */ { MAD_F(0x0710ef7e) /* 0.441634649 */, 16 }, - /* 2220 */ { MAD_F(0x071205c5) /* 0.441900034 */, 16 }, - /* 2221 */ { MAD_F(0x07131c17) /* 0.442165460 */, 16 }, - /* 2222 */ { MAD_F(0x07143273) /* 0.442430925 */, 16 }, - /* 2223 */ { MAD_F(0x071548da) /* 0.442696430 */, 16 }, - - /* 2224 */ { MAD_F(0x07165f4b) /* 0.442961975 */, 16 }, - /* 2225 */ { MAD_F(0x071775c8) /* 0.443227559 */, 16 }, - /* 2226 */ { MAD_F(0x07188c4f) /* 0.443493184 */, 16 }, - /* 2227 */ { MAD_F(0x0719a2e0) /* 0.443758848 */, 16 }, - /* 2228 */ { MAD_F(0x071ab97d) /* 0.444024552 */, 16 }, - /* 2229 */ { MAD_F(0x071bd024) /* 0.444290296 */, 16 }, - /* 2230 */ { MAD_F(0x071ce6d6) /* 0.444556079 */, 16 }, - /* 2231 */ { MAD_F(0x071dfd92) /* 0.444821902 */, 16 }, - /* 2232 */ { MAD_F(0x071f1459) /* 0.445087765 */, 16 }, - /* 2233 */ { MAD_F(0x07202b2b) /* 0.445353668 */, 16 }, - /* 2234 */ { MAD_F(0x07214207) /* 0.445619610 */, 16 }, - /* 2235 */ { MAD_F(0x072258ee) /* 0.445885592 */, 16 }, - /* 2236 */ { MAD_F(0x07236fe0) /* 0.446151614 */, 16 }, - /* 2237 */ { MAD_F(0x072486dc) /* 0.446417675 */, 16 }, - /* 2238 */ { MAD_F(0x07259de3) /* 0.446683776 */, 16 }, - /* 2239 */ { MAD_F(0x0726b4f4) /* 0.446949917 */, 16 }, - - /* 2240 */ { MAD_F(0x0727cc11) /* 0.447216097 */, 16 }, - /* 2241 */ { MAD_F(0x0728e338) /* 0.447482317 */, 16 }, - /* 2242 */ { MAD_F(0x0729fa69) /* 0.447748576 */, 16 }, - /* 2243 */ { MAD_F(0x072b11a5) /* 0.448014875 */, 16 }, - /* 2244 */ { MAD_F(0x072c28ec) /* 0.448281214 */, 16 }, - /* 2245 */ { MAD_F(0x072d403d) /* 0.448547592 */, 16 }, - /* 2246 */ { MAD_F(0x072e5799) /* 0.448814010 */, 16 }, - /* 2247 */ { MAD_F(0x072f6f00) /* 0.449080467 */, 16 }, - /* 2248 */ { MAD_F(0x07308671) /* 0.449346964 */, 16 }, - /* 2249 */ { MAD_F(0x07319ded) /* 0.449613501 */, 16 }, - /* 2250 */ { MAD_F(0x0732b573) /* 0.449880076 */, 16 }, - /* 2251 */ { MAD_F(0x0733cd04) /* 0.450146692 */, 16 }, - /* 2252 */ { MAD_F(0x0734e4a0) /* 0.450413347 */, 16 }, - /* 2253 */ { MAD_F(0x0735fc46) /* 0.450680041 */, 16 }, - /* 2254 */ { MAD_F(0x073713f7) /* 0.450946775 */, 16 }, - /* 2255 */ { MAD_F(0x07382bb2) /* 0.451213548 */, 16 }, - - /* 2256 */ { MAD_F(0x07394378) /* 0.451480360 */, 16 }, - /* 2257 */ { MAD_F(0x073a5b49) /* 0.451747213 */, 16 }, - /* 2258 */ { MAD_F(0x073b7324) /* 0.452014104 */, 16 }, - /* 2259 */ { MAD_F(0x073c8b0a) /* 0.452281035 */, 16 }, - /* 2260 */ { MAD_F(0x073da2fa) /* 0.452548005 */, 16 }, - /* 2261 */ { MAD_F(0x073ebaf5) /* 0.452815015 */, 16 }, - /* 2262 */ { MAD_F(0x073fd2fa) /* 0.453082064 */, 16 }, - /* 2263 */ { MAD_F(0x0740eb0a) /* 0.453349152 */, 16 }, - /* 2264 */ { MAD_F(0x07420325) /* 0.453616280 */, 16 }, - /* 2265 */ { MAD_F(0x07431b4a) /* 0.453883447 */, 16 }, - /* 2266 */ { MAD_F(0x0744337a) /* 0.454150653 */, 16 }, - /* 2267 */ { MAD_F(0x07454bb4) /* 0.454417899 */, 16 }, - /* 2268 */ { MAD_F(0x074663f8) /* 0.454685184 */, 16 }, - /* 2269 */ { MAD_F(0x07477c48) /* 0.454952508 */, 16 }, - /* 2270 */ { MAD_F(0x074894a2) /* 0.455219872 */, 16 }, - /* 2271 */ { MAD_F(0x0749ad06) /* 0.455487275 */, 16 }, - - /* 2272 */ { MAD_F(0x074ac575) /* 0.455754717 */, 16 }, - /* 2273 */ { MAD_F(0x074bddee) /* 0.456022198 */, 16 }, - /* 2274 */ { MAD_F(0x074cf672) /* 0.456289719 */, 16 }, - /* 2275 */ { MAD_F(0x074e0f01) /* 0.456557278 */, 16 }, - /* 2276 */ { MAD_F(0x074f279a) /* 0.456824877 */, 16 }, - /* 2277 */ { MAD_F(0x0750403e) /* 0.457092516 */, 16 }, - /* 2278 */ { MAD_F(0x075158ec) /* 0.457360193 */, 16 }, - /* 2279 */ { MAD_F(0x075271a4) /* 0.457627909 */, 16 }, - /* 2280 */ { MAD_F(0x07538a67) /* 0.457895665 */, 16 }, - /* 2281 */ { MAD_F(0x0754a335) /* 0.458163460 */, 16 }, - /* 2282 */ { MAD_F(0x0755bc0d) /* 0.458431294 */, 16 }, - /* 2283 */ { MAD_F(0x0756d4f0) /* 0.458699167 */, 16 }, - /* 2284 */ { MAD_F(0x0757eddd) /* 0.458967079 */, 16 }, - /* 2285 */ { MAD_F(0x075906d5) /* 0.459235030 */, 16 }, - /* 2286 */ { MAD_F(0x075a1fd7) /* 0.459503021 */, 16 }, - /* 2287 */ { MAD_F(0x075b38e3) /* 0.459771050 */, 16 }, - - /* 2288 */ { MAD_F(0x075c51fa) /* 0.460039119 */, 16 }, - /* 2289 */ { MAD_F(0x075d6b1c) /* 0.460307226 */, 16 }, - /* 2290 */ { MAD_F(0x075e8448) /* 0.460575373 */, 16 }, - /* 2291 */ { MAD_F(0x075f9d7f) /* 0.460843559 */, 16 }, - /* 2292 */ { MAD_F(0x0760b6c0) /* 0.461111783 */, 16 }, - /* 2293 */ { MAD_F(0x0761d00b) /* 0.461380047 */, 16 }, - /* 2294 */ { MAD_F(0x0762e961) /* 0.461648350 */, 16 }, - /* 2295 */ { MAD_F(0x076402c1) /* 0.461916691 */, 16 }, - /* 2296 */ { MAD_F(0x07651c2c) /* 0.462185072 */, 16 }, - /* 2297 */ { MAD_F(0x076635a2) /* 0.462453492 */, 16 }, - /* 2298 */ { MAD_F(0x07674f22) /* 0.462721950 */, 16 }, - /* 2299 */ { MAD_F(0x076868ac) /* 0.462990448 */, 16 }, - /* 2300 */ { MAD_F(0x07698240) /* 0.463258984 */, 16 }, - /* 2301 */ { MAD_F(0x076a9be0) /* 0.463527560 */, 16 }, - /* 2302 */ { MAD_F(0x076bb589) /* 0.463796174 */, 16 }, - /* 2303 */ { MAD_F(0x076ccf3d) /* 0.464064827 */, 16 }, - - /* 2304 */ { MAD_F(0x076de8fc) /* 0.464333519 */, 16 }, - /* 2305 */ { MAD_F(0x076f02c5) /* 0.464602250 */, 16 }, - /* 2306 */ { MAD_F(0x07701c98) /* 0.464871020 */, 16 }, - /* 2307 */ { MAD_F(0x07713676) /* 0.465139829 */, 16 }, - /* 2308 */ { MAD_F(0x0772505e) /* 0.465408676 */, 16 }, - /* 2309 */ { MAD_F(0x07736a51) /* 0.465677563 */, 16 }, - /* 2310 */ { MAD_F(0x0774844e) /* 0.465946488 */, 16 }, - /* 2311 */ { MAD_F(0x07759e55) /* 0.466215452 */, 16 }, - /* 2312 */ { MAD_F(0x0776b867) /* 0.466484455 */, 16 }, - /* 2313 */ { MAD_F(0x0777d283) /* 0.466753496 */, 16 }, - /* 2314 */ { MAD_F(0x0778ecaa) /* 0.467022577 */, 16 }, - /* 2315 */ { MAD_F(0x077a06db) /* 0.467291696 */, 16 }, - /* 2316 */ { MAD_F(0x077b2117) /* 0.467560854 */, 16 }, - /* 2317 */ { MAD_F(0x077c3b5d) /* 0.467830050 */, 16 }, - /* 2318 */ { MAD_F(0x077d55ad) /* 0.468099285 */, 16 }, - /* 2319 */ { MAD_F(0x077e7008) /* 0.468368560 */, 16 }, - - /* 2320 */ { MAD_F(0x077f8a6d) /* 0.468637872 */, 16 }, - /* 2321 */ { MAD_F(0x0780a4dc) /* 0.468907224 */, 16 }, - /* 2322 */ { MAD_F(0x0781bf56) /* 0.469176614 */, 16 }, - /* 2323 */ { MAD_F(0x0782d9da) /* 0.469446043 */, 16 }, - /* 2324 */ { MAD_F(0x0783f469) /* 0.469715510 */, 16 }, - /* 2325 */ { MAD_F(0x07850f02) /* 0.469985016 */, 16 }, - /* 2326 */ { MAD_F(0x078629a5) /* 0.470254561 */, 16 }, - /* 2327 */ { MAD_F(0x07874453) /* 0.470524145 */, 16 }, - /* 2328 */ { MAD_F(0x07885f0b) /* 0.470793767 */, 16 }, - /* 2329 */ { MAD_F(0x078979ce) /* 0.471063427 */, 16 }, - /* 2330 */ { MAD_F(0x078a949a) /* 0.471333126 */, 16 }, - /* 2331 */ { MAD_F(0x078baf72) /* 0.471602864 */, 16 }, - /* 2332 */ { MAD_F(0x078cca53) /* 0.471872641 */, 16 }, - /* 2333 */ { MAD_F(0x078de53f) /* 0.472142456 */, 16 }, - /* 2334 */ { MAD_F(0x078f0035) /* 0.472412309 */, 16 }, - /* 2335 */ { MAD_F(0x07901b36) /* 0.472682201 */, 16 }, - - /* 2336 */ { MAD_F(0x07913641) /* 0.472952132 */, 16 }, - /* 2337 */ { MAD_F(0x07925156) /* 0.473222101 */, 16 }, - /* 2338 */ { MAD_F(0x07936c76) /* 0.473492108 */, 16 }, - /* 2339 */ { MAD_F(0x079487a0) /* 0.473762155 */, 16 }, - /* 2340 */ { MAD_F(0x0795a2d4) /* 0.474032239 */, 16 }, - /* 2341 */ { MAD_F(0x0796be13) /* 0.474302362 */, 16 }, - /* 2342 */ { MAD_F(0x0797d95c) /* 0.474572524 */, 16 }, - /* 2343 */ { MAD_F(0x0798f4af) /* 0.474842724 */, 16 }, - /* 2344 */ { MAD_F(0x079a100c) /* 0.475112962 */, 16 }, - /* 2345 */ { MAD_F(0x079b2b74) /* 0.475383239 */, 16 }, - /* 2346 */ { MAD_F(0x079c46e7) /* 0.475653554 */, 16 }, - /* 2347 */ { MAD_F(0x079d6263) /* 0.475923908 */, 16 }, - /* 2348 */ { MAD_F(0x079e7dea) /* 0.476194300 */, 16 }, - /* 2349 */ { MAD_F(0x079f997b) /* 0.476464731 */, 16 }, - /* 2350 */ { MAD_F(0x07a0b516) /* 0.476735200 */, 16 }, - /* 2351 */ { MAD_F(0x07a1d0bc) /* 0.477005707 */, 16 }, - - /* 2352 */ { MAD_F(0x07a2ec6c) /* 0.477276252 */, 16 }, - /* 2353 */ { MAD_F(0x07a40827) /* 0.477546836 */, 16 }, - /* 2354 */ { MAD_F(0x07a523eb) /* 0.477817459 */, 16 }, - /* 2355 */ { MAD_F(0x07a63fba) /* 0.478088119 */, 16 }, - /* 2356 */ { MAD_F(0x07a75b93) /* 0.478358818 */, 16 }, - /* 2357 */ { MAD_F(0x07a87777) /* 0.478629555 */, 16 }, - /* 2358 */ { MAD_F(0x07a99364) /* 0.478900331 */, 16 }, - /* 2359 */ { MAD_F(0x07aaaf5c) /* 0.479171145 */, 16 }, - /* 2360 */ { MAD_F(0x07abcb5f) /* 0.479441997 */, 16 }, - /* 2361 */ { MAD_F(0x07ace76b) /* 0.479712887 */, 16 }, - /* 2362 */ { MAD_F(0x07ae0382) /* 0.479983816 */, 16 }, - /* 2363 */ { MAD_F(0x07af1fa3) /* 0.480254782 */, 16 }, - /* 2364 */ { MAD_F(0x07b03bcf) /* 0.480525787 */, 16 }, - /* 2365 */ { MAD_F(0x07b15804) /* 0.480796831 */, 16 }, - /* 2366 */ { MAD_F(0x07b27444) /* 0.481067912 */, 16 }, - /* 2367 */ { MAD_F(0x07b3908e) /* 0.481339032 */, 16 }, - - /* 2368 */ { MAD_F(0x07b4ace3) /* 0.481610189 */, 16 }, - /* 2369 */ { MAD_F(0x07b5c941) /* 0.481881385 */, 16 }, - /* 2370 */ { MAD_F(0x07b6e5aa) /* 0.482152620 */, 16 }, - /* 2371 */ { MAD_F(0x07b8021d) /* 0.482423892 */, 16 }, - /* 2372 */ { MAD_F(0x07b91e9b) /* 0.482695202 */, 16 }, - /* 2373 */ { MAD_F(0x07ba3b22) /* 0.482966551 */, 16 }, - /* 2374 */ { MAD_F(0x07bb57b4) /* 0.483237938 */, 16 }, - /* 2375 */ { MAD_F(0x07bc7450) /* 0.483509362 */, 16 }, - /* 2376 */ { MAD_F(0x07bd90f6) /* 0.483780825 */, 16 }, - /* 2377 */ { MAD_F(0x07beada7) /* 0.484052326 */, 16 }, - /* 2378 */ { MAD_F(0x07bfca61) /* 0.484323865 */, 16 }, - /* 2379 */ { MAD_F(0x07c0e726) /* 0.484595443 */, 16 }, - /* 2380 */ { MAD_F(0x07c203f5) /* 0.484867058 */, 16 }, - /* 2381 */ { MAD_F(0x07c320cf) /* 0.485138711 */, 16 }, - /* 2382 */ { MAD_F(0x07c43db2) /* 0.485410402 */, 16 }, - /* 2383 */ { MAD_F(0x07c55aa0) /* 0.485682131 */, 16 }, - - /* 2384 */ { MAD_F(0x07c67798) /* 0.485953899 */, 16 }, - /* 2385 */ { MAD_F(0x07c7949a) /* 0.486225704 */, 16 }, - /* 2386 */ { MAD_F(0x07c8b1a7) /* 0.486497547 */, 16 }, - /* 2387 */ { MAD_F(0x07c9cebd) /* 0.486769429 */, 16 }, - /* 2388 */ { MAD_F(0x07caebde) /* 0.487041348 */, 16 }, - /* 2389 */ { MAD_F(0x07cc0909) /* 0.487313305 */, 16 }, - /* 2390 */ { MAD_F(0x07cd263e) /* 0.487585300 */, 16 }, - /* 2391 */ { MAD_F(0x07ce437d) /* 0.487857333 */, 16 }, - /* 2392 */ { MAD_F(0x07cf60c7) /* 0.488129404 */, 16 }, - /* 2393 */ { MAD_F(0x07d07e1b) /* 0.488401513 */, 16 }, - /* 2394 */ { MAD_F(0x07d19b79) /* 0.488673660 */, 16 }, - /* 2395 */ { MAD_F(0x07d2b8e1) /* 0.488945845 */, 16 }, - /* 2396 */ { MAD_F(0x07d3d653) /* 0.489218067 */, 16 }, - /* 2397 */ { MAD_F(0x07d4f3cf) /* 0.489490328 */, 16 }, - /* 2398 */ { MAD_F(0x07d61156) /* 0.489762626 */, 16 }, - /* 2399 */ { MAD_F(0x07d72ee6) /* 0.490034962 */, 16 }, - - /* 2400 */ { MAD_F(0x07d84c81) /* 0.490307336 */, 16 }, - /* 2401 */ { MAD_F(0x07d96a26) /* 0.490579748 */, 16 }, - /* 2402 */ { MAD_F(0x07da87d5) /* 0.490852198 */, 16 }, - /* 2403 */ { MAD_F(0x07dba58f) /* 0.491124686 */, 16 }, - /* 2404 */ { MAD_F(0x07dcc352) /* 0.491397211 */, 16 }, - /* 2405 */ { MAD_F(0x07dde120) /* 0.491669774 */, 16 }, - /* 2406 */ { MAD_F(0x07defef7) /* 0.491942375 */, 16 }, - /* 2407 */ { MAD_F(0x07e01cd9) /* 0.492215014 */, 16 }, - /* 2408 */ { MAD_F(0x07e13ac5) /* 0.492487690 */, 16 }, - /* 2409 */ { MAD_F(0x07e258bc) /* 0.492760404 */, 16 }, - /* 2410 */ { MAD_F(0x07e376bc) /* 0.493033156 */, 16 }, - /* 2411 */ { MAD_F(0x07e494c6) /* 0.493305946 */, 16 }, - /* 2412 */ { MAD_F(0x07e5b2db) /* 0.493578773 */, 16 }, - /* 2413 */ { MAD_F(0x07e6d0f9) /* 0.493851638 */, 16 }, - /* 2414 */ { MAD_F(0x07e7ef22) /* 0.494124541 */, 16 }, - /* 2415 */ { MAD_F(0x07e90d55) /* 0.494397481 */, 16 }, - - /* 2416 */ { MAD_F(0x07ea2b92) /* 0.494670459 */, 16 }, - /* 2417 */ { MAD_F(0x07eb49d9) /* 0.494943475 */, 16 }, - /* 2418 */ { MAD_F(0x07ec682a) /* 0.495216529 */, 16 }, - /* 2419 */ { MAD_F(0x07ed8686) /* 0.495489620 */, 16 }, - /* 2420 */ { MAD_F(0x07eea4eb) /* 0.495762748 */, 16 }, - /* 2421 */ { MAD_F(0x07efc35b) /* 0.496035915 */, 16 }, - /* 2422 */ { MAD_F(0x07f0e1d4) /* 0.496309119 */, 16 }, - /* 2423 */ { MAD_F(0x07f20058) /* 0.496582360 */, 16 }, - /* 2424 */ { MAD_F(0x07f31ee6) /* 0.496855639 */, 16 }, - /* 2425 */ { MAD_F(0x07f43d7e) /* 0.497128956 */, 16 }, - /* 2426 */ { MAD_F(0x07f55c20) /* 0.497402310 */, 16 }, - /* 2427 */ { MAD_F(0x07f67acc) /* 0.497675702 */, 16 }, - /* 2428 */ { MAD_F(0x07f79982) /* 0.497949132 */, 16 }, - /* 2429 */ { MAD_F(0x07f8b842) /* 0.498222598 */, 16 }, - /* 2430 */ { MAD_F(0x07f9d70c) /* 0.498496103 */, 16 }, - /* 2431 */ { MAD_F(0x07faf5e1) /* 0.498769645 */, 16 }, - - /* 2432 */ { MAD_F(0x07fc14bf) /* 0.499043224 */, 16 }, - /* 2433 */ { MAD_F(0x07fd33a8) /* 0.499316841 */, 16 }, - /* 2434 */ { MAD_F(0x07fe529a) /* 0.499590496 */, 16 }, - /* 2435 */ { MAD_F(0x07ff7197) /* 0.499864188 */, 16 }, - /* 2436 */ { MAD_F(0x0400484f) /* 0.250068959 */, 17 }, - /* 2437 */ { MAD_F(0x0400d7d7) /* 0.250205842 */, 17 }, - /* 2438 */ { MAD_F(0x04016764) /* 0.250342744 */, 17 }, - /* 2439 */ { MAD_F(0x0401f6f7) /* 0.250479665 */, 17 }, - /* 2440 */ { MAD_F(0x0402868e) /* 0.250616605 */, 17 }, - /* 2441 */ { MAD_F(0x0403162b) /* 0.250753563 */, 17 }, - /* 2442 */ { MAD_F(0x0403a5cc) /* 0.250890540 */, 17 }, - /* 2443 */ { MAD_F(0x04043573) /* 0.251027536 */, 17 }, - /* 2444 */ { MAD_F(0x0404c51e) /* 0.251164550 */, 17 }, - /* 2445 */ { MAD_F(0x040554cf) /* 0.251301583 */, 17 }, - /* 2446 */ { MAD_F(0x0405e484) /* 0.251438635 */, 17 }, - /* 2447 */ { MAD_F(0x0406743f) /* 0.251575706 */, 17 }, - - /* 2448 */ { MAD_F(0x040703ff) /* 0.251712795 */, 17 }, - /* 2449 */ { MAD_F(0x040793c3) /* 0.251849903 */, 17 }, - /* 2450 */ { MAD_F(0x0408238d) /* 0.251987029 */, 17 }, - /* 2451 */ { MAD_F(0x0408b35b) /* 0.252124174 */, 17 }, - /* 2452 */ { MAD_F(0x0409432f) /* 0.252261338 */, 17 }, - /* 2453 */ { MAD_F(0x0409d308) /* 0.252398520 */, 17 }, - /* 2454 */ { MAD_F(0x040a62e5) /* 0.252535721 */, 17 }, - /* 2455 */ { MAD_F(0x040af2c8) /* 0.252672941 */, 17 }, - /* 2456 */ { MAD_F(0x040b82b0) /* 0.252810180 */, 17 }, - /* 2457 */ { MAD_F(0x040c129c) /* 0.252947436 */, 17 }, - /* 2458 */ { MAD_F(0x040ca28e) /* 0.253084712 */, 17 }, - /* 2459 */ { MAD_F(0x040d3284) /* 0.253222006 */, 17 }, - /* 2460 */ { MAD_F(0x040dc280) /* 0.253359319 */, 17 }, - /* 2461 */ { MAD_F(0x040e5281) /* 0.253496651 */, 17 }, - /* 2462 */ { MAD_F(0x040ee286) /* 0.253634001 */, 17 }, - /* 2463 */ { MAD_F(0x040f7291) /* 0.253771369 */, 17 }, - - /* 2464 */ { MAD_F(0x041002a1) /* 0.253908756 */, 17 }, - /* 2465 */ { MAD_F(0x041092b5) /* 0.254046162 */, 17 }, - /* 2466 */ { MAD_F(0x041122cf) /* 0.254183587 */, 17 }, - /* 2467 */ { MAD_F(0x0411b2ed) /* 0.254321030 */, 17 }, - /* 2468 */ { MAD_F(0x04124311) /* 0.254458491 */, 17 }, - /* 2469 */ { MAD_F(0x0412d339) /* 0.254595971 */, 17 }, - /* 2470 */ { MAD_F(0x04136367) /* 0.254733470 */, 17 }, - /* 2471 */ { MAD_F(0x0413f399) /* 0.254870987 */, 17 }, - /* 2472 */ { MAD_F(0x041483d1) /* 0.255008523 */, 17 }, - /* 2473 */ { MAD_F(0x0415140d) /* 0.255146077 */, 17 }, - /* 2474 */ { MAD_F(0x0415a44f) /* 0.255283650 */, 17 }, - /* 2475 */ { MAD_F(0x04163495) /* 0.255421241 */, 17 }, - /* 2476 */ { MAD_F(0x0416c4e1) /* 0.255558851 */, 17 }, - /* 2477 */ { MAD_F(0x04175531) /* 0.255696480 */, 17 }, - /* 2478 */ { MAD_F(0x0417e586) /* 0.255834127 */, 17 }, - /* 2479 */ { MAD_F(0x041875e1) /* 0.255971792 */, 17 }, - - /* 2480 */ { MAD_F(0x04190640) /* 0.256109476 */, 17 }, - /* 2481 */ { MAD_F(0x041996a4) /* 0.256247179 */, 17 }, - /* 2482 */ { MAD_F(0x041a270d) /* 0.256384900 */, 17 }, - /* 2483 */ { MAD_F(0x041ab77b) /* 0.256522639 */, 17 }, - /* 2484 */ { MAD_F(0x041b47ef) /* 0.256660397 */, 17 }, - /* 2485 */ { MAD_F(0x041bd867) /* 0.256798174 */, 17 }, - /* 2486 */ { MAD_F(0x041c68e4) /* 0.256935969 */, 17 }, - /* 2487 */ { MAD_F(0x041cf966) /* 0.257073782 */, 17 }, - /* 2488 */ { MAD_F(0x041d89ed) /* 0.257211614 */, 17 }, - /* 2489 */ { MAD_F(0x041e1a79) /* 0.257349465 */, 17 }, - /* 2490 */ { MAD_F(0x041eab0a) /* 0.257487334 */, 17 }, - /* 2491 */ { MAD_F(0x041f3b9f) /* 0.257625221 */, 17 }, - /* 2492 */ { MAD_F(0x041fcc3a) /* 0.257763127 */, 17 }, - /* 2493 */ { MAD_F(0x04205cda) /* 0.257901051 */, 17 }, - /* 2494 */ { MAD_F(0x0420ed7f) /* 0.258038994 */, 17 }, - /* 2495 */ { MAD_F(0x04217e28) /* 0.258176955 */, 17 }, - - /* 2496 */ { MAD_F(0x04220ed7) /* 0.258314934 */, 17 }, - /* 2497 */ { MAD_F(0x04229f8a) /* 0.258452932 */, 17 }, - /* 2498 */ { MAD_F(0x04233043) /* 0.258590948 */, 17 }, - /* 2499 */ { MAD_F(0x0423c100) /* 0.258728983 */, 17 }, - /* 2500 */ { MAD_F(0x042451c3) /* 0.258867036 */, 17 }, - /* 2501 */ { MAD_F(0x0424e28a) /* 0.259005108 */, 17 }, - /* 2502 */ { MAD_F(0x04257356) /* 0.259143198 */, 17 }, - /* 2503 */ { MAD_F(0x04260428) /* 0.259281307 */, 17 }, - /* 2504 */ { MAD_F(0x042694fe) /* 0.259419433 */, 17 }, - /* 2505 */ { MAD_F(0x042725d9) /* 0.259557579 */, 17 }, - /* 2506 */ { MAD_F(0x0427b6b9) /* 0.259695742 */, 17 }, - /* 2507 */ { MAD_F(0x0428479e) /* 0.259833924 */, 17 }, - /* 2508 */ { MAD_F(0x0428d888) /* 0.259972124 */, 17 }, - /* 2509 */ { MAD_F(0x04296976) /* 0.260110343 */, 17 }, - /* 2510 */ { MAD_F(0x0429fa6a) /* 0.260248580 */, 17 }, - /* 2511 */ { MAD_F(0x042a8b63) /* 0.260386836 */, 17 }, - - /* 2512 */ { MAD_F(0x042b1c60) /* 0.260525110 */, 17 }, - /* 2513 */ { MAD_F(0x042bad63) /* 0.260663402 */, 17 }, - /* 2514 */ { MAD_F(0x042c3e6a) /* 0.260801712 */, 17 }, - /* 2515 */ { MAD_F(0x042ccf77) /* 0.260940041 */, 17 }, - /* 2516 */ { MAD_F(0x042d6088) /* 0.261078388 */, 17 }, - /* 2517 */ { MAD_F(0x042df19e) /* 0.261216754 */, 17 }, - /* 2518 */ { MAD_F(0x042e82b9) /* 0.261355137 */, 17 }, - /* 2519 */ { MAD_F(0x042f13d9) /* 0.261493540 */, 17 }, - /* 2520 */ { MAD_F(0x042fa4fe) /* 0.261631960 */, 17 }, - /* 2521 */ { MAD_F(0x04303628) /* 0.261770399 */, 17 }, - /* 2522 */ { MAD_F(0x0430c757) /* 0.261908856 */, 17 }, - /* 2523 */ { MAD_F(0x0431588b) /* 0.262047331 */, 17 }, - /* 2524 */ { MAD_F(0x0431e9c3) /* 0.262185825 */, 17 }, - /* 2525 */ { MAD_F(0x04327b01) /* 0.262324337 */, 17 }, - /* 2526 */ { MAD_F(0x04330c43) /* 0.262462867 */, 17 }, - /* 2527 */ { MAD_F(0x04339d8a) /* 0.262601416 */, 17 }, - - /* 2528 */ { MAD_F(0x04342ed7) /* 0.262739982 */, 17 }, - /* 2529 */ { MAD_F(0x0434c028) /* 0.262878568 */, 17 }, - /* 2530 */ { MAD_F(0x0435517e) /* 0.263017171 */, 17 }, - /* 2531 */ { MAD_F(0x0435e2d9) /* 0.263155792 */, 17 }, - /* 2532 */ { MAD_F(0x04367439) /* 0.263294432 */, 17 }, - /* 2533 */ { MAD_F(0x0437059e) /* 0.263433090 */, 17 }, - /* 2534 */ { MAD_F(0x04379707) /* 0.263571767 */, 17 }, - /* 2535 */ { MAD_F(0x04382876) /* 0.263710461 */, 17 }, - /* 2536 */ { MAD_F(0x0438b9e9) /* 0.263849174 */, 17 }, - /* 2537 */ { MAD_F(0x04394b61) /* 0.263987905 */, 17 }, - /* 2538 */ { MAD_F(0x0439dcdf) /* 0.264126655 */, 17 }, - /* 2539 */ { MAD_F(0x043a6e61) /* 0.264265422 */, 17 }, - /* 2540 */ { MAD_F(0x043affe8) /* 0.264404208 */, 17 }, - /* 2541 */ { MAD_F(0x043b9174) /* 0.264543012 */, 17 }, - /* 2542 */ { MAD_F(0x043c2305) /* 0.264681834 */, 17 }, - /* 2543 */ { MAD_F(0x043cb49a) /* 0.264820674 */, 17 }, - - /* 2544 */ { MAD_F(0x043d4635) /* 0.264959533 */, 17 }, - /* 2545 */ { MAD_F(0x043dd7d4) /* 0.265098410 */, 17 }, - /* 2546 */ { MAD_F(0x043e6979) /* 0.265237305 */, 17 }, - /* 2547 */ { MAD_F(0x043efb22) /* 0.265376218 */, 17 }, - /* 2548 */ { MAD_F(0x043f8cd0) /* 0.265515149 */, 17 }, - /* 2549 */ { MAD_F(0x04401e83) /* 0.265654099 */, 17 }, - /* 2550 */ { MAD_F(0x0440b03b) /* 0.265793066 */, 17 }, - /* 2551 */ { MAD_F(0x044141f7) /* 0.265932052 */, 17 }, - /* 2552 */ { MAD_F(0x0441d3b9) /* 0.266071056 */, 17 }, - /* 2553 */ { MAD_F(0x04426580) /* 0.266210078 */, 17 }, - /* 2554 */ { MAD_F(0x0442f74b) /* 0.266349119 */, 17 }, - /* 2555 */ { MAD_F(0x0443891b) /* 0.266488177 */, 17 }, - /* 2556 */ { MAD_F(0x04441af0) /* 0.266627254 */, 17 }, - /* 2557 */ { MAD_F(0x0444acca) /* 0.266766349 */, 17 }, - /* 2558 */ { MAD_F(0x04453ea9) /* 0.266905462 */, 17 }, - /* 2559 */ { MAD_F(0x0445d08d) /* 0.267044593 */, 17 }, - - /* 2560 */ { MAD_F(0x04466275) /* 0.267183742 */, 17 }, - /* 2561 */ { MAD_F(0x0446f463) /* 0.267322909 */, 17 }, - /* 2562 */ { MAD_F(0x04478655) /* 0.267462094 */, 17 }, - /* 2563 */ { MAD_F(0x0448184c) /* 0.267601298 */, 17 }, - /* 2564 */ { MAD_F(0x0448aa48) /* 0.267740519 */, 17 }, - /* 2565 */ { MAD_F(0x04493c49) /* 0.267879759 */, 17 }, - /* 2566 */ { MAD_F(0x0449ce4f) /* 0.268019017 */, 17 }, - /* 2567 */ { MAD_F(0x044a6059) /* 0.268158293 */, 17 }, - /* 2568 */ { MAD_F(0x044af269) /* 0.268297587 */, 17 }, - /* 2569 */ { MAD_F(0x044b847d) /* 0.268436899 */, 17 }, - /* 2570 */ { MAD_F(0x044c1696) /* 0.268576229 */, 17 }, - /* 2571 */ { MAD_F(0x044ca8b4) /* 0.268715577 */, 17 }, - /* 2572 */ { MAD_F(0x044d3ad7) /* 0.268854943 */, 17 }, - /* 2573 */ { MAD_F(0x044dccff) /* 0.268994328 */, 17 }, - /* 2574 */ { MAD_F(0x044e5f2b) /* 0.269133730 */, 17 }, - /* 2575 */ { MAD_F(0x044ef15d) /* 0.269273150 */, 17 }, - - /* 2576 */ { MAD_F(0x044f8393) /* 0.269412589 */, 17 }, - /* 2577 */ { MAD_F(0x045015ce) /* 0.269552045 */, 17 }, - /* 2578 */ { MAD_F(0x0450a80e) /* 0.269691520 */, 17 }, - /* 2579 */ { MAD_F(0x04513a53) /* 0.269831013 */, 17 }, - /* 2580 */ { MAD_F(0x0451cc9c) /* 0.269970523 */, 17 }, - /* 2581 */ { MAD_F(0x04525eeb) /* 0.270110052 */, 17 }, - /* 2582 */ { MAD_F(0x0452f13e) /* 0.270249599 */, 17 }, - /* 2583 */ { MAD_F(0x04538396) /* 0.270389163 */, 17 }, - /* 2584 */ { MAD_F(0x045415f3) /* 0.270528746 */, 17 }, - /* 2585 */ { MAD_F(0x0454a855) /* 0.270668347 */, 17 }, - /* 2586 */ { MAD_F(0x04553abb) /* 0.270807965 */, 17 }, - /* 2587 */ { MAD_F(0x0455cd27) /* 0.270947602 */, 17 }, - /* 2588 */ { MAD_F(0x04565f97) /* 0.271087257 */, 17 }, - /* 2589 */ { MAD_F(0x0456f20c) /* 0.271226930 */, 17 }, - /* 2590 */ { MAD_F(0x04578486) /* 0.271366620 */, 17 }, - /* 2591 */ { MAD_F(0x04581705) /* 0.271506329 */, 17 }, - - /* 2592 */ { MAD_F(0x0458a989) /* 0.271646056 */, 17 }, - /* 2593 */ { MAD_F(0x04593c11) /* 0.271785800 */, 17 }, - /* 2594 */ { MAD_F(0x0459ce9e) /* 0.271925563 */, 17 }, - /* 2595 */ { MAD_F(0x045a6130) /* 0.272065343 */, 17 }, - /* 2596 */ { MAD_F(0x045af3c7) /* 0.272205142 */, 17 }, - /* 2597 */ { MAD_F(0x045b8663) /* 0.272344958 */, 17 }, - /* 2598 */ { MAD_F(0x045c1903) /* 0.272484793 */, 17 }, - /* 2599 */ { MAD_F(0x045caba9) /* 0.272624645 */, 17 }, - /* 2600 */ { MAD_F(0x045d3e53) /* 0.272764515 */, 17 }, - /* 2601 */ { MAD_F(0x045dd102) /* 0.272904403 */, 17 }, - /* 2602 */ { MAD_F(0x045e63b6) /* 0.273044310 */, 17 }, - /* 2603 */ { MAD_F(0x045ef66e) /* 0.273184234 */, 17 }, - /* 2604 */ { MAD_F(0x045f892b) /* 0.273324176 */, 17 }, - /* 2605 */ { MAD_F(0x04601bee) /* 0.273464136 */, 17 }, - /* 2606 */ { MAD_F(0x0460aeb5) /* 0.273604113 */, 17 }, - /* 2607 */ { MAD_F(0x04614180) /* 0.273744109 */, 17 }, - - /* 2608 */ { MAD_F(0x0461d451) /* 0.273884123 */, 17 }, - /* 2609 */ { MAD_F(0x04626727) /* 0.274024154 */, 17 }, - /* 2610 */ { MAD_F(0x0462fa01) /* 0.274164204 */, 17 }, - /* 2611 */ { MAD_F(0x04638ce0) /* 0.274304271 */, 17 }, - /* 2612 */ { MAD_F(0x04641fc4) /* 0.274444356 */, 17 }, - /* 2613 */ { MAD_F(0x0464b2ac) /* 0.274584459 */, 17 }, - /* 2614 */ { MAD_F(0x0465459a) /* 0.274724580 */, 17 }, - /* 2615 */ { MAD_F(0x0465d88c) /* 0.274864719 */, 17 }, - /* 2616 */ { MAD_F(0x04666b83) /* 0.275004875 */, 17 }, - /* 2617 */ { MAD_F(0x0466fe7f) /* 0.275145050 */, 17 }, - /* 2618 */ { MAD_F(0x0467917f) /* 0.275285242 */, 17 }, - /* 2619 */ { MAD_F(0x04682485) /* 0.275425452 */, 17 }, - /* 2620 */ { MAD_F(0x0468b78f) /* 0.275565681 */, 17 }, - /* 2621 */ { MAD_F(0x04694a9e) /* 0.275705926 */, 17 }, - /* 2622 */ { MAD_F(0x0469ddb2) /* 0.275846190 */, 17 }, - /* 2623 */ { MAD_F(0x046a70ca) /* 0.275986472 */, 17 }, - - /* 2624 */ { MAD_F(0x046b03e7) /* 0.276126771 */, 17 }, - /* 2625 */ { MAD_F(0x046b970a) /* 0.276267088 */, 17 }, - /* 2626 */ { MAD_F(0x046c2a31) /* 0.276407423 */, 17 }, - /* 2627 */ { MAD_F(0x046cbd5c) /* 0.276547776 */, 17 }, - /* 2628 */ { MAD_F(0x046d508d) /* 0.276688147 */, 17 }, - /* 2629 */ { MAD_F(0x046de3c2) /* 0.276828535 */, 17 }, - /* 2630 */ { MAD_F(0x046e76fc) /* 0.276968942 */, 17 }, - /* 2631 */ { MAD_F(0x046f0a3b) /* 0.277109366 */, 17 }, - /* 2632 */ { MAD_F(0x046f9d7e) /* 0.277249808 */, 17 }, - /* 2633 */ { MAD_F(0x047030c7) /* 0.277390267 */, 17 }, - /* 2634 */ { MAD_F(0x0470c414) /* 0.277530745 */, 17 }, - /* 2635 */ { MAD_F(0x04715766) /* 0.277671240 */, 17 }, - /* 2636 */ { MAD_F(0x0471eabc) /* 0.277811753 */, 17 }, - /* 2637 */ { MAD_F(0x04727e18) /* 0.277952284 */, 17 }, - /* 2638 */ { MAD_F(0x04731178) /* 0.278092832 */, 17 }, - /* 2639 */ { MAD_F(0x0473a4dd) /* 0.278233399 */, 17 }, - - /* 2640 */ { MAD_F(0x04743847) /* 0.278373983 */, 17 }, - /* 2641 */ { MAD_F(0x0474cbb5) /* 0.278514584 */, 17 }, - /* 2642 */ { MAD_F(0x04755f29) /* 0.278655204 */, 17 }, - /* 2643 */ { MAD_F(0x0475f2a1) /* 0.278795841 */, 17 }, - /* 2644 */ { MAD_F(0x0476861d) /* 0.278936496 */, 17 }, - /* 2645 */ { MAD_F(0x0477199f) /* 0.279077169 */, 17 }, - /* 2646 */ { MAD_F(0x0477ad25) /* 0.279217860 */, 17 }, - /* 2647 */ { MAD_F(0x047840b0) /* 0.279358568 */, 17 }, - /* 2648 */ { MAD_F(0x0478d440) /* 0.279499294 */, 17 }, - /* 2649 */ { MAD_F(0x047967d5) /* 0.279640037 */, 17 }, - /* 2650 */ { MAD_F(0x0479fb6e) /* 0.279780799 */, 17 }, - /* 2651 */ { MAD_F(0x047a8f0c) /* 0.279921578 */, 17 }, - /* 2652 */ { MAD_F(0x047b22af) /* 0.280062375 */, 17 }, - /* 2653 */ { MAD_F(0x047bb657) /* 0.280203189 */, 17 }, - /* 2654 */ { MAD_F(0x047c4a03) /* 0.280344021 */, 17 }, - /* 2655 */ { MAD_F(0x047cddb4) /* 0.280484871 */, 17 }, - - /* 2656 */ { MAD_F(0x047d716a) /* 0.280625739 */, 17 }, - /* 2657 */ { MAD_F(0x047e0524) /* 0.280766624 */, 17 }, - /* 2658 */ { MAD_F(0x047e98e4) /* 0.280907527 */, 17 }, - /* 2659 */ { MAD_F(0x047f2ca8) /* 0.281048447 */, 17 }, - /* 2660 */ { MAD_F(0x047fc071) /* 0.281189385 */, 17 }, - /* 2661 */ { MAD_F(0x0480543e) /* 0.281330341 */, 17 }, - /* 2662 */ { MAD_F(0x0480e811) /* 0.281471315 */, 17 }, - /* 2663 */ { MAD_F(0x04817be8) /* 0.281612306 */, 17 }, - /* 2664 */ { MAD_F(0x04820fc3) /* 0.281753315 */, 17 }, - /* 2665 */ { MAD_F(0x0482a3a4) /* 0.281894341 */, 17 }, - /* 2666 */ { MAD_F(0x04833789) /* 0.282035386 */, 17 }, - /* 2667 */ { MAD_F(0x0483cb73) /* 0.282176447 */, 17 }, - /* 2668 */ { MAD_F(0x04845f62) /* 0.282317527 */, 17 }, - /* 2669 */ { MAD_F(0x0484f355) /* 0.282458624 */, 17 }, - /* 2670 */ { MAD_F(0x0485874d) /* 0.282599738 */, 17 }, - /* 2671 */ { MAD_F(0x04861b4a) /* 0.282740871 */, 17 }, - - /* 2672 */ { MAD_F(0x0486af4c) /* 0.282882021 */, 17 }, - /* 2673 */ { MAD_F(0x04874352) /* 0.283023188 */, 17 }, - /* 2674 */ { MAD_F(0x0487d75d) /* 0.283164373 */, 17 }, - /* 2675 */ { MAD_F(0x04886b6d) /* 0.283305576 */, 17 }, - /* 2676 */ { MAD_F(0x0488ff82) /* 0.283446796 */, 17 }, - /* 2677 */ { MAD_F(0x0489939b) /* 0.283588034 */, 17 }, - /* 2678 */ { MAD_F(0x048a27b9) /* 0.283729290 */, 17 }, - /* 2679 */ { MAD_F(0x048abbdc) /* 0.283870563 */, 17 }, - /* 2680 */ { MAD_F(0x048b5003) /* 0.284011853 */, 17 }, - /* 2681 */ { MAD_F(0x048be42f) /* 0.284153161 */, 17 }, - /* 2682 */ { MAD_F(0x048c7860) /* 0.284294487 */, 17 }, - /* 2683 */ { MAD_F(0x048d0c96) /* 0.284435831 */, 17 }, - /* 2684 */ { MAD_F(0x048da0d0) /* 0.284577192 */, 17 }, - /* 2685 */ { MAD_F(0x048e350f) /* 0.284718570 */, 17 }, - /* 2686 */ { MAD_F(0x048ec953) /* 0.284859966 */, 17 }, - /* 2687 */ { MAD_F(0x048f5d9b) /* 0.285001380 */, 17 }, - - /* 2688 */ { MAD_F(0x048ff1e8) /* 0.285142811 */, 17 }, - /* 2689 */ { MAD_F(0x0490863a) /* 0.285284259 */, 17 }, - /* 2690 */ { MAD_F(0x04911a91) /* 0.285425726 */, 17 }, - /* 2691 */ { MAD_F(0x0491aeec) /* 0.285567209 */, 17 }, - /* 2692 */ { MAD_F(0x0492434c) /* 0.285708711 */, 17 }, - /* 2693 */ { MAD_F(0x0492d7b0) /* 0.285850229 */, 17 }, - /* 2694 */ { MAD_F(0x04936c1a) /* 0.285991766 */, 17 }, - /* 2695 */ { MAD_F(0x04940088) /* 0.286133319 */, 17 }, - /* 2696 */ { MAD_F(0x049494fb) /* 0.286274891 */, 17 }, - /* 2697 */ { MAD_F(0x04952972) /* 0.286416480 */, 17 }, - /* 2698 */ { MAD_F(0x0495bdee) /* 0.286558086 */, 17 }, - /* 2699 */ { MAD_F(0x0496526f) /* 0.286699710 */, 17 }, - /* 2700 */ { MAD_F(0x0496e6f5) /* 0.286841351 */, 17 }, - /* 2701 */ { MAD_F(0x04977b7f) /* 0.286983010 */, 17 }, - /* 2702 */ { MAD_F(0x0498100e) /* 0.287124686 */, 17 }, - /* 2703 */ { MAD_F(0x0498a4a1) /* 0.287266380 */, 17 }, - - /* 2704 */ { MAD_F(0x0499393a) /* 0.287408091 */, 17 }, - /* 2705 */ { MAD_F(0x0499cdd7) /* 0.287549820 */, 17 }, - /* 2706 */ { MAD_F(0x049a6278) /* 0.287691566 */, 17 }, - /* 2707 */ { MAD_F(0x049af71f) /* 0.287833330 */, 17 }, - /* 2708 */ { MAD_F(0x049b8bca) /* 0.287975111 */, 17 }, - /* 2709 */ { MAD_F(0x049c207a) /* 0.288116909 */, 17 }, - /* 2710 */ { MAD_F(0x049cb52e) /* 0.288258725 */, 17 }, - /* 2711 */ { MAD_F(0x049d49e7) /* 0.288400559 */, 17 }, - /* 2712 */ { MAD_F(0x049ddea5) /* 0.288542409 */, 17 }, - /* 2713 */ { MAD_F(0x049e7367) /* 0.288684278 */, 17 }, - /* 2714 */ { MAD_F(0x049f082f) /* 0.288826163 */, 17 }, - /* 2715 */ { MAD_F(0x049f9cfa) /* 0.288968067 */, 17 }, - /* 2716 */ { MAD_F(0x04a031cb) /* 0.289109987 */, 17 }, - /* 2717 */ { MAD_F(0x04a0c6a0) /* 0.289251925 */, 17 }, - /* 2718 */ { MAD_F(0x04a15b7a) /* 0.289393881 */, 17 }, - /* 2719 */ { MAD_F(0x04a1f059) /* 0.289535854 */, 17 }, - - /* 2720 */ { MAD_F(0x04a2853c) /* 0.289677844 */, 17 }, - /* 2721 */ { MAD_F(0x04a31a24) /* 0.289819851 */, 17 }, - /* 2722 */ { MAD_F(0x04a3af10) /* 0.289961876 */, 17 }, - /* 2723 */ { MAD_F(0x04a44401) /* 0.290103919 */, 17 }, - /* 2724 */ { MAD_F(0x04a4d8f7) /* 0.290245979 */, 17 }, - /* 2725 */ { MAD_F(0x04a56df2) /* 0.290388056 */, 17 }, - /* 2726 */ { MAD_F(0x04a602f1) /* 0.290530150 */, 17 }, - /* 2727 */ { MAD_F(0x04a697f5) /* 0.290672262 */, 17 }, - /* 2728 */ { MAD_F(0x04a72cfe) /* 0.290814392 */, 17 }, - /* 2729 */ { MAD_F(0x04a7c20b) /* 0.290956538 */, 17 }, - /* 2730 */ { MAD_F(0x04a8571d) /* 0.291098703 */, 17 }, - /* 2731 */ { MAD_F(0x04a8ec33) /* 0.291240884 */, 17 }, - /* 2732 */ { MAD_F(0x04a9814e) /* 0.291383083 */, 17 }, - /* 2733 */ { MAD_F(0x04aa166e) /* 0.291525299 */, 17 }, - /* 2734 */ { MAD_F(0x04aaab93) /* 0.291667532 */, 17 }, - /* 2735 */ { MAD_F(0x04ab40bc) /* 0.291809783 */, 17 }, - - /* 2736 */ { MAD_F(0x04abd5ea) /* 0.291952051 */, 17 }, - /* 2737 */ { MAD_F(0x04ac6b1c) /* 0.292094337 */, 17 }, - /* 2738 */ { MAD_F(0x04ad0053) /* 0.292236640 */, 17 }, - /* 2739 */ { MAD_F(0x04ad958f) /* 0.292378960 */, 17 }, - /* 2740 */ { MAD_F(0x04ae2ad0) /* 0.292521297 */, 17 }, - /* 2741 */ { MAD_F(0x04aec015) /* 0.292663652 */, 17 }, - /* 2742 */ { MAD_F(0x04af555e) /* 0.292806024 */, 17 }, - /* 2743 */ { MAD_F(0x04afeaad) /* 0.292948414 */, 17 }, - /* 2744 */ { MAD_F(0x04b08000) /* 0.293090820 */, 17 }, - /* 2745 */ { MAD_F(0x04b11557) /* 0.293233244 */, 17 }, - /* 2746 */ { MAD_F(0x04b1aab4) /* 0.293375686 */, 17 }, - /* 2747 */ { MAD_F(0x04b24015) /* 0.293518144 */, 17 }, - /* 2748 */ { MAD_F(0x04b2d57a) /* 0.293660620 */, 17 }, - /* 2749 */ { MAD_F(0x04b36ae4) /* 0.293803113 */, 17 }, - /* 2750 */ { MAD_F(0x04b40053) /* 0.293945624 */, 17 }, - /* 2751 */ { MAD_F(0x04b495c7) /* 0.294088151 */, 17 }, - - /* 2752 */ { MAD_F(0x04b52b3f) /* 0.294230696 */, 17 }, - /* 2753 */ { MAD_F(0x04b5c0bc) /* 0.294373259 */, 17 }, - /* 2754 */ { MAD_F(0x04b6563d) /* 0.294515838 */, 17 }, - /* 2755 */ { MAD_F(0x04b6ebc3) /* 0.294658435 */, 17 }, - /* 2756 */ { MAD_F(0x04b7814e) /* 0.294801049 */, 17 }, - /* 2757 */ { MAD_F(0x04b816dd) /* 0.294943680 */, 17 }, - /* 2758 */ { MAD_F(0x04b8ac71) /* 0.295086329 */, 17 }, - /* 2759 */ { MAD_F(0x04b9420a) /* 0.295228995 */, 17 }, - /* 2760 */ { MAD_F(0x04b9d7a7) /* 0.295371678 */, 17 }, - /* 2761 */ { MAD_F(0x04ba6d49) /* 0.295514378 */, 17 }, - /* 2762 */ { MAD_F(0x04bb02ef) /* 0.295657095 */, 17 }, - /* 2763 */ { MAD_F(0x04bb989a) /* 0.295799830 */, 17 }, - /* 2764 */ { MAD_F(0x04bc2e4a) /* 0.295942582 */, 17 }, - /* 2765 */ { MAD_F(0x04bcc3fe) /* 0.296085351 */, 17 }, - /* 2766 */ { MAD_F(0x04bd59b7) /* 0.296228138 */, 17 }, - /* 2767 */ { MAD_F(0x04bdef74) /* 0.296370941 */, 17 }, - - /* 2768 */ { MAD_F(0x04be8537) /* 0.296513762 */, 17 }, - /* 2769 */ { MAD_F(0x04bf1afd) /* 0.296656600 */, 17 }, - /* 2770 */ { MAD_F(0x04bfb0c9) /* 0.296799455 */, 17 }, - /* 2771 */ { MAD_F(0x04c04699) /* 0.296942327 */, 17 }, - /* 2772 */ { MAD_F(0x04c0dc6d) /* 0.297085217 */, 17 }, - /* 2773 */ { MAD_F(0x04c17247) /* 0.297228124 */, 17 }, - /* 2774 */ { MAD_F(0x04c20824) /* 0.297371048 */, 17 }, - /* 2775 */ { MAD_F(0x04c29e07) /* 0.297513989 */, 17 }, - /* 2776 */ { MAD_F(0x04c333ee) /* 0.297656947 */, 17 }, - /* 2777 */ { MAD_F(0x04c3c9da) /* 0.297799922 */, 17 }, - /* 2778 */ { MAD_F(0x04c45fca) /* 0.297942915 */, 17 }, - /* 2779 */ { MAD_F(0x04c4f5bf) /* 0.298085925 */, 17 }, - /* 2780 */ { MAD_F(0x04c58bb8) /* 0.298228951 */, 17 }, - /* 2781 */ { MAD_F(0x04c621b6) /* 0.298371996 */, 17 }, - /* 2782 */ { MAD_F(0x04c6b7b9) /* 0.298515057 */, 17 }, - /* 2783 */ { MAD_F(0x04c74dc0) /* 0.298658135 */, 17 }, - - /* 2784 */ { MAD_F(0x04c7e3cc) /* 0.298801231 */, 17 }, - /* 2785 */ { MAD_F(0x04c879dd) /* 0.298944343 */, 17 }, - /* 2786 */ { MAD_F(0x04c90ff2) /* 0.299087473 */, 17 }, - /* 2787 */ { MAD_F(0x04c9a60c) /* 0.299230620 */, 17 }, - /* 2788 */ { MAD_F(0x04ca3c2a) /* 0.299373784 */, 17 }, - /* 2789 */ { MAD_F(0x04cad24d) /* 0.299516965 */, 17 }, - /* 2790 */ { MAD_F(0x04cb6874) /* 0.299660163 */, 17 }, - /* 2791 */ { MAD_F(0x04cbfea0) /* 0.299803378 */, 17 }, - /* 2792 */ { MAD_F(0x04cc94d1) /* 0.299946611 */, 17 }, - /* 2793 */ { MAD_F(0x04cd2b06) /* 0.300089860 */, 17 }, - /* 2794 */ { MAD_F(0x04cdc140) /* 0.300233127 */, 17 }, - /* 2795 */ { MAD_F(0x04ce577f) /* 0.300376411 */, 17 }, - /* 2796 */ { MAD_F(0x04ceedc2) /* 0.300519711 */, 17 }, - /* 2797 */ { MAD_F(0x04cf8409) /* 0.300663029 */, 17 }, - /* 2798 */ { MAD_F(0x04d01a55) /* 0.300806364 */, 17 }, - /* 2799 */ { MAD_F(0x04d0b0a6) /* 0.300949716 */, 17 }, - - /* 2800 */ { MAD_F(0x04d146fb) /* 0.301093085 */, 17 }, - /* 2801 */ { MAD_F(0x04d1dd55) /* 0.301236472 */, 17 }, - /* 2802 */ { MAD_F(0x04d273b4) /* 0.301379875 */, 17 }, - /* 2803 */ { MAD_F(0x04d30a17) /* 0.301523295 */, 17 }, - /* 2804 */ { MAD_F(0x04d3a07f) /* 0.301666733 */, 17 }, - /* 2805 */ { MAD_F(0x04d436eb) /* 0.301810187 */, 17 }, - /* 2806 */ { MAD_F(0x04d4cd5c) /* 0.301953659 */, 17 }, - /* 2807 */ { MAD_F(0x04d563d1) /* 0.302097147 */, 17 }, - /* 2808 */ { MAD_F(0x04d5fa4b) /* 0.302240653 */, 17 }, - /* 2809 */ { MAD_F(0x04d690ca) /* 0.302384175 */, 17 }, - /* 2810 */ { MAD_F(0x04d7274d) /* 0.302527715 */, 17 }, - /* 2811 */ { MAD_F(0x04d7bdd5) /* 0.302671271 */, 17 }, - /* 2812 */ { MAD_F(0x04d85461) /* 0.302814845 */, 17 }, - /* 2813 */ { MAD_F(0x04d8eaf2) /* 0.302958436 */, 17 }, - /* 2814 */ { MAD_F(0x04d98187) /* 0.303102044 */, 17 }, - /* 2815 */ { MAD_F(0x04da1821) /* 0.303245668 */, 17 }, - - /* 2816 */ { MAD_F(0x04daaec0) /* 0.303389310 */, 17 }, - /* 2817 */ { MAD_F(0x04db4563) /* 0.303532969 */, 17 }, - /* 2818 */ { MAD_F(0x04dbdc0a) /* 0.303676645 */, 17 }, - /* 2819 */ { MAD_F(0x04dc72b7) /* 0.303820337 */, 17 }, - /* 2820 */ { MAD_F(0x04dd0967) /* 0.303964047 */, 17 }, - /* 2821 */ { MAD_F(0x04dda01d) /* 0.304107774 */, 17 }, - /* 2822 */ { MAD_F(0x04de36d7) /* 0.304251517 */, 17 }, - /* 2823 */ { MAD_F(0x04decd95) /* 0.304395278 */, 17 }, - /* 2824 */ { MAD_F(0x04df6458) /* 0.304539056 */, 17 }, - /* 2825 */ { MAD_F(0x04dffb20) /* 0.304682850 */, 17 }, - /* 2826 */ { MAD_F(0x04e091ec) /* 0.304826662 */, 17 }, - /* 2827 */ { MAD_F(0x04e128bc) /* 0.304970491 */, 17 }, - /* 2828 */ { MAD_F(0x04e1bf92) /* 0.305114336 */, 17 }, - /* 2829 */ { MAD_F(0x04e2566b) /* 0.305258199 */, 17 }, - /* 2830 */ { MAD_F(0x04e2ed4a) /* 0.305402078 */, 17 }, - /* 2831 */ { MAD_F(0x04e3842d) /* 0.305545974 */, 17 }, - - /* 2832 */ { MAD_F(0x04e41b14) /* 0.305689888 */, 17 }, - /* 2833 */ { MAD_F(0x04e4b200) /* 0.305833818 */, 17 }, - /* 2834 */ { MAD_F(0x04e548f1) /* 0.305977765 */, 17 }, - /* 2835 */ { MAD_F(0x04e5dfe6) /* 0.306121729 */, 17 }, - /* 2836 */ { MAD_F(0x04e676df) /* 0.306265710 */, 17 }, - /* 2837 */ { MAD_F(0x04e70dde) /* 0.306409708 */, 17 }, - /* 2838 */ { MAD_F(0x04e7a4e0) /* 0.306553723 */, 17 }, - /* 2839 */ { MAD_F(0x04e83be7) /* 0.306697755 */, 17 }, - /* 2840 */ { MAD_F(0x04e8d2f3) /* 0.306841804 */, 17 }, - /* 2841 */ { MAD_F(0x04e96a04) /* 0.306985869 */, 17 }, - /* 2842 */ { MAD_F(0x04ea0118) /* 0.307129952 */, 17 }, - /* 2843 */ { MAD_F(0x04ea9832) /* 0.307274051 */, 17 }, - /* 2844 */ { MAD_F(0x04eb2f50) /* 0.307418168 */, 17 }, - /* 2845 */ { MAD_F(0x04ebc672) /* 0.307562301 */, 17 }, - /* 2846 */ { MAD_F(0x04ec5d99) /* 0.307706451 */, 17 }, - /* 2847 */ { MAD_F(0x04ecf4c5) /* 0.307850618 */, 17 }, - - /* 2848 */ { MAD_F(0x04ed8bf5) /* 0.307994802 */, 17 }, - /* 2849 */ { MAD_F(0x04ee2329) /* 0.308139003 */, 17 }, - /* 2850 */ { MAD_F(0x04eeba63) /* 0.308283220 */, 17 }, - /* 2851 */ { MAD_F(0x04ef51a0) /* 0.308427455 */, 17 }, - /* 2852 */ { MAD_F(0x04efe8e2) /* 0.308571706 */, 17 }, - /* 2853 */ { MAD_F(0x04f08029) /* 0.308715974 */, 17 }, - /* 2854 */ { MAD_F(0x04f11774) /* 0.308860260 */, 17 }, - /* 2855 */ { MAD_F(0x04f1aec4) /* 0.309004561 */, 17 }, - /* 2856 */ { MAD_F(0x04f24618) /* 0.309148880 */, 17 }, - /* 2857 */ { MAD_F(0x04f2dd71) /* 0.309293216 */, 17 }, - /* 2858 */ { MAD_F(0x04f374cf) /* 0.309437568 */, 17 }, - /* 2859 */ { MAD_F(0x04f40c30) /* 0.309581938 */, 17 }, - /* 2860 */ { MAD_F(0x04f4a397) /* 0.309726324 */, 17 }, - /* 2861 */ { MAD_F(0x04f53b02) /* 0.309870727 */, 17 }, - /* 2862 */ { MAD_F(0x04f5d271) /* 0.310015147 */, 17 }, - /* 2863 */ { MAD_F(0x04f669e5) /* 0.310159583 */, 17 }, - - /* 2864 */ { MAD_F(0x04f7015d) /* 0.310304037 */, 17 }, - /* 2865 */ { MAD_F(0x04f798da) /* 0.310448507 */, 17 }, - /* 2866 */ { MAD_F(0x04f8305c) /* 0.310592994 */, 17 }, - /* 2867 */ { MAD_F(0x04f8c7e2) /* 0.310737498 */, 17 }, - /* 2868 */ { MAD_F(0x04f95f6c) /* 0.310882018 */, 17 }, - /* 2869 */ { MAD_F(0x04f9f6fb) /* 0.311026556 */, 17 }, - /* 2870 */ { MAD_F(0x04fa8e8f) /* 0.311171110 */, 17 }, - /* 2871 */ { MAD_F(0x04fb2627) /* 0.311315681 */, 17 }, - /* 2872 */ { MAD_F(0x04fbbdc3) /* 0.311460269 */, 17 }, - /* 2873 */ { MAD_F(0x04fc5564) /* 0.311604874 */, 17 }, - /* 2874 */ { MAD_F(0x04fced0a) /* 0.311749495 */, 17 }, - /* 2875 */ { MAD_F(0x04fd84b4) /* 0.311894133 */, 17 }, - /* 2876 */ { MAD_F(0x04fe1c62) /* 0.312038788 */, 17 }, - /* 2877 */ { MAD_F(0x04feb415) /* 0.312183460 */, 17 }, - /* 2878 */ { MAD_F(0x04ff4bcd) /* 0.312328148 */, 17 }, - /* 2879 */ { MAD_F(0x04ffe389) /* 0.312472854 */, 17 }, - - /* 2880 */ { MAD_F(0x05007b49) /* 0.312617576 */, 17 }, - /* 2881 */ { MAD_F(0x0501130e) /* 0.312762314 */, 17 }, - /* 2882 */ { MAD_F(0x0501aad8) /* 0.312907070 */, 17 }, - /* 2883 */ { MAD_F(0x050242a6) /* 0.313051842 */, 17 }, - /* 2884 */ { MAD_F(0x0502da78) /* 0.313196631 */, 17 }, - /* 2885 */ { MAD_F(0x0503724f) /* 0.313341437 */, 17 }, - /* 2886 */ { MAD_F(0x05040a2b) /* 0.313486259 */, 17 }, - /* 2887 */ { MAD_F(0x0504a20b) /* 0.313631098 */, 17 }, - /* 2888 */ { MAD_F(0x050539ef) /* 0.313775954 */, 17 }, - /* 2889 */ { MAD_F(0x0505d1d8) /* 0.313920827 */, 17 }, - /* 2890 */ { MAD_F(0x050669c5) /* 0.314065716 */, 17 }, - /* 2891 */ { MAD_F(0x050701b7) /* 0.314210622 */, 17 }, - /* 2892 */ { MAD_F(0x050799ae) /* 0.314355545 */, 17 }, - /* 2893 */ { MAD_F(0x050831a9) /* 0.314500484 */, 17 }, - /* 2894 */ { MAD_F(0x0508c9a8) /* 0.314645440 */, 17 }, - /* 2895 */ { MAD_F(0x050961ac) /* 0.314790413 */, 17 }, - - /* 2896 */ { MAD_F(0x0509f9b4) /* 0.314935403 */, 17 }, - /* 2897 */ { MAD_F(0x050a91c1) /* 0.315080409 */, 17 }, - /* 2898 */ { MAD_F(0x050b29d2) /* 0.315225432 */, 17 }, - /* 2899 */ { MAD_F(0x050bc1e8) /* 0.315370472 */, 17 }, - /* 2900 */ { MAD_F(0x050c5a02) /* 0.315515528 */, 17 }, - /* 2901 */ { MAD_F(0x050cf221) /* 0.315660601 */, 17 }, - /* 2902 */ { MAD_F(0x050d8a44) /* 0.315805690 */, 17 }, - /* 2903 */ { MAD_F(0x050e226c) /* 0.315950797 */, 17 }, - /* 2904 */ { MAD_F(0x050eba98) /* 0.316095920 */, 17 }, - /* 2905 */ { MAD_F(0x050f52c9) /* 0.316241059 */, 17 }, - /* 2906 */ { MAD_F(0x050feafe) /* 0.316386216 */, 17 }, - /* 2907 */ { MAD_F(0x05108337) /* 0.316531388 */, 17 }, - /* 2908 */ { MAD_F(0x05111b75) /* 0.316676578 */, 17 }, - /* 2909 */ { MAD_F(0x0511b3b8) /* 0.316821784 */, 17 }, - /* 2910 */ { MAD_F(0x05124bff) /* 0.316967007 */, 17 }, - /* 2911 */ { MAD_F(0x0512e44a) /* 0.317112247 */, 17 }, - - /* 2912 */ { MAD_F(0x05137c9a) /* 0.317257503 */, 17 }, - /* 2913 */ { MAD_F(0x051414ee) /* 0.317402775 */, 17 }, - /* 2914 */ { MAD_F(0x0514ad47) /* 0.317548065 */, 17 }, - /* 2915 */ { MAD_F(0x051545a5) /* 0.317693371 */, 17 }, - /* 2916 */ { MAD_F(0x0515de06) /* 0.317838693 */, 17 }, - /* 2917 */ { MAD_F(0x0516766d) /* 0.317984033 */, 17 }, - /* 2918 */ { MAD_F(0x05170ed7) /* 0.318129388 */, 17 }, - /* 2919 */ { MAD_F(0x0517a746) /* 0.318274761 */, 17 }, - /* 2920 */ { MAD_F(0x05183fba) /* 0.318420150 */, 17 }, - /* 2921 */ { MAD_F(0x0518d832) /* 0.318565555 */, 17 }, - /* 2922 */ { MAD_F(0x051970ae) /* 0.318710978 */, 17 }, - /* 2923 */ { MAD_F(0x051a092f) /* 0.318856416 */, 17 }, - /* 2924 */ { MAD_F(0x051aa1b5) /* 0.319001872 */, 17 }, - /* 2925 */ { MAD_F(0x051b3a3f) /* 0.319147344 */, 17 }, - /* 2926 */ { MAD_F(0x051bd2cd) /* 0.319292832 */, 17 }, - /* 2927 */ { MAD_F(0x051c6b60) /* 0.319438338 */, 17 }, - - /* 2928 */ { MAD_F(0x051d03f7) /* 0.319583859 */, 17 }, - /* 2929 */ { MAD_F(0x051d9c92) /* 0.319729398 */, 17 }, - /* 2930 */ { MAD_F(0x051e3532) /* 0.319874952 */, 17 }, - /* 2931 */ { MAD_F(0x051ecdd7) /* 0.320020524 */, 17 }, - /* 2932 */ { MAD_F(0x051f6680) /* 0.320166112 */, 17 }, - /* 2933 */ { MAD_F(0x051fff2d) /* 0.320311716 */, 17 }, - /* 2934 */ { MAD_F(0x052097df) /* 0.320457337 */, 17 }, - /* 2935 */ { MAD_F(0x05213095) /* 0.320602975 */, 17 }, - /* 2936 */ { MAD_F(0x0521c950) /* 0.320748629 */, 17 }, - /* 2937 */ { MAD_F(0x0522620f) /* 0.320894300 */, 17 }, - /* 2938 */ { MAD_F(0x0522fad3) /* 0.321039987 */, 17 }, - /* 2939 */ { MAD_F(0x0523939b) /* 0.321185691 */, 17 }, - /* 2940 */ { MAD_F(0x05242c68) /* 0.321331411 */, 17 }, - /* 2941 */ { MAD_F(0x0524c538) /* 0.321477148 */, 17 }, - /* 2942 */ { MAD_F(0x05255e0e) /* 0.321622901 */, 17 }, - /* 2943 */ { MAD_F(0x0525f6e8) /* 0.321768671 */, 17 }, - - /* 2944 */ { MAD_F(0x05268fc6) /* 0.321914457 */, 17 }, - /* 2945 */ { MAD_F(0x052728a9) /* 0.322060260 */, 17 }, - /* 2946 */ { MAD_F(0x0527c190) /* 0.322206079 */, 17 }, - /* 2947 */ { MAD_F(0x05285a7b) /* 0.322351915 */, 17 }, - /* 2948 */ { MAD_F(0x0528f36b) /* 0.322497768 */, 17 }, - /* 2949 */ { MAD_F(0x05298c5f) /* 0.322643636 */, 17 }, - /* 2950 */ { MAD_F(0x052a2558) /* 0.322789522 */, 17 }, - /* 2951 */ { MAD_F(0x052abe55) /* 0.322935424 */, 17 }, - /* 2952 */ { MAD_F(0x052b5757) /* 0.323081342 */, 17 }, - /* 2953 */ { MAD_F(0x052bf05d) /* 0.323227277 */, 17 }, - /* 2954 */ { MAD_F(0x052c8968) /* 0.323373228 */, 17 }, - /* 2955 */ { MAD_F(0x052d2277) /* 0.323519196 */, 17 }, - /* 2956 */ { MAD_F(0x052dbb8a) /* 0.323665180 */, 17 }, - /* 2957 */ { MAD_F(0x052e54a2) /* 0.323811180 */, 17 }, - /* 2958 */ { MAD_F(0x052eedbe) /* 0.323957197 */, 17 }, - /* 2959 */ { MAD_F(0x052f86de) /* 0.324103231 */, 17 }, - - /* 2960 */ { MAD_F(0x05302003) /* 0.324249281 */, 17 }, - /* 2961 */ { MAD_F(0x0530b92d) /* 0.324395347 */, 17 }, - /* 2962 */ { MAD_F(0x0531525b) /* 0.324541430 */, 17 }, - /* 2963 */ { MAD_F(0x0531eb8d) /* 0.324687530 */, 17 }, - /* 2964 */ { MAD_F(0x053284c4) /* 0.324833646 */, 17 }, - /* 2965 */ { MAD_F(0x05331dff) /* 0.324979778 */, 17 }, - /* 2966 */ { MAD_F(0x0533b73e) /* 0.325125926 */, 17 }, - /* 2967 */ { MAD_F(0x05345082) /* 0.325272091 */, 17 }, - /* 2968 */ { MAD_F(0x0534e9ca) /* 0.325418273 */, 17 }, - /* 2969 */ { MAD_F(0x05358317) /* 0.325564471 */, 17 }, - /* 2970 */ { MAD_F(0x05361c68) /* 0.325710685 */, 17 }, - /* 2971 */ { MAD_F(0x0536b5be) /* 0.325856916 */, 17 }, - /* 2972 */ { MAD_F(0x05374f17) /* 0.326003163 */, 17 }, - /* 2973 */ { MAD_F(0x0537e876) /* 0.326149427 */, 17 }, - /* 2974 */ { MAD_F(0x053881d9) /* 0.326295707 */, 17 }, - /* 2975 */ { MAD_F(0x05391b40) /* 0.326442003 */, 17 }, - - /* 2976 */ { MAD_F(0x0539b4ab) /* 0.326588316 */, 17 }, - /* 2977 */ { MAD_F(0x053a4e1b) /* 0.326734645 */, 17 }, - /* 2978 */ { MAD_F(0x053ae78f) /* 0.326880990 */, 17 }, - /* 2979 */ { MAD_F(0x053b8108) /* 0.327027352 */, 17 }, - /* 2980 */ { MAD_F(0x053c1a85) /* 0.327173730 */, 17 }, - /* 2981 */ { MAD_F(0x053cb407) /* 0.327320125 */, 17 }, - /* 2982 */ { MAD_F(0x053d4d8d) /* 0.327466536 */, 17 }, - /* 2983 */ { MAD_F(0x053de717) /* 0.327612963 */, 17 }, - /* 2984 */ { MAD_F(0x053e80a6) /* 0.327759407 */, 17 }, - /* 2985 */ { MAD_F(0x053f1a39) /* 0.327905867 */, 17 }, - /* 2986 */ { MAD_F(0x053fb3d0) /* 0.328052344 */, 17 }, - /* 2987 */ { MAD_F(0x05404d6c) /* 0.328198837 */, 17 }, - /* 2988 */ { MAD_F(0x0540e70c) /* 0.328345346 */, 17 }, - /* 2989 */ { MAD_F(0x054180b1) /* 0.328491871 */, 17 }, - /* 2990 */ { MAD_F(0x05421a5a) /* 0.328638413 */, 17 }, - /* 2991 */ { MAD_F(0x0542b407) /* 0.328784971 */, 17 }, - - /* 2992 */ { MAD_F(0x05434db9) /* 0.328931546 */, 17 }, - /* 2993 */ { MAD_F(0x0543e76f) /* 0.329078137 */, 17 }, - /* 2994 */ { MAD_F(0x0544812a) /* 0.329224744 */, 17 }, - /* 2995 */ { MAD_F(0x05451ae9) /* 0.329371367 */, 17 }, - /* 2996 */ { MAD_F(0x0545b4ac) /* 0.329518007 */, 17 }, - /* 2997 */ { MAD_F(0x05464e74) /* 0.329664663 */, 17 }, - /* 2998 */ { MAD_F(0x0546e840) /* 0.329811336 */, 17 }, - /* 2999 */ { MAD_F(0x05478211) /* 0.329958024 */, 17 }, - /* 3000 */ { MAD_F(0x05481be5) /* 0.330104730 */, 17 }, - /* 3001 */ { MAD_F(0x0548b5bf) /* 0.330251451 */, 17 }, - /* 3002 */ { MAD_F(0x05494f9c) /* 0.330398189 */, 17 }, - /* 3003 */ { MAD_F(0x0549e97e) /* 0.330544943 */, 17 }, - /* 3004 */ { MAD_F(0x054a8364) /* 0.330691713 */, 17 }, - /* 3005 */ { MAD_F(0x054b1d4f) /* 0.330838499 */, 17 }, - /* 3006 */ { MAD_F(0x054bb73e) /* 0.330985302 */, 17 }, - /* 3007 */ { MAD_F(0x054c5132) /* 0.331132121 */, 17 }, - - /* 3008 */ { MAD_F(0x054ceb2a) /* 0.331278957 */, 17 }, - /* 3009 */ { MAD_F(0x054d8526) /* 0.331425808 */, 17 }, - /* 3010 */ { MAD_F(0x054e1f26) /* 0.331572676 */, 17 }, - /* 3011 */ { MAD_F(0x054eb92b) /* 0.331719560 */, 17 }, - /* 3012 */ { MAD_F(0x054f5334) /* 0.331866461 */, 17 }, - /* 3013 */ { MAD_F(0x054fed42) /* 0.332013377 */, 17 }, - /* 3014 */ { MAD_F(0x05508754) /* 0.332160310 */, 17 }, - /* 3015 */ { MAD_F(0x0551216b) /* 0.332307260 */, 17 }, - /* 3016 */ { MAD_F(0x0551bb85) /* 0.332454225 */, 17 }, - /* 3017 */ { MAD_F(0x055255a4) /* 0.332601207 */, 17 }, - /* 3018 */ { MAD_F(0x0552efc8) /* 0.332748205 */, 17 }, - /* 3019 */ { MAD_F(0x055389f0) /* 0.332895219 */, 17 }, - /* 3020 */ { MAD_F(0x0554241c) /* 0.333042249 */, 17 }, - /* 3021 */ { MAD_F(0x0554be4c) /* 0.333189296 */, 17 }, - /* 3022 */ { MAD_F(0x05555881) /* 0.333336359 */, 17 }, - /* 3023 */ { MAD_F(0x0555f2ba) /* 0.333483438 */, 17 }, - - /* 3024 */ { MAD_F(0x05568cf8) /* 0.333630533 */, 17 }, - /* 3025 */ { MAD_F(0x0557273a) /* 0.333777645 */, 17 }, - /* 3026 */ { MAD_F(0x0557c180) /* 0.333924772 */, 17 }, - /* 3027 */ { MAD_F(0x05585bcb) /* 0.334071916 */, 17 }, - /* 3028 */ { MAD_F(0x0558f61a) /* 0.334219076 */, 17 }, - /* 3029 */ { MAD_F(0x0559906d) /* 0.334366253 */, 17 }, - /* 3030 */ { MAD_F(0x055a2ac5) /* 0.334513445 */, 17 }, - /* 3031 */ { MAD_F(0x055ac521) /* 0.334660654 */, 17 }, - /* 3032 */ { MAD_F(0x055b5f81) /* 0.334807879 */, 17 }, - /* 3033 */ { MAD_F(0x055bf9e6) /* 0.334955120 */, 17 }, - /* 3034 */ { MAD_F(0x055c944f) /* 0.335102377 */, 17 }, - /* 3035 */ { MAD_F(0x055d2ebd) /* 0.335249651 */, 17 }, - /* 3036 */ { MAD_F(0x055dc92e) /* 0.335396941 */, 17 }, - /* 3037 */ { MAD_F(0x055e63a5) /* 0.335544246 */, 17 }, - /* 3038 */ { MAD_F(0x055efe1f) /* 0.335691568 */, 17 }, - /* 3039 */ { MAD_F(0x055f989e) /* 0.335838906 */, 17 }, - - /* 3040 */ { MAD_F(0x05603321) /* 0.335986261 */, 17 }, - /* 3041 */ { MAD_F(0x0560cda8) /* 0.336133631 */, 17 }, - /* 3042 */ { MAD_F(0x05616834) /* 0.336281018 */, 17 }, - /* 3043 */ { MAD_F(0x056202c4) /* 0.336428421 */, 17 }, - /* 3044 */ { MAD_F(0x05629d59) /* 0.336575840 */, 17 }, - /* 3045 */ { MAD_F(0x056337f2) /* 0.336723275 */, 17 }, - /* 3046 */ { MAD_F(0x0563d28f) /* 0.336870726 */, 17 }, - /* 3047 */ { MAD_F(0x05646d30) /* 0.337018193 */, 17 }, - /* 3048 */ { MAD_F(0x056507d6) /* 0.337165677 */, 17 }, - /* 3049 */ { MAD_F(0x0565a280) /* 0.337313176 */, 17 }, - /* 3050 */ { MAD_F(0x05663d2f) /* 0.337460692 */, 17 }, - /* 3051 */ { MAD_F(0x0566d7e1) /* 0.337608224 */, 17 }, - /* 3052 */ { MAD_F(0x05677298) /* 0.337755772 */, 17 }, - /* 3053 */ { MAD_F(0x05680d54) /* 0.337903336 */, 17 }, - /* 3054 */ { MAD_F(0x0568a814) /* 0.338050916 */, 17 }, - /* 3055 */ { MAD_F(0x056942d8) /* 0.338198513 */, 17 }, - - /* 3056 */ { MAD_F(0x0569dda0) /* 0.338346125 */, 17 }, - /* 3057 */ { MAD_F(0x056a786d) /* 0.338493753 */, 17 }, - /* 3058 */ { MAD_F(0x056b133e) /* 0.338641398 */, 17 }, - /* 3059 */ { MAD_F(0x056bae13) /* 0.338789059 */, 17 }, - /* 3060 */ { MAD_F(0x056c48ed) /* 0.338936736 */, 17 }, - /* 3061 */ { MAD_F(0x056ce3cb) /* 0.339084429 */, 17 }, - /* 3062 */ { MAD_F(0x056d7ead) /* 0.339232138 */, 17 }, - /* 3063 */ { MAD_F(0x056e1994) /* 0.339379863 */, 17 }, - /* 3064 */ { MAD_F(0x056eb47f) /* 0.339527604 */, 17 }, - /* 3065 */ { MAD_F(0x056f4f6e) /* 0.339675361 */, 17 }, - /* 3066 */ { MAD_F(0x056fea62) /* 0.339823134 */, 17 }, - /* 3067 */ { MAD_F(0x0570855a) /* 0.339970924 */, 17 }, - /* 3068 */ { MAD_F(0x05712056) /* 0.340118729 */, 17 }, - /* 3069 */ { MAD_F(0x0571bb56) /* 0.340266550 */, 17 }, - /* 3070 */ { MAD_F(0x0572565b) /* 0.340414388 */, 17 }, - /* 3071 */ { MAD_F(0x0572f164) /* 0.340562242 */, 17 }, - - /* 3072 */ { MAD_F(0x05738c72) /* 0.340710111 */, 17 }, - /* 3073 */ { MAD_F(0x05742784) /* 0.340857997 */, 17 }, - /* 3074 */ { MAD_F(0x0574c29a) /* 0.341005899 */, 17 }, - /* 3075 */ { MAD_F(0x05755db4) /* 0.341153816 */, 17 }, - /* 3076 */ { MAD_F(0x0575f8d3) /* 0.341301750 */, 17 }, - /* 3077 */ { MAD_F(0x057693f6) /* 0.341449700 */, 17 }, - /* 3078 */ { MAD_F(0x05772f1d) /* 0.341597666 */, 17 }, - /* 3079 */ { MAD_F(0x0577ca49) /* 0.341745648 */, 17 }, - /* 3080 */ { MAD_F(0x05786578) /* 0.341893646 */, 17 }, - /* 3081 */ { MAD_F(0x057900ad) /* 0.342041659 */, 17 }, - /* 3082 */ { MAD_F(0x05799be5) /* 0.342189689 */, 17 }, - /* 3083 */ { MAD_F(0x057a3722) /* 0.342337735 */, 17 }, - /* 3084 */ { MAD_F(0x057ad263) /* 0.342485797 */, 17 }, - /* 3085 */ { MAD_F(0x057b6da8) /* 0.342633875 */, 17 }, - /* 3086 */ { MAD_F(0x057c08f2) /* 0.342781969 */, 17 }, - /* 3087 */ { MAD_F(0x057ca440) /* 0.342930079 */, 17 }, - - /* 3088 */ { MAD_F(0x057d3f92) /* 0.343078205 */, 17 }, - /* 3089 */ { MAD_F(0x057ddae9) /* 0.343226347 */, 17 }, - /* 3090 */ { MAD_F(0x057e7644) /* 0.343374505 */, 17 }, - /* 3091 */ { MAD_F(0x057f11a3) /* 0.343522679 */, 17 }, - /* 3092 */ { MAD_F(0x057fad06) /* 0.343670869 */, 17 }, - /* 3093 */ { MAD_F(0x0580486e) /* 0.343819075 */, 17 }, - /* 3094 */ { MAD_F(0x0580e3da) /* 0.343967296 */, 17 }, - /* 3095 */ { MAD_F(0x05817f4a) /* 0.344115534 */, 17 }, - /* 3096 */ { MAD_F(0x05821abf) /* 0.344263788 */, 17 }, - /* 3097 */ { MAD_F(0x0582b638) /* 0.344412058 */, 17 }, - /* 3098 */ { MAD_F(0x058351b5) /* 0.344560343 */, 17 }, - /* 3099 */ { MAD_F(0x0583ed36) /* 0.344708645 */, 17 }, - /* 3100 */ { MAD_F(0x058488bc) /* 0.344856963 */, 17 }, - /* 3101 */ { MAD_F(0x05852446) /* 0.345005296 */, 17 }, - /* 3102 */ { MAD_F(0x0585bfd4) /* 0.345153646 */, 17 }, - /* 3103 */ { MAD_F(0x05865b67) /* 0.345302011 */, 17 }, - - /* 3104 */ { MAD_F(0x0586f6fd) /* 0.345450393 */, 17 }, - /* 3105 */ { MAD_F(0x05879298) /* 0.345598790 */, 17 }, - /* 3106 */ { MAD_F(0x05882e38) /* 0.345747203 */, 17 }, - /* 3107 */ { MAD_F(0x0588c9dc) /* 0.345895632 */, 17 }, - /* 3108 */ { MAD_F(0x05896583) /* 0.346044077 */, 17 }, - /* 3109 */ { MAD_F(0x058a0130) /* 0.346192538 */, 17 }, - /* 3110 */ { MAD_F(0x058a9ce0) /* 0.346341015 */, 17 }, - /* 3111 */ { MAD_F(0x058b3895) /* 0.346489508 */, 17 }, - /* 3112 */ { MAD_F(0x058bd44e) /* 0.346638017 */, 17 }, - /* 3113 */ { MAD_F(0x058c700b) /* 0.346786542 */, 17 }, - /* 3114 */ { MAD_F(0x058d0bcd) /* 0.346935082 */, 17 }, - /* 3115 */ { MAD_F(0x058da793) /* 0.347083639 */, 17 }, - /* 3116 */ { MAD_F(0x058e435d) /* 0.347232211 */, 17 }, - /* 3117 */ { MAD_F(0x058edf2b) /* 0.347380799 */, 17 }, - /* 3118 */ { MAD_F(0x058f7afe) /* 0.347529403 */, 17 }, - /* 3119 */ { MAD_F(0x059016d5) /* 0.347678023 */, 17 }, - - /* 3120 */ { MAD_F(0x0590b2b0) /* 0.347826659 */, 17 }, - /* 3121 */ { MAD_F(0x05914e8f) /* 0.347975311 */, 17 }, - /* 3122 */ { MAD_F(0x0591ea73) /* 0.348123979 */, 17 }, - /* 3123 */ { MAD_F(0x0592865b) /* 0.348272662 */, 17 }, - /* 3124 */ { MAD_F(0x05932247) /* 0.348421362 */, 17 }, - /* 3125 */ { MAD_F(0x0593be37) /* 0.348570077 */, 17 }, - /* 3126 */ { MAD_F(0x05945a2c) /* 0.348718808 */, 17 }, - /* 3127 */ { MAD_F(0x0594f625) /* 0.348867555 */, 17 }, - /* 3128 */ { MAD_F(0x05959222) /* 0.349016318 */, 17 }, - /* 3129 */ { MAD_F(0x05962e24) /* 0.349165097 */, 17 }, - /* 3130 */ { MAD_F(0x0596ca2a) /* 0.349313892 */, 17 }, - /* 3131 */ { MAD_F(0x05976634) /* 0.349462702 */, 17 }, - /* 3132 */ { MAD_F(0x05980242) /* 0.349611528 */, 17 }, - /* 3133 */ { MAD_F(0x05989e54) /* 0.349760370 */, 17 }, - /* 3134 */ { MAD_F(0x05993a6b) /* 0.349909228 */, 17 }, - /* 3135 */ { MAD_F(0x0599d686) /* 0.350058102 */, 17 }, - - /* 3136 */ { MAD_F(0x059a72a5) /* 0.350206992 */, 17 }, - /* 3137 */ { MAD_F(0x059b0ec9) /* 0.350355897 */, 17 }, - /* 3138 */ { MAD_F(0x059baaf1) /* 0.350504818 */, 17 }, - /* 3139 */ { MAD_F(0x059c471d) /* 0.350653756 */, 17 }, - /* 3140 */ { MAD_F(0x059ce34d) /* 0.350802708 */, 17 }, - /* 3141 */ { MAD_F(0x059d7f81) /* 0.350951677 */, 17 }, - /* 3142 */ { MAD_F(0x059e1bba) /* 0.351100662 */, 17 }, - /* 3143 */ { MAD_F(0x059eb7f7) /* 0.351249662 */, 17 }, - /* 3144 */ { MAD_F(0x059f5438) /* 0.351398678 */, 17 }, - /* 3145 */ { MAD_F(0x059ff07e) /* 0.351547710 */, 17 }, - /* 3146 */ { MAD_F(0x05a08cc7) /* 0.351696758 */, 17 }, - /* 3147 */ { MAD_F(0x05a12915) /* 0.351845821 */, 17 }, - /* 3148 */ { MAD_F(0x05a1c567) /* 0.351994901 */, 17 }, - /* 3149 */ { MAD_F(0x05a261be) /* 0.352143996 */, 17 }, - /* 3150 */ { MAD_F(0x05a2fe18) /* 0.352293107 */, 17 }, - /* 3151 */ { MAD_F(0x05a39a77) /* 0.352442233 */, 17 }, - - /* 3152 */ { MAD_F(0x05a436da) /* 0.352591376 */, 17 }, - /* 3153 */ { MAD_F(0x05a4d342) /* 0.352740534 */, 17 }, - /* 3154 */ { MAD_F(0x05a56fad) /* 0.352889708 */, 17 }, - /* 3155 */ { MAD_F(0x05a60c1d) /* 0.353038898 */, 17 }, - /* 3156 */ { MAD_F(0x05a6a891) /* 0.353188103 */, 17 }, - /* 3157 */ { MAD_F(0x05a7450a) /* 0.353337325 */, 17 }, - /* 3158 */ { MAD_F(0x05a7e186) /* 0.353486562 */, 17 }, - /* 3159 */ { MAD_F(0x05a87e07) /* 0.353635814 */, 17 }, - /* 3160 */ { MAD_F(0x05a91a8c) /* 0.353785083 */, 17 }, - /* 3161 */ { MAD_F(0x05a9b715) /* 0.353934367 */, 17 }, - /* 3162 */ { MAD_F(0x05aa53a2) /* 0.354083667 */, 17 }, - /* 3163 */ { MAD_F(0x05aaf034) /* 0.354232983 */, 17 }, - /* 3164 */ { MAD_F(0x05ab8cca) /* 0.354382314 */, 17 }, - /* 3165 */ { MAD_F(0x05ac2964) /* 0.354531662 */, 17 }, - /* 3166 */ { MAD_F(0x05acc602) /* 0.354681025 */, 17 }, - /* 3167 */ { MAD_F(0x05ad62a5) /* 0.354830403 */, 17 }, - - /* 3168 */ { MAD_F(0x05adff4c) /* 0.354979798 */, 17 }, - /* 3169 */ { MAD_F(0x05ae9bf7) /* 0.355129208 */, 17 }, - /* 3170 */ { MAD_F(0x05af38a6) /* 0.355278634 */, 17 }, - /* 3171 */ { MAD_F(0x05afd559) /* 0.355428075 */, 17 }, - /* 3172 */ { MAD_F(0x05b07211) /* 0.355577533 */, 17 }, - /* 3173 */ { MAD_F(0x05b10ecd) /* 0.355727006 */, 17 }, - /* 3174 */ { MAD_F(0x05b1ab8d) /* 0.355876494 */, 17 }, - /* 3175 */ { MAD_F(0x05b24851) /* 0.356025999 */, 17 }, - /* 3176 */ { MAD_F(0x05b2e51a) /* 0.356175519 */, 17 }, - /* 3177 */ { MAD_F(0x05b381e6) /* 0.356325054 */, 17 }, - /* 3178 */ { MAD_F(0x05b41eb7) /* 0.356474606 */, 17 }, - /* 3179 */ { MAD_F(0x05b4bb8c) /* 0.356624173 */, 17 }, - /* 3180 */ { MAD_F(0x05b55866) /* 0.356773756 */, 17 }, - /* 3181 */ { MAD_F(0x05b5f543) /* 0.356923354 */, 17 }, - /* 3182 */ { MAD_F(0x05b69225) /* 0.357072969 */, 17 }, - /* 3183 */ { MAD_F(0x05b72f0b) /* 0.357222598 */, 17 }, - - /* 3184 */ { MAD_F(0x05b7cbf5) /* 0.357372244 */, 17 }, - /* 3185 */ { MAD_F(0x05b868e3) /* 0.357521905 */, 17 }, - /* 3186 */ { MAD_F(0x05b905d6) /* 0.357671582 */, 17 }, - /* 3187 */ { MAD_F(0x05b9a2cd) /* 0.357821275 */, 17 }, - /* 3188 */ { MAD_F(0x05ba3fc8) /* 0.357970983 */, 17 }, - /* 3189 */ { MAD_F(0x05badcc7) /* 0.358120707 */, 17 }, - /* 3190 */ { MAD_F(0x05bb79ca) /* 0.358270446 */, 17 }, - /* 3191 */ { MAD_F(0x05bc16d2) /* 0.358420201 */, 17 }, - /* 3192 */ { MAD_F(0x05bcb3de) /* 0.358569972 */, 17 }, - /* 3193 */ { MAD_F(0x05bd50ee) /* 0.358719758 */, 17 }, - /* 3194 */ { MAD_F(0x05bdee02) /* 0.358869560 */, 17 }, - /* 3195 */ { MAD_F(0x05be8b1a) /* 0.359019378 */, 17 }, - /* 3196 */ { MAD_F(0x05bf2837) /* 0.359169211 */, 17 }, - /* 3197 */ { MAD_F(0x05bfc558) /* 0.359319060 */, 17 }, - /* 3198 */ { MAD_F(0x05c0627d) /* 0.359468925 */, 17 }, - /* 3199 */ { MAD_F(0x05c0ffa6) /* 0.359618805 */, 17 }, - - /* 3200 */ { MAD_F(0x05c19cd3) /* 0.359768701 */, 17 }, - /* 3201 */ { MAD_F(0x05c23a05) /* 0.359918612 */, 17 }, - /* 3202 */ { MAD_F(0x05c2d73a) /* 0.360068540 */, 17 }, - /* 3203 */ { MAD_F(0x05c37474) /* 0.360218482 */, 17 }, - /* 3204 */ { MAD_F(0x05c411b2) /* 0.360368440 */, 17 }, - /* 3205 */ { MAD_F(0x05c4aef5) /* 0.360518414 */, 17 }, - /* 3206 */ { MAD_F(0x05c54c3b) /* 0.360668404 */, 17 }, - /* 3207 */ { MAD_F(0x05c5e986) /* 0.360818409 */, 17 }, - /* 3208 */ { MAD_F(0x05c686d5) /* 0.360968429 */, 17 }, - /* 3209 */ { MAD_F(0x05c72428) /* 0.361118466 */, 17 }, - /* 3210 */ { MAD_F(0x05c7c17f) /* 0.361268517 */, 17 }, - /* 3211 */ { MAD_F(0x05c85eda) /* 0.361418585 */, 17 }, - /* 3212 */ { MAD_F(0x05c8fc3a) /* 0.361568668 */, 17 }, - /* 3213 */ { MAD_F(0x05c9999e) /* 0.361718766 */, 17 }, - /* 3214 */ { MAD_F(0x05ca3706) /* 0.361868881 */, 17 }, - /* 3215 */ { MAD_F(0x05cad472) /* 0.362019010 */, 17 }, - - /* 3216 */ { MAD_F(0x05cb71e2) /* 0.362169156 */, 17 }, - /* 3217 */ { MAD_F(0x05cc0f57) /* 0.362319316 */, 17 }, - /* 3218 */ { MAD_F(0x05ccaccf) /* 0.362469493 */, 17 }, - /* 3219 */ { MAD_F(0x05cd4a4c) /* 0.362619685 */, 17 }, - /* 3220 */ { MAD_F(0x05cde7cd) /* 0.362769892 */, 17 }, - /* 3221 */ { MAD_F(0x05ce8552) /* 0.362920115 */, 17 }, - /* 3222 */ { MAD_F(0x05cf22dc) /* 0.363070354 */, 17 }, - /* 3223 */ { MAD_F(0x05cfc069) /* 0.363220608 */, 17 }, - /* 3224 */ { MAD_F(0x05d05dfb) /* 0.363370878 */, 17 }, - /* 3225 */ { MAD_F(0x05d0fb91) /* 0.363521163 */, 17 }, - /* 3226 */ { MAD_F(0x05d1992b) /* 0.363671464 */, 17 }, - /* 3227 */ { MAD_F(0x05d236c9) /* 0.363821780 */, 17 }, - /* 3228 */ { MAD_F(0x05d2d46c) /* 0.363972112 */, 17 }, - /* 3229 */ { MAD_F(0x05d37212) /* 0.364122459 */, 17 }, - /* 3230 */ { MAD_F(0x05d40fbd) /* 0.364272822 */, 17 }, - /* 3231 */ { MAD_F(0x05d4ad6c) /* 0.364423200 */, 17 }, - - /* 3232 */ { MAD_F(0x05d54b1f) /* 0.364573594 */, 17 }, - /* 3233 */ { MAD_F(0x05d5e8d6) /* 0.364724004 */, 17 }, - /* 3234 */ { MAD_F(0x05d68691) /* 0.364874429 */, 17 }, - /* 3235 */ { MAD_F(0x05d72451) /* 0.365024869 */, 17 }, - /* 3236 */ { MAD_F(0x05d7c215) /* 0.365175325 */, 17 }, - /* 3237 */ { MAD_F(0x05d85fdc) /* 0.365325796 */, 17 }, - /* 3238 */ { MAD_F(0x05d8fda8) /* 0.365476283 */, 17 }, - /* 3239 */ { MAD_F(0x05d99b79) /* 0.365626786 */, 17 }, - /* 3240 */ { MAD_F(0x05da394d) /* 0.365777304 */, 17 }, - /* 3241 */ { MAD_F(0x05dad726) /* 0.365927837 */, 17 }, - /* 3242 */ { MAD_F(0x05db7502) /* 0.366078386 */, 17 }, - /* 3243 */ { MAD_F(0x05dc12e3) /* 0.366228950 */, 17 }, - /* 3244 */ { MAD_F(0x05dcb0c8) /* 0.366379530 */, 17 }, - /* 3245 */ { MAD_F(0x05dd4eb1) /* 0.366530125 */, 17 }, - /* 3246 */ { MAD_F(0x05ddec9e) /* 0.366680736 */, 17 }, - /* 3247 */ { MAD_F(0x05de8a90) /* 0.366831362 */, 17 }, - - /* 3248 */ { MAD_F(0x05df2885) /* 0.366982004 */, 17 }, - /* 3249 */ { MAD_F(0x05dfc67f) /* 0.367132661 */, 17 }, - /* 3250 */ { MAD_F(0x05e0647d) /* 0.367283334 */, 17 }, - /* 3251 */ { MAD_F(0x05e1027f) /* 0.367434022 */, 17 }, - /* 3252 */ { MAD_F(0x05e1a085) /* 0.367584725 */, 17 }, - /* 3253 */ { MAD_F(0x05e23e8f) /* 0.367735444 */, 17 }, - /* 3254 */ { MAD_F(0x05e2dc9e) /* 0.367886179 */, 17 }, - /* 3255 */ { MAD_F(0x05e37ab0) /* 0.368036929 */, 17 }, - /* 3256 */ { MAD_F(0x05e418c7) /* 0.368187694 */, 17 }, - /* 3257 */ { MAD_F(0x05e4b6e2) /* 0.368338475 */, 17 }, - /* 3258 */ { MAD_F(0x05e55501) /* 0.368489271 */, 17 }, - /* 3259 */ { MAD_F(0x05e5f324) /* 0.368640082 */, 17 }, - /* 3260 */ { MAD_F(0x05e6914c) /* 0.368790909 */, 17 }, - /* 3261 */ { MAD_F(0x05e72f77) /* 0.368941752 */, 17 }, - /* 3262 */ { MAD_F(0x05e7cda7) /* 0.369092610 */, 17 }, - /* 3263 */ { MAD_F(0x05e86bda) /* 0.369243483 */, 17 }, - - /* 3264 */ { MAD_F(0x05e90a12) /* 0.369394372 */, 17 }, - /* 3265 */ { MAD_F(0x05e9a84e) /* 0.369545276 */, 17 }, - /* 3266 */ { MAD_F(0x05ea468e) /* 0.369696195 */, 17 }, - /* 3267 */ { MAD_F(0x05eae4d3) /* 0.369847130 */, 17 }, - /* 3268 */ { MAD_F(0x05eb831b) /* 0.369998080 */, 17 }, - /* 3269 */ { MAD_F(0x05ec2168) /* 0.370149046 */, 17 }, - /* 3270 */ { MAD_F(0x05ecbfb8) /* 0.370300027 */, 17 }, - /* 3271 */ { MAD_F(0x05ed5e0d) /* 0.370451024 */, 17 }, - /* 3272 */ { MAD_F(0x05edfc66) /* 0.370602036 */, 17 }, - /* 3273 */ { MAD_F(0x05ee9ac3) /* 0.370753063 */, 17 }, - /* 3274 */ { MAD_F(0x05ef3924) /* 0.370904105 */, 17 }, - /* 3275 */ { MAD_F(0x05efd78a) /* 0.371055163 */, 17 }, - /* 3276 */ { MAD_F(0x05f075f3) /* 0.371206237 */, 17 }, - /* 3277 */ { MAD_F(0x05f11461) /* 0.371357326 */, 17 }, - /* 3278 */ { MAD_F(0x05f1b2d3) /* 0.371508430 */, 17 }, - /* 3279 */ { MAD_F(0x05f25148) /* 0.371659549 */, 17 }, - - /* 3280 */ { MAD_F(0x05f2efc2) /* 0.371810684 */, 17 }, - /* 3281 */ { MAD_F(0x05f38e40) /* 0.371961834 */, 17 }, - /* 3282 */ { MAD_F(0x05f42cc3) /* 0.372113000 */, 17 }, - /* 3283 */ { MAD_F(0x05f4cb49) /* 0.372264181 */, 17 }, - /* 3284 */ { MAD_F(0x05f569d3) /* 0.372415377 */, 17 }, - /* 3285 */ { MAD_F(0x05f60862) /* 0.372566589 */, 17 }, - /* 3286 */ { MAD_F(0x05f6a6f5) /* 0.372717816 */, 17 }, - /* 3287 */ { MAD_F(0x05f7458b) /* 0.372869058 */, 17 }, - /* 3288 */ { MAD_F(0x05f7e426) /* 0.373020316 */, 17 }, - /* 3289 */ { MAD_F(0x05f882c5) /* 0.373171589 */, 17 }, - /* 3290 */ { MAD_F(0x05f92169) /* 0.373322877 */, 17 }, - /* 3291 */ { MAD_F(0x05f9c010) /* 0.373474181 */, 17 }, - /* 3292 */ { MAD_F(0x05fa5ebb) /* 0.373625500 */, 17 }, - /* 3293 */ { MAD_F(0x05fafd6b) /* 0.373776834 */, 17 }, - /* 3294 */ { MAD_F(0x05fb9c1e) /* 0.373928184 */, 17 }, - /* 3295 */ { MAD_F(0x05fc3ad6) /* 0.374079549 */, 17 }, - - /* 3296 */ { MAD_F(0x05fcd992) /* 0.374230929 */, 17 }, - /* 3297 */ { MAD_F(0x05fd7852) /* 0.374382325 */, 17 }, - /* 3298 */ { MAD_F(0x05fe1716) /* 0.374533735 */, 17 }, - /* 3299 */ { MAD_F(0x05feb5de) /* 0.374685162 */, 17 }, - /* 3300 */ { MAD_F(0x05ff54aa) /* 0.374836603 */, 17 }, - /* 3301 */ { MAD_F(0x05fff37b) /* 0.374988060 */, 17 }, - /* 3302 */ { MAD_F(0x0600924f) /* 0.375139532 */, 17 }, - /* 3303 */ { MAD_F(0x06013128) /* 0.375291019 */, 17 }, - /* 3304 */ { MAD_F(0x0601d004) /* 0.375442522 */, 17 }, - /* 3305 */ { MAD_F(0x06026ee5) /* 0.375594040 */, 17 }, - /* 3306 */ { MAD_F(0x06030dca) /* 0.375745573 */, 17 }, - /* 3307 */ { MAD_F(0x0603acb3) /* 0.375897122 */, 17 }, - /* 3308 */ { MAD_F(0x06044ba0) /* 0.376048685 */, 17 }, - /* 3309 */ { MAD_F(0x0604ea91) /* 0.376200265 */, 17 }, - /* 3310 */ { MAD_F(0x06058987) /* 0.376351859 */, 17 }, - /* 3311 */ { MAD_F(0x06062880) /* 0.376503468 */, 17 }, - - /* 3312 */ { MAD_F(0x0606c77d) /* 0.376655093 */, 17 }, - /* 3313 */ { MAD_F(0x0607667f) /* 0.376806733 */, 17 }, - /* 3314 */ { MAD_F(0x06080585) /* 0.376958389 */, 17 }, - /* 3315 */ { MAD_F(0x0608a48f) /* 0.377110059 */, 17 }, - /* 3316 */ { MAD_F(0x0609439c) /* 0.377261745 */, 17 }, - /* 3317 */ { MAD_F(0x0609e2ae) /* 0.377413446 */, 17 }, - /* 3318 */ { MAD_F(0x060a81c4) /* 0.377565163 */, 17 }, - /* 3319 */ { MAD_F(0x060b20df) /* 0.377716894 */, 17 }, - /* 3320 */ { MAD_F(0x060bbffd) /* 0.377868641 */, 17 }, - /* 3321 */ { MAD_F(0x060c5f1f) /* 0.378020403 */, 17 }, - /* 3322 */ { MAD_F(0x060cfe46) /* 0.378172181 */, 17 }, - /* 3323 */ { MAD_F(0x060d9d70) /* 0.378323973 */, 17 }, - /* 3324 */ { MAD_F(0x060e3c9f) /* 0.378475781 */, 17 }, - /* 3325 */ { MAD_F(0x060edbd1) /* 0.378627604 */, 17 }, - /* 3326 */ { MAD_F(0x060f7b08) /* 0.378779442 */, 17 }, - /* 3327 */ { MAD_F(0x06101a43) /* 0.378931296 */, 17 }, - - /* 3328 */ { MAD_F(0x0610b982) /* 0.379083164 */, 17 }, - /* 3329 */ { MAD_F(0x061158c5) /* 0.379235048 */, 17 }, - /* 3330 */ { MAD_F(0x0611f80c) /* 0.379386947 */, 17 }, - /* 3331 */ { MAD_F(0x06129757) /* 0.379538862 */, 17 }, - /* 3332 */ { MAD_F(0x061336a6) /* 0.379690791 */, 17 }, - /* 3333 */ { MAD_F(0x0613d5fa) /* 0.379842736 */, 17 }, - /* 3334 */ { MAD_F(0x06147551) /* 0.379994696 */, 17 }, - /* 3335 */ { MAD_F(0x061514ad) /* 0.380146671 */, 17 }, - /* 3336 */ { MAD_F(0x0615b40c) /* 0.380298661 */, 17 }, - /* 3337 */ { MAD_F(0x06165370) /* 0.380450666 */, 17 }, - /* 3338 */ { MAD_F(0x0616f2d8) /* 0.380602687 */, 17 }, - /* 3339 */ { MAD_F(0x06179243) /* 0.380754723 */, 17 }, - /* 3340 */ { MAD_F(0x061831b3) /* 0.380906774 */, 17 }, - /* 3341 */ { MAD_F(0x0618d127) /* 0.381058840 */, 17 }, - /* 3342 */ { MAD_F(0x0619709f) /* 0.381210921 */, 17 }, - /* 3343 */ { MAD_F(0x061a101b) /* 0.381363018 */, 17 }, - - /* 3344 */ { MAD_F(0x061aaf9c) /* 0.381515130 */, 17 }, - /* 3345 */ { MAD_F(0x061b4f20) /* 0.381667257 */, 17 }, - /* 3346 */ { MAD_F(0x061beea8) /* 0.381819399 */, 17 }, - /* 3347 */ { MAD_F(0x061c8e34) /* 0.381971556 */, 17 }, - /* 3348 */ { MAD_F(0x061d2dc5) /* 0.382123728 */, 17 }, - /* 3349 */ { MAD_F(0x061dcd59) /* 0.382275916 */, 17 }, - /* 3350 */ { MAD_F(0x061e6cf2) /* 0.382428118 */, 17 }, - /* 3351 */ { MAD_F(0x061f0c8f) /* 0.382580336 */, 17 }, - /* 3352 */ { MAD_F(0x061fac2f) /* 0.382732569 */, 17 }, - /* 3353 */ { MAD_F(0x06204bd4) /* 0.382884817 */, 17 }, - /* 3354 */ { MAD_F(0x0620eb7d) /* 0.383037080 */, 17 }, - /* 3355 */ { MAD_F(0x06218b2a) /* 0.383189358 */, 17 }, - /* 3356 */ { MAD_F(0x06222adb) /* 0.383341652 */, 17 }, - /* 3357 */ { MAD_F(0x0622ca90) /* 0.383493960 */, 17 }, - /* 3358 */ { MAD_F(0x06236a49) /* 0.383646284 */, 17 }, - /* 3359 */ { MAD_F(0x06240a06) /* 0.383798623 */, 17 }, - - /* 3360 */ { MAD_F(0x0624a9c7) /* 0.383950977 */, 17 }, - /* 3361 */ { MAD_F(0x0625498d) /* 0.384103346 */, 17 }, - /* 3362 */ { MAD_F(0x0625e956) /* 0.384255730 */, 17 }, - /* 3363 */ { MAD_F(0x06268923) /* 0.384408129 */, 17 }, - /* 3364 */ { MAD_F(0x062728f5) /* 0.384560544 */, 17 }, - /* 3365 */ { MAD_F(0x0627c8ca) /* 0.384712973 */, 17 }, - /* 3366 */ { MAD_F(0x062868a4) /* 0.384865418 */, 17 }, - /* 3367 */ { MAD_F(0x06290881) /* 0.385017878 */, 17 }, - /* 3368 */ { MAD_F(0x0629a863) /* 0.385170352 */, 17 }, - /* 3369 */ { MAD_F(0x062a4849) /* 0.385322842 */, 17 }, - /* 3370 */ { MAD_F(0x062ae832) /* 0.385475347 */, 17 }, - /* 3371 */ { MAD_F(0x062b8820) /* 0.385627867 */, 17 }, - /* 3372 */ { MAD_F(0x062c2812) /* 0.385780402 */, 17 }, - /* 3373 */ { MAD_F(0x062cc808) /* 0.385932953 */, 17 }, - /* 3374 */ { MAD_F(0x062d6802) /* 0.386085518 */, 17 }, - /* 3375 */ { MAD_F(0x062e0800) /* 0.386238098 */, 17 }, - - /* 3376 */ { MAD_F(0x062ea802) /* 0.386390694 */, 17 }, - /* 3377 */ { MAD_F(0x062f4808) /* 0.386543304 */, 17 }, - /* 3378 */ { MAD_F(0x062fe812) /* 0.386695930 */, 17 }, - /* 3379 */ { MAD_F(0x06308820) /* 0.386848570 */, 17 }, - /* 3380 */ { MAD_F(0x06312832) /* 0.387001226 */, 17 }, - /* 3381 */ { MAD_F(0x0631c849) /* 0.387153897 */, 17 }, - /* 3382 */ { MAD_F(0x06326863) /* 0.387306582 */, 17 }, - /* 3383 */ { MAD_F(0x06330881) /* 0.387459283 */, 17 }, - /* 3384 */ { MAD_F(0x0633a8a3) /* 0.387611999 */, 17 }, - /* 3385 */ { MAD_F(0x063448ca) /* 0.387764730 */, 17 }, - /* 3386 */ { MAD_F(0x0634e8f4) /* 0.387917476 */, 17 }, - /* 3387 */ { MAD_F(0x06358923) /* 0.388070237 */, 17 }, - /* 3388 */ { MAD_F(0x06362955) /* 0.388223013 */, 17 }, - /* 3389 */ { MAD_F(0x0636c98c) /* 0.388375804 */, 17 }, - /* 3390 */ { MAD_F(0x063769c6) /* 0.388528610 */, 17 }, - /* 3391 */ { MAD_F(0x06380a05) /* 0.388681431 */, 17 }, - - /* 3392 */ { MAD_F(0x0638aa48) /* 0.388834268 */, 17 }, - /* 3393 */ { MAD_F(0x06394a8e) /* 0.388987119 */, 17 }, - /* 3394 */ { MAD_F(0x0639ead9) /* 0.389139985 */, 17 }, - /* 3395 */ { MAD_F(0x063a8b28) /* 0.389292866 */, 17 }, - /* 3396 */ { MAD_F(0x063b2b7b) /* 0.389445762 */, 17 }, - /* 3397 */ { MAD_F(0x063bcbd1) /* 0.389598674 */, 17 }, - /* 3398 */ { MAD_F(0x063c6c2c) /* 0.389751600 */, 17 }, - /* 3399 */ { MAD_F(0x063d0c8b) /* 0.389904541 */, 17 }, - /* 3400 */ { MAD_F(0x063dacee) /* 0.390057497 */, 17 }, - /* 3401 */ { MAD_F(0x063e4d55) /* 0.390210468 */, 17 }, - /* 3402 */ { MAD_F(0x063eedc0) /* 0.390363455 */, 17 }, - /* 3403 */ { MAD_F(0x063f8e2f) /* 0.390516456 */, 17 }, - /* 3404 */ { MAD_F(0x06402ea2) /* 0.390669472 */, 17 }, - /* 3405 */ { MAD_F(0x0640cf19) /* 0.390822503 */, 17 }, - /* 3406 */ { MAD_F(0x06416f94) /* 0.390975549 */, 17 }, - /* 3407 */ { MAD_F(0x06421013) /* 0.391128611 */, 17 }, - - /* 3408 */ { MAD_F(0x0642b096) /* 0.391281687 */, 17 }, - /* 3409 */ { MAD_F(0x0643511d) /* 0.391434778 */, 17 }, - /* 3410 */ { MAD_F(0x0643f1a8) /* 0.391587884 */, 17 }, - /* 3411 */ { MAD_F(0x06449237) /* 0.391741005 */, 17 }, - /* 3412 */ { MAD_F(0x064532ca) /* 0.391894141 */, 17 }, - /* 3413 */ { MAD_F(0x0645d361) /* 0.392047292 */, 17 }, - /* 3414 */ { MAD_F(0x064673fc) /* 0.392200458 */, 17 }, - /* 3415 */ { MAD_F(0x0647149c) /* 0.392353638 */, 17 }, - /* 3416 */ { MAD_F(0x0647b53f) /* 0.392506834 */, 17 }, - /* 3417 */ { MAD_F(0x064855e6) /* 0.392660045 */, 17 }, - /* 3418 */ { MAD_F(0x0648f691) /* 0.392813271 */, 17 }, - /* 3419 */ { MAD_F(0x06499740) /* 0.392966511 */, 17 }, - /* 3420 */ { MAD_F(0x064a37f4) /* 0.393119767 */, 17 }, - /* 3421 */ { MAD_F(0x064ad8ab) /* 0.393273038 */, 17 }, - /* 3422 */ { MAD_F(0x064b7966) /* 0.393426323 */, 17 }, - /* 3423 */ { MAD_F(0x064c1a25) /* 0.393579623 */, 17 }, - - /* 3424 */ { MAD_F(0x064cbae9) /* 0.393732939 */, 17 }, - /* 3425 */ { MAD_F(0x064d5bb0) /* 0.393886269 */, 17 }, - /* 3426 */ { MAD_F(0x064dfc7b) /* 0.394039614 */, 17 }, - /* 3427 */ { MAD_F(0x064e9d4b) /* 0.394192974 */, 17 }, - /* 3428 */ { MAD_F(0x064f3e1e) /* 0.394346349 */, 17 }, - /* 3429 */ { MAD_F(0x064fdef5) /* 0.394499739 */, 17 }, - /* 3430 */ { MAD_F(0x06507fd0) /* 0.394653144 */, 17 }, - /* 3431 */ { MAD_F(0x065120b0) /* 0.394806564 */, 17 }, - /* 3432 */ { MAD_F(0x0651c193) /* 0.394959999 */, 17 }, - /* 3433 */ { MAD_F(0x0652627a) /* 0.395113448 */, 17 }, - /* 3434 */ { MAD_F(0x06530366) /* 0.395266913 */, 17 }, - /* 3435 */ { MAD_F(0x0653a455) /* 0.395420392 */, 17 }, - /* 3436 */ { MAD_F(0x06544548) /* 0.395573886 */, 17 }, - /* 3437 */ { MAD_F(0x0654e640) /* 0.395727395 */, 17 }, - /* 3438 */ { MAD_F(0x0655873b) /* 0.395880919 */, 17 }, - /* 3439 */ { MAD_F(0x0656283a) /* 0.396034458 */, 17 }, - - /* 3440 */ { MAD_F(0x0656c93d) /* 0.396188012 */, 17 }, - /* 3441 */ { MAD_F(0x06576a45) /* 0.396341581 */, 17 }, - /* 3442 */ { MAD_F(0x06580b50) /* 0.396495164 */, 17 }, - /* 3443 */ { MAD_F(0x0658ac5f) /* 0.396648763 */, 17 }, - /* 3444 */ { MAD_F(0x06594d73) /* 0.396802376 */, 17 }, - /* 3445 */ { MAD_F(0x0659ee8a) /* 0.396956004 */, 17 }, - /* 3446 */ { MAD_F(0x065a8fa5) /* 0.397109647 */, 17 }, - /* 3447 */ { MAD_F(0x065b30c4) /* 0.397263305 */, 17 }, - /* 3448 */ { MAD_F(0x065bd1e7) /* 0.397416978 */, 17 }, - /* 3449 */ { MAD_F(0x065c730f) /* 0.397570666 */, 17 }, - /* 3450 */ { MAD_F(0x065d143a) /* 0.397724368 */, 17 }, - /* 3451 */ { MAD_F(0x065db569) /* 0.397878085 */, 17 }, - /* 3452 */ { MAD_F(0x065e569c) /* 0.398031818 */, 17 }, - /* 3453 */ { MAD_F(0x065ef7d3) /* 0.398185565 */, 17 }, - /* 3454 */ { MAD_F(0x065f990e) /* 0.398339326 */, 17 }, - /* 3455 */ { MAD_F(0x06603a4e) /* 0.398493103 */, 17 }, - - /* 3456 */ { MAD_F(0x0660db91) /* 0.398646895 */, 17 }, - /* 3457 */ { MAD_F(0x06617cd8) /* 0.398800701 */, 17 }, - /* 3458 */ { MAD_F(0x06621e23) /* 0.398954522 */, 17 }, - /* 3459 */ { MAD_F(0x0662bf72) /* 0.399108358 */, 17 }, - /* 3460 */ { MAD_F(0x066360c5) /* 0.399262209 */, 17 }, - /* 3461 */ { MAD_F(0x0664021c) /* 0.399416075 */, 17 }, - /* 3462 */ { MAD_F(0x0664a377) /* 0.399569955 */, 17 }, - /* 3463 */ { MAD_F(0x066544d6) /* 0.399723851 */, 17 }, - /* 3464 */ { MAD_F(0x0665e639) /* 0.399877761 */, 17 }, - /* 3465 */ { MAD_F(0x066687a0) /* 0.400031686 */, 17 }, - /* 3466 */ { MAD_F(0x0667290b) /* 0.400185625 */, 17 }, - /* 3467 */ { MAD_F(0x0667ca79) /* 0.400339580 */, 17 }, - /* 3468 */ { MAD_F(0x06686bec) /* 0.400493549 */, 17 }, - /* 3469 */ { MAD_F(0x06690d63) /* 0.400647534 */, 17 }, - /* 3470 */ { MAD_F(0x0669aede) /* 0.400801533 */, 17 }, - /* 3471 */ { MAD_F(0x066a505d) /* 0.400955546 */, 17 }, - - /* 3472 */ { MAD_F(0x066af1df) /* 0.401109575 */, 17 }, - /* 3473 */ { MAD_F(0x066b9366) /* 0.401263618 */, 17 }, - /* 3474 */ { MAD_F(0x066c34f1) /* 0.401417676 */, 17 }, - /* 3475 */ { MAD_F(0x066cd67f) /* 0.401571749 */, 17 }, - /* 3476 */ { MAD_F(0x066d7812) /* 0.401725837 */, 17 }, - /* 3477 */ { MAD_F(0x066e19a9) /* 0.401879939 */, 17 }, - /* 3478 */ { MAD_F(0x066ebb43) /* 0.402034056 */, 17 }, - /* 3479 */ { MAD_F(0x066f5ce2) /* 0.402188188 */, 17 }, - /* 3480 */ { MAD_F(0x066ffe84) /* 0.402342335 */, 17 }, - /* 3481 */ { MAD_F(0x0670a02a) /* 0.402496497 */, 17 }, - /* 3482 */ { MAD_F(0x067141d5) /* 0.402650673 */, 17 }, - /* 3483 */ { MAD_F(0x0671e383) /* 0.402804864 */, 17 }, - /* 3484 */ { MAD_F(0x06728535) /* 0.402959070 */, 17 }, - /* 3485 */ { MAD_F(0x067326ec) /* 0.403113291 */, 17 }, - /* 3486 */ { MAD_F(0x0673c8a6) /* 0.403267526 */, 17 }, - /* 3487 */ { MAD_F(0x06746a64) /* 0.403421776 */, 17 }, - - /* 3488 */ { MAD_F(0x06750c26) /* 0.403576041 */, 17 }, - /* 3489 */ { MAD_F(0x0675adec) /* 0.403730320 */, 17 }, - /* 3490 */ { MAD_F(0x06764fb6) /* 0.403884615 */, 17 }, - /* 3491 */ { MAD_F(0x0676f184) /* 0.404038924 */, 17 }, - /* 3492 */ { MAD_F(0x06779356) /* 0.404193247 */, 17 }, - /* 3493 */ { MAD_F(0x0678352c) /* 0.404347586 */, 17 }, - /* 3494 */ { MAD_F(0x0678d706) /* 0.404501939 */, 17 }, - /* 3495 */ { MAD_F(0x067978e4) /* 0.404656307 */, 17 }, - /* 3496 */ { MAD_F(0x067a1ac6) /* 0.404810690 */, 17 }, - /* 3497 */ { MAD_F(0x067abcac) /* 0.404965087 */, 17 }, - /* 3498 */ { MAD_F(0x067b5e95) /* 0.405119499 */, 17 }, - /* 3499 */ { MAD_F(0x067c0083) /* 0.405273926 */, 17 }, - /* 3500 */ { MAD_F(0x067ca275) /* 0.405428368 */, 17 }, - /* 3501 */ { MAD_F(0x067d446a) /* 0.405582824 */, 17 }, - /* 3502 */ { MAD_F(0x067de664) /* 0.405737295 */, 17 }, - /* 3503 */ { MAD_F(0x067e8861) /* 0.405891781 */, 17 }, - - /* 3504 */ { MAD_F(0x067f2a62) /* 0.406046281 */, 17 }, - /* 3505 */ { MAD_F(0x067fcc68) /* 0.406200796 */, 17 }, - /* 3506 */ { MAD_F(0x06806e71) /* 0.406355326 */, 17 }, - /* 3507 */ { MAD_F(0x0681107e) /* 0.406509870 */, 17 }, - /* 3508 */ { MAD_F(0x0681b28f) /* 0.406664429 */, 17 }, - /* 3509 */ { MAD_F(0x068254a4) /* 0.406819003 */, 17 }, - /* 3510 */ { MAD_F(0x0682f6bd) /* 0.406973592 */, 17 }, - /* 3511 */ { MAD_F(0x068398da) /* 0.407128195 */, 17 }, - /* 3512 */ { MAD_F(0x06843afb) /* 0.407282813 */, 17 }, - /* 3513 */ { MAD_F(0x0684dd20) /* 0.407437445 */, 17 }, - /* 3514 */ { MAD_F(0x06857f49) /* 0.407592093 */, 17 }, - /* 3515 */ { MAD_F(0x06862176) /* 0.407746754 */, 17 }, - /* 3516 */ { MAD_F(0x0686c3a6) /* 0.407901431 */, 17 }, - /* 3517 */ { MAD_F(0x068765db) /* 0.408056122 */, 17 }, - /* 3518 */ { MAD_F(0x06880814) /* 0.408210828 */, 17 }, - /* 3519 */ { MAD_F(0x0688aa50) /* 0.408365549 */, 17 }, - - /* 3520 */ { MAD_F(0x06894c90) /* 0.408520284 */, 17 }, - /* 3521 */ { MAD_F(0x0689eed5) /* 0.408675034 */, 17 }, - /* 3522 */ { MAD_F(0x068a911d) /* 0.408829798 */, 17 }, - /* 3523 */ { MAD_F(0x068b3369) /* 0.408984577 */, 17 }, - /* 3524 */ { MAD_F(0x068bd5b9) /* 0.409139371 */, 17 }, - /* 3525 */ { MAD_F(0x068c780e) /* 0.409294180 */, 17 }, - /* 3526 */ { MAD_F(0x068d1a66) /* 0.409449003 */, 17 }, - /* 3527 */ { MAD_F(0x068dbcc1) /* 0.409603840 */, 17 }, - /* 3528 */ { MAD_F(0x068e5f21) /* 0.409758693 */, 17 }, - /* 3529 */ { MAD_F(0x068f0185) /* 0.409913560 */, 17 }, - /* 3530 */ { MAD_F(0x068fa3ed) /* 0.410068441 */, 17 }, - /* 3531 */ { MAD_F(0x06904658) /* 0.410223338 */, 17 }, - /* 3532 */ { MAD_F(0x0690e8c8) /* 0.410378249 */, 17 }, - /* 3533 */ { MAD_F(0x06918b3c) /* 0.410533174 */, 17 }, - /* 3534 */ { MAD_F(0x06922db3) /* 0.410688114 */, 17 }, - /* 3535 */ { MAD_F(0x0692d02e) /* 0.410843069 */, 17 }, - - /* 3536 */ { MAD_F(0x069372ae) /* 0.410998038 */, 17 }, - /* 3537 */ { MAD_F(0x06941531) /* 0.411153022 */, 17 }, - /* 3538 */ { MAD_F(0x0694b7b8) /* 0.411308021 */, 17 }, - /* 3539 */ { MAD_F(0x06955a43) /* 0.411463034 */, 17 }, - /* 3540 */ { MAD_F(0x0695fcd2) /* 0.411618062 */, 17 }, - /* 3541 */ { MAD_F(0x06969f65) /* 0.411773104 */, 17 }, - /* 3542 */ { MAD_F(0x069741fb) /* 0.411928161 */, 17 }, - /* 3543 */ { MAD_F(0x0697e496) /* 0.412083232 */, 17 }, - /* 3544 */ { MAD_F(0x06988735) /* 0.412238319 */, 17 }, - /* 3545 */ { MAD_F(0x069929d7) /* 0.412393419 */, 17 }, - /* 3546 */ { MAD_F(0x0699cc7e) /* 0.412548535 */, 17 }, - /* 3547 */ { MAD_F(0x069a6f28) /* 0.412703664 */, 17 }, - /* 3548 */ { MAD_F(0x069b11d6) /* 0.412858809 */, 17 }, - /* 3549 */ { MAD_F(0x069bb489) /* 0.413013968 */, 17 }, - /* 3550 */ { MAD_F(0x069c573f) /* 0.413169142 */, 17 }, - /* 3551 */ { MAD_F(0x069cf9f9) /* 0.413324330 */, 17 }, - - /* 3552 */ { MAD_F(0x069d9cb7) /* 0.413479532 */, 17 }, - /* 3553 */ { MAD_F(0x069e3f78) /* 0.413634750 */, 17 }, - /* 3554 */ { MAD_F(0x069ee23e) /* 0.413789982 */, 17 }, - /* 3555 */ { MAD_F(0x069f8508) /* 0.413945228 */, 17 }, - /* 3556 */ { MAD_F(0x06a027d5) /* 0.414100489 */, 17 }, - /* 3557 */ { MAD_F(0x06a0caa7) /* 0.414255765 */, 17 }, - /* 3558 */ { MAD_F(0x06a16d7c) /* 0.414411055 */, 17 }, - /* 3559 */ { MAD_F(0x06a21055) /* 0.414566359 */, 17 }, - /* 3560 */ { MAD_F(0x06a2b333) /* 0.414721679 */, 17 }, - /* 3561 */ { MAD_F(0x06a35614) /* 0.414877012 */, 17 }, - /* 3562 */ { MAD_F(0x06a3f8f9) /* 0.415032361 */, 17 }, - /* 3563 */ { MAD_F(0x06a49be2) /* 0.415187723 */, 17 }, - /* 3564 */ { MAD_F(0x06a53ece) /* 0.415343101 */, 17 }, - /* 3565 */ { MAD_F(0x06a5e1bf) /* 0.415498493 */, 17 }, - /* 3566 */ { MAD_F(0x06a684b4) /* 0.415653899 */, 17 }, - /* 3567 */ { MAD_F(0x06a727ac) /* 0.415809320 */, 17 }, - - /* 3568 */ { MAD_F(0x06a7caa9) /* 0.415964756 */, 17 }, - /* 3569 */ { MAD_F(0x06a86da9) /* 0.416120206 */, 17 }, - /* 3570 */ { MAD_F(0x06a910ad) /* 0.416275670 */, 17 }, - /* 3571 */ { MAD_F(0x06a9b3b5) /* 0.416431149 */, 17 }, - /* 3572 */ { MAD_F(0x06aa56c1) /* 0.416586643 */, 17 }, - /* 3573 */ { MAD_F(0x06aaf9d1) /* 0.416742151 */, 17 }, - /* 3574 */ { MAD_F(0x06ab9ce5) /* 0.416897673 */, 17 }, - /* 3575 */ { MAD_F(0x06ac3ffc) /* 0.417053210 */, 17 }, - /* 3576 */ { MAD_F(0x06ace318) /* 0.417208762 */, 17 }, - /* 3577 */ { MAD_F(0x06ad8637) /* 0.417364328 */, 17 }, - /* 3578 */ { MAD_F(0x06ae295b) /* 0.417519909 */, 17 }, - /* 3579 */ { MAD_F(0x06aecc82) /* 0.417675504 */, 17 }, - /* 3580 */ { MAD_F(0x06af6fad) /* 0.417831113 */, 17 }, - /* 3581 */ { MAD_F(0x06b012dc) /* 0.417986737 */, 17 }, - /* 3582 */ { MAD_F(0x06b0b60f) /* 0.418142376 */, 17 }, - /* 3583 */ { MAD_F(0x06b15946) /* 0.418298029 */, 17 }, - - /* 3584 */ { MAD_F(0x06b1fc81) /* 0.418453696 */, 17 }, - /* 3585 */ { MAD_F(0x06b29fbf) /* 0.418609378 */, 17 }, - /* 3586 */ { MAD_F(0x06b34302) /* 0.418765075 */, 17 }, - /* 3587 */ { MAD_F(0x06b3e648) /* 0.418920786 */, 17 }, - /* 3588 */ { MAD_F(0x06b48992) /* 0.419076511 */, 17 }, - /* 3589 */ { MAD_F(0x06b52ce0) /* 0.419232251 */, 17 }, - /* 3590 */ { MAD_F(0x06b5d032) /* 0.419388005 */, 17 }, - /* 3591 */ { MAD_F(0x06b67388) /* 0.419543774 */, 17 }, - /* 3592 */ { MAD_F(0x06b716e2) /* 0.419699557 */, 17 }, - /* 3593 */ { MAD_F(0x06b7ba3f) /* 0.419855355 */, 17 }, - /* 3594 */ { MAD_F(0x06b85da1) /* 0.420011167 */, 17 }, - /* 3595 */ { MAD_F(0x06b90106) /* 0.420166994 */, 17 }, - /* 3596 */ { MAD_F(0x06b9a470) /* 0.420322835 */, 17 }, - /* 3597 */ { MAD_F(0x06ba47dd) /* 0.420478690 */, 17 }, - /* 3598 */ { MAD_F(0x06baeb4e) /* 0.420634560 */, 17 }, - /* 3599 */ { MAD_F(0x06bb8ec3) /* 0.420790445 */, 17 }, - - /* 3600 */ { MAD_F(0x06bc323b) /* 0.420946343 */, 17 }, - /* 3601 */ { MAD_F(0x06bcd5b8) /* 0.421102257 */, 17 }, - /* 3602 */ { MAD_F(0x06bd7939) /* 0.421258184 */, 17 }, - /* 3603 */ { MAD_F(0x06be1cbd) /* 0.421414127 */, 17 }, - /* 3604 */ { MAD_F(0x06bec045) /* 0.421570083 */, 17 }, - /* 3605 */ { MAD_F(0x06bf63d1) /* 0.421726054 */, 17 }, - /* 3606 */ { MAD_F(0x06c00761) /* 0.421882040 */, 17 }, - /* 3607 */ { MAD_F(0x06c0aaf5) /* 0.422038039 */, 17 }, - /* 3608 */ { MAD_F(0x06c14e8d) /* 0.422194054 */, 17 }, - /* 3609 */ { MAD_F(0x06c1f229) /* 0.422350082 */, 17 }, - /* 3610 */ { MAD_F(0x06c295c8) /* 0.422506125 */, 17 }, - /* 3611 */ { MAD_F(0x06c3396c) /* 0.422662183 */, 17 }, - /* 3612 */ { MAD_F(0x06c3dd13) /* 0.422818255 */, 17 }, - /* 3613 */ { MAD_F(0x06c480be) /* 0.422974341 */, 17 }, - /* 3614 */ { MAD_F(0x06c5246d) /* 0.423130442 */, 17 }, - /* 3615 */ { MAD_F(0x06c5c820) /* 0.423286557 */, 17 }, - - /* 3616 */ { MAD_F(0x06c66bd6) /* 0.423442686 */, 17 }, - /* 3617 */ { MAD_F(0x06c70f91) /* 0.423598830 */, 17 }, - /* 3618 */ { MAD_F(0x06c7b34f) /* 0.423754988 */, 17 }, - /* 3619 */ { MAD_F(0x06c85712) /* 0.423911161 */, 17 }, - /* 3620 */ { MAD_F(0x06c8fad8) /* 0.424067348 */, 17 }, - /* 3621 */ { MAD_F(0x06c99ea2) /* 0.424223550 */, 17 }, - /* 3622 */ { MAD_F(0x06ca4270) /* 0.424379765 */, 17 }, - /* 3623 */ { MAD_F(0x06cae641) /* 0.424535996 */, 17 }, - /* 3624 */ { MAD_F(0x06cb8a17) /* 0.424692240 */, 17 }, - /* 3625 */ { MAD_F(0x06cc2df0) /* 0.424848499 */, 17 }, - /* 3626 */ { MAD_F(0x06ccd1ce) /* 0.425004772 */, 17 }, - /* 3627 */ { MAD_F(0x06cd75af) /* 0.425161060 */, 17 }, - /* 3628 */ { MAD_F(0x06ce1994) /* 0.425317362 */, 17 }, - /* 3629 */ { MAD_F(0x06cebd7d) /* 0.425473678 */, 17 }, - /* 3630 */ { MAD_F(0x06cf6169) /* 0.425630009 */, 17 }, - /* 3631 */ { MAD_F(0x06d0055a) /* 0.425786354 */, 17 }, - - /* 3632 */ { MAD_F(0x06d0a94e) /* 0.425942714 */, 17 }, - /* 3633 */ { MAD_F(0x06d14d47) /* 0.426099088 */, 17 }, - /* 3634 */ { MAD_F(0x06d1f143) /* 0.426255476 */, 17 }, - /* 3635 */ { MAD_F(0x06d29543) /* 0.426411878 */, 17 }, - /* 3636 */ { MAD_F(0x06d33947) /* 0.426568295 */, 17 }, - /* 3637 */ { MAD_F(0x06d3dd4e) /* 0.426724726 */, 17 }, - /* 3638 */ { MAD_F(0x06d4815a) /* 0.426881172 */, 17 }, - /* 3639 */ { MAD_F(0x06d52569) /* 0.427037632 */, 17 }, - /* 3640 */ { MAD_F(0x06d5c97c) /* 0.427194106 */, 17 }, - /* 3641 */ { MAD_F(0x06d66d93) /* 0.427350594 */, 17 }, - /* 3642 */ { MAD_F(0x06d711ae) /* 0.427507097 */, 17 }, - /* 3643 */ { MAD_F(0x06d7b5cd) /* 0.427663614 */, 17 }, - /* 3644 */ { MAD_F(0x06d859f0) /* 0.427820146 */, 17 }, - /* 3645 */ { MAD_F(0x06d8fe16) /* 0.427976692 */, 17 }, - /* 3646 */ { MAD_F(0x06d9a240) /* 0.428133252 */, 17 }, - /* 3647 */ { MAD_F(0x06da466f) /* 0.428289826 */, 17 }, - - /* 3648 */ { MAD_F(0x06daeaa1) /* 0.428446415 */, 17 }, - /* 3649 */ { MAD_F(0x06db8ed6) /* 0.428603018 */, 17 }, - /* 3650 */ { MAD_F(0x06dc3310) /* 0.428759635 */, 17 }, - /* 3651 */ { MAD_F(0x06dcd74d) /* 0.428916267 */, 17 }, - /* 3652 */ { MAD_F(0x06dd7b8f) /* 0.429072913 */, 17 }, - /* 3653 */ { MAD_F(0x06de1fd4) /* 0.429229573 */, 17 }, - /* 3654 */ { MAD_F(0x06dec41d) /* 0.429386248 */, 17 }, - /* 3655 */ { MAD_F(0x06df686a) /* 0.429542937 */, 17 }, - /* 3656 */ { MAD_F(0x06e00cbb) /* 0.429699640 */, 17 }, - /* 3657 */ { MAD_F(0x06e0b10f) /* 0.429856357 */, 17 }, - /* 3658 */ { MAD_F(0x06e15567) /* 0.430013089 */, 17 }, - /* 3659 */ { MAD_F(0x06e1f9c4) /* 0.430169835 */, 17 }, - /* 3660 */ { MAD_F(0x06e29e24) /* 0.430326595 */, 17 }, - /* 3661 */ { MAD_F(0x06e34287) /* 0.430483370 */, 17 }, - /* 3662 */ { MAD_F(0x06e3e6ef) /* 0.430640159 */, 17 }, - /* 3663 */ { MAD_F(0x06e48b5b) /* 0.430796962 */, 17 }, - - /* 3664 */ { MAD_F(0x06e52fca) /* 0.430953779 */, 17 }, - /* 3665 */ { MAD_F(0x06e5d43d) /* 0.431110611 */, 17 }, - /* 3666 */ { MAD_F(0x06e678b4) /* 0.431267457 */, 17 }, - /* 3667 */ { MAD_F(0x06e71d2f) /* 0.431424317 */, 17 }, - /* 3668 */ { MAD_F(0x06e7c1ae) /* 0.431581192 */, 17 }, - /* 3669 */ { MAD_F(0x06e86630) /* 0.431738080 */, 17 }, - /* 3670 */ { MAD_F(0x06e90ab7) /* 0.431894983 */, 17 }, - /* 3671 */ { MAD_F(0x06e9af41) /* 0.432051900 */, 17 }, - /* 3672 */ { MAD_F(0x06ea53cf) /* 0.432208832 */, 17 }, - /* 3673 */ { MAD_F(0x06eaf860) /* 0.432365778 */, 17 }, - /* 3674 */ { MAD_F(0x06eb9cf6) /* 0.432522737 */, 17 }, - /* 3675 */ { MAD_F(0x06ec418f) /* 0.432679712 */, 17 }, - /* 3676 */ { MAD_F(0x06ece62d) /* 0.432836700 */, 17 }, - /* 3677 */ { MAD_F(0x06ed8ace) /* 0.432993703 */, 17 }, - /* 3678 */ { MAD_F(0x06ee2f73) /* 0.433150720 */, 17 }, - /* 3679 */ { MAD_F(0x06eed41b) /* 0.433307751 */, 17 }, - - /* 3680 */ { MAD_F(0x06ef78c8) /* 0.433464796 */, 17 }, - /* 3681 */ { MAD_F(0x06f01d78) /* 0.433621856 */, 17 }, - /* 3682 */ { MAD_F(0x06f0c22c) /* 0.433778929 */, 17 }, - /* 3683 */ { MAD_F(0x06f166e4) /* 0.433936017 */, 17 }, - /* 3684 */ { MAD_F(0x06f20ba0) /* 0.434093120 */, 17 }, - /* 3685 */ { MAD_F(0x06f2b060) /* 0.434250236 */, 17 }, - /* 3686 */ { MAD_F(0x06f35523) /* 0.434407367 */, 17 }, - /* 3687 */ { MAD_F(0x06f3f9eb) /* 0.434564512 */, 17 }, - /* 3688 */ { MAD_F(0x06f49eb6) /* 0.434721671 */, 17 }, - /* 3689 */ { MAD_F(0x06f54385) /* 0.434878844 */, 17 }, - /* 3690 */ { MAD_F(0x06f5e857) /* 0.435036032 */, 17 }, - /* 3691 */ { MAD_F(0x06f68d2e) /* 0.435193233 */, 17 }, - /* 3692 */ { MAD_F(0x06f73208) /* 0.435350449 */, 17 }, - /* 3693 */ { MAD_F(0x06f7d6e6) /* 0.435507679 */, 17 }, - /* 3694 */ { MAD_F(0x06f87bc8) /* 0.435664924 */, 17 }, - /* 3695 */ { MAD_F(0x06f920ae) /* 0.435822182 */, 17 }, - - /* 3696 */ { MAD_F(0x06f9c597) /* 0.435979455 */, 17 }, - /* 3697 */ { MAD_F(0x06fa6a85) /* 0.436136741 */, 17 }, - /* 3698 */ { MAD_F(0x06fb0f76) /* 0.436294042 */, 17 }, - /* 3699 */ { MAD_F(0x06fbb46b) /* 0.436451358 */, 17 }, - /* 3700 */ { MAD_F(0x06fc5964) /* 0.436608687 */, 17 }, - /* 3701 */ { MAD_F(0x06fcfe60) /* 0.436766031 */, 17 }, - /* 3702 */ { MAD_F(0x06fda361) /* 0.436923388 */, 17 }, - /* 3703 */ { MAD_F(0x06fe4865) /* 0.437080760 */, 17 }, - /* 3704 */ { MAD_F(0x06feed6d) /* 0.437238146 */, 17 }, - /* 3705 */ { MAD_F(0x06ff9279) /* 0.437395547 */, 17 }, - /* 3706 */ { MAD_F(0x07003788) /* 0.437552961 */, 17 }, - /* 3707 */ { MAD_F(0x0700dc9c) /* 0.437710389 */, 17 }, - /* 3708 */ { MAD_F(0x070181b3) /* 0.437867832 */, 17 }, - /* 3709 */ { MAD_F(0x070226ce) /* 0.438025289 */, 17 }, - /* 3710 */ { MAD_F(0x0702cbed) /* 0.438182760 */, 17 }, - /* 3711 */ { MAD_F(0x0703710f) /* 0.438340245 */, 17 }, - - /* 3712 */ { MAD_F(0x07041636) /* 0.438497744 */, 17 }, - /* 3713 */ { MAD_F(0x0704bb60) /* 0.438655258 */, 17 }, - /* 3714 */ { MAD_F(0x0705608e) /* 0.438812785 */, 17 }, - /* 3715 */ { MAD_F(0x070605c0) /* 0.438970327 */, 17 }, - /* 3716 */ { MAD_F(0x0706aaf5) /* 0.439127883 */, 17 }, - /* 3717 */ { MAD_F(0x0707502f) /* 0.439285453 */, 17 }, - /* 3718 */ { MAD_F(0x0707f56c) /* 0.439443037 */, 17 }, - /* 3719 */ { MAD_F(0x07089aad) /* 0.439600635 */, 17 }, - /* 3720 */ { MAD_F(0x07093ff2) /* 0.439758248 */, 17 }, - /* 3721 */ { MAD_F(0x0709e53a) /* 0.439915874 */, 17 }, - /* 3722 */ { MAD_F(0x070a8a86) /* 0.440073515 */, 17 }, - /* 3723 */ { MAD_F(0x070b2fd7) /* 0.440231170 */, 17 }, - /* 3724 */ { MAD_F(0x070bd52a) /* 0.440388839 */, 17 }, - /* 3725 */ { MAD_F(0x070c7a82) /* 0.440546522 */, 17 }, - /* 3726 */ { MAD_F(0x070d1fde) /* 0.440704219 */, 17 }, - /* 3727 */ { MAD_F(0x070dc53d) /* 0.440861930 */, 17 }, - - /* 3728 */ { MAD_F(0x070e6aa0) /* 0.441019655 */, 17 }, - /* 3729 */ { MAD_F(0x070f1007) /* 0.441177395 */, 17 }, - /* 3730 */ { MAD_F(0x070fb571) /* 0.441335148 */, 17 }, - /* 3731 */ { MAD_F(0x07105ae0) /* 0.441492916 */, 17 }, - /* 3732 */ { MAD_F(0x07110052) /* 0.441650697 */, 17 }, - /* 3733 */ { MAD_F(0x0711a5c8) /* 0.441808493 */, 17 }, - /* 3734 */ { MAD_F(0x07124b42) /* 0.441966303 */, 17 }, - /* 3735 */ { MAD_F(0x0712f0bf) /* 0.442124127 */, 17 }, - /* 3736 */ { MAD_F(0x07139641) /* 0.442281965 */, 17 }, - /* 3737 */ { MAD_F(0x07143bc6) /* 0.442439817 */, 17 }, - /* 3738 */ { MAD_F(0x0714e14f) /* 0.442597683 */, 17 }, - /* 3739 */ { MAD_F(0x071586db) /* 0.442755564 */, 17 }, - /* 3740 */ { MAD_F(0x07162c6c) /* 0.442913458 */, 17 }, - /* 3741 */ { MAD_F(0x0716d200) /* 0.443071366 */, 17 }, - /* 3742 */ { MAD_F(0x07177798) /* 0.443229289 */, 17 }, - /* 3743 */ { MAD_F(0x07181d34) /* 0.443387226 */, 17 }, - - /* 3744 */ { MAD_F(0x0718c2d3) /* 0.443545176 */, 17 }, - /* 3745 */ { MAD_F(0x07196877) /* 0.443703141 */, 17 }, - /* 3746 */ { MAD_F(0x071a0e1e) /* 0.443861120 */, 17 }, - /* 3747 */ { MAD_F(0x071ab3c9) /* 0.444019113 */, 17 }, - /* 3748 */ { MAD_F(0x071b5977) /* 0.444177119 */, 17 }, - /* 3749 */ { MAD_F(0x071bff2a) /* 0.444335140 */, 17 }, - /* 3750 */ { MAD_F(0x071ca4e0) /* 0.444493175 */, 17 }, - /* 3751 */ { MAD_F(0x071d4a9a) /* 0.444651224 */, 17 }, - /* 3752 */ { MAD_F(0x071df058) /* 0.444809288 */, 17 }, - /* 3753 */ { MAD_F(0x071e9619) /* 0.444967365 */, 17 }, - /* 3754 */ { MAD_F(0x071f3bde) /* 0.445125456 */, 17 }, - /* 3755 */ { MAD_F(0x071fe1a8) /* 0.445283561 */, 17 }, - /* 3756 */ { MAD_F(0x07208774) /* 0.445441680 */, 17 }, - /* 3757 */ { MAD_F(0x07212d45) /* 0.445599814 */, 17 }, - /* 3758 */ { MAD_F(0x0721d319) /* 0.445757961 */, 17 }, - /* 3759 */ { MAD_F(0x072278f1) /* 0.445916122 */, 17 }, - - /* 3760 */ { MAD_F(0x07231ecd) /* 0.446074298 */, 17 }, - /* 3761 */ { MAD_F(0x0723c4ad) /* 0.446232487 */, 17 }, - /* 3762 */ { MAD_F(0x07246a90) /* 0.446390690 */, 17 }, - /* 3763 */ { MAD_F(0x07251077) /* 0.446548908 */, 17 }, - /* 3764 */ { MAD_F(0x0725b662) /* 0.446707139 */, 17 }, - /* 3765 */ { MAD_F(0x07265c51) /* 0.446865385 */, 17 }, - /* 3766 */ { MAD_F(0x07270244) /* 0.447023644 */, 17 }, - /* 3767 */ { MAD_F(0x0727a83a) /* 0.447181918 */, 17 }, - /* 3768 */ { MAD_F(0x07284e34) /* 0.447340205 */, 17 }, - /* 3769 */ { MAD_F(0x0728f431) /* 0.447498507 */, 17 }, - /* 3770 */ { MAD_F(0x07299a33) /* 0.447656822 */, 17 }, - /* 3771 */ { MAD_F(0x072a4038) /* 0.447815152 */, 17 }, - /* 3772 */ { MAD_F(0x072ae641) /* 0.447973495 */, 17 }, - /* 3773 */ { MAD_F(0x072b8c4e) /* 0.448131853 */, 17 }, - /* 3774 */ { MAD_F(0x072c325e) /* 0.448290224 */, 17 }, - /* 3775 */ { MAD_F(0x072cd873) /* 0.448448609 */, 17 }, - - /* 3776 */ { MAD_F(0x072d7e8b) /* 0.448607009 */, 17 }, - /* 3777 */ { MAD_F(0x072e24a7) /* 0.448765422 */, 17 }, - /* 3778 */ { MAD_F(0x072ecac6) /* 0.448923850 */, 17 }, - /* 3779 */ { MAD_F(0x072f70e9) /* 0.449082291 */, 17 }, - /* 3780 */ { MAD_F(0x07301710) /* 0.449240746 */, 17 }, - /* 3781 */ { MAD_F(0x0730bd3b) /* 0.449399216 */, 17 }, - /* 3782 */ { MAD_F(0x0731636a) /* 0.449557699 */, 17 }, - /* 3783 */ { MAD_F(0x0732099c) /* 0.449716196 */, 17 }, - /* 3784 */ { MAD_F(0x0732afd2) /* 0.449874708 */, 17 }, - /* 3785 */ { MAD_F(0x0733560c) /* 0.450033233 */, 17 }, - /* 3786 */ { MAD_F(0x0733fc49) /* 0.450191772 */, 17 }, - /* 3787 */ { MAD_F(0x0734a28b) /* 0.450350325 */, 17 }, - /* 3788 */ { MAD_F(0x073548d0) /* 0.450508892 */, 17 }, - /* 3789 */ { MAD_F(0x0735ef18) /* 0.450667473 */, 17 }, - /* 3790 */ { MAD_F(0x07369565) /* 0.450826068 */, 17 }, - /* 3791 */ { MAD_F(0x07373bb5) /* 0.450984677 */, 17 }, - - /* 3792 */ { MAD_F(0x0737e209) /* 0.451143300 */, 17 }, - /* 3793 */ { MAD_F(0x07388861) /* 0.451301937 */, 17 }, - /* 3794 */ { MAD_F(0x07392ebc) /* 0.451460588 */, 17 }, - /* 3795 */ { MAD_F(0x0739d51c) /* 0.451619252 */, 17 }, - /* 3796 */ { MAD_F(0x073a7b7f) /* 0.451777931 */, 17 }, - /* 3797 */ { MAD_F(0x073b21e5) /* 0.451936623 */, 17 }, - /* 3798 */ { MAD_F(0x073bc850) /* 0.452095330 */, 17 }, - /* 3799 */ { MAD_F(0x073c6ebe) /* 0.452254050 */, 17 }, - /* 3800 */ { MAD_F(0x073d1530) /* 0.452412785 */, 17 }, - /* 3801 */ { MAD_F(0x073dbba6) /* 0.452571533 */, 17 }, - /* 3802 */ { MAD_F(0x073e621f) /* 0.452730295 */, 17 }, - /* 3803 */ { MAD_F(0x073f089c) /* 0.452889071 */, 17 }, - /* 3804 */ { MAD_F(0x073faf1d) /* 0.453047861 */, 17 }, - /* 3805 */ { MAD_F(0x074055a2) /* 0.453206665 */, 17 }, - /* 3806 */ { MAD_F(0x0740fc2a) /* 0.453365483 */, 17 }, - /* 3807 */ { MAD_F(0x0741a2b6) /* 0.453524315 */, 17 }, - - /* 3808 */ { MAD_F(0x07424946) /* 0.453683161 */, 17 }, - /* 3809 */ { MAD_F(0x0742efd9) /* 0.453842020 */, 17 }, - /* 3810 */ { MAD_F(0x07439671) /* 0.454000894 */, 17 }, - /* 3811 */ { MAD_F(0x07443d0c) /* 0.454159781 */, 17 }, - /* 3812 */ { MAD_F(0x0744e3aa) /* 0.454318683 */, 17 }, - /* 3813 */ { MAD_F(0x07458a4d) /* 0.454477598 */, 17 }, - /* 3814 */ { MAD_F(0x074630f3) /* 0.454636527 */, 17 }, - /* 3815 */ { MAD_F(0x0746d79d) /* 0.454795470 */, 17 }, - /* 3816 */ { MAD_F(0x07477e4b) /* 0.454954427 */, 17 }, - /* 3817 */ { MAD_F(0x074824fc) /* 0.455113397 */, 17 }, - /* 3818 */ { MAD_F(0x0748cbb1) /* 0.455272382 */, 17 }, - /* 3819 */ { MAD_F(0x0749726a) /* 0.455431381 */, 17 }, - /* 3820 */ { MAD_F(0x074a1927) /* 0.455590393 */, 17 }, - /* 3821 */ { MAD_F(0x074abfe7) /* 0.455749419 */, 17 }, - /* 3822 */ { MAD_F(0x074b66ab) /* 0.455908459 */, 17 }, - /* 3823 */ { MAD_F(0x074c0d73) /* 0.456067513 */, 17 }, - - /* 3824 */ { MAD_F(0x074cb43e) /* 0.456226581 */, 17 }, - /* 3825 */ { MAD_F(0x074d5b0d) /* 0.456385663 */, 17 }, - /* 3826 */ { MAD_F(0x074e01e0) /* 0.456544759 */, 17 }, - /* 3827 */ { MAD_F(0x074ea8b7) /* 0.456703868 */, 17 }, - /* 3828 */ { MAD_F(0x074f4f91) /* 0.456862992 */, 17 }, - /* 3829 */ { MAD_F(0x074ff66f) /* 0.457022129 */, 17 }, - /* 3830 */ { MAD_F(0x07509d51) /* 0.457181280 */, 17 }, - /* 3831 */ { MAD_F(0x07514437) /* 0.457340445 */, 17 }, - /* 3832 */ { MAD_F(0x0751eb20) /* 0.457499623 */, 17 }, - /* 3833 */ { MAD_F(0x0752920d) /* 0.457658816 */, 17 }, - /* 3834 */ { MAD_F(0x075338fd) /* 0.457818022 */, 17 }, - /* 3835 */ { MAD_F(0x0753dff2) /* 0.457977243 */, 17 }, - /* 3836 */ { MAD_F(0x075486ea) /* 0.458136477 */, 17 }, - /* 3837 */ { MAD_F(0x07552de6) /* 0.458295725 */, 17 }, - /* 3838 */ { MAD_F(0x0755d4e5) /* 0.458454987 */, 17 }, - /* 3839 */ { MAD_F(0x07567be8) /* 0.458614262 */, 17 }, - - /* 3840 */ { MAD_F(0x075722ef) /* 0.458773552 */, 17 }, - /* 3841 */ { MAD_F(0x0757c9fa) /* 0.458932855 */, 17 }, - /* 3842 */ { MAD_F(0x07587108) /* 0.459092172 */, 17 }, - /* 3843 */ { MAD_F(0x0759181a) /* 0.459251503 */, 17 }, - /* 3844 */ { MAD_F(0x0759bf30) /* 0.459410848 */, 17 }, - /* 3845 */ { MAD_F(0x075a664a) /* 0.459570206 */, 17 }, - /* 3846 */ { MAD_F(0x075b0d67) /* 0.459729579 */, 17 }, - /* 3847 */ { MAD_F(0x075bb488) /* 0.459888965 */, 17 }, - /* 3848 */ { MAD_F(0x075c5bac) /* 0.460048365 */, 17 }, - /* 3849 */ { MAD_F(0x075d02d5) /* 0.460207779 */, 17 }, - /* 3850 */ { MAD_F(0x075daa01) /* 0.460367206 */, 17 }, - /* 3851 */ { MAD_F(0x075e5130) /* 0.460526648 */, 17 }, - /* 3852 */ { MAD_F(0x075ef864) /* 0.460686103 */, 17 }, - /* 3853 */ { MAD_F(0x075f9f9b) /* 0.460845572 */, 17 }, - /* 3854 */ { MAD_F(0x076046d6) /* 0.461005055 */, 17 }, - /* 3855 */ { MAD_F(0x0760ee14) /* 0.461164552 */, 17 }, - - /* 3856 */ { MAD_F(0x07619557) /* 0.461324062 */, 17 }, - /* 3857 */ { MAD_F(0x07623c9d) /* 0.461483586 */, 17 }, - /* 3858 */ { MAD_F(0x0762e3e6) /* 0.461643124 */, 17 }, - /* 3859 */ { MAD_F(0x07638b34) /* 0.461802676 */, 17 }, - /* 3860 */ { MAD_F(0x07643285) /* 0.461962242 */, 17 }, - /* 3861 */ { MAD_F(0x0764d9d9) /* 0.462121821 */, 17 }, - /* 3862 */ { MAD_F(0x07658132) /* 0.462281414 */, 17 }, - /* 3863 */ { MAD_F(0x0766288e) /* 0.462441021 */, 17 }, - /* 3864 */ { MAD_F(0x0766cfee) /* 0.462600642 */, 17 }, - /* 3865 */ { MAD_F(0x07677751) /* 0.462760276 */, 17 }, - /* 3866 */ { MAD_F(0x07681eb9) /* 0.462919924 */, 17 }, - /* 3867 */ { MAD_F(0x0768c624) /* 0.463079586 */, 17 }, - /* 3868 */ { MAD_F(0x07696d92) /* 0.463239262 */, 17 }, - /* 3869 */ { MAD_F(0x076a1505) /* 0.463398951 */, 17 }, - /* 3870 */ { MAD_F(0x076abc7b) /* 0.463558655 */, 17 }, - /* 3871 */ { MAD_F(0x076b63f4) /* 0.463718372 */, 17 }, - - /* 3872 */ { MAD_F(0x076c0b72) /* 0.463878102 */, 17 }, - /* 3873 */ { MAD_F(0x076cb2f3) /* 0.464037847 */, 17 }, - /* 3874 */ { MAD_F(0x076d5a78) /* 0.464197605 */, 17 }, - /* 3875 */ { MAD_F(0x076e0200) /* 0.464357377 */, 17 }, - /* 3876 */ { MAD_F(0x076ea98c) /* 0.464517163 */, 17 }, - /* 3877 */ { MAD_F(0x076f511c) /* 0.464676962 */, 17 }, - /* 3878 */ { MAD_F(0x076ff8b0) /* 0.464836776 */, 17 }, - /* 3879 */ { MAD_F(0x0770a047) /* 0.464996603 */, 17 }, - /* 3880 */ { MAD_F(0x077147e2) /* 0.465156443 */, 17 }, - /* 3881 */ { MAD_F(0x0771ef80) /* 0.465316298 */, 17 }, - /* 3882 */ { MAD_F(0x07729723) /* 0.465476166 */, 17 }, - /* 3883 */ { MAD_F(0x07733ec9) /* 0.465636048 */, 17 }, - /* 3884 */ { MAD_F(0x0773e672) /* 0.465795943 */, 17 }, - /* 3885 */ { MAD_F(0x07748e20) /* 0.465955853 */, 17 }, - /* 3886 */ { MAD_F(0x077535d1) /* 0.466115776 */, 17 }, - /* 3887 */ { MAD_F(0x0775dd85) /* 0.466275713 */, 17 }, - - /* 3888 */ { MAD_F(0x0776853e) /* 0.466435663 */, 17 }, - /* 3889 */ { MAD_F(0x07772cfa) /* 0.466595627 */, 17 }, - /* 3890 */ { MAD_F(0x0777d4ba) /* 0.466755605 */, 17 }, - /* 3891 */ { MAD_F(0x07787c7d) /* 0.466915597 */, 17 }, - /* 3892 */ { MAD_F(0x07792444) /* 0.467075602 */, 17 }, - /* 3893 */ { MAD_F(0x0779cc0f) /* 0.467235621 */, 17 }, - /* 3894 */ { MAD_F(0x077a73dd) /* 0.467395654 */, 17 }, - /* 3895 */ { MAD_F(0x077b1baf) /* 0.467555701 */, 17 }, - /* 3896 */ { MAD_F(0x077bc385) /* 0.467715761 */, 17 }, - /* 3897 */ { MAD_F(0x077c6b5f) /* 0.467875835 */, 17 }, - /* 3898 */ { MAD_F(0x077d133c) /* 0.468035922 */, 17 }, - /* 3899 */ { MAD_F(0x077dbb1d) /* 0.468196023 */, 17 }, - /* 3900 */ { MAD_F(0x077e6301) /* 0.468356138 */, 17 }, - /* 3901 */ { MAD_F(0x077f0ae9) /* 0.468516267 */, 17 }, - /* 3902 */ { MAD_F(0x077fb2d5) /* 0.468676409 */, 17 }, - /* 3903 */ { MAD_F(0x07805ac5) /* 0.468836565 */, 17 }, - - /* 3904 */ { MAD_F(0x078102b8) /* 0.468996735 */, 17 }, - /* 3905 */ { MAD_F(0x0781aaaf) /* 0.469156918 */, 17 }, - /* 3906 */ { MAD_F(0x078252aa) /* 0.469317115 */, 17 }, - /* 3907 */ { MAD_F(0x0782faa8) /* 0.469477326 */, 17 }, - /* 3908 */ { MAD_F(0x0783a2aa) /* 0.469637550 */, 17 }, - /* 3909 */ { MAD_F(0x07844aaf) /* 0.469797788 */, 17 }, - /* 3910 */ { MAD_F(0x0784f2b8) /* 0.469958040 */, 17 }, - /* 3911 */ { MAD_F(0x07859ac5) /* 0.470118305 */, 17 }, - /* 3912 */ { MAD_F(0x078642d6) /* 0.470278584 */, 17 }, - /* 3913 */ { MAD_F(0x0786eaea) /* 0.470438877 */, 17 }, - /* 3914 */ { MAD_F(0x07879302) /* 0.470599183 */, 17 }, - /* 3915 */ { MAD_F(0x07883b1e) /* 0.470759503 */, 17 }, - /* 3916 */ { MAD_F(0x0788e33d) /* 0.470919836 */, 17 }, - /* 3917 */ { MAD_F(0x07898b60) /* 0.471080184 */, 17 }, - /* 3918 */ { MAD_F(0x078a3386) /* 0.471240545 */, 17 }, - /* 3919 */ { MAD_F(0x078adbb0) /* 0.471400919 */, 17 }, - - /* 3920 */ { MAD_F(0x078b83de) /* 0.471561307 */, 17 }, - /* 3921 */ { MAD_F(0x078c2c10) /* 0.471721709 */, 17 }, - /* 3922 */ { MAD_F(0x078cd445) /* 0.471882125 */, 17 }, - /* 3923 */ { MAD_F(0x078d7c7e) /* 0.472042554 */, 17 }, - /* 3924 */ { MAD_F(0x078e24ba) /* 0.472202996 */, 17 }, - /* 3925 */ { MAD_F(0x078eccfb) /* 0.472363453 */, 17 }, - /* 3926 */ { MAD_F(0x078f753e) /* 0.472523923 */, 17 }, - /* 3927 */ { MAD_F(0x07901d86) /* 0.472684406 */, 17 }, - /* 3928 */ { MAD_F(0x0790c5d1) /* 0.472844904 */, 17 }, - /* 3929 */ { MAD_F(0x07916e20) /* 0.473005414 */, 17 }, - /* 3930 */ { MAD_F(0x07921672) /* 0.473165939 */, 17 }, - /* 3931 */ { MAD_F(0x0792bec8) /* 0.473326477 */, 17 }, - /* 3932 */ { MAD_F(0x07936722) /* 0.473487029 */, 17 }, - /* 3933 */ { MAD_F(0x07940f80) /* 0.473647594 */, 17 }, - /* 3934 */ { MAD_F(0x0794b7e1) /* 0.473808173 */, 17 }, - /* 3935 */ { MAD_F(0x07956045) /* 0.473968765 */, 17 }, - - /* 3936 */ { MAD_F(0x079608ae) /* 0.474129372 */, 17 }, - /* 3937 */ { MAD_F(0x0796b11a) /* 0.474289991 */, 17 }, - /* 3938 */ { MAD_F(0x0797598a) /* 0.474450625 */, 17 }, - /* 3939 */ { MAD_F(0x079801fd) /* 0.474611272 */, 17 }, - /* 3940 */ { MAD_F(0x0798aa74) /* 0.474771932 */, 17 }, - /* 3941 */ { MAD_F(0x079952ee) /* 0.474932606 */, 17 }, - /* 3942 */ { MAD_F(0x0799fb6d) /* 0.475093294 */, 17 }, - /* 3943 */ { MAD_F(0x079aa3ef) /* 0.475253995 */, 17 }, - /* 3944 */ { MAD_F(0x079b4c74) /* 0.475414710 */, 17 }, - /* 3945 */ { MAD_F(0x079bf4fd) /* 0.475575439 */, 17 }, - /* 3946 */ { MAD_F(0x079c9d8a) /* 0.475736181 */, 17 }, - /* 3947 */ { MAD_F(0x079d461b) /* 0.475896936 */, 17 }, - /* 3948 */ { MAD_F(0x079deeaf) /* 0.476057705 */, 17 }, - /* 3949 */ { MAD_F(0x079e9747) /* 0.476218488 */, 17 }, - /* 3950 */ { MAD_F(0x079f3fe2) /* 0.476379285 */, 17 }, - /* 3951 */ { MAD_F(0x079fe881) /* 0.476540095 */, 17 }, - - /* 3952 */ { MAD_F(0x07a09124) /* 0.476700918 */, 17 }, - /* 3953 */ { MAD_F(0x07a139ca) /* 0.476861755 */, 17 }, - /* 3954 */ { MAD_F(0x07a1e274) /* 0.477022606 */, 17 }, - /* 3955 */ { MAD_F(0x07a28b22) /* 0.477183470 */, 17 }, - /* 3956 */ { MAD_F(0x07a333d3) /* 0.477344348 */, 17 }, - /* 3957 */ { MAD_F(0x07a3dc88) /* 0.477505239 */, 17 }, - /* 3958 */ { MAD_F(0x07a48541) /* 0.477666144 */, 17 }, - /* 3959 */ { MAD_F(0x07a52dfd) /* 0.477827062 */, 17 }, - /* 3960 */ { MAD_F(0x07a5d6bd) /* 0.477987994 */, 17 }, - /* 3961 */ { MAD_F(0x07a67f80) /* 0.478148940 */, 17 }, - /* 3962 */ { MAD_F(0x07a72847) /* 0.478309899 */, 17 }, - /* 3963 */ { MAD_F(0x07a7d112) /* 0.478470871 */, 17 }, - /* 3964 */ { MAD_F(0x07a879e1) /* 0.478631857 */, 17 }, - /* 3965 */ { MAD_F(0x07a922b3) /* 0.478792857 */, 17 }, - /* 3966 */ { MAD_F(0x07a9cb88) /* 0.478953870 */, 17 }, - /* 3967 */ { MAD_F(0x07aa7462) /* 0.479114897 */, 17 }, - - /* 3968 */ { MAD_F(0x07ab1d3e) /* 0.479275937 */, 17 }, - /* 3969 */ { MAD_F(0x07abc61f) /* 0.479436991 */, 17 }, - /* 3970 */ { MAD_F(0x07ac6f03) /* 0.479598058 */, 17 }, - /* 3971 */ { MAD_F(0x07ad17eb) /* 0.479759139 */, 17 }, - /* 3972 */ { MAD_F(0x07adc0d6) /* 0.479920233 */, 17 }, - /* 3973 */ { MAD_F(0x07ae69c6) /* 0.480081341 */, 17 }, - /* 3974 */ { MAD_F(0x07af12b8) /* 0.480242463 */, 17 }, - /* 3975 */ { MAD_F(0x07afbbaf) /* 0.480403598 */, 17 }, - /* 3976 */ { MAD_F(0x07b064a8) /* 0.480564746 */, 17 }, - /* 3977 */ { MAD_F(0x07b10da6) /* 0.480725908 */, 17 }, - /* 3978 */ { MAD_F(0x07b1b6a7) /* 0.480887083 */, 17 }, - /* 3979 */ { MAD_F(0x07b25fac) /* 0.481048272 */, 17 }, - /* 3980 */ { MAD_F(0x07b308b5) /* 0.481209475 */, 17 }, - /* 3981 */ { MAD_F(0x07b3b1c1) /* 0.481370691 */, 17 }, - /* 3982 */ { MAD_F(0x07b45ad0) /* 0.481531920 */, 17 }, - /* 3983 */ { MAD_F(0x07b503e4) /* 0.481693163 */, 17 }, - - /* 3984 */ { MAD_F(0x07b5acfb) /* 0.481854420 */, 17 }, - /* 3985 */ { MAD_F(0x07b65615) /* 0.482015690 */, 17 }, - /* 3986 */ { MAD_F(0x07b6ff33) /* 0.482176973 */, 17 }, - /* 3987 */ { MAD_F(0x07b7a855) /* 0.482338270 */, 17 }, - /* 3988 */ { MAD_F(0x07b8517b) /* 0.482499580 */, 17 }, - /* 3989 */ { MAD_F(0x07b8faa4) /* 0.482660904 */, 17 }, - /* 3990 */ { MAD_F(0x07b9a3d0) /* 0.482822242 */, 17 }, - /* 3991 */ { MAD_F(0x07ba4d01) /* 0.482983592 */, 17 }, - /* 3992 */ { MAD_F(0x07baf635) /* 0.483144957 */, 17 }, - /* 3993 */ { MAD_F(0x07bb9f6c) /* 0.483306335 */, 17 }, - /* 3994 */ { MAD_F(0x07bc48a7) /* 0.483467726 */, 17 }, - /* 3995 */ { MAD_F(0x07bcf1e6) /* 0.483629131 */, 17 }, - /* 3996 */ { MAD_F(0x07bd9b28) /* 0.483790549 */, 17 }, - /* 3997 */ { MAD_F(0x07be446e) /* 0.483951980 */, 17 }, - /* 3998 */ { MAD_F(0x07beedb8) /* 0.484113426 */, 17 }, - /* 3999 */ { MAD_F(0x07bf9705) /* 0.484274884 */, 17 }, - - /* 4000 */ { MAD_F(0x07c04056) /* 0.484436356 */, 17 }, - /* 4001 */ { MAD_F(0x07c0e9aa) /* 0.484597842 */, 17 }, - /* 4002 */ { MAD_F(0x07c19302) /* 0.484759341 */, 17 }, - /* 4003 */ { MAD_F(0x07c23c5e) /* 0.484920853 */, 17 }, - /* 4004 */ { MAD_F(0x07c2e5bd) /* 0.485082379 */, 17 }, - /* 4005 */ { MAD_F(0x07c38f20) /* 0.485243918 */, 17 }, - /* 4006 */ { MAD_F(0x07c43887) /* 0.485405471 */, 17 }, - /* 4007 */ { MAD_F(0x07c4e1f1) /* 0.485567037 */, 17 }, - /* 4008 */ { MAD_F(0x07c58b5f) /* 0.485728617 */, 17 }, - /* 4009 */ { MAD_F(0x07c634d0) /* 0.485890210 */, 17 }, - /* 4010 */ { MAD_F(0x07c6de45) /* 0.486051817 */, 17 }, - /* 4011 */ { MAD_F(0x07c787bd) /* 0.486213436 */, 17 }, - /* 4012 */ { MAD_F(0x07c83139) /* 0.486375070 */, 17 }, - /* 4013 */ { MAD_F(0x07c8dab9) /* 0.486536717 */, 17 }, - /* 4014 */ { MAD_F(0x07c9843c) /* 0.486698377 */, 17 }, - /* 4015 */ { MAD_F(0x07ca2dc3) /* 0.486860051 */, 17 }, - - /* 4016 */ { MAD_F(0x07cad74e) /* 0.487021738 */, 17 }, - /* 4017 */ { MAD_F(0x07cb80dc) /* 0.487183438 */, 17 }, - /* 4018 */ { MAD_F(0x07cc2a6e) /* 0.487345152 */, 17 }, - /* 4019 */ { MAD_F(0x07ccd403) /* 0.487506879 */, 17 }, - /* 4020 */ { MAD_F(0x07cd7d9c) /* 0.487668620 */, 17 }, - /* 4021 */ { MAD_F(0x07ce2739) /* 0.487830374 */, 17 }, - /* 4022 */ { MAD_F(0x07ced0d9) /* 0.487992142 */, 17 }, - /* 4023 */ { MAD_F(0x07cf7a7d) /* 0.488153923 */, 17 }, - /* 4024 */ { MAD_F(0x07d02424) /* 0.488315717 */, 17 }, - /* 4025 */ { MAD_F(0x07d0cdcf) /* 0.488477525 */, 17 }, - /* 4026 */ { MAD_F(0x07d1777e) /* 0.488639346 */, 17 }, - /* 4027 */ { MAD_F(0x07d22130) /* 0.488801181 */, 17 }, - /* 4028 */ { MAD_F(0x07d2cae5) /* 0.488963029 */, 17 }, - /* 4029 */ { MAD_F(0x07d3749f) /* 0.489124890 */, 17 }, - /* 4030 */ { MAD_F(0x07d41e5c) /* 0.489286765 */, 17 }, - /* 4031 */ { MAD_F(0x07d4c81c) /* 0.489448653 */, 17 }, - - /* 4032 */ { MAD_F(0x07d571e0) /* 0.489610555 */, 17 }, - /* 4033 */ { MAD_F(0x07d61ba8) /* 0.489772470 */, 17 }, - /* 4034 */ { MAD_F(0x07d6c573) /* 0.489934398 */, 17 }, - /* 4035 */ { MAD_F(0x07d76f42) /* 0.490096340 */, 17 }, - /* 4036 */ { MAD_F(0x07d81915) /* 0.490258295 */, 17 }, - /* 4037 */ { MAD_F(0x07d8c2eb) /* 0.490420263 */, 17 }, - /* 4038 */ { MAD_F(0x07d96cc4) /* 0.490582245 */, 17 }, - /* 4039 */ { MAD_F(0x07da16a2) /* 0.490744240 */, 17 }, - /* 4040 */ { MAD_F(0x07dac083) /* 0.490906249 */, 17 }, - /* 4041 */ { MAD_F(0x07db6a67) /* 0.491068271 */, 17 }, - /* 4042 */ { MAD_F(0x07dc144f) /* 0.491230306 */, 17 }, - /* 4043 */ { MAD_F(0x07dcbe3b) /* 0.491392355 */, 17 }, - /* 4044 */ { MAD_F(0x07dd682a) /* 0.491554417 */, 17 }, - /* 4045 */ { MAD_F(0x07de121d) /* 0.491716492 */, 17 }, - /* 4046 */ { MAD_F(0x07debc13) /* 0.491878581 */, 17 }, - /* 4047 */ { MAD_F(0x07df660d) /* 0.492040683 */, 17 }, - - /* 4048 */ { MAD_F(0x07e0100a) /* 0.492202799 */, 17 }, - /* 4049 */ { MAD_F(0x07e0ba0c) /* 0.492364928 */, 17 }, - /* 4050 */ { MAD_F(0x07e16410) /* 0.492527070 */, 17 }, - /* 4051 */ { MAD_F(0x07e20e19) /* 0.492689225 */, 17 }, - /* 4052 */ { MAD_F(0x07e2b824) /* 0.492851394 */, 17 }, - /* 4053 */ { MAD_F(0x07e36234) /* 0.493013576 */, 17 }, - /* 4054 */ { MAD_F(0x07e40c47) /* 0.493175772 */, 17 }, - /* 4055 */ { MAD_F(0x07e4b65e) /* 0.493337981 */, 17 }, - /* 4056 */ { MAD_F(0x07e56078) /* 0.493500203 */, 17 }, - /* 4057 */ { MAD_F(0x07e60a95) /* 0.493662438 */, 17 }, - /* 4058 */ { MAD_F(0x07e6b4b7) /* 0.493824687 */, 17 }, - /* 4059 */ { MAD_F(0x07e75edc) /* 0.493986949 */, 17 }, - /* 4060 */ { MAD_F(0x07e80904) /* 0.494149225 */, 17 }, - /* 4061 */ { MAD_F(0x07e8b330) /* 0.494311514 */, 17 }, - /* 4062 */ { MAD_F(0x07e95d60) /* 0.494473816 */, 17 }, - /* 4063 */ { MAD_F(0x07ea0793) /* 0.494636131 */, 17 }, - - /* 4064 */ { MAD_F(0x07eab1ca) /* 0.494798460 */, 17 }, - /* 4065 */ { MAD_F(0x07eb5c04) /* 0.494960802 */, 17 }, - /* 4066 */ { MAD_F(0x07ec0642) /* 0.495123158 */, 17 }, - /* 4067 */ { MAD_F(0x07ecb084) /* 0.495285526 */, 17 }, - /* 4068 */ { MAD_F(0x07ed5ac9) /* 0.495447908 */, 17 }, - /* 4069 */ { MAD_F(0x07ee0512) /* 0.495610304 */, 17 }, - /* 4070 */ { MAD_F(0x07eeaf5e) /* 0.495772712 */, 17 }, - /* 4071 */ { MAD_F(0x07ef59ae) /* 0.495935134 */, 17 }, - /* 4072 */ { MAD_F(0x07f00401) /* 0.496097570 */, 17 }, - /* 4073 */ { MAD_F(0x07f0ae58) /* 0.496260018 */, 17 }, - /* 4074 */ { MAD_F(0x07f158b3) /* 0.496422480 */, 17 }, - /* 4075 */ { MAD_F(0x07f20311) /* 0.496584955 */, 17 }, - /* 4076 */ { MAD_F(0x07f2ad72) /* 0.496747444 */, 17 }, - /* 4077 */ { MAD_F(0x07f357d8) /* 0.496909945 */, 17 }, - /* 4078 */ { MAD_F(0x07f40240) /* 0.497072460 */, 17 }, - /* 4079 */ { MAD_F(0x07f4acad) /* 0.497234989 */, 17 }, - - /* 4080 */ { MAD_F(0x07f5571d) /* 0.497397530 */, 17 }, - /* 4081 */ { MAD_F(0x07f60190) /* 0.497560085 */, 17 }, - /* 4082 */ { MAD_F(0x07f6ac07) /* 0.497722653 */, 17 }, - /* 4083 */ { MAD_F(0x07f75682) /* 0.497885235 */, 17 }, - /* 4084 */ { MAD_F(0x07f80100) /* 0.498047829 */, 17 }, - /* 4085 */ { MAD_F(0x07f8ab82) /* 0.498210437 */, 17 }, - /* 4086 */ { MAD_F(0x07f95607) /* 0.498373058 */, 17 }, - /* 4087 */ { MAD_F(0x07fa0090) /* 0.498535693 */, 17 }, - /* 4088 */ { MAD_F(0x07faab1c) /* 0.498698341 */, 17 }, - /* 4089 */ { MAD_F(0x07fb55ac) /* 0.498861002 */, 17 }, - /* 4090 */ { MAD_F(0x07fc0040) /* 0.499023676 */, 17 }, - /* 4091 */ { MAD_F(0x07fcaad7) /* 0.499186364 */, 17 }, - /* 4092 */ { MAD_F(0x07fd5572) /* 0.499349064 */, 17 }, - /* 4093 */ { MAD_F(0x07fe0010) /* 0.499511778 */, 17 }, - /* 4094 */ { MAD_F(0x07feaab2) /* 0.499674506 */, 17 }, - /* 4095 */ { MAD_F(0x07ff5557) /* 0.499837246 */, 17 }, - - /* 4096 */ { MAD_F(0x04000000) /* 0.250000000 */, 18 }, - /* 4097 */ { MAD_F(0x04005556) /* 0.250081384 */, 18 }, - /* 4098 */ { MAD_F(0x0400aaae) /* 0.250162774 */, 18 }, - /* 4099 */ { MAD_F(0x04010008) /* 0.250244170 */, 18 }, - /* 4100 */ { MAD_F(0x04015563) /* 0.250325574 */, 18 }, - /* 4101 */ { MAD_F(0x0401aac1) /* 0.250406984 */, 18 }, - /* 4102 */ { MAD_F(0x04020020) /* 0.250488400 */, 18 }, - /* 4103 */ { MAD_F(0x04025581) /* 0.250569824 */, 18 }, - /* 4104 */ { MAD_F(0x0402aae3) /* 0.250651254 */, 18 }, - /* 4105 */ { MAD_F(0x04030048) /* 0.250732690 */, 18 }, - /* 4106 */ { MAD_F(0x040355ae) /* 0.250814133 */, 18 }, - /* 4107 */ { MAD_F(0x0403ab16) /* 0.250895583 */, 18 }, - /* 4108 */ { MAD_F(0x04040080) /* 0.250977039 */, 18 }, - /* 4109 */ { MAD_F(0x040455eb) /* 0.251058502 */, 18 }, - /* 4110 */ { MAD_F(0x0404ab59) /* 0.251139971 */, 18 }, - /* 4111 */ { MAD_F(0x040500c8) /* 0.251221448 */, 18 }, - - /* 4112 */ { MAD_F(0x04055638) /* 0.251302930 */, 18 }, - /* 4113 */ { MAD_F(0x0405abab) /* 0.251384420 */, 18 }, - /* 4114 */ { MAD_F(0x0406011f) /* 0.251465916 */, 18 }, - /* 4115 */ { MAD_F(0x04065696) /* 0.251547418 */, 18 }, - /* 4116 */ { MAD_F(0x0406ac0e) /* 0.251628927 */, 18 }, - /* 4117 */ { MAD_F(0x04070187) /* 0.251710443 */, 18 }, - /* 4118 */ { MAD_F(0x04075703) /* 0.251791965 */, 18 }, - /* 4119 */ { MAD_F(0x0407ac80) /* 0.251873494 */, 18 }, - /* 4120 */ { MAD_F(0x040801ff) /* 0.251955030 */, 18 }, - /* 4121 */ { MAD_F(0x04085780) /* 0.252036572 */, 18 }, - /* 4122 */ { MAD_F(0x0408ad02) /* 0.252118121 */, 18 }, - /* 4123 */ { MAD_F(0x04090287) /* 0.252199676 */, 18 }, - /* 4124 */ { MAD_F(0x0409580d) /* 0.252281238 */, 18 }, - /* 4125 */ { MAD_F(0x0409ad95) /* 0.252362807 */, 18 }, - /* 4126 */ { MAD_F(0x040a031e) /* 0.252444382 */, 18 }, - /* 4127 */ { MAD_F(0x040a58aa) /* 0.252525963 */, 18 }, - - /* 4128 */ { MAD_F(0x040aae37) /* 0.252607552 */, 18 }, - /* 4129 */ { MAD_F(0x040b03c6) /* 0.252689147 */, 18 }, - /* 4130 */ { MAD_F(0x040b5957) /* 0.252770748 */, 18 }, - /* 4131 */ { MAD_F(0x040baee9) /* 0.252852356 */, 18 }, - /* 4132 */ { MAD_F(0x040c047e) /* 0.252933971 */, 18 }, - /* 4133 */ { MAD_F(0x040c5a14) /* 0.253015592 */, 18 }, - /* 4134 */ { MAD_F(0x040cafab) /* 0.253097220 */, 18 }, - /* 4135 */ { MAD_F(0x040d0545) /* 0.253178854 */, 18 }, - /* 4136 */ { MAD_F(0x040d5ae0) /* 0.253260495 */, 18 }, - /* 4137 */ { MAD_F(0x040db07d) /* 0.253342143 */, 18 }, - /* 4138 */ { MAD_F(0x040e061c) /* 0.253423797 */, 18 }, - /* 4139 */ { MAD_F(0x040e5bbd) /* 0.253505457 */, 18 }, - /* 4140 */ { MAD_F(0x040eb15f) /* 0.253587125 */, 18 }, - /* 4141 */ { MAD_F(0x040f0703) /* 0.253668799 */, 18 }, - /* 4142 */ { MAD_F(0x040f5ca9) /* 0.253750479 */, 18 }, - /* 4143 */ { MAD_F(0x040fb251) /* 0.253832166 */, 18 }, - - /* 4144 */ { MAD_F(0x041007fa) /* 0.253913860 */, 18 }, - /* 4145 */ { MAD_F(0x04105da6) /* 0.253995560 */, 18 }, - /* 4146 */ { MAD_F(0x0410b353) /* 0.254077266 */, 18 }, - /* 4147 */ { MAD_F(0x04110901) /* 0.254158980 */, 18 }, - /* 4148 */ { MAD_F(0x04115eb2) /* 0.254240700 */, 18 }, - /* 4149 */ { MAD_F(0x0411b464) /* 0.254322426 */, 18 }, - /* 4150 */ { MAD_F(0x04120a18) /* 0.254404159 */, 18 }, - /* 4151 */ { MAD_F(0x04125fce) /* 0.254485899 */, 18 }, - /* 4152 */ { MAD_F(0x0412b586) /* 0.254567645 */, 18 }, - /* 4153 */ { MAD_F(0x04130b3f) /* 0.254649397 */, 18 }, - /* 4154 */ { MAD_F(0x041360fa) /* 0.254731157 */, 18 }, - /* 4155 */ { MAD_F(0x0413b6b7) /* 0.254812922 */, 18 }, - /* 4156 */ { MAD_F(0x04140c75) /* 0.254894695 */, 18 }, - /* 4157 */ { MAD_F(0x04146236) /* 0.254976474 */, 18 }, - /* 4158 */ { MAD_F(0x0414b7f8) /* 0.255058259 */, 18 }, - /* 4159 */ { MAD_F(0x04150dbc) /* 0.255140051 */, 18 }, - - /* 4160 */ { MAD_F(0x04156381) /* 0.255221850 */, 18 }, - /* 4161 */ { MAD_F(0x0415b949) /* 0.255303655 */, 18 }, - /* 4162 */ { MAD_F(0x04160f12) /* 0.255385467 */, 18 }, - /* 4163 */ { MAD_F(0x041664dd) /* 0.255467285 */, 18 }, - /* 4164 */ { MAD_F(0x0416baaa) /* 0.255549110 */, 18 }, - /* 4165 */ { MAD_F(0x04171078) /* 0.255630941 */, 18 }, - /* 4166 */ { MAD_F(0x04176648) /* 0.255712779 */, 18 }, - /* 4167 */ { MAD_F(0x0417bc1a) /* 0.255794624 */, 18 }, - /* 4168 */ { MAD_F(0x041811ee) /* 0.255876475 */, 18 }, - /* 4169 */ { MAD_F(0x041867c3) /* 0.255958332 */, 18 }, - /* 4170 */ { MAD_F(0x0418bd9b) /* 0.256040196 */, 18 }, - /* 4171 */ { MAD_F(0x04191374) /* 0.256122067 */, 18 }, - /* 4172 */ { MAD_F(0x0419694e) /* 0.256203944 */, 18 }, - /* 4173 */ { MAD_F(0x0419bf2b) /* 0.256285828 */, 18 }, - /* 4174 */ { MAD_F(0x041a1509) /* 0.256367718 */, 18 }, - /* 4175 */ { MAD_F(0x041a6ae9) /* 0.256449615 */, 18 }, - - /* 4176 */ { MAD_F(0x041ac0cb) /* 0.256531518 */, 18 }, - /* 4177 */ { MAD_F(0x041b16ae) /* 0.256613428 */, 18 }, - /* 4178 */ { MAD_F(0x041b6c94) /* 0.256695344 */, 18 }, - /* 4179 */ { MAD_F(0x041bc27b) /* 0.256777267 */, 18 }, - /* 4180 */ { MAD_F(0x041c1863) /* 0.256859197 */, 18 }, - /* 4181 */ { MAD_F(0x041c6e4e) /* 0.256941133 */, 18 }, - /* 4182 */ { MAD_F(0x041cc43a) /* 0.257023076 */, 18 }, - /* 4183 */ { MAD_F(0x041d1a28) /* 0.257105025 */, 18 }, - /* 4184 */ { MAD_F(0x041d7018) /* 0.257186980 */, 18 }, - /* 4185 */ { MAD_F(0x041dc60a) /* 0.257268942 */, 18 }, - /* 4186 */ { MAD_F(0x041e1bfd) /* 0.257350911 */, 18 }, - /* 4187 */ { MAD_F(0x041e71f2) /* 0.257432886 */, 18 }, - /* 4188 */ { MAD_F(0x041ec7e9) /* 0.257514868 */, 18 }, - /* 4189 */ { MAD_F(0x041f1de1) /* 0.257596856 */, 18 }, - /* 4190 */ { MAD_F(0x041f73dc) /* 0.257678851 */, 18 }, - /* 4191 */ { MAD_F(0x041fc9d8) /* 0.257760852 */, 18 }, - - /* 4192 */ { MAD_F(0x04201fd5) /* 0.257842860 */, 18 }, - /* 4193 */ { MAD_F(0x042075d5) /* 0.257924875 */, 18 }, - /* 4194 */ { MAD_F(0x0420cbd6) /* 0.258006895 */, 18 }, - /* 4195 */ { MAD_F(0x042121d9) /* 0.258088923 */, 18 }, - /* 4196 */ { MAD_F(0x042177de) /* 0.258170957 */, 18 }, - /* 4197 */ { MAD_F(0x0421cde5) /* 0.258252997 */, 18 }, - /* 4198 */ { MAD_F(0x042223ed) /* 0.258335044 */, 18 }, - /* 4199 */ { MAD_F(0x042279f7) /* 0.258417097 */, 18 }, - /* 4200 */ { MAD_F(0x0422d003) /* 0.258499157 */, 18 }, - /* 4201 */ { MAD_F(0x04232611) /* 0.258581224 */, 18 }, - /* 4202 */ { MAD_F(0x04237c20) /* 0.258663297 */, 18 }, - /* 4203 */ { MAD_F(0x0423d231) /* 0.258745376 */, 18 }, - /* 4204 */ { MAD_F(0x04242844) /* 0.258827462 */, 18 }, - /* 4205 */ { MAD_F(0x04247e58) /* 0.258909555 */, 18 }, - /* 4206 */ { MAD_F(0x0424d46e) /* 0.258991654 */, 18 }, - /* 4207 */ { MAD_F(0x04252a87) /* 0.259073760 */, 18 }, - - /* 4208 */ { MAD_F(0x042580a0) /* 0.259155872 */, 18 }, - /* 4209 */ { MAD_F(0x0425d6bc) /* 0.259237990 */, 18 }, - /* 4210 */ { MAD_F(0x04262cd9) /* 0.259320115 */, 18 }, - /* 4211 */ { MAD_F(0x042682f8) /* 0.259402247 */, 18 }, - /* 4212 */ { MAD_F(0x0426d919) /* 0.259484385 */, 18 }, - /* 4213 */ { MAD_F(0x04272f3b) /* 0.259566529 */, 18 }, - /* 4214 */ { MAD_F(0x04278560) /* 0.259648680 */, 18 }, - /* 4215 */ { MAD_F(0x0427db86) /* 0.259730838 */, 18 }, - /* 4216 */ { MAD_F(0x042831ad) /* 0.259813002 */, 18 }, - /* 4217 */ { MAD_F(0x042887d7) /* 0.259895173 */, 18 }, - /* 4218 */ { MAD_F(0x0428de02) /* 0.259977350 */, 18 }, - /* 4219 */ { MAD_F(0x0429342f) /* 0.260059533 */, 18 }, - /* 4220 */ { MAD_F(0x04298a5e) /* 0.260141723 */, 18 }, - /* 4221 */ { MAD_F(0x0429e08e) /* 0.260223920 */, 18 }, - /* 4222 */ { MAD_F(0x042a36c0) /* 0.260306123 */, 18 }, - /* 4223 */ { MAD_F(0x042a8cf4) /* 0.260388332 */, 18 }, - - /* 4224 */ { MAD_F(0x042ae32a) /* 0.260470548 */, 18 }, - /* 4225 */ { MAD_F(0x042b3962) /* 0.260552771 */, 18 }, - /* 4226 */ { MAD_F(0x042b8f9b) /* 0.260635000 */, 18 }, - /* 4227 */ { MAD_F(0x042be5d6) /* 0.260717235 */, 18 }, - /* 4228 */ { MAD_F(0x042c3c12) /* 0.260799477 */, 18 }, - /* 4229 */ { MAD_F(0x042c9251) /* 0.260881725 */, 18 }, - /* 4230 */ { MAD_F(0x042ce891) /* 0.260963980 */, 18 }, - /* 4231 */ { MAD_F(0x042d3ed3) /* 0.261046242 */, 18 }, - /* 4232 */ { MAD_F(0x042d9516) /* 0.261128510 */, 18 }, - /* 4233 */ { MAD_F(0x042deb5c) /* 0.261210784 */, 18 }, - /* 4234 */ { MAD_F(0x042e41a3) /* 0.261293065 */, 18 }, - /* 4235 */ { MAD_F(0x042e97ec) /* 0.261375352 */, 18 }, - /* 4236 */ { MAD_F(0x042eee36) /* 0.261457646 */, 18 }, - /* 4237 */ { MAD_F(0x042f4482) /* 0.261539946 */, 18 }, - /* 4238 */ { MAD_F(0x042f9ad1) /* 0.261622253 */, 18 }, - /* 4239 */ { MAD_F(0x042ff120) /* 0.261704566 */, 18 }, - - /* 4240 */ { MAD_F(0x04304772) /* 0.261786886 */, 18 }, - /* 4241 */ { MAD_F(0x04309dc5) /* 0.261869212 */, 18 }, - /* 4242 */ { MAD_F(0x0430f41a) /* 0.261951545 */, 18 }, - /* 4243 */ { MAD_F(0x04314a71) /* 0.262033884 */, 18 }, - /* 4244 */ { MAD_F(0x0431a0c9) /* 0.262116229 */, 18 }, - /* 4245 */ { MAD_F(0x0431f723) /* 0.262198581 */, 18 }, - /* 4246 */ { MAD_F(0x04324d7f) /* 0.262280940 */, 18 }, - /* 4247 */ { MAD_F(0x0432a3dd) /* 0.262363305 */, 18 }, - /* 4248 */ { MAD_F(0x0432fa3d) /* 0.262445676 */, 18 }, - /* 4249 */ { MAD_F(0x0433509e) /* 0.262528054 */, 18 }, - /* 4250 */ { MAD_F(0x0433a701) /* 0.262610438 */, 18 }, - /* 4251 */ { MAD_F(0x0433fd65) /* 0.262692829 */, 18 }, - /* 4252 */ { MAD_F(0x043453cc) /* 0.262775227 */, 18 }, - /* 4253 */ { MAD_F(0x0434aa34) /* 0.262857630 */, 18 }, - /* 4254 */ { MAD_F(0x0435009d) /* 0.262940040 */, 18 }, - /* 4255 */ { MAD_F(0x04355709) /* 0.263022457 */, 18 }, - - /* 4256 */ { MAD_F(0x0435ad76) /* 0.263104880 */, 18 }, - /* 4257 */ { MAD_F(0x043603e5) /* 0.263187310 */, 18 }, - /* 4258 */ { MAD_F(0x04365a56) /* 0.263269746 */, 18 }, - /* 4259 */ { MAD_F(0x0436b0c9) /* 0.263352188 */, 18 }, - /* 4260 */ { MAD_F(0x0437073d) /* 0.263434637 */, 18 }, - /* 4261 */ { MAD_F(0x04375db3) /* 0.263517093 */, 18 }, - /* 4262 */ { MAD_F(0x0437b42a) /* 0.263599554 */, 18 }, - /* 4263 */ { MAD_F(0x04380aa4) /* 0.263682023 */, 18 }, - /* 4264 */ { MAD_F(0x0438611f) /* 0.263764497 */, 18 }, - /* 4265 */ { MAD_F(0x0438b79c) /* 0.263846979 */, 18 }, - /* 4266 */ { MAD_F(0x04390e1a) /* 0.263929466 */, 18 }, - /* 4267 */ { MAD_F(0x0439649b) /* 0.264011960 */, 18 }, - /* 4268 */ { MAD_F(0x0439bb1d) /* 0.264094461 */, 18 }, - /* 4269 */ { MAD_F(0x043a11a1) /* 0.264176968 */, 18 }, - /* 4270 */ { MAD_F(0x043a6826) /* 0.264259481 */, 18 }, - /* 4271 */ { MAD_F(0x043abead) /* 0.264342001 */, 18 }, - - /* 4272 */ { MAD_F(0x043b1536) /* 0.264424527 */, 18 }, - /* 4273 */ { MAD_F(0x043b6bc1) /* 0.264507060 */, 18 }, - /* 4274 */ { MAD_F(0x043bc24d) /* 0.264589599 */, 18 }, - /* 4275 */ { MAD_F(0x043c18dc) /* 0.264672145 */, 18 }, - /* 4276 */ { MAD_F(0x043c6f6c) /* 0.264754697 */, 18 }, - /* 4277 */ { MAD_F(0x043cc5fd) /* 0.264837255 */, 18 }, - /* 4278 */ { MAD_F(0x043d1c91) /* 0.264919820 */, 18 }, - /* 4279 */ { MAD_F(0x043d7326) /* 0.265002392 */, 18 }, - /* 4280 */ { MAD_F(0x043dc9bc) /* 0.265084969 */, 18 }, - /* 4281 */ { MAD_F(0x043e2055) /* 0.265167554 */, 18 }, - /* 4282 */ { MAD_F(0x043e76ef) /* 0.265250144 */, 18 }, - /* 4283 */ { MAD_F(0x043ecd8b) /* 0.265332741 */, 18 }, - /* 4284 */ { MAD_F(0x043f2429) /* 0.265415345 */, 18 }, - /* 4285 */ { MAD_F(0x043f7ac8) /* 0.265497955 */, 18 }, - /* 4286 */ { MAD_F(0x043fd169) /* 0.265580571 */, 18 }, - /* 4287 */ { MAD_F(0x0440280c) /* 0.265663194 */, 18 }, - - /* 4288 */ { MAD_F(0x04407eb1) /* 0.265745823 */, 18 }, - /* 4289 */ { MAD_F(0x0440d557) /* 0.265828459 */, 18 }, - /* 4290 */ { MAD_F(0x04412bff) /* 0.265911101 */, 18 }, - /* 4291 */ { MAD_F(0x044182a9) /* 0.265993749 */, 18 }, - /* 4292 */ { MAD_F(0x0441d955) /* 0.266076404 */, 18 }, - /* 4293 */ { MAD_F(0x04423002) /* 0.266159065 */, 18 }, - /* 4294 */ { MAD_F(0x044286b1) /* 0.266241733 */, 18 }, - /* 4295 */ { MAD_F(0x0442dd61) /* 0.266324407 */, 18 }, - /* 4296 */ { MAD_F(0x04433414) /* 0.266407088 */, 18 }, - /* 4297 */ { MAD_F(0x04438ac8) /* 0.266489775 */, 18 }, - /* 4298 */ { MAD_F(0x0443e17e) /* 0.266572468 */, 18 }, - /* 4299 */ { MAD_F(0x04443835) /* 0.266655168 */, 18 }, - /* 4300 */ { MAD_F(0x04448eef) /* 0.266737874 */, 18 }, - /* 4301 */ { MAD_F(0x0444e5aa) /* 0.266820587 */, 18 }, - /* 4302 */ { MAD_F(0x04453c66) /* 0.266903306 */, 18 }, - /* 4303 */ { MAD_F(0x04459325) /* 0.266986031 */, 18 }, - - /* 4304 */ { MAD_F(0x0445e9e5) /* 0.267068763 */, 18 }, - /* 4305 */ { MAD_F(0x044640a7) /* 0.267151501 */, 18 }, - /* 4306 */ { MAD_F(0x0446976a) /* 0.267234246 */, 18 }, - /* 4307 */ { MAD_F(0x0446ee30) /* 0.267316997 */, 18 }, - /* 4308 */ { MAD_F(0x044744f7) /* 0.267399755 */, 18 }, - /* 4309 */ { MAD_F(0x04479bc0) /* 0.267482518 */, 18 }, - /* 4310 */ { MAD_F(0x0447f28a) /* 0.267565289 */, 18 }, - /* 4311 */ { MAD_F(0x04484956) /* 0.267648065 */, 18 }, - /* 4312 */ { MAD_F(0x0448a024) /* 0.267730848 */, 18 }, - /* 4313 */ { MAD_F(0x0448f6f4) /* 0.267813638 */, 18 }, - /* 4314 */ { MAD_F(0x04494dc5) /* 0.267896434 */, 18 }, - /* 4315 */ { MAD_F(0x0449a498) /* 0.267979236 */, 18 }, - /* 4316 */ { MAD_F(0x0449fb6d) /* 0.268062045 */, 18 }, - /* 4317 */ { MAD_F(0x044a5243) /* 0.268144860 */, 18 }, - /* 4318 */ { MAD_F(0x044aa91c) /* 0.268227681 */, 18 }, - /* 4319 */ { MAD_F(0x044afff6) /* 0.268310509 */, 18 }, - - /* 4320 */ { MAD_F(0x044b56d1) /* 0.268393343 */, 18 }, - /* 4321 */ { MAD_F(0x044badaf) /* 0.268476184 */, 18 }, - /* 4322 */ { MAD_F(0x044c048e) /* 0.268559031 */, 18 }, - /* 4323 */ { MAD_F(0x044c5b6f) /* 0.268641885 */, 18 }, - /* 4324 */ { MAD_F(0x044cb251) /* 0.268724744 */, 18 }, - /* 4325 */ { MAD_F(0x044d0935) /* 0.268807611 */, 18 }, - /* 4326 */ { MAD_F(0x044d601b) /* 0.268890483 */, 18 }, - /* 4327 */ { MAD_F(0x044db703) /* 0.268973362 */, 18 }, - /* 4328 */ { MAD_F(0x044e0dec) /* 0.269056248 */, 18 }, - /* 4329 */ { MAD_F(0x044e64d7) /* 0.269139139 */, 18 }, - /* 4330 */ { MAD_F(0x044ebbc4) /* 0.269222037 */, 18 }, - /* 4331 */ { MAD_F(0x044f12b3) /* 0.269304942 */, 18 }, - /* 4332 */ { MAD_F(0x044f69a3) /* 0.269387853 */, 18 }, - /* 4333 */ { MAD_F(0x044fc095) /* 0.269470770 */, 18 }, - /* 4334 */ { MAD_F(0x04501788) /* 0.269553694 */, 18 }, - /* 4335 */ { MAD_F(0x04506e7e) /* 0.269636624 */, 18 }, - - /* 4336 */ { MAD_F(0x0450c575) /* 0.269719560 */, 18 }, - /* 4337 */ { MAD_F(0x04511c6e) /* 0.269802503 */, 18 }, - /* 4338 */ { MAD_F(0x04517368) /* 0.269885452 */, 18 }, - /* 4339 */ { MAD_F(0x0451ca64) /* 0.269968408 */, 18 }, - /* 4340 */ { MAD_F(0x04522162) /* 0.270051370 */, 18 }, - /* 4341 */ { MAD_F(0x04527862) /* 0.270134338 */, 18 }, - /* 4342 */ { MAD_F(0x0452cf63) /* 0.270217312 */, 18 }, - /* 4343 */ { MAD_F(0x04532666) /* 0.270300293 */, 18 }, - /* 4344 */ { MAD_F(0x04537d6b) /* 0.270383281 */, 18 }, - /* 4345 */ { MAD_F(0x0453d472) /* 0.270466275 */, 18 }, - /* 4346 */ { MAD_F(0x04542b7a) /* 0.270549275 */, 18 }, - /* 4347 */ { MAD_F(0x04548284) /* 0.270632281 */, 18 }, - /* 4348 */ { MAD_F(0x0454d98f) /* 0.270715294 */, 18 }, - /* 4349 */ { MAD_F(0x0455309c) /* 0.270798313 */, 18 }, - /* 4350 */ { MAD_F(0x045587ab) /* 0.270881339 */, 18 }, - /* 4351 */ { MAD_F(0x0455debc) /* 0.270964371 */, 18 }, - - /* 4352 */ { MAD_F(0x045635cf) /* 0.271047409 */, 18 }, - /* 4353 */ { MAD_F(0x04568ce3) /* 0.271130454 */, 18 }, - /* 4354 */ { MAD_F(0x0456e3f9) /* 0.271213505 */, 18 }, - /* 4355 */ { MAD_F(0x04573b10) /* 0.271296562 */, 18 }, - /* 4356 */ { MAD_F(0x04579229) /* 0.271379626 */, 18 }, - /* 4357 */ { MAD_F(0x0457e944) /* 0.271462696 */, 18 }, - /* 4358 */ { MAD_F(0x04584061) /* 0.271545772 */, 18 }, - /* 4359 */ { MAD_F(0x0458977f) /* 0.271628855 */, 18 }, - /* 4360 */ { MAD_F(0x0458ee9f) /* 0.271711944 */, 18 }, - /* 4361 */ { MAD_F(0x045945c1) /* 0.271795040 */, 18 }, - /* 4362 */ { MAD_F(0x04599ce5) /* 0.271878142 */, 18 }, - /* 4363 */ { MAD_F(0x0459f40a) /* 0.271961250 */, 18 }, - /* 4364 */ { MAD_F(0x045a4b31) /* 0.272044365 */, 18 }, - /* 4365 */ { MAD_F(0x045aa259) /* 0.272127486 */, 18 }, - /* 4366 */ { MAD_F(0x045af984) /* 0.272210613 */, 18 }, - /* 4367 */ { MAD_F(0x045b50b0) /* 0.272293746 */, 18 }, - - /* 4368 */ { MAD_F(0x045ba7dd) /* 0.272376886 */, 18 }, - /* 4369 */ { MAD_F(0x045bff0d) /* 0.272460033 */, 18 }, - /* 4370 */ { MAD_F(0x045c563e) /* 0.272543185 */, 18 }, - /* 4371 */ { MAD_F(0x045cad71) /* 0.272626344 */, 18 }, - /* 4372 */ { MAD_F(0x045d04a5) /* 0.272709510 */, 18 }, - /* 4373 */ { MAD_F(0x045d5bdc) /* 0.272792681 */, 18 }, - /* 4374 */ { MAD_F(0x045db313) /* 0.272875859 */, 18 }, - /* 4375 */ { MAD_F(0x045e0a4d) /* 0.272959044 */, 18 }, - /* 4376 */ { MAD_F(0x045e6188) /* 0.273042234 */, 18 }, - /* 4377 */ { MAD_F(0x045eb8c5) /* 0.273125431 */, 18 }, - /* 4378 */ { MAD_F(0x045f1004) /* 0.273208635 */, 18 }, - /* 4379 */ { MAD_F(0x045f6745) /* 0.273291844 */, 18 }, - /* 4380 */ { MAD_F(0x045fbe87) /* 0.273375060 */, 18 }, - /* 4381 */ { MAD_F(0x046015cb) /* 0.273458283 */, 18 }, - /* 4382 */ { MAD_F(0x04606d10) /* 0.273541511 */, 18 }, - /* 4383 */ { MAD_F(0x0460c457) /* 0.273624747 */, 18 }, - - /* 4384 */ { MAD_F(0x04611ba0) /* 0.273707988 */, 18 }, - /* 4385 */ { MAD_F(0x046172eb) /* 0.273791236 */, 18 }, - /* 4386 */ { MAD_F(0x0461ca37) /* 0.273874490 */, 18 }, - /* 4387 */ { MAD_F(0x04622185) /* 0.273957750 */, 18 }, - /* 4388 */ { MAD_F(0x046278d5) /* 0.274041017 */, 18 }, - /* 4389 */ { MAD_F(0x0462d026) /* 0.274124290 */, 18 }, - /* 4390 */ { MAD_F(0x0463277a) /* 0.274207569 */, 18 }, - /* 4391 */ { MAD_F(0x04637ece) /* 0.274290855 */, 18 }, - /* 4392 */ { MAD_F(0x0463d625) /* 0.274374147 */, 18 }, - /* 4393 */ { MAD_F(0x04642d7d) /* 0.274457445 */, 18 }, - /* 4394 */ { MAD_F(0x046484d7) /* 0.274540749 */, 18 }, - /* 4395 */ { MAD_F(0x0464dc33) /* 0.274624060 */, 18 }, - /* 4396 */ { MAD_F(0x04653390) /* 0.274707378 */, 18 }, - /* 4397 */ { MAD_F(0x04658aef) /* 0.274790701 */, 18 }, - /* 4398 */ { MAD_F(0x0465e250) /* 0.274874031 */, 18 }, - /* 4399 */ { MAD_F(0x046639b2) /* 0.274957367 */, 18 }, - - /* 4400 */ { MAD_F(0x04669116) /* 0.275040710 */, 18 }, - /* 4401 */ { MAD_F(0x0466e87c) /* 0.275124059 */, 18 }, - /* 4402 */ { MAD_F(0x04673fe3) /* 0.275207414 */, 18 }, - /* 4403 */ { MAD_F(0x0467974d) /* 0.275290775 */, 18 }, - /* 4404 */ { MAD_F(0x0467eeb7) /* 0.275374143 */, 18 }, - /* 4405 */ { MAD_F(0x04684624) /* 0.275457517 */, 18 }, - /* 4406 */ { MAD_F(0x04689d92) /* 0.275540897 */, 18 }, - /* 4407 */ { MAD_F(0x0468f502) /* 0.275624284 */, 18 }, - /* 4408 */ { MAD_F(0x04694c74) /* 0.275707677 */, 18 }, - /* 4409 */ { MAD_F(0x0469a3e7) /* 0.275791076 */, 18 }, - /* 4410 */ { MAD_F(0x0469fb5c) /* 0.275874482 */, 18 }, - /* 4411 */ { MAD_F(0x046a52d3) /* 0.275957894 */, 18 }, - /* 4412 */ { MAD_F(0x046aaa4b) /* 0.276041312 */, 18 }, - /* 4413 */ { MAD_F(0x046b01c5) /* 0.276124737 */, 18 }, - /* 4414 */ { MAD_F(0x046b5941) /* 0.276208167 */, 18 }, - /* 4415 */ { MAD_F(0x046bb0bf) /* 0.276291605 */, 18 }, - - /* 4416 */ { MAD_F(0x046c083e) /* 0.276375048 */, 18 }, - /* 4417 */ { MAD_F(0x046c5fbf) /* 0.276458498 */, 18 }, - /* 4418 */ { MAD_F(0x046cb741) /* 0.276541954 */, 18 }, - /* 4419 */ { MAD_F(0x046d0ec5) /* 0.276625416 */, 18 }, - /* 4420 */ { MAD_F(0x046d664b) /* 0.276708885 */, 18 }, - /* 4421 */ { MAD_F(0x046dbdd3) /* 0.276792360 */, 18 }, - /* 4422 */ { MAD_F(0x046e155c) /* 0.276875841 */, 18 }, - /* 4423 */ { MAD_F(0x046e6ce7) /* 0.276959328 */, 18 }, - /* 4424 */ { MAD_F(0x046ec474) /* 0.277042822 */, 18 }, - /* 4425 */ { MAD_F(0x046f1c02) /* 0.277126322 */, 18 }, - /* 4426 */ { MAD_F(0x046f7392) /* 0.277209829 */, 18 }, - /* 4427 */ { MAD_F(0x046fcb24) /* 0.277293341 */, 18 }, - /* 4428 */ { MAD_F(0x047022b8) /* 0.277376860 */, 18 }, - /* 4429 */ { MAD_F(0x04707a4d) /* 0.277460385 */, 18 }, - /* 4430 */ { MAD_F(0x0470d1e4) /* 0.277543917 */, 18 }, - /* 4431 */ { MAD_F(0x0471297c) /* 0.277627455 */, 18 }, - - /* 4432 */ { MAD_F(0x04718116) /* 0.277710999 */, 18 }, - /* 4433 */ { MAD_F(0x0471d8b2) /* 0.277794549 */, 18 }, - /* 4434 */ { MAD_F(0x04723050) /* 0.277878106 */, 18 }, - /* 4435 */ { MAD_F(0x047287ef) /* 0.277961669 */, 18 }, - /* 4436 */ { MAD_F(0x0472df90) /* 0.278045238 */, 18 }, - /* 4437 */ { MAD_F(0x04733733) /* 0.278128813 */, 18 }, - /* 4438 */ { MAD_F(0x04738ed7) /* 0.278212395 */, 18 }, - /* 4439 */ { MAD_F(0x0473e67d) /* 0.278295983 */, 18 }, - /* 4440 */ { MAD_F(0x04743e25) /* 0.278379578 */, 18 }, - /* 4441 */ { MAD_F(0x047495ce) /* 0.278463178 */, 18 }, - /* 4442 */ { MAD_F(0x0474ed79) /* 0.278546785 */, 18 }, - /* 4443 */ { MAD_F(0x04754526) /* 0.278630398 */, 18 }, - /* 4444 */ { MAD_F(0x04759cd4) /* 0.278714018 */, 18 }, - /* 4445 */ { MAD_F(0x0475f484) /* 0.278797643 */, 18 }, - /* 4446 */ { MAD_F(0x04764c36) /* 0.278881275 */, 18 }, - /* 4447 */ { MAD_F(0x0476a3ea) /* 0.278964914 */, 18 }, - - /* 4448 */ { MAD_F(0x0476fb9f) /* 0.279048558 */, 18 }, - /* 4449 */ { MAD_F(0x04775356) /* 0.279132209 */, 18 }, - /* 4450 */ { MAD_F(0x0477ab0e) /* 0.279215866 */, 18 }, - /* 4451 */ { MAD_F(0x047802c8) /* 0.279299529 */, 18 }, - /* 4452 */ { MAD_F(0x04785a84) /* 0.279383199 */, 18 }, - /* 4453 */ { MAD_F(0x0478b242) /* 0.279466875 */, 18 }, - /* 4454 */ { MAD_F(0x04790a01) /* 0.279550557 */, 18 }, - /* 4455 */ { MAD_F(0x047961c2) /* 0.279634245 */, 18 }, - /* 4456 */ { MAD_F(0x0479b984) /* 0.279717940 */, 18 }, - /* 4457 */ { MAD_F(0x047a1149) /* 0.279801641 */, 18 }, - /* 4458 */ { MAD_F(0x047a690f) /* 0.279885348 */, 18 }, - /* 4459 */ { MAD_F(0x047ac0d6) /* 0.279969061 */, 18 }, - /* 4460 */ { MAD_F(0x047b18a0) /* 0.280052781 */, 18 }, - /* 4461 */ { MAD_F(0x047b706b) /* 0.280136507 */, 18 }, - /* 4462 */ { MAD_F(0x047bc837) /* 0.280220239 */, 18 }, - /* 4463 */ { MAD_F(0x047c2006) /* 0.280303978 */, 18 }, - - /* 4464 */ { MAD_F(0x047c77d6) /* 0.280387722 */, 18 }, - /* 4465 */ { MAD_F(0x047ccfa8) /* 0.280471473 */, 18 }, - /* 4466 */ { MAD_F(0x047d277b) /* 0.280555230 */, 18 }, - /* 4467 */ { MAD_F(0x047d7f50) /* 0.280638994 */, 18 }, - /* 4468 */ { MAD_F(0x047dd727) /* 0.280722764 */, 18 }, - /* 4469 */ { MAD_F(0x047e2eff) /* 0.280806540 */, 18 }, - /* 4470 */ { MAD_F(0x047e86d9) /* 0.280890322 */, 18 }, - /* 4471 */ { MAD_F(0x047edeb5) /* 0.280974110 */, 18 }, - /* 4472 */ { MAD_F(0x047f3693) /* 0.281057905 */, 18 }, - /* 4473 */ { MAD_F(0x047f8e72) /* 0.281141706 */, 18 }, - /* 4474 */ { MAD_F(0x047fe653) /* 0.281225513 */, 18 }, - /* 4475 */ { MAD_F(0x04803e35) /* 0.281309326 */, 18 }, - /* 4476 */ { MAD_F(0x04809619) /* 0.281393146 */, 18 }, - /* 4477 */ { MAD_F(0x0480edff) /* 0.281476972 */, 18 }, - /* 4478 */ { MAD_F(0x048145e7) /* 0.281560804 */, 18 }, - /* 4479 */ { MAD_F(0x04819dd0) /* 0.281644643 */, 18 }, - - /* 4480 */ { MAD_F(0x0481f5bb) /* 0.281728487 */, 18 }, - /* 4481 */ { MAD_F(0x04824da7) /* 0.281812338 */, 18 }, - /* 4482 */ { MAD_F(0x0482a595) /* 0.281896195 */, 18 }, - /* 4483 */ { MAD_F(0x0482fd85) /* 0.281980059 */, 18 }, - /* 4484 */ { MAD_F(0x04835577) /* 0.282063928 */, 18 }, - /* 4485 */ { MAD_F(0x0483ad6a) /* 0.282147804 */, 18 }, - /* 4486 */ { MAD_F(0x0484055f) /* 0.282231686 */, 18 }, - /* 4487 */ { MAD_F(0x04845d56) /* 0.282315574 */, 18 }, - /* 4488 */ { MAD_F(0x0484b54e) /* 0.282399469 */, 18 }, - /* 4489 */ { MAD_F(0x04850d48) /* 0.282483370 */, 18 }, - /* 4490 */ { MAD_F(0x04856544) /* 0.282567277 */, 18 }, - /* 4491 */ { MAD_F(0x0485bd41) /* 0.282651190 */, 18 }, - /* 4492 */ { MAD_F(0x04861540) /* 0.282735109 */, 18 }, - /* 4493 */ { MAD_F(0x04866d40) /* 0.282819035 */, 18 }, - /* 4494 */ { MAD_F(0x0486c543) /* 0.282902967 */, 18 }, - /* 4495 */ { MAD_F(0x04871d47) /* 0.282986905 */, 18 }, - - /* 4496 */ { MAD_F(0x0487754c) /* 0.283070849 */, 18 }, - /* 4497 */ { MAD_F(0x0487cd54) /* 0.283154800 */, 18 }, - /* 4498 */ { MAD_F(0x0488255d) /* 0.283238757 */, 18 }, - /* 4499 */ { MAD_F(0x04887d67) /* 0.283322720 */, 18 }, - /* 4500 */ { MAD_F(0x0488d574) /* 0.283406689 */, 18 }, - /* 4501 */ { MAD_F(0x04892d82) /* 0.283490665 */, 18 }, - /* 4502 */ { MAD_F(0x04898591) /* 0.283574646 */, 18 }, - /* 4503 */ { MAD_F(0x0489dda3) /* 0.283658634 */, 18 }, - /* 4504 */ { MAD_F(0x048a35b6) /* 0.283742628 */, 18 }, - /* 4505 */ { MAD_F(0x048a8dca) /* 0.283826629 */, 18 }, - /* 4506 */ { MAD_F(0x048ae5e1) /* 0.283910635 */, 18 }, - /* 4507 */ { MAD_F(0x048b3df9) /* 0.283994648 */, 18 }, - /* 4508 */ { MAD_F(0x048b9612) /* 0.284078667 */, 18 }, - /* 4509 */ { MAD_F(0x048bee2e) /* 0.284162692 */, 18 }, - /* 4510 */ { MAD_F(0x048c464b) /* 0.284246723 */, 18 }, - /* 4511 */ { MAD_F(0x048c9e69) /* 0.284330761 */, 18 }, - - /* 4512 */ { MAD_F(0x048cf68a) /* 0.284414805 */, 18 }, - /* 4513 */ { MAD_F(0x048d4eac) /* 0.284498855 */, 18 }, - /* 4514 */ { MAD_F(0x048da6cf) /* 0.284582911 */, 18 }, - /* 4515 */ { MAD_F(0x048dfef5) /* 0.284666974 */, 18 }, - /* 4516 */ { MAD_F(0x048e571c) /* 0.284751042 */, 18 }, - /* 4517 */ { MAD_F(0x048eaf44) /* 0.284835117 */, 18 }, - /* 4518 */ { MAD_F(0x048f076f) /* 0.284919198 */, 18 }, - /* 4519 */ { MAD_F(0x048f5f9b) /* 0.285003285 */, 18 }, - /* 4520 */ { MAD_F(0x048fb7c8) /* 0.285087379 */, 18 }, - /* 4521 */ { MAD_F(0x04900ff8) /* 0.285171479 */, 18 }, - /* 4522 */ { MAD_F(0x04906829) /* 0.285255584 */, 18 }, - /* 4523 */ { MAD_F(0x0490c05b) /* 0.285339697 */, 18 }, - /* 4524 */ { MAD_F(0x04911890) /* 0.285423815 */, 18 }, - /* 4525 */ { MAD_F(0x049170c6) /* 0.285507939 */, 18 }, - /* 4526 */ { MAD_F(0x0491c8fd) /* 0.285592070 */, 18 }, - /* 4527 */ { MAD_F(0x04922137) /* 0.285676207 */, 18 }, - - /* 4528 */ { MAD_F(0x04927972) /* 0.285760350 */, 18 }, - /* 4529 */ { MAD_F(0x0492d1ae) /* 0.285844499 */, 18 }, - /* 4530 */ { MAD_F(0x049329ed) /* 0.285928655 */, 18 }, - /* 4531 */ { MAD_F(0x0493822c) /* 0.286012816 */, 18 }, - /* 4532 */ { MAD_F(0x0493da6e) /* 0.286096984 */, 18 }, - /* 4533 */ { MAD_F(0x049432b1) /* 0.286181158 */, 18 }, - /* 4534 */ { MAD_F(0x04948af6) /* 0.286265338 */, 18 }, - /* 4535 */ { MAD_F(0x0494e33d) /* 0.286349525 */, 18 }, - /* 4536 */ { MAD_F(0x04953b85) /* 0.286433717 */, 18 }, - /* 4537 */ { MAD_F(0x049593cf) /* 0.286517916 */, 18 }, - /* 4538 */ { MAD_F(0x0495ec1b) /* 0.286602121 */, 18 }, - /* 4539 */ { MAD_F(0x04964468) /* 0.286686332 */, 18 }, - /* 4540 */ { MAD_F(0x04969cb7) /* 0.286770550 */, 18 }, - /* 4541 */ { MAD_F(0x0496f508) /* 0.286854773 */, 18 }, - /* 4542 */ { MAD_F(0x04974d5a) /* 0.286939003 */, 18 }, - /* 4543 */ { MAD_F(0x0497a5ae) /* 0.287023239 */, 18 }, - - /* 4544 */ { MAD_F(0x0497fe03) /* 0.287107481 */, 18 }, - /* 4545 */ { MAD_F(0x0498565a) /* 0.287191729 */, 18 }, - /* 4546 */ { MAD_F(0x0498aeb3) /* 0.287275983 */, 18 }, - /* 4547 */ { MAD_F(0x0499070e) /* 0.287360244 */, 18 }, - /* 4548 */ { MAD_F(0x04995f6a) /* 0.287444511 */, 18 }, - /* 4549 */ { MAD_F(0x0499b7c8) /* 0.287528784 */, 18 }, - /* 4550 */ { MAD_F(0x049a1027) /* 0.287613063 */, 18 }, - /* 4551 */ { MAD_F(0x049a6889) /* 0.287697348 */, 18 }, - /* 4552 */ { MAD_F(0x049ac0eb) /* 0.287781640 */, 18 }, - /* 4553 */ { MAD_F(0x049b1950) /* 0.287865937 */, 18 }, - /* 4554 */ { MAD_F(0x049b71b6) /* 0.287950241 */, 18 }, - /* 4555 */ { MAD_F(0x049bca1e) /* 0.288034551 */, 18 }, - /* 4556 */ { MAD_F(0x049c2287) /* 0.288118867 */, 18 }, - /* 4557 */ { MAD_F(0x049c7af2) /* 0.288203190 */, 18 }, - /* 4558 */ { MAD_F(0x049cd35f) /* 0.288287518 */, 18 }, - /* 4559 */ { MAD_F(0x049d2bce) /* 0.288371853 */, 18 }, - - /* 4560 */ { MAD_F(0x049d843e) /* 0.288456194 */, 18 }, - /* 4561 */ { MAD_F(0x049ddcaf) /* 0.288540541 */, 18 }, - /* 4562 */ { MAD_F(0x049e3523) /* 0.288624894 */, 18 }, - /* 4563 */ { MAD_F(0x049e8d98) /* 0.288709253 */, 18 }, - /* 4564 */ { MAD_F(0x049ee60e) /* 0.288793619 */, 18 }, - /* 4565 */ { MAD_F(0x049f3e87) /* 0.288877990 */, 18 }, - /* 4566 */ { MAD_F(0x049f9701) /* 0.288962368 */, 18 }, - /* 4567 */ { MAD_F(0x049fef7c) /* 0.289046752 */, 18 }, - /* 4568 */ { MAD_F(0x04a047fa) /* 0.289131142 */, 18 }, - /* 4569 */ { MAD_F(0x04a0a079) /* 0.289215538 */, 18 }, - /* 4570 */ { MAD_F(0x04a0f8f9) /* 0.289299941 */, 18 }, - /* 4571 */ { MAD_F(0x04a1517c) /* 0.289384349 */, 18 }, - /* 4572 */ { MAD_F(0x04a1a9ff) /* 0.289468764 */, 18 }, - /* 4573 */ { MAD_F(0x04a20285) /* 0.289553185 */, 18 }, - /* 4574 */ { MAD_F(0x04a25b0c) /* 0.289637612 */, 18 }, - /* 4575 */ { MAD_F(0x04a2b395) /* 0.289722045 */, 18 }, - - /* 4576 */ { MAD_F(0x04a30c20) /* 0.289806485 */, 18 }, - /* 4577 */ { MAD_F(0x04a364ac) /* 0.289890930 */, 18 }, - /* 4578 */ { MAD_F(0x04a3bd3a) /* 0.289975382 */, 18 }, - /* 4579 */ { MAD_F(0x04a415c9) /* 0.290059840 */, 18 }, - /* 4580 */ { MAD_F(0x04a46e5a) /* 0.290144304 */, 18 }, - /* 4581 */ { MAD_F(0x04a4c6ed) /* 0.290228774 */, 18 }, - /* 4582 */ { MAD_F(0x04a51f81) /* 0.290313250 */, 18 }, - /* 4583 */ { MAD_F(0x04a57818) /* 0.290397733 */, 18 }, - /* 4584 */ { MAD_F(0x04a5d0af) /* 0.290482221 */, 18 }, - /* 4585 */ { MAD_F(0x04a62949) /* 0.290566716 */, 18 }, - /* 4586 */ { MAD_F(0x04a681e4) /* 0.290651217 */, 18 }, - /* 4587 */ { MAD_F(0x04a6da80) /* 0.290735724 */, 18 }, - /* 4588 */ { MAD_F(0x04a7331f) /* 0.290820237 */, 18 }, - /* 4589 */ { MAD_F(0x04a78bbf) /* 0.290904756 */, 18 }, - /* 4590 */ { MAD_F(0x04a7e460) /* 0.290989281 */, 18 }, - /* 4591 */ { MAD_F(0x04a83d03) /* 0.291073813 */, 18 }, - - /* 4592 */ { MAD_F(0x04a895a8) /* 0.291158351 */, 18 }, - /* 4593 */ { MAD_F(0x04a8ee4f) /* 0.291242894 */, 18 }, - /* 4594 */ { MAD_F(0x04a946f7) /* 0.291327444 */, 18 }, - /* 4595 */ { MAD_F(0x04a99fa1) /* 0.291412001 */, 18 }, - /* 4596 */ { MAD_F(0x04a9f84c) /* 0.291496563 */, 18 }, - /* 4597 */ { MAD_F(0x04aa50fa) /* 0.291581131 */, 18 }, - /* 4598 */ { MAD_F(0x04aaa9a8) /* 0.291665706 */, 18 }, - /* 4599 */ { MAD_F(0x04ab0259) /* 0.291750286 */, 18 }, - /* 4600 */ { MAD_F(0x04ab5b0b) /* 0.291834873 */, 18 }, - /* 4601 */ { MAD_F(0x04abb3bf) /* 0.291919466 */, 18 }, - /* 4602 */ { MAD_F(0x04ac0c74) /* 0.292004065 */, 18 }, - /* 4603 */ { MAD_F(0x04ac652b) /* 0.292088670 */, 18 }, - /* 4604 */ { MAD_F(0x04acbde4) /* 0.292173281 */, 18 }, - /* 4605 */ { MAD_F(0x04ad169e) /* 0.292257899 */, 18 }, - /* 4606 */ { MAD_F(0x04ad6f5a) /* 0.292342522 */, 18 }, - /* 4607 */ { MAD_F(0x04adc818) /* 0.292427152 */, 18 }, - - /* 4608 */ { MAD_F(0x04ae20d7) /* 0.292511788 */, 18 }, - /* 4609 */ { MAD_F(0x04ae7998) /* 0.292596430 */, 18 }, - /* 4610 */ { MAD_F(0x04aed25a) /* 0.292681078 */, 18 }, - /* 4611 */ { MAD_F(0x04af2b1e) /* 0.292765732 */, 18 }, - /* 4612 */ { MAD_F(0x04af83e4) /* 0.292850392 */, 18 }, - /* 4613 */ { MAD_F(0x04afdcac) /* 0.292935058 */, 18 }, - /* 4614 */ { MAD_F(0x04b03575) /* 0.293019731 */, 18 }, - /* 4615 */ { MAD_F(0x04b08e40) /* 0.293104409 */, 18 }, - /* 4616 */ { MAD_F(0x04b0e70c) /* 0.293189094 */, 18 }, - /* 4617 */ { MAD_F(0x04b13fda) /* 0.293273785 */, 18 }, - /* 4618 */ { MAD_F(0x04b198aa) /* 0.293358482 */, 18 }, - /* 4619 */ { MAD_F(0x04b1f17b) /* 0.293443185 */, 18 }, - /* 4620 */ { MAD_F(0x04b24a4e) /* 0.293527894 */, 18 }, - /* 4621 */ { MAD_F(0x04b2a322) /* 0.293612609 */, 18 }, - /* 4622 */ { MAD_F(0x04b2fbf9) /* 0.293697331 */, 18 }, - /* 4623 */ { MAD_F(0x04b354d1) /* 0.293782058 */, 18 }, - - /* 4624 */ { MAD_F(0x04b3adaa) /* 0.293866792 */, 18 }, - /* 4625 */ { MAD_F(0x04b40685) /* 0.293951532 */, 18 }, - /* 4626 */ { MAD_F(0x04b45f62) /* 0.294036278 */, 18 }, - /* 4627 */ { MAD_F(0x04b4b840) /* 0.294121029 */, 18 }, - /* 4628 */ { MAD_F(0x04b51120) /* 0.294205788 */, 18 }, - /* 4629 */ { MAD_F(0x04b56a02) /* 0.294290552 */, 18 }, - /* 4630 */ { MAD_F(0x04b5c2e6) /* 0.294375322 */, 18 }, - /* 4631 */ { MAD_F(0x04b61bcb) /* 0.294460098 */, 18 }, - /* 4632 */ { MAD_F(0x04b674b1) /* 0.294544881 */, 18 }, - /* 4633 */ { MAD_F(0x04b6cd99) /* 0.294629669 */, 18 }, - /* 4634 */ { MAD_F(0x04b72683) /* 0.294714464 */, 18 }, - /* 4635 */ { MAD_F(0x04b77f6f) /* 0.294799265 */, 18 }, - /* 4636 */ { MAD_F(0x04b7d85c) /* 0.294884072 */, 18 }, - /* 4637 */ { MAD_F(0x04b8314b) /* 0.294968885 */, 18 }, - /* 4638 */ { MAD_F(0x04b88a3b) /* 0.295053704 */, 18 }, - /* 4639 */ { MAD_F(0x04b8e32d) /* 0.295138529 */, 18 }, - - /* 4640 */ { MAD_F(0x04b93c21) /* 0.295223360 */, 18 }, - /* 4641 */ { MAD_F(0x04b99516) /* 0.295308197 */, 18 }, - /* 4642 */ { MAD_F(0x04b9ee0d) /* 0.295393041 */, 18 }, - /* 4643 */ { MAD_F(0x04ba4706) /* 0.295477890 */, 18 }, - /* 4644 */ { MAD_F(0x04baa000) /* 0.295562746 */, 18 }, - /* 4645 */ { MAD_F(0x04baf8fc) /* 0.295647608 */, 18 }, - /* 4646 */ { MAD_F(0x04bb51fa) /* 0.295732476 */, 18 }, - /* 4647 */ { MAD_F(0x04bbaaf9) /* 0.295817349 */, 18 }, - /* 4648 */ { MAD_F(0x04bc03fa) /* 0.295902229 */, 18 }, - /* 4649 */ { MAD_F(0x04bc5cfc) /* 0.295987115 */, 18 }, - /* 4650 */ { MAD_F(0x04bcb600) /* 0.296072008 */, 18 }, - /* 4651 */ { MAD_F(0x04bd0f06) /* 0.296156906 */, 18 }, - /* 4652 */ { MAD_F(0x04bd680d) /* 0.296241810 */, 18 }, - /* 4653 */ { MAD_F(0x04bdc116) /* 0.296326721 */, 18 }, - /* 4654 */ { MAD_F(0x04be1a21) /* 0.296411637 */, 18 }, - /* 4655 */ { MAD_F(0x04be732d) /* 0.296496560 */, 18 }, - - /* 4656 */ { MAD_F(0x04becc3b) /* 0.296581488 */, 18 }, - /* 4657 */ { MAD_F(0x04bf254a) /* 0.296666423 */, 18 }, - /* 4658 */ { MAD_F(0x04bf7e5b) /* 0.296751364 */, 18 }, - /* 4659 */ { MAD_F(0x04bfd76e) /* 0.296836311 */, 18 }, - /* 4660 */ { MAD_F(0x04c03083) /* 0.296921264 */, 18 }, - /* 4661 */ { MAD_F(0x04c08999) /* 0.297006223 */, 18 }, - /* 4662 */ { MAD_F(0x04c0e2b0) /* 0.297091188 */, 18 }, - /* 4663 */ { MAD_F(0x04c13bca) /* 0.297176159 */, 18 }, - /* 4664 */ { MAD_F(0x04c194e4) /* 0.297261136 */, 18 }, - /* 4665 */ { MAD_F(0x04c1ee01) /* 0.297346120 */, 18 }, - /* 4666 */ { MAD_F(0x04c2471f) /* 0.297431109 */, 18 }, - /* 4667 */ { MAD_F(0x04c2a03f) /* 0.297516105 */, 18 }, - /* 4668 */ { MAD_F(0x04c2f960) /* 0.297601106 */, 18 }, - /* 4669 */ { MAD_F(0x04c35283) /* 0.297686114 */, 18 }, - /* 4670 */ { MAD_F(0x04c3aba8) /* 0.297771128 */, 18 }, - /* 4671 */ { MAD_F(0x04c404ce) /* 0.297856147 */, 18 }, - - /* 4672 */ { MAD_F(0x04c45df6) /* 0.297941173 */, 18 }, - /* 4673 */ { MAD_F(0x04c4b720) /* 0.298026205 */, 18 }, - /* 4674 */ { MAD_F(0x04c5104b) /* 0.298111243 */, 18 }, - /* 4675 */ { MAD_F(0x04c56978) /* 0.298196287 */, 18 }, - /* 4676 */ { MAD_F(0x04c5c2a7) /* 0.298281337 */, 18 }, - /* 4677 */ { MAD_F(0x04c61bd7) /* 0.298366393 */, 18 }, - /* 4678 */ { MAD_F(0x04c67508) /* 0.298451456 */, 18 }, - /* 4679 */ { MAD_F(0x04c6ce3c) /* 0.298536524 */, 18 }, - /* 4680 */ { MAD_F(0x04c72771) /* 0.298621598 */, 18 }, - /* 4681 */ { MAD_F(0x04c780a7) /* 0.298706679 */, 18 }, - /* 4682 */ { MAD_F(0x04c7d9df) /* 0.298791765 */, 18 }, - /* 4683 */ { MAD_F(0x04c83319) /* 0.298876858 */, 18 }, - /* 4684 */ { MAD_F(0x04c88c55) /* 0.298961956 */, 18 }, - /* 4685 */ { MAD_F(0x04c8e592) /* 0.299047061 */, 18 }, - /* 4686 */ { MAD_F(0x04c93ed1) /* 0.299132172 */, 18 }, - /* 4687 */ { MAD_F(0x04c99811) /* 0.299217288 */, 18 }, - - /* 4688 */ { MAD_F(0x04c9f153) /* 0.299302411 */, 18 }, - /* 4689 */ { MAD_F(0x04ca4a97) /* 0.299387540 */, 18 }, - /* 4690 */ { MAD_F(0x04caa3dc) /* 0.299472675 */, 18 }, - /* 4691 */ { MAD_F(0x04cafd23) /* 0.299557816 */, 18 }, - /* 4692 */ { MAD_F(0x04cb566b) /* 0.299642963 */, 18 }, - /* 4693 */ { MAD_F(0x04cbafb5) /* 0.299728116 */, 18 }, - /* 4694 */ { MAD_F(0x04cc0901) /* 0.299813275 */, 18 }, - /* 4695 */ { MAD_F(0x04cc624e) /* 0.299898440 */, 18 }, - /* 4696 */ { MAD_F(0x04ccbb9d) /* 0.299983611 */, 18 }, - /* 4697 */ { MAD_F(0x04cd14ee) /* 0.300068789 */, 18 }, - /* 4698 */ { MAD_F(0x04cd6e40) /* 0.300153972 */, 18 }, - /* 4699 */ { MAD_F(0x04cdc794) /* 0.300239161 */, 18 }, - /* 4700 */ { MAD_F(0x04ce20e9) /* 0.300324357 */, 18 }, - /* 4701 */ { MAD_F(0x04ce7a40) /* 0.300409558 */, 18 }, - /* 4702 */ { MAD_F(0x04ced399) /* 0.300494765 */, 18 }, - /* 4703 */ { MAD_F(0x04cf2cf3) /* 0.300579979 */, 18 }, - - /* 4704 */ { MAD_F(0x04cf864f) /* 0.300665198 */, 18 }, - /* 4705 */ { MAD_F(0x04cfdfad) /* 0.300750424 */, 18 }, - /* 4706 */ { MAD_F(0x04d0390c) /* 0.300835656 */, 18 }, - /* 4707 */ { MAD_F(0x04d0926d) /* 0.300920893 */, 18 }, - /* 4708 */ { MAD_F(0x04d0ebcf) /* 0.301006137 */, 18 }, - /* 4709 */ { MAD_F(0x04d14533) /* 0.301091387 */, 18 }, - /* 4710 */ { MAD_F(0x04d19e99) /* 0.301176643 */, 18 }, - /* 4711 */ { MAD_F(0x04d1f800) /* 0.301261904 */, 18 }, - /* 4712 */ { MAD_F(0x04d25169) /* 0.301347172 */, 18 }, - /* 4713 */ { MAD_F(0x04d2aad4) /* 0.301432446 */, 18 }, - /* 4714 */ { MAD_F(0x04d30440) /* 0.301517726 */, 18 }, - /* 4715 */ { MAD_F(0x04d35dae) /* 0.301603012 */, 18 }, - /* 4716 */ { MAD_F(0x04d3b71d) /* 0.301688304 */, 18 }, - /* 4717 */ { MAD_F(0x04d4108e) /* 0.301773602 */, 18 }, - /* 4718 */ { MAD_F(0x04d46a01) /* 0.301858906 */, 18 }, - /* 4719 */ { MAD_F(0x04d4c375) /* 0.301944216 */, 18 }, - - /* 4720 */ { MAD_F(0x04d51ceb) /* 0.302029532 */, 18 }, - /* 4721 */ { MAD_F(0x04d57662) /* 0.302114854 */, 18 }, - /* 4722 */ { MAD_F(0x04d5cfdb) /* 0.302200182 */, 18 }, - /* 4723 */ { MAD_F(0x04d62956) /* 0.302285516 */, 18 }, - /* 4724 */ { MAD_F(0x04d682d2) /* 0.302370856 */, 18 }, - /* 4725 */ { MAD_F(0x04d6dc50) /* 0.302456203 */, 18 }, - /* 4726 */ { MAD_F(0x04d735d0) /* 0.302541555 */, 18 }, - /* 4727 */ { MAD_F(0x04d78f51) /* 0.302626913 */, 18 }, - /* 4728 */ { MAD_F(0x04d7e8d4) /* 0.302712277 */, 18 }, - /* 4729 */ { MAD_F(0x04d84258) /* 0.302797648 */, 18 }, - /* 4730 */ { MAD_F(0x04d89bde) /* 0.302883024 */, 18 }, - /* 4731 */ { MAD_F(0x04d8f566) /* 0.302968406 */, 18 }, - /* 4732 */ { MAD_F(0x04d94eef) /* 0.303053794 */, 18 }, - /* 4733 */ { MAD_F(0x04d9a87a) /* 0.303139189 */, 18 }, - /* 4734 */ { MAD_F(0x04da0207) /* 0.303224589 */, 18 }, - /* 4735 */ { MAD_F(0x04da5b95) /* 0.303309995 */, 18 }, - - /* 4736 */ { MAD_F(0x04dab524) /* 0.303395408 */, 18 }, - /* 4737 */ { MAD_F(0x04db0eb6) /* 0.303480826 */, 18 }, - /* 4738 */ { MAD_F(0x04db6849) /* 0.303566251 */, 18 }, - /* 4739 */ { MAD_F(0x04dbc1dd) /* 0.303651681 */, 18 }, - /* 4740 */ { MAD_F(0x04dc1b73) /* 0.303737117 */, 18 }, - /* 4741 */ { MAD_F(0x04dc750b) /* 0.303822560 */, 18 }, - /* 4742 */ { MAD_F(0x04dccea5) /* 0.303908008 */, 18 }, - /* 4743 */ { MAD_F(0x04dd2840) /* 0.303993463 */, 18 }, - /* 4744 */ { MAD_F(0x04dd81dc) /* 0.304078923 */, 18 }, - /* 4745 */ { MAD_F(0x04dddb7a) /* 0.304164390 */, 18 }, - /* 4746 */ { MAD_F(0x04de351a) /* 0.304249862 */, 18 }, - /* 4747 */ { MAD_F(0x04de8ebc) /* 0.304335340 */, 18 }, - /* 4748 */ { MAD_F(0x04dee85f) /* 0.304420825 */, 18 }, - /* 4749 */ { MAD_F(0x04df4203) /* 0.304506315 */, 18 }, - /* 4750 */ { MAD_F(0x04df9baa) /* 0.304591812 */, 18 }, - /* 4751 */ { MAD_F(0x04dff552) /* 0.304677314 */, 18 }, - - /* 4752 */ { MAD_F(0x04e04efb) /* 0.304762823 */, 18 }, - /* 4753 */ { MAD_F(0x04e0a8a6) /* 0.304848337 */, 18 }, - /* 4754 */ { MAD_F(0x04e10253) /* 0.304933858 */, 18 }, - /* 4755 */ { MAD_F(0x04e15c01) /* 0.305019384 */, 18 }, - /* 4756 */ { MAD_F(0x04e1b5b1) /* 0.305104917 */, 18 }, - /* 4757 */ { MAD_F(0x04e20f63) /* 0.305190455 */, 18 }, - /* 4758 */ { MAD_F(0x04e26916) /* 0.305275999 */, 18 }, - /* 4759 */ { MAD_F(0x04e2c2cb) /* 0.305361550 */, 18 }, - /* 4760 */ { MAD_F(0x04e31c81) /* 0.305447106 */, 18 }, - /* 4761 */ { MAD_F(0x04e37639) /* 0.305532669 */, 18 }, - /* 4762 */ { MAD_F(0x04e3cff3) /* 0.305618237 */, 18 }, - /* 4763 */ { MAD_F(0x04e429ae) /* 0.305703811 */, 18 }, - /* 4764 */ { MAD_F(0x04e4836b) /* 0.305789392 */, 18 }, - /* 4765 */ { MAD_F(0x04e4dd29) /* 0.305874978 */, 18 }, - /* 4766 */ { MAD_F(0x04e536e9) /* 0.305960571 */, 18 }, - /* 4767 */ { MAD_F(0x04e590ab) /* 0.306046169 */, 18 }, - - /* 4768 */ { MAD_F(0x04e5ea6e) /* 0.306131773 */, 18 }, - /* 4769 */ { MAD_F(0x04e64433) /* 0.306217383 */, 18 }, - /* 4770 */ { MAD_F(0x04e69df9) /* 0.306303000 */, 18 }, - /* 4771 */ { MAD_F(0x04e6f7c1) /* 0.306388622 */, 18 }, - /* 4772 */ { MAD_F(0x04e7518b) /* 0.306474250 */, 18 }, - /* 4773 */ { MAD_F(0x04e7ab56) /* 0.306559885 */, 18 }, - /* 4774 */ { MAD_F(0x04e80523) /* 0.306645525 */, 18 }, - /* 4775 */ { MAD_F(0x04e85ef2) /* 0.306731171 */, 18 }, - /* 4776 */ { MAD_F(0x04e8b8c2) /* 0.306816823 */, 18 }, - /* 4777 */ { MAD_F(0x04e91293) /* 0.306902481 */, 18 }, - /* 4778 */ { MAD_F(0x04e96c67) /* 0.306988145 */, 18 }, - /* 4779 */ { MAD_F(0x04e9c63b) /* 0.307073816 */, 18 }, - /* 4780 */ { MAD_F(0x04ea2012) /* 0.307159492 */, 18 }, - /* 4781 */ { MAD_F(0x04ea79ea) /* 0.307245174 */, 18 }, - /* 4782 */ { MAD_F(0x04ead3c4) /* 0.307330862 */, 18 }, - /* 4783 */ { MAD_F(0x04eb2d9f) /* 0.307416556 */, 18 }, - - /* 4784 */ { MAD_F(0x04eb877c) /* 0.307502256 */, 18 }, - /* 4785 */ { MAD_F(0x04ebe15b) /* 0.307587962 */, 18 }, - /* 4786 */ { MAD_F(0x04ec3b3b) /* 0.307673674 */, 18 }, - /* 4787 */ { MAD_F(0x04ec951c) /* 0.307759392 */, 18 }, - /* 4788 */ { MAD_F(0x04ecef00) /* 0.307845115 */, 18 }, - /* 4789 */ { MAD_F(0x04ed48e5) /* 0.307930845 */, 18 }, - /* 4790 */ { MAD_F(0x04eda2cb) /* 0.308016581 */, 18 }, - /* 4791 */ { MAD_F(0x04edfcb3) /* 0.308102323 */, 18 }, - /* 4792 */ { MAD_F(0x04ee569d) /* 0.308188071 */, 18 }, - /* 4793 */ { MAD_F(0x04eeb088) /* 0.308273824 */, 18 }, - /* 4794 */ { MAD_F(0x04ef0a75) /* 0.308359584 */, 18 }, - /* 4795 */ { MAD_F(0x04ef6464) /* 0.308445350 */, 18 }, - /* 4796 */ { MAD_F(0x04efbe54) /* 0.308531121 */, 18 }, - /* 4797 */ { MAD_F(0x04f01846) /* 0.308616899 */, 18 }, - /* 4798 */ { MAD_F(0x04f07239) /* 0.308702682 */, 18 }, - /* 4799 */ { MAD_F(0x04f0cc2e) /* 0.308788472 */, 18 }, - - /* 4800 */ { MAD_F(0x04f12624) /* 0.308874267 */, 18 }, - /* 4801 */ { MAD_F(0x04f1801d) /* 0.308960068 */, 18 }, - /* 4802 */ { MAD_F(0x04f1da16) /* 0.309045876 */, 18 }, - /* 4803 */ { MAD_F(0x04f23412) /* 0.309131689 */, 18 }, - /* 4804 */ { MAD_F(0x04f28e0f) /* 0.309217508 */, 18 }, - /* 4805 */ { MAD_F(0x04f2e80d) /* 0.309303334 */, 18 }, - /* 4806 */ { MAD_F(0x04f3420d) /* 0.309389165 */, 18 }, - /* 4807 */ { MAD_F(0x04f39c0f) /* 0.309475002 */, 18 }, - /* 4808 */ { MAD_F(0x04f3f612) /* 0.309560845 */, 18 }, - /* 4809 */ { MAD_F(0x04f45017) /* 0.309646694 */, 18 }, - /* 4810 */ { MAD_F(0x04f4aa1e) /* 0.309732549 */, 18 }, - /* 4811 */ { MAD_F(0x04f50426) /* 0.309818410 */, 18 }, - /* 4812 */ { MAD_F(0x04f55e30) /* 0.309904277 */, 18 }, - /* 4813 */ { MAD_F(0x04f5b83b) /* 0.309990150 */, 18 }, - /* 4814 */ { MAD_F(0x04f61248) /* 0.310076028 */, 18 }, - /* 4815 */ { MAD_F(0x04f66c56) /* 0.310161913 */, 18 }, - - /* 4816 */ { MAD_F(0x04f6c666) /* 0.310247804 */, 18 }, - /* 4817 */ { MAD_F(0x04f72078) /* 0.310333700 */, 18 }, - /* 4818 */ { MAD_F(0x04f77a8b) /* 0.310419603 */, 18 }, - /* 4819 */ { MAD_F(0x04f7d4a0) /* 0.310505511 */, 18 }, - /* 4820 */ { MAD_F(0x04f82eb7) /* 0.310591426 */, 18 }, - /* 4821 */ { MAD_F(0x04f888cf) /* 0.310677346 */, 18 }, - /* 4822 */ { MAD_F(0x04f8e2e9) /* 0.310763272 */, 18 }, - /* 4823 */ { MAD_F(0x04f93d04) /* 0.310849205 */, 18 }, - /* 4824 */ { MAD_F(0x04f99721) /* 0.310935143 */, 18 }, - /* 4825 */ { MAD_F(0x04f9f13f) /* 0.311021087 */, 18 }, - /* 4826 */ { MAD_F(0x04fa4b5f) /* 0.311107037 */, 18 }, - /* 4827 */ { MAD_F(0x04faa581) /* 0.311192993 */, 18 }, - /* 4828 */ { MAD_F(0x04faffa4) /* 0.311278955 */, 18 }, - /* 4829 */ { MAD_F(0x04fb59c9) /* 0.311364923 */, 18 }, - /* 4830 */ { MAD_F(0x04fbb3ef) /* 0.311450897 */, 18 }, - /* 4831 */ { MAD_F(0x04fc0e17) /* 0.311536877 */, 18 }, - - /* 4832 */ { MAD_F(0x04fc6841) /* 0.311622862 */, 18 }, - /* 4833 */ { MAD_F(0x04fcc26c) /* 0.311708854 */, 18 }, - /* 4834 */ { MAD_F(0x04fd1c99) /* 0.311794851 */, 18 }, - /* 4835 */ { MAD_F(0x04fd76c7) /* 0.311880855 */, 18 }, - /* 4836 */ { MAD_F(0x04fdd0f7) /* 0.311966864 */, 18 }, - /* 4837 */ { MAD_F(0x04fe2b29) /* 0.312052880 */, 18 }, - /* 4838 */ { MAD_F(0x04fe855c) /* 0.312138901 */, 18 }, - /* 4839 */ { MAD_F(0x04fedf91) /* 0.312224928 */, 18 }, - /* 4840 */ { MAD_F(0x04ff39c7) /* 0.312310961 */, 18 }, - /* 4841 */ { MAD_F(0x04ff93ff) /* 0.312397000 */, 18 }, - /* 4842 */ { MAD_F(0x04ffee38) /* 0.312483045 */, 18 }, - /* 4843 */ { MAD_F(0x05004874) /* 0.312569096 */, 18 }, - /* 4844 */ { MAD_F(0x0500a2b0) /* 0.312655153 */, 18 }, - /* 4845 */ { MAD_F(0x0500fcef) /* 0.312741216 */, 18 }, - /* 4846 */ { MAD_F(0x0501572e) /* 0.312827284 */, 18 }, - /* 4847 */ { MAD_F(0x0501b170) /* 0.312913359 */, 18 }, - - /* 4848 */ { MAD_F(0x05020bb3) /* 0.312999439 */, 18 }, - /* 4849 */ { MAD_F(0x050265f8) /* 0.313085526 */, 18 }, - /* 4850 */ { MAD_F(0x0502c03e) /* 0.313171618 */, 18 }, - /* 4851 */ { MAD_F(0x05031a86) /* 0.313257716 */, 18 }, - /* 4852 */ { MAD_F(0x050374cf) /* 0.313343820 */, 18 }, - /* 4853 */ { MAD_F(0x0503cf1a) /* 0.313429931 */, 18 }, - /* 4854 */ { MAD_F(0x05042967) /* 0.313516047 */, 18 }, - /* 4855 */ { MAD_F(0x050483b5) /* 0.313602168 */, 18 }, - /* 4856 */ { MAD_F(0x0504de05) /* 0.313688296 */, 18 }, - /* 4857 */ { MAD_F(0x05053856) /* 0.313774430 */, 18 }, - /* 4858 */ { MAD_F(0x050592a9) /* 0.313860570 */, 18 }, - /* 4859 */ { MAD_F(0x0505ecfd) /* 0.313946715 */, 18 }, - /* 4860 */ { MAD_F(0x05064754) /* 0.314032867 */, 18 }, - /* 4861 */ { MAD_F(0x0506a1ab) /* 0.314119024 */, 18 }, - /* 4862 */ { MAD_F(0x0506fc04) /* 0.314205187 */, 18 }, - /* 4863 */ { MAD_F(0x0507565f) /* 0.314291357 */, 18 }, - - /* 4864 */ { MAD_F(0x0507b0bc) /* 0.314377532 */, 18 }, - /* 4865 */ { MAD_F(0x05080b1a) /* 0.314463713 */, 18 }, - /* 4866 */ { MAD_F(0x05086579) /* 0.314549900 */, 18 }, - /* 4867 */ { MAD_F(0x0508bfdb) /* 0.314636092 */, 18 }, - /* 4868 */ { MAD_F(0x05091a3d) /* 0.314722291 */, 18 }, - /* 4869 */ { MAD_F(0x050974a2) /* 0.314808496 */, 18 }, - /* 4870 */ { MAD_F(0x0509cf08) /* 0.314894706 */, 18 }, - /* 4871 */ { MAD_F(0x050a296f) /* 0.314980923 */, 18 }, - /* 4872 */ { MAD_F(0x050a83d8) /* 0.315067145 */, 18 }, - /* 4873 */ { MAD_F(0x050ade43) /* 0.315153373 */, 18 }, - /* 4874 */ { MAD_F(0x050b38af) /* 0.315239607 */, 18 }, - /* 4875 */ { MAD_F(0x050b931d) /* 0.315325847 */, 18 }, - /* 4876 */ { MAD_F(0x050bed8d) /* 0.315412093 */, 18 }, - /* 4877 */ { MAD_F(0x050c47fe) /* 0.315498345 */, 18 }, - /* 4878 */ { MAD_F(0x050ca271) /* 0.315584603 */, 18 }, - /* 4879 */ { MAD_F(0x050cfce5) /* 0.315670866 */, 18 }, - - /* 4880 */ { MAD_F(0x050d575b) /* 0.315757136 */, 18 }, - /* 4881 */ { MAD_F(0x050db1d2) /* 0.315843411 */, 18 }, - /* 4882 */ { MAD_F(0x050e0c4b) /* 0.315929693 */, 18 }, - /* 4883 */ { MAD_F(0x050e66c5) /* 0.316015980 */, 18 }, - /* 4884 */ { MAD_F(0x050ec141) /* 0.316102273 */, 18 }, - /* 4885 */ { MAD_F(0x050f1bbf) /* 0.316188572 */, 18 }, - /* 4886 */ { MAD_F(0x050f763e) /* 0.316274877 */, 18 }, - /* 4887 */ { MAD_F(0x050fd0bf) /* 0.316361187 */, 18 }, - /* 4888 */ { MAD_F(0x05102b42) /* 0.316447504 */, 18 }, - /* 4889 */ { MAD_F(0x051085c6) /* 0.316533826 */, 18 }, - /* 4890 */ { MAD_F(0x0510e04b) /* 0.316620155 */, 18 }, - /* 4891 */ { MAD_F(0x05113ad3) /* 0.316706489 */, 18 }, - /* 4892 */ { MAD_F(0x0511955b) /* 0.316792829 */, 18 }, - /* 4893 */ { MAD_F(0x0511efe6) /* 0.316879175 */, 18 }, - /* 4894 */ { MAD_F(0x05124a72) /* 0.316965527 */, 18 }, - /* 4895 */ { MAD_F(0x0512a4ff) /* 0.317051885 */, 18 }, - - /* 4896 */ { MAD_F(0x0512ff8e) /* 0.317138249 */, 18 }, - /* 4897 */ { MAD_F(0x05135a1f) /* 0.317224618 */, 18 }, - /* 4898 */ { MAD_F(0x0513b4b1) /* 0.317310994 */, 18 }, - /* 4899 */ { MAD_F(0x05140f45) /* 0.317397375 */, 18 }, - /* 4900 */ { MAD_F(0x051469da) /* 0.317483762 */, 18 }, - /* 4901 */ { MAD_F(0x0514c471) /* 0.317570155 */, 18 }, - /* 4902 */ { MAD_F(0x05151f0a) /* 0.317656554 */, 18 }, - /* 4903 */ { MAD_F(0x051579a4) /* 0.317742959 */, 18 }, - /* 4904 */ { MAD_F(0x0515d440) /* 0.317829370 */, 18 }, - /* 4905 */ { MAD_F(0x05162edd) /* 0.317915786 */, 18 }, - /* 4906 */ { MAD_F(0x0516897c) /* 0.318002209 */, 18 }, - /* 4907 */ { MAD_F(0x0516e41c) /* 0.318088637 */, 18 }, - /* 4908 */ { MAD_F(0x05173ebe) /* 0.318175071 */, 18 }, - /* 4909 */ { MAD_F(0x05179962) /* 0.318261511 */, 18 }, - /* 4910 */ { MAD_F(0x0517f407) /* 0.318347957 */, 18 }, - /* 4911 */ { MAD_F(0x05184eae) /* 0.318434409 */, 18 }, - - /* 4912 */ { MAD_F(0x0518a956) /* 0.318520867 */, 18 }, - /* 4913 */ { MAD_F(0x05190400) /* 0.318607330 */, 18 }, - /* 4914 */ { MAD_F(0x05195eab) /* 0.318693800 */, 18 }, - /* 4915 */ { MAD_F(0x0519b958) /* 0.318780275 */, 18 }, - /* 4916 */ { MAD_F(0x051a1407) /* 0.318866756 */, 18 }, - /* 4917 */ { MAD_F(0x051a6eb7) /* 0.318953243 */, 18 }, - /* 4918 */ { MAD_F(0x051ac969) /* 0.319039736 */, 18 }, - /* 4919 */ { MAD_F(0x051b241c) /* 0.319126235 */, 18 }, - /* 4920 */ { MAD_F(0x051b7ed1) /* 0.319212739 */, 18 }, - /* 4921 */ { MAD_F(0x051bd987) /* 0.319299250 */, 18 }, - /* 4922 */ { MAD_F(0x051c3440) /* 0.319385766 */, 18 }, - /* 4923 */ { MAD_F(0x051c8ef9) /* 0.319472288 */, 18 }, - /* 4924 */ { MAD_F(0x051ce9b4) /* 0.319558816 */, 18 }, - /* 4925 */ { MAD_F(0x051d4471) /* 0.319645350 */, 18 }, - /* 4926 */ { MAD_F(0x051d9f2f) /* 0.319731890 */, 18 }, - /* 4927 */ { MAD_F(0x051df9ef) /* 0.319818435 */, 18 }, - - /* 4928 */ { MAD_F(0x051e54b1) /* 0.319904987 */, 18 }, - /* 4929 */ { MAD_F(0x051eaf74) /* 0.319991544 */, 18 }, - /* 4930 */ { MAD_F(0x051f0a38) /* 0.320078107 */, 18 }, - /* 4931 */ { MAD_F(0x051f64ff) /* 0.320164676 */, 18 }, - /* 4932 */ { MAD_F(0x051fbfc6) /* 0.320251251 */, 18 }, - /* 4933 */ { MAD_F(0x05201a90) /* 0.320337832 */, 18 }, - /* 4934 */ { MAD_F(0x0520755b) /* 0.320424419 */, 18 }, - /* 4935 */ { MAD_F(0x0520d027) /* 0.320511011 */, 18 }, - /* 4936 */ { MAD_F(0x05212af5) /* 0.320597609 */, 18 }, - /* 4937 */ { MAD_F(0x052185c5) /* 0.320684213 */, 18 }, - /* 4938 */ { MAD_F(0x0521e096) /* 0.320770823 */, 18 }, - /* 4939 */ { MAD_F(0x05223b69) /* 0.320857439 */, 18 }, - /* 4940 */ { MAD_F(0x0522963d) /* 0.320944061 */, 18 }, - /* 4941 */ { MAD_F(0x0522f113) /* 0.321030688 */, 18 }, - /* 4942 */ { MAD_F(0x05234bea) /* 0.321117322 */, 18 }, - /* 4943 */ { MAD_F(0x0523a6c3) /* 0.321203961 */, 18 }, - - /* 4944 */ { MAD_F(0x0524019e) /* 0.321290606 */, 18 }, - /* 4945 */ { MAD_F(0x05245c7a) /* 0.321377257 */, 18 }, - /* 4946 */ { MAD_F(0x0524b758) /* 0.321463913 */, 18 }, - /* 4947 */ { MAD_F(0x05251237) /* 0.321550576 */, 18 }, - /* 4948 */ { MAD_F(0x05256d18) /* 0.321637244 */, 18 }, - /* 4949 */ { MAD_F(0x0525c7fb) /* 0.321723919 */, 18 }, - /* 4950 */ { MAD_F(0x052622df) /* 0.321810599 */, 18 }, - /* 4951 */ { MAD_F(0x05267dc4) /* 0.321897285 */, 18 }, - /* 4952 */ { MAD_F(0x0526d8ab) /* 0.321983976 */, 18 }, - /* 4953 */ { MAD_F(0x05273394) /* 0.322070674 */, 18 }, - /* 4954 */ { MAD_F(0x05278e7e) /* 0.322157377 */, 18 }, - /* 4955 */ { MAD_F(0x0527e96a) /* 0.322244087 */, 18 }, - /* 4956 */ { MAD_F(0x05284457) /* 0.322330802 */, 18 }, - /* 4957 */ { MAD_F(0x05289f46) /* 0.322417523 */, 18 }, - /* 4958 */ { MAD_F(0x0528fa37) /* 0.322504249 */, 18 }, - /* 4959 */ { MAD_F(0x05295529) /* 0.322590982 */, 18 }, - - /* 4960 */ { MAD_F(0x0529b01d) /* 0.322677720 */, 18 }, - /* 4961 */ { MAD_F(0x052a0b12) /* 0.322764465 */, 18 }, - /* 4962 */ { MAD_F(0x052a6609) /* 0.322851215 */, 18 }, - /* 4963 */ { MAD_F(0x052ac101) /* 0.322937971 */, 18 }, - /* 4964 */ { MAD_F(0x052b1bfb) /* 0.323024732 */, 18 }, - /* 4965 */ { MAD_F(0x052b76f7) /* 0.323111500 */, 18 }, - /* 4966 */ { MAD_F(0x052bd1f4) /* 0.323198273 */, 18 }, - /* 4967 */ { MAD_F(0x052c2cf2) /* 0.323285052 */, 18 }, - /* 4968 */ { MAD_F(0x052c87f2) /* 0.323371837 */, 18 }, - /* 4969 */ { MAD_F(0x052ce2f4) /* 0.323458628 */, 18 }, - /* 4970 */ { MAD_F(0x052d3df7) /* 0.323545425 */, 18 }, - /* 4971 */ { MAD_F(0x052d98fc) /* 0.323632227 */, 18 }, - /* 4972 */ { MAD_F(0x052df403) /* 0.323719036 */, 18 }, - /* 4973 */ { MAD_F(0x052e4f0b) /* 0.323805850 */, 18 }, - /* 4974 */ { MAD_F(0x052eaa14) /* 0.323892670 */, 18 }, - /* 4975 */ { MAD_F(0x052f051f) /* 0.323979496 */, 18 }, - - /* 4976 */ { MAD_F(0x052f602c) /* 0.324066327 */, 18 }, - /* 4977 */ { MAD_F(0x052fbb3a) /* 0.324153165 */, 18 }, - /* 4978 */ { MAD_F(0x0530164a) /* 0.324240008 */, 18 }, - /* 4979 */ { MAD_F(0x0530715b) /* 0.324326857 */, 18 }, - /* 4980 */ { MAD_F(0x0530cc6e) /* 0.324413712 */, 18 }, - /* 4981 */ { MAD_F(0x05312783) /* 0.324500572 */, 18 }, - /* 4982 */ { MAD_F(0x05318299) /* 0.324587439 */, 18 }, - /* 4983 */ { MAD_F(0x0531ddb0) /* 0.324674311 */, 18 }, - /* 4984 */ { MAD_F(0x053238ca) /* 0.324761189 */, 18 }, - /* 4985 */ { MAD_F(0x053293e4) /* 0.324848073 */, 18 }, - /* 4986 */ { MAD_F(0x0532ef01) /* 0.324934963 */, 18 }, - /* 4987 */ { MAD_F(0x05334a1e) /* 0.325021858 */, 18 }, - /* 4988 */ { MAD_F(0x0533a53e) /* 0.325108760 */, 18 }, - /* 4989 */ { MAD_F(0x0534005f) /* 0.325195667 */, 18 }, - /* 4990 */ { MAD_F(0x05345b81) /* 0.325282580 */, 18 }, - /* 4991 */ { MAD_F(0x0534b6a5) /* 0.325369498 */, 18 }, - - /* 4992 */ { MAD_F(0x053511cb) /* 0.325456423 */, 18 }, - /* 4993 */ { MAD_F(0x05356cf2) /* 0.325543353 */, 18 }, - /* 4994 */ { MAD_F(0x0535c81b) /* 0.325630290 */, 18 }, - /* 4995 */ { MAD_F(0x05362345) /* 0.325717232 */, 18 }, - /* 4996 */ { MAD_F(0x05367e71) /* 0.325804179 */, 18 }, - /* 4997 */ { MAD_F(0x0536d99f) /* 0.325891133 */, 18 }, - /* 4998 */ { MAD_F(0x053734ce) /* 0.325978092 */, 18 }, - /* 4999 */ { MAD_F(0x05378ffe) /* 0.326065057 */, 18 }, - /* 5000 */ { MAD_F(0x0537eb30) /* 0.326152028 */, 18 }, - /* 5001 */ { MAD_F(0x05384664) /* 0.326239005 */, 18 }, - /* 5002 */ { MAD_F(0x0538a199) /* 0.326325988 */, 18 }, - /* 5003 */ { MAD_F(0x0538fcd0) /* 0.326412976 */, 18 }, - /* 5004 */ { MAD_F(0x05395808) /* 0.326499970 */, 18 }, - /* 5005 */ { MAD_F(0x0539b342) /* 0.326586970 */, 18 }, - /* 5006 */ { MAD_F(0x053a0e7d) /* 0.326673976 */, 18 }, - /* 5007 */ { MAD_F(0x053a69ba) /* 0.326760988 */, 18 }, - - /* 5008 */ { MAD_F(0x053ac4f9) /* 0.326848005 */, 18 }, - /* 5009 */ { MAD_F(0x053b2039) /* 0.326935028 */, 18 }, - /* 5010 */ { MAD_F(0x053b7b7b) /* 0.327022057 */, 18 }, - /* 5011 */ { MAD_F(0x053bd6be) /* 0.327109092 */, 18 }, - /* 5012 */ { MAD_F(0x053c3203) /* 0.327196132 */, 18 }, - /* 5013 */ { MAD_F(0x053c8d49) /* 0.327283178 */, 18 }, - /* 5014 */ { MAD_F(0x053ce891) /* 0.327370231 */, 18 }, - /* 5015 */ { MAD_F(0x053d43da) /* 0.327457288 */, 18 }, - /* 5016 */ { MAD_F(0x053d9f25) /* 0.327544352 */, 18 }, - /* 5017 */ { MAD_F(0x053dfa72) /* 0.327631421 */, 18 }, - /* 5018 */ { MAD_F(0x053e55c0) /* 0.327718497 */, 18 }, - /* 5019 */ { MAD_F(0x053eb10f) /* 0.327805578 */, 18 }, - /* 5020 */ { MAD_F(0x053f0c61) /* 0.327892665 */, 18 }, - /* 5021 */ { MAD_F(0x053f67b3) /* 0.327979757 */, 18 }, - /* 5022 */ { MAD_F(0x053fc308) /* 0.328066855 */, 18 }, - /* 5023 */ { MAD_F(0x05401e5e) /* 0.328153960 */, 18 }, - - /* 5024 */ { MAD_F(0x054079b5) /* 0.328241070 */, 18 }, - /* 5025 */ { MAD_F(0x0540d50e) /* 0.328328185 */, 18 }, - /* 5026 */ { MAD_F(0x05413068) /* 0.328415307 */, 18 }, - /* 5027 */ { MAD_F(0x05418bc4) /* 0.328502434 */, 18 }, - /* 5028 */ { MAD_F(0x0541e722) /* 0.328589567 */, 18 }, - /* 5029 */ { MAD_F(0x05424281) /* 0.328676706 */, 18 }, - /* 5030 */ { MAD_F(0x05429de2) /* 0.328763850 */, 18 }, - /* 5031 */ { MAD_F(0x0542f944) /* 0.328851001 */, 18 }, - /* 5032 */ { MAD_F(0x054354a8) /* 0.328938157 */, 18 }, - /* 5033 */ { MAD_F(0x0543b00d) /* 0.329025319 */, 18 }, - /* 5034 */ { MAD_F(0x05440b74) /* 0.329112486 */, 18 }, - /* 5035 */ { MAD_F(0x054466dd) /* 0.329199660 */, 18 }, - /* 5036 */ { MAD_F(0x0544c247) /* 0.329286839 */, 18 }, - /* 5037 */ { MAD_F(0x05451db2) /* 0.329374024 */, 18 }, - /* 5038 */ { MAD_F(0x0545791f) /* 0.329461215 */, 18 }, - /* 5039 */ { MAD_F(0x0545d48e) /* 0.329548411 */, 18 }, - - /* 5040 */ { MAD_F(0x05462ffe) /* 0.329635614 */, 18 }, - /* 5041 */ { MAD_F(0x05468b70) /* 0.329722822 */, 18 }, - /* 5042 */ { MAD_F(0x0546e6e3) /* 0.329810036 */, 18 }, - /* 5043 */ { MAD_F(0x05474258) /* 0.329897255 */, 18 }, - /* 5044 */ { MAD_F(0x05479dce) /* 0.329984481 */, 18 }, - /* 5045 */ { MAD_F(0x0547f946) /* 0.330071712 */, 18 }, - /* 5046 */ { MAD_F(0x054854c0) /* 0.330158949 */, 18 }, - /* 5047 */ { MAD_F(0x0548b03b) /* 0.330246191 */, 18 }, - /* 5048 */ { MAD_F(0x05490bb7) /* 0.330333440 */, 18 }, - /* 5049 */ { MAD_F(0x05496735) /* 0.330420694 */, 18 }, - /* 5050 */ { MAD_F(0x0549c2b5) /* 0.330507954 */, 18 }, - /* 5051 */ { MAD_F(0x054a1e36) /* 0.330595220 */, 18 }, - /* 5052 */ { MAD_F(0x054a79b9) /* 0.330682491 */, 18 }, - /* 5053 */ { MAD_F(0x054ad53d) /* 0.330769768 */, 18 }, - /* 5054 */ { MAD_F(0x054b30c3) /* 0.330857051 */, 18 }, - /* 5055 */ { MAD_F(0x054b8c4b) /* 0.330944340 */, 18 }, - - /* 5056 */ { MAD_F(0x054be7d4) /* 0.331031635 */, 18 }, - /* 5057 */ { MAD_F(0x054c435e) /* 0.331118935 */, 18 }, - /* 5058 */ { MAD_F(0x054c9eea) /* 0.331206241 */, 18 }, - /* 5059 */ { MAD_F(0x054cfa78) /* 0.331293553 */, 18 }, - /* 5060 */ { MAD_F(0x054d5607) /* 0.331380870 */, 18 }, - /* 5061 */ { MAD_F(0x054db197) /* 0.331468193 */, 18 }, - /* 5062 */ { MAD_F(0x054e0d2a) /* 0.331555522 */, 18 }, - /* 5063 */ { MAD_F(0x054e68bd) /* 0.331642857 */, 18 }, - /* 5064 */ { MAD_F(0x054ec453) /* 0.331730198 */, 18 }, - /* 5065 */ { MAD_F(0x054f1fe9) /* 0.331817544 */, 18 }, - /* 5066 */ { MAD_F(0x054f7b82) /* 0.331904896 */, 18 }, - /* 5067 */ { MAD_F(0x054fd71c) /* 0.331992254 */, 18 }, - /* 5068 */ { MAD_F(0x055032b7) /* 0.332079617 */, 18 }, - /* 5069 */ { MAD_F(0x05508e54) /* 0.332166986 */, 18 }, - /* 5070 */ { MAD_F(0x0550e9f3) /* 0.332254361 */, 18 }, - /* 5071 */ { MAD_F(0x05514593) /* 0.332341742 */, 18 }, - - /* 5072 */ { MAD_F(0x0551a134) /* 0.332429129 */, 18 }, - /* 5073 */ { MAD_F(0x0551fcd8) /* 0.332516521 */, 18 }, - /* 5074 */ { MAD_F(0x0552587c) /* 0.332603919 */, 18 }, - /* 5075 */ { MAD_F(0x0552b423) /* 0.332691323 */, 18 }, - /* 5076 */ { MAD_F(0x05530fca) /* 0.332778732 */, 18 }, - /* 5077 */ { MAD_F(0x05536b74) /* 0.332866147 */, 18 }, - /* 5078 */ { MAD_F(0x0553c71f) /* 0.332953568 */, 18 }, - /* 5079 */ { MAD_F(0x055422cb) /* 0.333040995 */, 18 }, - /* 5080 */ { MAD_F(0x05547e79) /* 0.333128427 */, 18 }, - /* 5081 */ { MAD_F(0x0554da29) /* 0.333215865 */, 18 }, - /* 5082 */ { MAD_F(0x055535da) /* 0.333303309 */, 18 }, - /* 5083 */ { MAD_F(0x0555918c) /* 0.333390759 */, 18 }, - /* 5084 */ { MAD_F(0x0555ed40) /* 0.333478214 */, 18 }, - /* 5085 */ { MAD_F(0x055648f6) /* 0.333565675 */, 18 }, - /* 5086 */ { MAD_F(0x0556a4ad) /* 0.333653142 */, 18 }, - /* 5087 */ { MAD_F(0x05570066) /* 0.333740615 */, 18 }, - - /* 5088 */ { MAD_F(0x05575c20) /* 0.333828093 */, 18 }, - /* 5089 */ { MAD_F(0x0557b7dc) /* 0.333915577 */, 18 }, - /* 5090 */ { MAD_F(0x05581399) /* 0.334003067 */, 18 }, - /* 5091 */ { MAD_F(0x05586f58) /* 0.334090562 */, 18 }, - /* 5092 */ { MAD_F(0x0558cb19) /* 0.334178063 */, 18 }, - /* 5093 */ { MAD_F(0x055926db) /* 0.334265570 */, 18 }, - /* 5094 */ { MAD_F(0x0559829e) /* 0.334353083 */, 18 }, - /* 5095 */ { MAD_F(0x0559de63) /* 0.334440601 */, 18 }, - /* 5096 */ { MAD_F(0x055a3a2a) /* 0.334528126 */, 18 }, - /* 5097 */ { MAD_F(0x055a95f2) /* 0.334615655 */, 18 }, - /* 5098 */ { MAD_F(0x055af1bb) /* 0.334703191 */, 18 }, - /* 5099 */ { MAD_F(0x055b4d87) /* 0.334790732 */, 18 }, - /* 5100 */ { MAD_F(0x055ba953) /* 0.334878279 */, 18 }, - /* 5101 */ { MAD_F(0x055c0522) /* 0.334965832 */, 18 }, - /* 5102 */ { MAD_F(0x055c60f1) /* 0.335053391 */, 18 }, - /* 5103 */ { MAD_F(0x055cbcc3) /* 0.335140955 */, 18 }, - - /* 5104 */ { MAD_F(0x055d1896) /* 0.335228525 */, 18 }, - /* 5105 */ { MAD_F(0x055d746a) /* 0.335316100 */, 18 }, - /* 5106 */ { MAD_F(0x055dd040) /* 0.335403682 */, 18 }, - /* 5107 */ { MAD_F(0x055e2c17) /* 0.335491269 */, 18 }, - /* 5108 */ { MAD_F(0x055e87f0) /* 0.335578861 */, 18 }, - /* 5109 */ { MAD_F(0x055ee3cb) /* 0.335666460 */, 18 }, - /* 5110 */ { MAD_F(0x055f3fa7) /* 0.335754064 */, 18 }, - /* 5111 */ { MAD_F(0x055f9b85) /* 0.335841674 */, 18 }, - /* 5112 */ { MAD_F(0x055ff764) /* 0.335929290 */, 18 }, - /* 5113 */ { MAD_F(0x05605344) /* 0.336016911 */, 18 }, - /* 5114 */ { MAD_F(0x0560af27) /* 0.336104538 */, 18 }, - /* 5115 */ { MAD_F(0x05610b0a) /* 0.336192171 */, 18 }, - /* 5116 */ { MAD_F(0x056166f0) /* 0.336279809 */, 18 }, - /* 5117 */ { MAD_F(0x0561c2d7) /* 0.336367453 */, 18 }, - /* 5118 */ { MAD_F(0x05621ebf) /* 0.336455103 */, 18 }, - /* 5119 */ { MAD_F(0x05627aa9) /* 0.336542759 */, 18 }, - - /* 5120 */ { MAD_F(0x0562d694) /* 0.336630420 */, 18 }, - /* 5121 */ { MAD_F(0x05633281) /* 0.336718087 */, 18 }, - /* 5122 */ { MAD_F(0x05638e70) /* 0.336805760 */, 18 }, - /* 5123 */ { MAD_F(0x0563ea60) /* 0.336893439 */, 18 }, - /* 5124 */ { MAD_F(0x05644651) /* 0.336981123 */, 18 }, - /* 5125 */ { MAD_F(0x0564a244) /* 0.337068813 */, 18 }, - /* 5126 */ { MAD_F(0x0564fe39) /* 0.337156508 */, 18 }, - /* 5127 */ { MAD_F(0x05655a2f) /* 0.337244209 */, 18 }, - /* 5128 */ { MAD_F(0x0565b627) /* 0.337331916 */, 18 }, - /* 5129 */ { MAD_F(0x05661220) /* 0.337419629 */, 18 }, - /* 5130 */ { MAD_F(0x05666e1a) /* 0.337507347 */, 18 }, - /* 5131 */ { MAD_F(0x0566ca17) /* 0.337595071 */, 18 }, - /* 5132 */ { MAD_F(0x05672614) /* 0.337682801 */, 18 }, - /* 5133 */ { MAD_F(0x05678214) /* 0.337770537 */, 18 }, - /* 5134 */ { MAD_F(0x0567de15) /* 0.337858278 */, 18 }, - /* 5135 */ { MAD_F(0x05683a17) /* 0.337946025 */, 18 }, - - /* 5136 */ { MAD_F(0x0568961b) /* 0.338033777 */, 18 }, - /* 5137 */ { MAD_F(0x0568f220) /* 0.338121535 */, 18 }, - /* 5138 */ { MAD_F(0x05694e27) /* 0.338209299 */, 18 }, - /* 5139 */ { MAD_F(0x0569aa30) /* 0.338297069 */, 18 }, - /* 5140 */ { MAD_F(0x056a063a) /* 0.338384844 */, 18 }, - /* 5141 */ { MAD_F(0x056a6245) /* 0.338472625 */, 18 }, - /* 5142 */ { MAD_F(0x056abe52) /* 0.338560412 */, 18 }, - /* 5143 */ { MAD_F(0x056b1a61) /* 0.338648204 */, 18 }, - /* 5144 */ { MAD_F(0x056b7671) /* 0.338736002 */, 18 }, - /* 5145 */ { MAD_F(0x056bd283) /* 0.338823806 */, 18 }, - /* 5146 */ { MAD_F(0x056c2e96) /* 0.338911616 */, 18 }, - /* 5147 */ { MAD_F(0x056c8aab) /* 0.338999431 */, 18 }, - /* 5148 */ { MAD_F(0x056ce6c1) /* 0.339087252 */, 18 }, - /* 5149 */ { MAD_F(0x056d42d9) /* 0.339175078 */, 18 }, - /* 5150 */ { MAD_F(0x056d9ef2) /* 0.339262910 */, 18 }, - /* 5151 */ { MAD_F(0x056dfb0d) /* 0.339350748 */, 18 }, - - /* 5152 */ { MAD_F(0x056e5729) /* 0.339438592 */, 18 }, - /* 5153 */ { MAD_F(0x056eb347) /* 0.339526441 */, 18 }, - /* 5154 */ { MAD_F(0x056f0f66) /* 0.339614296 */, 18 }, - /* 5155 */ { MAD_F(0x056f6b87) /* 0.339702157 */, 18 }, - /* 5156 */ { MAD_F(0x056fc7aa) /* 0.339790023 */, 18 }, - /* 5157 */ { MAD_F(0x057023cd) /* 0.339877895 */, 18 }, - /* 5158 */ { MAD_F(0x05707ff3) /* 0.339965773 */, 18 }, - /* 5159 */ { MAD_F(0x0570dc1a) /* 0.340053656 */, 18 }, - /* 5160 */ { MAD_F(0x05713843) /* 0.340141545 */, 18 }, - /* 5161 */ { MAD_F(0x0571946d) /* 0.340229440 */, 18 }, - /* 5162 */ { MAD_F(0x0571f098) /* 0.340317340 */, 18 }, - /* 5163 */ { MAD_F(0x05724cc5) /* 0.340405246 */, 18 }, - /* 5164 */ { MAD_F(0x0572a8f4) /* 0.340493158 */, 18 }, - /* 5165 */ { MAD_F(0x05730524) /* 0.340581075 */, 18 }, - /* 5166 */ { MAD_F(0x05736156) /* 0.340668999 */, 18 }, - /* 5167 */ { MAD_F(0x0573bd89) /* 0.340756927 */, 18 }, - - /* 5168 */ { MAD_F(0x057419be) /* 0.340844862 */, 18 }, - /* 5169 */ { MAD_F(0x057475f4) /* 0.340932802 */, 18 }, - /* 5170 */ { MAD_F(0x0574d22c) /* 0.341020748 */, 18 }, - /* 5171 */ { MAD_F(0x05752e65) /* 0.341108699 */, 18 }, - /* 5172 */ { MAD_F(0x05758aa0) /* 0.341196656 */, 18 }, - /* 5173 */ { MAD_F(0x0575e6dc) /* 0.341284619 */, 18 }, - /* 5174 */ { MAD_F(0x0576431a) /* 0.341372587 */, 18 }, - /* 5175 */ { MAD_F(0x05769f59) /* 0.341460562 */, 18 }, - /* 5176 */ { MAD_F(0x0576fb9a) /* 0.341548541 */, 18 }, - /* 5177 */ { MAD_F(0x057757dd) /* 0.341636527 */, 18 }, - /* 5178 */ { MAD_F(0x0577b421) /* 0.341724518 */, 18 }, - /* 5179 */ { MAD_F(0x05781066) /* 0.341812515 */, 18 }, - /* 5180 */ { MAD_F(0x05786cad) /* 0.341900517 */, 18 }, - /* 5181 */ { MAD_F(0x0578c8f5) /* 0.341988525 */, 18 }, - /* 5182 */ { MAD_F(0x0579253f) /* 0.342076539 */, 18 }, - /* 5183 */ { MAD_F(0x0579818b) /* 0.342164558 */, 18 }, - - /* 5184 */ { MAD_F(0x0579ddd8) /* 0.342252584 */, 18 }, - /* 5185 */ { MAD_F(0x057a3a27) /* 0.342340614 */, 18 }, - /* 5186 */ { MAD_F(0x057a9677) /* 0.342428651 */, 18 }, - /* 5187 */ { MAD_F(0x057af2c8) /* 0.342516693 */, 18 }, - /* 5188 */ { MAD_F(0x057b4f1c) /* 0.342604741 */, 18 }, - /* 5189 */ { MAD_F(0x057bab70) /* 0.342692794 */, 18 }, - /* 5190 */ { MAD_F(0x057c07c6) /* 0.342780853 */, 18 }, - /* 5191 */ { MAD_F(0x057c641e) /* 0.342868918 */, 18 }, - /* 5192 */ { MAD_F(0x057cc077) /* 0.342956988 */, 18 }, - /* 5193 */ { MAD_F(0x057d1cd2) /* 0.343045064 */, 18 }, - /* 5194 */ { MAD_F(0x057d792e) /* 0.343133146 */, 18 }, - /* 5195 */ { MAD_F(0x057dd58c) /* 0.343221233 */, 18 }, - /* 5196 */ { MAD_F(0x057e31eb) /* 0.343309326 */, 18 }, - /* 5197 */ { MAD_F(0x057e8e4c) /* 0.343397425 */, 18 }, - /* 5198 */ { MAD_F(0x057eeaae) /* 0.343485529 */, 18 }, - /* 5199 */ { MAD_F(0x057f4712) /* 0.343573639 */, 18 }, - - /* 5200 */ { MAD_F(0x057fa378) /* 0.343661754 */, 18 }, - /* 5201 */ { MAD_F(0x057fffde) /* 0.343749876 */, 18 }, - /* 5202 */ { MAD_F(0x05805c47) /* 0.343838003 */, 18 }, - /* 5203 */ { MAD_F(0x0580b8b1) /* 0.343926135 */, 18 }, - /* 5204 */ { MAD_F(0x0581151c) /* 0.344014273 */, 18 }, - /* 5205 */ { MAD_F(0x05817189) /* 0.344102417 */, 18 }, - /* 5206 */ { MAD_F(0x0581cdf7) /* 0.344190566 */, 18 }, - /* 5207 */ { MAD_F(0x05822a67) /* 0.344278722 */, 18 }, - /* 5208 */ { MAD_F(0x058286d9) /* 0.344366882 */, 18 }, - /* 5209 */ { MAD_F(0x0582e34c) /* 0.344455049 */, 18 }, - /* 5210 */ { MAD_F(0x05833fc0) /* 0.344543221 */, 18 }, - /* 5211 */ { MAD_F(0x05839c36) /* 0.344631398 */, 18 }, - /* 5212 */ { MAD_F(0x0583f8ae) /* 0.344719582 */, 18 }, - /* 5213 */ { MAD_F(0x05845527) /* 0.344807771 */, 18 }, - /* 5214 */ { MAD_F(0x0584b1a1) /* 0.344895965 */, 18 }, - /* 5215 */ { MAD_F(0x05850e1e) /* 0.344984165 */, 18 }, - - /* 5216 */ { MAD_F(0x05856a9b) /* 0.345072371 */, 18 }, - /* 5217 */ { MAD_F(0x0585c71a) /* 0.345160583 */, 18 }, - /* 5218 */ { MAD_F(0x0586239b) /* 0.345248800 */, 18 }, - /* 5219 */ { MAD_F(0x0586801d) /* 0.345337023 */, 18 }, - /* 5220 */ { MAD_F(0x0586dca1) /* 0.345425251 */, 18 }, - /* 5221 */ { MAD_F(0x05873926) /* 0.345513485 */, 18 }, - /* 5222 */ { MAD_F(0x058795ac) /* 0.345601725 */, 18 }, - /* 5223 */ { MAD_F(0x0587f235) /* 0.345689970 */, 18 }, - /* 5224 */ { MAD_F(0x05884ebe) /* 0.345778221 */, 18 }, - /* 5225 */ { MAD_F(0x0588ab49) /* 0.345866478 */, 18 }, - /* 5226 */ { MAD_F(0x058907d6) /* 0.345954740 */, 18 }, - /* 5227 */ { MAD_F(0x05896464) /* 0.346043008 */, 18 }, - /* 5228 */ { MAD_F(0x0589c0f4) /* 0.346131281 */, 18 }, - /* 5229 */ { MAD_F(0x058a1d85) /* 0.346219560 */, 18 }, - /* 5230 */ { MAD_F(0x058a7a18) /* 0.346307845 */, 18 }, - /* 5231 */ { MAD_F(0x058ad6ac) /* 0.346396135 */, 18 }, - - /* 5232 */ { MAD_F(0x058b3342) /* 0.346484431 */, 18 }, - /* 5233 */ { MAD_F(0x058b8fd9) /* 0.346572733 */, 18 }, - /* 5234 */ { MAD_F(0x058bec72) /* 0.346661040 */, 18 }, - /* 5235 */ { MAD_F(0x058c490c) /* 0.346749353 */, 18 }, - /* 5236 */ { MAD_F(0x058ca5a8) /* 0.346837671 */, 18 }, - /* 5237 */ { MAD_F(0x058d0246) /* 0.346925996 */, 18 }, - /* 5238 */ { MAD_F(0x058d5ee4) /* 0.347014325 */, 18 }, - /* 5239 */ { MAD_F(0x058dbb85) /* 0.347102661 */, 18 }, - /* 5240 */ { MAD_F(0x058e1827) /* 0.347191002 */, 18 }, - /* 5241 */ { MAD_F(0x058e74ca) /* 0.347279348 */, 18 }, - /* 5242 */ { MAD_F(0x058ed16f) /* 0.347367700 */, 18 }, - /* 5243 */ { MAD_F(0x058f2e15) /* 0.347456058 */, 18 }, - /* 5244 */ { MAD_F(0x058f8abd) /* 0.347544422 */, 18 }, - /* 5245 */ { MAD_F(0x058fe766) /* 0.347632791 */, 18 }, - /* 5246 */ { MAD_F(0x05904411) /* 0.347721165 */, 18 }, - /* 5247 */ { MAD_F(0x0590a0be) /* 0.347809546 */, 18 }, - - /* 5248 */ { MAD_F(0x0590fd6c) /* 0.347897931 */, 18 }, - /* 5249 */ { MAD_F(0x05915a1b) /* 0.347986323 */, 18 }, - /* 5250 */ { MAD_F(0x0591b6cc) /* 0.348074720 */, 18 }, - /* 5251 */ { MAD_F(0x0592137e) /* 0.348163123 */, 18 }, - /* 5252 */ { MAD_F(0x05927032) /* 0.348251531 */, 18 }, - /* 5253 */ { MAD_F(0x0592cce8) /* 0.348339945 */, 18 }, - /* 5254 */ { MAD_F(0x0593299f) /* 0.348428365 */, 18 }, - /* 5255 */ { MAD_F(0x05938657) /* 0.348516790 */, 18 }, - /* 5256 */ { MAD_F(0x0593e311) /* 0.348605221 */, 18 }, - /* 5257 */ { MAD_F(0x05943fcd) /* 0.348693657 */, 18 }, - /* 5258 */ { MAD_F(0x05949c8a) /* 0.348782099 */, 18 }, - /* 5259 */ { MAD_F(0x0594f948) /* 0.348870547 */, 18 }, - /* 5260 */ { MAD_F(0x05955608) /* 0.348959000 */, 18 }, - /* 5261 */ { MAD_F(0x0595b2ca) /* 0.349047459 */, 18 }, - /* 5262 */ { MAD_F(0x05960f8c) /* 0.349135923 */, 18 }, - /* 5263 */ { MAD_F(0x05966c51) /* 0.349224393 */, 18 }, - - /* 5264 */ { MAD_F(0x0596c917) /* 0.349312869 */, 18 }, - /* 5265 */ { MAD_F(0x059725de) /* 0.349401350 */, 18 }, - /* 5266 */ { MAD_F(0x059782a7) /* 0.349489837 */, 18 }, - /* 5267 */ { MAD_F(0x0597df72) /* 0.349578329 */, 18 }, - /* 5268 */ { MAD_F(0x05983c3e) /* 0.349666827 */, 18 }, - /* 5269 */ { MAD_F(0x0598990c) /* 0.349755331 */, 18 }, - /* 5270 */ { MAD_F(0x0598f5db) /* 0.349843840 */, 18 }, - /* 5271 */ { MAD_F(0x059952ab) /* 0.349932355 */, 18 }, - /* 5272 */ { MAD_F(0x0599af7d) /* 0.350020876 */, 18 }, - /* 5273 */ { MAD_F(0x059a0c51) /* 0.350109402 */, 18 }, - /* 5274 */ { MAD_F(0x059a6926) /* 0.350197933 */, 18 }, - /* 5275 */ { MAD_F(0x059ac5fc) /* 0.350286470 */, 18 }, - /* 5276 */ { MAD_F(0x059b22d4) /* 0.350375013 */, 18 }, - /* 5277 */ { MAD_F(0x059b7fae) /* 0.350463562 */, 18 }, - /* 5278 */ { MAD_F(0x059bdc89) /* 0.350552116 */, 18 }, - /* 5279 */ { MAD_F(0x059c3965) /* 0.350640675 */, 18 }, - - /* 5280 */ { MAD_F(0x059c9643) /* 0.350729240 */, 18 }, - /* 5281 */ { MAD_F(0x059cf323) /* 0.350817811 */, 18 }, - /* 5282 */ { MAD_F(0x059d5004) /* 0.350906388 */, 18 }, - /* 5283 */ { MAD_F(0x059dace6) /* 0.350994970 */, 18 }, - /* 5284 */ { MAD_F(0x059e09cb) /* 0.351083557 */, 18 }, - /* 5285 */ { MAD_F(0x059e66b0) /* 0.351172150 */, 18 }, - /* 5286 */ { MAD_F(0x059ec397) /* 0.351260749 */, 18 }, - /* 5287 */ { MAD_F(0x059f2080) /* 0.351349353 */, 18 }, - /* 5288 */ { MAD_F(0x059f7d6a) /* 0.351437963 */, 18 }, - /* 5289 */ { MAD_F(0x059fda55) /* 0.351526579 */, 18 }, - /* 5290 */ { MAD_F(0x05a03742) /* 0.351615200 */, 18 }, - /* 5291 */ { MAD_F(0x05a09431) /* 0.351703827 */, 18 }, - /* 5292 */ { MAD_F(0x05a0f121) /* 0.351792459 */, 18 }, - /* 5293 */ { MAD_F(0x05a14e12) /* 0.351881097 */, 18 }, - /* 5294 */ { MAD_F(0x05a1ab05) /* 0.351969740 */, 18 }, - /* 5295 */ { MAD_F(0x05a207fa) /* 0.352058389 */, 18 }, - - /* 5296 */ { MAD_F(0x05a264f0) /* 0.352147044 */, 18 }, - /* 5297 */ { MAD_F(0x05a2c1e7) /* 0.352235704 */, 18 }, - /* 5298 */ { MAD_F(0x05a31ee1) /* 0.352324369 */, 18 }, - /* 5299 */ { MAD_F(0x05a37bdb) /* 0.352413041 */, 18 }, - /* 5300 */ { MAD_F(0x05a3d8d7) /* 0.352501718 */, 18 }, - /* 5301 */ { MAD_F(0x05a435d5) /* 0.352590400 */, 18 }, - /* 5302 */ { MAD_F(0x05a492d4) /* 0.352679088 */, 18 }, - /* 5303 */ { MAD_F(0x05a4efd4) /* 0.352767782 */, 18 }, - /* 5304 */ { MAD_F(0x05a54cd6) /* 0.352856481 */, 18 }, - /* 5305 */ { MAD_F(0x05a5a9da) /* 0.352945186 */, 18 }, - /* 5306 */ { MAD_F(0x05a606df) /* 0.353033896 */, 18 }, - /* 5307 */ { MAD_F(0x05a663e5) /* 0.353122612 */, 18 }, - /* 5308 */ { MAD_F(0x05a6c0ed) /* 0.353211333 */, 18 }, - /* 5309 */ { MAD_F(0x05a71df7) /* 0.353300061 */, 18 }, - /* 5310 */ { MAD_F(0x05a77b02) /* 0.353388793 */, 18 }, - /* 5311 */ { MAD_F(0x05a7d80e) /* 0.353477531 */, 18 }, - - /* 5312 */ { MAD_F(0x05a8351c) /* 0.353566275 */, 18 }, - /* 5313 */ { MAD_F(0x05a8922c) /* 0.353655024 */, 18 }, - /* 5314 */ { MAD_F(0x05a8ef3c) /* 0.353743779 */, 18 }, - /* 5315 */ { MAD_F(0x05a94c4f) /* 0.353832540 */, 18 }, - /* 5316 */ { MAD_F(0x05a9a963) /* 0.353921306 */, 18 }, - /* 5317 */ { MAD_F(0x05aa0678) /* 0.354010077 */, 18 }, - /* 5318 */ { MAD_F(0x05aa638f) /* 0.354098855 */, 18 }, - /* 5319 */ { MAD_F(0x05aac0a8) /* 0.354187637 */, 18 }, - /* 5320 */ { MAD_F(0x05ab1dc2) /* 0.354276426 */, 18 }, - /* 5321 */ { MAD_F(0x05ab7add) /* 0.354365220 */, 18 }, - /* 5322 */ { MAD_F(0x05abd7fa) /* 0.354454019 */, 18 }, - /* 5323 */ { MAD_F(0x05ac3518) /* 0.354542824 */, 18 }, - /* 5324 */ { MAD_F(0x05ac9238) /* 0.354631635 */, 18 }, - /* 5325 */ { MAD_F(0x05acef5a) /* 0.354720451 */, 18 }, - /* 5326 */ { MAD_F(0x05ad4c7d) /* 0.354809272 */, 18 }, - /* 5327 */ { MAD_F(0x05ada9a1) /* 0.354898100 */, 18 }, - - /* 5328 */ { MAD_F(0x05ae06c7) /* 0.354986932 */, 18 }, - /* 5329 */ { MAD_F(0x05ae63ee) /* 0.355075771 */, 18 }, - /* 5330 */ { MAD_F(0x05aec117) /* 0.355164615 */, 18 }, - /* 5331 */ { MAD_F(0x05af1e41) /* 0.355253464 */, 18 }, - /* 5332 */ { MAD_F(0x05af7b6d) /* 0.355342319 */, 18 }, - /* 5333 */ { MAD_F(0x05afd89b) /* 0.355431180 */, 18 }, - /* 5334 */ { MAD_F(0x05b035c9) /* 0.355520046 */, 18 }, - /* 5335 */ { MAD_F(0x05b092fa) /* 0.355608917 */, 18 }, - /* 5336 */ { MAD_F(0x05b0f02b) /* 0.355697795 */, 18 }, - /* 5337 */ { MAD_F(0x05b14d5f) /* 0.355786677 */, 18 }, - /* 5338 */ { MAD_F(0x05b1aa94) /* 0.355875566 */, 18 }, - /* 5339 */ { MAD_F(0x05b207ca) /* 0.355964460 */, 18 }, - /* 5340 */ { MAD_F(0x05b26502) /* 0.356053359 */, 18 }, - /* 5341 */ { MAD_F(0x05b2c23b) /* 0.356142264 */, 18 }, - /* 5342 */ { MAD_F(0x05b31f76) /* 0.356231175 */, 18 }, - /* 5343 */ { MAD_F(0x05b37cb2) /* 0.356320091 */, 18 }, - - /* 5344 */ { MAD_F(0x05b3d9f0) /* 0.356409012 */, 18 }, - /* 5345 */ { MAD_F(0x05b4372f) /* 0.356497940 */, 18 }, - /* 5346 */ { MAD_F(0x05b4946f) /* 0.356586872 */, 18 }, - /* 5347 */ { MAD_F(0x05b4f1b2) /* 0.356675811 */, 18 }, - /* 5348 */ { MAD_F(0x05b54ef5) /* 0.356764754 */, 18 }, - /* 5349 */ { MAD_F(0x05b5ac3a) /* 0.356853704 */, 18 }, - /* 5350 */ { MAD_F(0x05b60981) /* 0.356942659 */, 18 }, - /* 5351 */ { MAD_F(0x05b666c9) /* 0.357031619 */, 18 }, - /* 5352 */ { MAD_F(0x05b6c413) /* 0.357120585 */, 18 }, - /* 5353 */ { MAD_F(0x05b7215e) /* 0.357209557 */, 18 }, - /* 5354 */ { MAD_F(0x05b77eab) /* 0.357298534 */, 18 }, - /* 5355 */ { MAD_F(0x05b7dbf9) /* 0.357387516 */, 18 }, - /* 5356 */ { MAD_F(0x05b83948) /* 0.357476504 */, 18 }, - /* 5357 */ { MAD_F(0x05b89699) /* 0.357565498 */, 18 }, - /* 5358 */ { MAD_F(0x05b8f3ec) /* 0.357654497 */, 18 }, - /* 5359 */ { MAD_F(0x05b95140) /* 0.357743502 */, 18 }, - - /* 5360 */ { MAD_F(0x05b9ae95) /* 0.357832512 */, 18 }, - /* 5361 */ { MAD_F(0x05ba0bec) /* 0.357921528 */, 18 }, - /* 5362 */ { MAD_F(0x05ba6945) /* 0.358010550 */, 18 }, - /* 5363 */ { MAD_F(0x05bac69f) /* 0.358099576 */, 18 }, - /* 5364 */ { MAD_F(0x05bb23fa) /* 0.358188609 */, 18 }, - /* 5365 */ { MAD_F(0x05bb8157) /* 0.358277647 */, 18 }, - /* 5366 */ { MAD_F(0x05bbdeb6) /* 0.358366690 */, 18 }, - /* 5367 */ { MAD_F(0x05bc3c16) /* 0.358455739 */, 18 }, - /* 5368 */ { MAD_F(0x05bc9977) /* 0.358544794 */, 18 }, - /* 5369 */ { MAD_F(0x05bcf6da) /* 0.358633854 */, 18 }, - /* 5370 */ { MAD_F(0x05bd543e) /* 0.358722920 */, 18 }, - /* 5371 */ { MAD_F(0x05bdb1a4) /* 0.358811991 */, 18 }, - /* 5372 */ { MAD_F(0x05be0f0b) /* 0.358901067 */, 18 }, - /* 5373 */ { MAD_F(0x05be6c74) /* 0.358990150 */, 18 }, - /* 5374 */ { MAD_F(0x05bec9df) /* 0.359079237 */, 18 }, - /* 5375 */ { MAD_F(0x05bf274a) /* 0.359168331 */, 18 }, - - /* 5376 */ { MAD_F(0x05bf84b8) /* 0.359257429 */, 18 }, - /* 5377 */ { MAD_F(0x05bfe226) /* 0.359346534 */, 18 }, - /* 5378 */ { MAD_F(0x05c03f97) /* 0.359435644 */, 18 }, - /* 5379 */ { MAD_F(0x05c09d08) /* 0.359524759 */, 18 }, - /* 5380 */ { MAD_F(0x05c0fa7c) /* 0.359613880 */, 18 }, - /* 5381 */ { MAD_F(0x05c157f0) /* 0.359703006 */, 18 }, - /* 5382 */ { MAD_F(0x05c1b566) /* 0.359792138 */, 18 }, - /* 5383 */ { MAD_F(0x05c212de) /* 0.359881276 */, 18 }, - /* 5384 */ { MAD_F(0x05c27057) /* 0.359970419 */, 18 }, - /* 5385 */ { MAD_F(0x05c2cdd2) /* 0.360059567 */, 18 }, - /* 5386 */ { MAD_F(0x05c32b4e) /* 0.360148721 */, 18 }, - /* 5387 */ { MAD_F(0x05c388cb) /* 0.360237881 */, 18 }, - /* 5388 */ { MAD_F(0x05c3e64b) /* 0.360327046 */, 18 }, - /* 5389 */ { MAD_F(0x05c443cb) /* 0.360416216 */, 18 }, - /* 5390 */ { MAD_F(0x05c4a14d) /* 0.360505392 */, 18 }, - /* 5391 */ { MAD_F(0x05c4fed1) /* 0.360594574 */, 18 }, - - /* 5392 */ { MAD_F(0x05c55c56) /* 0.360683761 */, 18 }, - /* 5393 */ { MAD_F(0x05c5b9dc) /* 0.360772953 */, 18 }, - /* 5394 */ { MAD_F(0x05c61764) /* 0.360862152 */, 18 }, - /* 5395 */ { MAD_F(0x05c674ed) /* 0.360951355 */, 18 }, - /* 5396 */ { MAD_F(0x05c6d278) /* 0.361040564 */, 18 }, - /* 5397 */ { MAD_F(0x05c73005) /* 0.361129779 */, 18 }, - /* 5398 */ { MAD_F(0x05c78d93) /* 0.361218999 */, 18 }, - /* 5399 */ { MAD_F(0x05c7eb22) /* 0.361308225 */, 18 }, - /* 5400 */ { MAD_F(0x05c848b3) /* 0.361397456 */, 18 }, - /* 5401 */ { MAD_F(0x05c8a645) /* 0.361486693 */, 18 }, - /* 5402 */ { MAD_F(0x05c903d9) /* 0.361575935 */, 18 }, - /* 5403 */ { MAD_F(0x05c9616e) /* 0.361665183 */, 18 }, - /* 5404 */ { MAD_F(0x05c9bf05) /* 0.361754436 */, 18 }, - /* 5405 */ { MAD_F(0x05ca1c9d) /* 0.361843695 */, 18 }, - /* 5406 */ { MAD_F(0x05ca7a37) /* 0.361932959 */, 18 }, - /* 5407 */ { MAD_F(0x05cad7d2) /* 0.362022229 */, 18 }, - - /* 5408 */ { MAD_F(0x05cb356e) /* 0.362111504 */, 18 }, - /* 5409 */ { MAD_F(0x05cb930d) /* 0.362200785 */, 18 }, - /* 5410 */ { MAD_F(0x05cbf0ac) /* 0.362290071 */, 18 }, - /* 5411 */ { MAD_F(0x05cc4e4d) /* 0.362379362 */, 18 }, - /* 5412 */ { MAD_F(0x05ccabf0) /* 0.362468660 */, 18 }, - /* 5413 */ { MAD_F(0x05cd0994) /* 0.362557962 */, 18 }, - /* 5414 */ { MAD_F(0x05cd6739) /* 0.362647271 */, 18 }, - /* 5415 */ { MAD_F(0x05cdc4e0) /* 0.362736584 */, 18 }, - /* 5416 */ { MAD_F(0x05ce2289) /* 0.362825904 */, 18 }, - /* 5417 */ { MAD_F(0x05ce8033) /* 0.362915228 */, 18 }, - /* 5418 */ { MAD_F(0x05ceddde) /* 0.363004559 */, 18 }, - /* 5419 */ { MAD_F(0x05cf3b8b) /* 0.363093894 */, 18 }, - /* 5420 */ { MAD_F(0x05cf9939) /* 0.363183236 */, 18 }, - /* 5421 */ { MAD_F(0x05cff6e9) /* 0.363272582 */, 18 }, - /* 5422 */ { MAD_F(0x05d0549a) /* 0.363361935 */, 18 }, - /* 5423 */ { MAD_F(0x05d0b24d) /* 0.363451292 */, 18 }, - - /* 5424 */ { MAD_F(0x05d11001) /* 0.363540655 */, 18 }, - /* 5425 */ { MAD_F(0x05d16db7) /* 0.363630024 */, 18 }, - /* 5426 */ { MAD_F(0x05d1cb6e) /* 0.363719398 */, 18 }, - /* 5427 */ { MAD_F(0x05d22927) /* 0.363808778 */, 18 }, - /* 5428 */ { MAD_F(0x05d286e1) /* 0.363898163 */, 18 }, - /* 5429 */ { MAD_F(0x05d2e49d) /* 0.363987554 */, 18 }, - /* 5430 */ { MAD_F(0x05d3425a) /* 0.364076950 */, 18 }, - /* 5431 */ { MAD_F(0x05d3a018) /* 0.364166352 */, 18 }, - /* 5432 */ { MAD_F(0x05d3fdd8) /* 0.364255759 */, 18 }, - /* 5433 */ { MAD_F(0x05d45b9a) /* 0.364345171 */, 18 }, - /* 5434 */ { MAD_F(0x05d4b95d) /* 0.364434589 */, 18 }, - /* 5435 */ { MAD_F(0x05d51721) /* 0.364524013 */, 18 }, - /* 5436 */ { MAD_F(0x05d574e7) /* 0.364613442 */, 18 }, - /* 5437 */ { MAD_F(0x05d5d2af) /* 0.364702877 */, 18 }, - /* 5438 */ { MAD_F(0x05d63078) /* 0.364792317 */, 18 }, - /* 5439 */ { MAD_F(0x05d68e42) /* 0.364881762 */, 18 }, - - /* 5440 */ { MAD_F(0x05d6ec0e) /* 0.364971213 */, 18 }, - /* 5441 */ { MAD_F(0x05d749db) /* 0.365060669 */, 18 }, - /* 5442 */ { MAD_F(0x05d7a7aa) /* 0.365150131 */, 18 }, - /* 5443 */ { MAD_F(0x05d8057a) /* 0.365239599 */, 18 }, - /* 5444 */ { MAD_F(0x05d8634c) /* 0.365329072 */, 18 }, - /* 5445 */ { MAD_F(0x05d8c11f) /* 0.365418550 */, 18 }, - /* 5446 */ { MAD_F(0x05d91ef4) /* 0.365508034 */, 18 }, - /* 5447 */ { MAD_F(0x05d97cca) /* 0.365597523 */, 18 }, - /* 5448 */ { MAD_F(0x05d9daa1) /* 0.365687018 */, 18 }, - /* 5449 */ { MAD_F(0x05da387a) /* 0.365776518 */, 18 }, - /* 5450 */ { MAD_F(0x05da9655) /* 0.365866024 */, 18 }, - /* 5451 */ { MAD_F(0x05daf431) /* 0.365955536 */, 18 }, - /* 5452 */ { MAD_F(0x05db520e) /* 0.366045052 */, 18 }, - /* 5453 */ { MAD_F(0x05dbafed) /* 0.366134574 */, 18 }, - /* 5454 */ { MAD_F(0x05dc0dce) /* 0.366224102 */, 18 }, - /* 5455 */ { MAD_F(0x05dc6baf) /* 0.366313635 */, 18 }, - - /* 5456 */ { MAD_F(0x05dcc993) /* 0.366403174 */, 18 }, - /* 5457 */ { MAD_F(0x05dd2778) /* 0.366492718 */, 18 }, - /* 5458 */ { MAD_F(0x05dd855e) /* 0.366582267 */, 18 }, - /* 5459 */ { MAD_F(0x05dde346) /* 0.366671822 */, 18 }, - /* 5460 */ { MAD_F(0x05de412f) /* 0.366761383 */, 18 }, - /* 5461 */ { MAD_F(0x05de9f1a) /* 0.366850949 */, 18 }, - /* 5462 */ { MAD_F(0x05defd06) /* 0.366940520 */, 18 }, - /* 5463 */ { MAD_F(0x05df5af3) /* 0.367030097 */, 18 }, - /* 5464 */ { MAD_F(0x05dfb8e2) /* 0.367119680 */, 18 }, - /* 5465 */ { MAD_F(0x05e016d3) /* 0.367209267 */, 18 }, - /* 5466 */ { MAD_F(0x05e074c5) /* 0.367298861 */, 18 }, - /* 5467 */ { MAD_F(0x05e0d2b8) /* 0.367388459 */, 18 }, - /* 5468 */ { MAD_F(0x05e130ad) /* 0.367478064 */, 18 }, - /* 5469 */ { MAD_F(0x05e18ea4) /* 0.367567673 */, 18 }, - /* 5470 */ { MAD_F(0x05e1ec9c) /* 0.367657288 */, 18 }, - /* 5471 */ { MAD_F(0x05e24a95) /* 0.367746909 */, 18 }, - - /* 5472 */ { MAD_F(0x05e2a890) /* 0.367836535 */, 18 }, - /* 5473 */ { MAD_F(0x05e3068c) /* 0.367926167 */, 18 }, - /* 5474 */ { MAD_F(0x05e3648a) /* 0.368015804 */, 18 }, - /* 5475 */ { MAD_F(0x05e3c289) /* 0.368105446 */, 18 }, - /* 5476 */ { MAD_F(0x05e4208a) /* 0.368195094 */, 18 }, - /* 5477 */ { MAD_F(0x05e47e8c) /* 0.368284747 */, 18 }, - /* 5478 */ { MAD_F(0x05e4dc8f) /* 0.368374406 */, 18 }, - /* 5479 */ { MAD_F(0x05e53a94) /* 0.368464070 */, 18 }, - /* 5480 */ { MAD_F(0x05e5989b) /* 0.368553740 */, 18 }, - /* 5481 */ { MAD_F(0x05e5f6a3) /* 0.368643415 */, 18 }, - /* 5482 */ { MAD_F(0x05e654ac) /* 0.368733096 */, 18 }, - /* 5483 */ { MAD_F(0x05e6b2b7) /* 0.368822782 */, 18 }, - /* 5484 */ { MAD_F(0x05e710c4) /* 0.368912473 */, 18 }, - /* 5485 */ { MAD_F(0x05e76ed2) /* 0.369002170 */, 18 }, - /* 5486 */ { MAD_F(0x05e7cce1) /* 0.369091873 */, 18 }, - /* 5487 */ { MAD_F(0x05e82af2) /* 0.369181581 */, 18 }, - - /* 5488 */ { MAD_F(0x05e88904) /* 0.369271294 */, 18 }, - /* 5489 */ { MAD_F(0x05e8e718) /* 0.369361013 */, 18 }, - /* 5490 */ { MAD_F(0x05e9452d) /* 0.369450737 */, 18 }, - /* 5491 */ { MAD_F(0x05e9a343) /* 0.369540467 */, 18 }, - /* 5492 */ { MAD_F(0x05ea015c) /* 0.369630202 */, 18 }, - /* 5493 */ { MAD_F(0x05ea5f75) /* 0.369719942 */, 18 }, - /* 5494 */ { MAD_F(0x05eabd90) /* 0.369809688 */, 18 }, - /* 5495 */ { MAD_F(0x05eb1bad) /* 0.369899440 */, 18 }, - /* 5496 */ { MAD_F(0x05eb79cb) /* 0.369989197 */, 18 }, - /* 5497 */ { MAD_F(0x05ebd7ea) /* 0.370078959 */, 18 }, - /* 5498 */ { MAD_F(0x05ec360b) /* 0.370168727 */, 18 }, - /* 5499 */ { MAD_F(0x05ec942d) /* 0.370258500 */, 18 }, - /* 5500 */ { MAD_F(0x05ecf251) /* 0.370348279 */, 18 }, - /* 5501 */ { MAD_F(0x05ed5076) /* 0.370438063 */, 18 }, - /* 5502 */ { MAD_F(0x05edae9d) /* 0.370527853 */, 18 }, - /* 5503 */ { MAD_F(0x05ee0cc5) /* 0.370617648 */, 18 }, - - /* 5504 */ { MAD_F(0x05ee6aef) /* 0.370707448 */, 18 }, - /* 5505 */ { MAD_F(0x05eec91a) /* 0.370797254 */, 18 }, - /* 5506 */ { MAD_F(0x05ef2746) /* 0.370887065 */, 18 }, - /* 5507 */ { MAD_F(0x05ef8574) /* 0.370976882 */, 18 }, - /* 5508 */ { MAD_F(0x05efe3a4) /* 0.371066704 */, 18 }, - /* 5509 */ { MAD_F(0x05f041d5) /* 0.371156532 */, 18 }, - /* 5510 */ { MAD_F(0x05f0a007) /* 0.371246365 */, 18 }, - /* 5511 */ { MAD_F(0x05f0fe3b) /* 0.371336203 */, 18 }, - /* 5512 */ { MAD_F(0x05f15c70) /* 0.371426047 */, 18 }, - /* 5513 */ { MAD_F(0x05f1baa7) /* 0.371515897 */, 18 }, - /* 5514 */ { MAD_F(0x05f218df) /* 0.371605751 */, 18 }, - /* 5515 */ { MAD_F(0x05f27719) /* 0.371695612 */, 18 }, - /* 5516 */ { MAD_F(0x05f2d554) /* 0.371785477 */, 18 }, - /* 5517 */ { MAD_F(0x05f33390) /* 0.371875348 */, 18 }, - /* 5518 */ { MAD_F(0x05f391cf) /* 0.371965225 */, 18 }, - /* 5519 */ { MAD_F(0x05f3f00e) /* 0.372055107 */, 18 }, - - /* 5520 */ { MAD_F(0x05f44e4f) /* 0.372144994 */, 18 }, - /* 5521 */ { MAD_F(0x05f4ac91) /* 0.372234887 */, 18 }, - /* 5522 */ { MAD_F(0x05f50ad5) /* 0.372324785 */, 18 }, - /* 5523 */ { MAD_F(0x05f5691b) /* 0.372414689 */, 18 }, - /* 5524 */ { MAD_F(0x05f5c761) /* 0.372504598 */, 18 }, - /* 5525 */ { MAD_F(0x05f625aa) /* 0.372594513 */, 18 }, - /* 5526 */ { MAD_F(0x05f683f3) /* 0.372684433 */, 18 }, - /* 5527 */ { MAD_F(0x05f6e23f) /* 0.372774358 */, 18 }, - /* 5528 */ { MAD_F(0x05f7408b) /* 0.372864289 */, 18 }, - /* 5529 */ { MAD_F(0x05f79ed9) /* 0.372954225 */, 18 }, - /* 5530 */ { MAD_F(0x05f7fd29) /* 0.373044167 */, 18 }, - /* 5531 */ { MAD_F(0x05f85b7a) /* 0.373134114 */, 18 }, - /* 5532 */ { MAD_F(0x05f8b9cc) /* 0.373224066 */, 18 }, - /* 5533 */ { MAD_F(0x05f91820) /* 0.373314024 */, 18 }, - /* 5534 */ { MAD_F(0x05f97675) /* 0.373403987 */, 18 }, - /* 5535 */ { MAD_F(0x05f9d4cc) /* 0.373493956 */, 18 }, - - /* 5536 */ { MAD_F(0x05fa3324) /* 0.373583930 */, 18 }, - /* 5537 */ { MAD_F(0x05fa917e) /* 0.373673910 */, 18 }, - /* 5538 */ { MAD_F(0x05faefd9) /* 0.373763895 */, 18 }, - /* 5539 */ { MAD_F(0x05fb4e36) /* 0.373853885 */, 18 }, - /* 5540 */ { MAD_F(0x05fbac94) /* 0.373943881 */, 18 }, - /* 5541 */ { MAD_F(0x05fc0af3) /* 0.374033882 */, 18 }, - /* 5542 */ { MAD_F(0x05fc6954) /* 0.374123889 */, 18 }, - /* 5543 */ { MAD_F(0x05fcc7b7) /* 0.374213901 */, 18 }, - /* 5544 */ { MAD_F(0x05fd261b) /* 0.374303918 */, 18 }, - /* 5545 */ { MAD_F(0x05fd8480) /* 0.374393941 */, 18 }, - /* 5546 */ { MAD_F(0x05fde2e7) /* 0.374483970 */, 18 }, - /* 5547 */ { MAD_F(0x05fe414f) /* 0.374574003 */, 18 }, - /* 5548 */ { MAD_F(0x05fe9fb9) /* 0.374664042 */, 18 }, - /* 5549 */ { MAD_F(0x05fefe24) /* 0.374754087 */, 18 }, - /* 5550 */ { MAD_F(0x05ff5c91) /* 0.374844137 */, 18 }, - /* 5551 */ { MAD_F(0x05ffbaff) /* 0.374934192 */, 18 }, - - /* 5552 */ { MAD_F(0x0600196e) /* 0.375024253 */, 18 }, - /* 5553 */ { MAD_F(0x060077df) /* 0.375114319 */, 18 }, - /* 5554 */ { MAD_F(0x0600d651) /* 0.375204391 */, 18 }, - /* 5555 */ { MAD_F(0x060134c5) /* 0.375294468 */, 18 }, - /* 5556 */ { MAD_F(0x0601933b) /* 0.375384550 */, 18 }, - /* 5557 */ { MAD_F(0x0601f1b1) /* 0.375474638 */, 18 }, - /* 5558 */ { MAD_F(0x0602502a) /* 0.375564731 */, 18 }, - /* 5559 */ { MAD_F(0x0602aea3) /* 0.375654830 */, 18 }, - /* 5560 */ { MAD_F(0x06030d1e) /* 0.375744934 */, 18 }, - /* 5561 */ { MAD_F(0x06036b9b) /* 0.375835043 */, 18 }, - /* 5562 */ { MAD_F(0x0603ca19) /* 0.375925158 */, 18 }, - /* 5563 */ { MAD_F(0x06042898) /* 0.376015278 */, 18 }, - /* 5564 */ { MAD_F(0x06048719) /* 0.376105404 */, 18 }, - /* 5565 */ { MAD_F(0x0604e59c) /* 0.376195535 */, 18 }, - /* 5566 */ { MAD_F(0x0605441f) /* 0.376285671 */, 18 }, - /* 5567 */ { MAD_F(0x0605a2a5) /* 0.376375813 */, 18 }, - - /* 5568 */ { MAD_F(0x0606012b) /* 0.376465960 */, 18 }, - /* 5569 */ { MAD_F(0x06065fb4) /* 0.376556113 */, 18 }, - /* 5570 */ { MAD_F(0x0606be3d) /* 0.376646271 */, 18 }, - /* 5571 */ { MAD_F(0x06071cc8) /* 0.376736434 */, 18 }, - /* 5572 */ { MAD_F(0x06077b55) /* 0.376826603 */, 18 }, - /* 5573 */ { MAD_F(0x0607d9e3) /* 0.376916777 */, 18 }, - /* 5574 */ { MAD_F(0x06083872) /* 0.377006957 */, 18 }, - /* 5575 */ { MAD_F(0x06089703) /* 0.377097141 */, 18 }, - /* 5576 */ { MAD_F(0x0608f595) /* 0.377187332 */, 18 }, - /* 5577 */ { MAD_F(0x06095429) /* 0.377277528 */, 18 }, - /* 5578 */ { MAD_F(0x0609b2be) /* 0.377367729 */, 18 }, - /* 5579 */ { MAD_F(0x060a1155) /* 0.377457935 */, 18 }, - /* 5580 */ { MAD_F(0x060a6fed) /* 0.377548147 */, 18 }, - /* 5581 */ { MAD_F(0x060ace86) /* 0.377638364 */, 18 }, - /* 5582 */ { MAD_F(0x060b2d21) /* 0.377728587 */, 18 }, - /* 5583 */ { MAD_F(0x060b8bbe) /* 0.377818815 */, 18 }, - - /* 5584 */ { MAD_F(0x060bea5c) /* 0.377909049 */, 18 }, - /* 5585 */ { MAD_F(0x060c48fb) /* 0.377999288 */, 18 }, - /* 5586 */ { MAD_F(0x060ca79c) /* 0.378089532 */, 18 }, - /* 5587 */ { MAD_F(0x060d063e) /* 0.378179781 */, 18 }, - /* 5588 */ { MAD_F(0x060d64e1) /* 0.378270036 */, 18 }, - /* 5589 */ { MAD_F(0x060dc387) /* 0.378360297 */, 18 }, - /* 5590 */ { MAD_F(0x060e222d) /* 0.378450563 */, 18 }, - /* 5591 */ { MAD_F(0x060e80d5) /* 0.378540834 */, 18 }, - /* 5592 */ { MAD_F(0x060edf7f) /* 0.378631110 */, 18 }, - /* 5593 */ { MAD_F(0x060f3e29) /* 0.378721392 */, 18 }, - /* 5594 */ { MAD_F(0x060f9cd6) /* 0.378811680 */, 18 }, - /* 5595 */ { MAD_F(0x060ffb83) /* 0.378901972 */, 18 }, - /* 5596 */ { MAD_F(0x06105a33) /* 0.378992270 */, 18 }, - /* 5597 */ { MAD_F(0x0610b8e3) /* 0.379082574 */, 18 }, - /* 5598 */ { MAD_F(0x06111795) /* 0.379172883 */, 18 }, - /* 5599 */ { MAD_F(0x06117649) /* 0.379263197 */, 18 }, - - /* 5600 */ { MAD_F(0x0611d4fe) /* 0.379353516 */, 18 }, - /* 5601 */ { MAD_F(0x061233b4) /* 0.379443841 */, 18 }, - /* 5602 */ { MAD_F(0x0612926c) /* 0.379534172 */, 18 }, - /* 5603 */ { MAD_F(0x0612f125) /* 0.379624507 */, 18 }, - /* 5604 */ { MAD_F(0x06134fe0) /* 0.379714848 */, 18 }, - /* 5605 */ { MAD_F(0x0613ae9c) /* 0.379805195 */, 18 }, - /* 5606 */ { MAD_F(0x06140d5a) /* 0.379895547 */, 18 }, - /* 5607 */ { MAD_F(0x06146c19) /* 0.379985904 */, 18 }, - /* 5608 */ { MAD_F(0x0614cada) /* 0.380076266 */, 18 }, - /* 5609 */ { MAD_F(0x0615299c) /* 0.380166634 */, 18 }, - /* 5610 */ { MAD_F(0x0615885f) /* 0.380257008 */, 18 }, - /* 5611 */ { MAD_F(0x0615e724) /* 0.380347386 */, 18 }, - /* 5612 */ { MAD_F(0x061645ea) /* 0.380437770 */, 18 }, - /* 5613 */ { MAD_F(0x0616a4b2) /* 0.380528160 */, 18 }, - /* 5614 */ { MAD_F(0x0617037b) /* 0.380618555 */, 18 }, - /* 5615 */ { MAD_F(0x06176246) /* 0.380708955 */, 18 }, - - /* 5616 */ { MAD_F(0x0617c112) /* 0.380799360 */, 18 }, - /* 5617 */ { MAD_F(0x06181fdf) /* 0.380889771 */, 18 }, - /* 5618 */ { MAD_F(0x06187eae) /* 0.380980187 */, 18 }, - /* 5619 */ { MAD_F(0x0618dd7e) /* 0.381070609 */, 18 }, - /* 5620 */ { MAD_F(0x06193c50) /* 0.381161036 */, 18 }, - /* 5621 */ { MAD_F(0x06199b24) /* 0.381251468 */, 18 }, - /* 5622 */ { MAD_F(0x0619f9f8) /* 0.381341906 */, 18 }, - /* 5623 */ { MAD_F(0x061a58ce) /* 0.381432349 */, 18 }, - /* 5624 */ { MAD_F(0x061ab7a6) /* 0.381522798 */, 18 }, - /* 5625 */ { MAD_F(0x061b167f) /* 0.381613251 */, 18 }, - /* 5626 */ { MAD_F(0x061b7559) /* 0.381703711 */, 18 }, - /* 5627 */ { MAD_F(0x061bd435) /* 0.381794175 */, 18 }, - /* 5628 */ { MAD_F(0x061c3313) /* 0.381884645 */, 18 }, - /* 5629 */ { MAD_F(0x061c91f1) /* 0.381975120 */, 18 }, - /* 5630 */ { MAD_F(0x061cf0d2) /* 0.382065601 */, 18 }, - /* 5631 */ { MAD_F(0x061d4fb3) /* 0.382156087 */, 18 }, - - /* 5632 */ { MAD_F(0x061dae96) /* 0.382246578 */, 18 }, - /* 5633 */ { MAD_F(0x061e0d7b) /* 0.382337075 */, 18 }, - /* 5634 */ { MAD_F(0x061e6c61) /* 0.382427577 */, 18 }, - /* 5635 */ { MAD_F(0x061ecb48) /* 0.382518084 */, 18 }, - /* 5636 */ { MAD_F(0x061f2a31) /* 0.382608597 */, 18 }, - /* 5637 */ { MAD_F(0x061f891b) /* 0.382699115 */, 18 }, - /* 5638 */ { MAD_F(0x061fe807) /* 0.382789638 */, 18 }, - /* 5639 */ { MAD_F(0x062046f4) /* 0.382880167 */, 18 }, - /* 5640 */ { MAD_F(0x0620a5e3) /* 0.382970701 */, 18 }, - /* 5641 */ { MAD_F(0x062104d3) /* 0.383061241 */, 18 }, - /* 5642 */ { MAD_F(0x062163c4) /* 0.383151786 */, 18 }, - /* 5643 */ { MAD_F(0x0621c2b7) /* 0.383242336 */, 18 }, - /* 5644 */ { MAD_F(0x062221ab) /* 0.383332891 */, 18 }, - /* 5645 */ { MAD_F(0x062280a1) /* 0.383423452 */, 18 }, - /* 5646 */ { MAD_F(0x0622df98) /* 0.383514018 */, 18 }, - /* 5647 */ { MAD_F(0x06233e91) /* 0.383604590 */, 18 }, - - /* 5648 */ { MAD_F(0x06239d8b) /* 0.383695167 */, 18 }, - /* 5649 */ { MAD_F(0x0623fc86) /* 0.383785749 */, 18 }, - /* 5650 */ { MAD_F(0x06245b83) /* 0.383876337 */, 18 }, - /* 5651 */ { MAD_F(0x0624ba82) /* 0.383966930 */, 18 }, - /* 5652 */ { MAD_F(0x06251981) /* 0.384057528 */, 18 }, - /* 5653 */ { MAD_F(0x06257883) /* 0.384148132 */, 18 }, - /* 5654 */ { MAD_F(0x0625d785) /* 0.384238741 */, 18 }, - /* 5655 */ { MAD_F(0x06263689) /* 0.384329355 */, 18 }, - /* 5656 */ { MAD_F(0x0626958f) /* 0.384419975 */, 18 }, - /* 5657 */ { MAD_F(0x0626f496) /* 0.384510600 */, 18 }, - /* 5658 */ { MAD_F(0x0627539e) /* 0.384601230 */, 18 }, - /* 5659 */ { MAD_F(0x0627b2a8) /* 0.384691866 */, 18 }, - /* 5660 */ { MAD_F(0x062811b3) /* 0.384782507 */, 18 }, - /* 5661 */ { MAD_F(0x062870c0) /* 0.384873153 */, 18 }, - /* 5662 */ { MAD_F(0x0628cfce) /* 0.384963805 */, 18 }, - /* 5663 */ { MAD_F(0x06292ede) /* 0.385054462 */, 18 }, - - /* 5664 */ { MAD_F(0x06298def) /* 0.385145124 */, 18 }, - /* 5665 */ { MAD_F(0x0629ed01) /* 0.385235792 */, 18 }, - /* 5666 */ { MAD_F(0x062a4c15) /* 0.385326465 */, 18 }, - /* 5667 */ { MAD_F(0x062aab2a) /* 0.385417143 */, 18 }, - /* 5668 */ { MAD_F(0x062b0a41) /* 0.385507827 */, 18 }, - /* 5669 */ { MAD_F(0x062b6959) /* 0.385598516 */, 18 }, - /* 5670 */ { MAD_F(0x062bc873) /* 0.385689211 */, 18 }, - /* 5671 */ { MAD_F(0x062c278e) /* 0.385779910 */, 18 }, - /* 5672 */ { MAD_F(0x062c86aa) /* 0.385870615 */, 18 }, - /* 5673 */ { MAD_F(0x062ce5c8) /* 0.385961326 */, 18 }, - /* 5674 */ { MAD_F(0x062d44e8) /* 0.386052041 */, 18 }, - /* 5675 */ { MAD_F(0x062da408) /* 0.386142762 */, 18 }, - /* 5676 */ { MAD_F(0x062e032a) /* 0.386233489 */, 18 }, - /* 5677 */ { MAD_F(0x062e624e) /* 0.386324221 */, 18 }, - /* 5678 */ { MAD_F(0x062ec173) /* 0.386414958 */, 18 }, - /* 5679 */ { MAD_F(0x062f209a) /* 0.386505700 */, 18 }, - - /* 5680 */ { MAD_F(0x062f7fc1) /* 0.386596448 */, 18 }, - /* 5681 */ { MAD_F(0x062fdeeb) /* 0.386687201 */, 18 }, - /* 5682 */ { MAD_F(0x06303e16) /* 0.386777959 */, 18 }, - /* 5683 */ { MAD_F(0x06309d42) /* 0.386868723 */, 18 }, - /* 5684 */ { MAD_F(0x0630fc6f) /* 0.386959492 */, 18 }, - /* 5685 */ { MAD_F(0x06315b9e) /* 0.387050266 */, 18 }, - /* 5686 */ { MAD_F(0x0631bacf) /* 0.387141045 */, 18 }, - /* 5687 */ { MAD_F(0x06321a01) /* 0.387231830 */, 18 }, - /* 5688 */ { MAD_F(0x06327934) /* 0.387322621 */, 18 }, - /* 5689 */ { MAD_F(0x0632d869) /* 0.387413416 */, 18 }, - /* 5690 */ { MAD_F(0x0633379f) /* 0.387504217 */, 18 }, - /* 5691 */ { MAD_F(0x063396d7) /* 0.387595023 */, 18 }, - /* 5692 */ { MAD_F(0x0633f610) /* 0.387685835 */, 18 }, - /* 5693 */ { MAD_F(0x0634554a) /* 0.387776652 */, 18 }, - /* 5694 */ { MAD_F(0x0634b486) /* 0.387867474 */, 18 }, - /* 5695 */ { MAD_F(0x063513c3) /* 0.387958301 */, 18 }, - - /* 5696 */ { MAD_F(0x06357302) /* 0.388049134 */, 18 }, - /* 5697 */ { MAD_F(0x0635d242) /* 0.388139972 */, 18 }, - /* 5698 */ { MAD_F(0x06363184) /* 0.388230816 */, 18 }, - /* 5699 */ { MAD_F(0x063690c7) /* 0.388321665 */, 18 }, - /* 5700 */ { MAD_F(0x0636f00b) /* 0.388412519 */, 18 }, - /* 5701 */ { MAD_F(0x06374f51) /* 0.388503378 */, 18 }, - /* 5702 */ { MAD_F(0x0637ae99) /* 0.388594243 */, 18 }, - /* 5703 */ { MAD_F(0x06380de1) /* 0.388685113 */, 18 }, - /* 5704 */ { MAD_F(0x06386d2b) /* 0.388775988 */, 18 }, - /* 5705 */ { MAD_F(0x0638cc77) /* 0.388866869 */, 18 }, - /* 5706 */ { MAD_F(0x06392bc4) /* 0.388957755 */, 18 }, - /* 5707 */ { MAD_F(0x06398b12) /* 0.389048646 */, 18 }, - /* 5708 */ { MAD_F(0x0639ea62) /* 0.389139542 */, 18 }, - /* 5709 */ { MAD_F(0x063a49b4) /* 0.389230444 */, 18 }, - /* 5710 */ { MAD_F(0x063aa906) /* 0.389321352 */, 18 }, - /* 5711 */ { MAD_F(0x063b085a) /* 0.389412264 */, 18 }, - - /* 5712 */ { MAD_F(0x063b67b0) /* 0.389503182 */, 18 }, - /* 5713 */ { MAD_F(0x063bc707) /* 0.389594105 */, 18 }, - /* 5714 */ { MAD_F(0x063c265f) /* 0.389685033 */, 18 }, - /* 5715 */ { MAD_F(0x063c85b9) /* 0.389775967 */, 18 }, - /* 5716 */ { MAD_F(0x063ce514) /* 0.389866906 */, 18 }, - /* 5717 */ { MAD_F(0x063d4471) /* 0.389957850 */, 18 }, - /* 5718 */ { MAD_F(0x063da3cf) /* 0.390048800 */, 18 }, - /* 5719 */ { MAD_F(0x063e032f) /* 0.390139755 */, 18 }, - /* 5720 */ { MAD_F(0x063e6290) /* 0.390230715 */, 18 }, - /* 5721 */ { MAD_F(0x063ec1f2) /* 0.390321681 */, 18 }, - /* 5722 */ { MAD_F(0x063f2156) /* 0.390412651 */, 18 }, - /* 5723 */ { MAD_F(0x063f80bb) /* 0.390503628 */, 18 }, - /* 5724 */ { MAD_F(0x063fe022) /* 0.390594609 */, 18 }, - /* 5725 */ { MAD_F(0x06403f8a) /* 0.390685596 */, 18 }, - /* 5726 */ { MAD_F(0x06409ef3) /* 0.390776588 */, 18 }, - /* 5727 */ { MAD_F(0x0640fe5e) /* 0.390867585 */, 18 }, - - /* 5728 */ { MAD_F(0x06415dcb) /* 0.390958588 */, 18 }, - /* 5729 */ { MAD_F(0x0641bd38) /* 0.391049596 */, 18 }, - /* 5730 */ { MAD_F(0x06421ca7) /* 0.391140609 */, 18 }, - /* 5731 */ { MAD_F(0x06427c18) /* 0.391231627 */, 18 }, - /* 5732 */ { MAD_F(0x0642db8a) /* 0.391322651 */, 18 }, - /* 5733 */ { MAD_F(0x06433afd) /* 0.391413680 */, 18 }, - /* 5734 */ { MAD_F(0x06439a72) /* 0.391504714 */, 18 }, - /* 5735 */ { MAD_F(0x0643f9e9) /* 0.391595754 */, 18 }, - /* 5736 */ { MAD_F(0x06445960) /* 0.391686799 */, 18 }, - /* 5737 */ { MAD_F(0x0644b8d9) /* 0.391777849 */, 18 }, - /* 5738 */ { MAD_F(0x06451854) /* 0.391868905 */, 18 }, - /* 5739 */ { MAD_F(0x064577d0) /* 0.391959966 */, 18 }, - /* 5740 */ { MAD_F(0x0645d74d) /* 0.392051032 */, 18 }, - /* 5741 */ { MAD_F(0x064636cc) /* 0.392142103 */, 18 }, - /* 5742 */ { MAD_F(0x0646964c) /* 0.392233180 */, 18 }, - /* 5743 */ { MAD_F(0x0646f5ce) /* 0.392324262 */, 18 }, - - /* 5744 */ { MAD_F(0x06475551) /* 0.392415349 */, 18 }, - /* 5745 */ { MAD_F(0x0647b4d5) /* 0.392506442 */, 18 }, - /* 5746 */ { MAD_F(0x0648145b) /* 0.392597540 */, 18 }, - /* 5747 */ { MAD_F(0x064873e3) /* 0.392688643 */, 18 }, - /* 5748 */ { MAD_F(0x0648d36b) /* 0.392779751 */, 18 }, - /* 5749 */ { MAD_F(0x064932f6) /* 0.392870865 */, 18 }, - /* 5750 */ { MAD_F(0x06499281) /* 0.392961984 */, 18 }, - /* 5751 */ { MAD_F(0x0649f20e) /* 0.393053108 */, 18 }, - /* 5752 */ { MAD_F(0x064a519c) /* 0.393144238 */, 18 }, - /* 5753 */ { MAD_F(0x064ab12c) /* 0.393235372 */, 18 }, - /* 5754 */ { MAD_F(0x064b10be) /* 0.393326513 */, 18 }, - /* 5755 */ { MAD_F(0x064b7050) /* 0.393417658 */, 18 }, - /* 5756 */ { MAD_F(0x064bcfe4) /* 0.393508809 */, 18 }, - /* 5757 */ { MAD_F(0x064c2f7a) /* 0.393599965 */, 18 }, - /* 5758 */ { MAD_F(0x064c8f11) /* 0.393691126 */, 18 }, - /* 5759 */ { MAD_F(0x064ceea9) /* 0.393782292 */, 18 }, - - /* 5760 */ { MAD_F(0x064d4e43) /* 0.393873464 */, 18 }, - /* 5761 */ { MAD_F(0x064dadde) /* 0.393964641 */, 18 }, - /* 5762 */ { MAD_F(0x064e0d7a) /* 0.394055823 */, 18 }, - /* 5763 */ { MAD_F(0x064e6d18) /* 0.394147011 */, 18 }, - /* 5764 */ { MAD_F(0x064eccb8) /* 0.394238204 */, 18 }, - /* 5765 */ { MAD_F(0x064f2c59) /* 0.394329402 */, 18 }, - /* 5766 */ { MAD_F(0x064f8bfb) /* 0.394420605 */, 18 }, - /* 5767 */ { MAD_F(0x064feb9e) /* 0.394511814 */, 18 }, - /* 5768 */ { MAD_F(0x06504b44) /* 0.394603028 */, 18 }, - /* 5769 */ { MAD_F(0x0650aaea) /* 0.394694247 */, 18 }, - /* 5770 */ { MAD_F(0x06510a92) /* 0.394785472 */, 18 }, - /* 5771 */ { MAD_F(0x06516a3b) /* 0.394876702 */, 18 }, - /* 5772 */ { MAD_F(0x0651c9e6) /* 0.394967937 */, 18 }, - /* 5773 */ { MAD_F(0x06522992) /* 0.395059177 */, 18 }, - /* 5774 */ { MAD_F(0x06528940) /* 0.395150423 */, 18 }, - /* 5775 */ { MAD_F(0x0652e8ef) /* 0.395241673 */, 18 }, - - /* 5776 */ { MAD_F(0x0653489f) /* 0.395332930 */, 18 }, - /* 5777 */ { MAD_F(0x0653a851) /* 0.395424191 */, 18 }, - /* 5778 */ { MAD_F(0x06540804) /* 0.395515458 */, 18 }, - /* 5779 */ { MAD_F(0x065467b9) /* 0.395606730 */, 18 }, - /* 5780 */ { MAD_F(0x0654c76f) /* 0.395698007 */, 18 }, - /* 5781 */ { MAD_F(0x06552726) /* 0.395789289 */, 18 }, - /* 5782 */ { MAD_F(0x065586df) /* 0.395880577 */, 18 }, - /* 5783 */ { MAD_F(0x0655e699) /* 0.395971870 */, 18 }, - /* 5784 */ { MAD_F(0x06564655) /* 0.396063168 */, 18 }, - /* 5785 */ { MAD_F(0x0656a612) /* 0.396154472 */, 18 }, - /* 5786 */ { MAD_F(0x065705d0) /* 0.396245780 */, 18 }, - /* 5787 */ { MAD_F(0x06576590) /* 0.396337094 */, 18 }, - /* 5788 */ { MAD_F(0x0657c552) /* 0.396428414 */, 18 }, - /* 5789 */ { MAD_F(0x06582514) /* 0.396519738 */, 18 }, - /* 5790 */ { MAD_F(0x065884d9) /* 0.396611068 */, 18 }, - /* 5791 */ { MAD_F(0x0658e49e) /* 0.396702403 */, 18 }, - - /* 5792 */ { MAD_F(0x06594465) /* 0.396793743 */, 18 }, - /* 5793 */ { MAD_F(0x0659a42e) /* 0.396885089 */, 18 }, - /* 5794 */ { MAD_F(0x065a03f7) /* 0.396976440 */, 18 }, - /* 5795 */ { MAD_F(0x065a63c3) /* 0.397067796 */, 18 }, - /* 5796 */ { MAD_F(0x065ac38f) /* 0.397159157 */, 18 }, - /* 5797 */ { MAD_F(0x065b235d) /* 0.397250524 */, 18 }, - /* 5798 */ { MAD_F(0x065b832d) /* 0.397341896 */, 18 }, - /* 5799 */ { MAD_F(0x065be2fe) /* 0.397433273 */, 18 }, - /* 5800 */ { MAD_F(0x065c42d0) /* 0.397524655 */, 18 }, - /* 5801 */ { MAD_F(0x065ca2a3) /* 0.397616043 */, 18 }, - /* 5802 */ { MAD_F(0x065d0279) /* 0.397707436 */, 18 }, - /* 5803 */ { MAD_F(0x065d624f) /* 0.397798834 */, 18 }, - /* 5804 */ { MAD_F(0x065dc227) /* 0.397890237 */, 18 }, - /* 5805 */ { MAD_F(0x065e2200) /* 0.397981646 */, 18 }, - /* 5806 */ { MAD_F(0x065e81db) /* 0.398073059 */, 18 }, - /* 5807 */ { MAD_F(0x065ee1b7) /* 0.398164479 */, 18 }, - - /* 5808 */ { MAD_F(0x065f4195) /* 0.398255903 */, 18 }, - /* 5809 */ { MAD_F(0x065fa174) /* 0.398347333 */, 18 }, - /* 5810 */ { MAD_F(0x06600154) /* 0.398438767 */, 18 }, - /* 5811 */ { MAD_F(0x06606136) /* 0.398530207 */, 18 }, - /* 5812 */ { MAD_F(0x0660c119) /* 0.398621653 */, 18 }, - /* 5813 */ { MAD_F(0x066120fd) /* 0.398713103 */, 18 }, - /* 5814 */ { MAD_F(0x066180e3) /* 0.398804559 */, 18 }, - /* 5815 */ { MAD_F(0x0661e0cb) /* 0.398896020 */, 18 }, - /* 5816 */ { MAD_F(0x066240b4) /* 0.398987487 */, 18 }, - /* 5817 */ { MAD_F(0x0662a09e) /* 0.399078958 */, 18 }, - /* 5818 */ { MAD_F(0x06630089) /* 0.399170435 */, 18 }, - /* 5819 */ { MAD_F(0x06636077) /* 0.399261917 */, 18 }, - /* 5820 */ { MAD_F(0x0663c065) /* 0.399353404 */, 18 }, - /* 5821 */ { MAD_F(0x06642055) /* 0.399444897 */, 18 }, - /* 5822 */ { MAD_F(0x06648046) /* 0.399536395 */, 18 }, - /* 5823 */ { MAD_F(0x0664e039) /* 0.399627898 */, 18 }, - - /* 5824 */ { MAD_F(0x0665402d) /* 0.399719406 */, 18 }, - /* 5825 */ { MAD_F(0x0665a022) /* 0.399810919 */, 18 }, - /* 5826 */ { MAD_F(0x06660019) /* 0.399902438 */, 18 }, - /* 5827 */ { MAD_F(0x06666011) /* 0.399993962 */, 18 }, - /* 5828 */ { MAD_F(0x0666c00b) /* 0.400085491 */, 18 }, - /* 5829 */ { MAD_F(0x06672006) /* 0.400177026 */, 18 }, - /* 5830 */ { MAD_F(0x06678003) /* 0.400268565 */, 18 }, - /* 5831 */ { MAD_F(0x0667e000) /* 0.400360110 */, 18 }, - /* 5832 */ { MAD_F(0x06684000) /* 0.400451660 */, 18 }, - /* 5833 */ { MAD_F(0x0668a000) /* 0.400543216 */, 18 }, - /* 5834 */ { MAD_F(0x06690003) /* 0.400634776 */, 18 }, - /* 5835 */ { MAD_F(0x06696006) /* 0.400726342 */, 18 }, - /* 5836 */ { MAD_F(0x0669c00b) /* 0.400817913 */, 18 }, - /* 5837 */ { MAD_F(0x066a2011) /* 0.400909489 */, 18 }, - /* 5838 */ { MAD_F(0x066a8019) /* 0.401001071 */, 18 }, - /* 5839 */ { MAD_F(0x066ae022) /* 0.401092657 */, 18 }, - - /* 5840 */ { MAD_F(0x066b402d) /* 0.401184249 */, 18 }, - /* 5841 */ { MAD_F(0x066ba039) /* 0.401275847 */, 18 }, - /* 5842 */ { MAD_F(0x066c0046) /* 0.401367449 */, 18 }, - /* 5843 */ { MAD_F(0x066c6055) /* 0.401459057 */, 18 }, - /* 5844 */ { MAD_F(0x066cc065) /* 0.401550670 */, 18 }, - /* 5845 */ { MAD_F(0x066d2076) /* 0.401642288 */, 18 }, - /* 5846 */ { MAD_F(0x066d8089) /* 0.401733911 */, 18 }, - /* 5847 */ { MAD_F(0x066de09e) /* 0.401825540 */, 18 }, - /* 5848 */ { MAD_F(0x066e40b3) /* 0.401917173 */, 18 }, - /* 5849 */ { MAD_F(0x066ea0cb) /* 0.402008812 */, 18 }, - /* 5850 */ { MAD_F(0x066f00e3) /* 0.402100457 */, 18 }, - /* 5851 */ { MAD_F(0x066f60fd) /* 0.402192106 */, 18 }, - /* 5852 */ { MAD_F(0x066fc118) /* 0.402283761 */, 18 }, - /* 5853 */ { MAD_F(0x06702135) /* 0.402375420 */, 18 }, - /* 5854 */ { MAD_F(0x06708153) /* 0.402467086 */, 18 }, - /* 5855 */ { MAD_F(0x0670e173) /* 0.402558756 */, 18 }, - - /* 5856 */ { MAD_F(0x06714194) /* 0.402650431 */, 18 }, - /* 5857 */ { MAD_F(0x0671a1b6) /* 0.402742112 */, 18 }, - /* 5858 */ { MAD_F(0x067201da) /* 0.402833798 */, 18 }, - /* 5859 */ { MAD_F(0x067261ff) /* 0.402925489 */, 18 }, - /* 5860 */ { MAD_F(0x0672c226) /* 0.403017186 */, 18 }, - /* 5861 */ { MAD_F(0x0673224e) /* 0.403108887 */, 18 }, - /* 5862 */ { MAD_F(0x06738277) /* 0.403200594 */, 18 }, - /* 5863 */ { MAD_F(0x0673e2a2) /* 0.403292306 */, 18 }, - /* 5864 */ { MAD_F(0x067442ce) /* 0.403384024 */, 18 }, - /* 5865 */ { MAD_F(0x0674a2fc) /* 0.403475746 */, 18 }, - /* 5866 */ { MAD_F(0x0675032b) /* 0.403567474 */, 18 }, - /* 5867 */ { MAD_F(0x0675635b) /* 0.403659207 */, 18 }, - /* 5868 */ { MAD_F(0x0675c38d) /* 0.403750945 */, 18 }, - /* 5869 */ { MAD_F(0x067623c0) /* 0.403842688 */, 18 }, - /* 5870 */ { MAD_F(0x067683f4) /* 0.403934437 */, 18 }, - /* 5871 */ { MAD_F(0x0676e42a) /* 0.404026190 */, 18 }, - - /* 5872 */ { MAD_F(0x06774462) /* 0.404117949 */, 18 }, - /* 5873 */ { MAD_F(0x0677a49b) /* 0.404209714 */, 18 }, - /* 5874 */ { MAD_F(0x067804d5) /* 0.404301483 */, 18 }, - /* 5875 */ { MAD_F(0x06786510) /* 0.404393258 */, 18 }, - /* 5876 */ { MAD_F(0x0678c54d) /* 0.404485037 */, 18 }, - /* 5877 */ { MAD_F(0x0679258c) /* 0.404576822 */, 18 }, - /* 5878 */ { MAD_F(0x067985cb) /* 0.404668613 */, 18 }, - /* 5879 */ { MAD_F(0x0679e60c) /* 0.404760408 */, 18 }, - /* 5880 */ { MAD_F(0x067a464f) /* 0.404852209 */, 18 }, - /* 5881 */ { MAD_F(0x067aa693) /* 0.404944014 */, 18 }, - /* 5882 */ { MAD_F(0x067b06d8) /* 0.405035825 */, 18 }, - /* 5883 */ { MAD_F(0x067b671f) /* 0.405127642 */, 18 }, - /* 5884 */ { MAD_F(0x067bc767) /* 0.405219463 */, 18 }, - /* 5885 */ { MAD_F(0x067c27b1) /* 0.405311290 */, 18 }, - /* 5886 */ { MAD_F(0x067c87fc) /* 0.405403122 */, 18 }, - /* 5887 */ { MAD_F(0x067ce848) /* 0.405494959 */, 18 }, - - /* 5888 */ { MAD_F(0x067d4896) /* 0.405586801 */, 18 }, - /* 5889 */ { MAD_F(0x067da8e5) /* 0.405678648 */, 18 }, - /* 5890 */ { MAD_F(0x067e0935) /* 0.405770501 */, 18 }, - /* 5891 */ { MAD_F(0x067e6987) /* 0.405862359 */, 18 }, - /* 5892 */ { MAD_F(0x067ec9da) /* 0.405954222 */, 18 }, - /* 5893 */ { MAD_F(0x067f2a2f) /* 0.406046090 */, 18 }, - /* 5894 */ { MAD_F(0x067f8a85) /* 0.406137963 */, 18 }, - /* 5895 */ { MAD_F(0x067feadd) /* 0.406229842 */, 18 }, - /* 5896 */ { MAD_F(0x06804b36) /* 0.406321726 */, 18 }, - /* 5897 */ { MAD_F(0x0680ab90) /* 0.406413615 */, 18 }, - /* 5898 */ { MAD_F(0x06810beb) /* 0.406505509 */, 18 }, - /* 5899 */ { MAD_F(0x06816c49) /* 0.406597408 */, 18 }, - /* 5900 */ { MAD_F(0x0681cca7) /* 0.406689313 */, 18 }, - /* 5901 */ { MAD_F(0x06822d07) /* 0.406781223 */, 18 }, - /* 5902 */ { MAD_F(0x06828d68) /* 0.406873138 */, 18 }, - /* 5903 */ { MAD_F(0x0682edcb) /* 0.406965058 */, 18 }, - - /* 5904 */ { MAD_F(0x06834e2f) /* 0.407056983 */, 18 }, - /* 5905 */ { MAD_F(0x0683ae94) /* 0.407148914 */, 18 }, - /* 5906 */ { MAD_F(0x06840efb) /* 0.407240850 */, 18 }, - /* 5907 */ { MAD_F(0x06846f63) /* 0.407332791 */, 18 }, - /* 5908 */ { MAD_F(0x0684cfcd) /* 0.407424737 */, 18 }, - /* 5909 */ { MAD_F(0x06853038) /* 0.407516688 */, 18 }, - /* 5910 */ { MAD_F(0x068590a4) /* 0.407608645 */, 18 }, - /* 5911 */ { MAD_F(0x0685f112) /* 0.407700606 */, 18 }, - /* 5912 */ { MAD_F(0x06865181) /* 0.407792573 */, 18 }, - /* 5913 */ { MAD_F(0x0686b1f2) /* 0.407884545 */, 18 }, - /* 5914 */ { MAD_F(0x06871264) /* 0.407976522 */, 18 }, - /* 5915 */ { MAD_F(0x068772d7) /* 0.408068505 */, 18 }, - /* 5916 */ { MAD_F(0x0687d34c) /* 0.408160492 */, 18 }, - /* 5917 */ { MAD_F(0x068833c2) /* 0.408252485 */, 18 }, - /* 5918 */ { MAD_F(0x06889439) /* 0.408344483 */, 18 }, - /* 5919 */ { MAD_F(0x0688f4b2) /* 0.408436486 */, 18 }, - - /* 5920 */ { MAD_F(0x0689552c) /* 0.408528495 */, 18 }, - /* 5921 */ { MAD_F(0x0689b5a8) /* 0.408620508 */, 18 }, - /* 5922 */ { MAD_F(0x068a1625) /* 0.408712527 */, 18 }, - /* 5923 */ { MAD_F(0x068a76a4) /* 0.408804551 */, 18 }, - /* 5924 */ { MAD_F(0x068ad724) /* 0.408896580 */, 18 }, - /* 5925 */ { MAD_F(0x068b37a5) /* 0.408988614 */, 18 }, - /* 5926 */ { MAD_F(0x068b9827) /* 0.409080653 */, 18 }, - /* 5927 */ { MAD_F(0x068bf8ac) /* 0.409172698 */, 18 }, - /* 5928 */ { MAD_F(0x068c5931) /* 0.409264748 */, 18 }, - /* 5929 */ { MAD_F(0x068cb9b8) /* 0.409356803 */, 18 }, - /* 5930 */ { MAD_F(0x068d1a40) /* 0.409448863 */, 18 }, - /* 5931 */ { MAD_F(0x068d7aca) /* 0.409540928 */, 18 }, - /* 5932 */ { MAD_F(0x068ddb54) /* 0.409632999 */, 18 }, - /* 5933 */ { MAD_F(0x068e3be1) /* 0.409725074 */, 18 }, - /* 5934 */ { MAD_F(0x068e9c6f) /* 0.409817155 */, 18 }, - /* 5935 */ { MAD_F(0x068efcfe) /* 0.409909241 */, 18 }, - - /* 5936 */ { MAD_F(0x068f5d8e) /* 0.410001332 */, 18 }, - /* 5937 */ { MAD_F(0x068fbe20) /* 0.410093428 */, 18 }, - /* 5938 */ { MAD_F(0x06901eb4) /* 0.410185530 */, 18 }, - /* 5939 */ { MAD_F(0x06907f48) /* 0.410277637 */, 18 }, - /* 5940 */ { MAD_F(0x0690dfde) /* 0.410369748 */, 18 }, - /* 5941 */ { MAD_F(0x06914076) /* 0.410461865 */, 18 }, - /* 5942 */ { MAD_F(0x0691a10f) /* 0.410553988 */, 18 }, - /* 5943 */ { MAD_F(0x069201a9) /* 0.410646115 */, 18 }, - /* 5944 */ { MAD_F(0x06926245) /* 0.410738247 */, 18 }, - /* 5945 */ { MAD_F(0x0692c2e2) /* 0.410830385 */, 18 }, - /* 5946 */ { MAD_F(0x06932380) /* 0.410922528 */, 18 }, - /* 5947 */ { MAD_F(0x06938420) /* 0.411014676 */, 18 }, - /* 5948 */ { MAD_F(0x0693e4c1) /* 0.411106829 */, 18 }, - /* 5949 */ { MAD_F(0x06944563) /* 0.411198987 */, 18 }, - /* 5950 */ { MAD_F(0x0694a607) /* 0.411291151 */, 18 }, - /* 5951 */ { MAD_F(0x069506ad) /* 0.411383320 */, 18 }, - - /* 5952 */ { MAD_F(0x06956753) /* 0.411475493 */, 18 }, - /* 5953 */ { MAD_F(0x0695c7fc) /* 0.411567672 */, 18 }, - /* 5954 */ { MAD_F(0x069628a5) /* 0.411659857 */, 18 }, - /* 5955 */ { MAD_F(0x06968950) /* 0.411752046 */, 18 }, - /* 5956 */ { MAD_F(0x0696e9fc) /* 0.411844240 */, 18 }, - /* 5957 */ { MAD_F(0x06974aaa) /* 0.411936440 */, 18 }, - /* 5958 */ { MAD_F(0x0697ab59) /* 0.412028645 */, 18 }, - /* 5959 */ { MAD_F(0x06980c09) /* 0.412120855 */, 18 }, - /* 5960 */ { MAD_F(0x06986cbb) /* 0.412213070 */, 18 }, - /* 5961 */ { MAD_F(0x0698cd6e) /* 0.412305290 */, 18 }, - /* 5962 */ { MAD_F(0x06992e23) /* 0.412397516 */, 18 }, - /* 5963 */ { MAD_F(0x06998ed9) /* 0.412489746 */, 18 }, - /* 5964 */ { MAD_F(0x0699ef90) /* 0.412581982 */, 18 }, - /* 5965 */ { MAD_F(0x069a5049) /* 0.412674223 */, 18 }, - /* 5966 */ { MAD_F(0x069ab103) /* 0.412766469 */, 18 }, - /* 5967 */ { MAD_F(0x069b11bf) /* 0.412858720 */, 18 }, - - /* 5968 */ { MAD_F(0x069b727b) /* 0.412950976 */, 18 }, - /* 5969 */ { MAD_F(0x069bd33a) /* 0.413043238 */, 18 }, - /* 5970 */ { MAD_F(0x069c33f9) /* 0.413135505 */, 18 }, - /* 5971 */ { MAD_F(0x069c94ba) /* 0.413227776 */, 18 }, - /* 5972 */ { MAD_F(0x069cf57d) /* 0.413320053 */, 18 }, - /* 5973 */ { MAD_F(0x069d5641) /* 0.413412335 */, 18 }, - /* 5974 */ { MAD_F(0x069db706) /* 0.413504623 */, 18 }, - /* 5975 */ { MAD_F(0x069e17cc) /* 0.413596915 */, 18 }, - /* 5976 */ { MAD_F(0x069e7894) /* 0.413689213 */, 18 }, - /* 5977 */ { MAD_F(0x069ed95e) /* 0.413781515 */, 18 }, - /* 5978 */ { MAD_F(0x069f3a28) /* 0.413873823 */, 18 }, - /* 5979 */ { MAD_F(0x069f9af4) /* 0.413966136 */, 18 }, - /* 5980 */ { MAD_F(0x069ffbc2) /* 0.414058454 */, 18 }, - /* 5981 */ { MAD_F(0x06a05c91) /* 0.414150778 */, 18 }, - /* 5982 */ { MAD_F(0x06a0bd61) /* 0.414243106 */, 18 }, - /* 5983 */ { MAD_F(0x06a11e32) /* 0.414335440 */, 18 }, - - /* 5984 */ { MAD_F(0x06a17f05) /* 0.414427779 */, 18 }, - /* 5985 */ { MAD_F(0x06a1dfda) /* 0.414520122 */, 18 }, - /* 5986 */ { MAD_F(0x06a240b0) /* 0.414612471 */, 18 }, - /* 5987 */ { MAD_F(0x06a2a187) /* 0.414704826 */, 18 }, - /* 5988 */ { MAD_F(0x06a3025f) /* 0.414797185 */, 18 }, - /* 5989 */ { MAD_F(0x06a36339) /* 0.414889549 */, 18 }, - /* 5990 */ { MAD_F(0x06a3c414) /* 0.414981919 */, 18 }, - /* 5991 */ { MAD_F(0x06a424f1) /* 0.415074294 */, 18 }, - /* 5992 */ { MAD_F(0x06a485cf) /* 0.415166674 */, 18 }, - /* 5993 */ { MAD_F(0x06a4e6ae) /* 0.415259059 */, 18 }, - /* 5994 */ { MAD_F(0x06a5478f) /* 0.415351449 */, 18 }, - /* 5995 */ { MAD_F(0x06a5a871) /* 0.415443844 */, 18 }, - /* 5996 */ { MAD_F(0x06a60955) /* 0.415536244 */, 18 }, - /* 5997 */ { MAD_F(0x06a66a3a) /* 0.415628650 */, 18 }, - /* 5998 */ { MAD_F(0x06a6cb20) /* 0.415721061 */, 18 }, - /* 5999 */ { MAD_F(0x06a72c08) /* 0.415813476 */, 18 }, - - /* 6000 */ { MAD_F(0x06a78cf1) /* 0.415905897 */, 18 }, - /* 6001 */ { MAD_F(0x06a7eddb) /* 0.415998324 */, 18 }, - /* 6002 */ { MAD_F(0x06a84ec7) /* 0.416090755 */, 18 }, - /* 6003 */ { MAD_F(0x06a8afb4) /* 0.416183191 */, 18 }, - /* 6004 */ { MAD_F(0x06a910a3) /* 0.416275633 */, 18 }, - /* 6005 */ { MAD_F(0x06a97193) /* 0.416368079 */, 18 }, - /* 6006 */ { MAD_F(0x06a9d284) /* 0.416460531 */, 18 }, - /* 6007 */ { MAD_F(0x06aa3377) /* 0.416552988 */, 18 }, - /* 6008 */ { MAD_F(0x06aa946b) /* 0.416645450 */, 18 }, - /* 6009 */ { MAD_F(0x06aaf561) /* 0.416737917 */, 18 }, - /* 6010 */ { MAD_F(0x06ab5657) /* 0.416830389 */, 18 }, - /* 6011 */ { MAD_F(0x06abb750) /* 0.416922867 */, 18 }, - /* 6012 */ { MAD_F(0x06ac1849) /* 0.417015349 */, 18 }, - /* 6013 */ { MAD_F(0x06ac7944) /* 0.417107837 */, 18 }, - /* 6014 */ { MAD_F(0x06acda41) /* 0.417200330 */, 18 }, - /* 6015 */ { MAD_F(0x06ad3b3e) /* 0.417292828 */, 18 }, - - /* 6016 */ { MAD_F(0x06ad9c3d) /* 0.417385331 */, 18 }, - /* 6017 */ { MAD_F(0x06adfd3e) /* 0.417477839 */, 18 }, - /* 6018 */ { MAD_F(0x06ae5e40) /* 0.417570352 */, 18 }, - /* 6019 */ { MAD_F(0x06aebf43) /* 0.417662871 */, 18 }, - /* 6020 */ { MAD_F(0x06af2047) /* 0.417755394 */, 18 }, - /* 6021 */ { MAD_F(0x06af814d) /* 0.417847923 */, 18 }, - /* 6022 */ { MAD_F(0x06afe255) /* 0.417940457 */, 18 }, - /* 6023 */ { MAD_F(0x06b0435e) /* 0.418032996 */, 18 }, - /* 6024 */ { MAD_F(0x06b0a468) /* 0.418125540 */, 18 }, - /* 6025 */ { MAD_F(0x06b10573) /* 0.418218089 */, 18 }, - /* 6026 */ { MAD_F(0x06b16680) /* 0.418310643 */, 18 }, - /* 6027 */ { MAD_F(0x06b1c78e) /* 0.418403203 */, 18 }, - /* 6028 */ { MAD_F(0x06b2289e) /* 0.418495767 */, 18 }, - /* 6029 */ { MAD_F(0x06b289af) /* 0.418588337 */, 18 }, - /* 6030 */ { MAD_F(0x06b2eac1) /* 0.418680911 */, 18 }, - /* 6031 */ { MAD_F(0x06b34bd5) /* 0.418773491 */, 18 }, - - /* 6032 */ { MAD_F(0x06b3acea) /* 0.418866076 */, 18 }, - /* 6033 */ { MAD_F(0x06b40e00) /* 0.418958666 */, 18 }, - /* 6034 */ { MAD_F(0x06b46f18) /* 0.419051262 */, 18 }, - /* 6035 */ { MAD_F(0x06b4d031) /* 0.419143862 */, 18 }, - /* 6036 */ { MAD_F(0x06b5314c) /* 0.419236467 */, 18 }, - /* 6037 */ { MAD_F(0x06b59268) /* 0.419329078 */, 18 }, - /* 6038 */ { MAD_F(0x06b5f385) /* 0.419421694 */, 18 }, - /* 6039 */ { MAD_F(0x06b654a4) /* 0.419514314 */, 18 }, - /* 6040 */ { MAD_F(0x06b6b5c4) /* 0.419606940 */, 18 }, - /* 6041 */ { MAD_F(0x06b716e6) /* 0.419699571 */, 18 }, - /* 6042 */ { MAD_F(0x06b77808) /* 0.419792208 */, 18 }, - /* 6043 */ { MAD_F(0x06b7d92d) /* 0.419884849 */, 18 }, - /* 6044 */ { MAD_F(0x06b83a52) /* 0.419977495 */, 18 }, - /* 6045 */ { MAD_F(0x06b89b79) /* 0.420070147 */, 18 }, - /* 6046 */ { MAD_F(0x06b8fca1) /* 0.420162803 */, 18 }, - /* 6047 */ { MAD_F(0x06b95dcb) /* 0.420255465 */, 18 }, - - /* 6048 */ { MAD_F(0x06b9bef6) /* 0.420348132 */, 18 }, - /* 6049 */ { MAD_F(0x06ba2023) /* 0.420440803 */, 18 }, - /* 6050 */ { MAD_F(0x06ba8150) /* 0.420533481 */, 18 }, - /* 6051 */ { MAD_F(0x06bae280) /* 0.420626163 */, 18 }, - /* 6052 */ { MAD_F(0x06bb43b0) /* 0.420718850 */, 18 }, - /* 6053 */ { MAD_F(0x06bba4e2) /* 0.420811542 */, 18 }, - /* 6054 */ { MAD_F(0x06bc0615) /* 0.420904240 */, 18 }, - /* 6055 */ { MAD_F(0x06bc674a) /* 0.420996942 */, 18 }, - /* 6056 */ { MAD_F(0x06bcc880) /* 0.421089650 */, 18 }, - /* 6057 */ { MAD_F(0x06bd29b7) /* 0.421182362 */, 18 }, - /* 6058 */ { MAD_F(0x06bd8af0) /* 0.421275080 */, 18 }, - /* 6059 */ { MAD_F(0x06bdec2a) /* 0.421367803 */, 18 }, - /* 6060 */ { MAD_F(0x06be4d66) /* 0.421460531 */, 18 }, - /* 6061 */ { MAD_F(0x06beaea3) /* 0.421553264 */, 18 }, - /* 6062 */ { MAD_F(0x06bf0fe1) /* 0.421646003 */, 18 }, - /* 6063 */ { MAD_F(0x06bf7120) /* 0.421738746 */, 18 }, - - /* 6064 */ { MAD_F(0x06bfd261) /* 0.421831494 */, 18 }, - /* 6065 */ { MAD_F(0x06c033a4) /* 0.421924248 */, 18 }, - /* 6066 */ { MAD_F(0x06c094e7) /* 0.422017007 */, 18 }, - /* 6067 */ { MAD_F(0x06c0f62c) /* 0.422109770 */, 18 }, - /* 6068 */ { MAD_F(0x06c15773) /* 0.422202539 */, 18 }, - /* 6069 */ { MAD_F(0x06c1b8bb) /* 0.422295313 */, 18 }, - /* 6070 */ { MAD_F(0x06c21a04) /* 0.422388092 */, 18 }, - /* 6071 */ { MAD_F(0x06c27b4e) /* 0.422480876 */, 18 }, - /* 6072 */ { MAD_F(0x06c2dc9a) /* 0.422573665 */, 18 }, - /* 6073 */ { MAD_F(0x06c33de8) /* 0.422666460 */, 18 }, - /* 6074 */ { MAD_F(0x06c39f36) /* 0.422759259 */, 18 }, - /* 6075 */ { MAD_F(0x06c40086) /* 0.422852064 */, 18 }, - /* 6076 */ { MAD_F(0x06c461d8) /* 0.422944873 */, 18 }, - /* 6077 */ { MAD_F(0x06c4c32a) /* 0.423037688 */, 18 }, - /* 6078 */ { MAD_F(0x06c5247f) /* 0.423130508 */, 18 }, - /* 6079 */ { MAD_F(0x06c585d4) /* 0.423223333 */, 18 }, - - /* 6080 */ { MAD_F(0x06c5e72b) /* 0.423316162 */, 18 }, - /* 6081 */ { MAD_F(0x06c64883) /* 0.423408997 */, 18 }, - /* 6082 */ { MAD_F(0x06c6a9dd) /* 0.423501838 */, 18 }, - /* 6083 */ { MAD_F(0x06c70b38) /* 0.423594683 */, 18 }, - /* 6084 */ { MAD_F(0x06c76c94) /* 0.423687533 */, 18 }, - /* 6085 */ { MAD_F(0x06c7cdf2) /* 0.423780389 */, 18 }, - /* 6086 */ { MAD_F(0x06c82f51) /* 0.423873249 */, 18 }, - /* 6087 */ { MAD_F(0x06c890b1) /* 0.423966115 */, 18 }, - /* 6088 */ { MAD_F(0x06c8f213) /* 0.424058985 */, 18 }, - /* 6089 */ { MAD_F(0x06c95376) /* 0.424151861 */, 18 }, - /* 6090 */ { MAD_F(0x06c9b4da) /* 0.424244742 */, 18 }, - /* 6091 */ { MAD_F(0x06ca1640) /* 0.424337628 */, 18 }, - /* 6092 */ { MAD_F(0x06ca77a8) /* 0.424430519 */, 18 }, - /* 6093 */ { MAD_F(0x06cad910) /* 0.424523415 */, 18 }, - /* 6094 */ { MAD_F(0x06cb3a7a) /* 0.424616316 */, 18 }, - /* 6095 */ { MAD_F(0x06cb9be5) /* 0.424709222 */, 18 }, - - /* 6096 */ { MAD_F(0x06cbfd52) /* 0.424802133 */, 18 }, - /* 6097 */ { MAD_F(0x06cc5ec0) /* 0.424895050 */, 18 }, - /* 6098 */ { MAD_F(0x06ccc030) /* 0.424987971 */, 18 }, - /* 6099 */ { MAD_F(0x06cd21a0) /* 0.425080898 */, 18 }, - /* 6100 */ { MAD_F(0x06cd8313) /* 0.425173829 */, 18 }, - /* 6101 */ { MAD_F(0x06cde486) /* 0.425266766 */, 18 }, - /* 6102 */ { MAD_F(0x06ce45fb) /* 0.425359708 */, 18 }, - /* 6103 */ { MAD_F(0x06cea771) /* 0.425452655 */, 18 }, - /* 6104 */ { MAD_F(0x06cf08e9) /* 0.425545607 */, 18 }, - /* 6105 */ { MAD_F(0x06cf6a62) /* 0.425638564 */, 18 }, - /* 6106 */ { MAD_F(0x06cfcbdc) /* 0.425731526 */, 18 }, - /* 6107 */ { MAD_F(0x06d02d58) /* 0.425824493 */, 18 }, - /* 6108 */ { MAD_F(0x06d08ed5) /* 0.425917465 */, 18 }, - /* 6109 */ { MAD_F(0x06d0f053) /* 0.426010443 */, 18 }, - /* 6110 */ { MAD_F(0x06d151d3) /* 0.426103425 */, 18 }, - /* 6111 */ { MAD_F(0x06d1b354) /* 0.426196412 */, 18 }, - - /* 6112 */ { MAD_F(0x06d214d7) /* 0.426289405 */, 18 }, - /* 6113 */ { MAD_F(0x06d2765a) /* 0.426382403 */, 18 }, - /* 6114 */ { MAD_F(0x06d2d7e0) /* 0.426475405 */, 18 }, - /* 6115 */ { MAD_F(0x06d33966) /* 0.426568413 */, 18 }, - /* 6116 */ { MAD_F(0x06d39aee) /* 0.426661426 */, 18 }, - /* 6117 */ { MAD_F(0x06d3fc77) /* 0.426754444 */, 18 }, - /* 6118 */ { MAD_F(0x06d45e02) /* 0.426847467 */, 18 }, - /* 6119 */ { MAD_F(0x06d4bf8e) /* 0.426940495 */, 18 }, - /* 6120 */ { MAD_F(0x06d5211c) /* 0.427033528 */, 18 }, - /* 6121 */ { MAD_F(0x06d582aa) /* 0.427126566 */, 18 }, - /* 6122 */ { MAD_F(0x06d5e43a) /* 0.427219609 */, 18 }, - /* 6123 */ { MAD_F(0x06d645cc) /* 0.427312657 */, 18 }, - /* 6124 */ { MAD_F(0x06d6a75f) /* 0.427405711 */, 18 }, - /* 6125 */ { MAD_F(0x06d708f3) /* 0.427498769 */, 18 }, - /* 6126 */ { MAD_F(0x06d76a88) /* 0.427591833 */, 18 }, - /* 6127 */ { MAD_F(0x06d7cc1f) /* 0.427684901 */, 18 }, - - /* 6128 */ { MAD_F(0x06d82db8) /* 0.427777975 */, 18 }, - /* 6129 */ { MAD_F(0x06d88f51) /* 0.427871054 */, 18 }, - /* 6130 */ { MAD_F(0x06d8f0ec) /* 0.427964137 */, 18 }, - /* 6131 */ { MAD_F(0x06d95288) /* 0.428057226 */, 18 }, - /* 6132 */ { MAD_F(0x06d9b426) /* 0.428150320 */, 18 }, - /* 6133 */ { MAD_F(0x06da15c5) /* 0.428243419 */, 18 }, - /* 6134 */ { MAD_F(0x06da7766) /* 0.428336523 */, 18 }, - /* 6135 */ { MAD_F(0x06dad907) /* 0.428429632 */, 18 }, - /* 6136 */ { MAD_F(0x06db3aaa) /* 0.428522746 */, 18 }, - /* 6137 */ { MAD_F(0x06db9c4f) /* 0.428615865 */, 18 }, - /* 6138 */ { MAD_F(0x06dbfdf5) /* 0.428708989 */, 18 }, - /* 6139 */ { MAD_F(0x06dc5f9c) /* 0.428802119 */, 18 }, - /* 6140 */ { MAD_F(0x06dcc145) /* 0.428895253 */, 18 }, - /* 6141 */ { MAD_F(0x06dd22ee) /* 0.428988392 */, 18 }, - /* 6142 */ { MAD_F(0x06dd849a) /* 0.429081537 */, 18 }, - /* 6143 */ { MAD_F(0x06dde646) /* 0.429174686 */, 18 }, - - /* 6144 */ { MAD_F(0x06de47f4) /* 0.429267841 */, 18 }, - /* 6145 */ { MAD_F(0x06dea9a4) /* 0.429361001 */, 18 }, - /* 6146 */ { MAD_F(0x06df0b54) /* 0.429454165 */, 18 }, - /* 6147 */ { MAD_F(0x06df6d06) /* 0.429547335 */, 18 }, - /* 6148 */ { MAD_F(0x06dfceba) /* 0.429640510 */, 18 }, - /* 6149 */ { MAD_F(0x06e0306f) /* 0.429733690 */, 18 }, - /* 6150 */ { MAD_F(0x06e09225) /* 0.429826874 */, 18 }, - /* 6151 */ { MAD_F(0x06e0f3dc) /* 0.429920064 */, 18 }, - /* 6152 */ { MAD_F(0x06e15595) /* 0.430013259 */, 18 }, - /* 6153 */ { MAD_F(0x06e1b74f) /* 0.430106459 */, 18 }, - /* 6154 */ { MAD_F(0x06e2190b) /* 0.430199664 */, 18 }, - /* 6155 */ { MAD_F(0x06e27ac8) /* 0.430292875 */, 18 }, - /* 6156 */ { MAD_F(0x06e2dc86) /* 0.430386090 */, 18 }, - /* 6157 */ { MAD_F(0x06e33e46) /* 0.430479310 */, 18 }, - /* 6158 */ { MAD_F(0x06e3a007) /* 0.430572535 */, 18 }, - /* 6159 */ { MAD_F(0x06e401c9) /* 0.430665765 */, 18 }, - - /* 6160 */ { MAD_F(0x06e4638d) /* 0.430759001 */, 18 }, - /* 6161 */ { MAD_F(0x06e4c552) /* 0.430852241 */, 18 }, - /* 6162 */ { MAD_F(0x06e52718) /* 0.430945487 */, 18 }, - /* 6163 */ { MAD_F(0x06e588e0) /* 0.431038737 */, 18 }, - /* 6164 */ { MAD_F(0x06e5eaa9) /* 0.431131993 */, 18 }, - /* 6165 */ { MAD_F(0x06e64c73) /* 0.431225253 */, 18 }, - /* 6166 */ { MAD_F(0x06e6ae3f) /* 0.431318519 */, 18 }, - /* 6167 */ { MAD_F(0x06e7100c) /* 0.431411790 */, 18 }, - /* 6168 */ { MAD_F(0x06e771db) /* 0.431505065 */, 18 }, - /* 6169 */ { MAD_F(0x06e7d3ab) /* 0.431598346 */, 18 }, - /* 6170 */ { MAD_F(0x06e8357c) /* 0.431691632 */, 18 }, - /* 6171 */ { MAD_F(0x06e8974e) /* 0.431784923 */, 18 }, - /* 6172 */ { MAD_F(0x06e8f922) /* 0.431878218 */, 18 }, - /* 6173 */ { MAD_F(0x06e95af8) /* 0.431971519 */, 18 }, - /* 6174 */ { MAD_F(0x06e9bcce) /* 0.432064825 */, 18 }, - /* 6175 */ { MAD_F(0x06ea1ea6) /* 0.432158136 */, 18 }, - - /* 6176 */ { MAD_F(0x06ea807f) /* 0.432251452 */, 18 }, - /* 6177 */ { MAD_F(0x06eae25a) /* 0.432344773 */, 18 }, - /* 6178 */ { MAD_F(0x06eb4436) /* 0.432438099 */, 18 }, - /* 6179 */ { MAD_F(0x06eba614) /* 0.432531431 */, 18 }, - /* 6180 */ { MAD_F(0x06ec07f2) /* 0.432624767 */, 18 }, - /* 6181 */ { MAD_F(0x06ec69d2) /* 0.432718108 */, 18 }, - /* 6182 */ { MAD_F(0x06eccbb4) /* 0.432811454 */, 18 }, - /* 6183 */ { MAD_F(0x06ed2d97) /* 0.432904805 */, 18 }, - /* 6184 */ { MAD_F(0x06ed8f7b) /* 0.432998162 */, 18 }, - /* 6185 */ { MAD_F(0x06edf160) /* 0.433091523 */, 18 }, - /* 6186 */ { MAD_F(0x06ee5347) /* 0.433184889 */, 18 }, - /* 6187 */ { MAD_F(0x06eeb52f) /* 0.433278261 */, 18 }, - /* 6188 */ { MAD_F(0x06ef1719) /* 0.433371637 */, 18 }, - /* 6189 */ { MAD_F(0x06ef7904) /* 0.433465019 */, 18 }, - /* 6190 */ { MAD_F(0x06efdaf0) /* 0.433558405 */, 18 }, - /* 6191 */ { MAD_F(0x06f03cde) /* 0.433651797 */, 18 }, - - /* 6192 */ { MAD_F(0x06f09ecc) /* 0.433745193 */, 18 }, - /* 6193 */ { MAD_F(0x06f100bd) /* 0.433838595 */, 18 }, - /* 6194 */ { MAD_F(0x06f162ae) /* 0.433932001 */, 18 }, - /* 6195 */ { MAD_F(0x06f1c4a1) /* 0.434025413 */, 18 }, - /* 6196 */ { MAD_F(0x06f22696) /* 0.434118830 */, 18 }, - /* 6197 */ { MAD_F(0x06f2888b) /* 0.434212251 */, 18 }, - /* 6198 */ { MAD_F(0x06f2ea82) /* 0.434305678 */, 18 }, - /* 6199 */ { MAD_F(0x06f34c7b) /* 0.434399110 */, 18 }, - /* 6200 */ { MAD_F(0x06f3ae75) /* 0.434492546 */, 18 }, - /* 6201 */ { MAD_F(0x06f41070) /* 0.434585988 */, 18 }, - /* 6202 */ { MAD_F(0x06f4726c) /* 0.434679435 */, 18 }, - /* 6203 */ { MAD_F(0x06f4d46a) /* 0.434772887 */, 18 }, - /* 6204 */ { MAD_F(0x06f53669) /* 0.434866344 */, 18 }, - /* 6205 */ { MAD_F(0x06f59869) /* 0.434959806 */, 18 }, - /* 6206 */ { MAD_F(0x06f5fa6b) /* 0.435053272 */, 18 }, - /* 6207 */ { MAD_F(0x06f65c6e) /* 0.435146744 */, 18 }, - - /* 6208 */ { MAD_F(0x06f6be73) /* 0.435240221 */, 18 }, - /* 6209 */ { MAD_F(0x06f72079) /* 0.435333703 */, 18 }, - /* 6210 */ { MAD_F(0x06f78280) /* 0.435427190 */, 18 }, - /* 6211 */ { MAD_F(0x06f7e489) /* 0.435520682 */, 18 }, - /* 6212 */ { MAD_F(0x06f84693) /* 0.435614179 */, 18 }, - /* 6213 */ { MAD_F(0x06f8a89e) /* 0.435707681 */, 18 }, - /* 6214 */ { MAD_F(0x06f90aaa) /* 0.435801188 */, 18 }, - /* 6215 */ { MAD_F(0x06f96cb8) /* 0.435894700 */, 18 }, - /* 6216 */ { MAD_F(0x06f9cec8) /* 0.435988217 */, 18 }, - /* 6217 */ { MAD_F(0x06fa30d8) /* 0.436081739 */, 18 }, - /* 6218 */ { MAD_F(0x06fa92ea) /* 0.436175266 */, 18 }, - /* 6219 */ { MAD_F(0x06faf4fe) /* 0.436268799 */, 18 }, - /* 6220 */ { MAD_F(0x06fb5712) /* 0.436362336 */, 18 }, - /* 6221 */ { MAD_F(0x06fbb928) /* 0.436455878 */, 18 }, - /* 6222 */ { MAD_F(0x06fc1b40) /* 0.436549425 */, 18 }, - /* 6223 */ { MAD_F(0x06fc7d58) /* 0.436642977 */, 18 }, - - /* 6224 */ { MAD_F(0x06fcdf72) /* 0.436736534 */, 18 }, - /* 6225 */ { MAD_F(0x06fd418e) /* 0.436830096 */, 18 }, - /* 6226 */ { MAD_F(0x06fda3ab) /* 0.436923664 */, 18 }, - /* 6227 */ { MAD_F(0x06fe05c9) /* 0.437017236 */, 18 }, - /* 6228 */ { MAD_F(0x06fe67e8) /* 0.437110813 */, 18 }, - /* 6229 */ { MAD_F(0x06feca09) /* 0.437204395 */, 18 }, - /* 6230 */ { MAD_F(0x06ff2c2b) /* 0.437297982 */, 18 }, - /* 6231 */ { MAD_F(0x06ff8e4f) /* 0.437391575 */, 18 }, - /* 6232 */ { MAD_F(0x06fff073) /* 0.437485172 */, 18 }, - /* 6233 */ { MAD_F(0x0700529a) /* 0.437578774 */, 18 }, - /* 6234 */ { MAD_F(0x0700b4c1) /* 0.437672381 */, 18 }, - /* 6235 */ { MAD_F(0x070116ea) /* 0.437765994 */, 18 }, - /* 6236 */ { MAD_F(0x07017914) /* 0.437859611 */, 18 }, - /* 6237 */ { MAD_F(0x0701db40) /* 0.437953233 */, 18 }, - /* 6238 */ { MAD_F(0x07023d6c) /* 0.438046860 */, 18 }, - /* 6239 */ { MAD_F(0x07029f9b) /* 0.438140493 */, 18 }, - - /* 6240 */ { MAD_F(0x070301ca) /* 0.438234130 */, 18 }, - /* 6241 */ { MAD_F(0x070363fb) /* 0.438327772 */, 18 }, - /* 6242 */ { MAD_F(0x0703c62d) /* 0.438421419 */, 18 }, - /* 6243 */ { MAD_F(0x07042861) /* 0.438515072 */, 18 }, - /* 6244 */ { MAD_F(0x07048a96) /* 0.438608729 */, 18 }, - /* 6245 */ { MAD_F(0x0704eccc) /* 0.438702391 */, 18 }, - /* 6246 */ { MAD_F(0x07054f04) /* 0.438796059 */, 18 }, - /* 6247 */ { MAD_F(0x0705b13d) /* 0.438889731 */, 18 }, - /* 6248 */ { MAD_F(0x07061377) /* 0.438983408 */, 18 }, - /* 6249 */ { MAD_F(0x070675b3) /* 0.439077090 */, 18 }, - /* 6250 */ { MAD_F(0x0706d7f0) /* 0.439170778 */, 18 }, - /* 6251 */ { MAD_F(0x07073a2e) /* 0.439264470 */, 18 }, - /* 6252 */ { MAD_F(0x07079c6e) /* 0.439358167 */, 18 }, - /* 6253 */ { MAD_F(0x0707feaf) /* 0.439451869 */, 18 }, - /* 6254 */ { MAD_F(0x070860f1) /* 0.439545577 */, 18 }, - /* 6255 */ { MAD_F(0x0708c335) /* 0.439639289 */, 18 }, - - /* 6256 */ { MAD_F(0x0709257a) /* 0.439733006 */, 18 }, - /* 6257 */ { MAD_F(0x070987c0) /* 0.439826728 */, 18 }, - /* 6258 */ { MAD_F(0x0709ea08) /* 0.439920456 */, 18 }, - /* 6259 */ { MAD_F(0x070a4c51) /* 0.440014188 */, 18 }, - /* 6260 */ { MAD_F(0x070aae9b) /* 0.440107925 */, 18 }, - /* 6261 */ { MAD_F(0x070b10e7) /* 0.440201667 */, 18 }, - /* 6262 */ { MAD_F(0x070b7334) /* 0.440295414 */, 18 }, - /* 6263 */ { MAD_F(0x070bd583) /* 0.440389167 */, 18 }, - /* 6264 */ { MAD_F(0x070c37d2) /* 0.440482924 */, 18 }, - /* 6265 */ { MAD_F(0x070c9a23) /* 0.440576686 */, 18 }, - /* 6266 */ { MAD_F(0x070cfc76) /* 0.440670453 */, 18 }, - /* 6267 */ { MAD_F(0x070d5eca) /* 0.440764225 */, 18 }, - /* 6268 */ { MAD_F(0x070dc11f) /* 0.440858002 */, 18 }, - /* 6269 */ { MAD_F(0x070e2375) /* 0.440951784 */, 18 }, - /* 6270 */ { MAD_F(0x070e85cd) /* 0.441045572 */, 18 }, - /* 6271 */ { MAD_F(0x070ee826) /* 0.441139364 */, 18 }, - - /* 6272 */ { MAD_F(0x070f4a80) /* 0.441233161 */, 18 }, - /* 6273 */ { MAD_F(0x070facdc) /* 0.441326963 */, 18 }, - /* 6274 */ { MAD_F(0x07100f39) /* 0.441420770 */, 18 }, - /* 6275 */ { MAD_F(0x07107198) /* 0.441514582 */, 18 }, - /* 6276 */ { MAD_F(0x0710d3f8) /* 0.441608399 */, 18 }, - /* 6277 */ { MAD_F(0x07113659) /* 0.441702221 */, 18 }, - /* 6278 */ { MAD_F(0x071198bb) /* 0.441796048 */, 18 }, - /* 6279 */ { MAD_F(0x0711fb1f) /* 0.441889880 */, 18 }, - /* 6280 */ { MAD_F(0x07125d84) /* 0.441983717 */, 18 }, - /* 6281 */ { MAD_F(0x0712bfeb) /* 0.442077559 */, 18 }, - /* 6282 */ { MAD_F(0x07132253) /* 0.442171406 */, 18 }, - /* 6283 */ { MAD_F(0x071384bc) /* 0.442265257 */, 18 }, - /* 6284 */ { MAD_F(0x0713e726) /* 0.442359114 */, 18 }, - /* 6285 */ { MAD_F(0x07144992) /* 0.442452976 */, 18 }, - /* 6286 */ { MAD_F(0x0714abff) /* 0.442546843 */, 18 }, - /* 6287 */ { MAD_F(0x07150e6e) /* 0.442640715 */, 18 }, - - /* 6288 */ { MAD_F(0x071570de) /* 0.442734592 */, 18 }, - /* 6289 */ { MAD_F(0x0715d34f) /* 0.442828473 */, 18 }, - /* 6290 */ { MAD_F(0x071635c1) /* 0.442922360 */, 18 }, - /* 6291 */ { MAD_F(0x07169835) /* 0.443016252 */, 18 }, - /* 6292 */ { MAD_F(0x0716faaa) /* 0.443110148 */, 18 }, - /* 6293 */ { MAD_F(0x07175d21) /* 0.443204050 */, 18 }, - /* 6294 */ { MAD_F(0x0717bf99) /* 0.443297957 */, 18 }, - /* 6295 */ { MAD_F(0x07182212) /* 0.443391868 */, 18 }, - /* 6296 */ { MAD_F(0x0718848d) /* 0.443485785 */, 18 }, - /* 6297 */ { MAD_F(0x0718e709) /* 0.443579706 */, 18 }, - /* 6298 */ { MAD_F(0x07194986) /* 0.443673633 */, 18 }, - /* 6299 */ { MAD_F(0x0719ac04) /* 0.443767564 */, 18 }, - /* 6300 */ { MAD_F(0x071a0e84) /* 0.443861501 */, 18 }, - /* 6301 */ { MAD_F(0x071a7105) /* 0.443955442 */, 18 }, - /* 6302 */ { MAD_F(0x071ad388) /* 0.444049389 */, 18 }, - /* 6303 */ { MAD_F(0x071b360c) /* 0.444143340 */, 18 }, - - /* 6304 */ { MAD_F(0x071b9891) /* 0.444237296 */, 18 }, - /* 6305 */ { MAD_F(0x071bfb18) /* 0.444331258 */, 18 }, - /* 6306 */ { MAD_F(0x071c5d9f) /* 0.444425224 */, 18 }, - /* 6307 */ { MAD_F(0x071cc029) /* 0.444519195 */, 18 }, - /* 6308 */ { MAD_F(0x071d22b3) /* 0.444613171 */, 18 }, - /* 6309 */ { MAD_F(0x071d853f) /* 0.444707153 */, 18 }, - /* 6310 */ { MAD_F(0x071de7cc) /* 0.444801139 */, 18 }, - /* 6311 */ { MAD_F(0x071e4a5b) /* 0.444895130 */, 18 }, - /* 6312 */ { MAD_F(0x071eaceb) /* 0.444989126 */, 18 }, - /* 6313 */ { MAD_F(0x071f0f7c) /* 0.445083127 */, 18 }, - /* 6314 */ { MAD_F(0x071f720e) /* 0.445177133 */, 18 }, - /* 6315 */ { MAD_F(0x071fd4a2) /* 0.445271144 */, 18 }, - /* 6316 */ { MAD_F(0x07203737) /* 0.445365160 */, 18 }, - /* 6317 */ { MAD_F(0x072099ce) /* 0.445459181 */, 18 }, - /* 6318 */ { MAD_F(0x0720fc66) /* 0.445553206 */, 18 }, - /* 6319 */ { MAD_F(0x07215eff) /* 0.445647237 */, 18 }, - - /* 6320 */ { MAD_F(0x0721c19a) /* 0.445741273 */, 18 }, - /* 6321 */ { MAD_F(0x07222436) /* 0.445835314 */, 18 }, - /* 6322 */ { MAD_F(0x072286d3) /* 0.445929359 */, 18 }, - /* 6323 */ { MAD_F(0x0722e971) /* 0.446023410 */, 18 }, - /* 6324 */ { MAD_F(0x07234c11) /* 0.446117466 */, 18 }, - /* 6325 */ { MAD_F(0x0723aeb2) /* 0.446211526 */, 18 }, - /* 6326 */ { MAD_F(0x07241155) /* 0.446305592 */, 18 }, - /* 6327 */ { MAD_F(0x072473f9) /* 0.446399662 */, 18 }, - /* 6328 */ { MAD_F(0x0724d69e) /* 0.446493738 */, 18 }, - /* 6329 */ { MAD_F(0x07253944) /* 0.446587818 */, 18 }, - /* 6330 */ { MAD_F(0x07259bec) /* 0.446681903 */, 18 }, - /* 6331 */ { MAD_F(0x0725fe95) /* 0.446775994 */, 18 }, - /* 6332 */ { MAD_F(0x07266140) /* 0.446870089 */, 18 }, - /* 6333 */ { MAD_F(0x0726c3ec) /* 0.446964189 */, 18 }, - /* 6334 */ { MAD_F(0x07272699) /* 0.447058294 */, 18 }, - /* 6335 */ { MAD_F(0x07278947) /* 0.447152404 */, 18 }, - - /* 6336 */ { MAD_F(0x0727ebf7) /* 0.447246519 */, 18 }, - /* 6337 */ { MAD_F(0x07284ea8) /* 0.447340639 */, 18 }, - /* 6338 */ { MAD_F(0x0728b15b) /* 0.447434764 */, 18 }, - /* 6339 */ { MAD_F(0x0729140f) /* 0.447528894 */, 18 }, - /* 6340 */ { MAD_F(0x072976c4) /* 0.447623029 */, 18 }, - /* 6341 */ { MAD_F(0x0729d97a) /* 0.447717169 */, 18 }, - /* 6342 */ { MAD_F(0x072a3c32) /* 0.447811314 */, 18 }, - /* 6343 */ { MAD_F(0x072a9eeb) /* 0.447905463 */, 18 }, - /* 6344 */ { MAD_F(0x072b01a6) /* 0.447999618 */, 18 }, - /* 6345 */ { MAD_F(0x072b6461) /* 0.448093778 */, 18 }, - /* 6346 */ { MAD_F(0x072bc71e) /* 0.448187942 */, 18 }, - /* 6347 */ { MAD_F(0x072c29dd) /* 0.448282112 */, 18 }, - /* 6348 */ { MAD_F(0x072c8c9d) /* 0.448376286 */, 18 }, - /* 6349 */ { MAD_F(0x072cef5e) /* 0.448470466 */, 18 }, - /* 6350 */ { MAD_F(0x072d5220) /* 0.448564650 */, 18 }, - /* 6351 */ { MAD_F(0x072db4e4) /* 0.448658839 */, 18 }, - - /* 6352 */ { MAD_F(0x072e17a9) /* 0.448753033 */, 18 }, - /* 6353 */ { MAD_F(0x072e7a6f) /* 0.448847233 */, 18 }, - /* 6354 */ { MAD_F(0x072edd37) /* 0.448941437 */, 18 }, - /* 6355 */ { MAD_F(0x072f4000) /* 0.449035646 */, 18 }, - /* 6356 */ { MAD_F(0x072fa2ca) /* 0.449129860 */, 18 }, - /* 6357 */ { MAD_F(0x07300596) /* 0.449224079 */, 18 }, - /* 6358 */ { MAD_F(0x07306863) /* 0.449318303 */, 18 }, - /* 6359 */ { MAD_F(0x0730cb32) /* 0.449412531 */, 18 }, - /* 6360 */ { MAD_F(0x07312e01) /* 0.449506765 */, 18 }, - /* 6361 */ { MAD_F(0x073190d2) /* 0.449601004 */, 18 }, - /* 6362 */ { MAD_F(0x0731f3a5) /* 0.449695247 */, 18 }, - /* 6363 */ { MAD_F(0x07325678) /* 0.449789496 */, 18 }, - /* 6364 */ { MAD_F(0x0732b94d) /* 0.449883749 */, 18 }, - /* 6365 */ { MAD_F(0x07331c23) /* 0.449978008 */, 18 }, - /* 6366 */ { MAD_F(0x07337efb) /* 0.450072271 */, 18 }, - /* 6367 */ { MAD_F(0x0733e1d4) /* 0.450166540 */, 18 }, - - /* 6368 */ { MAD_F(0x073444ae) /* 0.450260813 */, 18 }, - /* 6369 */ { MAD_F(0x0734a78a) /* 0.450355091 */, 18 }, - /* 6370 */ { MAD_F(0x07350a67) /* 0.450449374 */, 18 }, - /* 6371 */ { MAD_F(0x07356d45) /* 0.450543662 */, 18 }, - /* 6372 */ { MAD_F(0x0735d025) /* 0.450637955 */, 18 }, - /* 6373 */ { MAD_F(0x07363306) /* 0.450732253 */, 18 }, - /* 6374 */ { MAD_F(0x073695e8) /* 0.450826556 */, 18 }, - /* 6375 */ { MAD_F(0x0736f8cb) /* 0.450920864 */, 18 }, - /* 6376 */ { MAD_F(0x07375bb0) /* 0.451015176 */, 18 }, - /* 6377 */ { MAD_F(0x0737be96) /* 0.451109494 */, 18 }, - /* 6378 */ { MAD_F(0x0738217e) /* 0.451203817 */, 18 }, - /* 6379 */ { MAD_F(0x07388467) /* 0.451298144 */, 18 }, - /* 6380 */ { MAD_F(0x0738e751) /* 0.451392477 */, 18 }, - /* 6381 */ { MAD_F(0x07394a3d) /* 0.451486814 */, 18 }, - /* 6382 */ { MAD_F(0x0739ad29) /* 0.451581156 */, 18 }, - /* 6383 */ { MAD_F(0x073a1017) /* 0.451675503 */, 18 }, - - /* 6384 */ { MAD_F(0x073a7307) /* 0.451769856 */, 18 }, - /* 6385 */ { MAD_F(0x073ad5f8) /* 0.451864213 */, 18 }, - /* 6386 */ { MAD_F(0x073b38ea) /* 0.451958575 */, 18 }, - /* 6387 */ { MAD_F(0x073b9bdd) /* 0.452052942 */, 18 }, - /* 6388 */ { MAD_F(0x073bfed2) /* 0.452147313 */, 18 }, - /* 6389 */ { MAD_F(0x073c61c8) /* 0.452241690 */, 18 }, - /* 6390 */ { MAD_F(0x073cc4bf) /* 0.452336072 */, 18 }, - /* 6391 */ { MAD_F(0x073d27b8) /* 0.452430458 */, 18 }, - /* 6392 */ { MAD_F(0x073d8ab2) /* 0.452524850 */, 18 }, - /* 6393 */ { MAD_F(0x073dedae) /* 0.452619246 */, 18 }, - /* 6394 */ { MAD_F(0x073e50aa) /* 0.452713648 */, 18 }, - /* 6395 */ { MAD_F(0x073eb3a8) /* 0.452808054 */, 18 }, - /* 6396 */ { MAD_F(0x073f16a8) /* 0.452902465 */, 18 }, - /* 6397 */ { MAD_F(0x073f79a8) /* 0.452996882 */, 18 }, - /* 6398 */ { MAD_F(0x073fdcaa) /* 0.453091303 */, 18 }, - /* 6399 */ { MAD_F(0x07403fad) /* 0.453185729 */, 18 }, - - /* 6400 */ { MAD_F(0x0740a2b2) /* 0.453280160 */, 18 }, - /* 6401 */ { MAD_F(0x074105b8) /* 0.453374595 */, 18 }, - /* 6402 */ { MAD_F(0x074168bf) /* 0.453469036 */, 18 }, - /* 6403 */ { MAD_F(0x0741cbc8) /* 0.453563482 */, 18 }, - /* 6404 */ { MAD_F(0x07422ed2) /* 0.453657932 */, 18 }, - /* 6405 */ { MAD_F(0x074291dd) /* 0.453752388 */, 18 }, - /* 6406 */ { MAD_F(0x0742f4e9) /* 0.453846848 */, 18 }, - /* 6407 */ { MAD_F(0x074357f7) /* 0.453941314 */, 18 }, - /* 6408 */ { MAD_F(0x0743bb06) /* 0.454035784 */, 18 }, - /* 6409 */ { MAD_F(0x07441e17) /* 0.454130259 */, 18 }, - /* 6410 */ { MAD_F(0x07448129) /* 0.454224739 */, 18 }, - /* 6411 */ { MAD_F(0x0744e43c) /* 0.454319224 */, 18 }, - /* 6412 */ { MAD_F(0x07454750) /* 0.454413714 */, 18 }, - /* 6413 */ { MAD_F(0x0745aa66) /* 0.454508209 */, 18 }, - /* 6414 */ { MAD_F(0x07460d7d) /* 0.454602708 */, 18 }, - /* 6415 */ { MAD_F(0x07467095) /* 0.454697213 */, 18 }, - - /* 6416 */ { MAD_F(0x0746d3af) /* 0.454791723 */, 18 }, - /* 6417 */ { MAD_F(0x074736ca) /* 0.454886237 */, 18 }, - /* 6418 */ { MAD_F(0x074799e7) /* 0.454980756 */, 18 }, - /* 6419 */ { MAD_F(0x0747fd04) /* 0.455075281 */, 18 }, - /* 6420 */ { MAD_F(0x07486023) /* 0.455169810 */, 18 }, - /* 6421 */ { MAD_F(0x0748c344) /* 0.455264344 */, 18 }, - /* 6422 */ { MAD_F(0x07492665) /* 0.455358883 */, 18 }, - /* 6423 */ { MAD_F(0x07498988) /* 0.455453427 */, 18 }, - /* 6424 */ { MAD_F(0x0749ecac) /* 0.455547976 */, 18 }, - /* 6425 */ { MAD_F(0x074a4fd2) /* 0.455642529 */, 18 }, - /* 6426 */ { MAD_F(0x074ab2f9) /* 0.455737088 */, 18 }, - /* 6427 */ { MAD_F(0x074b1621) /* 0.455831652 */, 18 }, - /* 6428 */ { MAD_F(0x074b794b) /* 0.455926220 */, 18 }, - /* 6429 */ { MAD_F(0x074bdc75) /* 0.456020793 */, 18 }, - /* 6430 */ { MAD_F(0x074c3fa1) /* 0.456115372 */, 18 }, - /* 6431 */ { MAD_F(0x074ca2cf) /* 0.456209955 */, 18 }, - - /* 6432 */ { MAD_F(0x074d05fe) /* 0.456304543 */, 18 }, - /* 6433 */ { MAD_F(0x074d692e) /* 0.456399136 */, 18 }, - /* 6434 */ { MAD_F(0x074dcc5f) /* 0.456493733 */, 18 }, - /* 6435 */ { MAD_F(0x074e2f92) /* 0.456588336 */, 18 }, - /* 6436 */ { MAD_F(0x074e92c6) /* 0.456682944 */, 18 }, - /* 6437 */ { MAD_F(0x074ef5fb) /* 0.456777556 */, 18 }, - /* 6438 */ { MAD_F(0x074f5932) /* 0.456872174 */, 18 }, - /* 6439 */ { MAD_F(0x074fbc6a) /* 0.456966796 */, 18 }, - /* 6440 */ { MAD_F(0x07501fa3) /* 0.457061423 */, 18 }, - /* 6441 */ { MAD_F(0x075082de) /* 0.457156056 */, 18 }, - /* 6442 */ { MAD_F(0x0750e61a) /* 0.457250693 */, 18 }, - /* 6443 */ { MAD_F(0x07514957) /* 0.457345335 */, 18 }, - /* 6444 */ { MAD_F(0x0751ac96) /* 0.457439981 */, 18 }, - /* 6445 */ { MAD_F(0x07520fd6) /* 0.457534633 */, 18 }, - /* 6446 */ { MAD_F(0x07527317) /* 0.457629290 */, 18 }, - /* 6447 */ { MAD_F(0x0752d659) /* 0.457723951 */, 18 }, - - /* 6448 */ { MAD_F(0x0753399d) /* 0.457818618 */, 18 }, - /* 6449 */ { MAD_F(0x07539ce2) /* 0.457913289 */, 18 }, - /* 6450 */ { MAD_F(0x07540029) /* 0.458007965 */, 18 }, - /* 6451 */ { MAD_F(0x07546371) /* 0.458102646 */, 18 }, - /* 6452 */ { MAD_F(0x0754c6ba) /* 0.458197332 */, 18 }, - /* 6453 */ { MAD_F(0x07552a04) /* 0.458292023 */, 18 }, - /* 6454 */ { MAD_F(0x07558d50) /* 0.458386719 */, 18 }, - /* 6455 */ { MAD_F(0x0755f09d) /* 0.458481420 */, 18 }, - /* 6456 */ { MAD_F(0x075653eb) /* 0.458576125 */, 18 }, - /* 6457 */ { MAD_F(0x0756b73b) /* 0.458670836 */, 18 }, - /* 6458 */ { MAD_F(0x07571a8c) /* 0.458765551 */, 18 }, - /* 6459 */ { MAD_F(0x07577dde) /* 0.458860271 */, 18 }, - /* 6460 */ { MAD_F(0x0757e131) /* 0.458954996 */, 18 }, - /* 6461 */ { MAD_F(0x07584486) /* 0.459049726 */, 18 }, - /* 6462 */ { MAD_F(0x0758a7dd) /* 0.459144461 */, 18 }, - /* 6463 */ { MAD_F(0x07590b34) /* 0.459239201 */, 18 }, - - /* 6464 */ { MAD_F(0x07596e8d) /* 0.459333946 */, 18 }, - /* 6465 */ { MAD_F(0x0759d1e7) /* 0.459428695 */, 18 }, - /* 6466 */ { MAD_F(0x075a3542) /* 0.459523450 */, 18 }, - /* 6467 */ { MAD_F(0x075a989f) /* 0.459618209 */, 18 }, - /* 6468 */ { MAD_F(0x075afbfd) /* 0.459712973 */, 18 }, - /* 6469 */ { MAD_F(0x075b5f5d) /* 0.459807742 */, 18 }, - /* 6470 */ { MAD_F(0x075bc2bd) /* 0.459902516 */, 18 }, - /* 6471 */ { MAD_F(0x075c261f) /* 0.459997295 */, 18 }, - /* 6472 */ { MAD_F(0x075c8983) /* 0.460092079 */, 18 }, - /* 6473 */ { MAD_F(0x075cece7) /* 0.460186867 */, 18 }, - /* 6474 */ { MAD_F(0x075d504d) /* 0.460281661 */, 18 }, - /* 6475 */ { MAD_F(0x075db3b5) /* 0.460376459 */, 18 }, - /* 6476 */ { MAD_F(0x075e171d) /* 0.460471262 */, 18 }, - /* 6477 */ { MAD_F(0x075e7a87) /* 0.460566071 */, 18 }, - /* 6478 */ { MAD_F(0x075eddf2) /* 0.460660884 */, 18 }, - /* 6479 */ { MAD_F(0x075f415f) /* 0.460755701 */, 18 }, - - /* 6480 */ { MAD_F(0x075fa4cc) /* 0.460850524 */, 18 }, - /* 6481 */ { MAD_F(0x0760083b) /* 0.460945352 */, 18 }, - /* 6482 */ { MAD_F(0x07606bac) /* 0.461040184 */, 18 }, - /* 6483 */ { MAD_F(0x0760cf1e) /* 0.461135022 */, 18 }, - /* 6484 */ { MAD_F(0x07613291) /* 0.461229864 */, 18 }, - /* 6485 */ { MAD_F(0x07619605) /* 0.461324711 */, 18 }, - /* 6486 */ { MAD_F(0x0761f97b) /* 0.461419563 */, 18 }, - /* 6487 */ { MAD_F(0x07625cf2) /* 0.461514420 */, 18 }, - /* 6488 */ { MAD_F(0x0762c06a) /* 0.461609282 */, 18 }, - /* 6489 */ { MAD_F(0x076323e3) /* 0.461704149 */, 18 }, - /* 6490 */ { MAD_F(0x0763875e) /* 0.461799020 */, 18 }, - /* 6491 */ { MAD_F(0x0763eadb) /* 0.461893897 */, 18 }, - /* 6492 */ { MAD_F(0x07644e58) /* 0.461988778 */, 18 }, - /* 6493 */ { MAD_F(0x0764b1d7) /* 0.462083664 */, 18 }, - /* 6494 */ { MAD_F(0x07651557) /* 0.462178555 */, 18 }, - /* 6495 */ { MAD_F(0x076578d8) /* 0.462273451 */, 18 }, - - /* 6496 */ { MAD_F(0x0765dc5b) /* 0.462368352 */, 18 }, - /* 6497 */ { MAD_F(0x07663fdf) /* 0.462463257 */, 18 }, - /* 6498 */ { MAD_F(0x0766a364) /* 0.462558168 */, 18 }, - /* 6499 */ { MAD_F(0x076706eb) /* 0.462653083 */, 18 }, - /* 6500 */ { MAD_F(0x07676a73) /* 0.462748003 */, 18 }, - /* 6501 */ { MAD_F(0x0767cdfc) /* 0.462842928 */, 18 }, - /* 6502 */ { MAD_F(0x07683187) /* 0.462937858 */, 18 }, - /* 6503 */ { MAD_F(0x07689513) /* 0.463032793 */, 18 }, - /* 6504 */ { MAD_F(0x0768f8a0) /* 0.463127733 */, 18 }, - /* 6505 */ { MAD_F(0x07695c2e) /* 0.463222678 */, 18 }, - /* 6506 */ { MAD_F(0x0769bfbe) /* 0.463317627 */, 18 }, - /* 6507 */ { MAD_F(0x076a234f) /* 0.463412581 */, 18 }, - /* 6508 */ { MAD_F(0x076a86e2) /* 0.463507540 */, 18 }, - /* 6509 */ { MAD_F(0x076aea75) /* 0.463602504 */, 18 }, - /* 6510 */ { MAD_F(0x076b4e0a) /* 0.463697473 */, 18 }, - /* 6511 */ { MAD_F(0x076bb1a1) /* 0.463792447 */, 18 }, - - /* 6512 */ { MAD_F(0x076c1538) /* 0.463887426 */, 18 }, - /* 6513 */ { MAD_F(0x076c78d1) /* 0.463982409 */, 18 }, - /* 6514 */ { MAD_F(0x076cdc6c) /* 0.464077398 */, 18 }, - /* 6515 */ { MAD_F(0x076d4007) /* 0.464172391 */, 18 }, - /* 6516 */ { MAD_F(0x076da3a4) /* 0.464267389 */, 18 }, - /* 6517 */ { MAD_F(0x076e0742) /* 0.464362392 */, 18 }, - /* 6518 */ { MAD_F(0x076e6ae2) /* 0.464457399 */, 18 }, - /* 6519 */ { MAD_F(0x076ece82) /* 0.464552412 */, 18 }, - /* 6520 */ { MAD_F(0x076f3224) /* 0.464647430 */, 18 }, - /* 6521 */ { MAD_F(0x076f95c8) /* 0.464742452 */, 18 }, - /* 6522 */ { MAD_F(0x076ff96c) /* 0.464837479 */, 18 }, - /* 6523 */ { MAD_F(0x07705d12) /* 0.464932511 */, 18 }, - /* 6524 */ { MAD_F(0x0770c0ba) /* 0.465027548 */, 18 }, - /* 6525 */ { MAD_F(0x07712462) /* 0.465122590 */, 18 }, - /* 6526 */ { MAD_F(0x0771880c) /* 0.465217637 */, 18 }, - /* 6527 */ { MAD_F(0x0771ebb7) /* 0.465312688 */, 18 }, - - /* 6528 */ { MAD_F(0x07724f64) /* 0.465407744 */, 18 }, - /* 6529 */ { MAD_F(0x0772b312) /* 0.465502806 */, 18 }, - /* 6530 */ { MAD_F(0x077316c1) /* 0.465597872 */, 18 }, - /* 6531 */ { MAD_F(0x07737a71) /* 0.465692943 */, 18 }, - /* 6532 */ { MAD_F(0x0773de23) /* 0.465788018 */, 18 }, - /* 6533 */ { MAD_F(0x077441d6) /* 0.465883099 */, 18 }, - /* 6534 */ { MAD_F(0x0774a58a) /* 0.465978184 */, 18 }, - /* 6535 */ { MAD_F(0x07750940) /* 0.466073275 */, 18 }, - /* 6536 */ { MAD_F(0x07756cf7) /* 0.466168370 */, 18 }, - /* 6537 */ { MAD_F(0x0775d0af) /* 0.466263470 */, 18 }, - /* 6538 */ { MAD_F(0x07763468) /* 0.466358575 */, 18 }, - /* 6539 */ { MAD_F(0x07769823) /* 0.466453684 */, 18 }, - /* 6540 */ { MAD_F(0x0776fbdf) /* 0.466548799 */, 18 }, - /* 6541 */ { MAD_F(0x07775f9d) /* 0.466643918 */, 18 }, - /* 6542 */ { MAD_F(0x0777c35c) /* 0.466739043 */, 18 }, - /* 6543 */ { MAD_F(0x0778271c) /* 0.466834172 */, 18 }, - - /* 6544 */ { MAD_F(0x07788add) /* 0.466929306 */, 18 }, - /* 6545 */ { MAD_F(0x0778ee9f) /* 0.467024445 */, 18 }, - /* 6546 */ { MAD_F(0x07795263) /* 0.467119588 */, 18 }, - /* 6547 */ { MAD_F(0x0779b629) /* 0.467214737 */, 18 }, - /* 6548 */ { MAD_F(0x077a19ef) /* 0.467309890 */, 18 }, - /* 6549 */ { MAD_F(0x077a7db7) /* 0.467405048 */, 18 }, - /* 6550 */ { MAD_F(0x077ae180) /* 0.467500211 */, 18 }, - /* 6551 */ { MAD_F(0x077b454b) /* 0.467595379 */, 18 }, - /* 6552 */ { MAD_F(0x077ba916) /* 0.467690552 */, 18 }, - /* 6553 */ { MAD_F(0x077c0ce3) /* 0.467785729 */, 18 }, - /* 6554 */ { MAD_F(0x077c70b2) /* 0.467880912 */, 18 }, - /* 6555 */ { MAD_F(0x077cd481) /* 0.467976099 */, 18 }, - /* 6556 */ { MAD_F(0x077d3852) /* 0.468071291 */, 18 }, - /* 6557 */ { MAD_F(0x077d9c24) /* 0.468166488 */, 18 }, - /* 6558 */ { MAD_F(0x077dfff8) /* 0.468261690 */, 18 }, - /* 6559 */ { MAD_F(0x077e63cd) /* 0.468356896 */, 18 }, - - /* 6560 */ { MAD_F(0x077ec7a3) /* 0.468452108 */, 18 }, - /* 6561 */ { MAD_F(0x077f2b7a) /* 0.468547324 */, 18 }, - /* 6562 */ { MAD_F(0x077f8f53) /* 0.468642545 */, 18 }, - /* 6563 */ { MAD_F(0x077ff32d) /* 0.468737771 */, 18 }, - /* 6564 */ { MAD_F(0x07805708) /* 0.468833002 */, 18 }, - /* 6565 */ { MAD_F(0x0780bae5) /* 0.468928237 */, 18 }, - /* 6566 */ { MAD_F(0x07811ec3) /* 0.469023478 */, 18 }, - /* 6567 */ { MAD_F(0x078182a2) /* 0.469118723 */, 18 }, - /* 6568 */ { MAD_F(0x0781e683) /* 0.469213973 */, 18 }, - /* 6569 */ { MAD_F(0x07824a64) /* 0.469309228 */, 18 }, - /* 6570 */ { MAD_F(0x0782ae47) /* 0.469404488 */, 18 }, - /* 6571 */ { MAD_F(0x0783122c) /* 0.469499752 */, 18 }, - /* 6572 */ { MAD_F(0x07837612) /* 0.469595022 */, 18 }, - /* 6573 */ { MAD_F(0x0783d9f9) /* 0.469690296 */, 18 }, - /* 6574 */ { MAD_F(0x07843de1) /* 0.469785575 */, 18 }, - /* 6575 */ { MAD_F(0x0784a1ca) /* 0.469880859 */, 18 }, - - /* 6576 */ { MAD_F(0x078505b5) /* 0.469976148 */, 18 }, - /* 6577 */ { MAD_F(0x078569a2) /* 0.470071442 */, 18 }, - /* 6578 */ { MAD_F(0x0785cd8f) /* 0.470166740 */, 18 }, - /* 6579 */ { MAD_F(0x0786317e) /* 0.470262043 */, 18 }, - /* 6580 */ { MAD_F(0x0786956e) /* 0.470357351 */, 18 }, - /* 6581 */ { MAD_F(0x0786f95f) /* 0.470452664 */, 18 }, - /* 6582 */ { MAD_F(0x07875d52) /* 0.470547982 */, 18 }, - /* 6583 */ { MAD_F(0x0787c146) /* 0.470643305 */, 18 }, - /* 6584 */ { MAD_F(0x0788253b) /* 0.470738632 */, 18 }, - /* 6585 */ { MAD_F(0x07888932) /* 0.470833964 */, 18 }, - /* 6586 */ { MAD_F(0x0788ed2a) /* 0.470929301 */, 18 }, - /* 6587 */ { MAD_F(0x07895123) /* 0.471024643 */, 18 }, - /* 6588 */ { MAD_F(0x0789b51d) /* 0.471119990 */, 18 }, - /* 6589 */ { MAD_F(0x078a1919) /* 0.471215341 */, 18 }, - /* 6590 */ { MAD_F(0x078a7d16) /* 0.471310698 */, 18 }, - /* 6591 */ { MAD_F(0x078ae114) /* 0.471406059 */, 18 }, - - /* 6592 */ { MAD_F(0x078b4514) /* 0.471501425 */, 18 }, - /* 6593 */ { MAD_F(0x078ba915) /* 0.471596796 */, 18 }, - /* 6594 */ { MAD_F(0x078c0d17) /* 0.471692171 */, 18 }, - /* 6595 */ { MAD_F(0x078c711a) /* 0.471787552 */, 18 }, - /* 6596 */ { MAD_F(0x078cd51f) /* 0.471882937 */, 18 }, - /* 6597 */ { MAD_F(0x078d3925) /* 0.471978327 */, 18 }, - /* 6598 */ { MAD_F(0x078d9d2d) /* 0.472073722 */, 18 }, - /* 6599 */ { MAD_F(0x078e0135) /* 0.472169122 */, 18 }, - /* 6600 */ { MAD_F(0x078e653f) /* 0.472264527 */, 18 }, - /* 6601 */ { MAD_F(0x078ec94b) /* 0.472359936 */, 18 }, - /* 6602 */ { MAD_F(0x078f2d57) /* 0.472455350 */, 18 }, - /* 6603 */ { MAD_F(0x078f9165) /* 0.472550769 */, 18 }, - /* 6604 */ { MAD_F(0x078ff574) /* 0.472646193 */, 18 }, - /* 6605 */ { MAD_F(0x07905985) /* 0.472741622 */, 18 }, - /* 6606 */ { MAD_F(0x0790bd96) /* 0.472837055 */, 18 }, - /* 6607 */ { MAD_F(0x079121a9) /* 0.472932493 */, 18 }, - - /* 6608 */ { MAD_F(0x079185be) /* 0.473027937 */, 18 }, - /* 6609 */ { MAD_F(0x0791e9d3) /* 0.473123384 */, 18 }, - /* 6610 */ { MAD_F(0x07924dea) /* 0.473218837 */, 18 }, - /* 6611 */ { MAD_F(0x0792b202) /* 0.473314295 */, 18 }, - /* 6612 */ { MAD_F(0x0793161c) /* 0.473409757 */, 18 }, - /* 6613 */ { MAD_F(0x07937a37) /* 0.473505224 */, 18 }, - /* 6614 */ { MAD_F(0x0793de53) /* 0.473600696 */, 18 }, - /* 6615 */ { MAD_F(0x07944270) /* 0.473696173 */, 18 }, - /* 6616 */ { MAD_F(0x0794a68f) /* 0.473791655 */, 18 }, - /* 6617 */ { MAD_F(0x07950aaf) /* 0.473887141 */, 18 }, - /* 6618 */ { MAD_F(0x07956ed0) /* 0.473982632 */, 18 }, - /* 6619 */ { MAD_F(0x0795d2f2) /* 0.474078128 */, 18 }, - /* 6620 */ { MAD_F(0x07963716) /* 0.474173629 */, 18 }, - /* 6621 */ { MAD_F(0x07969b3b) /* 0.474269135 */, 18 }, - /* 6622 */ { MAD_F(0x0796ff62) /* 0.474364645 */, 18 }, - /* 6623 */ { MAD_F(0x07976389) /* 0.474460161 */, 18 }, - - /* 6624 */ { MAD_F(0x0797c7b2) /* 0.474555681 */, 18 }, - /* 6625 */ { MAD_F(0x07982bdd) /* 0.474651205 */, 18 }, - /* 6626 */ { MAD_F(0x07989008) /* 0.474746735 */, 18 }, - /* 6627 */ { MAD_F(0x0798f435) /* 0.474842270 */, 18 }, - /* 6628 */ { MAD_F(0x07995863) /* 0.474937809 */, 18 }, - /* 6629 */ { MAD_F(0x0799bc92) /* 0.475033353 */, 18 }, - /* 6630 */ { MAD_F(0x079a20c3) /* 0.475128902 */, 18 }, - /* 6631 */ { MAD_F(0x079a84f5) /* 0.475224456 */, 18 }, - /* 6632 */ { MAD_F(0x079ae929) /* 0.475320014 */, 18 }, - /* 6633 */ { MAD_F(0x079b4d5d) /* 0.475415578 */, 18 }, - /* 6634 */ { MAD_F(0x079bb193) /* 0.475511146 */, 18 }, - /* 6635 */ { MAD_F(0x079c15ca) /* 0.475606719 */, 18 }, - /* 6636 */ { MAD_F(0x079c7a03) /* 0.475702296 */, 18 }, - /* 6637 */ { MAD_F(0x079cde3c) /* 0.475797879 */, 18 }, - /* 6638 */ { MAD_F(0x079d4277) /* 0.475893466 */, 18 }, - /* 6639 */ { MAD_F(0x079da6b4) /* 0.475989058 */, 18 }, - - /* 6640 */ { MAD_F(0x079e0af1) /* 0.476084655 */, 18 }, - /* 6641 */ { MAD_F(0x079e6f30) /* 0.476180257 */, 18 }, - /* 6642 */ { MAD_F(0x079ed370) /* 0.476275863 */, 18 }, - /* 6643 */ { MAD_F(0x079f37b2) /* 0.476371475 */, 18 }, - /* 6644 */ { MAD_F(0x079f9bf5) /* 0.476467091 */, 18 }, - /* 6645 */ { MAD_F(0x07a00039) /* 0.476562712 */, 18 }, - /* 6646 */ { MAD_F(0x07a0647e) /* 0.476658338 */, 18 }, - /* 6647 */ { MAD_F(0x07a0c8c5) /* 0.476753968 */, 18 }, - /* 6648 */ { MAD_F(0x07a12d0c) /* 0.476849603 */, 18 }, - /* 6649 */ { MAD_F(0x07a19156) /* 0.476945243 */, 18 }, - /* 6650 */ { MAD_F(0x07a1f5a0) /* 0.477040888 */, 18 }, - /* 6651 */ { MAD_F(0x07a259ec) /* 0.477136538 */, 18 }, - /* 6652 */ { MAD_F(0x07a2be39) /* 0.477232193 */, 18 }, - /* 6653 */ { MAD_F(0x07a32287) /* 0.477327852 */, 18 }, - /* 6654 */ { MAD_F(0x07a386d7) /* 0.477423516 */, 18 }, - /* 6655 */ { MAD_F(0x07a3eb28) /* 0.477519185 */, 18 }, - - /* 6656 */ { MAD_F(0x07a44f7a) /* 0.477614858 */, 18 }, - /* 6657 */ { MAD_F(0x07a4b3ce) /* 0.477710537 */, 18 }, - /* 6658 */ { MAD_F(0x07a51822) /* 0.477806220 */, 18 }, - /* 6659 */ { MAD_F(0x07a57c78) /* 0.477901908 */, 18 }, - /* 6660 */ { MAD_F(0x07a5e0d0) /* 0.477997601 */, 18 }, - /* 6661 */ { MAD_F(0x07a64528) /* 0.478093299 */, 18 }, - /* 6662 */ { MAD_F(0x07a6a982) /* 0.478189001 */, 18 }, - /* 6663 */ { MAD_F(0x07a70ddd) /* 0.478284708 */, 18 }, - /* 6664 */ { MAD_F(0x07a7723a) /* 0.478380420 */, 18 }, - /* 6665 */ { MAD_F(0x07a7d698) /* 0.478476137 */, 18 }, - /* 6666 */ { MAD_F(0x07a83af7) /* 0.478571858 */, 18 }, - /* 6667 */ { MAD_F(0x07a89f57) /* 0.478667585 */, 18 }, - /* 6668 */ { MAD_F(0x07a903b9) /* 0.478763316 */, 18 }, - /* 6669 */ { MAD_F(0x07a9681c) /* 0.478859052 */, 18 }, - /* 6670 */ { MAD_F(0x07a9cc80) /* 0.478954793 */, 18 }, - /* 6671 */ { MAD_F(0x07aa30e5) /* 0.479050538 */, 18 }, - - /* 6672 */ { MAD_F(0x07aa954c) /* 0.479146288 */, 18 }, - /* 6673 */ { MAD_F(0x07aaf9b4) /* 0.479242043 */, 18 }, - /* 6674 */ { MAD_F(0x07ab5e1e) /* 0.479337803 */, 18 }, - /* 6675 */ { MAD_F(0x07abc288) /* 0.479433568 */, 18 }, - /* 6676 */ { MAD_F(0x07ac26f4) /* 0.479529337 */, 18 }, - /* 6677 */ { MAD_F(0x07ac8b61) /* 0.479625111 */, 18 }, - /* 6678 */ { MAD_F(0x07acefd0) /* 0.479720890 */, 18 }, - /* 6679 */ { MAD_F(0x07ad543f) /* 0.479816674 */, 18 }, - /* 6680 */ { MAD_F(0x07adb8b0) /* 0.479912463 */, 18 }, - /* 6681 */ { MAD_F(0x07ae1d23) /* 0.480008256 */, 18 }, - /* 6682 */ { MAD_F(0x07ae8196) /* 0.480104054 */, 18 }, - /* 6683 */ { MAD_F(0x07aee60b) /* 0.480199857 */, 18 }, - /* 6684 */ { MAD_F(0x07af4a81) /* 0.480295664 */, 18 }, - /* 6685 */ { MAD_F(0x07afaef9) /* 0.480391477 */, 18 }, - /* 6686 */ { MAD_F(0x07b01372) /* 0.480487294 */, 18 }, - /* 6687 */ { MAD_F(0x07b077ec) /* 0.480583116 */, 18 }, - - /* 6688 */ { MAD_F(0x07b0dc67) /* 0.480678943 */, 18 }, - /* 6689 */ { MAD_F(0x07b140e4) /* 0.480774774 */, 18 }, - /* 6690 */ { MAD_F(0x07b1a561) /* 0.480870611 */, 18 }, - /* 6691 */ { MAD_F(0x07b209e1) /* 0.480966452 */, 18 }, - /* 6692 */ { MAD_F(0x07b26e61) /* 0.481062298 */, 18 }, - /* 6693 */ { MAD_F(0x07b2d2e3) /* 0.481158148 */, 18 }, - /* 6694 */ { MAD_F(0x07b33766) /* 0.481254004 */, 18 }, - /* 6695 */ { MAD_F(0x07b39bea) /* 0.481349864 */, 18 }, - /* 6696 */ { MAD_F(0x07b4006f) /* 0.481445729 */, 18 }, - /* 6697 */ { MAD_F(0x07b464f6) /* 0.481541598 */, 18 }, - /* 6698 */ { MAD_F(0x07b4c97e) /* 0.481637473 */, 18 }, - /* 6699 */ { MAD_F(0x07b52e08) /* 0.481733352 */, 18 }, - /* 6700 */ { MAD_F(0x07b59292) /* 0.481829236 */, 18 }, - /* 6701 */ { MAD_F(0x07b5f71e) /* 0.481925125 */, 18 }, - /* 6702 */ { MAD_F(0x07b65bac) /* 0.482021019 */, 18 }, - /* 6703 */ { MAD_F(0x07b6c03a) /* 0.482116917 */, 18 }, - - /* 6704 */ { MAD_F(0x07b724ca) /* 0.482212820 */, 18 }, - /* 6705 */ { MAD_F(0x07b7895b) /* 0.482308728 */, 18 }, - /* 6706 */ { MAD_F(0x07b7eded) /* 0.482404640 */, 18 }, - /* 6707 */ { MAD_F(0x07b85281) /* 0.482500558 */, 18 }, - /* 6708 */ { MAD_F(0x07b8b716) /* 0.482596480 */, 18 }, - /* 6709 */ { MAD_F(0x07b91bac) /* 0.482692407 */, 18 }, - /* 6710 */ { MAD_F(0x07b98044) /* 0.482788339 */, 18 }, - /* 6711 */ { MAD_F(0x07b9e4dc) /* 0.482884275 */, 18 }, - /* 6712 */ { MAD_F(0x07ba4976) /* 0.482980216 */, 18 }, - /* 6713 */ { MAD_F(0x07baae12) /* 0.483076162 */, 18 }, - /* 6714 */ { MAD_F(0x07bb12ae) /* 0.483172113 */, 18 }, - /* 6715 */ { MAD_F(0x07bb774c) /* 0.483268069 */, 18 }, - /* 6716 */ { MAD_F(0x07bbdbeb) /* 0.483364029 */, 18 }, - /* 6717 */ { MAD_F(0x07bc408c) /* 0.483459994 */, 18 }, - /* 6718 */ { MAD_F(0x07bca52d) /* 0.483555964 */, 18 }, - /* 6719 */ { MAD_F(0x07bd09d0) /* 0.483651939 */, 18 }, - - /* 6720 */ { MAD_F(0x07bd6e75) /* 0.483747918 */, 18 }, - /* 6721 */ { MAD_F(0x07bdd31a) /* 0.483843902 */, 18 }, - /* 6722 */ { MAD_F(0x07be37c1) /* 0.483939891 */, 18 }, - /* 6723 */ { MAD_F(0x07be9c69) /* 0.484035885 */, 18 }, - /* 6724 */ { MAD_F(0x07bf0113) /* 0.484131883 */, 18 }, - /* 6725 */ { MAD_F(0x07bf65bd) /* 0.484227886 */, 18 }, - /* 6726 */ { MAD_F(0x07bfca69) /* 0.484323894 */, 18 }, - /* 6727 */ { MAD_F(0x07c02f16) /* 0.484419907 */, 18 }, - /* 6728 */ { MAD_F(0x07c093c5) /* 0.484515924 */, 18 }, - /* 6729 */ { MAD_F(0x07c0f875) /* 0.484611946 */, 18 }, - /* 6730 */ { MAD_F(0x07c15d26) /* 0.484707973 */, 18 }, - /* 6731 */ { MAD_F(0x07c1c1d8) /* 0.484804005 */, 18 }, - /* 6732 */ { MAD_F(0x07c2268b) /* 0.484900041 */, 18 }, - /* 6733 */ { MAD_F(0x07c28b40) /* 0.484996083 */, 18 }, - /* 6734 */ { MAD_F(0x07c2eff6) /* 0.485092128 */, 18 }, - /* 6735 */ { MAD_F(0x07c354ae) /* 0.485188179 */, 18 }, - - /* 6736 */ { MAD_F(0x07c3b967) /* 0.485284235 */, 18 }, - /* 6737 */ { MAD_F(0x07c41e21) /* 0.485380295 */, 18 }, - /* 6738 */ { MAD_F(0x07c482dc) /* 0.485476360 */, 18 }, - /* 6739 */ { MAD_F(0x07c4e798) /* 0.485572430 */, 18 }, - /* 6740 */ { MAD_F(0x07c54c56) /* 0.485668504 */, 18 }, - /* 6741 */ { MAD_F(0x07c5b115) /* 0.485764583 */, 18 }, - /* 6742 */ { MAD_F(0x07c615d6) /* 0.485860667 */, 18 }, - /* 6743 */ { MAD_F(0x07c67a97) /* 0.485956756 */, 18 }, - /* 6744 */ { MAD_F(0x07c6df5a) /* 0.486052849 */, 18 }, - /* 6745 */ { MAD_F(0x07c7441e) /* 0.486148948 */, 18 }, - /* 6746 */ { MAD_F(0x07c7a8e4) /* 0.486245051 */, 18 }, - /* 6747 */ { MAD_F(0x07c80daa) /* 0.486341158 */, 18 }, - /* 6748 */ { MAD_F(0x07c87272) /* 0.486437271 */, 18 }, - /* 6749 */ { MAD_F(0x07c8d73c) /* 0.486533388 */, 18 }, - /* 6750 */ { MAD_F(0x07c93c06) /* 0.486629510 */, 18 }, - /* 6751 */ { MAD_F(0x07c9a0d2) /* 0.486725637 */, 18 }, - - /* 6752 */ { MAD_F(0x07ca059f) /* 0.486821768 */, 18 }, - /* 6753 */ { MAD_F(0x07ca6a6d) /* 0.486917905 */, 18 }, - /* 6754 */ { MAD_F(0x07cacf3d) /* 0.487014045 */, 18 }, - /* 6755 */ { MAD_F(0x07cb340e) /* 0.487110191 */, 18 }, - /* 6756 */ { MAD_F(0x07cb98e0) /* 0.487206342 */, 18 }, - /* 6757 */ { MAD_F(0x07cbfdb4) /* 0.487302497 */, 18 }, - /* 6758 */ { MAD_F(0x07cc6288) /* 0.487398657 */, 18 }, - /* 6759 */ { MAD_F(0x07ccc75e) /* 0.487494821 */, 18 }, - /* 6760 */ { MAD_F(0x07cd2c36) /* 0.487590991 */, 18 }, - /* 6761 */ { MAD_F(0x07cd910e) /* 0.487687165 */, 18 }, - /* 6762 */ { MAD_F(0x07cdf5e8) /* 0.487783344 */, 18 }, - /* 6763 */ { MAD_F(0x07ce5ac3) /* 0.487879528 */, 18 }, - /* 6764 */ { MAD_F(0x07cebfa0) /* 0.487975716 */, 18 }, - /* 6765 */ { MAD_F(0x07cf247d) /* 0.488071909 */, 18 }, - /* 6766 */ { MAD_F(0x07cf895c) /* 0.488168107 */, 18 }, - /* 6767 */ { MAD_F(0x07cfee3c) /* 0.488264310 */, 18 }, - - /* 6768 */ { MAD_F(0x07d0531e) /* 0.488360517 */, 18 }, - /* 6769 */ { MAD_F(0x07d0b801) /* 0.488456729 */, 18 }, - /* 6770 */ { MAD_F(0x07d11ce5) /* 0.488552946 */, 18 }, - /* 6771 */ { MAD_F(0x07d181ca) /* 0.488649167 */, 18 }, - /* 6772 */ { MAD_F(0x07d1e6b0) /* 0.488745394 */, 18 }, - /* 6773 */ { MAD_F(0x07d24b98) /* 0.488841625 */, 18 }, - /* 6774 */ { MAD_F(0x07d2b081) /* 0.488937860 */, 18 }, - /* 6775 */ { MAD_F(0x07d3156c) /* 0.489034101 */, 18 }, - /* 6776 */ { MAD_F(0x07d37a57) /* 0.489130346 */, 18 }, - /* 6777 */ { MAD_F(0x07d3df44) /* 0.489226596 */, 18 }, - /* 6778 */ { MAD_F(0x07d44432) /* 0.489322851 */, 18 }, - /* 6779 */ { MAD_F(0x07d4a922) /* 0.489419110 */, 18 }, - /* 6780 */ { MAD_F(0x07d50e13) /* 0.489515375 */, 18 }, - /* 6781 */ { MAD_F(0x07d57305) /* 0.489611643 */, 18 }, - /* 6782 */ { MAD_F(0x07d5d7f8) /* 0.489707917 */, 18 }, - /* 6783 */ { MAD_F(0x07d63cec) /* 0.489804195 */, 18 }, - - /* 6784 */ { MAD_F(0x07d6a1e2) /* 0.489900479 */, 18 }, - /* 6785 */ { MAD_F(0x07d706d9) /* 0.489996766 */, 18 }, - /* 6786 */ { MAD_F(0x07d76bd2) /* 0.490093059 */, 18 }, - /* 6787 */ { MAD_F(0x07d7d0cb) /* 0.490189356 */, 18 }, - /* 6788 */ { MAD_F(0x07d835c6) /* 0.490285658 */, 18 }, - /* 6789 */ { MAD_F(0x07d89ac2) /* 0.490381965 */, 18 }, - /* 6790 */ { MAD_F(0x07d8ffc0) /* 0.490478277 */, 18 }, - /* 6791 */ { MAD_F(0x07d964be) /* 0.490574593 */, 18 }, - /* 6792 */ { MAD_F(0x07d9c9be) /* 0.490670914 */, 18 }, - /* 6793 */ { MAD_F(0x07da2ebf) /* 0.490767239 */, 18 }, - /* 6794 */ { MAD_F(0x07da93c2) /* 0.490863570 */, 18 }, - /* 6795 */ { MAD_F(0x07daf8c6) /* 0.490959905 */, 18 }, - /* 6796 */ { MAD_F(0x07db5dcb) /* 0.491056245 */, 18 }, - /* 6797 */ { MAD_F(0x07dbc2d1) /* 0.491152589 */, 18 }, - /* 6798 */ { MAD_F(0x07dc27d9) /* 0.491248939 */, 18 }, - /* 6799 */ { MAD_F(0x07dc8ce1) /* 0.491345293 */, 18 }, - - /* 6800 */ { MAD_F(0x07dcf1ec) /* 0.491441651 */, 18 }, - /* 6801 */ { MAD_F(0x07dd56f7) /* 0.491538015 */, 18 }, - /* 6802 */ { MAD_F(0x07ddbc04) /* 0.491634383 */, 18 }, - /* 6803 */ { MAD_F(0x07de2111) /* 0.491730756 */, 18 }, - /* 6804 */ { MAD_F(0x07de8621) /* 0.491827134 */, 18 }, - /* 6805 */ { MAD_F(0x07deeb31) /* 0.491923516 */, 18 }, - /* 6806 */ { MAD_F(0x07df5043) /* 0.492019903 */, 18 }, - /* 6807 */ { MAD_F(0x07dfb556) /* 0.492116295 */, 18 }, - /* 6808 */ { MAD_F(0x07e01a6a) /* 0.492212691 */, 18 }, - /* 6809 */ { MAD_F(0x07e07f80) /* 0.492309093 */, 18 }, - /* 6810 */ { MAD_F(0x07e0e496) /* 0.492405499 */, 18 }, - /* 6811 */ { MAD_F(0x07e149ae) /* 0.492501909 */, 18 }, - /* 6812 */ { MAD_F(0x07e1aec8) /* 0.492598325 */, 18 }, - /* 6813 */ { MAD_F(0x07e213e2) /* 0.492694745 */, 18 }, - /* 6814 */ { MAD_F(0x07e278fe) /* 0.492791170 */, 18 }, - /* 6815 */ { MAD_F(0x07e2de1b) /* 0.492887599 */, 18 }, - - /* 6816 */ { MAD_F(0x07e3433a) /* 0.492984033 */, 18 }, - /* 6817 */ { MAD_F(0x07e3a859) /* 0.493080472 */, 18 }, - /* 6818 */ { MAD_F(0x07e40d7a) /* 0.493176916 */, 18 }, - /* 6819 */ { MAD_F(0x07e4729c) /* 0.493273365 */, 18 }, - /* 6820 */ { MAD_F(0x07e4d7c0) /* 0.493369818 */, 18 }, - /* 6821 */ { MAD_F(0x07e53ce4) /* 0.493466275 */, 18 }, - /* 6822 */ { MAD_F(0x07e5a20a) /* 0.493562738 */, 18 }, - /* 6823 */ { MAD_F(0x07e60732) /* 0.493659205 */, 18 }, - /* 6824 */ { MAD_F(0x07e66c5a) /* 0.493755677 */, 18 }, - /* 6825 */ { MAD_F(0x07e6d184) /* 0.493852154 */, 18 }, - /* 6826 */ { MAD_F(0x07e736af) /* 0.493948635 */, 18 }, - /* 6827 */ { MAD_F(0x07e79bdb) /* 0.494045122 */, 18 }, - /* 6828 */ { MAD_F(0x07e80109) /* 0.494141612 */, 18 }, - /* 6829 */ { MAD_F(0x07e86638) /* 0.494238108 */, 18 }, - /* 6830 */ { MAD_F(0x07e8cb68) /* 0.494334608 */, 18 }, - /* 6831 */ { MAD_F(0x07e93099) /* 0.494431113 */, 18 }, - - /* 6832 */ { MAD_F(0x07e995cc) /* 0.494527623 */, 18 }, - /* 6833 */ { MAD_F(0x07e9fb00) /* 0.494624137 */, 18 }, - /* 6834 */ { MAD_F(0x07ea6035) /* 0.494720656 */, 18 }, - /* 6835 */ { MAD_F(0x07eac56b) /* 0.494817180 */, 18 }, - /* 6836 */ { MAD_F(0x07eb2aa3) /* 0.494913709 */, 18 }, - /* 6837 */ { MAD_F(0x07eb8fdc) /* 0.495010242 */, 18 }, - /* 6838 */ { MAD_F(0x07ebf516) /* 0.495106780 */, 18 }, - /* 6839 */ { MAD_F(0x07ec5a51) /* 0.495203322 */, 18 }, - /* 6840 */ { MAD_F(0x07ecbf8e) /* 0.495299870 */, 18 }, - /* 6841 */ { MAD_F(0x07ed24cc) /* 0.495396422 */, 18 }, - /* 6842 */ { MAD_F(0x07ed8a0b) /* 0.495492978 */, 18 }, - /* 6843 */ { MAD_F(0x07edef4c) /* 0.495589540 */, 18 }, - /* 6844 */ { MAD_F(0x07ee548e) /* 0.495686106 */, 18 }, - /* 6845 */ { MAD_F(0x07eeb9d1) /* 0.495782677 */, 18 }, - /* 6846 */ { MAD_F(0x07ef1f15) /* 0.495879252 */, 18 }, - /* 6847 */ { MAD_F(0x07ef845b) /* 0.495975833 */, 18 }, - - /* 6848 */ { MAD_F(0x07efe9a1) /* 0.496072418 */, 18 }, - /* 6849 */ { MAD_F(0x07f04ee9) /* 0.496169007 */, 18 }, - /* 6850 */ { MAD_F(0x07f0b433) /* 0.496265602 */, 18 }, - /* 6851 */ { MAD_F(0x07f1197d) /* 0.496362201 */, 18 }, - /* 6852 */ { MAD_F(0x07f17ec9) /* 0.496458804 */, 18 }, - /* 6853 */ { MAD_F(0x07f1e416) /* 0.496555413 */, 18 }, - /* 6854 */ { MAD_F(0x07f24965) /* 0.496652026 */, 18 }, - /* 6855 */ { MAD_F(0x07f2aeb5) /* 0.496748644 */, 18 }, - /* 6856 */ { MAD_F(0x07f31405) /* 0.496845266 */, 18 }, - /* 6857 */ { MAD_F(0x07f37958) /* 0.496941894 */, 18 }, - /* 6858 */ { MAD_F(0x07f3deab) /* 0.497038526 */, 18 }, - /* 6859 */ { MAD_F(0x07f44400) /* 0.497135162 */, 18 }, - /* 6860 */ { MAD_F(0x07f4a956) /* 0.497231804 */, 18 }, - /* 6861 */ { MAD_F(0x07f50ead) /* 0.497328450 */, 18 }, - /* 6862 */ { MAD_F(0x07f57405) /* 0.497425100 */, 18 }, - /* 6863 */ { MAD_F(0x07f5d95f) /* 0.497521756 */, 18 }, - - /* 6864 */ { MAD_F(0x07f63eba) /* 0.497618416 */, 18 }, - /* 6865 */ { MAD_F(0x07f6a416) /* 0.497715081 */, 18 }, - /* 6866 */ { MAD_F(0x07f70974) /* 0.497811750 */, 18 }, - /* 6867 */ { MAD_F(0x07f76ed3) /* 0.497908425 */, 18 }, - /* 6868 */ { MAD_F(0x07f7d433) /* 0.498005103 */, 18 }, - /* 6869 */ { MAD_F(0x07f83994) /* 0.498101787 */, 18 }, - /* 6870 */ { MAD_F(0x07f89ef7) /* 0.498198475 */, 18 }, - /* 6871 */ { MAD_F(0x07f9045a) /* 0.498295168 */, 18 }, - /* 6872 */ { MAD_F(0x07f969c0) /* 0.498391866 */, 18 }, - /* 6873 */ { MAD_F(0x07f9cf26) /* 0.498488568 */, 18 }, - /* 6874 */ { MAD_F(0x07fa348e) /* 0.498585275 */, 18 }, - /* 6875 */ { MAD_F(0x07fa99f6) /* 0.498681987 */, 18 }, - /* 6876 */ { MAD_F(0x07faff60) /* 0.498778704 */, 18 }, - /* 6877 */ { MAD_F(0x07fb64cc) /* 0.498875425 */, 18 }, - /* 6878 */ { MAD_F(0x07fbca38) /* 0.498972150 */, 18 }, - /* 6879 */ { MAD_F(0x07fc2fa6) /* 0.499068881 */, 18 }, - - /* 6880 */ { MAD_F(0x07fc9516) /* 0.499165616 */, 18 }, - /* 6881 */ { MAD_F(0x07fcfa86) /* 0.499262356 */, 18 }, - /* 6882 */ { MAD_F(0x07fd5ff8) /* 0.499359101 */, 18 }, - /* 6883 */ { MAD_F(0x07fdc56b) /* 0.499455850 */, 18 }, - /* 6884 */ { MAD_F(0x07fe2adf) /* 0.499552604 */, 18 }, - /* 6885 */ { MAD_F(0x07fe9054) /* 0.499649362 */, 18 }, - /* 6886 */ { MAD_F(0x07fef5cb) /* 0.499746126 */, 18 }, - /* 6887 */ { MAD_F(0x07ff5b43) /* 0.499842894 */, 18 }, - /* 6888 */ { MAD_F(0x07ffc0bc) /* 0.499939666 */, 18 }, - /* 6889 */ { MAD_F(0x0400131b) /* 0.250018222 */, 19 }, - /* 6890 */ { MAD_F(0x040045d9) /* 0.250066613 */, 19 }, - /* 6891 */ { MAD_F(0x04007897) /* 0.250115006 */, 19 }, - /* 6892 */ { MAD_F(0x0400ab57) /* 0.250163402 */, 19 }, - /* 6893 */ { MAD_F(0x0400de16) /* 0.250211800 */, 19 }, - /* 6894 */ { MAD_F(0x040110d7) /* 0.250260200 */, 19 }, - /* 6895 */ { MAD_F(0x04014398) /* 0.250308603 */, 19 }, - - /* 6896 */ { MAD_F(0x04017659) /* 0.250357008 */, 19 }, - /* 6897 */ { MAD_F(0x0401a91c) /* 0.250405415 */, 19 }, - /* 6898 */ { MAD_F(0x0401dbdf) /* 0.250453825 */, 19 }, - /* 6899 */ { MAD_F(0x04020ea2) /* 0.250502237 */, 19 }, - /* 6900 */ { MAD_F(0x04024166) /* 0.250550652 */, 19 }, - /* 6901 */ { MAD_F(0x0402742b) /* 0.250599068 */, 19 }, - /* 6902 */ { MAD_F(0x0402a6f0) /* 0.250647488 */, 19 }, - /* 6903 */ { MAD_F(0x0402d9b6) /* 0.250695909 */, 19 }, - /* 6904 */ { MAD_F(0x04030c7d) /* 0.250744333 */, 19 }, - /* 6905 */ { MAD_F(0x04033f44) /* 0.250792759 */, 19 }, - /* 6906 */ { MAD_F(0x0403720c) /* 0.250841187 */, 19 }, - /* 6907 */ { MAD_F(0x0403a4d5) /* 0.250889618 */, 19 }, - /* 6908 */ { MAD_F(0x0403d79e) /* 0.250938051 */, 19 }, - /* 6909 */ { MAD_F(0x04040a68) /* 0.250986487 */, 19 }, - /* 6910 */ { MAD_F(0x04043d32) /* 0.251034924 */, 19 }, - /* 6911 */ { MAD_F(0x04046ffd) /* 0.251083365 */, 19 }, - - /* 6912 */ { MAD_F(0x0404a2c9) /* 0.251131807 */, 19 }, - /* 6913 */ { MAD_F(0x0404d595) /* 0.251180252 */, 19 }, - /* 6914 */ { MAD_F(0x04050862) /* 0.251228699 */, 19 }, - /* 6915 */ { MAD_F(0x04053b30) /* 0.251277148 */, 19 }, - /* 6916 */ { MAD_F(0x04056dfe) /* 0.251325600 */, 19 }, - /* 6917 */ { MAD_F(0x0405a0cd) /* 0.251374054 */, 19 }, - /* 6918 */ { MAD_F(0x0405d39c) /* 0.251422511 */, 19 }, - /* 6919 */ { MAD_F(0x0406066c) /* 0.251470970 */, 19 }, - /* 6920 */ { MAD_F(0x0406393d) /* 0.251519431 */, 19 }, - /* 6921 */ { MAD_F(0x04066c0e) /* 0.251567894 */, 19 }, - /* 6922 */ { MAD_F(0x04069ee0) /* 0.251616360 */, 19 }, - /* 6923 */ { MAD_F(0x0406d1b3) /* 0.251664828 */, 19 }, - /* 6924 */ { MAD_F(0x04070486) /* 0.251713299 */, 19 }, - /* 6925 */ { MAD_F(0x0407375a) /* 0.251761772 */, 19 }, - /* 6926 */ { MAD_F(0x04076a2e) /* 0.251810247 */, 19 }, - /* 6927 */ { MAD_F(0x04079d03) /* 0.251858724 */, 19 }, - - /* 6928 */ { MAD_F(0x0407cfd9) /* 0.251907204 */, 19 }, - /* 6929 */ { MAD_F(0x040802af) /* 0.251955686 */, 19 }, - /* 6930 */ { MAD_F(0x04083586) /* 0.252004171 */, 19 }, - /* 6931 */ { MAD_F(0x0408685e) /* 0.252052658 */, 19 }, - /* 6932 */ { MAD_F(0x04089b36) /* 0.252101147 */, 19 }, - /* 6933 */ { MAD_F(0x0408ce0f) /* 0.252149638 */, 19 }, - /* 6934 */ { MAD_F(0x040900e8) /* 0.252198132 */, 19 }, - /* 6935 */ { MAD_F(0x040933c2) /* 0.252246628 */, 19 }, - /* 6936 */ { MAD_F(0x0409669d) /* 0.252295127 */, 19 }, - /* 6937 */ { MAD_F(0x04099978) /* 0.252343627 */, 19 }, - /* 6938 */ { MAD_F(0x0409cc54) /* 0.252392131 */, 19 }, - /* 6939 */ { MAD_F(0x0409ff31) /* 0.252440636 */, 19 }, - /* 6940 */ { MAD_F(0x040a320e) /* 0.252489144 */, 19 }, - /* 6941 */ { MAD_F(0x040a64ec) /* 0.252537654 */, 19 }, - /* 6942 */ { MAD_F(0x040a97cb) /* 0.252586166 */, 19 }, - /* 6943 */ { MAD_F(0x040acaaa) /* 0.252634681 */, 19 }, - - /* 6944 */ { MAD_F(0x040afd89) /* 0.252683198 */, 19 }, - /* 6945 */ { MAD_F(0x040b306a) /* 0.252731718 */, 19 }, - /* 6946 */ { MAD_F(0x040b634b) /* 0.252780240 */, 19 }, - /* 6947 */ { MAD_F(0x040b962c) /* 0.252828764 */, 19 }, - /* 6948 */ { MAD_F(0x040bc90e) /* 0.252877290 */, 19 }, - /* 6949 */ { MAD_F(0x040bfbf1) /* 0.252925819 */, 19 }, - /* 6950 */ { MAD_F(0x040c2ed5) /* 0.252974350 */, 19 }, - /* 6951 */ { MAD_F(0x040c61b9) /* 0.253022883 */, 19 }, - /* 6952 */ { MAD_F(0x040c949e) /* 0.253071419 */, 19 }, - /* 6953 */ { MAD_F(0x040cc783) /* 0.253119957 */, 19 }, - /* 6954 */ { MAD_F(0x040cfa69) /* 0.253168498 */, 19 }, - /* 6955 */ { MAD_F(0x040d2d4f) /* 0.253217040 */, 19 }, - /* 6956 */ { MAD_F(0x040d6037) /* 0.253265585 */, 19 }, - /* 6957 */ { MAD_F(0x040d931e) /* 0.253314133 */, 19 }, - /* 6958 */ { MAD_F(0x040dc607) /* 0.253362682 */, 19 }, - /* 6959 */ { MAD_F(0x040df8f0) /* 0.253411234 */, 19 }, - - /* 6960 */ { MAD_F(0x040e2bda) /* 0.253459789 */, 19 }, - /* 6961 */ { MAD_F(0x040e5ec4) /* 0.253508345 */, 19 }, - /* 6962 */ { MAD_F(0x040e91af) /* 0.253556904 */, 19 }, - /* 6963 */ { MAD_F(0x040ec49b) /* 0.253605466 */, 19 }, - /* 6964 */ { MAD_F(0x040ef787) /* 0.253654029 */, 19 }, - /* 6965 */ { MAD_F(0x040f2a74) /* 0.253702595 */, 19 }, - /* 6966 */ { MAD_F(0x040f5d61) /* 0.253751164 */, 19 }, - /* 6967 */ { MAD_F(0x040f904f) /* 0.253799734 */, 19 }, - /* 6968 */ { MAD_F(0x040fc33e) /* 0.253848307 */, 19 }, - /* 6969 */ { MAD_F(0x040ff62d) /* 0.253896883 */, 19 }, - /* 6970 */ { MAD_F(0x0410291d) /* 0.253945460 */, 19 }, - /* 6971 */ { MAD_F(0x04105c0e) /* 0.253994040 */, 19 }, - /* 6972 */ { MAD_F(0x04108eff) /* 0.254042622 */, 19 }, - /* 6973 */ { MAD_F(0x0410c1f1) /* 0.254091207 */, 19 }, - /* 6974 */ { MAD_F(0x0410f4e3) /* 0.254139794 */, 19 }, - /* 6975 */ { MAD_F(0x041127d6) /* 0.254188383 */, 19 }, - - /* 6976 */ { MAD_F(0x04115aca) /* 0.254236974 */, 19 }, - /* 6977 */ { MAD_F(0x04118dbe) /* 0.254285568 */, 19 }, - /* 6978 */ { MAD_F(0x0411c0b3) /* 0.254334165 */, 19 }, - /* 6979 */ { MAD_F(0x0411f3a9) /* 0.254382763 */, 19 }, - /* 6980 */ { MAD_F(0x0412269f) /* 0.254431364 */, 19 }, - /* 6981 */ { MAD_F(0x04125996) /* 0.254479967 */, 19 }, - /* 6982 */ { MAD_F(0x04128c8d) /* 0.254528572 */, 19 }, - /* 6983 */ { MAD_F(0x0412bf85) /* 0.254577180 */, 19 }, - /* 6984 */ { MAD_F(0x0412f27e) /* 0.254625790 */, 19 }, - /* 6985 */ { MAD_F(0x04132577) /* 0.254674403 */, 19 }, - /* 6986 */ { MAD_F(0x04135871) /* 0.254723017 */, 19 }, - /* 6987 */ { MAD_F(0x04138b6c) /* 0.254771635 */, 19 }, - /* 6988 */ { MAD_F(0x0413be67) /* 0.254820254 */, 19 }, - /* 6989 */ { MAD_F(0x0413f163) /* 0.254868876 */, 19 }, - /* 6990 */ { MAD_F(0x0414245f) /* 0.254917500 */, 19 }, - /* 6991 */ { MAD_F(0x0414575c) /* 0.254966126 */, 19 }, - - /* 6992 */ { MAD_F(0x04148a5a) /* 0.255014755 */, 19 }, - /* 6993 */ { MAD_F(0x0414bd58) /* 0.255063386 */, 19 }, - /* 6994 */ { MAD_F(0x0414f057) /* 0.255112019 */, 19 }, - /* 6995 */ { MAD_F(0x04152356) /* 0.255160655 */, 19 }, - /* 6996 */ { MAD_F(0x04155657) /* 0.255209292 */, 19 }, - /* 6997 */ { MAD_F(0x04158957) /* 0.255257933 */, 19 }, - /* 6998 */ { MAD_F(0x0415bc59) /* 0.255306575 */, 19 }, - /* 6999 */ { MAD_F(0x0415ef5b) /* 0.255355220 */, 19 }, - /* 7000 */ { MAD_F(0x0416225d) /* 0.255403867 */, 19 }, - /* 7001 */ { MAD_F(0x04165561) /* 0.255452517 */, 19 }, - /* 7002 */ { MAD_F(0x04168864) /* 0.255501169 */, 19 }, - /* 7003 */ { MAD_F(0x0416bb69) /* 0.255549823 */, 19 }, - /* 7004 */ { MAD_F(0x0416ee6e) /* 0.255598479 */, 19 }, - /* 7005 */ { MAD_F(0x04172174) /* 0.255647138 */, 19 }, - /* 7006 */ { MAD_F(0x0417547a) /* 0.255695799 */, 19 }, - /* 7007 */ { MAD_F(0x04178781) /* 0.255744463 */, 19 }, - - /* 7008 */ { MAD_F(0x0417ba89) /* 0.255793128 */, 19 }, - /* 7009 */ { MAD_F(0x0417ed91) /* 0.255841796 */, 19 }, - /* 7010 */ { MAD_F(0x0418209a) /* 0.255890467 */, 19 }, - /* 7011 */ { MAD_F(0x041853a3) /* 0.255939139 */, 19 }, - /* 7012 */ { MAD_F(0x041886ad) /* 0.255987814 */, 19 }, - /* 7013 */ { MAD_F(0x0418b9b8) /* 0.256036492 */, 19 }, - /* 7014 */ { MAD_F(0x0418ecc3) /* 0.256085171 */, 19 }, - /* 7015 */ { MAD_F(0x04191fcf) /* 0.256133853 */, 19 }, - /* 7016 */ { MAD_F(0x041952dc) /* 0.256182537 */, 19 }, - /* 7017 */ { MAD_F(0x041985e9) /* 0.256231224 */, 19 }, - /* 7018 */ { MAD_F(0x0419b8f7) /* 0.256279913 */, 19 }, - /* 7019 */ { MAD_F(0x0419ec05) /* 0.256328604 */, 19 }, - /* 7020 */ { MAD_F(0x041a1f15) /* 0.256377297 */, 19 }, - /* 7021 */ { MAD_F(0x041a5224) /* 0.256425993 */, 19 }, - /* 7022 */ { MAD_F(0x041a8534) /* 0.256474691 */, 19 }, - /* 7023 */ { MAD_F(0x041ab845) /* 0.256523392 */, 19 }, - - /* 7024 */ { MAD_F(0x041aeb57) /* 0.256572095 */, 19 }, - /* 7025 */ { MAD_F(0x041b1e69) /* 0.256620800 */, 19 }, - /* 7026 */ { MAD_F(0x041b517c) /* 0.256669507 */, 19 }, - /* 7027 */ { MAD_F(0x041b848f) /* 0.256718217 */, 19 }, - /* 7028 */ { MAD_F(0x041bb7a3) /* 0.256766929 */, 19 }, - /* 7029 */ { MAD_F(0x041beab8) /* 0.256815643 */, 19 }, - /* 7030 */ { MAD_F(0x041c1dcd) /* 0.256864359 */, 19 }, - /* 7031 */ { MAD_F(0x041c50e3) /* 0.256913078 */, 19 }, - /* 7032 */ { MAD_F(0x041c83fa) /* 0.256961800 */, 19 }, - /* 7033 */ { MAD_F(0x041cb711) /* 0.257010523 */, 19 }, - /* 7034 */ { MAD_F(0x041cea28) /* 0.257059249 */, 19 }, - /* 7035 */ { MAD_F(0x041d1d41) /* 0.257107977 */, 19 }, - /* 7036 */ { MAD_F(0x041d505a) /* 0.257156708 */, 19 }, - /* 7037 */ { MAD_F(0x041d8373) /* 0.257205440 */, 19 }, - /* 7038 */ { MAD_F(0x041db68e) /* 0.257254175 */, 19 }, - /* 7039 */ { MAD_F(0x041de9a8) /* 0.257302913 */, 19 }, - - /* 7040 */ { MAD_F(0x041e1cc4) /* 0.257351652 */, 19 }, - /* 7041 */ { MAD_F(0x041e4fe0) /* 0.257400394 */, 19 }, - /* 7042 */ { MAD_F(0x041e82fd) /* 0.257449139 */, 19 }, - /* 7043 */ { MAD_F(0x041eb61a) /* 0.257497885 */, 19 }, - /* 7044 */ { MAD_F(0x041ee938) /* 0.257546634 */, 19 }, - /* 7045 */ { MAD_F(0x041f1c57) /* 0.257595386 */, 19 }, - /* 7046 */ { MAD_F(0x041f4f76) /* 0.257644139 */, 19 }, - /* 7047 */ { MAD_F(0x041f8296) /* 0.257692895 */, 19 }, - /* 7048 */ { MAD_F(0x041fb5b6) /* 0.257741653 */, 19 }, - /* 7049 */ { MAD_F(0x041fe8d7) /* 0.257790414 */, 19 }, - /* 7050 */ { MAD_F(0x04201bf9) /* 0.257839176 */, 19 }, - /* 7051 */ { MAD_F(0x04204f1b) /* 0.257887941 */, 19 }, - /* 7052 */ { MAD_F(0x0420823e) /* 0.257936709 */, 19 }, - /* 7053 */ { MAD_F(0x0420b561) /* 0.257985478 */, 19 }, - /* 7054 */ { MAD_F(0x0420e885) /* 0.258034250 */, 19 }, - /* 7055 */ { MAD_F(0x04211baa) /* 0.258083025 */, 19 }, - - /* 7056 */ { MAD_F(0x04214ed0) /* 0.258131801 */, 19 }, - /* 7057 */ { MAD_F(0x042181f6) /* 0.258180580 */, 19 }, - /* 7058 */ { MAD_F(0x0421b51c) /* 0.258229361 */, 19 }, - /* 7059 */ { MAD_F(0x0421e843) /* 0.258278145 */, 19 }, - /* 7060 */ { MAD_F(0x04221b6b) /* 0.258326931 */, 19 }, - /* 7061 */ { MAD_F(0x04224e94) /* 0.258375719 */, 19 }, - /* 7062 */ { MAD_F(0x042281bd) /* 0.258424509 */, 19 }, - /* 7063 */ { MAD_F(0x0422b4e6) /* 0.258473302 */, 19 }, - /* 7064 */ { MAD_F(0x0422e811) /* 0.258522097 */, 19 }, - /* 7065 */ { MAD_F(0x04231b3c) /* 0.258570894 */, 19 }, - /* 7066 */ { MAD_F(0x04234e67) /* 0.258619694 */, 19 }, - /* 7067 */ { MAD_F(0x04238193) /* 0.258668496 */, 19 }, - /* 7068 */ { MAD_F(0x0423b4c0) /* 0.258717300 */, 19 }, - /* 7069 */ { MAD_F(0x0423e7ee) /* 0.258766106 */, 19 }, - /* 7070 */ { MAD_F(0x04241b1c) /* 0.258814915 */, 19 }, - /* 7071 */ { MAD_F(0x04244e4a) /* 0.258863726 */, 19 }, - - /* 7072 */ { MAD_F(0x04248179) /* 0.258912540 */, 19 }, - /* 7073 */ { MAD_F(0x0424b4a9) /* 0.258961356 */, 19 }, - /* 7074 */ { MAD_F(0x0424e7da) /* 0.259010174 */, 19 }, - /* 7075 */ { MAD_F(0x04251b0b) /* 0.259058994 */, 19 }, - /* 7076 */ { MAD_F(0x04254e3d) /* 0.259107817 */, 19 }, - /* 7077 */ { MAD_F(0x0425816f) /* 0.259156642 */, 19 }, - /* 7078 */ { MAD_F(0x0425b4a2) /* 0.259205469 */, 19 }, - /* 7079 */ { MAD_F(0x0425e7d6) /* 0.259254298 */, 19 }, - /* 7080 */ { MAD_F(0x04261b0a) /* 0.259303130 */, 19 }, - /* 7081 */ { MAD_F(0x04264e3f) /* 0.259351964 */, 19 }, - /* 7082 */ { MAD_F(0x04268174) /* 0.259400801 */, 19 }, - /* 7083 */ { MAD_F(0x0426b4aa) /* 0.259449639 */, 19 }, - /* 7084 */ { MAD_F(0x0426e7e1) /* 0.259498480 */, 19 }, - /* 7085 */ { MAD_F(0x04271b18) /* 0.259547324 */, 19 }, - /* 7086 */ { MAD_F(0x04274e50) /* 0.259596169 */, 19 }, - /* 7087 */ { MAD_F(0x04278188) /* 0.259645017 */, 19 }, - - /* 7088 */ { MAD_F(0x0427b4c2) /* 0.259693868 */, 19 }, - /* 7089 */ { MAD_F(0x0427e7fb) /* 0.259742720 */, 19 }, - /* 7090 */ { MAD_F(0x04281b36) /* 0.259791575 */, 19 }, - /* 7091 */ { MAD_F(0x04284e71) /* 0.259840432 */, 19 }, - /* 7092 */ { MAD_F(0x042881ac) /* 0.259889291 */, 19 }, - /* 7093 */ { MAD_F(0x0428b4e8) /* 0.259938153 */, 19 }, - /* 7094 */ { MAD_F(0x0428e825) /* 0.259987017 */, 19 }, - /* 7095 */ { MAD_F(0x04291b63) /* 0.260035883 */, 19 }, - /* 7096 */ { MAD_F(0x04294ea1) /* 0.260084752 */, 19 }, - /* 7097 */ { MAD_F(0x042981df) /* 0.260133623 */, 19 }, - /* 7098 */ { MAD_F(0x0429b51f) /* 0.260182496 */, 19 }, - /* 7099 */ { MAD_F(0x0429e85f) /* 0.260231372 */, 19 }, - /* 7100 */ { MAD_F(0x042a1b9f) /* 0.260280249 */, 19 }, - /* 7101 */ { MAD_F(0x042a4ee0) /* 0.260329129 */, 19 }, - /* 7102 */ { MAD_F(0x042a8222) /* 0.260378012 */, 19 }, - /* 7103 */ { MAD_F(0x042ab564) /* 0.260426896 */, 19 }, - - /* 7104 */ { MAD_F(0x042ae8a7) /* 0.260475783 */, 19 }, - /* 7105 */ { MAD_F(0x042b1beb) /* 0.260524673 */, 19 }, - /* 7106 */ { MAD_F(0x042b4f2f) /* 0.260573564 */, 19 }, - /* 7107 */ { MAD_F(0x042b8274) /* 0.260622458 */, 19 }, - /* 7108 */ { MAD_F(0x042bb5ba) /* 0.260671354 */, 19 }, - /* 7109 */ { MAD_F(0x042be900) /* 0.260720252 */, 19 }, - /* 7110 */ { MAD_F(0x042c1c46) /* 0.260769153 */, 19 }, - /* 7111 */ { MAD_F(0x042c4f8e) /* 0.260818056 */, 19 }, - /* 7112 */ { MAD_F(0x042c82d6) /* 0.260866961 */, 19 }, - /* 7113 */ { MAD_F(0x042cb61e) /* 0.260915869 */, 19 }, - /* 7114 */ { MAD_F(0x042ce967) /* 0.260964779 */, 19 }, - /* 7115 */ { MAD_F(0x042d1cb1) /* 0.261013691 */, 19 }, - /* 7116 */ { MAD_F(0x042d4ffb) /* 0.261062606 */, 19 }, - /* 7117 */ { MAD_F(0x042d8346) /* 0.261111522 */, 19 }, - /* 7118 */ { MAD_F(0x042db692) /* 0.261160441 */, 19 }, - /* 7119 */ { MAD_F(0x042de9de) /* 0.261209363 */, 19 }, - - /* 7120 */ { MAD_F(0x042e1d2b) /* 0.261258286 */, 19 }, - /* 7121 */ { MAD_F(0x042e5078) /* 0.261307212 */, 19 }, - /* 7122 */ { MAD_F(0x042e83c6) /* 0.261356140 */, 19 }, - /* 7123 */ { MAD_F(0x042eb715) /* 0.261405071 */, 19 }, - /* 7124 */ { MAD_F(0x042eea64) /* 0.261454004 */, 19 }, - /* 7125 */ { MAD_F(0x042f1db4) /* 0.261502939 */, 19 }, - /* 7126 */ { MAD_F(0x042f5105) /* 0.261551876 */, 19 }, - /* 7127 */ { MAD_F(0x042f8456) /* 0.261600816 */, 19 }, - /* 7128 */ { MAD_F(0x042fb7a8) /* 0.261649758 */, 19 }, - /* 7129 */ { MAD_F(0x042feafa) /* 0.261698702 */, 19 }, - /* 7130 */ { MAD_F(0x04301e4d) /* 0.261747649 */, 19 }, - /* 7131 */ { MAD_F(0x043051a1) /* 0.261796597 */, 19 }, - /* 7132 */ { MAD_F(0x043084f5) /* 0.261845548 */, 19 }, - /* 7133 */ { MAD_F(0x0430b84a) /* 0.261894502 */, 19 }, - /* 7134 */ { MAD_F(0x0430eb9f) /* 0.261943458 */, 19 }, - /* 7135 */ { MAD_F(0x04311ef5) /* 0.261992416 */, 19 }, - - /* 7136 */ { MAD_F(0x0431524c) /* 0.262041376 */, 19 }, - /* 7137 */ { MAD_F(0x043185a3) /* 0.262090338 */, 19 }, - /* 7138 */ { MAD_F(0x0431b8fb) /* 0.262139303 */, 19 }, - /* 7139 */ { MAD_F(0x0431ec54) /* 0.262188270 */, 19 }, - /* 7140 */ { MAD_F(0x04321fad) /* 0.262237240 */, 19 }, - /* 7141 */ { MAD_F(0x04325306) /* 0.262286211 */, 19 }, - /* 7142 */ { MAD_F(0x04328661) /* 0.262335185 */, 19 }, - /* 7143 */ { MAD_F(0x0432b9bc) /* 0.262384162 */, 19 }, - /* 7144 */ { MAD_F(0x0432ed17) /* 0.262433140 */, 19 }, - /* 7145 */ { MAD_F(0x04332074) /* 0.262482121 */, 19 }, - /* 7146 */ { MAD_F(0x043353d0) /* 0.262531104 */, 19 }, - /* 7147 */ { MAD_F(0x0433872e) /* 0.262580089 */, 19 }, - /* 7148 */ { MAD_F(0x0433ba8c) /* 0.262629077 */, 19 }, - /* 7149 */ { MAD_F(0x0433edea) /* 0.262678067 */, 19 }, - /* 7150 */ { MAD_F(0x0434214a) /* 0.262727059 */, 19 }, - /* 7151 */ { MAD_F(0x043454aa) /* 0.262776054 */, 19 }, - - /* 7152 */ { MAD_F(0x0434880a) /* 0.262825051 */, 19 }, - /* 7153 */ { MAD_F(0x0434bb6b) /* 0.262874050 */, 19 }, - /* 7154 */ { MAD_F(0x0434eecd) /* 0.262923051 */, 19 }, - /* 7155 */ { MAD_F(0x0435222f) /* 0.262972055 */, 19 }, - /* 7156 */ { MAD_F(0x04355592) /* 0.263021061 */, 19 }, - /* 7157 */ { MAD_F(0x043588f6) /* 0.263070069 */, 19 }, - /* 7158 */ { MAD_F(0x0435bc5a) /* 0.263119079 */, 19 }, - /* 7159 */ { MAD_F(0x0435efbf) /* 0.263168092 */, 19 }, - /* 7160 */ { MAD_F(0x04362324) /* 0.263217107 */, 19 }, - /* 7161 */ { MAD_F(0x0436568a) /* 0.263266125 */, 19 }, - /* 7162 */ { MAD_F(0x043689f1) /* 0.263315144 */, 19 }, - /* 7163 */ { MAD_F(0x0436bd58) /* 0.263364166 */, 19 }, - /* 7164 */ { MAD_F(0x0436f0c0) /* 0.263413191 */, 19 }, - /* 7165 */ { MAD_F(0x04372428) /* 0.263462217 */, 19 }, - /* 7166 */ { MAD_F(0x04375791) /* 0.263511246 */, 19 }, - /* 7167 */ { MAD_F(0x04378afb) /* 0.263560277 */, 19 }, - - /* 7168 */ { MAD_F(0x0437be65) /* 0.263609310 */, 19 }, - /* 7169 */ { MAD_F(0x0437f1d0) /* 0.263658346 */, 19 }, - /* 7170 */ { MAD_F(0x0438253c) /* 0.263707384 */, 19 }, - /* 7171 */ { MAD_F(0x043858a8) /* 0.263756424 */, 19 }, - /* 7172 */ { MAD_F(0x04388c14) /* 0.263805466 */, 19 }, - /* 7173 */ { MAD_F(0x0438bf82) /* 0.263854511 */, 19 }, - /* 7174 */ { MAD_F(0x0438f2f0) /* 0.263903558 */, 19 }, - /* 7175 */ { MAD_F(0x0439265e) /* 0.263952607 */, 19 }, - /* 7176 */ { MAD_F(0x043959cd) /* 0.264001659 */, 19 }, - /* 7177 */ { MAD_F(0x04398d3d) /* 0.264050713 */, 19 }, - /* 7178 */ { MAD_F(0x0439c0ae) /* 0.264099769 */, 19 }, - /* 7179 */ { MAD_F(0x0439f41f) /* 0.264148827 */, 19 }, - /* 7180 */ { MAD_F(0x043a2790) /* 0.264197888 */, 19 }, - /* 7181 */ { MAD_F(0x043a5b02) /* 0.264246951 */, 19 }, - /* 7182 */ { MAD_F(0x043a8e75) /* 0.264296016 */, 19 }, - /* 7183 */ { MAD_F(0x043ac1e9) /* 0.264345084 */, 19 }, - - /* 7184 */ { MAD_F(0x043af55d) /* 0.264394153 */, 19 }, - /* 7185 */ { MAD_F(0x043b28d2) /* 0.264443225 */, 19 }, - /* 7186 */ { MAD_F(0x043b5c47) /* 0.264492300 */, 19 }, - /* 7187 */ { MAD_F(0x043b8fbd) /* 0.264541376 */, 19 }, - /* 7188 */ { MAD_F(0x043bc333) /* 0.264590455 */, 19 }, - /* 7189 */ { MAD_F(0x043bf6aa) /* 0.264639536 */, 19 }, - /* 7190 */ { MAD_F(0x043c2a22) /* 0.264688620 */, 19 }, - /* 7191 */ { MAD_F(0x043c5d9a) /* 0.264737706 */, 19 }, - /* 7192 */ { MAD_F(0x043c9113) /* 0.264786794 */, 19 }, - /* 7193 */ { MAD_F(0x043cc48d) /* 0.264835884 */, 19 }, - /* 7194 */ { MAD_F(0x043cf807) /* 0.264884976 */, 19 }, - /* 7195 */ { MAD_F(0x043d2b82) /* 0.264934071 */, 19 }, - /* 7196 */ { MAD_F(0x043d5efd) /* 0.264983168 */, 19 }, - /* 7197 */ { MAD_F(0x043d9279) /* 0.265032268 */, 19 }, - /* 7198 */ { MAD_F(0x043dc5f6) /* 0.265081369 */, 19 }, - /* 7199 */ { MAD_F(0x043df973) /* 0.265130473 */, 19 }, - - /* 7200 */ { MAD_F(0x043e2cf1) /* 0.265179580 */, 19 }, - /* 7201 */ { MAD_F(0x043e6070) /* 0.265228688 */, 19 }, - /* 7202 */ { MAD_F(0x043e93ef) /* 0.265277799 */, 19 }, - /* 7203 */ { MAD_F(0x043ec76e) /* 0.265326912 */, 19 }, - /* 7204 */ { MAD_F(0x043efaef) /* 0.265376027 */, 19 }, - /* 7205 */ { MAD_F(0x043f2e6f) /* 0.265425145 */, 19 }, - /* 7206 */ { MAD_F(0x043f61f1) /* 0.265474264 */, 19 }, - /* 7207 */ { MAD_F(0x043f9573) /* 0.265523387 */, 19 }, - /* 7208 */ { MAD_F(0x043fc8f6) /* 0.265572511 */, 19 }, - /* 7209 */ { MAD_F(0x043ffc79) /* 0.265621638 */, 19 }, - /* 7210 */ { MAD_F(0x04402ffd) /* 0.265670766 */, 19 }, - /* 7211 */ { MAD_F(0x04406382) /* 0.265719898 */, 19 }, - /* 7212 */ { MAD_F(0x04409707) /* 0.265769031 */, 19 }, - /* 7213 */ { MAD_F(0x0440ca8d) /* 0.265818167 */, 19 }, - /* 7214 */ { MAD_F(0x0440fe13) /* 0.265867305 */, 19 }, - /* 7215 */ { MAD_F(0x0441319a) /* 0.265916445 */, 19 }, - - /* 7216 */ { MAD_F(0x04416522) /* 0.265965588 */, 19 }, - /* 7217 */ { MAD_F(0x044198aa) /* 0.266014732 */, 19 }, - /* 7218 */ { MAD_F(0x0441cc33) /* 0.266063880 */, 19 }, - /* 7219 */ { MAD_F(0x0441ffbc) /* 0.266113029 */, 19 }, - /* 7220 */ { MAD_F(0x04423346) /* 0.266162181 */, 19 }, - /* 7221 */ { MAD_F(0x044266d1) /* 0.266211334 */, 19 }, - /* 7222 */ { MAD_F(0x04429a5c) /* 0.266260491 */, 19 }, - /* 7223 */ { MAD_F(0x0442cde8) /* 0.266309649 */, 19 }, - /* 7224 */ { MAD_F(0x04430174) /* 0.266358810 */, 19 }, - /* 7225 */ { MAD_F(0x04433501) /* 0.266407973 */, 19 }, - /* 7226 */ { MAD_F(0x0443688f) /* 0.266457138 */, 19 }, - /* 7227 */ { MAD_F(0x04439c1d) /* 0.266506305 */, 19 }, - /* 7228 */ { MAD_F(0x0443cfac) /* 0.266555475 */, 19 }, - /* 7229 */ { MAD_F(0x0444033c) /* 0.266604647 */, 19 }, - /* 7230 */ { MAD_F(0x044436cc) /* 0.266653822 */, 19 }, - /* 7231 */ { MAD_F(0x04446a5d) /* 0.266702998 */, 19 }, - - /* 7232 */ { MAD_F(0x04449dee) /* 0.266752177 */, 19 }, - /* 7233 */ { MAD_F(0x0444d180) /* 0.266801358 */, 19 }, - /* 7234 */ { MAD_F(0x04450513) /* 0.266850541 */, 19 }, - /* 7235 */ { MAD_F(0x044538a6) /* 0.266899727 */, 19 }, - /* 7236 */ { MAD_F(0x04456c39) /* 0.266948915 */, 19 }, - /* 7237 */ { MAD_F(0x04459fce) /* 0.266998105 */, 19 }, - /* 7238 */ { MAD_F(0x0445d363) /* 0.267047298 */, 19 }, - /* 7239 */ { MAD_F(0x044606f8) /* 0.267096492 */, 19 }, - /* 7240 */ { MAD_F(0x04463a8f) /* 0.267145689 */, 19 }, - /* 7241 */ { MAD_F(0x04466e25) /* 0.267194888 */, 19 }, - /* 7242 */ { MAD_F(0x0446a1bd) /* 0.267244090 */, 19 }, - /* 7243 */ { MAD_F(0x0446d555) /* 0.267293294 */, 19 }, - /* 7244 */ { MAD_F(0x044708ee) /* 0.267342500 */, 19 }, - /* 7245 */ { MAD_F(0x04473c87) /* 0.267391708 */, 19 }, - /* 7246 */ { MAD_F(0x04477021) /* 0.267440919 */, 19 }, - /* 7247 */ { MAD_F(0x0447a3bb) /* 0.267490131 */, 19 }, - - /* 7248 */ { MAD_F(0x0447d756) /* 0.267539347 */, 19 }, - /* 7249 */ { MAD_F(0x04480af2) /* 0.267588564 */, 19 }, - /* 7250 */ { MAD_F(0x04483e8e) /* 0.267637783 */, 19 }, - /* 7251 */ { MAD_F(0x0448722b) /* 0.267687005 */, 19 }, - /* 7252 */ { MAD_F(0x0448a5c9) /* 0.267736229 */, 19 }, - /* 7253 */ { MAD_F(0x0448d967) /* 0.267785456 */, 19 }, - /* 7254 */ { MAD_F(0x04490d05) /* 0.267834685 */, 19 }, - /* 7255 */ { MAD_F(0x044940a5) /* 0.267883915 */, 19 }, - /* 7256 */ { MAD_F(0x04497445) /* 0.267933149 */, 19 }, - /* 7257 */ { MAD_F(0x0449a7e5) /* 0.267982384 */, 19 }, - /* 7258 */ { MAD_F(0x0449db86) /* 0.268031622 */, 19 }, - /* 7259 */ { MAD_F(0x044a0f28) /* 0.268080862 */, 19 }, - /* 7260 */ { MAD_F(0x044a42ca) /* 0.268130104 */, 19 }, - /* 7261 */ { MAD_F(0x044a766d) /* 0.268179349 */, 19 }, - /* 7262 */ { MAD_F(0x044aaa11) /* 0.268228595 */, 19 }, - /* 7263 */ { MAD_F(0x044addb5) /* 0.268277844 */, 19 }, - - /* 7264 */ { MAD_F(0x044b115a) /* 0.268327096 */, 19 }, - /* 7265 */ { MAD_F(0x044b44ff) /* 0.268376349 */, 19 }, - /* 7266 */ { MAD_F(0x044b78a5) /* 0.268425605 */, 19 }, - /* 7267 */ { MAD_F(0x044bac4c) /* 0.268474863 */, 19 }, - /* 7268 */ { MAD_F(0x044bdff3) /* 0.268524123 */, 19 }, - /* 7269 */ { MAD_F(0x044c139b) /* 0.268573386 */, 19 }, - /* 7270 */ { MAD_F(0x044c4743) /* 0.268622651 */, 19 }, - /* 7271 */ { MAD_F(0x044c7aec) /* 0.268671918 */, 19 }, - /* 7272 */ { MAD_F(0x044cae96) /* 0.268721187 */, 19 }, - /* 7273 */ { MAD_F(0x044ce240) /* 0.268770459 */, 19 }, - /* 7274 */ { MAD_F(0x044d15eb) /* 0.268819733 */, 19 }, - /* 7275 */ { MAD_F(0x044d4997) /* 0.268869009 */, 19 }, - /* 7276 */ { MAD_F(0x044d7d43) /* 0.268918287 */, 19 }, - /* 7277 */ { MAD_F(0x044db0ef) /* 0.268967568 */, 19 }, - /* 7278 */ { MAD_F(0x044de49d) /* 0.269016851 */, 19 }, - /* 7279 */ { MAD_F(0x044e184b) /* 0.269066136 */, 19 }, - - /* 7280 */ { MAD_F(0x044e4bf9) /* 0.269115423 */, 19 }, - /* 7281 */ { MAD_F(0x044e7fa8) /* 0.269164713 */, 19 }, - /* 7282 */ { MAD_F(0x044eb358) /* 0.269214005 */, 19 }, - /* 7283 */ { MAD_F(0x044ee708) /* 0.269263299 */, 19 }, - /* 7284 */ { MAD_F(0x044f1ab9) /* 0.269312595 */, 19 }, - /* 7285 */ { MAD_F(0x044f4e6b) /* 0.269361894 */, 19 }, - /* 7286 */ { MAD_F(0x044f821d) /* 0.269411195 */, 19 }, - /* 7287 */ { MAD_F(0x044fb5cf) /* 0.269460498 */, 19 }, - /* 7288 */ { MAD_F(0x044fe983) /* 0.269509804 */, 19 }, - /* 7289 */ { MAD_F(0x04501d37) /* 0.269559111 */, 19 }, - /* 7290 */ { MAD_F(0x045050eb) /* 0.269608421 */, 19 }, - /* 7291 */ { MAD_F(0x045084a0) /* 0.269657734 */, 19 }, - /* 7292 */ { MAD_F(0x0450b856) /* 0.269707048 */, 19 }, - /* 7293 */ { MAD_F(0x0450ec0d) /* 0.269756365 */, 19 }, - /* 7294 */ { MAD_F(0x04511fc4) /* 0.269805684 */, 19 }, - /* 7295 */ { MAD_F(0x0451537b) /* 0.269855005 */, 19 }, - - /* 7296 */ { MAD_F(0x04518733) /* 0.269904329 */, 19 }, - /* 7297 */ { MAD_F(0x0451baec) /* 0.269953654 */, 19 }, - /* 7298 */ { MAD_F(0x0451eea5) /* 0.270002982 */, 19 }, - /* 7299 */ { MAD_F(0x0452225f) /* 0.270052313 */, 19 }, - /* 7300 */ { MAD_F(0x0452561a) /* 0.270101645 */, 19 }, - /* 7301 */ { MAD_F(0x045289d5) /* 0.270150980 */, 19 }, - /* 7302 */ { MAD_F(0x0452bd91) /* 0.270200317 */, 19 }, - /* 7303 */ { MAD_F(0x0452f14d) /* 0.270249656 */, 19 }, - /* 7304 */ { MAD_F(0x0453250a) /* 0.270298998 */, 19 }, - /* 7305 */ { MAD_F(0x045358c8) /* 0.270348341 */, 19 }, - /* 7306 */ { MAD_F(0x04538c86) /* 0.270397687 */, 19 }, - /* 7307 */ { MAD_F(0x0453c045) /* 0.270447036 */, 19 }, - /* 7308 */ { MAD_F(0x0453f405) /* 0.270496386 */, 19 }, - /* 7309 */ { MAD_F(0x045427c5) /* 0.270545739 */, 19 }, - /* 7310 */ { MAD_F(0x04545b85) /* 0.270595094 */, 19 }, - /* 7311 */ { MAD_F(0x04548f46) /* 0.270644451 */, 19 }, - - /* 7312 */ { MAD_F(0x0454c308) /* 0.270693811 */, 19 }, - /* 7313 */ { MAD_F(0x0454f6cb) /* 0.270743173 */, 19 }, - /* 7314 */ { MAD_F(0x04552a8e) /* 0.270792537 */, 19 }, - /* 7315 */ { MAD_F(0x04555e51) /* 0.270841903 */, 19 }, - /* 7316 */ { MAD_F(0x04559216) /* 0.270891271 */, 19 }, - /* 7317 */ { MAD_F(0x0455c5db) /* 0.270940642 */, 19 }, - /* 7318 */ { MAD_F(0x0455f9a0) /* 0.270990015 */, 19 }, - /* 7319 */ { MAD_F(0x04562d66) /* 0.271039390 */, 19 }, - /* 7320 */ { MAD_F(0x0456612d) /* 0.271088768 */, 19 }, - /* 7321 */ { MAD_F(0x045694f4) /* 0.271138148 */, 19 }, - /* 7322 */ { MAD_F(0x0456c8bc) /* 0.271187530 */, 19 }, - /* 7323 */ { MAD_F(0x0456fc84) /* 0.271236914 */, 19 }, - /* 7324 */ { MAD_F(0x0457304e) /* 0.271286301 */, 19 }, - /* 7325 */ { MAD_F(0x04576417) /* 0.271335689 */, 19 }, - /* 7326 */ { MAD_F(0x045797e2) /* 0.271385080 */, 19 }, - /* 7327 */ { MAD_F(0x0457cbac) /* 0.271434474 */, 19 }, - - /* 7328 */ { MAD_F(0x0457ff78) /* 0.271483869 */, 19 }, - /* 7329 */ { MAD_F(0x04583344) /* 0.271533267 */, 19 }, - /* 7330 */ { MAD_F(0x04586711) /* 0.271582667 */, 19 }, - /* 7331 */ { MAD_F(0x04589ade) /* 0.271632069 */, 19 }, - /* 7332 */ { MAD_F(0x0458ceac) /* 0.271681474 */, 19 }, - /* 7333 */ { MAD_F(0x0459027b) /* 0.271730880 */, 19 }, - /* 7334 */ { MAD_F(0x0459364a) /* 0.271780289 */, 19 }, - /* 7335 */ { MAD_F(0x04596a19) /* 0.271829701 */, 19 }, - /* 7336 */ { MAD_F(0x04599dea) /* 0.271879114 */, 19 }, - /* 7337 */ { MAD_F(0x0459d1bb) /* 0.271928530 */, 19 }, - /* 7338 */ { MAD_F(0x045a058c) /* 0.271977948 */, 19 }, - /* 7339 */ { MAD_F(0x045a395e) /* 0.272027368 */, 19 }, - /* 7340 */ { MAD_F(0x045a6d31) /* 0.272076790 */, 19 }, - /* 7341 */ { MAD_F(0x045aa104) /* 0.272126215 */, 19 }, - /* 7342 */ { MAD_F(0x045ad4d8) /* 0.272175642 */, 19 }, - /* 7343 */ { MAD_F(0x045b08ad) /* 0.272225071 */, 19 }, - - /* 7344 */ { MAD_F(0x045b3c82) /* 0.272274503 */, 19 }, - /* 7345 */ { MAD_F(0x045b7058) /* 0.272323936 */, 19 }, - /* 7346 */ { MAD_F(0x045ba42e) /* 0.272373372 */, 19 }, - /* 7347 */ { MAD_F(0x045bd805) /* 0.272422810 */, 19 }, - /* 7348 */ { MAD_F(0x045c0bdd) /* 0.272472251 */, 19 }, - /* 7349 */ { MAD_F(0x045c3fb5) /* 0.272521693 */, 19 }, - /* 7350 */ { MAD_F(0x045c738e) /* 0.272571138 */, 19 }, - /* 7351 */ { MAD_F(0x045ca767) /* 0.272620585 */, 19 }, - /* 7352 */ { MAD_F(0x045cdb41) /* 0.272670035 */, 19 }, - /* 7353 */ { MAD_F(0x045d0f1b) /* 0.272719486 */, 19 }, - /* 7354 */ { MAD_F(0x045d42f7) /* 0.272768940 */, 19 }, - /* 7355 */ { MAD_F(0x045d76d2) /* 0.272818396 */, 19 }, - /* 7356 */ { MAD_F(0x045daaaf) /* 0.272867855 */, 19 }, - /* 7357 */ { MAD_F(0x045dde8c) /* 0.272917315 */, 19 }, - /* 7358 */ { MAD_F(0x045e1269) /* 0.272966778 */, 19 }, - /* 7359 */ { MAD_F(0x045e4647) /* 0.273016243 */, 19 }, - - /* 7360 */ { MAD_F(0x045e7a26) /* 0.273065710 */, 19 }, - /* 7361 */ { MAD_F(0x045eae06) /* 0.273115180 */, 19 }, - /* 7362 */ { MAD_F(0x045ee1e6) /* 0.273164652 */, 19 }, - /* 7363 */ { MAD_F(0x045f15c6) /* 0.273214126 */, 19 }, - /* 7364 */ { MAD_F(0x045f49a7) /* 0.273263602 */, 19 }, - /* 7365 */ { MAD_F(0x045f7d89) /* 0.273313081 */, 19 }, - /* 7366 */ { MAD_F(0x045fb16c) /* 0.273362561 */, 19 }, - /* 7367 */ { MAD_F(0x045fe54f) /* 0.273412044 */, 19 }, - /* 7368 */ { MAD_F(0x04601932) /* 0.273461530 */, 19 }, - /* 7369 */ { MAD_F(0x04604d16) /* 0.273511017 */, 19 }, - /* 7370 */ { MAD_F(0x046080fb) /* 0.273560507 */, 19 }, - /* 7371 */ { MAD_F(0x0460b4e1) /* 0.273609999 */, 19 }, - /* 7372 */ { MAD_F(0x0460e8c7) /* 0.273659493 */, 19 }, - /* 7373 */ { MAD_F(0x04611cad) /* 0.273708989 */, 19 }, - /* 7374 */ { MAD_F(0x04615094) /* 0.273758488 */, 19 }, - /* 7375 */ { MAD_F(0x0461847c) /* 0.273807989 */, 19 }, - - /* 7376 */ { MAD_F(0x0461b864) /* 0.273857492 */, 19 }, - /* 7377 */ { MAD_F(0x0461ec4d) /* 0.273906997 */, 19 }, - /* 7378 */ { MAD_F(0x04622037) /* 0.273956505 */, 19 }, - /* 7379 */ { MAD_F(0x04625421) /* 0.274006015 */, 19 }, - /* 7380 */ { MAD_F(0x0462880c) /* 0.274055527 */, 19 }, - /* 7381 */ { MAD_F(0x0462bbf7) /* 0.274105041 */, 19 }, - /* 7382 */ { MAD_F(0x0462efe3) /* 0.274154558 */, 19 }, - /* 7383 */ { MAD_F(0x046323d0) /* 0.274204076 */, 19 }, - /* 7384 */ { MAD_F(0x046357bd) /* 0.274253597 */, 19 }, - /* 7385 */ { MAD_F(0x04638bab) /* 0.274303121 */, 19 }, - /* 7386 */ { MAD_F(0x0463bf99) /* 0.274352646 */, 19 }, - /* 7387 */ { MAD_F(0x0463f388) /* 0.274402174 */, 19 }, - /* 7388 */ { MAD_F(0x04642778) /* 0.274451704 */, 19 }, - /* 7389 */ { MAD_F(0x04645b68) /* 0.274501236 */, 19 }, - /* 7390 */ { MAD_F(0x04648f59) /* 0.274550771 */, 19 }, - /* 7391 */ { MAD_F(0x0464c34a) /* 0.274600307 */, 19 }, - - /* 7392 */ { MAD_F(0x0464f73c) /* 0.274649846 */, 19 }, - /* 7393 */ { MAD_F(0x04652b2f) /* 0.274699387 */, 19 }, - /* 7394 */ { MAD_F(0x04655f22) /* 0.274748931 */, 19 }, - /* 7395 */ { MAD_F(0x04659316) /* 0.274798476 */, 19 }, - /* 7396 */ { MAD_F(0x0465c70a) /* 0.274848024 */, 19 }, - /* 7397 */ { MAD_F(0x0465faff) /* 0.274897574 */, 19 }, - /* 7398 */ { MAD_F(0x04662ef5) /* 0.274947126 */, 19 }, - /* 7399 */ { MAD_F(0x046662eb) /* 0.274996681 */, 19 }, - /* 7400 */ { MAD_F(0x046696e2) /* 0.275046238 */, 19 }, - /* 7401 */ { MAD_F(0x0466cad9) /* 0.275095797 */, 19 }, - /* 7402 */ { MAD_F(0x0466fed1) /* 0.275145358 */, 19 }, - /* 7403 */ { MAD_F(0x046732ca) /* 0.275194921 */, 19 }, - /* 7404 */ { MAD_F(0x046766c3) /* 0.275244487 */, 19 }, - /* 7405 */ { MAD_F(0x04679abd) /* 0.275294055 */, 19 }, - /* 7406 */ { MAD_F(0x0467ceb7) /* 0.275343625 */, 19 }, - /* 7407 */ { MAD_F(0x046802b2) /* 0.275393198 */, 19 }, - - /* 7408 */ { MAD_F(0x046836ae) /* 0.275442772 */, 19 }, - /* 7409 */ { MAD_F(0x04686aaa) /* 0.275492349 */, 19 }, - /* 7410 */ { MAD_F(0x04689ea7) /* 0.275541928 */, 19 }, - /* 7411 */ { MAD_F(0x0468d2a4) /* 0.275591509 */, 19 }, - /* 7412 */ { MAD_F(0x046906a2) /* 0.275641093 */, 19 }, - /* 7413 */ { MAD_F(0x04693aa1) /* 0.275690679 */, 19 }, - /* 7414 */ { MAD_F(0x04696ea0) /* 0.275740267 */, 19 }, - /* 7415 */ { MAD_F(0x0469a2a0) /* 0.275789857 */, 19 }, - /* 7416 */ { MAD_F(0x0469d6a0) /* 0.275839449 */, 19 }, - /* 7417 */ { MAD_F(0x046a0aa1) /* 0.275889044 */, 19 }, - /* 7418 */ { MAD_F(0x046a3ea3) /* 0.275938641 */, 19 }, - /* 7419 */ { MAD_F(0x046a72a5) /* 0.275988240 */, 19 }, - /* 7420 */ { MAD_F(0x046aa6a8) /* 0.276037842 */, 19 }, - /* 7421 */ { MAD_F(0x046adaab) /* 0.276087445 */, 19 }, - /* 7422 */ { MAD_F(0x046b0eaf) /* 0.276137051 */, 19 }, - /* 7423 */ { MAD_F(0x046b42b3) /* 0.276186659 */, 19 }, - - /* 7424 */ { MAD_F(0x046b76b9) /* 0.276236269 */, 19 }, - /* 7425 */ { MAD_F(0x046baabe) /* 0.276285882 */, 19 }, - /* 7426 */ { MAD_F(0x046bdec5) /* 0.276335497 */, 19 }, - /* 7427 */ { MAD_F(0x046c12cc) /* 0.276385113 */, 19 }, - /* 7428 */ { MAD_F(0x046c46d3) /* 0.276434733 */, 19 }, - /* 7429 */ { MAD_F(0x046c7adb) /* 0.276484354 */, 19 }, - /* 7430 */ { MAD_F(0x046caee4) /* 0.276533978 */, 19 }, - /* 7431 */ { MAD_F(0x046ce2ee) /* 0.276583604 */, 19 }, - /* 7432 */ { MAD_F(0x046d16f7) /* 0.276633232 */, 19 }, - /* 7433 */ { MAD_F(0x046d4b02) /* 0.276682862 */, 19 }, - /* 7434 */ { MAD_F(0x046d7f0d) /* 0.276732495 */, 19 }, - /* 7435 */ { MAD_F(0x046db319) /* 0.276782129 */, 19 }, - /* 7436 */ { MAD_F(0x046de725) /* 0.276831766 */, 19 }, - /* 7437 */ { MAD_F(0x046e1b32) /* 0.276881406 */, 19 }, - /* 7438 */ { MAD_F(0x046e4f40) /* 0.276931047 */, 19 }, - /* 7439 */ { MAD_F(0x046e834e) /* 0.276980691 */, 19 }, - - /* 7440 */ { MAD_F(0x046eb75c) /* 0.277030337 */, 19 }, - /* 7441 */ { MAD_F(0x046eeb6c) /* 0.277079985 */, 19 }, - /* 7442 */ { MAD_F(0x046f1f7c) /* 0.277129635 */, 19 }, - /* 7443 */ { MAD_F(0x046f538c) /* 0.277179288 */, 19 }, - /* 7444 */ { MAD_F(0x046f879d) /* 0.277228942 */, 19 }, - /* 7445 */ { MAD_F(0x046fbbaf) /* 0.277278600 */, 19 }, - /* 7446 */ { MAD_F(0x046fefc1) /* 0.277328259 */, 19 }, - /* 7447 */ { MAD_F(0x047023d4) /* 0.277377920 */, 19 }, - /* 7448 */ { MAD_F(0x047057e8) /* 0.277427584 */, 19 }, - /* 7449 */ { MAD_F(0x04708bfc) /* 0.277477250 */, 19 }, - /* 7450 */ { MAD_F(0x0470c011) /* 0.277526918 */, 19 }, - /* 7451 */ { MAD_F(0x0470f426) /* 0.277576588 */, 19 }, - /* 7452 */ { MAD_F(0x0471283c) /* 0.277626261 */, 19 }, - /* 7453 */ { MAD_F(0x04715c52) /* 0.277675936 */, 19 }, - /* 7454 */ { MAD_F(0x04719069) /* 0.277725613 */, 19 }, - /* 7455 */ { MAD_F(0x0471c481) /* 0.277775292 */, 19 }, - - /* 7456 */ { MAD_F(0x0471f899) /* 0.277824973 */, 19 }, - /* 7457 */ { MAD_F(0x04722cb2) /* 0.277874657 */, 19 }, - /* 7458 */ { MAD_F(0x047260cc) /* 0.277924343 */, 19 }, - /* 7459 */ { MAD_F(0x047294e6) /* 0.277974031 */, 19 }, - /* 7460 */ { MAD_F(0x0472c900) /* 0.278023722 */, 19 }, - /* 7461 */ { MAD_F(0x0472fd1b) /* 0.278073414 */, 19 }, - /* 7462 */ { MAD_F(0x04733137) /* 0.278123109 */, 19 }, - /* 7463 */ { MAD_F(0x04736554) /* 0.278172806 */, 19 }, - /* 7464 */ { MAD_F(0x04739971) /* 0.278222505 */, 19 }, - /* 7465 */ { MAD_F(0x0473cd8e) /* 0.278272207 */, 19 }, - /* 7466 */ { MAD_F(0x047401ad) /* 0.278321910 */, 19 }, - /* 7467 */ { MAD_F(0x047435cb) /* 0.278371616 */, 19 }, - /* 7468 */ { MAD_F(0x047469eb) /* 0.278421324 */, 19 }, - /* 7469 */ { MAD_F(0x04749e0b) /* 0.278471035 */, 19 }, - /* 7470 */ { MAD_F(0x0474d22c) /* 0.278520747 */, 19 }, - /* 7471 */ { MAD_F(0x0475064d) /* 0.278570462 */, 19 }, - - /* 7472 */ { MAD_F(0x04753a6f) /* 0.278620179 */, 19 }, - /* 7473 */ { MAD_F(0x04756e91) /* 0.278669898 */, 19 }, - /* 7474 */ { MAD_F(0x0475a2b4) /* 0.278719619 */, 19 }, - /* 7475 */ { MAD_F(0x0475d6d7) /* 0.278769343 */, 19 }, - /* 7476 */ { MAD_F(0x04760afc) /* 0.278819069 */, 19 }, - /* 7477 */ { MAD_F(0x04763f20) /* 0.278868797 */, 19 }, - /* 7478 */ { MAD_F(0x04767346) /* 0.278918527 */, 19 }, - /* 7479 */ { MAD_F(0x0476a76c) /* 0.278968260 */, 19 }, - /* 7480 */ { MAD_F(0x0476db92) /* 0.279017995 */, 19 }, - /* 7481 */ { MAD_F(0x04770fba) /* 0.279067731 */, 19 }, - /* 7482 */ { MAD_F(0x047743e1) /* 0.279117471 */, 19 }, - /* 7483 */ { MAD_F(0x0477780a) /* 0.279167212 */, 19 }, - /* 7484 */ { MAD_F(0x0477ac33) /* 0.279216956 */, 19 }, - /* 7485 */ { MAD_F(0x0477e05c) /* 0.279266701 */, 19 }, - /* 7486 */ { MAD_F(0x04781486) /* 0.279316449 */, 19 }, - /* 7487 */ { MAD_F(0x047848b1) /* 0.279366200 */, 19 }, - - /* 7488 */ { MAD_F(0x04787cdc) /* 0.279415952 */, 19 }, - /* 7489 */ { MAD_F(0x0478b108) /* 0.279465707 */, 19 }, - /* 7490 */ { MAD_F(0x0478e535) /* 0.279515464 */, 19 }, - /* 7491 */ { MAD_F(0x04791962) /* 0.279565223 */, 19 }, - /* 7492 */ { MAD_F(0x04794d8f) /* 0.279614984 */, 19 }, - /* 7493 */ { MAD_F(0x047981be) /* 0.279664748 */, 19 }, - /* 7494 */ { MAD_F(0x0479b5ed) /* 0.279714513 */, 19 }, - /* 7495 */ { MAD_F(0x0479ea1c) /* 0.279764281 */, 19 }, - /* 7496 */ { MAD_F(0x047a1e4c) /* 0.279814051 */, 19 }, - /* 7497 */ { MAD_F(0x047a527d) /* 0.279863824 */, 19 }, - /* 7498 */ { MAD_F(0x047a86ae) /* 0.279913598 */, 19 }, - /* 7499 */ { MAD_F(0x047abae0) /* 0.279963375 */, 19 }, - /* 7500 */ { MAD_F(0x047aef12) /* 0.280013154 */, 19 }, - /* 7501 */ { MAD_F(0x047b2346) /* 0.280062935 */, 19 }, - /* 7502 */ { MAD_F(0x047b5779) /* 0.280112719 */, 19 }, - /* 7503 */ { MAD_F(0x047b8bad) /* 0.280162504 */, 19 }, - - /* 7504 */ { MAD_F(0x047bbfe2) /* 0.280212292 */, 19 }, - /* 7505 */ { MAD_F(0x047bf418) /* 0.280262082 */, 19 }, - /* 7506 */ { MAD_F(0x047c284e) /* 0.280311875 */, 19 }, - /* 7507 */ { MAD_F(0x047c5c84) /* 0.280361669 */, 19 }, - /* 7508 */ { MAD_F(0x047c90bb) /* 0.280411466 */, 19 }, - /* 7509 */ { MAD_F(0x047cc4f3) /* 0.280461265 */, 19 }, - /* 7510 */ { MAD_F(0x047cf92c) /* 0.280511066 */, 19 }, - /* 7511 */ { MAD_F(0x047d2d65) /* 0.280560869 */, 19 }, - /* 7512 */ { MAD_F(0x047d619e) /* 0.280610675 */, 19 }, - /* 7513 */ { MAD_F(0x047d95d8) /* 0.280660483 */, 19 }, - /* 7514 */ { MAD_F(0x047dca13) /* 0.280710292 */, 19 }, - /* 7515 */ { MAD_F(0x047dfe4e) /* 0.280760105 */, 19 }, - /* 7516 */ { MAD_F(0x047e328a) /* 0.280809919 */, 19 }, - /* 7517 */ { MAD_F(0x047e66c7) /* 0.280859736 */, 19 }, - /* 7518 */ { MAD_F(0x047e9b04) /* 0.280909554 */, 19 }, - /* 7519 */ { MAD_F(0x047ecf42) /* 0.280959375 */, 19 }, - - /* 7520 */ { MAD_F(0x047f0380) /* 0.281009199 */, 19 }, - /* 7521 */ { MAD_F(0x047f37bf) /* 0.281059024 */, 19 }, - /* 7522 */ { MAD_F(0x047f6bff) /* 0.281108852 */, 19 }, - /* 7523 */ { MAD_F(0x047fa03f) /* 0.281158682 */, 19 }, - /* 7524 */ { MAD_F(0x047fd47f) /* 0.281208514 */, 19 }, - /* 7525 */ { MAD_F(0x048008c1) /* 0.281258348 */, 19 }, - /* 7526 */ { MAD_F(0x04803d02) /* 0.281308184 */, 19 }, - /* 7527 */ { MAD_F(0x04807145) /* 0.281358023 */, 19 }, - /* 7528 */ { MAD_F(0x0480a588) /* 0.281407864 */, 19 }, - /* 7529 */ { MAD_F(0x0480d9cc) /* 0.281457707 */, 19 }, - /* 7530 */ { MAD_F(0x04810e10) /* 0.281507552 */, 19 }, - /* 7531 */ { MAD_F(0x04814255) /* 0.281557400 */, 19 }, - /* 7532 */ { MAD_F(0x0481769a) /* 0.281607250 */, 19 }, - /* 7533 */ { MAD_F(0x0481aae0) /* 0.281657101 */, 19 }, - /* 7534 */ { MAD_F(0x0481df27) /* 0.281706956 */, 19 }, - /* 7535 */ { MAD_F(0x0482136e) /* 0.281756812 */, 19 }, - - /* 7536 */ { MAD_F(0x048247b6) /* 0.281806670 */, 19 }, - /* 7537 */ { MAD_F(0x04827bfe) /* 0.281856531 */, 19 }, - /* 7538 */ { MAD_F(0x0482b047) /* 0.281906394 */, 19 }, - /* 7539 */ { MAD_F(0x0482e491) /* 0.281956259 */, 19 }, - /* 7540 */ { MAD_F(0x048318db) /* 0.282006127 */, 19 }, - /* 7541 */ { MAD_F(0x04834d26) /* 0.282055996 */, 19 }, - /* 7542 */ { MAD_F(0x04838171) /* 0.282105868 */, 19 }, - /* 7543 */ { MAD_F(0x0483b5bd) /* 0.282155742 */, 19 }, - /* 7544 */ { MAD_F(0x0483ea0a) /* 0.282205618 */, 19 }, - /* 7545 */ { MAD_F(0x04841e57) /* 0.282255496 */, 19 }, - /* 7546 */ { MAD_F(0x048452a4) /* 0.282305377 */, 19 }, - /* 7547 */ { MAD_F(0x048486f3) /* 0.282355260 */, 19 }, - /* 7548 */ { MAD_F(0x0484bb42) /* 0.282405145 */, 19 }, - /* 7549 */ { MAD_F(0x0484ef91) /* 0.282455032 */, 19 }, - /* 7550 */ { MAD_F(0x048523e1) /* 0.282504921 */, 19 }, - /* 7551 */ { MAD_F(0x04855832) /* 0.282554813 */, 19 }, - - /* 7552 */ { MAD_F(0x04858c83) /* 0.282604707 */, 19 }, - /* 7553 */ { MAD_F(0x0485c0d5) /* 0.282654603 */, 19 }, - /* 7554 */ { MAD_F(0x0485f527) /* 0.282704501 */, 19 }, - /* 7555 */ { MAD_F(0x0486297a) /* 0.282754401 */, 19 }, - /* 7556 */ { MAD_F(0x04865dce) /* 0.282804304 */, 19 }, - /* 7557 */ { MAD_F(0x04869222) /* 0.282854209 */, 19 }, - /* 7558 */ { MAD_F(0x0486c677) /* 0.282904116 */, 19 }, - /* 7559 */ { MAD_F(0x0486facc) /* 0.282954025 */, 19 }, - /* 7560 */ { MAD_F(0x04872f22) /* 0.283003936 */, 19 }, - /* 7561 */ { MAD_F(0x04876379) /* 0.283053850 */, 19 }, - /* 7562 */ { MAD_F(0x048797d0) /* 0.283103766 */, 19 }, - /* 7563 */ { MAD_F(0x0487cc28) /* 0.283153684 */, 19 }, - /* 7564 */ { MAD_F(0x04880080) /* 0.283203604 */, 19 }, - /* 7565 */ { MAD_F(0x048834d9) /* 0.283253527 */, 19 }, - /* 7566 */ { MAD_F(0x04886933) /* 0.283303451 */, 19 }, - /* 7567 */ { MAD_F(0x04889d8d) /* 0.283353378 */, 19 }, - - /* 7568 */ { MAD_F(0x0488d1e8) /* 0.283403307 */, 19 }, - /* 7569 */ { MAD_F(0x04890643) /* 0.283453238 */, 19 }, - /* 7570 */ { MAD_F(0x04893a9f) /* 0.283503172 */, 19 }, - /* 7571 */ { MAD_F(0x04896efb) /* 0.283553107 */, 19 }, - /* 7572 */ { MAD_F(0x0489a358) /* 0.283603045 */, 19 }, - /* 7573 */ { MAD_F(0x0489d7b6) /* 0.283652985 */, 19 }, - /* 7574 */ { MAD_F(0x048a0c14) /* 0.283702927 */, 19 }, - /* 7575 */ { MAD_F(0x048a4073) /* 0.283752872 */, 19 }, - /* 7576 */ { MAD_F(0x048a74d3) /* 0.283802818 */, 19 }, - /* 7577 */ { MAD_F(0x048aa933) /* 0.283852767 */, 19 }, - /* 7578 */ { MAD_F(0x048add93) /* 0.283902718 */, 19 }, - /* 7579 */ { MAD_F(0x048b11f5) /* 0.283952671 */, 19 }, - /* 7580 */ { MAD_F(0x048b4656) /* 0.284002627 */, 19 }, - /* 7581 */ { MAD_F(0x048b7ab9) /* 0.284052584 */, 19 }, - /* 7582 */ { MAD_F(0x048baf1c) /* 0.284102544 */, 19 }, - /* 7583 */ { MAD_F(0x048be37f) /* 0.284152506 */, 19 }, - - /* 7584 */ { MAD_F(0x048c17e3) /* 0.284202470 */, 19 }, - /* 7585 */ { MAD_F(0x048c4c48) /* 0.284252436 */, 19 }, - /* 7586 */ { MAD_F(0x048c80ad) /* 0.284302405 */, 19 }, - /* 7587 */ { MAD_F(0x048cb513) /* 0.284352376 */, 19 }, - /* 7588 */ { MAD_F(0x048ce97a) /* 0.284402349 */, 19 }, - /* 7589 */ { MAD_F(0x048d1de1) /* 0.284452324 */, 19 }, - /* 7590 */ { MAD_F(0x048d5249) /* 0.284502301 */, 19 }, - /* 7591 */ { MAD_F(0x048d86b1) /* 0.284552281 */, 19 }, - /* 7592 */ { MAD_F(0x048dbb1a) /* 0.284602263 */, 19 }, - /* 7593 */ { MAD_F(0x048def83) /* 0.284652246 */, 19 }, - /* 7594 */ { MAD_F(0x048e23ed) /* 0.284702233 */, 19 }, - /* 7595 */ { MAD_F(0x048e5858) /* 0.284752221 */, 19 }, - /* 7596 */ { MAD_F(0x048e8cc3) /* 0.284802211 */, 19 }, - /* 7597 */ { MAD_F(0x048ec12f) /* 0.284852204 */, 19 }, - /* 7598 */ { MAD_F(0x048ef59b) /* 0.284902199 */, 19 }, - /* 7599 */ { MAD_F(0x048f2a08) /* 0.284952196 */, 19 }, - - /* 7600 */ { MAD_F(0x048f5e76) /* 0.285002195 */, 19 }, - /* 7601 */ { MAD_F(0x048f92e4) /* 0.285052197 */, 19 }, - /* 7602 */ { MAD_F(0x048fc753) /* 0.285102201 */, 19 }, - /* 7603 */ { MAD_F(0x048ffbc2) /* 0.285152206 */, 19 }, - /* 7604 */ { MAD_F(0x04903032) /* 0.285202214 */, 19 }, - /* 7605 */ { MAD_F(0x049064a3) /* 0.285252225 */, 19 }, - /* 7606 */ { MAD_F(0x04909914) /* 0.285302237 */, 19 }, - /* 7607 */ { MAD_F(0x0490cd86) /* 0.285352252 */, 19 }, - /* 7608 */ { MAD_F(0x049101f8) /* 0.285402269 */, 19 }, - /* 7609 */ { MAD_F(0x0491366b) /* 0.285452288 */, 19 }, - /* 7610 */ { MAD_F(0x04916ade) /* 0.285502309 */, 19 }, - /* 7611 */ { MAD_F(0x04919f52) /* 0.285552332 */, 19 }, - /* 7612 */ { MAD_F(0x0491d3c7) /* 0.285602358 */, 19 }, - /* 7613 */ { MAD_F(0x0492083c) /* 0.285652386 */, 19 }, - /* 7614 */ { MAD_F(0x04923cb2) /* 0.285702416 */, 19 }, - /* 7615 */ { MAD_F(0x04927128) /* 0.285752448 */, 19 }, - - /* 7616 */ { MAD_F(0x0492a59f) /* 0.285802482 */, 19 }, - /* 7617 */ { MAD_F(0x0492da17) /* 0.285852519 */, 19 }, - /* 7618 */ { MAD_F(0x04930e8f) /* 0.285902557 */, 19 }, - /* 7619 */ { MAD_F(0x04934308) /* 0.285952598 */, 19 }, - /* 7620 */ { MAD_F(0x04937781) /* 0.286002641 */, 19 }, - /* 7621 */ { MAD_F(0x0493abfb) /* 0.286052687 */, 19 }, - /* 7622 */ { MAD_F(0x0493e076) /* 0.286102734 */, 19 }, - /* 7623 */ { MAD_F(0x049414f1) /* 0.286152784 */, 19 }, - /* 7624 */ { MAD_F(0x0494496c) /* 0.286202836 */, 19 }, - /* 7625 */ { MAD_F(0x04947de9) /* 0.286252890 */, 19 }, - /* 7626 */ { MAD_F(0x0494b266) /* 0.286302946 */, 19 }, - /* 7627 */ { MAD_F(0x0494e6e3) /* 0.286353005 */, 19 }, - /* 7628 */ { MAD_F(0x04951b61) /* 0.286403065 */, 19 }, - /* 7629 */ { MAD_F(0x04954fe0) /* 0.286453128 */, 19 }, - /* 7630 */ { MAD_F(0x0495845f) /* 0.286503193 */, 19 }, - /* 7631 */ { MAD_F(0x0495b8df) /* 0.286553260 */, 19 }, - - /* 7632 */ { MAD_F(0x0495ed5f) /* 0.286603329 */, 19 }, - /* 7633 */ { MAD_F(0x049621e0) /* 0.286653401 */, 19 }, - /* 7634 */ { MAD_F(0x04965662) /* 0.286703475 */, 19 }, - /* 7635 */ { MAD_F(0x04968ae4) /* 0.286753551 */, 19 }, - /* 7636 */ { MAD_F(0x0496bf67) /* 0.286803629 */, 19 }, - /* 7637 */ { MAD_F(0x0496f3ea) /* 0.286853709 */, 19 }, - /* 7638 */ { MAD_F(0x0497286e) /* 0.286903792 */, 19 }, - /* 7639 */ { MAD_F(0x04975cf2) /* 0.286953876 */, 19 }, - /* 7640 */ { MAD_F(0x04979177) /* 0.287003963 */, 19 }, - /* 7641 */ { MAD_F(0x0497c5fd) /* 0.287054052 */, 19 }, - /* 7642 */ { MAD_F(0x0497fa83) /* 0.287104143 */, 19 }, - /* 7643 */ { MAD_F(0x04982f0a) /* 0.287154237 */, 19 }, - /* 7644 */ { MAD_F(0x04986392) /* 0.287204332 */, 19 }, - /* 7645 */ { MAD_F(0x0498981a) /* 0.287254430 */, 19 }, - /* 7646 */ { MAD_F(0x0498cca2) /* 0.287304530 */, 19 }, - /* 7647 */ { MAD_F(0x0499012c) /* 0.287354632 */, 19 }, - - /* 7648 */ { MAD_F(0x049935b5) /* 0.287404737 */, 19 }, - /* 7649 */ { MAD_F(0x04996a40) /* 0.287454843 */, 19 }, - /* 7650 */ { MAD_F(0x04999ecb) /* 0.287504952 */, 19 }, - /* 7651 */ { MAD_F(0x0499d356) /* 0.287555063 */, 19 }, - /* 7652 */ { MAD_F(0x049a07e2) /* 0.287605176 */, 19 }, - /* 7653 */ { MAD_F(0x049a3c6f) /* 0.287655291 */, 19 }, - /* 7654 */ { MAD_F(0x049a70fc) /* 0.287705409 */, 19 }, - /* 7655 */ { MAD_F(0x049aa58a) /* 0.287755528 */, 19 }, - /* 7656 */ { MAD_F(0x049ada19) /* 0.287805650 */, 19 }, - /* 7657 */ { MAD_F(0x049b0ea8) /* 0.287855774 */, 19 }, - /* 7658 */ { MAD_F(0x049b4337) /* 0.287905900 */, 19 }, - /* 7659 */ { MAD_F(0x049b77c8) /* 0.287956028 */, 19 }, - /* 7660 */ { MAD_F(0x049bac58) /* 0.288006159 */, 19 }, - /* 7661 */ { MAD_F(0x049be0ea) /* 0.288056292 */, 19 }, - /* 7662 */ { MAD_F(0x049c157c) /* 0.288106427 */, 19 }, - /* 7663 */ { MAD_F(0x049c4a0e) /* 0.288156564 */, 19 }, - - /* 7664 */ { MAD_F(0x049c7ea1) /* 0.288206703 */, 19 }, - /* 7665 */ { MAD_F(0x049cb335) /* 0.288256844 */, 19 }, - /* 7666 */ { MAD_F(0x049ce7ca) /* 0.288306988 */, 19 }, - /* 7667 */ { MAD_F(0x049d1c5e) /* 0.288357134 */, 19 }, - /* 7668 */ { MAD_F(0x049d50f4) /* 0.288407282 */, 19 }, - /* 7669 */ { MAD_F(0x049d858a) /* 0.288457432 */, 19 }, - /* 7670 */ { MAD_F(0x049dba21) /* 0.288507584 */, 19 }, - /* 7671 */ { MAD_F(0x049deeb8) /* 0.288557739 */, 19 }, - /* 7672 */ { MAD_F(0x049e2350) /* 0.288607895 */, 19 }, - /* 7673 */ { MAD_F(0x049e57e8) /* 0.288658054 */, 19 }, - /* 7674 */ { MAD_F(0x049e8c81) /* 0.288708215 */, 19 }, - /* 7675 */ { MAD_F(0x049ec11b) /* 0.288758379 */, 19 }, - /* 7676 */ { MAD_F(0x049ef5b5) /* 0.288808544 */, 19 }, - /* 7677 */ { MAD_F(0x049f2a50) /* 0.288858712 */, 19 }, - /* 7678 */ { MAD_F(0x049f5eeb) /* 0.288908881 */, 19 }, - /* 7679 */ { MAD_F(0x049f9387) /* 0.288959053 */, 19 }, - - /* 7680 */ { MAD_F(0x049fc824) /* 0.289009227 */, 19 }, - /* 7681 */ { MAD_F(0x049ffcc1) /* 0.289059404 */, 19 }, - /* 7682 */ { MAD_F(0x04a0315e) /* 0.289109582 */, 19 }, - /* 7683 */ { MAD_F(0x04a065fd) /* 0.289159763 */, 19 }, - /* 7684 */ { MAD_F(0x04a09a9b) /* 0.289209946 */, 19 }, - /* 7685 */ { MAD_F(0x04a0cf3b) /* 0.289260131 */, 19 }, - /* 7686 */ { MAD_F(0x04a103db) /* 0.289310318 */, 19 }, - /* 7687 */ { MAD_F(0x04a1387b) /* 0.289360507 */, 19 }, - /* 7688 */ { MAD_F(0x04a16d1d) /* 0.289410699 */, 19 }, - /* 7689 */ { MAD_F(0x04a1a1be) /* 0.289460893 */, 19 }, - /* 7690 */ { MAD_F(0x04a1d661) /* 0.289511088 */, 19 }, - /* 7691 */ { MAD_F(0x04a20b04) /* 0.289561287 */, 19 }, - /* 7692 */ { MAD_F(0x04a23fa7) /* 0.289611487 */, 19 }, - /* 7693 */ { MAD_F(0x04a2744b) /* 0.289661689 */, 19 }, - /* 7694 */ { MAD_F(0x04a2a8f0) /* 0.289711894 */, 19 }, - /* 7695 */ { MAD_F(0x04a2dd95) /* 0.289762101 */, 19 }, - - /* 7696 */ { MAD_F(0x04a3123b) /* 0.289812309 */, 19 }, - /* 7697 */ { MAD_F(0x04a346e2) /* 0.289862521 */, 19 }, - /* 7698 */ { MAD_F(0x04a37b89) /* 0.289912734 */, 19 }, - /* 7699 */ { MAD_F(0x04a3b030) /* 0.289962949 */, 19 }, - /* 7700 */ { MAD_F(0x04a3e4d8) /* 0.290013167 */, 19 }, - /* 7701 */ { MAD_F(0x04a41981) /* 0.290063387 */, 19 }, - /* 7702 */ { MAD_F(0x04a44e2b) /* 0.290113609 */, 19 }, - /* 7703 */ { MAD_F(0x04a482d5) /* 0.290163833 */, 19 }, - /* 7704 */ { MAD_F(0x04a4b77f) /* 0.290214059 */, 19 }, - /* 7705 */ { MAD_F(0x04a4ec2a) /* 0.290264288 */, 19 }, - /* 7706 */ { MAD_F(0x04a520d6) /* 0.290314519 */, 19 }, - /* 7707 */ { MAD_F(0x04a55582) /* 0.290364751 */, 19 }, - /* 7708 */ { MAD_F(0x04a58a2f) /* 0.290414986 */, 19 }, - /* 7709 */ { MAD_F(0x04a5bedd) /* 0.290465224 */, 19 }, - /* 7710 */ { MAD_F(0x04a5f38b) /* 0.290515463 */, 19 }, - /* 7711 */ { MAD_F(0x04a62839) /* 0.290565705 */, 19 }, - - /* 7712 */ { MAD_F(0x04a65ce8) /* 0.290615948 */, 19 }, - /* 7713 */ { MAD_F(0x04a69198) /* 0.290666194 */, 19 }, - /* 7714 */ { MAD_F(0x04a6c648) /* 0.290716442 */, 19 }, - /* 7715 */ { MAD_F(0x04a6faf9) /* 0.290766692 */, 19 }, - /* 7716 */ { MAD_F(0x04a72fab) /* 0.290816945 */, 19 }, - /* 7717 */ { MAD_F(0x04a7645d) /* 0.290867199 */, 19 }, - /* 7718 */ { MAD_F(0x04a79910) /* 0.290917456 */, 19 }, - /* 7719 */ { MAD_F(0x04a7cdc3) /* 0.290967715 */, 19 }, - /* 7720 */ { MAD_F(0x04a80277) /* 0.291017976 */, 19 }, - /* 7721 */ { MAD_F(0x04a8372b) /* 0.291068239 */, 19 }, - /* 7722 */ { MAD_F(0x04a86be0) /* 0.291118505 */, 19 }, - /* 7723 */ { MAD_F(0x04a8a096) /* 0.291168772 */, 19 }, - /* 7724 */ { MAD_F(0x04a8d54c) /* 0.291219042 */, 19 }, - /* 7725 */ { MAD_F(0x04a90a03) /* 0.291269314 */, 19 }, - /* 7726 */ { MAD_F(0x04a93eba) /* 0.291319588 */, 19 }, - /* 7727 */ { MAD_F(0x04a97372) /* 0.291369865 */, 19 }, - - /* 7728 */ { MAD_F(0x04a9a82b) /* 0.291420143 */, 19 }, - /* 7729 */ { MAD_F(0x04a9dce4) /* 0.291470424 */, 19 }, - /* 7730 */ { MAD_F(0x04aa119d) /* 0.291520706 */, 19 }, - /* 7731 */ { MAD_F(0x04aa4658) /* 0.291570991 */, 19 }, - /* 7732 */ { MAD_F(0x04aa7b13) /* 0.291621278 */, 19 }, - /* 7733 */ { MAD_F(0x04aaafce) /* 0.291671568 */, 19 }, - /* 7734 */ { MAD_F(0x04aae48a) /* 0.291721859 */, 19 }, - /* 7735 */ { MAD_F(0x04ab1947) /* 0.291772153 */, 19 }, - /* 7736 */ { MAD_F(0x04ab4e04) /* 0.291822449 */, 19 }, - /* 7737 */ { MAD_F(0x04ab82c2) /* 0.291872747 */, 19 }, - /* 7738 */ { MAD_F(0x04abb780) /* 0.291923047 */, 19 }, - /* 7739 */ { MAD_F(0x04abec3f) /* 0.291973349 */, 19 }, - /* 7740 */ { MAD_F(0x04ac20fe) /* 0.292023653 */, 19 }, - /* 7741 */ { MAD_F(0x04ac55be) /* 0.292073960 */, 19 }, - /* 7742 */ { MAD_F(0x04ac8a7f) /* 0.292124269 */, 19 }, - /* 7743 */ { MAD_F(0x04acbf40) /* 0.292174580 */, 19 }, - - /* 7744 */ { MAD_F(0x04acf402) /* 0.292224893 */, 19 }, - /* 7745 */ { MAD_F(0x04ad28c5) /* 0.292275208 */, 19 }, - /* 7746 */ { MAD_F(0x04ad5d88) /* 0.292325526 */, 19 }, - /* 7747 */ { MAD_F(0x04ad924b) /* 0.292375845 */, 19 }, - /* 7748 */ { MAD_F(0x04adc70f) /* 0.292426167 */, 19 }, - /* 7749 */ { MAD_F(0x04adfbd4) /* 0.292476491 */, 19 }, - /* 7750 */ { MAD_F(0x04ae3099) /* 0.292526817 */, 19 }, - /* 7751 */ { MAD_F(0x04ae655f) /* 0.292577145 */, 19 }, - /* 7752 */ { MAD_F(0x04ae9a26) /* 0.292627476 */, 19 }, - /* 7753 */ { MAD_F(0x04aeceed) /* 0.292677808 */, 19 }, - /* 7754 */ { MAD_F(0x04af03b4) /* 0.292728143 */, 19 }, - /* 7755 */ { MAD_F(0x04af387d) /* 0.292778480 */, 19 }, - /* 7756 */ { MAD_F(0x04af6d45) /* 0.292828819 */, 19 }, - /* 7757 */ { MAD_F(0x04afa20f) /* 0.292879160 */, 19 }, - /* 7758 */ { MAD_F(0x04afd6d9) /* 0.292929504 */, 19 }, - /* 7759 */ { MAD_F(0x04b00ba3) /* 0.292979849 */, 19 }, - - /* 7760 */ { MAD_F(0x04b0406e) /* 0.293030197 */, 19 }, - /* 7761 */ { MAD_F(0x04b0753a) /* 0.293080547 */, 19 }, - /* 7762 */ { MAD_F(0x04b0aa06) /* 0.293130899 */, 19 }, - /* 7763 */ { MAD_F(0x04b0ded3) /* 0.293181253 */, 19 }, - /* 7764 */ { MAD_F(0x04b113a1) /* 0.293231610 */, 19 }, - /* 7765 */ { MAD_F(0x04b1486f) /* 0.293281968 */, 19 }, - /* 7766 */ { MAD_F(0x04b17d3d) /* 0.293332329 */, 19 }, - /* 7767 */ { MAD_F(0x04b1b20c) /* 0.293382692 */, 19 }, - /* 7768 */ { MAD_F(0x04b1e6dc) /* 0.293433057 */, 19 }, - /* 7769 */ { MAD_F(0x04b21bad) /* 0.293483424 */, 19 }, - /* 7770 */ { MAD_F(0x04b2507d) /* 0.293533794 */, 19 }, - /* 7771 */ { MAD_F(0x04b2854f) /* 0.293584165 */, 19 }, - /* 7772 */ { MAD_F(0x04b2ba21) /* 0.293634539 */, 19 }, - /* 7773 */ { MAD_F(0x04b2eef4) /* 0.293684915 */, 19 }, - /* 7774 */ { MAD_F(0x04b323c7) /* 0.293735293 */, 19 }, - /* 7775 */ { MAD_F(0x04b3589b) /* 0.293785673 */, 19 }, - - /* 7776 */ { MAD_F(0x04b38d6f) /* 0.293836055 */, 19 }, - /* 7777 */ { MAD_F(0x04b3c244) /* 0.293886440 */, 19 }, - /* 7778 */ { MAD_F(0x04b3f71a) /* 0.293936826 */, 19 }, - /* 7779 */ { MAD_F(0x04b42bf0) /* 0.293987215 */, 19 }, - /* 7780 */ { MAD_F(0x04b460c7) /* 0.294037606 */, 19 }, - /* 7781 */ { MAD_F(0x04b4959e) /* 0.294087999 */, 19 }, - /* 7782 */ { MAD_F(0x04b4ca76) /* 0.294138395 */, 19 }, - /* 7783 */ { MAD_F(0x04b4ff4e) /* 0.294188792 */, 19 }, - /* 7784 */ { MAD_F(0x04b53427) /* 0.294239192 */, 19 }, - /* 7785 */ { MAD_F(0x04b56901) /* 0.294289593 */, 19 }, - /* 7786 */ { MAD_F(0x04b59ddb) /* 0.294339997 */, 19 }, - /* 7787 */ { MAD_F(0x04b5d2b6) /* 0.294390403 */, 19 }, - /* 7788 */ { MAD_F(0x04b60791) /* 0.294440812 */, 19 }, - /* 7789 */ { MAD_F(0x04b63c6d) /* 0.294491222 */, 19 }, - /* 7790 */ { MAD_F(0x04b6714a) /* 0.294541635 */, 19 }, - /* 7791 */ { MAD_F(0x04b6a627) /* 0.294592049 */, 19 }, - - /* 7792 */ { MAD_F(0x04b6db05) /* 0.294642466 */, 19 }, - /* 7793 */ { MAD_F(0x04b70fe3) /* 0.294692885 */, 19 }, - /* 7794 */ { MAD_F(0x04b744c2) /* 0.294743306 */, 19 }, - /* 7795 */ { MAD_F(0x04b779a1) /* 0.294793730 */, 19 }, - /* 7796 */ { MAD_F(0x04b7ae81) /* 0.294844155 */, 19 }, - /* 7797 */ { MAD_F(0x04b7e362) /* 0.294894583 */, 19 }, - /* 7798 */ { MAD_F(0x04b81843) /* 0.294945013 */, 19 }, - /* 7799 */ { MAD_F(0x04b84d24) /* 0.294995445 */, 19 }, - /* 7800 */ { MAD_F(0x04b88207) /* 0.295045879 */, 19 }, - /* 7801 */ { MAD_F(0x04b8b6ea) /* 0.295096315 */, 19 }, - /* 7802 */ { MAD_F(0x04b8ebcd) /* 0.295146753 */, 19 }, - /* 7803 */ { MAD_F(0x04b920b1) /* 0.295197194 */, 19 }, - /* 7804 */ { MAD_F(0x04b95596) /* 0.295247637 */, 19 }, - /* 7805 */ { MAD_F(0x04b98a7b) /* 0.295298082 */, 19 }, - /* 7806 */ { MAD_F(0x04b9bf61) /* 0.295348529 */, 19 }, - /* 7807 */ { MAD_F(0x04b9f447) /* 0.295398978 */, 19 }, - - /* 7808 */ { MAD_F(0x04ba292e) /* 0.295449429 */, 19 }, - /* 7809 */ { MAD_F(0x04ba5e16) /* 0.295499883 */, 19 }, - /* 7810 */ { MAD_F(0x04ba92fe) /* 0.295550338 */, 19 }, - /* 7811 */ { MAD_F(0x04bac7e6) /* 0.295600796 */, 19 }, - /* 7812 */ { MAD_F(0x04bafcd0) /* 0.295651256 */, 19 }, - /* 7813 */ { MAD_F(0x04bb31b9) /* 0.295701718 */, 19 }, - /* 7814 */ { MAD_F(0x04bb66a4) /* 0.295752183 */, 19 }, - /* 7815 */ { MAD_F(0x04bb9b8f) /* 0.295802649 */, 19 }, - /* 7816 */ { MAD_F(0x04bbd07a) /* 0.295853118 */, 19 }, - /* 7817 */ { MAD_F(0x04bc0566) /* 0.295903588 */, 19 }, - /* 7818 */ { MAD_F(0x04bc3a53) /* 0.295954061 */, 19 }, - /* 7819 */ { MAD_F(0x04bc6f40) /* 0.296004536 */, 19 }, - /* 7820 */ { MAD_F(0x04bca42e) /* 0.296055013 */, 19 }, - /* 7821 */ { MAD_F(0x04bcd91d) /* 0.296105493 */, 19 }, - /* 7822 */ { MAD_F(0x04bd0e0c) /* 0.296155974 */, 19 }, - /* 7823 */ { MAD_F(0x04bd42fb) /* 0.296206458 */, 19 }, - - /* 7824 */ { MAD_F(0x04bd77ec) /* 0.296256944 */, 19 }, - /* 7825 */ { MAD_F(0x04bdacdc) /* 0.296307432 */, 19 }, - /* 7826 */ { MAD_F(0x04bde1ce) /* 0.296357922 */, 19 }, - /* 7827 */ { MAD_F(0x04be16c0) /* 0.296408414 */, 19 }, - /* 7828 */ { MAD_F(0x04be4bb2) /* 0.296458908 */, 19 }, - /* 7829 */ { MAD_F(0x04be80a5) /* 0.296509405 */, 19 }, - /* 7830 */ { MAD_F(0x04beb599) /* 0.296559904 */, 19 }, - /* 7831 */ { MAD_F(0x04beea8d) /* 0.296610404 */, 19 }, - /* 7832 */ { MAD_F(0x04bf1f82) /* 0.296660907 */, 19 }, - /* 7833 */ { MAD_F(0x04bf5477) /* 0.296711413 */, 19 }, - /* 7834 */ { MAD_F(0x04bf896d) /* 0.296761920 */, 19 }, - /* 7835 */ { MAD_F(0x04bfbe64) /* 0.296812429 */, 19 }, - /* 7836 */ { MAD_F(0x04bff35b) /* 0.296862941 */, 19 }, - /* 7837 */ { MAD_F(0x04c02852) /* 0.296913455 */, 19 }, - /* 7838 */ { MAD_F(0x04c05d4b) /* 0.296963971 */, 19 }, - /* 7839 */ { MAD_F(0x04c09243) /* 0.297014489 */, 19 }, - - /* 7840 */ { MAD_F(0x04c0c73d) /* 0.297065009 */, 19 }, - /* 7841 */ { MAD_F(0x04c0fc37) /* 0.297115531 */, 19 }, - /* 7842 */ { MAD_F(0x04c13131) /* 0.297166056 */, 19 }, - /* 7843 */ { MAD_F(0x04c1662d) /* 0.297216582 */, 19 }, - /* 7844 */ { MAD_F(0x04c19b28) /* 0.297267111 */, 19 }, - /* 7845 */ { MAD_F(0x04c1d025) /* 0.297317642 */, 19 }, - /* 7846 */ { MAD_F(0x04c20521) /* 0.297368175 */, 19 }, - /* 7847 */ { MAD_F(0x04c23a1f) /* 0.297418710 */, 19 }, - /* 7848 */ { MAD_F(0x04c26f1d) /* 0.297469248 */, 19 }, - /* 7849 */ { MAD_F(0x04c2a41b) /* 0.297519787 */, 19 }, - /* 7850 */ { MAD_F(0x04c2d91b) /* 0.297570329 */, 19 }, - /* 7851 */ { MAD_F(0x04c30e1a) /* 0.297620873 */, 19 }, - /* 7852 */ { MAD_F(0x04c3431b) /* 0.297671418 */, 19 }, - /* 7853 */ { MAD_F(0x04c3781c) /* 0.297721967 */, 19 }, - /* 7854 */ { MAD_F(0x04c3ad1d) /* 0.297772517 */, 19 }, - /* 7855 */ { MAD_F(0x04c3e21f) /* 0.297823069 */, 19 }, - - /* 7856 */ { MAD_F(0x04c41722) /* 0.297873624 */, 19 }, - /* 7857 */ { MAD_F(0x04c44c25) /* 0.297924180 */, 19 }, - /* 7858 */ { MAD_F(0x04c48129) /* 0.297974739 */, 19 }, - /* 7859 */ { MAD_F(0x04c4b62d) /* 0.298025300 */, 19 }, - /* 7860 */ { MAD_F(0x04c4eb32) /* 0.298075863 */, 19 }, - /* 7861 */ { MAD_F(0x04c52038) /* 0.298126429 */, 19 }, - /* 7862 */ { MAD_F(0x04c5553e) /* 0.298176996 */, 19 }, - /* 7863 */ { MAD_F(0x04c58a44) /* 0.298227565 */, 19 }, - /* 7864 */ { MAD_F(0x04c5bf4c) /* 0.298278137 */, 19 }, - /* 7865 */ { MAD_F(0x04c5f453) /* 0.298328711 */, 19 }, - /* 7866 */ { MAD_F(0x04c6295c) /* 0.298379287 */, 19 }, - /* 7867 */ { MAD_F(0x04c65e65) /* 0.298429865 */, 19 }, - /* 7868 */ { MAD_F(0x04c6936e) /* 0.298480445 */, 19 }, - /* 7869 */ { MAD_F(0x04c6c878) /* 0.298531028 */, 19 }, - /* 7870 */ { MAD_F(0x04c6fd83) /* 0.298581612 */, 19 }, - /* 7871 */ { MAD_F(0x04c7328e) /* 0.298632199 */, 19 }, - - /* 7872 */ { MAD_F(0x04c7679a) /* 0.298682788 */, 19 }, - /* 7873 */ { MAD_F(0x04c79ca7) /* 0.298733379 */, 19 }, - /* 7874 */ { MAD_F(0x04c7d1b4) /* 0.298783972 */, 19 }, - /* 7875 */ { MAD_F(0x04c806c1) /* 0.298834567 */, 19 }, - /* 7876 */ { MAD_F(0x04c83bcf) /* 0.298885165 */, 19 }, - /* 7877 */ { MAD_F(0x04c870de) /* 0.298935764 */, 19 }, - /* 7878 */ { MAD_F(0x04c8a5ed) /* 0.298986366 */, 19 }, - /* 7879 */ { MAD_F(0x04c8dafd) /* 0.299036970 */, 19 }, - /* 7880 */ { MAD_F(0x04c9100d) /* 0.299087576 */, 19 }, - /* 7881 */ { MAD_F(0x04c9451e) /* 0.299138184 */, 19 }, - /* 7882 */ { MAD_F(0x04c97a30) /* 0.299188794 */, 19 }, - /* 7883 */ { MAD_F(0x04c9af42) /* 0.299239406 */, 19 }, - /* 7884 */ { MAD_F(0x04c9e455) /* 0.299290021 */, 19 }, - /* 7885 */ { MAD_F(0x04ca1968) /* 0.299340638 */, 19 }, - /* 7886 */ { MAD_F(0x04ca4e7c) /* 0.299391256 */, 19 }, - /* 7887 */ { MAD_F(0x04ca8391) /* 0.299441877 */, 19 }, - - /* 7888 */ { MAD_F(0x04cab8a6) /* 0.299492500 */, 19 }, - /* 7889 */ { MAD_F(0x04caedbb) /* 0.299543126 */, 19 }, - /* 7890 */ { MAD_F(0x04cb22d1) /* 0.299593753 */, 19 }, - /* 7891 */ { MAD_F(0x04cb57e8) /* 0.299644382 */, 19 }, - /* 7892 */ { MAD_F(0x04cb8d00) /* 0.299695014 */, 19 }, - /* 7893 */ { MAD_F(0x04cbc217) /* 0.299745648 */, 19 }, - /* 7894 */ { MAD_F(0x04cbf730) /* 0.299796284 */, 19 }, - /* 7895 */ { MAD_F(0x04cc2c49) /* 0.299846922 */, 19 }, - /* 7896 */ { MAD_F(0x04cc6163) /* 0.299897562 */, 19 }, - /* 7897 */ { MAD_F(0x04cc967d) /* 0.299948204 */, 19 }, - /* 7898 */ { MAD_F(0x04cccb98) /* 0.299998849 */, 19 }, - /* 7899 */ { MAD_F(0x04cd00b3) /* 0.300049495 */, 19 }, - /* 7900 */ { MAD_F(0x04cd35cf) /* 0.300100144 */, 19 }, - /* 7901 */ { MAD_F(0x04cd6aeb) /* 0.300150795 */, 19 }, - /* 7902 */ { MAD_F(0x04cda008) /* 0.300201448 */, 19 }, - /* 7903 */ { MAD_F(0x04cdd526) /* 0.300252103 */, 19 }, - - /* 7904 */ { MAD_F(0x04ce0a44) /* 0.300302761 */, 19 }, - /* 7905 */ { MAD_F(0x04ce3f63) /* 0.300353420 */, 19 }, - /* 7906 */ { MAD_F(0x04ce7482) /* 0.300404082 */, 19 }, - /* 7907 */ { MAD_F(0x04cea9a2) /* 0.300454745 */, 19 }, - /* 7908 */ { MAD_F(0x04cedec3) /* 0.300505411 */, 19 }, - /* 7909 */ { MAD_F(0x04cf13e4) /* 0.300556079 */, 19 }, - /* 7910 */ { MAD_F(0x04cf4906) /* 0.300606749 */, 19 }, - /* 7911 */ { MAD_F(0x04cf7e28) /* 0.300657421 */, 19 }, - /* 7912 */ { MAD_F(0x04cfb34b) /* 0.300708096 */, 19 }, - /* 7913 */ { MAD_F(0x04cfe86e) /* 0.300758772 */, 19 }, - /* 7914 */ { MAD_F(0x04d01d92) /* 0.300809451 */, 19 }, - /* 7915 */ { MAD_F(0x04d052b6) /* 0.300860132 */, 19 }, - /* 7916 */ { MAD_F(0x04d087db) /* 0.300910815 */, 19 }, - /* 7917 */ { MAD_F(0x04d0bd01) /* 0.300961500 */, 19 }, - /* 7918 */ { MAD_F(0x04d0f227) /* 0.301012187 */, 19 }, - /* 7919 */ { MAD_F(0x04d1274e) /* 0.301062876 */, 19 }, - - /* 7920 */ { MAD_F(0x04d15c76) /* 0.301113568 */, 19 }, - /* 7921 */ { MAD_F(0x04d1919e) /* 0.301164261 */, 19 }, - /* 7922 */ { MAD_F(0x04d1c6c6) /* 0.301214957 */, 19 }, - /* 7923 */ { MAD_F(0x04d1fbef) /* 0.301265655 */, 19 }, - /* 7924 */ { MAD_F(0x04d23119) /* 0.301316355 */, 19 }, - /* 7925 */ { MAD_F(0x04d26643) /* 0.301367057 */, 19 }, - /* 7926 */ { MAD_F(0x04d29b6e) /* 0.301417761 */, 19 }, - /* 7927 */ { MAD_F(0x04d2d099) /* 0.301468468 */, 19 }, - /* 7928 */ { MAD_F(0x04d305c5) /* 0.301519176 */, 19 }, - /* 7929 */ { MAD_F(0x04d33af2) /* 0.301569887 */, 19 }, - /* 7930 */ { MAD_F(0x04d3701f) /* 0.301620599 */, 19 }, - /* 7931 */ { MAD_F(0x04d3a54d) /* 0.301671314 */, 19 }, - /* 7932 */ { MAD_F(0x04d3da7b) /* 0.301722031 */, 19 }, - /* 7933 */ { MAD_F(0x04d40faa) /* 0.301772751 */, 19 }, - /* 7934 */ { MAD_F(0x04d444d9) /* 0.301823472 */, 19 }, - /* 7935 */ { MAD_F(0x04d47a09) /* 0.301874195 */, 19 }, - - /* 7936 */ { MAD_F(0x04d4af3a) /* 0.301924921 */, 19 }, - /* 7937 */ { MAD_F(0x04d4e46b) /* 0.301975649 */, 19 }, - /* 7938 */ { MAD_F(0x04d5199c) /* 0.302026378 */, 19 }, - /* 7939 */ { MAD_F(0x04d54ecf) /* 0.302077110 */, 19 }, - /* 7940 */ { MAD_F(0x04d58401) /* 0.302127845 */, 19 }, - /* 7941 */ { MAD_F(0x04d5b935) /* 0.302178581 */, 19 }, - /* 7942 */ { MAD_F(0x04d5ee69) /* 0.302229319 */, 19 }, - /* 7943 */ { MAD_F(0x04d6239d) /* 0.302280060 */, 19 }, - /* 7944 */ { MAD_F(0x04d658d2) /* 0.302330802 */, 19 }, - /* 7945 */ { MAD_F(0x04d68e08) /* 0.302381547 */, 19 }, - /* 7946 */ { MAD_F(0x04d6c33e) /* 0.302432294 */, 19 }, - /* 7947 */ { MAD_F(0x04d6f875) /* 0.302483043 */, 19 }, - /* 7948 */ { MAD_F(0x04d72dad) /* 0.302533794 */, 19 }, - /* 7949 */ { MAD_F(0x04d762e5) /* 0.302584547 */, 19 }, - /* 7950 */ { MAD_F(0x04d7981d) /* 0.302635303 */, 19 }, - /* 7951 */ { MAD_F(0x04d7cd56) /* 0.302686060 */, 19 }, - - /* 7952 */ { MAD_F(0x04d80290) /* 0.302736820 */, 19 }, - /* 7953 */ { MAD_F(0x04d837ca) /* 0.302787581 */, 19 }, - /* 7954 */ { MAD_F(0x04d86d05) /* 0.302838345 */, 19 }, - /* 7955 */ { MAD_F(0x04d8a240) /* 0.302889111 */, 19 }, - /* 7956 */ { MAD_F(0x04d8d77c) /* 0.302939879 */, 19 }, - /* 7957 */ { MAD_F(0x04d90cb9) /* 0.302990650 */, 19 }, - /* 7958 */ { MAD_F(0x04d941f6) /* 0.303041422 */, 19 }, - /* 7959 */ { MAD_F(0x04d97734) /* 0.303092197 */, 19 }, - /* 7960 */ { MAD_F(0x04d9ac72) /* 0.303142973 */, 19 }, - /* 7961 */ { MAD_F(0x04d9e1b1) /* 0.303193752 */, 19 }, - /* 7962 */ { MAD_F(0x04da16f0) /* 0.303244533 */, 19 }, - /* 7963 */ { MAD_F(0x04da4c30) /* 0.303295316 */, 19 }, - /* 7964 */ { MAD_F(0x04da8171) /* 0.303346101 */, 19 }, - /* 7965 */ { MAD_F(0x04dab6b2) /* 0.303396889 */, 19 }, - /* 7966 */ { MAD_F(0x04daebf4) /* 0.303447678 */, 19 }, - /* 7967 */ { MAD_F(0x04db2136) /* 0.303498469 */, 19 }, - - /* 7968 */ { MAD_F(0x04db5679) /* 0.303549263 */, 19 }, - /* 7969 */ { MAD_F(0x04db8bbc) /* 0.303600059 */, 19 }, - /* 7970 */ { MAD_F(0x04dbc100) /* 0.303650857 */, 19 }, - /* 7971 */ { MAD_F(0x04dbf644) /* 0.303701657 */, 19 }, - /* 7972 */ { MAD_F(0x04dc2b8a) /* 0.303752459 */, 19 }, - /* 7973 */ { MAD_F(0x04dc60cf) /* 0.303803263 */, 19 }, - /* 7974 */ { MAD_F(0x04dc9616) /* 0.303854070 */, 19 }, - /* 7975 */ { MAD_F(0x04dccb5c) /* 0.303904878 */, 19 }, - /* 7976 */ { MAD_F(0x04dd00a4) /* 0.303955689 */, 19 }, - /* 7977 */ { MAD_F(0x04dd35ec) /* 0.304006502 */, 19 }, - /* 7978 */ { MAD_F(0x04dd6b34) /* 0.304057317 */, 19 }, - /* 7979 */ { MAD_F(0x04dda07d) /* 0.304108134 */, 19 }, - /* 7980 */ { MAD_F(0x04ddd5c7) /* 0.304158953 */, 19 }, - /* 7981 */ { MAD_F(0x04de0b11) /* 0.304209774 */, 19 }, - /* 7982 */ { MAD_F(0x04de405c) /* 0.304260597 */, 19 }, - /* 7983 */ { MAD_F(0x04de75a7) /* 0.304311423 */, 19 }, - - /* 7984 */ { MAD_F(0x04deaaf3) /* 0.304362251 */, 19 }, - /* 7985 */ { MAD_F(0x04dee040) /* 0.304413080 */, 19 }, - /* 7986 */ { MAD_F(0x04df158d) /* 0.304463912 */, 19 }, - /* 7987 */ { MAD_F(0x04df4adb) /* 0.304514746 */, 19 }, - /* 7988 */ { MAD_F(0x04df8029) /* 0.304565582 */, 19 }, - /* 7989 */ { MAD_F(0x04dfb578) /* 0.304616421 */, 19 }, - /* 7990 */ { MAD_F(0x04dfeac7) /* 0.304667261 */, 19 }, - /* 7991 */ { MAD_F(0x04e02017) /* 0.304718103 */, 19 }, - /* 7992 */ { MAD_F(0x04e05567) /* 0.304768948 */, 19 }, - /* 7993 */ { MAD_F(0x04e08ab8) /* 0.304819795 */, 19 }, - /* 7994 */ { MAD_F(0x04e0c00a) /* 0.304870644 */, 19 }, - /* 7995 */ { MAD_F(0x04e0f55c) /* 0.304921495 */, 19 }, - /* 7996 */ { MAD_F(0x04e12aaf) /* 0.304972348 */, 19 }, - /* 7997 */ { MAD_F(0x04e16002) /* 0.305023203 */, 19 }, - /* 7998 */ { MAD_F(0x04e19556) /* 0.305074060 */, 19 }, - /* 7999 */ { MAD_F(0x04e1caab) /* 0.305124920 */, 19 }, - - /* 8000 */ { MAD_F(0x04e20000) /* 0.305175781 */, 19 }, - /* 8001 */ { MAD_F(0x04e23555) /* 0.305226645 */, 19 }, - /* 8002 */ { MAD_F(0x04e26aac) /* 0.305277511 */, 19 }, - /* 8003 */ { MAD_F(0x04e2a002) /* 0.305328379 */, 19 }, - /* 8004 */ { MAD_F(0x04e2d55a) /* 0.305379249 */, 19 }, - /* 8005 */ { MAD_F(0x04e30ab2) /* 0.305430121 */, 19 }, - /* 8006 */ { MAD_F(0x04e3400a) /* 0.305480995 */, 19 }, - /* 8007 */ { MAD_F(0x04e37563) /* 0.305531872 */, 19 }, - /* 8008 */ { MAD_F(0x04e3aabd) /* 0.305582750 */, 19 }, - /* 8009 */ { MAD_F(0x04e3e017) /* 0.305633631 */, 19 }, - /* 8010 */ { MAD_F(0x04e41572) /* 0.305684513 */, 19 }, - /* 8011 */ { MAD_F(0x04e44acd) /* 0.305735398 */, 19 }, - /* 8012 */ { MAD_F(0x04e48029) /* 0.305786285 */, 19 }, - /* 8013 */ { MAD_F(0x04e4b585) /* 0.305837174 */, 19 }, - /* 8014 */ { MAD_F(0x04e4eae2) /* 0.305888066 */, 19 }, - /* 8015 */ { MAD_F(0x04e52040) /* 0.305938959 */, 19 }, - - /* 8016 */ { MAD_F(0x04e5559e) /* 0.305989854 */, 19 }, - /* 8017 */ { MAD_F(0x04e58afd) /* 0.306040752 */, 19 }, - /* 8018 */ { MAD_F(0x04e5c05c) /* 0.306091652 */, 19 }, - /* 8019 */ { MAD_F(0x04e5f5bc) /* 0.306142554 */, 19 }, - /* 8020 */ { MAD_F(0x04e62b1c) /* 0.306193457 */, 19 }, - /* 8021 */ { MAD_F(0x04e6607d) /* 0.306244364 */, 19 }, - /* 8022 */ { MAD_F(0x04e695df) /* 0.306295272 */, 19 }, - /* 8023 */ { MAD_F(0x04e6cb41) /* 0.306346182 */, 19 }, - /* 8024 */ { MAD_F(0x04e700a3) /* 0.306397094 */, 19 }, - /* 8025 */ { MAD_F(0x04e73607) /* 0.306448009 */, 19 }, - /* 8026 */ { MAD_F(0x04e76b6b) /* 0.306498925 */, 19 }, - /* 8027 */ { MAD_F(0x04e7a0cf) /* 0.306549844 */, 19 }, - /* 8028 */ { MAD_F(0x04e7d634) /* 0.306600765 */, 19 }, - /* 8029 */ { MAD_F(0x04e80b99) /* 0.306651688 */, 19 }, - /* 8030 */ { MAD_F(0x04e84100) /* 0.306702613 */, 19 }, - /* 8031 */ { MAD_F(0x04e87666) /* 0.306753540 */, 19 }, - - /* 8032 */ { MAD_F(0x04e8abcd) /* 0.306804470 */, 19 }, - /* 8033 */ { MAD_F(0x04e8e135) /* 0.306855401 */, 19 }, - /* 8034 */ { MAD_F(0x04e9169e) /* 0.306906334 */, 19 }, - /* 8035 */ { MAD_F(0x04e94c07) /* 0.306957270 */, 19 }, - /* 8036 */ { MAD_F(0x04e98170) /* 0.307008208 */, 19 }, - /* 8037 */ { MAD_F(0x04e9b6da) /* 0.307059148 */, 19 }, - /* 8038 */ { MAD_F(0x04e9ec45) /* 0.307110090 */, 19 }, - /* 8039 */ { MAD_F(0x04ea21b0) /* 0.307161034 */, 19 }, - /* 8040 */ { MAD_F(0x04ea571c) /* 0.307211980 */, 19 }, - /* 8041 */ { MAD_F(0x04ea8c88) /* 0.307262928 */, 19 }, - /* 8042 */ { MAD_F(0x04eac1f5) /* 0.307313879 */, 19 }, - /* 8043 */ { MAD_F(0x04eaf762) /* 0.307364831 */, 19 }, - /* 8044 */ { MAD_F(0x04eb2cd0) /* 0.307415786 */, 19 }, - /* 8045 */ { MAD_F(0x04eb623f) /* 0.307466743 */, 19 }, - /* 8046 */ { MAD_F(0x04eb97ae) /* 0.307517702 */, 19 }, - /* 8047 */ { MAD_F(0x04ebcd1e) /* 0.307568663 */, 19 }, - - /* 8048 */ { MAD_F(0x04ec028e) /* 0.307619626 */, 19 }, - /* 8049 */ { MAD_F(0x04ec37ff) /* 0.307670591 */, 19 }, - /* 8050 */ { MAD_F(0x04ec6d71) /* 0.307721558 */, 19 }, - /* 8051 */ { MAD_F(0x04eca2e3) /* 0.307772528 */, 19 }, - /* 8052 */ { MAD_F(0x04ecd855) /* 0.307823499 */, 19 }, - /* 8053 */ { MAD_F(0x04ed0dc8) /* 0.307874473 */, 19 }, - /* 8054 */ { MAD_F(0x04ed433c) /* 0.307925449 */, 19 }, - /* 8055 */ { MAD_F(0x04ed78b0) /* 0.307976426 */, 19 }, - /* 8056 */ { MAD_F(0x04edae25) /* 0.308027406 */, 19 }, - /* 8057 */ { MAD_F(0x04ede39a) /* 0.308078389 */, 19 }, - /* 8058 */ { MAD_F(0x04ee1910) /* 0.308129373 */, 19 }, - /* 8059 */ { MAD_F(0x04ee4e87) /* 0.308180359 */, 19 }, - /* 8060 */ { MAD_F(0x04ee83fe) /* 0.308231347 */, 19 }, - /* 8061 */ { MAD_F(0x04eeb976) /* 0.308282338 */, 19 }, - /* 8062 */ { MAD_F(0x04eeeeee) /* 0.308333331 */, 19 }, - /* 8063 */ { MAD_F(0x04ef2467) /* 0.308384325 */, 19 }, - - /* 8064 */ { MAD_F(0x04ef59e0) /* 0.308435322 */, 19 }, - /* 8065 */ { MAD_F(0x04ef8f5a) /* 0.308486321 */, 19 }, - /* 8066 */ { MAD_F(0x04efc4d5) /* 0.308537322 */, 19 }, - /* 8067 */ { MAD_F(0x04effa50) /* 0.308588325 */, 19 }, - /* 8068 */ { MAD_F(0x04f02fcb) /* 0.308639331 */, 19 }, - /* 8069 */ { MAD_F(0x04f06547) /* 0.308690338 */, 19 }, - /* 8070 */ { MAD_F(0x04f09ac4) /* 0.308741348 */, 19 }, - /* 8071 */ { MAD_F(0x04f0d041) /* 0.308792359 */, 19 }, - /* 8072 */ { MAD_F(0x04f105bf) /* 0.308843373 */, 19 }, - /* 8073 */ { MAD_F(0x04f13b3e) /* 0.308894389 */, 19 }, - /* 8074 */ { MAD_F(0x04f170bd) /* 0.308945407 */, 19 }, - /* 8075 */ { MAD_F(0x04f1a63c) /* 0.308996427 */, 19 }, - /* 8076 */ { MAD_F(0x04f1dbbd) /* 0.309047449 */, 19 }, - /* 8077 */ { MAD_F(0x04f2113d) /* 0.309098473 */, 19 }, - /* 8078 */ { MAD_F(0x04f246bf) /* 0.309149499 */, 19 }, - /* 8079 */ { MAD_F(0x04f27c40) /* 0.309200528 */, 19 }, - - /* 8080 */ { MAD_F(0x04f2b1c3) /* 0.309251558 */, 19 }, - /* 8081 */ { MAD_F(0x04f2e746) /* 0.309302591 */, 19 }, - /* 8082 */ { MAD_F(0x04f31cc9) /* 0.309353626 */, 19 }, - /* 8083 */ { MAD_F(0x04f3524d) /* 0.309404663 */, 19 }, - /* 8084 */ { MAD_F(0x04f387d2) /* 0.309455702 */, 19 }, - /* 8085 */ { MAD_F(0x04f3bd57) /* 0.309506743 */, 19 }, - /* 8086 */ { MAD_F(0x04f3f2dd) /* 0.309557786 */, 19 }, - /* 8087 */ { MAD_F(0x04f42864) /* 0.309608831 */, 19 }, - /* 8088 */ { MAD_F(0x04f45dea) /* 0.309659879 */, 19 }, - /* 8089 */ { MAD_F(0x04f49372) /* 0.309710928 */, 19 }, - /* 8090 */ { MAD_F(0x04f4c8fa) /* 0.309761980 */, 19 }, - /* 8091 */ { MAD_F(0x04f4fe83) /* 0.309813033 */, 19 }, - /* 8092 */ { MAD_F(0x04f5340c) /* 0.309864089 */, 19 }, - /* 8093 */ { MAD_F(0x04f56996) /* 0.309915147 */, 19 }, - /* 8094 */ { MAD_F(0x04f59f20) /* 0.309966207 */, 19 }, - /* 8095 */ { MAD_F(0x04f5d4ab) /* 0.310017269 */, 19 }, - - /* 8096 */ { MAD_F(0x04f60a36) /* 0.310068333 */, 19 }, - /* 8097 */ { MAD_F(0x04f63fc2) /* 0.310119400 */, 19 }, - /* 8098 */ { MAD_F(0x04f6754f) /* 0.310170468 */, 19 }, - /* 8099 */ { MAD_F(0x04f6aadc) /* 0.310221539 */, 19 }, - /* 8100 */ { MAD_F(0x04f6e06a) /* 0.310272611 */, 19 }, - /* 8101 */ { MAD_F(0x04f715f8) /* 0.310323686 */, 19 }, - /* 8102 */ { MAD_F(0x04f74b87) /* 0.310374763 */, 19 }, - /* 8103 */ { MAD_F(0x04f78116) /* 0.310425842 */, 19 }, - /* 8104 */ { MAD_F(0x04f7b6a6) /* 0.310476923 */, 19 }, - /* 8105 */ { MAD_F(0x04f7ec37) /* 0.310528006 */, 19 }, - /* 8106 */ { MAD_F(0x04f821c8) /* 0.310579091 */, 19 }, - /* 8107 */ { MAD_F(0x04f85759) /* 0.310630179 */, 19 }, - /* 8108 */ { MAD_F(0x04f88cec) /* 0.310681268 */, 19 }, - /* 8109 */ { MAD_F(0x04f8c27e) /* 0.310732360 */, 19 }, - /* 8110 */ { MAD_F(0x04f8f812) /* 0.310783453 */, 19 }, - /* 8111 */ { MAD_F(0x04f92da6) /* 0.310834549 */, 19 }, - - /* 8112 */ { MAD_F(0x04f9633a) /* 0.310885647 */, 19 }, - /* 8113 */ { MAD_F(0x04f998cf) /* 0.310936747 */, 19 }, - /* 8114 */ { MAD_F(0x04f9ce65) /* 0.310987849 */, 19 }, - /* 8115 */ { MAD_F(0x04fa03fb) /* 0.311038953 */, 19 }, - /* 8116 */ { MAD_F(0x04fa3992) /* 0.311090059 */, 19 }, - /* 8117 */ { MAD_F(0x04fa6f29) /* 0.311141168 */, 19 }, - /* 8118 */ { MAD_F(0x04faa4c1) /* 0.311192278 */, 19 }, - /* 8119 */ { MAD_F(0x04fada59) /* 0.311243390 */, 19 }, - /* 8120 */ { MAD_F(0x04fb0ff2) /* 0.311294505 */, 19 }, - /* 8121 */ { MAD_F(0x04fb458c) /* 0.311345622 */, 19 }, - /* 8122 */ { MAD_F(0x04fb7b26) /* 0.311396741 */, 19 }, - /* 8123 */ { MAD_F(0x04fbb0c1) /* 0.311447862 */, 19 }, - /* 8124 */ { MAD_F(0x04fbe65c) /* 0.311498985 */, 19 }, - /* 8125 */ { MAD_F(0x04fc1bf8) /* 0.311550110 */, 19 }, - /* 8126 */ { MAD_F(0x04fc5194) /* 0.311601237 */, 19 }, - /* 8127 */ { MAD_F(0x04fc8731) /* 0.311652366 */, 19 }, - - /* 8128 */ { MAD_F(0x04fcbcce) /* 0.311703498 */, 19 }, - /* 8129 */ { MAD_F(0x04fcf26c) /* 0.311754631 */, 19 }, - /* 8130 */ { MAD_F(0x04fd280b) /* 0.311805767 */, 19 }, - /* 8131 */ { MAD_F(0x04fd5daa) /* 0.311856905 */, 19 }, - /* 8132 */ { MAD_F(0x04fd934a) /* 0.311908044 */, 19 }, - /* 8133 */ { MAD_F(0x04fdc8ea) /* 0.311959186 */, 19 }, - /* 8134 */ { MAD_F(0x04fdfe8b) /* 0.312010330 */, 19 }, - /* 8135 */ { MAD_F(0x04fe342c) /* 0.312061476 */, 19 }, - /* 8136 */ { MAD_F(0x04fe69ce) /* 0.312112625 */, 19 }, - /* 8137 */ { MAD_F(0x04fe9f71) /* 0.312163775 */, 19 }, - /* 8138 */ { MAD_F(0x04fed514) /* 0.312214927 */, 19 }, - /* 8139 */ { MAD_F(0x04ff0ab8) /* 0.312266082 */, 19 }, - /* 8140 */ { MAD_F(0x04ff405c) /* 0.312317238 */, 19 }, - /* 8141 */ { MAD_F(0x04ff7601) /* 0.312368397 */, 19 }, - /* 8142 */ { MAD_F(0x04ffaba6) /* 0.312419558 */, 19 }, - /* 8143 */ { MAD_F(0x04ffe14c) /* 0.312470720 */, 19 }, - - /* 8144 */ { MAD_F(0x050016f3) /* 0.312521885 */, 19 }, - /* 8145 */ { MAD_F(0x05004c9a) /* 0.312573052 */, 19 }, - /* 8146 */ { MAD_F(0x05008241) /* 0.312624222 */, 19 }, - /* 8147 */ { MAD_F(0x0500b7e9) /* 0.312675393 */, 19 }, - /* 8148 */ { MAD_F(0x0500ed92) /* 0.312726566 */, 19 }, - /* 8149 */ { MAD_F(0x0501233b) /* 0.312777742 */, 19 }, - /* 8150 */ { MAD_F(0x050158e5) /* 0.312828919 */, 19 }, - /* 8151 */ { MAD_F(0x05018e90) /* 0.312880099 */, 19 }, - /* 8152 */ { MAD_F(0x0501c43b) /* 0.312931280 */, 19 }, - /* 8153 */ { MAD_F(0x0501f9e6) /* 0.312982464 */, 19 }, - /* 8154 */ { MAD_F(0x05022f92) /* 0.313033650 */, 19 }, - /* 8155 */ { MAD_F(0x0502653f) /* 0.313084838 */, 19 }, - /* 8156 */ { MAD_F(0x05029aec) /* 0.313136028 */, 19 }, - /* 8157 */ { MAD_F(0x0502d09a) /* 0.313187220 */, 19 }, - /* 8158 */ { MAD_F(0x05030648) /* 0.313238414 */, 19 }, - /* 8159 */ { MAD_F(0x05033bf7) /* 0.313289611 */, 19 }, - - /* 8160 */ { MAD_F(0x050371a7) /* 0.313340809 */, 19 }, - /* 8161 */ { MAD_F(0x0503a757) /* 0.313392010 */, 19 }, - /* 8162 */ { MAD_F(0x0503dd07) /* 0.313443212 */, 19 }, - /* 8163 */ { MAD_F(0x050412b9) /* 0.313494417 */, 19 }, - /* 8164 */ { MAD_F(0x0504486a) /* 0.313545624 */, 19 }, - /* 8165 */ { MAD_F(0x05047e1d) /* 0.313596833 */, 19 }, - /* 8166 */ { MAD_F(0x0504b3cf) /* 0.313648044 */, 19 }, - /* 8167 */ { MAD_F(0x0504e983) /* 0.313699257 */, 19 }, - /* 8168 */ { MAD_F(0x05051f37) /* 0.313750472 */, 19 }, - /* 8169 */ { MAD_F(0x050554eb) /* 0.313801689 */, 19 }, - /* 8170 */ { MAD_F(0x05058aa0) /* 0.313852909 */, 19 }, - /* 8171 */ { MAD_F(0x0505c056) /* 0.313904130 */, 19 }, - /* 8172 */ { MAD_F(0x0505f60c) /* 0.313955354 */, 19 }, - /* 8173 */ { MAD_F(0x05062bc3) /* 0.314006579 */, 19 }, - /* 8174 */ { MAD_F(0x0506617a) /* 0.314057807 */, 19 }, - /* 8175 */ { MAD_F(0x05069732) /* 0.314109037 */, 19 }, - - /* 8176 */ { MAD_F(0x0506cceb) /* 0.314160269 */, 19 }, - /* 8177 */ { MAD_F(0x050702a4) /* 0.314211502 */, 19 }, - /* 8178 */ { MAD_F(0x0507385d) /* 0.314262739 */, 19 }, - /* 8179 */ { MAD_F(0x05076e17) /* 0.314313977 */, 19 }, - /* 8180 */ { MAD_F(0x0507a3d2) /* 0.314365217 */, 19 }, - /* 8181 */ { MAD_F(0x0507d98d) /* 0.314416459 */, 19 }, - /* 8182 */ { MAD_F(0x05080f49) /* 0.314467704 */, 19 }, - /* 8183 */ { MAD_F(0x05084506) /* 0.314518950 */, 19 }, - /* 8184 */ { MAD_F(0x05087ac2) /* 0.314570199 */, 19 }, - /* 8185 */ { MAD_F(0x0508b080) /* 0.314621449 */, 19 }, - /* 8186 */ { MAD_F(0x0508e63e) /* 0.314672702 */, 19 }, - /* 8187 */ { MAD_F(0x05091bfd) /* 0.314723957 */, 19 }, - /* 8188 */ { MAD_F(0x050951bc) /* 0.314775214 */, 19 }, - /* 8189 */ { MAD_F(0x0509877c) /* 0.314826473 */, 19 }, - /* 8190 */ { MAD_F(0x0509bd3c) /* 0.314877734 */, 19 }, - /* 8191 */ { MAD_F(0x0509f2fd) /* 0.314928997 */, 19 }, - - /* 8192 */ { MAD_F(0x050a28be) /* 0.314980262 */, 19 }, - /* 8193 */ { MAD_F(0x050a5e80) /* 0.315031530 */, 19 }, - /* 8194 */ { MAD_F(0x050a9443) /* 0.315082799 */, 19 }, - /* 8195 */ { MAD_F(0x050aca06) /* 0.315134071 */, 19 }, - /* 8196 */ { MAD_F(0x050affc9) /* 0.315185344 */, 19 }, - /* 8197 */ { MAD_F(0x050b358e) /* 0.315236620 */, 19 }, - /* 8198 */ { MAD_F(0x050b6b52) /* 0.315287898 */, 19 }, - /* 8199 */ { MAD_F(0x050ba118) /* 0.315339178 */, 19 }, - /* 8200 */ { MAD_F(0x050bd6de) /* 0.315390460 */, 19 }, - /* 8201 */ { MAD_F(0x050c0ca4) /* 0.315441744 */, 19 }, - /* 8202 */ { MAD_F(0x050c426b) /* 0.315493030 */, 19 }, - /* 8203 */ { MAD_F(0x050c7833) /* 0.315544318 */, 19 }, - /* 8204 */ { MAD_F(0x050cadfb) /* 0.315595608 */, 19 }, - /* 8205 */ { MAD_F(0x050ce3c4) /* 0.315646901 */, 19 }, - /* 8206 */ { MAD_F(0x050d198d) /* 0.315698195 */, 19 } diff --git a/src/libmad/sf_table.dat b/src/libmad/sf_table.dat deleted file mode 100644 index ea7a1c191..000000000 --- a/src/libmad/sf_table.dat +++ /dev/null @@ -1,100 +0,0 @@ -/* - * libmad - MPEG audio decoder library - * Copyright (C) 2000-2001 Robert Leslie - * - * 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: sf_table.dat,v 1.2 2002/04/30 18:46:58 miguelfreitas Exp $ - */ - -/* - * These are the scalefactor values for Layer I and Layer II. - * The values are from Table B.1 of ISO/IEC 11172-3. - * - * There is some error introduced by the 32-bit fixed-point representation; - * the amount of error is shown. For 16-bit PCM output, this shouldn't be - * too much of a problem. - */ - - MAD_F(0x20000000), /* 2.000000000000 => 2.000000000000, e 0.000000000000 */ - MAD_F(0x1965fea5), /* 1.587401051968 => 1.587401051074, e 0.000000000894 */ - MAD_F(0x1428a2fa), /* 1.259921049895 => 1.259921051562, e -0.000000001667 */ - MAD_F(0x10000000), /* 1.000000000000 => 1.000000000000, e 0.000000000000 */ - MAD_F(0x0cb2ff53), /* 0.793700525984 => 0.793700527400, e -0.000000001416 */ - MAD_F(0x0a14517d), /* 0.629960524947 => 0.629960525781, e -0.000000000833 */ - MAD_F(0x08000000), /* 0.500000000000 => 0.500000000000, e 0.000000000000 */ - MAD_F(0x06597fa9), /* 0.396850262992 => 0.396850261837, e 0.000000001155 */ - - MAD_F(0x050a28be), /* 0.314980262474 => 0.314980261028, e 0.000000001446 */ - MAD_F(0x04000000), /* 0.250000000000 => 0.250000000000, e 0.000000000000 */ - MAD_F(0x032cbfd5), /* 0.198425131496 => 0.198425132781, e -0.000000001285 */ - MAD_F(0x0285145f), /* 0.157490131237 => 0.157490130514, e 0.000000000723 */ - MAD_F(0x02000000), /* 0.125000000000 => 0.125000000000, e 0.000000000000 */ - MAD_F(0x01965fea), /* 0.099212565748 => 0.099212564528, e 0.000000001220 */ - MAD_F(0x01428a30), /* 0.078745065618 => 0.078745067120, e -0.000000001501 */ - MAD_F(0x01000000), /* 0.062500000000 => 0.062500000000, e 0.000000000000 */ - - MAD_F(0x00cb2ff5), /* 0.049606282874 => 0.049606282264, e 0.000000000610 */ - MAD_F(0x00a14518), /* 0.039372532809 => 0.039372533560, e -0.000000000751 */ - MAD_F(0x00800000), /* 0.031250000000 => 0.031250000000, e 0.000000000000 */ - MAD_F(0x006597fb), /* 0.024803141437 => 0.024803142995, e -0.000000001558 */ - MAD_F(0x0050a28c), /* 0.019686266405 => 0.019686266780, e -0.000000000375 */ - MAD_F(0x00400000), /* 0.015625000000 => 0.015625000000, e 0.000000000000 */ - MAD_F(0x0032cbfd), /* 0.012401570719 => 0.012401569635, e 0.000000001084 */ - MAD_F(0x00285146), /* 0.009843133202 => 0.009843133390, e -0.000000000188 */ - - MAD_F(0x00200000), /* 0.007812500000 => 0.007812500000, e 0.000000000000 */ - MAD_F(0x001965ff), /* 0.006200785359 => 0.006200786680, e -0.000000001321 */ - MAD_F(0x001428a3), /* 0.004921566601 => 0.004921566695, e -0.000000000094 */ - MAD_F(0x00100000), /* 0.003906250000 => 0.003906250000, e 0.000000000000 */ - MAD_F(0x000cb2ff), /* 0.003100392680 => 0.003100391477, e 0.000000001202 */ - MAD_F(0x000a1451), /* 0.002460783301 => 0.002460781485, e 0.000000001816 */ - MAD_F(0x00080000), /* 0.001953125000 => 0.001953125000, e 0.000000000000 */ - MAD_F(0x00065980), /* 0.001550196340 => 0.001550197601, e -0.000000001262 */ - - MAD_F(0x00050a29), /* 0.001230391650 => 0.001230392605, e -0.000000000955 */ - MAD_F(0x00040000), /* 0.000976562500 => 0.000976562500, e 0.000000000000 */ - MAD_F(0x00032cc0), /* 0.000775098170 => 0.000775098801, e -0.000000000631 */ - MAD_F(0x00028514), /* 0.000615195825 => 0.000615194440, e 0.000000001385 */ - MAD_F(0x00020000), /* 0.000488281250 => 0.000488281250, e 0.000000000000 */ - MAD_F(0x00019660), /* 0.000387549085 => 0.000387549400, e -0.000000000315 */ - MAD_F(0x0001428a), /* 0.000307597913 => 0.000307597220, e 0.000000000693 */ - MAD_F(0x00010000), /* 0.000244140625 => 0.000244140625, e 0.000000000000 */ - - MAD_F(0x0000cb30), /* 0.000193774542 => 0.000193774700, e -0.000000000158 */ - MAD_F(0x0000a145), /* 0.000153798956 => 0.000153798610, e 0.000000000346 */ - MAD_F(0x00008000), /* 0.000122070313 => 0.000122070313, e 0.000000000000 */ - MAD_F(0x00006598), /* 0.000096887271 => 0.000096887350, e -0.000000000079 */ - MAD_F(0x000050a3), /* 0.000076899478 => 0.000076901168, e -0.000000001689 */ - MAD_F(0x00004000), /* 0.000061035156 => 0.000061035156, e 0.000000000000 */ - MAD_F(0x000032cc), /* 0.000048443636 => 0.000048443675, e -0.000000000039 */ - MAD_F(0x00002851), /* 0.000038449739 => 0.000038448721, e 0.000000001018 */ - - MAD_F(0x00002000), /* 0.000030517578 => 0.000030517578, e 0.000000000000 */ - MAD_F(0x00001966), /* 0.000024221818 => 0.000024221838, e -0.000000000020 */ - MAD_F(0x00001429), /* 0.000019224870 => 0.000019226223, e -0.000000001354 */ - MAD_F(0x00001000), /* 0.000015258789 => 0.000015258789, e -0.000000000000 */ - MAD_F(0x00000cb3), /* 0.000012110909 => 0.000012110919, e -0.000000000010 */ - MAD_F(0x00000a14), /* 0.000009612435 => 0.000009611249, e 0.000000001186 */ - MAD_F(0x00000800), /* 0.000007629395 => 0.000007629395, e -0.000000000000 */ - MAD_F(0x00000659), /* 0.000006055454 => 0.000006053597, e 0.000000001858 */ - - MAD_F(0x0000050a), /* 0.000004806217 => 0.000004805624, e 0.000000000593 */ - MAD_F(0x00000400), /* 0.000003814697 => 0.000003814697, e 0.000000000000 */ - MAD_F(0x0000032d), /* 0.000003027727 => 0.000003028661, e -0.000000000934 */ - MAD_F(0x00000285), /* 0.000002403109 => 0.000002402812, e 0.000000000296 */ - MAD_F(0x00000200), /* 0.000001907349 => 0.000001907349, e -0.000000000000 */ - MAD_F(0x00000196), /* 0.000001513864 => 0.000001512468, e 0.000000001396 */ - MAD_F(0x00000143) /* 0.000001201554 => 0.000001203269, e -0.000000001714 */ diff --git a/src/libmad/stream.c b/src/libmad/stream.c deleted file mode 100644 index fecc87434..000000000 --- a/src/libmad/stream.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - * 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: stream.c,v 1.3 2004/04/22 00:23:07 miguelfreitas Exp $ - */ - -# ifdef HAVE_CONFIG_H -# include "config.h" -# endif - -# include "global.h" - -# include <stdlib.h> - -# include "bit.h" -# include "stream.h" - -/* - * NAME: stream->init() - * DESCRIPTION: initialize stream struct - */ -void mad_stream_init(struct mad_stream *stream) -{ - stream->buffer = 0; - stream->bufend = 0; - stream->skiplen = 0; - - stream->sync = 0; - stream->freerate = 0; - - stream->this_frame = 0; - stream->next_frame = 0; - mad_bit_init(&stream->ptr, 0); - - mad_bit_init(&stream->anc_ptr, 0); - stream->anc_bitlen = 0; - - stream->main_data = 0; - stream->md_len = 0; - - stream->options = 0; - stream->error = MAD_ERROR_NONE; -} - -/* - * NAME: stream->finish() - * DESCRIPTION: deallocate any dynamic memory associated with stream - */ -void mad_stream_finish(struct mad_stream *stream) -{ - if (stream->main_data) { - free(stream->main_data); - stream->main_data = 0; - } - - mad_bit_finish(&stream->anc_ptr); - mad_bit_finish(&stream->ptr); -} - -/* - * NAME: stream->buffer() - * DESCRIPTION: set stream buffer pointers - */ -void mad_stream_buffer(struct mad_stream *stream, - unsigned char const *buffer, unsigned long length) -{ - stream->buffer = buffer; - stream->bufend = buffer + length; - - stream->this_frame = buffer; - stream->next_frame = buffer; - - stream->sync = 1; - - mad_bit_init(&stream->ptr, buffer); -} - -/* - * NAME: stream->skip() - * DESCRIPTION: arrange to skip bytes before the next frame - */ -void mad_stream_skip(struct mad_stream *stream, unsigned long length) -{ - stream->skiplen += length; -} - -/* - * NAME: stream->sync() - * DESCRIPTION: locate the next stream sync word - */ -int mad_stream_sync(struct mad_stream *stream) -{ - register unsigned char const *ptr, *end; - - ptr = mad_bit_nextbyte(&stream->ptr); - end = stream->bufend; - - while (ptr < end - 1 && - !(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) - ++ptr; - - if (end - ptr < MAD_BUFFER_GUARD) - return -1; - - mad_bit_init(&stream->ptr, ptr); - - return 0; -} - -/* - * NAME: stream->errorstr() - * DESCRIPTION: return a string description of the current error condition - */ -char const *mad_stream_errorstr(struct mad_stream const *stream) -{ - switch (stream->error) { - case MAD_ERROR_NONE: return "no error"; - - case MAD_ERROR_BUFLEN: return "input buffer too small (or EOF)"; - case MAD_ERROR_BUFPTR: return "invalid (null) buffer pointer"; - - case MAD_ERROR_NOMEM: return "not enough memory"; - - case MAD_ERROR_LOSTSYNC: return "lost synchronization"; - case MAD_ERROR_BADLAYER: return "reserved header layer value"; - case MAD_ERROR_BADBITRATE: return "forbidden bitrate value"; - case MAD_ERROR_BADSAMPLERATE: return "reserved sample frequency value"; - case MAD_ERROR_BADEMPHASIS: return "reserved emphasis value"; - - case MAD_ERROR_BADCRC: return "CRC check failed"; - case MAD_ERROR_BADBITALLOC: return "forbidden bit allocation value"; - case MAD_ERROR_BADSCALEFACTOR: return "bad scalefactor index"; - case MAD_ERROR_BADMODE: return "bad bitrate/mode combination"; - case MAD_ERROR_BADFRAMELEN: return "bad frame length"; - case MAD_ERROR_BADBIGVALUES: return "bad big_values count"; - case MAD_ERROR_BADBLOCKTYPE: return "reserved block_type"; - case MAD_ERROR_BADSCFSI: return "bad scalefactor selection info"; - case MAD_ERROR_BADDATAPTR: return "bad main_data_begin pointer"; - case MAD_ERROR_BADPART3LEN: return "bad audio data length"; - case MAD_ERROR_BADHUFFTABLE: return "bad Huffman table select"; - case MAD_ERROR_BADHUFFDATA: return "Huffman data overrun"; - case MAD_ERROR_BADSTEREO: return "incompatible block_type for JS"; - } - - return 0; -} diff --git a/src/libmad/stream.h b/src/libmad/stream.h deleted file mode 100644 index b99b87582..000000000 --- a/src/libmad/stream.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * 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: stream.h,v 1.3 2004/04/22 00:23:12 miguelfreitas Exp $ - */ - -# ifndef LIBMAD_STREAM_H -# define LIBMAD_STREAM_H - -# include "bit.h" - -# define MAD_BUFFER_GUARD 8 -# define MAD_BUFFER_MDLEN (511 + 2048 + MAD_BUFFER_GUARD) - -enum mad_error { - MAD_ERROR_NONE = 0x0000, /* no error */ - - MAD_ERROR_BUFLEN = 0x0001, /* input buffer too small (or EOF) */ - MAD_ERROR_BUFPTR = 0x0002, /* invalid (null) buffer pointer */ - - MAD_ERROR_NOMEM = 0x0031, /* not enough memory */ - - MAD_ERROR_LOSTSYNC = 0x0101, /* lost synchronization */ - MAD_ERROR_BADLAYER = 0x0102, /* reserved header layer value */ - MAD_ERROR_BADBITRATE = 0x0103, /* forbidden bitrate value */ - MAD_ERROR_BADSAMPLERATE = 0x0104, /* reserved sample frequency value */ - MAD_ERROR_BADEMPHASIS = 0x0105, /* reserved emphasis value */ - - MAD_ERROR_BADCRC = 0x0201, /* CRC check failed */ - MAD_ERROR_BADBITALLOC = 0x0211, /* forbidden bit allocation value */ - MAD_ERROR_BADSCALEFACTOR = 0x0221, /* bad scalefactor index */ - MAD_ERROR_BADMODE = 0x0222, /* bad bitrate/mode combination */ - MAD_ERROR_BADFRAMELEN = 0x0231, /* bad frame length */ - MAD_ERROR_BADBIGVALUES = 0x0232, /* bad big_values count */ - MAD_ERROR_BADBLOCKTYPE = 0x0233, /* reserved block_type */ - MAD_ERROR_BADSCFSI = 0x0234, /* bad scalefactor selection info */ - MAD_ERROR_BADDATAPTR = 0x0235, /* bad main_data_begin pointer */ - MAD_ERROR_BADPART3LEN = 0x0236, /* bad audio data length */ - MAD_ERROR_BADHUFFTABLE = 0x0237, /* bad Huffman table select */ - MAD_ERROR_BADHUFFDATA = 0x0238, /* Huffman data overrun */ - MAD_ERROR_BADSTEREO = 0x0239 /* incompatible block_type for JS */ -}; - -# define MAD_RECOVERABLE(error) ((error) & 0xff00) - -struct mad_stream { - unsigned char const *buffer; /* input bitstream buffer */ - unsigned char const *bufend; /* end of buffer */ - unsigned long skiplen; /* bytes to skip before next frame */ - - int sync; /* stream sync found */ - unsigned long freerate; /* free bitrate (fixed) */ - - unsigned char const *this_frame; /* start of current frame */ - unsigned char const *next_frame; /* start of next frame */ - struct mad_bitptr ptr; /* current processing bit pointer */ - - struct mad_bitptr anc_ptr; /* ancillary bits pointer */ - unsigned int anc_bitlen; /* number of ancillary bits */ - - unsigned char (*main_data)[MAD_BUFFER_MDLEN]; - /* Layer III main_data() */ - unsigned int md_len; /* bytes in main_data */ - - int options; /* decoding options (see below) */ - enum mad_error error; /* error code (see above) */ -}; - -enum { - MAD_OPTION_IGNORECRC = 0x0001, /* ignore CRC errors */ - MAD_OPTION_HALFSAMPLERATE = 0x0002 /* generate PCM at 1/2 sample rate */ -# if 0 /* not yet implemented */ - MAD_OPTION_LEFTCHANNEL = 0x0010, /* decode left channel only */ - MAD_OPTION_RIGHTCHANNEL = 0x0020, /* decode right channel only */ - MAD_OPTION_SINGLECHANNEL = 0x0030 /* combine channels */ -# endif -}; - -void mad_stream_init(struct mad_stream *); -void mad_stream_finish(struct mad_stream *); - -# define mad_stream_options(stream, opts) \ - ((void) ((stream)->options = (opts))) - -void mad_stream_buffer(struct mad_stream *, - unsigned char const *, unsigned long); -void mad_stream_skip(struct mad_stream *, unsigned long); - -int mad_stream_sync(struct mad_stream *); - -char const *mad_stream_errorstr(struct mad_stream const *); - -# endif diff --git a/src/libmad/synth.c b/src/libmad/synth.c deleted file mode 100755 index c05ad3efc..000000000 --- a/src/libmad/synth.c +++ /dev/null @@ -1,857 +0,0 @@ -/* - * 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: synth.c,v 1.4 2006/09/26 03:02:20 dgp85 Exp $ - */ - -# ifdef HAVE_CONFIG_H -# include "config.h" -# endif - -# include "global.h" - -# include "fixed.h" -# include "frame.h" -# include "synth.h" - -/* - * NAME: synth->init() - * DESCRIPTION: initialize synth struct - */ -void mad_synth_init(struct mad_synth *synth) -{ - mad_synth_mute(synth); - - synth->phase = 0; - - synth->pcm.samplerate = 0; - synth->pcm.channels = 0; - synth->pcm.length = 0; -} - -/* - * NAME: synth->mute() - * DESCRIPTION: zero all polyphase filterbank values, resetting synthesis - */ -void mad_synth_mute(struct mad_synth *synth) -{ - unsigned int ch, s, v; - - for (ch = 0; ch < 2; ++ch) { - for (s = 0; s < 16; ++s) { - for (v = 0; v < 8; ++v) { - synth->filter[ch][0][0][s][v] = synth->filter[ch][0][1][s][v] = - synth->filter[ch][1][0][s][v] = synth->filter[ch][1][1][s][v] = 0; - } - } - } -} - -/* - * An optional optimization called here the Subband Synthesis Optimization - * (SSO) improves the performance of subband synthesis at the expense of - * accuracy. - * - * The idea is to simplify 32x32->64-bit multiplication to 32x32->32 such - * that extra scaling and rounding are not necessary. This often allows the - * compiler to use faster 32-bit multiply-accumulate instructions instead of - * explicit 64-bit multiply, shift, and add instructions. - * - * SSO works like this: a full 32x32->64-bit multiply of two mad_fixed_t - * values requires the result to be right-shifted 28 bits to be properly - * scaled to the same fixed-point format. Right shifts can be applied at any - * time to either operand or to the result, so the optimization involves - * careful placement of these shifts to minimize the loss of accuracy. - * - * First, a 14-bit shift is applied with rounding at compile-time to the D[] - * table of coefficients for the subband synthesis window. This only loses 2 - * bits of accuracy because the lower 12 bits are always zero. A second - * 12-bit shift occurs after the DCT calculation. This loses 12 bits of - * accuracy. Finally, a third 2-bit shift occurs just before the sample is - * saved in the PCM buffer. 14 + 12 + 2 == 28 bits. - */ - -/* FPM_DEFAULT without OPT_SSO will actually lose accuracy and performance */ - -# if defined(FPM_DEFAULT) && !defined(OPT_SSO) -# define OPT_SSO -# endif - -/* second SSO shift, with rounding */ - -# if defined(OPT_SSO) -# define SHIFT(x) (((x) + (1L << 11)) >> 12) -# else -# define SHIFT(x) (x) -# endif - -/* possible DCT speed optimization */ - -# if defined(OPT_SPEED) && defined(MAD_F_MLX) -# define OPT_DCTO -# define MUL(x, y) \ - ({ mad_fixed64hi_t hi; \ - mad_fixed64lo_t lo; \ - MAD_F_MLX(hi, lo, (x), (y)); \ - hi << (32 - MAD_F_SCALEBITS - 3); \ - }) -# else -# undef OPT_DCTO -# define MUL(x, y) mad_f_mul((x), (y)) -# endif - -/* - * NAME: dct32() - * DESCRIPTION: perform fast in[32]->out[32] DCT - */ -static -void dct32(mad_fixed_t const in[32], unsigned int slot, - mad_fixed_t lo[16][8], mad_fixed_t hi[16][8]) -{ - mad_fixed_t t0, t1, t2, t3, t4, t5, t6, t7; - mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15; - mad_fixed_t t16, t17, t18, t19, t20, t21, t22, t23; - mad_fixed_t t24, t25, t26, t27, t28, t29, t30, t31; - mad_fixed_t t32, t33, t34, t35, t36, t37, t38, t39; - mad_fixed_t t40, t41, t42, t43, t44, t45, t46, t47; - mad_fixed_t t48, t49, t50, t51, t52, t53, t54, t55; - mad_fixed_t t56, t57, t58, t59, t60, t61, t62, t63; - mad_fixed_t t64, t65, t66, t67, t68, t69, t70, t71; - mad_fixed_t t72, t73, t74, t75, t76, t77, t78, t79; - mad_fixed_t t80, t81, t82, t83, t84, t85, t86, t87; - mad_fixed_t t88, t89, t90, t91, t92, t93, t94, t95; - mad_fixed_t t96, t97, t98, t99, t100, t101, t102, t103; - mad_fixed_t t104, t105, t106, t107, t108, t109, t110, t111; - mad_fixed_t t112, t113, t114, t115, t116, t117, t118, t119; - mad_fixed_t t120, t121, t122, t123, t124, t125, t126, t127; - mad_fixed_t t128, t129, t130, t131, t132, t133, t134, t135; - mad_fixed_t t136, t137, t138, t139, t140, t141, t142, t143; - mad_fixed_t t144, t145, t146, t147, t148, t149, t150, t151; - mad_fixed_t t152, t153, t154, t155, t156, t157, t158, t159; - mad_fixed_t t160, t161, t162, t163, t164, t165, t166, t167; - mad_fixed_t t168, t169, t170, t171, t172, t173, t174, t175; - mad_fixed_t t176; - - /* costab[i] = cos(PI / (2 * 32) * i) */ - -# if defined(OPT_DCTO) -# define costab1 MAD_F(0x7fd8878e) -# define costab2 MAD_F(0x7f62368f) -# define costab3 MAD_F(0x7e9d55fc) -# define costab4 MAD_F(0x7d8a5f40) -# define costab5 MAD_F(0x7c29fbee) -# define costab6 MAD_F(0x7a7d055b) -# define costab7 MAD_F(0x78848414) -# define costab8 MAD_F(0x7641af3d) -# define costab9 MAD_F(0x73b5ebd1) -# define costab10 MAD_F(0x70e2cbc6) -# define costab11 MAD_F(0x6dca0d14) -# define costab12 MAD_F(0x6a6d98a4) -# define costab13 MAD_F(0x66cf8120) -# define costab14 MAD_F(0x62f201ac) -# define costab15 MAD_F(0x5ed77c8a) -# define costab16 MAD_F(0x5a82799a) -# define costab17 MAD_F(0x55f5a4d2) -# define costab18 MAD_F(0x5133cc94) -# define costab19 MAD_F(0x4c3fdff4) -# define costab20 MAD_F(0x471cece7) -# define costab21 MAD_F(0x41ce1e65) -# define costab22 MAD_F(0x3c56ba70) -# define costab23 MAD_F(0x36ba2014) -# define costab24 MAD_F(0x30fbc54d) -# define costab25 MAD_F(0x2b1f34eb) -# define costab26 MAD_F(0x25280c5e) -# define costab27 MAD_F(0x1f19f97b) -# define costab28 MAD_F(0x18f8b83c) -# define costab29 MAD_F(0x12c8106f) -# define costab30 MAD_F(0x0c8bd35e) -# define costab31 MAD_F(0x0647d97c) -# else -# define costab1 MAD_F(0x0ffb10f2) /* 0.998795456 */ -# define costab2 MAD_F(0x0fec46d2) /* 0.995184727 */ -# define costab3 MAD_F(0x0fd3aac0) /* 0.989176510 */ -# define costab4 MAD_F(0x0fb14be8) /* 0.980785280 */ -# define costab5 MAD_F(0x0f853f7e) /* 0.970031253 */ -# define costab6 MAD_F(0x0f4fa0ab) /* 0.956940336 */ -# define costab7 MAD_F(0x0f109082) /* 0.941544065 */ -# define costab8 MAD_F(0x0ec835e8) /* 0.923879533 */ -# define costab9 MAD_F(0x0e76bd7a) /* 0.903989293 */ -# define costab10 MAD_F(0x0e1c5979) /* 0.881921264 */ -# define costab11 MAD_F(0x0db941a3) /* 0.857728610 */ -# define costab12 MAD_F(0x0d4db315) /* 0.831469612 */ -# define costab13 MAD_F(0x0cd9f024) /* 0.803207531 */ -# define costab14 MAD_F(0x0c5e4036) /* 0.773010453 */ -# define costab15 MAD_F(0x0bdaef91) /* 0.740951125 */ -# define costab16 MAD_F(0x0b504f33) /* 0.707106781 */ -# define costab17 MAD_F(0x0abeb49a) /* 0.671558955 */ -# define costab18 MAD_F(0x0a267993) /* 0.634393284 */ -# define costab19 MAD_F(0x0987fbfe) /* 0.595699304 */ -# define costab20 MAD_F(0x08e39d9d) /* 0.555570233 */ -# define costab21 MAD_F(0x0839c3cd) /* 0.514102744 */ -# define costab22 MAD_F(0x078ad74e) /* 0.471396737 */ -# define costab23 MAD_F(0x06d74402) /* 0.427555093 */ -# define costab24 MAD_F(0x061f78aa) /* 0.382683432 */ -# define costab25 MAD_F(0x0563e69d) /* 0.336889853 */ -# define costab26 MAD_F(0x04a5018c) /* 0.290284677 */ -# define costab27 MAD_F(0x03e33f2f) /* 0.242980180 */ -# define costab28 MAD_F(0x031f1708) /* 0.195090322 */ -# define costab29 MAD_F(0x0259020e) /* 0.146730474 */ -# define costab30 MAD_F(0x01917a6c) /* 0.098017140 */ -# define costab31 MAD_F(0x00c8fb30) /* 0.049067674 */ -# endif - - t0 = in[0] + in[31]; t16 = MUL(in[0] - in[31], costab1); - t1 = in[15] + in[16]; t17 = MUL(in[15] - in[16], costab31); - - t41 = t16 + t17; - t59 = MUL(t16 - t17, costab2); - t33 = t0 + t1; - t50 = MUL(t0 - t1, costab2); - - t2 = in[7] + in[24]; t18 = MUL(in[7] - in[24], costab15); - t3 = in[8] + in[23]; t19 = MUL(in[8] - in[23], costab17); - - t42 = t18 + t19; - t60 = MUL(t18 - t19, costab30); - t34 = t2 + t3; - t51 = MUL(t2 - t3, costab30); - - t4 = in[3] + in[28]; t20 = MUL(in[3] - in[28], costab7); - t5 = in[12] + in[19]; t21 = MUL(in[12] - in[19], costab25); - - t43 = t20 + t21; - t61 = MUL(t20 - t21, costab14); - t35 = t4 + t5; - t52 = MUL(t4 - t5, costab14); - - t6 = in[4] + in[27]; t22 = MUL(in[4] - in[27], costab9); - t7 = in[11] + in[20]; t23 = MUL(in[11] - in[20], costab23); - - t44 = t22 + t23; - t62 = MUL(t22 - t23, costab18); - t36 = t6 + t7; - t53 = MUL(t6 - t7, costab18); - - t8 = in[1] + in[30]; t24 = MUL(in[1] - in[30], costab3); - t9 = in[14] + in[17]; t25 = MUL(in[14] - in[17], costab29); - - t45 = t24 + t25; - t63 = MUL(t24 - t25, costab6); - t37 = t8 + t9; - t54 = MUL(t8 - t9, costab6); - - t10 = in[6] + in[25]; t26 = MUL(in[6] - in[25], costab13); - t11 = in[9] + in[22]; t27 = MUL(in[9] - in[22], costab19); - - t46 = t26 + t27; - t64 = MUL(t26 - t27, costab26); - t38 = t10 + t11; - t55 = MUL(t10 - t11, costab26); - - t12 = in[2] + in[29]; t28 = MUL(in[2] - in[29], costab5); - t13 = in[13] + in[18]; t29 = MUL(in[13] - in[18], costab27); - - t47 = t28 + t29; - t65 = MUL(t28 - t29, costab10); - t39 = t12 + t13; - t56 = MUL(t12 - t13, costab10); - - t14 = in[5] + in[26]; t30 = MUL(in[5] - in[26], costab11); - t15 = in[10] + in[21]; t31 = MUL(in[10] - in[21], costab21); - - t48 = t30 + t31; - t66 = MUL(t30 - t31, costab22); - t40 = t14 + t15; - t57 = MUL(t14 - t15, costab22); - - t69 = t33 + t34; t89 = MUL(t33 - t34, costab4); - t70 = t35 + t36; t90 = MUL(t35 - t36, costab28); - t71 = t37 + t38; t91 = MUL(t37 - t38, costab12); - t72 = t39 + t40; t92 = MUL(t39 - t40, costab20); - t73 = t41 + t42; t94 = MUL(t41 - t42, costab4); - t74 = t43 + t44; t95 = MUL(t43 - t44, costab28); - t75 = t45 + t46; t96 = MUL(t45 - t46, costab12); - t76 = t47 + t48; t97 = MUL(t47 - t48, costab20); - - t78 = t50 + t51; t100 = MUL(t50 - t51, costab4); - t79 = t52 + t53; t101 = MUL(t52 - t53, costab28); - t80 = t54 + t55; t102 = MUL(t54 - t55, costab12); - t81 = t56 + t57; t103 = MUL(t56 - t57, costab20); - - t83 = t59 + t60; t106 = MUL(t59 - t60, costab4); - t84 = t61 + t62; t107 = MUL(t61 - t62, costab28); - t85 = t63 + t64; t108 = MUL(t63 - t64, costab12); - t86 = t65 + t66; t109 = MUL(t65 - t66, costab20); - - t113 = t69 + t70; - t114 = t71 + t72; - - /* 0 */ hi[15][slot] = SHIFT(t113 + t114); - /* 16 */ lo[ 0][slot] = SHIFT(MUL(t113 - t114, costab16)); - - t115 = t73 + t74; - t116 = t75 + t76; - - t32 = t115 + t116; - - /* 1 */ hi[14][slot] = SHIFT(t32); - - t118 = t78 + t79; - t119 = t80 + t81; - - t58 = t118 + t119; - - /* 2 */ hi[13][slot] = SHIFT(t58); - - t121 = t83 + t84; - t122 = t85 + t86; - - t67 = t121 + t122; - - t49 = (t67 * 2) - t32; - - /* 3 */ hi[12][slot] = SHIFT(t49); - - t125 = t89 + t90; - t126 = t91 + t92; - - t93 = t125 + t126; - - /* 4 */ hi[11][slot] = SHIFT(t93); - - t128 = t94 + t95; - t129 = t96 + t97; - - t98 = t128 + t129; - - t68 = (t98 * 2) - t49; - - /* 5 */ hi[10][slot] = SHIFT(t68); - - t132 = t100 + t101; - t133 = t102 + t103; - - t104 = t132 + t133; - - t82 = (t104 * 2) - t58; - - /* 6 */ hi[ 9][slot] = SHIFT(t82); - - t136 = t106 + t107; - t137 = t108 + t109; - - t110 = t136 + t137; - - t87 = (t110 * 2) - t67; - - t77 = (t87 * 2) - t68; - - /* 7 */ hi[ 8][slot] = SHIFT(t77); - - t141 = MUL(t69 - t70, costab8); - t142 = MUL(t71 - t72, costab24); - t143 = t141 + t142; - - /* 8 */ hi[ 7][slot] = SHIFT(t143); - /* 24 */ lo[ 8][slot] = - SHIFT((MUL(t141 - t142, costab16) * 2) - t143); - - t144 = MUL(t73 - t74, costab8); - t145 = MUL(t75 - t76, costab24); - t146 = t144 + t145; - - t88 = (t146 * 2) - t77; - - /* 9 */ hi[ 6][slot] = SHIFT(t88); - - t148 = MUL(t78 - t79, costab8); - t149 = MUL(t80 - t81, costab24); - t150 = t148 + t149; - - t105 = (t150 * 2) - t82; - - /* 10 */ hi[ 5][slot] = SHIFT(t105); - - t152 = MUL(t83 - t84, costab8); - t153 = MUL(t85 - t86, costab24); - t154 = t152 + t153; - - t111 = (t154 * 2) - t87; - - t99 = (t111 * 2) - t88; - - /* 11 */ hi[ 4][slot] = SHIFT(t99); - - t157 = MUL(t89 - t90, costab8); - t158 = MUL(t91 - t92, costab24); - t159 = t157 + t158; - - t127 = (t159 * 2) - t93; - - /* 12 */ hi[ 3][slot] = SHIFT(t127); - - t160 = (MUL(t125 - t126, costab16) * 2) - t127; - - /* 20 */ lo[ 4][slot] = SHIFT(t160); - /* 28 */ lo[12][slot] = - SHIFT((((MUL(t157 - t158, costab16) * 2) - t159) * 2) - t160); - - t161 = MUL(t94 - t95, costab8); - t162 = MUL(t96 - t97, costab24); - t163 = t161 + t162; - - t130 = (t163 * 2) - t98; - - t112 = (t130 * 2) - t99; - - /* 13 */ hi[ 2][slot] = SHIFT(t112); - - t164 = (MUL(t128 - t129, costab16) * 2) - t130; - - t166 = MUL(t100 - t101, costab8); - t167 = MUL(t102 - t103, costab24); - t168 = t166 + t167; - - t134 = (t168 * 2) - t104; - - t120 = (t134 * 2) - t105; - - /* 14 */ hi[ 1][slot] = SHIFT(t120); - - t135 = (MUL(t118 - t119, costab16) * 2) - t120; - - /* 18 */ lo[ 2][slot] = SHIFT(t135); - - t169 = (MUL(t132 - t133, costab16) * 2) - t134; - - t151 = (t169 * 2) - t135; - - /* 22 */ lo[ 6][slot] = SHIFT(t151); - - t170 = (((MUL(t148 - t149, costab16) * 2) - t150) * 2) - t151; - - /* 26 */ lo[10][slot] = SHIFT(t170); - /* 30 */ lo[14][slot] = - SHIFT((((((MUL(t166 - t167, costab16) * 2) - - t168) * 2) - t169) * 2) - t170); - - t171 = MUL(t106 - t107, costab8); - t172 = MUL(t108 - t109, costab24); - t173 = t171 + t172; - - t138 = (t173 * 2) - t110; - - t123 = (t138 * 2) - t111; - - t139 = (MUL(t121 - t122, costab16) * 2) - t123; - - t117 = (t123 * 2) - t112; - - /* 15 */ hi[ 0][slot] = SHIFT(t117); - - t124 = (MUL(t115 - t116, costab16) * 2) - t117; - - /* 17 */ lo[ 1][slot] = SHIFT(t124); - - t131 = (t139 * 2) - t124; - - /* 19 */ lo[ 3][slot] = SHIFT(t131); - - t140 = (t164 * 2) - t131; - - /* 21 */ lo[ 5][slot] = SHIFT(t140); - - t174 = (MUL(t136 - t137, costab16) * 2) - t138; - - t155 = (t174 * 2) - t139; - - t147 = (t155 * 2) - t140; - - /* 23 */ lo[ 7][slot] = SHIFT(t147); - - t156 = (((MUL(t144 - t145, costab16) * 2) - t146) * 2) - t147; - - /* 25 */ lo[ 9][slot] = SHIFT(t156); - - t175 = (((MUL(t152 - t153, costab16) * 2) - t154) * 2) - t155; - - t165 = (t175 * 2) - t156; - - /* 27 */ lo[11][slot] = SHIFT(t165); - - t176 = (((((MUL(t161 - t162, costab16) * 2) - - t163) * 2) - t164) * 2) - t165; - - /* 29 */ lo[13][slot] = SHIFT(t176); - /* 31 */ lo[15][slot] = - SHIFT((((((((MUL(t171 - t172, costab16) * 2) - - t173) * 2) - t174) * 2) - t175) * 2) - t176); - - /* - * Totals: - * 80 multiplies - * 80 additions - * 119 subtractions - * 49 shifts (not counting SSO) - */ -} - -# undef MUL -# undef SHIFT - -/* third SSO shift and/or D[] optimization preshift */ - -# if defined(OPT_SSO) -# if MAD_F_FRACBITS != 28 -# error "MAD_F_FRACBITS must be 28 to use OPT_SSO" -# endif -# define ML0(hi, lo, x, y) ((lo) = (x) * (y)) -# define MLA(hi, lo, x, y) ((lo) += (x) * (y)) -# define MLN(hi, lo) ((lo) = -(lo)) -# define MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo)) -# define SHIFT(x) ((x) >> 2) -# define PRESHIFT(x) ((MAD_F(x) + (1L << 13)) >> 14) -# else -# define ML0(hi, lo, x, y) MAD_F_ML0((hi), (lo), (x), (y)) -# define MLA(hi, lo, x, y) MAD_F_MLA((hi), (lo), (x), (y)) -# define MLN(hi, lo) MAD_F_MLN((hi), (lo)) -# define MLZ(hi, lo) MAD_F_MLZ((hi), (lo)) -# define SHIFT(x) (x) -# if defined(MAD_F_SCALEBITS) -# undef MAD_F_SCALEBITS -# define MAD_F_SCALEBITS (MAD_F_FRACBITS - 12) -# define PRESHIFT(x) (MAD_F(x) >> 12) -# else -# define PRESHIFT(x) MAD_F(x) -# endif -# endif - -static -mad_fixed_t const D[17][32] = { -# include "D.dat" -}; - -# if defined(ASO_SYNTH) -void synth_full(struct mad_synth *, struct mad_frame const *, - unsigned int, unsigned int); -# else -/* - * NAME: synth->full() - * DESCRIPTION: perform full frequency PCM synthesis - */ -static -void synth_full(struct mad_synth *synth, struct mad_frame const *frame, - unsigned int nch, unsigned int ns) -{ - unsigned int phase, ch, s, sb, pe, po; - mad_fixed_t *pcm1, *pcm2, (*filter)[2][2][16][8]; - mad_fixed_t const (*sbsample)[36][32]; - register mad_fixed_t (*fe)[8], (*fx)[8], (*fo)[8]; - register mad_fixed_t const (*Dptr)[32], *ptr; - register mad_fixed64hi_t hi = 0; - register mad_fixed64lo_t lo = 0; - - for (ch = 0; ch < nch; ++ch) { - sbsample = &frame->sbsample[ch]; - filter = &synth->filter[ch]; - phase = synth->phase; - pcm1 = synth->pcm.samples[ch]; - - for (s = 0; s < ns; ++s) { - dct32((*sbsample)[s], phase >> 1, - (*filter)[0][phase & 1], (*filter)[1][phase & 1]); - - pe = phase & ~1; - po = ((phase - 1) & 0xf) | 1; - - /* calculate 32 samples */ - - fe = &(*filter)[0][ phase & 1][0]; - fx = &(*filter)[0][~phase & 1][0]; - fo = &(*filter)[1][~phase & 1][0]; - - Dptr = &D[0]; - - ptr = *Dptr + po; - ML0(hi, lo, (*fx)[0], ptr[ 0]); - MLA(hi, lo, (*fx)[1], ptr[14]); - MLA(hi, lo, (*fx)[2], ptr[12]); - MLA(hi, lo, (*fx)[3], ptr[10]); - MLA(hi, lo, (*fx)[4], ptr[ 8]); - MLA(hi, lo, (*fx)[5], ptr[ 6]); - MLA(hi, lo, (*fx)[6], ptr[ 4]); - MLA(hi, lo, (*fx)[7], ptr[ 2]); - MLN(hi, lo); - - ptr = *Dptr + pe; - MLA(hi, lo, (*fe)[0], ptr[ 0]); - MLA(hi, lo, (*fe)[1], ptr[14]); - MLA(hi, lo, (*fe)[2], ptr[12]); - MLA(hi, lo, (*fe)[3], ptr[10]); - MLA(hi, lo, (*fe)[4], ptr[ 8]); - MLA(hi, lo, (*fe)[5], ptr[ 6]); - MLA(hi, lo, (*fe)[6], ptr[ 4]); - MLA(hi, lo, (*fe)[7], ptr[ 2]); - - *pcm1++ = SHIFT(MLZ(hi, lo)); - - pcm2 = pcm1 + 30; - - for (sb = 1; sb < 16; ++sb) { - ++fe; - ++Dptr; - - /* D[32 - sb][i] == -D[sb][31 - i] */ - - ptr = *Dptr + po; - ML0(hi, lo, (*fo)[0], ptr[ 0]); - MLA(hi, lo, (*fo)[1], ptr[14]); - MLA(hi, lo, (*fo)[2], ptr[12]); - MLA(hi, lo, (*fo)[3], ptr[10]); - MLA(hi, lo, (*fo)[4], ptr[ 8]); - MLA(hi, lo, (*fo)[5], ptr[ 6]); - MLA(hi, lo, (*fo)[6], ptr[ 4]); - MLA(hi, lo, (*fo)[7], ptr[ 2]); - MLN(hi, lo); - - ptr = *Dptr + pe; - MLA(hi, lo, (*fe)[7], ptr[ 2]); - MLA(hi, lo, (*fe)[6], ptr[ 4]); - MLA(hi, lo, (*fe)[5], ptr[ 6]); - MLA(hi, lo, (*fe)[4], ptr[ 8]); - MLA(hi, lo, (*fe)[3], ptr[10]); - MLA(hi, lo, (*fe)[2], ptr[12]); - MLA(hi, lo, (*fe)[1], ptr[14]); - MLA(hi, lo, (*fe)[0], ptr[ 0]); - - *pcm1++ = SHIFT(MLZ(hi, lo)); - - ptr = *Dptr - pe; - ML0(hi, lo, (*fe)[0], ptr[31 - 16]); - MLA(hi, lo, (*fe)[1], ptr[31 - 14]); - MLA(hi, lo, (*fe)[2], ptr[31 - 12]); - MLA(hi, lo, (*fe)[3], ptr[31 - 10]); - MLA(hi, lo, (*fe)[4], ptr[31 - 8]); - MLA(hi, lo, (*fe)[5], ptr[31 - 6]); - MLA(hi, lo, (*fe)[6], ptr[31 - 4]); - MLA(hi, lo, (*fe)[7], ptr[31 - 2]); - - ptr = *Dptr - po; - MLA(hi, lo, (*fo)[7], ptr[31 - 2]); - MLA(hi, lo, (*fo)[6], ptr[31 - 4]); - MLA(hi, lo, (*fo)[5], ptr[31 - 6]); - MLA(hi, lo, (*fo)[4], ptr[31 - 8]); - MLA(hi, lo, (*fo)[3], ptr[31 - 10]); - MLA(hi, lo, (*fo)[2], ptr[31 - 12]); - MLA(hi, lo, (*fo)[1], ptr[31 - 14]); - MLA(hi, lo, (*fo)[0], ptr[31 - 16]); - - *pcm2-- = SHIFT(MLZ(hi, lo)); - - ++fo; - } - - ++Dptr; - - ptr = *Dptr + po; - ML0(hi, lo, (*fo)[0], ptr[ 0]); - MLA(hi, lo, (*fo)[1], ptr[14]); - MLA(hi, lo, (*fo)[2], ptr[12]); - MLA(hi, lo, (*fo)[3], ptr[10]); - MLA(hi, lo, (*fo)[4], ptr[ 8]); - MLA(hi, lo, (*fo)[5], ptr[ 6]); - MLA(hi, lo, (*fo)[6], ptr[ 4]); - MLA(hi, lo, (*fo)[7], ptr[ 2]); - - *pcm1 = SHIFT(-MLZ(hi, lo)); - pcm1 += 16; - - phase = (phase + 1) % 16; - } - } -} -# endif - -/* - * NAME: synth->half() - * DESCRIPTION: perform half frequency PCM synthesis - */ -static -void synth_half(struct mad_synth *synth, struct mad_frame const *frame, - unsigned int nch, unsigned int ns) -{ - unsigned int phase, ch, s, sb, pe, po; - mad_fixed_t *pcm1, *pcm2, (*filter)[2][2][16][8]; - mad_fixed_t const (*sbsample)[36][32]; - register mad_fixed_t (*fe)[8], (*fx)[8], (*fo)[8]; - register mad_fixed_t const (*Dptr)[32], *ptr; - register mad_fixed64hi_t hi = 0; - register mad_fixed64lo_t lo = 0; - - for (ch = 0; ch < nch; ++ch) { - sbsample = &frame->sbsample[ch]; - filter = &synth->filter[ch]; - phase = synth->phase; - pcm1 = synth->pcm.samples[ch]; - - for (s = 0; s < ns; ++s) { - dct32((*sbsample)[s], phase >> 1, - (*filter)[0][phase & 1], (*filter)[1][phase & 1]); - - pe = phase & ~1; - po = ((phase - 1) & 0xf) | 1; - - /* calculate 16 samples */ - - fe = &(*filter)[0][ phase & 1][0]; - fx = &(*filter)[0][~phase & 1][0]; - fo = &(*filter)[1][~phase & 1][0]; - - Dptr = &D[0]; - - ptr = *Dptr + po; - ML0(hi, lo, (*fx)[0], ptr[ 0]); - MLA(hi, lo, (*fx)[1], ptr[14]); - MLA(hi, lo, (*fx)[2], ptr[12]); - MLA(hi, lo, (*fx)[3], ptr[10]); - MLA(hi, lo, (*fx)[4], ptr[ 8]); - MLA(hi, lo, (*fx)[5], ptr[ 6]); - MLA(hi, lo, (*fx)[6], ptr[ 4]); - MLA(hi, lo, (*fx)[7], ptr[ 2]); - MLN(hi, lo); - - ptr = *Dptr + pe; - MLA(hi, lo, (*fe)[0], ptr[ 0]); - MLA(hi, lo, (*fe)[1], ptr[14]); - MLA(hi, lo, (*fe)[2], ptr[12]); - MLA(hi, lo, (*fe)[3], ptr[10]); - MLA(hi, lo, (*fe)[4], ptr[ 8]); - MLA(hi, lo, (*fe)[5], ptr[ 6]); - MLA(hi, lo, (*fe)[6], ptr[ 4]); - MLA(hi, lo, (*fe)[7], ptr[ 2]); - - *pcm1++ = SHIFT(MLZ(hi, lo)); - - pcm2 = pcm1 + 14; - - for (sb = 1; sb < 16; ++sb) { - ++fe; - ++Dptr; - - /* D[32 - sb][i] == -D[sb][31 - i] */ - - if (!(sb & 1)) { - ptr = *Dptr + po; - ML0(hi, lo, (*fo)[0], ptr[ 0]); - MLA(hi, lo, (*fo)[1], ptr[14]); - MLA(hi, lo, (*fo)[2], ptr[12]); - MLA(hi, lo, (*fo)[3], ptr[10]); - MLA(hi, lo, (*fo)[4], ptr[ 8]); - MLA(hi, lo, (*fo)[5], ptr[ 6]); - MLA(hi, lo, (*fo)[6], ptr[ 4]); - MLA(hi, lo, (*fo)[7], ptr[ 2]); - MLN(hi, lo); - - ptr = *Dptr + pe; - MLA(hi, lo, (*fe)[7], ptr[ 2]); - MLA(hi, lo, (*fe)[6], ptr[ 4]); - MLA(hi, lo, (*fe)[5], ptr[ 6]); - MLA(hi, lo, (*fe)[4], ptr[ 8]); - MLA(hi, lo, (*fe)[3], ptr[10]); - MLA(hi, lo, (*fe)[2], ptr[12]); - MLA(hi, lo, (*fe)[1], ptr[14]); - MLA(hi, lo, (*fe)[0], ptr[ 0]); - - *pcm1++ = SHIFT(MLZ(hi, lo)); - - ptr = *Dptr - po; - ML0(hi, lo, (*fo)[7], ptr[31 - 2]); - MLA(hi, lo, (*fo)[6], ptr[31 - 4]); - MLA(hi, lo, (*fo)[5], ptr[31 - 6]); - MLA(hi, lo, (*fo)[4], ptr[31 - 8]); - MLA(hi, lo, (*fo)[3], ptr[31 - 10]); - MLA(hi, lo, (*fo)[2], ptr[31 - 12]); - MLA(hi, lo, (*fo)[1], ptr[31 - 14]); - MLA(hi, lo, (*fo)[0], ptr[31 - 16]); - - ptr = *Dptr - pe; - MLA(hi, lo, (*fe)[0], ptr[31 - 16]); - MLA(hi, lo, (*fe)[1], ptr[31 - 14]); - MLA(hi, lo, (*fe)[2], ptr[31 - 12]); - MLA(hi, lo, (*fe)[3], ptr[31 - 10]); - MLA(hi, lo, (*fe)[4], ptr[31 - 8]); - MLA(hi, lo, (*fe)[5], ptr[31 - 6]); - MLA(hi, lo, (*fe)[6], ptr[31 - 4]); - MLA(hi, lo, (*fe)[7], ptr[31 - 2]); - - *pcm2-- = SHIFT(MLZ(hi, lo)); - } - - ++fo; - } - - ++Dptr; - - ptr = *Dptr + po; - ML0(hi, lo, (*fo)[0], ptr[ 0]); - MLA(hi, lo, (*fo)[1], ptr[14]); - MLA(hi, lo, (*fo)[2], ptr[12]); - MLA(hi, lo, (*fo)[3], ptr[10]); - MLA(hi, lo, (*fo)[4], ptr[ 8]); - MLA(hi, lo, (*fo)[5], ptr[ 6]); - MLA(hi, lo, (*fo)[6], ptr[ 4]); - MLA(hi, lo, (*fo)[7], ptr[ 2]); - - *pcm1 = SHIFT(-MLZ(hi, lo)); - pcm1 += 8; - - phase = (phase + 1) % 16; - } - } -} - -/* - * NAME: synth->frame() - * DESCRIPTION: perform PCM synthesis of frame subband samples - */ -void mad_synth_frame(struct mad_synth *synth, struct mad_frame const *frame) -{ - unsigned int nch, ns; - void (*synth_frame)(struct mad_synth *, struct mad_frame const *, - unsigned int, unsigned int); - - nch = MAD_NCHANNELS(&frame->header); - ns = MAD_NSBSAMPLES(&frame->header); - - synth->pcm.samplerate = frame->header.samplerate; - synth->pcm.channels = nch; - synth->pcm.length = 32 * ns; - - synth_frame = synth_full; - - if (frame->options & MAD_OPTION_HALFSAMPLERATE) { - synth->pcm.samplerate /= 2; - synth->pcm.length /= 2; - - synth_frame = synth_half; - } - - synth_frame(synth, frame, nch, ns); - - synth->phase = (synth->phase + ns) % 16; -} diff --git a/src/libmad/synth.h b/src/libmad/synth.h deleted file mode 100644 index d5a63589e..000000000 --- a/src/libmad/synth.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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: synth.h,v 1.3 2004/04/22 00:23:24 miguelfreitas Exp $ - */ - -# ifndef LIBMAD_SYNTH_H -# define LIBMAD_SYNTH_H - -# include "fixed.h" -# include "frame.h" - -struct mad_pcm { - unsigned int samplerate; /* sampling frequency (Hz) */ - unsigned short channels; /* number of channels */ - unsigned short length; /* number of samples per channel */ - mad_fixed_t samples[2][1152]; /* PCM output samples [ch][sample] */ -}; - -struct mad_synth { - mad_fixed_t filter[2][2][2][16][8]; /* polyphase filterbank outputs */ - /* [ch][eo][peo][s][v] */ - - unsigned int phase; /* current processing phase */ - - struct mad_pcm pcm; /* PCM output */ -}; - -/* single channel PCM selector */ -enum { - MAD_PCM_CHANNEL_SINGLE = 0 -}; - -/* dual channel PCM selector */ -enum { - MAD_PCM_CHANNEL_DUAL_1 = 0, - MAD_PCM_CHANNEL_DUAL_2 = 1 -}; - -/* stereo PCM selector */ -enum { - MAD_PCM_CHANNEL_STEREO_LEFT = 0, - MAD_PCM_CHANNEL_STEREO_RIGHT = 1 -}; - -void mad_synth_init(struct mad_synth *); - -# define mad_synth_finish(synth) /* nothing */ - -void mad_synth_mute(struct mad_synth *); - -void mad_synth_frame(struct mad_synth *, struct mad_frame const *); - -# endif diff --git a/src/libmad/timer.c b/src/libmad/timer.c deleted file mode 100755 index 9aa2e8924..000000000 --- a/src/libmad/timer.c +++ /dev/null @@ -1,485 +0,0 @@ -/* - * 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: timer.c,v 1.6 2004/04/22 00:23:26 miguelfreitas Exp $ - */ - -# ifdef HAVE_CONFIG_H -# include "config.h" -# endif - -# include "global.h" - -# include <stdio.h> - -# ifdef HAVE_ASSERT_H -# include <assert.h> -# endif - -# include "timer.h" - -mad_timer_t const mad_timer_zero = { 0, 0 }; - -/* - * NAME: timer->compare() - * DESCRIPTION: indicate relative order of two timers - */ -int mad_timer_compare(mad_timer_t timer1, mad_timer_t timer2) -{ - signed long diff; - - diff = timer1.seconds - timer2.seconds; - if (diff < 0) - return -1; - else if (diff > 0) - return +1; - - diff = timer1.fraction - timer2.fraction; - if (diff < 0) - return -1; - else if (diff > 0) - return +1; - - return 0; -} - -/* - * NAME: timer->negate() - * DESCRIPTION: invert the sign of a timer - */ -void mad_timer_negate(mad_timer_t *timer) -{ - timer->seconds = -timer->seconds; - - if (timer->fraction) { - timer->seconds -= 1; - timer->fraction = MAD_TIMER_RESOLUTION - timer->fraction; - } -} - -/* - * NAME: timer->abs() - * DESCRIPTION: return the absolute value of a timer - */ -mad_timer_t mad_timer_abs(mad_timer_t timer) -{ - if (timer.seconds < 0) - mad_timer_negate(&timer); - - return timer; -} - -/* - * NAME: reduce_timer() - * DESCRIPTION: carry timer fraction into seconds - */ -static -void reduce_timer(mad_timer_t *timer) -{ - timer->seconds += timer->fraction / MAD_TIMER_RESOLUTION; - timer->fraction %= MAD_TIMER_RESOLUTION; -} - -/* - * NAME: gcd() - * DESCRIPTION: compute greatest common denominator - */ -static -unsigned long gcd(unsigned long num1, unsigned long num2) -{ - unsigned long tmp; - - while (num2) { - tmp = num2; - num2 = num1 % num2; - num1 = tmp; - } - - return num1; -} - -/* - * NAME: reduce_rational() - * DESCRIPTION: convert rational expression to lowest terms - */ -static -void reduce_rational(unsigned long *numer, unsigned long *denom) -{ - unsigned long factor; - - factor = gcd(*numer, *denom); - - assert(factor != 0); - - *numer /= factor; - *denom /= factor; -} - -/* - * NAME: scale_rational() - * DESCRIPTION: solve numer/denom == ?/scale avoiding overflowing - */ -static -unsigned long scale_rational(unsigned long numer, unsigned long denom, - unsigned long scale) -{ - reduce_rational(&numer, &denom); - reduce_rational(&scale, &denom); - - assert(denom != 0); - - if (denom < scale) - return numer * (scale / denom) + numer * (scale % denom) / denom; - if (denom < numer) - return scale * (numer / denom) + scale * (numer % denom) / denom; - - return numer * scale / denom; -} - -/* - * NAME: timer->set() - * DESCRIPTION: set timer to specific (positive) value - */ -void mad_timer_set(mad_timer_t *timer, unsigned long seconds, - unsigned long numer, unsigned long denom) -{ - timer->seconds = seconds; - if (numer >= denom && denom > 0) { - timer->seconds += numer / denom; - numer %= denom; - } - - switch (denom) { - case 0: - case 1: - timer->fraction = 0; - break; - - case MAD_TIMER_RESOLUTION: - timer->fraction = numer; - break; - - case 1000: - timer->fraction = numer * (MAD_TIMER_RESOLUTION / 1000); - break; - - case 8000: - timer->fraction = numer * (MAD_TIMER_RESOLUTION / 8000); - break; - - case 11025: - timer->fraction = numer * (MAD_TIMER_RESOLUTION / 11025); - break; - - case 12000: - timer->fraction = numer * (MAD_TIMER_RESOLUTION / 12000); - break; - - case 16000: - timer->fraction = numer * (MAD_TIMER_RESOLUTION / 16000); - break; - - case 22050: - timer->fraction = numer * (MAD_TIMER_RESOLUTION / 22050); - break; - - case 24000: - timer->fraction = numer * (MAD_TIMER_RESOLUTION / 24000); - break; - - case 32000: - timer->fraction = numer * (MAD_TIMER_RESOLUTION / 32000); - break; - - case 44100: - timer->fraction = numer * (MAD_TIMER_RESOLUTION / 44100); - break; - - case 48000: - timer->fraction = numer * (MAD_TIMER_RESOLUTION / 48000); - break; - - default: - timer->fraction = scale_rational(numer, denom, MAD_TIMER_RESOLUTION); - break; - } - - if (timer->fraction >= MAD_TIMER_RESOLUTION) - reduce_timer(timer); -} - -/* - * NAME: timer->add() - * DESCRIPTION: add one timer to another - */ -void mad_timer_add(mad_timer_t *timer, mad_timer_t incr) -{ - timer->seconds += incr.seconds; - timer->fraction += incr.fraction; - - if (timer->fraction >= MAD_TIMER_RESOLUTION) - reduce_timer(timer); -} - -/* - * NAME: timer->multiply() - * DESCRIPTION: multiply a timer by a scalar value - */ -void mad_timer_multiply(mad_timer_t *timer, signed long scalar) -{ - mad_timer_t addend; - unsigned long factor; - - factor = scalar; - if (scalar < 0) { - factor = -scalar; - mad_timer_negate(timer); - } - - addend = *timer; - *timer = mad_timer_zero; - - while (factor) { - if (factor & 1) - mad_timer_add(timer, addend); - - mad_timer_add(&addend, addend); - factor >>= 1; - } -} - -/* - * NAME: timer->count() - * DESCRIPTION: return timer value in selected units - */ -signed long mad_timer_count(mad_timer_t timer, enum mad_units units) -{ - switch (units) { - case MAD_UNITS_HOURS: - return timer.seconds / 60 / 60; - - case MAD_UNITS_MINUTES: - return timer.seconds / 60; - - case MAD_UNITS_SECONDS: - return timer.seconds; - - case MAD_UNITS_DECISECONDS: - case MAD_UNITS_CENTISECONDS: - case MAD_UNITS_MILLISECONDS: - - case MAD_UNITS_8000_HZ: - case MAD_UNITS_11025_HZ: - case MAD_UNITS_12000_HZ: - case MAD_UNITS_16000_HZ: - case MAD_UNITS_22050_HZ: - case MAD_UNITS_24000_HZ: - case MAD_UNITS_32000_HZ: - case MAD_UNITS_44100_HZ: - case MAD_UNITS_48000_HZ: - - case MAD_UNITS_24_FPS: - case MAD_UNITS_25_FPS: - case MAD_UNITS_30_FPS: - case MAD_UNITS_48_FPS: - case MAD_UNITS_50_FPS: - case MAD_UNITS_60_FPS: - case MAD_UNITS_75_FPS: - return timer.seconds * (signed long) units + - (signed long) scale_rational(timer.fraction, MAD_TIMER_RESOLUTION, - units); - - case MAD_UNITS_23_976_FPS: - case MAD_UNITS_24_975_FPS: - case MAD_UNITS_29_97_FPS: - case MAD_UNITS_47_952_FPS: - case MAD_UNITS_49_95_FPS: - case MAD_UNITS_59_94_FPS: - return (mad_timer_count(timer, -units) + 1) * 1000 / 1001; - } - - /* unsupported units */ - return 0; -} - -/* - * NAME: timer->fraction() - * DESCRIPTION: return fractional part of timer in arbitrary terms - */ -unsigned long mad_timer_fraction(mad_timer_t timer, unsigned long denom) -{ - timer = mad_timer_abs(timer); - - switch (denom) { - case 0: - return timer.fraction ? - MAD_TIMER_RESOLUTION / timer.fraction : MAD_TIMER_RESOLUTION + 1; - - case MAD_TIMER_RESOLUTION: - return timer.fraction; - - default: - return scale_rational(timer.fraction, MAD_TIMER_RESOLUTION, denom); - } -} - -/* - * NAME: timer->string() - * DESCRIPTION: write a string representation of a timer using a template - */ -void mad_timer_string(mad_timer_t timer, - char *dest, char const *format, enum mad_units units, - enum mad_units fracunits, unsigned long subparts) -{ - unsigned long hours, minutes, seconds, sub; - unsigned int frac; - - timer = mad_timer_abs(timer); - - seconds = timer.seconds; - frac = sub = 0; - - switch (fracunits) { - case MAD_UNITS_HOURS: - case MAD_UNITS_MINUTES: - case MAD_UNITS_SECONDS: - break; - - case MAD_UNITS_DECISECONDS: - case MAD_UNITS_CENTISECONDS: - case MAD_UNITS_MILLISECONDS: - - case MAD_UNITS_8000_HZ: - case MAD_UNITS_11025_HZ: - case MAD_UNITS_12000_HZ: - case MAD_UNITS_16000_HZ: - case MAD_UNITS_22050_HZ: - case MAD_UNITS_24000_HZ: - case MAD_UNITS_32000_HZ: - case MAD_UNITS_44100_HZ: - case MAD_UNITS_48000_HZ: - - case MAD_UNITS_24_FPS: - case MAD_UNITS_25_FPS: - case MAD_UNITS_30_FPS: - case MAD_UNITS_48_FPS: - case MAD_UNITS_50_FPS: - case MAD_UNITS_60_FPS: - case MAD_UNITS_75_FPS: - { - unsigned long denom; - - denom = MAD_TIMER_RESOLUTION / fracunits; - - frac = timer.fraction / denom; - sub = scale_rational(timer.fraction % denom, denom, subparts); - } - break; - - case MAD_UNITS_23_976_FPS: - case MAD_UNITS_24_975_FPS: - case MAD_UNITS_29_97_FPS: - case MAD_UNITS_47_952_FPS: - case MAD_UNITS_49_95_FPS: - case MAD_UNITS_59_94_FPS: - /* drop-frame encoding */ - /* N.B. this is only well-defined for MAD_UNITS_29_97_FPS */ - { - unsigned long frame, cycle, d, m; - - frame = mad_timer_count(timer, fracunits); - - cycle = -fracunits * 60 * 10 - (10 - 1) * 2; - - d = frame / cycle; - m = frame % cycle; - frame += (10 - 1) * 2 * d; - if (m > 2) - frame += 2 * ((m - 2) / (cycle / 10)); - - frac = frame % -fracunits; - seconds = frame / -fracunits; - } - break; - } - - switch (units) { - case MAD_UNITS_HOURS: - minutes = seconds / 60; - hours = minutes / 60; - - sprintf(dest, format, - hours, - (unsigned int) (minutes % 60), - (unsigned int) (seconds % 60), - frac, sub); - break; - - case MAD_UNITS_MINUTES: - minutes = seconds / 60; - - sprintf(dest, format, - minutes, - (unsigned int) (seconds % 60), - frac, sub); - break; - - case MAD_UNITS_SECONDS: - sprintf(dest, format, - seconds, - frac, sub); - break; - - case MAD_UNITS_23_976_FPS: - case MAD_UNITS_24_975_FPS: - case MAD_UNITS_29_97_FPS: - case MAD_UNITS_47_952_FPS: - case MAD_UNITS_49_95_FPS: - case MAD_UNITS_59_94_FPS: - if (fracunits < 0) { - /* not yet implemented */ - sub = 0; - } - - /* fall through */ - - case MAD_UNITS_DECISECONDS: - case MAD_UNITS_CENTISECONDS: - case MAD_UNITS_MILLISECONDS: - - case MAD_UNITS_8000_HZ: - case MAD_UNITS_11025_HZ: - case MAD_UNITS_12000_HZ: - case MAD_UNITS_16000_HZ: - case MAD_UNITS_22050_HZ: - case MAD_UNITS_24000_HZ: - case MAD_UNITS_32000_HZ: - case MAD_UNITS_44100_HZ: - case MAD_UNITS_48000_HZ: - - case MAD_UNITS_24_FPS: - case MAD_UNITS_25_FPS: - case MAD_UNITS_30_FPS: - case MAD_UNITS_48_FPS: - case MAD_UNITS_50_FPS: - case MAD_UNITS_60_FPS: - case MAD_UNITS_75_FPS: - sprintf(dest, format, mad_timer_count(timer, units), sub); - break; - } -} diff --git a/src/libmad/timer.h b/src/libmad/timer.h deleted file mode 100755 index 88e997d5e..000000000 --- a/src/libmad/timer.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * 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: timer.h,v 1.3 2004/04/22 00:23:27 miguelfreitas Exp $ - */ - -# ifndef LIBMAD_TIMER_H -# define LIBMAD_TIMER_H - -typedef struct { - signed long seconds; /* whole seconds */ - unsigned long fraction; /* 1/MAD_TIMER_RESOLUTION seconds */ -} mad_timer_t; - -extern mad_timer_t const mad_timer_zero; - -# define MAD_TIMER_RESOLUTION 352800000UL - -enum mad_units { - MAD_UNITS_HOURS = -2, - MAD_UNITS_MINUTES = -1, - MAD_UNITS_SECONDS = 0, - - /* metric units */ - - MAD_UNITS_DECISECONDS = 10, - MAD_UNITS_CENTISECONDS = 100, - MAD_UNITS_MILLISECONDS = 1000, - - /* audio sample units */ - - MAD_UNITS_8000_HZ = 8000, - MAD_UNITS_11025_HZ = 11025, - MAD_UNITS_12000_HZ = 12000, - - MAD_UNITS_16000_HZ = 16000, - MAD_UNITS_22050_HZ = 22050, - MAD_UNITS_24000_HZ = 24000, - - MAD_UNITS_32000_HZ = 32000, - MAD_UNITS_44100_HZ = 44100, - MAD_UNITS_48000_HZ = 48000, - - /* video frame/field units */ - - MAD_UNITS_24_FPS = 24, - MAD_UNITS_25_FPS = 25, - MAD_UNITS_30_FPS = 30, - MAD_UNITS_48_FPS = 48, - MAD_UNITS_50_FPS = 50, - MAD_UNITS_60_FPS = 60, - - /* CD audio frames */ - - MAD_UNITS_75_FPS = 75, - - /* video drop-frame units */ - - MAD_UNITS_23_976_FPS = -24, - MAD_UNITS_24_975_FPS = -25, - MAD_UNITS_29_97_FPS = -30, - MAD_UNITS_47_952_FPS = -48, - MAD_UNITS_49_95_FPS = -50, - MAD_UNITS_59_94_FPS = -60 -}; - -# define mad_timer_reset(timer) ((void) (*(timer) = mad_timer_zero)) - -int mad_timer_compare(mad_timer_t, mad_timer_t); - -# define mad_timer_sign(timer) mad_timer_compare((timer), mad_timer_zero) - -void mad_timer_negate(mad_timer_t *); -mad_timer_t mad_timer_abs(mad_timer_t); - -void mad_timer_set(mad_timer_t *, unsigned long, unsigned long, unsigned long); -void mad_timer_add(mad_timer_t *, mad_timer_t); -void mad_timer_multiply(mad_timer_t *, signed long); - -signed long mad_timer_count(mad_timer_t, enum mad_units); -unsigned long mad_timer_fraction(mad_timer_t, unsigned long); -void mad_timer_string(mad_timer_t, char *, char const *, - enum mad_units, enum mad_units, unsigned long); - -# endif diff --git a/src/libmad/version.c b/src/libmad/version.c deleted file mode 100644 index 8fc70f408..000000000 --- a/src/libmad/version.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * 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: version.c,v 1.2 2004/04/22 00:23:27 miguelfreitas Exp $ - */ - -# ifdef HAVE_CONFIG_H -# include "config.h" -# endif - -# include "global.h" - -# include "version.h" - -char const mad_version[] = "MPEG Audio Decoder " MAD_VERSION; -char const mad_copyright[] = "Copyright (C) " MAD_PUBLISHYEAR " " MAD_AUTHOR; -char const mad_author[] = MAD_AUTHOR " <" MAD_EMAIL ">"; - -char const mad_build[] = "" -# if defined(DEBUG) - "DEBUG " -# elif defined(NDEBUG) - "NDEBUG " -# endif - -# if defined(EXPERIMENTAL) - "EXPERIMENTAL " -# endif - -# if defined(FPM_64BIT) - "FPM_64BIT " -# elif defined(FPM_INTEL) - "FPM_INTEL " -# elif defined(FPM_ARM) - "FPM_ARM " -# elif defined(FPM_MIPS) - "FPM_MIPS " -# elif defined(FPM_SPARC) - "FPM_SPARC " -# elif defined(FPM_PPC) - "FPM_PPC " -# elif defined(FPM_DEFAULT) - "FPM_DEFAULT " -# endif - -# if defined(ASO_IMDCT) - "ASO_IMDCT " -# endif -# if defined(ASO_INTERLEAVE1) - "ASO_INTERLEAVE1 " -# endif -# if defined(ASO_INTERLEAVE2) - "ASO_INTERLEAVE2 " -# endif -# if defined(ASO_ZEROCHECK) - "ASO_ZEROCHECK " -# endif - -# if defined(OPT_SPEED) - "OPT_SPEED " -# elif defined(OPT_ACCURACY) - "OPT_ACCURACY " -# endif - -# if defined(OPT_SSO) - "OPT_SSO " -# endif - -# if defined(OPT_DCTO) /* never defined here */ - "OPT_DCTO " -# endif - -# if defined(OPT_STRICT) - "OPT_STRICT " -# endif -; diff --git a/src/libmad/version.h b/src/libmad/version.h deleted file mode 100644 index c056e6fc9..000000000 --- a/src/libmad/version.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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: version.h,v 1.2 2004/04/22 00:23:29 miguelfreitas Exp $ - */ - -# ifndef LIBMAD_VERSION_H -# define LIBMAD_VERSION_H - -# define MAD_VERSION_MAJOR 0 -# define MAD_VERSION_MINOR 15 -# define MAD_VERSION_PATCH 1 -# define MAD_VERSION_EXTRA " (beta)" - -# define MAD_VERSION_STRINGIZE(str) #str -# define MAD_VERSION_STRING(num) MAD_VERSION_STRINGIZE(num) - -# define MAD_VERSION MAD_VERSION_STRING(MAD_VERSION_MAJOR) "." \ - MAD_VERSION_STRING(MAD_VERSION_MINOR) "." \ - MAD_VERSION_STRING(MAD_VERSION_PATCH) \ - MAD_VERSION_EXTRA - -# define MAD_PUBLISHYEAR "2000-2004" -# define MAD_AUTHOR "Underbit Technologies, Inc." -# define MAD_EMAIL "info@underbit.com" - -extern char const mad_version[]; -extern char const mad_copyright[]; -extern char const mad_author[]; -extern char const mad_build[]; - -# endif diff --git a/src/libxineadec/Makefile.am b/src/libxineadec/Makefile.am index 25d1e358a..c552d9a08 100644 --- a/src/libxineadec/Makefile.am +++ b/src/libxineadec/Makefile.am @@ -5,14 +5,6 @@ AM_LDFLAGS = $(xineplug_ldflags) EXTRA_DIST = fooaudio.c -if ENABLE_VORBIS -vorbis_module = xineplug_decode_vorbis.la -endif - -if ENABLE_SPEEX -speex_module = xineplug_decode_speex.la -endif - if ENABLE_MUSEPACK musepack_module = xineplug_decode_mpc.la endif @@ -21,6 +13,27 @@ if ENABLE_DTS dts_module = xineplug_decode_dts.la endif +if ENABLE_MAD +mad_module = xineplug_decode_mad.la +endif + +if ENABLE_A52DEC +a52_module = xineplug_decode_a52.la +endif + +if ENABLE_FAAD +faad_module = xineplug_decode_faad.la +endif + +$(top_builddir)/contrib/a52dec/liba52.la: + $(MAKE) -C $(top_builddir)/contrib/a52dec + +$(top_builddir)/contrib/libfaad/libfaad.la: + $(MAKE) -C $(top_builddir)/contrib/libfaad + +$(top_builddir)/contrib/libmad/libmad.la: + $(MAKE) -C $(top_builddir)/contrib/libmad + $(top_builddir)/contrib/libmpcdec/libmpcdec.la: $(MAKE) -C $(top_builddir)/contrib/libmpcdec @@ -33,10 +46,11 @@ $(top_builddir)/contrib/gsm610/libgsm610.la: xineplug_LTLIBRARIES = \ xineplug_decode_gsm610.la \ xineplug_decode_lpcm.la \ - $(vorbis_module) \ - $(speex_module) \ $(musepack_module) \ - $(dts_module) + $(dts_module) \ + $(mad_module) \ + $(a52_module) \ + $(faad_module) xineplug_decode_gsm610_la_SOURCES = gsm610.c xineplug_decode_gsm610_la_LIBADD = $(XINE_LIB) $(top_builddir)/contrib/gsm610/libgsm610.la @@ -45,14 +59,6 @@ xineplug_decode_gsm610_la_CPPFLAGS = -I$(top_srcdir)/contrib/gsm610 xineplug_decode_lpcm_la_SOURCES = xine_lpcm_decoder.c xineplug_decode_lpcm_la_LIBADD = $(XINE_LIB) -xineplug_decode_vorbis_la_SOURCES = xine_vorbis_decoder.c -xineplug_decode_vorbis_la_LIBADD = $(XINE_LIB) $(VORBIS_LIBS) $(OGG_LIBS) -xineplug_decode_vorbis_la_CFLAGS = $(AM_CFLAGS) $(VORBIS_CFLAGS) - -xineplug_decode_speex_la_SOURCES = xine_speex_decoder.c -xineplug_decode_speex_la_LIBADD = $(XINE_LIB) $(SPEEX_LIBS) -xineplug_decode_speex_la_CFLAGS = $(AM_CFLAGS) $(SPEEX_CFLAGS) - xineplug_decode_mpc_la_SOURCES = xine_musepack_decoder.c xineplug_decode_mpc_la_DEPENDENCIES = $(MPCDEC_DEPS) xineplug_decode_mpc_la_LIBADD = $(XINE_LIB) $(MPCDEC_LIBS) @@ -62,3 +68,17 @@ xineplug_decode_dts_la_SOURCES = xine_dts_decoder.c xineplug_decode_dts_la_DEPENDENCIES = $(LIBDTS_DEPS) xineplug_decode_dts_la_LIBADD = $(XINE_LIB) $(LIBDTS_LIBS) xineplug_decode_dts_la_CFLAGS = $(AM_CFLAGS) $(LIBDTS_CFLAGS) + +xineplug_decode_mad_la_SOURCES = xine_mad_decoder.c +xineplug_decode_mad_la_DEPENDENCIES = $(LIBMAD_DEPS) +xineplug_decode_mad_la_LIBADD = $(XINE_LIB) $(LIBMAD_LIBS) +xineplug_decode_mad_la_CFLAGS = $(AM_CFLAGS) $(LIBMAD_CFLAGS) + +xineplug_decode_a52_la_SOURCES = xine_a52_decoder.c +xineplug_decode_a52_la_DEPENDENCIES = $(A52DEC_DEPS) +xineplug_decode_a52_la_LIBADD = $(XINE_LIB) $(A52DEC_LIBS) -lm +xineplug_decode_a52_la_CFLAGS = $(AM_CFLAGS) $(A52DEC_CFLAGS) + +xineplug_decode_faad_la_SOURCES = xine_faad_decoder.c +xineplug_decode_faad_la_LIBADD = $(XINE_LIB) $(top_builddir)/contrib/libfaad/libfaad.la -lm +xineplug_decode_faad_la_CPPFLAGS = -I$(top_srcdir)/contrib/libfaad diff --git a/src/liba52/xine_a52_decoder.c b/src/libxineadec/xine_a52_decoder.c index 5435e9664..f6fa8a9a3 100644 --- a/src/liba52/xine_a52_decoder.c +++ b/src/libxineadec/xine_a52_decoder.c @@ -64,7 +64,7 @@ #include "buffer.h" #include "xineutils.h" -#include "crc.c" +#include "../../contrib/a52dec/crc.c" #undef DEBUG_A52 #ifdef DEBUG_A52 diff --git a/src/libfaad/xine_faad_decoder.c b/src/libxineadec/xine_faad_decoder.c index 169874a44..169874a44 100644 --- a/src/libfaad/xine_faad_decoder.c +++ b/src/libxineadec/xine_faad_decoder.c diff --git a/src/libmad/xine_mad_decoder.c b/src/libxineadec/xine_mad_decoder.c index 28407cfec..98695db68 100644 --- a/src/libmad/xine_mad_decoder.c +++ b/src/libxineadec/xine_mad_decoder.c @@ -39,10 +39,15 @@ #include "xine_internal.h" #include "audio_out.h" #include "buffer.h" -#include "frame.h" -#include "synth.h" #include "xineutils.h" +#ifdef HAVE_MAD_H +# include <mad.h> +#else +# include "frame.h" +# include "synth.h" +#endif + #define INPUT_BUF_SIZE 16384 typedef struct { diff --git a/src/libxinevdec/Makefile.am b/src/libxinevdec/Makefile.am index 28a926a79..ac632dfd5 100644 --- a/src/libxinevdec/Makefile.am +++ b/src/libxinevdec/Makefile.am @@ -13,10 +13,6 @@ if ENABLE_GDK_PIXBUF gdkpixbuf_module = xineplug_decode_gdk_pixbuf.la endif -if ENABLE_THEORA -theora_module = xineplug_decode_theora.la -endif - xineplug_LTLIBRARIES = $(image_module) \ $(gdkpixbuf_module) \ $(theora_module) \ @@ -40,7 +36,3 @@ xineplug_decode_image_la_CFLAGS = $(AM_CFLAGS) $(WAND_CFLAGS) xineplug_decode_gdk_pixbuf_la_SOURCES = gdkpixbuf.c xineplug_decode_gdk_pixbuf_la_LIBADD = $(XINE_LIB) $(DYNAMIC_LD_LIBS) $(GDK_PIXBUF_LIBS) xineplug_decode_gdk_pixbuf_la_CFLAGS = $(AM_CFLAGS) $(GDK_PIXBUF_CFLAGS) - -xineplug_decode_theora_la_SOURCES = xine_theora_decoder.c -xineplug_decode_theora_la_LIBADD = $(XINE_LIB) $(OGG_LIBS) $(THEORA_LIBS) -xineplug_decode_theora_la_CFLAGS = $(AM_CFLAGS) $(OGG_CFLAGS) $(THEORA_CFLAGS) diff --git a/src/video_out/Makefile.am b/src/video_out/Makefile.am index a4f219b9c..9a9f879fe 100644 --- a/src/video_out/Makefile.am +++ b/src/video_out/Makefile.am @@ -6,25 +6,13 @@ AM_OBJCFLAGS = $(DEFAULT_OCFLAGS) $(VISIBILITY_FLAG) SUBDIRS = -if BUILD_DHA_KMOD -SUBDIRS += libdha -endif - -# vidix depends on portions of dha -if ENABLE_VIDIX -if !BUILD_DHA_KMOD -SUBDIRS += libdha -endif -SUBDIRS += vidix -endif - if ENABLE_MACOSX_VIDEO SUBDIRS += macosx endif EXTRA_DIST = video_out_directfb.c video_out_directfb_fb.c video_out_directfb_x.c video_out_directx.c video_out_macosx.m -noinst_HEADERS = deinterlace.h video_out_syncfb.h yuv2rgb.h x11osd.h xcbosd.h +noinst_HEADERS = video_out_syncfb.h yuv2rgb.h x11osd.h xcbosd.h if HAVE_X11 X11OSD = x11osd.c @@ -64,6 +52,8 @@ endif if ENABLE_VIDIX vidix_module = xineplug_vo_out_vidix.la +$(top_builddir)/contrib/vidix/libvidix.la: + $(MAKE) -C $(top_builddir)/contrib/vidix libvidix.la endif if ENABLE_AA @@ -122,7 +112,7 @@ xineplug_vo_out_xcbshm_la_SOURCES = yuv2rgb.c yuv2rgb_mmx.c yuv2rgb_mlib.c video xineplug_vo_out_xcbshm_la_LIBADD = $(MLIB_LIBS) $(XINE_LIB) $(PTHREAD_LIBS) $(XCB_LIBS) $(XCBSHM_LIBS) xineplug_vo_out_xcbshm_la_CFLAGS = $(AM_CFLAGS) $(MLIB_CFLAGS) $(XCB_CFLAGS) $(XCBSHM_CFLAGS) -xineplug_vo_out_xcbxv_la_SOURCES = deinterlace.c video_out_xcbxv.c $(XCBOSD) +xineplug_vo_out_xcbxv_la_SOURCES = video_out_xcbxv.c $(XCBOSD) xineplug_vo_out_xcbxv_la_LIBADD = $(XINE_LIB) $(PTHREAD_LIBS) $(XCBXV_LIBS) $(XCB_LIBS) xineplug_vo_out_xcbxv_la_CFLAGS = $(AM_CFLAGS) $(XCB_CFLAGS) $(XCBXV_CFLAGS) @@ -131,15 +121,15 @@ xineplug_vo_out_xshm_la_SOURCES = yuv2rgb.c yuv2rgb_mmx.c yuv2rgb_mlib.c \ xineplug_vo_out_xshm_la_LIBADD = $(MLIB_LIBS) $(X_LIBS) $(XINE_LIB) $(PTHREAD_LIBS) xineplug_vo_out_xshm_la_CFLAGS = $(AM_CFLAGS) $(X_CFLAGS) $(MLIB_CFLAGS) -fno-strict-aliasing -xineplug_vo_out_xv_la_SOURCES = $(X11OSD) deinterlace.c video_out_xv.c +xineplug_vo_out_xv_la_SOURCES = $(X11OSD) video_out_xv.c xineplug_vo_out_xv_la_LIBADD = $(XV_LIBS) $(X_LIBS) $(XINE_LIB) $(PTHREAD_LIBS) xineplug_vo_out_xv_la_CFLAGS = $(AM_CFLAGS) $(X_CFLAGS) $(XV_CFLAGS) -fno-strict-aliasing -xineplug_vo_out_xvmc_la_SOURCES = deinterlace.c video_out_xvmc.c +xineplug_vo_out_xvmc_la_SOURCES = video_out_xvmc.c xineplug_vo_out_xvmc_la_LIBADD = $(XVMC_LIBS) $(XV_LIBS) $(X_LIBS) $(XINE_LIB) $(PTHREAD_LIBS) xineplug_vo_out_xvmc_la_CFLAGS = $(AM_CFLAGS) $(X_CFLAGS) $(XV_CFLAGS) -xineplug_vo_out_xxmc_la_SOURCES = $(X11OSD) deinterlace.c video_out_xxmc.c\ +xineplug_vo_out_xxmc_la_SOURCES = $(X11OSD) video_out_xxmc.c\ xvmc_mocomp.c xvmc_vld.c xxmc.h xineplug_vo_out_xxmc_la_LIBADD = $(XXMC_LIBS) $(XV_LIBS) $(X_LIBS) $(XINE_LIB) $(PTHREAD_LIBS) xineplug_vo_out_xxmc_la_CFLAGS = $(AM_CFLAGS) $(X_CFLAGS) $(XV_CFLAGS) -fno-strict-aliasing @@ -165,10 +155,10 @@ xineplug_vo_out_pgx32_la_CPPFLAGS = $(AM_CPPFLAGS) $(SUNDGA_CPPFLAGS) xineplug_vo_out_vidix_la_SOURCES = video_out_vidix.c $(X11OSD) xineplug_vo_out_vidix_la_LIBADD = $(XINE_LIB) $(X_LIBS) \ - $(top_builddir)/src/video_out/vidix/libvidix.la $(PTHREAD_LIBS) + $(top_builddir)/contrib/vidix/libvidix.la $(PTHREAD_LIBS) xineplug_vo_out_vidix_la_CFLAGS = $(AM_CFLAGS) $(X_CFLAGS) -fno-strict-aliasing -xineplug_vo_out_vidix_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_builddir)/src/video_out/vidix \ - -I$(top_srcdir)/src/video_out/vidix +xineplug_vo_out_vidix_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_builddir)/contrib/vidix \ + -I$(top_srcdir)/contrib/vidix xineplug_vo_out_aa_la_SOURCES = video_out_aa.c diff --git a/src/video_out/deinterlace.c b/src/video_out/deinterlace.c deleted file mode 100644 index 1fda3d733..000000000 --- a/src/video_out/deinterlace.c +++ /dev/null @@ -1,847 +0,0 @@ - /* - * Copyright (C) 2001 the xine project - * - * This file is part of xine, a free video player. - * - * xine 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. - * - * xine 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 - * - * Deinterlace routines by Miguel Freitas - * based of DScaler project sources (deinterlace.sourceforge.net) - * - * Currently only available for Xv driver and MMX extensions - * - * small todo list: - * - implement non-MMX versions for all methods - * - support MMX2 instructions - * - move some generic code from xv driver to this file - * - make it also work for yuy2 frames - * - */ - -#include <stdio.h> -#include <string.h> -#include "xine_internal.h" -#include "deinterlace.h" -#include "xineutils.h" - - -/* - DeinterlaceFieldBob algorithm - Based on Virtual Dub plugin by Gunnar Thalin - MMX asm version from dscaler project (deinterlace.sourceforge.net) - Linux version for Xine player by Miguel Freitas -*/ -static void deinterlace_bob_yuv_mmx( uint8_t *pdst, uint8_t *psrc[], - int width, int height ) -{ -#if defined(ARCH_X86) || defined(ARCH_X86_64) - int Line; - uint64_t *YVal1; - uint64_t *YVal2; - uint64_t *YVal3; - uint64_t *Dest; - uint8_t* pEvenLines = psrc[0]; - uint8_t* pOddLines = psrc[0]+width; - int LineLength = width; - int SourcePitch = width * 2; - int IsOdd = 1; - long EdgeDetect = 625; - long JaggieThreshold = 73; - - int n; - - uint64_t qwEdgeDetect; - uint64_t qwThreshold; - - static mmx_t YMask = {ub:{0xff,0,0xff,0,0xff,0,0xff,0}}; - static mmx_t Mask = {ub:{0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe}}; - - qwEdgeDetect = EdgeDetect; - qwEdgeDetect += (qwEdgeDetect << 48) + (qwEdgeDetect << 32) + (qwEdgeDetect << 16); - qwThreshold = JaggieThreshold; - qwThreshold += (qwThreshold << 48) + (qwThreshold << 32) + (qwThreshold << 16); - - - // copy first even line no matter what, and the first odd line if we're - // processing an odd field. - xine_fast_memcpy(pdst, pEvenLines, LineLength); - if (IsOdd) - xine_fast_memcpy(pdst + LineLength, pOddLines, LineLength); - - height = height / 2; - for (Line = 0; Line < height - 1; ++Line) - { - if (IsOdd) - { - YVal1 = (uint64_t *)(pOddLines + Line * SourcePitch); - YVal2 = (uint64_t *)(pEvenLines + (Line + 1) * SourcePitch); - YVal3 = (uint64_t *)(pOddLines + (Line + 1) * SourcePitch); - Dest = (uint64_t *)(pdst + (Line * 2 + 2) * LineLength); - } - else - { - YVal1 = (uint64_t *)(pEvenLines + Line * SourcePitch); - YVal2 = (uint64_t *)(pOddLines + Line * SourcePitch); - YVal3 = (uint64_t *)(pEvenLines + (Line + 1) * SourcePitch); - Dest = (uint64_t *)(pdst + (Line * 2 + 1) * LineLength); - } - - // For ease of reading, the comments below assume that we're operating on an odd - // field (i.e., that bIsOdd is true). The exact same processing is done when we - // operate on an even field, but the roles of the odd and even fields are reversed. - // It's just too cumbersome to explain the algorithm in terms of "the next odd - // line if we're doing an odd field, or the next even line if we're doing an - // even field" etc. So wherever you see "odd" or "even" below, keep in mind that - // half the time this function is called, those words' meanings will invert. - - // Copy the odd line to the overlay verbatim. - xine_fast_memcpy((char *)Dest + LineLength, YVal3, LineLength); - - n = LineLength >> 3; - while( n-- ) - { - movq_m2r (*YVal1++, mm0); - movq_m2r (*YVal2++, mm1); - movq_m2r (*YVal3++, mm2); - - // get intensities in mm3 - 4 - movq_r2r ( mm0, mm3 ); - pand_m2r ( YMask, mm3 ); - movq_r2r ( mm1, mm4 ); - pand_m2r ( YMask, mm4 ); - movq_r2r ( mm2, mm5 ); - pand_m2r ( YMask, mm5 ); - - // get average in mm0 - pand_m2r ( Mask, mm0 ); - pand_m2r ( Mask, mm2 ); - psrlw_i2r ( 01, mm0 ); - psrlw_i2r ( 01, mm2 ); - paddw_r2r ( mm2, mm0 ); - - // work out (O1 - E) * (O2 - E) / 2 - EdgeDetect * (O1 - O2) ^ 2 >> 12 - // result will be in mm6 - - psrlw_i2r ( 01, mm3 ); - psrlw_i2r ( 01, mm4 ); - psrlw_i2r ( 01, mm5 ); - - movq_r2r ( mm3, mm6 ); - psubw_r2r ( mm4, mm6 ); //mm6 = O1 - E - - movq_r2r ( mm5, mm7 ); - psubw_r2r ( mm4, mm7 ); //mm7 = O2 - E - - pmullw_r2r ( mm7, mm6 ); // mm6 = (O1 - E) * (O2 - E) - - movq_r2r ( mm3, mm7 ); - psubw_r2r ( mm5, mm7 ); // mm7 = (O1 - O2) - pmullw_r2r ( mm7, mm7 ); // mm7 = (O1 - O2) ^ 2 - psrlw_i2r ( 12, mm7 ); // mm7 = (O1 - O2) ^ 2 >> 12 - pmullw_m2r ( *&qwEdgeDetect, mm7 );// mm7 = EdgeDetect * (O1 - O2) ^ 2 >> 12 - - psubw_r2r ( mm7, mm6 ); // mm6 is what we want - - pcmpgtw_m2r ( *&qwThreshold, mm6 ); - - movq_r2r ( mm6, mm7 ); - - pand_r2r ( mm6, mm0 ); - - pandn_r2r ( mm1, mm7 ); - - por_r2r ( mm0, mm7 ); - - movq_r2m ( mm7, *Dest++ ); - } - } - - // Copy last odd line if we're processing an even field. - if (! IsOdd) - { - xine_fast_memcpy(pdst + (height * 2 - 1) * LineLength, - pOddLines + (height - 1) * SourcePitch, - LineLength); - } - - // clear out the MMX registers ready for doing floating point - // again - emms(); -#endif -} - -/* Deinterlace the latest field, with a tendency to weave rather than bob. - Good for high detail on low-movement scenes. - Seems to produce bad output in general case, need to check if this - is normal or if the code is broken. -*/ -static int deinterlace_weave_yuv_mmx( uint8_t *pdst, uint8_t *psrc[], - int width, int height ) -{ -#if defined(ARCH_X86) || defined(ARCH_X86_64) - - int Line; - uint64_t *YVal1; - uint64_t *YVal2; - uint64_t *YVal3; - uint64_t *YVal4; - uint64_t *Dest; - uint8_t* pEvenLines = psrc[0]; - uint8_t* pOddLines = psrc[0]+width; - uint8_t* pPrevLines; - - int LineLength = width; - int SourcePitch = width * 2; - int IsOdd = 1; - - long TemporalTolerance = 300; - long SpatialTolerance = 600; - long SimilarityThreshold = 25; - - int n; - - uint64_t qwSpatialTolerance; - uint64_t qwTemporalTolerance; - uint64_t qwThreshold; - - static mmx_t YMask = {ub:{0xff,0,0xff,0,0xff,0,0xff,0}}; - static mmx_t Mask = {ub:{0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe}}; - - - // Make sure we have all the data we need. - if ( psrc[0] == NULL || psrc[1] == NULL ) - return 0; - - if (IsOdd) - pPrevLines = psrc[1] + width; - else - pPrevLines = psrc[1]; - - // Since the code uses MMX to process 4 pixels at a time, we need our constants - // to be represented 4 times per quadword. - qwSpatialTolerance = SpatialTolerance; - qwSpatialTolerance += (qwSpatialTolerance << 48) + (qwSpatialTolerance << 32) + (qwSpatialTolerance << 16); - qwTemporalTolerance = TemporalTolerance; - qwTemporalTolerance += (qwTemporalTolerance << 48) + (qwTemporalTolerance << 32) + (qwTemporalTolerance << 16); - qwThreshold = SimilarityThreshold; - qwThreshold += (qwThreshold << 48) + (qwThreshold << 32) + (qwThreshold << 16); - - // copy first even line no matter what, and the first odd line if we're - // processing an even field. - xine_fast_memcpy(pdst, pEvenLines, LineLength); - if (!IsOdd) - xine_fast_memcpy(pdst + LineLength, pOddLines, LineLength); - - height = height / 2; - for (Line = 0; Line < height - 1; ++Line) - { - if (IsOdd) - { - YVal1 = (uint64_t *)(pEvenLines + Line * SourcePitch); - YVal2 = (uint64_t *)(pOddLines + Line * SourcePitch); - YVal3 = (uint64_t *)(pEvenLines + (Line + 1) * SourcePitch); - YVal4 = (uint64_t *)(pPrevLines + Line * SourcePitch); - Dest = (uint64_t *)(pdst + (Line * 2 + 1) * LineLength); - } - else - { - YVal1 = (uint64_t *)(pOddLines + Line * SourcePitch); - YVal2 = (uint64_t *)(pEvenLines + (Line + 1) * SourcePitch); - YVal3 = (uint64_t *)(pOddLines + (Line + 1) * SourcePitch); - YVal4 = (uint64_t *)(pPrevLines + (Line + 1) * SourcePitch); - Dest = (uint64_t *)(pdst + (Line * 2 + 2) * LineLength); - } - - // For ease of reading, the comments below assume that we're operating on an odd - // field (i.e., that bIsOdd is true). The exact same processing is done when we - // operate on an even field, but the roles of the odd and even fields are reversed. - // It's just too cumbersome to explain the algorithm in terms of "the next odd - // line if we're doing an odd field, or the next even line if we're doing an - // even field" etc. So wherever you see "odd" or "even" below, keep in mind that - // half the time this function is called, those words' meanings will invert. - - // Copy the even scanline below this one to the overlay buffer, since we'll be - // adapting the current scanline to the even lines surrounding it. The scanline - // above has already been copied by the previous pass through the loop. - xine_fast_memcpy((char *)Dest + LineLength, YVal3, LineLength); - - n = LineLength >> 3; - while( n-- ) - { - movq_m2r ( *YVal1++, mm0 ); // mm0 = E1 - movq_m2r ( *YVal2++, mm1 ); // mm1 = O - movq_m2r ( *YVal3++, mm2 ); // mm2 = E2 - - movq_r2r ( mm0, mm3 ); // mm3 = intensity(E1) - movq_r2r ( mm1, mm4 ); // mm4 = intensity(O) - movq_r2r ( mm2, mm6 ); // mm6 = intensity(E2) - - pand_m2r ( YMask, mm3 ); - pand_m2r ( YMask, mm4 ); - pand_m2r ( YMask, mm6 ); - - // Average E1 and E2 for interpolated bobbing. - // leave result in mm0 - pand_m2r ( Mask, mm0 ); // mm0 = E1 with lower chroma bit stripped off - pand_m2r ( Mask, mm2 ); // mm2 = E2 with lower chroma bit stripped off - psrlw_i2r ( 01, mm0 ); // mm0 = E1 / 2 - psrlw_i2r ( 01, mm2 ); // mm2 = E2 / 2 - paddb_r2r ( mm2, mm0 ); - - // The meat of the work is done here. We want to see whether this pixel is - // close in luminosity to ANY of: its top neighbor, its bottom neighbor, - // or its predecessor. To do this without branching, we use MMX's - // saturation feature, which gives us Z(x) = x if x>=0, or 0 if x<0. - // - // The formula we're computing here is - // Z(ST - (E1 - O) ^ 2) + Z(ST - (E2 - O) ^ 2) + Z(TT - (Oold - O) ^ 2) - // where ST is spatial tolerance and TT is temporal tolerance. The idea - // is that if a pixel is similar to none of its neighbors, the resulting - // value will be pretty low, probably zero. A high value therefore indicates - // that the pixel had a similar neighbor. The pixel in the same position - // in the field before last (Oold) is considered a neighbor since we want - // to be able to display 1-pixel-high horizontal lines. - - movq_m2r ( *&qwSpatialTolerance, mm7 ); - movq_r2r ( mm3, mm5 ); // mm5 = E1 - psubsw_r2r ( mm4, mm5 ); // mm5 = E1 - O - psraw_i2r ( 1, mm5 ); - pmullw_r2r ( mm5, mm5 ); // mm5 = (E1 - O) ^ 2 - psubusw_r2r ( mm5, mm7 ); // mm7 = ST - (E1 - O) ^ 2, or 0 if that's negative - - movq_m2r ( *&qwSpatialTolerance, mm3 ); - movq_r2r ( mm6, mm5 ); // mm5 = E2 - psubsw_r2r ( mm4, mm5 ); // mm5 = E2 - O - psraw_i2r ( 1, mm5 ); - pmullw_r2r ( mm5, mm5 ); // mm5 = (E2 - O) ^ 2 - psubusw_r2r ( mm5, mm3 ); // mm0 = ST - (E2 - O) ^ 2, or 0 if that's negative - paddusw_r2r ( mm3, mm7 ); // mm7 = (ST - (E1 - O) ^ 2) + (ST - (E2 - O) ^ 2) - - movq_m2r ( *&qwTemporalTolerance, mm3 ); - movq_m2r ( *YVal4++, mm5 ); // mm5 = Oold - pand_m2r ( YMask, mm5 ); - psubsw_r2r ( mm4, mm5 ); // mm5 = Oold - O - psraw_i2r ( 1, mm5 ); // XXX - pmullw_r2r ( mm5, mm5 ); // mm5 = (Oold - O) ^ 2 - psubusw_r2r ( mm5, mm3 ); /* mm0 = TT - (Oold - O) ^ 2, or 0 if that's negative */ - paddusw_r2r ( mm3, mm7 ); // mm7 = our magic number - - /* - * Now compare the similarity totals against our threshold. The pcmpgtw - * instruction will populate the target register with a bunch of mask bits, - * filling words where the comparison is true with 1s and ones where it's - * false with 0s. A few ANDs and NOTs and an OR later, we have bobbed - * values for pixels under the similarity threshold and weaved ones for - * pixels over the threshold. - */ - - pcmpgtw_m2r( *&qwThreshold, mm7 ); // mm7 = 0xffff where we're greater than the threshold, 0 elsewhere - movq_r2r ( mm7, mm6 ); // mm6 = 0xffff where we're greater than the threshold, 0 elsewhere - pand_r2r ( mm1, mm7 ); // mm7 = weaved data where we're greater than the threshold, 0 elsewhere - pandn_r2r ( mm0, mm6 ); // mm6 = bobbed data where we're not greater than the threshold, 0 elsewhere - por_r2r ( mm6, mm7 ); // mm7 = bobbed and weaved data - - movq_r2m ( mm7, *Dest++ ); - } - } - - // Copy last odd line if we're processing an odd field. - if (IsOdd) - { - xine_fast_memcpy(pdst + (height * 2 - 1) * LineLength, - pOddLines + (height - 1) * SourcePitch, - LineLength); - } - - // clear out the MMX registers ready for doing floating point - // again - emms(); - -#endif - - return 1; -} - - -// This is a simple lightweight DeInterlace method that uses little CPU time -// but gives very good results for low or intermedite motion. (MORE CPU THAN BOB) -// It defers frames by one field, but that does not seem to produce noticeable -// lip sync problems. -// -// The method used is to take either the older or newer weave pixel depending -// upon which give the smaller comb factor, and then clip to avoid large damage -// when wrong. -// -// I'd intended this to be part of a larger more elaborate method added to -// Blended Clip but this give too good results for the CPU to ignore here. -static int deinterlace_greedy_yuv_mmx( uint8_t *pdst, uint8_t *psrc[], - int width, int height ) -{ -#if defined(ARCH_X86) || defined(ARCH_X86_64) - int Line; - int LoopCtr; - uint64_t *L1; // ptr to Line1, of 3 - uint64_t *L2; // ptr to Line2, the weave line - uint64_t *L3; // ptr to Line3 - uint64_t *LP2; // ptr to prev Line2 - uint64_t *Dest; - uint8_t* pEvenLines = psrc[0]; - uint8_t* pOddLines = psrc[0]+width; - uint8_t* pPrevLines; - - static mmx_t ShiftMask = {ub:{0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe}}; - - int LineLength = width; - int SourcePitch = width * 2; - int IsOdd = 1; - long GreedyMaxComb = 15; - static mmx_t MaxComb; - int i; - - if ( psrc[0] == NULL || psrc[1] == NULL ) - return 0; - - if (IsOdd) - pPrevLines = psrc[1] + width; - else - pPrevLines = psrc[1]; - - - for( i = 0; i < 8; i++ ) - MaxComb.ub[i] = GreedyMaxComb; // How badly do we let it weave? 0-255 - - - // copy first even line no matter what, and the first odd line if we're - // processing an EVEN field. (note diff from other deint rtns.) - xine_fast_memcpy(pdst, pEvenLines, LineLength); //DL0 - if (!IsOdd) - xine_fast_memcpy(pdst + LineLength, pOddLines, LineLength); //DL1 - - height = height / 2; - for (Line = 0; Line < height - 1; ++Line) - { - LoopCtr = LineLength / 8; // there are LineLength / 8 qwords per line - - if (IsOdd) - { - L1 = (uint64_t *)(pEvenLines + Line * SourcePitch); - L2 = (uint64_t *)(pOddLines + Line * SourcePitch); - L3 = (uint64_t *)(pEvenLines + (Line + 1) * SourcePitch); - LP2 = (uint64_t *)(pPrevLines + Line * SourcePitch); // prev Odd lines - Dest = (uint64_t *)(pdst + (Line * 2 + 1) * LineLength); - } - else - { - L1 = (uint64_t *)(pOddLines + Line * SourcePitch); - L2 = (uint64_t *)(pEvenLines + (Line + 1) * SourcePitch); - L3 = (uint64_t *)(pOddLines + (Line + 1) * SourcePitch); - LP2 = (uint64_t *)(pPrevLines + (Line + 1) * SourcePitch); //prev even lines - Dest = (uint64_t *)(pdst + (Line * 2 + 2) * LineLength); - } - - xine_fast_memcpy((char *)Dest + LineLength, L3, LineLength); - -// For ease of reading, the comments below assume that we're operating on an odd -// field (i.e., that info->IsOdd is true). Assume the obvious for even lines.. - - while( LoopCtr-- ) - { - movq_m2r ( *L1++, mm1 ); - movq_m2r ( *L2++, mm2 ); - movq_m2r ( *L3++, mm3 ); - movq_m2r ( *LP2++, mm0 ); - - // average L1 and L3 leave result in mm4 - movq_r2r ( mm1, mm4 ); // L1 - - pand_m2r ( ShiftMask, mm4 ); - psrlw_i2r ( 01, mm4 ); - movq_r2r ( mm3, mm5 ); // L3 - pand_m2r ( ShiftMask, mm5 ); - psrlw_i2r ( 01, mm5 ); - paddb_r2r ( mm5, mm4 ); // the average, for computing comb - - // get abs value of possible L2 comb - movq_r2r ( mm2, mm7 ); // L2 - psubusb_r2r ( mm4, mm7 ); // L2 - avg - movq_r2r ( mm4, mm5 ); // avg - psubusb_r2r ( mm2, mm5 ); // avg - L2 - por_r2r ( mm7, mm5 ); // abs(avg-L2) - movq_r2r ( mm4, mm6 ); // copy of avg for later - - // get abs value of possible LP2 comb - movq_r2r ( mm0, mm7 ); // LP2 - psubusb_r2r ( mm4, mm7 ); // LP2 - avg - psubusb_r2r ( mm0, mm4 ); // avg - LP2 - por_r2r ( mm7, mm4 ); // abs(avg-LP2) - - // use L2 or LP2 depending upon which makes smaller comb - psubusb_r2r ( mm5, mm4 ); // see if it goes to zero - psubusb_r2r ( mm5, mm5 ); // 0 - pcmpeqb_r2r ( mm5, mm4 ); // if (mm4=0) then FF else 0 - pcmpeqb_r2r ( mm4, mm5 ); // opposite of mm4 - - // if Comb(LP2) <= Comb(L2) then mm4=ff, mm5=0 else mm4=0, mm5 = 55 - pand_r2r ( mm2, mm5 ); // use L2 if mm5 == ff, else 0 - pand_r2r ( mm0, mm4 ); // use LP2 if mm4 = ff, else 0 - por_r2r ( mm5, mm4 ); // may the best win - - // Now lets clip our chosen value to be not outside of the range - // of the high/low range L1-L3 by more than abs(L1-L3) - // This allows some comb but limits the damages and also allows more - // detail than a boring oversmoothed clip. - - movq_r2r ( mm1, mm2 ); // copy L1 - psubusb_r2r ( mm3, mm2 ); // - L3, with saturation - paddusb_r2r ( mm3, mm2 ); // now = Max(L1,L3) - - pcmpeqb_r2r ( mm7, mm7 ); // all ffffffff - psubusb_r2r ( mm1, mm7 ); // - L1 - paddusb_r2r ( mm7, mm3 ); // add, may sat at fff.. - psubusb_r2r ( mm7, mm3 ); // now = Min(L1,L3) - - // allow the value to be above the high or below the low by amt of MaxComb - paddusb_m2r ( MaxComb, mm2 ); // increase max by diff - psubusb_m2r ( MaxComb, mm3 ); // lower min by diff - - psubusb_r2r ( mm3, mm4 ); // best - Min - paddusb_r2r ( mm3, mm4 ); // now = Max(best,Min(L1,L3) - - pcmpeqb_r2r ( mm7, mm7 ); // all ffffffff - psubusb_r2r ( mm4, mm7 ); // - Max(best,Min(best,L3) - paddusb_r2r ( mm7, mm2 ); // add may sat at FFF.. - psubusb_r2r ( mm7, mm2 ); // now = Min( Max(best, Min(L1,L3), L2 )=L2 clipped - - movq_r2m ( mm2, *Dest++ ); // move in our clipped best - - } - } - - /* Copy last odd line if we're processing an Odd field. */ - if (IsOdd) - { - xine_fast_memcpy(pdst + (height * 2 - 1) * LineLength, - pOddLines + (height - 1) * SourcePitch, - LineLength); - } - - /* clear out the MMX registers ready for doing floating point again */ - emms(); - -#endif - - return 1; -} - -/* Use one field to interpolate the other (low cpu utilization) - Will lose resolution but does not produce weaving effect - (good for fast moving scenes) also know as "linear interpolation" -*/ -static void deinterlace_onefield_yuv_mmx( uint8_t *pdst, uint8_t *psrc[], - int width, int height ) -{ -#if defined(ARCH_X86) || defined(ARCH_X86_64) - int Line; - uint64_t *YVal1; - uint64_t *YVal3; - uint64_t *Dest; - uint8_t* pEvenLines = psrc[0]; - uint8_t* pOddLines = psrc[0]+width; - int LineLength = width; - int SourcePitch = width * 2; - int IsOdd = 1; - - int n; - - static mmx_t Mask = {ub:{0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe}}; - - /* - * copy first even line no matter what, and the first odd line if we're - * processing an odd field. - */ - - xine_fast_memcpy(pdst, pEvenLines, LineLength); - if (IsOdd) - xine_fast_memcpy(pdst + LineLength, pOddLines, LineLength); - - height = height / 2; - for (Line = 0; Line < height - 1; ++Line) - { - if (IsOdd) - { - YVal1 = (uint64_t *)(pOddLines + Line * SourcePitch); - YVal3 = (uint64_t *)(pOddLines + (Line + 1) * SourcePitch); - Dest = (uint64_t *)(pdst + (Line * 2 + 2) * LineLength); - } - else - { - YVal1 = (uint64_t *)(pEvenLines + Line * SourcePitch); - YVal3 = (uint64_t *)(pEvenLines + (Line + 1) * SourcePitch); - Dest = (uint64_t *)(pdst + (Line * 2 + 1) * LineLength); - } - - // Copy the odd line to the overlay verbatim. - xine_fast_memcpy((char *)Dest + LineLength, YVal3, LineLength); - - n = LineLength >> 3; - while( n-- ) - { - movq_m2r (*YVal1++, mm0); - movq_m2r (*YVal3++, mm2); - - // get average in mm0 - pand_m2r ( Mask, mm0 ); - pand_m2r ( Mask, mm2 ); - psrlw_i2r ( 01, mm0 ); - psrlw_i2r ( 01, mm2 ); - paddw_r2r ( mm2, mm0 ); - - movq_r2m ( mm0, *Dest++ ); - } - } - - /* Copy last odd line if we're processing an even field. */ - if (! IsOdd) - { - xine_fast_memcpy(pdst + (height * 2 - 1) * LineLength, - pOddLines + (height - 1) * SourcePitch, - LineLength); - } - - /* clear out the MMX registers ready for doing floating point - * again - */ - emms(); -#endif -} - -/* Linear Blend filter - does a kind of vertical blurring on the image. - (idea borrowed from mplayer's sources) -*/ -static void deinterlace_linearblend_yuv_mmx( uint8_t *pdst, uint8_t *psrc[], - int width, int height ) -{ -#if defined(ARCH_X86) || defined(ARCH_X86_64) - int Line; - uint64_t *YVal1; - uint64_t *YVal2; - uint64_t *YVal3; - uint64_t *Dest; - int LineLength = width; - - int n; - - /* Copy first line */ - xine_fast_memcpy(pdst, psrc[0], LineLength); - - for (Line = 1; Line < height - 1; ++Line) - { - YVal1 = (uint64_t *)(psrc[0] + (Line - 1) * LineLength); - YVal2 = (uint64_t *)(psrc[0] + (Line) * LineLength); - YVal3 = (uint64_t *)(psrc[0] + (Line + 1) * LineLength); - Dest = (uint64_t *)(pdst + Line * LineLength); - - n = LineLength >> 3; - while( n-- ) - { - /* load data from 3 lines */ - movq_m2r (*YVal1++, mm0); - movq_m2r (*YVal2++, mm1); - movq_m2r (*YVal3++, mm2); - - /* expand bytes to words */ - punpckhbw_r2r (mm0, mm3); - punpckhbw_r2r (mm1, mm4); - punpckhbw_r2r (mm2, mm5); - punpcklbw_r2r (mm0, mm0); - punpcklbw_r2r (mm1, mm1); - punpcklbw_r2r (mm2, mm2); - - /* - * deinterlacing: - * deint_line = (line0 + 2*line1 + line2) / 4 - */ - psrlw_i2r (07, mm0); - psrlw_i2r (06, mm1); - psrlw_i2r (07, mm2); - psrlw_i2r (07, mm3); - psrlw_i2r (06, mm4); - psrlw_i2r (07, mm5); - paddw_r2r (mm1, mm0); - paddw_r2r (mm2, mm0); - paddw_r2r (mm4, mm3); - paddw_r2r (mm5, mm3); - psrlw_i2r (03, mm0); - psrlw_i2r (03, mm3); - - /* pack 8 words to 8 bytes in mm0 */ - packuswb_r2r (mm3, mm0); - - movq_r2m ( mm0, *Dest++ ); - } - } - - /* Copy last line */ - xine_fast_memcpy(pdst + Line * LineLength, - psrc[0] + Line * LineLength, LineLength); - - /* clear out the MMX registers ready for doing floating point - * again - */ - emms(); -#endif -} - -/* Linear Blend filter - C version contributed by Rogerio Brito. - This algorithm has the same interface as the other functions. - - The destination "screen" (pdst) is constructed from the source - screen (psrc[0]) line by line. - - The i-th line of the destination screen is the average of 3 lines - from the source screen: the (i-1)-th, i-th and (i+1)-th lines, with - the i-th line having weight 2 in the computation. - - Remarks: - * each line on pdst doesn't depend on previous lines; - * due to the way the algorithm is defined, the first & last lines of the - screen aren't deinterlaced. - -*/ -static void deinterlace_linearblend_yuv( uint8_t *pdst, uint8_t *psrc[], - int width, int height ) -{ - register int x, y; - register uint8_t *l0, *l1, *l2, *l3; - - l0 = pdst; /* target line */ - l1 = psrc[0]; /* 1st source line */ - l2 = l1 + width; /* 2nd source line = line that follows l1 */ - l3 = l2 + width; /* 3rd source line = line that follows l2 */ - - /* Copy the first line */ - xine_fast_memcpy(l0, l1, width); - l0 += width; - - for (y = 1; y < height-1; ++y) { - /* computes avg of: l1 + 2*l2 + l3 */ - - for (x = 0; x < width; ++x) { - l0[x] = (l1[x] + (l2[x]<<1) + l3[x]) >> 2; - } - - /* updates the line pointers */ - l1 = l2; l2 = l3; l3 += width; - l0 += width; - } - - /* Copy the last line */ - xine_fast_memcpy(l0, l1, width); -} - -static int check_for_mmx(void) -{ -#if defined(ARCH_X86) || defined(ARCH_X86_64) -static int config_flags = -1; - - if ( config_flags == -1 ) - config_flags = xine_mm_accel(); - if (config_flags & MM_ACCEL_X86_MMX) - return 1; - return 0; -#else - return 0; -#endif -} - -/* generic YUV deinterlacer - pdst -> pointer to destination bitmap - psrc -> array of pointers to source bitmaps ([0] = most recent) - width,height -> dimension for bitmaps - method -> DEINTERLACE_xxx -*/ - -void deinterlace_yuv( uint8_t *pdst, uint8_t *psrc[], - int width, int height, int method ) -{ - switch( method ) { - case DEINTERLACE_NONE: - xine_fast_memcpy(pdst,psrc[0],width*height); - break; - case DEINTERLACE_BOB: - if( check_for_mmx() ) - deinterlace_bob_yuv_mmx(pdst,psrc,width,height); - else /* FIXME: provide an alternative? */ - xine_fast_memcpy(pdst,psrc[0],width*height); - break; - case DEINTERLACE_WEAVE: - if( check_for_mmx() ) - { - if( !deinterlace_weave_yuv_mmx(pdst,psrc,width,height) ) - xine_fast_memcpy(pdst,psrc[0],width*height); - } - else /* FIXME: provide an alternative? */ - xine_fast_memcpy(pdst,psrc[0],width*height); - break; - case DEINTERLACE_GREEDY: - if( check_for_mmx() ) - { - if( !deinterlace_greedy_yuv_mmx(pdst,psrc,width,height) ) - xine_fast_memcpy(pdst,psrc[0],width*height); - } - else /* FIXME: provide an alternative? */ - xine_fast_memcpy(pdst,psrc[0],width*height); - break; - case DEINTERLACE_ONEFIELD: - if( check_for_mmx() ) - deinterlace_onefield_yuv_mmx(pdst,psrc,width,height); - else /* FIXME: provide an alternative? */ - xine_fast_memcpy(pdst,psrc[0],width*height); - break; - case DEINTERLACE_ONEFIELDXV: - lprintf("ONEFIELDXV must be handled by the video driver.\n"); - break; - case DEINTERLACE_LINEARBLEND: - if( check_for_mmx() ) - deinterlace_linearblend_yuv_mmx(pdst,psrc,width,height); - else - deinterlace_linearblend_yuv(pdst,psrc,width,height); - break; - default: - lprintf("unknow method %d.\n",method); - break; - } -} - -int deinterlace_yuv_supported ( int method ) -{ - switch( method ) { - case DEINTERLACE_NONE: - return 1; - case DEINTERLACE_BOB: - case DEINTERLACE_WEAVE: - case DEINTERLACE_GREEDY: - case DEINTERLACE_ONEFIELD: - return check_for_mmx(); - case DEINTERLACE_ONEFIELDXV: - lprintf ("ONEFIELDXV must be handled by the video driver.\n"); - return 0; - case DEINTERLACE_LINEARBLEND: - return 1; - } - - return 0; -} - diff --git a/src/video_out/deinterlace.h b/src/video_out/deinterlace.h deleted file mode 100644 index 6f398fcbd..000000000 --- a/src/video_out/deinterlace.h +++ /dev/null @@ -1,55 +0,0 @@ - /* - * Copyright (C) 2001 the xine project - * - * This file is part of xine, a free video player. - * - * xine 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. - * - * xine 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 - * - * Deinterlace routines by Miguel Freitas - * based of DScaler project sources (deinterlace.sourceforge.net) - * - * Currently only available for Xv driver and MMX extensions - * - */ - -#ifndef __DEINTERLACE_H__ -#define __DEINTERLACE_H__ - -#include "video_out.h" - -int deinterlace_yuv_supported ( int method ); -void deinterlace_yuv( uint8_t *pdst, uint8_t *psrc[], - int width, int height, int method ); - -#define DEINTERLACE_NONE 0 -#define DEINTERLACE_BOB 1 -#define DEINTERLACE_WEAVE 2 -#define DEINTERLACE_GREEDY 3 -#define DEINTERLACE_ONEFIELD 4 -#define DEINTERLACE_ONEFIELDXV 5 -#define DEINTERLACE_LINEARBLEND 6 - -static const char *const deinterlace_methods[] = { - "none", - "bob", - "weave", - "greedy", - "onefield", - "onefield_xv", - "linearblend", - NULL -}; - -#endif diff --git a/src/video_out/libdha/.hgignore b/src/video_out/libdha/.hgignore deleted file mode 100644 index 7b5ba91fb..000000000 --- a/src/video_out/libdha/.hgignore +++ /dev/null @@ -1,9 +0,0 @@ -.libs -.deps -*.lo -*.la -pci_dev_ids.c -pci_ids.h -pci_names.c -pci_names.h -pci_vendors.h diff --git a/src/video_out/libdha/AsmMacros.h b/src/video_out/libdha/AsmMacros.h deleted file mode 100644 index d1b136a7b..000000000 --- a/src/video_out/libdha/AsmMacros.h +++ /dev/null @@ -1,119 +0,0 @@ -/* $XConsortium: AsmMacros.h /main/13 1996/10/25 11:33:12 kaleb $ */ -/* - * (c) Copyright 1993,1994 by David Wexelblat <dwex@xfree86.org> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * DAVID WEXELBLAT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF - * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * Except as contained in this notice, the name of David Wexelblat shall not be - * used in advertising or otherwise to promote the sale, use or other dealings - * in this Software without prior written authorization from David Wexelblat. - * - */ -/* - * Copyright 1997 - * Digital Equipment Corporation. All rights reserved. - * This software is furnished under license and may be used and copied only in - * accordance with the following terms and conditions. Subject to these - * conditions, you may download, copy, install, use, modify and distribute - * this software in source and/or binary form. No title or ownership is - * transferred hereby. - * - * 1) Any source code used, modified or distributed must reproduce and retain - * this copyright notice and list of conditions as they appear in the source - * file. - * - * 2) No right is granted to use any trade name, trademark, or logo of Digital - * Equipment Corporation. Neither the "Digital Equipment Corporation" name - * nor any trademark or logo of Digital Equipment Corporation may be used - * to endorse or promote products derived from this software without the - * prior written permission of Digital Equipment Corporation. - * - * 3) This software is provided "AS-IS" and any express or implied warranties, - * including but not limited to, any implied warranties of merchantability, - * fitness for a particular purpose, or non-infringement are disclaimed. In - * no event shall DIGITAL be liable for any damages whatsoever, and in - * particular, DIGITAL shall not be liable for special, indirect, - * consequential, or incidental damages or damages for - * lost profits, loss of revenue or loss of use, whether such damages arise - * in contract, - * negligence, tort, under statute, in equity, at law or otherwise, even if - * advised of the possibility of such damage. - * - */ - -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/chips/util/AsmMacros.h,v 1.1 2001/11/16 21:13:34 tsi Exp $ */ - -/* - * Modified for readability by Nick Kurshev -*/ - -#if defined(__GNUC__) || defined(__ICC) -#if defined(__alpha__) -#include "sysdep/AsmMacros_alpha.h" -#elif defined(__ia64__) -#include "sysdep/AsmMacros_ia64.h" -#elif defined(__sparc__) -#include "sysdep/AsmMacros_sparc.h" -#elif defined( __arm32__ ) -#include "sysdep/AsmMacros_arm32.h" -#elif defined(__powerpc__) -#include "sysdep/AsmMacros_powerpc.h" -#elif defined (__i386__) -#include "sysdep/AsmMacros_x86.h" -#else -#include "sysdep/AsmMacros_generic.h" -#endif - -#else /* __GNUC__ */ - -#if defined(_MINIX) && defined(_ACK) - -/* inb, outb, inw and outw are defined in the library */ -/* ... but I've no idea if the same is true for inl & outl */ - -extern u8_t inb(U16_t); -extern void outb(U16_t, U8_t); -extern u16_t inw(U16_t); -extern void outw(U16_t, U16_t); -extern u32_t inl(U16_t); -extern void outl(U16_t, U32_t); - -#else /* not _MINIX and _ACK */ - -# if defined(__STDC__) && (__STDC__ == 1) -# ifndef NCR -# define asm __asm -# endif -# endif -# ifdef SVR4 -# include <sys/types.h> -# ifndef __USLC__ -# define __USLC__ -# endif -# endif -#ifndef SCO325 -# include <sys/inline.h> -#else -# include "../common/scoasm.h" -#endif -#define intr_disable() asm("cli") -#define intr_enable() asm("sti") - -#endif /* _MINIX and _ACK */ -#endif /* __GNUC__ */ diff --git a/src/video_out/libdha/Makefile.am b/src/video_out/libdha/Makefile.am deleted file mode 100644 index 05aebb704..000000000 --- a/src/video_out/libdha/Makefile.am +++ /dev/null @@ -1,44 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -SUBDIRS = bin oth sysdep - -if BUILD_DHA_KMOD -SUBDIRS += kernelhelper -endif - -AM_CFLAGS = $(DEFAULT_OCFLAGS) - -EXTRA_DIST = README pci_db2c.awk - -awk_generated = pci_dev_ids.c pci_ids.h pci_names.c pci_names.h pci_vendors.h -CLEANFILES = $(awk_generated) - -noinst_HEADERS = AsmMacros.h libdha.h pci_ids.h pci_names.h pci_vendors.h - -if ENABLE_VIDIX -noinst_LTLIBRARIES = libdha.la -endif - -libdha_la_SOURCES = libdha.c mtrr.c pci.c mmi.c ports.c irq.c cpu_flush.c -nodist_libdha_la_SOURCES = pci_names.c - -EXTRA_PROGRAMS = test - -test_SOURCES = test.c -test_LDADD = $(top_builddir)/src/video_out/libdha/libdha.la - -## for OpenBSD LIBS += -li386 - -## We have to create some files, on the fly, this is why this rule is needed. -pci_db2c.awk: -oth/pci.db: - -$(awk_generated): pci_db2c.awk oth/pci.db - LC_ALL=C $(AWK) -f $(top_srcdir)/src/video_out/libdha/pci_db2c.awk \ - $(top_srcdir)/src/video_out/libdha/oth/pci.db - -pci_names.lo: $(awk_generated) - source='$*.c' object='$@' libtool=yes \ - depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' \ - $(CCDEPMODE) $(depcomp) \ - $(LTCOMPILE) -c -o $@ `test -f $*.c || echo '$(srcdir)/'`$*.c diff --git a/src/video_out/libdha/README b/src/video_out/libdha/README deleted file mode 100644 index a855880cd..000000000 --- a/src/video_out/libdha/README +++ /dev/null @@ -1,12 +0,0 @@ -libdha - Library of Direct Hardware Access. -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -This library was designed for direct hardware access under different -OS and architectures. It's not linux specific only (like harddrake -and other). - -This library is based on gfxdump utility from GATOS project. -Full list of supported OS'es see in libdha.h - -Note: This library requires ROOT privileges or SUID'ed executable -file (same as XServer). -(Or use newly developed libdha kernel helper. Look at kernelhelper/dhahelper.c) diff --git a/src/video_out/libdha/bin/Makefile.am b/src/video_out/libdha/bin/Makefile.am deleted file mode 100644 index 24c6d3abf..000000000 --- a/src/video_out/libdha/bin/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -EXTRA_DIST = README mapdev.copyright mapdev.vxd diff --git a/src/video_out/libdha/bin/README b/src/video_out/libdha/bin/README deleted file mode 100644 index fe4bfa6f3..000000000 --- a/src/video_out/libdha/bin/README +++ /dev/null @@ -1,6 +0,0 @@ -mapdev.vxd -~~~~~~~~~~ -mapdev.vxd - provides direct hardware access under Win9x. -install: Just copy it into %WINDOWS%\system folder and reboot. -note: This driver won't work under NT-based systems -(like WinNT, Win2000 and even WinME and WinXP due importing NT things). diff --git a/src/video_out/libdha/bin/mapdev.copyright b/src/video_out/libdha/bin/mapdev.copyright deleted file mode 100644 index b22433d29..000000000 --- a/src/video_out/libdha/bin/mapdev.copyright +++ /dev/null @@ -1,70 +0,0 @@ -From khazzah@melita.com Mon Jun 23 21:48:19 1997 -Return-Path: <khazzah@melita.com> -Received: from melita.melita.com by max4.rrze.uni-erlangen.de; Mon, 23 Jun 1997 21:48:16 +0200 -Received: from mailgate.melita.com ([192.68.22.8]) by melita.melita.com (8.6.12/8.6.9) with SMTP id QAA29292 for <Stefan.Dirsch@stud.uni-erlangen.de>; Mon, 23 Jun 1997 16:17:55 -0400 -Received: by mailgate.melita.com with Microsoft Mail - id <33AEFD34@mailgate.melita.com>; Mon, 23 Jun 97 15:48:20 PDT -From: Karen Hazzah <khazzah@melita.com> -To: "'Stefan.Dirsch@stud.uni-erlangen.de'" <Stefan.Dirsch@stud.uni-erlangen.de> -Subject: Your post to vxd newsgroup -Date: Sun, 22 Jun 97 20:51:00 PDT -Message-ID: <33AEFD34@mailgate.melita.com> -Encoding: 22 TEXT -X-Mailer: Microsoft Mail V3.0 - - -I posted an answer to your question in the newsgroup. I also have -additional information for you. - -I can email you the binary for VxD which does exactly what you need: -given a physical address, returns a pointer that can be used by a -Win32 application. I'll also give you source for a Win32 app which -uses the VxD to read an area of physical memory. - -I don't offer this solution to everyone, since in most cases the -proper solution is for them to write a VxD which interacts with their -hardware, rather than simply getting a pointer to the hardware and -interacting with it from an application. - -However, in your case, you're just using a VxD as a tool to get your -Linux driver working...you shouldn't have to write a VxD for this :-) - -Let me know if you're interested. -=============================================================================== -Hello Karen - -A long time ago, you sent me your VXD for reading an area of physical -memory under Win32, so I could make register dumps of the graphic -chip. Did I ever mention, that it works perfectly for me? - -Why I contact you is, that I really would like to offer this solution -to all XFree86 members, so that it will be much easier in the future -for XFree86 to develop drivers for graphic boards. - -Can I count with your agreement? Would you like to add a special -copyright to your software? - -Stefan -=============================================================================== -From KHazzah@melita.com Wed Mar 4 00:00:28 1998 -Return-Path: <KHazzah@melita.com> -Received: from melita.melita.com (melita.com [192.68.22.2]) - by Galois.suse.de (8.8.8/8.8.8) with SMTP id AAA03709 - for <sndirsch@suse.de>; Wed, 4 Mar 1998 00:00:26 +0100 -Received: from norcross.melita.com (norcross.melita.com [192.68.22.10]) by melita.melita.com (8.6.12/8.6.9) with ESMTP id TAA31217 for <sndirsch@suse.de>; Tue, 3 Mar 1998 19:48:10 -0500 -Received: by zippy.melita.com with Internet Mail Service (5.5.1960.3) - id <F5X7MBSS>; Tue, 3 Mar 1998 18:00:26 -0500 -Message-ID: <D8EE8292EB83D111A15E00805FA67447166532@zippy.melita.com> -From: "Hazzah, Karen" <KHazzah@melita.com> -To: Stefan Dirsch <sndirsch@suse.de> -Subject: RE: VXD binary for Win32 for reading an area of physical memory -Date: Tue, 3 Mar 1998 18:00:25 -0500 -MIME-Version: 1.0 -X-Mailer: Internet Mail Service (5.5.1960.3) -Content-Type: text/plain -Status: ROr - -OK, you have my permission to make it publicly available, as is. - -If you make it available on the web (ftp, etc.), please give me the -URL so I can refer others to it. diff --git a/src/video_out/libdha/bin/mapdev.vxd b/src/video_out/libdha/bin/mapdev.vxd Binary files differdeleted file mode 100644 index e09194b84..000000000 --- a/src/video_out/libdha/bin/mapdev.vxd +++ /dev/null diff --git a/src/video_out/libdha/cpu_flush.c b/src/video_out/libdha/cpu_flush.c deleted file mode 100644 index 9186f89e8..000000000 --- a/src/video_out/libdha/cpu_flush.c +++ /dev/null @@ -1,23 +0,0 @@ -/* CPU flush support */ -#include <stdio.h> -#include <sys/ioctl.h> -#include <errno.h> -#include <unistd.h> -#include <fcntl.h> -#include "libdha.h" -#include "kernelhelper/dhahelper.h" - -void cpu_flush(void *va,unsigned long length) -{ - int retval; - int libdha_fd=-1; - if( libdha_fd == -1) libdha_fd = open("/dev/dhahelper",O_RDWR); - if (libdha_fd > 0) - { - dhahelper_cpu_flush_t _l2; - _l2.va = va; - _l2.length = length; - retval = ioctl(libdha_fd, DHAHELPER_CPU_FLUSH, &_l2); - close(libdha_fd); - } -} diff --git a/src/video_out/libdha/irq.c b/src/video_out/libdha/irq.c deleted file mode 100644 index abccaf74c..000000000 --- a/src/video_out/libdha/irq.c +++ /dev/null @@ -1,63 +0,0 @@ -/* HW IRQ support */ -#include <stdio.h> -#include <sys/ioctl.h> -#include <sys/types.h> -#include <sys/mman.h> /* mlock */ -#include <pthread.h> -#include <errno.h> -#include <unistd.h> -#include <fcntl.h> -#include "libdha.h" -#include "kernelhelper/dhahelper.h" - - -static int libdha_fd=-1; -static int hwirq_locks=0; - -int hwirq_install(int bus, int dev, int func, - int ar, u_long ao, uint32_t ad) -{ - int retval; - if( libdha_fd == -1) libdha_fd = open("/dev/dhahelper",O_RDWR); - hwirq_locks++; - if (libdha_fd > 0) - { - dhahelper_irq_t _irq; - _irq.bus = bus; - _irq.dev = dev; - _irq.func = func; - _irq.ack_region = ar; - _irq.ack_offset = ao; - _irq.ack_data = ad; - retval = ioctl(libdha_fd, DHAHELPER_INSTALL_IRQ, &_irq); - return retval; - } - return errno; -} - -int hwirq_wait(unsigned irqnum) -{ - int retval; - if (libdha_fd > 0) - { - dhahelper_irq_t _irq; - _irq.num = irqnum; - retval = ioctl(libdha_fd, DHAHELPER_ACK_IRQ, &_irq); - return retval; - } - return EINVAL; -} - -int hwirq_uninstall(int bus, int dev, int func) -{ - if (libdha_fd > 0) - { - dhahelper_irq_t _irq; - _irq.bus = bus; - _irq.dev = dev; - _irq.func = func; - ioctl(libdha_fd, DHAHELPER_FREE_IRQ, &_irq); - } - if(!hwirq_locks) { close(libdha_fd); libdha_fd=-1; } - return 0; -} diff --git a/src/video_out/libdha/kernelhelper/Makefile.am b/src/video_out/libdha/kernelhelper/Makefile.am deleted file mode 100644 index fffaab433..000000000 --- a/src/video_out/libdha/kernelhelper/Makefile.am +++ /dev/null @@ -1,50 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -EXTRA_DIST = README dhahelper.c - -KCFLAGS = -O2 -Wall -D__KERNEL__ -DMODULE -include `echo $(LINUX_INCLUDE) | sed -e 's/\-I//g'`/linux/modversions.h - -KVERSION = $(shell $(SHELL) -c 'uname -r') -moddir = /lib/modules/$(KVERSION)/misc - -KCOMPILE = $(CC) $(CFLAGS) $(KCFLAGS) $(INCLUDES) $(LINUX_INCLUDE) - -if HAVE_LINUX -KERNEL_MODULE = dhahelper.o -endif - -noinst_HEADERS = dhahelper.h - -EXTRA_PROGRAMS = test -test_SOURCES = test.c - -dhahelper.o: - $(KCOMPILE) -c `test -f $*.c || echo '$(srcdir)/'`$*.c - -nodes: - $(MKNOD) -m 666 /dev/dhahelper c 252 0 - -all: $(KERNEL_MODULE) - -install-exec-local: $(KERNEL_MODULE) - @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(moddir) - @list='$(KERNEL_MODULE)'; \ - for p in $$list; do \ - if test -f $$p; then \ - echo "$(INSTALL) -o root -g root -m 644 $$p $(DESTDIR)$(moddir)/$$p"; \ - $(INSTALL) -o root -g root -m 644 $$p $(DESTDIR)$(moddir)/$$p; \ - else :; fi; \ - done; \ - $(DEPMOD) -a - if test ! -c /dev/dhahelper; then \ - $(MAKE) nodes; \ - fi - -uninstall-local: - @$(NORMAL_UNINSTALL) - @list='$(KERNEL_MODULE)'; \ - for p in $$list; do \ - echo "rm -f $(DESTDIR)$(moddir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ - rm -f $(DESTDIR)$(moddir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ - done diff --git a/src/video_out/libdha/kernelhelper/README b/src/video_out/libdha/kernelhelper/README deleted file mode 100644 index 98a7923b3..000000000 --- a/src/video_out/libdha/kernelhelper/README +++ /dev/null @@ -1,38 +0,0 @@ -dhahelper is small driver to provide some kernel function into userspace. -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The main reason you need to use dhahelper is for busmastering. -(Btw, lacking of possibility to implement conversion of -virtual addresses into physical in userspace caused -implementing of so-called DRM drivers for Linux from -XFree86 side). -Second goal (still is unfinished) - provide possibility -to control port and physical memory access through -groups and access rights of this driver. (Unix way). - -Installation: -~~~~~~~~~~~~~ -just type in this directory: -make all install - -The device node /dev/dhahelper will be created. The initial -permissions of this node are restrictive. See below for information -on how to make it available to non-root users. - -Porting: -~~~~~~~~ -This driver was developed only for Linux. -So if someone will port that on other unices -then any patches are gladly accepted. - -WARNING: -~~~~~~~~ - -This driver violates some kernel security rules. To keep this driver -from anonymous access I suggest you create a new group (e.g. dha) for -/dev/dhahelper and set the permissions to 660 (or ug+rw,o-rw). Then -do one of the following: - -- add trusted users to group dha. -- make trusted applications SGID to dha. - -Good luck! diff --git a/src/video_out/libdha/kernelhelper/dhahelper.c b/src/video_out/libdha/kernelhelper/dhahelper.c deleted file mode 100644 index 0e755064a..000000000 --- a/src/video_out/libdha/kernelhelper/dhahelper.c +++ /dev/null @@ -1,1239 +0,0 @@ -/* - Direct Hardware Access kernel helper - - (C) 2002 Alex Beregszaszi <alex@naxine.org> - (C) 2002-2003 Nick Kurshev <nickols_k@mail.ru> - (C) 2002-2004 MÃ¥ns RullgÃ¥rd <mru@users.sourceforge.net> - - Accessing hardware from userspace as USER (no root needed!) - - Tested on 2.2.x (2.2.19), 2.4.x (2.4.3,2.4.17) and 2.6.1. - - License: GPL - - WARNING! THIS MODULE VIOLATES SEVERAL SECURITY LINES! DON'T USE IT - ON PRODUCTION SYSTEMS, ONLY AT HOME, ON A "SINGLE-USER" SYSTEM. - NO WARRANTY! - - IF YOU WANT TO USE IT ON PRODUCTION SYSTEMS THEN PLEASE READ 'README' - FILE TO KNOW HOW TO PREVENT ANONYMOUS ACCESS TO THIS MODULE. - - Tech: - Communication between userspace and kernelspace goes over character - device using ioctl. - - Usage: - mknod -m 600 /dev/dhahelper c 252 0 - - Also you can change the major number, setting the "dhahelper_major" - module parameter, the default is 252, specified in dhahelper.h. - - Note: do not use other than minor==0, the module forbids it. - - TODO: - * select (request?) a "valid" major number (from Linux project? ;) - * make security - * is pci handling needed? (libdha does this with lowlevel port funcs) - * is mttr handling needed? - * test on older kernels (2.0.x (?)) -*/ - -#ifndef MODULE -#define MODULE -#endif - -#ifndef __KERNEL__ -#define __KERNEL__ -#endif - -#include <linux/config.h> - -#ifdef CONFIG_MODVERSION -#define MODVERSION -#include <linux/modversions.h> -#endif - -#include <linux/version.h> -#include <linux/module.h> -#include <linux/types.h> -#include <linux/kernel.h> -#include <linux/sched.h> -#include <linux/mm.h> -#include <linux/pagemap.h> -#include <linux/init.h> -#include <linux/pci.h> -#include <linux/interrupt.h> -#include <linux/vmalloc.h> -#include <linux/string.h> -#include <linux/errno.h> -#include <asm/io.h> -#include <asm/pgtable.h> -#include <asm/unistd.h> -#include <asm/uaccess.h> - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -#include <linux/malloc.h> -#else -#include <linux/slab.h> -#endif - -#include <linux/pci.h> -#include <linux/ioport.h> -#include <linux/init.h> - -#include <asm/uaccess.h> -#include <asm/system.h> -#include <asm/io.h> - -#include <linux/mman.h> - -#include <linux/fs.h> -#include <linux/unistd.h> - -#ifdef CONFIG_MTRR -#include <asm/mtrr.h> -#endif -#ifdef CONFIG_DEVFS_FS -#include <linux/devfs_fs_kernel.h> -#endif - -#include "dhahelper.h" - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) -#define pte_offset(p,a) pte_offset_kernel(p,a) -#define LockPage(p) SetPageLocked(p) -#define UnlockPage(p) ClearPageLocked(p) -#define irqreturn(n) return(n) -#else -#define irqreturn_t void -#define irqreturn(n) return -#endif - -MODULE_AUTHOR("Alex Beregszaszi <alex@naxine.org>, Nick Kurshev <nickols_k@mail.ru>, MÃ¥ns RullgÃ¥rd <mru@users.sf.net>"); -MODULE_DESCRIPTION("Provides userspace access to hardware"); -#ifdef MODULE_LICENSE -MODULE_LICENSE("GPL"); -#endif - -static int dhahelper_major = DEFAULT_MAJOR; -MODULE_PARM(dhahelper_major, "i"); -MODULE_PARM_DESC(dhahelper_major, "Major number of dhahelper characterdevice"); - -/* 0 = silent */ -/* 1 = report errors (default) */ -/* 2 = debug */ -static int dhahelper_verbosity = 1; -MODULE_PARM(dhahelper_verbosity, "i"); -MODULE_PARM_DESC(dhahelper_verbosity, "Level of verbosity (0 = silent, 1 = only errors, 2 = debug)"); - -static int dhahelper_open(struct inode *inode, struct file *file) -{ - if (dhahelper_verbosity > 1) - printk(KERN_DEBUG "dhahelper: device opened\n"); - - if (MINOR(inode->i_rdev) != 0) - return -ENXIO; - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) - MOD_INC_USE_COUNT; -#endif - - return 0; -} - -static int dhahelper_release(struct inode *inode, struct file *file) -{ - if (dhahelper_verbosity > 1) - printk(KERN_DEBUG "dhahelper: device released\n"); - - if (MINOR(inode->i_rdev) != 0) - return -ENXIO; - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) - MOD_DEC_USE_COUNT; -#endif - - return 0; -} - -static int dhahelper_get_version(int * arg) -{ - int version = API_VERSION; - - if (copy_to_user(arg, &version, sizeof(int))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy to userspace\n"); - return -EFAULT; - } - return 0; -} - -static int dhahelper_port(dhahelper_port_t * arg) -{ - dhahelper_port_t port; - if (copy_from_user(&port, arg, sizeof(dhahelper_port_t))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy from userspace\n"); - return -EFAULT; - } - switch(port.operation) - { - case PORT_OP_READ: - { - switch(port.size) - { - case 1: - port.value = inb(port.addr); - break; - case 2: - port.value = inw(port.addr); - break; - case 4: - port.value = inl(port.addr); - break; - default: - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: invalid port read size (%d)\n", - port.size); - return -EINVAL; - } - break; - } - case PORT_OP_WRITE: - { - switch(port.size) - { - case 1: - outb(port.value, port.addr); - break; - case 2: - outw(port.value, port.addr); - break; - case 4: - outl(port.value, port.addr); - break; - default: - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: invalid port write size (%d)\n", - port.size); - return -EINVAL; - } - break; - } - default: - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: invalid port operation (%d)\n", - port.operation); - return -EINVAL; - } - /* copy back only if read was performed */ - if (port.operation == PORT_OP_READ) - if (copy_to_user(arg, &port, sizeof(dhahelper_port_t))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy to userspace\n"); - return -EFAULT; - } - return 0; -} - -/*******************************/ -/* Memory management functions */ -/* from kernel:/drivers/media/video/bttv-driver.c */ -/*******************************/ - -#define MDEBUG(x) do { } while(0) /* Debug memory management */ - -/* [DaveM] I've recoded most of this so that: - * 1) It's easier to tell what is happening - * 2) It's more portable, especially for translating things - * out of vmalloc mapped areas in the kernel. - * 3) Less unnecessary translations happen. - * - * The code used to assume that the kernel vmalloc mappings - * existed in the page tables of every process, this is simply - * not guarenteed. We now use pgd_offset_k which is the - * defined way to get at the kernel page tables. - */ - -/* Given PGD from the address space's page table, return the kernel - * virtual mapping of the physical memory mapped at ADR. - */ -static inline unsigned long uvirt_to_kva(pgd_t *pgd, unsigned long adr) -{ - unsigned long ret = 0UL; - pmd_t *pmd; - pte_t *ptep, pte; - - if (!pgd_none(*pgd)) { - pmd = pmd_offset(pgd, adr); - if (!pmd_none(*pmd)) { - ptep = pte_offset(pmd, adr); - pte = *ptep; - if(pte_present(pte)) { - ret = (unsigned long) page_address(pte_page(pte)); - ret |= (adr & (PAGE_SIZE - 1)); - - } - } - } - MDEBUG(printk("uv2kva(%lx-->%lx)", adr, ret)); - return ret; -} - -static inline unsigned long uvirt_to_bus(unsigned long adr) -{ - unsigned long kva, ret; - - kva = uvirt_to_kva(pgd_offset(current->mm, adr), adr); - ret = virt_to_bus((void *)kva); - MDEBUG(printk("uv2b(%lx-->%lx)", adr, ret)); - return ret; -} - -static inline unsigned long uvirt_to_pa(unsigned long adr) -{ - unsigned long kva, ret; - - kva = uvirt_to_kva(pgd_offset(current->mm, adr), adr); - ret = virt_to_phys((void *)kva); - MDEBUG(printk("uv2b(%lx-->%lx)", adr, ret)); - return ret; -} - -static inline unsigned long kvirt_to_bus(unsigned long va) -{ - unsigned long kva, ret; - - kva = uvirt_to_kva(pgd_offset_k(va), va); - ret = virt_to_bus((void *)kva); - MDEBUG(printk("kv2b(%lx-->%lx)", adr, ret)); - return ret; -} - -/* Here we want the physical address of the memory. - * This is used when initializing the contents of the - * area and marking the pages as reserved. - */ -static inline unsigned long kvirt_to_pa(unsigned long va) -{ - unsigned long kva, ret; - - kva = uvirt_to_kva(pgd_offset_k(va), va); - ret = __pa(kva); - MDEBUG(printk("kv2pa(%lx-->%lx)", adr, ret)); - return ret; -} - -static void * rvmalloc(signed long size) -{ - void * mem; - unsigned long adr, page; - - mem=vmalloc_32(size); - if (mem) - { - memset(mem, 0, size); /* Clear the ram out, no junk to the user */ - adr=(unsigned long) mem; - while (size > 0) - { - page = kvirt_to_pa(adr); - SetPageReserved(virt_to_page(__va(page))); - adr+=PAGE_SIZE; - size-=PAGE_SIZE; - } - } - return mem; -} - -static int pag_lock(unsigned long addr) -{ - unsigned long page; - unsigned long kva; - - kva = uvirt_to_kva(pgd_offset(current->mm, addr), addr); - if(kva) - { - lock_it: - page = uvirt_to_pa((unsigned long)addr); - LockPage(virt_to_page(__va(page))); - SetPageReserved(virt_to_page(__va(page))); - } - else - { - copy_from_user(&page,(char *)addr,1); /* try access it */ - kva = uvirt_to_kva(pgd_offset(current->mm, addr), addr); - if(kva) goto lock_it; - else return EPERM; - } - return 0; -} - -static int pag_unlock(unsigned long addr) -{ - unsigned long page; - unsigned long kva; - - kva = uvirt_to_kva(pgd_offset(current->mm, addr), addr); - if(kva) - { - page = uvirt_to_pa((unsigned long)addr); - UnlockPage(virt_to_page(__va(page))); - ClearPageReserved(virt_to_page(__va(page))); - return 0; - } - return EPERM; -} - - -static void rvfree(void * mem, signed long size) -{ - unsigned long adr, page; - - if (mem) - { - adr=(unsigned long) mem; - while (size > 0) - { - page = kvirt_to_pa(adr); - ClearPageReserved(virt_to_page(__va(page))); - adr+=PAGE_SIZE; - size-=PAGE_SIZE; - } - vfree(mem); - } -} - - -static int dhahelper_virt_to_phys(dhahelper_vmi_t *arg) -{ - dhahelper_vmi_t mem; - unsigned long i,nitems; - char *addr; - if (copy_from_user(&mem, arg, sizeof(dhahelper_vmi_t))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy from userspace\n"); - return -EFAULT; - } - nitems = mem.length / PAGE_SIZE; - if(mem.length % PAGE_SIZE) nitems++; - addr = mem.virtaddr; - for(i=0;i<nitems;i++) - { - unsigned long result; - result = uvirt_to_pa((unsigned long)addr); - if (copy_to_user(&mem.realaddr[i], &result, sizeof(unsigned long))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy to userspace\n"); - return -EFAULT; - } - addr += PAGE_SIZE; - } - return 0; -} - -static int dhahelper_virt_to_bus(dhahelper_vmi_t *arg) -{ - dhahelper_vmi_t mem; - unsigned long i,nitems; - char *addr; - if (copy_from_user(&mem, arg, sizeof(dhahelper_vmi_t))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy from userspace\n"); - return -EFAULT; - } - nitems = mem.length / PAGE_SIZE; - if(mem.length % PAGE_SIZE) nitems++; - addr = mem.virtaddr; - for(i=0;i<nitems;i++) - { - unsigned long result; - result = uvirt_to_bus((unsigned long)addr); - if (copy_to_user(&mem.realaddr[i], &result, sizeof(unsigned long))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy to userspace\n"); - return -EFAULT; - } - addr += PAGE_SIZE; - } - return 0; -} - - -static int dhahelper_alloc_pa(dhahelper_mem_t *arg) -{ - dhahelper_mem_t mem; - if (copy_from_user(&mem, arg, sizeof(dhahelper_mem_t))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy from userspace\n"); - return -EFAULT; - } - mem.addr = rvmalloc(mem.length); - if (copy_to_user(arg, &mem, sizeof(dhahelper_mem_t))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy to userspace\n"); - return -EFAULT; - } - return 0; -} - -static int dhahelper_free_pa(dhahelper_mem_t *arg) -{ - dhahelper_mem_t mem; - if (copy_from_user(&mem, arg, sizeof(dhahelper_mem_t))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy from userspace\n"); - return -EFAULT; - } - rvfree(mem.addr,mem.length); - return 0; -} - -static int dhahelper_lock_mem(dhahelper_mem_t *arg) -{ - dhahelper_mem_t mem; - int retval; - unsigned long i,nitems,addr; - if (copy_from_user(&mem, arg, sizeof(dhahelper_mem_t))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy from userspace\n"); - return -EFAULT; - } - nitems = mem.length / PAGE_SIZE; - if(mem.length % PAGE_SIZE) nitems++; - addr = (unsigned long)mem.addr; - for(i=0;i<nitems;i++) - { - retval = pag_lock((unsigned long)addr); - if(retval) - { - unsigned long j; - addr = (unsigned long)mem.addr; - for(j=0;j<i;j++) - { - pag_unlock(addr); - addr += PAGE_SIZE; - } - return retval; - } - addr += PAGE_SIZE; - } - return 0; -} - -static int dhahelper_unlock_mem(dhahelper_mem_t *arg) -{ - dhahelper_mem_t mem; - int retval; - unsigned long i,nitems,addr; - if (copy_from_user(&mem, arg, sizeof(dhahelper_mem_t))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy from userspace\n"); - return -EFAULT; - } - nitems = mem.length / PAGE_SIZE; - if(mem.length % PAGE_SIZE) nitems++; - addr = (unsigned long)mem.addr; - for(i=0;i<nitems;i++) - { - retval = pag_unlock((unsigned long)addr); - if(retval) return retval; - addr += PAGE_SIZE; - } - return 0; -} - -static struct dha_irq { - spinlock_t lock; - unsigned long flags; - int handled; - int rcvd; - volatile u32 *ack_addr; - u32 ack_data; - struct pci_dev *dev; - wait_queue_head_t wait; - unsigned long count; -} dha_irqs[256]; - -static irqreturn_t dhahelper_irq_handler(int irq, void *dev_id, - struct pt_regs *regs) -{ - spin_lock_irqsave(&dha_irqs[irq].lock, dha_irqs[irq].flags); - if(dha_irqs[irq].handled){ - dha_irqs[irq].rcvd = 1; - dha_irqs[irq].count++; - if(dha_irqs[irq].ack_addr){ - *dha_irqs[irq].ack_addr = dha_irqs[irq].ack_data; - mb(); - } - wake_up_interruptible(&dha_irqs[irq].wait); - } - spin_unlock_irqrestore(&dha_irqs[irq].lock, dha_irqs[irq].flags); - irqreturn(0); -} - -static int dhahelper_install_irq(dhahelper_irq_t *arg) -{ - dhahelper_irq_t my_irq; - struct pci_dev *pci; - long rlen; - int retval; - long ack_addr; - int irqn; - - if (copy_from_user(&my_irq, arg, sizeof(dhahelper_irq_t))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy from userspace\n"); - return -EFAULT; - } - - if(!(pci = pci_find_slot(my_irq.bus, PCI_DEVFN(my_irq.dev, my_irq.func)))) - return -EINVAL; - - rlen = pci_resource_len(pci, my_irq.ack_region); - if(my_irq.ack_offset > rlen - 4) - return -EINVAL; - - irqn = pci->irq; - - spin_lock_irqsave(&dha_irqs[irqn].lock, - dha_irqs[irqn].flags); - - if(dha_irqs[irqn].handled){ - retval = -EBUSY; - goto fail; - } - - if(my_irq.ack_region >= 0){ - ack_addr = pci_resource_start(pci, my_irq.ack_region); - ack_addr += my_irq.ack_offset; -#ifdef CONFIG_ALPHA - ack_addr += ((struct pci_controller *) pci->sysdata)->dense_mem_base; -#endif - /* FIXME: Other architectures */ - - dha_irqs[irqn].ack_addr = phys_to_virt(ack_addr); - dha_irqs[irqn].ack_data = my_irq.ack_data; - } else { - dha_irqs[irqn].ack_addr = 0; - } - - dha_irqs[irqn].lock = SPIN_LOCK_UNLOCKED; - dha_irqs[irqn].flags = 0; - dha_irqs[irqn].rcvd = 0; - dha_irqs[irqn].dev = pci; - init_waitqueue_head(&dha_irqs[irqn].wait); - dha_irqs[irqn].count = 0; - - retval = request_irq(irqn, dhahelper_irq_handler, - SA_SHIRQ, "dhahelper", pci); - - if(retval < 0) - goto fail; - - copy_to_user(&arg->num, &irqn, sizeof(irqn)); - - dha_irqs[irqn].handled = 1; - -out: - spin_unlock_irqrestore(&dha_irqs[irqn].lock, - dha_irqs[irqn].flags); - return retval; - -fail: - if(retval == -EINVAL){ - printk("dhahelper: bad irq number or handler\n"); - } else if(retval == -EBUSY){ - printk("dhahelper: IRQ %u busy\n", irqn); - } else { - printk("dhahelper: Could not install irq handler...\n"); - } - printk("dhahelper: Perhaps you need to let your BIOS assign an IRQ to your video card\n"); - goto out; -} - -static int dhahelper_free_irq(dhahelper_irq_t *arg) -{ - dhahelper_irq_t irq; - struct pci_dev *pci; - int irqn; - - if (copy_from_user(&irq, arg, sizeof(dhahelper_irq_t))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy from userspace\n"); - return -EFAULT; - } - - pci = pci_find_slot(irq.bus, PCI_DEVFN(irq.dev, irq.func)); - if(!pci) - return -EINVAL; - - irqn = pci->irq; - - spin_lock_irqsave(&dha_irqs[irqn].lock, dha_irqs[irqn].flags); - if(dha_irqs[irqn].handled) { - free_irq(irqn, pci); - dha_irqs[irqn].handled = 0; - printk("IRQ %i: %li\n", irqn, dha_irqs[irqn].count); - } - spin_unlock_irqrestore(&dha_irqs[irqn].lock, dha_irqs[irqn].flags); - return 0; -} - -static int dhahelper_ack_irq(dhahelper_irq_t *arg) -{ - dhahelper_irq_t irq; - int retval = 0; - DECLARE_WAITQUEUE(wait, current); - if (copy_from_user(&irq, arg, sizeof(dhahelper_irq_t))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy from userspace\n"); - return -EFAULT; - } - if(irq.num > 255) return -EINVAL; - if(!dha_irqs[irq.num].handled) return -ESRCH; - add_wait_queue(&dha_irqs[irq.num].wait, &wait); - set_current_state(TASK_INTERRUPTIBLE); - for(;;){ - int r; - spin_lock_irqsave(&dha_irqs[irq.num].lock, - dha_irqs[irq.num].flags); - r = dha_irqs[irq.num].rcvd; - spin_unlock_irqrestore(&dha_irqs[irq.num].lock, - dha_irqs[irq.num].flags); - - if(r){ - dha_irqs[irq.num].rcvd = 0; - break; - } - - if(signal_pending(current)){ - retval = -ERESTARTSYS; - break; - } - - schedule(); - } - set_current_state(TASK_RUNNING); - remove_wait_queue(&dha_irqs[irq.num].wait, &wait); - return retval; -} - -static int dhahelper_cpu_flush(dhahelper_cpu_flush_t *arg) -{ - dhahelper_cpu_flush_t my_l2; - if (copy_from_user(&my_l2, arg, sizeof(dhahelper_cpu_flush_t))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy from userspace\n"); - return -EFAULT; - } -#if defined(__i386__) - /* WBINVD writes all modified cache lines back to main memory */ - if(boot_cpu_data.x86 > 3) { __asm __volatile("wbinvd":::"memory"); } -#else - /* FIXME!!!*/ - mb(); /* declared in "asm/system.h" */ -#endif - return 0; -} - -static struct pci_dev *pdev = NULL; -static int dhahelper_pci_find(dhahelper_pci_device_t *arg) -{ - dhahelper_pci_device_t this_dev; - pdev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pdev); - if(pdev) - { - this_dev.bus = pdev->bus->number; - this_dev.card = PCI_SLOT(pdev->devfn); - this_dev.func = PCI_FUNC(pdev->devfn); - this_dev.vendor = pdev->vendor; - this_dev.device = pdev->device; - this_dev.base0 = pci_resource_start (pdev, 0); - this_dev.base1 = pci_resource_start (pdev, 1); - this_dev.base2 = pci_resource_start (pdev, 2); - pci_read_config_dword(pdev, pdev->rom_base_reg, (u32*)&this_dev.baserom); - this_dev.base3 = pci_resource_start (pdev, 3); - this_dev.base4 = pci_resource_start (pdev, 4); - this_dev.base5 = pci_resource_start (pdev, 5); - pci_read_config_byte(pdev, PCI_INTERRUPT_LINE, &this_dev.irq); - pci_read_config_byte(pdev, PCI_INTERRUPT_PIN, &this_dev.ipin); - pci_read_config_byte(pdev, PCI_MIN_GNT, &this_dev.gnt); - pci_read_config_byte(pdev, PCI_MAX_LAT, &this_dev.lat); - } - else memset(&this_dev,0,sizeof(dhahelper_pci_device_t)); - if (copy_to_user(arg, &this_dev, sizeof(dhahelper_pci_device_t))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy to userspace\n"); - return -EFAULT; - } - return pdev?0:-ENODATA; -} - -static int dhahelper_pci_config(dhahelper_pci_config_t *arg) -{ - dhahelper_pci_config_t op; - struct pci_dev *pdev; - if (copy_from_user(&op, arg, sizeof(dhahelper_pci_config_t))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy from userspace\n"); - return -EFAULT; - } - pdev = pci_find_slot(op.bus,PCI_DEVFN(op.dev,op.func)); - if(!pdev) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: can't identify device\n"); - return -EFAULT; - } - switch(op.operation) - { - case PCI_OP_READ: - switch(op.size) - { - case 1: - pci_read_config_byte(pdev,op.cmd,(u8*)&op.ret); - break; - case 2: - pci_read_config_word(pdev,op.cmd,(u16*)&op.ret); - break; - case 4: - pci_read_config_dword(pdev,op.cmd,(u32*)&op.ret); - break; - default: - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: wrong size of pci operation: %u \n",op.size); - return -EFAULT; - } - case PCI_OP_WRITE: - switch(op.size) - { - case 1: - pci_write_config_byte(pdev,op.cmd,op.ret); - break; - case 2: - pci_write_config_word(pdev,op.cmd,op.ret); - break; - case 4: - pci_write_config_dword(pdev,op.cmd,op.ret); - break; - default: - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: wrong size of pci operation: %u \n",op.size); - return -EFAULT; - } - default: - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: unknown pci operation %i\n",op.operation); - return -EFAULT; - } - if (copy_to_user(arg, &op, sizeof(dhahelper_pci_device_t))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy to userspace\n"); - return -EFAULT; - } - return 0; -} - -static int dhahelper_mtrr(dhahelper_mtrr_t *arg) -{ -#ifdef CONFIG_MTRR - dhahelper_mtrr_t op; - if (copy_from_user(&op, arg, sizeof(dhahelper_pci_config_t))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy from userspace\n"); - return -EFAULT; - } - switch(op.operation) - { - case MTRR_OP_ADD: - op.privat = mtrr_add (op.start,op.size,op.type,1); - break; - case MTRR_OP_DEL: - mtrr_del(op.privat, op.start, op.size); - break; - default: - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: unknown mtrr operation %i\n",op.operation); - return -EFAULT; - } - if (copy_to_user(arg, &op, sizeof(dhahelper_mtrr_t))) - { - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: failed copy to userspace\n"); - return -EFAULT; - } -#endif - return 0; -} - -static int dhahelper_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) -{ - if (dhahelper_verbosity > 1) - printk(KERN_DEBUG "dhahelper: ioctl(cmd=%x, arg=%lx)\n", - cmd, arg); - - if (MINOR(inode->i_rdev) != 0) - return -ENXIO; - - switch(cmd) - { - case DHAHELPER_GET_VERSION: return dhahelper_get_version((int *)arg); - case DHAHELPER_PORT: return dhahelper_port((dhahelper_port_t *)arg); - case DHAHELPER_MTRR: return dhahelper_mtrr((dhahelper_mtrr_t *)arg); - case DHAHELPER_PCI_CONFIG: return dhahelper_pci_config((dhahelper_pci_config_t *)arg); - case DHAHELPER_VIRT_TO_PHYS:return dhahelper_virt_to_phys((dhahelper_vmi_t *)arg); - case DHAHELPER_VIRT_TO_BUS: return dhahelper_virt_to_bus((dhahelper_vmi_t *)arg); - case DHAHELPER_ALLOC_PA:return dhahelper_alloc_pa((dhahelper_mem_t *)arg); - case DHAHELPER_FREE_PA: return dhahelper_free_pa((dhahelper_mem_t *)arg); - case DHAHELPER_LOCK_MEM: return dhahelper_lock_mem((dhahelper_mem_t *)arg); - case DHAHELPER_UNLOCK_MEM: return dhahelper_unlock_mem((dhahelper_mem_t *)arg); - case DHAHELPER_INSTALL_IRQ: return dhahelper_install_irq((dhahelper_irq_t *)arg); - case DHAHELPER_ACK_IRQ: return dhahelper_ack_irq((dhahelper_irq_t *)arg); - case DHAHELPER_FREE_IRQ: return dhahelper_free_irq((dhahelper_irq_t *)arg); - case DHAHELPER_CPU_FLUSH: return dhahelper_cpu_flush((dhahelper_cpu_flush_t *)arg); - case DHAHELPER_PCI_FIND: return dhahelper_pci_find((dhahelper_pci_device_t *)arg); - default: - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: invalid ioctl (%x)\n", cmd); - return -EINVAL; - } - return 0; -} - -/* - fops functions were shamelessly stolen from linux-kernel project ;) -*/ - -static loff_t dhahelper_lseek(struct file * file, loff_t offset, int orig) -{ - switch (orig) { - case 0: - file->f_pos = offset; - return file->f_pos; - case 1: - file->f_pos += offset; - return file->f_pos; - default: - return -EINVAL; - } -} - -/* - * This funcion reads the *physical* memory. The f_pos points directly to the - * memory location. - */ -static ssize_t dhahelper_read(struct file * file, char * buf, - size_t count, loff_t *ppos) -{ - unsigned long p = *ppos; - unsigned long end_mem; - ssize_t read; - - end_mem = __pa(high_memory); - if (p >= end_mem) - return 0; - if (count > end_mem - p) - count = end_mem - p; - read = 0; -#if defined(__sparc__) || defined(__mc68000__) - /* we don't have page 0 mapped on sparc and m68k.. */ - if (p < PAGE_SIZE) { - unsigned long sz = PAGE_SIZE-p; - if (sz > count) - sz = count; - if (sz > 0) { - if (clear_user(buf, sz)) - return -EFAULT; - buf += sz; - p += sz; - count -= sz; - read += sz; - } - } -#endif - if (copy_to_user(buf, __va(p), count)) - return -EFAULT; - read += count; - *ppos += read; - return read; -} - -static ssize_t do_write_mem(struct file * file, void *p, unsigned long realp, - const char * buf, size_t count, loff_t *ppos) -{ - ssize_t written; - - written = 0; -#if defined(__sparc__) || defined(__mc68000__) - /* we don't have page 0 mapped on sparc and m68k.. */ - if (realp < PAGE_SIZE) { - unsigned long sz = PAGE_SIZE-realp; - if (sz > count) sz = count; - /* Hmm. Do something? */ - buf+=sz; - p+=sz; - count-=sz; - written+=sz; - } -#endif - if (copy_from_user(p, buf, count)) - return -EFAULT; - written += count; - *ppos += written; - return written; -} - -static ssize_t dhahelper_write(struct file * file, const char * buf, - size_t count, loff_t *ppos) -{ - unsigned long p = *ppos; - unsigned long end_mem; - - end_mem = __pa(high_memory); - if (p >= end_mem) - return 0; - if (count > end_mem - p) - count = end_mem - p; - return do_write_mem(file, __va(p), p, buf, count, ppos); -} - -#ifndef pgprot_noncached - -/* - * This should probably be per-architecture in <asm/pgtable.h> - */ -static inline pgprot_t pgprot_noncached(pgprot_t _prot) -{ - unsigned long prot = pgprot_val(_prot); - -#if defined(__i386__) || defined(__x86_64__) - /* On PPro and successors, PCD alone doesn't always mean - uncached because of interactions with the MTRRs. PCD | PWT - means definitely uncached. */ - if (boot_cpu_data.x86 > 3) - prot |= _PAGE_PCD | _PAGE_PWT; -#elif defined(__powerpc__) - prot |= _PAGE_NO_CACHE | _PAGE_GUARDED; -#elif defined(__mc68000__) -#ifdef SUN3_PAGE_NOCACHE - if (MMU_IS_SUN3) - prot |= SUN3_PAGE_NOCACHE; - else -#endif - if (MMU_IS_851 || MMU_IS_030) - prot |= _PAGE_NOCACHE030; - /* Use no-cache mode, serialized */ - else if (MMU_IS_040 || MMU_IS_060) - prot = (prot & _CACHEMASK040) | _PAGE_NOCACHE_S; -#endif - - return __pgprot(prot); -} - -#endif /* !pgprot_noncached */ - -/* - * Architectures vary in how they handle caching for addresses - * outside of main memory. - */ -static inline int noncached_address(unsigned long addr) -{ -#if defined(__i386__) - /* - * On the PPro and successors, the MTRRs are used to set - * memory types for physical addresses outside main memory, - * so blindly setting PCD or PWT on those pages is wrong. - * For Pentiums and earlier, the surround logic should disable - * caching for the high addresses through the KEN pin, but - * we maintain the tradition of paranoia in this code. - */ - return !( test_bit(X86_FEATURE_MTRR, boot_cpu_data.x86_capability) || - test_bit(X86_FEATURE_K6_MTRR, boot_cpu_data.x86_capability) || - test_bit(X86_FEATURE_CYRIX_ARR, boot_cpu_data.x86_capability) || - test_bit(X86_FEATURE_CENTAUR_MCR, boot_cpu_data.x86_capability) ) - && addr >= __pa(high_memory); -#else - return addr >= __pa(high_memory); -#endif -} - -static int dhahelper_mmap(struct file * file, struct vm_area_struct * vma) -{ - unsigned long offset = vma->vm_pgoff << PAGE_SHIFT; - int err; - - /* - * Accessing memory above the top the kernel knows about or - * through a file pointer that was marked O_SYNC will be - * done non-cached. - */ - if (noncached_address(offset) || (file->f_flags & O_SYNC)) - vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); - - /* Don't try to swap out physical pages.. */ - vma->vm_flags |= VM_RESERVED; - - /* - * Don't dump addresses that are not real memory to a core file. - */ - if (offset >= __pa(high_memory) || (file->f_flags & O_SYNC)) - vma->vm_flags |= VM_IO; - -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) - err = remap_page_range(vma, vma->vm_start, offset, - vma->vm_end-vma->vm_start, vma->vm_page_prot); -#else - err = remap_page_range(vma->vm_start, offset, - vma->vm_end-vma->vm_start, vma->vm_page_prot); -#endif - if(err) - return -EAGAIN; - return 0; -} - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -static struct file_operations dhahelper_fops = -{ - /*llseek*/ dhahelper_lseek, - /*read*/ dhahelper_read, - /*write*/ dhahelper_write, - /*readdir*/ NULL, - /*poll*/ NULL, - /*ioctl*/ dhahelper_ioctl, - /*mmap*/ dhahelper_mmap, - /*open*/ dhahelper_open, - /*flush*/ NULL, - /*release*/ dhahelper_release, - /* zero out the last 5 entries too ? */ -}; -#else -static struct file_operations dhahelper_fops = -{ - owner: THIS_MODULE, - ioctl: dhahelper_ioctl, - open: dhahelper_open, - release: dhahelper_release, - llseek: dhahelper_lseek, - read: dhahelper_read, - write: dhahelper_write, - mmap: dhahelper_mmap, -}; -#endif - -#ifdef CONFIG_DEVFS_FS -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) -devfs_handle_t dha_devfsh; - -static int -register_dev(void) -{ - dha_devfsh = devfs_register(NULL, "dhahelper", DEVFS_FL_NONE, - dhahelper_major, 0, - S_IFCHR | S_IRUSR | S_IWUSR, - &dhahelper_fops, NULL); - if(!dha_devfsh) - return -EIO; - return 0; -} - -static void -unregister_dev(void) -{ - devfs_unregister(dha_devfsh); -} -#else /* VERSION < 2.6.0 */ -static int -register_dev(void) -{ - devfs_mk_cdev(MKDEV(dhahelper_major, 0), S_IFCHR | S_IRUSR | S_IWUSR, - "dhahelper"); - if(register_chrdev(dhahelper_major, "dhahelper", &dhahelper_fops)) - return -EIO; - return 0; -} - -static void -unregister_dev(void) -{ - devfs_remove("dhahelper"); - unregister_chrdev(dhahelper_major, "dhahelper"); -} -#endif /* VERSION < 2.6.0 */ -#else -static int -register_dev(void) -{ - return register_chrdev(dhahelper_major, "dhahelper", &dhahelper_fops); -} - -static void -unregister_dev(void) -{ - unregister_chrdev(dhahelper_major, "dhahelper"); -} -#endif /* defined CONFIG_DEVFS_FS */ - - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -int init_module(void) -#else -static int __init init_dhahelper(void) -#endif -{ - int err = 0; - printk(KERN_INFO "Direct Hardware Access kernel helper (C) Alex Beregszaszi\n"); - - err = register_dev(); - if(err){ - if (dhahelper_verbosity > 0) - printk(KERN_ERR "dhahelper: unable to register character device (major: %d)\n", - dhahelper_major); - return err; - } - memset(dha_irqs, 0, sizeof(dha_irqs)); - return 0; -} - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -void cleanup_module(void) -#else -static void __exit exit_dhahelper(void) -#endif -{ - unsigned i; - for(i=0;i<256;i++) - if(dha_irqs[i].handled) - free_irq(i, dha_irqs[i].dev); - - unregister_dev(); -} - -#ifdef EXPORT_NO_SYMBOLS -EXPORT_NO_SYMBOLS; -#endif - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) -module_init(init_dhahelper); -module_exit(exit_dhahelper); -#endif diff --git a/src/video_out/libdha/kernelhelper/dhahelper.h b/src/video_out/libdha/kernelhelper/dhahelper.h deleted file mode 100644 index 7db56abb5..000000000 --- a/src/video_out/libdha/kernelhelper/dhahelper.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - Direct Hardware Access kernel helper - - (C) 2002 Alex Beregszaszi <alex@naxine.org> - (C) 2002-2003 Nick Kurshev <nickols_k@mail.ru> -*/ - -#ifndef DHAHELPER_H -#define DHAHELPER_H - -/* #include <linux/ioctl.h> */ - -/* feel free to change */ -#define DEFAULT_MAJOR 252 /* 240-254 LOCAL/EXPERIMENTAL USE */ - -#define API_VERSION 0x30 /* 3.0*/ - -typedef struct dhahelper_port_s -{ -#define PORT_OP_READ 1 -#define PORT_OP_WRITE 2 - int operation; - int size; - int addr; // FIXME - switch to void* (64bit) - int value; -} dhahelper_port_t; - -typedef struct dhahelper_mtrr_s -{ -#define MTRR_OP_ADD 1 -#define MTRR_OP_DEL 2 - int operation; - long start; - long size; - int type; - int privat; -} dhahelper_mtrr_t; - -typedef struct dhahelper_pci_config_s -{ -#define PCI_OP_READ 0 -#define PCI_OP_WRITE 1 - int operation; - int bus; - int dev; - int func; - int cmd; - int size; - long ret; -} dhahelper_pci_config_t; - -typedef struct dhahelper_vmi_s -{ - void * virtaddr; - unsigned long length; - unsigned long *realaddr; -}dhahelper_vmi_t; - -typedef struct dhahelper_mem_s -{ - void * addr; - unsigned long length; -}dhahelper_mem_t; - -typedef struct dhahelper_irq_s -{ - unsigned num; - int bus, dev, func; - int ack_region; - unsigned long ack_offset; - unsigned int ack_data; -}dhahelper_irq_t; - -typedef struct dhahelper_cpu_flush_s -{ - void *va; - unsigned long length; -}dhahelper_cpu_flush_t; - -typedef struct dhahelper_pci_device_s -{ - int bus,card,func; /* PCI/AGP bus:card:func */ - unsigned short vendor,device; /* Card vendor+device ID */ - unsigned long base0,base1,base2,baserom; /* Memory and I/O base addresses */ - unsigned long base3,base4,base5; /* Memory and I/O base addresses */ - unsigned char irq,ipin,gnt,lat; /* assigned IRQ parameters for this card */ -}dhahelper_pci_device_t; - -#define DHAHELPER_GET_VERSION _IOW('D', 0, int) -#define DHAHELPER_PORT _IOWR('D', 1, dhahelper_port_t) -#define DHAHELPER_MTRR _IOWR('D', 2, dhahelper_mtrr_t) -#define DHAHELPER_PCI_CONFIG _IOWR('D', 3, dhahelper_pci_config_t) -#define DHAHELPER_VIRT_TO_PHYS _IOWR('D', 4, dhahelper_vmi_t) -#define DHAHELPER_VIRT_TO_BUS _IOWR('D', 5, dhahelper_vmi_t) -#define DHAHELPER_ALLOC_PA _IOWR('D', 6, dhahelper_mem_t) -#define DHAHELPER_FREE_PA _IOWR('D', 7, dhahelper_mem_t) -#define DHAHELPER_LOCK_MEM _IOWR('D', 8, dhahelper_mem_t) -#define DHAHELPER_UNLOCK_MEM _IOWR('D', 9, dhahelper_mem_t) -#define DHAHELPER_INSTALL_IRQ _IOWR('D', 10, dhahelper_irq_t) -#define DHAHELPER_ACK_IRQ _IOWR('D', 11, dhahelper_irq_t) -#define DHAHELPER_FREE_IRQ _IOWR('D', 12, dhahelper_irq_t) -#define DHAHELPER_CPU_FLUSH _IOWR('D', 13, dhahelper_cpu_flush_t) -#define DHAHELPER_PCI_FIND _IOWR('D', 14, dhahelper_pci_device_t) - -#endif /* DHAHELPER_H */ diff --git a/src/video_out/libdha/kernelhelper/test.c b/src/video_out/libdha/kernelhelper/test.c deleted file mode 100644 index d2d807f3f..000000000 --- a/src/video_out/libdha/kernelhelper/test.c +++ /dev/null @@ -1,49 +0,0 @@ -#include <string.h> -#include <stdio.h> -#include <sys/ioctl.h> -#include <unistd.h> -#include <errno.h> -#include <fcntl.h> -#include <sys/mman.h> -#include <stdlib.h> - -#include "dhahelper.h" - -int main(int argc, char *argv[]) -{ - int fd; - int ret; - - fd = open("/dev/dhahelper", O_RDWR); - if(fd < 0){ - perror("dev/dhahelper"); - exit(1); - } - - ioctl(fd, DHAHELPER_GET_VERSION, &ret); - - printf("api version: %d\n", ret); - if (ret != API_VERSION) - printf("incompatible api!\n"); - - { - void *mem; - unsigned long size=256; - mem = mmap(0,size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); - printf("allocated to %p\n", mem); - - if (argc > 1) - if (mem != 0) - { - int i; - - for (i = 0; i < 256; i++) - printf("[%x] ", *(int *)(mem+i)); - printf("\n"); - } - - munmap((void *)mem, size); - } - - return(0); -} diff --git a/src/video_out/libdha/libdha.c b/src/video_out/libdha/libdha.c deleted file mode 100644 index 73a4387a2..000000000 --- a/src/video_out/libdha/libdha.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - libgha.c - Library for direct hardware access - Copyrights: - 1996/10/27 - Robin Cutshaw (robin@xfree86.org) - XFree86 3.3.3 implementation - 1999 - Øyvind Aabling. - Modified for GATOS/win/gfxdump. - - 2002 - library implementation by Nick Kurshev - - dhahelper and some changes by Alex Beregszaszi - - supported O/S's: SVR4, UnixWare, SCO, Solaris, - FreeBSD, NetBSD, 386BSD, BSDI BSD/386, - Linux, Mach/386, ISC - DOS (WATCOM 9.5 compiler), Win9x (with mapdev.vxd) - Licence: GPL - Original location: www.linuxvideo.org/gatos -*/ - -#include "config.h" - -#include "libdha.h" -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <fcntl.h> -#include <sys/stat.h> -#include <sys/types.h> -#ifdef ARCH_ALPHA -#include <sys/io.h> -#endif -#include <unistd.h> - -/* instead exit() use libdha_exit, and do the 'mother-application' deinit - only in this code */ -void libdha_exit(const char *message, int level) -{ - printf("libdha: FATAL: %s\n", message); - exit(level); /* FIXME */ -} - -#if defined(_WIN32) -#include "sysdep/libdha_win32.c" -#elif defined (__EMX__) -#include "sysdep/libdha_os2.c" -#else - -#if defined(SVR4) || defined(SCO325) -# if !(defined(sun) && defined (i386) && defined (SVR4)) -# define DEV_MEM "/dev/pmem" -# elif defined(PowerMAX_OS) -# define DEV_MEM "/dev/iomem" -# endif -# ifdef SCO325 -# undef DEV_MEM -# define DEV_MEM "/dev/mem" -# endif -# endif /* SVR4 */ - -/* Generic version */ -#include <sys/mman.h> -#include <sys/ioctl.h> -#ifndef DEV_MEM -#define DEV_MEM "/dev/mem" -#endif - -#include "kernelhelper/dhahelper.h" - -static int devmem_fd=-1; -static unsigned devmem_locks=0; -void *map_phys_mem(unsigned long base, unsigned long size) -{ -#ifdef ARCH_ALPHA -/* TODO: move it into sysdep */ - base += bus_base(); -#endif - if( devmem_fd == -1) - { - if ( (devmem_fd = open("/dev/dhahelper",O_RDWR)) < 0) - { - if ( (devmem_fd = open(DEV_MEM,O_RDWR)) == -1) - { - perror("libdha: open(/dev/mem) failed"); - exit(1); - } - } - } - devmem_locks++; - return mmap(0,size,PROT_READ|PROT_WRITE,MAP_SHARED,devmem_fd,base) ; -} - -void unmap_phys_mem(void *ptr, unsigned long size) -{ - int res=munmap(ptr,size) ; - if (res == -1) { perror("libdha: munmap() failed") ; exit(1) ; } - devmem_locks--; - if(!devmem_locks) { close(devmem_fd); devmem_fd=-1; } -} -#endif diff --git a/src/video_out/libdha/libdha.h b/src/video_out/libdha/libdha.h deleted file mode 100644 index 2bd8fe39b..000000000 --- a/src/video_out/libdha/libdha.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - libgha.h - Library for direct hardware access - Copyrights: - 1996/10/27 - Robin Cutshaw (robin@xfree86.org) - XFree86 3.3.3 implementation - 1999 - Øyvind Aabling. - Modified for GATOS/win/gfxdump. - 2002 - library implementation by Nick Kurshev - - supported O/S's: SVR4, UnixWare, SCO, Solaris, - FreeBSD, NetBSD, 386BSD, BSDI BSD/386, - Linux, Mach/386, ISC - DOS (WATCOM 9.5 compiler), Win9x (with mapdev.vxd) - Licence: GPL -*/ -#ifndef LIBDHA_H -#define LIBDHA_H - -#if defined (__FreeBSD__) -# include <inttypes.h> -#else -# include <stdint.h> -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#define MAX_DEV_PER_VENDOR_CFG1 64 -#define MAX_PCI_DEVICES_PER_BUS 32 -#define MAX_PCI_DEVICES 64 -#define PCI_MULTIFUNC_DEV 0x80 - -typedef struct pciinfo_s -{ - int bus,card,func; /* PCI/AGP bus:card:func */ - unsigned short vendor,device; /* Card vendor+device ID */ - unsigned long base0,base1,base2,baserom; /* Memory and I/O base addresses */ - unsigned long base3,base4,base5; /* Memory and I/O base addresses */ - unsigned char irq,ipin,gnt,lat; /* assigned IRQ parameters for this card */ -// unsigned base0_limit, base1_limit, base2_limit, baserom_limit; -}pciinfo_t; - -extern int pci_config_read(unsigned char bus, unsigned char dev, unsigned char func, - unsigned char cmd, int len, unsigned long *val); -extern int pci_config_write(unsigned char bus, unsigned char dev, unsigned char func, - unsigned char cmd, int len, unsigned long val); - /* Fill array pci_list which must have size MAX_PCI_DEVICES - and return 0 if sucessful */ -extern int pci_scan(pciinfo_t *pci_list,unsigned *num_card); - - /* Enables/disables accessing to IO space from application side. - Should return 0 if o'k or errno on error. */ -extern int enable_app_io( void ); -extern int disable_app_io( void ); - -extern unsigned char INPORT8(unsigned idx); -extern unsigned short INPORT16(unsigned idx); -extern unsigned INPORT32(unsigned idx); -#define INPORT(idx) INPORT32(idx) -extern void OUTPORT8(unsigned idx,unsigned char val); -extern void OUTPORT16(unsigned idx,unsigned short val); -extern void OUTPORT32(unsigned idx,unsigned val); -#define OUTPORT(idx,val) OUTPORT32(idx,val) - -extern void * map_phys_mem(unsigned long base, unsigned long size); -extern void unmap_phys_mem(void *ptr, unsigned long size); - -/* These are the region types */ -#define MTRR_TYPE_UNCACHABLE 0 -#define MTRR_TYPE_WRCOMB 1 -#define MTRR_TYPE_WRTHROUGH 4 -#define MTRR_TYPE_WRPROT 5 -#define MTRR_TYPE_WRBACK 6 -extern int mtrr_set_type(unsigned base,unsigned size,int type); - -/* Busmastering support */ - /* returns 0 if support exists else errno */ -extern int bm_open( void ); -extern void bm_close( void ); - /* Converts virtual memory addresses into physical - returns 0 if OK else - errno - parray should have enough length to accept length/page_size - elements. virt_addr can be located in non-continious memory - block and can be allocated by malloc(). (kmalloc() is not - needed). Note: if you have some very old card which requires - continous memory block then you need to implement bm_kmalloc - bm_kfree functions here. NOTE2: to be sure that every page of - region is present in physical memory (is not swapped out) use - m(un)lock functions. Note3: Probably your card will want to - have page-aligned block for DMA transfer so use - memalign(PAGE_SIZE,mem_size) function to alloc such memory. */ -extern int bm_virt_to_phys( void * virt_addr, unsigned long length, - unsigned long * parray ); - /* Converts virtual memory addresses into bus address - Works in the same way as bm_virt_to_phys. - WARNING: This function will be die after implementing - bm_alloc_pci_shmem() because we really can't pass - any memory address to card. Example: 64-bit linear address - can't be passed into 32-bit card. Even more - some old - cards can access 24-bit address space only */ -extern int bm_virt_to_bus( void * virt_addr, unsigned long length, - unsigned long * barray ); - - /* NOTE: bm_alloc_pci_shmem() and bm_free_pci_shmem() - are still not implemented! - arguments: - pciinfo_t - specifies pci card for which memory should be shared - bitness - can be 16,24,32,64 specifies addressing possibilities - of the card - length - specifies size of memory which should allocated - op - specifies direction as combination flags TO_CARD,FROM_CARD - Return value - should be tuned - we need to have something like this: - struct pci_shmem - { - void * handler; - void * virt_addr - void * array_of_bus_addr[]; - unsigned long length; - } - NOTE2: After finalizing of these functions bm_virt_to_bus() will be die */ -extern void * bm_alloc_pci_shmem(pciinfo_t *, unsigned mem_bitness, unsigned long length,int op ); -extern void bm_free_pci_shmem(void * pci_shmem); - -extern int bm_lock_mem( const void * addr, unsigned long length ); -extern int bm_unlock_mem( const void * addr, unsigned long length ); - -/* HWIRQ support */ - -extern int hwirq_install(int bus, int dev, int func, - int areg, unsigned long aoff, uint32_t adata); -extern int hwirq_wait(unsigned irqnum); -extern int hwirq_uninstall(int bus, int dev, int func); - -/* CPU flushing support */ -extern void cpu_flush(void *va,unsigned long length); - -extern void libdha_exit(const char *message, int level); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/video_out/libdha/mmi.c b/src/video_out/libdha/mmi.c deleted file mode 100644 index 39d21926a..000000000 --- a/src/video_out/libdha/mmi.c +++ /dev/null @@ -1,112 +0,0 @@ -/* Memory manager interface */ -#include <stdio.h> -#include <sys/ioctl.h> -#include <sys/types.h> -#include <sys/mman.h> /* mlock */ -#include <errno.h> -#include <unistd.h> -#include <fcntl.h> -#include "libdha.h" -#include "kernelhelper/dhahelper.h" - -static int libdha_fd=-1; - -#define ALLOWED_VER 0x10 -int bm_open( void ) -{ - int retv; - libdha_fd = open("/dev/dhahelper",O_RDWR); - retv = libdha_fd > 0 ? 0 : ENXIO; - if(!retv) - { - int ver; - ioctl(libdha_fd,DHAHELPER_GET_VERSION,&ver); - if(ver < ALLOWED_VER) - { - printf("libdha: You have wrong version (%i) of /dev/dhahelper\n" - "libdha: Please upgrade your driver up to ver=%i\n",ver,ALLOWED_VER); - retv = EINVAL; - close(libdha_fd); - } - } - else printf("libdha: Can't open /dev/dhahelper\n"); - return retv; -} - -void bm_close( void ) -{ - close(libdha_fd); -} - -int bm_virt_to_phys( void * virt_addr, unsigned long length, unsigned long * parray ) -{ - dhahelper_vmi_t vmi; - vmi.virtaddr = virt_addr; - vmi.length = length; - vmi.realaddr = parray; - if(libdha_fd > 0) return ioctl(libdha_fd,DHAHELPER_VIRT_TO_PHYS,&vmi); - return ENXIO; -} - -int bm_virt_to_bus( void * virt_addr, unsigned long length, unsigned long * barray ) -{ - dhahelper_vmi_t vmi; - vmi.virtaddr = virt_addr; - vmi.length = length; - vmi.realaddr = barray; - if(libdha_fd > 0) return ioctl(libdha_fd,DHAHELPER_VIRT_TO_BUS,&vmi); - return ENXIO; -} - -void * bm_alloc_pci_shmem(pciinfo_t *pi, unsigned mem_bitness, unsigned long length,int op ) -{ - printf("libdha: Pure virtual function call - bm_alloc_pci_shmem()\n"); -#if 0 - dhahelper_mem_t vmi; - vmi.length = length; - if(libdha_fd > 0) - { - if(ioctl(libdha_fd,DHAHELPER_ALLOC_PA,&vmi) == 0) - return vmi.addr; - } -#endif - return NULL; -} - -void bm_free_pci_shmem(void * pci_shmem) -{ - printf("libdha: Pure virtual function call - bm_free_pci_shmem()\n"); -#if 0 - dhahelper_mem_t vmi; - vmi.addr = virt_addr; - vmi.length = length; - if(libdha_fd > 0) - { - ioctl(libdha_fd,DHAHELPER_FREE_PA,&vmi); - } -#endif -} - -int bm_lock_mem( const void *addr, unsigned long length ) -{ - dhahelper_mem_t vmi; - vmi.addr = (void *) addr; - vmi.length = length; - if(libdha_fd > 0) - { - return ioctl(libdha_fd,DHAHELPER_LOCK_MEM,&vmi); - } - return mlock(addr,length); -} - -int bm_unlock_mem( const void * addr, unsigned long length ) -{ - dhahelper_mem_t vmi; - vmi.addr = (void *) addr; - vmi.length = length; - if(libdha_fd > 0) - { - return ioctl(libdha_fd,DHAHELPER_UNLOCK_MEM,&vmi); - } - return munlock(addr,length); -} diff --git a/src/video_out/libdha/mtrr.c b/src/video_out/libdha/mtrr.c deleted file mode 100644 index 48ae5a1fd..000000000 --- a/src/video_out/libdha/mtrr.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - mtrr.c - Stuff for optimizing memory access - Copyrights: - 2002 - Linux version by Nick Kurshev - Licence: GPL -*/ - -#include "config.h" - -#include <stdio.h> -#include <string.h> -#include <errno.h> -#include <unistd.h> -#include <fcntl.h> -#include <sys/ioctl.h> -#include "kernelhelper/dhahelper.h" -#include "libdha.h" - -#if defined (__i386__) && defined (__NetBSD__) -#include <sys/param.h> -#if __NetBSD_Version__ > 105240000 -#include <stdint.h> -#include <stdlib.h> -#include <machine/mtrr.h> -#include <machine/sysarch.h> -#endif -#endif - -int mtrr_set_type(unsigned base,unsigned size,int type) -{ - int dhahelper_fd; - dhahelper_fd = open("/dev/dhahelper",O_RDWR); - if(dhahelper_fd > 0) - { - int retval; - dhahelper_mtrr_t mtrrs; - mtrrs.operation = MTRR_OP_ADD; - mtrrs.start = base; - mtrrs.size = size; - mtrrs.type = type; - retval = ioctl(dhahelper_fd, DHAHELPER_ACK_IRQ, &mtrrs); - close(dhahelper_fd); - return retval; - } -#if defined (__NetBSD__) && (__NetBSD_Version__) > 105240000 - { - struct mtrr *mtrrp; - int n; - - mtrrp = malloc(sizeof (struct mtrr)); - mtrrp->base = base; - mtrrp->len = size; - mtrrp->type = type; - mtrrp->flags = MTRR_VALID | MTRR_PRIVATE; - n = 1; - - if (i386_set_mtrr(mtrrp, &n) < 0) { - free(mtrrp); - return errno; - } - free(mtrrp); - return 0; - } -#else - { - FILE * mtrr_fd; - char * stype; - switch(type) - { - case MTRR_TYPE_UNCACHABLE: stype = "uncachable"; break; - case MTRR_TYPE_WRCOMB: stype = "write-combining"; break; - case MTRR_TYPE_WRTHROUGH: stype = "write-through"; break; - case MTRR_TYPE_WRPROT: stype = "write-protect"; break; - case MTRR_TYPE_WRBACK: stype = "write-back"; break; - default: return EINVAL; - } - mtrr_fd = fopen("/proc/mtrr","wt"); - if(mtrr_fd) - { - char sout[256]; - unsigned wr_len; - sprintf(sout,"base=0x%08X size=0x%08X type=%s\n",base,size,stype); - wr_len = fprintf(mtrr_fd,"%s",sout); - /*printf("MTRR: %s\n",sout);*/ - fclose(mtrr_fd); - return wr_len == strlen(sout) ? 0 : EPERM; - } - } -#endif - return ENOSYS; -} diff --git a/src/video_out/libdha/oth/Makefile.am b/src/video_out/libdha/oth/Makefile.am deleted file mode 100644 index 55651d233..000000000 --- a/src/video_out/libdha/oth/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -EXTRA_DIST = pci.db diff --git a/src/video_out/libdha/oth/pci.db b/src/video_out/libdha/oth/pci.db deleted file mode 100644 index 083b2892f..000000000 --- a/src/video_out/libdha/oth/pci.db +++ /dev/null @@ -1,9471 +0,0 @@ -v 0000 Gammagraphx, Inc. 0 -v 001a Ascend Communications, Inc. 0 -v 0033 Paradyne corp. 0 -v 003d Lockheed Martin-Marietta Corp 0 -v 0059 Tiger Jet Network Inc. (Wrong ID) 0 Real TJN ID is e159, but they got it wrong several times --mj -v 0070 Hauppauge computer works Inc. 0 -d 00704000 WinTV PVR-350 0 -d 00704001 WinTV PVR-250 (v1) 0 -d 00704009 WinTV PVR-250 0 -d 00704801 WinTV PVR-250 MCE 0 -v 0071 Nebula Electronics Ltd. 0 -v 0095 Silicon Image, Inc. (Wrong ID) 0 -d 00950680 Ultra ATA/133 IDE RAID CONTROLLER CARD 0 -v 0100 Ncipher Corp Ltd 0 -v 018a LevelOne 0 018a is not LevelOne but there is a board misprogrammed -d 018a0106 FPC-0106TX misprogrammed [RTL81xx] 0 -v 021b Compaq Computer Corporation 0 021b is not Compaq but there is a board misprogrammed -d 021b8139 HNE-300 (RealTek RTL8139c) [iPaq Networking] 0 -v 0291 Davicom Semiconductor, Inc. 0 http://www.davicom.com.tw/ -d 02918212 DM9102A(DM9102AE, SM9102AF) Ethernet 100/10 MBit(Rev 40) 0 -v 02ac SpeedStream 0 SpeedStream is Efficient Networks, Inc, a Siemens Company -d 02ac1012 1012 PCMCIA 10/100 Ethernet Card [RTL81xx] 0 -v 0357 TTTech AG 0 -d 0357000a TTP-Monitoring Card V2.0 0 -v 05e3 CyberDoor 0 -d 05e30701 CBD516 0 -v 0675 Dynalink 0 -d 06751700 IS64PH ISDN Adapter 0 -d 06751702 IS64PH ISDN Adapter 0 -v 0925 VIA Technologies, Inc. (Wrong ID) 0 Wrong ID used in subsystem ID of VIA USB controllers. -v 09c1 Arris 0 -d 09c10704 CM 200E Cable Modem 0 -v 0a89 BREA Technologies Inc 0 -v 0b49 ASCII Corporation 0 -d 0b49064f Trance Vibrator 0 see http://homepage1.nifty.com/mcn/lab/machines/trance_vibrator/usbview.vib.txt -v 0e11 Compaq Computer Corporation 0 -d 0e110001 PCI to EISA Bridge 0 -d 0e110002 PCI to ISA Bridge 0 -d 0e110046 Smart Array 64xx 0 -s 0e1100460e11409a Smart Array 641 0 -s 0e1100460e11409b Smart Array 642 0 -s 0e1100460e11409c Smart Array 6400 0 -s 0e1100460e11409d Smart Array 6400 EM 0 -d 0e110049 NC7132 Gigabit Upgrade Module 0 -d 0e11004a NC6136 Gigabit Server Adapter 0 -d 0e11007c NC7770 1000BaseTX 0 -d 0e11007d NC6770 1000BaseTX 0 -d 0e110085 NC7780 1000BaseTX 0 -d 0e1100bb NC7760 0 -d 0e1100ca NC7771 0 -d 0e1100cb NC7781 0 -d 0e1100cf NC7772 0 -d 0e1100d0 NC7782 0 -d 0e1100d1 NC7783 0 -d 0e1100e3 NC7761 0 -d 0e110508 Netelligent 4/16 Token Ring 0 -d 0e111000 Triflex/Pentium Bridge, Model 1000 0 -d 0e112000 Triflex/Pentium Bridge, Model 2000 0 -d 0e113032 QVision 1280/p 0 -d 0e113033 QVision 1280/p 0 -d 0e113034 QVision 1280/p 0 -d 0e114000 4000 [Triflex] 0 -d 0e114030 SMART-2/P 0 -d 0e114031 SMART-2SL 0 -d 0e114032 Smart Array 3200 0 -d 0e114033 Smart Array 3100ES 0 -d 0e114034 Smart Array 221 0 -d 0e114040 Integrated Array 0 -d 0e114048 Compaq Raid LC2 0 -d 0e114050 Smart Array 4200 0 -d 0e114051 Smart Array 4250ES 0 -d 0e114058 Smart Array 431 0 -d 0e114070 Smart Array 5300 0 -d 0e114080 Smart Array 5i 0 -d 0e114082 Smart Array 532 0 -d 0e114083 Smart Array 5312 0 -d 0e114091 Smart Array 6i 0 -d 0e11409a Smart Array 641 0 -d 0e11409b Smart Array 642 0 -d 0e11409c Smart Array 6400 0 -d 0e11409d Smart Array 6400 EM 0 -d 0e116010 HotPlug PCI Bridge 6010 0 -d 0e117020 USB Controller 0 -d 0e11a0ec Fibre Channel Host Controller 0 -d 0e11a0f0 Advanced System Management Controller 0 -d 0e11a0f3 Triflex PCI to ISA Bridge 0 -d 0e11a0f7 PCI Hotplug Controller 0 -s 0e11a0f78086002a PCI Hotplug Controller A 0 -s 0e11a0f78086002b PCI Hotplug Controller B 0 -d 0e11a0f8 ZFMicro Chipset USB 0 -d 0e11a0fc FibreChannel HBA Tachyon 0 -d 0e11ae10 Smart-2/P RAID Controller 0 -s 0e11ae100e114030 Smart-2/P Array Controller 0 -s 0e11ae100e114031 Smart-2SL Array Controller 0 -s 0e11ae100e114032 Smart Array Controller 0 -s 0e11ae100e114033 Smart 3100ES Array Controller 0 -d 0e11ae29 MIS-L 0 -d 0e11ae2a MPC 0 -d 0e11ae2b MIS-E 0 -d 0e11ae31 System Management Controller 0 -d 0e11ae32 Netelligent 10/100 TX PCI UTP 0 -d 0e11ae33 Triflex Dual EIDE Controller 0 -d 0e11ae34 Netelligent 10 T PCI UTP 0 -d 0e11ae35 Integrated NetFlex-3/P 0 -d 0e11ae40 Netelligent Dual 10/100 TX PCI UTP 0 -d 0e11ae43 Netelligent Integrated 10/100 TX UTP 0 -d 0e11ae69 CETUS-L 0 -d 0e11ae6c Northstar 0 -d 0e11ae6d NorthStar CPU to PCI Bridge 0 -d 0e11b011 Netelligent 10/100 TX Embedded UTP 0 -d 0e11b012 Netelligent 10 T/2 PCI UTP/Coax 0 -d 0e11b01e NC3120 Fast Ethernet NIC 0 -d 0e11b01f NC3122 Fast Ethernet NIC 0 -d 0e11b02f NC1120 Ethernet NIC 0 -d 0e11b030 Netelligent 10/100 TX UTP 0 -d 0e11b04a 10/100 TX PCI Intel WOL UTP Controller 0 -d 0e11b060 Smart Array 5300 Controller 0 -d 0e11b0c6 NC3161 Fast Ethernet NIC 0 -d 0e11b0c7 NC3160 Fast Ethernet NIC 0 -d 0e11b0d7 NC3121 Fast Ethernet NIC 0 -d 0e11b0dd NC3131 Fast Ethernet NIC 0 -d 0e11b0de NC3132 Fast Ethernet Module 0 -d 0e11b0df NC6132 Gigabit Module 0 -d 0e11b0e0 NC6133 Gigabit Module 0 -d 0e11b0e1 NC3133 Fast Ethernet Module 0 -d 0e11b123 NC6134 Gigabit NIC 0 -d 0e11b134 NC3163 Fast Ethernet NIC 0 -d 0e11b13c NC3162 Fast Ethernet NIC 0 -d 0e11b144 NC3123 Fast Ethernet NIC 0 -d 0e11b163 NC3134 Fast Ethernet NIC 0 -d 0e11b164 NC3165 Fast Ethernet Upgrade Module 0 -d 0e11b178 Smart Array 5i/532 0 -s 0e11b1780e114080 Smart Array 5i 0 -s 0e11b1780e114082 Smart Array 532 0 -s 0e11b1780e114083 Smart Array 5312 0 -d 0e11b1a4 NC7131 Gigabit Server Adapter 0 -d 0e11b200 Memory Hot-Plug Controller 0 HP Memory Hot-Plug Controller -d 0e11b203 Integrated Lights Out Controller 0 -d 0e11b204 Integrated Lights Out Processor 0 -d 0e11f130 NetFlex-3/P ThunderLAN 1.0 0 -d 0e11f150 NetFlex-3/P ThunderLAN 2.3 0 -v 0e55 HaSoTec GmbH 0 -v 1000 LSI Logic / Symbios Logic 0 Formerly NCR -d 10000001 53c810 0 -s 1000000110001000 LSI53C810AE PCI to SCSI I/O Processor 0 -d 10000002 53c820 0 -d 10000003 53c825 0 -s 1000000310001000 LSI53C825AE PCI to SCSI I/O Processor (Ultra Wide) 0 -d 10000004 53c815 0 -d 10000005 53c810AP 0 -d 10000006 53c860 0 -s 1000000610001000 LSI53C860E PCI to Ultra SCSI I/O Processor 0 -d 1000000a 53c1510 0 -s 1000000a10001000 LSI53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Nonintelligent mode) 0 -d 1000000b 53C896/897 0 -s 1000000b0e116004 EOB003 Series SCSI host adapter 0 -s 1000000b10001000 LSI53C896/7 PCI to Dual Channel Ultra2 SCSI Multifunction Controller 0 -s 1000000b10001010 LSI22910 PCI to Dual Channel Ultra2 SCSI host adapter 0 -s 1000000b10001020 LSI21002 PCI to Dual Channel Ultra2 SCSI host adapter 0 -s 1000000b13e91000 6221L-4U 0 multifunction PCI card: Dual U2W SCSI, dual 10/100TX, graphics -d 1000000c 53c895 0 -s 1000000c10001010 LSI8951U PCI to Ultra2 SCSI host adapter 0 -s 1000000c10001020 LSI8952U PCI to Ultra2 SCSI host adapter 0 -s 1000000c1de13906 DC-390U2B SCSI adapter 0 -s 1000000c1de13907 DC-390U2W 0 -d 1000000d 53c885 0 -d 1000000f 53c875 0 -s 1000000f0e117004 Embedded Ultra Wide SCSI Controller 0 -s 1000000f10001000 LSI53C876/E PCI to Dual Channel SCSI Controller 0 -s 1000000f10001010 LSI22801 PCI to Dual Channel Ultra SCSI host adapter 0 -s 1000000f10001020 LSI22802 PCI to Dual Channel Ultra SCSI host adapter 0 -s 1000000f10928760 FirePort 40 Dual SCSI Controller 0 -s 1000000f1de13904 DC390F/U Ultra Wide SCSI Adapter 0 -s 1000000f4c531000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard 0 -s 1000000f4c531050 CT7 mainboard 0 -d 10000010 53C1510 0 -s 100000100e114040 Integrated Array Controller 0 -s 100000100e114048 RAID LC2 Controller 0 -s 1000001010001000 53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Intelligent mode) 0 -d 10000012 53c895a 0 -s 1000001210001000 LSI53C895A PCI to Ultra2 SCSI Controller 0 -d 10000013 53c875a 0 -s 1000001310001000 LSI53C875A PCI to Ultra SCSI Controller 0 -d 10000020 53c1010 Ultra3 SCSI Adapter 0 -s 1000002010001000 LSI53C1010-33 PCI to Dual Channel Ultra160 SCSI Controller 0 -s 100000201de11020 DC-390U3W 0 -d 10000021 53c1010 66MHz Ultra3 SCSI Adapter 0 -s 1000002110001000 LSI53C1000/1000R/1010R/1010-66 PCI to Ultra160 SCSI Controller 0 -s 1000002110001010 Asus TR-DLS onboard 53C1010-66 0 -s 10000021124b1070 PMC-USCSI3 0 -s 100000214c531080 CT8 mainboard 0 -s 100000214c531300 P017 mezzanine (32-bit PMC) 0 -s 100000214c531310 P017 mezzanine (64-bit PMC) 0 -d 10000030 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI 0 -s 1000003010280123 PowerEdge 2600 0 -s 100000301028014a PowerEdge 1750 0 -s 100000301028016c PowerEdge 1850 MPT Fusion SCSI/RAID (Perc 4) 0 -s 1000003010281010 LSI U320 SCSI Controller 0 -d 10000031 53c1030ZC PCI-X Fusion-MPT Dual Ultra320 SCSI 0 -d 10000032 53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI 0 -s 1000003210001000 LSI53C1020/1030 PCI-X to Ultra320 SCSI Controller 0 -d 10000033 1030ZC_53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI 0 -d 10000040 53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI 0 -s 1000004010000033 MegaRAID SCSI 320-2XR 0 -s 1000004010000066 MegaRAID SCSI 320-2XRWS 0 -d 10000041 53C1035ZC PCI-X Fusion-MPT Dual Ultra320 SCSI 0 -d 1000008f 53c875J 0 -s 1000008f10928000 FirePort 40 SCSI Controller 0 -s 1000008f10928760 FirePort 40 Dual SCSI Host Adapter 0 -d 10000407 MegaRAID 0 -s 1000040710000530 MegaRAID 530 SCSI 320-0X RAID Controller 0 -s 1000040710000531 MegaRAID 531 SCSI 320-4X RAID Controller 0 -s 1000040710000532 MegaRAID 532 SCSI 320-2X RAID Controller 0 -s 1000040710280531 PowerEdge Expandable RAID Controller 4/QC 0 -s 1000040710280533 PowerEdge Expandable RAID Controller 4/QC 0 -s 1000040780860530 MegaRAID Intel RAID Controller SRCZCRX 0 -s 1000040780860532 MegaRAID Intel RAID Controller SRCU42X 0 -d 10000408 MegaRAID 0 -s 1000040810000001 MegaRAID SCSI 320-1E RAID Controller 0 -s 1000040810000002 MegaRAID SCSI 320-2E RAID Controller 0 -s 100004081025004d MegaRAID ACER ROMB-2E RAID Controller 0 -s 1000040810280001 PowerEdge RAID Controller PERC4e/SC 0 -s 1000040810280002 PowerEdge RAID Controller PERC4e/DC 0 -s 1000040817341065 FSC MegaRAID PCI Express ROMB 0 -s 1000040880860002 MegaRAID Intel RAID Controller SRCU42E 0 -d 10000409 MegaRAID 0 -s 1000040910003004 MegaRAID SATA 300-4X RAID Controller 0 -s 1000040910003008 MegaRAID SATA 300-8X RAID Controller 0 -s 1000040980863008 MegaRAID RAID Controller SRCS28X 0 -s 1000040980863431 MegaRAID RAID Controller Alief SROMBU42E 0 -s 1000040980863499 MegaRAID RAID Controller Harwich SROMBU42E 0 -d 10000621 FC909 Fibre Channel Adapter 0 -d 10000622 FC929 Fibre Channel Adapter 0 -s 1000062210001020 44929 O Dual Fibre Channel card 0 -d 10000623 FC929 LAN 0 -d 10000624 FC919 Fibre Channel Adapter 0 -d 10000625 FC919 LAN 0 -d 10000626 FC929X Fibre Channel Adapter 0 -s 1000062610001010 7202-XP-LC Dual Fibre Channel card 0 -d 10000627 FC929X LAN 0 -d 10000628 FC919X Fibre Channel Adapter 0 -d 10000629 FC919X LAN 0 -d 10000701 83C885 NT50 DigitalScape Fast Ethernet 0 -d 10000702 Yellowfin G-NIC gigabit ethernet 0 -s 1000070213180000 PEI100X 0 -d 10000804 SA2010 0 -d 10000805 SA2010ZC 0 -d 10000806 SA2020 0 -d 10000807 SA2020ZC 0 -d 10000901 61C102 0 -d 10001000 63C815 0 -d 10001960 MegaRAID 0 -s 1000196010000518 MegaRAID 518 SCSI 320-2 Controller 0 -s 1000196010000520 MegaRAID 520 SCSI 320-1 Controller 0 -s 1000196010000522 MegaRAID 522 i4 133 RAID Controller 0 -s 1000196010000523 MegaRAID SATA 150-6 RAID Controller 0 -s 1000196010004523 MegaRAID SATA 150-4 RAID Controller 0 -s 100019601000a520 MegaRAID ZCR SCSI 320-0 Controller 0 -s 1000196010280518 MegaRAID 518 DELL PERC 4/DC RAID Controller 0 -s 1000196010280520 MegaRAID 520 DELL PERC 4/SC RAID Controller 0 -s 1000196010280531 PowerEdge Expandable RAID Controller 4/QC 0 -s 1000196010280533 PowerEdge Expandable RAID Controller 4/QC 0 -s 1000196080860520 MegaRAIDRAID Controller SRCU41L 0 -s 1000196080860523 MegaRAID RAID Controller SRCS16 0 -v 1001 Kolter Electronic 0 -d 10010010 PCI 1616 Measurement card with 32 digital I/O lines 0 -d 10010011 OPTO-PCI Opto-Isolated digital I/O board 0 -d 10010012 PCI-AD/DA Analogue I/O board 0 -d 10010013 PCI-OPTO-RELAIS Digital I/O board with relay outputs 0 -d 10010014 PCI-Counter/Timer Counter Timer board 0 -d 10010015 PCI-DAC416 Analogue output board 0 -d 10010016 PCI-MFB Analogue I/O board 0 -d 10010017 PROTO-3 PCI Prototyping board 0 -d 10019100 INI-9100/9100W SCSI Host 0 -v 1002 ATI Technologies Inc 0 -d 10023150 M24 1P [Radeon Mobility X600] 0 -d 10023154 M24 1T [FireGL M24 GL] 0 -d 10023e50 RV380 0x3e50 [Radeon X600] 0 -d 10023e54 RV380 0x3e54 [FireGL V3200] 0 -d 10023e70 RV380 [Radeon X600] Secondary 0 -d 10024136 Radeon IGP 320 M 0 -d 10024137 Radeon IGP330/340/350 0 -d 10024144 R300 AD [Radeon 9500 Pro] 0 -d 10024145 R300 AE [Radeon 9700 Pro] 0 New PCI ID provided by ATI developer relations (correction to above) -d 10024146 R300 AF [Radeon 9700 Pro] 0 New PCI ID provided by ATI developer relations (oops, correction to above) -d 10024147 R300 AG [FireGL Z1/X1] 0 -d 10024148 R350 AH [Radeon 9800] 0 -d 10024149 R350 AI [Radeon 9800] 0 -d 1002414a R350 AJ [Radeon 9800] 0 -d 1002414b R350 AK [Fire GL X2] 0 -d 10024150 RV350 AP [Radeon 9600] 0 New PCI ID provided by ATI developer relations -s 1002415010020002 R9600 Pro primary (Asus OEM for HP) 0 -s 1002415010020003 R9600 Pro secondary (Asus OEM for HP) 0 -s 1002415014584024 Giga-Byte GV-R96128D Primary 0 -s 10024150148c2064 PowerColor R96A-C3N 0 -s 10024150148c2066 PowerColor R96A-C3N 0 -s 10024150174b7c19 Sapphire Atlantis Radeon 9600 Pro 0 -s 10024150174b7c29 GC-R9600PRO Primary [Sapphire] 0 -s 1002415017ee2002 Radeon 9600 256Mb Primary 0 -s 1002415018bc0101 GC-R9600PRO Primary 0 -d 10024151 RV350 AQ [Radeon 9600] 0 New PCI ID provided by ATI developer relations -s 100241511043c004 A9600SE 0 -d 10024152 RV350 AR [Radeon 9600] 0 New PCI ID provided by ATI developer relations -s 1002415210020002 Radeon 9600XT 0 -s 100241521043c002 Radeon 9600 XT TVD 0 -d 10024153 RV350 AS [Radeon 9600 AS] 0 -d 10024154 RV350 AT [Fire GL T2] 0 -d 10024155 RV350 AU [Fire GL T2] 0 -d 10024156 RV350 AV [Fire GL T2] 0 -d 10024157 RV350 AW [Fire GL T2] 0 -d 10024158 68800AX [Mach32] 0 -d 10024164 R300 AD [Radeon 9500 Pro] (Secondary) 0 The PCI ID is unrelated to any DVI output. -d 10024165 R300 AE [Radeon 9700 Pro] (Secondary) 0 New PCI ID info provided by ATI developer relations -d 10024166 R300 AF [Radeon 9700 Pro] (Secondary) 0 New PCI ID info provided by ATI developer relations -d 10024168 Radeon R350 [Radeon 9800] (Secondary) 0 New PCI ID provided by ATI developer relations -d 10024170 RV350 AP [Radeon 9600] (Secondary) 0 New PCI ID provided by ATI developer relations (correction to above) -s 1002417014584025 Giga-Byte GV-R96128D Secondary 0 -s 10024170148c2067 PowerColor R96A-C3N (Secondary) 0 -s 10024170174b7c28 GC-R9600PRO Secondary [Sapphire] 0 -s 1002417017ee2003 Radeon 9600 256Mb Secondary 0 -s 1002417018bc0100 GC-R9600PRO Secondary 0 -d 10024171 RV350 AQ [Radeon 9600] (Secondary) 0 New PCI ID provided by ATI developer relations (correction to above) -s 100241711043c005 A9600SE (Secondary) 0 -d 10024172 RV350 AR [Radeon 9600] (Secondary) 0 New PCI ID provided by ATI developer relations (correction to above) -s 1002417210020003 Radeon 9600XT (Secondary) 0 -s 100241721043c003 A9600XT (Secondary) 0 -d 10024173 RV350 ?? [Radeon 9550] (Secondary) 0 -d 10024237 Radeon 7000 IGP 0 -d 10024242 R200 BB [Radeon All in Wonder 8500DV] 0 -s 10024242100202aa Radeon 8500 AIW DV Edition 0 -d 10024243 R200 BC [Radeon All in Wonder 8500] 0 -d 10024336 Radeon Mobility U1 0 -s 10024336103c0024 Pavilion ze4400 builtin Video 0 -d 10024337 Radeon IGP 330M/340M/350M 0 -s 100243371014053a ThinkPad R40e (2684-HVG) builtin VGA controller 0 -s 10024337103c0850 Radeon IGP 345M 0 -d 10024341 IXP150 AC'97 Audio Controller 0 -d 10024345 EHCI USB Controller 0 -d 10024347 OHCI USB Controller #1 0 -d 10024348 OHCI USB Controller #2 0 -d 1002434d IXP AC'97 Modem 0 -d 10024353 ATI SMBus 0 Radeon 9100 IGP integrated -d 10024354 215CT [Mach64 CT] 0 -d 10024358 210888CX [Mach64 CX] 0 -d 10024437 Radeon Mobility 7000 IGP 0 -d 10024554 210888ET [Mach64 ET] 0 -d 10024654 Mach64 VT 0 -d 10024742 3D Rage Pro AGP 1X/2X 0 -s 1002474210020040 Rage Pro Turbo AGP 2X 0 -s 1002474210020044 Rage Pro Turbo AGP 2X 0 -s 1002474210020061 Rage Pro AIW AGP 2X 0 -s 1002474210020062 Rage Pro AIW AGP 2X 0 -s 1002474210020063 Rage Pro AIW AGP 2X 0 -s 1002474210020080 Rage Pro Turbo AGP 2X 0 -s 1002474210020084 Rage Pro Turbo AGP 2X 0 -s 1002474210024742 Rage Pro Turbo AGP 2X 0 -s 1002474210028001 Rage Pro Turbo AGP 2X 0 -s 1002474210280082 Rage Pro Turbo AGP 2X 0 -s 1002474210284082 Optiplex GX1 Onboard Display Adapter 0 -s 1002474210288082 Rage Pro Turbo AGP 2X 0 -s 100247421028c082 Rage Pro Turbo AGP 2X 0 -s 1002474280864152 Xpert 98D AGP 2X 0 -s 100247428086464a Rage Pro Turbo AGP 2X 0 -d 10024744 3D Rage Pro AGP 1X 0 -s 1002474410024744 Rage Pro Turbo AGP 0 -d 10024747 3D Rage Pro 0 -d 10024749 3D Rage Pro 0 -s 1002474910020061 Rage Pro AIW 0 -s 1002474910020062 Rage Pro AIW 0 -d 1002474c Rage XC 0 -d 1002474d Rage XL AGP 2X 0 -s 1002474d10020004 Xpert 98 RXL AGP 2X 0 -s 1002474d10020008 Xpert 98 RXL AGP 2X 0 -s 1002474d10020080 Rage XL AGP 2X 0 -s 1002474d10020084 Xpert 98 AGP 2X 0 -s 1002474d1002474d Rage XL AGP 0 -s 1002474d1033806a Rage XL AGP 0 -d 1002474e Rage XC AGP 0 -s 1002474e1002474e Rage XC AGP 0 -d 1002474f Rage XL 0 -s 1002474f10020008 Rage XL 0 -s 1002474f1002474f Rage XL 0 -d 10024750 3D Rage Pro 215GP 0 -s 1002475010020040 Rage Pro Turbo 0 -s 1002475010020044 Rage Pro Turbo 0 -s 1002475010020080 Rage Pro Turbo 0 -s 1002475010020084 Rage Pro Turbo 0 -s 1002475010024750 Rage Pro Turbo 0 -d 10024751 3D Rage Pro 215GQ 0 -d 10024752 Rage XL 0 -s 1002475210020008 Rage XL 0 -s 1002475210024752 Rage XL 0 -s 1002475210028008 Rage XL 0 -s 10024752102800ce PowerEdge 1400 0 -s 10024752102800d1 PowerEdge 2550 0 -s 10024752102800d9 PowerEdge 2500 0 -s 1002475280863411 SDS2 Mainboard 0 -s 1002475280863427 S875WP1-E mainboard 0 -d 10024753 Rage XC 0 -s 1002475310024753 Rage XC 0 -d 10024754 3D Rage I/II 215GT [Mach64 GT] 0 -d 10024755 3D Rage II+ 215GTB [Mach64 GTB] 0 -d 10024756 3D Rage IIC 215IIC [Mach64 GT IIC] 0 -s 1002475610024756 Rage IIC 0 -d 10024757 3D Rage IIC AGP 0 -s 1002475710024757 Rage IIC AGP 0 -s 1002475710280089 Rage 3D IIC 0 -s 1002475710284082 Rage 3D IIC 0 -s 1002475710288082 Rage 3D IIC 0 -s 100247571028c082 Rage 3D IIC 0 -d 10024758 210888GX [Mach64 GX] 0 -d 10024759 3D Rage IIC 0 -d 1002475a 3D Rage IIC AGP 0 -s 1002475a10020084 Rage 3D Pro AGP 2x XPERT 98 0 -s 1002475a10020087 Rage 3D IIC 0 -s 1002475a1002475a Rage IIC AGP 0 -d 10024964 Radeon RV250 Id [Radeon 9000] 0 -d 10024965 Radeon RV250 Ie [Radeon 9000] 0 -d 10024966 Radeon RV250 If [Radeon 9000] 0 -s 1002496610f10002 RV250 If [Tachyon G9000 PRO] 0 -s 10024966148c2039 RV250 If [Radeon 9000 Pro "Evil Commando"] 0 -s 1002496615099a00 RV250 If [Radeon 9000 "AT009"] 0 -s 1002496616810040 RV250 If [3D prophet 9000] 0 New subdevice - 3D Prophet 9000 PCI by Hercules. AGP version probably would have same ID, so not specified. -s 10024966174b7176 RV250 If [Sapphire Radeon 9000 Pro] 0 -s 10024966174b7192 RV250 If [Radeon 9000 "Atlantis"] 0 -s 1002496617af2005 RV250 If [Excalibur Radeon 9000 Pro] 0 -s 1002496617af2006 RV250 If [Excalibur Radeon 9000] 0 -d 10024967 Radeon RV250 Ig [Radeon 9000] 0 -d 1002496e Radeon RV250 [Radeon 9000] (Secondary) 0 -d 10024a48 R420 JH [Radeon X800] 0 -d 10024a49 R420 JI [Radeon X800PRO] 0 -d 10024a4a R420 JJ [Radeon X800SE] 0 -d 10024a4b R420 JK [Radeon X800] 0 -d 10024a4c R420 JL [Radeon X800] 0 -d 10024a4d R420 JM [FireGL X3] 0 -d 10024a4e M18 JN [Radeon Mobility 9800] 0 -d 10024a50 R420 JP [Radeon X800XT] 0 -d 10024a70 R420 [X800XT-PE] (Secondary) 0 -d 10024c42 3D Rage LT Pro AGP-133 0 -s 10024c420e11b0e7 Rage LT Pro (Compaq Presario 5240) 0 -s 10024c420e11b0e8 Rage 3D LT Pro 0 -s 10024c420e11b10e 3D Rage LT Pro (Compaq Armada 1750) 0 -s 10024c4210020040 Rage LT Pro AGP 2X 0 -s 10024c4210020044 Rage LT Pro AGP 2X 0 -s 10024c4210024c42 Rage LT Pro AGP 2X 0 -s 10024c4210028001 Rage LT Pro AGP 2X 0 -s 10024c4210280085 Rage 3D LT Pro 0 -d 10024c44 3D Rage LT Pro AGP-66 0 -d 10024c45 Rage Mobility M3 AGP 0 -d 10024c46 Rage Mobility M3 AGP 2x 0 -s 10024c46102800b1 Latitude C600 0 -d 10024c47 3D Rage LT-G 215LG 0 -d 10024c49 3D Rage LT Pro 0 -s 10024c4910020004 Rage LT Pro 0 -s 10024c4910020040 Rage LT Pro 0 -s 10024c4910020044 Rage LT Pro 0 -s 10024c4910024c49 Rage LT Pro 0 -d 10024c4d Rage Mobility P/M AGP 2x 0 -s 10024c4d0e11b111 Armada M700 0 -s 10024c4d0e11b160 Armada E500 0 -s 10024c4d10020084 Xpert 98 AGP 2X (Mobility) 0 -s 10024c4d10140154 ThinkPad A20m 0 -s 10024c4d102800aa Latitude CPt 0 -d 10024c4e Rage Mobility L AGP 2x 0 -d 10024c50 3D Rage LT Pro 0 -s 10024c5010024c50 Rage LT Pro 0 -d 10024c51 3D Rage LT Pro 0 -d 10024c52 Rage Mobility P/M 0 -s 10024c5210338112 Versa Note VXi 0 -d 10024c53 Rage Mobility L 0 -d 10024c54 264LT [Mach64 LT] 0 -d 10024c57 Radeon Mobility M7 LW [Radeon Mobility 7500] 0 -s 10024c5710140517 ThinkPad T30 0 -s 10024c57102800e6 Radeon Mobility M7 LW (Dell Inspiron 8100) 0 -s 10024c571028012a Latitude C640 0 -s 10024c57144dc006 Radeon Mobility M7 LW in vpr Matrix 170B4 0 -d 10024c58 Radeon RV200 LX [Mobility FireGL 7800 M7] 0 -d 10024c59 Radeon Mobility M6 LY 0 -s 10024c5910140235 ThinkPad A30/A30p (2652/2653) 0 -s 10024c5910140239 ThinkPad X22/X23/X24 0 -s 10024c59104d80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP 0 -d 10024c5a Radeon Mobility M6 LZ 0 -d 10024c64 Radeon R250 Ld [Radeon Mobility 9000 M9] 0 -d 10024c65 Radeon R250 Le [Radeon Mobility 9000 M9] 0 -d 10024c66 Radeon R250 Lf [FireGL 9000] 0 -d 10024c67 Radeon R250 Lg [Radeon Mobility 9000 M9] 0 -d 10024c6e Radeon R250 Ln [Radeon Mobility 9000 M9] [Secondary] 0 Secondary chip to the Lf -d 10024d46 Rage Mobility M4 AGP 0 -d 10024d4c Rage Mobility M4 AGP 0 -d 10024e44 Radeon R300 ND [Radeon 9700 Pro] 0 -d 10024e45 Radeon R300 NE [Radeon 9500 Pro] 0 -s 10024e4510020002 Radeon R300 NE [Radeon 9500 Pro] 0 -s 10024e4516810002 Hercules 3D Prophet 9500 PRO [Radeon 9500 Pro] 0 -d 10024e46 RV350 NF [Radeon 9600] 0 New PCI ID provided by ATI developer relations (correction to above) -d 10024e47 Radeon R300 NG [FireGL X1] 0 -d 10024e48 Radeon R350 [Radeon 9800 Pro] 0 (added pro) -d 10024e49 Radeon R350 [Radeon 9800] 0 New PCI ID provided by ATI developer relations -d 10024e4a RV350 NJ [Radeon 9800 XT] 0 -d 10024e4b R350 NK [Fire GL X2] 0 -d 10024e50 RV350 [Mobility Radeon 9600 M10] 0 New PCI ID provided by ATI developer relations -s 10024e501025005a TravelMate 290 0 -s 10024e50103c0890 NC6000 laptop 0 -s 10024e5017341055 Amilo M1420W 0 -d 10024e51 M10 NQ [Radeon Mobility 9600] 0 -d 10024e52 RV350 [Mobility Radeon 9600 M10] 0 -d 10024e53 M10 NS [Radeon Mobility 9600] 0 -d 10024e54 M10 NT [FireGL Mobility T2] 0 -d 10024e56 M11 NV [FireGL Mobility T2e] 0 -d 10024e64 Radeon R300 [Radeon 9700 Pro] (Secondary) 0 -d 10024e65 Radeon R300 [Radeon 9500 Pro] (Secondary) 0 -s 10024e6510020003 Radeon R300 NE [Radeon 9500 Pro] 0 -s 10024e6516810003 Hercules 3D Prophet 9500 PRO [Radeon 9500 Pro] (Secondary) 0 -d 10024e66 RV350 NF [Radeon 9600] (Secondary) 0 New PCI ID provided by ATI developer relations (correction to above) -d 10024e67 Radeon R300 [FireGL X1] (Secondary) 0 -d 10024e68 Radeon R350 [Radeon 9800 Pro] (Secondary) 0 (added pro) -d 10024e69 Radeon R350 [Radeon 9800] (Secondary) 0 New PCI ID provided by ATI developer relations -d 10024e6a RV350 NJ [Radeon 9800 XT] (Secondary) 0 -d 10025041 Rage 128 PA/PRO 0 -d 10025042 Rage 128 PB/PRO AGP 2x 0 -d 10025043 Rage 128 PC/PRO AGP 4x 0 -d 10025044 Rage 128 PD/PRO TMDS 0 -s 1002504410020028 Rage 128 AIW 0 -s 1002504410020029 Rage 128 AIW 0 -d 10025045 Rage 128 PE/PRO AGP 2x TMDS 0 -d 10025046 Rage 128 PF/PRO AGP 4x TMDS 0 -s 1002504610020004 Rage Fury Pro 0 -s 1002504610020008 Rage Fury Pro/Xpert 2000 Pro 0 -s 1002504610020014 Rage Fury Pro 0 -s 1002504610020018 Rage Fury Pro/Xpert 2000 Pro 0 -s 1002504610020028 Rage 128 Pro AIW AGP 0 -s 100250461002002a Rage 128 Pro AIW AGP 0 -s 1002504610020048 Rage Fury Pro 0 -s 1002504610022000 Rage Fury MAXX AGP 4x (TMDS) (VGA device) 0 -s 1002504610022001 Rage Fury MAXX AGP 4x (TMDS) (Extra device?!) 0 -d 10025047 Rage 128 PG/PRO 0 -d 10025048 Rage 128 PH/PRO AGP 2x 0 -d 10025049 Rage 128 PI/PRO AGP 4x 0 -d 1002504a Rage 128 PJ/PRO TMDS 0 -d 1002504b Rage 128 PK/PRO AGP 2x TMDS 0 -d 1002504c Rage 128 PL/PRO AGP 4x TMDS 0 -d 1002504d Rage 128 PM/PRO 0 -d 1002504e Rage 128 PN/PRO AGP 2x 0 -d 1002504f Rage 128 PO/PRO AGP 4x 0 -d 10025050 Rage 128 PP/PRO TMDS [Xpert 128] 0 -s 1002505010020008 Xpert 128 0 -d 10025051 Rage 128 PQ/PRO AGP 2x TMDS 0 -d 10025052 Rage 128 PR/PRO AGP 4x TMDS 0 -d 10025053 Rage 128 PS/PRO 0 -d 10025054 Rage 128 PT/PRO AGP 2x 0 -d 10025055 Rage 128 PU/PRO AGP 4x 0 -d 10025056 Rage 128 PV/PRO TMDS 0 -d 10025057 Rage 128 PW/PRO AGP 2x TMDS 0 -d 10025058 Rage 128 PX/PRO AGP 4x TMDS 0 -d 10025144 Radeon R100 QD [Radeon 7200] 0 -s 1002514410020008 Radeon 7000/Radeon VE 0 -s 1002514410020009 Radeon 7000/Radeon 0 -s 100251441002000a Radeon 7000/Radeon 0 -s 100251441002001a Radeon 7000/Radeon 0 -s 1002514410020029 Radeon AIW 0 -s 1002514410020038 Radeon 7000/Radeon 0 -s 1002514410020039 Radeon 7000/Radeon 0 -s 100251441002008a Radeon 7000/Radeon 0 -s 10025144100200ba Radeon 7000/Radeon 0 -s 1002514410020139 Radeon 7000/Radeon 0 -s 100251441002028a Radeon 7000/Radeon 0 -s 10025144100202aa Radeon AIW 0 -s 100251441002053a Radeon 7000/Radeon 0 -d 10025145 Radeon R100 QE 0 -d 10025146 Radeon R100 QF 0 -d 10025147 Radeon R100 QG 0 -d 10025148 Radeon R200 QH [Radeon 8500] 0 -s 100251481002010a FireGL 8800 64Mb 0 -s 1002514810020152 FireGL 8800 128Mb 0 -s 1002514810020162 FireGL 8700 32Mb 0 -s 1002514810020172 FireGL 8700 64Mb 0 -d 10025149 Radeon R200 QI 0 -d 1002514a Radeon R200 QJ 0 -d 1002514b Radeon R200 QK 0 -d 1002514c Radeon R200 QL [Radeon 8500 LE] 0 -s 1002514c1002003a Radeon R200 QL [Radeon 8500 LE] 0 -s 1002514c1002013a Radeon 8500 0 -s 1002514c148c2026 R200 QL [Radeon 8500 Evil Master II Multi Display Edition] 0 -s 1002514c16810010 Radeon 8500 [3D Prophet 8500 128Mb] 0 -s 1002514c174b7149 Radeon R200 QL [Sapphire Radeon 8500 LE] 0 -d 1002514d Radeon R200 QM [Radeon 9100] 0 -d 1002514e Radeon R200 QN [Radeon 8500LE] 0 -d 1002514f Radeon R200 QO [Radeon 8500LE] 0 -d 10025154 R200 QT [Radeon 8500] 0 -d 10025155 R200 QU [Radeon 9100] 0 -d 10025157 Radeon RV200 QW [Radeon 7500] 0 -s 100251571002013a Radeon 7500 0 -s 100251571002103a Dell Optiplex GX260 0 -s 1002515714584000 RV200 QW [RADEON 7500 PRO MAYA AR] 0 -s 10025157148c2024 RV200 QW [Radeon 7500LE Dual Display] 0 -s 10025157148c2025 RV200 QW [Radeon 7500 Evil Master Multi Display Edition] 0 -s 10025157148c2036 RV200 QW [Radeon 7500 PCI Dual Display] 0 -s 10025157174b7146 RV200 QW [Radeon 7500 LE] 0 -s 10025157174b7147 RV200 QW [Sapphire Radeon 7500LE] 0 -s 10025157174b7161 Radeon RV200 QW [Radeon 7500 LE] 0 -s 1002515717af0202 RV200 QW [Excalibur Radeon 7500LE] 0 -d 10025158 Radeon RV200 QX [Radeon 7500] 0 -d 10025159 Radeon RV100 QY [Radeon 7000/VE] 0 -s 100251591002000a Radeon 7000/Radeon VE 0 -s 100251591002000b Radeon 7000 0 -s 1002515910020038 Radeon 7000/Radeon VE 0 -s 100251591002003a Radeon 7000/Radeon VE 0 -s 10025159100200ba Radeon 7000/Radeon VE 0 -s 100251591002013a Radeon 7000/Radeon VE 0 -s 1002515914584002 RV100 QY [RADEON 7000 PRO MAYA AV Series] 0 -s 10025159148c2003 RV100 QY [Radeon 7000 Multi-Display Edition] 0 -s 10025159148c2023 RV100 QY [Radeon 7000 Evil Master Multi-Display] 0 -s 10025159174b7112 RV100 QY [Sapphire Radeon VE 7000] 0 -s 10025159174b7c28 Sapphire Radeon VE 7000 DDR 0 -s 1002515917870202 RV100 QY [Excalibur Radeon 7000] 0 -d 1002515a Radeon RV100 QZ [Radeon 7000/VE] 0 -d 10025168 Radeon R200 Qh 0 -d 10025169 Radeon R200 Qi 0 -d 1002516a Radeon R200 Qj 0 -d 1002516b Radeon R200 Qk 0 -d 1002516c Radeon R200 Ql 0 This one is not in ATI documentation, but is in XFree86 source code -d 10025245 Rage 128 RE/SG 0 -s 1002524510020008 Xpert 128 0 -s 1002524510020028 Rage 128 AIW 0 -s 1002524510020029 Rage 128 AIW 0 -s 1002524510020068 Rage 128 AIW 0 -d 10025246 Rage 128 RF/SG AGP 0 -s 1002524610020004 Magnum/Xpert 128/Xpert 99 0 -s 1002524610020008 Magnum/Xpert128/X99/Xpert2000 0 -s 1002524610020028 Rage 128 AIW AGP 0 -s 1002524610020044 Rage Fury/Xpert 128/Xpert 2000 0 -s 1002524610020068 Rage 128 AIW AGP 0 -s 1002524610020448 Rage Fury 0 -d 10025247 Rage 128 RG 0 -d 1002524b Rage 128 RK/VR 0 -d 1002524c Rage 128 RL/VR AGP 0 -s 1002524c10020008 Xpert 99/Xpert 2000 0 -s 1002524c10020088 Xpert 99 0 -d 10025345 Rage 128 SE/4x 0 -d 10025346 Rage 128 SF/4x AGP 2x 0 -s 1002534610020048 RAGE 128 16MB VGA TVOUT AMC PAL 0 -d 10025347 Rage 128 SG/4x AGP 4x 0 -d 10025348 Rage 128 SH 0 -d 1002534b Rage 128 SK/4x 0 -d 1002534c Rage 128 SL/4x AGP 2x 0 -d 1002534d Rage 128 SM/4x AGP 4x 0 -s 1002534d10020008 Xpert 99/Xpert 2000 0 -s 1002534d10020018 Xpert 2000 0 -d 1002534e Rage 128 4x 0 -d 10025354 Mach 64 VT 0 -s 1002535410025654 Mach 64 reference 0 -d 10025446 Rage 128 Pro Ultra TF 0 -s 1002544610020004 Rage Fury Pro 0 -s 1002544610020008 Rage Fury Pro/Xpert 2000 Pro 0 -s 1002544610020018 Rage Fury Pro/Xpert 2000 Pro 0 -s 1002544610020028 Rage 128 AIW Pro AGP 0 -s 1002544610020029 Rage 128 AIW 0 -s 100254461002002a Rage 128 AIW Pro AGP 0 -s 100254461002002b Rage 128 AIW 0 -s 1002544610020048 Xpert 2000 Pro 0 -d 1002544c Rage 128 Pro Ultra TL 0 -d 10025452 Rage 128 Pro Ultra TR 0 -s 100254521002001c Rage 128 Pro 4XL 0 -s 10025452103c1279 Rage 128 Pro 4XL 0 -d 10025453 Rage 128 Pro Ultra TS 0 -d 10025454 Rage 128 Pro Ultra TT 0 -d 10025455 Rage 128 Pro Ultra TU 0 -d 10025460 M22 [Radeon Mobility M300] 0 -d 10025464 M22 [FireGL GL] 0 -d 10025548 R423 UH [Radeon X800 (PCIE)] 0 -d 10025549 R423 UI [Radeon X800PRO (PCIE)] 0 -d 1002554a R423 UJ [Radeon X800LE (PCIE)] 0 -d 1002554b R423 UK [Radeon X800SE (PCIE)] 0 -d 10025551 R423 UQ [FireGL V7200 (PCIE)] 0 -d 10025552 R423 UR [FireGL V5100 (PCIE)] 0 -d 10025554 R423 UT [FireGL V7100 (PCIE)] 0 -d 1002556b Radeon R423 UK (PCIE) [X800 SE] (Secondary) 0 -d 10025654 264VT [Mach64 VT] 0 -s 1002565410025654 Mach64VT Reference 0 -d 10025655 264VT3 [Mach64 VT3] 0 -d 10025656 264VT4 [Mach64 VT4] 0 -d 10025830 RS300 Host Bridge 0 -d 10025831 RS300 Host Bridge 0 -d 10025832 RS300 Host Bridge 0 -d 10025833 Radeon 9100 IGP Host Bridge 0 -d 10025834 Radeon 9100 IGP 0 -d 10025835 RS300M AGP [Radeon Mobility 9100IGP] 0 -d 10025838 Radeon 9100 IGP AGP Bridge 0 -d 10025941 RV280 [Radeon 9200] (Secondary) 0 -s 10025941174b7c12 Sapphire Radeon 9200 0 -s 1002594117af200d Excalibur Radeon 9200 0 http://www.hightech.com.hk/html/9200.htm -s 1002594118bc0050 GeXcube GC-R9200-C3 (Secondary) 0 -d 10025944 RV280 [Radeon 9200 SE (PCI)] 0 -d 10025960 RV280 [Radeon 9200 PRO] 0 -d 10025961 RV280 [Radeon 9200] 0 -s 1002596110022f72 All-in-Wonder 9200 Series 0 -s 1002596112ab5961 YUAN SMARTVGA Radeon 9200 0 -s 1002596114584018 Gigabyte Radeon 9200 0 -s 10025961174b7c13 Sapphire Radeon 9200 0 -s 1002596117af200c Excalibur Radeon 9200 0 http://www.hightech.com.hk/html/9200.htm -s 1002596118bc0050 Radeon 9200 Game Buster 0 -s 1002596118bc0051 GeXcube GC-R9200-C3 0 -s 1002596118bc0053 Radeon 9200 Game Buster VIVO 0 -d 10025962 RV280 [Radeon 9200] 0 -d 10025964 RV280 [Radeon 9200 SE] 0 -s 100259641043c006 ASUS Radeon 9200 SE / TD / 128M 0 -s 1002596414584018 Radeon 9200 SE 0 -s 10025964148c2073 CN-AG92E 0 -s 10025964174b7c13 Sapphire Radeon 9200 SE 0 -s 1002596417875964 Excalibur 9200SE VIVO 128M 0 -s 1002596417af2012 Radeon 9200 SE Excalibur 0 -s 1002596418bc0170 Sapphire Radeon 9200 SE 128MB Game Buster 0 -s 1002596418bc0173 GC-R9200L(SE)-C3H [Radeon 9200 Game Buster] 0 128MB DDR, DVI/VGA/TV out -d 10025b60 RV370 5B60 [Radeon X300 (PCIE)] 0 -s 10025b601043002a EAX300SE 0 -d 10025b62 RV370 5B62 [Radeon X600 (PCIE)] 0 -d 10025b64 RV370 5B64 [FireGL V3100 (PCIE)] 0 -d 10025b65 RV370 5B65 [FireGL D1100 (PCIE)] 0 -d 10025c61 M9+ 5C61 [Radeon Mobility 9200 (AGP)] 0 -d 10025c63 M9+ 5C63 [Radeon Mobility 9200 (AGP)] 0 -d 10025d44 RV280 [Radeon 9200 SE] (Secondary) 0 -s 10025d4414584019 Radeon 9200 SE (Secondary) 0 -s 10025d44174b7c12 Sapphire Radeon 9200 SE (Secondary) 0 -s 10025d4417875965 Excalibur 9200SE VIVO 128M (Secondary) 0 -s 10025d4417af2013 Radeon 9200 SE Excalibur (Secondary) 0 -s 10025d4418bc0171 Radeon 9200 SE 128MB Game Buster (Secondary) 0 -s 10025d4418bc0172 GC-R9200L(SE)-C3H [Radeon 9200 Game Buster] 0 -d 10025d57 R423 5F57 [Radeon X800XT (PCIE)] 0 -d 1002700f PCI Bridge [IGP 320M] 0 -d 10027010 PCI Bridge [IGP 340M] 0 -d 10027834 Radeon 9100 PRO IGP 0 -d 10027835 Radeon Mobility 9200 IGP 0 -d 10027c37 RV350 AQ [Radeon 9600 SE] 0 -d 1002cab0 AGP Bridge [IGP 320M] 0 -d 1002cab2 RS200/RS200M AGP Bridge [IGP 340M] 0 -d 1002cbb2 RS200/RS200M AGP Bridge [IGP 340M] 0 -v 1003 ULSI Systems 0 -d 10030201 US201 0 -v 1004 VLSI Technology Inc 0 -d 10040005 82C592-FC1 0 -d 10040006 82C593-FC1 0 -d 10040007 82C594-AFC2 0 -d 10040008 82C596/7 [Wildcat] 0 -d 10040009 82C597-AFC2 0 -d 1004000c 82C541 [Lynx] 0 -d 1004000d 82C543 [Lynx] 0 -d 10040101 82C532 0 -d 10040102 82C534 [Eagle] 0 -d 10040103 82C538 0 -d 10040104 82C535 0 -d 10040105 82C147 0 -d 10040200 82C975 0 -d 10040280 82C925 0 -d 10040304 QSound ThunderBird PCI Audio 0 -s 1004030410040304 QSound ThunderBird PCI Audio 0 -s 10040304122d1206 DSP368 Audio 0 -s 1004030414835020 XWave Thunder 3D Audio 0 -d 10040305 QSound ThunderBird PCI Audio Gameport 0 -s 1004030510040305 QSound ThunderBird PCI Audio Gameport 0 -s 10040305122d1207 DSP368 Audio Gameport 0 -s 1004030514835021 XWave Thunder 3D Audio Gameport 0 -d 10040306 QSound ThunderBird PCI Audio Support Registers 0 -s 1004030610040306 QSound ThunderBird PCI Audio Support Registers 0 -s 10040306122d1208 DSP368 Audio Support Registers 0 -s 1004030614835022 XWave Thunder 3D Audio Support Registers 0 -d 10040307 Thunderbird 0 -d 10040308 Thunderbird 0 -d 10040702 VAS96011 [Golden Gate II] 0 -d 10040703 Tollgate 0 -v 1005 Avance Logic Inc. [ALI] 0 -d 10052064 ALG2032/2064 0 -d 10052128 ALG2364A 0 -d 10052301 ALG2301 0 -d 10052302 ALG2302 0 -d 10052364 ALG2364 0 -d 10052464 ALG2364A 0 -d 10052501 ALG2564A/25128A 0 -v 1006 Reply Group 0 -v 1007 NetFrame Systems Inc 0 -v 1008 Epson 0 -v 100a Phoenix Technologies 0 -v 100b National Semiconductor Corporation 0 -d 100b0001 DP83810 0 -d 100b0002 87415/87560 IDE 0 -d 100b000e 87560 Legacy I/O 0 -d 100b000f FireWire Controller 0 -d 100b0011 NS87560 National PCI System I/O 0 -d 100b0012 USB Controller 0 -d 100b0020 DP83815 (MacPhyter) Ethernet Controller 0 -s 100b0020103c0024 Pavilion ze4400 builtin Network 0 -s 100b00201385f311 FA311 / FA312 (FA311 with WoL HW) 0 -d 100b0022 DP83820 10/100/1000 Ethernet Controller 0 -d 100b0028 CS5535 Host bridge 0 -d 100b002b CS5535 ISA bridge 0 -d 100b002d CS5535 IDE 0 -d 100b002e CS5535 Audio 0 -d 100b002f CS5535 USB 0 -d 100b0030 CS5535 Video 0 -d 100b0035 DP83065 [Saturn] 10/100/1000 Ethernet Controller 0 -d 100b0500 SCx200 Bridge 0 -d 100b0501 SCx200 SMI 0 -d 100b0502 SCx200 IDE 0 -d 100b0503 SCx200 Audio 0 -d 100b0504 SCx200 Video 0 -d 100b0505 SCx200 XBus 0 -d 100b0510 SC1100 Bridge 0 -d 100b0511 SC1100 SMI 0 -d 100b0515 SC1100 XBus 0 -d 100bd001 87410 IDE 0 -v 100c Tseng Labs Inc 0 -d 100c3202 ET4000/W32p rev A 0 -d 100c3205 ET4000/W32p rev B 0 -d 100c3206 ET4000/W32p rev C 0 -d 100c3207 ET4000/W32p rev D 0 -d 100c3208 ET6000 0 -d 100c4702 ET6300 0 -v 100d AST Research Inc 0 -v 100e Weitek 0 -d 100e9000 P9000 Viper 0 -d 100e9001 P9000 Viper 0 -d 100e9002 P9000 Viper 0 -d 100e9100 P9100 Viper Pro/SE 0 -v 1010 Video Logic, Ltd. 0 -v 1011 Digital Equipment Corporation 0 -d 10110001 DECchip 21050 0 -d 10110002 DECchip 21040 [Tulip] 0 -d 10110004 DECchip 21030 [TGA] 0 -d 10110007 NVRAM [Zephyr NVRAM] 0 -d 10110008 KZPSA [KZPSA] 0 -d 10110009 DECchip 21140 [FasterNet] 0 -s 1011000910250310 21140 Fast Ethernet 0 -s 1011000910b82001 SMC9332BDT EtherPower 10/100 0 -s 1011000910b82002 SMC9332BVT EtherPower T4 10/100 0 -s 1011000910b82003 SMC9334BDT EtherPower 10/100 (1-port) 0 -s 1011000911092400 ANA-6944A/TX Fast Ethernet 0 -s 1011000911122300 RNS2300 Fast Ethernet 0 -s 1011000911122320 RNS2320 Fast Ethernet 0 -s 1011000911122340 RNS2340 Fast Ethernet 0 -s 1011000911131207 EN-1207-TX Fast Ethernet 0 -s 1011000911861100 DFE-500TX Fast Ethernet 0 -s 1011000911861112 DFE-570TX Fast Ethernet 0 -s 1011000911861140 DFE-660 Cardbus Ethernet 10/100 0 -s 1011000911861142 DFE-660 Cardbus Ethernet 10/100 0 -s 1011000911f60503 Freedomline Fast Ethernet 0 -s 1011000912829100 AEF-380TXD Fast Ethernet 0 -s 1011000913851100 FA310TX Fast Ethernet 0 -s 1011000926460001 KNE100TX Fast Ethernet 0 -d 1011000a 21230 Video Codec 0 -d 1011000d PBXGB [TGA2] 0 -d 1011000f DEFPA 0 -d 10110014 DECchip 21041 [Tulip Pass 3] 0 -s 1011001411860100 DE-530+ 0 -d 10110016 DGLPB [OPPO] 0 -d 10110017 PV-PCI Graphics Controller (ZLXp-L) 0 -d 10110019 DECchip 21142/43 0 -s 101100191011500a DE500A Fast Ethernet 0 -s 101100191011500b DE500B Fast Ethernet 0 -s 1011001910140001 10/100 EtherJet Cardbus 0 -s 1011001910250315 ALN315 Fast Ethernet 0 -s 101100191033800c PC-9821-CS01 100BASE-TX Interface Card 0 -s 101100191033800d PC-9821NR-B06 100BASE-TX Interface Card 0 -s 10110019108d0016 Rapidfire 2327 10/100 Ethernet 0 -s 10110019108d0017 GoCard 2250 Ethernet 10/100 Cardbus 0 -s 1011001910b82005 SMC8032DT Extreme Ethernet 10/100 0 -s 1011001910b88034 SMC8034 Extreme Ethernet 10/100 0 -s 1011001910ef8169 Cardbus Fast Ethernet 0 -s 1011001911092a00 ANA-6911A/TX Fast Ethernet 0 -s 1011001911092b00 ANA-6911A/TXC Fast Ethernet 0 -s 1011001911093000 ANA-6922/TX Fast Ethernet 0 -s 1011001911131207 Cheetah Fast Ethernet 0 -s 1011001911132220 Cardbus Fast Ethernet 0 -s 10110019115d0002 Cardbus Ethernet 10/100 0 -s 1011001911790203 Fast Ethernet 0 -s 1011001911790204 Cardbus Fast Ethernet 0 -s 1011001911861100 DFE-500TX Fast Ethernet 0 -s 1011001911861101 DFE-500TX Fast Ethernet 0 -s 1011001911861102 DFE-500TX Fast Ethernet 0 -s 1011001911861112 DFE-570TX Quad Fast Ethernet 0 -s 1011001912592800 AT-2800Tx Fast Ethernet 0 -s 1011001912660004 Eagle Fast EtherMAX 0 -s 1011001912af0019 NetFlyer Cardbus Fast Ethernet 0 -s 1011001913740001 Cardbus Ethernet Card 10/100 0 -s 1011001913740002 Cardbus Ethernet Card 10/100 0 -s 1011001913740007 Cardbus Ethernet Card 10/100 0 -s 1011001913740008 Cardbus Ethernet Card 10/100 0 -s 1011001913852100 FA510 0 -s 1011001913950001 10/100 Ethernet CardBus PC Card 0 -s 1011001913d1ab01 EtherFast 10/100 Cardbus (PCMPC200) 0 -s 1011001914cb0100 LNDL-100N 100Base-TX Ethernet PC Card 0 -s 1011001980860001 EtherExpress PRO/100 Mobile CardBus 32 0 -d 1011001a Farallon PN9000SX Gigabit Ethernet 0 -d 10110021 DECchip 21052 0 -d 10110022 DECchip 21150 0 -d 10110023 DECchip 21150 0 -d 10110024 DECchip 21152 0 -d 10110025 DECchip 21153 0 -d 10110026 DECchip 21154 0 -d 10110034 56k Modem Cardbus 0 -s 1011003413740003 56k Modem Cardbus 0 -d 10110045 DECchip 21553 0 -d 10110046 DECchip 21554 0 -s 101100460e114050 Integrated Smart Array 0 -s 101100460e114051 Integrated Smart Array 0 -s 101100460e114058 Integrated Smart Array 0 -s 10110046103c10c2 Hewlett-Packard NetRAID-4M 0 -s 1011004612d9000a IP Telephony card 0 -s 101100464c531050 CT7 mainboard 0 -s 101100464c531051 CE7 mainboard 0 -s 1011004690050364 5400S (Mustang) 0 -s 1011004690050365 5400S (Mustang) 0 -s 1011004690051364 Dell PowerEdge RAID Controller 2 0 -s 1011004690051365 Dell PowerEdge RAID Controller 2 0 -s 10110046e4bf1000 CC8-1-BLUES 0 -d 10111065 StrongARM DC21285 0 -s 1011106510690020 DAC960P / DAC1164P 0 -v 1012 Micronics Computers Inc 0 -v 1013 Cirrus Logic 0 -d 10130038 GD 7548 0 -d 10130040 GD 7555 Flat Panel GUI Accelerator 0 -d 1013004c GD 7556 Video/Graphics LCD/CRT Ctrlr 0 -d 101300a0 GD 5430/40 [Alpine] 0 -d 101300a2 GD 5432 [Alpine] 0 -d 101300a4 GD 5434-4 [Alpine] 0 -d 101300a8 GD 5434-8 [Alpine] 0 -d 101300ac GD 5436 [Alpine] 0 -d 101300b0 GD 5440 0 -d 101300b8 GD 5446 0 -d 101300bc GD 5480 0 -s 101300bc101300bc CL-GD5480 0 -d 101300d0 GD 5462 0 -d 101300d2 GD 5462 [Laguna I] 0 -d 101300d4 GD 5464 [Laguna] 0 -d 101300d5 GD 5464 BD [Laguna] 0 -d 101300d6 GD 5465 [Laguna] 0 -s 101300d613ce8031 Barco Metheus 2 Megapixel, Dual Head 0 -s 101300d613cf8031 Barco Metheus 2 Megapixel, Dual Head 0 -d 101300e8 GD 5436U 0 -d 10131100 CL 6729 0 -d 10131110 PD 6832 PCMCIA/CardBus Ctrlr 0 -d 10131112 PD 6834 PCMCIA/CardBus Ctrlr 0 -d 10131113 PD 6833 PCMCIA/CardBus Ctrlr 0 -d 10131200 GD 7542 [Nordic] 0 -d 10131202 GD 7543 [Viking] 0 -d 10131204 GD 7541 [Nordic Light] 0 -d 10134400 CD 4400 0 -d 10136001 CS 4610/11 [CrystalClear SoundFusion Audio Accelerator] 0 -s 1013600110141010 CS4610 SoundFusion Audio Accelerator 0 -d 10136003 CS 4614/22/24 [CrystalClear SoundFusion Audio Accelerator] 0 -s 1013600310134280 Crystal SoundFusion PCI Audio Accelerator 0 -s 1013600316810050 Game Theater XP 0 -s 101360031681a011 Fortissimo III 7.1 0 -d 10136004 CS 4614/22/24 [CrystalClear SoundFusion Audio Accelerator] 0 -d 10136005 Crystal CS4281 PCI Audio 0 -s 1013600510134281 Crystal CS4281 PCI Audio 0 -s 1013600510cf10a8 Crystal CS4281 PCI Audio 0 -s 1013600510cf10a9 Crystal CS4281 PCI Audio 0 -s 1013600510cf10aa Crystal CS4281 PCI Audio 0 -s 1013600510cf10ab Crystal CS4281 PCI Audio 0 -s 1013600510cf10ac Crystal CS4281 PCI Audio 0 -s 1013600510cf10ad Crystal CS4281 PCI Audio 0 -s 1013600510cf10b4 Crystal CS4281 PCI Audio 0 -s 1013600511790001 Crystal CS4281 PCI Audio 0 -s 1013600514c0000c Crystal CS4281 PCI Audio 0 -v 1014 IBM 0 -d 10140002 PCI to MCA Bridge 0 -d 10140005 Alta Lite 0 -d 10140007 Alta MP 0 -d 1014000a Fire Coral 0 -d 10140017 CPU to PCI Bridge 0 -d 10140018 TR Auto LANstreamer 0 -d 1014001b GXT-150P 0 -d 1014001c Carrera 0 -d 1014001d 82G2675 0 -d 10140020 GXT1000 Graphics Adapter 0 -d 10140022 IBM27-82351 0 -d 1014002d Python 0 -d 1014002e SCSI RAID Adapter [ServeRAID] 0 [official name in AIX 5] -s 1014002e1014002e ServeRAID-3x 0 -s 1014002e1014022e ServeRAID-4H 0 -d 10140031 2 Port Serial Adapter 0 -s 1014003110140031 2721 WAN IOA - 2 Port Sync Serial Adapter 0 AS400 iSeries PCI sync serial card -d 10140036 Miami 0 -d 10140037 82660 CPU to PCI Bridge 0 -d 1014003a CPU to PCI Bridge 0 -d 1014003c GXT250P/GXT255P Graphics Adapter 0 -d 1014003e 16/4 Token ring UTP/STP controller 0 -s 1014003e1014003e Token-Ring Adapter 0 -s 1014003e101400cd Token-Ring Adapter + Wake-On-LAN 0 -s 1014003e101400ce 16/4 Token-Ring Adapter 2 0 -s 1014003e101400cf 16/4 Token-Ring Adapter Special 0 -s 1014003e101400e4 High-Speed 100/16/4 Token-Ring Adapter 0 -s 1014003e101400e5 16/4 Token-Ring Adapter 2 + Wake-On-LAN 0 -s 1014003e1014016d iSeries 2744 Card 0 -d 10140045 SSA Adapter 0 -d 10140046 MPIC interrupt controller 0 -d 10140047 PCI to PCI Bridge 0 -d 10140048 PCI to PCI Bridge 0 -d 10140049 Warhead SCSI Controller 0 -d 1014004e ATM Controller (14104e00) 0 -d 1014004f ATM Controller (14104f00) 0 -d 10140050 ATM Controller (14105000) 0 -d 10140053 25 MBit ATM Controller 0 -d 10140054 GXT500P/GXT550P Graphics Adapter 0 -d 10140057 MPEG PCI Bridge 0 -d 1014005c i82557B 10/100 0 -d 1014005e GXT800P Graphics Adapter 0 -d 1014007c ATM Controller (14107c00) 0 -d 1014007d 3780IDSP [MWave] 0 -d 1014008b EADS PCI to PCI Bridge 0 -d 1014008e GXT3000P Graphics Adapter 0 -d 10140090 GXT 3000P 0 -s 101400901014008e GXT-3000P 0 -d 10140091 SSA Adapter 0 -d 10140095 20H2999 PCI Docking Bridge 0 -d 10140096 Chukar chipset SCSI controller 0 -s 1014009610140097 iSeries 2778 DASD IOA 0 -s 1014009610140098 iSeries 2763 DASD IOA 0 -s 1014009610140099 iSeries 2748 DASD IOA 0 -d 1014009f PCI 4758 Cryptographic Accelerator 0 -d 101400a5 ATM Controller (1410a500) 0 -d 101400a6 ATM 155MBPS MM Controller (1410a600) 0 -d 101400b7 256-bit Graphics Rasterizer [Fire GL1] 0 -s 101400b7109200b8 FireGL1 AGP 32Mb 0 -d 101400b8 GXT2000P Graphics Adapter 0 -d 101400be ATM 622MBPS Controller (1410be00) 0 -d 101400dc Advanced Systems Management Adapter (ASMA) 0 -d 101400fc CPC710 Dual Bridge and Memory Controller (PCI-64) 0 -d 10140104 Gigabit Ethernet-SX Adapter 0 -d 10140105 CPC710 Dual Bridge and Memory Controller (PCI-32) 0 -d 1014010f Remote Supervisor Adapter (RSA) 0 -d 10140142 Yotta Video Compositor Input 0 -s 1014014210140143 Yotta Input Controller (ytin) 0 -d 10140144 Yotta Video Compositor Output 0 -s 1014014410140145 Yotta Output Controller (ytout) 0 -d 10140156 405GP PLB to PCI Bridge 0 -d 1014015e 622Mbps ATM PCI Adapter 0 -d 10140160 64bit/66MHz PCI ATM 155 MMF 0 -d 1014016e GXT4000P Graphics Adapter 0 -d 10140170 GXT6000P Graphics Adapter 0 -d 1014017d GXT300P Graphics Adapter 0 -d 10140180 Snipe chipset SCSI controller 0 -s 1014018010140241 iSeries 2757 DASD IOA 0 -s 1014018010140264 Quad Channel PCI-X U320 SCSI RAID Adapter (2780) 0 -d 10140188 EADS-X PCI-X to PCI-X Bridge 0 -d 101401a7 PCI-X to PCI-X Bridge 0 -d 101401bd ServeRAID Controller 0 -s 101401bd101401be ServeRAID-4M 0 -s 101401bd101401bf ServeRAID-4L 0 -s 101401bd10140208 ServeRAID-4Mx 0 -s 101401bd1014020e ServeRAID-4Lx 0 -s 101401bd1014022e ServeRAID-4H 0 -s 101401bd10140258 ServeRAID-5i 0 -s 101401bd10140259 ServeRAID-5i 0 -d 101401c1 64bit/66MHz PCI ATM 155 UTP 0 -d 101401e6 Cryptographic Accelerator 0 -d 101401ff 10/100 Mbps Ethernet 0 -d 10140219 Multiport Serial Adapter 0 -s 101402191014021a Dual RVX 0 -s 1014021910140251 Internal Modem/RVX 0 -s 1014021910140252 Quad Internal Modem 0 -d 1014021b GXT6500P Graphics Adapter 0 -d 1014021c GXT4500P Graphics Adapter 0 -d 10140233 GXT135P Graphics Adapter 0 -d 10140266 PCI-X Dual Channel SCSI 0 -d 10140268 Gigabit Ethernet-SX Adapter (PCI-X) 0 -d 10140269 10/100/1000 Base-TX Ethernet Adapter (PCI-X) 0 -d 10140302 Winnipeg PCI-X Host Bridge 0 -d 10140314 ZISC 036 Neural accelerator card 0 -d 1014ffff MPIC-2 interrupt controller 0 -v 1015 LSI Logic Corp of Canada 0 -v 1016 ICL Personal Systems 0 -v 1017 SPEA Software AG 0 -d 10175343 SPEA 3D Accelerator 0 -v 1018 Unisys Systems 0 -v 1019 Elitegroup Computer Systems 0 -v 101a AT&T GIS (NCR) 0 -d 101a0005 100VG ethernet 0 -v 101b Vitesse Semiconductor 0 -v 101c Western Digital 0 -d 101c0193 33C193A 0 -d 101c0196 33C196A 0 -d 101c0197 33C197A 0 -d 101c0296 33C296A 0 -d 101c3193 7193 0 -d 101c3197 7197 0 -d 101c3296 33C296A 0 -d 101c4296 34C296 0 -d 101c9710 Pipeline 9710 0 -d 101c9712 Pipeline 9712 0 -d 101cc24a 90C 0 -v 101e American Megatrends Inc. 0 -d 101e1960 MegaRAID 0 -s 101e1960101e0471 MegaRAID 471 Enterprise 1600 RAID Controller 0 -s 101e1960101e0475 MegaRAID 475 Express 500/500LC RAID Controller 0 -s 101e1960101e0477 MegaRAID 477 Elite 3100 RAID Controller 0 -s 101e1960101e0493 MegaRAID 493 Elite 1600 RAID Controller 0 -s 101e1960101e0494 MegaRAID 494 Elite 1650 RAID Controller 0 -s 101e1960101e0503 MegaRAID 503 Enterprise 1650 RAID Controller 0 -s 101e1960101e0511 MegaRAID 511 i4 IDE RAID Controller 0 -s 101e1960101e0522 MegaRAID 522 i4133 RAID Controller 0 -s 101e196010280471 PowerEdge RAID Controller 3/QC 0 -s 101e196010280475 PowerEdge RAID Controller 3/SC 0 -s 101e196010280493 PowerEdge RAID Controller 3/DC 0 -s 101e196010280511 PowerEdge Cost Effective RAID Controller ATA100/4Ch 0 -d 101e9010 MegaRAID 428 Ultra RAID Controller 0 -d 101e9030 EIDE Controller 0 -d 101e9031 EIDE Controller 0 -d 101e9032 EIDE & SCSI Controller 0 -d 101e9033 SCSI Controller 0 -d 101e9040 Multimedia card 0 -d 101e9060 MegaRAID 434 Ultra GT RAID Controller 0 -d 101e9063 MegaRAC 0 -s 101e9063101e0767 Dell Remote Assistant Card 2 0 -v 101f PictureTel 0 -v 1020 Hitachi Computer Products 0 -v 1021 OKI Electric Industry Co. Ltd. 0 -v 1022 Advanced Micro Devices [AMD] 0 -d 10221100 K8 [Athlon64/Opteron] HyperTransport Technology Configuration 0 -d 10221101 K8 [Athlon64/Opteron] Address Map 0 -d 10221102 K8 [Athlon64/Opteron] DRAM Controller 0 -d 10221103 K8 [Athlon64/Opteron] Miscellaneous Control 0 -d 10222000 79c970 [PCnet32 LANCE] 0 -s 1022200010142000 NetFinity 10/100 Fast Ethernet 0 -s 1022200010222000 PCnet - Fast 79C971 0 -s 10222000103c104c Ethernet with LAN remote power Adapter 0 -s 10222000103c1064 Ethernet with LAN remote power Adapter 0 -s 10222000103c1065 Ethernet with LAN remote power Adapter 0 -s 10222000103c106c Ethernet with LAN remote power Adapter 0 -s 10222000103c106e Ethernet with LAN remote power Adapter 0 -s 10222000103c10ea Ethernet with LAN remote power Adapter 0 -s 1022200011131220 EN1220 10/100 Fast Ethernet 0 -s 1022200012592450 AT-2450 10/100 Fast Ethernet 0 -s 1022200012592454 AT-2450v4 10Mb Ethernet Adapter 0 -s 1022200012592700 AT-2700TX 10/100 Fast Ethernet 0 -s 1022200012592701 AT-2700FX 100Mb Ethernet 0 -s 102220004c531000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard 0 -s 102220004c531010 CP5/CR6 mainboard 0 -s 102220004c531020 VR6 mainboard 0 -s 102220004c531030 PC5 mainboard 0 -s 102220004c531040 CL7 mainboard 0 -s 102220004c531060 PC7 mainboard 0 -d 10222001 79c978 [HomePNA] 0 -s 1022200110920a78 Multimedia Home Network Adapter 0 -s 1022200116680299 ActionLink Home Network Adapter 0 -d 10222003 Am 1771 MBW [Alchemy] 0 -d 10222020 53c974 [PCscsi] 0 -d 10222040 79c974 0 -d 10223000 ELanSC520 Microcontroller 0 -d 10227006 AMD-751 [Irongate] System Controller 0 -d 10227007 AMD-751 [Irongate] AGP Bridge 0 -d 1022700a AMD-IGR4 AGP Host to PCI Bridge 0 -d 1022700b AMD-IGR4 PCI to PCI Bridge 0 -d 1022700c AMD-760 MP [IGD4-2P] System Controller 0 -d 1022700d AMD-760 MP [IGD4-2P] AGP Bridge 0 -d 1022700e AMD-760 [IGD4-1P] System Controller 0 -d 1022700f AMD-760 [IGD4-1P] AGP Bridge 0 -d 10227400 AMD-755 [Cobra] ISA 0 -d 10227401 AMD-755 [Cobra] IDE 0 -d 10227403 AMD-755 [Cobra] ACPI 0 -d 10227404 AMD-755 [Cobra] USB 0 -d 10227408 AMD-756 [Viper] ISA 0 -d 10227409 AMD-756 [Viper] IDE 0 -d 1022740b AMD-756 [Viper] ACPI 0 -d 1022740c AMD-756 [Viper] USB 0 -d 10227410 AMD-766 [ViperPlus] ISA 0 -d 10227411 AMD-766 [ViperPlus] IDE 0 -d 10227413 AMD-766 [ViperPlus] ACPI 0 -d 10227414 AMD-766 [ViperPlus] USB 0 -d 10227440 AMD-768 [Opus] ISA 0 -s 1022744010438044 A7M-D Mainboard 0 -d 10227441 AMD-768 [Opus] IDE 0 -d 10227443 AMD-768 [Opus] ACPI 0 -s 1022744310438044 A7M-D Mainboard 0 -d 10227445 AMD-768 [Opus] Audio 0 -d 10227446 AMD-768 [Opus] MC97 Modem (Smart Link HAMR5600 compatible) 0 -d 10227448 AMD-768 [Opus] PCI 0 -d 10227449 AMD-768 [Opus] USB 0 -d 10227450 AMD-8131 PCI-X Bridge 0 -d 10227451 AMD-8131 PCI-X APIC 0 -d 10227454 AMD-8151 System Controller 0 -d 10227455 AMD-8151 AGP Bridge 0 -d 10227460 AMD-8111 PCI 0 -s 10227460161f3017 HDAMB 0 -d 10227461 AMD-8111 USB 0 -d 10227462 AMD-8111 Ethernet 0 -d 10227464 AMD-8111 USB 0 -s 10227464161f3017 HDAMB 0 -d 10227468 AMD-8111 LPC 0 -s 10227468161f3017 HDAMB 0 -d 10227469 AMD-8111 IDE 0 -s 10227469161f3017 HDAMB 0 -d 1022746a AMD-8111 SMBus 2.0 0 -d 1022746b AMD-8111 ACPI 0 -s 1022746b161f3017 HDAMB 0 -d 1022746d AMD-8111 AC97 Audio 0 -s 1022746d161f3017 HDAMB 0 -d 1022746e AMD-8111 MC97 Modem 0 -d 1022756b AMD-8111 ACPI 0 -v 1023 Trident Microsystems 0 -d 10230194 82C194 0 -d 10232000 4DWave DX 0 -d 10232001 4DWave NX 0 -s 10232001122d1400 Trident PCI288-Q3DII (NX) 0 -d 10232100 CyberBlade XP4m32 0 -d 10238400 CyberBlade/i7 0 -s 1023840010238400 CyberBlade i7 AGP 0 -d 10238420 CyberBlade/i7d 0 -s 102384200e11b15a CyberBlade i7 AGP 0 -d 10238500 CyberBlade/i1 0 -d 10238520 CyberBlade i1 0 -s 102385200e11b16e CyberBlade i1 AGP 0 -s 1023852010238520 CyberBlade i1 AGP 0 -d 10238620 CyberBlade/i1 0 -s 1023862010140502 ThinkPad R30/T30 0 -d 10238820 CyberBlade XPAi1 0 -d 10239320 TGUI 9320 0 -d 10239350 GUI Accelerator 0 -d 10239360 Flat panel GUI Accelerator 0 -d 10239382 Cyber 9382 [Reference design] 0 -d 10239383 Cyber 9383 [Reference design] 0 -d 10239385 Cyber 9385 [Reference design] 0 -d 10239386 Cyber 9386 0 -d 10239388 Cyber 9388 0 -d 10239397 Cyber 9397 0 -d 1023939a Cyber 9397DVD 0 -d 10239420 TGUI 9420 0 -d 10239430 TGUI 9430 0 -d 10239440 TGUI 9440 0 -d 10239460 TGUI 9460 0 -d 10239470 TGUI 9470 0 -d 10239520 Cyber 9520 0 -d 10239525 Cyber 9525 0 -s 1023952510cf1094 Lifebook C6155 0 -d 10239540 Cyber 9540 0 -d 10239660 TGUI 9660/938x/968x 0 -d 10239680 TGUI 9680 0 -d 10239682 TGUI 9682 0 -d 10239683 TGUI 9683 0 -d 10239685 ProVIDIA 9685 0 -d 10239750 3DImage 9750 0 -s 1023975010149750 3DImage 9750 0 -s 1023975010239750 3DImage 9750 0 -d 10239753 TGUI 9753 0 -d 10239754 TGUI 9754 0 -d 10239759 TGUI 975 0 -d 10239783 TGUI 9783 0 -d 10239785 TGUI 9785 0 -d 10239850 3DImage 9850 0 -d 10239880 Blade 3D PCI/AGP 0 -s 1023988010239880 Blade 3D 0 -d 10239910 CyberBlade/XP 0 -d 10239930 CyberBlade/XPm 0 -v 1024 Zenith Data Systems 0 -v 1025 Acer Incorporated [ALI] 0 -d 10251435 M1435 0 -d 10251445 M1445 0 -d 10251449 M1449 0 -d 10251451 M1451 0 -d 10251461 M1461 0 -d 10251489 M1489 0 -d 10251511 M1511 0 -d 10251512 ALI M1512 Aladdin 0 -d 10251513 M1513 0 -d 10251521 ALI M1521 Aladdin III CPU Bridge 0 -s 1025152110b91521 ALI M1521 Aladdin III CPU Bridge 0 -d 10251523 ALI M1523 ISA Bridge 0 -s 1025152310b91523 ALI M1523 ISA Bridge 0 -d 10251531 M1531 Northbridge [Aladdin IV/IV+] 0 -d 10251533 M1533 PCI-to-ISA Bridge 0 -s 1025153310b91533 ALI M1533 Aladdin IV/V ISA South Bridge 0 -d 10251535 M1535 PCI Bridge + Super I/O + FIR 0 -d 10251541 M1541 Northbridge [Aladdin V] 0 -s 1025154110b91541 ALI M1541 Aladdin V/V+ AGP+PCI North Bridge 0 -d 10251542 M1542 Northbridge [Aladdin V] 0 -d 10251543 M1543 PCI-to-ISA Bridge + Super I/O + FIR 0 -d 10251561 M1561 Northbridge [Aladdin 7] 0 -d 10251621 M1621 Northbridge [Aladdin-Pro II] 0 -d 10251631 M1631 Northbridge+3D Graphics [Aladdin TNT2] 0 -d 10251641 M1641 Northbridge [Aladdin-Pro IV] 0 -d 10251647 M1647 [MaGiK1] PCI North Bridge 0 -d 10251671 M1671 Northbridge [ALADDiN-P4] 0 -d 10251672 Northbridge [CyberALADDiN-P4] 0 -d 10253141 M3141 0 -d 10253143 M3143 0 -d 10253145 M3145 0 -d 10253147 M3147 0 -d 10253149 M3149 0 -d 10253151 M3151 0 -d 10253307 M3307 MPEG-I Video Controller 0 -d 10253309 M3309 MPEG-II Video w/ Software Audio Decoder 0 -d 10253321 M3321 MPEG-II Audio/Video Decoder 0 -d 10255212 M4803 0 -d 10255215 ALI PCI EIDE Controller 0 -d 10255217 M5217H 0 -d 10255219 M5219 0 -d 10255225 M5225 0 -d 10255229 M5229 0 -d 10255235 M5235 0 -d 10255237 M5237 PCI USB Host Controller 0 -d 10255240 EIDE Controller 0 -d 10255241 PCMCIA Bridge 0 -d 10255242 General Purpose Controller 0 -d 10255243 PCI to PCI Bridge Controller 0 -d 10255244 Floppy Disk Controller 0 -d 10255247 M1541 PCI to PCI Bridge 0 -d 10255251 M5251 P1394 Controller 0 -d 10255427 PCI to AGP Bridge 0 -d 10255451 M5451 PCI AC-Link Controller Audio Device 0 -d 10255453 M5453 PCI AC-Link Controller Modem Device 0 -d 10257101 M7101 PCI PMU Power Management Controller 0 -s 1025710110b97101 M7101 PCI PMU Power Management Controller 0 -v 1028 Dell 0 -d 10280001 PowerEdge Expandable RAID Controller 2/Si 0 -s 1028000110280001 PowerEdge 2400 0 -d 10280002 PowerEdge Expandable RAID Controller 3/Di 0 -s 1028000210280002 PowerEdge 4400 0 -d 10280003 PowerEdge Expandable RAID Controller 3/Si 0 -s 1028000310280003 PowerEdge 2450 0 -d 10280006 PowerEdge Expandable RAID Controller 3/Di 0 -d 10280007 Remote Access Card III 0 -d 10280008 Remote Access Card III 0 -d 10280009 Remote Access Card III: BMC/SMIC device not present 0 -d 1028000a PowerEdge Expandable RAID Controller 3/Di 0 -d 1028000c Embedded Remote Access or ERA/O 0 -d 1028000d Embedded Remote Access: BMC/SMIC device 0 -d 1028000e PowerEdge Expandable RAID controller 4/Di 0 -d 1028000f PowerEdge Expandable RAID controller 4/Di 0 -d 10280010 Remote Access Card 4 0 -d 10280011 Remote Access Card 4 Daughter Card 0 -d 10280012 Remote Access Card 4 Daughter Card Virtual UART 0 -d 10280013 PowerEdge Expandable RAID controller 4 0 -s 102800131028016c PowerEdge Expandable RAID Controller 4e/Si 0 -s 102800131028016d PowerEdge Expandable RAID Controller 4e/Di 0 -s 102800131028016e PowerEdge Expandable RAID Controller 4e/Di 0 -s 102800131028016f PowerEdge Expandable RAID Controller 4e/Di 0 -s 1028001310280170 PowerEdge Expandable RAID Controller 4e/Di 0 -d 10280014 Remote Access Card 4 Daughter Card SMIC interface 0 -v 1029 Siemens Nixdorf IS 0 -v 102a LSI Logic 0 -d 102a0000 HYDRA 0 -d 102a0010 ASPEN 0 -d 102a001f AHA-2940U2/U2W /7890/7891 SCSI Controllers 0 -s 102a001f9005000f 2940U2W SCSI Controller 0 -s 102a001f90050106 2940U2W SCSI Controller 0 -s 102a001f9005a180 2940U2W SCSI Controller 0 -d 102a00c5 AIC-7899 U160/m SCSI Controller 0 -s 102a00c5102800c5 PowerEdge 2550/2650/4600 0 -d 102a00cf AIC-7899P U160/m 0 -s 102a00cf10280106 PowerEdge 4600 0 -s 102a00cf10280121 PowerEdge 2650 0 -v 102b Matrox Graphics, Inc. 0 -d 102b0010 MGA-I [Impression?] 0 DJ: I've a suspicion that 0010 is a duplicate of 0d10. -d 102b0100 MGA 1064SG [Mystique] 0 -d 102b0518 MGA-II [Athena] 0 -d 102b0519 MGA 2064W [Millennium] 0 -d 102b051a MGA 1064SG [Mystique] 0 -s 102b051a102b0100 MGA-1064SG Mystique 0 -s 102b051a102b1100 MGA-1084SG Mystique 0 -s 102b051a102b1200 MGA-1084SG Mystique 0 -s 102b051a1100102b MGA-1084SG Mystique 0 -s 102b051a110a0018 Scenic Pro C5 (D1025) 0 -d 102b051b MGA 2164W [Millennium II] 0 -s 102b051b102b051b MGA-2164W Millennium II 0 -s 102b051b102b1100 MGA-2164W Millennium II 0 -s 102b051b102b1200 MGA-2164W Millennium II 0 -d 102b051e MGA 1064SG [Mystique] AGP 0 -d 102b051f MGA 2164W [Millennium II] AGP 0 -d 102b0520 MGA G200 0 -s 102b0520102bdbc2 G200 Multi-Monitor 0 -s 102b0520102bdbc8 G200 Multi-Monitor 0 -s 102b0520102bdbe2 G200 Multi-Monitor 0 -s 102b0520102bdbe8 G200 Multi-Monitor 0 -s 102b0520102bff03 Millennium G200 SD 0 -s 102b0520102bff04 Marvel G200 0 -d 102b0521 MGA G200 AGP 0 -s 102b05211014ff03 Millennium G200 AGP 0 -s 102b0521102b48e9 Mystique G200 AGP 0 -s 102b0521102b48f8 Millennium G200 SD AGP 0 -s 102b0521102b4a60 Millennium G200 LE AGP 0 -s 102b0521102b4a64 Millennium G200 AGP 0 -s 102b0521102bc93c Millennium G200 AGP 0 -s 102b0521102bc9b0 Millennium G200 AGP 0 -s 102b0521102bc9bc Millennium G200 AGP 0 -s 102b0521102bca60 Millennium G250 LE AGP 0 -s 102b0521102bca6c Millennium G250 AGP 0 -s 102b0521102bdbbc Millennium G200 AGP 0 -s 102b0521102bdbc2 Millennium G200 MMS (Dual G200) 0 -s 102b0521102bdbc3 G200 Multi-Monitor 0 -s 102b0521102bdbc8 Millennium G200 MMS (Dual G200) 0 -s 102b0521102bdbd2 G200 Multi-Monitor 0 -s 102b0521102bdbd3 G200 Multi-Monitor 0 -s 102b0521102bdbd4 G200 Multi-Monitor 0 -s 102b0521102bdbd5 G200 Multi-Monitor 0 -s 102b0521102bdbd8 G200 Multi-Monitor 0 -s 102b0521102bdbd9 G200 Multi-Monitor 0 -s 102b0521102bdbe2 Millennium G200 MMS (Quad G200) 0 -s 102b0521102bdbe3 G200 Multi-Monitor 0 -s 102b0521102bdbe8 Millennium G200 MMS (Quad G200) 0 -s 102b0521102bdbf2 G200 Multi-Monitor 0 -s 102b0521102bdbf3 G200 Multi-Monitor 0 -s 102b0521102bdbf4 G200 Multi-Monitor 0 -s 102b0521102bdbf5 G200 Multi-Monitor 0 -s 102b0521102bdbf8 G200 Multi-Monitor 0 -s 102b0521102bdbf9 G200 Multi-Monitor 0 -s 102b0521102bf806 Mystique G200 Video AGP 0 -s 102b0521102bff00 MGA-G200 AGP 0 -s 102b0521102bff02 Mystique G200 AGP 0 -s 102b0521102bff03 Millennium G200 AGP 0 -s 102b0521102bff04 Marvel G200 AGP 0 -s 102b0521110a0032 MGA-G200 AGP 0 -d 102b0525 MGA G400 AGP 0 -s 102b05250e11b16f MGA-G400 AGP 0 -s 102b0525102b0328 Millennium G400 16Mb SDRAM 0 -s 102b0525102b0338 Millennium G400 16Mb SDRAM 0 -s 102b0525102b0378 Millennium G400 32Mb SDRAM 0 -s 102b0525102b0541 Millennium G450 Dual Head 0 -s 102b0525102b0542 Millennium G450 Dual Head LX 0 -s 102b0525102b0543 Millennium G450 Single Head LX 0 -s 102b0525102b0641 Millennium G450 32Mb SDRAM Dual Head 0 -s 102b0525102b0642 Millennium G450 32Mb SDRAM Dual Head LX 0 -s 102b0525102b0643 Millennium G450 32Mb SDRAM Single Head LX 0 -s 102b0525102b07c0 Millennium G450 Dual Head LE 0 -s 102b0525102b07c1 Millennium G450 SDR Dual Head LE 0 -s 102b0525102b0d41 Millennium G450 Dual Head PCI 0 -s 102b0525102b0d42 Millennium G450 Dual Head LX PCI 0 -s 102b0525102b0d43 Millennium G450 32Mb Dual Head PCI 0 -s 102b0525102b0e00 Marvel G450 eTV 0 -s 102b0525102b0e01 Marvel G450 eTV 0 -s 102b0525102b0e02 Marvel G450 eTV 0 -s 102b0525102b0e03 Marvel G450 eTV 0 -s 102b0525102b0f80 Millennium G450 Low Profile 0 -s 102b0525102b0f81 Millennium G450 Low Profile 0 -s 102b0525102b0f82 Millennium G450 Low Profile DVI 0 -s 102b0525102b0f83 Millennium G450 Low Profile DVI 0 -s 102b0525102b19d8 Millennium G400 16Mb SGRAM 0 -s 102b0525102b19f8 Millennium G400 32Mb SGRAM 0 -s 102b0525102b2159 Millennium G400 Dual Head 16Mb 0 -s 102b0525102b2179 Millennium G400 MAX/Dual Head 32Mb 0 -s 102b0525102b217d Millennium G400 Dual Head Max 0 -s 102b0525102b23c0 Millennium G450 0 -s 102b0525102b23c1 Millennium G450 0 -s 102b0525102b23c2 Millennium G450 DVI 0 -s 102b0525102b23c3 Millennium G450 DVI 0 -s 102b0525102b2f58 Millennium G400 0 -s 102b0525102b2f78 Millennium G400 0 -s 102b0525102b3693 Marvel G400 AGP 0 -s 102b0525102b5dd0 4Sight II 0 -s 102b0525102b5f50 4Sight II 0 -s 102b0525102b5f51 4Sight II 0 -s 102b0525102b5f52 4Sight II 0 -s 102b0525102b9010 Millennium G400 Dual Head 0 -s 102b052514580400 GA-G400 0 -s 102b052517050001 Millennium G450 32MB SGRAM 0 -s 102b052517050002 Millennium G450 16MB SGRAM 0 -s 102b052517050003 Millennium G450 32MB 0 -s 102b052517050004 Millennium G450 16MB 0 -d 102b0527 MGA Parhelia AGP 0 -s 102b0527102b0840 Parhelia 128Mb 0 -d 102b0d10 MGA Ultima/Impression 0 -d 102b1000 MGA G100 [Productiva] 0 -s 102b1000102bff01 Productiva G100 0 -s 102b1000102bff05 Productiva G100 Multi-Monitor 0 -d 102b1001 MGA G100 [Productiva] AGP 0 -s 102b1001102b1001 MGA-G100 AGP 0 -s 102b1001102bff00 MGA-G100 AGP 0 -s 102b1001102bff01 MGA-G100 Productiva AGP 0 -s 102b1001102bff03 Millennium G100 AGP 0 -s 102b1001102bff04 MGA-G100 AGP 0 -s 102b1001102bff05 MGA-G100 Productiva AGP Multi-Monitor 0 -s 102b1001110a001e MGA-G100 AGP 0 -d 102b2007 MGA Mistral 0 -d 102b2527 MGA G550 AGP 0 -s 102b2527102b0f83 Millennium G550 0 -s 102b2527102b0f84 Millennium G550 Dual Head DDR 32Mb 0 -s 102b2527102b1e41 Millennium G550 0 -d 102b2537 MGA G650 AGP 0 -d 102b4536 VIA Framegrabber 0 -d 102b6573 Shark 10/100 Multiport SwitchNIC 0 -v 102c Chips and Technologies 0 -d 102c00b8 F64310 0 -d 102c00c0 F69000 HiQVideo 0 -s 102c00c0102c00c0 F69000 HiQVideo 0 -s 102c00c04c531000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard 0 -s 102c00c04c531010 CP5/CR6 mainboard 0 -s 102c00c04c531020 VR6 mainboard 0 -s 102c00c04c531030 PC5 mainboard 0 -s 102c00c04c531050 CT7 mainboard 0 -s 102c00c04c531051 CE7 mainboard 0 -d 102c00d0 F65545 0 -d 102c00d8 F65545 0 -d 102c00dc F65548 0 -d 102c00e0 F65550 0 -d 102c00e4 F65554 0 -d 102c00e5 F65555 HiQVPro 0 -s 102c00e50e11b049 Armada 1700 Laptop Display Controller 0 -d 102c00f0 F68554 0 -d 102c00f4 F68554 HiQVision 0 -d 102c00f5 F68555 0 -d 102c0c30 F69030 0 -s 102c0c304c531000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard 0 -s 102c0c304c531050 CT7 mainboard 0 -s 102c0c304c531051 CE7 mainboard 0 -s 102c0c304c531080 CT8 mainboard 0 C5C project cancelled -v 102d Wyse Technology Inc. 0 -d 102d50dc 3328 Audio 0 -v 102e Olivetti Advanced Technology 0 -v 102f Toshiba America 0 -d 102f0009 r4x00 0 -d 102f000a TX3927 MIPS RISC PCI Controller 0 -d 102f0020 ATM Meteor 155 0 -s 102f0020102f00f8 ATM Meteor 155 0 -d 102f0030 TC35815CF PCI 10/100 Mbit Ethernet Controller 0 -d 102f0031 TC35815CF PCI 10/100 Mbit Ethernet Controller with WOL 0 -d 102f0105 TC86C001 [goku-s] IDE 0 -d 102f0106 TC86C001 [goku-s] USB 1.1 Host 0 -d 102f0107 TC86C001 [goku-s] USB Device Controller 0 -d 102f0108 TC86C001 [goku-s] I2C/SIO/GPIO Controller 0 -d 102f0180 TX4927/38 MIPS RISC PCI Controller 0 -d 102f0181 TX4925 MIPS RISC PCI Controller 0 -d 102f0182 TX4937 MIPS RISC PCI Controller 0 -v 1030 TMC Research 0 -v 1031 Miro Computer Products AG 0 -d 10315601 DC20 ASIC 0 -d 10315607 Video I/O & motion JPEG compressor 0 -d 10315631 Media 3D 0 -d 10316057 MiroVideo DC10/DC30+ 0 -v 1032 Compaq 0 -v 1033 NEC Corporation 0 -d 10330000 Vr4181A USB Host or Function Control Unit 0 -d 10330001 PCI to 486-like bus Bridge 0 -d 10330002 PCI to VL98 Bridge 0 -d 10330003 ATM Controller 0 -d 10330004 R4000 PCI Bridge 0 -d 10330005 PCI to 486-like bus Bridge 0 -d 10330006 PC-9800 Graphic Accelerator 0 -d 10330007 PCI to UX-Bus Bridge 0 -d 10330008 PC-9800 Graphic Accelerator 0 -d 10330009 PCI to PC9800 Core-Graph Bridge 0 -d 10330016 PCI to VL Bridge 0 -d 1033001a [Nile II] 0 -d 10330021 Vrc4373 [Nile I] 0 -d 10330029 PowerVR PCX1 0 -d 1033002a PowerVR 3D 0 -d 1033002c Star Alpha 2 0 -d 1033002d PCI to C-bus Bridge 0 -d 10330035 USB 0 -s 1033003511790001 USB 0 -s 1033003512ee7000 Root Hub 0 -s 1033003517990001 Root Hub 0 -s 10330035807d0035 PCI-USB2 (OHCI subsystem) 0 -d 1033003b PCI to C-bus Bridge 0 -d 1033003e NAPCCARD Cardbus Controller 0 -d 10330046 PowerVR PCX2 [midas] 0 -d 1033005a Vrc5074 [Nile 4] 0 -d 10330063 Firewarden 0 -d 10330067 PowerVR Neon 250 Chipset 0 -s 1033006710100020 PowerVR Neon 250 AGP 32Mb 0 -s 1033006710100080 PowerVR Neon 250 AGP 16Mb 0 -s 1033006710100088 PowerVR Neon 250 16Mb 0 -s 1033006710100090 PowerVR Neon 250 AGP 16Mb 0 -s 1033006710100098 PowerVR Neon 250 16Mb 0 -s 10330067101000a0 PowerVR Neon 250 AGP 32Mb 0 -s 10330067101000a8 PowerVR Neon 250 32Mb 0 -s 1033006710100120 PowerVR Neon 250 AGP 32Mb 0 -d 10330074 56k Voice Modem 0 -s 1033007410338014 RCV56ACF 56k Voice Modem 0 -d 1033009b Vrc5476 0 -d 103300a5 VRC4173 0 -d 103300a6 VRC5477 AC97 0 -d 103300cd IEEE 1394 [OrangeLink] Host Controller 0 -s 103300cd12ee8011 Root hub 0 -d 103300ce IEEE 1394 Host Controller 0 -d 103300df Vr4131 0 -d 103300e0 USB 2.0 0 -s 103300e00ee43383 Sitecom IEEE 1394 / USB2.0 Combo Card 0 -s 103300e012ee7001 Root hub 0 -s 103300e017990002 Root Hub 0 -s 103300e0807d1043 PCI-USB2 (EHCI subsystem) 0 -d 103300e7 IEEE 1394 Host Controller 0 -d 103300f2 uPD72874 IEEE1394 OHCI 1.1 3-port PHY-Link Ctrlr 0 -d 103300f3 uPD6113x Multimedia Decoder/Processor [EMMA2] 0 -d 1033010c VR7701 0 -v 1034 Framatome Connectors USA Inc. 0 -v 1035 Comp. & Comm. Research Lab 0 -v 1036 Future Domain Corp. 0 -d 10360000 TMC-18C30 [36C70] 0 -v 1037 Hitachi Micro Systems 0 -v 1038 AMP, Inc 0 -v 1039 Silicon Integrated Systems [SiS] 0 -d 10390001 Virtual PCI-to-PCI bridge (AGP) 0 -d 10390002 SG86C202 0 -d 10390006 85C501/2/3 0 -d 10390008 SiS85C503/5513 (LPC Bridge) 0 -d 10390009 ACPI 0 -d 10390016 SiS961/2 SMBus Controller 0 source: http://members.datafast.net.au/dft0802/downloads/pcidevs.txt -d 10390018 SiS85C503/5513 (LPC Bridge) 0 -d 10390180 RAID bus controller 180 SATA/PATA [SiS] 0 Controller for 2 PATA and 2 SATA channels -d 10390181 SiS SATA 0 -d 10390200 5597/5598/6326 VGA 0 -s 1039020010390000 SiS5597 SVGA (Shared RAM) 0 -d 10390204 82C204 0 -d 10390205 SG86C205 0 -d 10390300 300/305 PCI/AGP VGA Display Adapter 0 -s 10390300107d2720 Leadtek WinFast VR300 0 -d 10390310 315H PCI/AGP VGA Display Adapter 0 -d 10390315 315 PCI/AGP VGA Display Adapter 0 -d 10390325 315PRO PCI/AGP VGA Display Adapter 0 -d 10390330 330 [Xabre] PCI/AGP VGA Display Adapter 0 -d 10390406 85C501/2 0 -d 10390496 85C496 0 -d 10390530 530 Host 0 -d 10390540 540 Host 0 -d 10390550 550 Host 0 -d 10390597 5513C 0 -d 10390601 85C601 0 -d 10390620 620 Host 0 -d 10390630 630 Host 0 -d 10390633 633 Host 0 -d 10390635 635 Host 0 -d 10390645 SiS645 Host & Memory & AGP Controller 0 -d 10390646 SiS645DX Host & Memory & AGP Controller 0 -d 10390648 SiS 645xx 0 -d 10390650 650/M650 Host 0 -d 10390651 651 Host 0 -d 10390655 655 Host 0 -d 10390660 660 Host 0 -d 10390661 661FX/M661FX/M661MX Host 0 -d 10390730 730 Host 0 -d 10390733 733 Host 0 -d 10390735 735 Host 0 -d 10390740 740 Host 0 -d 10390741 741/741GX/M741 Host 0 -d 10390745 745 Host 0 -d 10390746 746 Host 0 -d 10390755 755 Host 0 -d 10390760 760/M760 Host 0 -d 10390900 SiS900 PCI Fast Ethernet 0 -s 1039090010190a14 K7S5A motherboard 0 -s 1039090010390900 SiS900 10/100 Ethernet Adapter 0 -s 1039090010438035 CUSI-FX motherboard 0 -d 10390961 SiS961 [MuTIOL Media IO] 0 -d 10390962 SiS962 [MuTIOL Media IO] 0 -d 10390963 SiS963 [MuTIOL Media IO] 0 -d 10390964 SiS964 [MuTIOL Media IO] 0 -d 10390965 SiS965 [MuTIOL Media IO] 0 -d 10393602 83C602 0 -d 10395107 5107 0 -d 10395300 SiS540 PCI Display Adapter 0 -d 10395315 550 PCI/AGP VGA Display Adapter 0 -d 10395401 486 PCI Chipset 0 -d 10395511 5511/5512 0 -d 10395513 5513 [IDE] 0 -s 1039551310190970 P6STP-FL motherboard 0 -s 1039551310395513 SiS5513 EIDE Controller (A,B step) 0 -s 1039551310438035 CUSI-FX motherboard 0 -d 10395517 5517 0 -d 10395571 5571 0 -d 10395581 5581 Pentium Chipset 0 -d 10395582 5582 0 -d 10395591 5591/5592 Host 0 -d 10395596 5596 Pentium Chipset 0 -d 10395597 5597 [SiS5582] 0 -d 10395600 5600 Host 0 -d 10396204 Video decoder & MPEG interface 0 -d 10396205 VGA Controller 0 -d 10396236 6236 3D-AGP 0 -d 10396300 630/730 PCI/AGP VGA Display Adapter 0 -s 1039630010190970 P6STP-FL motherboard 0 -s 1039630010438035 CUSI-FX motherboard 0 -d 10396306 530/620 PCI/AGP VGA Display Adapter 0 -s 1039630610396306 SiS530,620 GUI Accelerator+3D 0 -d 10396325 65x/M650/740 PCI/AGP VGA Display Adapter 0 -d 10396326 86C326 5598/6326 0 -s 1039632610396326 SiS6326 GUI Accelerator 0 -s 1039632610920a50 SpeedStar A50 0 -s 1039632610920a70 SpeedStar A70 0 -s 1039632610924910 SpeedStar A70 0 -s 1039632610924920 SpeedStar A70 0 -s 1039632615696326 SiS6326 GUI Accelerator 0 -d 10396330 661/741/760 PCI/AGP VGA Display Adapter 0 -s 1039633010396330 [M]661xX/[M]741[GX]/[M]760 PCI/AGP VGA Adapter 0 -d 10397001 USB 1.0 Controller 0 -s 1039700110190a14 K7S5A motherboard 0 -s 1039700110397000 Onboard USB Controller 0 -d 10397002 USB 2.0 Controller 0 -s 1039700215097002 Onboard USB Controller 0 -d 10397007 FireWire Controller 0 -d 10397012 Sound Controller 0 -d 10397013 AC'97 Modem Controller 0 There are may be different modem codecs here (Intel537 compatible and incompatible) -d 10397016 SiS7016 PCI Fast Ethernet Adapter 0 -s 1039701610397016 SiS7016 10/100 Ethernet Adapter 0 -d 10397018 SiS PCI Audio Accelerator 0 -s 10397018101401b6 SiS PCI Audio Accelerator 0 -s 10397018101401b7 SiS PCI Audio Accelerator 0 -s 1039701810197018 SiS PCI Audio Accelerator 0 -s 103970181025000e SiS PCI Audio Accelerator 0 -s 1039701810250018 SiS PCI Audio Accelerator 0 -s 1039701810397018 SiS PCI Audio Accelerator 0 -s 103970181043800b SiS PCI Audio Accelerator 0 -s 1039701810547018 SiS PCI Audio Accelerator 0 -s 10397018107d5330 SiS PCI Audio Accelerator 0 -s 10397018107d5350 SiS PCI Audio Accelerator 0 -s 1039701811703209 SiS PCI Audio Accelerator 0 -s 103970181462400a SiS PCI Audio Accelerator 0 -s 1039701814a42089 SiS PCI Audio Accelerator 0 -s 1039701814cd2194 SiS PCI Audio Accelerator 0 -s 1039701814ff1100 SiS PCI Audio Accelerator 0 -s 10397018152d8808 SiS PCI Audio Accelerator 0 -s 1039701815581103 SiS PCI Audio Accelerator 0 -s 1039701815582200 SiS PCI Audio Accelerator 0 -s 1039701815637018 SiS PCI Audio Accelerator 0 -s 1039701815c50111 SiS PCI Audio Accelerator 0 -s 10397018270fa171 SiS PCI Audio Accelerator 0 -s 10397018a0a00022 SiS PCI Audio Accelerator 0 -d 10397019 SiS7019 Audio Accelerator 0 -v 103a Seiko Epson Corporation 0 -v 103b Tatung Co. of America 0 -v 103c Hewlett-Packard Company 0 -d 103c1005 A4977A Visualize EG 0 -d 103c1006 Visualize FX6 0 -d 103c1008 Visualize FX4 0 -d 103c100a Visualize FX2 0 -d 103c1028 Tach TL Fibre Channel Host Adapter 0 -d 103c1029 Tach XL2 Fibre Channel Host Adapter 0 -s 103c1029107e000f Interphase 5560 Fibre Channel Adapter 0 -s 103c102990049210 1Gb/2Gb Family Fibre Channel Controller 0 -s 103c102990049211 1Gb/2Gb Family Fibre Channel Controller 0 -d 103c102a Tach TS Fibre Channel Host Adapter 0 -s 103c102a107e000e Interphase 5540/5541 Fibre Channel Adapter 0 -s 103c102a90049110 1Gb/2Gb Family Fibre Channel Controller 0 -s 103c102a90049111 1Gb/2Gb Family Fibre Channel Controller 0 -d 103c1030 J2585A DeskDirect 10/100VG NIC 0 -d 103c1031 J2585B HP 10/100VG PCI LAN Adapter 0 -s 103c1031103c1040 J2973A DeskDirect 10BaseT NIC 0 -s 103c1031103c1041 J2585B DeskDirect 10/100VG NIC 0 -s 103c1031103c1042 J2970A DeskDirect 10BaseT/2 NIC 0 -d 103c1040 J2973A DeskDirect 10BaseT NIC 0 -d 103c1041 J2585B DeskDirect 10/100 NIC 0 -d 103c1042 J2970A DeskDirect 10BaseT/2 NIC 0 -d 103c1048 Diva Serial [GSP] Multiport UART 0 -s 103c1048103c1049 Tosca Console 0 -s 103c1048103c104a Tosca Secondary 0 -s 103c1048103c104b Maestro SP2 0 -s 103c1048103c1223 Superdome Console 0 -s 103c1048103c1226 Keystone SP2 0 -s 103c1048103c1227 Powerbar SP2 0 -s 103c1048103c1282 Everest SP2 0 -d 103c1054 PCI Local Bus Adapter 0 -d 103c1064 79C970 PCnet Ethernet Controller 0 -d 103c108b Visualize FXe 0 -d 103c10c1 NetServer Smart IRQ Router 0 -d 103c10ed TopTools Remote Control 0 -d 103c1200 82557B 10/100 NIC 0 -d 103c1219 NetServer PCI Hot-Plug Controller 0 -d 103c121a NetServer SMIC Controller 0 -d 103c121b NetServer Legacy COM Port Decoder 0 -d 103c121c NetServer PCI COM Port Decoder 0 -d 103c1229 zx1 System Bus Adapter 0 -d 103c122a zx1 I/O Controller 0 -d 103c122e zx1 Local Bus Adapter 0 -d 103c127c sx1000 I/O Controller 0 -d 103c1290 Auxiliary Diva Serial Port 0 -d 103c2910 E2910A PCIBus Exerciser 0 -d 103c2925 E2925A 32 Bit, 33 MHzPCI Exerciser & Analyzer 0 -v 103e Solliday Engineering 0 -v 103f Synopsys/Logic Modeling Group 0 -v 1040 Accelgraphics Inc. 0 -v 1041 Computrend 0 -v 1042 Micron 0 -d 10421000 PC Tech RZ1000 0 -d 10421001 PC Tech RZ1001 0 -d 10423000 Samurai_0 0 -d 10423010 Samurai_1 0 -d 10423020 Samurai_IDE 0 -v 1043 ASUSTeK Computer Inc. 0 -d 10430675 ISDNLink P-IN100-ST-D 0 -d 10434015 v7100 SDRAM [GeForce2 MX] 0 -d 10434021 v7100 Combo Deluxe [GeForce2 MX + TV tuner] 0 -d 10434057 v8200 GeForce 3 0 -d 10438043 v8240 PAL 128M [P4T] Motherboard 0 -d 1043807b v9280/TD [Geforce4 TI4200 8X With TV-Out and DVI] 0 -d 104380bb v9180 Magic/T [GeForce4 MX440 AGP 8x 64MB TV-out] 0 -v 1044 Adaptec (formerly DPT) 0 -d 10441012 Domino RAID Engine 0 -d 1044a400 SmartCache/Raid I-IV Controller 0 -d 1044a500 PCI Bridge 0 -d 1044a501 SmartRAID V Controller 0 -s 1044a5011044c001 PM1554U2 Ultra2 Single Channel 0 -s 1044a5011044c002 PM1654U2 Ultra2 Single Channel 0 -s 1044a5011044c003 PM1564U3 Ultra3 Single Channel 0 -s 1044a5011044c004 PM1564U3 Ultra3 Dual Channel 0 -s 1044a5011044c005 PM1554U2 Ultra2 Single Channel (NON ACPI) 0 -s 1044a5011044c00a PM2554U2 Ultra2 Single Channel 0 -s 1044a5011044c00b PM2654U2 Ultra2 Single Channel 0 -s 1044a5011044c00c PM2664U3 Ultra3 Single Channel 0 -s 1044a5011044c00d PM2664U3 Ultra3 Dual Channel 0 -s 1044a5011044c00e PM2554U2 Ultra2 Single Channel (NON ACPI) 0 -s 1044a5011044c00f PM2654U2 Ultra2 Single Channel (NON ACPI) 0 -s 1044a5011044c014 PM3754U2 Ultra2 Single Channel (NON ACPI) 0 -s 1044a5011044c015 PM3755U2B Ultra2 Single Channel (NON ACPI) 0 -s 1044a5011044c016 PM3755F Fibre Channel (NON ACPI) 0 -s 1044a5011044c01e PM3757U2 Ultra2 Single Channel 0 -s 1044a5011044c01f PM3757U2 Ultra2 Dual Channel 0 -s 1044a5011044c020 PM3767U3 Ultra3 Dual Channel 0 -s 1044a5011044c021 PM3767U3 Ultra3 Quad Channel 0 -s 1044a5011044c028 PM2865U3 Ultra3 Single Channel 0 -s 1044a5011044c029 PM2865U3 Ultra3 Dual Channel 0 -s 1044a5011044c02a PM2865F Fibre Channel 0 -s 1044a5011044c03c 2000S Ultra3 Single Channel 0 -s 1044a5011044c03d 2000S Ultra3 Dual Channel 0 -s 1044a5011044c03e 2000F Fibre Channel 0 -s 1044a5011044c046 3000S Ultra3 Single Channel 0 -s 1044a5011044c047 3000S Ultra3 Dual Channel 0 -s 1044a5011044c048 3000F Fibre Channel 0 -s 1044a5011044c050 5000S Ultra3 Single Channel 0 -s 1044a5011044c051 5000S Ultra3 Dual Channel 0 -s 1044a5011044c052 5000F Fibre Channel 0 -s 1044a5011044c05a 2400A UDMA Four Channel 0 -s 1044a5011044c05b 2400A UDMA Four Channel DAC 0 -s 1044a5011044c064 3010S Ultra3 Dual Channel 0 -s 1044a5011044c065 3010S Ultra3 Four Channel 0 -s 1044a5011044c066 3010S Fibre Channel 0 -d 1044a511 SmartRAID V Controller 0 -s 1044a5111044c032 ASR-2005S I2O Zero Channel 0 -v 1045 OPTi Inc. 0 -d 1045a0f8 82C750 [Vendetta] USB Controller 0 -d 1045c101 92C264 0 -d 1045c178 92C178 0 -d 1045c556 82X556 [Viper] 0 -d 1045c557 82C557 [Viper-M] 0 -d 1045c558 82C558 [Viper-M ISA+IDE] 0 -d 1045c567 82C750 [Vendetta], device 0 0 -d 1045c568 82C750 [Vendetta], device 1 0 -d 1045c569 82C579 [Viper XPress+ Chipset] 0 -d 1045c621 82C621 [Viper-M/N+] 0 -d 1045c700 82C700 [FireStar] 0 -d 1045c701 82C701 [FireStar Plus] 0 -d 1045c814 82C814 [Firebridge 1] 0 -d 1045c822 82C822 0 -d 1045c824 82C824 0 -d 1045c825 82C825 [Firebridge 2] 0 -d 1045c832 82C832 0 -d 1045c861 82C861 0 -d 1045c895 82C895 0 -d 1045c935 EV1935 ECTIVA MachOne PCIAudio 0 -d 1045d568 82C825 [Firebridge 2] 0 -d 1045d721 IDE [FireStar] 0 -v 1046 IPC Corporation, Ltd. 0 -v 1047 Genoa Systems Corp 0 -v 1048 Elsa AG 0 -d 10480c60 Gladiac MX 0 -d 10480d22 Quadro4 900XGL [ELSA GLoria4 900XGL] 0 -d 10481000 QuickStep 1000 0 -d 10483000 QuickStep 3000 0 -d 10488901 Gloria XL 0 -v 1049 Fountain Technologies, Inc. 0 -v 104a STMicroelectronics 0 # nee SGS Thomson Microelectronics -d 104a0008 STG 2000X 0 -d 104a0009 STG 1764X 0 -d 104a0010 STG4000 [3D Prophet Kyro Series] 0 -d 104a0209 STPC Consumer/Industrial North- and Southbridge 0 -d 104a020a STPC Atlas/ConsumerS/Consumer IIA Northbridge 0 -d 104a0210 STPC Atlas ISA Bridge 0 From <http://gatekeeper.dec.com/pub/BSD/FreeBSD/FreeBSD-stable/src/share/misc/pci_vendors> -d 104a021a STPC Consumer S Southbridge 0 -d 104a021b STPC Consumer IIA Southbridge 0 -d 104a0500 ST70137 [Unicorn] ADSL DMT Transceiver 0 -d 104a0564 STPC Client Northbridge 0 -d 104a0981 21x4x DEC-Tulip compatible 10/100 Ethernet 0 -d 104a1746 STG 1764X 0 -d 104a2774 21x4x DEC-Tulip compatible 10/100 Ethernet 0 -d 104a3520 MPEG-II decoder card 0 -d 104a55cc STPC Client Southbridge 0 -v 104b BusLogic 0 -d 104b0140 BT-946C (old) [multimaster 01] 0 -d 104b1040 BT-946C (BA80C30) [MultiMaster 10] 0 -d 104b8130 Flashpoint LT 0 -v 104c Texas Instruments 0 -d 104c0500 100 MBit LAN Controller 0 -d 104c0508 TMS380C2X Compressor Interface 0 -d 104c1000 Eagle i/f AS 0 -d 104c104c PCI1510 PC card Cardbus Controller 0 -d 104c3d04 TVP4010 [Permedia] 0 -d 104c3d07 TVP4020 [Permedia 2] 0 -s 104c3d0710114d10 Comet 0 -s 104c3d071040000f AccelStar II 0 -s 104c3d0710400011 AccelStar II 0 -s 104c3d0710480a31 WINNER 2000 0 -s 104c3d0710480a32 GLoria Synergy 0 -s 104c3d0710480a35 GLoria Synergy 0 -s 104c3d07107d2633 WinFast 3D L2300 0 -s 104c3d0710920127 FIRE GL 1000 PRO 0 -s 104c3d0710920136 FIRE GL 1000 PRO 0 -s 104c3d0710920141 FIRE GL 1000 PRO 0 -s 104c3d0710920146 FIRE GL 1000 PRO 0 -s 104c3d0710920148 FIRE GL 1000 PRO 0 -s 104c3d0710920149 FIRE GL 1000 PRO 0 -s 104c3d0710920152 FIRE GL 1000 PRO 0 -s 104c3d0710920154 FIRE GL 1000 PRO 0 -s 104c3d0710920155 FIRE GL 1000 PRO 0 -s 104c3d0710920156 FIRE GL 1000 PRO 0 -s 104c3d0710920157 FIRE GL 1000 PRO 0 -s 104c3d0710973d01 Jeronimo Pro 0 -s 104c3d071102100f Graphics Blaster Extreme 0 -s 104c3d073d3d0100 Reference Permedia 2 3D 0 -d 104c8000 PCILynx/PCILynx2 IEEE 1394 Link Layer Controller 0 -s 104c8000e4bf1010 CF1-1-SNARE 0 -s 104c8000e4bf1020 CF1-2-SNARE 0 -d 104c8009 FireWire Controller 0 -s 104c8009104d8032 8032 OHCI i.LINK (IEEE 1394) Controller 0 -d 104c8017 PCI4410 FireWire Controller 0 -d 104c8019 TSB12LV23 IEEE-1394 Controller 0 -s 104c801911bd000a Studio DV500-1394 0 -s 104c801911bd000e Studio DV 0 -s 104c8019e4bf1010 CF2-1-CYMBAL 0 -d 104c8020 TSB12LV26 IEEE-1394 Controller (Link) 0 -d 104c8021 TSB43AA22 IEEE-1394 Controller (PHY/Link Integrated) 0 -s 104c8021104d80df Vaio PCG-FX403 0 -s 104c8021104d80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP 0 -d 104c8022 TSB43AB22 IEEE-1394a-2000 Controller (PHY/Link) 0 -d 104c8023 TSB43AB22/A IEEE-1394a-2000 Controller (PHY/Link) 0 -d 104c8024 TSB43AB23 IEEE-1394a-2000 Controller (PHY/Link) 0 -d 104c8025 TSB82AA2 IEEE-1394b Link Layer Controller 0 -s 104c802555aa55aa FireWire 800 PCI Card 0 -d 104c8026 TSB43AB21 IEEE-1394a-2000 Controller (PHY/Link) 0 -d 104c8027 PCI4451 IEEE-1394 Controller 0 -s 104c8027102800e6 PCI4451 IEEE-1394 Controller (Dell Inspiron 8100) 0 -d 104c8029 PCI4510 IEEE-1394 Controller 0 -s 104c802910280163 Latitude D505 0 -s 104c802910718160 MIM2900 0 -d 104c802e PCI7x20 1394a-2000 OHCI Two-Port PHY/Link-Layer Controller 0 -d 104c8201 PCI1620 Firmware Loading Function 0 -d 104c8400 ACX 100 22Mbps Wireless Interface 0 -s 104c840000fc16ec U.S. Robotics 22 Mbps Wireless PC Card (model 2210) 0 -s 104c840000fd16ec U.S. Robotics 22Mbps Wireless PCI Adapter (model 2216) 0 -s 104c840011863b00 DWL-650+ PC Card cardbus 22Mbs Wireless Adapter [AirPlus] 0 -s 104c840011863b01 DWL-520+ 22Mbps PCI Wireless Adapter 0 -d 104c8401 ACX 100 22Mbps Wireless Interface 0 -d 104c9000 Wireless Interface (of unknown type) 0 OK, this info is almost useless as is, but at least it's known that it's a wireless card. More info requested from reporter (whi -d 104c9066 ACX 111 54Mbps Wireless Interface 0 -d 104ca001 TDC1570 0 -d 104ca100 TDC1561 0 -d 104ca102 TNETA1575 HyperSAR Plus w/PCI Host i/f & UTOPIA i/f 0 -d 104ca106 TMS320C6205 Fixed Point DSP 0 -s 104ca106175c5000 ASI50xx Audio Adapter 0 -s 104ca106175c8700 ASI87xx Radio Tuner card 0 -d 104cac10 PCI1050 0 -d 104cac11 PCI1053 0 -d 104cac12 PCI1130 0 -d 104cac13 PCI1031 0 -d 104cac15 PCI1131 0 -d 104cac16 PCI1250 0 -s 104cac1610140092 ThinkPad 600 0 -d 104cac17 PCI1220 0 -d 104cac18 PCI1260 0 -d 104cac19 PCI1221 0 -d 104cac1a PCI1210 0 -d 104cac1b PCI1450 0 -s 104cac1b0e11b113 Armada M700 0 -d 104cac1c PCI1225 0 -s 104cac1c0e11b121 Armada E500 0 -s 104cac1c10280088 Dell Computer Corporation Latitude CPi A400XT 0 -d 104cac1d PCI1251A 0 -d 104cac1e PCI1211 0 -d 104cac1f PCI1251B 0 -d 104cac20 TI 2030 0 -d 104cac21 PCI2031 0 -d 104cac22 PCI2032 PCI Docking Bridge 0 -d 104cac23 PCI2250 PCI-to-PCI Bridge 0 -d 104cac28 PCI2050 PCI-to-PCI Bridge 0 -d 104cac30 PCI1260 PC card Cardbus Controller 0 -d 104cac40 PCI4450 PC card Cardbus Controller 0 -d 104cac41 PCI4410 PC card Cardbus Controller 0 -d 104cac42 PCI4451 PC card Cardbus Controller 0 -s 104cac42102800e6 PCI4451 PC card CardBus Controller (Dell Inspiron 8100) 0 -d 104cac44 PCI4510 PC card Cardbus Controller 0 -s 104cac4410280163 Latitude D505 0 -s 104cac4410718160 MIM2000 0 -d 104cac46 PCI4520 PC card Cardbus Controller 0 -d 104cac50 PCI1410 PC card Cardbus Controller 0 -d 104cac51 PCI1420 0 -s 104cac511014023b ThinkPad T23 (2647-4MG) 0 -s 104cac51102800b1 Latitude C600 0 -s 104cac511028012a Latitude C640 0 -s 104cac51103380cd Versa Note VXi 0 -s 104cac5110cf1095 Lifebook C6155 0 -s 104cac51e4bf1000 CP2-2-HIPHOP 0 -d 104cac52 PCI1451 PC card Cardbus Controller 0 -d 104cac53 PCI1421 PC card Cardbus Controller 0 -d 104cac54 PCI1620 PC Card Controller 0 -d 104cac55 PCI1520 PC card Cardbus Controller 0 -s 104cac5510140512 ThinkPad T30/T40 0 -d 104cac56 PCI1510 PC card Cardbus Controller 0 -s 104cac5610140528 ThinkPad R40e (2684-HVG) Cardbus Controller 0 -d 104cac60 PCI2040 PCI to DSP Bridge Controller 0 -s 104cac60175c5100 ASI51xx Audio Adapter 0 -s 104cac60175c6100 ASI61xx Audio Adapter 0 -s 104cac60175c6200 ASI62xx Audio Adapter 0 -d 104cac8d PCI 7620 0 -d 104cac8e PCI7420 CardBus Controller 0 -d 104cac8f PCI7420/PCI7620 Dual Socket CardBus and Smart Card Cont. w/ 1394a-2000 OHCI Two-Port PHY/Link-Layer Cont. and SD/MS-Pro Sockets 0 -d 104cfe00 FireWire Host Controller 0 -d 104cfe03 12C01A FireWire Host Controller 0 -v 104d Sony Corporation 0 -d 104d8009 CXD1947Q i.LINK Controller 0 -d 104d8039 CXD3222 i.LINK Controller 0 -d 104d8056 Rockwell HCF 56K modem 0 -d 104d808a Memory Stick Controller 0 -v 104e Oak Technology, Inc 0 -d 104e0017 OTI-64017 0 -d 104e0107 OTI-107 [Spitfire] 0 -d 104e0109 Video Adapter 0 -d 104e0111 OTI-64111 [Spitfire] 0 -d 104e0217 OTI-64217 0 -d 104e0317 OTI-64317 0 -v 104f Co-time Computer Ltd 0 -v 1050 Winbond Electronics Corp 0 -d 10500000 NE2000 0 -d 10500001 W83769F 0 -d 10500105 W82C105 0 -d 10500840 W89C840 0 -s 1050084010500001 W89C840 Ethernet Adapter 0 -s 1050084010500840 W89C840 Ethernet Adapter 0 -d 10500940 W89C940 0 -d 10505a5a W89C940F 0 -d 10506692 W6692 0 -d 10509921 W99200F MPEG-1 Video Encoder 0 -d 10509922 W99200F/W9922PF MPEG-1/2 Video Encoder 0 -d 10509970 W9970CF 0 -v 1051 Anigma, Inc. 0 -v 1052 ?Young Micro Systems 0 -v 1053 Young Micro Systems 0 -v 1054 Hitachi, Ltd 0 -v 1055 Efar Microsystems 0 -d 10559130 SLC90E66 [Victory66] IDE 0 -d 10559460 SLC90E66 [Victory66] ISA 0 -d 10559462 SLC90E66 [Victory66] USB 0 -d 10559463 SLC90E66 [Victory66] ACPI 0 -v 1056 ICL 0 -v 1057 Motorola 0 Motorola made a mistake and used 1507 instead of 1057 in some chips. Please look at the 1507 entry as well when updating this. -d 10570001 MPC105 [Eagle] 0 -d 10570002 MPC106 [Grackle] 0 -d 10570003 MPC8240 [Kahlua] 0 -d 10570004 MPC107 0 -d 10570006 MPC8245 [Unity] 0 -d 10570008 MPC8540 0 -d 10570009 MPC8560 0 -d 10570100 MC145575 [HFC-PCI] 0 -d 10570431 KTI829c 100VG 0 -d 10571801 DSP56301 Digital Signal Processor 0 -s 1057180114fb0101 Transas Radar Imitator Board [RIM] 0 -s 1057180114fb0102 Transas Radar Imitator Board [RIM-2] 0 -s 1057180114fb0202 Transas Radar Integrator Board [RIB-2] 0 -s 1057180114fb0611 1 channel CAN bus Controller [CanPci-1] 0 -s 1057180114fb0612 2 channels CAN bus Controller [CanPci-2] 0 -s 1057180114fb0613 3 channels CAN bus Controller [CanPci-3] 0 -s 1057180114fb0614 4 channels CAN bus Controller [CanPci-4] 0 -s 1057180114fb0621 1 channel CAN bus Controller [CanPci2-1] 0 -s 1057180114fb0622 2 channels CAN bus Controller [CanPci2-2] 0 -s 1057180114fb0810 Transas VTS Radar Integrator Board [RIB-4] 0 -s 10571801175c4200 ASI4215 Audio Adapter 0 -s 10571801175c4300 ASI43xx Audio Adapter 0 -s 10571801175c4400 ASI4401 Audio Adapter 0 -s 10571801ecc00030 Layla 0 -d 105718c0 MPC8265A/MPC8266 0 -d 105718c1 MPC8271/MPC8272 0 -d 10574801 Raven 0 -d 10574802 Falcon 0 -d 10574803 Hawk 0 -d 10574806 CPX8216 0 -d 10574d68 20268 0 -d 10575600 SM56 PCI Modem 0 -s 1057560010570300 SM56 PCI Speakerphone Modem 0 -s 1057560010570301 SM56 PCI Voice Modem 0 -s 1057560010570302 SM56 PCI Fax Modem 0 -s 1057560010575600 SM56 PCI Voice modem 0 -s 1057560013d20300 SM56 PCI Speakerphone Modem 0 -s 1057560013d20301 SM56 PCI Voice modem 0 -s 1057560013d20302 SM56 PCI Fax Modem 0 -s 1057560014360300 SM56 PCI Speakerphone Modem 0 -s 1057560014360301 SM56 PCI Voice modem 0 -s 1057560014360302 SM56 PCI Fax Modem 0 -s 10575600144f100c SM56 PCI Fax Modem 0 -s 1057560014940300 SM56 PCI Speakerphone Modem 0 -s 1057560014940301 SM56 PCI Voice modem 0 -s 1057560014c80300 SM56 PCI Speakerphone Modem 0 -s 1057560014c80302 SM56 PCI Fax Modem 0 -s 1057560016680300 SM56 PCI Speakerphone Modem 0 -s 1057560016680302 SM56 PCI Fax Modem 0 -d 10575803 MPC5200 0 -d 10576400 MPC190 Security Processor (S1 family, encryption) 0 -d 10576405 MPC184 Security Processor (S1 family) 0 -v 1058 Electronics & Telecommunications RSH 0 -v 1059 Teknor Industrial Computers Inc 0 -v 105a Promise Technology, Inc. 0 -d 105a0d30 PDC20265 (FastTrak100 Lite/Ultra100) 0 more correct description from promise linux sources -s 105a0d30105a4d33 Ultra100 0 -d 105a0d38 20263 0 -s 105a0d38105a4d39 Fasttrak66 0 -d 105a1275 20275 0 -d 105a3318 PDC20318 (SATA150 TX4) 0 -d 105a3319 PDC20319 (FastTrak S150 TX4) 0 -s 105a331980863427 S875WP1-E mainboard 0 -d 105a3371 PDC20371 (FastTrak S150 TX2plus) 0 -d 105a3373 PDC20378 (FastTrak 378/SATA 378) 0 -s 105a3373104380f5 PC-DL Deluxe motherboard 0 -s 105a33731462702e K8T NEO FIS2R motherboard 0 -d 105a3375 PDC20375 (SATA150 TX2plus) 0 -d 105a3376 PDC20376 (FastTrak 376) 0 -s 105a33761043809e A7V8X motherboard 0 -d 105a3574 PDC20579 SATAII 150 IDE Controller 0 -d 105a3d18 PDC20518 SATAII 150 IDE Controller 0 -d 105a4d30 PDC20267 (FastTrak100/Ultra100) 0 -s 105a4d30105a4d33 Ultra100 0 -s 105a4d30105a4d39 FastTrak100 0 -d 105a4d33 20246 0 -s 105a4d33105a4d33 20246 IDE Controller 0 -d 105a4d38 PDC20262 (FastTrak66/Ultra66) 0 -s 105a4d38105a4d30 Ultra Device on SuperTrak 0 -s 105a4d38105a4d33 Ultra66 0 -s 105a4d38105a4d39 FastTrak66 0 -d 105a4d68 PDC20268 (Ultra100 TX2) 0 -s 105a4d68105a4d68 Ultra100TX2 0 -d 105a4d69 20269 0 -s 105a4d69105a4d68 Ultra133TX2 0 -d 105a5275 PDC20276 (MBFastTrak133 Lite) 0 -s 105a5275105a0275 SuperTrak SX6000 IDE 0 -s 105a5275105a1275 MBFastTrak133 Lite (tm) Controller (RAID mode) 0 -s 105a52751458b001 MBUltra 133 0 -d 105a5300 DC5300 0 -d 105a6268 PDC20270 (FastTrak100 LP/TX2/TX4) 0 -s 105a6268105a4d68 FastTrak100 TX2 0 -d 105a6269 PDC20271 (FastTrak TX2000) 0 -s 105a6269105a6269 FastTrak TX2/TX2000 0 -d 105a6621 PDC20621 (FastTrak S150 SX4/FastTrak SX4000 lite) 0 -d 105a6622 PDC20621 [SATA150 SX4] 4 Channel IDE RAID Controller 0 -d 105a6626 PDC20618 (Ultra 618) 0 -d 105a6629 PDC20619 (FastTrak TX4000) 0 -d 105a7275 PDC20277 (SBFastTrak133 Lite) 0 -v 105b Foxconn International, Inc. 0 -v 105c Wipro Infotech Limited 0 -v 105d Number 9 Computer Company 0 -d 105d2309 Imagine 128 0 -d 105d2339 Imagine 128-II 0 -s 105d2339105d0000 Imagine 128 series 2 4Mb VRAM 0 -s 105d2339105d0001 Imagine 128 series 2 4Mb VRAM 0 -s 105d2339105d0002 Imagine 128 series 2 4Mb VRAM 0 -s 105d2339105d0003 Imagine 128 series 2 4Mb VRAM 0 -s 105d2339105d0004 Imagine 128 series 2 4Mb VRAM 0 -s 105d2339105d0005 Imagine 128 series 2 4Mb VRAM 0 -s 105d2339105d0006 Imagine 128 series 2 4Mb VRAM 0 -s 105d2339105d0007 Imagine 128 series 2 4Mb VRAM 0 -s 105d2339105d0008 Imagine 128 series 2e 4Mb DRAM 0 -s 105d2339105d0009 Imagine 128 series 2e 4Mb DRAM 0 -s 105d2339105d000a Imagine 128 series 2 8Mb VRAM 0 -s 105d2339105d000b Imagine 128 series 2 8Mb H-VRAM 0 -s 105d233911a4000a Barco Metheus 5 Megapixel 0 -s 105d233913cc0000 Barco Metheus 5 Megapixel 0 -s 105d233913cc0004 Barco Metheus 5 Megapixel 0 -s 105d233913cc0005 Barco Metheus 5 Megapixel 0 -s 105d233913cc0006 Barco Metheus 5 Megapixel 0 -s 105d233913cc0008 Barco Metheus 5 Megapixel 0 -s 105d233913cc0009 Barco Metheus 5 Megapixel 0 -s 105d233913cc000a Barco Metheus 5 Megapixel 0 -s 105d233913cc000c Barco Metheus 5 Megapixel 0 -d 105d493d Imagine 128 T2R [Ticket to Ride] 0 -s 105d493d11a4000a Barco Metheus 5 Megapixel, Dual Head 0 -s 105d493d11a4000b Barco Metheus 5 Megapixel, Dual Head 0 -s 105d493d13cc0002 Barco Metheus 4 Megapixel, Dual Head 0 -s 105d493d13cc0003 Barco Metheus 5 Megapixel, Dual Head 0 -s 105d493d13cc0007 Barco Metheus 5 Megapixel, Dual Head 0 -s 105d493d13cc0008 Barco Metheus 5 Megapixel, Dual Head 0 -s 105d493d13cc0009 Barco Metheus 5 Megapixel, Dual Head 0 -s 105d493d13cc000a Barco Metheus 5 Megapixel, Dual Head 0 -d 105d5348 Revolution 4 0 -s 105d5348105d0037 Revolution IV-FP AGP (For SGI 1600SW) 0 -v 105e Vtech Computers Ltd 0 -v 105f Infotronic America Inc 0 -v 1060 United Microelectronics [UMC] 0 -d 10600001 UM82C881 0 -d 10600002 UM82C886 0 -d 10600101 UM8673F 0 -d 10600881 UM8881 0 -d 10600886 UM8886F 0 -d 10600891 UM8891A 0 -d 10601001 UM886A 0 -d 1060673a UM8886BF 0 -d 1060673b EIDE Master/DMA 0 -d 10608710 UM8710 0 -d 1060886a UM8886A 0 -d 10608881 UM8881F 0 -d 10608886 UM8886F 0 -d 1060888a UM8886A 0 -d 10608891 UM8891A 0 -d 10609017 UM9017F 0 -d 10609018 UM9018 0 -d 10609026 UM9026 0 -d 1060e881 UM8881N 0 -d 1060e886 UM8886N 0 -d 1060e88a UM8886N 0 -d 1060e891 UM8891N 0 -v 1061 I.I.T. 0 -d 10610001 AGX016 0 -d 10610002 IIT3204/3501 0 -v 1062 Maspar Computer Corp 0 -v 1063 Ocean Office Automation 0 -v 1064 Alcatel 0 -v 1065 Texas Microsystems 0 -v 1066 PicoPower Technology 0 -d 10660000 PT80C826 0 -d 10660001 PT86C521 [Vesuvius v1] Host Bridge 0 -d 10660002 PT86C523 [Vesuvius v3] PCI-ISA Bridge Master 0 -d 10660003 PT86C524 [Nile] PCI-to-PCI Bridge 0 -d 10660004 PT86C525 [Nile-II] PCI-to-PCI Bridge 0 -d 10660005 National PC87550 System Controller 0 -d 10668002 PT86C523 [Vesuvius v3] PCI-ISA Bridge Slave 0 -v 1067 Mitsubishi Electric 0 -d 10670301 AccelGraphics AccelECLIPSE 0 -d 10670304 AccelGALAXY A2100 [OEM Evans & Sutherland] 0 -d 10670308 Tornado 3000 [OEM Evans & Sutherland] 0 -d 10671002 VG500 [VolumePro Volume Rendering Accelerator] 0 -v 1068 Diversified Technology 0 -v 1069 Mylex Corporation 0 -d 10690001 DAC960P 0 -d 10690002 DAC960PD 0 -d 10690010 DAC960PG 0 -d 10690020 DAC960LA 0 -d 10690050 AcceleRAID 352/170/160 support Device 0 -d 1069b166 Gemstone chipset SCSI controller 0 -s 1069b16610140242 iSeries 2872 DASD IOA 0 -s 1069b16610140266 Dual Channel PCI-X U320 SCSI Adapter 0 -s 1069b16610140278 Dual Channel PCI-X U320 SCSI RAID Adapter 0 -d 1069ba55 eXtremeRAID 1100 support Device 0 -d 1069ba56 eXtremeRAID 2000/3000 support Device 0 -v 106a Aten Research Inc 0 -v 106b Apple Computer Inc. 0 -d 106b0001 Bandit PowerPC host bridge 0 -d 106b0002 Grand Central I/O 0 -d 106b0003 Control Video 0 -d 106b0004 PlanB Video-In 0 -d 106b0007 O'Hare I/O 0 -d 106b000e Hydra Mac I/O 0 -d 106b0010 Heathrow Mac I/O 0 -d 106b0017 Paddington Mac I/O 0 -d 106b0018 UniNorth FireWire 0 -d 106b0019 KeyLargo USB 0 -d 106b001e UniNorth Internal PCI 0 -d 106b001f UniNorth PCI 0 -d 106b0020 UniNorth AGP 0 -d 106b0021 UniNorth GMAC (Sun GEM) 0 -d 106b0022 KeyLargo Mac I/O 0 -d 106b0024 UniNorth/Pangea GMAC (Sun GEM) 0 -d 106b0025 KeyLargo/Pangea Mac I/O 0 -d 106b0026 KeyLargo/Pangea USB 0 -d 106b0027 UniNorth/Pangea AGP 0 -d 106b0028 UniNorth/Pangea PCI 0 -d 106b0029 UniNorth/Pangea Internal PCI 0 -d 106b002d UniNorth 1.5 AGP 0 -d 106b002e UniNorth 1.5 PCI 0 -d 106b002f UniNorth 1.5 Internal PCI 0 -d 106b0030 UniNorth/Pangea FireWire 0 -d 106b0031 UniNorth 2 FireWire 0 -d 106b0032 UniNorth 2 GMAC (Sun GEM) 0 -d 106b0033 UniNorth 2 ATA/100 0 -d 106b0034 UniNorth 2 AGP 0 -d 106b0035 UniNorth 2 PCI 0 -d 106b0036 UniNorth 2 Internal PCI 0 -d 106b003b UniNorth/Intrepid ATA/100 0 -d 106b003e KeyLargo/Intrepid Mac I/O 0 -d 106b003f KeyLargo/Intrepid USB 0 -d 106b0040 K2 KeyLargo USB 0 -d 106b0041 K2 KeyLargo Mac/IO 0 -d 106b0042 K2 FireWire 0 -d 106b0043 K2 ATA/100 0 -d 106b0045 K2 HT-PCI Bridge 0 -d 106b0046 K2 HT-PCI Bridge 0 -d 106b0047 K2 HT-PCI Bridge 0 -d 106b0048 K2 HT-PCI Bridge 0 -d 106b0049 K2 HT-PCI Bridge 0 -d 106b004b U3 AGP 0 -d 106b004c K2 GMAC (Sun GEM) 0 -d 106b004f Shasta Mac I/O 0 -d 106b0050 Shasta IDE 0 -d 106b0051 Shasta (Sun GEM) 0 -d 106b0052 Shasta Firewire 0 -d 106b0053 Shasta PCI Bridge 0 -d 106b0054 Shasta PCI Bridge 0 -d 106b0055 Shasta PCI Bridge 0 -d 106b0058 U3L AGP Bridge 0 -d 106b1645 Tigon3 Gigabit Ethernet NIC (BCM5701) 0 -v 106c Hynix Semiconductor 0 -d 106c8801 Dual Pentium ISA/PCI Motherboard 0 -d 106c8802 PowerPC ISA/PCI Motherboard 0 -d 106c8803 Dual Window Graphics Accelerator 0 -d 106c8804 LAN Controller 0 -d 106c8805 100-BaseT LAN 0 -v 106d Sequent Computer Systems 0 -v 106e DFI, Inc 0 -v 106f City Gate Development Ltd 0 -v 1070 Daewoo Telecom Ltd 0 -v 1071 Mitac 0 -d 10718160 Mitac 8060B Mobile Platform 0 -v 1072 GIT Co Ltd 0 -v 1073 Yamaha Corporation 0 -d 10730001 3D GUI Accelerator 0 -d 10730002 YGV615 [RPA3 3D-Graphics Controller] 0 -d 10730003 YMF-740 0 -d 10730004 YMF-724 0 -s 1073000410730004 YMF724-Based PCI Audio Adapter 0 -d 10730005 DS1 Audio 0 -s 1073000510730005 DS-XG PCI Audio CODEC 0 -d 10730006 DS1 Audio 0 -d 10730008 DS1 Audio 0 -s 1073000810730008 DS-XG PCI Audio CODEC 0 -d 1073000a DS1L Audio 0 -s 1073000a10730004 DS-XG PCI Audio CODEC 0 -s 1073000a1073000a DS-XG PCI Audio CODEC 0 -d 1073000c YMF-740C [DS-1L Audio Controller] 0 -s 1073000c107a000c DS-XG PCI Audio CODEC 0 -d 1073000d YMF-724F [DS-1 Audio Controller] 0 -s 1073000d1073000d DS-XG PCI Audio CODEC 0 -d 10730010 YMF-744B [DS-1S Audio Controller] 0 -s 1073001010730006 DS-XG PCI Audio CODEC 0 -s 1073001010730010 DS-XG PCI Audio CODEC 0 -d 10730012 YMF-754 [DS-1E Audio Controller] 0 -s 1073001210730012 DS-XG PCI Audio Codec 0 -d 10730020 DS-1 Audio 0 -d 10732000 DS2416 Digital Mixing Card 0 -s 1073200010732000 DS2416 Digital Mixing Card 0 -v 1074 NexGen Microsystems 0 -d 10744e78 82c500/1 0 -v 1075 Advanced Integrations Research 0 -v 1076 Chaintech Computer Co. Ltd 0 -v 1077 QLogic Corp. 0 -d 10771016 ISP10160 Single Channel Ultra3 SCSI Processor 0 -d 10771020 ISP1020 Fast-wide SCSI 0 -d 10771022 ISP1022 Fast-wide SCSI 0 -d 10771080 ISP1080 SCSI Host Adapter 0 -d 10771216 ISP12160 Dual Channel Ultra3 SCSI Processor 0 -s 10771216101e8471 QLA12160 on AMI MegaRAID 0 -s 10771216101e8493 QLA12160 on AMI MegaRAID 0 -d 10771240 ISP1240 SCSI Host Adapter 0 -d 10771280 ISP1280 SCSI Host Adapter 0 -d 10772020 ISP2020A Fast!SCSI Basic Adapter 0 -d 10772100 QLA2100 64-bit Fibre Channel Adapter 0 -s 1077210010770001 QLA2100 64-bit Fibre Channel Adapter 0 -d 10772200 QLA2200 64-bit Fibre Channel Adapter 0 -s 1077220010770002 QLA2200 0 -d 10772300 QLA2300 64-bit Fibre Channel Adapter 0 -d 10772312 QLA2312 Fibre Channel Adapter 0 -v 1078 Cyrix Corporation 0 -d 10780000 5510 [Grappa] 0 -d 10780001 PCI Master 0 -d 10780002 5520 [Cognac] 0 -d 10780100 5530 Legacy [Kahlua] 0 -d 10780101 5530 SMI [Kahlua] 0 -d 10780102 5530 IDE [Kahlua] 0 -d 10780103 5530 Audio [Kahlua] 0 -d 10780104 5530 Video [Kahlua] 0 -d 10780400 ZFMicro PCI Bridge 0 -d 10780401 ZFMicro Chipset SMI 0 -d 10780402 ZFMicro Chipset IDE 0 -d 10780403 ZFMicro Expansion Bus 0 -v 1079 I-Bus 0 -v 107a NetWorth 0 -v 107b Gateway 2000 0 -v 107c LG Electronics [Lucky Goldstar Co. Ltd] 0 -v 107d LeadTek Research Inc. 0 -d 107d0000 P86C850 0 -d 107d2134 WinFast 3D S320 II 0 -d 107d2971 [GeForce FX 5900] WinFast A350 TDH MyViVo 0 -v 107e Interphase Corporation 0 -d 107e0001 5515 ATM Adapter [Flipper] 0 -d 107e0002 100 VG AnyLan Controller 0 -d 107e0004 5526 Fibre Channel Host Adapter 0 -d 107e0005 x526 Fibre Channel Host Adapter 0 -d 107e0008 5525/5575 ATM Adapter (155 Mbit) [Atlantic] 0 -d 107e9003 5535-4P-BRI-ST 0 -d 107e9007 5535-4P-BRI-U 0 -d 107e9008 5535-1P-SR 0 -d 107e900c 5535-1P-SR-ST 0 -d 107e900e 5535-1P-SR-U 0 -d 107e9011 5535-1P-PRI 0 -d 107e9013 5535-2P-PRI 0 -d 107e9023 5536-4P-BRI-ST 0 -d 107e9027 5536-4P-BRI-U 0 -d 107e9031 5536-1P-PRI 0 -d 107e9033 5536-2P-PRI 0 -v 107f Data Technology Corporation 0 -d 107f0802 SL82C105 0 -v 1080 Contaq Microsystems 0 -d 10800600 82C599 0 -d 1080c691 Cypress CY82C691 0 -d 1080c693 82c693 0 -v 1081 Supermac Technology 0 -d 10810d47 Radius PCI to NuBUS Bridge 0 -v 1082 EFA Corporation of America 0 -v 1083 Forex Computer Corporation 0 -d 10830001 FR710 0 -v 1084 Parador 0 -v 1085 Tulip Computers Int.B.V. 0 -v 1086 J. Bond Computer Systems 0 -v 1087 Cache Computer 0 -v 1088 Microcomputer Systems (M) Son 0 -v 1089 Data General Corporation 0 -v 108a SBS Technologies 0 Formerly Bit3 Computer Corp. -d 108a0001 VME Bridge Model 617 0 -d 108a0010 VME Bridge Model 618 0 -d 108a0040 dataBLIZZARD 0 -d 108a3000 VME Bridge Model 2706 0 -v 108c Oakleigh Systems Inc. 0 -v 108d Olicom 0 -d 108d0001 Token-Ring 16/4 PCI Adapter (3136/3137) 0 -d 108d0002 16/4 Token Ring 0 -d 108d0004 RapidFire 3139 Token-Ring 16/4 PCI Adapter 0 -s 108d0004108d0004 OC-3139/3140 RapidFire Token-Ring 16/4 Adapter 0 -d 108d0005 GoCard 3250 Token-Ring 16/4 CardBus PC Card 0 -d 108d0006 OC-3530 RapidFire Token-Ring 100 0 -d 108d0007 RapidFire 3141 Token-Ring 16/4 PCI Fiber Adapter 0 -s 108d0007108d0007 OC-3141 RapidFire Token-Ring 16/4 Adapter 0 -d 108d0008 RapidFire 3540 HSTR 100/16/4 PCI Adapter 0 -s 108d0008108d0008 OC-3540 RapidFire HSTR 100/16/4 Adapter 0 -d 108d0011 OC-2315 0 -d 108d0012 OC-2325 0 -d 108d0013 OC-2183/2185 0 -d 108d0014 OC-2326 0 -d 108d0019 OC-2327/2250 10/100 Ethernet Adapter 0 -s 108d0019108d0016 OC-2327 Rapidfire 10/100 Ethernet Adapter 0 -s 108d0019108d0017 OC-2250 GoCard 10/100 Ethernet Adapter 0 -d 108d0021 OC-6151/6152 [RapidFire ATM 155] 0 -d 108d0022 ATM Adapter 0 -v 108e Sun Microsystems Computer Corp. 0 -d 108e0001 EBUS 0 -d 108e1000 EBUS 0 -d 108e1001 Happy Meal 0 -d 108e1100 RIO EBUS 0 -d 108e1101 RIO GEM 0 -d 108e1102 RIO 1394 0 -d 108e1103 RIO USB 0 -d 108e2bad GEM 0 -d 108e5000 Simba Advanced PCI Bridge 0 -d 108e5043 SunPCI Co-processor 0 -d 108e8000 Psycho PCI Bus Module 0 -d 108e8001 Schizo PCI Bus Module 0 -d 108ea000 Ultra IIi 0 -d 108ea001 Ultra IIe 0 -d 108ea801 Tomatillo PCI Bus Module 0 -d 108eabba Cassini 10/100/1000 0 -v 108f Systemsoft 0 -v 1090 Encore Computer Corporation 0 -v 1091 Intergraph Corporation 0 -d 10910020 3D graphics processor 0 -d 10910021 3D graphics processor w/Texturing 0 -d 10910040 3D graphics frame buffer 0 -d 10910041 3D graphics frame buffer 0 -d 10910060 Proprietary bus bridge 0 -d 109100e4 Powerstorm 4D50T 0 -d 10910720 Motion JPEG codec 0 -d 109107a0 Sun Expert3D-Lite Graphics Accelerator 0 -d 10911091 Sun Expert3D Graphics Accelerator 0 -v 1092 Diamond Multimedia Systems 0 -d 109200a0 Speedstar Pro SE 0 -d 109200a8 Speedstar 64 0 -d 10920550 Viper V550 0 -d 109208d4 Supra 2260 Modem 0 -d 1092094c SupraExpress 56i Pro 0 -d 10921092 Viper V330 0 -d 10926120 Maximum DVD 0 -d 10928810 Stealth SE 0 -d 10928811 Stealth 64/SE 0 -d 10928880 Stealth 0 -d 10928881 Stealth 0 -d 109288b0 Stealth 64 0 -d 109288b1 Stealth 64 0 -d 109288c0 Stealth 64 0 -d 109288c1 Stealth 64 0 -d 109288d0 Stealth 64 0 -d 109288d1 Stealth 64 0 -d 109288f0 Stealth 64 0 -d 109288f1 Stealth 64 0 -d 10929999 DMD-I0928-1 "Monster sound" sound chip 0 -v 1093 National Instruments 0 -d 10930160 PCI-DIO-96 0 -d 10930162 PCI-MIO-16XE-50 0 -d 10931170 PCI-MIO-16XE-10 0 -d 10931180 PCI-MIO-16E-1 0 -d 10931190 PCI-MIO-16E-4 0 -d 10931330 PCI-6031E 0 -d 10931350 PCI-6071E 0 -d 109314e0 PCI-6110 0 -d 109314f0 PCI-6111 0 -d 109317d0 PCI-6503 0 -d 10931870 PCI-6713 0 -d 10931880 PCI-6711 0 -d 109318b0 PCI-6052E 0 -d 10932410 PCI-6733 0 -d 10932890 PCI-6036E 0 -d 10932a60 PCI-6023E 0 -d 10932a70 PCI-6024E 0 -d 10932a80 PCI-6025E 0 -d 10932c80 PCI-6035E 0 -d 10932ca0 PCI-6034E 0 -d 1093b001 IMAQ-PCI-1408 0 -d 1093b011 IMAQ-PXI-1408 0 -d 1093b021 IMAQ-PCI-1424 0 -d 1093b031 IMAQ-PCI-1413 0 -d 1093b041 IMAQ-PCI-1407 0 -d 1093b051 IMAQ-PXI-1407 0 -d 1093b061 IMAQ-PCI-1411 0 -d 1093b071 IMAQ-PCI-1422 0 -d 1093b081 IMAQ-PXI-1422 0 -d 1093b091 IMAQ-PXI-1411 0 -d 1093c801 PCI-GPIB 0 -d 1093c831 PCI-GPIB bridge 0 -v 1094 First International Computers [FIC] 0 -v 1095 Silicon Image, Inc. (formerly CMD Technology Inc) 0 -d 10950240 Adaptec AAR-1210SA SATA HostRAID Controller 0 -d 10950640 PCI0640 0 -d 10950643 PCI0643 0 -d 10950646 PCI0646 0 -d 10950647 PCI0647 0 -d 10950648 PCI0648 0 -d 10950649 SiI 0649 Ultra ATA/100 PCI to ATA Host Controller 0 -s 109506490e11005d Integrated Ultra ATA-100 Dual Channel Controller 0 -s 109506490e11007e Integrated Ultra ATA-100 IDE RAID Controller 0 -s 10950649101e0649 AMI MegaRAID IDE 100 Controller 0 -d 10950650 PBC0650A 0 -d 10950670 USB0670 0 -s 1095067010950670 USB0670 0 -d 10950673 USB0673 0 -d 10950680 PCI0680 Ultra ATA-133 Host Controller 0 -s 1095068010953680 Winic W-680 (Silicon Image 680 based) 0 -d 10953112 SiI 3112 [SATALink/SATARaid] Serial ATA Controller 0 -s 1095311210953112 SiI 3112 SATALink Controller 0 -s 1095311210956112 SiI 3112 SATARaid Controller 0 -d 10953114 SiI 3114 [SATALink/SATARaid] Serial ATA Controller 0 -s 1095311410953114 SiI 3114 SATALink Controller 0 -s 1095311410956114 SiI 3114 SATARaid Controller 0 -d 10953124 SiI 3124 PCI-X Serial ATA Controller 0 -s 1095312410953124 SiI 3124 PCI-X Serial ATA Controller 0 -d 10953512 SiI 3512 [SATALink/SATARaid] Serial ATA Controller 0 -s 1095351210953512 SiI 3512 SATALink Controller 0 -s 1095351210956512 SiI 3512 SATARaid Controller 0 -v 1096 Alacron 0 -v 1097 Appian Technology 0 -v 1098 Quantum Designs (H.K.) Ltd 0 -d 10980001 QD-8500 0 -d 10980002 QD-8580 0 -v 1099 Samsung Electronics Co., Ltd 0 -v 109a Packard Bell 0 -v 109b Gemlight Computer Ltd. 0 -v 109c Megachips Corporation 0 -v 109d Zida Technologies Ltd. 0 -v 109e Brooktree Corporation 0 -d 109e0350 Bt848 Video Capture 0 -d 109e0351 Bt849A Video capture 0 -d 109e0369 Bt878 Video Capture 0 -s 109e036910020001 TV-Wonder 0 -s 109e036910020003 TV-Wonder/VE 0 -d 109e036c Bt879(?) Video Capture 0 -s 109e036c13e90070 Win/TV (Video Section) 0 -d 109e036e Bt878 Video Capture 0 -s 109e036e007013eb WinTV Series 0 -s 109e036e0070ff01 Viewcast Osprey 200 0 -s 109e036e00710101 DigiTV PCI 0 -s 109e036e107d6606 WinFast TV 2000 0 -s 109e036e11bd0012 PCTV pro (TV + FM stereo receiver) 0 -s 109e036e11bd001c PCTV Sat (DBC receiver) 0 -s 109e036e127a0001 Bt878 Mediastream Controller NTSC 0 -s 109e036e127a0002 Bt878 Mediastream Controller PAL BG 0 -s 109e036e127a0003 Bt878a Mediastream Controller PAL BG 0 -s 109e036e127a0048 Bt878/832 Mediastream Controller 0 -s 109e036e144f3000 MagicTView CPH060 - Video 0 -s 109e036e14610002 TV98 Series (TV/No FM/Remote) 0 -s 109e036e14610004 AVerTV WDM Video Capture 0 -s 109e036e14610761 AverTV DVB-T 0 -s 109e036e14f10001 Bt878 Mediastream Controller NTSC 0 -s 109e036e14f10002 Bt878 Mediastream Controller PAL BG 0 -s 109e036e14f10003 Bt878a Mediastream Controller PAL BG 0 -s 109e036e14f10048 Bt878/832 Mediastream Controller 0 -s 109e036e18220001 VisionPlus DVB card 0 -s 109e036e18511850 FlyVideo'98 - Video 0 -s 109e036e18511851 FlyVideo II 0 -s 109e036e18521852 FlyVideo'98 - Video (with FM Tuner) 0 -s 109e036e270ffc00 Digitop DTT-1000 0 -s 109e036ebd111200 PCTV pro (TV + FM stereo receiver) 0 -d 109e036f Bt879 Video Capture 0 -s 109e036f127a0044 Bt879 Video Capture NTSC 0 -s 109e036f127a0122 Bt879 Video Capture PAL I 0 -s 109e036f127a0144 Bt879 Video Capture NTSC 0 -s 109e036f127a0222 Bt879 Video Capture PAL BG 0 -s 109e036f127a0244 Bt879a Video Capture NTSC 0 -s 109e036f127a0322 Bt879 Video Capture NTSC 0 -s 109e036f127a0422 Bt879 Video Capture NTSC 0 -s 109e036f127a1122 Bt879 Video Capture PAL I 0 -s 109e036f127a1222 Bt879 Video Capture PAL BG 0 -s 109e036f127a1322 Bt879 Video Capture NTSC 0 -s 109e036f127a1522 Bt879a Video Capture PAL I 0 -s 109e036f127a1622 Bt879a Video Capture PAL BG 0 -s 109e036f127a1722 Bt879a Video Capture NTSC 0 -s 109e036f14f10044 Bt879 Video Capture NTSC 0 -s 109e036f14f10122 Bt879 Video Capture PAL I 0 -s 109e036f14f10144 Bt879 Video Capture NTSC 0 -s 109e036f14f10222 Bt879 Video Capture PAL BG 0 -s 109e036f14f10244 Bt879a Video Capture NTSC 0 -s 109e036f14f10322 Bt879 Video Capture NTSC 0 -s 109e036f14f10422 Bt879 Video Capture NTSC 0 -s 109e036f14f11122 Bt879 Video Capture PAL I 0 -s 109e036f14f11222 Bt879 Video Capture PAL BG 0 -s 109e036f14f11322 Bt879 Video Capture NTSC 0 -s 109e036f14f11522 Bt879a Video Capture PAL I 0 -s 109e036f14f11622 Bt879a Video Capture PAL BG 0 -s 109e036f14f11722 Bt879a Video Capture NTSC 0 -s 109e036f18511850 FlyVideo'98 - Video 0 -s 109e036f18511851 FlyVideo II 0 -s 109e036f18521852 FlyVideo'98 - Video (with FM Tuner) 0 -d 109e0370 Bt880 Video Capture 0 -s 109e037018511850 FlyVideo'98 0 -s 109e037018511851 FlyVideo'98 EZ - video 0 -s 109e037018521852 FlyVideo'98 (with FM Tuner) 0 -d 109e0878 Bt878 Audio Capture 0 -s 109e0878007013eb WinTV Series 0 -s 109e08780070ff01 Viewcast Osprey 200 0 -s 109e087800710101 DigiTV PCI 0 -s 109e087810020001 TV-Wonder 0 -s 109e087810020003 TV-Wonder/VE 0 -s 109e087811bd0012 PCTV pro (TV + FM stereo receiver, audio section) 0 -s 109e087811bd001c PCTV Sat (DBC receiver) 0 -s 109e0878127a0001 Bt878 Video Capture (Audio Section) 0 -s 109e0878127a0002 Bt878 Video Capture (Audio Section) 0 -s 109e0878127a0003 Bt878 Video Capture (Audio Section) 0 -s 109e0878127a0048 Bt878 Video Capture (Audio Section) 0 -s 109e087813e90070 Win/TV (Audio Section) 0 -s 109e0878144f3000 MagicTView CPH060 - Audio 0 -s 109e087814610004 AVerTV WDM Audio Capture 0 -s 109e087814610761 AVerTV DVB-T 0 -s 109e087814f10001 Bt878 Video Capture (Audio Section) 0 -s 109e087814f10002 Bt878 Video Capture (Audio Section) 0 -s 109e087814f10003 Bt878 Video Capture (Audio Section) 0 -s 109e087814f10048 Bt878 Video Capture (Audio Section) 0 -s 109e087818220001 VisionPlus DVB Card 0 -s 109e0878270ffc00 Digitop DTT-1000 0 -s 109e0878bd111200 PCTV pro (TV + FM stereo receiver, audio section) 0 -d 109e0879 Bt879 Audio Capture 0 -s 109e0879127a0044 Bt879 Video Capture (Audio Section) 0 -s 109e0879127a0122 Bt879 Video Capture (Audio Section) 0 -s 109e0879127a0144 Bt879 Video Capture (Audio Section) 0 -s 109e0879127a0222 Bt879 Video Capture (Audio Section) 0 -s 109e0879127a0244 Bt879 Video Capture (Audio Section) 0 -s 109e0879127a0322 Bt879 Video Capture (Audio Section) 0 -s 109e0879127a0422 Bt879 Video Capture (Audio Section) 0 -s 109e0879127a1122 Bt879 Video Capture (Audio Section) 0 -s 109e0879127a1222 Bt879 Video Capture (Audio Section) 0 -s 109e0879127a1322 Bt879 Video Capture (Audio Section) 0 -s 109e0879127a1522 Bt879 Video Capture (Audio Section) 0 -s 109e0879127a1622 Bt879 Video Capture (Audio Section) 0 -s 109e0879127a1722 Bt879 Video Capture (Audio Section) 0 -s 109e087914f10044 Bt879 Video Capture (Audio Section) 0 -s 109e087914f10122 Bt879 Video Capture (Audio Section) 0 -s 109e087914f10144 Bt879 Video Capture (Audio Section) 0 -s 109e087914f10222 Bt879 Video Capture (Audio Section) 0 -s 109e087914f10244 Bt879 Video Capture (Audio Section) 0 -s 109e087914f10322 Bt879 Video Capture (Audio Section) 0 -s 109e087914f10422 Bt879 Video Capture (Audio Section) 0 -s 109e087914f11122 Bt879 Video Capture (Audio Section) 0 -s 109e087914f11222 Bt879 Video Capture (Audio Section) 0 -s 109e087914f11322 Bt879 Video Capture (Audio Section) 0 -s 109e087914f11522 Bt879 Video Capture (Audio Section) 0 -s 109e087914f11622 Bt879 Video Capture (Audio Section) 0 -s 109e087914f11722 Bt879 Video Capture (Audio Section) 0 -d 109e0880 Bt880 Audio Capture 0 -d 109e2115 BtV 2115 Mediastream controller 0 -d 109e2125 BtV 2125 Mediastream controller 0 -d 109e2164 BtV 2164 0 -d 109e2165 BtV 2165 0 -d 109e8230 Bt8230 ATM Segment/Reassembly Ctrlr (SRC) 0 -d 109e8472 Bt8472 0 -d 109e8474 Bt8474 0 -v 109f Trigem Computer Inc. 0 -v 10a0 Meidensha Corporation 0 -v 10a1 Juko Electronics Ind. Co. Ltd 0 -v 10a2 Quantum Corporation 0 -v 10a3 Everex Systems Inc 0 -v 10a4 Globe Manufacturing Sales 0 -v 10a5 Smart Link Ltd. 0 -d 10a53052 SmartPCI562 56K Modem 0 -d 10a55449 SmartPCI561 modem 0 -v 10a6 Informtech Industrial Ltd. 0 -v 10a7 Benchmarq Microelectronics 0 -v 10a8 Sierra Semiconductor 0 -d 10a80000 STB Horizon 64 0 -v 10a9 Silicon Graphics, Inc. 0 -d 10a90001 Crosstalk to PCI Bridge 0 -d 10a90002 Linc I/O controller 0 -d 10a90003 IOC3 I/O controller 0 -d 10a90004 O2 MACE 0 -d 10a90005 RAD Audio 0 -d 10a90006 HPCEX 0 -d 10a90007 RPCEX 0 -d 10a90008 DiVO VIP 0 -d 10a90009 AceNIC Gigabit Ethernet 0 -s 10a9000910a98002 AceNIC Gigabit Ethernet 0 -d 10a90010 AMP Video I/O 0 -d 10a90011 GRIP 0 -d 10a90012 SGH PSHAC GSN 0 -d 10a91001 Magic Carpet 0 -d 10a91002 Lithium 0 -d 10a91003 Dual JPEG 1 0 -d 10a91004 Dual JPEG 2 0 -d 10a91005 Dual JPEG 3 0 -d 10a91006 Dual JPEG 4 0 -d 10a91007 Dual JPEG 5 0 -d 10a91008 Cesium 0 -d 10a9100a IOC4 I/O controller 0 -d 10a92001 Fibre Channel 0 -d 10a92002 ASDE 0 -d 10a98001 O2 1394 0 -d 10a98002 G-net NT 0 -v 10aa ACC Microelectronics 0 -d 10aa0000 ACCM 2188 0 -v 10ab Digicom 0 -v 10ac Honeywell IAC 0 -v 10ad Symphony Labs 0 -d 10ad0001 W83769F 0 -d 10ad0003 SL82C103 0 -d 10ad0005 SL82C105 0 -d 10ad0103 SL82c103 0 -d 10ad0105 SL82c105 0 -d 10ad0565 W83C553 0 -v 10ae Cornerstone Technology 0 -v 10af Micro Computer Systems Inc 0 -v 10b0 CardExpert Technology 0 -v 10b1 Cabletron Systems Inc 0 -v 10b2 Raytheon Company 0 -v 10b3 Databook Inc 0 -d 10b33106 DB87144 0 -d 10b3b106 DB87144 0 -v 10b4 STB Systems Inc 0 -d 10b41b1d Velocity 128 3D 0 -s 10b41b1d10b4237e Velocity 4400 0 -v 10b5 PLX Technology, Inc. 0 -d 10b50001 i960 PCI bus interface 0 -d 10b51076 VScom 800 8 port serial adaptor 0 -d 10b51077 VScom 400 4 port serial adaptor 0 -d 10b51078 VScom 210 2 port serial and 1 port parallel adaptor 0 -d 10b51103 VScom 200 2 port serial adaptor 0 -d 10b51146 VScom 010 1 port parallel adaptor 0 -d 10b51147 VScom 020 2 port parallel adaptor 0 -d 10b52724 Thales PCSM Security Card 0 -d 10b59030 PCI <-> IOBus Bridge Hot Swap 0 -s 10b5903010b52862 Alpermann+Velte PCL PCI LV (3V/5V): Timecode Reader Board 0 -s 10b5903010b52906 Alpermann+Velte PCI TS (3V/5V): Time Synchronisation Board 0 -s 10b5903010b52940 Alpermann+Velte PCL PCI D (3V/5V): Timecode Reader Board 0 -s 10b5903015ed1002 MCCS 8-port Serial Hot Swap 0 -s 10b5903015ed1003 MCCS 16-port Serial Hot Swap 0 -d 10b59036 9036 0 -d 10b59050 PCI <-> IOBus Bridge 0 -s 10b5905010b51067 IXXAT CAN i165 0 -s 10b5905010b51172 IK220 (Heidenhain) 0 -s 10b5905010b52036 SatPak GPS 0 -s 10b5905010b52221 Alpermann+Velte PCL PCI LV: Timecode Reader Board 0 -s 10b5905010b52273 SH-ARC SoHard ARCnet card 0 -s 10b5905010b52431 Alpermann+Velte PCL PCI D: Timecode Reader Board 0 -s 10b5905010b52905 Alpermann+Velte PCI TS: Time Synchronisation Board 0 -s 10b5905010b59050 MP9050 0 -s 10b5905014980362 TPMC866 8 Channel Serial Card 0 -s 10b5905015220001 RockForce 4 Port V.90 Data/Fax/Voice Modem 0 -s 10b5905015220002 RockForce 2 Port V.90 Data/Fax/Voice Modem 0 -s 10b5905015220003 RockForce 6 Port V.90 Data/Fax/Voice Modem 0 -s 10b5905015220004 RockForce 8 Port V.90 Data/Fax/Voice Modem 0 -s 10b5905015220010 RockForce2000 4 Port V.90 Data/Fax/Voice Modem 0 -s 10b5905015220020 RockForce2000 2 Port V.90 Data/Fax/Voice Modem 0 -s 10b5905015ed1000 Macrolink MCCS 8-port Serial 0 -s 10b5905015ed1001 Macrolink MCCS 16-port Serial 0 -s 10b5905015ed1002 Macrolink MCCS 8-port Serial Hot Swap 0 -s 10b5905015ed1003 Macrolink MCCS 16-port Serial Hot Swap 0 -s 10b5905056542036 OpenSwitch 6 Telephony card 0 Sorry, there was a typo -s 10b5905056543132 OpenSwitch 12 Telephony card 0 Sorry, there was a typo -s 10b5905056545634 OpenLine4 Telephony Card 0 -s 10b59050d531c002 PCIntelliCAN 2xSJA1000 CAN bus 0 -s 10b59050d84d4006 EX-4006 1P 0 -s 10b59050d84d4008 EX-4008 1P EPP/ECP 0 -s 10b59050d84d4014 EX-4014 2P 0 -s 10b59050d84d4018 EX-4018 3P EPP/ECP 0 -s 10b59050d84d4025 EX-4025 1S(16C550) RS-232 0 -s 10b59050d84d4027 EX-4027 1S(16C650) RS-232 0 -s 10b59050d84d4028 EX-4028 1S(16C850) RS-232 0 -s 10b59050d84d4036 EX-4036 2S(16C650) RS-232 0 -s 10b59050d84d4037 EX-4037 2S(16C650) RS-232 0 -s 10b59050d84d4038 EX-4038 2S(16C850) RS-232 0 -s 10b59050d84d4052 EX-4052 1S(16C550) RS-422/485 0 -s 10b59050d84d4053 EX-4053 2S(16C550) RS-422/485 0 -s 10b59050d84d4055 EX-4055 4S(16C550) RS-232 0 -s 10b59050d84d4058 EX-4055 4S(16C650) RS-232 0 -s 10b59050d84d4065 EX-4065 8S(16C550) RS-232 0 -s 10b59050d84d4068 EX-4068 8S(16C650) RS-232 0 -s 10b59050d84d4078 EX-4078 2S(16C552) RS-232+1P 0 -d 10b59054 PCI <-> IOBus Bridge 0 -s 10b5905410b52455 Wessex Techology PHIL-PCI 0 -s 10b5905410b52696 Innes Corp AM Radcap card 0 -s 10b5905410b52717 Innes Corp Auricon card 0 -s 10b5905410b52844 Innes Corp TVS Encoder card 0 -s 10b5905412d90002 PCI Prosody Card rev 1.5 0 -s 10b5905416df0011 PIKA PrimeNet MM PCI 0 -s 10b5905416df0012 PIKA PrimeNet MM cPCI 8 0 -s 10b5905416df0013 PIKA PrimeNet MM cPCI 8 (without CAS Signaling Option) 0 -s 10b5905416df0014 PIKA PrimeNet MM cPCI 4 0 -s 10b5905416df0015 PIKA Daytona MM 0 -s 10b5905416df0016 PIKA InLine MM 0 -d 10b59056 Francois 0 -s 10b5905610b52979 CellinkBlade 11 - CPCI board VoATM AAL1 0 -d 10b59060 9060 0 -d 10b5906d 9060SD 0 -s 10b5906d125c0640 Aries 16000P 0 -d 10b5906e 9060ES 0 -d 10b59080 9080 0 -s 10b59080103c10eb (Agilent) E2777B 83K Series PCI based Optical Communication Interface 0 -s 10b59080103c10ec (Agilent) E6978-66442 PCI CIC 0 -s 10b5908010b59080 9080 [real subsystem ID not set] 0 -s 10b59080129d0002 Aculab PCI Prosidy card 0 -s 10b5908012d90002 PCI Prosody Card 0 -s 10b5908012df4422 4422PCI ["Do-All" Telemetry Data Aquisition System] 0 -d 10b5bb04 B&B 3PCIOSD1A Isolated PCI Serial 0 -v 10b6 Madge Networks 0 -d 10b60001 Smart 16/4 PCI Ringnode 0 -d 10b60002 Smart 16/4 PCI Ringnode Mk2 0 -s 10b6000210b60002 Smart 16/4 PCI Ringnode Mk2 0 -s 10b6000210b60006 16/4 CardBus Adapter 0 -d 10b60003 Smart 16/4 PCI Ringnode Mk3 0 -s 10b600030e11b0fd Compaq NC4621 PCI, 4/16, WOL 0 -s 10b6000310b60003 Smart 16/4 PCI Ringnode Mk3 0 -s 10b6000310b60007 Presto PCI Plus Adapter 0 -d 10b60004 Smart 16/4 PCI Ringnode Mk1 0 -d 10b60006 16/4 Cardbus Adapter 0 -s 10b6000610b60006 16/4 CardBus Adapter 0 -d 10b60007 Presto PCI Adapter 0 -s 10b6000710b60007 Presto PCI 0 -d 10b60009 Smart 100/16/4 PCI-HS Ringnode 0 -s 10b6000910b60009 Smart 100/16/4 PCI-HS Ringnode 0 -d 10b6000a Smart 100/16/4 PCI Ringnode 0 -s 10b6000a10b6000a Smart 100/16/4 PCI Ringnode 0 -d 10b6000b 16/4 CardBus Adapter Mk2 0 -s 10b6000b10b60008 16/4 CardBus Adapter Mk2 0 -s 10b6000b10b6000b 16/4 Cardbus Adapter Mk2 0 -d 10b6000c RapidFire 3140V2 16/4 TR Adapter 0 -s 10b6000c10b6000c RapidFire 3140V2 16/4 TR Adapter 0 -d 10b61000 Collage 25/155 ATM Client Adapter 0 -d 10b61001 Collage 155 ATM Server Adapter 0 -v 10b7 3Com Corporation 0 -d 10b70001 3c985 1000BaseSX (SX/TX) 0 -d 10b70013 AR5212 802.11abg NIC (3CRDAG675) 0 -s 10b7001310b72031 3CRDAG675 11a/b/g Wireless PCI Adapter 0 -d 10b70910 3C910-A01 0 -d 10b71006 MINI PCI type 3B Data Fax Modem 0 -d 10b71007 Mini PCI 56k Winmodem 0 -s 10b7100710b7615c Mini PCI 56K Modem 0 -d 10b71201 3c982-TXM 10/100baseTX Dual Port A [Hydra] 0 -d 10b71202 3c982-TXM 10/100baseTX Dual Port B [Hydra] 0 -d 10b71700 3c940 10/100/1000Base-T [Marvell] 0 -s 10b71700104380eb P4P800 Mainboard 0 -s 10b7170010b70010 3C940 Gigabit LOM Ethernet Adapter 0 -s 10b7170010b70020 3C941 Gigabit LOM Ethernet Adapter 0 -s 10b71700147b1407 KV8-MAX3 motherboard 0 -d 10b73390 3c339 TokenLink Velocity 0 -d 10b73590 3c359 TokenLink Velocity XL 0 -s 10b7359010b73590 TokenLink Velocity XL Adapter (3C359/359B) 0 -d 10b74500 3c450 HomePNA [Tornado] 0 -d 10b75055 3c555 Laptop Hurricane 0 -d 10b75057 3c575 Megahertz 10/100 LAN CardBus [Boomerang] 0 -s 10b7505710b75a57 3C575 Megahertz 10/100 LAN Cardbus PC Card 0 -d 10b75157 3cCFE575BT Megahertz 10/100 LAN CardBus [Cyclone] 0 -s 10b7515710b75b57 3C575 Megahertz 10/100 LAN Cardbus PC Card 0 -d 10b75257 3cCFE575CT CardBus [Cyclone] 0 -s 10b7525710b75c57 FE575C-3Com 10/100 LAN CardBus-Fast Ethernet 0 -d 10b75900 3c590 10BaseT [Vortex] 0 -d 10b75920 3c592 EISA 10mbps Demon/Vortex 0 -d 10b75950 3c595 100BaseTX [Vortex] 0 -d 10b75951 3c595 100BaseT4 [Vortex] 0 -d 10b75952 3c595 100Base-MII [Vortex] 0 -d 10b75970 3c597 EISA Fast Demon/Vortex 0 -d 10b75b57 3c595 Megahertz 10/100 LAN CardBus [Boomerang] 0 -s 10b75b5710b75b57 3C575 Megahertz 10/100 LAN Cardbus PC Card 0 -d 10b76000 3CRSHPW796 [OfficeConnect Wireless CardBus] 0 -d 10b76001 3com 3CRWE154G72 [Office Connect Wireless LAN Adapter] 0 -d 10b76055 3c556 Hurricane CardBus [Cyclone] 0 -d 10b76056 3c556B CardBus [Tornado] 0 -s 10b7605610b76556 10/100 Mini PCI Ethernet Adapter 0 -d 10b76560 3cCFE656 CardBus [Cyclone] 0 -s 10b7656010b7656a 3CCFEM656 10/100 LAN+56K Modem CardBus 0 -d 10b76561 3cCFEM656 10/100 LAN+56K Modem CardBus 0 -s 10b7656110b7656b 3CCFEM656 10/100 LAN+56K Modem CardBus 0 -d 10b76562 3cCFEM656B 10/100 LAN+Winmodem CardBus [Cyclone] 0 -s 10b7656210b7656b 3CCFEM656B 10/100 LAN+56K Modem CardBus 0 -d 10b76563 3cCFEM656B 10/100 LAN+56K Modem CardBus 0 -s 10b7656310b7656b 3CCFEM656 10/100 LAN+56K Modem CardBus 0 -d 10b76564 3cXFEM656C 10/100 LAN+Winmodem CardBus [Tornado] 0 -d 10b77646 3cSOHO100-TX Hurricane 0 -d 10b77770 3CRWE777 PCI(PLX) Wireless Adaptor [Airconnect] 0 -d 10b77940 3c803 FDDILink UTP Controller 0 -d 10b77980 3c804 FDDILink SAS Controller 0 -d 10b77990 3c805 FDDILink DAS Controller 0 -d 10b780eb 3c940B 10/100/1000Base-T 0 -d 10b78811 Token ring 0 -d 10b79000 3c900 10BaseT [Boomerang] 0 -d 10b79001 3c900 10Mbps Combo [Boomerang] 0 -d 10b79004 3c900B-TPO Etherlink XL [Cyclone] 0 -s 10b7900410b79004 3C900B-TPO Etherlink XL TPO 10Mb 0 -d 10b79005 3c900B-Combo Etherlink XL [Cyclone] 0 -s 10b7900510b79005 3C900B-Combo Etherlink XL Combo 0 -d 10b79006 3c900B-TPC Etherlink XL [Cyclone] 0 -d 10b7900a 3c900B-FL 10base-FL [Cyclone] 0 -d 10b79050 3c905 100BaseTX [Boomerang] 0 -d 10b79051 3c905 100BaseT4 [Boomerang] 0 -d 10b79055 3c905B 100BaseTX [Cyclone] 0 -s 10b7905510280080 3C905B Fast Etherlink XL 10/100 0 -s 10b7905510280081 3C905B Fast Etherlink XL 10/100 0 -s 10b7905510280082 3C905B Fast Etherlink XL 10/100 0 -s 10b7905510280083 3C905B Fast Etherlink XL 10/100 0 -s 10b7905510280084 3C905B Fast Etherlink XL 10/100 0 -s 10b7905510280085 3C905B Fast Etherlink XL 10/100 0 -s 10b7905510280086 3C905B Fast Etherlink XL 10/100 0 -s 10b7905510280087 3C905B Fast Etherlink XL 10/100 0 -s 10b7905510280088 3C905B Fast Etherlink XL 10/100 0 -s 10b7905510280089 3C905B Fast Etherlink XL 10/100 0 -s 10b7905510280090 3C905B Fast Etherlink XL 10/100 0 -s 10b7905510280091 3C905B Fast Etherlink XL 10/100 0 -s 10b7905510280092 3C905B Fast Etherlink XL 10/100 0 -s 10b7905510280093 3C905B Fast Etherlink XL 10/100 0 -s 10b7905510280094 3C905B Fast Etherlink XL 10/100 0 -s 10b7905510280095 3C905B Fast Etherlink XL 10/100 0 -s 10b7905510280096 3C905B Fast Etherlink XL 10/100 0 -s 10b7905510280097 3C905B Fast Etherlink XL 10/100 0 -s 10b7905510280098 3C905B Fast Etherlink XL 10/100 0 -s 10b7905510280099 3C905B Fast Etherlink XL 10/100 0 -s 10b7905510b79055 3C905B Fast Etherlink XL 10/100 0 -d 10b79056 3c905B-T4 Fast EtherLink XL [Cyclone] 0 -d 10b79058 3c905B Deluxe Etherlink 10/100/BNC [Cyclone] 0 -d 10b7905a 3c905B-FX Fast Etherlink XL FX 100baseFx [Cyclone] 0 -d 10b79200 3c905C-TX/TX-M [Tornado] 0 -s 10b7920010280095 3C920 Integrated Fast Ethernet Controller 0 -s 10b7920010280097 3C920 Integrated Fast Ethernet Controller 0 -s 10b79200102800fe Optiplex GX240 0 -s 10b792001028012a 3C920 Integrated Fast Ethernet Controller [Latitude C640] 0 -s 10b7920010b71000 3C905C-TX Fast Etherlink for PC Management NIC 0 -s 10b7920010b77000 10/100 Mini PCI Ethernet Adapter 0 -s 10b7920010f12466 Tiger MPX S2466 (3C920 Integrated Fast Ethernet Controller) 0 -d 10b79201 3C920B-EMB Integrated Fast Ethernet Controller [Tornado] 0 -s 10b79201104380ab A7N8X Deluxe onboard 3C920B-EMB Integrated Fast Ethernet Controller 0 -d 10b79202 3Com 3C920B-EMB-WNM Integrated Fast Ethernet Controller 0 -d 10b79210 3C920B-EMB-WNM Integrated Fast Ethernet Controller 0 -d 10b79300 3CSOHO100B-TX 910-A01 [tulip] 0 -d 10b79800 3c980-TX Fast Etherlink XL Server Adapter [Cyclone] 0 -s 10b7980010b79800 3c980-TX Fast Etherlink XL Server Adapter 0 -d 10b79805 3c980-C 10/100baseTX NIC [Python-T] 0 -s 10b7980510b71201 EtherLink Server 10/100 Dual Port A 0 -s 10b7980510b71202 EtherLink Server 10/100 Dual Port B 0 -s 10b7980510b79805 3c980 10/100baseTX NIC [Python-T] 0 -s 10b7980510f12462 Thunder K7 S2462 0 -d 10b79900 3C990-TX [Typhoon] 0 -d 10b79902 3CR990-TX-95 [Typhoon 56-bit] 0 -d 10b79903 3CR990-TX-97 [Typhoon 168-bit] 0 -d 10b79904 3C990B-TX-M/3C990BSVR [Typhoon2] 0 -s 10b7990410b71000 3CR990B-TX-M [Typhoon2] 0 -s 10b7990410b72000 3CR990BSVR [Typhoon2 Server] 0 -d 10b79905 3CR990-FX-95/97/95 [Typhon Fiber] 0 -s 10b7990510b71101 3CR990-FX-95 [Typhoon Fiber 56-bit] 0 -s 10b7990510b71102 3CR990-FX-97 [Typhoon Fiber 168-bit] 0 -s 10b7990510b72101 3CR990-FX-95 Server [Typhoon Fiber 56-bit] 0 -s 10b7990510b72102 3CR990-FX-97 Server [Typhoon Fiber 168-bit] 0 -d 10b79908 3CR990SVR95 [Typhoon Server 56-bit] 0 -d 10b79909 3CR990SVR97 [Typhoon Server 168-bit] 0 -d 10b7990a 3C990SVR [Typhoon Server] 0 -d 10b7990b 3C990SVR [Typhoon Server] 0 -v 10b8 Standard Microsystems Corp [SMC] 0 -d 10b80005 83c170 EPIC/100 Fast Ethernet Adapter 0 -s 10b800051055e000 LANEPIC 10/100 [EVB171Q-PCI] 0 -s 10b800051055e002 LANEPIC 10/100 [EVB171G-PCI] 0 -s 10b8000510b8a011 EtherPower II 10/100 0 -s 10b8000510b8a014 EtherPower II 10/100 0 -s 10b8000510b8a015 EtherPower II 10/100 0 -s 10b8000510b8a016 EtherPower II 10/100 0 -s 10b8000510b8a017 EtherPower II 10/100 0 -d 10b80006 83c175 EPIC/100 Fast Ethernet Adapter 0 -s 10b800061055e100 LANEPIC Cardbus Fast Ethernet Adapter 0 -s 10b800061055e102 LANEPIC Cardbus Fast Ethernet Adapter 0 -s 10b800061055e300 LANEPIC Cardbus Fast Ethernet Adapter 0 -s 10b800061055e302 LANEPIC Cardbus Fast Ethernet Adapter 0 -s 10b8000610b8a012 LANEPIC Cardbus Fast Ethernet Adapter 0 -s 10b8000613a28002 LANEPIC Cardbus Fast Ethernet Adapter 0 -s 10b8000613a28006 LANEPIC Cardbus Fast Ethernet Adapter 0 -d 10b81000 FDC 37c665 0 -d 10b81001 FDC 37C922 0 -d 10b82802 SMC2802W [EZ Connect g] 0 802.11g card -d 10b8a011 83C170QF 0 -d 10b8b106 SMC34C90 0 -v 10b9 ALi Corporation 0 -d 10b90101 CMI8338/C3DX PCI Audio Device 0 -d 10b90111 C-Media CMI8738/C3DX Audio Device (OEM) 0 -s 10b9011110b90111 C-Media CMI8738/C3DX Audio Device (OEM) 0 -d 10b90780 Multi-IO Card 0 -d 10b90782 Multi-IO Card 0 -d 10b91435 M1435 0 -d 10b91445 M1445 0 -d 10b91449 M1449 0 -d 10b91451 M1451 0 -d 10b91461 M1461 0 -d 10b91489 M1489 0 -d 10b91511 M1511 [Aladdin] 0 -d 10b91512 M1512 [Aladdin] 0 -d 10b91513 M1513 [Aladdin] 0 -d 10b91521 M1521 [Aladdin III] 0 -s 10b9152110b91521 ALI M1521 Aladdin III CPU Bridge 0 -d 10b91523 M1523 0 -s 10b9152310b91523 ALI M1523 ISA Bridge 0 -d 10b91531 M1531 [Aladdin IV] 0 -d 10b91533 M1533 PCI to ISA Bridge [Aladdin IV] 0 -s 10b915331014053b ThinkPad R40e (2684-HVG) PCI to ISA Bridge 0 -s 10b9153310b91533 ALI M1533 Aladdin IV ISA Bridge 0 -d 10b91541 M1541 0 -s 10b9154110b91541 ALI M1541 Aladdin V/V+ AGP System Controller 0 -d 10b91543 M1543 0 -d 10b91563 M1563 HyperTransport South Bridge 0 -d 10b91621 M1621 0 -d 10b91631 ALI M1631 PCI North Bridge Aladdin Pro III 0 -d 10b91632 M1632M Northbridge+Trident 0 -d 10b91641 ALI M1641 PCI North Bridge Aladdin Pro IV 0 -d 10b91644 M1644/M1644T Northbridge+Trident 0 -d 10b91646 M1646 Northbridge+Trident 0 -d 10b91647 M1647 Northbridge [MAGiK 1 / MobileMAGiK 1] 0 -d 10b91651 M1651/M1651T Northbridge [Aladdin-Pro 5/5M,Aladdin-Pro 5T/5TM] 0 -d 10b91671 M1671 Super P4 Northbridge [AGP4X,PCI and SDR/DDR] 0 -d 10b91672 M1672 Northbridge [CyberALADDiN-P4] 0 -d 10b91681 M1681 P4 Northbridge [AGP8X,HyperTransport and SDR/DDR] 0 -d 10b91687 M1687 K8 Northbridge [AGP8X and HyperTransport] 0 -d 10b91689 M1689 K8 Northbridge [Super K8 Single Chip] 0 -d 10b93141 M3141 0 -d 10b93143 M3143 0 -d 10b93145 M3145 0 -d 10b93147 M3147 0 -d 10b93149 M3149 0 -d 10b93151 M3151 0 -d 10b93307 M3307 0 -d 10b93309 M3309 0 -d 10b93323 M3325 Video/Audio Decoder 0 -d 10b95212 M4803 0 -d 10b95215 MS4803 0 -d 10b95217 M5217H 0 -d 10b95219 M5219 0 -d 10b95225 M5225 0 -d 10b95229 M5229 IDE 0 -s 10b952291014050f ThinkPad R30 0 -s 10b952291014053d ThinkPad R40e (2684-HVG) builtin IDE 0 -s 10b95229103c0024 Pavilion ze4400 builtin IDE 0 -s 10b9522910438053 A7A266 Motherboard IDE 0 -d 10b95235 M5225 0 -d 10b95237 USB 1.1 Controller 0 -s 10b9523710140540 ThinkPad R40e (2684-HVG) builtin USB 0 -s 10b95237103c0024 Pavilion ze4400 builtin USB 0 -d 10b95239 USB 2.0 Controller 0 -d 10b95243 M1541 PCI to AGP Controller 0 -d 10b95246 AGP8X Controller 0 -d 10b95247 PCI to AGP Controller 0 -d 10b95249 M5249 HTT to PCI Bridge 0 -d 10b95251 M5251 P1394 OHCI 1.0 Controller 0 -d 10b95253 M5253 P1394 OHCI 1.1 Controller 0 -d 10b95261 M5261 Ethernet Controller 0 -d 10b95263 M5263 Ethernet Controller 0 -d 10b95281 ALi M5281 Serial ATA / RAID Host Controller 0 -d 10b95450 Lucent Technologies Soft Modem AMR 0 -d 10b95451 M5451 PCI AC-Link Controller Audio Device 0 -s 10b9545110140506 ThinkPad R30 0 -s 10b954511014053e ThinkPad R40e (2684-HVG) builtin Audio 0 -s 10b95451103c0024 Pavilion ze4400 builtin Audio 0 -s 10b9545110b95451 HP Compaq nc4010 (DY885AA#ABN) 0 -d 10b95453 M5453 PCI AC-Link Controller Modem Device 0 -d 10b95455 M5455 PCI AC-Link Controller Audio Device 0 -d 10b95457 M5457 AC'97 Modem Controller 0 -s 10b9545710140535 ThinkPad R40e (2684-HVG) builtin modem 0 -s 10b95457103c0024 Pavilion ze4400 builtin Modem Device 0 -d 10b95459 SmartLink SmartPCI561 56K Modem 0 Same but more usefull for driver's lookup -d 10b9545a SmartLink SmartPCI563 56K Modem 0 SmartLink PCI SoftModem -d 10b95471 M5471 Memory Stick Controller 0 -d 10b95473 M5473 SD-MMC Controller 0 -d 10b97101 M7101 Power Management Controller [PMU] 0 -s 10b9710110140510 ThinkPad R30 0 -s 10b971011014053c ThinkPad R40e (2684-HVG) Power Management Controller 0 -s 10b97101103c0024 Pavilion ze4400 0 -v 10ba Mitsubishi Electric Corp. 0 -d 10ba0301 AccelGraphics AccelECLIPSE 0 -d 10ba0304 AccelGALAXY A2100 [OEM Evans & Sutherland] 0 -d 10ba0308 Tornado 3000 [OEM Evans & Sutherland] 0 -d 10ba1002 VG500 [VolumePro Volume Rendering Accelerator] 0 -v 10bb Dapha Electronics Corporation 0 -v 10bc Advanced Logic Research 0 -v 10bd Surecom Technology 0 -d 10bd0e34 NE-34 0 -v 10be Tseng Labs International Co. 0 -v 10bf Most Inc 0 -v 10c0 Boca Research Inc. 0 -v 10c1 ICM Co., Ltd. 0 -v 10c2 Auspex Systems Inc. 0 -v 10c3 Samsung Semiconductors, Inc. 0 -d 10c31100 Smartether100 SC1100 LAN Adapter (i82557B) 0 -v 10c4 Award Software International Inc. 0 -v 10c5 Xerox Corporation 0 -v 10c6 Rambus Inc. 0 -v 10c7 Media Vision 0 -v 10c8 Neomagic Corporation 0 -d 10c80001 NM2070 [MagicGraph 128] 0 -d 10c80002 NM2090 [MagicGraph 128V] 0 -d 10c80003 NM2093 [MagicGraph 128ZV] 0 -d 10c80004 NM2160 [MagicGraph 128XD] 0 -s 10c80004101400ba MagicGraph 128XD 0 -s 10c8000410251007 MagicGraph 128XD 0 -s 10c8000410280074 MagicGraph 128XD 0 -s 10c8000410280075 MagicGraph 128XD 0 -s 10c800041028007d MagicGraph 128XD 0 -s 10c800041028007e MagicGraph 128XD 0 -s 10c800041033802f MagicGraph 128XD 0 -s 10c80004104d801b MagicGraph 128XD 0 -s 10c80004104d802f MagicGraph 128XD 0 -s 10c80004104d830b MagicGraph 128XD 0 -s 10c8000410ba0e00 MagicGraph 128XD 0 -s 10c8000410c80004 MagicGraph 128XD 0 -s 10c8000410cf1029 MagicGraph 128XD 0 -s 10c8000410f78308 MagicGraph 128XD 0 -s 10c8000410f78309 MagicGraph 128XD 0 -s 10c8000410f7830b MagicGraph 128XD 0 -s 10c8000410f7830d MagicGraph 128XD 0 -s 10c8000410f78312 MagicGraph 128XD 0 -d 10c80005 NM2200 [MagicGraph 256AV] 0 -s 10c80005101400dd ThinkPad 570 0 -s 10c8000510280088 Latitude CPi A 0 -d 10c80006 NM2360 [MagicMedia 256ZX] 0 -d 10c80016 NM2380 [MagicMedia 256XL+] 0 -s 10c8001610c80016 MagicMedia 256XL+ 0 -d 10c80025 NM2230 [MagicGraph 256AV+] 0 -d 10c80083 NM2093 [MagicGraph 128ZV+] 0 -d 10c88005 NM2200 [MagicMedia 256AV Audio] 0 -s 10c880050e11b0d1 MagicMedia 256AV Audio Device on Discovery 0 -s 10c880050e11b126 MagicMedia 256AV Audio Device on Durango 0 -s 10c88005101400dd MagicMedia 256AV Audio Device on BlackTip Thinkpad 0 -s 10c8800510251003 MagicMedia 256AV Audio Device on TravelMate 720 0 -s 10c8800510280088 Latitude CPi A 0 -s 10c880051028008f MagicMedia 256AV Audio Device on Colorado Inspiron 0 -s 10c88005103c0007 MagicMedia 256AV Audio Device on Voyager II 0 -s 10c88005103c0008 MagicMedia 256AV Audio Device on Voyager III 0 -s 10c88005103c000d MagicMedia 256AV Audio Device on Omnibook 900 0 -s 10c8800510c88005 MagicMedia 256AV Audio Device on FireAnt 0 -s 10c88005110a8005 MagicMedia 256AV Audio Device 0 -s 10c8800514c00004 MagicMedia 256AV Audio Device 0 -d 10c88006 NM2360 [MagicMedia 256ZX Audio] 0 -d 10c88016 NM2380 [MagicMedia 256XL+ Audio] 0 -v 10c9 Dataexpert Corporation 0 -v 10ca Fujitsu Microelectr., Inc. 0 -v 10cb Omron Corporation 0 -v 10cc Mai Logic Incorporated 0 nee Mentor ARC Inc -d 10cc0660 Articia S Host Bridge 0 -d 10cc0661 Articia S PCI Bridge 0 -v 10cd Advanced System Products, Inc 0 -d 10cd1100 ASC1100 0 -d 10cd1200 ASC1200 [(abp940) Fast SCSI-II] 0 -d 10cd1300 ABP940-U / ABP960-U 0 -s 10cd130010cd1310 ASC1300 SCSI Adapter 0 -d 10cd2300 ABP940-UW 0 -d 10cd2500 ABP940-U2W 0 -v 10ce Radius 0 -v 10cf Fujitsu Limited. 0 nee Citicorp TTI -d 10cf2001 mb86605 0 -v 10d1 FuturePlus Systems Corp. 0 -v 10d2 Molex Incorporated 0 -v 10d3 Jabil Circuit Inc 0 -v 10d4 Hualon Microelectronics 0 -v 10d5 Autologic Inc. 0 -v 10d6 Cetia 0 -v 10d7 BCM Advanced Research 0 -v 10d8 Advanced Peripherals Labs 0 -v 10d9 Macronix, Inc. [MXIC] 0 -d 10d90512 MX98713 0 -d 10d90531 MX987x5 0 -s 10d9053111861200 DFE-540TX ProFAST 10/100 Adapter 0 -d 10d98625 MX86250 0 -d 10d98888 MX86200 0 -v 10da Compaq IPG-Austin 0 -d 10da0508 TC4048 Token Ring 4/16 0 -d 10da3390 Tl3c3x9 0 -v 10db Rohm LSI Systems, Inc. 0 -v 10dc CERN/ECP/EDU 0 -d 10dc0001 STAR/RD24 SCI-PCI (PMC) 0 -d 10dc0002 TAR/RD24 SCI-PCI (PMC) 0 -d 10dc0021 HIPPI destination 0 -d 10dc0022 HIPPI source 0 -d 10dc10dc ATT2C15-3 FPGA 0 -v 10dd Evans & Sutherland 0 -v 10de nVidia Corporation 0 -d 10de0008 NV1 [EDGE 3D] 0 -d 10de0009 NV1 [EDGE 3D] 0 -d 10de0010 NV2 [Mutara V08] 0 -d 10de0020 NV4 [RIVA TNT] 0 -s 10de002010430200 V3400 TNT 0 -s 10de002010480c18 Erazor II SGRAM 0 -s 10de002010480c1b Erazor II 0 -s 10de002010920550 Viper V550 0 -s 10de002010920552 Viper V550 0 -s 10de002010924804 Viper V550 0 -s 10de002010924808 Viper V550 0 -s 10de002010924810 Viper V550 0 -s 10de002010924812 Viper V550 0 -s 10de002010924815 Viper V550 0 -s 10de002010924820 Viper V550 with TV out 0 -s 10de002010924822 Viper V550 0 -s 10de002010924904 Viper V550 0 -s 10de002010924914 Viper V550 0 -s 10de002010928225 Viper V550 0 -s 10de002010b4273d Velocity 4400 0 -s 10de002010b4273e Velocity 4400 0 -s 10de002010b42740 Velocity 4400 0 -s 10de002010de0020 Riva TNT 0 -s 10de002011021015 Graphics Blaster CT6710 0 -s 10de002011021016 Graphics Blaster RIVA TNT 0 -d 10de0028 NV5 [RIVA TNT2/TNT2 Pro] 0 -s 10de002810430200 AGP-V3800 SGRAM 0 -s 10de002810430201 AGP-V3800 SDRAM 0 -s 10de002810430205 PCI-V3800 0 -s 10de002810434000 AGP-V3800PRO 0 -s 10de002810480c21 Synergy II 0 -s 10de002810480c31 Erazor III 0 -s 10de0028107d2134 WinFast 3D S320 II + TV-Out 0 -s 10de002810924804 Viper V770 0 -s 10de002810924a00 Viper V770 0 -s 10de002810924a02 Viper V770 Ultra 0 -s 10de002810925a00 RIVA TNT2/TNT2 Pro 0 -s 10de002810926a02 Viper V770 Ultra 0 -s 10de002810927a02 Viper V770 Ultra 0 -s 10de002810de0005 RIVA TNT2 Pro 0 -s 10de002810de000f Compaq NVIDIA TNT2 Pro 0 -s 10de002811021020 3D Blaster RIVA TNT2 0 -s 10de002811021026 3D Blaster RIVA TNT2 Digital 0 -s 10de002814af5810 Maxi Gamer Xentor 0 -d 10de0029 NV5 [RIVA TNT2 Ultra] 0 -s 10de002910430200 AGP-V3800 Deluxe 0 -s 10de002910430201 AGP-V3800 Ultra SDRAM 0 -s 10de002910430205 PCI-V3800 Ultra 0 -s 10de002911021021 3D Blaster RIVA TNT2 Ultra 0 -s 10de002911021029 3D Blaster RIVA TNT2 Ultra 0 -s 10de00291102102f 3D Blaster RIVA TNT2 Ultra 0 -s 10de002914af5820 Maxi Gamer Xentor 32 0 -d 10de002a NV5 [Riva TnT2] 0 -d 10de002b NV5 [Riva TnT2] 0 -d 10de002c NV6 [Vanta/Vanta LT] 0 -s 10de002c10430200 AGP-V3800 Combat SDRAM 0 -s 10de002c10430201 AGP-V3800 Combat 0 -s 10de002c10926820 Viper V730 0 -s 10de002c11021031 CT6938 VANTA 8MB 0 -s 10de002c11021034 CT6894 VANTA 16MB 0 -s 10de002c14af5008 Maxi Gamer Phoenix 2 0 -d 10de002d NV5M64 [RIVA TNT2 Model 64/Model 64 Pro] 0 -s 10de002d10430200 AGP-V3800M 0 -s 10de002d10430201 AGP-V3800M 0 -s 10de002d10480c3a Erazor III LT 0 -s 10de002d10de001e M64 AGP4x 0 -s 10de002d11021023 CT6892 RIVA TNT2 Value 0 -s 10de002d11021024 CT6932 RIVA TNT2 Value 32Mb 0 -s 10de002d1102102c CT6931 RIVA TNT2 Value [Jumper] 0 -s 10de002d14628808 MSI-8808 0 -s 10de002d15541041 Pixelview RIVA TNT2 M64 0 -d 10de002e NV6 [Vanta] 0 -d 10de002f NV6 [Vanta] 0 -d 10de0034 MCP04 SMBus 0 -d 10de0035 MCP04 IDE 0 -d 10de0036 MCP04 Serial ATA Controller 0 -d 10de0037 MCP04 Ethernet Controller 0 -d 10de0038 MCP04 Ethernet Controller 0 -d 10de003a MCP04 AC'97 Audio Controller 0 -d 10de003b MCP04 USB Controller 0 -d 10de003c MCP04 USB Controller 0 -d 10de003d MCP04 PCI Bridge 0 -d 10de003e MCP04 Serial ATA Controller 0 -d 10de0040 nv40 [GeForce 6800 Ultra] 0 -d 10de0041 NV40 [GeForce 6800] 0 -d 10de0042 NV40.2 0 -d 10de0043 NV40.3 0 -d 10de0045 NV40 [GeForce 6800 GT] 0 -d 10de0049 NV40GL 0 -d 10de004e NV40GL [Quadro FX 4000] 0 -d 10de0052 CK804 SMBus 0 -d 10de0053 CK804 IDE 0 -d 10de0054 CK804 Serial ATA Controller 0 -d 10de0055 CK804 Serial ATA Controller 0 -d 10de0056 CK804 Ethernet Controller 0 -d 10de0057 CK804 Ethernet Controller 0 -d 10de0059 CK804 AC'97 Audio Controller 0 -d 10de005a CK804 USB Controller 0 -d 10de005b CK804 USB Controller 0 -d 10de005c CK804 PCI Bridge 0 -d 10de005d CK804 PCIE Bridge 0 -d 10de005e CK804 Memory Controller 0 -d 10de0060 nForce2 ISA Bridge 0 -s 10de0060104380ad A7N8X Mainboard 0 -d 10de0064 nForce2 SMBus (MCP) 0 -d 10de0065 nForce2 IDE 0 -d 10de0066 nForce2 Ethernet Controller 0 -s 10de0066104380a7 A7N8X Mainboard onboard nForce2 Ethernet 0 -d 10de0067 nForce2 USB Controller 0 -s 10de006710430c11 A7N8X Mainboard 0 -d 10de0068 nForce2 USB Controller 0 -s 10de006810430c11 A7N8X Mainboard 0 -d 10de006a nForce2 AC97 Audio Controler (MCP) 0 -d 10de006b nForce MultiMedia audio [Via VT82C686B] 0 -s 10de006b10de006b nForce2 MCP Audio Processing Unit 0 -d 10de006c nForce2 External PCI Bridge 0 -d 10de006d nForce2 PCI Bridge 0 -d 10de006e nForce2 FireWire (IEEE 1394) Controller 0 -d 10de0084 MCP2A SMBus 0 -d 10de0085 MCP2A IDE 0 -d 10de0086 MCP2A Ethernet Controller 0 -d 10de0087 MCP2A USB Controller 0 -d 10de0088 MCP2A USB Controller 0 -d 10de008a MCP2S AC'97 Audio Controller 0 -d 10de008b MCP2A PCI Bridge 0 -d 10de008c MCP2A Ethernet Controller 0 -d 10de008e nForce2 Serial ATA Controller 0 -d 10de00a0 NV5 [Aladdin TNT2] 0 -s 10de00a014af5810 Maxi Gamer Xentor 0 -d 10de00c0 NV41.0 0 -d 10de00c1 NV41.1 0 -d 10de00c2 NV41.2 0 -d 10de00c8 NV41.8 0 -d 10de00ce NV41GL 0 -d 10de00d0 nForce3 LPC Bridge 0 -d 10de00d1 nForce3 Host Bridge 0 -d 10de00d2 nForce3 AGP Bridge 0 -d 10de00d3 CK804 Memory Controller 0 -d 10de00d4 nForce3 SMBus 0 -d 10de00d5 nForce3 IDE 0 -d 10de00d6 nForce3 Ethernet 0 -d 10de00d7 nForce3 USB 1.1 0 -d 10de00d8 nForce3 USB 2.0 0 -d 10de00da nForce3 Audio 0 -d 10de00dd nForce3 PCI Bridge 0 -d 10de00df CK8S Ethernet Controller 0 -d 10de00e1 nForce3 250Gb Host Bridge 0 -d 10de00e2 nForce3 250Gb AGP Host to PCI Bridge 0 -d 10de00e3 CK8S Serial ATA Controller (v2.5) 0 -d 10de00e4 nForce 250Gb PCI System Management 0 -d 10de00e5 CK8S Parallel ATA Controller (v2.5) 0 -d 10de00e6 CK8S Ethernet Controller 0 -d 10de00e7 CK8S USB Controller 0 -d 10de00e8 CK8S USB Controller 0 -d 10de00ea nForce3 250Gb AC'97 Audio Controller 0 -d 10de00ed nForce3 250Gb PCI-to-PCI Bridge 0 -d 10de00ee CK8S Serial ATA Controller (v2.5) 0 -d 10de00f0 NV40 [GeForce 6800/GeForce 6800 Ultra] 0 -d 10de00f1 NV43 [GeForce 6600/GeForce 6600 GT] 0 -d 10de00f2 NV43 [GeForce 6600 GT] 0 -d 10de00f8 NV45GL [Quadro FX 3400] 0 -d 10de00f9 NV40 [GeForce 6800 Ultra] 0 -d 10de00fa NV36 [GeForce PCX 5750] 0 -d 10de00fb NV35 [GeForce PCX 5900] 0 -d 10de00fc NV37GL [Quadro FX 330/GeForce PCX 5300] 0 -d 10de00fd NV37GL [Quadro FX 330] 0 -d 10de00fe NV38GL [Quadro FX 1300] 0 -d 10de00ff NV18 [GeForce PCX 4300] 0 -d 10de0100 NV10 [GeForce 256 SDR] 0 -s 10de010010430200 AGP-V6600 SGRAM 0 -s 10de010010430201 AGP-V6600 SDRAM 0 -s 10de010010434008 AGP-V6600 SGRAM 0 -s 10de010010434009 AGP-V6600 SDRAM 0 -s 10de01001102102d CT6941 GeForce 256 0 -s 10de010014af5022 3D Prophet SE 0 -d 10de0101 NV10DDR [GeForce 256 DDR] 0 -s 10de010110430202 AGP-V6800 DDR 0 -s 10de01011043400a AGP-V6800 DDR SGRAM 0 -s 10de01011043400b AGP-V6800 DDR SDRAM 0 -s 10de0101107d2822 WinFast GeForce 256 0 -s 10de01011102102e CT6971 GeForce 256 DDR 0 -s 10de010114af5021 3D Prophet DDR-DVI 0 -d 10de0103 NV10GL [Quadro] 0 -d 10de0110 NV11 [GeForce2 MX/MX 400] 0 -s 10de011010434015 AGP-V7100 Pro 0 -s 10de011010434031 V7100 Pro with TV output 0 -s 10de011010de0091 Dell OEM GeForce 2 MX 400 0 -s 10de011014628817 MSI GeForce2 MX400 Pro32S [MS-8817] 0 -s 10de011014af7102 3D Prophet II MX 0 -s 10de011014af7103 3D Prophet II MX Dual-Display 0 -d 10de0111 NV11DDR [GeForce2 MX 100 DDR/200 DDR] 0 -d 10de0112 NV11 [GeForce2 Go] 0 -d 10de0113 NV11GL [Quadro2 MXR/EX] 0 -d 10de0150 NV15 [GeForce2 GTS/Pro] 0 -s 10de015010434016 V7700 AGP Video Card 0 -s 10de0150107d2840 WinFast GeForce2 GTS with TV output 0 -s 10de0150107d2842 WinFast GeForce 2 Pro 0 -s 10de015014628831 Creative GeForce2 Pro 0 -d 10de0151 NV15DDR [GeForce2 Ti] 0 -s 10de01511043405f V7700Ti 0 -s 10de015114625506 Creative 3D Blaster Geforce2 Titanium 0 -d 10de0152 NV15BR [GeForce2 Ultra, Bladerunner] 0 -s 10de015210480c56 GLADIAC Ultra 0 -d 10de0153 NV15GL [Quadro2 Pro] 0 -d 10de0170 NV17 [GeForce4 MX 460] 0 -d 10de0171 NV17 [GeForce4 MX 440] 0 -s 10de017110b00002 Gainward Pro/600 TV 0 -s 10de017114628661 G4MX440-VTP 0 -s 10de017114628730 MX440SES-T (MS-8873) 0 -s 10de0171147b8f00 Abit Siluro GeForce4MX440 0 -d 10de0172 NV17 [GeForce4 MX 420] 0 -d 10de0173 NV17 [GeForce4 MX 440-SE] 0 -d 10de0174 NV17 [GeForce4 440 Go] 0 -d 10de0175 NV17 [GeForce4 420 Go] 0 -d 10de0176 NV17 [GeForce4 420 Go 32M] 0 -s 10de01764c531090 Cx9 / Vx9 mainboard 0 -d 10de0177 NV17 [GeForce4 460 Go] 0 -d 10de0178 NV17GL [Quadro4 550 XGL] 0 -d 10de0179 NV17 [GeForce4 440 Go 64M] 0 -s 10de017910de0179 GeForce4 MX (Mac) 0 -d 10de017a NV17GL [Quadro4 200/400 NVS] 0 -d 10de017b NV17GL [Quadro4 550 XGL] 0 -d 10de017c NV17GL [Quadro4 550 GoGL] 0 -d 10de017d NV17 [GeForce4 410 Go 16M] 0 -d 10de0181 NV18 [GeForce4 MX 440 AGP 8x] 0 -s 10de01811043806f V9180 Magic 0 -s 10de018114628880 MS-StarForce GeForce4 MX 440 with AGP8X 0 -s 10de018114628900 MS-8890 GeForce 4 MX440 AGP8X 0 -s 10de018114629350 MSI Geforce4 MX T8X with AGP8X 0 -s 10de0181147b8f0d Siluro GF4 MX-8X 0 -d 10de0182 NV18 [GeForce4 MX 440SE AGP 8x] 0 -d 10de0183 NV18 [GeForce4 MX 420 AGP 8x] 0 -d 10de0185 NV18 [GeForce4 MX 4000 AGP 8x] 0 -d 10de0186 NV18M [GeForce4 448 Go] 0 -d 10de0187 NV18M [GeForce4 488 Go] 0 -d 10de0188 NV18GL [Quadro4 580 XGL] 0 -d 10de018a NV18GL [Quadro4 NVS AGP 8x] 0 -d 10de018b NV18GL [Quadro4 380 XGL] 0 -d 10de018d NV18M [GeForce4 448 Go] 0 -d 10de01a0 NVCrush11 [GeForce2 MX Integrated Graphics] 0 -d 10de01a4 nForce CPU bridge 0 -d 10de01ab nForce 420 Memory Controller (DDR) 0 -d 10de01ac nForce 220/420 Memory Controller 0 -d 10de01ad nForce 220/420 Memory Controller 0 -d 10de01b0 nForce Audio 0 -d 10de01b1 nForce Audio 0 -d 10de01b2 nForce ISA Bridge 0 -d 10de01b4 nForce PCI System Management 0 -d 10de01b7 nForce AGP to PCI Bridge 0 -d 10de01b8 nForce PCI-to-PCI bridge 0 -d 10de01bc nForce IDE 0 -d 10de01c1 nForce AC'97 Modem Controller 0 -d 10de01c2 nForce USB Controller 0 -d 10de01c3 nForce Ethernet Controller 0 -d 10de01e0 nForce2 AGP (different version?) 0 -d 10de01e8 nForce2 AGP 0 -d 10de01ea nForce2 Memory Controller 0 0 -d 10de01eb nForce2 Memory Controller 1 0 -d 10de01ec nForce2 Memory Controller 2 0 -d 10de01ed nForce2 Memory Controller 3 0 -d 10de01ee nForce2 Memory Controller 4 0 -d 10de01ef nForce2 Memory Controller 5 0 -d 10de01f0 NV18 [GeForce4 MX - nForce GPU] 0 -d 10de0200 NV20 [GeForce3] 0 -s 10de02001043402f AGP-V8200 DDR 0 -d 10de0201 NV20 [GeForce3 Ti 200] 0 -d 10de0202 NV20 [GeForce3 Ti 500] 0 -s 10de02021043405b V8200 T5 0 -s 10de02021545002f Xtasy 6964 0 -d 10de0203 NV20DCC [Quadro DCC] 0 -d 10de0250 NV25 [GeForce4 Ti 4600] 0 -d 10de0251 NV25 [GeForce4 Ti 4400] 0 -s 10de025110438023 v8440 GeForce 4 Ti4400 0 -d 10de0252 NV25 [GeForce4 Ti] 0 -d 10de0253 NV25 [GeForce4 Ti 4200] 0 -s 10de0253107d2896 WinFast A250 LE TD (Dual VGA/TV-out/DVI) 0 -s 10de0253147b8f09 Siluro (Dual VGA/TV-out/DVI) 0 -d 10de0258 NV25GL [Quadro4 900 XGL] 0 -d 10de0259 NV25GL [Quadro4 750 XGL] 0 -d 10de025b NV25GL [Quadro4 700 XGL] 0 -d 10de0280 NV28 [GeForce4 Ti 4800] 0 -d 10de0281 NV28 [GeForce4 Ti 4200 AGP 8x] 0 -d 10de0282 NV28 [GeForce4 Ti 4800 SE] 0 -d 10de0286 NV28 [GeForce4 Ti 4200 Go AGP 8x] 0 -d 10de0288 NV28GL [Quadro4 980 XGL] 0 -d 10de0289 NV28GL [Quadro4 780 XGL] 0 -d 10de028c NV28GLM [Quadro4 700 GoGL] 0 -d 10de0300 NV30 [GeForce FX] 0 -d 10de0301 NV30 [GeForce FX 5800 Ultra] 0 -d 10de0302 NV30 [GeForce FX 5800] 0 -d 10de0308 NV30GL [Quadro FX 2000] 0 -d 10de0309 NV30GL [Quadro FX 1000] 0 -d 10de0311 NV31 [GeForce FX 5600 Ultra] 0 -d 10de0312 NV31 [GeForce FX 5600] 0 -d 10de0313 NV31 0 -d 10de0314 NV31 [GeForce FX 5600XT] 0 -s 10de03141043814a V9560XT/TD 0 -d 10de0316 NV31 0 -d 10de0317 NV31 0 -d 10de031a NV31M [GeForce FX Go 5600] 0 -d 10de031b NV31M [GeForce FX Go5650] 0 -d 10de031c NVIDIA Quadro FX 700 Go 0 -d 10de031d NV31 0 -d 10de031e NV31 0 -d 10de031f NV31 0 -d 10de0320 NV34 [GeForce FX 5200] 0 -d 10de0321 NV34 [GeForce FX 5200 Ultra] 0 -d 10de0322 NV34 [GeForce FX 5200] 0 -s 10de032214629171 MS-8917 (FX5200-T128) 0 -d 10de0323 NV34 [GeForce FX 5200LE] 0 -d 10de0324 NV34M [GeForce FX Go 5200] 0 -s 10de032410718160 MIM2000 0 -d 10de0325 NV34M [GeForce FX Go5250] 0 -d 10de0326 NV34 [GeForce FX 5500] 0 -d 10de0327 NV34 [GeForce FX 5100] 0 -d 10de0328 NV34M [GeForce FX Go 5200] 0 -d 10de0329 NV34M [GeForce FX Go5200] 0 -d 10de032a NV34GL [Quadro NVS 280 PCI] 0 -d 10de032b NV34GL [Quadro FX 500/600 PCI] 0 -d 10de032c NV34GLM [GeForce FX Go 5300] 0 -d 10de032d NV34 [GeForce FX Go5100] 0 -d 10de032f NV34 0 -d 10de0330 NV35 [GeForce FX 5900 Ultra] 0 -d 10de0331 NV35 [GeForce FX 5900] 0 -s 10de033110438145 V9950GE 0 -d 10de0332 NV35 [GeForce FX 5900XT] 0 -d 10de0333 NV38 [GeForce FX 5950 Ultra] 0 -d 10de0334 NV35 [GeForce FX 5900ZT] 0 -d 10de0338 NV35GL [Quadro FX 3000] 0 -d 10de033f NV35GL [Quadro FX 700] 0 -d 10de0341 NV36.1 [GeForce FX 5700 Ultra] 0 -d 10de0342 NV36.2 [GeForce FX 5700] 0 -d 10de0343 NV36 [GeForce FX 5700LE] 0 -d 10de0344 NV36.4 [GeForce FX 5700VE] 0 -d 10de0345 NV36.5 0 -d 10de0347 NV36 [GeForce FX Go5700] 0 -d 10de0348 NV36 [GeForce FX Go5700] 0 -d 10de0349 NV36 0 -d 10de034b NV36 0 -d 10de034c NV36 [Quadro FX Go1000] 0 -d 10de034e NV36GL [Quadro FX 1100] 0 -d 10de034f NV36GL 0 -v 10df Emulex Corporation 0 -d 10df1ae5 LP6000 Fibre Channel Host Adapter 0 -d 10df1ae6 LP 8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2) 0 -d 10df1ae7 LP 8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:2-3) 0 -d 10dff015 LP1150e 0 -d 10dff085 LP850 Fibre Channel Adapter 0 -d 10dff095 LP952 Fibre Channel Adapter 0 -d 10dff098 LP982 Fibre Channel Adapter 0 -d 10dff0a1 LightPulse Fibre Channel Adapter 0 -d 10dff0a5 LP1050 0 -d 10dff0d5 LP1150 0 -d 10dff100 LP11000e 0 -d 10dff700 LP7000 Fibre Channel Host Adapter 0 -d 10dff701 LP 7000EFibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2) 0 -d 10dff800 LP8000 Fibre Channel Host Adapter 0 -d 10dff801 LP 8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2) 0 -d 10dff900 LP9000 Fibre Channel Host Adapter 0 -d 10dff901 LP 9000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2) 0 -d 10dff980 LP9802 Fibre Channel Adapter 0 -d 10dff981 LP 9802 Fibre Channel Host Adapter Alternate ID 0 -d 10dff982 LP 9802 Fibre Channel Host Adapter Alternate ID 0 -d 10dffa00 LP10000 Fibre Channel Host Adapter 0 -d 10dffa01 LP101 0 -d 10dffb00 LightPulse Fibre Channel Adapter 0 -d 10dffd00 LP11000 0 -v 10e0 Integrated Micro Solutions Inc. 0 -d 10e05026 IMS5026/27/28 0 -d 10e05027 IMS5027 0 -d 10e05028 IMS5028 0 -d 10e08849 IMS8849 0 -d 10e08853 IMS8853 0 -d 10e09128 IMS9128 [Twin turbo 128] 0 -v 10e1 Tekram Technology Co.,Ltd. 0 -d 10e10391 TRM-S1040 0 -s 10e1039110e10391 DC-315U SCSI-3 Host Adapter 0 -d 10e1690c DC-690c 0 -d 10e1dc29 DC-290 0 -v 10e2 Aptix Corporation 0 -v 10e3 Tundra Semiconductor Corp. 0 -d 10e30000 CA91C042 [Universe] 0 -d 10e30860 CA91C860 [QSpan] 0 -d 10e30862 CA91C862A [QSpan-II] 0 -d 10e38260 CA91L8200B [Dual PCI PowerSpan II] 0 -d 10e38261 CA91L8260B [Single PCI PowerSpan II] 0 -v 10e4 Tandem Computers 0 -v 10e5 Micro Industries Corporation 0 -v 10e6 Gainbery Computer Products Inc. 0 -v 10e7 Vadem 0 -v 10e8 Applied Micro Circuits Corp. 0 -d 10e81072 INES GPIB-PCI (AMCC5920 based) 0 -d 10e82011 Q-Motion Video Capture/Edit board 0 -d 10e84750 S5930 [Matchmaker] 0 -d 10e85920 S5920 0 -d 10e88043 LANai4.x [Myrinet LANai interface chip] 0 -d 10e88062 S5933_PARASTATION 0 -d 10e8807d S5933 [Matchmaker] 0 -d 10e88088 Kongsberg Spacetec Format Synchronizer 0 -d 10e88089 Kongsberg Spacetec Serial Output Board 0 -d 10e8809c S5933_HEPC3 0 -d 10e880d7 PCI-9112 0 -d 10e880d9 PCI-9118 0 -d 10e880da PCI-9812 0 -d 10e8811a PCI-IEEE1355-DS-DE Interface 0 -d 10e8814c Fastcom ESCC-PCI (Commtech, Inc.) 0 -d 10e88170 S5933 [Matchmaker] (Chipset Development Tool) 0 -d 10e881e6 Multimedia video controller 0 sold with Roper Scientifc(Photometrics) CoolSnap HQ camera -d 10e88291 Fastcom 232/8-PCI (Commtech, Inc.) 0 -d 10e882c4 Fastcom 422/4-PCI (Commtech, Inc.) 0 -d 10e882c5 Fastcom 422/2-PCI (Commtech, Inc.) 0 -d 10e882c6 Fastcom IG422/1-PCI (Commtech, Inc.) 0 -d 10e882c7 Fastcom IG232/2-PCI (Commtech, Inc.) 0 -d 10e882ca Fastcom 232/4-PCI (Commtech, Inc.) 0 -d 10e882db AJA HDNTV HD SDI Framestore 0 -d 10e882e2 Fastcom DIO24H-PCI (Commtech, Inc.) 0 -d 10e88851 S5933 on Innes Corp FM Radio Capture card 0 -v 10e9 Alps Electric Co., Ltd. 0 -v 10ea Intergraphics Systems 0 -d 10ea1680 IGA-1680 0 -d 10ea1682 IGA-1682 0 -d 10ea1683 IGA-1683 0 -d 10ea2000 CyberPro 2000 0 -d 10ea2010 CyberPro 2000A 0 -d 10ea5000 CyberPro 5000 0 -d 10ea5050 CyberPro 5050 0 -d 10ea5202 CyberPro 5202 0 -d 10ea5252 CyberPro5252 0 CyberPro5202 Audio Function -v 10eb Artists Graphics 0 -d 10eb0101 3GA 0 -d 10eb8111 Twist3 Frame Grabber 0 -v 10ec Realtek Semiconductor Co., Ltd. 0 -d 10ec8029 RTL-8029(AS) 0 -s 10ec802910b82011 EZ-Card (SMC1208) 0 -s 10ec802910ec8029 RTL-8029(AS) 0 -s 10ec802911131208 EN1208 0 -s 10ec802911860300 DE-528 0 -s 10ec802912592400 AT-2400 0 -d 10ec8129 RTL-8129 0 -s 10ec812910ec8129 RT8129 Fast Ethernet Adapter 0 -d 10ec8138 RT8139 (B/C) Cardbus Fast Ethernet Adapter 0 -s 10ec813810ec8138 RT8139 (B/C) Fast Ethernet Adapter 0 -d 10ec8139 RTL-8139/8139C/8139C+ 0 -s 10ec81390357000a TTP-Monitoring Card V2.0 0 -s 10ec81391025005a TravelMate 290 0 -s 10ec813910258920 ALN-325 0 -s 10ec813910258921 ALN-325 0 -s 10ec813910718160 MIM2000 0 -s 10ec813910bd0320 EP-320X-R 0 -s 10ec813910ec8139 RT8139 0 -s 10ec81391113ec01 FNC-0107TX 0 -s 10ec813911861300 DFE-538TX 0 -s 10ec813911861320 SN5200 0 -s 10ec813911868139 DRN-32TX 0 -s 10ec813911f68139 FN22-3(A) LinxPRO Ethernet Adapter 0 -s 10ec813912592500 AT-2500TX 0 -s 10ec813912592503 AT-2500TX/ACPI 0 -s 10ec81391429d010 ND010 0 -s 10ec813914329130 EN-9130TX 0 -s 10ec813914368139 RT8139 0 -s 10ec81391458e000 GA-7VM400M/7VT600 Motherboard 0 -s 10ec8139146c1439 FE-1439TX 0 -s 10ec813914896001 GF100TXRII 0 -s 10ec813914896002 GF100TXRA 0 -s 10ec8139149c139a LFE-8139ATX 0 -s 10ec8139149c8139 LFE-8139TX 0 -s 10ec813914cb0200 LNR-100 Family 10/100 Base-TX Ethernet 0 -s 10ec813917995000 F5D5000 PCI Card/Desktop Network PCI Card 0 -s 10ec813926460001 EtheRx 0 -s 10ec81398e2e7000 KF-230TX 0 -s 10ec81398e2e7100 KF-230TX/2 0 -s 10ec8139a0a00007 ALN-325C 0 -d 10ec8169 RTL-8169 Gigabit Ethernet 0 -s 10ec81691259c107 CG-LAPCIGT 0 -s 10ec81691371434e ProG-2000L 0 -s 10ec81691458e000 GA-K8VT800 Pro Motherboard 0 -s 10ec81691462702c K8T NEO 2 motherboard 0 -d 10ec8180 RTL8180L 802.11b MAC 0 -d 10ec8197 SmartLAN56 56K Modem 0 -v 10ed Ascii Corporation 0 -d 10ed7310 V7310 0 -v 10ee Xilinx Corporation 0 -d 10ee3fc0 RME Digi96 0 -d 10ee3fc1 RME Digi96/8 0 -d 10ee3fc2 RME Digi96/8 Pro 0 -d 10ee3fc3 RME Digi96/8 Pad 0 -d 10ee3fc4 RME Digi9652 (Hammerfall) 0 -d 10ee3fc5 RME Hammerfall DSP 0 -d 10ee3fc6 RME Hammerfall DSP MADI 0 -d 10ee8381 Ellips Santos Frame Grabber 0 -v 10ef Racore Computer Products, Inc. 0 -d 10ef8154 M815x Token Ring Adapter 0 -v 10f0 Peritek Corporation 0 -v 10f1 Tyan Computer 0 -v 10f2 Achme Computer, Inc. 0 -v 10f3 Alaris, Inc. 0 -v 10f4 S-MOS Systems, Inc. 0 -v 10f5 NKK Corporation 0 -d 10f5a001 NDR4000 [NR4600 Bridge] 0 -v 10f6 Creative Electronic Systems SA 0 -v 10f7 Matsushita Electric Industrial Co., Ltd. 0 -v 10f8 Altos India Ltd 0 -v 10f9 PC Direct 0 -v 10fa Truevision 0 -d 10fa000c TARGA 1000 0 -v 10fb Thesys Gesellschaft für Mikroelektronik mbH 0 -d 10fb186f TH 6255 0 -v 10fc I-O Data Device, Inc. 0 -d 10fc0003 Cardbus IDE Controller 0 What's in the cardbus end of a Sony ACR-A01 card, comes with newer Vaio CD-RW drives -d 10fc0005 Cardbus SCSI CBSC II 0 -v 10fd Soyo Computer, Inc 0 -v 10fe Fast Multimedia AG 0 -v 10ff NCube 0 -v 1100 Jazz Multimedia 0 -v 1101 Initio Corporation 0 -d 11011060 INI-A100U2W 0 -d 11019100 INI-9100/9100W 0 -d 11019400 INI-940 0 -d 11019401 INI-950 0 -d 11019500 360P 0 -d 11019502 Initio INI-9100UW Ultra Wide SCSI Controller INIC-950P chip 0 -v 1102 Creative Labs 0 -d 11020002 SB Live! EMU10k1 0 -s 1102000211020020 CT4850 SBLive! Value 0 -s 1102000211020021 CT4620 SBLive! 0 -s 110200021102002f SBLive! mainboard implementation 0 -s 1102000211024001 E-mu APS 0 -s 1102000211028022 CT4780 SBLive! Value 0 -s 1102000211028023 CT4790 SoundBlaster PCI512 0 -s 1102000211028024 CT4760 SBLive! 0 -s 1102000211028025 SBLive! Mainboard Implementation 0 -s 1102000211028026 CT4830 SBLive! Value 0 -s 1102000211028027 CT4832 SBLive! Value 0 -s 1102000211028028 CT4760 SBLive! OEM version 0 -s 1102000211028031 CT4831 SBLive! Value 0 -s 1102000211028040 CT4760 SBLive! 0 -s 1102000211028051 CT4850 SBLive! Value 0 -s 1102000211028061 SBLive! Player 5.1 0 -s 1102000211028064 SB Live! 5.1 Model SB0100 0 -s 1102000211028065 SBLive! 5.1 Digital Model SB0220 0 -s 1102000211028067 SBLive! 5.1 eMicro 28028 0 -d 11020004 SB Audigy 0 -s 1102000411020051 SB0090 Audigy Player 0 -s 1102000411020053 SB0090 Audigy Player/OEM 0 -s 1102000411020058 SB0090 Audigy Player/OEM 0 -s 1102000411022002 SB Audigy 2 ZS (SB0350) 0 -d 11020006 [SB Live! Value] EMU10k1X 0 -d 11020007 SB Audigy LS 0 -s 1102000711021001 SB0310 Audigy LS 0 -s 1102000711021002 SB0312 Audigy LS 0 -d 11020008 SB0400 Audigy2 Value 0 -d 11024001 SB Audigy FireWire Port 0 -s 1102400111020010 SB Audigy FireWire Port 0 -d 11027002 SB Live! MIDI/Game Port 0 -s 1102700211020020 Gameport Joystick 0 -d 11027003 SB Audigy MIDI/Game port 0 -s 1102700311020040 SB Audigy MIDI/Game Port 0 -d 11027004 [SB Live! Value] Input device controller 0 -d 11027005 SB Audigy LS MIDI/Game port 0 -s 1102700511021001 SB0310 Audigy LS MIDI/Game port 0 -s 1102700511021002 SB0312 Audigy LS MIDI/Game port 0 -d 11028064 SB0100 [SBLive! 5.1 OEM] 0 -d 11028938 Ectiva EV1938 0 -v 1103 Triones Technologies, Inc. 0 -d 11030003 HPT343 0 -d 11030004 HPT366/368/370/370A/372 0 Revisions: 01=HPT366, 03=HPT370, 04=HPT370A, 05=HPT372 -s 1103000411030001 HPT370A 0 -s 1103000411030003 HPT343 / HPT345 / HPT363 UDMA33 0 -s 1103000411030004 HPT366 UDMA66 (r1) / HPT368 UDMA66 (r2) / HPT370 UDMA100 (r3) / HPT370 UDMA100 RAID (r4) 0 -s 1103000411030005 HPT370 UDMA100 0 -s 1103000411030006 HPT302 0 -s 1103000411030007 HPT371 UDMA133 0 -s 1103000411030008 HPT374 UDMA/ATA133 RAID Controller 0 -d 11030005 HPT372A 0 -d 11030006 HPT302 0 -d 11030007 HPT371 0 -d 11030008 HPT374 0 -d 11030009 HPT372N 0 -v 1104 RasterOps Corp. 0 -v 1105 Sigma Designs, Inc. 0 -d 11051105 REALmagic Xcard MPEG 1/2/3/4 DVD Decoder 0 -d 11058300 REALmagic Hollywood Plus DVD Decoder 0 -d 11058400 EM840x REALmagic DVD/MPEG-2 Audio/Video Decoder 0 -d 11058401 EM8401 REALmagic DVD/MPEG-2 A/V Decoder 0 -d 11058470 EM8470 REALmagic DVD/MPEG-4 A/V Decoder 0 -d 11058471 EM8471 REALmagic DVD/MPEG-4 A/V Decoder 0 -d 11058475 EM8475 REALmagic DVD/MPEG-4 A/V Decoder 0 -d 11058476 EM8476 REALmagic DVD/MPEG-4 A/V Decoder 0 -d 11058485 EM8485 REALmagic DVD/MPEG-4 A/V Decoder 0 -d 11058486 EM8486 REALmagic DVD/MPEG-4 A/V Decoder 0 -v 1106 VIA Technologies, Inc. 0 -d 11060102 Embedded VIA Ethernet Controller 0 -d 11060130 VT6305 1394.A Controller 0 -d 11060305 VT8363/8365 [KT133/KM133] 0 -s 1106030510438033 A7V Mainboard 0 -s 110603051043803e A7V-E Mainboard 0 -s 1106030510438042 A7V133/A7V133-C Mainboard 0 -s 11060305147ba401 KT7/KT7-RAID/KT7A/KT7A-RAID Mainboard 0 -d 11060391 VT8371 [KX133] 0 -d 11060501 VT8501 [Apollo MVP4] 0 -d 11060505 VT82C505 0 -d 11060561 VT82C576MV 0 Shares chip with :0576. The VT82C576M has :1571 instead of :0561. -d 11060571 VT82C586A/B/VT82C686/A/B/VT823x/A/C PIPC Bus Master IDE 0 -s 1106057110190985 P6VXA Motherboard 0 -s 1106057110190a81 L7VTA v1.0 Motherboard (KT400-8235) 0 -s 1106057110438052 VT8233A Bus Master ATA100/66/33 IDE 0 -s 110605711043808c A7V8X motherboard 0 -s 11060571104380a1 A7V8X-X motherboard rev. 1.01 0 -s 11060571104380ed A7V600 motherboard 0 -s 1106057111060571 VT82C586/B/VT82C686/A/B/VT8233/A/C/VT8235 PIPC Bus Master IDE 0 -s 1106057111790001 Magnia Z310 0 -s 110605711297f641 FX41 motherboard 0 -s 1106057114585002 GA-7VAX Mainboard 0 -s 1106057114627020 K8T NEO 2 motherboard 0 -s 11060571147b1407 KV8-MAX3 motherboard 0 -s 1106057118490571 K7VT2 motherboard 0 -d 11060576 VT82C576 3V [Apollo Master] 0 -d 11060585 VT82C585VP [Apollo VP1/VPX] 0 -d 11060586 VT82C586/A/B PCI-to-ISA [Apollo VP] 0 -s 1106058611060000 MVP3 ISA Bridge 0 -d 11060595 VT82C595 [Apollo VP2] 0 -d 11060596 VT82C596 ISA [Mobile South] 0 -s 1106059611060000 VT82C596/A/B PCI to ISA Bridge 0 -s 1106059614580596 VT82C596/A/B PCI to ISA Bridge 0 -d 11060597 VT82C597 [Apollo VP3] 0 -d 11060598 VT82C598 [Apollo MVP3] 0 -d 11060601 VT8601 [Apollo ProMedia] 0 -d 11060605 VT8605 [ProSavage PM133] 0 -s 110606051043802c CUV4X mainboard 0 -d 11060680 VT82C680 [Apollo P6] 0 -d 11060686 VT82C686 [Apollo Super South] 0 -s 1106068610190985 P6VXA Motherboard 0 -s 110606861043802c CUV4X mainboard 0 -s 1106068610438033 A7V Mainboard 0 -s 110606861043803e A7V-E Mainboard 0 -s 1106068610438040 A7M266 Mainboard 0 -s 1106068610438042 A7V133/A7V133-C Mainboard 0 -s 1106068611060000 VT82C686/A PCI to ISA Bridge 0 -s 1106068611060686 VT82C686/A PCI to ISA Bridge 0 -s 1106068611790001 Magnia Z310 0 -s 11060686147ba702 KG7-Lite Mainboard 0 -d 11060691 VT82C693A/694x [Apollo PRO133x] 0 -s 1106069110190985 P6VXA Motherboard 0 -s 1106069111790001 Magnia Z310 0 -s 1106069114580691 VT82C691 Apollo Pro System Controller 0 -d 11060693 VT82C693 [Apollo Pro Plus] 0 -d 11060698 VT82C693A [Apollo Pro133 AGP] 0 -d 11060926 VT82C926 [Amazon] 0 -d 11061000 VT82C570MV 0 -d 11061106 VT82C570MV 0 -d 11061571 VT82C576M/VT82C586 0 -d 11061595 VT82C595/97 [Apollo VP2/97] 0 -d 11063022 CLE266 0 -d 11063038 VT82xxxxx UHCI USB 1.1 Controller 0 This is *not* USB 2.0 as the existing entry suggests -s 1106303809251234 USB Controller 0 -s 1106303810190985 P6VXA Motherboard 0 -s 1106303810190a81 L7VTA v1.0 Motherboard (KT400-8235) 0 -s 110630381043808c VT6202 USB2.0 4 port controller 0 -s 11063038104380a1 A7V8X-X motherboard 0 -s 11063038104380ed A7V600 motherboard 0 -s 1106303811790001 Magnia Z310 0 -s 1106303814585004 GA-7VAX Mainboard 0 -s 1106303814627020 K8T NEO 2 motherboard 0 -s 11063038147b1407 KV8-MAX3 motherboard 0 -d 11063040 VT82C586B ACPI 0 -d 11063043 VT86C100A [Rhine] 0 -s 1106304310bd0000 VT86C100A Fast Ethernet Adapter 0 -s 1106304311060100 VT86C100A Fast Ethernet Adapter 0 -s 1106304311861400 DFE-530TX rev A 0 -d 11063044 IEEE 1394 Host Controller 0 -s 110630441025005a TravelMate 290 0 -s 1106304414581000 GA-7VT600-1394 Motherboard 0 -s 110630441462702d K8T NEO 2 motherboard 0 -d 11063050 VT82C596 Power Management 0 -d 11063051 VT82C596 Power Management 0 -d 11063053 VT6105M [Rhine-III] 0 -d 11063057 VT82C686 [Apollo Super ACPI] 0 -s 1106305710190985 P6VXA Motherboard 0 -s 1106305710438033 A7V Mainboard 0 -s 110630571043803e A7V-E Mainboard 0 -s 1106305710438040 A7M266 Mainboard 0 -s 1106305710438042 A7V133/A7V133-C Mainboard 0 -s 1106305711790001 Magnia Z310 0 -d 11063058 VT82C686 AC97 Audio Controller 0 -s 110630580e110097 SoundMax Digital Integrated Audio 0 -s 110630580e11b194 Soundmax integrated digital audio 0 -s 1106305810190985 P6VXA Motherboard 0 -s 1106305810431106 A7V133/A7V133-C Mainboard 0 -s 1106305811064511 Onboard Audio on EP7KXA 0 -s 1106305814587600 Onboard Audio 0 -s 1106305814623091 MS-6309 Onboard Audio 0 -s 1106305814623300 MS-6330 Onboard Audio 0 -s 1106305815dd7609 Onboard Audio 0 -d 11063059 VT8233/A/8235/8237 AC97 Audio Controller 0 -s 1106305910190a81 L7VTA v1.0 Motherboard (KT400-8235) 0 -s 1106305910438095 A7V8X Motherboard (Realtek ALC650 codec) 0 -s 11063059104380a1 A7V8X-X Motherboard 0 -s 11063059104380b0 A7V600 motherboard (ADI AD1980 codec [SoundMAX]) 0 -s 1106305911063059 L7VMM2 Motherboard 0 -s 1106305911064161 K7VT2 motherboard 0 -s 110630591297c160 FX41 motherboard (Realtek ALC650 codec) 0 -s 110630591458a002 GA-7VAX Onboard Audio (Realtek ALC650) 0 -s 1106305914620080 K8T NEO 2 motherboard 0 -s 1106305914623800 KT266 onboard audio 0 -s 11063059147b1407 KV8-MAX3 motherboard 0 -d 11063065 VT6102 [Rhine-II] 0 -s 11063065104380a1 A7V8X-X Motherboard 0 -s 1106306511060102 VT6102 [Rhine II] Embeded Ethernet Controller on VT8235 0 -s 1106306511861400 DFE-530TX rev A 0 -s 1106306511861401 DFE-530TX rev B 0 -s 1106306513b91421 LD-10/100AL PCI Fast Ethernet Adapter (rev.B) 0 -d 11063068 AC'97 Modem Controller 0 This hosts more than just the Intel 537 codec, it also hosts PCtel (SIL33) and SmartLink (SIL34) codecs -s 110630681462309e MS-6309 Saturn Motherboard 0 -d 11063074 VT8233 PCI to ISA Bridge 0 -s 1106307410438052 VT8233A 0 -d 11063091 VT8633 [Apollo Pro266] 0 -d 11063099 VT8366/A/7 [Apollo KT266/A/333] 0 -s 1106309910438064 A7V266-E Mainboard 0 -s 110630991043807f A7V333 Mainboard 0 -s 1106309918493099 K7VT2 motherboard 0 -d 11063101 VT8653 Host Bridge 0 -d 11063102 VT8662 Host Bridge 0 -d 11063103 VT8615 Host Bridge 0 -d 11063104 USB 2.0 0 -s 1106310410190a81 L7VTA v1.0 Motherboard (KT400-8235) 0 -s 110631041043808c A7V8X motherboard 0 -s 11063104104380a1 A7V8X-X motherboard rev 1.01 0 -s 11063104104380ed A7V600 motherboard 0 -s 110631041297f641 FX41 motherboard 0 -s 1106310414585004 GA-7VAX Mainboard 0 -s 1106310414627020 K8T NEO 2 motherboard 0 -s 11063104147b1407 KV8-MAX3 motherboard 0 -d 11063106 VT6105 [Rhine-III] 0 -s 1106310611861403 DFE-530TX rev C 0 -d 11063108 S3 Unichrome Pro VGA Adapter 0 -d 11063109 VT8233C PCI to ISA Bridge 0 -d 11063112 VT8361 [KLE133] Host Bridge 0 -d 11063116 VT8375 [KM266/KL266] Host Bridge 0 -s 110631161297f641 FX41 motherboard 0 -d 11063118 S3 Unichrome Pro VGA Adapter 0 -d 11063119 VT6120/VT6121/VT6122 Gigabit Ethernet Adapter 0 -d 11063122 VT8623 [Apollo CLE266] integrated CastleRock graphics 0 found on EPIA M6000/9000 mainboard -d 11063123 VT8623 [Apollo CLE266] 0 found on EPIA M6000/9000 mainboard -d 11063128 VT8753 [P4X266 AGP] 0 -d 11063133 VT3133 Host Bridge 0 -d 11063147 VT8233A ISA Bridge 0 -d 11063148 P4M266 Host Bridge 0 -d 11063149 VIA VT6420 SATA RAID Controller 0 -s 11063149104380ed A7V600 motherboard 0 -s 110631491458b003 GA-7VM400AM(F) Motherboard 0 -s 1106314914627020 K8T Neo 2 Motherboard 0 -d 11063156 P/KN266 Host Bridge 0 -d 11063164 VT6410 ATA133 RAID controller 0 on ASUS P4P800 -d 11063168 VT8374 P4X400 Host Controller/AGP Bridge 0 -d 11063177 VT8235 ISA Bridge 0 -s 1106317710190a81 L7VTA v1.0 Motherboard (KT400-8235) 0 -s 110631771043808c A7V8X motherboard 0 -s 11063177104380a1 A7V8X-X motherboard 0 -s 110631771297f641 FX41 motherboard 0 -s 1106317714585001 GA-7VAX Mainboard 0 -s 1106317718493177 K7VT2 motherboard 0 -d 11063188 VT8385 [K8T800 AGP] Host Bridge 0 -s 11063188147b1407 KV8-MAX3 motherboard 0 -d 11063189 VT8377 [KT400/KT600 AGP] Host Bridge 0 -s 110631891043807f A7V8X motherboard 0 -s 1106318914585000 GA-7VAX Mainboard 0 -d 11063204 K8M800 0 -d 11063205 VT8378 [KM400/A] Chipset Host Bridge 0 -s 1106320514585000 GA-7VM400M Motherboard 0 -d 11063227 VT8237 ISA bridge [KT600/K8T800 South] 0 -s 11063227104380ed A7V600 motherboard 0 -s 1106322711063227 DFI KT600-AL Motherboard 0 -s 1106322714585001 GA-7VT600 Motherboard 0 -s 11063227147b1407 KV8-MAX3 motherboard 0 -d 11064149 VIA VT6420 (ATA133) Controller 0 -d 11065030 VT82C596 ACPI [Apollo PRO] 0 -d 11066100 VT85C100A [Rhine II] 0 -d 11067204 K8M800 0 -d 11067205 VT8378 [S3 UniChrome] Integrated Video 0 S3 Graphics UniChromeâ„¢ 2D/3D Graphics with motion compensation -s 110672051458d000 Gigabyte GA-7VM400(A)M(F) Motherboard 0 -d 11068231 VT8231 [PCI-to-ISA Bridge] 0 -d 11068235 VT8235 ACPI 0 -d 11068305 VT8363/8365 [KT133/KM133 AGP] 0 -d 11068391 VT8371 [KX133 AGP] 0 -d 11068501 VT8501 [Apollo MVP4 AGP] 0 -d 11068596 VT82C596 [Apollo PRO AGP] 0 -d 11068597 VT82C597 [Apollo VP3 AGP] 0 -d 11068598 VT82C598/694x [Apollo MVP3/Pro133x AGP] 0 -s 1106859810190985 P6VXA Motherboard 0 -d 11068601 VT8601 [Apollo ProMedia AGP] 0 -d 11068605 VT8605 [PM133 AGP] 0 -d 11068691 VT82C691 [Apollo Pro] 0 -d 11068693 VT82C693 [Apollo Pro Plus] PCI Bridge 0 -d 1106b091 VT8633 [Apollo Pro266 AGP] 0 -d 1106b099 VT8366/A/7 [Apollo KT266/A/333 AGP] 0 -d 1106b101 VT8653 AGP Bridge 0 -d 1106b102 VT8362 AGP Bridge 0 -d 1106b103 VT8615 AGP Bridge 0 -d 1106b112 VT8361 [KLE133] AGP Bridge 0 -d 1106b168 VT8235 PCI Bridge 0 -d 1106b188 VT8237 PCI bridge [K8T800 South] 0 -s 1106b188147b1407 KV8-MAX3 motherboard 0 -d 1106b198 VT8237 PCI Bridge 0 -d 1106d104 VT8237 Integrated Fast Ethernet Controller 0 32-Bit PCI bus master Ethernet MAC with standard MII interface -v 1107 Stratus Computers 0 -d 11070576 VIA VT82C570MV [Apollo] (Wrong vendor ID!) 0 -v 1108 Proteon, Inc. 0 -d 11080100 p1690plus_AA 0 -d 11080101 p1690plus_AB 0 -d 11080105 P1690Plus 0 -d 11080108 P1690Plus 0 -d 11080138 P1690Plus 0 -d 11080139 P1690Plus 0 -d 1108013c P1690Plus 0 -d 1108013d P1690Plus 0 -v 1109 Cogent Data Technologies, Inc. 0 -d 11091400 EM110TX [EX110TX] 0 -v 110a Siemens Nixdorf AG 0 -d 110a0002 Pirahna 2-port 0 -d 110a0005 Tulip controller, power management, switch extender 0 -d 110a0006 FSC PINC (I/O-APIC) 0 -d 110a0015 FSC Multiprocessor Interrupt Controller 0 -d 110a001d FSC Copernicus Management Controller 0 -d 110a007b FSC Remote Service Controller, mailbox device 0 -d 110a007c FSC Remote Service Controller, shared memory device 0 -d 110a007d FSC Remote Service Controller, SMIC device 0 -d 110a2102 DSCC4 WAN adapter 0 -d 110a2104 Eicon Diva 2.02 compatible passive ISDN card 0 -d 110a3142 SIMATIC NET CP 5613A1 (Profibus Adapter) 0 -d 110a4021 SIMATIC NET CP 5512 (Profibus and MPI Cardbus Adapter) 0 -d 110a4029 SIMATIC NET CP 5613A2 (Profibus Adapter) 0 -d 110a4942 FPGA I-Bus Tracer for MBD 0 -d 110a6120 SZB6120 0 -v 110b Chromatic Research Inc. 0 -d 110b0001 Mpact Media Processor 0 -d 110b0004 Mpact 2 0 -v 110c Mini-Max Technology, Inc. 0 -v 110d Znyx Advanced Systems 0 -v 110e CPU Technology 0 -v 110f Ross Technology 0 -v 1110 Powerhouse Systems 0 -d 11106037 Firepower Powerized SMP I/O ASIC 0 -d 11106073 Firepower Powerized SMP I/O ASIC 0 -v 1111 Santa Cruz Operation 0 -v 1112 Osicom Technologies Inc 0 Also claimed to be RNS or Rockwell International, current PCISIG records list Osicom -d 11122200 FDDI Adapter 0 -d 11122300 Fast Ethernet Adapter 0 -d 11122340 4 Port Fast Ethernet Adapter 0 -d 11122400 ATM Adapter 0 -v 1113 Accton Technology Corporation 0 -d 11131211 SMC2-1211TX 0 -s 11131211103c1207 EN-1207D Fast Ethernet Adapter 0 -s 1113121111131211 EN-1207D Fast Ethernet Adapter 0 -d 11131216 EN-1216 Ethernet Adapter 0 -s 1113121611132242 EN2242 10/100 Ethernet Mini-PCI Card 0 -s 11131216111a1020 SpeedStream 1020 PCI 10/100 Ethernet Adaptor [EN-1207F-TX ?] 0 -d 11131217 EN-1217 Ethernet Adapter 0 -d 11135105 10Mbps Network card 0 -d 11139211 EN-1207D Fast Ethernet Adapter 0 -s 1113921111139211 EN-1207D Fast Ethernet Adapter 0 -d 11139511 21x4x DEC-Tulip compatible Fast Ethernet 0 -d 1113d301 CPWNA100 (Philips wireless PCMCIA) 0 -d 1113ec02 SMC 1244TX v3 0 -v 1114 Atmel Corporation 0 -d 11140506 802.11b Wireless Network Adaptor (at76c506) 0 -v 1115 3D Labs 0 -v 1116 Data Translation 0 -d 11160022 DT3001 0 -d 11160023 DT3002 0 -d 11160024 DT3003 0 -d 11160025 DT3004 0 -d 11160026 DT3005 0 -d 11160027 DT3001-PGL 0 -d 11160028 DT3003-PGL 0 -v 1117 Datacube, Inc 0 -d 11179500 Max-1C SVGA card 0 -d 11179501 Max-1C image processing 0 -v 1118 Berg Electronics 0 -v 1119 ICP Vortex Computersysteme GmbH 0 -d 11190000 GDT 6000/6020/6050 0 -d 11190001 GDT 6000B/6010 0 -d 11190002 GDT 6110/6510 0 -d 11190003 GDT 6120/6520 0 -d 11190004 GDT 6530 0 -d 11190005 GDT 6550 0 -d 11190006 GDT 6117/6517 0 -d 11190007 GDT 6127/6527 0 -d 11190008 GDT 6537 0 -d 11190009 GDT 6557/6557-ECC 0 -d 1119000a GDT 6115/6515 0 -d 1119000b GDT 6125/6525 0 -d 1119000c GDT 6535 0 -d 1119000d GDT 6555 0 -d 11190010 GDT 6115/6515 0 -d 11190011 GDT 6125/6525 0 -d 11190012 GDT 6535 0 -d 11190013 GDT 6555/6555-ECC 0 -d 11190100 GDT 6117RP/6517RP 0 -d 11190101 GDT 6127RP/6527RP 0 -d 11190102 GDT 6537RP 0 -d 11190103 GDT 6557RP 0 -d 11190104 GDT 6111RP/6511RP 0 -d 11190105 GDT 6121RP/6521RP 0 -d 11190110 GDT 6117RD/6517RD 0 -d 11190111 GDT 6127RD/6527RD 0 -d 11190112 GDT 6537RD 0 -d 11190113 GDT 6557RD 0 -d 11190114 GDT 6111RD/6511RD 0 -d 11190115 GDT 6121RD/6521RD 0 -d 11190118 GDT 6118RD/6518RD/6618RD 0 -d 11190119 GDT 6128RD/6528RD/6628RD 0 -d 1119011a GDT 6538RD/6638RD 0 -d 1119011b GDT 6558RD/6658RD 0 -d 11190120 GDT 6117RP2/6517RP2 0 -d 11190121 GDT 6127RP2/6527RP2 0 -d 11190122 GDT 6537RP2 0 -d 11190123 GDT 6557RP2 0 -d 11190124 GDT 6111RP2/6511RP2 0 -d 11190125 GDT 6121RP2/6521RP2 0 -d 11190136 GDT 6113RS/6513RS 0 -d 11190137 GDT 6123RS/6523RS 0 -d 11190138 GDT 6118RS/6518RS/6618RS 0 -d 11190139 GDT 6128RS/6528RS/6628RS 0 -d 1119013a GDT 6538RS/6638RS 0 -d 1119013b GDT 6558RS/6658RS 0 -d 1119013c GDT 6533RS/6633RS 0 -d 1119013d GDT 6543RS/6643RS 0 -d 1119013e GDT 6553RS/6653RS 0 -d 1119013f GDT 6563RS/6663RS 0 -d 11190166 GDT 7113RN/7513RN/7613RN 0 -d 11190167 GDT 7123RN/7523RN/7623RN 0 -d 11190168 GDT 7118RN/7518RN/7518RN 0 -d 11190169 GDT 7128RN/7528RN/7628RN 0 -d 1119016a GDT 7538RN/7638RN 0 -d 1119016b GDT 7558RN/7658RN 0 -d 1119016c GDT 7533RN/7633RN 0 -d 1119016d GDT 7543RN/7643RN 0 -d 1119016e GDT 7553RN/7653RN 0 -d 1119016f GDT 7563RN/7663RN 0 -d 111901d6 GDT 4x13RZ 0 -d 111901d7 GDT 4x23RZ 0 -d 111901f6 GDT 8x13RZ 0 -d 111901f7 GDT 8x23RZ 0 -d 111901fc GDT 8x33RZ 0 -d 111901fd GDT 8x43RZ 0 -d 111901fe GDT 8x53RZ 0 -d 111901ff GDT 8x63RZ 0 -d 11190210 GDT 6519RD/6619RD 0 -d 11190211 GDT 6529RD/6629RD 0 -d 11190260 GDT 7519RN/7619RN 0 -d 11190261 GDT 7529RN/7629RN 0 -d 111902ff GDT MAXRP 0 -d 11190300 GDT NEWRX 0 -v 111a Efficient Networks, Inc 0 -d 111a0000 155P-MF1 (FPGA) 0 -d 111a0002 155P-MF1 (ASIC) 0 -d 111a0003 ENI-25P ATM 0 -s 111a0003111a0000 ENI-25p Miniport ATM Adapter 0 -d 111a0005 SpeedStream (LANAI) 0 -s 111a0005111a0001 ENI-3010 ATM 0 -s 111a0005111a0009 ENI-3060 ADSL (VPI=0) 0 -s 111a0005111a0101 ENI-3010 ATM 0 -s 111a0005111a0109 ENI-3060CO ADSL (VPI=0) 0 -s 111a0005111a0809 ENI-3060 ADSL (VPI=0 or 8) 0 -s 111a0005111a0909 ENI-3060CO ADSL (VPI=0 or 8) 0 -s 111a0005111a0a09 ENI-3060 ADSL (VPI=<0..15>) 0 -d 111a0007 SpeedStream ADSL 0 -s 111a0007111a1001 ENI-3061 ADSL [ASIC] 0 -d 111a1203 SpeedStream 1023 Wireless PCI Adapter 0 -v 111b Teledyne Electronic Systems 0 -v 111c Tricord Systems Inc. 0 -d 111c0001 Powerbis Bridge 0 -v 111d Integrated Device Technology, Inc. 0 -d 111d0001 IDT77201/77211 155Mbps ATM SAR Controller [NICStAR] 0 -d 111d0003 IDT77222/77252 155Mbps ATM MICRO ABR SAR Controller 0 -d 111d0004 IDT77V252 155Mbps ATM MICRO ABR SAR Controller 0 -d 111d0005 IDT77V222 155Mbps ATM MICRO ABR SAR Controller 0 -v 111e Eldec 0 -v 111f Precision Digital Images 0 -d 111f4a47 Precision MX Video engine interface 0 -d 111f5243 Frame capture bus interface 0 -v 1120 EMC Corporation 0 -v 1121 Zilog 0 -v 1122 Multi-tech Systems, Inc. 0 -v 1123 Excellent Design, Inc. 0 -v 1124 Leutron Vision AG 0 -v 1125 Eurocore 0 -v 1126 Vigra 0 -v 1127 FORE Systems Inc 0 -d 11270200 ForeRunner PCA-200 ATM 0 -d 11270210 PCA-200PC 0 -d 11270250 ATM 0 -d 11270300 ForeRunner PCA-200EPC ATM 0 -d 11270310 ATM 0 -d 11270400 ForeRunnerHE ATM Adapter 0 -s 1127040011270400 ForeRunnerHE ATM 0 -v 1129 Firmworks 0 -v 112a Hermes Electronics Company, Ltd. 0 -v 112b Linotype - Hell AG 0 -v 112c Zenith Data Systems 0 -v 112d Ravicad 0 -v 112e Infomedia Microelectronics Inc. 0 -v 112f Imaging Technology Inc 0 -d 112f0000 MVC IC-PCI 0 -d 112f0001 MVC IM-PCI Video frame grabber/processor 0 -v 1130 Computervision 0 -v 1131 Philips Semiconductors 0 -d 11311561 USB 1.1 Host Controller 0 -d 11311562 USB 2.0 Host Controller 0 -d 11313400 SmartPCI56(UCB1500) 56K Modem 0 -d 11315400 TriMedia TM1000/1100 0 -d 11315402 TriMedia TM-1300 0 -d 11317130 SAA7130 Video Broadcast Decoder 0 -s 1131713051680138 LiveView FlyVideo 2000 0 -d 11317133 SAA713X Audio+video broadcast decoder 0 -s 1131713351680138 LifeView FlyVideo 3000 0 -s 1131713351680212 LifeView FlyTV Platinum mini 0 -d 11317134 SAA7134 0 PCI audio and video broadcast decoder (http://www.semiconductors.philips.com/pip/saa7134hl) -d 11317135 SAA7135 Audio+video broadcast decoder 0 -d 11317145 SAA7145 0 -d 11317146 SAA7146 0 -s 11317146110a0000 Fujitsu/Siemens DVB-C card rev1.5 0 -s 11317146110affff Fujitsu/Siemens DVB-C card rev1.5 0 -s 1131714611314f56 KNC1 DVB-S Budget 0 -s 1131714611314f61 Fujitsu-Siemens Activy DVB-S Budget 0 -s 11317146114b2003 DVRaptor Video Edit/Capture Card 0 -s 1131714611bd0006 DV500 Overlay 0 -s 1131714611bd000a DV500 Overlay 0 -s 1131714613c20000 Siemens/Technotrend/Hauppauge DVB card rev1.3 or rev1.5 0 -s 1131714613c20001 Technotrend/Hauppauge DVB card rev1.3 or rev1.6 0 -s 1131714613c20002 Technotrend/Hauppauge DVB card rev2.1 0 -s 1131714613c20003 Technotrend/Hauppauge DVB card rev2.1 0 -s 1131714613c20004 Technotrend/Hauppauge DVB card rev2.1 0 -s 1131714613c20006 Technotrend/Hauppauge DVB card rev1.3 or rev1.6 0 -s 1131714613c20008 Technotrend/Hauppauge DVB-T 0 -s 1131714613c2000a Octal/Technotrend DVB-C for iTV 0 -s 1131714613c21003 Technotrend-Budget / Hauppauge WinTV-NOVA-S DVB card 0 -s 1131714613c21004 Technotrend-Budget / Hauppauge WinTV-NOVA-C DVB card 0 -s 1131714613c21005 Technotrend-Budget / Hauppauge WinTV-NOVA-T DVB card 0 -s 1131714613c2100c Technotrend-Budget / Hauppauge WinTV-NOVA-CI DVB card 0 -s 1131714613c2100f Technotrend-Budget / Hauppauge WinTV-NOVA-CI DVB card 0 -s 1131714613c21011 Technotrend-Budget / Hauppauge WinTV-NOVA-T DVB card 0 -s 1131714613c21013 SATELCO Multimedia DVB 0 -s 1131714613c21102 Technotrend/Hauppauge DVB card rev2.1 0 -v 1132 Mitel Corp. 0 -v 1133 Eicon Networks Corporation 0 This is the new official company name. See disclaimer on www.eicon.com for details! -d 11337901 EiconCard S90 0 -d 11337902 EiconCard S90 0 -d 11337911 EiconCard S91 0 -d 11337912 EiconCard S91 0 -d 11337941 EiconCard S94 0 -d 11337942 EiconCard S94 0 -d 11337943 EiconCard S94 0 -d 11337944 EiconCard S94 0 -d 1133b921 EiconCard P92 0 -d 1133b922 EiconCard P92 0 -d 1133b923 EiconCard P92 0 -d 1133e001 Diva Pro 2.0 S/T 0 -d 1133e002 Diva 2.0 S/T PCI 0 -d 1133e003 Diva Pro 2.0 U 0 -d 1133e004 Diva 2.0 U PCI 0 -d 1133e005 Diva 2.01 S/T PCI 0 -d 1133e006 Diva CT S/T PCI 0 -d 1133e007 Diva CT U PCI 0 -d 1133e008 Diva CT Lite S/T PCI 0 -d 1133e009 Diva CT Lite U PCI 0 -d 1133e00a Diva ISDN+V.90 PCI 0 -d 1133e00b Diva 2.02 PCI S/T 0 -d 1133e00c Diva 2.02 PCI U 0 -d 1133e00d Diva ISDN Pro 3.0 PCI 0 -d 1133e00e Diva ISDN+CT S/T PCI Rev 2 0 -d 1133e010 Diva Server BRI-2M PCI 0 -s 1133e010110a0021 Fujitsu Siemens ISDN S0 0 -s 1133e01080010014 Diva Server BRI-2M PCI Cornet NQ 0 -d 1133e011 Diva Server BRI S/T Rev 2 0 -d 1133e012 Diva Server 4BRI-8M PCI 0 -s 1133e01280010014 Diva Server 4BRI-8M PCI Cornet NQ 0 -d 1133e013 Diva Server 4BRI Rev 2 0 -s 1133e01311331300 Diva Server V-4BRI-8 0 -s 1133e0131133e013 Diva Server 4BRI-8M 2.0 PCI 0 -s 1133e01380010014 Diva Server 4BRI-8M 2.0 PCI Cornet NQ 0 -d 1133e014 Diva Server PRI-30M PCI 0 -s 1133e01400080100 Diva Server PRI-30M PCI 0 -s 1133e01480010014 Diva Server PRI-30M PCI Cornet NQ 0 -d 1133e015 DIVA Server PRI Rev 2 0 -s 1133e0151133e015 Diva Server PRI 2.0 PCI 0 -s 1133e01580010014 Diva Server PRI 2.0 PCI Cornet NQ 0 -d 1133e016 Diva Server Voice 4BRI PCI 0 -s 1133e01680010014 Diva Server PRI Cornet NQ 0 -d 1133e017 Diva Server Voice 4BRI Rev 2 0 -s 1133e0171133e017 Diva Server Voice 4BRI-8M 2.0 PCI 0 -s 1133e01780010014 Diva Server Voice 4BRI-8M 2.0 PCI Cornet NQ 0 -d 1133e018 Diva Server BRI-2M 2.0 PCI 0 -s 1133e01811331800 Diva Server V-BRI-2 0 -s 1133e0181133e018 Diva Server BRI-2M 2.0 PCI 0 -s 1133e01880010014 Diva Server BRI-2M 2.0 PCI Cornet NQ 0 -d 1133e019 Diva Server Voice PRI Rev 2 0 -s 1133e0191133e019 Diva Server Voice PRI 2.0 PCI 0 -s 1133e01980010014 Diva Server Voice PRI 2.0 PCI Cornet NQ 0 -d 1133e01a Diva Server 2FX 0 -d 1133e01b Diva Server Voice BRI-2M 2.0 PCI 0 -s 1133e01b1133e01b Diva Server Voice BRI-2M 2.0 PCI 0 -s 1133e01b80010014 Diva Server Voice BRI-2M 2.0 PCI Cornet NQ 0 -d 1133e01c Diva Server PRI Rev 3 0 -s 1133e01c11331c01 Diva Server PRI/E1/T1-8 0 -s 1133e01c11331c02 Diva Server PRI/T1-24 0 -s 1133e01c11331c03 Diva Server PRI/E1-30 0 -s 1133e01c11331c04 Diva Server PRI/E1/T1 0 -s 1133e01c11331c05 Diva Server V-PRI/T1-24 0 -s 1133e01c11331c06 Diva Server V-PRI/E1-30 0 -s 1133e01c11331c07 Diva Server PRI/E1/T1-8 Cornet NQ 0 -s 1133e01c11331c08 Diva Server PRI/T1-24 Cornet NQ 0 -s 1133e01c11331c09 Diva Server PRI/E1-30 Cornet NQ 0 -s 1133e01c11331c0a Diva Server PRI/E1/T1 Cornet NQ 0 -s 1133e01c11331c0b Diva Server V-PRI/T1-24 Cornet NQ 0 -s 1133e01c11331c0c Diva Server V-PRI/E1-30 Cornet NQ 0 -d 1133e01e Diva Server 2PRI 0 -s 1133e01e11331e00 Diva Server V-2PRI/E1-60 0 -s 1133e01e11331e01 Diva Server V-2PRI/T1-48 0 -s 1133e01e11331e02 Diva Server 2PRI/E1-60 0 -s 1133e01e11331e03 Diva Server 2PRI/T1-48 0 -d 1133e020 Diva Server 4PRI 0 -s 1133e02011332000 Diva Server V-4PRI/E1-120 0 -s 1133e02011332001 Diva Server V-4PRI/T1-96 0 -s 1133e02011332002 Diva Server 4PRI/E1-120 0 -s 1133e02011332003 Diva Server 4PRI/T1-96 0 -d 1133e024 Diva Server Analog-4P 0 -s 1133e02411332400 Diva Server V-Analog-4P 0 -s 1133e0241133e024 Diva Server Analog-4P 0 -d 1133e028 Diva Server Analog-8P 0 -s 1133e02811332800 Diva Server V-Analog-8P 0 -s 1133e0281133e028 Diva Server Analog-8P 0 -v 1134 Mercury Computer Systems 0 -d 11340001 Raceway Bridge 0 -d 11340002 Dual PCI to RapidIO Bridge 0 -v 1135 Fuji Xerox Co Ltd 0 -d 11350001 Printer controller 0 -v 1136 Momentum Data Systems 0 -v 1137 Cisco Systems Inc 0 -v 1138 Ziatech Corporation 0 -d 11388905 8905 [STD 32 Bridge] 0 -v 1139 Dynamic Pictures, Inc 0 -d 11390001 VGA Compatable 3D Graphics 0 -v 113a FWB Inc 0 -v 113b Network Computing Devices 0 -v 113c Cyclone Microsystems, Inc. 0 -d 113c0000 PCI-9060 i960 Bridge 0 -d 113c0001 PCI-SDK [PCI i960 Evaluation Platform] 0 -d 113c0911 PCI-911 [i960Jx-based Intelligent I/O Controller] 0 -d 113c0912 PCI-912 [i960CF-based Intelligent I/O Controller] 0 -d 113c0913 PCI-913 0 -d 113c0914 PCI-914 [I/O Controller w/ secondary PCI bus] 0 -v 113d Leading Edge Products Inc 0 -v 113e Sanyo Electric Co - Computer Engineering Dept 0 -v 113f Equinox Systems, Inc. 0 -d 113f0808 SST-64P Adapter 0 -d 113f1010 SST-128P Adapter 0 -d 113f80c0 SST-16P DB Adapter 0 -d 113f80c4 SST-16P RJ Adapter 0 -d 113f80c8 SST-16P Adapter 0 -d 113f8888 SST-4P Adapter 0 -d 113f9090 SST-8P Adapter 0 -v 1140 Intervoice Inc 0 -v 1141 Crest Microsystem Inc 0 -v 1142 Alliance Semiconductor Corporation 0 -d 11423210 AP6410 0 -d 11426422 ProVideo 6422 0 -d 11426424 ProVideo 6424 0 -d 11426425 ProMotion AT25 0 -d 1142643d ProMotion AT3D 0 -v 1143 NetPower, Inc 0 -v 1144 Cincinnati Milacron 0 -d 11440001 Noservo controller 0 -v 1145 Workbit Corporation 0 -d 11458007 NinjaSCSI-32 Workbit 0 -d 1145f007 NinjaSCSI-32 KME 0 -d 1145f010 NinjaSCSI-32 Workbit 0 -d 1145f012 NinjaSCSI-32 Logitec 0 -d 1145f013 NinjaSCSI-32 Logitec 0 -d 1145f015 NinjaSCSI-32 Melco 0 -v 1146 Force Computers 0 -v 1147 Interface Corp 0 -v 1148 SysKonnect 0 Formerly (Schneider & Koch) -d 11484000 FDDI Adapter 0 -s 114840000e11b03b Netelligent 100 FDDI DAS Fibre SC 0 -s 114840000e11b03c Netelligent 100 FDDI SAS Fibre SC 0 -s 114840000e11b03d Netelligent 100 FDDI DAS UTP 0 -s 114840000e11b03e Netelligent 100 FDDI SAS UTP 0 -s 114840000e11b03f Netelligent 100 FDDI SAS Fibre MIC 0 -s 1148400011485521 FDDI SK-5521 (SK-NET FDDI-UP) 0 -s 1148400011485522 FDDI SK-5522 (SK-NET FDDI-UP DAS) 0 -s 1148400011485541 FDDI SK-5541 (SK-NET FDDI-FP) 0 -s 1148400011485543 FDDI SK-5543 (SK-NET FDDI-LP) 0 -s 1148400011485544 FDDI SK-5544 (SK-NET FDDI-LP DAS) 0 -s 1148400011485821 FDDI SK-5821 (SK-NET FDDI-UP64) 0 -s 1148400011485822 FDDI SK-5822 (SK-NET FDDI-UP64 DAS) 0 -s 1148400011485841 FDDI SK-5841 (SK-NET FDDI-FP64) 0 -s 1148400011485843 FDDI SK-5843 (SK-NET FDDI-LP64) 0 -s 1148400011485844 FDDI SK-5844 (SK-NET FDDI-LP64 DAS) 0 -d 11484200 Token Ring adapter 0 -d 11484300 SK-98xx Gigabit Ethernet Server Adapter 0 -s 1148430011489821 SK-9821 Gigabit Ethernet Server Adapter (SK-NET GE-T) 0 -s 1148430011489822 SK-9822 Gigabit Ethernet Server Adapter (SK-NET GE-T dual link) 0 -s 1148430011489841 SK-9841 Gigabit Ethernet Server Adapter (SK-NET GE-LX) 0 -s 1148430011489842 SK-9842 Gigabit Ethernet Server Adapter (SK-NET GE-LX dual link) 0 -s 1148430011489843 SK-9843 Gigabit Ethernet Server Adapter (SK-NET GE-SX) 0 -s 1148430011489844 SK-9844 Gigabit Ethernet Server Adapter (SK-NET GE-SX dual link) 0 -s 1148430011489861 SK-9861 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition) 0 -s 1148430011489862 SK-9862 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition dual link) 0 -s 1148430011489871 SK-9871 Gigabit Ethernet Server Adapter (SK-NET GE-ZX) 0 -s 1148430011489872 SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link) 0 -s 1148430012592970 AT-2970SX Gigabit Ethernet Adapter 0 -s 1148430012592971 AT-2970LX Gigabit Ethernet Adapter 0 -s 1148430012592972 AT-2970TX Gigabit Ethernet Adapter 0 -s 1148430012592973 AT-2971SX Gigabit Ethernet Adapter 0 -s 1148430012592974 AT-2971T Gigabit Ethernet Adapter 0 -s 1148430012592975 AT-2970SX/2SC Gigabit Ethernet Adapter 0 -s 1148430012592976 AT-2970LX/2SC Gigabit Ethernet Adapter 0 -s 1148430012592977 AT-2970TX/2TX Gigabit Ethernet Adapter 0 -d 11484320 SK-98xx V2.0 Gigabit Ethernet Adapter 0 -s 1148432011480121 Marvell RDK-8001 Adapter 0 -s 1148432011480221 Marvell RDK-8002 Adapter 0 -s 1148432011480321 Marvell RDK-8003 Adapter 0 -s 1148432011480421 Marvell RDK-8004 Adapter 0 -s 1148432011480621 Marvell RDK-8006 Adapter 0 -s 1148432011480721 Marvell RDK-8007 Adapter 0 -s 1148432011480821 Marvell RDK-8008 Adapter 0 -s 1148432011480921 Marvell RDK-8009 Adapter 0 -s 1148432011481121 Marvell RDK-8011 Adapter 0 -s 1148432011481221 Marvell RDK-8012 Adapter 0 -s 1148432011483221 SK-9521 V2.0 10/100/1000Base-T Adapter 0 -s 1148432011485021 SK-9821 V2.0 Gigabit Ethernet 10/100/1000Base-T Adapter 0 -s 1148432011485041 SK-9841 V2.0 Gigabit Ethernet 1000Base-LX Adapter 0 -s 1148432011485043 SK-9843 V2.0 Gigabit Ethernet 1000Base-SX Adapter 0 -s 1148432011485051 SK-9851 V2.0 Gigabit Ethernet 1000Base-SX Adapter 0 -s 1148432011485061 SK-9861 V2.0 Gigabit Ethernet 1000Base-SX Adapter 0 -s 1148432011485071 SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter 0 -s 1148432011489521 SK-9521 10/100/1000Base-T Adapter 0 -d 11484400 SK-9Dxx Gigabit Ethernet Adapter 0 -d 11484500 SK-9Mxx Gigabit Ethernet Adapter 0 -d 11489e00 SK-9Exx 10/100/1000Base-T Adapter 0 -s 11489e0011482100 SK-9E21 Server Adapter 0 -s 11489e00114821d0 SK-9E21D 10/100/1000Base-T Adapter 0 -s 11489e0011482200 SK-9E22 Server Adapter 0 -s 11489e0011488100 SK-9E81 Server Adapter 0 -s 11489e0011488200 SK-9E82 Server Adapter 0 -s 11489e0011489100 SK-9E91 Server Adapter 0 -s 11489e0011489200 SK-9E92 Server Adapter 0 -v 1149 Win System Corporation 0 -v 114a VMIC 0 -d 114a5579 VMIPCI-5579 (Reflective Memory Card) 0 -d 114a5587 VMIPCI-5587 (Reflective Memory Card) 0 -d 114a6504 VMIC PCI 7755 FPGA 0 -d 114a7587 VMIVME-7587 0 -v 114b Canopus Co., Ltd 0 -v 114c Annabooks 0 -v 114d IC Corporation 0 -v 114e Nikon Systems Inc 0 -v 114f Digi International 0 -d 114f0002 AccelePort EPC 0 -d 114f0003 RightSwitch SE-6 0 -d 114f0004 AccelePort Xem 0 -d 114f0005 AccelePort Xr 0 -d 114f0006 AccelePort Xr,C/X 0 -d 114f0009 AccelePort Xr/J 0 -d 114f000a AccelePort EPC/J 0 -d 114f000c DataFirePRIme T1 (1-port) 0 -d 114f000d SyncPort 2-Port (x.25/FR) 0 -d 114f0011 AccelePort 8r EIA-232 (IBM) 0 -d 114f0012 AccelePort 8r EIA-422 0 -d 114f0013 AccelePort Xr 0 -d 114f0014 AccelePort 8r EIA-422 0 -d 114f0015 AccelePort Xem 0 -d 114f0016 AccelePort EPC/X 0 -d 114f0017 AccelePort C/X 0 -d 114f001a DataFirePRIme E1 (1-port) 0 -d 114f001b AccelePort C/X (IBM) 0 -d 114f001d DataFire RAS T1/E1/PRI 0 -s 114f001d114f0050 DataFire RAS E1 Adapter 0 -s 114f001d114f0051 DataFire RAS Dual E1 Adapter 0 -s 114f001d114f0052 DataFire RAS T1 Adapter 0 -s 114f001d114f0053 DataFire RAS Dual T1 Adapter 0 -d 114f0023 AccelePort RAS 0 -d 114f0024 DataFire RAS B4 ST/U 0 -s 114f0024114f0030 DataFire RAS BRI U Adapter 0 -s 114f0024114f0031 DataFire RAS BRI S/T Adapter 0 -d 114f0026 AccelePort 4r 920 0 -d 114f0027 AccelePort Xr 920 0 -d 114f0028 ClassicBoard 4 0 -d 114f0029 ClassicBoard 8 0 -d 114f0034 AccelePort 2r 920 0 -d 114f0035 DataFire DSP T1/E1/PRI cPCI 0 -d 114f0040 AccelePort Xp 0 -d 114f0042 AccelePort 2p 0 -d 114f0043 AccelePort 4p 0 -d 114f0044 AccelePort 8p 0 -d 114f0045 AccelePort 16p 0 -d 114f004e AccelePort 32p 0 -d 114f0070 Datafire Micro V IOM2 (Europe) 0 -d 114f0071 Datafire Micro V (Europe) 0 -d 114f0072 Datafire Micro V IOM2 (North America) 0 -d 114f0073 Datafire Micro V (North America) 0 -d 114f00b0 Digi Neo 4 0 -d 114f00b1 Digi Neo 8 0 -d 114f00c8 Digi Neo 2 DB9 0 -d 114f00c9 Digi Neo 2 DB9 PRI 0 -d 114f00ca Digi Neo 2 RJ45 0 -d 114f00cb Digi Neo 2 RJ45 PRI 0 -d 114f00d0 ClassicBoard 4 422 0 -d 114f00d1 ClassicBoard 8 422 0 -d 114f6001 Avanstar 0 -v 1150 Thinking Machines Corp 0 -v 1151 JAE Electronics Inc. 0 -v 1152 Megatek 0 -v 1153 Land Win Electronic Corp 0 -v 1154 Melco Inc 0 -v 1155 Pine Technology Ltd 0 -v 1156 Periscope Engineering 0 -v 1157 Avsys Corporation 0 -v 1158 Voarx R & D Inc 0 -d 11583011 Tokenet/vg 1001/10m anylan 0 -d 11589050 Lanfleet/Truevalue 0 -d 11589051 Lanfleet/Truevalue 0 -v 1159 Mutech Corp 0 -d 11590001 MV-1000 0 -v 115a Harlequin Ltd 0 -v 115b Parallax Graphics 0 -v 115c Photron Ltd. 0 -v 115d Xircom 0 -d 115d0003 Cardbus Ethernet 10/100 0 -s 115d000310140181 10/100 EtherJet Cardbus Adapter 0 -s 115d000310141181 10/100 EtherJet Cardbus Adapter 0 -s 115d000310148181 10/100 EtherJet Cardbus Adapter 0 -s 115d000310149181 10/100 EtherJet Cardbus Adapter 0 -s 115d0003115d0181 Cardbus Ethernet 10/100 0 -s 115d0003115d1181 Cardbus Ethernet 10/100 0 -s 115d000311790181 Cardbus Ethernet 10/100 0 -s 115d000380868181 EtherExpress PRO/100 Mobile CardBus 32 Adapter 0 -s 115d000380869181 EtherExpress PRO/100 Mobile CardBus 32 Adapter 0 -d 115d0005 Cardbus Ethernet 10/100 0 -s 115d000510140182 10/100 EtherJet Cardbus Adapter 0 -s 115d000510141182 10/100 EtherJet Cardbus Adapter 0 -s 115d0005115d0182 Cardbus Ethernet 10/100 0 -s 115d0005115d1182 Cardbus Ethernet 10/100 0 -d 115d0007 Cardbus Ethernet 10/100 0 -s 115d000710140182 10/100 EtherJet Cardbus Adapter 0 -s 115d000710141182 10/100 EtherJet Cardbus Adapter 0 -s 115d0007115d0182 Cardbus Ethernet 10/100 0 -s 115d0007115d1182 Cardbus Ethernet 10/100 0 -d 115d000b Cardbus Ethernet 10/100 0 -s 115d000b10140183 10/100 EtherJet Cardbus Adapter 0 -s 115d000b115d0183 Cardbus Ethernet 10/100 0 -d 115d000c Mini-PCI V.90 56k Modem 0 -d 115d000f Cardbus Ethernet 10/100 0 -s 115d000f10140183 10/100 EtherJet Cardbus Adapter 0 -s 115d000f115d0183 Cardbus Ethernet 10/100 0 -d 115d00d4 Mini-PCI K56Flex Modem 0 -d 115d0101 Cardbus 56k modem 0 -s 115d0101115d1081 Cardbus 56k Modem 0 -d 115d0103 Cardbus Ethernet + 56k Modem 0 -s 115d010310149181 Cardbus 56k Modem 0 -s 115d010311151181 Cardbus Ethernet 100 + 56k Modem 0 -s 115d0103115d1181 CBEM56G-100 Ethernet + 56k Modem 0 -s 115d010380869181 PRO/100 LAN + Modem56 CardBus 0 -v 115e Peer Protocols Inc 0 -v 115f Maxtor Corporation 0 -v 1160 Megasoft Inc 0 -v 1161 PFU Limited 0 -v 1162 OA Laboratory Co Ltd 0 -v 1163 Rendition 0 -d 11630001 Verite 1000 0 -d 11632000 Verite V2000/V2100/V2200 0 -s 1163200010922000 Stealth II S220 0 -v 1164 Advanced Peripherals Technologies 0 -v 1165 Imagraph Corporation 0 -d 11650001 Motion TPEG Recorder/Player with audio 0 -v 1166 ServerWorks 0 -d 11660000 CMIC-LE 0 -d 11660005 CNB20-LE Host Bridge 0 -d 11660006 CNB20HE Host Bridge 0 -d 11660007 CNB20-LE Host Bridge 0 -d 11660008 CNB20HE Host Bridge 0 -d 11660009 CNB20LE Host Bridge 0 -d 11660010 CIOB30 0 -d 11660011 CMIC-HE 0 -d 11660012 CMIC-WS Host Bridge (GC-LE chipset) 0 -d 11660013 CNB20-HE Host Bridge 0 -d 11660014 CMIC-LE Host Bridge (GC-LE chipset) 0 -d 11660015 CMIC-GC Host Bridge 0 -d 11660016 CMIC-GC Host Bridge 0 -d 11660017 GCNB-LE Host Bridge 0 -d 11660101 CIOB-X2 PCI-X I/O Bridge 0 -d 11660110 CIOB-E I/O Bridge with Gigabit Ethernet 0 -d 11660200 OSB4 South Bridge 0 -d 11660201 CSB5 South Bridge 0 -s 116602014c531080 CT8 mainboard 0 -d 11660203 CSB6 South Bridge 0 -d 11660211 OSB4 IDE Controller 0 -d 11660212 CSB5 IDE Controller 0 -s 116602124c531080 CT8 mainboard 0 -d 11660213 CSB6 RAID/IDE Controller 0 -d 11660217 CSB6 IDE Controller 0 -d 11660220 OSB4/CSB5 OHCI USB Controller 0 -s 116602204c531080 CT8 mainboard 0 -d 11660221 CSB6 OHCI USB Controller 0 -d 11660225 CSB5 LPC bridge 0 -s 116602254c531080 CT8 mainboard 0 cancelled -d 11660227 GCLE-2 Host Bridge 0 -d 11660230 CSB5 LPC bridge 0 -s 116602304c531080 CT8 mainboard 0 -d 11660240 K2 SATA 0 -v 1167 Mutoh Industries Inc 0 -v 1168 Thine Electronics Inc 0 -v 1169 Centre for Development of Advanced Computing 0 -v 116a Polaris Communications 0 -d 116a6100 Bus/Tag Channel 0 -d 116a6800 Escon Channel 0 -d 116a7100 Bus/Tag Channel 0 -d 116a7800 Escon Channel 0 -v 116b Connectware Inc 0 -v 116c Intelligent Resources Integrated Systems 0 -v 116d Martin-Marietta 0 -v 116e Electronics for Imaging 0 -v 116f Workstation Technology 0 -v 1170 Inventec Corporation 0 -v 1171 Loughborough Sound Images Plc 0 -v 1172 Altera Corporation 0 -v 1173 Adobe Systems, Inc 0 -v 1174 Bridgeport Machines 0 -v 1175 Mitron Computer Inc. 0 -v 1176 SBE Incorporated 0 -v 1177 Silicon Engineering 0 -v 1178 Alfa, Inc. 0 -d 1178afa1 Fast Ethernet Adapter 0 -v 1179 Toshiba America Info Systems 0 -d 11790103 EX-IDE Type-B 0 -d 11790404 DVD Decoder card 0 -d 11790406 Tecra Video Capture device 0 -d 11790407 DVD Decoder card (Version 2) 0 -d 11790601 601 0 -d 11790603 ToPIC95 PCI to CardBus Bridge for Notebooks 0 -d 1179060a ToPIC95 0 -d 1179060f ToPIC97 0 -d 11790617 ToPIC100 PCI to Cardbus Bridge with ZV Support 0 -d 11790618 CPU to PCI and PCI to ISA bridge 0 -d 11790701 FIR Port 0 Claimed to be Lucent DSP1645 [Mars], but that's apparently incorrect. Does anyone know the correct ID? -d 11790804 TC6371AF SmartMedia Controller 0 -d 11790805 SD TypA Controller 0 -d 11790d01 FIR Port Type-DO 0 -s 11790d0111790001 FIR Port Type-DO 0 -v 117a A-Trend Technology 0 -v 117b L G Electronics, Inc. 0 -v 117c Atto Technology 0 -v 117d Becton & Dickinson 0 -v 117e T/R Systems 0 -v 117f Integrated Circuit Systems 0 -v 1180 Ricoh Co Ltd 0 -d 11800465 RL5c465 0 -d 11800466 RL5c466 0 -d 11800475 RL5c475 0 -s 11800475144dc006 vpr Matrix 170B4 CardBus bridge 0 -d 11800476 RL5c476 II 0 -s 1180047610140185 ThinkPad A/T/X Series 0 -s 11800476104d80df Vaio PCG-FX403 0 -s 11800476104d80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP 0 -s 1180047614ef0220 PCD-RP-220S 0 -d 11800477 RL5c477 0 -d 11800478 RL5c478 0 -s 1180047810140184 ThinkPad A30p (2653-64G) 0 -d 11800522 R5C522 IEEE 1394 Controller 0 -s 11800522101401cf ThinkPad A30p (2653-64G) 0 -d 11800551 R5C551 IEEE 1394 Controller 0 -s 11800551144dc006 vpr Matrix 170B4 0 -d 11800552 R5C552 IEEE 1394 Controller 0 -s 1180055210140511 ThinkPad A/T/X Series 0 -v 1181 Telmatics International 0 -v 1183 Fujikura Ltd 0 -v 1184 Forks Inc 0 -v 1185 Dataworld International Ltd 0 -v 1186 D-Link System Inc 0 -d 11860100 DC21041 0 -d 11861002 DL10050 Sundance Ethernet 0 -s 1186100211861002 DFE-550TX 0 -s 1186100211861012 DFE-580TX 0 -d 11861025 AirPlus Xtreme G DWL-G650 Adapter 0 -d 11861026 AirXpert DWL-AG650 Wireless Cardbus Adapter 0 -d 11861043 AirXpert DWL-AG650 Wireless Cardbus Adapter 0 -d 11861300 RTL8139 Ethernet 0 -s 1186130011861300 DFE-538TX 10/100 Ethernet Adapter 0 -s 1186130011861301 DFE-530TX+ 10/100 Ethernet Adapter 0 -d 11861340 DFE-690TXD CardBus PC Card 0 -d 11861541 DFE-680TXD CardBus PC Card 0 -d 11861561 DRP-32TXD Cardbus PC Card 0 -d 11862027 AirPlus Xtreme G DWL-G520 Adapter 0 -d 11863203 AirPlus Xtreme G DWL-G520 Adapter 0 -d 11863300 DWL-510 2.4GHz Wireless PCI Adapter 0 -d 11863a03 AirPro DWL-A650 Wireless Cardbus Adapter(rev.B) 0 -d 11863a04 AirPro DWL-AB650 Multimode Wireless Cardbus Adapter 0 -d 11863a05 AirPro DWL-AB520 Multimode Wireless PCI Adapter 0 -d 11863a07 AirXpert DWL-AG650 Wireless Cardbus Adapter 0 -d 11863a08 AirXpert DWL-AG520 Wireless PCI Adapter 0 -d 11863a10 AirXpert DWL-AG650 Wireless Cardbus Adapter(rev.B) 0 -d 11863a11 AirXpert DWL-AG520 Wireless PCI Adapter(rev.B) 0 -d 11863a12 AirPlus DWL-G650 Wireless Cardbus Adapter(rev.C) 0 -d 11863a13 AirPlus DWL-G520 Wireless PCI Adapter(rev.B) 0 -d 11863a14 AirPremier DWL-AG530 Wireless PCI Adapter 0 -d 11863a63 AirXpert DWL-AG660 Wireless Cardbus Adapter 0 -d 11863b05 DWL-G650+ CardBus PC Card 0 -d 11864000 DL2000-based Gigabit Ethernet 0 -d 11864c00 Gigabit Ethernet Adapter 0 -s 11864c0011864c00 DGE-530T Gigabit Ethernet Adapter 0 -d 11868400 D-Link DWL-650+ CardBus PC Card 0 -v 1187 Advanced Technology Laboratories, Inc. 0 -v 1188 Shima Seiki Manufacturing Ltd. 0 -v 1189 Matsushita Electronics Co Ltd 0 -v 118a Hilevel Technology 0 -v 118b Hypertec Pty Limited 0 -v 118c Corollary, Inc 0 -d 118c0014 PCIB [C-bus II to PCI bus host bridge chip] 0 -d 118c1117 Intel 8-way XEON Profusion Chipset [Cache Coherency Filter] 0 -v 118d BitFlow Inc 0 -d 118d0001 Raptor-PCI framegrabber 0 -d 118d0012 Model 12 Road Runner Frame Grabber 0 -d 118d0014 Model 14 Road Runner Frame Grabber 0 -d 118d0024 Model 24 Road Runner Frame Grabber 0 -d 118d0044 Model 44 Road Runner Frame Grabber 0 -d 118d0112 Model 12 Road Runner Frame Grabber 0 -d 118d0114 Model 14 Road Runner Frame Grabber 0 -d 118d0124 Model 24 Road Runner Frame Grabber 0 -d 118d0144 Model 44 Road Runner Frame Grabber 0 -d 118d0212 Model 12 Road Runner Frame Grabber 0 -d 118d0214 Model 14 Road Runner Frame Grabber 0 -d 118d0224 Model 24 Road Runner Frame Grabber 0 -d 118d0244 Model 44 Road Runner Frame Grabber 0 -d 118d0312 Model 12 Road Runner Frame Grabber 0 -d 118d0314 Model 14 Road Runner Frame Grabber 0 -d 118d0324 Model 24 Road Runner Frame Grabber 0 -d 118d0344 Model 44 Road Runner Frame Grabber 0 -v 118e Hermstedt GmbH 0 -v 118f Green Logic 0 -v 1190 Tripace 0 -d 1190c731 TP-910/920/940 PCI Ultra(Wide) SCSI Adapter 0 -v 1191 Artop Electronic Corp 0 -d 11910003 SCSI Cache Host Adapter 0 -d 11910004 ATP8400 0 -d 11910005 ATP850UF 0 -d 11910006 ATP860 NO-BIOS 0 -d 11910007 ATP860 0 -d 11910008 ATP865 NO-ROM 0 -d 11910009 ATP865 0 -d 11918002 AEC6710 SCSI-2 Host Adapter 0 -d 11918010 AEC6712UW SCSI 0 -d 11918020 AEC6712U SCSI 0 -d 11918030 AEC6712S SCSI 0 -d 11918040 AEC6712D SCSI 0 -d 11918050 AEC6712SUW SCSI 0 -v 1192 Densan Company Ltd 0 -v 1193 Zeitnet Inc. 0 -d 11930001 1221 0 -d 11930002 1225 0 -v 1194 Toucan Technology 0 -v 1195 Ratoc System Inc 0 -v 1196 Hytec Electronics Ltd 0 -v 1197 Gage Applied Sciences, Inc. 0 -d 1197010c CompuScope 82G 8bit 2GS/s Analog Input Card 0 -v 1198 Lambda Systems Inc 0 -v 1199 Attachmate Corporation 0 -v 119a Mind Share, Inc. 0 -v 119b Omega Micro Inc. 0 -d 119b1221 82C092G 0 -v 119c Information Technology Inst. 0 -v 119d Bug, Inc. Sapporo Japan 0 -v 119e Fujitsu Microelectronics Ltd. 0 -d 119e0001 FireStream 155 0 -d 119e0003 FireStream 50 0 -v 119f Bull HN Information Systems 0 -v 11a0 Convex Computer Corporation 0 -v 11a1 Hamamatsu Photonics K.K. 0 -v 11a2 Sierra Research and Technology 0 -v 11a3 Deuretzbacher GmbH & Co. Eng. KG 0 -v 11a4 Barco Graphics NV 0 -v 11a5 Microunity Systems Eng. Inc 0 -v 11a6 Pure Data Ltd. 0 -v 11a7 Power Computing Corp. 0 -v 11a8 Systech Corp. 0 -v 11a9 InnoSys Inc. 0 -d 11a94240 AMCC S933Q Intelligent Serial Card 0 -v 11aa Actel 0 -v 11ab Marvell Technology Group Ltd. 0 Formerly Galileo Technology, Inc. -d 11ab0146 GT-64010/64010A System Controller 0 -d 11ab138f W8300 802.11 Adapter (rev 07) 0 -d 11ab1fa6 Marvell W8300 802.11 Adapter 0 -d 11ab4320 Gigabit Ethernet Controller 0 -s 11ab432010190f38 Marvell 88E8001 Gigabit Ethernet Controller (ECS) 0 -s 11ab432010198001 Marvell 88E8001 Gigabit Ethernet Controller (ECS) 0 -s 11ab43201043173c Marvell 88E8001 Gigabit Ethernet Controller (Asus) 0 -s 11ab43201043811a Marvell 88E8001 Gigabit Ethernet Controller (Asus) 0 -s 11ab4320105b0c19 Marvell 88E8001 Gigabit Ethernet Controller (Foxconn) 0 -s 11ab432010b8b452 SMC EZ Card 1000 (SMC9452TXV.2) 0 -s 11ab432011ab0121 Marvell RDK-8001 0 -s 11ab432011ab0321 Marvell RDK-8003 0 -s 11ab432011ab1021 Marvell RDK-8010 0 -s 11ab432011ab5021 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (64 bit) 0 -s 11ab432011ab9521 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (32 bit) 0 -s 11ab43201458e000 Marvell 88E8001 Gigabit Ethernet Controller (Gigabyte) 0 -s 11ab4320147b1406 Marvell 88E8001 Gigabit Ethernet Controller (Abit) 0 -s 11ab432015d40047 Marvell 88E8001 Gigabit Ethernet Controller (Iwill) 0 -s 11ab432016959025 Marvell 88E8001 Gigabit Ethernet Controller (Epox) 0 -s 11ab432017f21c03 Marvell 88E8001 Gigabit Ethernet Controller (Albatron) 0 -s 11ab4320270f2803 Marvell 88E8001 Gigabit Ethernet Controller (Chaintech) 0 -d 11ab4350 Fast Ethernet Controller 0 -s 11ab435011790001 Marvell 88E8035 Fast Ethernet Controller (Toshiba) 0 -s 11ab435011ab3521 Marvell RDK-8035 0 -s 11ab43501854000d Marvell 88E8035 Fast Ethernet Controller (LGE) 0 -s 11ab43501854000e Marvell 88E8035 Fast Ethernet Controller (LGE) 0 -s 11ab43501854000f Marvell 88E8035 Fast Ethernet Controller (LGE) 0 -s 11ab435018540011 Marvell 88E8035 Fast Ethernet Controller (LGE) 0 -s 11ab435018540012 Marvell 88E8035 Fast Ethernet Controller (LGE) 0 -s 11ab435018540016 Marvell 88E8035 Fast Ethernet Controller (LGE) 0 -s 11ab435018540017 Marvell 88E8035 Fast Ethernet Controller (LGE) 0 -s 11ab435018540018 Marvell 88E8035 Fast Ethernet Controller (LGE) 0 -s 11ab435018540019 Marvell 88E8035 Fast Ethernet Controller (LGE) 0 -s 11ab43501854001c Marvell 88E8035 Fast Ethernet Controller (LGE) 0 -s 11ab43501854001e Marvell 88E8035 Fast Ethernet Controller (LGE) 0 -s 11ab435018540020 Marvell 88E8035 Fast Ethernet Controller (LGE) 0 -d 11ab4351 Fast Ethernet Controller 0 -s 11ab4351107b4009 Marvell 88E8036 Fast Ethernet Controller (Wistron) 0 -s 11ab435110f78338 Marvell 88E8036 Fast Ethernet Controller (Panasonic) 0 -s 11ab435111790001 Marvell 88E8036 Fast Ethernet Controller (Toshiba) 0 -s 11ab43511179ff00 Marvell 88E8036 Fast Ethernet Controller (Compal) 0 -s 11ab43511179ff10 Marvell 88E8036 Fast Ethernet Controller (Inventec) 0 -s 11ab435111ab3621 Marvell RDK-8036 0 -s 11ab435113d1ac12 Abocom EFE3K - 10/100 Ethernet Expresscard 0 -s 11ab4351161f203d Marvell 88E8036 Fast Ethernet Controller (Arima) 0 -s 11ab43511854000d Marvell 88E8036 Fast Ethernet Controller (LGE) 0 -s 11ab43511854000e Marvell 88E8036 Fast Ethernet Controller (LGE) 0 -s 11ab43511854000f Marvell 88E8036 Fast Ethernet Controller (LGE) 0 -s 11ab435118540011 Marvell 88E8036 Fast Ethernet Controller (LGE) 0 -s 11ab435118540012 Marvell 88E8036 Fast Ethernet Controller (LGE) 0 -s 11ab435118540016 Marvell 88E8036 Fast Ethernet Controller (LGE) 0 -s 11ab435118540017 Marvell 88E8036 Fast Ethernet Controller (LGE) 0 -s 11ab435118540018 Marvell 88E8036 Fast Ethernet Controller (LGE) 0 -s 11ab435118540019 Marvell 88E8036 Fast Ethernet Controller (LGE) 0 -s 11ab43511854001c Marvell 88E8036 Fast Ethernet Controller (LGE) 0 -s 11ab43511854001e Marvell 88E8036 Fast Ethernet Controller (LGE) 0 -s 11ab435118540020 Marvell 88E8036 Fast Ethernet Controller (LGE) 0 -d 11ab4360 Gigabit Ethernet Controller 0 -s 11ab436010438134 Marvell 88E8052 Gigabit Ethernet Controller (Asus) 0 -s 11ab4360107b4009 Marvell 88E8052 Gigabit Ethernet Controller (Wistron) 0 -s 11ab436011ab5221 Marvell RDK-8052 0 -s 11ab43601458e000 Marvell 88E8052 Gigabit Ethernet Controller (Gigabyte) 0 -s 11ab43601462052c Marvell 88E8052 Gigabit Ethernet Controller (MSI) 0 -s 11ab436018498052 Marvell 88E8052 Gigabit Ethernet Controller (ASRock) 0 -s 11ab43601940e000 Marvell 88E8052 Gigabit Ethernet Controller (Gigabyte) 0 -s 11ab4360a0a00509 Marvell 88E8052 Gigabit Ethernet Controller (Aopen) 0 -d 11ab4361 Gigabit Ethernet Controller 0 -s 11ab4361107b3015 Marvell 88E8050 Gigabit Ethernet Controller (Gateway) 0 -s 11ab436111ab5021 Marvell 88E8050 Gigabit Ethernet Controller (Intel) 0 -s 11ab436180863063 D925XCVLK mainboard 0 -d 11ab4362 Gigabit Ethernet Controller 0 -s 11ab4362103c2a0d Marvell 88E8053 Gigabit Ethernet Controller (Asus) 0 -s 11ab436210438142 Marvell 88E8053 Gigabit Ethernet Controller (Asus) 0 -s 11ab4362109f3197 Marvell 88E8053 Gigabit Ethernet Controller (Trigem) 0 -s 11ab436210f78338 Marvell 88E8053 Gigabit Ethernet Controller (Panasonic) 0 -s 11ab436210fda430 Marvell 88E8053 Gigabit Ethernet Controller (SOYO) 0 -s 11ab436211790001 Marvell 88E8053 Gigabit Ethernet Controller (Toshiba) 0 -s 11ab43621179ff00 Marvell 88E8053 Gigabit Ethernet Controller (Compal) 0 -s 11ab43621179ff10 Marvell 88E8053 Gigabit Ethernet Controller (Inventec) 0 -s 11ab436211ab5321 Marvell RDK-8053 0 -s 11ab43621297c240 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) 0 -s 11ab43621297c241 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) 0 -s 11ab43621297c242 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) 0 -s 11ab43621297c243 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) 0 -s 11ab43621297c244 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) 0 -s 11ab436213d1ac11 Abocom EGE5K - Giga Ethernet Expresscard 0 -s 11ab43621458e000 Marvell 88E8053 Gigabit Ethernet Controller (Gigabyte) 0 -s 11ab43621462058c Marvell 88E8053 Gigabit Ethernet Controller (MSI) 0 -s 11ab436214c00012 Marvell 88E8053 Gigabit Ethernet Controller (Compal) 0 -s 11ab4362155804a0 Marvell 88E8053 Gigabit Ethernet Controller (Clevo) 0 -s 11ab436215bd1003 Marvell 88E8053 Gigabit Ethernet Controller (DFI) 0 -s 11ab4362161f203c Marvell 88E8053 Gigabit Ethernet Controller (Arima) 0 -s 11ab4362161f203d Marvell 88E8053 Gigabit Ethernet Controller (Arima) 0 -s 11ab436216959029 Marvell 88E8053 Gigabit Ethernet Controller (Epox) 0 -s 11ab436217f22c08 Marvell 88E8053 Gigabit Ethernet Controller (Albatron) 0 -s 11ab436217ff0585 Marvell 88E8053 Gigabit Ethernet Controller (Quanta) 0 -s 11ab436218498053 Marvell 88E8053 Gigabit Ethernet Controller (ASRock) 0 -s 11ab43621854000b Marvell 88E8053 Gigabit Ethernet Controller (LGE) 0 -s 11ab43621854000c Marvell 88E8053 Gigabit Ethernet Controller (LGE) 0 -s 11ab436218540010 Marvell 88E8053 Gigabit Ethernet Controller (LGE) 0 -s 11ab436218540013 Marvell 88E8053 Gigabit Ethernet Controller (LGE) 0 -s 11ab436218540014 Marvell 88E8053 Gigabit Ethernet Controller (LGE) 0 -s 11ab436218540015 Marvell 88E8053 Gigabit Ethernet Controller (LGE) 0 -s 11ab43621854001a Marvell 88E8053 Gigabit Ethernet Controller (LGE) 0 -s 11ab43621854001b Marvell 88E8053 Gigabit Ethernet Controller (LGE) 0 -s 11ab43621854001d Marvell 88E8053 Gigabit Ethernet Controller (LGE) 0 -s 11ab43621854001f Marvell 88E8053 Gigabit Ethernet Controller (LGE) 0 -s 11ab436218540021 Marvell 88E8053 Gigabit Ethernet Controller (LGE) 0 -s 11ab436218540022 Marvell 88E8053 Gigabit Ethernet Controller (LGE) 0 -s 11ab43621940e000 Marvell 88E8053 Gigabit Ethernet Controller (Gigabyte) 0 -s 11ab4362270f2801 Marvell 88E8053 Gigabit Ethernet Controller (Chaintech) 0 -s 11ab4362a0a00506 Marvell 88E8053 Gigabit Ethernet Controller (Aopen) 0 -d 11ab4611 GT-64115 System Controller 0 -d 11ab4620 GT-64120/64120A/64121A System Controller 0 -d 11ab4801 GT-48001 0 -d 11ab5040 MV88SX5040 4-port SATA I PCI-X Controller 0 -d 11ab5041 MV88SX5041 4-port SATA I PCI-X Controller 0 -d 11ab5080 MV88SX5080 8-port SATA I PCI-X Controller 0 -d 11ab5081 MV88SX5081 8-port SATA I PCI-X Controller 0 -d 11ab6041 MV88SX6041 4-port SATA II PCI-X Controller 0 -d 11ab6081 MV88SX6081 8-port SATA II PCI-X Controller 0 -d 11ab6460 MV64360/64361/64362 System Controller 0 -d 11abf003 GT-64010 Primary Image Piranha Image Generator 0 -v 11ac Canon Information Systems Research Aust. 0 -v 11ad Lite-On Communications Inc 0 -d 11ad0002 LNE100TX 0 -s 11ad000211ad0002 LNE100TX 0 -s 11ad000211ad0003 LNE100TX 0 -s 11ad000211adf003 LNE100TX 0 -s 11ad000211adffff LNE100TX 0 -s 11ad00021385f004 FA310TX 0 -d 11adc115 LNE100TX [Linksys EtherFast 10/100] 0 -s 11adc11511adc001 LNE100TX [ver 2.0] 0 -v 11ae Aztech System Ltd 0 -v 11af Avid Technology Inc. 0 -d 11af0001 [Cinema] 0 -v 11b0 V3 Semiconductor Inc. 0 -d 11b00002 V300PSC 0 -d 11b00292 V292PBC [Am29030/40 Bridge] 0 -d 11b00960 V96xPBC 0 -d 11b0c960 V96DPC 0 -v 11b1 Apricot Computers 0 -v 11b2 Eastman Kodak 0 -v 11b3 Barr Systems Inc. 0 -v 11b4 Leitch Technology International 0 -v 11b5 Radstone Technology Plc 0 -v 11b6 United Video Corp 0 -v 11b7 Motorola 0 -v 11b8 XPoint Technologies, Inc 0 -d 11b80001 Quad PeerMaster 0 -v 11b9 Pathlight Technology Inc. 0 -d 11b9c0ed SSA Controller 0 -v 11ba Videotron Corp 0 -v 11bb Pyramid Technology 0 -v 11bc Network Peripherals Inc 0 -d 11bc0001 NP-PCI 0 -v 11bd Pinnacle Systems Inc. 0 -v 11be International Microcircuits Inc 0 -v 11bf Astrodesign, Inc. 0 -v 11c0 Hewlett Packard 0 -v 11c1 Agere Systems (former Lucent Microelectronics) 0 -d 11c10440 56k WinModem 0 -s 11c1044010338015 LT WinModem 56k Data+Fax+Voice+Dsvd 0 -s 11c1044010338047 LT WinModem 56k Data+Fax+Voice+Dsvd 0 -s 11c104401033804f LT WinModem 56k Data+Fax+Voice+Dsvd 0 -s 11c1044010cf102c LB LT Modem V.90 56k 0 -s 11c1044010cf104a BIBLO LT Modem 56k 0 -s 11c1044010cf105f LB2 LT Modem V.90 56k 0 -s 11c1044011790001 Internal V.90 Modem 0 -s 11c1044011c10440 LT WinModem 56k Data+Fax+Voice+Dsvd 0 -s 11c10440122d4101 MDP7800-U Modem 0 -s 11c10440122d4102 MDP7800SP-U Modem 0 -s 11c1044013e00040 LT WinModem 56k Data+Fax+Voice+Dsvd 0 -s 11c1044013e00440 LT WinModem 56k Data+Fax+Voice+Dsvd 0 -s 11c1044013e00441 LT WinModem 56k Data+Fax+Voice+Dsvd 0 -s 11c1044013e00450 LT WinModem 56k Data+Fax+Voice+Dsvd 0 -s 11c1044013e0f100 LT WinModem 56k Data+Fax+Voice+Dsvd 0 -s 11c1044013e0f101 LT WinModem 56k Data+Fax+Voice+Dsvd 0 -s 11c10440144d2101 LT56PV Modem 0 -s 11c10440149f0440 LT WinModem 56k Data+Fax+Voice+Dsvd 0 -d 11c10441 56k WinModem 0 -s 11c104411033804d LT WinModem 56k Data+Fax 0 -s 11c1044110338065 LT WinModem 56k Data+Fax 0 -s 11c1044110920440 Supra 56i 0 -s 11c1044111790001 Internal V.90 Modem 0 -s 11c1044111c10440 LT WinModem 56k Data+Fax 0 -s 11c1044111c10441 LT WinModem 56k Data+Fax 0 -s 11c10441122d4100 MDP7800-U Modem 0 -s 11c1044113e00040 LT WinModem 56k Data+Fax 0 -s 11c1044113e00100 LT WinModem 56k Data+Fax 0 -s 11c1044113e00410 LT WinModem 56k Data+Fax 0 -s 11c1044113e00420 TelePath Internet 56k WinModem 0 -s 11c1044113e00440 LT WinModem 56k Data+Fax 0 -s 11c1044113e00443 LT WinModem 56k Data+Fax 0 -s 11c1044113e0f102 LT WinModem 56k Data+Fax 0 -s 11c1044114169804 CommWave 56k Modem 0 -s 11c10441141d0440 LT WinModem 56k Data+Fax 0 -s 11c10441144f0441 Lucent 56k V.90 DF Modem 0 -s 11c10441144f0449 Lucent 56k V.90 DF Modem 0 -s 11c10441144f110d Lucent Win Modem 0 -s 11c1044114680441 Presario 56k V.90 DF Modem 0 -s 11c1044116680440 Lucent Win Modem 0 -d 11c10442 56k WinModem 0 -s 11c1044211c10440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd 0 -s 11c1044211c10442 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd 0 -s 11c1044213e00412 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd 0 -s 11c1044213e00442 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd 0 -s 11c1044213fc2471 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd 0 -s 11c10442144d2104 LT56PT Modem 0 -s 11c10442144f1104 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd 0 -s 11c10442149f0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd 0 -s 11c1044216680440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd 0 -d 11c10443 LT WinModem 0 -d 11c10444 LT WinModem 0 -d 11c10445 LT WinModem 0 -s 11c1044580862203 PRO/100+ MiniPCI (probably an Ambit U98.003.C.00 combo card) 0 -s 11c1044580862204 PRO/100+ MiniPCI on Armada E500 0 -d 11c10446 LT WinModem 0 -d 11c10447 LT WinModem 0 -d 11c10448 WinModem 56k 0 -s 11c1044810140131 Lucent Win Modem 0 -s 11c1044810338066 LT WinModem 56k Data+Fax+Voice+Dsvd 0 -s 11c1044813e00030 56k Voice Modem 0 -s 11c1044813e00040 LT WinModem 56k Data+Fax+Voice+Dsvd 0 -s 11c1044816682400 LT WinModem 56k (MiniPCI Ethernet+Modem) 0 Actiontech eth+modem card as used by Dell &c. -d 11c10449 WinModem 56k 0 -s 11c104490e11b14d 56k V.90 Modem 0 -s 11c1044913e00020 LT WinModem 56k Data+Fax 0 -s 11c1044913e00041 TelePath Internet 56k WinModem 0 -s 11c1044914360440 Lucent Win Modem 0 -s 11c10449144f0449 Lucent 56k V.90 DFi Modem 0 -s 11c1044914680410 IBM ThinkPad T23 (2647-4MG) 0 -s 11c1044914680440 Lucent Win Modem 0 -s 11c1044914680449 Presario 56k V.90 DFi Modem 0 -d 11c1044a F-1156IV WinModem (V90, 56KFlex) 0 -s 11c1044a10cf1072 LB Global LT Modem 0 -s 11c1044a13e00012 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd 0 -s 11c1044a13e00042 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd 0 -s 11c1044a144f1005 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd 0 -d 11c1044b LT WinModem 0 -d 11c1044c LT WinModem 0 -d 11c1044d LT WinModem 0 -d 11c1044e LT WinModem 0 -d 11c1044f V90 WildWire Modem 0 -d 11c10450 LT WinModem 0 -s 11c10450103380a8 Versa Note Vxi 0 -s 11c10450144f4005 Magnia SG20 0 -d 11c10451 LT WinModem 0 -d 11c10452 LT WinModem 0 -d 11c10453 LT WinModem 0 -d 11c10454 LT WinModem 0 -d 11c10455 LT WinModem 0 -d 11c10456 LT WinModem 0 -d 11c10457 LT WinModem 0 -d 11c10458 LT WinModem 0 -d 11c10459 LT WinModem 0 -d 11c1045a LT WinModem 0 -d 11c1045c LT WinModem 0 -d 11c10461 V90 WildWire Modem 0 -d 11c10462 V90 WildWire Modem 0 -d 11c10480 Venus Modem (V90, 56KFlex) 0 -d 11c1048c V.92 56K WinModem 0 -d 11c1048f V.92 56k WinModem 0 InPorte Home Internal 56k Modem/fax/answering machine/SMS Features -d 11c15801 USB 0 -d 11c15802 USS-312 USB Controller 0 -d 11c15803 USS-344S USB Controller 0 4 port PCI USB Controller made by Agere (formely Lucent) -d 11c15811 FW323 0 -s 11c158118086524c D865PERL mainboard 0 -s 11c15811dead0800 FireWire Host Bus Adapter 0 -d 11c1ab10 WL60010 Wireless LAN MAC 0 -d 11c1ab11 WL60040 Multimode Wireles LAN MAC 0 -s 11c1ab1111c1ab12 WaveLAN 11abg Cardbus card (Model 1102) 0 -s 11c1ab1111c1ab13 WaveLAN 11abg MiniPCI card (Model 0512) 0 -s 11c1ab1111c1ab15 WaveLAN 11abg Cardbus card (Model 1106) 0 -s 11c1ab1111c1ab16 WaveLAN 11abg MiniPCI card (Model 0516) 0 -d 11c1ab20 ORiNOCO PCI Adapter 0 -d 11c1ab21 Agere Wireless PCI Adapter 0 -d 11c1ab30 Hermes2 Mini-PCI WaveLAN a/b/g 0 -s 11c1ab3014cd2012 Hermes2 Mini-PCI WaveLAN a/b/g 0 -v 11c2 Sand Microelectronics 0 -v 11c3 NEC Corporation 0 -v 11c4 Document Technologies, Inc 0 -v 11c5 Shiva Corporation 0 -v 11c6 Dainippon Screen Mfg. Co. Ltd 0 -v 11c7 D.C.M. Data Systems 0 -v 11c8 Dolphin Interconnect Solutions AS 0 -d 11c80658 PSB32 SCI-Adapter D31x 0 -d 11c8d665 PSB64 SCI-Adapter D32x 0 -d 11c8d667 PSB66 SCI-Adapter D33x 0 -v 11c9 Magma 0 -d 11c90010 16-line serial port w/- DMA 0 -d 11c90011 4-line serial port w/- DMA 0 -v 11ca LSI Systems, Inc 0 -v 11cb Specialix Research Ltd. 0 -d 11cb2000 PCI_9050 0 -s 11cb200011cb0200 SX 0 -s 11cb200011cbb008 I/O8+ 0 -d 11cb4000 SUPI_1 0 -d 11cb8000 T225 0 -v 11cc Michels & Kleberhoff Computer GmbH 0 -v 11cd HAL Computer Systems, Inc. 0 -v 11ce Netaccess 0 -v 11cf Pioneer Electronic Corporation 0 -v 11d0 Lockheed Martin Federal Systems-Manassas 0 -v 11d1 Auravision 0 -d 11d101f7 VxP524 0 -v 11d2 Intercom Inc. 0 -v 11d3 Trancell Systems Inc 0 -v 11d4 Analog Devices 0 -d 11d41535 Blackfin BF535 processor 0 -d 11d41805 SM56 PCI modem 0 -d 11d41889 AD1889 sound chip 0 -v 11d5 Ikon Corporation 0 -d 11d50115 10115 0 -d 11d50117 10117 0 -v 11d6 Tekelec Telecom 0 -v 11d7 Trenton Technology, Inc. 0 -v 11d8 Image Technologies Development 0 -v 11d9 TEC Corporation 0 -v 11da Novell 0 -v 11db Sega Enterprises Ltd 0 -v 11dc Questra Corporation 0 -v 11dd Crosfield Electronics Limited 0 -v 11de Zoran Corporation 0 -d 11de6057 ZR36057PQC Video cutting chipset 0 -s 11de605710317efe DC10 Plus 0 -s 11de60571031fc00 MiroVIDEO DC50, Motion JPEG Capture/CODEC Board 0 -s 11de605713ca4231 JPEG/TV Card 0 -d 11de6120 ZR36120 0 -s 11de61201328f001 Cinemaster C DVD Decoder 0 -v 11df New Wave PDG 0 -v 11e0 Cray Communications A/S 0 -v 11e1 GEC Plessey Semi Inc. 0 -v 11e2 Samsung Information Systems America 0 -v 11e3 Quicklogic Corporation 0 -d 11e35030 PC Watchdog 0 -v 11e4 Second Wave Inc 0 -v 11e5 IIX Consulting 0 -v 11e6 Mitsui-Zosen System Research 0 -v 11e7 Toshiba America, Elec. Company 0 -v 11e8 Digital Processing Systems Inc. 0 -v 11e9 Highwater Designs Ltd. 0 -v 11ea Elsag Bailey 0 -v 11eb Formation Inc. 0 -v 11ec Coreco Inc 0 -v 11ed Mediamatics 0 -v 11ee Dome Imaging Systems Inc 0 -v 11ef Nicolet Technologies B.V. 0 -v 11f0 Compu-Shack 0 -d 11f04231 FDDI 0 -d 11f04232 FASTline UTP Quattro 0 -d 11f04233 FASTline FO 0 -d 11f04234 FASTline UTP 0 -d 11f04235 FASTline-II UTP 0 -d 11f04236 FASTline-II FO 0 -d 11f04731 GIGAline 0 -v 11f1 Symbios Logic Inc 0 -v 11f2 Picture Tel Japan K.K. 0 -v 11f3 Keithley Metrabyte 0 -v 11f4 Kinetic Systems Corporation 0 -d 11f42915 CAMAC controller 0 -v 11f5 Computing Devices International 0 -v 11f6 Compex 0 -d 11f60112 ENet100VG4 0 -d 11f60113 FreedomLine 100 0 -d 11f61401 ReadyLink 2000 0 -d 11f62011 RL100-ATX 10/100 0 -s 11f6201111f62011 RL100-ATX 0 -d 11f62201 ReadyLink 100TX (Winbond W89C840) 0 -s 11f6220111f62011 ReadyLink 100TX 0 -d 11f69881 RL100TX Fast Ethernet 0 -v 11f7 Scientific Atlanta 0 -v 11f8 PMC-Sierra Inc. 0 -d 11f87375 PM7375 [LASAR-155 ATM SAR] 0 -v 11f9 I-Cube Inc 0 -v 11fa Kasan Electronics Company, Ltd. 0 -v 11fb Datel Inc 0 -v 11fc Silicon Magic 0 -v 11fd High Street Consultants 0 -v 11fe Comtrol Corporation 0 -d 11fe0001 RocketPort 32 port w/external I/F 0 -d 11fe0002 RocketPort 8 port w/external I/F 0 -d 11fe0003 RocketPort 16 port w/external I/F 0 -d 11fe0004 RocketPort 4 port w/quad cable 0 -d 11fe0005 RocketPort 8 port w/octa cable 0 -d 11fe0006 RocketPort 8 port w/RJ11 connectors 0 -d 11fe0007 RocketPort 4 port w/RJ11 connectors 0 -d 11fe0008 RocketPort 8 port w/ DB78 SNI (Siemens) connector 0 -d 11fe0009 RocketPort 16 port w/ DB78 SNI (Siemens) connector 0 -d 11fe000a RocketPort Plus 4 port 0 -d 11fe000b RocketPort Plus 8 port 0 -d 11fe000c RocketModem 6 port 0 -d 11fe000d RocketModem 4-port 0 -d 11fe000e RocketPort Plus 2 port RS232 0 -d 11fe000f RocketPort Plus 2 port RS422 0 -d 11fe0801 RocketPort UPCI 32 port w/external I/F 0 -d 11fe0802 RocketPort UPCI 8 port w/external I/F 0 -d 11fe0803 RocketPort UPCI 16 port w/external I/F 0 -d 11fe0805 RocketPort UPCI 8 port w/octa cable 0 -d 11fe080c RocketModem III 8 port 0 -d 11fe080d RocketModem III 4 port 0 -d 11fe0903 RocketPort Compact PCI 16 port w/external I/F 0 -d 11fe8015 RocketPort 4-port UART 16954 0 -v 11ff Scion Corporation 0 -d 11ff0003 AG-5 0 -v 1200 CSS Corporation 0 -v 1201 Vista Controls Corp 0 -v 1202 Network General Corp. 0 -d 12024300 Gigabit Ethernet Adapter 0 -s 1202430012029841 SK-9841 LX 0 -s 1202430012029842 SK-9841 LX dual link 0 -s 1202430012029843 SK-9843 SX 0 -s 1202430012029844 SK-9843 SX dual link 0 -v 1203 Bayer Corporation, Agfa Division 0 -v 1204 Lattice Semiconductor Corporation 0 -v 1205 Array Corporation 0 -v 1206 Amdahl Corporation 0 -v 1208 Parsytec GmbH 0 -d 12084853 HS-Link Device 0 -v 1209 SCI Systems Inc 0 -v 120a Synaptel 0 -v 120b Adaptive Solutions 0 -v 120c Technical Corp. 0 -v 120d Compression Labs, Inc. 0 -v 120e Cyclades Corporation 0 -d 120e0100 Cyclom-Y below first megabyte 0 -d 120e0101 Cyclom-Y above first megabyte 0 -d 120e0102 Cyclom-4Y below first megabyte 0 -d 120e0103 Cyclom-4Y above first megabyte 0 -d 120e0104 Cyclom-8Y below first megabyte 0 -d 120e0105 Cyclom-8Y above first megabyte 0 -d 120e0200 Cyclades-Z below first megabyte 0 -d 120e0201 Cyclades-Z above first megabyte 0 -d 120e0300 PC300/RSV or /X21 (2 ports) 0 -d 120e0301 PC300/RSV or /X21 (1 port) 0 -d 120e0310 PC300/TE (2 ports) 0 -d 120e0311 PC300/TE (1 port) 0 -d 120e0320 PC300/TE-M (2 ports) 0 -d 120e0321 PC300/TE-M (1 port) 0 -d 120e0400 PC400 0 -v 120f Essential Communications 0 -d 120f0001 Roadrunner serial HIPPI 0 -v 1210 Hyperparallel Technologies 0 -v 1211 Braintech Inc 0 -v 1212 Kingston Technology Corp. 0 -v 1213 Applied Intelligent Systems, Inc. 0 -v 1214 Performance Technologies, Inc. 0 -v 1215 Interware Co., Ltd 0 -v 1216 Purup Prepress A/S 0 -v 1217 O2 Micro, Inc. 0 -d 12176729 OZ6729 0 -d 1217673a OZ6730 0 -d 12176832 OZ6832/6833 Cardbus Controller 0 -d 12176836 OZ6836/6860 Cardbus Controller 0 -d 12176872 OZ6812 Cardbus Controller 0 -d 12176925 OZ6922 Cardbus Controller 0 -d 12176933 OZ6933 Cardbus Controller 0 -s 1217693310251016 Travelmate 612 TX 0 -d 12176972 OZ6912 Cardbus Controller 0 -s 121769721014020c ThinkPad R30 0 -s 1217697211790001 Magnia Z310 0 -d 12177110 OZ711Mx MultiMediaBay Accelerator 0 -s 12177110103c0890 NC6000 laptop 0 -d 12177112 OZ711EC1/M1 SmartCardBus MultiMediaBay Controller 0 -d 12177113 OZ711EC1 SmartCardBus Controller 0 -d 12177114 OZ711M1 SmartCardBus MultiMediaBay Controller 0 -d 121771e2 OZ711E2 SmartCardBus Controller 0 -d 12177212 OZ711M2 SmartCardBus MultiMediaBay Controller 0 -d 12177213 OZ6933E CardBus Controller 0 -d 12177223 OZ711M3 SmartCardBus MultiMediaBay Controller 0 -s 12177223103c0890 NC6000 laptop 0 -v 1218 Hybricon Corp. 0 -v 1219 First Virtual Corporation 0 -v 121a 3Dfx Interactive, Inc. 0 -d 121a0001 Voodoo 0 -d 121a0002 Voodoo 2 0 -d 121a0003 Voodoo Banshee 0 -s 121a000310920003 Monster Fusion 0 -s 121a000310924000 Monster Fusion 0 -s 121a000310924002 Monster Fusion 0 -s 121a000310924801 Monster Fusion AGP 0 -s 121a000310924803 Monster Fusion AGP 0 -s 121a000310928030 Monster Fusion 0 -s 121a000310928035 Monster Fusion AGP 0 -s 121a000310b00001 Dragon 4000 0 -s 121a000311021018 3D Blaster Banshee VE 0 -s 121a0003121a0001 Voodoo Banshee AGP 0 -s 121a0003121a0003 Voodoo Banshee AGP SGRAM 0 -s 121a0003121a0004 Voodoo Banshee 0 -s 121a0003139c0016 Raven 0 -s 121a0003139c0017 Raven 0 -s 121a000314af0002 Maxi Gamer Phoenix 0 -d 121a0004 Voodoo Banshee [Velocity 100] 0 -d 121a0005 Voodoo 3 0 -s 121a0005121a0004 Voodoo3 AGP 0 -s 121a0005121a0030 Voodoo3 AGP 0 -s 121a0005121a0031 Voodoo3 AGP 0 -s 121a0005121a0034 Voodoo3 AGP 0 -s 121a0005121a0036 Voodoo3 2000 PCI 0 -s 121a0005121a0037 Voodoo3 AGP 0 -s 121a0005121a0038 Voodoo3 AGP 0 -s 121a0005121a003a Voodoo3 AGP 0 -s 121a0005121a0044 Voodoo3 0 -s 121a0005121a004b Velocity 100 0 -s 121a0005121a004c Velocity 200 0 -s 121a0005121a004d Voodoo3 AGP 0 -s 121a0005121a004e Voodoo3 AGP 0 -s 121a0005121a0051 Voodoo3 AGP 0 -s 121a0005121a0052 Voodoo3 AGP 0 -s 121a0005121a0060 Voodoo3 3500 TV (NTSC) 0 -s 121a0005121a0061 Voodoo3 3500 TV (PAL) 0 -s 121a0005121a0062 Voodoo3 3500 TV (SECAM) 0 -d 121a0009 Voodoo 4 / Voodoo 5 0 -s 121a0009121a0003 Voodoo5 PCI 5500 0 -s 121a0009121a0009 Voodoo5 AGP 5500/6000 0 -d 121a0057 Voodoo 3/3000 [Avenger] 0 -v 121b Advanced Telecommunications Modules 0 -v 121c Nippon Texaco., Ltd 0 -v 121d Lippert Automationstechnik GmbH 0 -v 121e CSPI 0 -v 121f Arcus Technology, Inc. 0 -v 1220 Ariel Corporation 0 -d 12201220 AMCC 5933 TMS320C80 DSP/Imaging board 0 -v 1221 Contec Co., Ltd 0 -v 1222 Ancor Communications, Inc. 0 -v 1223 Artesyn Communication Products 0 -d 12230003 PM/Link 0 -d 12230004 PM/T1 0 -d 12230005 PM/E1 0 -d 12230008 PM/SLS 0 -d 12230009 BajaSpan Resource Target 0 -d 1223000a BajaSpan Section 0 0 -d 1223000b BajaSpan Section 1 0 -d 1223000c BajaSpan Section 2 0 -d 1223000d BajaSpan Section 3 0 -d 1223000e PM/PPC 0 -v 1224 Interactive Images 0 -v 1225 Power I/O, Inc. 0 -v 1227 Tech-Source 0 -d 12270006 Raptor GFX 8P 0 -v 1228 Norsk Elektro Optikk A/S 0 -v 1229 Data Kinesis Inc. 0 -v 122a Integrated Telecom 0 -v 122b LG Industrial Systems Co., Ltd 0 -v 122c Sican GmbH 0 -v 122d Aztech System Ltd 0 -d 122d1206 368DSP 0 -d 122d1400 Trident PCI288-Q3DII (NX) 0 -d 122d50dc 3328 Audio 0 -s 122d50dc122d0001 3328 Audio 0 -d 122d80da 3328 Audio 0 -s 122d80da122d0001 3328 Audio 0 -v 122e Xyratex 0 -v 122f Andrew Corporation 0 -v 1230 Fishcamp Engineering 0 -v 1231 Woodward McCoach, Inc. 0 -v 1232 GPT Limited 0 -v 1233 Bus-Tech, Inc. 0 -v 1234 Technical Corp. 0 -v 1235 Risq Modular Systems, Inc. 0 -v 1236 Sigma Designs Corporation 0 -d 12360000 RealMagic64/GX 0 -d 12366401 REALmagic 64/GX (SD 6425) 0 -v 1237 Alta Technology Corporation 0 -v 1238 Adtran 0 -v 1239 3DO Company 0 -v 123a Visicom Laboratories, Inc. 0 -v 123b Seeq Technology, Inc. 0 -v 123c Century Systems, Inc. 0 -v 123d Engineering Design Team, Inc. 0 -d 123d0000 EasyConnect 8/32 0 -d 123d0002 EasyConnect 8/64 0 -d 123d0003 EasyIO 0 -v 123e Simutech, Inc. 0 -v 123f C-Cube Microsystems 0 -d 123f00e4 MPEG 0 -d 123f8120 E4? 0 -s 123f812011bd0006 DV500 E4 0 -s 123f812011bd000a DV500 E4 0 -d 123f8888 Cinemaster C 3.0 DVD Decoder 0 -s 123f888810020001 Cinemaster C 3.0 DVD Decoder 0 -s 123f888810020002 Cinemaster C 3.0 DVD Decoder 0 -s 123f888813280001 Cinemaster C 3.0 DVD Decoder 0 -v 1240 Marathon Technologies Corp. 0 -v 1241 DSC Communications 0 -v 1242 JNI Corporation 0 Formerly Jaycor Networks, Inc. -d 12421560 JNIC-1560 PCI-X Fibre Channel Controller 0 -s 1242156012426562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter 0 -s 124215601242656a FCX-6562 PCI-X Fibre Channel Adapter 0 -d 12424643 FCI-1063 Fibre Channel Adapter 0 -d 12426562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter 0 -d 1242656a FCX-6562 PCI-X Fibre Channel Adapter 0 -v 1243 Delphax 0 -v 1244 AVM Audiovisuelles MKTG & Computer System GmbH 0 -d 12440700 B1 ISDN 0 -d 12440800 C4 ISDN 0 -d 12440a00 A1 ISDN [Fritz] 0 -s 12440a0012440a00 FRITZ!Card ISDN Controller 0 -d 12440e00 Fritz!PCI v2.0 ISDN 0 -d 12441100 C2 ISDN 0 -d 12441200 T1 ISDN 0 -d 12442700 Fritz!Card DSL SL 0 -d 12442900 Fritz!Card DSL v2.0 0 -v 1245 A.P.D., S.A. 0 -v 1246 Dipix Technologies, Inc. 0 -v 1247 Xylon Research, Inc. 0 -v 1248 Central Data Corporation 0 -v 1249 Samsung Electronics Co., Ltd. 0 -v 124a AEG Electrocom GmbH 0 -v 124b SBS/Greenspring Modular I/O 0 -d 124b0040 PCI-40A or cPCI-200 Quad IndustryPack carrier 0 -s 124b0040124b9080 PCI9080 Bridge 0 -v 124c Solitron Technologies, Inc. 0 -v 124d Stallion Technologies, Inc. 0 -d 124d0000 EasyConnection 8/32 0 -d 124d0002 EasyConnection 8/64 0 -d 124d0003 EasyIO 0 -d 124d0004 EasyConnection/RA 0 -v 124e Cylink 0 -v 124f Infotrend Technology, Inc. 0 -d 124f0041 IFT-2000 Series RAID Controller 0 -v 1250 Hitachi Microcomputer System Ltd 0 -v 1251 VLSI Solutions Oy 0 -v 1253 Guzik Technical Enterprises 0 -v 1254 Linear Systems Ltd. 0 -v 1255 Optibase Ltd 0 -d 12551110 MPEG Forge 0 -d 12551210 MPEG Fusion 0 -d 12552110 VideoPlex 0 -d 12552120 VideoPlex CC 0 -d 12552130 VideoQuest 0 -v 1256 Perceptive Solutions, Inc. 0 -d 12564201 PCI-2220I 0 -d 12564401 PCI-2240I 0 -d 12565201 PCI-2000 0 -v 1257 Vertex Networks, Inc. 0 -v 1258 Gilbarco, Inc. 0 -v 1259 Allied Telesyn International 0 -d 12592560 AT-2560 Fast Ethernet Adapter (i82557B) 0 -d 1259a117 RTL81xx Fast Ethernet 0 -d 1259a120 21x4x DEC-Tulip compatible 10/100 Ethernet 0 -v 125a ABB Power Systems 0 -v 125b Asix Electronics Corporation 0 -d 125b1400 ALFA GFC2204 Fast Ethernet 0 -v 125c Aurora Technologies, Inc. 0 -d 125c0101 Saturn 4520P 0 -d 125c0640 Aries 16000P 0 -v 125d ESS Technology 0 -d 125d0000 ES336H Fax Modem (Early Model) 0 -d 125d1948 Solo? 0 -d 125d1968 ES1968 Maestro 2 0 -s 125d196810280085 ES1968 Maestro-2 PCI 0 -s 125d196810338051 ES1968 Maestro-2 Audiodrive 0 -d 125d1969 ES1969 Solo-1 Audiodrive 0 -s 125d196910140166 ES1969 SOLO-1 AudioDrive on IBM Aptiva Mainboard 0 -s 125d1969125d8888 Solo-1 Audio Adapter 0 -d 125d1978 ES1978 Maestro 2E 0 -s 125d19780e11b112 Armada M700/E500 0 -s 125d19781033803c ES1978 Maestro-2E Audiodrive 0 -s 125d197810338058 ES1978 Maestro-2E Audiodrive 0 -s 125d197810924000 Monster Sound MX400 0 -s 125d197811790001 ES1978 Maestro-2E Audiodrive 0 -d 125d1988 ES1988 Allegro-1 0 -s 125d198810924100 Sonic Impact S100 0 -s 125d1988125d1988 ESS Allegro-1 Audiodrive 0 -d 125d1989 ESS Modem 0 -s 125d1989125d1989 ESS Modem 0 -d 125d1998 ES1983S Maestro-3i PCI Audio Accelerator 0 -s 125d1998102800b1 Latitude C600 0 -s 125d1998102800e6 ES1983S Maestro-3i (Dell Inspiron 8100) 0 -d 125d1999 ES1983S Maestro-3i PCI Modem Accelerator 0 -d 125d199a ES1983S Maestro-3i PCI Audio Accelerator 0 -d 125d199b ES1983S Maestro-3i PCI Modem Accelerator 0 -d 125d2808 ES336H Fax Modem (Later Model) 0 -d 125d2838 ES2838/2839 SuperLink Modem 0 -d 125d2898 ES2898 Modem 0 -s 125d2898125d0424 ES56-PI Data Fax Modem 0 -s 125d2898125d0425 ES56T-PI Data Fax Modem 0 -s 125d2898125d0426 ES56V-PI Data Fax Modem 0 -s 125d2898125d0427 VW-PI Data Fax Modem 0 -s 125d2898125d0428 ES56ST-PI Data Fax Modem 0 -s 125d2898125d0429 ES56SV-PI Data Fax Modem 0 -s 125d2898147ac001 ES56-PI Data Fax Modem 0 -s 125d289814fe0428 ES56-PI Data Fax Modem 0 -s 125d289814fe0429 ES56-PI Data Fax Modem 0 -v 125e Specialvideo Engineering SRL 0 -v 125f Concurrent Technologies, Inc. 0 -v 1260 Intersil Corporation 0 -d 12603872 Prism 2.5 Wavelan chipset 0 -s 1260387214680202 LAN-Express IEEE 802.11b Wireless LAN 0 -d 12603873 Prism 2.5 Wavelan chipset 0 -s 1260387311863501 DWL-520 Wireless PCI Adapter 0 -s 1260387311863700 DWL-520 Wireless PCI Adapter, Rev E1 0 -s 1260387313854105 MA311 802.11b wireless adapter 0 -s 1260387316680414 HWP01170-01 802.11b PCI Wireless Adapter 0 -s 1260387316a51601 AIR.mate PC-400 PCI Wireless LAN Adapter 0 -s 1260387317373874 WMP11 Wireless 802.11b PCI Adapter 0 -s 1260387380862513 Wireless 802.11b MiniPCI Adapter 0 -d 12603886 ISL3886 [Prism Javelin/Prism Xbow] 0 -s 1260388617cf0037 Z-Com XG-901 and clones Wireless Adapter 0 -d 12603890 Intersil ISL3890 [Prism GT/Prism Duette] 0 -s 1260389010b82802 SMC2802W Wireless PCI Adapter 0 -s 1260389010b82835 SMC2835W Wireless Cardbus Adapter 0 -s 1260389010b8a835 SMC2835W V2 Wireless Cardbus Adapter 0 -s 126038901113ee03 SMC2802W V2 Wireless PCI Adapter 0 -s 1260389011863202 DWL-G650 A1 Wireless Adapter 0 -s 126038901259c104 CG-WLCB54GT Wireless Adapter 0 -s 1260389013854800 WG511 Wireless Adapter 0 -s 1260389016a51605 ALLNET ALL0271 Wireless PCI Adapter 0 -s 1260389017cf0014 Z-Com XG-600 and clones Wireless Adapter 0 -s 1260389017cf0020 Z-Com XG-900 and clones Wireless Adapter 0 -d 12608130 HMP8130 NTSC/PAL Video Decoder 0 -d 12608131 HMP8131 NTSC/PAL Video Decoder 0 -v 1261 Matsushita-Kotobuki Electronics Industries, Ltd. 0 -v 1262 ES Computer Company, Ltd. 0 -v 1263 Sonic Solutions 0 -v 1264 Aval Nagasaki Corporation 0 -v 1265 Casio Computer Co., Ltd. 0 -v 1266 Microdyne Corporation 0 -d 12660001 NE10/100 Adapter (i82557B) 0 -d 12661910 NE2000Plus (RT8029) Ethernet Adapter 0 -s 1266191012661910 NE2000Plus Ethernet Adapter 0 -v 1267 S. A. Telecommunications 0 -d 12675352 PCR2101 0 -d 12675a4b Telsat Turbo 0 -v 1268 Tektronix 0 -v 1269 Thomson-CSF/TTM 0 -v 126a Lexmark International, Inc. 0 -v 126b Adax, Inc. 0 -v 126c Northern Telecom 0 -d 126c1211 10/100BaseTX [RTL81xx] 0 -d 126c126c 802.11b Wireless Ethernet Adapter 0 -v 126d Splash Technology, Inc. 0 -v 126e Sumitomo Metal Industries, Ltd. 0 -v 126f Silicon Motion, Inc. 0 -d 126f0501 SM501 VoyagerGX 0 -d 126f0710 SM710 LynxEM 0 -d 126f0712 SM712 LynxEM+ 0 -d 126f0720 SM720 Lynx3DM 0 -d 126f0730 SM731 Cougar3DR 0 -d 126f0810 SM810 LynxE 0 -d 126f0811 SM811 LynxE 0 -d 126f0820 SM820 Lynx3D 0 -d 126f0910 SM910 0 -v 1270 Olympus Optical Co., Ltd. 0 -v 1271 GW Instruments 0 -v 1272 Telematics International 0 -v 1273 Hughes Network Systems 0 -d 12730002 DirecPC 0 -v 1274 Ensoniq 0 -d 12741171 ES1373 [AudioPCI] (also Creative Labs CT5803) 0 -d 12741371 ES1371 [AudioPCI-97] 0 -s 127413710e110024 AudioPCI on Motherboard Compaq Deskpro 0 -s 127413710e11b1a7 ES1371, ES1373 AudioPCI 0 -s 12741371103380ac ES1371, ES1373 AudioPCI 0 -s 1274137110421854 Tazer 0 -s 12741371107b8054 Tabor2 0 -s 1274137112741371 Creative Sound Blaster AudioPCI64V, AudioPCI128 0 -s 1274137114626470 ES1371, ES1373 AudioPCI On Motherboard MS-6147 1.1A 0 -s 1274137114626560 ES1371, ES1373 AudioPCI On Motherboard MS-6156 1.10 0 -s 1274137114626630 ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 1.0A 0 -s 1274137114626631 ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 1.0A 0 -s 1274137114626632 ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 2.0A 0 -s 1274137114626633 ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 2.0A 0 -s 1274137114626820 ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00 0 -s 1274137114626822 ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00A 0 -s 1274137114626830 ES1371, ES1373 AudioPCI On Motherboard MS-6183 1.00 0 -s 1274137114626880 ES1371, ES1373 AudioPCI On Motherboard MS-6188 1.00 0 -s 1274137114626900 ES1371, ES1373 AudioPCI On Motherboard MS-6190 1.00 0 -s 1274137114626910 ES1371, ES1373 AudioPCI On Motherboard MS-6191 0 -s 1274137114626930 ES1371, ES1373 AudioPCI On Motherboard MS-6193 0 -s 1274137114626990 ES1371, ES1373 AudioPCI On Motherboard MS-6199BX 2.0A 0 -s 1274137114626991 ES1371, ES1373 AudioPCI On Motherboard MS-6199VIA 2.0A 0 -s 1274137114a42077 ES1371, ES1373 AudioPCI On Motherboard KR639 0 -s 1274137114a42105 ES1371, ES1373 AudioPCI On Motherboard MR800 0 -s 1274137114a42107 ES1371, ES1373 AudioPCI On Motherboard MR801 0 -s 1274137114a42172 ES1371, ES1373 AudioPCI On Motherboard DR739 0 -s 1274137115099902 ES1371, ES1373 AudioPCI On Motherboard KW11 0 -s 1274137115099903 ES1371, ES1373 AudioPCI On Motherboard KW31 0 -s 1274137115099904 ES1371, ES1373 AudioPCI On Motherboard KA11 0 -s 1274137115099905 ES1371, ES1373 AudioPCI On Motherboard KC13 0 -s 12741371152d8801 ES1371, ES1373 AudioPCI On Motherboard CP810E 0 -s 12741371152d8802 ES1371, ES1373 AudioPCI On Motherboard CP810 0 -s 12741371152d8803 ES1371, ES1373 AudioPCI On Motherboard P3810E 0 -s 12741371152d8804 ES1371, ES1373 AudioPCI On Motherboard P3810-S 0 -s 12741371152d8805 ES1371, ES1373 AudioPCI On Motherboard P3820-S 0 -s 12741371270f2001 ES1371, ES1373 AudioPCI On Motherboard 6CTR 0 -s 12741371270f2200 ES1371, ES1373 AudioPCI On Motherboard 6WTX 0 -s 12741371270f3000 ES1371, ES1373 AudioPCI On Motherboard 6WSV 0 -s 12741371270f3100 ES1371, ES1373 AudioPCI On Motherboard 6WIV2 0 -s 12741371270f3102 ES1371, ES1373 AudioPCI On Motherboard 6WIV 0 -s 12741371270f7060 ES1371, ES1373 AudioPCI On Motherboard 6ASA2 0 -s 1274137180864249 ES1371, ES1373 AudioPCI On Motherboard BI440ZX 0 -s 127413718086424c ES1371, ES1373 AudioPCI On Motherboard BL440ZX 0 -s 127413718086425a ES1371, ES1373 AudioPCI On Motherboard BZ440ZX 0 -s 1274137180864341 ES1371, ES1373 AudioPCI On Motherboard Cayman 0 -s 1274137180864343 ES1371, ES1373 AudioPCI On Motherboard Cape Cod 0 -s 1274137180864649 ES1371, ES1373 AudioPCI On Motherboard Fire Island 0 -s 127413718086464a ES1371, ES1373 AudioPCI On Motherboard FJ440ZX 0 -s 1274137180864d4f ES1371, ES1373 AudioPCI On Motherboard Montreal 0 -s 1274137180864f43 ES1371, ES1373 AudioPCI On Motherboard OC440LX 0 -s 1274137180865243 ES1371, ES1373 AudioPCI On Motherboard RC440BX 0 -s 1274137180865352 ES1371, ES1373 AudioPCI On Motherboard SunRiver 0 -s 1274137180865643 ES1371, ES1373 AudioPCI On Motherboard Vancouver 0 -s 1274137180865753 ES1371, ES1373 AudioPCI On Motherboard WS440BX 0 -d 12745000 ES1370 [AudioPCI] 0 -d 12745880 5880 AudioPCI 0 -s 1274588012742000 Creative Sound Blaster AudioPCI128 0 -s 1274588012742003 Creative SoundBlaster AudioPCI 128 0 -s 1274588012745880 Creative Sound Blaster AudioPCI128 0 -s 1274588012748001 Sound Blaster 16PCI 4.1ch 0 -s 127458801458a000 5880 AudioPCI On Motherboard 6OXET 0 -s 1274588014626880 5880 AudioPCI On Motherboard MS-6188 1.00 0 -s 12745880270f2001 5880 AudioPCI On Motherboard 6CTR 0 -s 12745880270f2200 5880 AudioPCI On Motherboard 6WTX 0 -s 12745880270f7040 5880 AudioPCI On Motherboard 6ATA4 0 -v 1275 Network Appliance Corporation 0 -v 1276 Switched Network Technologies, Inc. 0 -v 1277 Comstream 0 -v 1278 Transtech Parallel Systems Ltd. 0 -d 12780701 TPE3/TM3 PowerPC Node 0 -d 12780710 TPE5 PowerPC PCI board 0 -v 1279 Transmeta Corporation 0 -d 12790295 Northbridge 0 -d 12790395 LongRun Northbridge 0 -d 12790396 SDRAM controller 0 -d 12790397 BIOS scratchpad 0 -v 127a Rockwell International 0 -d 127a1002 HCF 56k Data/Fax Modem 0 -s 127a10021092094c SupraExpress 56i PRO [Diamond SUP2380] 0 -s 127a1002122d4002 HPG / MDP3858-U 0 -s 127a1002122d4005 MDP3858-E 0 -s 127a1002122d4007 MDP3858-A/-NZ 0 -s 127a1002122d4012 MDP3858-SA 0 -s 127a1002122d4017 MDP3858-W 0 -s 127a1002122d4018 MDP3858-W 0 -s 127a1002127a1002 Rockwell 56K D/F HCF Modem 0 -d 127a1003 HCF 56k Data/Fax Modem 0 -s 127a10030e11b0bc 229-DF Zephyr 0 -s 127a10030e11b114 229-DF Cheetah 0 -s 127a10031033802b 229-DF 0 -s 127a100313df1003 PCI56RX Modem 0 -s 127a100313e00117 IBM 0 -s 127a100313e00147 IBM F-1156IV+/R3 Spain V.90 Modem 0 -s 127a100313e00197 IBM 0 -s 127a100313e001c7 IBM F-1156IV+/R3 WW V.90 Modem 0 -s 127a100313e001f7 IBM 0 -s 127a100314361003 IBM 0 -s 127a100314361103 IBM 5614PM3G V.90 Modem 0 -s 127a100314361602 Compaq 229-DF Ducati 0 -d 127a1004 HCF 56k Data/Fax/Voice Modem 0 -s 127a100410481500 MicroLink 56k Modem 0 -s 127a100410cf1059 Fujitsu 229-DFRT 0 -d 127a1005 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem 0 -s 127a100510338029 229-DFSV 0 -s 127a100510338054 Modem 0 -s 127a100510cf103c Fujitsu 0 -s 127a100510cf1055 Fujitsu 229-DFSV 0 -s 127a100510cf1056 Fujitsu 229-DFSV 0 -s 127a1005122d4003 MDP3858SP-U 0 -s 127a1005122d4006 Packard Bell MDP3858V-E 0 -s 127a1005122d4008 MDP3858SP-A/SP-NZ 0 -s 127a1005122d4009 MDP3858SP-E 0 -s 127a1005122d4010 MDP3858V-U 0 -s 127a1005122d4011 MDP3858SP-SA 0 -s 127a1005122d4013 MDP3858V-A/V-NZ 0 -s 127a1005122d4015 MDP3858SP-W 0 -s 127a1005122d4016 MDP3858V-W 0 -s 127a1005122d4019 MDP3858V-SA 0 -s 127a100513df1005 PCI56RVP Modem 0 -s 127a100513e00187 IBM 0 -s 127a100513e001a7 IBM 0 -s 127a100513e001b7 IBM DF-1156IV+/R3 Spain V.90 Modem 0 -s 127a100513e001d7 IBM DF-1156IV+/R3 WW V.90 Modem 0 -s 127a100514361005 IBM 0 -s 127a100514361105 IBM 0 -s 127a100514371105 IBM 5614PS3G V.90 Modem 0 -d 127a1022 HCF 56k Modem 0 -s 127a102214361303 M3-5614PM3G V.90 Modem 0 -d 127a1023 HCF 56k Data/Fax Modem 0 -s 127a1023122d4020 Packard Bell MDP3858-WE 0 -s 127a1023122d4023 MDP3858-UE 0 -s 127a102313e00247 IBM F-1156IV+/R6 Spain V.90 Modem 0 -s 127a102313e00297 IBM 0 -s 127a102313e002c7 IBM F-1156IV+/R6 WW V.90 Modem 0 -s 127a102314361203 IBM 0 -s 127a102314361303 IBM 0 -d 127a1024 HCF 56k Data/Fax/Voice Modem 0 -d 127a1025 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem 0 -s 127a102510cf106a Fujitsu 235-DFSV 0 -s 127a1025122d4021 Packard Bell MDP3858V-WE 0 -s 127a1025122d4022 MDP3858SP-WE 0 -s 127a1025122d4024 MDP3858V-UE 0 -s 127a1025122d4025 MDP3858SP-UE 0 -d 127a1026 HCF 56k PCI Speakerphone Modem 0 -d 127a1032 HCF 56k Modem 0 -d 127a1033 HCF 56k Modem 0 -d 127a1034 HCF 56k Modem 0 -d 127a1035 HCF 56k PCI Speakerphone Modem 0 -d 127a1036 HCF 56k Modem 0 -d 127a1085 HCF 56k Volcano PCI Modem 0 -d 127a2005 HCF 56k Data/Fax Modem 0 -s 127a2005104d8044 229-DFSV 0 -s 127a2005104d8045 229-DFSV 0 -s 127a2005104d8055 PBE/Aztech 235W-DFSV 0 -s 127a2005104d8056 235-DFSV 0 -s 127a2005104d805a Modem 0 -s 127a2005104d805f Modem 0 -s 127a2005104d8074 Modem 0 -d 127a2013 HSF 56k Data/Fax Modem 0 -s 127a201311790001 Modem 0 -s 127a20131179ff00 Modem 0 -d 127a2014 HSF 56k Data/Fax/Voice Modem 0 -s 127a201410cf1057 Fujitsu Citicorp III 0 -s 127a2014122d4050 MSP3880-U 0 -s 127a2014122d4055 MSP3880-W 0 -d 127a2015 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem 0 -s 127a201510cf1063 Fujitsu 0 -s 127a201510cf1064 Fujitsu 0 -s 127a201514682015 Fujitsu 0 -d 127a2016 HSF 56k Data/Fax/Voice/Spkp Modem 0 -s 127a2016122d4051 MSP3880V-W 0 -s 127a2016122d4052 MSP3880SP-W 0 -s 127a2016122d4054 MSP3880V-U 0 -s 127a2016122d4056 MSP3880SP-U 0 -s 127a2016122d4057 MSP3880SP-A 0 -d 127a4311 Riptide HSF 56k PCI Modem 0 -s 127a4311127a4311 Ring Modular? Riptide HSF RT HP Dom 0 -s 127a431113e00210 HP-GVC 0 -d 127a4320 Riptide PCI Audio Controller 0 -s 127a432012354320 Riptide PCI Audio Controller 0 -d 127a4321 Riptide HCF 56k PCI Modem 0 -s 127a432112354321 Hewlett Packard DF 0 -s 127a432112354324 Hewlett Packard DF 0 -s 127a432113e00210 Hewlett Packard DF 0 -s 127a4321144d2321 Riptide 0 -d 127a4322 Riptide PCI Game Controller 0 -s 127a432212354322 Riptide PCI Game Controller 0 -d 127a8234 RapidFire 616X ATM155 Adapter 0 -s 127a8234108d0022 RapidFire 616X ATM155 Adapter 0 -s 127a8234108d0027 RapidFire 616X ATM155 Adapter 0 -v 127b Pixera Corporation 0 -v 127c Crosspoint Solutions, Inc. 0 -v 127d Vela Research 0 -v 127e Winnov, L.P. 0 -v 127f Fujifilm 0 -v 1280 Photoscript Group Ltd. 0 -v 1281 Yokogawa Electric Corporation 0 -v 1282 Davicom Semiconductor, Inc. 0 -d 12829009 Ethernet 100/10 MBit 0 -d 12829100 21x4x DEC-Tulip compatible 10/100 Ethernet 0 -d 12829102 21x4x DEC-Tulip compatible 10/100 Ethernet 0 -d 12829132 Ethernet 100/10 MBit 0 -v 1283 Integrated Technology Express, Inc. 0 -d 1283673a IT8330G 0 -d 12838212 IT/ITE8212 Dual channel ATA RAID controller (PCI version seems to be IT8212, embedded seems to be ITE8212) 0 -s 1283821212830001 IT/ITE8212 Dual channel ATA RAID controller 0 -d 12838330 IT8330G 0 -d 12838872 IT8874F PCI Dual Serial Port Controller 0 -d 12838888 IT8888F PCI to ISA Bridge with SMB 0 -d 12838889 IT8889F PCI to ISA Bridge 0 -d 1283e886 IT8330G 0 -v 1284 Sahara Networks, Inc. 0 -v 1285 Platform Technologies, Inc. 0 -d 12850100 AGOGO sound chip (aka ESS Maestro 1) 0 -v 1286 Mazet GmbH 0 -v 1287 M-Pact, Inc. 0 -d 1287001e LS220D DVD Decoder 0 -d 1287001f LS220C DVD Decoder 0 -v 1288 Timestep Corporation 0 -v 1289 AVC Technology, Inc. 0 -v 128a Asante Technologies, Inc. 0 -v 128b Transwitch Corporation 0 -v 128c Retix Corporation 0 -v 128d G2 Networks, Inc. 0 -d 128d0021 ATM155 Adapter 0 -v 128e Hoontech Corporation/Samho Multi Tech Ltd. 0 -d 128e0008 ST128 WSS/SB 0 -d 128e0009 ST128 SAM9407 0 -d 128e000a ST128 Game Port 0 -d 128e000b ST128 MPU Port 0 -d 128e000c ST128 Ctrl Port 0 -v 128f Tateno Dennou, Inc. 0 -v 1290 Sord Computer Corporation 0 -v 1291 NCS Computer Italia 0 -v 1292 Tritech Microelectronics Inc 0 -v 1293 Media Reality Technology 0 -v 1294 Rhetorex, Inc. 0 -v 1295 Imagenation Corporation 0 -v 1296 Kofax Image Products 0 -v 1297 Holco Enterprise Co, Ltd/Shuttle Computer 0 -v 1298 Spellcaster Telecommunications Inc. 0 -v 1299 Knowledge Technology Lab. 0 -v 129a VMetro, inc. 0 -d 129a0615 PBT-615 PCI-X Bus Analyzer 0 -v 129b Image Access 0 -v 129c Jaycor 0 -v 129d Compcore Multimedia, Inc. 0 -v 129e Victor Company of Japan, Ltd. 0 -v 129f OEC Medical Systems, Inc. 0 -v 12a0 Allen-Bradley Company 0 -v 12a1 Simpact Associates, Inc. 0 -v 12a2 Newgen Systems Corporation 0 -v 12a3 Lucent Technologies 0 -d 12a38105 T8105 H100 Digital Switch 0 -v 12a4 NTT Electronics Technology Company 0 -v 12a5 Vision Dynamics Ltd. 0 -v 12a6 Scalable Networks, Inc. 0 -v 12a7 AMO GmbH 0 -v 12a8 News Datacom 0 -v 12a9 Xiotech Corporation 0 -v 12aa SDL Communications, Inc. 0 -v 12ab Yuan Yuan Enterprise Co., Ltd. 0 -d 12ab0002 AU8830 [Vortex2] Based Sound Card With A3D Support 0 -d 12ab3000 MPG-200C PCI DVD Decoder Card 0 -v 12ac Measurex Corporation 0 -v 12ad Multidata GmbH 0 -v 12ae Alteon Networks Inc. 0 -d 12ae0001 AceNIC Gigabit Ethernet 0 -s 12ae000110140104 Gigabit Ethernet-SX PCI Adapter 0 -s 12ae000112ae0001 Gigabit Ethernet-SX (Universal) 0 -s 12ae000114100104 Gigabit Ethernet-SX PCI Adapter 0 -d 12ae0002 AceNIC Gigabit Ethernet (Copper) 0 -s 12ae000210a98002 Acenic Gigabit Ethernet 0 -s 12ae000212ae0002 Gigabit Ethernet-T (3C986-T) 0 -d 12ae00fa Farallon PN9100-T Gigabit Ethernet 0 -v 12af TDK USA Corp 0 -v 12b0 Jorge Scientific Corp 0 -v 12b1 GammaLink 0 -v 12b2 General Signal Networks 0 -v 12b3 Inter-Face Co Ltd 0 -v 12b4 FutureTel Inc 0 -v 12b5 Granite Systems Inc. 0 -v 12b6 Natural Microsystems 0 -v 12b7 Cognex Modular Vision Systems Div. - Acumen Inc. 0 -v 12b8 Korg 0 -v 12b9 3Com Corp, Modem Division (formerly US Robotics) 0 -d 12b91006 WinModem 0 -s 12b9100612b9005c USR 56k Internal Voice WinModem (Model 3472) 0 -s 12b9100612b9005e USR 56k Internal WinModem (Models 662975) 0 -s 12b9100612b90062 USR 56k Internal Voice WinModem (Model 662978) 0 -s 12b9100612b90068 USR 56k Internal Voice WinModem (Model 5690) 0 -s 12b9100612b9007a USR 56k Internal Voice WinModem (Model 662974) 0 -s 12b9100612b9007f USR 56k Internal WinModem (Models 5698, 5699) 0 -s 12b9100612b90080 USR 56k Internal WinModem (Models 2975, 3528) 0 -s 12b9100612b90081 USR 56k Internal Voice WinModem (Models 2974, 3529) 0 -s 12b9100612b90091 USR 56k Internal Voice WinModem (Model 2978) 0 -d 12b91007 USR 56k Internal WinModem 0 -s 12b9100712b900a3 USR 56k Internal WinModem (Model 3595) 0 -d 12b91008 56K FaxModem Model 5610 0 -s 12b9100812b900a2 USR 56k Internal FAX Modem (Model 2977) 0 -s 12b9100812b900aa USR 56k Internal Voice Modem (Model 2976) 0 -s 12b9100812b900ab USR 56k Internal Voice Modem (Model 5609) 0 -s 12b9100812b900ac USR 56k Internal Voice Modem (Model 3298) 0 -s 12b9100812b900ad USR 56k Internal FAX Modem (Model 5610) 0 -v 12ba BittWare, Inc. 0 -v 12bb Nippon Unisoft Corporation 0 -v 12bc Array Microsystems 0 -v 12bd Computerm Corp. 0 -v 12be Anchor Chips Inc. 0 -d 12be3041 AN3041Q CO-MEM 0 -d 12be3042 AN3042Q CO-MEM Lite 0 -s 12be304212be3042 Anchor Chips Lite Evaluation Board 0 -v 12bf Fujifilm Microdevices 0 -v 12c0 Infimed 0 -v 12c1 GMM Research Corp 0 -v 12c2 Mentec Limited 0 -v 12c3 Holtek Microelectronics Inc 0 -d 12c30058 PCI NE2K Ethernet 0 -d 12c35598 PCI NE2K Ethernet 0 -v 12c4 Connect Tech Inc 0 -v 12c5 Picture Elements Incorporated 0 -d 12c5007e Imaging/Scanning Subsystem Engine 0 -d 12c5007f Imaging/Scanning Subsystem Engine 0 -d 12c50081 PCIVST [Grayscale Thresholding Engine] 0 -d 12c50085 Video Simulator/Sender 0 -d 12c50086 THR2 Multi-scale Thresholder 0 -v 12c6 Mitani Corporation 0 -v 12c7 Dialogic Corp 0 -v 12c8 G Force Co, Ltd 0 -v 12c9 Gigi Operations 0 -v 12ca Integrated Computing Engines 0 -v 12cb Antex Electronics Corporation 0 -v 12cc Pluto Technologies International 0 -v 12cd Aims Lab 0 -v 12ce Netspeed Inc. 0 -v 12cf Prophet Systems, Inc. 0 -v 12d0 GDE Systems, Inc. 0 -v 12d1 PSITech 0 -v 12d2 NVidia / SGS Thomson (Joint Venture) 0 -d 12d20008 NV1 0 -d 12d20009 DAC64 0 -d 12d20018 Riva128 0 -s 12d2001810480c10 VICTORY Erazor 0 -s 12d20018107b8030 STB Velocity 128 0 -s 12d2001810920350 Viper V330 0 -s 12d2001810921092 Viper V330 0 -s 12d2001810b41b1b STB Velocity 128 0 -s 12d2001810b41b1d STB Velocity 128 0 -s 12d2001810b41b1e STB Velocity 128, PAL TV-Out 0 -s 12d2001810b41b20 STB Velocity 128 Sapphire 0 -s 12d2001810b41b21 STB Velocity 128 0 -s 12d2001810b41b22 STB Velocity 128 AGP, NTSC TV-Out 0 -s 12d2001810b41b23 STB Velocity 128 AGP, PAL TV-Out 0 -s 12d2001810b41b27 STB Velocity 128 DVD 0 -s 12d2001810b41b88 MVP Pro 128 0 -s 12d2001810b4222a STB Velocity 128 AGP 0 -s 12d2001810b42230 STB Velocity 128 0 -s 12d2001810b42232 STB Velocity 128 0 -s 12d2001810b42235 STB Velocity 128 AGP 0 -s 12d200182a1554a3 3DVision-SAGP / 3DexPlorer 3000 0 -d 12d20019 Riva128ZX 0 -d 12d20020 TNT 0 -d 12d20028 TNT2 0 -d 12d20029 UTNT2 0 -d 12d2002c VTNT2 0 -d 12d200a0 ITNT2 0 -v 12d3 Vingmed Sound A/S 0 -v 12d4 Ulticom (Formerly DGM&S) 0 -d 12d40200 T1 Card 0 -v 12d5 Equator Technologies Inc 0 -v 12d6 Analogic Corp 0 -v 12d7 Biotronic SRL 0 -v 12d8 Pericom Semiconductor 0 -v 12d9 Aculab PLC 0 -d 12d90002 PCI Prosody 0 -d 12d90004 cPCI Prosody 0 -d 12d90005 Aculab E1/T1 PCI card 0 -v 12da True Time Inc. 0 -v 12db Annapolis Micro Systems, Inc 0 -v 12dc Symicron Computer Communication Ltd. 0 -v 12dd Management Graphics 0 -v 12de Rainbow Technologies 0 -d 12de0200 CryptoSwift CS200 0 -v 12df SBS Technologies Inc 0 -v 12e0 Chase Research 0 -d 12e00010 ST16C654 Quad UART 0 -d 12e00020 ST16C654 Quad UART 0 -d 12e00030 ST16C654 Quad UART 0 -v 12e1 Nintendo Co, Ltd 0 -v 12e2 Datum Inc. Bancomm-Timing Division 0 -v 12e3 Imation Corp - Medical Imaging Systems 0 -v 12e4 Brooktrout Technology Inc 0 -v 12e5 Apex Semiconductor Inc 0 -v 12e6 Cirel Systems 0 -v 12e7 Sunsgroup Corporation 0 -v 12e8 Crisc Corp 0 -v 12e9 GE Spacenet 0 -v 12ea Zuken 0 -v 12eb Aureal Semiconductor 0 -d 12eb0001 Vortex 1 0 -s 12eb0001104d8036 AU8820 Vortex Digital Audio Processor 0 -s 12eb000110922000 Sonic Impact A3D 0 -s 12eb000110922100 Sonic Impact A3D 0 -s 12eb000110922110 Sonic Impact A3D 0 -s 12eb000110922200 Sonic Impact A3D 0 -s 12eb0001122d1002 AU8820 Vortex Digital Audio Processor 0 -s 12eb000112eb0001 AU8820 Vortex Digital Audio Processor 0 -s 12eb000150533355 Montego 0 -d 12eb0002 Vortex 2 0 -s 12eb0002104d8049 AU8830 Vortex 3D Digital Audio Processor 0 -s 12eb0002104d807b AU8830 Vortex 3D Digital Audio Processor 0 -s 12eb000210923000 Monster Sound II 0 -s 12eb000210923001 Monster Sound II 0 -s 12eb000210923002 Monster Sound II 0 -s 12eb000210923003 Monster Sound II 0 -s 12eb000210923004 Monster Sound II 0 -s 12eb000212eb0001 AU8830 Vortex 3D Digital Audio Processor 0 -s 12eb000212eb0002 AU8830 Vortex 3D Digital Audio Processor 0 -s 12eb000212eb0088 AU8830 Vortex 3D Digital Audio Processor 0 -s 12eb0002144d3510 AU8830 Vortex 3D Digital Audio Processor 0 -s 12eb000250533356 Montego II 0 -d 12eb0003 AU8810 Vortex Digital Audio Processor 0 -s 12eb0003104d8049 AU8810 Vortex Digital Audio Processor 0 -s 12eb0003104d8077 AU8810 Vortex Digital Audio Processor 0 -s 12eb0003109f1000 AU8810 Vortex Digital Audio Processor 0 -s 12eb000312eb0003 AU8810 Vortex Digital Audio Processor 0 -s 12eb000314626780 AU8810 Vortex Digital Audio Processor 0 -s 12eb000314a42073 AU8810 Vortex Digital Audio Processor 0 -s 12eb000314a42091 AU8810 Vortex Digital Audio Processor 0 -s 12eb000314a42104 AU8810 Vortex Digital Audio Processor 0 -s 12eb000314a42106 AU8810 Vortex Digital Audio Processor 0 -d 12eb8803 Vortex 56k Software Modem 0 -s 12eb880312eb8803 Vortex 56k Software Modem 0 -v 12ec 3A International, Inc. 0 -v 12ed Optivision Inc. 0 -v 12ee Orange Micro 0 -v 12ef Vienna Systems 0 -v 12f0 Pentek 0 -v 12f1 Sorenson Vision Inc 0 -v 12f2 Gammagraphx, Inc. 0 -v 12f3 Radstone Technology 0 -v 12f4 Megatel 0 -v 12f5 Forks 0 -v 12f6 Dawson France 0 -v 12f7 Cognex 0 -v 12f8 Electronic Design GmbH 0 -d 12f80002 VideoMaker 0 -v 12f9 Four Fold Ltd 0 -v 12fb Spectrum Signal Processing 0 -v 12fc Capital Equipment Corp 0 -v 12fd I2S 0 -v 12fe ESD Electronic System Design GmbH 0 -v 12ff Lexicon 0 -v 1300 Harman International Industries Inc 0 -v 1302 Computer Sciences Corp 0 -v 1303 Innovative Integration 0 -v 1304 Juniper Networks 0 -v 1305 Netphone, Inc 0 -v 1306 Duet Technologies 0 -v 1307 Measurement Computing 0 Formerly ComputerBoards -d 13070001 PCI-DAS1602/16 0 -d 1307000b PCI-DIO48H 0 -d 1307000c PCI-PDISO8 0 -d 1307000d PCI-PDISO16 0 -d 1307000f PCI-DAS1200 0 -d 13070010 PCI-DAS1602/12 0 -d 13070014 PCI-DIO24H 0 -d 13070015 PCI-DIO24H/CTR3 0 -d 13070016 PCI-DIO48H/CTR15 0 -d 13070017 PCI-DIO96H 0 -d 13070018 PCI-CTR05 0 -d 13070019 PCI-DAS1200/JR 0 -d 1307001a PCI-DAS1001 0 -d 1307001b PCI-DAS1002 0 -d 1307001c PCI-DAS1602JR/16 0 -d 1307001d PCI-DAS6402/16 0 -d 1307001e PCI-DAS6402/12 0 -d 1307001f PCI-DAS16/M1 0 -d 13070020 PCI-DDA02/12 0 -d 13070021 PCI-DDA04/12 0 -d 13070022 PCI-DDA08/12 0 -d 13070023 PCI-DDA02/16 0 -d 13070024 PCI-DDA04/16 0 -d 13070025 PCI-DDA08/16 0 -d 13070026 PCI-DAC04/12-HS 0 -d 13070027 PCI-DAC04/16-HS 0 -d 13070028 PCI-DIO24 0 -d 13070029 PCI-DAS08 0 -d 1307002c PCI-INT32 0 -d 13070033 PCI-DUAL-AC5 0 -d 13070034 PCI-DAS-TC 0 -d 13070035 PCI-DAS64/M1/16 0 -d 13070036 PCI-DAS64/M2/16 0 -d 13070037 PCI-DAS64/M3/16 0 -d 1307004c PCI-DAS1000 0 -d 1307004d PCI-QUAD04 0 -d 13070052 PCI-DAS4020/12 0 -d 1307005e PCI-DAS6025 0 -v 1308 Jato Technologies Inc. 0 -d 13080001 NetCelerator Adapter 0 -s 1308000113080001 NetCelerator Adapter 0 -v 1309 AB Semiconductor Ltd 0 -v 130a Mitsubishi Electric Microcomputer 0 -v 130b Colorgraphic Communications Corp 0 -v 130c Ambex Technologies, Inc 0 -v 130d Accelerix Inc 0 -v 130e Yamatake-Honeywell Co. Ltd 0 -v 130f Advanet Inc 0 -v 1310 Gespac 0 -v 1311 Videoserver, Inc 0 -v 1312 Acuity Imaging, Inc 0 -v 1313 Yaskawa Electric Co. 0 -v 1316 Teradyne Inc 0 -v 1317 Linksys 0 -d 13170981 21x4x DEC-Tulip compatible 10/100 Ethernet 0 -d 13170985 NC100 Network Everywhere Fast Ethernet 10/100 0 -d 13171985 21x4x DEC-Tulip compatible 10/100 Ethernet 0 -d 13172850 HSP MicroModem 56 0 -d 13178201 ADMtek ADM8211 802.11b Wireless Interface 0 -s 1317820110b82635 SMC2635W 802.11b (11Mbps) wireless lan pcmcia (cardbus) card 0 -s 1317820113178201 SMC2635W 802.11b (11mbps) wireless lan pcmcia (cardbus) card 0 -d 13178211 ADMtek ADM8211 802.11b Wireless Interface 0 -d 13179511 21x4x DEC-Tulip compatible 10/100 Ethernet 0 -v 1318 Packet Engines Inc. 0 -d 13180911 GNIC-II PCI Gigabit Ethernet [Hamachi] 0 -v 1319 Fortemedia, Inc 0 -d 13190801 Xwave QS3000A [FM801] 0 -d 13190802 Xwave QS3000A [FM801 game port] 0 -d 13191000 FM801 PCI Audio 0 -d 13191001 FM801 PCI Joystick 0 -v 131a Finisar Corp. 0 -v 131c Nippon Electro-Sensory Devices Corp 0 -v 131d Sysmic, Inc. 0 -v 131e Xinex Networks Inc 0 -v 131f Siig Inc 0 -d 131f1000 CyberSerial (1-port) 16550 0 -d 131f1001 CyberSerial (1-port) 16650 0 -d 131f1002 CyberSerial (1-port) 16850 0 -d 131f1010 Duet 1S(16550)+1P 0 -d 131f1011 Duet 1S(16650)+1P 0 -d 131f1012 Duet 1S(16850)+1P 0 -d 131f1020 CyberParallel (1-port) 0 -d 131f1021 CyberParallel (2-port) 0 -d 131f1030 CyberSerial (2-port) 16550 0 -d 131f1031 CyberSerial (2-port) 16650 0 -d 131f1032 CyberSerial (2-port) 16850 0 -d 131f1034 Trio 2S(16550)+1P 0 -d 131f1035 Trio 2S(16650)+1P 0 -d 131f1036 Trio 2S(16850)+1P 0 -d 131f1050 CyberSerial (4-port) 16550 0 -d 131f1051 CyberSerial (4-port) 16650 0 -d 131f1052 CyberSerial (4-port) 16850 0 -d 131f2000 CyberSerial (1-port) 16550 0 -d 131f2001 CyberSerial (1-port) 16650 0 -d 131f2002 CyberSerial (1-port) 16850 0 -d 131f2010 Duet 1S(16550)+1P 0 -d 131f2011 Duet 1S(16650)+1P 0 -d 131f2012 Duet 1S(16850)+1P 0 -d 131f2020 CyberParallel (1-port) 0 -d 131f2021 CyberParallel (2-port) 0 -d 131f2030 CyberSerial (2-port) 16550 0 -s 131f2030131f2030 PCI Serial Card 0 -d 131f2031 CyberSerial (2-port) 16650 0 -d 131f2032 CyberSerial (2-port) 16850 0 -d 131f2040 Trio 1S(16550)+2P 0 -d 131f2041 Trio 1S(16650)+2P 0 -d 131f2042 Trio 1S(16850)+2P 0 -d 131f2050 CyberSerial (4-port) 16550 0 -d 131f2051 CyberSerial (4-port) 16650 0 -d 131f2052 CyberSerial (4-port) 16850 0 -d 131f2060 Trio 2S(16550)+1P 0 -d 131f2061 Trio 2S(16650)+1P 0 -d 131f2062 Trio 2S(16850)+1P 0 -d 131f2081 CyberSerial (8-port) ST16654 0 -v 1320 Crypto AG 0 -v 1321 Arcobel Graphics BV 0 -v 1322 MTT Co., Ltd 0 -v 1323 Dome Inc 0 -v 1324 Sphere Communications 0 -v 1325 Salix Technologies, Inc 0 -v 1326 Seachange international 0 -v 1327 Voss scientific 0 -v 1328 quadrant international 0 -v 1329 Productivity Enhancement 0 -v 132a Microcom Inc. 0 -v 132b Broadband Technologies 0 -v 132c Micrel Inc 0 -v 132d Integrated Silicon Solution, Inc. 0 -v 1330 MMC Networks 0 -v 1331 Radisys Corp. 0 -d 13310030 ENP-2611 0 -d 13318200 82600 Host Bridge 0 -d 13318201 82600 IDE 0 -d 13318202 82600 USB 0 -d 13318210 82600 PCI Bridge 0 -v 1332 Micro Memory 0 -d 13325415 MM-5415CN PCI Memory Module with Battery Backup 0 -d 13325425 MM-5425CN PCI 64/66 Memory Module with Battery Backup 0 -v 1334 Redcreek Communications, Inc 0 -v 1335 Videomail, Inc 0 -v 1337 Third Planet Publishing 0 -v 1338 BT Electronics 0 -v 133a Vtel Corp 0 -v 133b Softcom Microsystems 0 -v 133c Holontech Corp 0 -v 133d SS Technologies 0 -v 133e Virtual Computer Corp 0 -v 133f SCM Microsystems 0 -v 1340 Atalla Corp 0 -v 1341 Kyoto Microcomputer Co 0 -v 1342 Promax Systems Inc 0 -v 1343 Phylon Communications Inc 0 -v 1344 Crucial Technology 0 -v 1345 Arescom Inc 0 -v 1347 Odetics 0 -v 1349 Sumitomo Electric Industries, Ltd. 0 -v 134a DTC Technology Corp. 0 -d 134a0001 Domex 536 0 -d 134a0002 Domex DMX3194UP SCSI Adapter 0 -v 134b ARK Research Corp. 0 -v 134c Chori Joho System Co. Ltd 0 -v 134d PCTel Inc 0 -d 134d2189 HSP56 MicroModem 0 -d 134d2486 2304WT V.92 MDC Modem 0 -d 134d7890 HSP MicroModem 56 0 -s 134d7890134d0001 PCT789 adapter 0 -d 134d7891 HSP MicroModem 56 0 -s 134d7891134d0001 HSP MicroModem 56 0 -d 134d7892 HSP MicroModem 56 0 -d 134d7893 HSP MicroModem 56 0 -d 134d7894 HSP MicroModem 56 0 -d 134d7895 HSP MicroModem 56 0 -d 134d7896 HSP MicroModem 56 0 -d 134d7897 HSP MicroModem 56 0 -v 134e CSTI 0 -v 134f Algo System Co Ltd 0 -v 1350 Systec Co. Ltd 0 -v 1351 Sonix Inc 0 -v 1353 Thales Idatys 0 -d 13530002 Proserver 0 -d 13530003 PCI-FUT 0 -d 13530004 PCI-S0 0 -d 13530005 PCI-FUT-S0 0 -v 1354 Dwave System Inc 0 -v 1355 Kratos Analytical Ltd 0 -v 1356 The Logical Co 0 -v 1359 Prisa Networks 0 -v 135a Brain Boxes 0 -v 135b Giganet Inc 0 -v 135c Quatech Inc 0 -d 135c0010 QSC-100 0 -d 135c0020 DSC-100 0 -d 135c0030 DSC-200/300 0 -d 135c0040 QSC-200/300 0 -d 135c0050 ESC-100D 0 -d 135c0060 ESC-100M 0 -d 135c00f0 MPAC-100 Syncronous Serial Card (Zilog 85230) 0 -d 135c0170 QSCLP-100 0 -d 135c0180 DSCLP-100 0 -d 135c0190 SSCLP-100 0 -d 135c01a0 QSCLP-200/300 0 -d 135c01b0 DSCLP-200/300 0 -d 135c01c0 SSCLP-200/300 0 -v 135d ABB Network Partner AB 0 -v 135e Sealevel Systems Inc 0 -d 135e5101 Route 56.PCI - Multi-Protocol Serial Interface (Zilog Z16C32) 0 -d 135e7101 Single Port RS-232/422/485/530 0 -d 135e7201 Dual Port RS-232/422/485 Interface 0 -d 135e7202 Dual Port RS-232 Interface 0 -d 135e7401 Four Port RS-232 Interface 0 -d 135e7402 Four Port RS-422/485 Interface 0 -d 135e7801 Eight Port RS-232 Interface 0 -d 135e8001 8001 Digital I/O Adapter 0 -v 135f I-Data International A-S 0 -v 1360 Meinberg Funkuhren 0 -d 13600101 PCI32 DCF77 Radio Clock 0 -d 13600102 PCI509 DCF77 Radio Clock 0 -d 13600103 PCI510 DCF77 Radio Clock 0 -d 13600201 GPS167PCI GPS Receiver 0 -d 13600202 GPS168PCI GPS Receiver 0 -d 13600203 GPS169PCI GPS Receiver 0 -d 13600301 TCR510PCI IRIG Receiver 0 -v 1361 Soliton Systems K.K. 0 -v 1362 Fujifacom Corporation 0 -v 1363 Phoenix Technology Ltd 0 -v 1364 ATM Communications Inc 0 -v 1365 Hypercope GmbH 0 -v 1366 Teijin Seiki Co. Ltd 0 -v 1367 Hitachi Zosen Corporation 0 -v 1368 Skyware Corporation 0 -v 1369 Digigram 0 -v 136a High Soft Tech 0 -v 136b Kawasaki Steel Corporation 0 -d 136bff01 KL5A72002 Motion JPEG 0 -v 136c Adtek System Science Co Ltd 0 -v 136d Gigalabs Inc 0 -v 136f Applied Magic Inc 0 -v 1370 ATL Products 0 -v 1371 CNet Technology Inc 0 -d 1371434e GigaCard Network Adapter 0 -s 1371434e1371434e N-Way PCI-Bus Giga-Card 1000/100/10Mbps(L) 0 -v 1373 Silicon Vision Inc 0 -v 1374 Silicom Ltd 0 -v 1375 Argosystems Inc 0 -v 1376 LMC 0 -v 1377 Electronic Equipment Production & Distribution GmbH 0 -v 1378 Telemann Co. Ltd 0 -v 1379 Asahi Kasei Microsystems Co Ltd 0 -v 137a Mark of the Unicorn Inc 0 -d 137a0001 PCI-324 Audiowire Interface 0 -v 137b PPT Vision 0 -v 137c Iwatsu Electric Co Ltd 0 -v 137d Dynachip Corporation 0 -v 137e Patriot Scientific Corporation 0 -v 137f Japan Satellite Systems Inc 0 -v 1380 Sanritz Automation Co Ltd 0 -v 1381 Brains Co. Ltd 0 -v 1382 Marian - Electronic & Software 0 -d 13820001 ARC88 audio recording card 0 -d 13822088 Marc-8 MIDI 8 channel audio card 0 -v 1383 Controlnet Inc 0 -v 1384 Reality Simulation Systems Inc 0 -v 1385 Netgear 0 -d 13850013 WG311T 0 Note: This lists as Atheros Communications, Inc. AR5212 802.11abg NIC because of Madwifi -d 13854100 802.11b Wireless Adapter (MA301) 0 -d 13854105 MA311 802.11b wireless adapter 0 -d 13854400 WAG511 802.11a/b/g Dual Band Wireless PC Card 0 -d 13854600 WAG511 802.11a/b/g Dual Band Wireless PC Card 0 -d 13854601 WAG511 802.11a/b/g Dual Band Wireless PC Card 0 -d 13854610 WAG511 802.11a/b/g Dual Band Wireless PC Card 0 -d 13854a00 WAG311 802.11a/g Wireless PCI Adapter 0 -d 13854c00 WG311v2 54 Mbps Wireless PCI Adapter 0 -d 1385620a GA620 Gigabit Ethernet 0 -d 1385622a GA622 0 -d 1385630a GA630 Gigabit Ethernet 0 -d 1385f004 FA310TX 0 -v 1386 Video Domain Technologies 0 -v 1387 Systran Corp 0 -v 1388 Hitachi Information Technology Co Ltd 0 -v 1389 Applicom International 0 -d 13890001 PCI1500PFB [Intelligent fieldbus adaptor] 0 -v 138a Fusion Micromedia Corp 0 -v 138b Tokimec Inc 0 -v 138c Silicon Reality 0 -v 138d Future Techno Designs pte Ltd 0 -v 138e Basler GmbH 0 -v 138f Patapsco Designs Inc 0 -v 1390 Concept Development Inc 0 -v 1391 Development Concepts Inc 0 -v 1392 Medialight Inc 0 -v 1393 Moxa Technologies Co Ltd 0 -d 13931040 Smartio C104H/PCI 0 -d 13931141 Industrio CP-114 0 -d 13931680 Smartio C168H/PCI 0 -d 13932040 Intellio CP-204J 0 -d 13932180 Intellio C218 Turbo PCI 0 -d 13933200 Intellio C320 Turbo PCI 0 -v 1394 Level One Communications 0 -d 13940001 LXT1001 Gigabit Ethernet 0 -s 1394000113940001 NetCelerator Adapter 0 -v 1395 Ambicom Inc 0 -v 1396 Cipher Systems Inc 0 -v 1397 Cologne Chip Designs GmbH 0 -d 13972bd0 ISDN network controller [HFC-PCI] 0 -s 13972bd013972bd0 ISDN Board 0 -s 13972bd0e4bf1000 CI1-1-Harp 0 -v 1398 Clarion co. Ltd 0 -v 1399 Rios systems Co Ltd 0 -v 139a Alacritech Inc 0 -d 139a0001 Quad Port 10/100 Server Accelerator 0 -d 139a0003 Single Port 10/100 Server Accelerator 0 -d 139a0005 Single Port Gigabit Server Accelerator 0 -v 139b Mediasonic Multimedia Systems Ltd 0 -v 139c Quantum 3d Inc 0 -v 139d EPL limited 0 -v 139e Media4 0 -v 139f Aethra s.r.l. 0 -v 13a0 Crystal Group Inc 0 -v 13a1 Kawasaki Heavy Industries Ltd 0 -v 13a2 Ositech Communications Inc 0 -v 13a3 Hifn Inc. 0 -d 13a30005 7751 Security Processor 0 -d 13a30006 6500 Public Key Processor 0 -d 13a30007 7811 Security Processor 0 -d 13a30012 7951 Security Processor 0 -d 13a30014 78XX Security Processor 0 -d 13a30016 8065 Security Processor 0 -d 13a30017 8165 Security Processor 0 -d 13a30018 8154 Security Processor 0 -v 13a4 Rascom Inc 0 -v 13a5 Audio Digital Imaging Inc 0 -v 13a6 Videonics Inc 0 -v 13a7 Teles AG 0 -v 13a8 Exar Corp. 0 -d 13a80154 XR17C154 Quad UART 0 -d 13a80158 XR17C158 Octal UART 0 -v 13a9 Siemens Medical Systems, Ultrasound Group 0 -v 13aa Broadband Networks Inc 0 -v 13ab Arcom Control Systems Ltd 0 -v 13ac Motion Media Technology Ltd 0 -v 13ad Nexus Inc 0 -v 13ae ALD Technology Ltd 0 -v 13af T.Sqware 0 -v 13b0 Maxspeed Corp 0 -v 13b1 Tamura corporation 0 -v 13b2 Techno Chips Co. Ltd 0 -v 13b3 Lanart Corporation 0 -v 13b4 Wellbean Co Inc 0 -v 13b5 ARM 0 -v 13b6 Dlog GmbH 0 -v 13b7 Logic Devices Inc 0 -v 13b8 Nokia Telecommunications oy 0 -v 13b9 Elecom Co Ltd 0 -v 13ba Oxford Instruments 0 -v 13bb Sanyo Technosound Co Ltd 0 -v 13bc Bitran Corporation 0 -v 13bd Sharp corporation 0 -v 13be Miroku Jyoho Service Co. Ltd 0 -v 13bf Sharewave Inc 0 -v 13c0 Microgate Corporation 0 -d 13c00010 SyncLink Adapter v1 0 -d 13c00020 SyncLink SCC Adapter 0 -d 13c00030 SyncLink Multiport Adapter 0 -d 13c00210 SyncLink Adapter v2 0 -v 13c1 3ware Inc 0 -d 13c11000 3ware Inc 3ware 5xxx/6xxx-series PATA-RAID 0 -d 13c11001 3ware Inc 3ware 7xxx/8xxx-series PATA/SATA-RAID 0 -s 13c1100113c11001 3ware Inc 3ware 7xxx/8xxx-series PATA/SATA-RAID 0 -d 13c11002 3ware Inc 3ware 9xxx-series SATA-RAID 0 -v 13c2 Technotrend Systemtechnik GmbH 0 -v 13c3 Janz Computer AG 0 -v 13c4 Phase Metrics 0 -v 13c5 Alphi Technology Corp 0 -v 13c6 Condor Engineering Inc 0 -d 13c60520 CEI-520 A429 Card 0 -d 13c60620 CEI-620 A429 Card 0 -d 13c60820 CEI-820 A429 Card 0 -v 13c7 Blue Chip Technology Ltd 0 -v 13c8 Apptech Inc 0 -v 13c9 Eaton Corporation 0 -v 13ca Iomega Corporation 0 -v 13cb Yano Electric Co Ltd 0 -v 13cc Metheus Corporation 0 -v 13cd Compatible Systems Corporation 0 -v 13ce Cocom A/S 0 -v 13cf Studio Audio & Video Ltd 0 -v 13d0 Techsan Electronics Co Ltd 0 -d 13d02103 B2C2 FlexCopII DVB chip / Technisat SkyStar2 DVB card 0 -d 13d02200 B2C2 FlexCopIII DVB chip / Technisat SkyStar2 DVB card 0 -v 13d1 Abocom Systems Inc 0 -d 13d1ab02 ADMtek Centaur-C rev 17 [D-Link DFE-680TX] CardBus Fast Ethernet Adapter 0 -d 13d1ab03 21x4x DEC-Tulip compatible 10/100 Ethernet 0 -d 13d1ab06 RTL8139 [FE2000VX] CardBus Fast Ethernet Attached Port Adapter 0 -d 13d1ab08 21x4x DEC-Tulip compatible 10/100 Ethernet 0 -v 13d2 Shark Multimedia Inc 0 -v 13d3 IMC Networks 0 -v 13d4 Graphics Microsystems Inc 0 -v 13d5 Media 100 Inc 0 -v 13d6 K.I. Technology Co Ltd 0 -v 13d7 Toshiba Engineering Corporation 0 -v 13d8 Phobos corporation 0 -v 13d9 Apex PC Solutions Inc 0 -v 13da Intresource Systems pte Ltd 0 -v 13db Janich & Klass Computertechnik GmbH 0 -v 13dc Netboost Corporation 0 -v 13dd Multimedia Bundle Inc 0 -v 13de ABB Robotics Products AB 0 -v 13df E-Tech Inc 0 -d 13df0001 PCI56RVP Modem 0 -s 13df000113df0001 PCI56RVP Modem 0 -v 13e0 GVC Corporation 0 -v 13e1 Silicom Multimedia Systems Inc 0 -v 13e2 Dynamics Research Corporation 0 -v 13e3 Nest Inc 0 -v 13e4 Calculex Inc 0 -v 13e5 Telesoft Design Ltd 0 -v 13e6 Argosy research Inc 0 -v 13e7 NAC Incorporated 0 -v 13e8 Chip Express Corporation 0 -v 13e9 Intraserver Technology Inc 0 -v 13ea Dallas Semiconductor 0 -v 13eb Hauppauge Computer Works Inc 0 -v 13ec Zydacron Inc 0 -v 13ed Raytheion E-Systems 0 -v 13ee Hayes Microcomputer Products Inc 0 -v 13ef Coppercom Inc 0 -v 13f0 Sundance Technology Inc 0 -d 13f00201 ST201 Sundance Ethernet 0 -v 13f1 Oce' - Technologies B.V. 0 -v 13f2 Ford Microelectronics Inc 0 -v 13f3 Mcdata Corporation 0 -v 13f4 Troika Networks, Inc. 0 -d 13f41401 Zentai Fibre Channel Adapter 0 -v 13f5 Kansai Electric Co. Ltd 0 -v 13f6 C-Media Electronics Inc 0 -d 13f60011 CMI8738 0 -d 13f60100 CM8338A 0 -s 13f6010013f6ffff CMI8338/C3DX PCI Audio Device 0 -d 13f60101 CM8338B 0 -s 13f6010113f60101 CMI8338-031 PCI Audio Device 0 -d 13f60111 CM8738 0 -s 13f6011110190970 P6STP-FL motherboard 0 -s 13f6011110438035 CUSI-FX motherboard 0 -s 13f6011110438077 CMI8738 6-channel audio controller 0 -s 13f60111104380e2 CMI8738 6ch-MX 0 -s 13f6011113f60111 CMI8738/C3DX PCI Audio Device 0 -s 13f601111681a000 Gamesurround MUSE XL 0 -d 13f60211 CM8738 0 -v 13f7 Wildfire Communications 0 -v 13f8 Ad Lib Multimedia Inc 0 -v 13f9 NTT Advanced Technology Corp. 0 -v 13fa Pentland Systems Ltd 0 -v 13fb Aydin Corp 0 -v 13fc Computer Peripherals International 0 -v 13fd Micro Science Inc 0 -v 13fe Advantech Co. Ltd 0 -d 13fe1240 PCI-1240 4-channel stepper motor controller card w. Nova Electronics MCX314 0 -d 13fe1600 PCI-1612 4-port RS-232/422/485 PCI Communication Card 0 -d 13fe1752 PCI-1752 0 -d 13fe1754 PCI-1754 0 -d 13fe1756 PCI-1756 0 -v 13ff Silicon Spice Inc 0 -v 1400 Artx Inc 0 -d 14001401 9432 TX 0 -v 1401 CR-Systems A/S 0 -v 1402 Meilhaus Electronic GmbH 0 -v 1403 Ascor Inc 0 -v 1404 Fundamental Software Inc 0 -v 1405 Excalibur Systems Inc 0 -v 1406 Oce' Printing Systems GmbH 0 -v 1407 Lava Computer mfg Inc 0 -d 14070100 Lava Dual Serial 0 -d 14070101 Lava Quatro A 0 -d 14070102 Lava Quatro B 0 -d 14070120 Quattro-PCI A 0 -d 14070121 Quattro-PCI B 0 -d 14070180 Lava Octo A 0 -d 14070181 Lava Octo B 0 -d 14070200 Lava Port Plus 0 -d 14070201 Lava Quad A 0 -d 14070202 Lava Quad B 0 -d 14070220 Lava Quattro PCI Ports A/B 0 -d 14070221 Lava Quattro PCI Ports C/D 0 -d 14070500 Lava Single Serial 0 -d 14070600 Lava Port 650 0 -d 14078000 Lava Parallel 0 -d 14078001 Dual parallel port controller A 0 -d 14078002 Lava Dual Parallel port A 0 -d 14078003 Lava Dual Parallel port B 0 -d 14078800 BOCA Research IOPPAR 0 -v 1408 Aloka Co. Ltd 0 -v 1409 Timedia Technology Co Ltd 0 -d 14097168 PCI2S550 (Dual 16550 UART) 0 -v 140a DSP Research Inc 0 -v 140b Ramix Inc 0 -v 140c Elmic Systems Inc 0 -v 140d Matsushita Electric Works Ltd 0 -v 140e Goepel Electronic GmbH 0 -v 140f Salient Systems Corp 0 -v 1410 Midas lab Inc 0 -v 1411 Ikos Systems Inc 0 -v 1412 VIA Technologies Inc. 0 formerly IC Ensemble Inc. -d 14121712 ICE1712 [Envy24] PCI Multi-Channel I/O Controller 0 -s 141217121412d638 M-Audio Delta 410 0 -d 14121724 VT1720/24 [Envy24PT/HT] PCI Multi-Channel Audio Controller 0 -v 1413 Addonics 0 -v 1414 Microsoft Corporation 0 -v 1415 Oxford Semiconductor Ltd 0 -d 14158403 VScom 011H-EP1 1 port parallel adaptor 0 -d 14159501 OX16PCI954 (Quad 16950 UART) function 0 0 -s 14159501131f2050 CyberPro (4-port) 0 -s 1415950115ed2000 MCCR Serial p0-3 of 8 0 -s 1415950115ed2001 MCCR Serial p0-3 of 16 0 -d 1415950a EXSYS EX-41092 Dual 16950 Serial adapter 0 -d 1415950b OXCB950 Cardbus 16950 UART 0 -d 14159511 OX16PCI954 (Quad 16950 UART) function 1 0 -s 1415951115ed2000 MCCR Serial p4-7 of 8 0 -s 1415951115ed2001 MCCR Serial p4-15 of 16 0 -d 14159521 OX16PCI952 (Dual 16950 UART) 0 -v 1416 Multiwave Innovation pte Ltd 0 -v 1417 Convergenet Technologies Inc 0 -v 1418 Kyushu electronics systems Inc 0 -v 1419 Excel Switching Corp 0 -v 141a Apache Micro Peripherals Inc 0 -v 141b Zoom Telephonics Inc 0 -v 141d Digitan Systems Inc 0 -v 141e Fanuc Ltd 0 -v 141f Visiontech Ltd 0 -v 1420 Psion Dacom plc 0 -d 14208002 Gold Card NetGlobal 56k+10/100Mb CardBus (Ethernet part) 0 -d 14208003 Gold Card NetGlobal 56k+10/100Mb CardBus (Modem part) 0 -v 1421 Ads Technologies Inc 0 -v 1422 Ygrec Systems Co Ltd 0 -v 1423 Custom Technology Corp. 0 -v 1424 Videoserver Connections 0 -v 1425 Chelsio Communications Inc 0 -v 1426 Storage Technology Corp. 0 -v 1427 Better On-Line Solutions 0 -v 1428 Edec Co Ltd 0 -v 1429 Unex Technology Corp. 0 -v 142a Kingmax Technology Inc 0 -v 142b Radiolan 0 -v 142c Minton Optic Industry Co Ltd 0 -v 142d Pix stream Inc 0 -v 142e Vitec Multimedia 0 -d 142e4020 VM2-2 [Video Maker 2] MPEG1/2 Encoder 0 -v 142f Radicom Research Inc 0 -v 1430 ITT Aerospace/Communications Division 0 -v 1431 Gilat Satellite Networks 0 -v 1432 Edimax Computer Co. 0 -d 14329130 RTL81xx Fast Ethernet 0 -v 1433 Eltec Elektronik GmbH 0 -v 1435 Real Time Devices US Inc. 0 -v 1436 CIS Technology Inc 0 -v 1437 Nissin Inc Co 0 -v 1438 Atmel-dream 0 -v 1439 Outsource Engineering & Mfg. Inc 0 -v 143a Stargate Solutions Inc 0 -v 143b Canon Research Center, America 0 -v 143c Amlogic Inc 0 -v 143d Tamarack Microelectronics Inc 0 -v 143e Jones Futurex Inc 0 -v 143f Lightwell Co Ltd - Zax Division 0 -v 1440 ALGOL Corp. 0 -v 1441 AGIE Ltd 0 -v 1442 Phoenix Contact GmbH & Co. 0 -v 1443 Unibrain S.A. 0 -v 1444 TRW 0 -v 1445 Logical DO Ltd 0 -v 1446 Graphin Co Ltd 0 -v 1447 AIM GmBH 0 -v 1448 Alesis Studio Electronics 0 -v 1449 TUT Systems Inc 0 -v 144a Adlink Technology 0 -d 144a7296 PCI-7296 0 -d 144a7432 PCI-7432 0 -d 144a7433 PCI-7433 0 -d 144a7434 PCI-7434 0 -d 144a7841 PCI-7841 0 -d 144a8133 PCI-8133 0 -d 144a8164 PCI-8164 0 -d 144a8554 PCI-8554 0 -d 144a9111 PCI-9111 0 -d 144a9113 PCI-9113 0 -d 144a9114 PCI-9114 0 -v 144b Loronix Information Systems Inc 0 -v 144c Catalina Research Inc 0 -v 144d Samsung Electronics Co Ltd 0 -v 144e OLITEC 0 -v 144f Askey Computer Corp. 0 -v 1450 Octave Communications Ind. 0 -v 1451 SP3D Chip Design GmBH 0 -v 1453 MYCOM Inc 0 -v 1454 Altiga Networks 0 -v 1455 Logic Plus Plus Inc 0 -v 1456 Advanced Hardware Architectures 0 -v 1457 Nuera Communications Inc 0 -v 1458 Giga-byte Technology 0 -v 1459 DOOIN Electronics 0 -v 145a Escalate Networks Inc 0 -v 145b PRAIM SRL 0 -v 145c Cryptek 0 -v 145d Gallant Computer Inc 0 -v 145e Aashima Technology B.V. 0 -v 145f Baldor Electric Company 0 -d 145f0001 NextMove PCI 0 -v 1460 DYNARC INC 0 -v 1461 Avermedia Technologies Inc 0 -v 1462 Micro-Star International Co., Ltd. 0 -d 14626825 PCI Card wireless 11g [PC54G] 0 -d 14628725 NVIDIA NV25 [GeForce4 Ti 4600] VGA Adapter 0 -d 14629000 NVIDIA NV28 [GeForce4 Ti 4800] VGA Adapter 0 MSI G4Ti4800, 128MB DDR SDRAM, TV-Out, DVI-I -d 14629119 NVIDIA NV31 [GeForce FX 5600XT] VGA Adapter 0 -v 1463 Fast Corporation 0 -v 1464 Interactive Circuits & Systems Ltd 0 -v 1465 GN NETTEST Telecom DIV. 0 -v 1466 Designpro Inc. 0 -v 1467 DIGICOM SPA 0 -v 1468 AMBIT Microsystem Corp. 0 -v 1469 Cleveland Motion Controls 0 -v 146a IFR 0 -v 146b Parascan Technologies Ltd 0 -v 146c Ruby Tech Corp. 0 -d 146c1430 FE-1430TX Fast Ethernet PCI Adapter 0 -v 146d Tachyon, INC. 0 -v 146e Williams Electronics Games, Inc. 0 -v 146f Multi Dimensional Consulting Inc 0 -v 1470 Bay Networks 0 -v 1471 Integrated Telecom Express Inc 0 -v 1472 DAIKIN Industries, Ltd 0 -v 1473 ZAPEX Technologies Inc 0 -v 1474 Doug Carson & Associates 0 -v 1475 PICAZO Communications 0 -v 1476 MORTARA Instrument Inc 0 -v 1477 Net Insight 0 -v 1478 DIATREND Corporation 0 -v 1479 TORAY Industries Inc 0 -v 147a FORMOSA Industrial Computing 0 -v 147b ABIT Computer Corp. 0 -v 147c AWARE, Inc. 0 -v 147d Interworks Computer Products 0 -v 147e Matsushita Graphic Communication Systems, Inc. 0 -v 147f NIHON UNISYS, Ltd. 0 -v 1480 SCII Telecom 0 -v 1481 BIOPAC Systems Inc 0 -v 1482 ISYTEC - Integrierte Systemtechnik GmBH 0 -v 1483 LABWAY Corporation 0 -v 1484 Logic Corporation 0 -v 1485 ERMA - Electronic GmBH 0 -v 1486 L3 Communications Telemetry & Instrumentation 0 -v 1487 MARQUETTE Medical Systems 0 -v 1488 KONTRON Electronik GmBH 0 -v 1489 KYE Systems Corporation 0 -v 148a OPTO 0 -v 148b INNOMEDIALOGIC Inc. 0 -v 148c C.P. Technology Co. Ltd 0 -v 148d DIGICOM Systems, Inc. 0 -d 148d1003 HCF 56k Data/Fax Modem 0 -v 148e OSI Plus Corporation 0 -v 148f Plant Equipment, Inc. 0 -v 1490 Stone Microsystems PTY Ltd. 0 -v 1491 ZEAL Corporation 0 -v 1492 Time Logic Corporation 0 -v 1493 MAKER Communications 0 -v 1494 WINTOP Technology, Inc. 0 -v 1495 TOKAI Communications Industry Co. Ltd 0 -v 1496 JOYTECH Computer Co., Ltd. 0 -v 1497 SMA Regelsysteme GmBH 0 -v 1498 TEWS Datentechnik GmBH 0 -d 149830c8 TPCI200 0 -v 1499 EMTEC CO., Ltd 0 -v 149a ANDOR Technology Ltd 0 -v 149b SEIKO Instruments Inc 0 -v 149c OVISLINK Corp. 0 -v 149d NEWTEK Inc 0 -d 149d0001 Video Toaster for PC 0 -v 149e Mapletree Networks Inc. 0 -v 149f LECTRON Co Ltd 0 -v 14a0 SOFTING GmBH 0 -v 14a1 Systembase Co Ltd 0 -v 14a2 Millennium Engineering Inc 0 -v 14a3 Maverick Networks 0 -v 14a4 GVC/BCM Advanced Research 0 -v 14a5 XIONICS Document Technologies Inc 0 -v 14a6 INOVA Computers GmBH & Co KG 0 -v 14a7 MYTHOS Systems Inc 0 -v 14a8 FEATRON Technologies Corporation 0 -v 14a9 HIVERTEC Inc 0 -v 14aa Advanced MOS Technology Inc 0 -v 14ab Mentor Graphics Corp. 0 -v 14ac Novaweb Technologies Inc 0 -v 14ad Time Space Radio AB 0 -v 14ae CTI, Inc 0 -v 14af Guillemot Corporation 0 -d 14af7102 3D Prophet II MX 0 -v 14b0 BST Communication Technology Ltd 0 -v 14b1 Nextcom K.K. 0 -v 14b2 ENNOVATE Networks Inc 0 -v 14b3 XPEED Inc 0 -d 14b30000 DSL NIC 0 -v 14b4 PHILIPS Business Electronics B.V. 0 -v 14b5 Creamware GmBH 0 -d 14b50200 Scope 0 -d 14b50300 Pulsar 0 -d 14b50400 PulsarSRB 0 -d 14b50600 Pulsar2 0 -d 14b50800 DSP-Board 0 -d 14b50900 DSP-Board 0 -d 14b50a00 DSP-Board 0 -d 14b50b00 DSP-Board 0 -v 14b6 Quantum Data Corp. 0 -v 14b7 PROXIM Inc 0 -d 14b70001 Symphony 4110 0 -v 14b8 Techsoft Technology Co Ltd 0 -v 14b9 AIRONET Wireless Communications 0 -d 14b90001 PC4800 0 -d 14b90340 PC4800 0 -d 14b90350 PC4800 0 -d 14b94500 PC4500 0 -d 14b94800 Cisco Aironet 340 802.11b Wireless LAN Adapter/Aironet PC4800 0 -d 14b9a504 Cisco Aironet Wireless 802.11b 0 -d 14b9a505 Cisco Aironet CB20a 802.11a Wireless LAN Adapter 0 -d 14b9a506 Cisco Aironet Mini PCI b/g 0 -v 14ba INTERNIX Inc. 0 -v 14bb SEMTECH Corporation 0 -v 14bc Globespan Semiconductor Inc. 0 -v 14bd CARDIO Control N.V. 0 -v 14be L3 Communications 0 -v 14bf SPIDER Communications Inc. 0 -v 14c0 COMPAL Electronics Inc 0 -v 14c1 MYRICOM Inc. 0 -d 14c18043 Myrinet 2000 Scalable Cluster Interconnect 0 -v 14c2 DTK Computer 0 -v 14c3 MEDIATEK Corp. 0 -v 14c4 IWASAKI Information Systems Co Ltd 0 -v 14c5 Automation Products AB 0 -v 14c6 Data Race Inc 0 -v 14c7 Modular Technology Holdings Ltd 0 -v 14c8 Turbocomm Tech. Inc. 0 -v 14c9 ODIN Telesystems Inc 0 -v 14ca PE Logic Corp. 0 -v 14cb Billionton Systems Inc 0 -v 14cc NAKAYO Telecommunications Inc 0 -v 14cd Universal Scientific Ind. 0 -v 14ce Whistle Communications 0 -v 14cf TEK Microsystems Inc. 0 -v 14d0 Ericsson Axe R & D 0 -v 14d1 Computer Hi-Tech Co Ltd 0 -v 14d2 Titan Electronics Inc 0 -d 14d28001 VScom 010L 1 port parallel adaptor 0 -d 14d28002 VScom 020L 2 port parallel adaptor 0 -d 14d28010 VScom 100L 1 port serial adaptor 0 -d 14d28011 VScom 110L 1 port serial and 1 port parallel adaptor 0 -d 14d28020 VScom 200L 1 port serial adaptor 0 -d 14d28021 VScom 210L 2 port serial and 1 port parallel adaptor 0 -d 14d28040 VScom 400L 4 port serial adaptor 0 -d 14d28080 VScom 800L 8 port serial adaptor 0 -d 14d2a000 VScom 010H 1 port parallel adaptor 0 -d 14d2a001 VScom 100H 1 port serial adaptor 0 -d 14d2a003 VScom 400H 4 port serial adaptor 0 -d 14d2a004 VScom 400HF1 4 port serial adaptor 0 -d 14d2a005 VScom 200H 2 port serial adaptor 0 -d 14d2e001 VScom 010HV2 1 port parallel adaptor 0 -d 14d2e010 VScom 100HV2 1 port serial adaptor 0 -d 14d2e020 VScom 200HV2 2 port serial adaptor 0 -v 14d3 CIRTECH (UK) Ltd 0 -v 14d4 Panacom Technology Corp 0 -v 14d5 Nitsuko Corporation 0 -v 14d6 Accusys Inc 0 -v 14d7 Hirakawa Hewtech Corp 0 -v 14d8 HOPF Elektronik GmBH 0 -v 14d9 Alliance Semiconductor Corporation 0 Formerly SiPackets, Inc., formerly API NetWorks, Inc., formerly Alpha Processor, Inc. -d 14d90010 AP1011/SP1011 HyperTransport-PCI Bridge [Sturgeon] 0 -d 14d99000 AS90L10204/10208 HyperTransport to PCI-X Bridge 0 -v 14da National Aerospace Laboratories 0 -v 14db AFAVLAB Technology Inc 0 -d 14db2120 TK9902 0 -v 14dc Amplicon Liveline Ltd 0 -d 14dc0000 PCI230 0 -d 14dc0001 PCI242 0 -d 14dc0002 PCI244 0 -d 14dc0003 PCI247 0 -d 14dc0004 PCI248 0 -d 14dc0005 PCI249 0 -d 14dc0006 PCI260 0 -d 14dc0007 PCI224 0 -d 14dc0008 PCI234 0 -d 14dc0009 PCI236 0 -d 14dc000a PCI272 0 -d 14dc000b PCI215 0 -v 14dd Boulder Design Labs Inc 0 -v 14de Applied Integration Corporation 0 -v 14df ASIC Communications Corp 0 -v 14e1 INVERTEX 0 -v 14e2 INFOLIBRIA 0 -v 14e3 AMTELCO 0 -v 14e4 Broadcom Corporation 0 -d 14e40800 Sentry5 Chipcommon I/O Controller 0 -d 14e40804 Sentry5 PCI Bridge 0 -d 14e40805 Sentry5 MIPS32 CPU 0 -d 14e40806 Sentry5 Ethernet Controller 0 -d 14e4080b Sentry5 Crypto Accelerator 0 -d 14e4080f Sentry5 DDR/SDR RAM Controller 0 -d 14e40811 Sentry5 External Interface Core 0 -d 14e40816 BCM3302 Sentry5 MIPS32 CPU 0 -d 14e41644 NetXtreme BCM5700 Gigabit Ethernet 0 -s 14e4164410140277 Broadcom Vigil B5700 1000Base-T 0 -s 14e41644102800d1 Broadcom BCM5700 0 -s 14e4164410280106 Broadcom BCM5700 0 -s 14e4164410280109 Broadcom BCM5700 1000Base-T 0 -s 14e416441028010a Broadcom BCM5700 1000BaseTX 0 -s 14e4164410b71000 3C996-T 1000Base-T 0 -s 14e4164410b71001 3C996B-T 1000Base-T 0 -s 14e4164410b71002 3C996C-T 1000Base-T 0 -s 14e4164410b71003 3C997-T 1000Base-T Dual Port 0 -s 14e4164410b71004 3C996-SX 1000Base-SX 0 -s 14e4164410b71005 3C997-SX 1000Base-SX Dual Port 0 -s 14e4164410b71008 3C942 Gigabit LOM (31X31) 0 -s 14e4164414e40002 NetXtreme 1000Base-SX 0 -s 14e4164414e40003 NetXtreme 1000Base-SX 0 -s 14e4164414e40004 NetXtreme 1000Base-T 0 -s 14e4164414e41028 NetXtreme 1000BaseTX 0 -s 14e4164414e41644 BCM5700 1000Base-T 0 -d 14e41645 NetXtreme BCM5701 Gigabit Ethernet 0 -s 14e416450e11007c NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T) 0 -s 14e416450e11007d NC6770 Gigabit Server Adapter (PCI-X, 1000-SX) 0 -s 14e416450e110085 NC7780 Gigabit Server Adapter (embedded, WOL) 0 -s 14e416450e110099 NC7780 Gigabit Server Adapter (embedded, WOL) 0 -s 14e416450e11009a NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T) 0 -s 14e416450e1100c1 NC6770 Gigabit Server Adapter (PCI-X, 1000-SX) 0 -s 14e4164510280121 Broadcom BCM5701 1000Base-T 0 -s 14e41645103c128a HP 1000Base-T (PCI) [A7061A] 0 -s 14e41645103c128b HP 1000Base-SX (PCI) [A7073A] 0 -s 14e41645103c12a4 HP Core Lan 1000Base-T 0 -s 14e41645103c12c1 HP IOX Core Lan 1000Base-T [A7109AX] 0 -s 14e4164510a98010 SGI IO9 Gigabit Ethernet (Copper) 0 -s 14e4164510a98011 SGI Gigabit Ethernet (Copper) 0 -s 14e4164510a98012 SGI Gigabit Ethernet (Fiber) 0 -s 14e4164510b71004 3C996-SX 1000Base-SX 0 -s 14e4164510b71006 3C996B-T 1000Base-T 0 -s 14e4164510b71007 3C1000-T 1000Base-T 0 -s 14e4164510b71008 3C940-BR01 1000Base-T 0 -s 14e4164514e40001 BCM5701 1000Base-T 0 -s 14e4164514e40005 BCM5701 1000Base-T 0 -s 14e4164514e40006 BCM5701 1000Base-T 0 -s 14e4164514e40007 BCM5701 1000Base-SX 0 -s 14e4164514e40008 BCM5701 1000Base-T 0 -s 14e4164514e48008 BCM5701 1000Base-T 0 -d 14e41646 NetXtreme BCM5702 Gigabit Ethernet 0 -s 14e416460e1100bb NC7760 1000BaseTX 0 -s 14e4164610280126 Broadcom BCM5702 1000BaseTX 0 -s 14e4164614e48009 BCM5702 1000BaseTX 0 -d 14e41647 NetXtreme BCM5703 Gigabit Ethernet 0 -s 14e416470e110099 NC7780 1000BaseTX 0 -s 14e416470e11009a NC7770 1000BaseTX 0 -s 14e4164710a98010 SGI IO9 Gigabit Ethernet (Copper) 0 -s 14e4164714e40009 BCM5703 1000BaseTX 0 -s 14e4164714e4000a BCM5703 1000BaseSX 0 -s 14e4164714e4000b BCM5703 1000BaseTX 0 -s 14e4164714e48009 BCM5703 1000BaseTX 0 -s 14e4164714e4800a BCM5703 1000BaseTX 0 -d 14e41648 NetXtreme BCM5704 Gigabit Ethernet 0 -s 14e416480e1100cf NC7772 Gigabit Server Adapter (PCI-X, 10,100,1000-T) 0 -s 14e416480e1100d0 NC7782 Gigabit Server Adapter (PCI-X, 10,100,1000-T) 0 -s 14e416480e1100d1 NC7783 Gigabit Server Adapter (PCI-X, 10,100,1000-T) 0 -s 14e4164810b72000 3C998-T Dual Port 10/100/1000 PCI-X 0 -s 14e4164810b73000 3C999-T Quad Port 10/100/1000 PCI-X 0 -s 14e4164811661648 NetXtreme CIOB-E 1000Base-T 0 -d 14e4164a NetXtreme II BCM5706 Gigabit Ethernet 0 -d 14e4164d NetXtreme BCM5702FE Gigabit Ethernet 0 -d 14e41653 NetXtreme BCM5705 Gigabit Ethernet 0 -s 14e416530e1100e3 NC7761 Gigabit Server Adapter 0 -d 14e41654 NetXtreme BCM5705_2 Gigabit Ethernet 0 -s 14e416540e1100e3 NC7761 Gigabit Server Adapter 0 -s 14e41654103c3100 NC1020 HP ProLiant Gigabit Server Adapter 32 PCI 0 -d 14e41659 NetXtreme BCM5721 Gigabit Ethernet PCI Express 0 -d 14e4165d NetXtreme BCM5705M Gigabit Ethernet 0 -d 14e4165e NetXtreme BCM5705M_2 Gigabit Ethernet 0 -s 14e4165e103c0890 NC6000 laptop 0 -d 14e4166e 570x 10/100 Integrated Controller 0 -d 14e41677 NetXtreme BCM5751 Gigabit Ethernet PCI Express 0 -s 14e4167710280179 Optiplex GX280 0 -d 14e4167d NetXtreme BCM5751M Gigabit Ethernet PCI Express 0 -d 14e4167e NetXtreme BCM5751F Fast Ethernet PCI Express 0 -d 14e41696 NetXtreme BCM5782 Gigabit Ethernet 0 -s 14e41696103c12bc HP d530 CMT (DG746A) 0 -s 14e4169614e4000d NetXtreme BCM5782 1000Base-T 0 -d 14e4169c NetXtreme BCM5788 Gigabit Ethernet 0 -d 14e4169d NetLink BCM5789 Gigabit Ethernet PCI Express 0 -d 14e416a6 NetXtreme BCM5702X Gigabit Ethernet 0 -s 14e416a60e1100bb NC7760 Gigabit Server Adapter (PCI-X, 10/100/1000-T) 0 -s 14e416a610280126 BCM5702 1000Base-T 0 -s 14e416a614e4000c BCM5702 1000Base-T 0 -s 14e416a614e48009 BCM5702 1000Base-T 0 -d 14e416a7 NetXtreme BCM5703X Gigabit Ethernet 0 -s 14e416a70e1100ca NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T) 0 -s 14e416a70e1100cb NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T) 0 -s 14e416a714e40009 NetXtreme BCM5703 1000Base-T 0 -s 14e416a714e4000a NetXtreme BCM5703 1000Base-SX 0 -s 14e416a714e4000b NetXtreme BCM5703 1000Base-T 0 -s 14e416a714e4800a NetXtreme BCM5703 1000Base-T 0 -d 14e416a8 NetXtreme BCM5704S Gigabit Ethernet 0 -s 14e416a810b72001 3C998-SX Dual Port 1000-SX PCI-X 0 -d 14e416aa NetXtreme II BCM5706S Gigabit Ethernet 0 -d 14e416c6 NetXtreme BCM5702A3 Gigabit Ethernet 0 -s 14e416c610b71100 3C1000B-T 10/100/1000 PCI 0 -s 14e416c614e4000c BCM5702 1000Base-T 0 -s 14e416c614e48009 BCM5702 1000Base-T 0 -d 14e416c7 NetXtreme BCM5703 Gigabit Ethernet 0 -s 14e416c70e1100ca NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T) 0 -s 14e416c70e1100cb NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T) 0 -s 14e416c7103c12c3 HP Combo FC/GigE-SX [A9782A] 0 -s 14e416c7103c12ca HP Combo FC/GigE-T [A9784A] 0 -s 14e416c714e40009 NetXtreme BCM5703 1000Base-T 0 -s 14e416c714e4000a NetXtreme BCM5703 1000Base-SX 0 -d 14e416dd NetLink BCM5781 Gigabit Ethernet PCI Express 0 -d 14e416f7 NetXtreme BCM5753 Gigabit Ethernet PCI Express 0 -d 14e416fd NetXtreme BCM5753M Gigabit Ethernet PCI Express 0 -d 14e416fe NetXtreme BCM5753F Fast Ethernet PCI Express 0 -d 14e4170c BCM4401-B0 100Base-TX 0 -d 14e4170d NetXtreme BCM5901 100Base-TX 0 -s 14e4170d10140545 ThinkPad R40e (2684-HVG) builtin ethernet controller 0 -d 14e4170e NetXtreme BCM5901 100Base-TX 0 -d 14e43352 BCM3352 0 -d 14e43360 BCM3360 0 -d 14e44210 BCM4210 iLine10 HomePNA 2.0 0 -d 14e44211 BCM4211 iLine10 HomePNA 2.0 + V.90 56k modem 0 -d 14e44212 BCM4212 v.90 56k modem 0 -d 14e44301 BCM4303 802.11b Wireless LAN Controller 0 -s 14e4430110280407 TrueMobile 1180 Onboard WLAN 0 -s 14e4430110430120 WL-103b Wireless LAN PC Card 0 -d 14e44305 BCM4307 V.90 56k Modem 0 -d 14e44306 BCM4307 Ethernet Controller 0 -d 14e44307 BCM4307 802.11b Wireless LAN Controller 0 -d 14e44310 BCM4310 Chipcommon I/OController 0 -d 14e44312 BCM4310 UART 0 -d 14e44313 BCM4310 Ethernet Controller 0 -d 14e44315 BCM4310 USB Controller 0 -d 14e44320 BCM4306 802.11b/g Wireless LAN Controller 0 -s 14e4432010280001 TrueMobile 1300 WLAN Mini-PCI Card 0 -s 14e4432010280003 Wireless 1350 WLAN Mini-PCI Card 0 -s 14e443201043100f WL-100G 0 -s 14e4432014e44320 Linksys WMP54G PCI 0 -s 14e4432017374320 WPC54G 0 -s 14e4432017997010 Belkin F5D7010 54g Wireless Network card 0 -d 14e44321 BCM4306 802.11a Wireless LAN Controller 0 -d 14e44322 BCM4306 UART 0 -d 14e44324 BCM4309 802.11a/b/g 0 -s 14e4432410280001 Truemobile 1400 0 -s 14e4432410280003 Truemobile 1450 MiniPCI 0 -d 14e44325 BCM43xG 802.11b/g 0 -s 14e4432514140003 Wireless Notebook Adapter MN-720 0 -s 14e4432514140004 Wireless PCI Adapter MN-730 0 -d 14e44326 BCM4307 Chipcommon I/O Controller? 0 probably this is a correct ID... -d 14e44401 BCM4401 100Base-T 0 -s 14e44401104380a8 A7V8X motherboard 0 -d 14e44402 BCM4402 Integrated 10/100BaseT 0 -d 14e44403 BCM4402 V.90 56k Modem 0 -d 14e44410 BCM4413 iLine32 HomePNA 2.0 0 -d 14e44411 BCM4413 V.90 56k modem 0 -d 14e44412 BCM4412 10/100BaseT 0 -d 14e44430 BCM44xx CardBus iLine32 HomePNA 2.0 0 -d 14e44432 BCM4432 CardBus 10/100BaseT 0 -d 14e44610 BCM4610 Sentry5 PCI to SB Bridge 0 -d 14e44611 BCM4610 Sentry5 iLine32 HomePNA 1.0 0 -d 14e44612 BCM4610 Sentry5 V.90 56k Modem 0 -d 14e44613 BCM4610 Sentry5 Ethernet Controller 0 -d 14e44614 BCM4610 Sentry5 External Interface 0 -d 14e44615 BCM4610 Sentry5 USB Controller 0 -d 14e44704 BCM4704 PCI to SB Bridge 0 -d 14e44705 BCM4704 Sentry5 802.11b Wireless LAN Controller 0 -d 14e44706 BCM4704 Sentry5 Ethernet Controller 0 -d 14e44707 BCM4704 Sentry5 USB Controller 0 -d 14e44708 BCM4704 Crypto Accelerator 0 -d 14e44710 BCM4710 Sentry5 PCI to SB Bridge 0 -d 14e44711 BCM47xx Sentry5 iLine32 HomePNA 2.0 0 -d 14e44712 BCM47xx V.92 56k modem 0 -d 14e44713 Sentry5 Ethernet Controller 0 -d 14e44714 BCM47xx Sentry5 External Interface 0 -d 14e44715 Sentry5 USB Controller 0 -d 14e44716 BCM47xx Sentry5 USB Host Controller 0 -d 14e44717 BCM47xx Sentry5 USB Device Controller 0 -d 14e44718 Sentry5 Crypto Accelerator 0 -d 14e44720 BCM4712 MIPS CPU 0 -d 14e45365 BCM5365P Sentry5 Host Bridge 0 -d 14e45600 BCM5600 StrataSwitch 24+2 Ethernet Switch Controller 0 -d 14e45605 BCM5605 StrataSwitch 24+2 Ethernet Switch Controller 0 -d 14e45615 BCM5615 StrataSwitch 24+2 Ethernet Switch Controller 0 -d 14e45625 BCM5625 StrataSwitch 24+2 Ethernet Switch Controller 0 -d 14e45645 BCM5645 StrataSwitch 24+2 Ethernet Switch Controller 0 -d 14e45670 BCM5670 8-Port 10GE Ethernet Switch Fabric 0 -d 14e45680 BCM5680 G-Switch 8 Port Gigabit Ethernet Switch Controller 0 -d 14e45690 BCM5690 12-port Multi-Layer Gigabit Ethernet Switch 0 -d 14e45691 BCM5691 GE/10GE 8+2 Gigabit Ethernet Switch Controller 0 -d 14e45820 BCM5820 Crypto Accelerator 0 -d 14e45821 BCM5821 Crypto Accelerator 0 -d 14e45822 BCM5822 Crypto Accelerator 0 -d 14e45823 BCM5823 Crypto Accelerator 0 -d 14e45824 BCM5824 Crypto Accelerator 0 -d 14e45840 BCM5840 Crypto Accelerator 0 -d 14e45841 BCM5841 Crypto Accelerator 0 -d 14e45850 BCM5850 Crypto Accelerator 0 -v 14e5 Pixelfusion Ltd 0 -v 14e6 SHINING Technology Inc 0 -v 14e7 3CX 0 -v 14e8 RAYCER Inc 0 -v 14e9 GARNETS System CO Ltd 0 -v 14ea Planex Communications, Inc 0 -d 14eaab06 FNW-3603-TX CardBus Fast Ethernet 0 -d 14eaab07 RTL81xx RealTek Ethernet 0 -v 14eb SEIKO EPSON Corp 0 -v 14ec ACQIRIS 0 -v 14ed DATAKINETICS Ltd 0 -v 14ee MASPRO KENKOH Corp 0 -v 14ef CARRY Computer ENG. CO Ltd 0 -v 14f0 CANON RESEACH CENTRE FRANCE 0 -v 14f1 Conexant 0 -d 14f11002 HCF 56k Modem 0 -d 14f11003 HCF 56k Modem 0 -d 14f11004 HCF 56k Modem 0 -d 14f11005 HCF 56k Modem 0 -d 14f11006 HCF 56k Modem 0 -d 14f11022 HCF 56k Modem 0 -d 14f11023 HCF 56k Modem 0 -d 14f11024 HCF 56k Modem 0 -d 14f11025 HCF 56k Modem 0 -d 14f11026 HCF 56k Modem 0 -d 14f11032 HCF 56k Modem 0 -d 14f11033 HCF 56k Data/Fax Modem 0 -s 14f1103310338077 NEC 0 -s 14f11033122d4027 Dell Zeus - MDP3880-W(B) Data Fax Modem 0 -s 14f11033122d4030 Dell Mercury - MDP3880-U(B) Data Fax Modem 0 -s 14f11033122d4034 Dell Thor - MDP3880-W(U) Data Fax Modem 0 -s 14f1103313e0020d Dell Copper 0 -s 14f1103313e0020e Dell Silver 0 -s 14f1103313e00261 IBM 0 -s 14f1103313e00290 Compaq Goldwing 0 -s 14f1103313e002a0 IBM 0 -s 14f1103313e002b0 IBM 0 -s 14f1103313e002c0 Compaq Scooter 0 -s 14f1103313e002d0 IBM 0 -s 14f11033144f1500 IBM P85-DF (1) 0 -s 14f11033144f1501 IBM P85-DF (2) 0 -s 14f11033144f150a IBM P85-DF (3) 0 -s 14f11033144f150b IBM P85-DF Low Profile (1) 0 -s 14f11033144f1510 IBM P85-DF Low Profile (2) 0 -d 14f11034 HCF 56k Data/Fax/Voice Modem 0 -d 14f11035 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem 0 -s 14f1103510cf1098 Fujitsu P85-DFSV 0 -d 14f11036 HCF 56k Data/Fax/Voice/Spkp Modem 0 -s 14f11036104d8067 HCF 56k Modem 0 -s 14f11036122d4029 MDP3880SP-W 0 -s 14f11036122d4031 MDP3880SP-U 0 -s 14f1103613e00209 Dell Titanium 0 -s 14f1103613e0020a Dell Graphite 0 -s 14f1103613e00260 Gateway Red Owl 0 -s 14f1103613e00270 Gateway White Horse 0 -d 14f11052 HCF 56k Data/Fax Modem (Worldwide) 0 -d 14f11053 HCF 56k Data/Fax Modem (Worldwide) 0 -d 14f11054 HCF 56k Data/Fax/Voice Modem (Worldwide) 0 -d 14f11055 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (Worldwide) 0 -d 14f11056 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide) 0 -d 14f11057 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide) 0 -d 14f11059 HCF 56k Data/Fax/Voice Modem (Worldwide) 0 -d 14f11063 HCF 56k Data/Fax Modem 0 -d 14f11064 HCF 56k Data/Fax/Voice Modem 0 -d 14f11065 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem 0 -d 14f11066 HCF 56k Data/Fax/Voice/Spkp Modem 0 -s 14f11066122d4033 Dell Athena - MDP3900V-U 0 -d 14f11433 HCF 56k Data/Fax Modem 0 -d 14f11434 HCF 56k Data/Fax/Voice Modem 0 -d 14f11435 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem 0 -d 14f11436 HCF 56k Data/Fax Modem 0 -d 14f11453 HCF 56k Data/Fax Modem 0 -s 14f1145313e00240 IBM 0 -s 14f1145313e00250 IBM 0 -s 14f11453144f1502 IBM P95-DF (1) 0 -s 14f11453144f1503 IBM P95-DF (2) 0 -d 14f11454 HCF 56k Data/Fax/Voice Modem 0 -d 14f11455 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem 0 -d 14f11456 HCF 56k Data/Fax/Voice/Spkp Modem 0 -s 14f11456122d4035 Dell Europa - MDP3900V-W 0 -s 14f11456122d4302 Dell MP3930V-W(C) MiniPCI 0 -d 14f11610 ADSL AccessRunner PCI Arbitration Device 0 -d 14f11611 AccessRunner PCI ADSL Interface Device 0 -d 14f11620 ADSL AccessRunner V2 PCI Arbitration Device 0 -d 14f11621 AccessRunner V2 PCI ADSL Interface Device 0 -d 14f11622 AccessRunner V2 PCI ADSL Yukon WAN Adapter 0 -d 14f11803 HCF 56k Modem 0 -s 14f118030e110023 623-LAN Grizzly 0 -s 14f118030e110043 623-LAN Yogi 0 -d 14f11815 HCF 56k Modem 0 -s 14f118150e110022 Grizzly 0 -s 14f118150e110042 Yogi 0 -d 14f12003 HSF 56k Data/Fax Modem 0 -d 14f12004 HSF 56k Data/Fax/Voice Modem 0 -d 14f12005 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem 0 -d 14f12006 HSF 56k Data/Fax/Voice/Spkp Modem 0 -d 14f12013 HSF 56k Data/Fax Modem 0 -s 14f120130e11b195 Bear 0 -s 14f120130e11b196 Seminole 1 0 -s 14f120130e11b1be Seminole 2 0 -s 14f1201310258013 Acer 0 -s 14f120131033809d NEC 0 -s 14f12013103380bc NEC 0 -s 14f12013155d6793 HP 0 -s 14f12013155d8850 E Machines 0 -d 14f12014 HSF 56k Data/Fax/Voice Modem 0 -d 14f12015 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem 0 -d 14f12016 HSF 56k Data/Fax/Voice/Spkp Modem 0 -d 14f12043 HSF 56k Data/Fax Modem (WorldW SmartDAA) 0 -d 14f12044 HSF 56k Data/Fax/Voice Modem (WorldW SmartDAA) 0 -d 14f12045 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (WorldW SmartDAA) 0 -d 14f12046 HSF 56k Data/Fax/Voice/Spkp Modem (WorldW SmartDAA) 0 -d 14f12063 HSF 56k Data/Fax Modem (SmartDAA) 0 -d 14f12064 HSF 56k Data/Fax/Voice Modem (SmartDAA) 0 -d 14f12065 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (SmartDAA) 0 -d 14f12066 HSF 56k Data/Fax/Voice/Spkp Modem (SmartDAA) 0 -d 14f12093 HSF 56k Modem 0 -s 14f12093155d2f07 Legend 0 -d 14f12143 HSF 56k Data/Fax/Cell Modem (Mob WorldW SmartDAA) 0 -d 14f12144 HSF 56k Data/Fax/Voice/Cell Modem (Mob WorldW SmartDAA) 0 -d 14f12145 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob WorldW SmartDAA) 0 -d 14f12146 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob WorldW SmartDAA) 0 -d 14f12163 HSF 56k Data/Fax/Cell Modem (Mob SmartDAA) 0 -d 14f12164 HSF 56k Data/Fax/Voice/Cell Modem (Mob SmartDAA) 0 -d 14f12165 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob SmartDAA) 0 -d 14f12166 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob SmartDAA) 0 -d 14f12343 HSF 56k Data/Fax CardBus Modem (Mob WorldW SmartDAA) 0 -d 14f12344 HSF 56k Data/Fax/Voice CardBus Modem (Mob WorldW SmartDAA) 0 -d 14f12345 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob WorldW SmartDAA) 0 -d 14f12346 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob WorldW SmartDAA) 0 -d 14f12363 HSF 56k Data/Fax CardBus Modem (Mob SmartDAA) 0 -d 14f12364 HSF 56k Data/Fax/Voice CardBus Modem (Mob SmartDAA) 0 -d 14f12365 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob SmartDAA) 0 -d 14f12366 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob SmartDAA) 0 -d 14f12443 HSF 56k Data/Fax Modem (Mob WorldW SmartDAA) 0 -s 14f12443104d8075 Modem 0 -s 14f12443104d8083 Modem 0 -s 14f12443104d8097 Modem 0 -d 14f12444 HSF 56k Data/Fax/Voice Modem (Mob WorldW SmartDAA) 0 -d 14f12445 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob WorldW SmartDAA) 0 -d 14f12446 HSF 56k Data/Fax/Voice/Spkp Modem (Mob WorldW SmartDAA) 0 -d 14f12463 HSF 56k Data/Fax Modem (Mob SmartDAA) 0 -d 14f12464 HSF 56k Data/Fax/Voice Modem (Mob SmartDAA) 0 -d 14f12465 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob SmartDAA) 0 -d 14f12466 HSF 56k Data/Fax/Voice/Spkp Modem (Mob SmartDAA) 0 -d 14f12f00 HSF 56k HSFi Modem 0 -s 14f12f0013e08d84 IBM HSFi V.90 0 -s 14f12f0013e08d85 Compaq Stinger 0 -s 14f12f0014f12004 Dynalink 56PMi 0 -d 14f12f02 HSF 56k HSFi Data/Fax 0 -d 14f12f11 HSF 56k HSFi Modem 0 -d 14f18234 RS8234 ATM SAR Controller [ServiceSAR Plus] 0 -d 14f18800 Winfast TV2000 XP 0 -v 14f2 MOBILITY Electronics 0 -d 14f20120 EV1000 bridge 0 -d 14f20121 EV1000 Parallel port 0 -d 14f20122 EV1000 Serial port 0 -d 14f20123 EV1000 Keyboard controller 0 -d 14f20124 EV1000 Mouse controller 0 -v 14f3 BroadLogic 0 -d 14f32030 2030 DVB-S Satellite Reciever 0 -d 14f32050 2050 DVB-T Terrestrial (Cable) Reciever 0 -d 14f32060 2060 ATSC Terrestrial (Cable) Reciever 0 -v 14f4 TOKYO Electronic Industry CO Ltd 0 -v 14f5 SOPAC Ltd 0 -v 14f6 COYOTE Technologies LLC 0 -v 14f7 WOLF Technology Inc 0 -v 14f8 AUDIOCODES Inc 0 -d 14f82077 TP-240 dual span E1 VoIP PCI card 0 -v 14f9 AG COMMUNICATIONS 0 -v 14fa WANDEL & GOCHERMANN 0 -v 14fb TRANSAS MARINE (UK) Ltd 0 -v 14fc Quadrics Ltd 0 -d 14fc0000 QsNet Elan3 Network Adapter 0 -d 14fc0001 QsNetII Elan4 Network Adapter 0 -v 14fd JAPAN Computer Industry Inc 0 -v 14fe ARCHTEK TELECOM Corp 0 -v 14ff TWINHEAD INTERNATIONAL Corp 0 -v 1500 DELTA Electronics, Inc 0 -d 15001360 RTL81xx RealTek Ethernet 0 -v 1501 BANKSOFT CANADA Ltd 0 -v 1502 MITSUBISHI ELECTRIC LOGISTICS SUPPORT Co Ltd 0 -v 1503 KAWASAKI LSI USA Inc 0 -v 1504 KAISER Electronics 0 -v 1505 ITA INGENIEURBURO FUR TESTAUFGABEN GmbH 0 -v 1506 CHAMELEON Systems Inc 0 -v 1507 Motorola ?? / HTEC 0 Should be HTEC Ltd, but there are no known HTEC chips and 1507 is already used by mistake by Motorola (see vendor ID 1057). -d 15070001 MPC105 [Eagle] 0 -d 15070002 MPC106 [Grackle] 0 -d 15070003 MPC8240 [Kahlua] 0 -d 15070100 MC145575 [HFC-PCI] 0 -d 15070431 KTI829c 100VG 0 -d 15074801 Raven 0 -d 15074802 Falcon 0 -d 15074803 Hawk 0 -d 15074806 CPX8216 0 -v 1508 HONDA CONNECTORS/MHOTRONICS Inc 0 -v 1509 FIRST INTERNATIONAL Computer Inc 0 -v 150a FORVUS RESEARCH Inc 0 -v 150b YAMASHITA Systems Corp 0 -v 150c KYOPAL CO Ltd 0 -v 150d WARPSPPED Inc 0 -v 150e C-PORT Corp 0 -v 150f INTEC GmbH 0 -v 1510 BEHAVIOR TECH Computer Corp 0 -v 1511 CENTILLIUM Technology Corp 0 -v 1512 ROSUN Technologies Inc 0 -v 1513 Raychem 0 -v 1514 TFL LAN Inc 0 -v 1515 Advent design 0 -v 1516 MYSON Technology Inc 0 -d 15160800 MTD-8xx 100/10M Ethernet PCI Adapter 0 -d 15160803 SURECOM EP-320X-S 100/10M Ethernet PCI Adapter 0 -s 15160803132010bd SURECOM EP-320X-S 100/10M Ethernet PCI Adapter 0 -d 15160891 MTD-8xx 100/10M Ethernet PCI Adapter 0 -v 1517 ECHOTEK Corp 0 -v 1518 PEP MODULAR Computers GmbH 0 -v 1519 TELEFON AKTIEBOLAGET LM Ericsson 0 -v 151a Globetek 0 -d 151a1002 PCI-1002 0 -d 151a1004 PCI-1004 0 -d 151a1008 PCI-1008 0 -v 151b COMBOX Ltd 0 -v 151c DIGITAL AUDIO LABS Inc 0 -v 151d Fujitsu Computer Products Of America 0 -v 151e MATRIX Corp 0 -v 151f TOPIC SEMICONDUCTOR Corp 0 -d 151f0000 TP560 Data/Fax/Voice 56k modem 0 -v 1520 CHAPLET System Inc 0 -v 1521 BELL Corp 0 -v 1522 MainPine Ltd 0 -d 15220100 PCI <-> IOBus Bridge 0 -s 1522010015220200 RockForceDUO 2 Port V.92/V.44 Data/Fax/Voice Modem 0 -s 1522010015220300 RockForceQUATRO 4 Port V.92/V.44 Data/Fax/Voice Modem 0 -s 1522010015220400 RockForceDUO+ 2 Port V.92/V.44 Data/Fax/Voice Modem 0 -s 1522010015220500 RockForceQUATRO+ 4 Port V.92/V.44 Data/Fax/Voice Modem 0 -s 1522010015220600 RockForce+ 2 Port V.90 Data/Fax/Voice Modem 0 -s 1522010015220700 RockForce+ 4 Port V.90 Data/Fax/Voice Modem 0 -s 1522010015220800 RockForceOCTO+ 8 Port V.92/V.44 Data/Fax/Voice Modem 0 -s 1522010015220c00 RockForceDUO+ 2 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem 0 -s 1522010015220d00 RockForceQUATRO+ 4 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem 0 -s 1522010015221d00 RockForceOCTO+ 8 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem 0 this is a correction to a recent entry. 1522:0E00 should be 1522:1D00 -v 1523 MUSIC Semiconductors 0 -v 1524 ENE Technology Inc 0 -d 15240510 CB710 Memory Card Reader Controller 0 -d 15240610 PCI Smart Card Reader Controller 0 -d 15241211 CB1211 Cardbus Controller 0 -d 15241225 CB1225 Cardbus Controller 0 -d 15241410 CB1410 Cardbus Controller 0 -s 152414101025005a TravelMate 290 0 -d 15241411 CB-710/2/4 Cardbus Controller 0 -d 15241412 CB-712/4 Cardbus Controller 0 -d 15241420 CB1420 Cardbus Controller 0 -d 15241421 CB-720/2/4 Cardbus Controller 0 -d 15241422 CB-722/4 Cardbus Controller 0 -v 1525 IMPACT Technologies 0 -v 1526 ISS, Inc 0 -v 1527 SOLECTRON 0 -v 1528 ACKSYS 0 -v 1529 AMERICAN MICROSystems Inc 0 -v 152a QUICKTURN DESIGN Systems 0 -v 152b FLYTECH Technology CO Ltd 0 -v 152c MACRAIGOR Systems LLC 0 -v 152d QUANTA Computer Inc 0 -v 152e MELEC Inc 0 -v 152f PHILIPS - CRYPTO 0 -v 1530 ACQIS Technology Inc 0 -v 1531 CHRYON Corp 0 -v 1532 ECHELON Corp 0 -v 1533 BALTIMORE 0 -v 1534 ROAD Corp 0 -v 1535 EVERGREEN Technologies Inc 0 -v 1537 DATALEX COMMUNCATIONS 0 -v 1538 ARALION Inc 0 -d 15380303 ARS106S Ultra ATA 133/100/66 Host Controller 0 -v 1539 ATELIER INFORMATIQUES et ELECTRONIQUE ETUDES S.A. 0 -v 153a ONO SOKKI 0 -v 153b TERRATEC Electronic GmbH 0 -d 153b1144 Aureon 5.1 0 -d 153b1147 Aureon 5.1 Sky 0 Terratec seems to use several IDs for the same card. -d 153b1158 Philips Semiconductors SAA7134 (rev 01) [Terratec Cinergy 600 TV] 0 -v 153c ANTAL Electronic 0 -v 153d FILANET Corp 0 -v 153e TECHWELL Inc 0 -v 153f MIPS DENMARK 0 -v 1540 PROVIDEO MULTIMEDIA Co Ltd 0 -v 1541 MACHONE Communications 0 -v 1542 VIVID Technology Inc 0 -v 1543 SILICON Laboratories 0 -d 15433052 Intel 537 [Winmodem] 0 -d 15434c22 Si3036 MC'97 DAA 0 -v 1544 DCM DATA Systems 0 -v 1545 VISIONTEK 0 -v 1546 IOI Technology Corp 0 -v 1547 MITUTOYO Corp 0 -v 1548 JET PROPULSION Laboratory 0 -v 1549 INTERCONNECT Systems Solutions 0 -v 154a MAX Technologies Inc 0 -v 154b COMPUTEX Co Ltd 0 -v 154c VISUAL Technology Inc 0 -v 154d PAN INTERNATIONAL Industrial Corp 0 -v 154e SERVOTEST Ltd 0 -v 154f STRATABEAM Technology 0 -v 1550 OPEN NETWORK Co Ltd 0 -v 1551 SMART Electronic DEVELOPMENT GmBH 0 -v 1552 RACAL AIRTECH Ltd 0 -v 1553 CHICONY Electronics Co Ltd 0 -v 1554 PROLINK Microsystems Corp 0 -v 1555 GESYTEC GmBH 0 -v 1556 PLD APPLICATIONS 0 -v 1557 MEDIASTAR Co Ltd 0 -v 1558 CLEVO/KAPOK Computer 0 -v 1559 SI LOGIC Ltd 0 -v 155a INNOMEDIA Inc 0 -v 155b PROTAC INTERNATIONAL Corp 0 -v 155c Cemax-Icon Inc 0 -v 155d Mac System Co Ltd 0 -v 155e LP Elektronik GmbH 0 -v 155f Perle Systems Ltd 0 -v 1560 Terayon Communications Systems 0 -v 1561 Viewgraphics Inc 0 -v 1562 Symbol Technologies 0 -v 1563 A-Trend Technology Co Ltd 0 -v 1564 Yamakatsu Electronics Industry Co Ltd 0 -v 1565 Biostar Microtech Int'l Corp 0 -v 1566 Ardent Technologies Inc 0 -v 1567 Jungsoft 0 -v 1568 DDK Electronics Inc 0 -v 1569 Palit Microsystems Inc. 0 -v 156a Avtec Systems 0 -v 156b 2wire Inc 0 -v 156c Vidac Electronics GmbH 0 -v 156d Alpha-Top Corp 0 -v 156e Alfa Inc 0 -v 156f M-Systems Flash Disk Pioneers Ltd 0 -v 1570 Lecroy Corp 0 -v 1571 Contemporary Controls 0 -d 1571a001 CCSI PCI20-485 ARCnet 0 -d 1571a002 CCSI PCI20-485D ARCnet 0 -d 1571a003 CCSI PCI20-485X ARCnet 0 -d 1571a004 CCSI PCI20-CXB ARCnet 0 -d 1571a005 CCSI PCI20-CXS ARCnet 0 -d 1571a006 CCSI PCI20-FOG-SMA ARCnet 0 -d 1571a007 CCSI PCI20-FOG-ST ARCnet 0 -d 1571a008 CCSI PCI20-TB5 ARCnet 0 -d 1571a009 CCSI PCI20-5-485 5Mbit ARCnet 0 -d 1571a00a CCSI PCI20-5-485D 5Mbit ARCnet 0 -d 1571a00b CCSI PCI20-5-485X 5Mbit ARCnet 0 -d 1571a00c CCSI PCI20-5-FOG-ST 5Mbit ARCnet 0 -d 1571a00d CCSI PCI20-5-FOG-SMA 5Mbit ARCnet 0 -d 1571a201 CCSI PCI22-485 10Mbit ARCnet 0 -d 1571a202 CCSI PCI22-485D 10Mbit ARCnet 0 -d 1571a203 CCSI PCI22-485X 10Mbit ARCnet 0 -d 1571a204 CCSI PCI22-CHB 10Mbit ARCnet 0 -d 1571a205 CCSI PCI22-FOG_ST 10Mbit ARCnet 0 -d 1571a206 CCSI PCI22-THB 10Mbit ARCnet 0 -v 1572 Otis Elevator Company 0 -v 1573 Lattice - Vantis 0 -v 1574 Fairchild Semiconductor 0 -v 1575 Voltaire Advanced Data Security Ltd 0 -v 1576 Viewcast COM 0 -v 1578 HITT 0 -v 1579 Dual Technology Corp 0 -v 157a Japan Elecronics Ind Inc 0 -v 157b Star Multimedia Corp 0 -v 157c Eurosoft (UK) 0 -d 157c8001 Fix2000 PCI Y2K Compliance Card 0 -v 157d Gemflex Networks 0 -v 157e Transition Networks 0 -v 157f PX Instruments Technology Ltd 0 -v 1580 Primex Aerospace Co 0 -v 1581 SEH Computertechnik GmbH 0 -v 1582 Cytec Corp 0 -v 1583 Inet Technologies Inc 0 -v 1584 Uniwill Computer Corp 0 -v 1585 Logitron 0 -v 1586 Lancast Inc 0 -v 1587 Konica Corp 0 -v 1588 Solidum Systems Corp 0 -v 1589 Atlantek Microsystems Pty Ltd 0 -v 158a Digalog Systems Inc 0 -v 158b Allied Data Technologies 0 -v 158c Hitachi Semiconductor & Devices Sales Co Ltd 0 -v 158d Point Multimedia Systems 0 -v 158e Lara Technology Inc 0 -v 158f Ditect Coop 0 -v 1590 3pardata Inc 0 -v 1591 ARN 0 -v 1592 Syba Tech Ltd 0 -d 15920781 Multi-IO Card 0 -d 15920782 Parallel Port Card 2xEPP 0 -d 15920783 Multi-IO Card 0 -d 15920785 Multi-IO Card 0 -d 15920786 Multi-IO Card 0 -d 15920787 Multi-IO Card 0 -d 15920788 Multi-IO Card 0 -d 1592078a Multi-IO Card 0 -v 1593 Bops Inc 0 -v 1594 Netgame Ltd 0 -v 1595 Diva Systems Corp 0 -v 1596 Folsom Research Inc 0 -v 1597 Memec Design Services 0 -v 1598 Granite Microsystems 0 -v 1599 Delta Electronics Inc 0 -v 159a General Instrument 0 -v 159b Faraday Technology Corp 0 -v 159c Stratus Computer Systems 0 -v 159d Ningbo Harrison Electronics Co Ltd 0 -v 159e A-Max Technology Co Ltd 0 -v 159f Galea Network Security 0 -v 15a0 Compumaster SRL 0 -v 15a1 Geocast Network Systems 0 -v 15a2 Catalyst Enterprises Inc 0 -d 15a20001 TA700 PCI Bus Analyzer/Exerciser 0 -v 15a3 Italtel 0 -v 15a4 X-Net OY 0 -v 15a5 Toyota Macs Inc 0 -v 15a6 Sunlight Ultrasound Technologies Ltd 0 -v 15a7 SSE Telecom Inc 0 -v 15a8 Shanghai Communications Technologies Center 0 -v 15aa Moreton Bay 0 -v 15ab Bluesteel Networks Inc 0 -v 15ac North Atlantic Instruments 0 -v 15ad VMware Inc 0 -d 15ad0405 [VMware SVGA II] PCI Display Adapter 0 -d 15ad0710 Virtual SVGA 0 -d 15ad0720 VMware High-Speed Virtual NIC [vmxnet] 0 -v 15ae Amersham Pharmacia Biotech 0 -v 15b0 Zoltrix International Ltd 0 -v 15b1 Source Technology Inc 0 -v 15b2 Mosaid Technologies Inc 0 -v 15b3 Mellanox Technologies 0 -d 15b35274 MT21108 InfiniBridge 0 -d 15b35a44 MT23108 InfiniHost 0 -d 15b35a45 MT23108 [Infinihost HCA Flash Recovery] 0 -d 15b35a46 MT23108 PCI Bridge 0 -d 15b35e8c MT24204 [InfiniHost III Lx HCA] 0 -d 15b35e8d MT24204 [InfiniHost III Lx HCA Flash Recovery] 0 -d 15b36278 MT25208 InfiniHost III Ex (Tavor compatibility mode) 0 -d 15b36279 MT25208 [InfiniHost III Ex HCA Flash Recovery] 0 -d 15b36282 MT25208 InfiniHost III Ex 0 -v 15b4 CCI/TRIAD 0 -v 15b5 Cimetrics Inc 0 -v 15b6 Texas Memory Systems Inc 0 -v 15b7 Sandisk Corp 0 -v 15b8 ADDI-DATA GmbH 0 -v 15b9 Maestro Digital Communications 0 -v 15ba Impacct Technology Corp 0 -v 15bb Portwell Inc 0 -v 15bc Agilent Technologies 0 -d 15bc2922 64 Bit, 133MHz PCI-X Exerciser & Protocol Checker 0 -d 15bc2928 64 Bit, 66MHz PCI Exerciser & Analyzer 0 -d 15bc2929 64 Bit, 133MHz PCI-X Analyzer & Exerciser 0 -v 15bd DFI Inc 0 -v 15be Sola Electronics 0 -v 15bf High Tech Computer Corp (HTC) 0 -v 15c0 BVM Ltd 0 -v 15c1 Quantel 0 -v 15c2 Newer Technology Inc 0 -v 15c3 Taiwan Mycomp Co Ltd 0 -v 15c4 EVSX Inc 0 -v 15c5 Procomp Informatics Ltd 0 -d 15c58010 1394b - 1394 Firewire 3-Port Host Adapter Card 0 -v 15c6 Technical University of Budapest 0 -v 15c7 Tateyama System Laboratory Co Ltd 0 -d 15c70349 Tateyama C-PCI PLC/NC card Rev.01A 0 -v 15c8 Penta Media Co Ltd 0 -v 15c9 Serome Technology Inc 0 -v 15ca Bitboys OY 0 -v 15cb AG Electronics Ltd 0 -v 15cc Hotrail Inc 0 -v 15cd Dreamtech Co Ltd 0 -v 15ce Genrad Inc 0 -v 15cf Hilscher GmbH 0 -v 15d1 Infineon Technologies AG 0 -v 15d2 FIC (First International Computer Inc) 0 -v 15d3 NDS Technologies Israel Ltd 0 -v 15d4 Iwill Corp 0 -v 15d5 Tatung Co 0 -v 15d6 Entridia Corp 0 -v 15d7 Rockwell-Collins Inc 0 -v 15d8 Cybernetics Technology Co Ltd 0 -v 15d9 Super Micro Computer Inc 0 -v 15da Cyberfirm Inc 0 -v 15db Applied Computing Systems Inc 0 -v 15dc Litronic Inc 0 -d 15dc0001 Argus 300 PCI Cryptography Module 0 -v 15dd Sigmatel Inc 0 -v 15de Malleable Technologies Inc 0 -v 15df Infinilink Corp 0 -v 15e0 Cacheflow Inc 0 -v 15e1 Voice Technologies Group Inc 0 -v 15e2 Quicknet Technologies Inc 0 -v 15e3 Networth Technologies Inc 0 -v 15e4 VSN Systemen BV 0 -v 15e5 Valley technologies Inc 0 -v 15e6 Agere Inc 0 -v 15e7 Get Engineering Corp 0 -v 15e8 National Datacomm Corp 0 -d 15e80130 Wireless PCI Card 0 -v 15e9 Pacific Digital Corp 0 -d 15e91841 ADMA-100 DiscStaQ ATA Controller 0 -v 15ea Tokyo Denshi Sekei K.K. 0 -v 15eb Drsearch GmbH 0 -v 15ec Beckhoff GmbH 0 -d 15ec3101 FC3101 Profibus DP 1 Channel PCI 0 -d 15ec5102 FC5102 0 -v 15ed Macrolink Inc 0 -v 15ee In Win Development Inc 0 -v 15ef Intelligent Paradigm Inc 0 -v 15f0 B-Tree Systems Inc 0 -v 15f1 Times N Systems Inc 0 -v 15f2 Diagnostic Instruments Inc 0 -v 15f3 Digitmedia Corp 0 -v 15f4 Valuesoft 0 -v 15f5 Power Micro Research 0 -v 15f6 Extreme Packet Device Inc 0 -v 15f7 Banctec 0 -v 15f8 Koga Electronics Co 0 -v 15f9 Zenith Electronics Corp 0 -v 15fa J.P. Axzam Corp 0 -v 15fb Zilog Inc 0 -v 15fc Techsan Electronics Co Ltd 0 -v 15fd N-CUBED.NET 0 -v 15fe Kinpo Electronics Inc 0 -v 15ff Fastpoint Technologies Inc 0 -v 1600 Northrop Grumman - Canada Ltd 0 -v 1601 Tenta Technology 0 -v 1602 Prosys-tec Inc 0 -v 1603 Nokia Wireless Communications 0 -v 1604 Central System Research Co Ltd 0 -v 1605 Pairgain Technologies 0 -v 1606 Europop AG 0 -v 1607 Lava Semiconductor Manufacturing Inc 0 -v 1608 Automated Wagering International 0 -v 1609 Scimetric Instruments Inc 0 -v 1612 Telesynergy Research Inc. 0 -v 1619 FarSite Communications Ltd 0 -d 16190400 FarSync T2P (2 port X.21/V.35/V.24) 0 -d 16190440 FarSync T4P (4 port X.21/V.35/V.24) 0 -v 161f Rioworks 0 www.rioworks.com -v 1626 TDK Semiconductor Corp. 0 -d 16268410 RTL81xx Fast Ethernet 0 -v 1629 Kongsberg Spacetec AS 0 -d 16291003 Format synchronizer v3.0 0 -d 16292002 Fast Universal Data Output 0 -v 1637 Linksys 0 This seems to occur on their 802.11b Wireless card WMP-11 -d 16373874 Linksys 802.11b WMP11 PCI Wireless card 0 -v 1638 Standard Microsystems Corp [SMC] 0 -d 16381100 SMC2602W EZConnect / Addtron AWA-100 / Eumitcom PCI WL11000 0 -v 163c Smart Link Ltd. 0 -d 163c3052 SmartLink SmartPCI562 56K Modem 0 -d 163c5449 SmartPCI561 Modem 0 -v 1657 Brocade Communications Systems, Inc. 0 -v 165a Epix Inc 0 -d 165ac100 PIXCI(R) CL1 Camera Link Video Capture Board [custom QL5232] 0 -d 165ad200 PIXCI(R) D2X Digital Video Capture Board [custom QL5232] 0 -d 165ad300 PIXCI(R) D3X Digital Video Capture Board [custom QL5232] 0 -v 165d Hsing Tech. Enterprise Co., Ltd. 0 -v 1661 Worldspace Corp. 0 -v 1668 Actiontec Electronics Inc 0 -d 16680100 Mini-PCI bridge 0 -v 166d Broadcom Corporation 0 Formerly SiByte, Inc. -d 166d0001 SiByte BCM1125/1125H/1250 System-on-a-Chip PCI 0 -d 166d0002 SiByte BCM1125H/1250 System-on-a-Chip HyperTransport 0 -v 1677 Bernecker + Rainer 0 -d 1677104e 5LS172.6 B&R Dual CAN Interface Card 0 -d 167712d7 5LS172.61 B&R Dual CAN Interface Card 0 -v 1681 Hercules 0 -d 16810010 Hercules 3d Prophet II Ultra 64MB [ 350 MHz NV15BR core, 128-bit DDR @ 460 MHz, 1.5v AGP4x ] 0 More specs, more accurate desc. -v 1688 CastleNet Technology Inc. 0 -d 16881170 WLAN 802.11b card 0 -v 168c Atheros Communications, Inc. 0 -d 168c0007 AR5000 802.11a Wireless Adapter 0 -d 168c0011 AR5210 802.11a NIC 0 -d 168c0012 AR5211 802.11ab NIC 0 -d 168c0013 AR5212 802.11abg NIC 0 -s 168c001311863202 D-link DWL-G650 B3 Wireless cardbus adapter 0 -s 168c001311863203 DWL-G520 Wireless PCI Adapter 0 -s 168c001311863a13 DWL-G520 Wireless PCI Adapter rev. B 0 -s 168c001311863a94 C54C Wireless 801.11g cardbus 0 -s 168c001313854d00 Netgear WG311T Wireless PCI Adapter 0 -s 168c001314b70a60 8482-WD ORiNOCO 11a/b/g Wireless PCI Adapter 0 -s 168c0013168c0013 WG511T Wireless CardBus Adapter 0 -s 168c0013168c1025 DWL-G650B2 Wireless CardBus Adapter 0 -s 168c0013168c2026 Netgate 5354MP ARIES a(108Mb turbo)/b/g MiniPCI Adapter 0 -d 168c1014 AR5212 802.11abg NIC 0 -v 16a5 Tekram Technology Co.,Ltd. 0 -v 16ab Global Sun Technology Inc 0 -d 16ab1100 GL24110P 0 -d 16ab1101 PLX9052 PCMCIA-to-PCI Wireless LAN 0 -d 16ab1102 PCMCIA-to-PCI Wireless Network Bridge 0 -v 16ae Safenet Inc 0 -d 16ae1141 SafeXcel-1141 0 -v 16b4 Aspex Semiconductor Ltd 0 -v 16be Creatix Polymedia GmbH 0 -v 16ca CENATEK Inc 0 -d 16ca0001 Rocket Drive DL 0 -v 16cd Densitron Technologies 0 -v 16df PIKA Technologies Inc. 0 www.pikatechnologies.com -v 16e3 European Space Agency 0 -d 16e31e0f LEON2FT Processor 0 -v 16ec U.S. Robotics 0 -d 16ec00ff USR997900 10/100 Mbps PCI Network Card 0 -d 16ec3685 Wireless Access PCI Adapter Model 022415 0 -v 16ed Sycron N. V. 0 -d 16ed1001 UMIO communication card 0 -v 16f3 Jetway Information Co., Ltd. 0 -v 16f4 Vweb Corp 0 -d 16f48000 VW2010 0 -v 16f6 VideoTele.com, Inc. 0 -v 1702 Internet Machines Corporation (IMC) 0 www.internetmachines.com -v 1705 Digital First, Inc. 0 -v 170b NetOctave 0 -d 170b0100 NSP2000-SSL crypto accelerator 0 -v 170c YottaYotta Inc. 0 -v 1725 Vitesse Semiconductor 0 Seems to be a 2nd ID for Vitesse Semiconductor -d 17257174 VSC7174 PCI/PCI-X Serial ATA Host Bus Controller 0 -v 172a Accelerated Encryption 0 -v 1734 Fujitsu Siemens Computer GmbH 0 -v 1737 Linksys 0 -d 17370013 WMP54G Wireless Pci Card 0 -d 17370015 WMP54GS Wireless Pci Card 0 -d 17371032 Gigabit Network Adapter 0 -s 1737103217370015 EG1032 v2 Instant Gigabit Network Adapter 0 -d 17371064 Gigabit Network Adapter 0 -s 1737106417370016 EG1064 v2 Instant Gigabit Network Adapter 0 -d 1737ab08 21x4x DEC-Tulip compatible 10/100 Ethernet 0 -d 1737ab09 21x4x DEC-Tulip compatible 10/100 Ethernet 0 -v 173b Altima (nee Broadcom) 0 -d 173b03e8 AC1000 Gigabit Ethernet 0 -d 173b03e9 AC1001 Gigabit Ethernet 0 -d 173b03ea AC9100 Gigabit Ethernet 0 -s 173b03ea173b0001 AC1002 0 -d 173b03eb AC1003 Gigabit Ethernet 0 -v 1743 Peppercon AG 0 -d 17438139 ROL/F-100 Fast Ethernet Adapter with ROL 0 -v 1749 RLX Technologies 0 -v 174b PC Partner Limited 0 -v 174d WellX Telecom SA 0 -v 175c AudioScience Inc 0 -v 175e Sanera Systems, Inc. 0 -v 1787 Hightech Information System Ltd. 0 -v 1796 Research Centre Juelich 0 also used by Struck Innovative Systeme for joint developments -d 17960001 SIS1100 [Gigabit link] 0 -d 17960002 HOTlink 0 -d 17960003 Counter Timer 0 -d 17960004 CAMAC Controller 0 -d 17960005 PROFIBUS 0 -d 17960006 AMCC HOTlink 0 -v 1797 JumpTec h, GMBH 0 -v 1799 Belkin 0 -d 17996001 Wireless PCI Card - F5D6001 0 -d 17996020 Wireless PCMCIA Card - F5D6020 0 -d 17996060 Wireless PDA Card - F5D6060 0 -d 17997000 Wireless PCI Card - F5D7000 0 -v 17a0 Genesys Logic, Inc 0 -d 17a08033 GL880S USB 1.1 controller 0 -d 17a08034 GL880S USB 2.0 controller 0 -v 17af Hightech Information System Ltd. 0 -v 17b3 Hawking Technologies 0 -d 17b3ab08 PN672TX 10/100 Ethernet 0 -v 17b4 Indra Networks, Inc. 0 -d 17b40011 WebEnhance 100 GZIP Compression Card 0 -v 17c0 Wistron Corp. 0 -v 17c2 Newisys, Inc. 0 -v 17cc NetChip Technology, Inc 0 -d 17cc2280 USB 2.0 0 -v 17d5 S2io Inc. 0 S2io ships 10Gb PCI-X Ethernet adapters www.s2io.com -v 17ee Connect Components Ltd 0 http://www.connect3d.com -v 17fe Linksys, A Division of Cisco Systems 0 -d 17fe2220 [AirConn] INPROCOMM IPN 2220 Wireless LAN Adapter (rev 01) 0 -v 1813 Ambient Technologies Inc 0 -d 18134000 HaM controllerless modem 0 -s 1813400016be0001 V9x HAM Data Fax Modem 0 -d 18134100 HaM plus Data Fax Modem 0 -s 1813410016be0002 V9x HAM 1394 0 -v 1814 RaLink 0 -d 18140101 Wireless PCI Adpator RT2400 / RT2460 0 -d 18140201 Ralink RT2500 802.11 Cardbus Reference Card 0 -s 181402011371001e CWC-854 Wireless-G CardBus Adapter 0 -s 181402011371001f CWM-854 Wireless-G Mini PCI Adapter 0 -s 1814020113710020 CWP-854 Wireless-G PCI Adapter 0 -v 1820 InfiniCon Systems Inc. 0 -v 1822 Twinhan Technology Co. Ltd 0 -v 182d SiteCom Europe BV 0 -d 182d3069 ISDN PCI DC-105V2 0 HFC-based ISDN card -v 1830 Credence Systems Corporation 0 -v 183b MikroM GmbH 0 -d 183b08a7 MVC100 DVI 0 -d 183b08a8 MVC101 SDI 0 -d 183b08a9 MVC102 DVI+Audio 0 -v 1849 ASRock Incorporation 0 -v 1851 Microtune, Inc. 0 -v 1852 Anritsu Corp. 0 -v 1867 Topspin Communications 0 -d 18675a44 MT23108 PCI-X HCA 0 -d 18675a45 MT23108 PCI-X HCA flash recovery 0 -d 18675a46 MT23108 PCI-X HCA bridge 0 -d 18676278 MT25208 InfiniHost III Ex (Tavor compatibility mode) 0 -d 18676282 MT25208 InfiniHost III Ex 0 -v 1888 Varisys Ltd 0 -d 18880301 VMFX1 FPGA PMC module 0 -d 18880601 VSM2 dual PMC carrier 0 -d 18880710 VS14x series PowerPC PCI board 0 -d 18880720 VS24x series PowerPC PCI board 0 -v 1894 KNC One 0 found e.g. on KNC DVB-S card -v 1896 B&B Electronics Manufacturing Company, Inc. 0 -v 18a1 Astute Networks Inc. 0 -v 18ac DViCO Corporation 0 -d 18acd810 FusionHDTV 3 Gold 0 -v 18bc Info-Tek Corp. 0 -v 18c8 Cray Inc 0 assigned to Octigabay System, which has been acquired by Cray -v 18c9 ARVOO Engineering BV 0 -v 18ca XGI - Xabre Graphics Inc 0 -d 18ca0040 Volari V8 0 -v 18e6 MPL AG 0 -d 18e60001 OSCI [Octal Serial Communication Interface] 0 -v 18f7 Commtech, Inc. 0 -d 18f70001 Fastcom ESCC-PCI-335 0 -d 18f70002 Fastcom 422/4-PCI-335 0 -d 18f70004 Fastcom 422/2-PCI-335 0 -d 18f70005 Fastcom IGESCC-PCI-ISO/1 0 -d 18f7000a Fastcom 232/4-PCI-335 0 -v 18fb Resilience Corporation 0 -v 1a08 Sierra semiconductor 0 -d 1a080000 SC15064 0 -v 1b13 Jaton Corp 0 -v 1c1c Symphony 0 -d 1c1c0001 82C101 0 -v 1d44 DPT 0 -d 1d44a400 PM2x24/PM3224 0 -v 1de1 Tekram Technology Co.,Ltd. 0 -d 1de10391 TRM-S1040 0 -d 1de12020 DC-390 0 -d 1de1690c 690c 0 -d 1de1dc29 DC290 0 -v 1fc0 Tumsan Oy 0 -d 1fc00300 E2200 Dual E1/Rawpipe Card 0 -v 2000 Smart Link Ltd. 0 -v 2001 Temporal Research Ltd 0 -v 2003 Smart Link Ltd. 0 -v 2004 Smart Link Ltd. 0 -v 21c3 21st Century Computer Corp. 0 -v 2348 Racore 0 -d 23482010 8142 100VG/AnyLAN 0 -v 2646 Kingston Technologies 0 -v 270b Xantel Corporation 0 -v 270f Chaintech Computer Co. Ltd 0 -v 2711 AVID Technology Inc. 0 -v 2a15 3D Vision(?) 0 -v 3000 Hansol Electronics Inc. 0 -v 3142 Post Impression Systems. 0 -v 3388 Hint Corp 0 -d 33880013 HiNT HC4 PCI to ISDN bridge, Multimedia audio controller 0 -d 33880014 HiNT HC4 PCI to ISDN bridge, Network controller 0 -d 33880020 HB6 Universal PCI-PCI bridge (transparent mode) 0 -d 33880021 HB6 Universal PCI-PCI bridge (non-transparent mode) 0 -s 338800214c531050 CT7 mainboard 0 -s 338800214c531080 CT8 mainboard 0 -s 338800214c5310a0 CA3/CR3 mainboard 0 -s 338800214c533010 PPCI mezzanine (32-bit PMC) 0 -s 338800214c533011 PPCI mezzanine (64-bit PMC) 0 -d 33880022 HiNT HB4 PCI-PCI Bridge (PCI6150) 0 -d 33880026 HB2 PCI-PCI Bridge 0 -d 3388101a E.Band [AudioTrak Inca88] 0 -d 3388101b E.Band [AudioTrak Inca88] 0 -d 33888011 VXPro II Chipset 0 -s 3388801133888011 VXPro II Chipset CPU to PCI Bridge 0 -d 33888012 VXPro II Chipset 0 -s 3388801233888012 VXPro II Chipset PCI to ISA Bridge 0 -d 33888013 VXPro II IDE 0 -s 3388801333888013 VXPro II Chipset EIDE Controller 0 -v 3411 Quantum Designs (H.K.) Inc 0 -v 3513 ARCOM Control Systems Ltd 0 -v 3842 eVga.com. Corp. 0 -v 38ef 4Links 0 -v 3d3d 3DLabs 0 -d 3d3d0001 GLINT 300SX 0 -d 3d3d0002 GLINT 500TX 0 -d 3d3d0003 GLINT Delta 0 -d 3d3d0004 Permedia 0 -d 3d3d0005 Permedia 0 -d 3d3d0006 GLINT MX 0 -d 3d3d0007 3D Extreme 0 -d 3d3d0008 GLINT Gamma G1 0 -d 3d3d0009 Permedia II 2D+3D 0 -s 3d3d000910400011 AccelStar II 0 -s 3d3d000913e91000 6221L-4U 0 -s 3d3d00093d3d0100 AccelStar II 3D Accelerator 0 -s 3d3d00093d3d0111 Permedia 3:16 0 -s 3d3d00093d3d0114 Santa Ana 0 -s 3d3d00093d3d0116 Oxygen GVX1 0 -s 3d3d00093d3d0119 Scirocco 0 -s 3d3d00093d3d0120 Santa Ana PCL 0 -s 3d3d00093d3d0125 Oxygen VX1 0 -s 3d3d00093d3d0127 Permedia3 Create! 0 -d 3d3d000a GLINT R3 0 -s 3d3d000a3d3d0121 Oxygen VX1 0 -d 3d3d000c GLINT R3 [Oxygen VX1] 0 -s 3d3d000c3d3d0144 Oxygen VX1-4X AGP [Permedia 4] 0 -d 3d3d000d GLint R4 rev A 0 -d 3d3d0011 GLint R4 rev B 0 -d 3d3d0012 GLint R5 rev A 0 -d 3d3d0013 GLint R5 rev B 0 -d 3d3d0020 VP10 visual processor 0 -d 3d3d0022 VP10 visual processor 0 P10 generic II -d 3d3d0024 VP9 visual processor 0 -d 3d3d0100 Permedia II 2D+3D 0 -d 3d3d07a1 Wildcat III 6210 0 -d 3d3d07a2 Sun XVR-500 Graphics Accelerator 0 -d 3d3d07a3 Wildcat IV 7210 0 -d 3d3d1004 Permedia 0 -d 3d3d3d04 Permedia 0 -d 3d3dffff Glint VGA 0 -v 4005 Avance Logic Inc. 0 -d 40050300 ALS300 PCI Audio Device 0 -d 40050308 ALS300+ PCI Audio Device 0 -d 40050309 PCI Input Controller 0 -d 40051064 ALG-2064 0 -d 40052064 ALG-2064i 0 -d 40052128 ALG-2364A GUI Accelerator 0 -d 40052301 ALG-2301 0 -d 40052302 ALG-2302 0 -d 40052303 AVG-2302 GUI Accelerator 0 -d 40052364 ALG-2364A 0 -d 40052464 ALG-2464 0 -d 40052501 ALG-2564A/25128A 0 -d 40054000 ALS4000 Audio Chipset 0 -s 4005400040054000 ALS4000 Audio Chipset 0 -d 40054710 ALC200/200P 0 -v 4033 Addtron Technology Co, Inc. 0 -d 40331360 RTL8139 Ethernet 0 -v 4143 Digital Equipment Corp 0 -v 4144 Alpha Data 0 -v 416c Aladdin Knowledge Systems 0 -d 416c0100 AladdinCARD 0 -d 416c0200 CPC 0 -v 4444 Internext Compression Inc 0 -d 44440016 iTVC16 (CX23416) MPEG-2 Encoder 0 -s 4444001600704009 WinTV PVR 250 0 -d 44440803 iTVC15 MPEG-2 Encoder 0 -s 4444080300704000 WinTV PVR-350 0 -s 4444080300704001 WinTV PVR-250 0 -v 4468 Bridgeport machines 0 -v 4594 Cogetec Informatique Inc 0 -v 45fb Baldor Electric Company 0 -v 4680 Umax Computer Corp 0 -v 4843 Hercules Computer Technology Inc 0 -v 4916 RedCreek Communications Inc 0 -d 49161960 RedCreek PCI adapter 0 -v 4943 Growth Networks 0 -v 494f ACCES I/O Products, Inc. 0 -d 494f10e8 LPCI-COM-8SM 0 -v 4978 Axil Computer Inc 0 -v 4a14 NetVin 0 -d 4a145000 NV5000SC 0 -s 4a1450004a145000 RT8029-Based Ethernet Adapter 0 -v 4b10 Buslogic Inc. 0 -v 4c48 LUNG HWA Electronics 0 -v 4c53 SBS Technologies 0 -d 4c530000 PLUSTEST device 0 -s 4c5300004c533000 PLUSTEST card (PC104+) 0 -s 4c5300004c533001 PLUSTEST card (PMC) 0 -d 4c530001 PLUSTEST-MM device 0 -s 4c5300014c533002 PLUSTEST-MM card (PMC) 0 -v 4ca1 Seanix Technology Inc 0 -v 4d51 MediaQ Inc. 0 -d 4d510200 MQ-200 0 -v 4d54 Microtechnica Co Ltd 0 -v 4ddc ILC Data Device Corp 0 -d 4ddc0100 DD-42924I5-300 (ARINC 429 Data Bus) 0 -d 4ddc0801 BU-65570I1 MIL-STD-1553 Test and Simulation 0 -d 4ddc0802 BU-65570I2 MIL-STD-1553 Test and Simulation 0 -d 4ddc0811 BU-65572I1 MIL-STD-1553 Test and Simulation 0 -d 4ddc0812 BU-65572I2 MIL-STD-1553 Test and Simulation 0 -d 4ddc0881 BU-65570T1 MIL-STD-1553 Test and Simulation 0 -d 4ddc0882 BU-65570T2 MIL-STD-1553 Test and Simulation 0 -d 4ddc0891 BU-65572T1 MIL-STD-1553 Test and Simulation 0 -d 4ddc0892 BU-65572T2 MIL-STD-1553 Test and Simulation 0 -d 4ddc0901 BU-65565C1 MIL-STD-1553 Data Bus 0 -d 4ddc0902 BU-65565C2 MIL-STD-1553 Data Bus 0 -d 4ddc0903 BU-65565C3 MIL-STD-1553 Data Bus 0 -d 4ddc0904 BU-65565C4 MIL-STD-1553 Data Bus 0 -d 4ddc0b01 BU-65569I1 MIL-STD-1553 Data Bus 0 -d 4ddc0b02 BU-65569I2 MIL-STD-1553 Data Bus 0 -d 4ddc0b03 BU-65569I3 MIL-STD-1553 Data Bus 0 -d 4ddc0b04 BU-65569I4 MIL-STD-1553 Data Bus 0 -v 5046 GemTek Technology Corporation 0 -d 50461001 PCI Radio 0 -v 5053 Voyetra Technologies 0 -d 50532010 Daytona Audio Adapter 0 -v 5136 S S Technologies 0 -v 5143 Qualcomm Inc 0 -v 5145 Ensoniq (Old) 0 -d 51453031 Concert AudioPCI 0 -v 5168 Animation Technologies Inc. 0 -v 5301 Alliance Semiconductor Corp. 0 -d 53010001 ProMotion aT3D 0 -v 5333 S3 Inc. 0 -d 53330551 Plato/PX (system) 0 -d 53335631 86c325 [ViRGE] 0 -d 53338800 86c866 [Vision 866] 0 -d 53338801 86c964 [Vision 964] 0 -d 53338810 86c764_0 [Trio 32 vers 0] 0 -d 53338811 86c764/765 [Trio32/64/64V+] 0 -d 53338812 86cM65 [Aurora64V+] 0 -d 53338813 86c764_3 [Trio 32/64 vers 3] 0 -d 53338814 86c767 [Trio 64UV+] 0 -d 53338815 86cM65 [Aurora 128] 0 -d 5333883d 86c988 [ViRGE/VX] 0 -d 53338870 FireGL 0 -d 53338880 86c868 [Vision 868 VRAM] vers 0 0 -d 53338881 86c868 [Vision 868 VRAM] vers 1 0 -d 53338882 86c868 [Vision 868 VRAM] vers 2 0 -d 53338883 86c868 [Vision 868 VRAM] vers 3 0 -d 533388b0 86c928 [Vision 928 VRAM] vers 0 0 -d 533388b1 86c928 [Vision 928 VRAM] vers 1 0 -d 533388b2 86c928 [Vision 928 VRAM] vers 2 0 -d 533388b3 86c928 [Vision 928 VRAM] vers 3 0 -d 533388c0 86c864 [Vision 864 DRAM] vers 0 0 -d 533388c1 86c864 [Vision 864 DRAM] vers 1 0 -d 533388c2 86c864 [Vision 864-P DRAM] vers 2 0 -d 533388c3 86c864 [Vision 864-P DRAM] vers 3 0 -d 533388d0 86c964 [Vision 964 VRAM] vers 0 0 -d 533388d1 86c964 [Vision 964 VRAM] vers 1 0 -d 533388d2 86c964 [Vision 964-P VRAM] vers 2 0 -d 533388d3 86c964 [Vision 964-P VRAM] vers 3 0 -d 533388f0 86c968 [Vision 968 VRAM] rev 0 0 -d 533388f1 86c968 [Vision 968 VRAM] rev 1 0 -d 533388f2 86c968 [Vision 968 VRAM] rev 2 0 -d 533388f3 86c968 [Vision 968 VRAM] rev 3 0 -d 53338900 86c755 [Trio 64V2/DX] 0 -s 5333890053338900 86C775 Trio64V2/DX 0 -d 53338901 86c775/86c785 [Trio 64V2/DX or /GX] 0 -s 5333890153338901 86C775 Trio64V2/DX, 86C785 Trio64V2/GX 0 -d 53338902 Plato/PX 0 -d 53338903 Trio 3D business multimedia 0 -d 53338904 Trio 64 3D 0 -s 53338904101400db Integrated Trio3D 0 -s 5333890453338904 86C365 Trio3D AGP 0 -d 53338905 Trio 64V+ family 0 -d 53338906 Trio 64V+ family 0 -d 53338907 Trio 64V+ family 0 -d 53338908 Trio 64V+ family 0 -d 53338909 Trio 64V+ family 0 -d 5333890a Trio 64V+ family 0 -d 5333890b Trio 64V+ family 0 -d 5333890c Trio 64V+ family 0 -d 5333890d Trio 64V+ family 0 -d 5333890e Trio 64V+ family 0 -d 5333890f Trio 64V+ family 0 -d 53338a01 ViRGE/DX or /GX 0 -s 53338a010e11b032 ViRGE/GX 0 -s 53338a0110b41617 Nitro 3D 0 -s 53338a0110b41717 Nitro 3D 0 -s 53338a0153338a01 ViRGE/DX 0 -d 53338a10 ViRGE/GX2 0 -s 53338a1010928a10 Stealth 3D 4000 0 -d 53338a13 86c368 [Trio 3D/2X] 0 -s 53338a1353338a13 Trio3D/2X 0 -d 53338a20 86c794 [Savage 3D] 0 -s 53338a2053338a20 86C391 Savage3D 0 -d 53338a21 86c390 [Savage 3D/MV] 0 -s 53338a2153338a21 86C390 Savage3D/MV 0 -d 53338a22 Savage 4 0 -s 53338a2210338068 Savage 4 0 -s 53338a2210338069 Savage 4 0 -s 53338a2210338110 Savage4 LT 0 -s 53338a22105d0018 SR9 8Mb SDRAM 0 -s 53338a22105d002a SR9 Pro 16Mb SDRAM 0 -s 53338a22105d003a SR9 Pro 32Mb SDRAM 0 -s 53338a22105d092f SR9 Pro+ 16Mb SGRAM 0 -s 53338a2210924207 Stealth III S540 0 -s 53338a2210924800 Stealth III S540 0 -s 53338a2210924807 SpeedStar A90 0 -s 53338a2210924808 Stealth III S540 0 -s 53338a2210924809 Stealth III S540 0 -s 53338a221092480e Stealth III S540 0 -s 53338a2210924904 Stealth III S520 0 -s 53338a2210924905 SpeedStar A200 0 -s 53338a2210924a09 Stealth III S540 0 -s 53338a2210924a0b Stealth III S540 Xtreme 0 -s 53338a2210924a0f Stealth III S540 0 -s 53338a2210924e01 Stealth III S540 0 -s 53338a221102101d 3d Blaster Savage 4 0 -s 53338a221102101e 3d Blaster Savage 4 0 -s 53338a2253338100 86C394-397 Savage4 SDRAM 100 0 -s 53338a2253338110 86C394-397 Savage4 SDRAM 110 0 -s 53338a2253338125 86C394-397 Savage4 SDRAM 125 0 -s 53338a2253338143 86C394-397 Savage4 SDRAM 143 0 -s 53338a2253338a22 86C394-397 Savage4 0 -s 53338a2253338a2e 86C394-397 Savage4 32bit 0 -s 53338a2253339125 86C394-397 Savage4 SGRAM 125 0 -s 53338a2253339143 86C394-397 Savage4 SGRAM 143 0 -d 53338a23 Savage 4 0 -d 53338a25 ProSavage PM133 0 -d 53338a26 ProSavage KM133 0 -d 53338c00 ViRGE/M3 0 -d 53338c01 ViRGE/MX 0 -s 53338c0111790001 ViRGE/MX 0 -d 53338c02 ViRGE/MX+ 0 -d 53338c03 ViRGE/MX+MV 0 -d 53338c10 86C270-294 Savage/MX-MV 0 -d 53338c11 82C270-294 Savage/MX 0 -d 53338c12 86C270-294 Savage/IX-MV 0 -s 53338c121014017f ThinkPad T20 0 -d 53338c13 86C270-294 Savage/IX 0 -s 53338c1311790001 Magnia Z310 0 -d 53338c22 SuperSavage MX/128 0 -d 53338c24 SuperSavage MX/64 0 -d 53338c26 SuperSavage MX/64C 0 -d 53338c2a SuperSavage IX/128 SDR 0 -d 53338c2b SuperSavage IX/128 DDR 0 -d 53338c2c SuperSavage IX/64 SDR 0 -d 53338c2d SuperSavage IX/64 DDR 0 -d 53338c2e SuperSavage IX/C SDR 0 -s 53338c2e101401fc ThinkPad T23 (2647-4MG) 0 -d 53338c2f SuperSavage IX/C DDR 0 -d 53338d01 86C380 [ProSavageDDR K4M266] 0 -d 53338d02 VT8636A [ProSavage KN133] AGP4X VGA Controller (TwisterK) 0 -d 53338d03 VT8751 [ProSavageDDR P4M266] 0 -d 53338d04 VT8375 [ProSavage8 KM266/KL266] 0 -d 53339102 86C410 Savage 2000 0 -s 5333910210925932 Viper II Z200 0 -s 5333910210925934 Viper II Z200 0 -s 5333910210925952 Viper II Z200 0 -s 5333910210925954 Viper II Z200 0 -s 5333910210925a35 Viper II Z200 0 -s 5333910210925a37 Viper II Z200 0 -s 5333910210925a55 Viper II Z200 0 -s 5333910210925a57 Viper II Z200 0 -d 5333ca00 SonicVibes 0 -v 544c Teralogic Inc 0 -d 544c0350 TL880-based HDTV/ATSC tuner 0 -v 5455 Technische University Berlin 0 -d 54554458 S5933 0 -v 5519 Cnet Technologies, Inc. 0 -v 5544 Dunord Technologies 0 -d 55440001 I-30xx Scanner Interface 0 -v 5555 Genroco, Inc 0 -d 55550003 TURBOstor HFP-832 [HiPPI NIC] 0 -v 5654 VoiceTronix Pty Ltd 0 -d 56543132 OpenSwitch12 0 -v 5700 Netpower 0 -v 5851 Exacq Technologies 0 -v 6356 UltraStor 0 -v 6374 c't Magazin für Computertechnik 0 -d 63746773 GPPCI 0 -v 6409 Logitec Corp. 0 -v 6666 Decision Computer International Co. 0 -d 66660001 PCCOM4 0 -d 66660002 PCCOM8 0 -v 7604 O.N. Electronic Co Ltd. 0 -v 7bde MIDAC Corporation 0 -v 7fed PowerTV 0 -v 8008 Quancom Electronic GmbH 0 -d 80080010 WDOG1 [PCI-Watchdog 1] 0 -d 80080011 PWDOG2 [PCI-Watchdog 2] 0 -v 807d Asustek Computer, Inc. 0 Wrong ID used in subsystem ID of AsusTek PCI-USB2 PCI card. -v 8086 Intel Corp. 0 -d 80860007 82379AB 0 -d 80860008 Extended Express System Support Controller 0 -s 8086000800081000 WorldMark 4300 INCA ASIC 0 -d 80860039 21145 Fast Ethernet 0 -d 80860122 82437FX 0 -d 80860309 80303 I/O Processor PCI-to-PCI Bridge 0 -d 8086030d 80312 I/O Companion Chip PCI-to-PCI Bridge 0 -d 80860326 6700/6702PXH I/OxAPIC Interrupt Controller A 0 -d 80860327 6700PXH I/OxAPIC Interrupt Controller B 0 -d 80860329 6700PXH PCI Express-to-PCI Bridge A 0 -d 8086032a 6700PXH PCI Express-to-PCI Bridge B 0 -d 8086032c 6702PXH PCI Express-to-PCI Bridge A 0 -d 80860330 80332 [Dobson] I/O processor 0 A-segment bridge -d 80860331 80332 [Dobson] I/O processor 0 A-segment IOAPIC -d 80860332 80332 [Dobson] I/O processor 0 B-segment bridge -d 80860333 80332 [Dobson] I/O processor 0 B-segment IOAPIC -d 80860334 80332 [Dobson] I/O processor 0 Address Translation Unit (ATU) -d 80860335 80331 [Lindsay] I/O processor 0 PCI-X bridge -d 80860336 80331 [Lindsay] I/O processor 0 Address Translation Unit (ATU) -d 80860340 41210 [Lanai] Serial to Parallel PCI Bridge 0 A-segment bridge -d 80860341 41210 [Lanai] Serial to Parallel PCI Bridge 0 B-segment bridge -d 80860482 82375EB/SB PCI to EISA Bridge 0 -d 80860483 82424TX/ZX [Saturn] CPU to PCI bridge 0 -d 80860484 82378ZB/IB, 82379AB (SIO, SIO.A) PCI to ISA Bridge 0 -d 80860486 82425EX/ZX [Aries] PCIset with ISA bridge 0 -d 808604a3 82434LX/NX [Mercury/Neptune] Processor to PCI bridge 0 -d 808604d0 82437FX [Triton FX] 0 -d 80860500 E8870 Processor bus control 0 -d 80860501 E8870 Memory controller 0 -d 80860502 E8870 Scalability Port 0 0 and registers common to both SPs -d 80860503 E8870 Scalability Port 1 0 and global performance monitoring -d 80860510 E8870IO Hub Interface Port 0 registers (8-bit compatibility port) 0 -d 80860511 E8870IO Hub Interface Port 1 registers 0 -d 80860512 E8870IO Hub Interface Port 2 registers 0 -d 80860513 E8870IO Hub Interface Port 3 registers 0 -d 80860514 E8870IO Hub Interface Port 4 registers 0 -d 80860515 E8870IO General SIOH registers 0 -d 80860516 E8870IO RAS registers 0 -d 80860530 E8870SP Scalability Port 0 registers 0 -d 80860531 E8870SP Scalability Port 1 registers 0 -d 80860532 E8870SP Scalability Port 2 registers 0 -d 80860533 E8870SP Scalability Port 3 registers 0 -d 80860534 E8870SP Scalability Port 4 registers 0 -d 80860535 E8870SP Scalability Port 5 registers 0 -d 80860536 E8870SP Interleave registers 0 and 1 0 (bi-interleave 0) and global registers that are neither per-port nor per-interleave -d 80860537 E8870SP Interleave registers 2 and 3 0 (bi-interleave 1) -d 80860600 RAID Controller 0 -s 80860600808601c1 ICP Vortex GDT8546RZ 0 -s 80860600808601f7 SCRU32 0 -d 8086061f 80303 I/O Processor 0 uninitialized SRCU32 RAID Controller -d 80860960 80960RP [i960 RP Microprocessor/Bridge] 0 -d 80860962 80960RM [i960RM Bridge] 0 -d 80860964 80960RP [i960 RP Microprocessor/Bridge] 0 -d 80861000 82542 Gigabit Ethernet Controller 0 -s 808610000e11b0df NC1632 Gigabit Ethernet Adapter (1000-SX) 0 -s 808610000e11b0e0 NC1633 Gigabit Ethernet Adapter (1000-LX) 0 -s 808610000e11b123 NC1634 Gigabit Ethernet Adapter (1000-SX) 0 -s 8086100010140119 Netfinity Gigabit Ethernet SX Adapter 0 -s 8086100080861000 PRO/1000 Gigabit Server Adapter 0 -d 80861001 82543GC Gigabit Ethernet Controller (Fiber) 0 -s 808610010e11004a NC6136 Gigabit Server Adapter 0 -s 80861001101401ea Netfinity Gigabit Ethernet SX Adapter 0 -s 8086100180861002 PRO/1000 F Server Adapter 0 -s 8086100180861003 PRO/1000 F Server Adapter 0 -d 80861002 Pro 100 LAN+Modem 56 Cardbus II 0 -s 808610028086200e Pro 100 LAN+Modem 56 Cardbus II 0 -s 8086100280862013 Pro 100 SR Mobile Combo Adapter 0 -s 8086100280862017 Pro 100 S Combo Mobile Adapter 0 -d 80861004 82543GC Gigabit Ethernet Controller (Copper) 0 -s 808610040e110049 NC7132 Gigabit Upgrade Module 0 -s 808610040e11b1a4 NC7131 Gigabit Server Adapter 0 -s 80861004101410f2 Gigabit Ethernet Server Adapter 0 -s 8086100480861004 PRO/1000 T Server Adapter 0 -s 8086100480862004 PRO/1000 T Server Adapter 0 -d 80861008 82544EI Gigabit Ethernet Controller (Copper) 0 -s 8086100810140269 iSeries 1000/100/10 Ethernet Adapter 0 -s 808610081028011c PRO/1000 XT Network Connection 0 -s 8086100880861107 PRO/1000 XT Server Adapter 0 -s 8086100880862107 PRO/1000 XT Server Adapter 0 -s 8086100880862110 PRO/1000 XT Server Adapter 0 -s 8086100880863108 PRO/1000 XT Network Connection 0 -d 80861009 82544EI Gigabit Ethernet Controller (Fiber) 0 -s 8086100910140268 iSeries Gigabit Ethernet Adapter 0 -s 8086100980861109 PRO/1000 XF Server Adapter 0 -s 8086100980862109 PRO/1000 XF Server Adapter 0 -d 8086100c 82544GC Gigabit Ethernet Controller (Copper) 0 -s 8086100c80861112 PRO/1000 T Desktop Adapter 0 -s 8086100c80862112 PRO/1000 T Desktop Adapter 0 -d 8086100d 82544GC Gigabit Ethernet Controller (LOM) 0 -s 8086100d10280123 PRO/1000 XT Network Connection 0 -s 8086100d1079891f 82544GC Based Network Connection 0 -s 8086100d4c531080 CT8 mainboard 0 -s 8086100d8086110d 82544GC Based Network Connection 0 -d 8086100e 82540EM Gigabit Ethernet Controller 0 -s 8086100e10140265 PRO/1000 MT Network Connection 0 -s 8086100e10140267 PRO/1000 MT Network Connection 0 -s 8086100e1014026a PRO/1000 MT Network Connection 0 -s 8086100e1028002e Optiplex GX260 0 -s 8086100e10280151 PRO/1000 MT Network Connection 0 -s 8086100e107b8920 PRO/1000 MT Desktop Adapter 0 -s 8086100e8086001e PRO/1000 MT Desktop Adapter 0 -s 8086100e8086002e PRO/1000 MT Desktop Adapter 0 -d 8086100f 82545EM Gigabit Ethernet Controller (Copper) 0 -s 8086100f10140269 iSeries 1000/100/10 Ethernet Adapter 0 -s 8086100f1014028e PRO/1000 MT Network Connection 0 -s 8086100f80861000 PRO/1000 MT Network Connection 0 -s 8086100f80861001 PRO/1000 MT Server Adapter 0 -d 80861010 82546EB Gigabit Ethernet Controller (Copper) 0 -s 808610101014027c PRO/1000 MT Dual Port Network Adapter 0 -s 8086101018fb7872 RESlink-X 0 -s 808610104c531080 CT8 mainboard 0 -s 808610104c5310a0 CA3/CR3 mainboard 0 -s 8086101080861011 PRO/1000 MT Dual Port Server Adapter 0 -s 808610108086101a PRO/1000 MT Dual Port Network Adapter 0 -s 8086101080863424 SE7501HG2 Mainboard 0 -d 80861011 82545EM Gigabit Ethernet Controller (Fiber) 0 -s 8086101110140268 iSeries Gigabit Ethernet Adapter 0 -s 8086101180861002 PRO/1000 MF Server Adapter 0 -s 8086101180861003 PRO/1000 MF Server Adapter (LX) 0 -d 80861012 82546EB Gigabit Ethernet Controller (Fiber) 0 -s 8086101280861012 PRO/1000 MF Dual Port Server Adapter 0 -d 80861013 82541EI Gigabit Ethernet Controller (Copper) 0 -s 8086101380860013 PRO/1000 MT Network Connection 0 -s 8086101380861013 IBM ThinkCentre Network Card 0 -s 8086101380861113 PRO/1000 MT Desktop Adapter 0 -d 80861014 82541ER Gigabit Ethernet Controller 0 -d 80861015 82540EM Gigabit Ethernet Controller (LOM) 0 -d 80861016 82540EP Gigabit Ethernet Controller (LOM) 0 -s 808610161014052c PRO/1000 MT Mobile Connection 0 -s 8086101611790001 PRO/1000 MT Mobile Connection 0 -s 8086101680861016 PRO/1000 MT Mobile Connection 0 -d 80861017 82540EP Gigabit Ethernet Controller (LOM) 0 -s 8086101780861017 PR0/1000 MT Desktop Connection 0 -d 80861018 82541EI Gigabit Ethernet Controller 0 Update controller name from 82541EP to 82541EI -s 8086101880861018 PRO/1000 MT Desktop Adapter 0 -d 80861019 82547EI Gigabit Ethernet Controller (LOM) 0 -s 8086101914581019 GA-8IPE1000 Pro2 motherboard (865PE) 0 -s 8086101980861019 PRO/1000 CT Desktop Connection 0 -s 808610198086301f D865PERL mainboard 0 -s 8086101980863427 S875WP1-E mainboard 0 -d 8086101d 82546EB Gigabit Ethernet Controller 0 -s 8086101d80861000 PRO/1000 MT Quad Port Server Adapter 0 -d 8086101e 82540EP Gigabit Ethernet Controller (Mobile) 0 -s 8086101e10140549 PRO/1000 MT Mobile Connection 0 -s 8086101e11790001 PRO/1000 MT Mobile Connection 0 -s 8086101e8086101e PRO/1000 MT Mobile Connection 0 -d 80861026 82545GM Gigabit Ethernet Controller 0 -s 8086102680861000 PRO/1000 MT Server Connection 0 -s 8086102680861001 PRO/1000 MT Server Adapter 0 -s 8086102680861002 PRO/1000 MT Server Adapter 0 -s 8086102680861026 PRO/1000 MT Server Connection 0 -d 80861027 82545GM Gigabit Ethernet Controller 0 -s 8086102780861001 PRO/1000 MF Server Adapter(LX) 0 -s 8086102780861002 PRO/1000 MF Server Adapter(LX) 0 -s 8086102780861003 PRO/1000 MF Server Adapter(LX) 0 -s 8086102780861027 PRO/1000 MF Server Adapter 0 -d 80861028 82545GM Gigabit Ethernet Controller 0 -s 8086102880861028 PRO/1000 MB Server Adapter 0 -d 80861029 82559 Ethernet Controller 0 -d 80861030 82559 InBusiness 10/100 0 -d 80861031 82801CAM (ICH3) PRO/100 VE (LOM) Ethernet Controller 0 -s 8086103110140209 ThinkPad A/T/X Series 0 -s 80861031104d80e7 Vaio PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP 0 -s 80861031107b5350 EtherExpress PRO/100 VE 0 -s 8086103111790001 EtherExpress PRO/100 VE 0 -s 80861031144dc000 EtherExpress PRO/100 VE 0 -s 80861031144dc001 EtherExpress PRO/100 VE 0 -s 80861031144dc003 EtherExpress PRO/100 VE 0 -s 80861031144dc006 vpr Matrix 170B4 0 -d 80861032 82801CAM (ICH3) PRO/100 VE Ethernet Controller 0 -d 80861033 82801CAM (ICH3) PRO/100 VM (LOM) Ethernet Controller 0 -d 80861034 82801CAM (ICH3) PRO/100 VM Ethernet Controller 0 -d 80861035 82801CAM (ICH3)/82562EH (LOM) Ethernet Controller 0 -d 80861036 82801CAM (ICH3) 82562EH Ethernet Controller 0 -d 80861037 82801CAM (ICH3) Chipset Ethernet Controller 0 -d 80861038 82801CAM (ICH3) PRO/100 VM (KM) Ethernet Controller 0 -d 80861039 82801DB PRO/100 VE (LOM) Ethernet Controller 0 -s 8086103910140267 NetVista A30p 0 -d 8086103a 82801DB PRO/100 VE (CNR) Ethernet Controller 0 -d 8086103b 82801DB PRO/100 VM (LOM) Ethernet Controller 0 -d 8086103c 82801DB PRO/100 VM (CNR) Ethernet Controller 0 -d 8086103d 82801DB PRO/100 VE (MOB) Ethernet Controller 0 -d 8086103e 82801DB PRO/100 VM (MOB) Ethernet Controller 0 -d 80861040 536EP Data Fax Modem 0 -s 8086104016be1040 V.9X DSP Data Fax Modem 0 -d 80861043 PRO/Wireless LAN 2100 3B Mini PCI Adapter 0 -s 8086104380862527 MIM2000/Centrino 0 -d 80861048 PRO/10GbE LR Server Adapter 0 -s 808610488086a01f PRO/10GbE LR Server Adapter 0 -s 808610488086a11f PRO/10GbE LR Server Adapter 0 -d 80861050 82562EZ 10/100 Ethernet Controller 0 -s 808610501462728c 865PE Neo2 (MS-6728) 0 -s 808610501462758c MS-6758 (875P Neo) 0 -s 8086105080863427 S875WP1-E mainboard 0 -d 80861051 82801EB/ER (ICH5/ICH5R) integrated LAN Controller 0 -d 80861059 82551QM Ethernet Controller 0 -d 80861064 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller 0 ICH-6 Component -d 80861065 82562ET/EZ/GT/GZ - PRO/100 VE Ethernet Controller 0 ICH-6 Component -d 80861066 82562 EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller 0 ICH-6 Component -d 80861067 82562 EM/EX/GX - PRO/100 VM Ethernet Controller 0 ICH-6 Component -d 80861068 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller Mobile 0 ICH-6 Component -d 80861069 82562 EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller Mobile 0 ICH-6 Component -d 8086106a 82562G \t- PRO/100 VE (LOM) Ethernet Controller 0 ICH-6 Component -d 8086106b 82562G \t- PRO/100 VE Ethernet Controller Mobile 0 ICH-6 Component -d 80861075 82547GI Gigabit Ethernet Controller 0 -s 8086107510280165 PowerEdge 750 0 -s 8086107580860075 PRO/1000 CT Network Connection 0 -s 8086107580861075 PRO/1000 CT Network Connection 0 -d 80861076 82541GI/PI Gigabit Ethernet Controller 0 -s 8086107610280165 PowerEdge 750 0 -s 8086107680860076 PRO/1000 MT Network Connection 0 -s 8086107680861076 PRO/1000 MT Network Connection 0 -s 8086107680861176 PRO/1000 MT Desktop Adapter 0 -s 8086107680861276 PRO/1000 MT Desktop Adapter 0 -d 80861077 82541GI Gigabit Ethernet Controller 0 -s 8086107711790001 PRO/1000 MT Mobile Connection 0 -s 8086107780860077 PRO/1000 MT Mobile Connection 0 -s 8086107780861077 PRO/1000 MT Mobile Connection 0 -d 80861078 82541EI Gigabit Ethernet Controller 0 -s 8086107880861078 PRO/1000 MT Network Connection 0 -d 80861079 82546GB Gigabit Ethernet Controller 0 -s 80861079103c12a6 HP Dual Port 1000Base-T [A9900A] 0 -s 80861079103c12cf HP Core Dual Port 1000Base-T [AB352A] 0 -s 808610794c531090 Cx9 / Vx9 mainboard 0 -s 808610794c5310b0 CL9 mainboard 0 -s 8086107980860079 PRO/1000 MT Dual Port Network Connection 0 -s 8086107980861079 PRO/1000 MT Dual Port Network Connection 0 -s 8086107980861179 PRO/1000 MT Dual Port Network Connection 0 -s 808610798086117a PRO/1000 MT Dual Port Server Adapter 0 -d 8086107a 82546GB Gigabit Ethernet Controller 0 -s 8086107a103c12a8 HP Dual Port 1000base-SX [A9899A] 0 -s 8086107a8086107a PRO/1000 MF Dual Port Server Adapter 0 -s 8086107a8086127a PRO/1000 MF Dual Port Server Adapter 0 -d 8086107b 82546GB Gigabit Ethernet Controller 0 -s 8086107b8086007b PRO/1000 MB Dual Port Server Connection 0 -s 8086107b8086107b PRO/1000 MB Dual Port Server Connection 0 -d 80861107 PRO/1000 MF Server Adapter (LX) 0 -d 80861130 82815 815 Chipset Host Bridge and Memory Controller Hub 0 -s 8086113010251016 Travelmate 612 TX 0 -s 8086113010438027 TUSL2-C Mainboard 0 -s 80861130104d80df Vaio PCG-FX403 0 -s 8086113080864532 D815EEA2 mainboard 0 -s 8086113080864557 D815EGEW Mainboard 0 -d 80861131 82815 815 Chipset AGP Bridge 0 -d 80861132 82815 CGC [Chipset Graphics Controller] 0 -s 8086113210251016 Travelmate 612 TX 0 -s 80861132104d80df Vaio PCG-FX403 0 -s 8086113280864532 D815EEA2 Mainboard 0 -s 8086113280864557 D815EGEW Mainboard 0 -d 80861161 82806AA PCI64 Hub Advanced Programmable Interrupt Controller 0 -s 8086116180861161 82806AA PCI64 Hub APIC 0 -d 80861162 Xscale 80200 Big Endian Companion Chip 0 -d 80861200 Intel IXP1200 Network Processor 0 -s 80861200172a0000 AEP SSL Accelerator 0 -d 80861209 8255xER/82551IT Fast Ethernet Controller 0 -s 808612094c531050 CT7 mainboard 0 -s 808612094c531051 CE7 mainboard 0 -s 808612094c531070 PC6 mainboard 0 -d 80861221 82092AA PCI to PCMCIA Bridge 0 -d 80861222 82092AA IDE Controller 0 -d 80861223 SAA7116 0 -d 80861225 82452KX/GX [Orion] 0 -d 80861226 82596 PRO/10 PCI 0 -d 80861227 82865 EtherExpress PRO/100A 0 -d 80861228 82556 EtherExpress PRO/100 Smart 0 -d 80861229 82557/8/9 [Ethernet Pro 100] 0 the revision field differentiates between them (1-3 is 82557, 4-5 is 82558, 6-8 is 82559, 9 is 82559ER) -s 808612290e113001 82559 Fast Ethernet LOM with Alert on LAN* 0 -s 808612290e113002 82559 Fast Ethernet LOM with Alert on LAN* 0 -s 808612290e113003 82559 Fast Ethernet LOM with Alert on LAN* 0 -s 808612290e113004 82559 Fast Ethernet LOM with Alert on LAN* 0 -s 808612290e113005 82559 Fast Ethernet LOM with Alert on LAN* 0 -s 808612290e113006 82559 Fast Ethernet LOM with Alert on LAN* 0 -s 808612290e113007 82559 Fast Ethernet LOM with Alert on LAN* 0 -s 808612290e11b01e NC3120 Fast Ethernet NIC 0 -s 808612290e11b01f NC3122 Fast Ethernet NIC (dual port) 0 -s 808612290e11b02f NC1120 Ethernet NIC 0 -s 808612290e11b04a Netelligent 10/100TX NIC with Wake on LAN 0 -s 808612290e11b0c6 NC3161 Fast Ethernet NIC (embedded, WOL) 0 -s 808612290e11b0c7 NC3160 Fast Ethernet NIC (embedded) 0 -s 808612290e11b0d7 NC3121 Fast Ethernet NIC (WOL) 0 -s 808612290e11b0dd NC3131 Fast Ethernet NIC (dual port) 0 -s 808612290e11b0de NC3132 Fast Ethernet Module (dual port) 0 -s 808612290e11b0e1 NC3133 Fast Ethernet Module (100-FX) 0 -s 808612290e11b134 NC3163 Fast Ethernet NIC (embedded, WOL) 0 -s 808612290e11b13c NC3162 Fast Ethernet NIC (embedded) 0 -s 808612290e11b144 NC3123 Fast Ethernet NIC (WOL) 0 -s 808612290e11b163 NC3134 Fast Ethernet NIC (dual port) 0 -s 808612290e11b164 NC3135 Fast Ethernet Upgrade Module (dual port) 0 -s 808612290e11b1a4 NC7131 Gigabit Server Adapter 0 -s 808612291014005c 82558B Ethernet Pro 10/100 0 -s 80861229101401bc 82559 Fast Ethernet LAN On Motherboard 0 -s 80861229101401f1 10/100 Ethernet Server Adapter 0 -s 80861229101401f2 10/100 Ethernet Server Adapter 0 -s 8086122910140207 Ethernet Pro/100 S 0 -s 8086122910140232 10/100 Dual Port Server Adapter 0 -s 808612291014023a ThinkPad R30 0 -s 808612291014105c Netfinity 10/100 0 -s 8086122910142205 ThinkPad A22p 0 -s 808612291014305c 10/100 EtherJet Management Adapter 0 -s 808612291014405c 10/100 EtherJet Adapter with Alert on LAN 0 -s 808612291014505c 10/100 EtherJet Secure Management Adapter 0 -s 808612291014605c 10/100 EtherJet Secure Management Adapter 0 -s 808612291014705c 10/100 Netfinity 10/100 Ethernet Security Adapter 0 -s 808612291014805c 10/100 Netfinity 10/100 Ethernet Security Adapter 0 -s 808612291028009b PowerEdge 2500/2550 0 -s 80861229102800ce PowerEdge 1400 0 -s 8086122910338000 PC-9821X-B06 0 -s 8086122910338016 PK-UG-X006 0 -s 808612291033801f PK-UG-X006 0 -s 8086122910338026 PK-UG-X006 0 -s 8086122910338063 82559-based Fast Ethernet Adapter 0 -s 8086122910338064 82559-based Fast Ethernet Adapter 0 -s 80861229103c10c0 NetServer 10/100TX 0 -s 80861229103c10c3 NetServer 10/100TX 0 -s 80861229103c10ca NetServer 10/100TX 0 -s 80861229103c10cb NetServer 10/100TX 0 -s 80861229103c10e3 NetServer 10/100TX 0 -s 80861229103c10e4 NetServer 10/100TX 0 -s 80861229103c1200 NetServer 10/100TX 0 -s 8086122910c31100 SmartEther100 SC1100 0 -s 8086122910cf1115 8255x-based Ethernet Adapter (10/100) 0 -s 8086122910cf1143 8255x-based Ethernet Adapter (10/100) 0 -s 8086122911790001 8255x-based Ethernet Adapter (10/100) 0 -s 8086122911790002 PCI FastEther LAN on Docker 0 -s 8086122911790003 8255x-based Fast Ethernet 0 -s 8086122912592560 AT-2560 100 0 -s 8086122912592561 AT-2560 100 FX Ethernet Adapter 0 -s 8086122912660001 NE10/100 Adapter 0 -s 8086122913e91000 6221L-4U 0 -s 80861229144d2501 SEM-2000 MiniPCI LAN Adapter 0 -s 80861229144d2502 SEM-2100IL MiniPCI LAN Adapter 0 -s 8086122916681100 EtherExpress PRO/100B (TX) (MiniPCI Ethernet+Modem) 0 -s 808612294c531080 CT8 mainboard 0 -s 8086122980860001 EtherExpress PRO/100B (TX) 0 -s 8086122980860002 EtherExpress PRO/100B (T4) 0 -s 8086122980860003 EtherExpress PRO/10+ 0 -s 8086122980860004 EtherExpress PRO/100 WfM 0 -s 8086122980860005 82557 10/100 0 -s 8086122980860006 82557 10/100 with Wake on LAN 0 -s 8086122980860007 82558 10/100 Adapter 0 -s 8086122980860008 82558 10/100 with Wake on LAN 0 -s 8086122980860009 EtherExpress PRO/100+ 0 -s 808612298086000a EtherExpress PRO/100+ Management Adapter 0 -s 808612298086000b EtherExpress PRO/100+ 0 -s 808612298086000c EtherExpress PRO/100+ Management Adapter 0 -s 808612298086000d EtherExpress PRO/100+ Alert On LAN II* Adapter 0 -s 808612298086000e EtherExpress PRO/100+ Management Adapter with Alert On LAN* 0 -s 808612298086000f EtherExpress PRO/100 Desktop Adapter 0 -s 8086122980860010 EtherExpress PRO/100 S Management Adapter 0 -s 8086122980860011 EtherExpress PRO/100 S Management Adapter 0 -s 8086122980860012 EtherExpress PRO/100 S Advanced Management Adapter (D) 0 -s 8086122980860013 EtherExpress PRO/100 S Advanced Management Adapter (E) 0 -s 8086122980860030 EtherExpress PRO/100 Management Adapter with Alert On LAN* GC 0 -s 8086122980860031 EtherExpress PRO/100 Desktop Adapter 0 -s 8086122980860040 EtherExpress PRO/100 S Desktop Adapter 0 -s 8086122980860041 EtherExpress PRO/100 S Desktop Adapter 0 -s 8086122980860042 EtherExpress PRO/100 Desktop Adapter 0 -s 8086122980860050 EtherExpress PRO/100 S Desktop Adapter 0 -s 8086122980861009 EtherExpress PRO/100+ Server Adapter 0 -s 808612298086100c EtherExpress PRO/100+ Server Adapter (PILA8470B) 0 -s 8086122980861012 EtherExpress PRO/100 S Server Adapter (D) 0 -s 8086122980861013 EtherExpress PRO/100 S Server Adapter (E) 0 -s 8086122980861015 EtherExpress PRO/100 S Dual Port Server Adapter 0 -s 8086122980861017 EtherExpress PRO/100+ Dual Port Server Adapter 0 -s 8086122980861030 EtherExpress PRO/100+ Management Adapter with Alert On LAN* G Server 0 -s 8086122980861040 EtherExpress PRO/100 S Server Adapter 0 -s 8086122980861041 EtherExpress PRO/100 S Server Adapter 0 -s 8086122980861042 EtherExpress PRO/100 Server Adapter 0 -s 8086122980861050 EtherExpress PRO/100 S Server Adapter 0 -s 8086122980861051 EtherExpress PRO/100 Server Adapter 0 -s 8086122980861052 EtherExpress PRO/100 Server Adapter 0 -s 80861229808610f0 EtherExpress PRO/100+ Dual Port Adapter 0 -s 8086122980862009 EtherExpress PRO/100 S Mobile Adapter 0 -s 808612298086200d EtherExpress PRO/100 Cardbus 0 -s 808612298086200e EtherExpress PRO/100 LAN+V90 Cardbus Modem 0 -s 808612298086200f EtherExpress PRO/100 SR Mobile Adapter 0 -s 8086122980862010 EtherExpress PRO/100 S Mobile Combo Adapter 0 -s 8086122980862013 EtherExpress PRO/100 SR Mobile Combo Adapter 0 -s 8086122980862016 EtherExpress PRO/100 S Mobile Adapter 0 -s 8086122980862017 EtherExpress PRO/100 S Combo Mobile Adapter 0 -s 8086122980862018 EtherExpress PRO/100 SR Mobile Adapter 0 -s 8086122980862019 EtherExpress PRO/100 SR Combo Mobile Adapter 0 -s 8086122980862101 EtherExpress PRO/100 P Mobile Adapter 0 -s 8086122980862102 EtherExpress PRO/100 SP Mobile Adapter 0 -s 8086122980862103 EtherExpress PRO/100 SP Mobile Adapter 0 -s 8086122980862104 EtherExpress PRO/100 SP Mobile Adapter 0 -s 8086122980862105 EtherExpress PRO/100 SP Mobile Adapter 0 -s 8086122980862106 EtherExpress PRO/100 P Mobile Adapter 0 -s 8086122980862107 EtherExpress PRO/100 Network Connection 0 -s 8086122980862108 EtherExpress PRO/100 Network Connection 0 -s 8086122980862200 EtherExpress PRO/100 P Mobile Combo Adapter 0 -s 8086122980862201 EtherExpress PRO/100 P Mobile Combo Adapter 0 -s 8086122980862202 EtherExpress PRO/100 SP Mobile Combo Adapter 0 -s 8086122980862203 EtherExpress PRO/100+ MiniPCI 0 -s 8086122980862204 EtherExpress PRO/100+ MiniPCI 0 -s 8086122980862205 EtherExpress PRO/100 SP Mobile Combo Adapter 0 -s 8086122980862206 EtherExpress PRO/100 SP Mobile Combo Adapter 0 -s 8086122980862207 EtherExpress PRO/100 SP Mobile Combo Adapter 0 -s 8086122980862208 EtherExpress PRO/100 P Mobile Combo Adapter 0 -s 8086122980862402 EtherExpress PRO/100+ MiniPCI 0 -s 8086122980862407 EtherExpress PRO/100+ MiniPCI 0 -s 8086122980862408 EtherExpress PRO/100+ MiniPCI 0 -s 8086122980862409 EtherExpress PRO/100+ MiniPCI 0 -s 808612298086240f EtherExpress PRO/100+ MiniPCI 0 -s 8086122980862410 EtherExpress PRO/100+ MiniPCI 0 -s 8086122980862411 EtherExpress PRO/100+ MiniPCI 0 -s 8086122980862412 EtherExpress PRO/100+ MiniPCI 0 -s 8086122980862413 EtherExpress PRO/100+ MiniPCI 0 -s 8086122980863000 82559 Fast Ethernet LAN on Motherboard 0 -s 8086122980863001 82559 Fast Ethernet LOM with Basic Alert on LAN* 0 -s 8086122980863002 82559 Fast Ethernet LOM with Alert on LAN II* 0 -s 8086122980863006 EtherExpress PRO/100 S Network Connection 0 -s 8086122980863007 EtherExpress PRO/100 S Network Connection 0 -s 8086122980863008 EtherExpress PRO/100 Network Connection 0 -s 8086122980863010 EtherExpress PRO/100 S Network Connection 0 -s 8086122980863011 EtherExpress PRO/100 S Network Connection 0 -s 8086122980863012 EtherExpress PRO/100 Network Connection 0 -s 8086122980863411 SDS2 Mainboard 0 -d 8086122d 430FX - 82437FX TSC [Triton I] 0 -d 8086122e 82371FB PIIX ISA [Triton I] 0 -d 80861230 82371FB PIIX IDE [Triton I] 0 -d 80861231 DSVD Modem 0 -d 80861234 430MX - 82371MX Mobile PCI I/O IDE Xcelerator (MPIIX) 0 -d 80861235 430MX - 82437MX Mob. System Ctrlr (MTSC) & 82438MX Data Path (MTDP) 0 -d 80861237 440FX - 82441FX PMC [Natoma] 0 -d 80861239 82371FB PIIX IDE Interface 0 -d 8086123b 82380PB PCI to PCI Docking Bridge 0 -d 8086123c 82380AB (MISA) Mobile PCI-to-ISA Bridge 0 -d 8086123d 683053 Programmable Interrupt Device 0 -d 8086123e 82466GX (IHPC) Integrated Hot-Plug Controller 0 in" hidden" mode -d 8086123f 82466GX Integrated Hot-Plug Controller (IHPC) 0 -d 80861240 82752 (752) AGP Graphics Accelerator 0 -d 8086124b 82380FB (MPCI2) Mobile Docking Controller 0 -d 80861250 430HX - 82439HX TXC [Triton II] 0 -d 80861360 82806AA PCI64 Hub PCI Bridge 0 -d 80861361 82806AA PCI64 Hub Controller (HRes) 0 -s 8086136180861361 82806AA PCI64 Hub Controller (HRes) 0 -s 8086136180868000 82806AA PCI64 Hub Controller (HRes) 0 -d 80861460 82870P2 P64H2 Hub PCI Bridge 0 -d 80861461 82870P2 P64H2 I/OxAPIC 0 -s 8086146115d93480 P4DP6 0 -s 808614614c531090 Cx9 / Vx9 mainboard 0 -d 80861462 82870P2 P64H2 Hot Plug Controller 0 -d 80861960 80960RP [i960RP Microprocessor] 0 -s 80861960101e0431 MegaRAID 431 RAID Controller 0 -s 80861960101e0438 MegaRAID 438 Ultra2 LVD RAID Controller 0 -s 80861960101e0466 MegaRAID 466 Express Plus RAID Controller 0 -s 80861960101e0467 MegaRAID 467 Enterprise 1500 RAID Controller 0 -s 80861960101e0490 MegaRAID 490 Express 300 RAID Controller 0 -s 80861960101e0762 MegaRAID 762 Express RAID Controller 0 -s 80861960101e09a0 PowerEdge Expandable RAID Controller 2/SC 0 -s 8086196010280467 PowerEdge Expandable RAID Controller 2/DC 0 -s 8086196010281111 PowerEdge Expandable RAID Controller 2/SC 0 -s 80861960103c03a2 MegaRAID 0 -s 80861960103c10c6 MegaRAID 438, HP NetRAID-3Si 0 -s 80861960103c10c7 MegaRAID T5, Integrated HP NetRAID 0 -s 80861960103c10cc MegaRAID, Integrated HP NetRAID 0 -s 80861960103c10cd HP NetRAID-1Si 0 -s 80861960105a0000 SuperTrak 0 -s 80861960105a2168 SuperTrak Pro 0 -s 80861960105a5168 SuperTrak66/100 0 -s 8086196011111111 MegaRAID 466, PowerEdge Expandable RAID Controller 2/SC 0 -s 8086196011111112 PowerEdge Expandable RAID Controller 2/SC 0 -s 80861960113c03a2 MegaRAID 0 -s 80861960e4bf1010 CG1-RADIO 0 -s 80861960e4bf1020 CU2-QUARTET 0 -s 80861960e4bf1040 CU1-CHORUS 0 -s 80861960e4bf3100 CX1-BAND 0 -d 80861962 80960RM [i960RM Microprocessor] 0 -s 80861962105a0000 SuperTrak SX6000 I2O CPU 0 -d 80861a21 82840 840 (Carmel) Chipset Host Bridge (Hub A) 0 -d 80861a23 82840 840 (Carmel) Chipset AGP Bridge 0 -d 80861a24 82840 840 (Carmel) Chipset PCI Bridge (Hub B) 0 -d 80861a30 82845 845 (Brookdale) Chipset Host Bridge 0 -s 80861a301028010e Optiplex GX240 0 -d 80861a31 82845 845 (Brookdale) Chipset AGP Bridge 0 -d 80862410 82801AA ISA Bridge (LPC) 0 -d 80862411 82801AA IDE 0 -d 80862412 82801AA USB 0 -d 80862413 82801AA SMBus 0 -d 80862415 82801AA AC'97 Audio 0 -s 8086241510280095 Precision Workstation 220 Integrated Digital Audio 0 -s 8086241511d40040 SoundMAX Integrated Digital Audio 0 -s 8086241511d40048 SoundMAX Integrated Digital Audio 0 -s 8086241511d45340 SoundMAX Integrated Digital Audio 0 -d 80862416 82801AA AC'97 Modem 0 -d 80862418 82801AA PCI Bridge 0 -d 80862420 82801AB ISA Bridge (LPC) 0 -d 80862421 82801AB IDE 0 -d 80862422 82801AB USB 0 -d 80862423 82801AB SMBus 0 -d 80862425 82801AB AC'97 Audio 0 -s 8086242511d40040 SoundMAX Integrated Digital Audio 0 -s 8086242511d40048 SoundMAX Integrated Digital Audio 0 -d 80862426 82801AB AC'97 Modem 0 -d 80862428 82801AB PCI Bridge 0 -d 80862440 82801BA ISA Bridge (LPC) 0 -d 80862442 82801BA/BAM USB (Hub #1) 0 -s 80862442101401c6 Netvista A40/A40p 0 -s 8086244210251016 Travelmate 612 TX 0 -s 808624421028010e Optiplex GX240 0 -s 8086244210438027 TUSL2-C Mainboard 0 -s 80862442104d80df Vaio PCG-FX403 0 -s 80862442147b0507 TH7II-RAID 0 -s 8086244280864532 D815EEA2 mainboard 0 -s 8086244280864557 D815EGEW Mainboard 0 -d 80862443 82801BA/BAM SMBus 0 -s 80862443101401c6 Netvista A40/A40p 0 -s 8086244310251016 Travelmate 612 TX 0 -s 808624431028010e Optiplex GX240 0 -s 8086244310438027 TUSL2-C Mainboard 0 -s 80862443104d80df Vaio PCG-FX403 0 -s 80862443147b0507 TH7II-RAID 0 -s 8086244380864532 D815EEA2 mainboard 0 -s 8086244380864557 D815EGEW Mainboard 0 -d 80862444 82801BA/BAM USB (Hub #2) 0 -s 8086244410251016 Travelmate 612 TX 0 -s 808624441028010e Optiplex GX240 0 -s 8086244410438027 TUSL2-C Mainboard 0 -s 80862444104d80df Vaio PCG-FX403 0 -s 80862444147b0507 TH7II-RAID 0 -s 8086244480864532 D815EEA2 mainboard 0 -d 80862445 82801BA/BAM AC'97 Audio 0 -s 80862445101401c6 Netvista A40/A40p 0 -s 8086244510251016 Travelmate 612 TX 0 -s 80862445104d80df Vaio PCG-FX403 0 -s 8086244514623370 STAC9721 AC 0 -s 80862445147b0507 TH7II-RAID 0 -s 8086244580864557 D815EGEW Mainboard 0 -d 80862446 82801BA/BAM AC'97 Modem 0 -s 8086244610251016 Travelmate 612 TX 0 -s 80862446104d80df Vaio PCG-FX403 0 -d 80862448 82801 Mobile PCI Bridge 0 -d 80862449 82801BA/BAM/CA/CAM Ethernet Controller 0 -s 808624490e110012 EtherExpress PRO/100 VM 0 -s 808624490e110091 EtherExpress PRO/100 VE 0 -s 80862449101401ce EtherExpress PRO/100 VE 0 -s 80862449101401dc EtherExpress PRO/100 VE 0 -s 80862449101401eb EtherExpress PRO/100 VE 0 -s 80862449101401ec EtherExpress PRO/100 VE 0 -s 8086244910140202 EtherExpress PRO/100 VE 0 -s 8086244910140205 EtherExpress PRO/100 VE 0 -s 8086244910140217 EtherExpress PRO/100 VE 0 -s 8086244910140234 EtherExpress PRO/100 VE 0 -s 808624491014023d EtherExpress PRO/100 VE 0 -s 8086244910140244 EtherExpress PRO/100 VE 0 -s 8086244910140245 EtherExpress PRO/100 VE 0 -s 8086244910140265 PRO/100 VE Desktop Connection 0 -s 8086244910140267 PRO/100 VE Desktop Connection 0 -s 808624491014026a PRO/100 VE Desktop Connection 0 -s 80862449109f315d EtherExpress PRO/100 VE 0 -s 80862449109f3181 EtherExpress PRO/100 VE 0 -s 808624491179ff01 PRO/100 VE Network Connection 0 -s 8086244911867801 EtherExpress PRO/100 VE 0 -s 80862449144d2602 HomePNA 1M CNR 0 -s 8086244980863010 EtherExpress PRO/100 VE 0 -s 8086244980863011 EtherExpress PRO/100 VM 0 -s 8086244980863012 82562EH based Phoneline 0 -s 8086244980863013 EtherExpress PRO/100 VE 0 -s 8086244980863014 EtherExpress PRO/100 VM 0 -s 8086244980863015 82562EH based Phoneline 0 -s 8086244980863016 EtherExpress PRO/100 P Mobile Combo 0 -s 8086244980863017 EtherExpress PRO/100 P Mobile 0 -s 8086244980863018 EtherExpress PRO/100 0 -d 8086244a 82801BAM IDE U100 0 -s 8086244a10251016 Travelmate 612TX 0 -s 8086244a104d80df Vaio PCG-FX403 0 -d 8086244b 82801BA IDE U100 0 -s 8086244b101401c6 Netvista A40/A40p 0 -s 8086244b1028010e Optiplex GX240 0 -s 8086244b10438027 TUSL2-C Mainboard 0 -s 8086244b147b0507 TH7II-RAID 0 -s 8086244b80864532 D815EEA2 mainboard 0 -s 8086244b80864557 D815EGEW Mainboard 0 -d 8086244c 82801BAM ISA Bridge (LPC) 0 -d 8086244e 82801 PCI Bridge 0 -s 8086244e10140267 NetVista A30p 0 -d 80862450 82801E ISA Bridge (LPC) 0 -d 80862452 82801E USB 0 -d 80862453 82801E SMBus 0 -d 80862459 82801E Ethernet Controller 0 0 -d 8086245b 82801E IDE U100 0 -d 8086245d 82801E Ethernet Controller 1 0 -d 8086245e 82801E PCI Bridge 0 -d 80862480 82801CA LPC Interface Controller 0 -d 80862482 82801CA/CAM USB (Hub #1) 0 -s 8086248210140220 ThinkPad A/T/X Series 0 -s 80862482104d80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP 0 -s 8086248215d93480 P4DP6 0 -s 8086248280861958 vpr Matrix 170B4 0 -s 8086248280863424 SE7501HG2 Mainboard 0 -s 8086248280864541 Latitude C640 0 -d 80862483 82801CA/CAM SMBus Controller 0 -s 8086248310140220 ThinkPad A/T/X Series 0 -s 80862483104d80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP 0 -s 8086248315d93480 P4DP6 0 -s 8086248380861958 vpr Matrix 170B4 0 -d 80862484 82801CA/CAM USB (Hub #2) 0 -s 8086248410140220 ThinkPad A/T/X Series 0 -s 80862484104d80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP 0 -s 8086248415d93480 P4DP6 0 -s 8086248480861958 vpr Matrix 170B4 0 -d 80862485 82801CA/CAM AC'97 Audio Controller 0 -s 8086248510135959 Crystal WMD Audio Codec 0 -s 8086248510140222 ThinkPad T23 (2647-4MG) or A30/A30p (2652/2653) 0 -s 8086248510140508 ThinkPad T30 0 -s 808624851014051c ThinkPad A/T/X Series 0 -s 80862485104d80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP 0 -s 80862485144dc006 vpr Matrix 170B4 0 -d 80862486 82801CA/CAM AC'97 Modem Controller 0 -s 8086248610140223 ThinkPad A/T/X Series 0 -s 8086248610140503 ThinkPad R31 2656BBG 0 -s 808624861014051a ThinkPad A/T/X Series 0 -s 80862486101f1025 Acer 620 Series 0 -s 80862486104d80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP 0 -s 8086248611790001 Toshiba Satellite 1110 Z15 internal Modem 0 -s 80862486134d4c21 Dell Inspiron 2100 internal modem 0 -s 80862486144d2115 vpr Matrix 170B4 internal modem 0 -s 8086248614f15421 MD56ORD V.92 MDC Modem 0 -d 80862487 82801CA/CAM USB (Hub #3) 0 -s 8086248710140220 ThinkPad A/T/X Series 0 -s 80862487104d80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP 0 -s 8086248715d93480 P4DP6 0 -s 8086248780861958 vpr Matrix 170B4 0 -d 8086248a 82801CAM IDE U100 0 -s 8086248a10140220 ThinkPad A/T/X Series 0 -s 8086248a104d80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP 0 -s 8086248a80861958 vpr Matrix 170B4 0 -s 8086248a80864541 Latitude C640 0 -d 8086248b 82801CA Ultra ATA Storage Controller 0 -s 8086248b15d93480 P4DP6 0 -d 8086248c 82801CAM ISA Bridge (LPC) 0 -d 808624c0 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge 0 -s 808624c010140267 NetVista A30p 0 -s 808624c014625800 845PE Max (MS-6580) 0 -d 808624c1 82801DBL (ICH4-L) IDE Controller 0 -d 808624c2 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 0 -s 808624c210140267 NetVista A30p 0 -s 808624c21025005a TravelMate 290 0 -s 808624c210280126 Optiplex GX260 0 -s 808624c210280163 Latitude D505 0 -s 808624c2103c0890 NC6000 laptop 0 -s 808624c210718160 MIM2000 0 -s 808624c214625800 845PE Max (MS-6580) 0 -s 808624c215092990 Averatec 5110H laptop 0 -s 808624c24c531090 Cx9 / Vx9 mainboard 0 -d 808624c3 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller 0 -s 808624c310140267 NetVista A30p 0 -s 808624c31025005a TravelMate 290 0 -s 808624c310280126 Optiplex GX260 0 -s 808624c3103c0890 NC6000 laptop 0 -s 808624c310718160 MIM2000 0 -s 808624c3145824c2 GA-8PE667 Ultra 0 -s 808624c314625800 845PE Max (MS-6580) 0 -s 808624c34c531090 Cx9 / Vx9 mainboard 0 -d 808624c4 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 0 -s 808624c410140267 NetVista A30p 0 -s 808624c41025005a TravelMate 290 0 -s 808624c410280126 Optiplex GX260 0 -s 808624c410280163 Latitude D505 0 -s 808624c4103c0890 NC6000 laptop 0 -s 808624c410718160 MIM2000 0 -s 808624c414625800 845PE Max (MS-6580) 0 -s 808624c415092990 Averatec 5110H 0 -s 808624c44c531090 Cx9 / Vx9 mainboard 0 -d 808624c5 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller 0 -s 808624c50e1100b8 Analog Devices Inc. codec [SoundMAX] 0 -s 808624c510140267 NetVista A30p 0 -s 808624c51025005a TravelMate 290 0 -s 808624c510280163 Latitude D505 0 -s 808624c5103c0890 NC6000 laptop 0 -s 808624c510718160 MIM2000 0 -s 808624c51458a002 GA-8PE667 Ultra 0 -s 808624c514625800 845PE Max (MS-6580) 0 -d 808624c6 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Modem Controller 0 -s 808624c61025005a TravelMate 290 0 -s 808624c6103c0890 NC6000 laptop 0 -s 808624c610718160 MIM2000 0 -d 808624c7 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 0 -s 808624c710140267 NetVista A30p 0 -s 808624c71025005a TravelMate 290 0 -s 808624c710280126 Optiplex GX260 0 -s 808624c710280163 Latitude D505 0 -s 808624c7103c0890 NC6000 laptop 0 -s 808624c710718160 MIM2000 0 -s 808624c714625800 845PE Max (MS-6580) 0 -s 808624c715092990 Averatec 5110H 0 -s 808624c74c531090 Cx9 / Vx9 mainboard 0 -d 808624ca 82801DBM (ICH4-M) IDE Controller 0 -s 808624ca1025005a TravelMate 290 0 -s 808624ca10280163 Latitude D505 0 -s 808624ca103c0890 NC6000 laptop 0 -s 808624ca10718160 MIM2000 0 -d 808624cb 82801DB (ICH4) IDE Controller 0 -s 808624cb10140267 NetVista A30p 0 -s 808624cb10280126 Optiplex GX260 0 -s 808624cb145824c2 GA-8PE667 Ultra 0 -s 808624cb14625800 845PE Max (MS-6580) 0 -s 808624cb4c531090 Cx9 / Vx9 mainboard 0 -d 808624cc 82801DBM (ICH4-M) LPC Interface Bridge 0 -d 808624cd 82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller 0 -s 808624cd10140267 NetVista A30p 0 -s 808624cd1025005a TravelMate 290 0 -s 808624cd10280126 Optiplex GX260 0 -s 808624cd10280163 Latitude D505 0 -s 808624cd103c0890 NC6000 laptop 0 -s 808624cd10718160 MIM2000 0 -s 808624cd14623981 845PE Max (MS-6580) 0 -s 808624cd15091968 Averatec 5110H 0 -s 808624cd4c531090 Cx9 / Vx9 mainboard 0 -d 808624d0 82801EB/ER (ICH5/ICH5R) LPC Interface Bridge 0 -d 808624d1 82801EB (ICH5) SATA Controller 0 -s 808624d1103c12bc d530 CMT (DG746A) 0 -s 808624d1145824d1 GA-8IPE1000 Pro2 motherboard (865PE) 0 -s 808624d114627280 865PE Neo2 (MS-6728) 0 -s 808624d180863427 S875WP1-E mainboard 0 -s 808624d18086524c D865PERL mainboard 0 -d 808624d2 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #1 0 -s 808624d2103c12bc d530 CMT (DG746A) 0 -s 808624d2104380a6 P4P800 Mainboard 0 -s 808624d2145824d2 GA-8KNXP motherboard (875P) 0 -s 808624d214627280 865PE Neo2 (MS-6728) 0 -s 808624d280863427 S875WP1-E mainboard 0 -s 808624d28086524c D865PERL mainboard 0 -d 808624d3 82801EB/ER (ICH5/ICH5R) SMBus Controller 0 -s 808624d3104380a6 P4P800 Mainboard 0 -s 808624d3145824d2 GA-8IPE1000 Pro2 motherboard (865PE) 0 -s 808624d314627280 865PE Neo2 (MS-6728) 0 -s 808624d380863427 S875WP1-E mainboard 0 -s 808624d38086524c D865PERL mainboard 0 -d 808624d4 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #2 0 -s 808624d4103c12bc d530 CMT (DG746A) 0 -s 808624d4104380a6 P4P800 Mainboard 0 -s 808624d4145824d2 GA-8IPE1000 Pro2 motherboard (865PE) 0 -s 808624d414627280 865PE Neo2 (MS-6728) 0 -s 808624d480863427 S875WP1-E mainboard 0 -s 808624d48086524c D865PERL mainboard 0 -d 808624d5 82801EB/ER (ICH5/ICH5R) AC'97 Audio Controller 0 -s 808624d5103c12bc Analog Devices codec [SoundMAX Integrated Digital Audio] 0 -s 808624d5104380f3 P4P800 Mainboard 0 -s 808624d51458a002 GA-8KNXP motherboard (875P) 0 -s 808624d514627280 865PE Neo2 (MS-6728) 0 -s 808624d58086a000 D865PERL mainboard 0 -d 808624d6 82801EB/ER (ICH5/ICH5R) AC'97 Modem Controller 0 -d 808624d7 82801EB/ER (ICH5/ICH5R) USB UHCI #3 0 -s 808624d7103c12bc d530 CMT (DG746A) 0 -s 808624d7104380a6 P4P800 Mainboard 0 -s 808624d7145824d2 GA-8IPE1000 Pro2 motherboard (865PE) 0 -s 808624d714627280 865PE Neo2 (MS-6728) 0 -s 808624d780863427 S875WP1-E mainboard 0 -s 808624d78086524c D865PERL mainboard 0 -d 808624db 82801EB/ER (ICH5/ICH5R) IDE Controller 0 -s 808624db103c12bc d530 CMT (DG746A) 0 -s 808624db104380a6 P4P800 Mainboard 0 -s 808624db145824d2 GA-8IPE1000 Pro2 motherboard (865PE) 0 -s 808624db14627280 865PE Neo2 (MS-6728) 0 -s 808624db14627580 MSI 875P 0 -s 808624db80863427 S875WP1-E mainboard 0 -s 808624db8086524c D865PERL mainboard 0 -d 808624dc 82801EB (ICH5) LPC Interface Bridge 0 -d 808624dd 82801EB/ER (ICH5/ICH5R) USB2 EHCI Controller 0 -s 808624dd103c12bc d530 CMT (DG746A) 0 -s 808624dd104380a6 P4P800 Mainboard 0 -s 808624dd14585006 GA-8IPE1000 Pro2 motherboard (865PE) 0 -s 808624dd14627280 865PE Neo2 (MS-6728) 0 -s 808624dd80863427 S875WP1-E mainboard 0 -s 808624dd8086524c D865PERL mainboard 0 -d 808624de 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #4 0 -s 808624de104380a6 P4P800 Mainboard 0 -s 808624de145824d2 GA-8IPE1000 Pro2 motherboard (865PE) 0 -s 808624de14627280 865PE Neo2 (MS-6728) 0 -s 808624de80863427 S875WP1-E mainboard 0 -s 808624de8086524c D865PERL mainboard 0 -d 808624df 82801ER (ICH5R) SATA Controller 0 -d 80862500 82820 820 (Camino) Chipset Host Bridge (MCH) 0 -s 8086250010280095 Precision Workstation 220 Chipset 0 -s 808625001043801c P3C-2000 system chipset 0 -d 80862501 82820 820 (Camino) Chipset Host Bridge (MCH) 0 -s 808625011043801c P3C-2000 system chipset 0 -d 8086250b 82820 820 (Camino) Chipset Host Bridge 0 -d 8086250f 82820 820 (Camino) Chipset AGP Bridge 0 -d 80862520 82805AA MTH Memory Translator Hub 0 -d 80862521 82804AA MRH-S Memory Repeater Hub for SDRAM 0 -d 80862530 82850 850 (Tehama) Chipset Host Bridge (MCH) 0 -s 80862530147b0507 TH7II-RAID 0 -d 80862531 82860 860 (Wombat) Chipset Host Bridge (MCH) 0 -d 80862532 82850 850 (Tehama) Chipset AGP Bridge 0 -d 80862533 82860 860 (Wombat) Chipset AGP Bridge 0 -d 80862534 82860 860 (Wombat) Chipset PCI Bridge 0 -d 80862540 E7500 Memory Controller Hub 0 -s 8086254015d93480 P4DP6 0 -d 80862541 E7500/E7501 Host RASUM Controller 0 -s 8086254115d93480 P4DP6 0 -s 808625414c531090 Cx9 / Vx9 mainboard 0 -s 8086254180863424 SE7501HG2 Mainboard 0 -d 80862543 E7500/E7501 Hub Interface B PCI-to-PCI Bridge 0 -d 80862544 E7500/E7501 Hub Interface B RASUM Controller 0 -s 808625444c531090 Cx9 / Vx9 mainboard 0 -d 80862545 E7500/E7501 Hub Interface C PCI-to-PCI Bridge 0 -d 80862546 E7500/E7501 Hub Interface C RASUM Controller 0 -d 80862547 E7500/E7501 Hub Interface D PCI-to-PCI Bridge 0 -d 80862548 E7500/E7501 Hub Interface D RASUM Controller 0 -d 8086254c E7501 Memory Controller Hub 0 -s 8086254c4c531090 Cx9 / Vx9 mainboard 0 -s 8086254c80863424 SE7501HG2 Mainboard 0 -d 80862550 E7505 Memory Controller Hub 0 -d 80862551 E7505/E7205 Series RAS Controller 0 -d 80862552 E7505/E7205 PCI-to-AGP Bridge 0 -d 80862553 E7505 Hub Interface B PCI-to-PCI Bridge 0 -d 80862554 E7505 Hub Interface B PCI-to-PCI Bridge RAS Controller 0 -d 8086255d E7205 Memory Controller Hub 0 -d 80862560 82845G/GL[Brookdale-G]/GE/PE DRAM Controller/Host-Hub Interface 0 -s 8086256010280126 Optiplex GX260 0 -s 8086256014582560 GA-8PE667 Ultra 0 -s 8086256014625800 845PE Max (MS-6580) 0 -d 80862561 82845G/GL[Brookdale-G]/GE/PE Host-to-AGP Bridge 0 -d 80862562 82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device 0 -s 8086256210140267 NetVista A30p 0 -d 80862570 82865G/PE/P DRAM Controller/Host-Hub Interface 0 -s 80862570104380f2 P4P800 Mainboard 0 -s 8086257014582570 GA-8IPE1000 Pro2 motherboard (865PE) 0 -d 80862571 82865G/PE/P PCI to AGP Controller 0 -d 80862572 82865G Integrated Graphics Device 0 -d 80862573 82865G/PE/P PCI to CSA Bridge 0 -d 80862576 82865G/PE/P Processor to I/O Memory Interface 0 -d 80862578 82875P/E7210 Memory Controller Hub 0 -s 8086257814582578 GA-8KNXP motherboard (875P) 0 -s 8086257814627580 MS-6758 (875P Neo) 0 -s 8086257815d94580 Super Micro Computer Inc. P4SCE 0 Motherboard P4SCE -d 80862579 82875P Processor to AGP Controller 0 -d 8086257b 82875P/E7210 Processor to PCI to CSA Bridge 0 -d 8086257e 82875P/E7210 Processor to I/O Memory Interface 0 -d 80862580 915G/P/GV Processor to I/O Controller 0 -d 80862581 915G/P/GV PCI Express Root Port 0 -d 80862582 82915G Express Chipset Family Graphics Controller 0 -s 8086258210281079 Optiplex GX280 0 -d 80862584 925X/XE Memory Controller Hub 0 -d 80862585 925X/XE PCI Express Root Port 0 -d 80862588 E7220/E7221 Memory Controller Hub 0 -d 80862589 E7220/E7221 PCI Express Root Port 0 -d 8086258a E7221 Integrated Graphics Controller 0 -d 80862590 Mobile Memory Controller Hub 0 -d 80862591 Mobile Memory Controller Hub PCI Express Port 0 -d 80862592 Mobile Graphics Controller 0 -d 808625a1 6300ESB LPC Interface Controller 0 -d 808625a2 6300ESB PATA Storage Controller 0 -s 808625a24c5310b0 CL9 mainboard 0 -d 808625a3 6300ESB SATA Storage Controller 0 -s 808625a34c5310b0 CL9 mainboard 0 -d 808625a4 6300ESB SMBus Controller 0 -s 808625a44c5310b0 CL9 mainboard 0 -d 808625a6 6300ESB AC'97 Audio Controller 0 -s 808625a64c5310b0 CL9 mainboard 0 -d 808625a7 6300ESB AC'97 Modem Controller 0 -d 808625a9 6300ESB USB Universal Host Controller 0 -s 808625a94c5310b0 CL9 mainboard 0 -d 808625aa 6300ESB USB Universal Host Controller 0 -s 808625aa4c5310b0 CL9 mainboard 0 -d 808625ab 6300ESB Watchdog Timer 0 -s 808625ab4c5310b0 CL9 mainboard 0 -d 808625ac 6300ESB I/O Advanced Programmable Interrupt Controller 0 -s 808625ac4c5310b0 CL9 mainboard 0 -d 808625ad 6300ESB USB2 Enhanced Host Controller 0 -d 808625ae 6300ESB 64-bit PCI-X Bridge 0 -d 808625b0 6300ESB SATA RAID Controller 0 -d 80862600 Server Hub Interface 0 -d 80862601 Server Hub PCI Express x4 Port D 0 -d 80862602 Server Hub PCI Express x4 Port C0 0 -d 80862603 Server Hub PCI Express x4 Port C1 0 -d 80862604 Server Hub PCI Express x4 Port B0 0 -d 80862605 Server Hub PCI Express x4 Port B1 0 -d 80862606 Server Hub PCI Express x4 Port A0 0 -d 80862607 Server Hub PCI Express x4 Port A1 0 -d 80862608 Server Hub PCI Express x8 Port C 0 -d 80862609 Server Hub PCI Express x8 Port B 0 -d 8086260a Server Hub PCI Express x8 Port A 0 -d 8086260c Server Hub IMI Registers 0 -d 80862610 Server Hub System Bus, Boot, and Interrupt Registers 0 -d 80862611 Server Hub Address Mapping Registers 0 -d 80862612 Server Hub RAS Registers 0 -d 80862613 Server Hub Reserved Registers 0 -d 80862614 Server Hub Reserved Registers 0 -d 80862615 Server Hub Miscellaneous Registers 0 -d 80862617 Server Hub Reserved Registers 0 -d 80862618 Server Hub Reserved Registers 0 -d 80862619 Server Hub Reserved Registers 0 -d 8086261a Server Hub Reserved Registers 0 -d 8086261b Server Hub Reserved Registers 0 -d 8086261c Server Hub Reserved Registers 0 -d 8086261d Server Hub Reserved Registers 0 -d 8086261e Server Hub Reserved Registers 0 -d 80862620 External Memory Bridge 0 -d 80862621 External Memory Bridge Control Registers 0 -d 80862622 External Memory Bridge Memory Interleaving Registers 0 -d 80862623 External Memory Bridge DDR Initialization and Calibration 0 -d 80862624 External Memory Bridge Reserved Registers 0 -d 80862625 External Memory Bridge Reserved Registers 0 -d 80862626 External Memory Bridge Reserved Registers 0 -d 80862627 External Memory Bridge Reserved Registers 0 -d 80862640 82801FB/FR (ICH6/ICH6R) LPC Interface Bridge 0 -d 80862641 82801FBM (ICH6M) LPC Interface Bridge 0 -d 80862642 82801FW/FRW (ICH6W/ICH6RW) LPC Interface Bridge 0 -d 80862651 82801FB/FW (ICH6/ICH6W) SATA Controller 0 -s 8086265110280179 Optiplex GX280 0 -d 80862652 82801FR/FRW (ICH6R/ICH6RW) SATA Controller 0 -d 80862653 82801FBM (ICH6M) SATA Controller 0 -d 80862658 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #1 0 -s 8086265810280179 Optiplex GX280 0 -d 80862659 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #2 0 -s 8086265910280179 Optiplex GX280 0 -d 8086265a 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #3 0 -s 8086265a10280179 Optiplex GX280 0 -d 8086265b 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #4 0 -s 8086265b10280179 Optiplex GX280 0 -d 8086265c 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB2 EHCI Controller 0 -s 8086265c10280179 Optiplex GX280 0 -d 80862660 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 1 0 -d 80862662 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 2 0 -d 80862664 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 3 0 -d 80862666 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 4 0 -d 80862668 82801FB/FBM/FR/FW/FRW (ICH6 Family) High Definition Audio Controller 0 -d 8086266a 82801FB/FBM/FR/FW/FRW (ICH6 Family) SMBus Controller 0 -s 8086266a10280179 Optiplex GX280 0 -d 8086266c 82801FB/FBM/FR/FW/FRW (ICH6 Family) LAN Controller 0 -d 8086266d 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Modem Controller 0 -d 8086266e 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Audio Controller 0 -s 8086266e10280179 Optiplex GX280 0 -d 8086266f 82801FB/FBM/FR/FW/FRW (ICH6 Family) IDE Controller 0 -d 80862782 82915G Express Chipset Family Graphics Controller 0 -d 80862792 Mobile Graphics Controller 0 -d 80863092 Integrated RAID 0 -d 80863200 GD31244 PCI-X SATA HBA 0 -d 80863340 82855PM Processor to I/O Controller 0 -s 808633401025005a TravelMate 290 0 -s 80863340103c0890 NC6000 laptop 0 -d 80863341 82855PM Processor to AGP Controller 0 -d 80863575 82830 830 Chipset Host Bridge 0 -s 808635751014021d ThinkPad A/T/X Series 0 -s 80863575104d80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP 0 -d 80863576 82830 830 Chipset AGP Bridge 0 -d 80863577 82830 CGC [Chipset Graphics Controller] 0 -s 8086357710140513 ThinkPad A/T/X Series 0 -d 80863578 82830 830 Chipset Host Bridge 0 -d 80863580 82852/82855 GM/GME/PM/GMV Processor to I/O Controller 0 -s 8086358010280163 Latitude D505 0 -s 808635804c5310b0 CL9 mainboard 0 -d 80863581 82852/82855 GM/GME/PM/GMV Processor to AGP Controller 0 -d 80863582 82852/855GM Integrated Graphics Device 0 -s 8086358210280163 Latitude D505 0 -s 808635824c5310b0 CL9 mainboard 0 -d 80863584 82852/82855 GM/GME/PM/GMV Processor to I/O Controller 0 -s 8086358410280163 Latitude D505 0 -s 808635844c5310b0 CL9 mainboard 0 -d 80863585 82852/82855 GM/GME/PM/GMV Processor to I/O Controller 0 -s 8086358510280163 Latitude D505 0 -s 808635854c5310b0 CL9 mainboard 0 -d 80863590 E7520 Memory Controller Hub 0 -d 80863591 E7525/E7520 Error Reporting Registers 0 -d 80863592 E7320 Memory Controller Hub 0 -d 80863593 E7320 Error Reporting Registers 0 -d 80863594 E7520 DMA Controller 0 -d 80863595 E7525/E7520/E7320 PCI Express Port A 0 -d 80863596 E7525/E7520/E7320 PCI Express Port A1 0 -d 80863597 E7525/E7520 PCI Express Port B 0 -d 80863598 E7520 PCI Express Port B1 0 -d 80863599 E7520 PCI Express Port C 0 -d 8086359a E7520 PCI Express Port C1 0 -d 8086359b E7525/E7520/E7320 Extended Configuration Registers 0 -d 8086359e E7525 Memory Controller Hub 0 -d 80864220 PRO/Wireless 2200BG 0 -d 80864223 PRO/Wireless 2915ABG MiniPCI Adapter 0 -d 80865200 EtherExpress PRO/100 Intelligent Server 0 -d 80865201 EtherExpress PRO/100 Intelligent Server 0 -s 8086520180860001 EtherExpress PRO/100 Server Ethernet Adapter 0 -d 8086530d 80310 IOP [IO Processor] 0 -d 80867000 82371SB PIIX3 ISA [Natoma/Triton II] 0 -d 80867010 82371SB PIIX3 IDE [Natoma/Triton II] 0 -d 80867020 82371SB PIIX3 USB [Natoma/Triton II] 0 -d 80867030 430VX - 82437VX TVX [Triton VX] 0 -d 80867050 Intel Intercast Video Capture Card 0 -d 80867100 430TX - 82439TX MTXC 0 -d 80867110 82371AB/EB/MB PIIX4 ISA 0 -s 8086711015ad1976 virtualHW v3 0 -d 80867111 82371AB/EB/MB PIIX4 IDE 0 -s 8086711115ad1976 virtualHW v3 0 -d 80867112 82371AB/EB/MB PIIX4 USB 0 -s 8086711215ad1976 virtualHW v3 0 -d 80867113 82371AB/EB/MB PIIX4 ACPI 0 -s 8086711315ad1976 virtualHW v3 0 -d 80867120 82810 GMCH [Graphics Memory Controller Hub] 0 -s 808671204c531040 CL7 mainboard 0 -s 808671204c531060 PC7 mainboard 0 -d 80867121 82810 CGC [Chipset Graphics Controller] 0 -s 808671214c531040 CL7 mainboard 0 -s 808671214c531060 PC7 mainboard 0 -s 8086712180864341 Cayman (CA810) Mainboard 0 -d 80867122 82810 DC-100 GMCH [Graphics Memory Controller Hub] 0 -d 80867123 82810 DC-100 CGC [Chipset Graphics Controller] 0 -d 80867124 82810E DC-133 GMCH [Graphics Memory Controller Hub] 0 -d 80867125 82810E DC-133 CGC [Chipset Graphics Controller] 0 -d 80867126 82810 DC-133 System and Graphics Controller 0 -d 80867128 82810-M DC-100 System and Graphics Controller 0 -d 8086712a 82810-M DC-133 System and Graphics Controller 0 -d 80867180 440LX/EX - 82443LX/EX Host bridge 0 -d 80867181 440LX/EX - 82443LX/EX AGP bridge 0 -d 80867190 440BX/ZX/DX - 82443BX/ZX/DX Host bridge 0 -s 808671900e110500 Armada 1750 Laptop System Chipset 0 -s 808671900e11b110 Armada M700/E500 0 -s 8086719011790001 Toshiba Tecra 8100 Laptop System Chipset 0 -s 8086719015ad1976 virtualHW v3 0 -s 808671904c531050 CT7 mainboard 0 -s 808671904c531051 CE7 mainboard 0 -d 80867191 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge 0 -d 80867192 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (AGP disabled) 0 -s 808671920e110460 Armada 1700 Laptop System Chipset 0 -s 808671924c531000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard 0 -d 80867194 82440MX Host Bridge 0 -s 8086719410330000 Versa Note Vxi 0 -s 808671944c5310a0 CA3/CR3 mainboard 0 -d 80867195 82440MX AC'97 Audio Controller 0 -s 80867195103380cc Versa Note VXi 0 -s 8086719510cf1099 QSound_SigmaTel Stac97 PCI Audio 0 -s 8086719511d40040 SoundMAX Integrated Digital Audio 0 -s 8086719511d40048 SoundMAX Integrated Digital Audio 0 -d 80867196 82440MX AC'97 Modem Controller 0 -d 80867198 82440MX ISA Bridge 0 -d 80867199 82440MX EIDE Controller 0 -d 8086719a 82440MX USB Universal Host Controller 0 -d 8086719b 82440MX Power Management Controller 0 -d 808671a0 440GX - 82443GX Host bridge 0 -s 808671a04c531050 CT7 mainboard 0 -s 808671a04c531051 CE7 mainboard 0 -d 808671a1 440GX - 82443GX AGP bridge 0 -d 808671a2 440GX - 82443GX Host bridge (AGP disabled) 0 -s 808671a24c531000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard 0 -d 80867600 82372FB PIIX5 ISA 0 -d 80867601 82372FB PIIX5 IDE 0 -d 80867602 82372FB PIIX5 USB 0 -d 80867603 82372FB PIIX5 SMBus 0 -d 80867800 82740 (i740) AGP Graphics Accelerator 0 -s 80867800003d0008 Starfighter AGP 0 -s 80867800003d000b Starfighter AGP 0 -s 8086780010920100 Stealth II G460 0 -s 8086780010b4201a Lightspeed 740 0 -s 8086780010b4202f Lightspeed 740 0 -s 8086780080860000 Terminator 2x/i 0 -s 8086780080860100 Intel740 Graphics Accelerator 0 -d 808684c4 450KX/GX [Orion] - 82454KX/GX PCI bridge 0 -d 808684c5 450KX/GX [Orion] - 82453KX/GX Memory controller 0 -d 808684ca 450NX - 82451NX Memory & I/O Controller 0 -d 808684cb 450NX - 82454NX/84460GX PCI Expander Bridge 0 -d 808684e0 460GX - 84460GX System Address Controller (SAC) 0 -d 808684e1 460GX - 84460GX System Data Controller (SDC) 0 -d 808684e2 460GX - 84460GX AGP Bridge (GXB function 2) 0 -d 808684e3 460GX - 84460GX Memory Address Controller (MAC) 0 -d 808684e4 460GX - 84460GX Memory Data Controller (MDC) 0 -d 808684e6 460GX - 82466GX Wide and fast PCI eXpander Bridge (WXB) 0 -d 808684ea 460GX - 84460GX AGP Bridge (GXB function 1) 0 -d 80868500 IXP4XX - Intel Network Processor family. IXP420, IXP421, IXP422, IXP425 and IXC1100 0 -d 80869000 IXP2000 Family Network Processor 0 -d 80869001 IXP2400 Network Processor 0 -d 80869004 IXP2800 Network Processor 0 -d 80869621 Integrated RAID 0 -d 80869622 Integrated RAID 0 -d 80869641 Integrated RAID 0 -d 808696a1 Integrated RAID 0 -d 8086a01f PRO/10GbE LR Server Adapter 0 retail verson -d 8086a11f PRO/10GbE LR Server Adapter 0 OEM version -d 8086b152 21152 PCI-to-PCI Bridge 0 -d 8086b154 21154 PCI-to-PCI Bridge 0 observed, and documented in Intel revision note; new mask of 1011:0026 -d 8086b555 21555 Non transparent PCI-to-PCI Bridge 0 -s 8086b55512d9000a PCI VoIP Gateway 0 -s 8086b5554c531050 CT7 mainboard 0 -s 8086b5554c531051 CE7 mainboard 0 -s 8086b555e4bf1000 CC8-1-BLUES 0 -d 8086ffff 450NX/GX [Orion] - 82453KX/GX Memory controller [BUG] 0 -v 8401 TRENDware International Inc. 0 -v 8800 Trigem Computer Inc. 0 -d 88002008 Video assistent component 0 -v 8866 T-Square Design Inc. 0 -v 8888 Silicon Magic 0 -v 8c4a Winbond 0 8c4a is not Winbond but there is a board misprogrammed -d 8c4a1980 W89C940 misprogrammed [ne2k] 0 -v 8e0e Computone Corporation 0 -v 8e2e KTI 0 -d 8e2e3000 ET32P2 0 -v 9004 Adaptec 0 -d 90040078 AHA-2940U_CN 0 -d 90041078 AIC-7810 0 -d 90041160 AIC-1160 [Family Fibre Channel Adapter] 0 -d 90042178 AIC-7821 0 -d 90043860 AHA-2930CU 0 -d 90043b78 AHA-4844W/4844UW 0 -d 90045075 AIC-755x 0 -d 90045078 AHA-7850 0 -s 9004507890047850 AHA-2904/Integrated AIC-7850 0 -d 90045175 AIC-755x 0 -d 90045178 AIC-7851 0 -d 90045275 AIC-755x 0 -d 90045278 AIC-7852 0 -d 90045375 AIC-755x 0 -d 90045378 AIC-7850 0 -d 90045475 AIC-755x 0 -d 90045478 AIC-7850 0 -d 90045575 AVA-2930 0 -d 90045578 AIC-7855 0 -d 90045647 ANA-7711 TCP Offload Engine 0 -s 9004564790047710 ANA-7711F TCP Offload Engine - Optical 0 -s 9004564790047711 ANA-7711LP TCP Offload Engine - Copper 0 -d 90045675 AIC-755x 0 -d 90045678 AIC-7856 0 -d 90045775 AIC-755x 0 -d 90045778 AIC-7850 0 -d 90045800 AIC-5800 0 -d 90045900 ANA-5910/5930/5940 ATM155 & 25 LAN Adapter 0 -d 90045905 ANA-5910A/5930A/5940A ATM Adapter 0 -d 90046038 AIC-3860 0 -d 90046075 AIC-1480 / APA-1480 0 -s 9004607590047560 AIC-1480 / APA-1480 Cardbus 0 -d 90046078 AIC-7860 0 -d 90046178 AIC-7861 0 -s 9004617890047861 AHA-2940AU Single 0 -d 90046278 AIC-7860 0 -d 90046378 AIC-7860 0 -d 90046478 AIC-786x 0 -d 90046578 AIC-786x 0 -d 90046678 AIC-786x 0 -d 90046778 AIC-786x 0 -d 90046915 ANA620xx/ANA69011A 0 -s 9004691590040008 ANA69011A/TX 10/100 0 -s 9004691590040009 ANA69011A/TX 10/100 0 -s 9004691590040010 ANA62022 2-port 10/100 0 -s 9004691590040018 ANA62044 4-port 10/100 0 -s 9004691590040019 ANA62044 4-port 10/100 0 -s 9004691590040020 ANA62022 2-port 10/100 0 -s 9004691590040028 ANA69011A/TX 10/100 0 -s 9004691590048008 ANA69011A/TX 64 bit 10/100 0 -s 9004691590048009 ANA69011A/TX 64 bit 10/100 0 -s 9004691590048010 ANA62022 2-port 64 bit 10/100 0 -s 9004691590048018 ANA62044 4-port 64 bit 10/100 0 -s 9004691590048019 ANA62044 4-port 64 bit 10/100 0 -s 9004691590048020 ANA62022 2-port 64 bit 10/100 0 -s 9004691590048028 ANA69011A/TX 64 bit 10/100 0 -d 90047078 AHA-294x / AIC-7870 0 -d 90047178 AHA-2940/2940W / AIC-7871 0 -d 90047278 AHA-3940/3940W / AIC-7872 0 -d 90047378 AHA-3985 / AIC-7873 0 -d 90047478 AHA-2944/2944W / AIC-7874 0 -d 90047578 AHA-3944/3944W / AIC-7875 0 -d 90047678 AHA-4944W/UW / AIC-7876 0 -d 90047710 ANA-7711F Network Accelerator Card (NAC) - Optical 0 -d 90047711 ANA-7711C Network Accelerator Card (NAC) - Copper 0 -d 90047778 AIC-787x 0 -d 90047810 AIC-7810 0 -d 90047815 AIC-7815 RAID+Memory Controller IC 0 -s 9004781590047815 ARO-1130U2 RAID Controller 0 -s 9004781590047840 AIC-7815 RAID+Memory Controller IC 0 -d 90047850 AIC-7850 0 -d 90047855 AHA-2930 0 -d 90047860 AIC-7860 0 -d 90047870 AIC-7870 0 -d 90047871 AHA-2940 0 -d 90047872 AHA-3940 0 -d 90047873 AHA-3980 0 -d 90047874 AHA-2944 0 -d 90047880 AIC-7880P 0 -d 90047890 AIC-7890 0 -d 90047891 AIC-789x 0 -d 90047892 AIC-789x 0 -d 90047893 AIC-789x 0 -d 90047894 AIC-789x 0 -d 90047895 AHA-2940U/UW / AHA-39xx / AIC-7895 0 -s 9004789590047890 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B 0 -s 9004789590047891 AHA-2940U/2940UW Dual 0 -s 9004789590047892 AHA-3940AU/AUW/AUWD/UWD 0 -s 9004789590047894 AHA-3944AUWD 0 -s 9004789590047895 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B 0 -s 9004789590047896 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B 0 -s 9004789590047897 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B 0 -d 90047896 AIC-789x 0 -d 90047897 AIC-789x 0 -d 90048078 AIC-7880U 0 -s 9004807890047880 AIC-7880P Ultra/Ultra Wide SCSI Chipset 0 -d 90048178 AHA-2940U/UW/D / AIC-7881U 0 -s 9004817890047881 AHA-2940UW SCSI Host Adapter 0 -d 90048278 AHA-3940U/UW/UWD / AIC-7882U 0 -d 90048378 AHA-3940U/UW / AIC-7883U 0 -d 90048478 AHA-2944UW / AIC-7884U 0 -d 90048578 AHA-3944U/UWD / AIC-7885 0 -d 90048678 AHA-4944UW / AIC-7886 0 -d 90048778 AHA-2940UW Pro / AIC-788x 0 -s 9004877890047887 2940UW Pro Ultra-Wide SCSI Controller 0 -d 90048878 AHA-2930UW / AIC-7888 0 -s 9004887890047888 AHA-2930UW SCSI Controller 0 -d 90048b78 ABA-1030 0 -d 9004ec78 AHA-4944W/UW 0 -v 9005 Adaptec 0 -d 90050010 AHA-2940U2/U2W 0 -s 9005001090052180 AHA-2940U2 SCSI Controller 0 -s 9005001090058100 AHA-2940U2B SCSI Controller 0 -s 900500109005a100 AHA-2940U2B SCSI Controller 0 -s 900500109005a180 AHA-2940U2W SCSI Controller 0 -s 900500109005e100 AHA-2950U2B SCSI Controller 0 -d 90050011 AHA-2930U2 0 -d 90050013 78902 0 -s 9005001390050003 AAA-131U2 Array1000 1 Channel RAID Controller 0 -s 900500139005000f AIC7890_ARO 0 -d 9005001f AHA-2940U2/U2W / 7890/7891 0 -s 9005001f9005000f 2940U2W SCSI Controller 0 -s 9005001f9005a180 2940U2W SCSI Controller 0 -d 90050020 AIC-7890 0 -d 9005002f AIC-7890 0 -d 90050030 AIC-7890 0 -d 9005003f AIC-7890 0 -d 90050050 AHA-3940U2x/395U2x 0 -s 900500509005f500 AHA-3950U2B 0 -s 900500509005ffff AHA-3950U2B 0 -d 90050051 AHA-3950U2D 0 -s 900500519005b500 AHA-3950U2D 0 -d 90050053 AIC-7896 SCSI Controller 0 -s 900500539005ffff AIC-7896 SCSI Controller mainboard implementation 0 -d 9005005f AIC-7896U2/7897U2 0 -d 90050080 AIC-7892A U160/m 0 -s 900500800e11e2a0 Compaq 64-Bit/66MHz Wide Ultra3 SCSI Adapter 0 -s 9005008090056220 AHA-29160C 0 -s 90050080900562a0 29160N Ultra160 SCSI Controller 0 -s 900500809005e220 29160LP Low Profile Ultra160 SCSI Controller 0 -s 900500809005e2a0 29160 Ultra160 SCSI Controller 0 -d 90050081 AIC-7892B U160/m 0 -s 90050081900562a1 19160 Ultra160 SCSI Controller 0 -d 90050083 AIC-7892D U160/m 0 -d 9005008f AIC-7892P U160/m 0 -s 9005008f11790001 Magnia Z310 0 -s 9005008f15d99005 Onboard SCSI Host Adapter 0 -d 900500c0 AHA-3960D / AIC-7899A U160/m 0 -s 900500c00e11f620 Compaq 64-Bit/66MHz Dual Channel Wide Ultra3 SCSI Adapter 0 -s 900500c09005f620 AHA-3960D U160/m 0 -d 900500c1 AIC-7899B U160/m 0 -d 900500c3 AIC-7899D U160/m 0 -d 900500c5 RAID subsystem HBA 0 -s 900500c5102800c5 PowerEdge 2400,2500,2550,4400 0 -d 900500cf AIC-7899P U160/m 0 -s 900500cf102800ce PowerEdge 1400 0 -s 900500cf102800d1 PowerEdge 2550 0 -s 900500cf102800d9 PowerEdge 2500 0 -s 900500cf10f12462 Thunder K7 S2462 0 -s 900500cf15d99005 Onboard SCSI Host Adapter 0 -s 900500cf80863411 SDS2 Mainboard 0 -d 90050250 ServeRAID Controller 0 -s 9005025010140279 ServeRAID-xx 0 -s 900502501014028c ServeRAID-xx 0 -d 90050279 ServeRAID 6M 0 from kernel sources -d 90050283 AAC-RAID 0 -s 9005028390050283 Catapult 0 -d 90050284 AAC-RAID 0 -s 9005028490050284 Tomcat 0 -d 90050285 AAC-RAID 0 -s 900502850e110295 SATA 6Ch (Bearcat) 0 -s 9005028510280287 PowerEdge Expandable RAID Controller 320/DC 0 -s 9005028510280291 CERC SATA RAID 2 PCI SATA 6ch (DellCorsair) 0 -s 9005028517aa0286 Legend S220 (Legend Crusader) 0 -s 9005028517aa0287 Legend S230 (Legend Vulcan) 0 -s 9005028590050285 2200S (Vulcan) 0 -s 9005028590050286 2120S (Crusader) 0 -s 9005028590050287 2200S (Vulcan-2m) 0 -s 9005028590050288 3230S (Harrier) 0 -s 9005028590050289 3240S (Tornado) 0 -s 900502859005028a ASR-2020S PCI-X ZCR (Skyhawk) 0 -s 900502859005028b ASR-2020S SO-DIMM PCI-X ZCR (Terminator) 0 -s 9005028590050290 AAR-2410SA PCI SATA 4ch (Jaguar II) 0 -s 9005028590050292 AAR-2810SA PCI SATA 8ch (Corsair-8) 0 -s 9005028590050293 AAR-21610SA PCI SATA 16ch (Corsair-16) 0 -s 9005028590050294 ESD SO-DIMM PCI-X SATA ZCR (Prowler) 0 -d 90050286 AAC-RAID (Rocket) 0 -s 900502869005028c ASR-2230S + ASR-2230SLP PCI-X (Lancer) 0 -d 90058000 ASC-29320A U320 0 -d 9005800f AIC-7901 U320 0 -d 90058010 ASC-39320 U320 0 -d 90058011 ASC-32320D U320 0 -s 900580110e1100ac ASC-39320D U320 0 -s 9005801190050041 ASC-39320D U320 0 -d 90058012 ASC-29320 U320 0 -d 90058013 ASC-29320B U320 0 -d 90058014 ASC-29320LP U320 0 -d 90058015 ASC-39320B U320 0 -d 90058016 ASC-39320A U320 0 -d 90058017 ASC-29320ALP U320 0 -d 9005801c ASC-39320D U320 0 -d 9005801d AIC-7902B U320 0 -d 9005801e AIC-7901A U320 0 -d 9005801f AIC-7902 U320 0 -d 90058080 ASC-29320A U320 w/HostRAID 0 -d 9005808f AIC-7901 U320 w/HostRAID 0 -d 90058090 ASC-39320 U320 w/HostRAID 0 -d 90058091 ASC-39320D U320 w/HostRAID 0 -d 90058092 ASC-29320 U320 w/HostRAID 0 -d 90058093 ASC-29320B U320 w/HostRAID 0 -d 90058094 ASC-29320LP U320 w/HostRAID 0 -d 90058095 ASC-39320(B) U320 w/HostRAID 0 -d 90058096 ASC-39320A U320 w/HostRAID 0 -d 90058097 ASC-29320ALP U320 w/HostRAID 0 -d 9005809c ASC-39320D(B) U320 w/HostRAID 0 -d 9005809d AIC-7902(B) U320 w/HostRAID 0 -d 9005809e AIC-7901A U320 w/HostRAID 0 -d 9005809f AIC-7902 U320 w/HostRAID 0 -v 907f Atronics 0 -d 907f2015 IDE-2015PL 0 -v 919a Gigapixel Corp 0 -v 9412 Holtek 0 -d 94126565 6565 0 -v 9699 Omni Media Technology Inc 0 -d 96996565 6565 0 -v 9710 NetMos Technology 0 -d 97107780 USB IRDA-port 0 -d 97109815 PCI 9815 Multi-I/O Controller 0 -s 9710981510000020 2P0S (2 port parallel adaptor) 0 -d 97109835 PCI 9835 Multi-I/O Controller 0 -s 9710983510000002 2S (16C550 UART) 0 -s 9710983510000012 1P2S 0 -d 97109845 PCI 9845 Multi-I/O Controller 0 -s 9710984510000004 0P4S (4 port 16550A serial card) 0 -s 9710984510000006 0P6S (6 port 16550a serial card) 0 -d 97109855 PCI 9855 Multi-I/O Controller 0 -s 9710985510000014 1P4S 0 -v 9902 Stargen Inc. 0 -d 99020001 SG2010 PCI over Starfabric Bridge 0 -d 99020002 SG2010 PCI to Starfabric Gateway 0 -d 99020003 SG1010 Starfabric Switch and PCI Bridge 0 -v a0a0 AOPEN Inc. 0 -v a0f1 UNISYS Corporation 0 -v a200 NEC Corporation 0 -v a259 Hewlett Packard 0 -v a25b Hewlett Packard GmbH PL24-MKT 0 -v a304 Sony 0 -v a727 3Com Corporation 0 -d a7270013 3CRPAG175 Wireless PC Card 0 -v aa42 Scitex Digital Video 0 -v ac1e Digital Receiver Technology Inc 0 -v ac3d Actuality Systems 0 -v aecb Adrienne Electronics Corporation 0 -v b1b3 Shiva Europe Limited 0 -v bd11 Pinnacle Systems, Inc. (Wrong ID) 0 Pinnacle should be 11bd, but they got it wrong several times --mj -v c001 TSI Telsys 0 -v c0a9 Micron/Crucial Technology 0 -v c0de Motorola 0 -v c0fe Motion Engineering, Inc. 0 -v ca50 Varian Australia Pty Ltd 0 -v cafe Chrysalis-ITS 0 -v cccc Catapult Communications 0 -v cddd Tyzx, Inc. 0 -d cddd0101 DeepSea 1 High Speed Stereo Vision Frame Grabber 0 -d cddd0200 DeepSea 2 High Speed Stereo Vision Frame Grabber 0 -v d4d4 Dy4 Systems Inc 0 -d d4d40601 PCI Mezzanine Card 0 -v d531 I+ME ACTIA GmbH 0 -v d84d Exsys 0 -v dead Indigita Corporation 0 -v e000 Winbond 0 -d e000e000 W89C940 0 -v e159 Tiger Jet Network Inc. 0 see also : http://www.schoenfeld.de/inside/Inside_CWMK3.txt maybe a misuse of TJN id or it use the TJN 3XX chip for other applic -d e1590001 Tiger3XX Modem/ISDN interface 0 -s e159000100590001 128k ISDN-S/T Adapter 0 -s e159000100590003 128k ISDN-U Adapter 0 -d e1590002 Tiger100APC ISDN chipset 0 -v e4bf EKF Elektronik GmbH 0 -v e55e Essence Technology, Inc. 0 Innovative and scalable network IC vendor -v ea01 Eagle Technology 0 -v ea60 RME 0 The main chip of all these devices is by Xilinx -> It could also be a Xilinx ID. -d ea609896 Digi32 0 -d ea609897 Digi32 Pro 0 -d ea609898 Digi32/8 0 -v eabb Aashima Technology B.V. 0 -v eace Endace Measurement Systems, Ltd 0 -d eace3100 DAG 3.10 OC-3/OC-12 0 -d eace3200 DAG 3.2x OC-3/OC-12 0 -d eace320e DAG 3.2E Fast Ethernet 0 -d eace340e DAG 3.4E Fast Ethernet 0 -d eace341e DAG 3.41E Fast Ethernet 0 -d eace3500 DAG 3.5 OC-3/OC-12 0 -d eace351c DAG 3.5ECM Fast Ethernet 0 -d eace4100 DAG 4.10 OC-48 0 -d eace4110 DAG 4.11 OC-48 0 -d eace4220 DAG 4.2 OC-48 0 -d eace422e DAG 4.2E Dual Gigabit Ethernet 0 -v ec80 Belkin Corporation 0 -d ec80ec00 F5D6000 0 -v ecc0 Echo Digital Audio Corporation 0 -d ecc00050 Gina24_301 0 -d ecc00051 Gina24_361 0 -d ecc00060 Layla24 0 -d ecc00070 Mona_301_80 0 -d ecc00071 Mona_301_66 0 -d ecc00072 Mona_361 0 -d ecc00080 Mia 0 -v edd8 ARK Logic Inc 0 -d edd8a091 1000PV [Stingray] 0 -d edd8a099 2000PV [Stingray] 0 -d edd8a0a1 2000MT 0 -d edd8a0a9 2000MI 0 -v f1d0 AJA Video 0 -d f1d0cafe KONA SD SMPTE 259M I/O 0 All boards I have seen have this ID not efac, though all docs say efac... -d f1d0efac KONA SD SMPTE 259M I/O 0 -d f1d0facd KONA HD SMPTE 292M I/O 0 -v fa57 Interagon AS 0 -d fa570001 PMC [Pattern Matching Chip] 0 -v febd Ultraview Corp. 0 -v feda Broadcom Inc (nee Epigram) 0 -d fedaa0fa BCM4210 iLine10 HomePNA 2.0 0 -d fedaa10e BCM4230 iLine10 HomePNA 2.0 0 -v fede Fedetec Inc. 0 IT & Telecom company, develops PCI Trunk cards <www.fedetec.es> -d fede0003 TABIC PCI v3 0 -v fffe VMWare Inc 0 -d fffe0405 Virtual SVGA 4.0 0 -d fffe0710 Virtual SVGA 0 -v ffff Illegal Vendor ID 0 diff --git a/src/video_out/libdha/pci.c b/src/video_out/libdha/pci.c deleted file mode 100644 index db8f4ddd5..000000000 --- a/src/video_out/libdha/pci.c +++ /dev/null @@ -1,834 +0,0 @@ -/* - (C) 2002 - library implementation by Nick Kyrshev - XFree86 3.3.3 scanpci.c, modified for GATOS/win/gfxdump by Øyvind Aabling. - */ -/* $XConsortium: scanpci.c /main/25 1996/10/27 11:48:40 kaleb $ */ -/* - * name: scanpci.c - * - * purpose: This program will scan for and print details of - * devices on the PCI bus. - - * author: Robin Cutshaw (robin@xfree86.org) - * - * supported O/S's: SVR4, UnixWare, SCO, Solaris, - * FreeBSD, NetBSD, 386BSD, BSDI BSD/386, - * Linux, Mach/386, ISC - * DOS (WATCOM 9.5 compiler) - * - * compiling: [g]cc scanpci.c -o scanpci - * for SVR4 (not Solaris), UnixWare use: - * [g]cc -DSVR4 scanpci.c -o scanpci - * for DOS, watcom 9.5: - * wcc386p -zq -omaxet -7 -4s -s -w3 -d2 name.c - * and link with PharLap or other dos extender for exe - * - */ - -/* $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ */ - -/* - * Copyright 1995 by Robin Cutshaw <robin@XFree86.Org> - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the names of the above listed copyright holder(s) - * not be used in advertising or publicity pertaining to distribution of - * the software without specific, written prior permission. The above listed - * copyright holder(s) make(s) no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - * THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD - * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE - * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY - * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - */ - -#include "libdha.h" -#include <errno.h> -#include <string.h> -#include <stdio.h> -#include <unistd.h> -#include <fcntl.h> -#include <sys/ioctl.h> -#include "kernelhelper/dhahelper.h" - -#ifdef __unix__ -#include <unistd.h> -#endif - -#if 0 -#if defined(__SUNPRO_C) || defined(sun) || defined(__sun) -#include <sys/psw.h> -#else -#include <sys/seg.h> -#endif -#include <sys/v86.h> -#endif - -#if defined(Lynx) && defined(__powerpc__) -/* let's mimick the Linux Alpha stuff for LynxOS so we don't have - * to change too much code - */ -#include <smem.h> - -static unsigned char *pciConfBase; - -static __inline__ unsigned long -static swapl(unsigned long val) -{ - unsigned char *p = (unsigned char *)&val; - return ((p[3] << 24) | (p[2] << 16) | (p[1] << 8) | (p[0] << 0)); -} - - -#define BUS(tag) (((tag)>>16)&0xff) -#define DFN(tag) (((tag)>>8)&0xff) - -#define PCIBIOS_DEVICE_NOT_FOUND 0x86 -#define PCIBIOS_SUCCESSFUL 0x00 - -int pciconfig_read( - unsigned char bus, - unsigned char dev, - unsigned char offset, - int len, /* unused, alway 4 */ - unsigned long *val) -{ - unsigned long _val; - unsigned long *ptr; - - dev >>= 3; - if (bus || dev >= 16) { - *val = 0xFFFFFFFF; - return PCIBIOS_DEVICE_NOT_FOUND; - } else { - ptr = (unsigned long *)(pciConfBase + ((1<<dev) | offset)); - _val = swapl(*ptr); - } - *val = _val; - return PCIBIOS_SUCCESSFUL; -} - -int pciconfig_write( - unsigned char bus, - unsigned char dev, - unsigned char offset, - int len, /* unused, alway 4 */ - unsigned long val) -{ - unsigned long _val; - unsigned long *ptr; - - dev >>= 3; - _val = swapl(val); - if (bus || dev >= 16) { - return PCIBIOS_DEVICE_NOT_FOUND; - } else { - ptr = (unsigned long *)(pciConfBase + ((1<<dev) | offset)); - *ptr = _val; - } - return PCIBIOS_SUCCESSFUL; -} -#endif - -#if !defined(__powerpc__) -struct pci_config_reg { - /* start of official PCI config space header */ - union { - unsigned long device_vendor; - struct { - unsigned short vendor; - unsigned short device; - } dv; - } dv_id; -#define _device_vendor dv_id.device_vendor -#define _vendor dv_id.dv.vendor -#define _device dv_id.dv.device - union { - unsigned long status_command; - struct { - unsigned short command; - unsigned short status; - } sc; - } stat_cmd; -#define _status_command stat_cmd.status_command -#define _command stat_cmd.sc.command -#define _status stat_cmd.sc.status - union { - unsigned long class_revision; - struct { - unsigned char rev_id; - unsigned char prog_if; - unsigned char sub_class; - unsigned char base_class; - } cr; - } class_rev; -#define _class_revision class_rev.class_revision -#define _rev_id class_rev.cr.rev_id -#define _prog_if class_rev.cr.prog_if -#define _sub_class class_rev.cr.sub_class -#define _base_class class_rev.cr.base_class - union { - unsigned long bist_header_latency_cache; - struct { - unsigned char cache_line_size; - unsigned char latency_timer; - unsigned char header_type; - unsigned char bist; - } bhlc; - } bhlc; -#define _bist_header_latency_cache bhlc.bist_header_latency_cache -#define _cache_line_size bhlc.bhlc.cache_line_size -#define _latency_timer bhlc.bhlc.latency_timer -#define _header_type bhlc.bhlc.header_type -#define _bist bhlc.bhlc.bist - union { - struct { - unsigned long dv_base0; - unsigned long dv_base1; - unsigned long dv_base2; - unsigned long dv_base3; - unsigned long dv_base4; - unsigned long dv_base5; - } dv; - struct { - unsigned long bg_rsrvd[2]; - unsigned char primary_bus_number; - unsigned char secondary_bus_number; - unsigned char subordinate_bus_number; - unsigned char secondary_latency_timer; - unsigned char io_base; - unsigned char io_limit; - unsigned short secondary_status; - unsigned short mem_base; - unsigned short mem_limit; - unsigned short prefetch_mem_base; - unsigned short prefetch_mem_limit; - } bg; - } bc; -#define _base0 bc.dv.dv_base0 -#define _base1 bc.dv.dv_base1 -#define _base2 bc.dv.dv_base2 -#define _base3 bc.dv.dv_base3 -#define _base4 bc.dv.dv_base4 -#define _base5 bc.dv.dv_base5 -#define _primary_bus_number bc.bg.primary_bus_number -#define _secondary_bus_number bc.bg.secondary_bus_number -#define _subordinate_bus_number bc.bg.subordinate_bus_number -#define _secondary_latency_timer bc.bg.secondary_latency_timer -#define _io_base bc.bg.io_base -#define _io_limit bc.bg.io_limit -#define _secondary_status bc.bg.secondary_status -#define _mem_base bc.bg.mem_base -#define _mem_limit bc.bg.mem_limit -#define _prefetch_mem_base bc.bg.prefetch_mem_base -#define _prefetch_mem_limit bc.bg.prefetch_mem_limit - unsigned long rsvd1; - unsigned long rsvd2; - unsigned long _baserom; - unsigned long rsvd3; - unsigned long rsvd4; - union { - unsigned long max_min_ipin_iline; - struct { - unsigned char int_line; - unsigned char int_pin; - unsigned char min_gnt; - unsigned char max_lat; - } mmii; - } mmii; -#define _max_min_ipin_iline mmii.max_min_ipin_iline -#define _int_line mmii.mmii.int_line -#define _int_pin mmii.mmii.int_pin -#define _min_gnt mmii.mmii.min_gnt -#define _max_lat mmii.mmii.max_lat - /* I don't know how accurate or standard this is (DHD) */ - union { - unsigned long user_config; - struct { - unsigned char user_config_0; - unsigned char user_config_1; - unsigned char user_config_2; - unsigned char user_config_3; - } uc; - } uc; -#define _user_config uc.user_config -#define _user_config_0 uc.uc.user_config_0 -#define _user_config_1 uc.uc.user_config_1 -#define _user_config_2 uc.uc.user_config_2 -#define _user_config_3 uc.uc.user_config_3 - /* end of official PCI config space header */ - unsigned long _pcibusidx; - unsigned long _pcinumbus; - unsigned long _pcibuses[16]; - unsigned short _configtype; /* config type found */ - unsigned short _ioaddr; /* config type 1 - private I/O addr */ - unsigned long _cardnum; /* config type 2 - private card number */ -}; -#else -/* ppc is big endian, swapping bytes is not quite enough - * to interpret the PCI config registers... - */ -struct pci_config_reg { - /* start of official PCI config space header */ - union { - unsigned long device_vendor; - struct { - unsigned short device; - unsigned short vendor; - } dv; - } dv_id; -#define _device_vendor dv_id.device_vendor -#define _vendor dv_id.dv.vendor -#define _device dv_id.dv.device - union { - unsigned long status_command; - struct { - unsigned short status; - unsigned short command; - } sc; - } stat_cmd; -#define _status_command stat_cmd.status_command -#define _command stat_cmd.sc.command -#define _status stat_cmd.sc.status - union { - unsigned long class_revision; - struct { - unsigned char base_class; - unsigned char sub_class; - unsigned char prog_if; - unsigned char rev_id; - } cr; - } class_rev; -#define _class_revision class_rev.class_revision -#define _rev_id class_rev.cr.rev_id -#define _prog_if class_rev.cr.prog_if -#define _sub_class class_rev.cr.sub_class -#define _base_class class_rev.cr.base_class - union { - unsigned long bist_header_latency_cache; - struct { - unsigned char bist; - unsigned char header_type; - unsigned char latency_timer; - unsigned char cache_line_size; - } bhlc; - } bhlc; -#define _bist_header_latency_cache bhlc.bist_header_latency_cache -#define _cache_line_size bhlc.bhlc.cache_line_size -#define _latency_timer bhlc.bhlc.latency_timer -#define _header_type bhlc.bhlc.header_type -#define _bist bhlc.bhlc.bist - union { - struct { - unsigned long dv_base0; - unsigned long dv_base1; - unsigned long dv_base2; - unsigned long dv_base3; - unsigned long dv_base4; - unsigned long dv_base5; - } dv; -/* ?? */ - struct { - unsigned long bg_rsrvd[2]; - - unsigned char secondary_latency_timer; - unsigned char subordinate_bus_number; - unsigned char secondary_bus_number; - unsigned char primary_bus_number; - - unsigned short secondary_status; - unsigned char io_limit; - unsigned char io_base; - - unsigned short mem_limit; - unsigned short mem_base; - - unsigned short prefetch_mem_limit; - unsigned short prefetch_mem_base; - } bg; - } bc; -#define _base0 bc.dv.dv_base0 -#define _base1 bc.dv.dv_base1 -#define _base2 bc.dv.dv_base2 -#define _base3 bc.dv.dv_base3 -#define _base4 bc.dv.dv_base4 -#define _base5 bc.dv.dv_base5 -#define _primary_bus_number bc.bg.primary_bus_number -#define _secondary_bus_number bc.bg.secondary_bus_number -#define _subordinate_bus_number bc.bg.subordinate_bus_number -#define _secondary_latency_timer bc.bg.secondary_latency_timer -#define _io_base bc.bg.io_base -#define _io_limit bc.bg.io_limit -#define _secondary_status bc.bg.secondary_status -#define _mem_base bc.bg.mem_base -#define _mem_limit bc.bg.mem_limit -#define _prefetch_mem_base bc.bg.prefetch_mem_base -#define _prefetch_mem_limit bc.bg.prefetch_mem_limit - unsigned long rsvd1; - unsigned long rsvd2; - unsigned long _baserom; - unsigned long rsvd3; - unsigned long rsvd4; - union { - unsigned long max_min_ipin_iline; - struct { - unsigned char max_lat; - unsigned char min_gnt; - unsigned char int_pin; - unsigned char int_line; - } mmii; - } mmii; -#define _max_min_ipin_iline mmii.max_min_ipin_iline -#define _int_line mmii.mmii.int_line -#define _int_pin mmii.mmii.int_pin -#define _min_gnt mmii.mmii.min_gnt -#define _max_lat mmii.mmii.max_lat - /* I don't know how accurate or standard this is (DHD) */ - union { - unsigned long user_config; - struct { - unsigned char user_config_3; - unsigned char user_config_2; - unsigned char user_config_1; - unsigned char user_config_0; - } uc; - } uc; -#define _user_config uc.user_config -#define _user_config_0 uc.uc.user_config_0 -#define _user_config_1 uc.uc.user_config_1 -#define _user_config_2 uc.uc.user_config_2 -#define _user_config_3 uc.uc.user_config_3 - /* end of official PCI config space header */ - unsigned long _pcibusidx; - unsigned long _pcinumbus; - unsigned long _pcibuses[16]; - unsigned short _ioaddr; /* config type 1 - private I/O addr */ - unsigned short _configtype; /* config type found */ - unsigned long _cardnum; /* config type 2 - private card number */ -}; -#endif - -#define MAX_DEV_PER_VENDOR_CFG1 64 -#define MAX_PCI_DEVICES_PER_BUS 32 -#define MAX_PCI_DEVICES 64 -#define NF ((void (*)())NULL), { 0.0, 0, 0, NULL } -#define PCI_MULTIFUNC_DEV 0x80 -#define PCI_ID_REG 0x00 -#define PCI_CMD_STAT_REG 0x04 -#define PCI_CLASS_REG 0x08 -#define PCI_HEADER_MISC 0x0C -#define PCI_MAP_REG_START 0x10 -#define PCI_MAP_ROM_REG 0x30 -#define PCI_INTERRUPT_REG 0x3C -#define PCI_INTERRUPT_PIN 0x3D /* 8 bits */ -#define PCI_MIN_GNT 0x3E /* 8 bits */ -#define PCI_MAX_LAT 0x3F /* 8 bits */ -#define PCI_REG_USERCONFIG 0x40 - -static int pcibus=-1, pcicard=-1, pcifunc=-1 ; -/*static struct pci_device *pcidev=NULL ;*/ - -#if defined(__alpha__) -#define PCI_EN 0x00000000 -#else -#define PCI_EN 0x80000000 -#endif - -#define PCI_MODE1_ADDRESS_REG 0xCF8 -#define PCI_MODE1_DATA_REG 0xCFC - -#define PCI_MODE2_ENABLE_REG 0xCF8 -#ifdef PC98 -#define PCI_MODE2_FORWARD_REG 0xCF9 -#else -#define PCI_MODE2_FORWARD_REG 0xCFA -#endif - -/* cpu depended stuff */ -#if defined(__alpha__) -#include "sysdep/pci_alpha.c" -#elif defined(__ia64__) -#include "sysdep/pci_ia64.c" -#elif defined(__sparc__) -#include "sysdep/pci_sparc.c" -#elif defined( __arm32__ ) -#include "sysdep/pci_arm32.c" -#elif defined(__powerpc__) -#include "sysdep/pci_powerpc.c" -#elif defined( __i386__ ) -#include "sysdep/pci_x86.c" -#else -#include "sysdep/pci_generic_cpu.c" -#endif - -static int pcicards=0 ; -static pciinfo_t *pci_lst; - -static void identify_card(struct pci_config_reg *pcr) -{ - - if (pcicards>=MAX_PCI_DEVICES) return ; - - pci_lst[pcicards].bus = pcibus ; - pci_lst[pcicards].card = pcicard ; - pci_lst[pcicards].func = pcifunc ; - pci_lst[pcicards].vendor = pcr->_vendor ; - pci_lst[pcicards].device = pcr->_device ; - pci_lst[pcicards].base0 = 0xFFFFFFFF ; - pci_lst[pcicards].base1 = 0xFFFFFFFF ; - pci_lst[pcicards].base2 = 0xFFFFFFFF ; - pci_lst[pcicards].base3 = 0xFFFFFFFF ; - pci_lst[pcicards].base4 = 0xFFFFFFFF ; - pci_lst[pcicards].base5 = 0xFFFFFFFF ; - pci_lst[pcicards].baserom = 0x000C0000 ; - if (pcr->_base0) pci_lst[pcicards].base0 = pcr->_base0 & - ((pcr->_base0&0x1) ? 0xFFFFFFFC : 0xFFFFFFF0) ; - if (pcr->_base1) pci_lst[pcicards].base1 = pcr->_base1 & - ((pcr->_base1&0x1) ? 0xFFFFFFFC : 0xFFFFFFF0) ; - if (pcr->_base2) pci_lst[pcicards].base2 = pcr->_base2 & - ((pcr->_base2&0x1) ? 0xFFFFFFFC : 0xFFFFFFF0) ; - if (pcr->_base3) pci_lst[pcicards].base3 = pcr->_base3 & - ((pcr->_base0&0x1) ? 0xFFFFFFFC : 0xFFFFFFF0) ; - if (pcr->_base4) pci_lst[pcicards].base4 = pcr->_base4 & - ((pcr->_base1&0x1) ? 0xFFFFFFFC : 0xFFFFFFF0) ; - if (pcr->_base5) pci_lst[pcicards].base5 = pcr->_base5 & - ((pcr->_base2&0x1) ? 0xFFFFFFFC : 0xFFFFFFF0) ; - if (pcr->_baserom) pci_lst[pcicards].baserom = pcr->_baserom ; - pci_lst[pcicards].irq = pcr->_int_line; - pci_lst[pcicards].ipin= pcr->_int_pin; - pci_lst[pcicards].gnt = pcr->_min_gnt; - pci_lst[pcicards].lat = pcr->_max_lat; - - pcicards++; -} - -/*main(int argc, char *argv[])*/ -static int __pci_scan(pciinfo_t *pci_list,unsigned *num_pci) -{ - unsigned int idx; - struct pci_config_reg pcr; - int do_mode1_scan = 0, do_mode2_scan = 0; - int func, hostbridges=0; - int ret = -1; - - pci_lst = pci_list; - pcicards = 0; - - ret = enable_app_io(); - if (ret != 0) - return(ret); - - if((pcr._configtype = pci_config_type()) == 0xFFFF) return ENODEV; - - /* Try pci config 1 probe first */ - - if ((pcr._configtype == 1) || do_mode1_scan) { - /*printf("\nPCI probing configuration type 1\n");*/ - - pcr._ioaddr = 0xFFFF; - - pcr._pcibuses[0] = 0; - pcr._pcinumbus = 1; - pcr._pcibusidx = 0; - idx = 0; - - do { - /*printf("Probing for devices on PCI bus %d:\n\n", pcr._pcibusidx);*/ - - for (pcr._cardnum = 0x0; pcr._cardnum < MAX_PCI_DEVICES_PER_BUS; - pcr._cardnum += 0x1) { - func = 0; - do { /* loop over the different functions, if present */ - pcr._device_vendor = pci_get_vendor(pcr._pcibuses[pcr._pcibusidx], pcr._cardnum, - func); - if ((pcr._vendor == 0xFFFF) || (pcr._device == 0xFFFF)) - break; /* nothing there */ - - /*printf("\npci bus 0x%x cardnum 0x%02x function 0x%04x: vendor 0x%04x device 0x%04x\n", - pcr._pcibuses[pcr._pcibusidx], pcr._cardnum, func, - pcr._vendor, pcr._device);*/ - pcibus = pcr._pcibuses[pcr._pcibusidx]; - pcicard = pcr._cardnum; - pcifunc = func; - - pcr._status_command = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx], - pcr._cardnum,func,PCI_CMD_STAT_REG); - pcr._class_revision = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx], - pcr._cardnum,func,PCI_CLASS_REG); - pcr._bist_header_latency_cache = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx], - pcr._cardnum,func,PCI_HEADER_MISC); - pcr._base0 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx], - pcr._cardnum,func,PCI_MAP_REG_START); - pcr._base1 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx], - pcr._cardnum,func,PCI_MAP_REG_START+4); - pcr._base2 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx], - pcr._cardnum,func,PCI_MAP_REG_START+8); - pcr._base3 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx], - pcr._cardnum,func,PCI_MAP_REG_START+0x0C); - pcr._base4 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx], - pcr._cardnum,func,PCI_MAP_REG_START+0x10); - pcr._base5 = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx], - pcr._cardnum,func,PCI_MAP_REG_START+0x14); - pcr._baserom = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx], - pcr._cardnum,func,PCI_MAP_ROM_REG); -#if 0 - pcr._int_pin = pci_config_read_byte(pcr._pcibuses[pcr._pcibusidx], - pcr._cardnum,func,PCI_INTERRUPT_PIN); - pcr._int_line = pci_config_read_byte(pcr._pcibuses[pcr._pcibusidx], - pcr._cardnum,func,PCI_INTERRUPT_REG); - pcr._min_gnt = pci_config_read_byte(pcr._pcibuses[pcr._pcibusidx], - pcr._cardnum,func,PCI_MIN_GNT); - pcr._max_lat = pci_config_read_byte(pcr._pcibuses[pcr._pcibusidx], - pcr._cardnum,func,PCI_MAX_LAT); -#else - pcr._max_min_ipin_iline = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx], - pcr._cardnum,func,PCI_INTERRUPT_REG); -#endif - pcr._user_config = pci_config_read_long(pcr._pcibuses[pcr._pcibusidx], - pcr._cardnum,func,PCI_REG_USERCONFIG); - /* check for pci-pci bridges */ -#define PCI_CLASS_MASK 0xff000000 -#define PCI_SUBCLASS_MASK 0x00ff0000 -#define PCI_CLASS_BRIDGE 0x06000000 -#define PCI_SUBCLASS_BRIDGE_PCI 0x00040000 - switch(pcr._class_revision & (PCI_CLASS_MASK|PCI_SUBCLASS_MASK)) { - case PCI_CLASS_BRIDGE|PCI_SUBCLASS_BRIDGE_PCI: - if (pcr._secondary_bus_number > 0) { - pcr._pcibuses[pcr._pcinumbus++] = pcr._secondary_bus_number; - } - break; - case PCI_CLASS_BRIDGE: - if ( ++hostbridges > 1) { - pcr._pcibuses[pcr._pcinumbus] = pcr._pcinumbus; - pcr._pcinumbus++; - } - break; - default: - break; - } - if((func==0) && ((pcr._header_type & PCI_MULTIFUNC_DEV) == 0)) { - /* not a multi function device */ - func = 8; - } else { - func++; - } - - if (idx++ >= MAX_PCI_DEVICES) - continue; - - identify_card(&pcr); - } while( func < 8 ); - } - } while (++pcr._pcibusidx < pcr._pcinumbus); - } - -#if !defined(__alpha__) && !defined(__powerpc__) - /* Now try pci config 2 probe (deprecated) */ - - if ((pcr._configtype == 2) || do_mode2_scan) { - OUTPORT8(PCI_MODE2_ENABLE_REG, 0xF1); - OUTPORT8(PCI_MODE2_FORWARD_REG, 0x00); /* bus 0 for now */ - - /*printf("\nPCI probing configuration type 2\n");*/ - - pcr._pcibuses[0] = 0; - pcr._pcinumbus = 1; - pcr._pcibusidx = 0; - idx = 0; - - do { - for (pcr._ioaddr = 0xC000; pcr._ioaddr < 0xD000; pcr._ioaddr += 0x0100){ - OUTPORT8(PCI_MODE2_FORWARD_REG, pcr._pcibuses[pcr._pcibusidx]); /* bus 0 for now */ - pcr._device_vendor = INPORT32(pcr._ioaddr); - OUTPORT8(PCI_MODE2_FORWARD_REG, 0x00); /* bus 0 for now */ - - if ((pcr._vendor == 0xFFFF) || (pcr._device == 0xFFFF)) - continue; - if ((pcr._vendor == 0xF0F0) || (pcr._device == 0xF0F0)) - continue; /* catch ASUS P55TP4XE motherboards */ - - /*printf("\npci bus 0x%x slot at 0x%04x, vendor 0x%04x device 0x%04x\n", - pcr._pcibuses[pcr._pcibusidx], pcr._ioaddr, pcr._vendor, - pcr._device);*/ - pcibus = pcr._pcibuses[pcr._pcibusidx] ; - pcicard = pcr._ioaddr ; pcifunc = 0 ; - - OUTPORT8(PCI_MODE2_FORWARD_REG, pcr._pcibuses[pcr._pcibusidx]); /* bus 0 for now */ - pcr._status_command = INPORT32(pcr._ioaddr + 0x04); - pcr._class_revision = INPORT32(pcr._ioaddr + 0x08); - pcr._bist_header_latency_cache = INPORT32(pcr._ioaddr + 0x0C); - pcr._base0 = INPORT32(pcr._ioaddr + 0x10); - pcr._base1 = INPORT32(pcr._ioaddr + 0x14); - pcr._base2 = INPORT32(pcr._ioaddr + 0x18); - pcr._base3 = INPORT32(pcr._ioaddr + 0x1C); - pcr._base4 = INPORT32(pcr._ioaddr + 0x20); - pcr._base5 = INPORT32(pcr._ioaddr + 0x24); - pcr._baserom = INPORT32(pcr._ioaddr + 0x30); - pcr._max_min_ipin_iline = INPORT8(pcr._ioaddr + 0x3C); - pcr._user_config = INPORT32(pcr._ioaddr + 0x40); - OUTPORT8(PCI_MODE2_FORWARD_REG, 0x00); /* bus 0 for now */ - - /* check for pci-pci bridges (currently we only know Digital) */ - if ((pcr._vendor == 0x1011) && (pcr._device == 0x0001)) - if (pcr._secondary_bus_number > 0) - pcr._pcibuses[pcr._pcinumbus++] = pcr._secondary_bus_number; - - if (idx++ >= MAX_PCI_DEVICES) - continue; - - identify_card(&pcr); - } - } while (++pcr._pcibusidx < pcr._pcinumbus); - - OUTPORT8(PCI_MODE2_ENABLE_REG, 0x00); - } - -#endif /* __alpha__ */ - - disable_app_io(); - *num_pci = pcicards; - - return 0 ; - -} - -#if !defined(ENOTSUP) -#if defined(EOPNOTSUPP) -#define ENOTSUP EOPNOTSUPP -#else -#warning "ENOTSUP nor EOPNOTSUPP defined!" -#endif -#endif - -int pci_scan(pciinfo_t *pci_list,unsigned *num_pci) -{ - int libdha_fd; - if ( (libdha_fd = open("/dev/dhahelper",O_RDWR)) < 0) - { - return __pci_scan(pci_list,num_pci); - } - else - { - dhahelper_pci_device_t pci_dev; - unsigned idx; - idx = 0; - while(ioctl(libdha_fd, DHAHELPER_PCI_FIND, &pci_dev)==0) - { - pci_list[idx].bus = pci_dev.bus; - pci_list[idx].card = pci_dev.card; - pci_list[idx].func = pci_dev.func; - pci_list[idx].vendor = pci_dev.vendor; - pci_list[idx].device = pci_dev.device; - pci_list[idx].base0 = pci_dev.base0?pci_dev.base0:0xFFFFFFFF; - pci_list[idx].base1 = pci_dev.base1?pci_dev.base1:0xFFFFFFFF; - pci_list[idx].base2 = pci_dev.base2?pci_dev.base2:0xFFFFFFFF; - pci_list[idx].baserom = pci_dev.baserom?pci_dev.baserom:0x000C0000; - pci_list[idx].base3 = pci_dev.base3?pci_dev.base3:0xFFFFFFFF; - pci_list[idx].base4 = pci_dev.base4?pci_dev.base4:0xFFFFFFFF; - pci_list[idx].base5 = pci_dev.base5?pci_dev.base5:0xFFFFFFFF; - pci_list[idx].irq = pci_dev.irq; - pci_list[idx].ipin = pci_dev.ipin; - pci_list[idx].gnt = pci_dev.gnt; - pci_list[idx].lat = pci_dev.lat; - idx++; - } - *num_pci=idx; - close(libdha_fd); - } - return 0; -} - -int pci_config_read(unsigned char bus, unsigned char dev, unsigned char func, - unsigned char cmd, int len, unsigned long *val) -{ - int ret; - int dhahelper_fd; - if ( (dhahelper_fd = open("/dev/dhahelper",O_RDWR)) > 0) - { - int retval; - dhahelper_pci_config_t pcic; - pcic.operation = PCI_OP_READ; - pcic.bus = bus; - pcic.dev = dev; - pcic.func = func; - pcic.cmd = cmd; - pcic.size = len; - retval = ioctl(dhahelper_fd, DHAHELPER_PCI_CONFIG, &pcic); - close(dhahelper_fd); - *val = pcic.ret; - return retval; - } - ret = enable_app_io(); - if (ret != 0) - return(ret); - switch(len) - { - case 4: - ret = pci_config_read_long(bus, dev, func, cmd); - break; - case 2: - ret = pci_config_read_word(bus, dev, func, cmd); - break; - case 1: - ret = pci_config_read_byte(bus, dev, func, cmd); - break; - default: - printf("libdha_pci: wrong length to read: %u\n",len); - } - disable_app_io(); - - *val = ret; - return(0); -} - -int pci_config_write(unsigned char bus, unsigned char dev, unsigned char func, - unsigned char cmd, int len, unsigned long val) -{ - int ret; - - int dhahelper_fd; - if ( (dhahelper_fd = open("/dev/dhahelper",O_RDWR)) > 0) - { - int retval; - dhahelper_pci_config_t pcic; - pcic.operation = PCI_OP_WRITE; - pcic.bus = bus; - pcic.dev = dev; - pcic.func = func; - pcic.cmd = cmd; - pcic.size = len; - pcic.ret = val; - retval = ioctl(dhahelper_fd, DHAHELPER_PCI_CONFIG, &pcic); - close(dhahelper_fd); - return retval; - } - ret = enable_app_io(); - if (ret != 0) - return ret; - switch(len) - { - case 4: - pci_config_write_long(bus, dev, func, cmd, val); - break; - case 2: - pci_config_write_word(bus, dev, func, cmd, val); - break; - case 1: - pci_config_write_byte(bus, dev, func, cmd, val); - break; - default: - printf("libdha_pci: wrong length to read: %u\n",len); - } - disable_app_io(); - - return 0; -} diff --git a/src/video_out/libdha/pci_db2c.awk b/src/video_out/libdha/pci_db2c.awk deleted file mode 100644 index feaa1c7a1..000000000 --- a/src/video_out/libdha/pci_db2c.awk +++ /dev/null @@ -1,267 +0,0 @@ -# This file converts given pci.db to "C" source and header files -# For latest version of pci ids see: http://pciids.sf.net -# Copyright 2002 Nick Kurshev -# -# Usage: awk -f pci_db2c.awk pci.db -# -# Tested with Gawk v 3.0.x and Mawk 1.3.3 -# But it should work with standard Awk implementations (hopefully). -# (Nobody tested it with Nawk, but it should work, too). -# - -BEGIN { - - if(ARGC != 2) { -# check for arguments: - print "Usage awk -f pci_db2c.awk pci.db (and make sure pci.db file exists first)"; - exit(1); - } - in_file = ARGV[1]; - vendor_file = "pci_vendors.h"; - ids_file = "pci_ids.h" - name_file = "pci_names.c" - name_h_file = "pci_names.h" - dev_ids_file = "pci_dev_ids.c" - line=0; -# print out head lines - print_head(vendor_file); - print_head(ids_file); - print_head(name_file); - print_head(name_h_file); - print_head(dev_ids_file); - print "#ifndef PCI_VENDORS_INCLUDED" >vendor_file - print "#define PCI_VENDORS_INCLUDED 1">vendor_file - print "" >vendor_file - print "#ifndef PCI_IDS_INCLUDED" >ids_file - print "#define PCI_IDS_INCLUDED 1">ids_file - print "" >ids_file - print "#include \"pci_vendors.h\"">ids_file - print "" >ids_file - - print "#ifndef PCI_NAMES_INCLUDED" >name_h_file - print "#define PCI_NAMES_INCLUDED 1">name_h_file - print "" >name_h_file - print_name_struct(name_h_file); - print "#include <stddef.h>">name_file - print "#include \"pci_names.h\"">name_file - print "#include \"pci_dev_ids.c\"">name_file - print "">name_file - print "static struct vendor_id_s vendor_ids[] = {">name_file - first_pass=1; - init_name_db(); - while(getline <in_file) - { -# count up lines - line++; - n=split($0, field, "[\t]"); - name_field = kill_double_quoting(field[3]) - if(field[1] == "v" && length(field[3])>0 && field[4] == "0") - { - init_device_db() - svend_name = get_short_vendor_name(field[3]) - printf("#define VENDOR_%s\t", svend_name) >vendor_file; - if(length(svend_name) < 9) printf("\t") >vendor_file; - printf("0x%s /*%s*/\n",field[2], name_field) >vendor_file; - printf("{ 0x%s, \"%s\", dev_lst_%s },\n",field[2], name_field, field[2]) >name_file; - printf("/* Vendor: %s: %s */\n", field[2], name_field) > ids_file - if(first_pass == 1) { first_pass=0; } - else { print "{ 0xFFFF, NULL }\n};" >dev_ids_file; } - printf("static const struct device_id_s dev_lst_%s[]={\n", field[2])>dev_ids_file - } - if(field[1] == "d" && length(field[3])>0 && field[4] == "0") - { - sdev_name = get_short_device_name(field[3]) - full_name = sprintf("#define DEVICE_%s_%s", svend_name, sdev_name); - printf("%s\t", full_name) >ids_file - if(length(full_name) < 9) printf("\t") >ids_file; - if(length(full_name) < 17) printf("\t") >ids_file; - if(length(full_name) < 25) printf("\t") >ids_file; - if(length(full_name) < 32) printf("\t") >ids_file; - if(length(full_name) < 40) printf("\t") >ids_file; - if(length(full_name) < 48) printf("\t") >ids_file; - printf("0x%s /*%s*/\n", substr(field[2], 5), name_field) >ids_file - printf("{ 0x%s, \"%s\" },\n", substr(field[2], 5), name_field) >dev_ids_file - } - if(field[1] == "s" && length(field[3])>0 && field[4] == "0") - { - subdev_name = get_short_subdevice_name(field[3]) - full_name = sprintf("#define SUBDEVICE_%s_%s", svend_name, subdev_name) - printf("\t%s\t", full_name) >ids_file - if(length(full_name) < 9) printf("\t") >ids_file; - if(length(full_name) < 17) printf("\t") >ids_file; - if(length(full_name) < 25) printf("\t") >ids_file; - if(length(full_name) < 32) printf("\t") >ids_file; - if(length(full_name) < 40) printf("\t") >ids_file; - printf("0x%s /*%s*/\n", substr(field[2], 9), name_field) >ids_file - } - } - print "Total lines parsed:", line; - print "">vendor_file - print "#endif/*PCI_VENDORS_INCLUDED*/">vendor_file - print "">ids_file - print "#endif/*PCI_IDS_INCLUDED*/">ids_file - print "">name_h_file - print "#endif/*PCI_NAMES_INCLUDED*/">name_h_file - print "};">name_file - print "{ 0xFFFF, NULL }" >dev_ids_file; - print "};">dev_ids_file - print_func_bodies(name_file); -} - -function print_head( out_file) -{ - print "/*" >out_file; - printf(" * File: %s\n", out_file) >out_file; - printf(" * This file was generated automatically. Don't modify it.\n") >out_file; - print "*/" >out_file; - return; -} - -function print_name_struct(out_file) -{ - print "#ifdef __cplusplus" >out_file - print "extern \"C\" {" >out_file - print "#endif" >out_file - print "">out_file - print "struct device_id_s" >out_file - print "{" >out_file - print "\tunsigned short\tid;" >out_file - print "\tconst char *\tname;" >out_file - print "};" >out_file - print "">out_file - print "struct vendor_id_s" >out_file - print "{" >out_file - print "\tunsigned short\tid;" >out_file - print "\tconst char *\tname;" >out_file - print "\tconst struct device_id_s *\tdev_list;" >out_file - print "};" >out_file - print "extern const char *pci_vendor_name(unsigned short id);">out_file - print "extern const char *pci_device_name(unsigned short vendor_id, unsigned short device_id);">out_file - print "">out_file - print "#ifdef __cplusplus" >out_file - print "}" >out_file - print "#endif" >out_file - return -} - -function print_func_bodies(out_file) -{ - print "">out_file - print "const char *pci_vendor_name(unsigned short id)" >out_file - print "{" >out_file - print " unsigned i;" >out_file - print " for(i=0;i<sizeof(vendor_ids)/sizeof(struct vendor_id_s);i++)">out_file - print " {" >out_file - print "\tif(vendor_ids[i].id == id) return vendor_ids[i].name;" >out_file - print " }" >out_file - print " return NULL;" >out_file - print "}">out_file - print "" >out_file - print "const char *pci_device_name(unsigned short vendor_id, unsigned short device_id)" >out_file - print "{" >out_file - print " unsigned i, j;" >out_file - print " for(i=0;i<sizeof(vendor_ids)/sizeof(struct vendor_id_s);i++)">out_file - print " {" >out_file - print "\tif(vendor_ids[i].id == vendor_id)" >out_file - print "\t{" >out_file - print "\t j=0;" >out_file - print "\t while(vendor_ids[i].dev_list[j].id != 0xFFFF)" >out_file - print "\t {">out_file - print "\t\tif(vendor_ids[i].dev_list[j].id == device_id) return vendor_ids[i].dev_list[j].name;">out_file - print "\t\tj++;">out_file - print "\t };">out_file - print "\t break;" >out_file - print "\t}" >out_file - print " }" >out_file - print " return NULL;">out_file - print "}">out_file - return -} - -function kill_double_quoting(fld) -{ - n=split(fld,phrases, "[\"]"); - new_fld = phrases[1] - for(i=2;i<=n;i++) new_fld = sprintf("%s\\\"%s", new_fld, phrases[i]) - return new_fld -} - -function init_name_db() -{ - vendor_names[1]="" -} - -function init_device_db() -{ -# delete device_names - for( i in device_names ) delete device_names[i]; - device_names[1]="" -# delete subdevice_names - for( i in subdevice_names ) delete subdevice_names[i]; - subdevice_names[1] = "" -} - -function get_short_vendor_name(from) -{ - n=split(from, name, "[ ]"); - new_name = toupper(name[1]); - if(length(new_name)<3) new_name = sprintf("%s_%s", new_name, toupper(name[2])); - n=split(new_name, name, "[^0-9A-Za-z]"); - svendor = name[1]; - for(i=2;i<=n;i++) svendor=sprintf("%s%s%s", svendor, length(name[i])?"_":"", name[i]); - new_name = svendor; - vend_suffix = 2; -# check for unique - while(new_name in vendor_names) - { - new_name = sprintf("%s%u", svendor, vend_suffix) - vend_suffix = vend_suffix + 1; - } -# Add new name in array of vendor's names - vendor_names[new_name] = new_name - return new_name; -} - -function get_short_device_name(from_name) -{ - n=split(from_name, name, "[ ]"); - new_name = toupper(name[1]); - if(length(name[2])) new_name = sprintf("%s_%s", new_name, toupper(name[2])); - if(length(name[3])) new_name = sprintf("%s_%s", new_name, toupper(name[3])); - n=split(new_name, name, "[^0-9A-Za-z]"); - sdevice = name[1]; - for(i=2;i<=n;i++) sdevice=sprintf("%s%s%s", sdevice, length(name[i])?"_":"", name[i]); - new_name = sdevice; - dev_suffix = 2; -# check for unique - while(new_name in device_names) - { - new_name = sprintf("%s%u", sdevice, dev_suffix) - dev_suffix = dev_suffix + 1; - } -# Add new name in array of device names - device_names[new_name] = new_name - return new_name; -} - -function get_short_subdevice_name(from_name) -{ - n=split(from_name, name, "[ ]"); - new_name = toupper(name[1]); - if(length(name[2])) new_name = sprintf("%s_%s", new_name, toupper(name[2])); - if(length(name[3])) new_name = sprintf("%s_%s", new_name, toupper(name[3])); - n=split(new_name, name, "[^0-9A-Za-z]"); - ssdevice = name[1]; - for(i=2;i<=n;i++) ssdevice=sprintf("%s%s%s", ssdevice, length(name[i])?"_":"", name[i]); - new_name = ssdevice; - sdev_suffix = 2; -# check for unique - while(new_name in subdevice_names) - { - new_name = sprintf("%s%u", ssdevice, sdev_suffix) - sdev_suffix = sdev_suffix + 1; - } -# Add new name in array of subdevice names - subdevice_names[new_name] = new_name - return new_name; -} diff --git a/src/video_out/libdha/ports.c b/src/video_out/libdha/ports.c deleted file mode 100644 index b531082d3..000000000 --- a/src/video_out/libdha/ports.c +++ /dev/null @@ -1,219 +0,0 @@ -/* - (C) 2002 - library implementation by Nick Kyrshev - XFree86 3.3.3 scanpci.c, modified for GATOS/win/gfxdump by Øyvind Aabling. - */ -/* $XConsortium: scanpci.c /main/25 1996/10/27 11:48:40 kaleb $ */ -/* - * name: scanpci.c - * - * purpose: This program will scan for and print details of - * devices on the PCI bus. - - * author: Robin Cutshaw (robin@xfree86.org) - * - * supported O/S's: SVR4, UnixWare, SCO, Solaris, - * FreeBSD, NetBSD, 386BSD, BSDI BSD/386, - * Linux, Mach/386, ISC - * DOS (WATCOM 9.5 compiler) - * - * compiling: [g]cc scanpci.c -o scanpci - * for SVR4 (not Solaris), UnixWare use: - * [g]cc -DSVR4 scanpci.c -o scanpci - * for DOS, watcom 9.5: - * wcc386p -zq -omaxet -7 -4s -s -w3 -d2 name.c - * and link with PharLap or other dos extender for exe - * - */ - -/* $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ */ - -/* - * Copyright 1995 by Robin Cutshaw <robin@XFree86.Org> - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the names of the above listed copyright holder(s) - * not be used in advertising or publicity pertaining to distribution of - * the software without specific, written prior permission. The above listed - * copyright holder(s) make(s) no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - * THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD - * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE - * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY - * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - */ -#include <sys/ioctl.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <fcntl.h> -#include <sys/stat.h> -#include <sys/types.h> -#ifdef ARCH_ALPHA -#include <sys/io.h> -#endif -#include <unistd.h> - -#include "libdha.h" -#include "AsmMacros.h" -#include "kernelhelper/dhahelper.h" - -/* OS depended stuff */ -#if defined (linux) -#include "sysdep/pci_linux.c" -#elif defined (__FreeBSD__) -#include "sysdep/pci_freebsd.c" -#elif defined (__386BSD__) -#include "sysdep/pci_386bsd.c" -#elif defined (__NetBSD__) -#include "sysdep/pci_netbsd.c" -#elif defined (__OpenBSD__) -#include "sysdep/pci_openbsd.c" -#elif defined (__bsdi__) -#include "sysdep/pci_bsdi.c" -#elif defined (Lynx) -#include "sysdep/pci_lynx.c" -#elif defined (MACH386) -#include "sysdep/pci_mach386.c" -#elif defined (__SVR4) -#if !defined(SVR4) -#define SVR4 -#endif -#include "sysdep/pci_svr4.c" -#elif defined (SCO) -#include "sysdep/pci_sco.c" -#elif defined (ISC) -#include "sysdep/pci_isc.c" -#elif defined (__EMX__) -#include "sysdep/pci_os2.c" -#elif defined (_WIN32) || defined(__CYGWIN__) -#include "sysdep/pci_win32.c" -#else -#include "sysdep/pci_generic_os.c" -#endif - -static int dhahelper_fd=-1; -static unsigned dhahelper_counter=0; -int enable_app_io( void ) -{ - if((dhahelper_fd=open("/dev/dhahelper",O_RDWR)) < 0) return enable_os_io(); - dhahelper_counter++; - return 0; -} - -int disable_app_io( void ) -{ - dhahelper_counter--; - if(dhahelper_fd > 0) - { - if(!dhahelper_counter) - { - close(dhahelper_fd); - dhahelper_fd = -1; - } - } - else return disable_os_io(); - return 0; -} - -unsigned char INPORT8(unsigned idx) -{ - if (dhahelper_fd > 0) - { - dhahelper_port_t _port; - - _port.operation = PORT_OP_READ; - _port.addr = idx; - _port.size = 1; - if (ioctl(dhahelper_fd, DHAHELPER_PORT, &_port) == 0) - return _port.value; - } - return inb(idx); -} - -unsigned short INPORT16(unsigned idx) -{ - if (dhahelper_fd > 0) - { - dhahelper_port_t _port; - - _port.operation = PORT_OP_READ; - _port.addr = idx; - _port.size = 2; - if (ioctl(dhahelper_fd, DHAHELPER_PORT, &_port) == 0) - return _port.value; - } - return inw(idx); -} - -unsigned INPORT32(unsigned idx) -{ - if (dhahelper_fd > 0) - { - dhahelper_port_t _port; - - _port.operation = PORT_OP_READ; - _port.addr = idx; - _port.size = 4; - if (ioctl(dhahelper_fd, DHAHELPER_PORT, &_port) == 0) - return _port.value; - } - return inl(idx); -} - -void OUTPORT8(unsigned idx,unsigned char val) -{ - if (dhahelper_fd > 0) - { - dhahelper_port_t _port; - - _port.operation = PORT_OP_WRITE; - _port.addr = idx; - _port.size = 1; - _port.value = val; - if (ioctl(dhahelper_fd, DHAHELPER_PORT, &_port) == 0) - return; - } - else outb(idx,val); -} - -void OUTPORT16(unsigned idx,unsigned short val) -{ - if (dhahelper_fd > 0) - { - dhahelper_port_t _port; - - _port.operation = PORT_OP_WRITE; - _port.addr = idx; - _port.size = 2; - _port.value = val; - if (ioctl(dhahelper_fd, DHAHELPER_PORT, &_port) == 0) - return; - } - else outw(idx,val); -} - -void OUTPORT32(unsigned idx,unsigned val) -{ - if (dhahelper_fd > 0) - { - dhahelper_port_t _port; - - _port.operation = PORT_OP_WRITE; - _port.addr = idx; - _port.size = 4; - _port.value = val; - if (ioctl(dhahelper_fd, DHAHELPER_PORT, &_port) == 0) - return; - } - else outl(idx,val); -} - diff --git a/src/video_out/libdha/sysdep/AsmMacros_alpha.h b/src/video_out/libdha/sysdep/AsmMacros_alpha.h deleted file mode 100644 index 59da53891..000000000 --- a/src/video_out/libdha/sysdep/AsmMacros_alpha.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/drivers/chips/util/AsmMacros.h,v 1.1 2001/11/16 21:13:34 tsi Exp $ - Modified for readability by Nick Kurshev -*/ - -#ifndef __ASM_MACROS_ALPHA_H -#define __ASM_MACROS_ALPHA_H -#if defined (linux) -#include <sys/io.h> -#elif defined (__FreeBSD__) -#include <sys/types.h> -extern void outb(u_int32_t port, u_int8_t val); -extern void outw(u_int32_t port, u_int16_t val); -extern void outl(u_int32_t port, u_int32_t val); -extern u_int8_t inb(u_int32_t port); -extern u_int16_t inw(u_int32_t port); -extern u_int32_t inl(u_int32_t port); -#else -#include "sysdep/AsmMacros_generic.h" -#endif - -#define intr_disable() -#define intr_enable() - -#endif diff --git a/src/video_out/libdha/sysdep/AsmMacros_arm32.h b/src/video_out/libdha/sysdep/AsmMacros_arm32.h deleted file mode 100644 index e618d32ee..000000000 --- a/src/video_out/libdha/sysdep/AsmMacros_arm32.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/drivers/chips/util/AsmMacros.h,v 1.1 2001/11/16 21:13:34 tsi Exp $ - Modified for readability by Nick Kurshev -*/ - -#ifndef __ASM_MACROS_ARM32_H -#define __ASM_MACROS_ARM32_H -unsigned int IOPortBase; /* Memory mapped I/O port area */ - -static __inline__ void outb(short port,char val) -{ - if ((unsigned short)port >= 0x400) return; - *(volatile unsigned char*)(((unsigned short)(port))+IOPortBase) = val; -} - -static __inline__ void outw(short port,short val) -{ - if ((unsigned short)port >= 0x400) return; - *(volatile unsigned short*)(((unsigned short)(port))+IOPortBase) = val; -} - -static __inline__ void outl(short port,int val) -{ - if ((unsigned short)port >= 0x400) return; - *(volatile unsigned long*)(((unsigned short)(port))+IOPortBase) = val; -} - -static __inline__ unsigned int inb(short port) -{ - if ((unsigned short)port >= 0x400) return((unsigned int)-1); - return(*(volatile unsigned char*)(((unsigned short)(port))+IOPortBase)); -} - -static __inline__ unsigned int inw(short port) -{ - if ((unsigned short)port >= 0x400) return((unsigned int)-1); - return(*(volatile unsigned short*)(((unsigned short)(port))+IOPortBase)); -} - -static __inline__ unsigned int inl(short port) -{ - if ((unsigned short)port >= 0x400) return((unsigned int)-1); - return(*(volatile unsigned long*)(((unsigned short)(port))+IOPortBase)); -} - -#define intr_disable() -#define intr_enable() - -#endif diff --git a/src/video_out/libdha/sysdep/AsmMacros_generic.h b/src/video_out/libdha/sysdep/AsmMacros_generic.h deleted file mode 100644 index 183f831e5..000000000 --- a/src/video_out/libdha/sysdep/AsmMacros_generic.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - Generic stuff to compile VIDIX only on any system (SCRATCH) -*/ - -#ifndef __ASM_MACROS_GENERIC_H -#define __ASM_MACROS_GENERIC_H - -#warning This stuff is not ported on your system - -static __inline__ void outb(short port,char val) -{ - printf("outb: generic function call\n"); - return; -} - -static __inline__ void outw(short port,short val) -{ - printf("outw: generic function call\n"); - return; -} - -static __inline__ void outl(short port,unsigned int val) -{ - printf("outl: generic function call\n"); - return; -} - -static __inline__ unsigned int inb(short port) -{ - printf("inb: generic function call\n"); - return 0; -} - -static __inline__ unsigned int inw(short port) -{ - printf("inw: generic function call\n"); - return 0; -} - -static __inline__ unsigned int inl(short port) -{ - printf("inl: generic function call\n"); - return 0; -} - -static __inline__ void intr_disable() -{ - printf("intr_disable: generic function call\n"); -} - -static __inline__ void intr_enable() -{ - printf("intr_enable: generic function call\n"); -} - -#endif diff --git a/src/video_out/libdha/sysdep/AsmMacros_ia64.h b/src/video_out/libdha/sysdep/AsmMacros_ia64.h deleted file mode 100644 index 7d6123f33..000000000 --- a/src/video_out/libdha/sysdep/AsmMacros_ia64.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/drivers/chips/util/AsmMacros.h,v 1.1 2001/11/16 21:13:34 tsi Exp $ - Modified for readability by Nick Kurshev -*/ - -#ifndef __ASM_MACROS_IA64_H -#define __ASM_MACROS_IA64_H - -#if defined(linux) -#include <sys/io.h> -#else -#include "sysdep/AsmMacros_generic.h" -#endif - -#endif diff --git a/src/video_out/libdha/sysdep/AsmMacros_powerpc.h b/src/video_out/libdha/sysdep/AsmMacros_powerpc.h deleted file mode 100644 index 2169c96b4..000000000 --- a/src/video_out/libdha/sysdep/AsmMacros_powerpc.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/drivers/chips/util/AsmMacros.h,v 1.1 2001/11/16 21:13:34 tsi Exp $ - Modified for readability by Nick Kurshev -*/ - -#ifndef __ASM_MACROS_POWERPC_H -#define __ASM_MACROS_POWERPC_H - -#if defined(Lynx) || defined(__OpenBSD__) - -extern unsigned char *ioBase; - -static __inline__ volatile void eieio() -{ - __asm__ __volatile__ ("eieio"); -} - -static __inline__ void outb(short port, unsigned char value) -{ - *(unsigned char *)(ioBase + port) = value; eieio(); -} - -static __inline__ void outw(short port, unsigned short value) -{ - *(unsigned short *)(ioBase + port) = value; eieio(); -} - -static __inline__ void outl(short port, unsigned short value) -{ - *(unsigned long *)(ioBase + port) = value; eieio(); -} - -static __inline__ unsigned char inb(short port) -{ - unsigned char val; - val = *((unsigned char *)(ioBase + port)); eieio(); - return(val); -} - -static __inline__ unsigned short inw(short port) -{ - unsigned short val; - val = *((unsigned short *)(ioBase + port)); eieio(); - return(val); -} - -static __inline__ unsigned long inl(short port) -{ - unsigned long val; - val = *((unsigned long *)(ioBase + port)); eieio(); - return(val); -} - -#define intr_disable() -#define intr_enable() - -#else - #ifdef linux - /*nothing*/ - #else - #include "sysdep/AsmMacros_generic.h" - #endif -#endif - -#endif diff --git a/src/video_out/libdha/sysdep/AsmMacros_sparc.h b/src/video_out/libdha/sysdep/AsmMacros_sparc.h deleted file mode 100644 index f6717b4bb..000000000 --- a/src/video_out/libdha/sysdep/AsmMacros_sparc.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/drivers/chips/util/AsmMacros.h,v 1.1 2001/11/16 21:13:34 tsi Exp $ - Modified for readability by Nick Kurshev -*/ - -#ifndef __ASM_MACROS_SPARC_H -#define __ASM_MACROS_SPARC_H - -#ifndef ASI_PL -#define ASI_PL 0x88 -#endif - -static __inline__ void outb(unsigned long port, char val) -{ - __asm__ __volatile__("stba %0, [%1] %2" : : "r" (val), "r" (port), "i" (ASI_PL)); -} - -static __inline__ void outw(unsigned long port, char val) -{ - __asm__ __volatile__("stha %0, [%1] %2" : : "r" (val), "r" (port), "i" (ASI_PL)); -} - -static __inline__ void outl(unsigned long port, char val) -{ - __asm__ __volatile__("sta %0, [%1] %2" : : "r" (val), "r" (port), "i" (ASI_PL)); -} - -static __inline__ unsigned int inb(unsigned long port) -{ - unsigned char ret; - __asm__ __volatile__("lduba [%1] %2, %0" : "=r" (ret) : "r" (port), "i" (ASI_PL)); - return ret; -} - -static __inline__ unsigned int inw(unsigned long port) -{ - unsigned char ret; - __asm__ __volatile__("lduha [%1] %2, %0" : "=r" (ret) : "r" (port), "i" (ASI_PL)); - return ret; -} - -static __inline__ unsigned int inl(unsigned long port) -{ - unsigned char ret; - __asm__ __volatile__("lda [%1] %2, %0" : "=r" (ret) : "r" (port), "i" (ASI_PL)); - return ret; -} - -#define intr_disable() -#define intr_enable() - -#endif diff --git a/src/video_out/libdha/sysdep/AsmMacros_x86.h b/src/video_out/libdha/sysdep/AsmMacros_x86.h deleted file mode 100644 index 97dcaae16..000000000 --- a/src/video_out/libdha/sysdep/AsmMacros_x86.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/drivers/chips/util/AsmMacros.h,v 1.1 2001/11/16 21:13:34 tsi Exp $ - Modified for readability by Nick Kurshev -*/ - -#ifndef __ASM_MACROS_X86_H -#define __ASM_MACROS_X86_H - -#if defined (WINNT) -#include "sysdep/AsmMacros_generic.h" -#else - -#include "config.h" - -static __inline__ void outb(short port,char val) -{ - __asm__ __volatile__("outb %0,%1" : :"a" (val), "d" (port)); - return; -} - -static __inline__ void outw(short port,short val) -{ - __asm__ __volatile__("outw %0,%1" : :"a" (val), "d" (port)); - return; -} - -static __inline__ void outl(short port,unsigned int val) -{ - __asm__ __volatile__("outl %0,%1" : :"a" (val), "d" (port)); - return; -} - -static __inline__ unsigned int inb(short port) -{ - unsigned char ret; - __asm__ __volatile__("inb %1,%0" : - "=a" (ret) : - "d" (port)); - return ret; -} - -static __inline__ unsigned int inw(short port) -{ - unsigned short ret; - __asm__ __volatile__("inw %1,%0" : - "=a" (ret) : - "d" (port)); - return ret; -} - -static __inline__ unsigned int inl(short port) -{ - unsigned int ret; - __asm__ __volatile__("inl %1,%0" : - "=a" (ret) : - "d" (port)); - return ret; -} - -static __inline__ void intr_disable() -{ - __asm__ __volatile__("cli"); -} - -static __inline__ void intr_enable() -{ - __asm__ __volatile__("sti"); -} - -#endif -#endif diff --git a/src/video_out/libdha/sysdep/Makefile.am b/src/video_out/libdha/sysdep/Makefile.am deleted file mode 100644 index 807572c39..000000000 --- a/src/video_out/libdha/sysdep/Makefile.am +++ /dev/null @@ -1,35 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -EXTRA_DIST = \ - libdha_os2.c \ - libdha_win32.c \ - pci_386bsd.c \ - pci_alpha.c \ - pci_arm32.c \ - pci_bsdi.c \ - pci_freebsd.c \ - pci_generic_cpu.c \ - pci_generic_os.c \ - pci_ia64.c \ - pci_isc.c \ - pci_linux.c \ - pci_lynx.c \ - pci_mach386.c \ - pci_netbsd.c \ - pci_openbsd.c \ - pci_os2.c \ - pci_powerpc.c \ - pci_sco.c \ - pci_sparc.c \ - pci_svr4.c \ - pci_win32.c \ - pci_x86.c - -noinst_HEADERS = \ - AsmMacros_alpha.h \ - AsmMacros_arm32.h \ - AsmMacros_generic.h \ - AsmMacros_ia64.h \ - AsmMacros_powerpc.h \ - AsmMacros_sparc.h \ - AsmMacros_x86.h diff --git a/src/video_out/libdha/sysdep/libdha_os2.c b/src/video_out/libdha/sysdep/libdha_os2.c deleted file mode 100644 index 041f6be71..000000000 --- a/src/video_out/libdha/sysdep/libdha_os2.c +++ /dev/null @@ -1,161 +0,0 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/os2/os2_video.c,v 3.14 2000/10/28 01:42:28 mvojkovi Exp $ */ -/* Modified for libdha by Nick Kurshev. */ -/* - * (c) Copyright 1994,1999 by Holger Veit - * <Holger.Veit@gmd.de> - * Modified 1996 by Sebastien Marineau <marineau@genie.uottawa.ca> - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * HOLGER VEIT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF - * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * Except as contained in this notice, the name of Holger Veit shall not be - * used in advertising or otherwise to promote the sale, use or other dealings - * in this Software without prior written authorization from Holger Veit. - * - */ -/* $XConsortium: os2_video.c /main/8 1996/10/27 11:49:02 kaleb $ */ - -#define INCL_DOSFILEMGR -#include "os2.h" - -/***************************************************************************/ -/* Video Memory Mapping helper functions */ -/***************************************************************************/ - -/* This section uses the xf86sup.sys driver developed for xfree86. - * The driver allows mapping of physical memory - * You must install it with a line DEVICE=path\xf86sup.sys in config.sys. - */ - -static HFILE mapdev = -1; -static ULONG stored_virt_addr; -static char* mappath = "\\DEV\\PMAP$"; -static HFILE open_mmap() -{ - APIRET rc; - ULONG action; - - if (mapdev != -1) - return mapdev; - - rc = DosOpen((PSZ)mappath, (PHFILE)&mapdev, (PULONG)&action, - (ULONG)0, FILE_SYSTEM, FILE_OPEN, - OPEN_SHARE_DENYNONE|OPEN_FLAGS_NOINHERIT|OPEN_ACCESS_READONLY, - (ULONG)0); - if (rc!=0) - mapdev = -1; - return mapdev; -} - -static void close_mmap() -{ - if (mapdev != -1) - DosClose(mapdev); - mapdev = -1; -} - -/* this structure is used as a parameter packet for the direct access - * ioctl of pmap$ - */ - -/* Changed here for structure of driver PMAP$ */ - -typedef struct{ - ULONG addr; - ULONG size; -} DIOParPkt; - -/* This is the data packet for the mapping function */ - -typedef struct { - ULONG addr; - USHORT sel; -} DIODtaPkt; - -/***************************************************************************/ -/* Video Memory Mapping section */ -/***************************************************************************/ - -static long callcount = 0L; - -/* ARGSUSED */ -void * map_phys_mem(unsigned long base, unsigned long size) -{ - DIOParPkt par; - ULONG plen; - DIODtaPkt dta; - ULONG dlen; - static BOOL ErrRedir = FALSE; - APIRET rc; - - par.addr = (ULONG)base; - par.size = (ULONG)size; - plen = sizeof(par); - dlen = sizeof(dta); - - open_mmap(); - if (mapdev == -1) - { - perror("libdha: device xf86sup.sys is not installed"); - exit(1); - } - if ((rc=DosDevIOCtl(mapdev, (ULONG)0x76, (ULONG)0x44, - (PVOID)&par, (ULONG)plen, (PULONG)&plen, - (PVOID)&dta, (ULONG)dlen, (PULONG)&dlen)) == 0) { - if (dlen==sizeof(dta)) { - callcount++; - return (void *)dta.addr; - } - /*else fail*/ - } - return (void *)-1; -} - -/* ARGSUSED */ -void unmap_phys_mem(void * base, unsigned long size) -{ - DIOParPkt par; - ULONG plen,vmaddr; - -/* We need here the VIRTADDR for unmapping, not the physical address */ -/* This should be taken care of either here by keeping track of allocated */ -/* pointers, but this is also already done in the driver... Thus it would */ -/* be a waste to do this tracking twice. Can this be changed when the fn. */ -/* is called? This would require tracking this function in all servers, */ -/* and changing it appropriately to call this with the virtual adress */ -/* If the above mapping function is only called once, then we can store */ -/* the virtual adress and use it here.... */ - - par.addr = (ULONG)base; - par.size = 0xffffffff; /* This is the virtual address parameter. Set this to ignore */ - plen = sizeof(par); - - if (mapdev != -1) - { - DosDevIOCtl(mapdev, (ULONG)0x76, (ULONG)0x46, - (PVOID)&par, (ULONG)plen, (PULONG)&plen, - &vmaddr, sizeof(ULONG), &plen); - callcount--; - } -/* Now if more than one region has been allocated and we close the driver, - * the other pointers will immediately become invalid. We avoid closing - * driver for now, but this should be fixed for server exit - */ - - if(!callcount) close_mmap(); -} diff --git a/src/video_out/libdha/sysdep/libdha_win32.c b/src/video_out/libdha/sysdep/libdha_win32.c deleted file mode 100644 index 75c5dfb94..000000000 --- a/src/video_out/libdha/sysdep/libdha_win32.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - MAPDEV.h - include file for VxD MAPDEV - Copyright (c) 1996 Vireo Software, Inc. - Modified for libdha by Nick Kurshev. -*/ - -#include <windows.h> - -/* - This is the request structure that applications use - to request services from the MAPDEV VxD. -*/ - -typedef struct _MapDevRequest -{ - DWORD mdr_ServiceID; /* supplied by caller */ - LPVOID mdr_PhysicalAddress; /* supplied by caller */ - DWORD mdr_SizeInBytes; /* supplied by caller */ - LPVOID mdr_LinearAddress; /* returned by VxD */ - WORD mdr_Selector; /* returned if 16-bit caller */ - WORD mdr_Status; /* MDR_xxxx code below */ -} MAPDEVREQUEST, *PMAPDEVREQUEST; - -#define MDR_SERVICE_MAP CTL_CODE(FILE_DEVICE_UNKNOWN, 1, METHOD_NEITHER, FILE_ANY_ACCESS) -#define MDR_SERVICE_UNMAP CTL_CODE(FILE_DEVICE_UNKNOWN, 2, METHOD_NEITHER, FILE_ANY_ACCESS) - -#define MDR_STATUS_SUCCESS 1 -#define MDR_STATUS_ERROR 0 -/*#include "winioctl.h"*/ -#define FILE_DEVICE_UNKNOWN 0x00000022 -#define METHOD_NEITHER 3 -#define FILE_ANY_ACCESS 0 -#define CTL_CODE( DeviceType, Function, Method, Access ) ( \ - ((DeviceType)<<16) | ((Access)<<14) | ((Function)<<2) | (Method) ) - -/* Memory Map a piece of Real Memory */ -void *map_phys_mem(unsigned base, unsigned size) { - - HANDLE hDevice ; - PVOID inBuf[1] ; /* buffer for struct pointer to VxD */ - DWORD RetInfo[2] ; /* buffer to receive data from VxD */ - DWORD cbBytesReturned ; /* count of bytes returned from VxD */ - MAPDEVREQUEST req ; /* map device request structure */ - DWORD *pNicstar, Status, Time ; int i ; char *endptr ; - const PCHAR VxDName = "\\\\.\\MAPDEV.VXD" ; - const PCHAR VxDNameAlreadyLoaded = "\\\\.\\MAPDEV" ; - - hDevice = CreateFile(VxDName, 0,0,0, - CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0) ; - if (hDevice == INVALID_HANDLE_VALUE) - hDevice = CreateFile(VxDNameAlreadyLoaded, 0,0,0, - CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0) ; - if (hDevice == INVALID_HANDLE_VALUE) { - fprintf(stderr, "Cannot open driver, error=%08lx\n", GetLastError()) ; - exit(1) ; } - - req.mdr_ServiceID = MDR_SERVICE_MAP ; - req.mdr_PhysicalAddress = (PVOID)base ; - req.mdr_SizeInBytes = size ; - inBuf[0] = &req ; - - if ( ! DeviceIoControl(hDevice, MDR_SERVICE_MAP, inBuf, sizeof(PVOID), - NULL, 0, &cbBytesReturned, NULL) ) { - fprintf(stderr, "Failed to map device\n") ; exit(1) ; } - - return (void*)req.mdr_LinearAddress ; -} - -void unmap_phys_mem(void *ptr, unsigned size) { } - diff --git a/src/video_out/libdha/sysdep/pci_386bsd.c b/src/video_out/libdha/sysdep/pci_386bsd.c deleted file mode 100644 index d00ecb078..000000000 --- a/src/video_out/libdha/sysdep/pci_386bsd.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ - Modified for readability by Nick Kurshev -*/ -#include <errno.h> -#include <sys/file.h> -#include <machine/console.h> -#ifndef GCCUSESGAS -#define GCCUSESGAS -#endif - -static int io_fd; - -static __inline__ int enable_os_io(void) -{ - io_fd = -1 ; - if ((io_fd = open("/dev/console", O_RDWR, 0)) < 0) { - perror("/dev/console"); - return(errno); - } - if (ioctl(io_fd, KDENABIO, 0) < 0) { - perror("ioctl(KDENABIO)"); - return(errno); - } - return(0); -} - -static __inline__ int disable_os_io(void) -{ - if (ioctl(io_fd, KDDISABIO, 0) < 0) { - perror("ioctl(KDDISABIO)"); - close(io_fd); - return(errno); - } - close(io_fd); - return(0); -} diff --git a/src/video_out/libdha/sysdep/pci_alpha.c b/src/video_out/libdha/sysdep/pci_alpha.c deleted file mode 100644 index 74c3eb687..000000000 --- a/src/video_out/libdha/sysdep/pci_alpha.c +++ /dev/null @@ -1,80 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ - Modified for readability by Nick Kurshev -*/ - -static int pci_config_type( void ) { return 1; } - -static int pci_get_vendor( - unsigned char bus, - unsigned char dev, - int func) -{ - unsigned long retval; - pciconfig_read(bus, dev<<3, PCI_ID_REG, 4, &retval); - return retval; -} - -static long pci_config_read_long( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - unsigned long retval; - pciconfig_read(bus, dev<<3, cmd, 4, &retval); - return retval; -} - -static long pci_config_read_word( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - unsigned long retval; - pciconfig_read(bus, dev<<3, cmd, 2, &retval); - return retval; -} - -static long pci_config_read_byte( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - unsigned long retval; - pciconfig_read(bus, dev<<3, cmd, 1, &retval); - return retval; -} - -static void pci_config_write_long( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - pciconfig_write(bus, dev<<3, cmd, 4, val); -} - -static void pci_config_write_word( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - pciconfig_write(bus, dev<<3, cmd, 2, val); -} - -static void pci_config_write_byte( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - pciconfig_write(bus, dev<<3, cmd, 1, val); -} diff --git a/src/video_out/libdha/sysdep/pci_arm32.c b/src/video_out/libdha/sysdep/pci_arm32.c deleted file mode 100644 index 6920b615e..000000000 --- a/src/video_out/libdha/sysdep/pci_arm32.c +++ /dev/null @@ -1,123 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ - Modified for readability by Nick Kurshev -*/ - -static int pci_config_type( void ) -{ - unsigned long tmplong1, tmplong2; - unsigned char tmp1, tmp2; - int retval; - retval = 0; - - OUTPORT8(PCI_MODE2_ENABLE_REG, 0x00); - OUTPORT8(PCI_MODE2_FORWARD_REG, 0x00); - tmp1 = INPORT8(PCI_MODE2_ENABLE_REG); - tmp2 = INPORT8(PCI_MODE2_FORWARD_REG); - if ((tmp1 == 0x00) && (tmp2 == 0x00)) { - retval = 2; - /*printf("PCI says configuration type 2\n");*/ - } else { - tmplong1 = INPORT32(PCI_MODE1_ADDRESS_REG); - OUTPORT32(PCI_MODE1_ADDRESS_REG, PCI_EN); - tmplong2 = INPORT32(PCI_MODE1_ADDRESS_REG); - OUTPORT32(PCI_MODE1_ADDRESS_REG, tmplong1); - if (tmplong2 == PCI_EN) { - retval = 1; - /*printf("PCI says configuration type 1\n");*/ - } else { - /*printf("No PCI !\n");*/ - disable_app_io(); - /*exit(1);*/ - retval = 0xFFFF; - } - } - return retval; -} - -static int pci_get_vendor( - unsigned char bus, - unsigned char dev, - int func) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd); - return INPORT32(PCI_MODE1_DATA_REG); -} - -static long pci_config_read_long( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - return INPORT32(PCI_MODE1_DATA_REG); -} - -static long pci_config_read_word( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - return INPORT16(PCI_MODE1_DATA_REG); -} - -static long pci_config_read_byte( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - return INPORT8(PCI_MODE1_DATA_REG); -} - -static void pci_config_write_long( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - OUTPORT32(PCI_MODE1_DATA_REG,val); -} - -static void pci_config_write_word( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - unsigned val) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - OUTPORT16(PCI_MODE1_DATA_REG,val); -} - -static void pci_config_write_byte( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - OUTPORT8(PCI_MODE1_DATA_REG,val); -} diff --git a/src/video_out/libdha/sysdep/pci_bsdi.c b/src/video_out/libdha/sysdep/pci_bsdi.c deleted file mode 100644 index b6b142054..000000000 --- a/src/video_out/libdha/sysdep/pci_bsdi.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ - Modified for readability by Nick Kurshev -*/ -#include <errno.h> -#include <sys/file.h> -#include <sys/ioctl.h> -#include <i386/isa/pcconsioctl.h> -#ifndef GCCUSESGAS -#define GCCUSESGAS -#endif - -static int io_fd; - -static __inline__ int enable_os_io(void) -{ - io_fd = -1 ; - if ((io_fd = open("/dev/console", O_RDWR, 0)) < 0) { - perror("/dev/console"); - return(errno); - } - if (ioctl(io_fd, PCCONENABIOPL, 0) < 0) { - perror("ioctl(PCCONENABIOPL)"); - return(errno); - } - return(0); -} - -static __inline__ int disable_os_io(void) -{ - if (ioctl(io_fd, PCCONDISABIOPL, 0) < 0) { - perror("ioctl(PCCONDISABIOPL)"); - close(io_fd); - return(errno); - } - close(io_fd); - return(0); -} diff --git a/src/video_out/libdha/sysdep/pci_freebsd.c b/src/video_out/libdha/sysdep/pci_freebsd.c deleted file mode 100644 index 9ad4b15f2..000000000 --- a/src/video_out/libdha/sysdep/pci_freebsd.c +++ /dev/null @@ -1,41 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ - Modified for readability by Nick Kurshev -*/ -#include <errno.h> -#include <sys/file.h> -/* machine/console.h seems to be outdated by recent FreeBSD * - * however pcvt_ioctl.h seems to exist for very long time */ -/* #include <machine/console.h>*/ -#include <machine/pcvt_ioctl.h> -#ifndef GCCUSESGAS -#define GCCUSESGAS -#endif - -static int io_fd; - -static __inline__ int enable_os_io(void) -{ - io_fd = -1 ; - if ((io_fd = open("/dev/console", O_RDWR, 0)) < 0) { - perror("/dev/console"); - return(errno); - } - if (ioctl(io_fd, KDENABIO, 0) < 0) { - perror("ioctl(KDENABIO)"); - return(errno); - } - return(0); -} - -static __inline__ int disable_os_io(void) -{ - if (ioctl(io_fd, KDDISABIO, 0) < 0) { - perror("ioctl(KDDISABIO)"); - close(io_fd); - return(errno); - } - close(io_fd); - return(0); -} diff --git a/src/video_out/libdha/sysdep/pci_generic_cpu.c b/src/video_out/libdha/sysdep/pci_generic_cpu.c deleted file mode 100644 index 729d48b5a..000000000 --- a/src/video_out/libdha/sysdep/pci_generic_cpu.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - Generic stuff to compile VIDIX only on any system (SCRATCH) -*/ -#warning This stuff is not ported on your system - -static int pci_config_type( void ) -{ - printf("pci_config_type: generic function call\n"); - return 0xFFFF; -} - -static int pci_get_vendor( - unsigned char bus, - unsigned char dev, - int func) -{ - printf("pci_get_vendor: generic function call\n"); - return 0; -} - -static long pci_config_read_long( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - printf("pci_config_read_long: generic function call\n"); - return 0; -} - -static long pci_config_read_word( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - printf("pci_config_read_word: generic function call\n"); - return 0; -} - -static long pci_config_read_byte( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - printf("pci_config_read_byte: generic function call\n"); - return 0; -} - -static void pci_config_write_long( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - printf("pci_config_write_long: generic function call\n"); -} - -static void pci_config_write_word( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - printf("pci_config_write_word: generic function call\n"); -} - -static void pci_config_write_byte( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - printf("pci_config_write_byte: generic function call\n"); -} diff --git a/src/video_out/libdha/sysdep/pci_generic_os.c b/src/video_out/libdha/sysdep/pci_generic_os.c deleted file mode 100644 index 8855bb4ba..000000000 --- a/src/video_out/libdha/sysdep/pci_generic_os.c +++ /dev/null @@ -1,15 +0,0 @@ -/* - Generic stuff to compile VIDIX only on any system (SCRATCH) -*/ -#warn This stuff is not ported on yur system -static __inline__ int enable_os_io(void) -{ - printf("enable_os_io: generic function call\n"); - return 0; -} - -static __inline__ int disable_os_io(void) -{ - printf("disable_os_io: generic function call\n"); - return 0; -} diff --git a/src/video_out/libdha/sysdep/pci_ia64.c b/src/video_out/libdha/sysdep/pci_ia64.c deleted file mode 100644 index ef2074ab2..000000000 --- a/src/video_out/libdha/sysdep/pci_ia64.c +++ /dev/null @@ -1,123 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ - Modified for readability by Nick Kurshev -*/ - -static int pci_config_type( void ) -{ - unsigned long tmplong1, tmplong2; - unsigned char tmp1, tmp2; - int retval; - retval = 0; - - OUTPORT8(PCI_MODE2_ENABLE_REG, 0x00); - OUTPORT8(PCI_MODE2_FORWARD_REG, 0x00); - tmp1 = INPORT8(PCI_MODE2_ENABLE_REG); - tmp2 = INPORT8(PCI_MODE2_FORWARD_REG); - if ((tmp1 == 0x00) && (tmp2 == 0x00)) { - retval = 2; - /*printf("PCI says configuration type 2\n");*/ - } else { - tmplong1 = INPORT32(PCI_MODE1_ADDRESS_REG); - OUTPORT32(PCI_MODE1_ADDRESS_REG, PCI_EN); - tmplong2 = INPORT32(PCI_MODE1_ADDRESS_REG); - OUTPORT32(PCI_MODE1_ADDRESS_REG, tmplong1); - if (tmplong2 == PCI_EN) { - retval = 1; - /*printf("PCI says configuration type 1\n");*/ - } else { - /*printf("No PCI !\n");*/ - disable_app_io(); - /*exit(1);*/ - retval = 0xFFFF; - } - } - return retval; -} - -static int pci_get_vendor( - unsigned char bus, - unsigned char dev, - int func) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd); - return INPORT32(PCI_MODE1_DATA_REG); -} - -static long pci_config_read_long( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - return INPORT32(PCI_MODE1_DATA_REG); -} - -static long pci_config_read_word( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - return INPORT16(PCI_MODE1_DATA_REG); -} - -static long pci_config_read_byte( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - return INPORT8(PCI_MODE1_DATA_REG); -} - -static void pci_config_write_long( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - OUTPORT32(PCI_MODE1_DATA_REG,val); -} - -static void pci_config_write_word( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - OUTPORT16(PCI_MODE1_DATA_REG,val); -} - -static void pci_config_write_byte( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - OUTPORT8(PCI_MODE1_DATA_REG,val); -} diff --git a/src/video_out/libdha/sysdep/pci_isc.c b/src/video_out/libdha/sysdep/pci_isc.c deleted file mode 100644 index 5b5a59182..000000000 --- a/src/video_out/libdha/sysdep/pci_isc.c +++ /dev/null @@ -1,32 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ - Modified for readability by Nick Kurshev -*/ -#include <sys/param.h> -#include <sys/immu.h> -#include <sys/region.h> -#include <sys/proc.h> -#include <sys/tss.h> -#include <sys/sysi86.h> -#include <sys/v86.h> - -static __inline__ int enable_os_io(void) -{ -#if defined(SI86IOPL) - sysi86(SI86IOPL, 3); -#else - sysi86(SI86V86, V86SC_IOPL, PS_IOPL); -#endif - return(0); -} - -static __inline__ int disable_os_io(void) -{ -#if defined(SI86IOPL) - sysi86(SI86IOPL, 0); -#else - sysi86(SI86V86, V86SC_IOPL, 0); -#endif - return(0); -} diff --git a/src/video_out/libdha/sysdep/pci_linux.c b/src/video_out/libdha/sysdep/pci_linux.c deleted file mode 100644 index 1d2116da6..000000000 --- a/src/video_out/libdha/sysdep/pci_linux.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ - Modified for readability by Nick Kurshev -*/ -#include <errno.h> -#ifdef __i386__ -#include <sys/perm.h> -#else -#ifndef __sparc__ -#include <sys/io.h> -#endif -#endif - -#include "config.h" - -#ifdef CONFIG_DHAHELPER -#include <fcntl.h> -int dhahelper_initialized = 0; -int dhahelper_fd = 0; -#endif - -#if defined(__sparc__) || defined(__powerpc__) -#define iopl(x) (0) -#endif - -static __inline__ int enable_os_io(void) -{ -#ifdef CONFIG_DHAHELPER - dhahelper_fd = open("/dev/dhahelper", O_RDWR); - if (dhahelper_fd > 0) - { - dhahelper_initialized = 1; - return(0); - } - dhahelper_initialized = -1; -#endif - - if (iopl(3) != 0) - return(errno); - return(0); -} - -static __inline__ int disable_os_io(void) -{ -#ifdef CONFIG_DHAHELPER - if (dhahelper_initialized == 1) - close(dhahelper_fd); - else -#endif - if (iopl(0) != 0) - return(errno); - return(0); -} diff --git a/src/video_out/libdha/sysdep/pci_lynx.c b/src/video_out/libdha/sysdep/pci_lynx.c deleted file mode 100644 index b698f6308..000000000 --- a/src/video_out/libdha/sysdep/pci_lynx.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ - Modified for readability by Nick Kurshev -*/ - -#if defined(Lynx_22) -#ifndef GCCUSESGAS -#define GCCUSESGAS -#endif - -/* let's mimick the Linux Alpha stuff for LynxOS so we don't have - * to change too much code - */ -#include <smem.h> - -static unsigned char *pciConfBase; - -static __inline__ void enable_os_io(void) -{ - pciConfBase = (unsigned char *) smem_create("PCI-CONF", - (char *)0x80800000, 64*1024, SM_READ|SM_WRITE); - if (pciConfBase == (void *) -1) - exit(1); -} - -static __inline__ void disable_os_io(void) -{ - smem_create(NULL, (char *) pciConfBase, 0, SM_DETACH); - smem_remove("PCI-CONF"); - pciConfBase = NULL; -} - -#include <smem.h> - -static unsigned char *pciConfBase; - -static __inline__ unsigned long -static swapl(unsigned long val) -{ - unsigned char *p = (unsigned char *)&val; - return ((p[3] << 24) | (p[2] << 16) | (p[1] << 8) | (p[0] << 0)); -} - - -#define BUS(tag) (((tag)>>16)&0xff) -#define DFN(tag) (((tag)>>8)&0xff) - -#define PCIBIOS_DEVICE_NOT_FOUND 0x86 -#define PCIBIOS_SUCCESSFUL 0x00 - -static int pciconfig_read( - unsigned char bus, - unsigned char dev, - unsigned char offset, - int len, /* unused, alway 4 */ - unsigned long *val) -{ - unsigned long _val; - unsigned long *ptr; - - dev >>= 3; - if (bus || dev >= 16) { - *val = 0xFFFFFFFF; - return PCIBIOS_DEVICE_NOT_FOUND; - } else { - ptr = (unsigned long *)(pciConfBase + ((1<<dev) | offset)); - _val = swapl(*ptr); - } - *val = _val; - return PCIBIOS_SUCCESSFUL; -} - -static int pciconfig_write( - unsigned char bus, - unsigned char dev, - unsigned char offset, - int len, /* unused, alway 4 */ - unsigned long val) -{ - unsigned long _val; - unsigned long *ptr; - - dev >>= 3; - _val = swapl(val); - if (bus || dev >= 16) { - return PCIBIOS_DEVICE_NOT_FOUND; - } else { - ptr = (unsigned long *)(pciConfBase + ((1<<dev) | offset)); - *ptr = _val; - } - return PCIBIOS_SUCCESSFUL; -} diff --git a/src/video_out/libdha/sysdep/pci_mach386.c b/src/video_out/libdha/sysdep/pci_mach386.c deleted file mode 100644 index 31621862b..000000000 --- a/src/video_out/libdha/sysdep/pci_mach386.c +++ /dev/null @@ -1,25 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ - Modified for readability by Nick Kurshev -*/ - -#include <errno.h> - -static int io_fd; - -static __inline__ int enable_os_io(void) -{ - io_fd = -1 ; - if ((io_fd = open("/dev/iopl", O_RDWR, 0)) < 0) { - perror("/dev/iopl"); - return(errno); - } - return(0); -} - -static __inline__ int disable_os_io(void) -{ - close(io_fd); - return(0); -} diff --git a/src/video_out/libdha/sysdep/pci_netbsd.c b/src/video_out/libdha/sysdep/pci_netbsd.c deleted file mode 100644 index 793944beb..000000000 --- a/src/video_out/libdha/sysdep/pci_netbsd.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ - Modified for readability by Nick Kurshev -*/ -#include <errno.h> -#include <sys/param.h> -#include <sys/file.h> -#include <machine/sysarch.h> -#ifndef GCCUSESGAS -#define GCCUSESGAS -#endif - -static int io_fd; - -static __inline__ int enable_os_io(void) -{ - io_fd = -1 ; -#if !defined(USE_I386_IOPL) - if ((io_fd = open("/dev/io", O_RDWR, 0)) < 0) { - perror("/dev/io"); - return(errno); - } -#else - if (i386_iopl(1) < 0) { - perror("i386_iopl"); - return(errno); - } -#endif /* USE_I386_IOPL */ - return(0); -} - -static __inline__ int disable_os_io(void) -{ -#if !defined(USE_I386_IOPL) - close(io_fd); -#else - if (i386_iopl(0) < 0) { - perror("i386_iopl"); - return(errno); - } -#endif /* NetBSD1_1 */ - return(0); -} diff --git a/src/video_out/libdha/sysdep/pci_openbsd.c b/src/video_out/libdha/sysdep/pci_openbsd.c deleted file mode 100644 index 89c85eab6..000000000 --- a/src/video_out/libdha/sysdep/pci_openbsd.c +++ /dev/null @@ -1,27 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ - Modified for readability by Nick Kurshev -*/ - -#ifdef __i386__ - -#include <errno.h> -#include <sys/types.h> -#include <machine/sysarch.h> - -static __inline__ int enable_os_io(void) -{ - if (i386_iopl(1) < 0) { - perror("i386_iopl"); - return(errno); - } - return(0); -} - -static __inline__ int disable_os_io(void) -{ - /* Nothing to do */ - return(0); -} -#endif diff --git a/src/video_out/libdha/sysdep/pci_os2.c b/src/video_out/libdha/sysdep/pci_os2.c deleted file mode 100644 index ddfc0c0ea..000000000 --- a/src/video_out/libdha/sysdep/pci_os2.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ - Modified for readability by Nick Kurshev -*/ -#define INCL_DOSFILEMGR -#include <os2.h> - -static USHORT callgate[3] = {0,0,0}; - -static __inline__ int enable_os_io(void) -{ - HFILE hfd; - ULONG dlen,action; - APIRET rc; - static char *ioDrvPath = "/dev/fastio$"; - - if (DosOpen((PSZ)ioDrvPath, (PHFILE)&hfd, (PULONG)&action, - (ULONG)0, FILE_SYSTEM, FILE_OPEN, - OPEN_SHARE_DENYNONE|OPEN_FLAGS_NOINHERIT|OPEN_ACCESS_READONLY, - (ULONG)0) != 0) { - fprintf(stderr,"Error opening fastio$ driver...\n"); - fprintf(stderr,"Please install xf86sup.sys in config.sys!\n"); - return(42); - } - callgate[0] = callgate[1] = 0; - -/* Get callgate from driver for fast io to ports and other stuff */ - - rc = DosDevIOCtl(hfd, (ULONG)0x76, (ULONG)0x64, - NULL, 0, NULL, - (ULONG*)&callgate[2], sizeof(USHORT), &dlen); - if (rc) { - fprintf(stderr,"xf86-OS/2: EnableIOPorts failed, rc=%d, dlen=%d; emergency exit\n", - rc,dlen); - DosClose(hfd); - return(42); - } - -/* Calling callgate with function 13 sets IOPL for the program */ - - asm volatile ("movl $13,%%ebx;.byte 0xff,0x1d;.long _callgate" - : /*no outputs */ - : /*no inputs */ - : "eax","ebx","ecx","edx","cc"); - - DosClose(hfd); - return(0); -} - -static __inline__ int disable_os_io(void) -{ -/* Nothing to do */ - return(0); -} diff --git a/src/video_out/libdha/sysdep/pci_powerpc.c b/src/video_out/libdha/sysdep/pci_powerpc.c deleted file mode 100644 index 667b4db37..000000000 --- a/src/video_out/libdha/sysdep/pci_powerpc.c +++ /dev/null @@ -1,250 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ - Modified for readability by Nick Kurshev -*/ - -static int pci_config_type( void ) { return 1; } -#ifdef linux -#include <fcntl.h> -#include <sys/io.h> -#include <linux/pci.h> -#include "../../bswap.h" -#endif - -#ifdef linux -static int pci_get_vendor( - unsigned char bus, - unsigned char dev, - int func) -{ - int retval; - char path[100]; - int fd; - short vendor, device; - sprintf(path,"/proc/bus/pci/%02d/%02x.0", bus, dev); - fd = open(path,O_RDONLY|O_SYNC); - if (fd == -1) { - retval=0xFFFF; - } - else if (pread(fd, &vendor, 2, PCI_VENDOR_ID) == 2 && - pread(fd, &device, 2, PCI_DEVICE_ID) == 2) { - vendor = bswap_16(vendor); - device = bswap_16(device); - retval = vendor + (device<<16); /*no worries about byte order, - all ppc are bigendian*/ - } else { - retval = 0xFFFF; - } - if (fd > 0) { - close(fd); - } - return retval; -} -#else -static int pci_get_vendor( - unsigned char bus, - unsigned char dev, - int func) -{ - int retval; - pciconfig_read(bus, dev<<3, PCI_ID_REG, 4, &retval); - return retval; -} -#endif -#ifdef linux -static long pci_config_read_long( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - long retval; - char path[100]; - int fd; - sprintf(path,"/proc/bus/pci/%02d/%02x.0", bus, dev); - fd = open(path,O_RDONLY|O_SYNC); - if (fd == -1) { - retval=0; - } - else if (pread(fd, &retval, 4, cmd) == 4) { - retval = bswap_32(retval); - } else { - retval = 0; - } - if (fd > 0) { - close(fd); - } - return retval; -} - -static long pci_config_read_word( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - long retval; - char path[100]; - int fd; - sprintf(path,"/proc/bus/pci/%02d/%02x.0", bus, dev); - fd = open(path,O_RDONLY|O_SYNC); - if (fd == -1) { - retval=0; - } - else if (pread(fd, &retval, 2, cmd) == 2) { - retval = bswap_16(retval); - } else { - retval = 0; - } - if (fd > 0) { - close(fd); - } - return retval; -} - -static long pci_config_read_byte( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - long retval; - char path[100]; - int fd; - sprintf(path,"/proc/bus/pci/%02d/%02x.0", bus, dev); - fd = open(path,O_RDONLY|O_SYNC); - if (fd == -1) { - retval=0; - } - else if (pread(fd, &retval, 1, cmd) != 1) { - retval = 0; - } - if (fd > 0) { - close(fd); - } - return retval; -} - -static void pci_config_write_long( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - char path[100]; - int fd; - val = bswap_32(val); - sprintf(path,"/proc/bus/pci/%02d/%02x.0", bus, dev); - fd = open(path,O_RDONLY|O_SYNC); - if (fd > 0) { - pwrite(fd, &val, 4, cmd); - close(fd); - } -} - -static void pci_config_write_word( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - char path[100]; - int fd; - val = bswap_16(val); - sprintf(path,"/proc/bus/pci/%02d/%02x.0", bus, dev); - fd = open(path,O_RDONLY|O_SYNC); - if (fd > 0) { - pwrite(fd, &val, 2, cmd); - close(fd); - } -} - -static void pci_config_write_byte( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - char path[100]; - int fd; - sprintf(path,"/proc/bus/pci/%02d/%02x.0", bus, dev); - fd = open(path,O_RDONLY|O_SYNC); - if (fd > 0) { - pwrite(fd, &val, 1, cmd); - close(fd); - } -} -#else -static long pci_config_read_long( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - long retval; - pciconfig_read(bus, dev<<3, cmd, 4, &retval); - return retval; -} - -static long pci_config_read_word( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - long retval; - pciconfig_read(bus, dev<<3, cmd, 2, &retval); - return retval; -} - -static long pci_config_read_byte( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - long retval; - pciconfig_read(bus, dev<<3, cmd, 1, &retval); - return retval; -} - -static void pci_config_write_long( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - long retval; - pciconfig_write(bus, dev<<3, cmd, 4, val); - return retval; -} - -static void pci_config_write_word( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - long retval; - pciconfig_write(bus, dev<<3, cmd, 2, val); - return retval; -} - -static void pci_config_write_byte( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - long retval; - pciconfig_write(bus, dev<<3, cmd, 1, val); - return retval; -} -#endif diff --git a/src/video_out/libdha/sysdep/pci_sco.c b/src/video_out/libdha/sysdep/pci_sco.c deleted file mode 100644 index 9cb2282ad..000000000 --- a/src/video_out/libdha/sysdep/pci_sco.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ - Modified for readability by Nick Kurshev -*/ -#include <sys/console.h> -#include <sys/param.h> -#include <sys/immu.h> -#include <sys/region.h> -#include <sys/proc.h> -#include <sys/tss.h> -#include <sys/sysi86.h> -#include <sys/v86.h> - -static __inline__ int enable_os_io(void) -{ -#if defined(SI86IOPL) - sysi86(SI86IOPL, 3); -#else - sysi86(SI86V86, V86SC_IOPL, PS_IOPL); -#endif - return(0); -} - -static __inline__ int disable_os_io(void) -{ -#if defined(SI86IOPL) - sysi86(SI86IOPL, 0); -#else - sysi86(SI86V86, V86SC_IOPL, 0); -#endif - return(0); -} diff --git a/src/video_out/libdha/sysdep/pci_sparc.c b/src/video_out/libdha/sysdep/pci_sparc.c deleted file mode 100644 index ef2074ab2..000000000 --- a/src/video_out/libdha/sysdep/pci_sparc.c +++ /dev/null @@ -1,123 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ - Modified for readability by Nick Kurshev -*/ - -static int pci_config_type( void ) -{ - unsigned long tmplong1, tmplong2; - unsigned char tmp1, tmp2; - int retval; - retval = 0; - - OUTPORT8(PCI_MODE2_ENABLE_REG, 0x00); - OUTPORT8(PCI_MODE2_FORWARD_REG, 0x00); - tmp1 = INPORT8(PCI_MODE2_ENABLE_REG); - tmp2 = INPORT8(PCI_MODE2_FORWARD_REG); - if ((tmp1 == 0x00) && (tmp2 == 0x00)) { - retval = 2; - /*printf("PCI says configuration type 2\n");*/ - } else { - tmplong1 = INPORT32(PCI_MODE1_ADDRESS_REG); - OUTPORT32(PCI_MODE1_ADDRESS_REG, PCI_EN); - tmplong2 = INPORT32(PCI_MODE1_ADDRESS_REG); - OUTPORT32(PCI_MODE1_ADDRESS_REG, tmplong1); - if (tmplong2 == PCI_EN) { - retval = 1; - /*printf("PCI says configuration type 1\n");*/ - } else { - /*printf("No PCI !\n");*/ - disable_app_io(); - /*exit(1);*/ - retval = 0xFFFF; - } - } - return retval; -} - -static int pci_get_vendor( - unsigned char bus, - unsigned char dev, - int func) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd); - return INPORT32(PCI_MODE1_DATA_REG); -} - -static long pci_config_read_long( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - return INPORT32(PCI_MODE1_DATA_REG); -} - -static long pci_config_read_word( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - return INPORT16(PCI_MODE1_DATA_REG); -} - -static long pci_config_read_byte( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - return INPORT8(PCI_MODE1_DATA_REG); -} - -static void pci_config_write_long( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - OUTPORT32(PCI_MODE1_DATA_REG,val); -} - -static void pci_config_write_word( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - OUTPORT16(PCI_MODE1_DATA_REG,val); -} - -static void pci_config_write_byte( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - OUTPORT8(PCI_MODE1_DATA_REG,val); -} diff --git a/src/video_out/libdha/sysdep/pci_svr4.c b/src/video_out/libdha/sysdep/pci_svr4.c deleted file mode 100644 index bcce5c901..000000000 --- a/src/video_out/libdha/sysdep/pci_svr4.c +++ /dev/null @@ -1,42 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ - Modified for readability by Nick Kurshev -*/ -#include <sys/types.h> -#include <sys/proc.h> -#include <sys/tss.h> -#if defined(NCR) -#define __STDC -#include <sys/sysi86.h> -#undef __STDC -#else -#include <sys/sysi86.h> -#endif - -#if defined(sun) -# ifndef __EXTENSIONS__ -# define __EXTENSIONS__ -# endif -# include <sys/psw.h> -#endif - -static __inline__ int enable_os_io(void) -{ -#if defined(SI86IOPL) - sysi86(SI86IOPL, 3); -#else - sysi86(SI86V86, V86SC_IOPL, PS_IOPL); -#endif - return(0); -} - -static __inline__ int disable_os_io(void) -{ -#if defined(SI86IOPL) - sysi86(SI86IOPL, 0); -#else - sysi86(SI86V86, V86SC_IOPL, 0); -#endif - return(0); -} diff --git a/src/video_out/libdha/sysdep/pci_win32.c b/src/video_out/libdha/sysdep/pci_win32.c deleted file mode 100644 index 1c88cb13e..000000000 --- a/src/video_out/libdha/sysdep/pci_win32.c +++ /dev/null @@ -1,18 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ - Modified for readability by Nick Kurshev -*/ -#include <windows.h> - -/* Nothing to do for Win9x. For WinNT I have no solution */ - -static __inline__ int enable_os_io(void) -{ - return(0); -} - -static __inline__ int disable_os_io(void) -{ - return(0); -} diff --git a/src/video_out/libdha/sysdep/pci_x86.c b/src/video_out/libdha/sysdep/pci_x86.c deleted file mode 100644 index ef2074ab2..000000000 --- a/src/video_out/libdha/sysdep/pci_x86.c +++ /dev/null @@ -1,123 +0,0 @@ -/* - This file is based on: - $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $ - Modified for readability by Nick Kurshev -*/ - -static int pci_config_type( void ) -{ - unsigned long tmplong1, tmplong2; - unsigned char tmp1, tmp2; - int retval; - retval = 0; - - OUTPORT8(PCI_MODE2_ENABLE_REG, 0x00); - OUTPORT8(PCI_MODE2_FORWARD_REG, 0x00); - tmp1 = INPORT8(PCI_MODE2_ENABLE_REG); - tmp2 = INPORT8(PCI_MODE2_FORWARD_REG); - if ((tmp1 == 0x00) && (tmp2 == 0x00)) { - retval = 2; - /*printf("PCI says configuration type 2\n");*/ - } else { - tmplong1 = INPORT32(PCI_MODE1_ADDRESS_REG); - OUTPORT32(PCI_MODE1_ADDRESS_REG, PCI_EN); - tmplong2 = INPORT32(PCI_MODE1_ADDRESS_REG); - OUTPORT32(PCI_MODE1_ADDRESS_REG, tmplong1); - if (tmplong2 == PCI_EN) { - retval = 1; - /*printf("PCI says configuration type 1\n");*/ - } else { - /*printf("No PCI !\n");*/ - disable_app_io(); - /*exit(1);*/ - retval = 0xFFFF; - } - } - return retval; -} - -static int pci_get_vendor( - unsigned char bus, - unsigned char dev, - int func) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd); - return INPORT32(PCI_MODE1_DATA_REG); -} - -static long pci_config_read_long( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - return INPORT32(PCI_MODE1_DATA_REG); -} - -static long pci_config_read_word( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - return INPORT16(PCI_MODE1_DATA_REG); -} - -static long pci_config_read_byte( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - return INPORT8(PCI_MODE1_DATA_REG); -} - -static void pci_config_write_long( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - OUTPORT32(PCI_MODE1_DATA_REG,val); -} - -static void pci_config_write_word( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - OUTPORT16(PCI_MODE1_DATA_REG,val); -} - -static void pci_config_write_byte( - unsigned char bus, - unsigned char dev, - int func, - unsigned cmd, - long val) -{ - unsigned long config_cmd; - config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8); - OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd); - OUTPORT8(PCI_MODE1_DATA_REG,val); -} diff --git a/src/video_out/libdha/test.c b/src/video_out/libdha/test.c deleted file mode 100644 index 857e739c6..000000000 --- a/src/video_out/libdha/test.c +++ /dev/null @@ -1,48 +0,0 @@ -#include "libdha.h" -#include "pci_names.h" -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <inttypes.h> /* for __WORDSIZE */ - -int main( void ) -{ - pciinfo_t lst[MAX_PCI_DEVICES]; - unsigned i,num_pci; - int err; - err = pci_scan(lst,&num_pci); - if(err) - { - printf("Error occured during pci scan: %s\n",strerror(err)); - return EXIT_FAILURE; - } - else - { - printf(" Bus:card:func vend:dev base0 :base1 :base2 :baserom :irq:pin:gnt:lat\n"); - for(i=0;i<num_pci;i++) -#if __WORDSIZE > 32 - printf("%04X:%04X:%04X %04X:%04X %16X:%16X:%16X:%16X:%02X :%02X :%02X :%02X\n" -#else - printf("%04X:%04X:%04X %04X:%04X %08X:%08X:%08X:%08X:%02X :%02X :%02X :%02X\n" -#endif - ,lst[i].bus,lst[i].card,lst[i].func - ,lst[i].vendor,lst[i].device - ,lst[i].base0,lst[i].base1,lst[i].base2,lst[i].baserom - ,lst[i].irq,lst[i].ipin,lst[i].gnt,lst[i].lat); - printf("Additional info:\n"); - printf("================\n"); - printf("base3 :base4 :base5 :name (vendor)\n"); - for(i=0;i<num_pci;i++) - { - const char *vname,*dname; - dname = pci_device_name(lst[i].vendor,lst[i].device); - dname = dname ? dname : "Unknown chip"; - vname = pci_vendor_name(lst[i].vendor); - vname = vname ? vname : "Unknown chip"; - printf("%08X:%08X:%08X:%s (%s)\n" - ,lst[i].base3,lst[i].base4,lst[i].base5 - ,dname,vname); - } - } - return EXIT_SUCCESS; -} diff --git a/src/video_out/video_out_xcbxv.c b/src/video_out/video_out_xcbxv.c index 36d6de7a7..baeeaea8d 100644 --- a/src/video_out/video_out_xcbxv.c +++ b/src/video_out/video_out_xcbxv.c @@ -63,7 +63,6 @@ #include "video_out.h" #include "xine_internal.h" /* #include "overlay.h" */ -#include "deinterlace.h" #include "xineutils.h" #include "vo_scale.h" #include "xcbosd.h" @@ -132,10 +131,6 @@ struct xv_driver_s { /* all scaling information goes here */ vo_scale_t sc; - xv_frame_t deinterlace_frame; - int deinterlace_method; - int deinterlace_enabled; - int use_colorkey; uint32_t colorkey; @@ -405,117 +400,6 @@ static void xv_update_frame_format (vo_driver_t *this_gen, frame->ratio = ratio; } -#define DEINTERLACE_CROMA -static void xv_deinterlace_frame (xv_driver_t *this) { - uint8_t *recent_bitmaps[VO_NUM_RECENT_FRAMES]; - xv_frame_t *frame = this->recent_frames[0]; - int i; - int xvscaling; - - xvscaling = (this->deinterlace_method == DEINTERLACE_ONEFIELDXV) ? 2 : 1; - - if (!this->deinterlace_frame.image - || (frame->width != this->deinterlace_frame.width) - || (frame->height != this->deinterlace_frame.height ) - || (frame->format != this->deinterlace_frame.format) - || (frame->ratio != this->deinterlace_frame.ratio)) { - pthread_mutex_lock(&this->main_mutex); - - if(this->deinterlace_frame.image) - dispose_ximage(this, &this->deinterlace_frame); - - create_ximage(this, &this->deinterlace_frame, frame->width, frame->height / xvscaling, frame->format); - this->deinterlace_frame.width = frame->width; - this->deinterlace_frame.height = frame->height; - this->deinterlace_frame.format = frame->format; - this->deinterlace_frame.ratio = frame->ratio; - - pthread_mutex_unlock(&this->main_mutex); - } - - - if ( this->deinterlace_method != DEINTERLACE_ONEFIELDXV ) { -#ifdef DEINTERLACE_CROMA - - /* I don't think this is the right way to do it (deinterlacing croma by croma info). - DScaler deinterlaces croma together with luma, but it's easier for them because - they have that components 1:1 at the same table. - */ - for( i = 0; i < VO_NUM_RECENT_FRAMES; i++ ) - if( this->recent_frames[i] && this->recent_frames[i]->width == frame->width && - this->recent_frames[i]->height == frame->height ) - recent_bitmaps[i] = this->recent_frames[i]->image + frame->width*frame->height; - else - recent_bitmaps[i] = NULL; - - deinterlace_yuv( this->deinterlace_frame.image+frame->width*frame->height, - recent_bitmaps, frame->width/2, frame->height/2, this->deinterlace_method ); - for( i = 0; i < VO_NUM_RECENT_FRAMES; i++ ) - if( this->recent_frames[i] && this->recent_frames[i]->width == frame->width && - this->recent_frames[i]->height == frame->height ) - recent_bitmaps[i] = this->recent_frames[i]->image + frame->width*frame->height*5/4; - else - recent_bitmaps[i] = NULL; - - deinterlace_yuv( this->deinterlace_frame.image+frame->width*frame->height*5/4, - recent_bitmaps, frame->width/2, frame->height/2, this->deinterlace_method ); - -#else - - /* know bug: we are not deinterlacing Cb and Cr */ - xine_fast_memcpy(this->deinterlace_frame.image + frame->width*frame->height, - frame->image + frame->width*frame->height, - frame->width*frame->height*1/2); - -#endif - - for( i = 0; i < VO_NUM_RECENT_FRAMES; i++ ) - if( this->recent_frames[i] && this->recent_frames[i]->width == frame->width && - this->recent_frames[i]->height == frame->height ) - recent_bitmaps[i] = this->recent_frames[i]->image; - else - recent_bitmaps[i] = NULL; - - deinterlace_yuv( this->deinterlace_frame.image, recent_bitmaps, - frame->width, frame->height, this->deinterlace_method ); - } - else { - /* - dirty and cheap deinterlace method: we give half of the lines to xv - driver and let it scale for us. - note that memcpy's below don't seem to impact much on performance, - specially when fast memcpys are available. - */ - uint8_t *dst, *src; - - dst = this->deinterlace_frame.image; - src = this->recent_frames[0]->image; - for( i = 0; i < frame->height; i+=2 ) { - xine_fast_memcpy(dst,src,frame->width); - dst += frame->width; - src += 2 * frame->width; - } - - dst = this->deinterlace_frame.image + frame->width * frame->height / 2; - src = this->recent_frames[0]->image + frame->width * frame->height; - for( i = 0; i < frame->height; i+=4 ) { - xine_fast_memcpy(dst,src,frame->width / 2); - dst += frame->width / 2; - src += frame->width; - } - - dst = this->deinterlace_frame.image + frame->width * frame->height * 5 / 8; - src = this->recent_frames[0]->image + frame->width * frame->height * 5 / 4; - for( i = 0; i < frame->height; i+=4 ) { - xine_fast_memcpy(dst,src,frame->width / 2); - dst += frame->width / 2; - src += frame->width; - } - } - - this->cur_frame = &this->deinterlace_frame; -} - static void xv_clean_output_area (xv_driver_t *this) { int i; xcb_rectangle_t rects[4]; @@ -570,14 +454,6 @@ static void xv_compute_ideal_size (xv_driver_t *this) { static void xv_compute_output_size (xv_driver_t *this) { _x_vo_scale_compute_output_size( &this->sc ); - - /* onefield_xv divide by 2 the number of lines */ - if (this->deinterlace_enabled - && (this->deinterlace_method == DEINTERLACE_ONEFIELDXV) - && this->cur_frame && (this->cur_frame->format == XINE_IMGFMT_YV12)) { - this->sc.displayed_height = this->sc.displayed_height / 2 - 1; - this->sc.displayed_yoffset = this->sc.displayed_yoffset / 2; - } } static void xv_overlay_begin (vo_driver_t *this_gen, @@ -721,17 +597,6 @@ static void xv_display_frame (vo_driver_t *this_gen, vo_frame_t *frame_gen) { } /* - * deinterlace frame if necessary - * (currently only working for YUV images) - */ - - if (this->deinterlace_enabled && this->deinterlace_method - && frame->format == XINE_IMGFMT_YV12 - && (deinterlace_yuv_supported( this->deinterlace_method ) == 1 - || this->deinterlace_method == DEINTERLACE_ONEFIELDXV)) - xv_deinterlace_frame (this); - - /* * tell gui that we are about to display a frame, * ask for offset and output size */ @@ -825,18 +690,6 @@ static int xv_set_property (vo_driver_t *this_gen, } else { switch (property) { - - case VO_PROP_INTERLACED: - this->props[property].value = value; - xprintf(this->xine, XINE_VERBOSITY_LOG, - LOG_MODULE ": VO_PROP_INTERLACED(%d)\n", this->props[property].value); - this->deinterlace_enabled = value; - if (this->deinterlace_method == DEINTERLACE_ONEFIELDXV) { - xv_compute_ideal_size (this); - xv_compute_output_size (this); - } - break; - case VO_PROP_ASPECT_RATIO: if (value>=XINE_VO_ASPECT_NUM_RATIOS) value = XINE_VO_ASPECT_AUTO; @@ -981,15 +834,6 @@ static int xv_gui_data_exchange (vo_driver_t *this_gen, rect->y = y1; rect->w = x2-x1; rect->h = y2-y1; - - /* onefield_xv divide by 2 the number of lines */ - if (this->deinterlace_enabled - && (this->deinterlace_method == DEINTERLACE_ONEFIELDXV) - && (this->cur_frame->format == XINE_IMGFMT_YV12)) { - rect->y = rect->y * 2; - rect->h = rect->h * 2; - } - } break; @@ -1059,12 +903,6 @@ static void xv_dispose (vo_driver_t *this_gen) { /* restore port attributes to their initial values */ xv_restore_port_attributes(this); - - if (this->deinterlace_frame.image) { - pthread_mutex_lock(&this->main_mutex); - dispose_ximage(this, &this->deinterlace_frame); - pthread_mutex_unlock(&this->main_mutex); - } pthread_mutex_lock(&this->main_mutex); xcb_xv_ungrab_port(this->connection, this->xv_port, XCB_CURRENT_TIME); @@ -1196,13 +1034,6 @@ static void xv_check_capability (xv_driver_t *this, } } else this->props[property].value = int_default; - -} - -static void xv_update_deinterlace(void *this_gen, xine_cfg_entry_t *entry) { - xv_driver_t *this = (xv_driver_t *) this_gen; - - this->deinterlace_method = entry->num_value; } static void xv_update_XV_FILTER(void *this_gen, xine_cfg_entry_t *entry) { @@ -1356,8 +1187,6 @@ static vo_driver_t *open_plugin(video_driver_class_t *class_gen, const void *vis xcb_create_gc(this->connection, this->gc, this->window, 0, NULL); this->capabilities = VO_CAP_CROP; this->use_shm = 1; - this->deinterlace_method = 0; - this->deinterlace_frame.image = NULL; this->use_colorkey = 0; this->colorkey = 0; this->xoverlay = NULL; @@ -1391,7 +1220,6 @@ static vo_driver_t *open_plugin(video_driver_class_t *class_gen, const void *vis this->props[i].this = this; } - this->props[VO_PROP_INTERLACED].value = 0; this->sc.user_ratio = this->props[VO_PROP_ASPECT_RATIO].value = XINE_VO_ASPECT_AUTO; this->props[VO_PROP_ZOOM_X].value = 100; @@ -1527,39 +1355,6 @@ static vo_driver_t *open_plugin(video_driver_class_t *class_gen, const void *vis _("Some buggy video drivers need a workaround to function properly."), 10, xv_update_xv_pitch_alignment, this); - this->deinterlace_method = - config->register_enum (config, "video.output.xv_deinterlace_method", 4, - deinterlace_methods, - _("deinterlace method (deprecated)"), - _("This config setting is deprecated. You should use the new deinterlacing " - "post processing settings instead.\n\n" - "From the old days of analog television, where the even and odd numbered " - "lines of a video frame would be displayed at different times comes the " - "idea to increase motion smoothness by also recording the lines at " - "different times. This is called \"interlacing\". But unfortunately, " - "todays displays show the even and odd numbered lines as one complete frame " - "all at the same time (called \"progressive display\"), which results in " - "ugly frame errors known as comb artifacts. Software deinterlacing is an " - "approach to reduce these artifacts. The individual values are:\n\n" - "none\n" - "Disables software deinterlacing.\n\n" - "bob\n" - "Interpolates between the lines for moving parts of the image.\n\n" - "weave\n" - "Similar to bob, but with a tendency to preserve the full resolution, " - "better for high detail in low movement scenes.\n\n" - "greedy\n" - "Very good adaptive deinterlacer, but needs a lot of CPU power.\n\n" - "onefield\n" - "Always interpolates and reduces vertical resolution.\n\n" - "onefieldxv\n" - "Same as onefield, but does the interpolation in hardware.\n\n" - "linearblend\n" - "Applies a slight vertical blur to remove the comb artifacts. Good results " - "with medium CPU usage."), - 10, xv_update_deinterlace, this); - this->deinterlace_enabled = 0; - if(this->use_colorkey==1) { this->xoverlay = xcbosd_create(this->xine, this->connection, this->screen, this->window, XCBOSD_COLORKEY); diff --git a/src/video_out/video_out_xv.c b/src/video_out/video_out_xv.c index 4338246ae..894192c6b 100644 --- a/src/video_out/video_out_xv.c +++ b/src/video_out/video_out_xv.c @@ -68,7 +68,6 @@ #include "video_out.h" #include "xine_internal.h" /* #include "overlay.h" */ -#include "deinterlace.h" #include "xineutils.h" #include "vo_scale.h" #include "x11osd.h" @@ -137,10 +136,6 @@ struct xv_driver_s { /* all scaling information goes here */ vo_scale_t sc; - xv_frame_t deinterlace_frame; - int deinterlace_method; - int deinterlace_enabled; - int use_colorkey; uint32_t colorkey; @@ -490,120 +485,6 @@ static void xv_update_frame_format (vo_driver_t *this_gen, frame->ratio = ratio; } -#define DEINTERLACE_CROMA -static void xv_deinterlace_frame (xv_driver_t *this) { - uint8_t *recent_bitmaps[VO_NUM_RECENT_FRAMES]; - xv_frame_t *frame = this->recent_frames[0]; - int i; - int xvscaling; - - xvscaling = (this->deinterlace_method == DEINTERLACE_ONEFIELDXV) ? 2 : 1; - - if (!this->deinterlace_frame.image - || (frame->width != this->deinterlace_frame.width) - || (frame->height != this->deinterlace_frame.height ) - || (frame->format != this->deinterlace_frame.format) - || (frame->ratio != this->deinterlace_frame.ratio)) { - LOCK_DISPLAY(this); - - if(this->deinterlace_frame.image) - dispose_ximage (this, &this->deinterlace_frame.shminfo, - this->deinterlace_frame.image); - - this->deinterlace_frame.image = create_ximage (this, &this->deinterlace_frame.shminfo, - frame->width,frame->height / xvscaling, - frame->format); - this->deinterlace_frame.width = frame->width; - this->deinterlace_frame.height = frame->height; - this->deinterlace_frame.format = frame->format; - this->deinterlace_frame.ratio = frame->ratio; - - UNLOCK_DISPLAY(this); - } - - - if ( this->deinterlace_method != DEINTERLACE_ONEFIELDXV ) { -#ifdef DEINTERLACE_CROMA - - /* I don't think this is the right way to do it (deinterlacing croma by croma info). - DScaler deinterlaces croma together with luma, but it's easier for them because - they have that components 1:1 at the same table. - */ - for( i = 0; i < VO_NUM_RECENT_FRAMES; i++ ) - if( this->recent_frames[i] && this->recent_frames[i]->width == frame->width && - this->recent_frames[i]->height == frame->height ) - recent_bitmaps[i] = this->recent_frames[i]->image->data + frame->width*frame->height; - else - recent_bitmaps[i] = NULL; - - deinterlace_yuv( this->deinterlace_frame.image->data+this->deinterlace_frame.image->width*frame->height, - recent_bitmaps, this->deinterlace_frame.image->width/2, frame->height/2, this->deinterlace_method ); - for( i = 0; i < VO_NUM_RECENT_FRAMES; i++ ) - if( this->recent_frames[i] && this->recent_frames[i]->width == frame->width && - this->recent_frames[i]->height == frame->height ) - recent_bitmaps[i] = this->recent_frames[i]->image->data + this->deinterlace_frame.image->width*frame->height*5/4; - else - recent_bitmaps[i] = NULL; - - deinterlace_yuv( this->deinterlace_frame.image->data+this->deinterlace_frame.image->width*frame->height*5/4, - recent_bitmaps, this->deinterlace_frame.image->width/2, frame->height/2, this->deinterlace_method ); - -#else - - /* know bug: we are not deinterlacing Cb and Cr */ - xine_fast_memcpy(this->deinterlace_frame.image->data + frame->width*frame->height, - frame->image->data + frame->width*frame->height, - frame->width*frame->height*1/2); - -#endif - - for( i = 0; i < VO_NUM_RECENT_FRAMES; i++ ) - if( this->recent_frames[i] && this->recent_frames[i]->width == frame->width && - this->recent_frames[i]->height == frame->height ) - recent_bitmaps[i] = this->recent_frames[i]->image->data; - else - recent_bitmaps[i] = NULL; - - deinterlace_yuv( this->deinterlace_frame.image->data, recent_bitmaps, - this->deinterlace_frame.image->width, frame->height, this->deinterlace_method ); - } - else { - /* - dirty and cheap deinterlace method: we give half of the lines to xv - driver and let it scale for us. - note that memcpy's below don't seem to impact much on performance, - specially when fast memcpys are available. - */ - uint8_t *dst, *src; - - dst = this->deinterlace_frame.image->data; - src = this->recent_frames[0]->image->data; - for( i = 0; i < frame->height; i+=2 ) { - xine_fast_memcpy(dst,src,frame->width); - dst += frame->width; - src += 2 * frame->width; - } - - dst = this->deinterlace_frame.image->data + frame->width * frame->height / 2; - src = this->recent_frames[0]->image->data + frame->width * frame->height; - for( i = 0; i < frame->height; i+=4 ) { - xine_fast_memcpy(dst,src,frame->width / 2); - dst += frame->width / 2; - src += frame->width; - } - - dst = this->deinterlace_frame.image->data + frame->width * frame->height * 5 / 8; - src = this->recent_frames[0]->image->data + frame->width * frame->height * 5 / 4; - for( i = 0; i < frame->height; i+=4 ) { - xine_fast_memcpy(dst,src,frame->width / 2); - dst += frame->width / 2; - src += frame->width; - } - } - - this->cur_frame = &this->deinterlace_frame; -} - static void xv_clean_output_area (xv_driver_t *this) { int i; @@ -651,14 +532,6 @@ static void xv_compute_ideal_size (xv_driver_t *this) { static void xv_compute_output_size (xv_driver_t *this) { _x_vo_scale_compute_output_size( &this->sc ); - - /* onefield_xv divide by 2 the number of lines */ - if (this->deinterlace_enabled - && (this->deinterlace_method == DEINTERLACE_ONEFIELDXV) - && this->cur_frame && (this->cur_frame->format == XINE_IMGFMT_YV12)) { - this->sc.displayed_height = this->sc.displayed_height / 2 - 1; - this->sc.displayed_yoffset = this->sc.displayed_yoffset / 2; - } } static void xv_overlay_begin (vo_driver_t *this_gen, @@ -812,17 +685,6 @@ static void xv_display_frame (vo_driver_t *this_gen, vo_frame_t *frame_gen) { } /* - * deinterlace frame if necessary - * (currently only working for YUV images) - */ - - if (this->deinterlace_enabled && this->deinterlace_method - && frame->format == XINE_IMGFMT_YV12 - && (deinterlace_yuv_supported( this->deinterlace_method ) == 1 - || this->deinterlace_method == DEINTERLACE_ONEFIELDXV)) - xv_deinterlace_frame (this); - - /* * tell gui that we are about to display a frame, * ask for offset and output size */ @@ -926,17 +788,6 @@ static int xv_set_property (vo_driver_t *this_gen, else { switch (property) { - case VO_PROP_INTERLACED: - this->props[property].value = value; - xprintf(this->xine, XINE_VERBOSITY_LOG, - LOG_MODULE ": VO_PROP_INTERLACED(%d)\n", this->props[property].value); - this->deinterlace_enabled = value; - if (this->deinterlace_method == DEINTERLACE_ONEFIELDXV) { - xv_compute_ideal_size (this); - xv_compute_output_size (this); - } - break; - case VO_PROP_ASPECT_RATIO: if (value>=XINE_VO_ASPECT_NUM_RATIOS) value = XINE_VO_ASPECT_AUTO; @@ -1070,15 +921,6 @@ static int xv_gui_data_exchange (vo_driver_t *this_gen, rect->y = y1; rect->w = x2-x1; rect->h = y2-y1; - - /* onefield_xv divide by 2 the number of lines */ - if (this->deinterlace_enabled - && (this->deinterlace_method == DEINTERLACE_ONEFIELDXV) - && (this->cur_frame->format == XINE_IMGFMT_YV12)) { - rect->y = rect->y * 2; - rect->h = rect->h * 2; - } - } break; @@ -1134,14 +976,6 @@ static void xv_dispose (vo_driver_t *this_gen) { /* restore port attributes to their initial values */ xv_restore_port_attributes(this); - - if (this->deinterlace_frame.image) { - LOCK_DISPLAY(this); - dispose_ximage (this, &this->deinterlace_frame.shminfo, - this->deinterlace_frame.image); - UNLOCK_DISPLAY(this); - this->deinterlace_frame.image = NULL; - } LOCK_DISPLAY(this); if(XvUngrabPort (this->display, this->xv_port, CurrentTime) != Success) { @@ -1257,13 +1091,6 @@ static void xv_check_capability (xv_driver_t *this, } } else this->props[property].value = int_default; - -} - -static void xv_update_deinterlace(void *this_gen, xine_cfg_entry_t *entry) { - xv_driver_t *this = (xv_driver_t *) this_gen; - - this->deinterlace_method = entry->num_value; } static void xv_update_XV_FILTER(void *this_gen, xine_cfg_entry_t *entry) { @@ -1409,8 +1236,6 @@ static vo_driver_t *open_plugin_2 (video_driver_class_t *class_gen, const void * UNLOCK_DISPLAY(this); this->capabilities = VO_CAP_CROP; this->use_shm = 1; - this->deinterlace_method = 0; - this->deinterlace_frame.image = NULL; this->use_colorkey = 0; this->colorkey = 0; this->xoverlay = NULL; @@ -1451,7 +1276,6 @@ static vo_driver_t *open_plugin_2 (video_driver_class_t *class_gen, const void * this->props[i].this = this; } - this->props[VO_PROP_INTERLACED].value = 0; this->sc.user_ratio = this->props[VO_PROP_ASPECT_RATIO].value = XINE_VO_ASPECT_AUTO; this->props[VO_PROP_ZOOM_X].value = 100; @@ -1597,39 +1421,6 @@ static vo_driver_t *open_plugin_2 (video_driver_class_t *class_gen, const void * _("Some buggy video drivers need a workaround to function properly."), 10, xv_update_xv_pitch_alignment, this); - this->deinterlace_method = - config->register_enum (config, "video.output.xv_deinterlace_method", 4, - deinterlace_methods, - _("deinterlace method (deprecated)"), - _("This config setting is deprecated. You should use the new deinterlacing " - "post processing settings instead.\n\n" - "From the old days of analog television, where the even and odd numbered " - "lines of a video frame would be displayed at different times comes the " - "idea to increase motion smoothness by also recording the lines at " - "different times. This is called \"interlacing\". But unfortunately, " - "todays displays show the even and odd numbered lines as one complete frame " - "all at the same time (called \"progressive display\"), which results in " - "ugly frame errors known as comb artifacts. Software deinterlacing is an " - "approach to reduce these artifacts. The individual values are:\n\n" - "none\n" - "Disables software deinterlacing.\n\n" - "bob\n" - "Interpolates between the lines for moving parts of the image.\n\n" - "weave\n" - "Similar to bob, but with a tendency to preserve the full resolution, " - "better for high detail in low movement scenes.\n\n" - "greedy\n" - "Very good adaptive deinterlacer, but needs a lot of CPU power.\n\n" - "onefield\n" - "Always interpolates and reduces vertical resolution.\n\n" - "onefieldxv\n" - "Same as onefield, but does the interpolation in hardware.\n\n" - "linearblend\n" - "Applies a slight vertical blur to remove the comb artifacts. Good results " - "with medium CPU usage."), - 10, xv_update_deinterlace, this); - this->deinterlace_enabled = 0; - LOCK_DISPLAY(this); if(this->use_colorkey==1) { this->xoverlay = x11osd_create (this->xine, this->display, this->screen, diff --git a/src/video_out/video_out_xvmc.c b/src/video_out/video_out_xvmc.c index 53d09b7d5..8773c3dd2 100644 --- a/src/video_out/video_out_xvmc.c +++ b/src/video_out/video_out_xvmc.c @@ -72,9 +72,6 @@ #include "xine_internal.h" #include "accel_xvmc.h" -/* TODO - delete these? */ -#include "deinterlace.h" - #include "xineutils.h" #include "vo_scale.h" @@ -198,11 +195,6 @@ struct xvmc_driver_s { double ratio_factor; /* output frame must fullfill: height = width * ratio_factor */ - - xvmc_frame_t deinterlace_frame; - int deinterlace_method; - int deinterlace_enabled; - /* gui callback */ void (*frame_output_cb) (void *user_data, @@ -966,24 +958,13 @@ static void xvmc_display_frame (vo_driver_t *this_gen, vo_frame_t *frame_gen) { /* Make sure the surface has finished rendering before we display */ XvMCSyncSurface(this->display, &this->cur_frame->surface); - if (this->deinterlace_enabled && - (this->deinterlace_method == DEINTERLACE_ONEFIELD)) { - XvMCPutSurface(this->display, &this->cur_frame->surface, - this->drawable, - this->sc.displayed_xoffset, this->sc.displayed_yoffset, - this->sc.displayed_width, this->sc.displayed_height, - this->sc.output_xoffset, this->sc.output_yoffset, - this->sc.output_width, this->sc.output_height, - XVMC_TOP_FIELD); - } else { /* WEAVE */ - XvMCPutSurface(this->display, &this->cur_frame->surface, - this->drawable, - this->sc.displayed_xoffset, this->sc.displayed_yoffset, - this->sc.displayed_width, this->sc.displayed_height, - this->sc.output_xoffset, this->sc.output_yoffset, - this->sc.output_width, this->sc.output_height, - XVMC_FRAME_PICTURE); - } + XvMCPutSurface(this->display, &this->cur_frame->surface, + this->drawable, + this->sc.displayed_xoffset, this->sc.displayed_yoffset, + this->sc.displayed_width, this->sc.displayed_height, + this->sc.output_xoffset, this->sc.output_yoffset, + this->sc.output_width, this->sc.output_height, + XVMC_FRAME_PICTURE); XUnlockDisplay (this->display); @@ -1047,16 +1028,6 @@ static int xvmc_set_property (vo_driver_t *this_gen, } else { switch (property) { - case VO_PROP_INTERLACED: - this->props[property].value = value; - lprintf("VO_PROP_INTERLACED(%d)\n", this->props[property].value); - this->deinterlace_enabled = value; - - if (this->deinterlace_method == DEINTERLACE_ONEFIELDXV) { - xvmc_compute_ideal_size (this); - } - break; - case VO_PROP_ASPECT_RATIO: if (value>=XINE_VO_ASPECT_NUM_RATIOS) value = XINE_VO_ASPECT_AUTO; @@ -1288,14 +1259,6 @@ static void xvmc_check_capability (xvmc_driver_t *this, this->props[property].value = int_default; } -static void xvmc_update_deinterlace(void *this_gen, xine_cfg_entry_t *entry) { - xvmc_driver_t *this = (xvmc_driver_t *) this_gen; - - lprintf ("xvmc_update_deinterlace method = %d\n",entry->num_value); - - this->deinterlace_method = entry->num_value; -} - static void xvmc_update_XV_DOUBLE_BUFFER(void *this_gen, xine_cfg_entry_t *entry) { xvmc_driver_t *this = (xvmc_driver_t *) this_gen; @@ -1366,7 +1329,6 @@ static vo_driver_t *open_plugin (video_driver_class_t *class_gen, const void *vi /* TODO CLEAN UP THIS */ this->user_data = visual->user_data; - this->deinterlace_method = 0; this->use_colorkey = 0; this->colorkey = 0; @@ -1517,65 +1479,6 @@ static vo_driver_t *open_plugin (video_driver_class_t *class_gen, const void *vi dispose_ximage (this, &myshminfo, myimage); XUnLockDisplay(this->display); */ - - this->deinterlace_method = - config->register_enum (config, "video.output.xv_deinterlace_method", 4, - deinterlace_methods, - _("deinterlace method (deprecated)"), - _("This config setting is deprecated. You should use the new deinterlacing " - "post processing settings instead.\n\n" - "From the old days of analog television, where the even and odd numbered " - "lines of a video frame would be displayed at different times comes the " - "idea to increase motion smoothness by also recording the lines at " - "different times. This is called \"interlacing\". But unfortunately, " - "todays displays show the even and odd numbered lines as one complete frame " - "all at the same time (called \"progressive display\"), which results in " - "ugly frame errors known as comb artifacts. Software deinterlacing is an " - "approach to reduce these artifacts. The individual values are:\n\n" - "none\n" - "Disables software deinterlacing.\n\n" - "bob\n" - "Interpolates between the lines for moving parts of the image.\n\n" - "weave\n" - "Similar to bob, but with a tendency to preserve the full resolution, " - "better for high detail in low movement scenes.\n\n" - "greedy\n" - "Very good adaptive deinterlacer, but needs a lot of CPU power.\n\n" - "onefield\n" - "Always interpolates and reduces vertical resolution.\n\n" - "onefieldxv\n" - "Same as onefield, but does the interpolation in hardware.\n\n" - "linearblend\n" - "Applies a slight vertical blur to remove the comb artifacts. Good results " - "with medium CPU usage."), - 10, xvmc_update_deinterlace, this); - - this->deinterlace_enabled = 1; /* default is enabled */ - lprintf("deinterlace_methods %d ",this->deinterlace_method); - - switch(this->deinterlace_method) { - case DEINTERLACE_NONE: - lprintf("NONE\n"); - break; - case DEINTERLACE_BOB: - lprintf("BOB\n"); - break; - case DEINTERLACE_WEAVE: - lprintf("WEAVE\n"); - break; - case DEINTERLACE_GREEDY: - lprintf("GREEDY\n"); - break; - case DEINTERLACE_ONEFIELD: - lprintf("ONEFIELD\n"); - break; - case DEINTERLACE_ONEFIELDXV: - lprintf("ONEFIELDXV\n"); - break; - case DEINTERLACE_LINEARBLEND: - lprintf("LINEARBLEND\n"); - break; - } lprintf("initialization of plugin successful\n"); return &this->vo_driver; diff --git a/src/video_out/vidix/Makefile.am b/src/video_out/vidix/Makefile.am deleted file mode 100644 index 7f19e7ce8..000000000 --- a/src/video_out/vidix/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -SUBDIRS = drivers - -AM_CFLAGS = $(DEFAULT_OCFLAGS) -AM_CPPFLAGS = -I$(top_srcdir)/src/video_out/vidix -I$(top_builddir)/src/video_out/libdha - -EXTRA_DIST = README vidix.txt - -noinst_HEADERS = fourcc.h vidix.h vidixlib.h - -noinst_LTLIBRARIES = libvidix.la - -libvidix_la_SOURCES = vidixlib.c -libvidix_la_LIBADD = $(DYNAMIC_LD_LIBS) $(top_builddir)/src/video_out/libdha/libdha.la - diff --git a/src/video_out/vidix/README b/src/video_out/vidix/README deleted file mode 100644 index 23bcaca30..000000000 --- a/src/video_out/vidix/README +++ /dev/null @@ -1,7 +0,0 @@ -VIDIX - Video Interface for *niX. -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -This library was designed and introduced as interface to userspace drivers -to provide DGA everywhere where it's possible (unline X11). -I hope that these drivers will be portable same as X11 (not only on *nix). - -For detail on how to develop new driver see vidix.txt diff --git a/src/video_out/vidix/drivers/Makefile.am b/src/video_out/vidix/drivers/Makefile.am deleted file mode 100644 index db3adc078..000000000 --- a/src/video_out/vidix/drivers/Makefile.am +++ /dev/null @@ -1,56 +0,0 @@ -include $(top_srcdir)/misc/Makefile.common - -AM_CFLAGS = $(DEFAULT_OCFLAGS) -AM_CPPFLAGS = -I$(top_srcdir)/src/video_out/vidix \ - -I$(top_srcdir)/src/video_out/libdha -I$(top_builddir)/src/video_out/libdha -AM_LDFLAGS = $(xineplug_ldflags) - -EXTRA_DIST = genfb_vid.c - -noinst_HEADERS = mach64.h glint_regs.h pm3_regs.h radeon.h savage_regs.h \ - cyberblade_regs.h unichrome_regs.h sis_defs.h sis_regs.h - -vidix_LTLIBRARIES = \ - mach64_vid.la \ - mga_crtc2_vid.la \ - mga_vid.la \ - pm2_vid.la \ - pm3_vid.la \ - radeon_vid.la \ - rage128_vid.la \ - cyberblade_vid.la \ - unichrome_vid.la \ - nvidia_vid.la \ - sis_vid.la \ - savage_vid.la - -cyberblade_vid_la_SOURCES = cyberblade_vid.c - -mach64_vid_la_SOURCES = mach64_vid.c - -mga_crtc2_vid_la_SOURCES = mga_vid.c -mga_crtc2_vid_la_LIBADD = -lm -mga_crtc2_vid_la_CPPFLAGS = $(AM_CPPFLAGS) -DCRTC2 - -mga_vid_la_SOURCES = mga_vid.c -mga_vid_la_LIBADD = -lm - -nvidia_vid_la_SOURCES = nvidia_vid.c - -pm2_vid_la_SOURCES = pm2_vid.c - -pm3_vid_la_SOURCES = pm3_vid.c - -radeon_vid_la_SOURCES = radeon_vid.c -radeon_vid_la_LIBADD = -lm - -rage128_vid_la_SOURCES = radeon_vid.c -rage128_vid_la_LIBADD = -lm -rage128_vid_la_CPPFLAGS = $(AM_CPPFLAGS) -DRAGE128 - -savage_vid_la_SOURCES = savage_vid.c -savage_vid_la_LIBADD = -lm - -sis_vid_la_SOURCES = sis_vid.c sis_bridge.c - -unichrome_vid_la_SOURCES = unichrome_vid.c diff --git a/src/video_out/vidix/drivers/cyberblade_regs.h b/src/video_out/vidix/drivers/cyberblade_regs.h deleted file mode 100644 index 1bae61d4a..000000000 --- a/src/video_out/vidix/drivers/cyberblade_regs.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright 1992-2000 by Alan Hourihane, Wigan, England. - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Alan Hourihane not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Alan Hourihane makes no representations - * about the suitability of this software for any purpose. It is provided - * "as is" without express or implied warranty. - * - * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - * - * Author: Alan Hourihane, alanh@fairlite.demon.co.uk - */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/trident/trident_regs.h,v 1.22 2002/01/11 13:06:30 alanh Exp $ */ - -#define DEBUG 1 - -#define NTSC 14.31818 -#define PAL 17.73448 - -/* General Registers */ -#define SPR 0x1F /* Software Programming Register (videoram) */ - -/* 3C4 */ -#define RevisionID 0x09 -#define ConfPort1 0x0C -#define ConfPort2 0x0C -#define NewMode2 0x0D -#define OldMode2 0x00 /* Should be 0x0D - dealt with in trident_dac.c */ -#define OldMode1 0x0E -#define NewMode1 0x0E -#define Protection 0x11 -#define MCLKLow 0x16 -#define MCLKHigh 0x17 -#define ClockLow 0x18 -#define ClockHigh 0x19 -#define SSetup 0x20 -#define SKey 0x37 -#define SPKey 0x57 - -/* 3x4 */ -#define Offset 0x13 -#define Underline 0x14 -#define CRTCMode 0x17 -#define CRTCModuleTest 0x1E -#define FIFOControl 0x20 -#define LinearAddReg 0x21 -#define DRAMTiming 0x23 -#define New32 0x23 -#define RAMDACTiming 0x25 -#define CRTHiOrd 0x27 -#define AddColReg 0x29 -#define InterfaceSel 0x2A -#define HorizOverflow 0x2B -#define GETest 0x2D -#define Performance 0x2F -#define GraphEngReg 0x36 -#define I2C 0x37 -#define PixelBusReg 0x38 -#define PCIReg 0x39 -#define DRAMControl 0x3A -#define MiscContReg 0x3C -#define CursorXLow 0x40 -#define CursorXHigh 0x41 -#define CursorYLow 0x42 -#define CursorYHigh 0x43 -#define CursorLocLow 0x44 -#define CursorLocHigh 0x45 -#define CursorXOffset 0x46 -#define CursorYOffset 0x47 -#define CursorFG1 0x48 -#define CursorFG2 0x49 -#define CursorFG3 0x4A -#define CursorFG4 0x4B -#define CursorBG1 0x4C -#define CursorBG2 0x4D -#define CursorBG3 0x4E -#define CursorBG4 0x4F -#define CursorControl 0x50 -#define PCIRetry 0x55 -#define PreEndControl 0x56 -#define PreEndFetch 0x57 -#define PCIMaster 0x60 -#define Enhancement0 0x62 -#define NewEDO 0x64 - -/* --- Additions by AMR for Vidix support --- */ -#define VideoWin1_HScale 0x80 -#define VideoWin1_VScale 0x82 -#define VideoWin1_Start 0x86 -#define VideoWin1_Stop 0x8a -#define Video_Flags 0x8e -#define VideoWin1_Y_BPR 0x90 -#define VideoWin1_Y_Offset 0x92 -#define Video_LineBufferThreshold 0x95 -#define Video_LineBufferLevel 0x96 -#define Video_Flags2 0x97 -/* --- */ - -#define TVinterface 0xC0 -#define TVMode 0xC1 -#define ClockControl 0xCF - - -/* 3CE */ -#define MiscExtFunc 0x0F -#define MiscIntContReg 0x2F -#define CyberControl 0x30 -#define CyberEnhance 0x31 -#define FPConfig 0x33 -#define VertStretch 0x52 -#define HorStretch 0x53 -#define BiosMode 0x5c -#define BiosNewMode1 0x5a -#define BiosNewMode2 0x5c -#define BiosReg 0x5d - -/* --- IO Macros by AMR --- */ - -#define CRINB(reg) (OUTPORT8(0x3d4,reg), INPORT8(0x3d5)) -#define SRINB(reg) (OUTPORT8(0x3c4,reg), INPORT8(0x3c5)) -#define CROUTB(reg,val) (OUTPORT8(0x3d4,reg), OUTPORT8(0x3d5,val)) -#define SROUTB(reg,val) (OUTPORT8(0x3c4,reg), OUTPORT8(0x3c5,val)) - -/* --- */ - - diff --git a/src/video_out/vidix/drivers/cyberblade_vid.c b/src/video_out/vidix/drivers/cyberblade_vid.c deleted file mode 100644 index 7a32ce7bd..000000000 --- a/src/video_out/vidix/drivers/cyberblade_vid.c +++ /dev/null @@ -1,649 +0,0 @@ -/* - Driver for CyberBlade/i1 - Version 0.1.4 - - Copyright (C) 2002 by Alastair M. Robinson. - Official homepage: http://www.blackfiveservices.co.uk/EPIAVidix.shtml - - Based on Permedia 3 driver by MÃ¥ns RullgÃ¥rd - - Thanks to Gilles Frattini for bugfixes - - 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 - - Changes: - 18/01/03 - MMIO is no longer used, sidestepping cache issues on EPIA-800 - TV-Out modes are now better supported - this should be the end - of the magenta stripes :) - Brightness/Contrast controls disabled for the time being - they were - seriously degrading picture quality, especially with TV-Out. - - To Do: - Implement Hue/Saturation controls - Support / Test multiple frames - Test colour-key code more extensively -*/ - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include <unistd.h> - -#include "vidix.h" -#include "fourcc.h" -#include "libdha.h" -#include "pci_ids.h" -#include "pci_names.h" - - -#include "cyberblade_regs.h" - -pciinfo_t pci_info; - -char save_colourkey[6]; -char *cyberblade_mem; - -#ifdef DEBUG_LOGFILE -FILE *logfile=0; -#define LOGWRITE(x) {if(logfile) fprintf(logfile,x);} -#else -#define LOGWRITE(x) -#endif - -/* Helper functions for reading registers. */ - -#if 0 /* unused */ -static int CRINW(int reg) -{ - int result; - result=CRINB(reg); - result|=CRINB(reg+1)<<8; - return(result); -} -#endif - -static void CROUTW(int reg,int val) -{ - CROUTB(reg,val&255); - CROUTB(reg+1,(val>>8)&255); -} - -#if 0 /* unused */ -static int SRINW(int reg) -{ - int result; - result=SRINB(reg); - result|=SRINB(reg+1)<<8; - return(result); -} -#endif - -static void SROUTW(int reg,int val) -{ - SROUTB(reg,val&255); - SROUTB(reg+1,(val>>8)&255); -} - -#if 0 /* unused */ -static void DumpRegisters(void) -{ -#ifdef DEBUG_LOGFILE - int reg,val; - if(logfile) - { - LOGWRITE("CRTC Register Dump:\n") - for(reg=0;reg<256;++reg) - { - val=CRINB(reg); - fprintf(logfile,"CR0x%2x: 0x%2x\n",reg,val); - } - LOGWRITE("SR Register Dump:\n") - for(reg=0;reg<256;++reg) - { - val=SRINB(reg); - fprintf(logfile,"SR0x%2x: 0x%2x\n",reg,val); - } - } -#endif -} -#endif - -/* --- */ - -static vidix_capability_t cyberblade_cap = -{ - "Trident CyberBlade i1 driver", - "Alastair M. Robinson <blackfive@fakenhamweb.co.uk>", - TYPE_OUTPUT, - { 0, 0, 0, 0 }, - 1024, - 1024, - 4, - 4, - -1, - FLAG_UPSCALER|FLAG_DOWNSCALER, - VENDOR_TRIDENT, - -1, - { 0, 0, 0, 0 } -}; - - -unsigned int vixGetVersion(void) -{ - return(VIDIX_VERSION); -} - - -static unsigned short cyberblade_card_ids[] = -{ - DEVICE_TRIDENT_CYBERBLADE_I7, - DEVICE_TRIDENT_CYBERBLADE_I7D, - DEVICE_TRIDENT_CYBERBLADE_I1, - DEVICE_TRIDENT_CYBERBLADE_I12, - DEVICE_TRIDENT_CYBERBLADE_I13, - DEVICE_TRIDENT_CYBERBLADE_XPAI1 -}; - - -static int find_chip(unsigned chip_id) -{ - unsigned i; - for(i = 0;i < sizeof(cyberblade_card_ids)/sizeof(unsigned short);i++) - { - if(chip_id == cyberblade_card_ids[i]) return i; - } - return -1; -} - -int vixProbe(int verbose, int force) -{ - pciinfo_t lst[MAX_PCI_DEVICES]; - unsigned i,num_pci; - int err; - err = pci_scan(lst,&num_pci); - if(err) - { - printf("[cyberblade] Error occurred during pci scan: %s\n",strerror(err)); - return err; - } - else - { - err = ENXIO; - for(i=0; i < num_pci; i++) - { - if(lst[i].vendor == VENDOR_TRIDENT) - { - int idx; - const char *dname; - idx = find_chip(lst[i].device); - if(idx == -1) - continue; - dname = pci_device_name(VENDOR_TRIDENT, lst[i].device); - dname = dname ? dname : "Unknown chip"; - printf("[cyberblade] Found chip: %s\n", dname); - cyberblade_cap.device_id = lst[i].device; - err = 0; - memcpy(&pci_info, &lst[i], sizeof(pciinfo_t)); - break; - } - } - } - - if(err && verbose) printf("[cyberblade] Can't find chip\n"); - return err; -} - - -int vixInit(const char *args) -{ - cyberblade_mem = map_phys_mem(pci_info.base0, 0x800000); - enable_app_io(); - save_colourkey[0]=SRINB(0x50); - save_colourkey[1]=SRINB(0x51); - save_colourkey[2]=SRINB(0x52); - save_colourkey[3]=SRINB(0x54); - save_colourkey[4]=SRINB(0x55); - save_colourkey[5]=SRINB(0x56); -#ifdef DEBUG_LOGFILE - logfile=fopen("/tmp/cyberblade_vidix.log","w"); -#endif - return 0; -} - -void vixDestroy(void) -{ - int protect; -#ifdef DEBUG_LOGFILE - if(logfile) - fclose(logfile); -#endif - protect=SRINB(0x11); - SROUTB(0x11, 0x92); - CROUTB(0x8E, 0xc4); /* Disable overlay */ - SROUTB(0x50,save_colourkey[0]); - SROUTB(0x51,save_colourkey[1]); - SROUTB(0x52,save_colourkey[2]); - SROUTB(0x54,save_colourkey[3]); - SROUTB(0x55,save_colourkey[4]); - SROUTB(0x56,save_colourkey[5]); - SROUTB(0x11, protect); - disable_app_io(); - unmap_phys_mem(cyberblade_mem, 0x800000); -} - - -int vixGetCapability(vidix_capability_t *to) -{ - memcpy(to, &cyberblade_cap, sizeof(vidix_capability_t)); - return 0; -} - - -static int is_supported_fourcc(uint32_t fourcc) -{ - switch(fourcc) - { - case IMGFMT_YUY2: - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_YVU9: - case IMGFMT_BGR16: - return 1; - default: - return 0; - } -} - -int vixQueryFourcc(vidix_fourcc_t *to) -{ - if(is_supported_fourcc(to->fourcc)) - { - to->depth = VID_DEPTH_1BPP | VID_DEPTH_2BPP | - VID_DEPTH_4BPP | VID_DEPTH_8BPP | - VID_DEPTH_12BPP| VID_DEPTH_15BPP| - VID_DEPTH_16BPP| VID_DEPTH_24BPP| - VID_DEPTH_32BPP; - to->flags = VID_CAP_EXPAND | VID_CAP_SHRINK | VID_CAP_COLORKEY; - return 0; - } - else - to->depth = to->flags = 0; - return ENOSYS; -} - - -static int frames[VID_PLAY_MAXFRAMES]; - -static vidix_grkey_t cyberblade_grkey; - -int vixGetGrKeys(vidix_grkey_t *grkey) -{ - memcpy(grkey, &cyberblade_grkey, sizeof(vidix_grkey_t)); - return(0); -} - -int vixSetGrKeys(const vidix_grkey_t *grkey) -{ - int pixfmt=CRINB(0x38); - int protect; - memcpy(&cyberblade_grkey, grkey, sizeof(vidix_grkey_t)); - - protect=SRINB(0x11); - SROUTB(0x11, 0x92); - - if(pixfmt&0x28) /* 32 or 24 bpp */ - { - SROUTB(0x50, cyberblade_grkey.ckey.blue); /* Colour Key */ - SROUTB(0x51, cyberblade_grkey.ckey.green); /* Colour Key */ - SROUTB(0x52, cyberblade_grkey.ckey.red); /* Colour Key */ - SROUTB(0x54, 0xff); /* Colour Key Mask */ - SROUTB(0x55, 0xff); /* Colour Key Mask */ - SROUTB(0x56, 0xff); /* Colour Key Mask */ - } - else - { - int tmp=((cyberblade_grkey.ckey.blue & 0xF8)>>3) - | ((cyberblade_grkey.ckey.green & 0xfc)<<3) - | ((cyberblade_grkey.ckey.red & 0xf8)<<8); - SROUTB(0x50, tmp&0xff); /* Colour Key */ - SROUTB(0x51, (tmp>>8)&0xff); /* Colour Key */ - SROUTB(0x52, 0); /* Colour Key */ - SROUTB(0x54, 0xff); /* Colour Key Mask */ - SROUTB(0x55, 0xff); /* Colour Key Mask */ - SROUTB(0x56, 0x00); /* Colour Key Mask */ - } - SROUTB(0x11,protect); - return(0); -} - - -vidix_video_eq_t equal = -{ - VEQ_CAP_BRIGHTNESS | VEQ_CAP_SATURATION | VEQ_CAP_HUE, - 300, 100, 0, 0, 0, 0, 0, 0 -}; - -int vixPlaybackGetEq( vidix_video_eq_t * eq) -{ - memcpy(eq,&equal,sizeof(vidix_video_eq_t)); - return 0; -} - -int vixPlaybackSetEq( const vidix_video_eq_t * eq) -{ - int br,sat,cr,protect; - if(eq->cap & VEQ_CAP_BRIGHTNESS) equal.brightness = eq->brightness; - if(eq->cap & VEQ_CAP_CONTRAST) equal.contrast = eq->contrast; - if(eq->cap & VEQ_CAP_SATURATION) equal.saturation = eq->saturation; - if(eq->cap & VEQ_CAP_HUE) equal.hue = eq->hue; - if(eq->cap & VEQ_CAP_RGB_INTENSITY) - { - equal.red_intensity = eq->red_intensity; - equal.green_intensity = eq->green_intensity; - equal.blue_intensity = eq->blue_intensity; - } - equal.flags = eq->flags; - - cr = (equal.contrast) * 31 / 2000; cr+=16; - if (cr < 0) cr = 0; if(cr > 7) cr = 7; - cr=cr<<4 | cr; - - br = (equal.brightness+1000) * 63 / 2000; - if (br < 0) br = 0; if(br > 63) br = 63; - if(br>32) br-=32; else br+=32; - - sat = (equal.saturation + 1000) * 16 / 2000; - if (sat < 0) sat = 0; if(sat > 31) sat = 31; - - protect=SRINB(0x11); - SROUTB(0x11, 0x92); - - SROUTB(0xBC,cr); - SROUTW(0xB0,(br<<10)|4); - - SROUTB(0x11, protect); - - return 0; -} - - -static int YOffs,UOffs,VOffs; - -int vixConfigPlayback(vidix_playback_t *info) -{ - int src_w, drw_w; - int src_h, drw_h; - int hscale,vscale; - long base0; - int y_pitch = 0, uv_pitch = 0; - int protect=0; - int layout=0; - unsigned int i; - - if(!is_supported_fourcc(info->fourcc)) - return -1; - - src_w = info->src.w; - src_h = info->src.h; - - drw_w = info->dest.w; - drw_h = info->dest.h; - - switch(info->fourcc) - { - case IMGFMT_YUY2: - case IMGFMT_BGR16: - y_pitch = (src_w*2 + 15) & ~15; - uv_pitch = 0; - YOffs=VOffs=UOffs=info->offset.y = info->offset.v = info->offset.u = 0; - info->frame_size = y_pitch*src_h; - layout=0x0; /* packed */ - break; - case IMGFMT_YV12: - case IMGFMT_I420: - y_pitch = (src_w+15) & ~15; - uv_pitch = ((src_w/2)+7) & ~7; - YOffs=info->offset.y = 0; - VOffs=info->offset.v = y_pitch*src_h; - UOffs=info->offset.u = info->offset.v+(uv_pitch)*(src_h/2); - info->frame_size = y_pitch*src_h + 2*uv_pitch*(src_h/2); - layout=0x1; /* planar, 4:1:1 */ - break; - case IMGFMT_YVU9: - y_pitch = (src_w+15) & ~15; - uv_pitch = ((src_w/4)+3) & ~3; - YOffs=info->offset.y = 0; - VOffs=info->offset.v = y_pitch*src_h; - UOffs=info->offset.u = info->offset.v+(uv_pitch)*(src_h/4); - info->frame_size = y_pitch*src_h + 2*uv_pitch*(src_h/4); - layout=0x51; /* planar, 16:1:1 */ - break; - } - - /* Assume we have 2 MB to play with */ - info->num_frames = 0x200000 / info->frame_size; - if(info->num_frames > VID_PLAY_MAXFRAMES) - info->num_frames = VID_PLAY_MAXFRAMES; - - /* Start at 6 MB. Let's hope it's not in use. */ - base0 = 0x600000; - info->dga_addr = cyberblade_mem + base0; - - info->dest.pitch.y = 16; - info->dest.pitch.u = 16; - info->dest.pitch.v = 16; - - for(i = 0; i < info->num_frames; i++) - { - info->offsets[i] = info->frame_size * i; - frames[i] = base0+info->offsets[i]; - } - - OUTPORT8(0x3d4,0x39); - OUTPORT8(0x3d5,INPORT(0x3d5)|1); - - SRINB(0x0b); /* Select new mode */ - - /* Unprotect hardware registers... */ - protect=SRINB(0x11); - SROUTB(0x11, 0x92); - - SROUTB(0x57, 0xc0); /* Playback key function */ - SROUTB(0x21, 0x34); /* Signature control */ - SROUTB(0x37, 0x30); /* Video key mode */ - - vixSetGrKeys(&cyberblade_grkey); - - /* compute_scale_factor(&src_w, &drw_w, &shrink, &zoom); */ - { - int HTotal,VTotal,HSync,VSync,Overflow,HDisp,VDisp; - int HWinStart,VWinStart; - int tx1,ty1,tx2,ty2; - - HTotal=CRINB(0x00); - HSync=CRINB(0x04); - VTotal=CRINB(0x06); - VSync=CRINB(0x10); - Overflow=CRINB(0x07); - HTotal <<=3; - HSync <<=3; - VTotal |= (Overflow & 1) <<8; - VTotal |= (Overflow & 0x20) <<4; - VTotal +=4; - VSync |= (Overflow & 4) <<6; - VSync |= (Overflow & 0x80) <<2; - - if(CRINB(0xd1)&0x80) - { - int TVHTotal,TVVTotal,TVHSyncStart,TVVSyncStart,TVOverflow; - LOGWRITE("[cyberblade] Using TV-CRTC\n"); - - HDisp=(1+CRINB(0x01))*8; - VDisp=1+CRINB(0x12); - Overflow=CRINB(0x07); - VDisp |= (Overflow & 2) <<7; - VDisp |= (Overflow & 0x40) << 3; - - TVHTotal=CRINB(0xe0)*8; - TVVTotal=CRINB(0xe6); - TVOverflow=CRINB(0xe7); - if(TVOverflow&0x20) TVVTotal|=512; - if(TVOverflow&0x01) TVVTotal|=256; - TVHTotal+=40; TVVTotal+=2; - - TVHSyncStart=CRINB(0xe4)*8; - TVVSyncStart=CRINB(0xf0); - if(TVOverflow&0x80) TVVSyncStart|=512; - if(TVOverflow&0x04) TVVSyncStart|=256; - - HWinStart=(TVHTotal-HDisp)&15; - HWinStart|=(HTotal-HDisp)&15; - HWinStart+=(TVHTotal-TVHSyncStart)-49; - } - else - { - LOGWRITE("[cyberblade] Using Standard CRTC\n"); - HWinStart=(HTotal-HSync)+15; - } - VWinStart=(VTotal-VSync)-8; - - printf("[cyberblade] HTotal: 0x%x, HSStart: 0x%x\n",HTotal,HSync); - printf(" VTotal: 0x%x, VStart: 0x%x\n",VTotal,VSync); - tx1=HWinStart+info->dest.x; - ty1=VWinStart+info->dest.y; - tx2=tx1+info->dest.w; - ty2=ty1+info->dest.h; - - CROUTW(0x86,tx1); - CROUTW(0x88,ty1); - CROUTW(0x8a,tx2); - CROUTW(0x8c,ty2+3); - } - - if(src_w==drw_w) - hscale=0; - else if(src_w<drw_w) - { - hscale=((src_w<<10)/(drw_w-2)) & 0x1fff; - } - else - { - hscale=0x8000 | ((((src_w/drw_w)-1)&7)<<10) | (((drw_w<<10)/src_w) & 0x3ff); - } - - vscale=(src_h<<10)/(drw_h); - if(drw_h<src_h) - vscale=0x8000|((drw_h<<10)/(src_h)); - - /* Write scale factors to hardware */ - - CROUTW(0x80,hscale); /* Horizontal Scale */ - CROUTW(0x82,vscale); /* Vertical Scale */ - - /* Now set the start address and data layout */ - { - int lb = (y_pitch+2) >> 2; - CROUTB(0x95, ((lb & 0x100)>>1) | 0x08 ); /* Linebuffer level bit 8 & threshold */ - CROUTB(0x96, (lb & 0xFF)); /* Linebuffer level */ - - CROUTB(0x97, 0x00); /* VDE Flags */ - CROUTB(0xBA, 0x00); /* Chroma key */ - CROUTB(0xBB, 0x00); /* Chroma key */ - CROUTB(0xBC, 0xFF); /* Chroma key */ - CROUTB(0xBD, 0xFF); /* Chroma key */ - CROUTB(0xBE, 0x04); /* Capture control */ - - if(src_w > 384) - layout|=4; /* 2x line buffers */ - SROUTB(0x97, layout); - - CROUTW(0x90,y_pitch); /* Y Bytes per row */ - SROUTW(0x9A,uv_pitch); /* UV Bytes per row */ - - switch(info->fourcc) - { - case IMGFMT_BGR16: - CROUTB(0x8F, 0x24); /* VDE Flags - Edge Recovery & CSC Bypass */ - CROUTB(0xBF, 0x02); /* Video format - RGB16 */ - SROUTB(0xBE, 0x0); /* HSCB disabled */ - break; - default: - CROUTB(0x8F, 0x20); /* VDE Flags - Edge Recovery */ - CROUTB(0xBF, 0x00); /* Video format - YUV */ - SROUTB(0xBE, 0x00); /* HSCB disable - was 0x03*/ - break; - } - - CROUTB(0x92, ((base0+info->offset.y) >> 3) &0xff); /* Lower 8 bits of start address */ - CROUTB(0x93, ((base0+info->offset.y) >> 11) &0xff); /* Mid 8 bits of start address */ - CROUTB(0x94, ((base0+info->offset.y) >> 19) &0xf); /* Upper 4 bits of start address */ - SROUTB(0x80, ((base0+info->offset.v) >> 3) &0xff); /* Lower 8 bits of start address */ - SROUTB(0x81, ((base0+info->offset.v) >> 11) &0xff); /* Mid 8 bits of start address */ - SROUTB(0x82, ((base0+info->offset.v) >> 19) &0xf); /* Upper 4 bits of start address */ - SROUTB(0x83, ((base0+info->offset.u) >> 3) &0xff); /* Lower 8 bits of start address */ - SROUTB(0x84, ((base0+info->offset.u) >> 11) &0xff); /* Mid 8 bits of start address */ - SROUTB(0x85, ((base0+info->offset.u) >> 19) &0xf); /* Upper 4 bits of start address */ - } - - vixPlaybackSetEq(&equal); - - /* Protect hardware registers again */ - SROUTB(0x11, protect); - return 0; -} - - -int vixPlaybackOn(void) -{ - LOGWRITE("Enable overlay\n"); - CROUTB(0x8E, 0xd4); /* VDE Flags*/ - - return 0; -} - - -int vixPlaybackOff(void) -{ - LOGWRITE("Disable overlay\n"); - CROUTB(0x8E, 0xc4); /* VDE Flags*/ - - return 0; -} - - -int vixPlaybackFrameSelect(unsigned int frame) -{ - int protect; - LOGWRITE("Frame select\n"); - protect=SRINB(0x11); - SROUTB(0x11, 0x92); - /* Set overlay address to that of selected frame */ - CROUTB(0x92, ((frames[frame]+YOffs) >> 3) &0xff); /* Lower 8 bits of start address */ - CROUTB(0x93, ((frames[frame]+YOffs) >> 11) &0xff); /* Mid 8 bits of start address */ - CROUTB(0x94, ((frames[frame]+YOffs) >> 19) &0xf); /* Upper 4 bits of start address */ - SROUTB(0x80, ((frames[frame]+VOffs) >> 3) &0xff); /* Lower 8 bits of start address */ - SROUTB(0x81, ((frames[frame]+VOffs) >> 11) &0xff); /* Mid 8 bits of start address */ - SROUTB(0x82, ((frames[frame]+VOffs) >> 19) &0xf); /* Upper 4 bits of start address */ - SROUTB(0x83, ((frames[frame]+UOffs) >> 3) &0xff); /* Lower 8 bits of start address */ - SROUTB(0x84, ((frames[frame]+UOffs) >> 11) &0xff); /* Mid 8 bits of start address */ - SROUTB(0x85, ((frames[frame]+UOffs) >> 19) &0xf); /* Upper 4 bits of start address */ - SROUTB(0x11, protect); - return 0; -} - - - diff --git a/src/video_out/vidix/drivers/genfb_vid.c b/src/video_out/vidix/drivers/genfb_vid.c deleted file mode 100644 index eaf548438..000000000 --- a/src/video_out/vidix/drivers/genfb_vid.c +++ /dev/null @@ -1,177 +0,0 @@ -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <math.h> -#include <inttypes.h> -#include <fcntl.h> - -#include "../vidix.h" -#include "../fourcc.h" -#include "../../libdha/libdha.h" -#include "../../libdha/pci_ids.h" -#include "../../libdha/pci_names.h" - -#define DEMO_DRIVER 1 -#define VIDIX_STATIC genfb_ - -#define GENFB_MSG "[genfb-demo-driver] " - -#if 0 /* these are unused. remove? */ -static int fd; - -static void *mmio_base = 0; -static void *mem_base = 0; -static int32_t overlay_offset = 0; -static uint32_t ram_size = 0; -#endif - -static int probed = 0; - -/* VIDIX exports */ - -static vidix_capability_t genfb_cap = -{ - "General Framebuffer", - "alex", - TYPE_OUTPUT, - { 0, 0, 0, 0 }, - 2048, - 2048, - 4, - 4, - -1, - FLAG_UPSCALER|FLAG_DOWNSCALER, - -1, - -1, - { 0, 0, 0, 0 } -}; - -unsigned int VIDIX_NAME(vixGetVersion)(void) -{ - return(VIDIX_VERSION); -} - -int VIDIX_NAME(vixProbe)(int verbose,int force) -{ -#if 0 - int err = 0; -#ifdef DEMO_DRIVER - err = ENOSYS; -#endif - - printf(GENFB_MSG"probe\n"); - - fd = open("/dev/fb0", O_RDWR); - if (fd < 0) - { - printf(GENFB_MSG"Error occured durint open: %s\n", strerror(errno)); - err = errno; - } - - probed = 1; - - return(err); -#else - pciinfo_t lst[MAX_PCI_DEVICES]; - unsigned i,num_pci; - int err; - err = pci_scan(lst,&num_pci); - if(err) - { - printf(GENFB_MSG"Error occured during pci scan: %s\n",strerror(err)); - return err; - } - else - { - err = ENXIO; - for(i=0;i<num_pci;i++) - { - if(verbose) - printf(GENFB_MSG" Found chip [%04X:%04X] '%s' '%s'\n" - ,lst[i].vendor - ,lst[i].device - ,pci_vendor_name(lst[i].vendor) - ,pci_device_name(lst[i].vendor,lst[i].device)); - } - } - return ENOSYS; -#endif -} - -int VIDIX_NAME(vixInit)(const char *args) -{ - printf(GENFB_MSG"init\n"); - - if (!probed) - { - printf(GENFB_MSG"Driver was not probed but is being initialized\n"); - return(EINTR); - } - - return(0); -} - -void VIDIX_NAME(vixDestroy)(void) -{ - printf(GENFB_MSG"destory\n"); - return; -} - -int VIDIX_NAME(vixGetCapability)(vidix_capability_t *to) -{ - memcpy(to, &genfb_cap, sizeof(vidix_capability_t)); - return(0); -} - -int VIDIX_NAME(vixQueryFourcc)(vidix_fourcc_t *to) -{ - printf(GENFB_MSG"query fourcc (%x)\n", to->fourcc); - - to->depth = VID_DEPTH_1BPP | VID_DEPTH_2BPP | - VID_DEPTH_4BPP | VID_DEPTH_8BPP | - VID_DEPTH_12BPP | VID_DEPTH_15BPP | - VID_DEPTH_16BPP | VID_DEPTH_24BPP | - VID_DEPTH_32BPP; - - to->flags = 0; - return(0); -} - -int VIDIX_NAME(vixConfigPlayback)(vidix_playback_t *info) -{ - printf(GENFB_MSG"config playback\n"); - - info->num_frames = 2; - info->frame_size = info->src.w*info->src.h+(info->src.w*info->src.h)/2; - info->dest.pitch.y = 32; - info->dest.pitch.u = info->dest.pitch.v = 16; - info->offsets[0] = 0; - info->offsets[1] = info->frame_size; - info->offset.y = 0; - info->offset.v = ((info->src.w+31) & ~31) * info->src.h; - info->offset.u = info->offset.v+((info->src.w+31) & ~31) * info->src.h/4; - info->dga_addr = malloc(info->num_frames*info->frame_size); - printf(GENFB_MSG"frame_size: %d, dga_addr: %p\n", - info->frame_size, info->dga_addr); - - return(0); -} - -int VIDIX_NAME(vixPlaybackOn)(void) -{ - printf(GENFB_MSG"playback on\n"); - return(0); -} - -int VIDIX_NAME(vixPlaybackOff)(void) -{ - printf(GENFB_MSG"playback off\n"); - return(0); -} - -int VIDIX_NAME(vixPlaybackFrameSelect)(unsigned int frame) -{ - printf(GENFB_MSG"frameselect: %d\n", frame); - return(0); -} diff --git a/src/video_out/vidix/drivers/glint_regs.h b/src/video_out/vidix/drivers/glint_regs.h deleted file mode 100644 index f33accd3d..000000000 --- a/src/video_out/vidix/drivers/glint_regs.h +++ /dev/null @@ -1,1304 +0,0 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/glint_regs.h,v 1.31 2001/12/08 16:01:52 alanh Exp $ */ - -/* - * glint register file - * - * Copyright by Stefan Dirsch, Dirk Hohndel, Alan Hourihane - * Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk> - * Dirk Hohndel, <hohndel@suse.de> - * Stefan Dirsch, <sndirsch@suse.de> - * Simon P., <sim@suse.de> - * - * this work is sponsored by S.u.S.E. GmbH, Fuerth, Elsa GmbH, Aachen and - * Siemens Nixdorf Informationssysteme - * - */ - -#ifndef _GLINTREG_H_ -#define _GLINTREG_H_ - -/********************************************** -* GLINT 500TX Configuration Region Registers * -***********************************************/ - -/* Device Identification */ -#define CFGVendorId 0x0000 -#define PCI_VENDOR_3DLABS 0x3D3D -#define PCI_VENDOR_TI 0x104C -#define CFGDeviceId 0x0002 - -#define CFGRevisionId 0x08 -#define CFGClassCode 0x09 -#define CFGHeaderType 0x0E - -/* Device Control/Status */ -#define CFGCommand 0x04 -#define CFGStatus 0x06 - -/* Miscellaneous Functions */ -#define CFGBist 0x0f -#define CFGLatTimer 0x0d -#define CFGCacheLine 0x0c -#define CFGMaxLat 0x3f -#define CFGMinGrant 0x3e -#define CFGIntPin 0x3d -#define CFGIntLine 0x3c - -/* Base Adresses */ -#define CFGBaseAddr0 0x10 -#define CFGBaseAddr1 0x14 -#define CFGBaseAddr2 0x18 -#define CFGBaseAddr3 0x1C -#define CFGBaseAddr4 0x20 -#define CFGRomAddr 0x30 - - - -/********************************** - * GLINT 500TX Region 0 Registers * - **********************************/ - -/* Control Status Registers */ -#define ResetStatus 0x0000 -#define IntEnable 0x0008 -#define IntFlags 0x0010 -#define InFIFOSpace 0x0018 -#define OutFIFOWords 0x0020 -#define DMAAddress 0x0028 -#define DMACount 0x0030 -#define ErrorFlags 0x0038 -#define VClkCtl 0x0040 -#define TestRegister 0x0048 -#define Aperture0 0x0050 -#define Aperture1 0x0058 -#define DMAControl 0x0060 -#define FIFODis 0x0068 - -/* GLINT PerMedia Region 0 additional Registers */ -#define ChipConfig 0x0070 -#define SCLK_SEL_MASK (3 << 10) -#define SCLK_SEL_MCLK_HALF (3 << 10) -#define ByDMAControl 0x00D8 - -/* GLINT 500TX LocalBuffer Registers */ -#define LBMemoryCtl 0x1000 -#define LBNumBanksMask 0x00000001 -#define LBNumBanks1 (0) -#define LBNumBanks2 (1) -#define LBPageSizeMask 0x00000006 -#define LBPageSize256 (0<<1) -#define LBPageSize512 (1<<1) -#define LBPageSize1024 (2<<1) -#define LBPageSize2048 (3<<1) -#define LBRASCASLowMask 0x00000018 -#define LBRASCASLow2 (0<<3) -#define LBRASCASLow3 (1<<3) -#define LBRASCASLow4 (2<<3) -#define LBRASCASLow5 (3<<3) -#define LBRASPrechargeMask 0x00000060 -#define LBRASPrecharge2 (0<<5) -#define LBRASPrecharge3 (1<<5) -#define LBRASPrecharge4 (2<<5) -#define LBRASPrecharge5 (3<<5) -#define LBCASLowMask 0x00000180 -#define LBCASLow1 (0<<7) -#define LBCASLow2 (1<<7) -#define LBCASLow3 (2<<7) -#define LBCASLow4 (3<<7) -#define LBPageModeMask 0x00000200 -#define LBPageModeEnabled (0<<9) -#define LBPageModeDisabled (1<<9) -#define LBRefreshCountMask 0x0003fc00 -#define LBRefreshCountShift 10 - -#define LBMemoryEDO 0x1008 -#define LBEDOMask 0x00000001 -#define LBEDODisabled (0) -#define LBEDOEnabled (1) -#define LBEDOBankSizeMask 0x0000000e -#define LBEDOBankSizeDiabled (0<<1) -#define LBEDOBankSize256K (1<<1) -#define LBEDOBankSize512K (2<<1) -#define LBEDOBankSize1M (3<<1) -#define LBEDOBankSize2M (4<<1) -#define LBEDOBankSize4M (5<<1) -#define LBEDOBankSize8M (6<<1) -#define LBEDOBankSize16M (7<<1) -#define LBTwoPageDetectorMask 0x00000010 -#define LBSinglePageDetector (0<<4) -#define LBTwoPageDetector (1<<4) - -/* GLINT PerMedia Memory Control Registers */ -#define PMReboot 0x1000 -#define PMRomControl 0x1040 -#define PMBootAddress 0x1080 -#define PMMemConfig 0x10C0 - #define RowCharge8 1 << 10 - #define TimeRCD8 1 << 7 - #define TimeRC8 0x6 << 3 - #define TimeRP8 1 - #define CAS3Latency8 0 << 16 - #define BootAdress8 0x10 - #define NumberBanks8 0x3 << 29 - #define RefreshCount8 0x41 << 21 - #define TimeRASMin8 1 << 13 - #define DeadCycle8 1 << 17 - #define BankDelay8 0 << 18 - #define Burst1Cycle8 1 << 31 - #define SDRAM8 0 << 4 - - #define RowCharge6 1 << 10 - #define TimeRCD6 1 << 7 - #define TimeRC6 0x6 << 3 - #define TimeRP6 0x2 - #define CAS3Latency6 1 << 16 - #define BootAdress6 0x60 - #define NumberBanks6 0x2 << 29 - #define RefreshCount6 0x41 << 21 - #define TimeRASMin6 1 << 13 - #define DeadCycle6 1 << 17 - #define BankDelay6 0 << 18 - #define Burst1Cycle6 1 << 31 - #define SDRAM6 0 << 4 - - #define RowCharge4 0 << 10 - #define TimeRCD4 0 << 7 - #define TimeRC4 0x4 << 3 - #define TimeRP4 1 - #define CAS3Latency4 0 << 16 - #define BootAdress4 0x10 - #define NumberBanks4 1 << 29 - #define RefreshCount4 0x30 << 21 - #define TimeRASMin4 1 << 13 - #define DeadCycle4 0 << 17 - #define BankDelay4 0 << 18 - #define Burst1Cycle4 1 << 31 - #define SDRAM4 0 << 4 - -/* Permedia 2 Control */ -#define MemControl 0x1040 - -#define PMBypassWriteMask 0x1100 -#define PMFramebufferWriteMask 0x1140 -#define PMCount 0x1180 - -/* Framebuffer Registers */ -#define FBMemoryCtl 0x1800 -#define FBModeSel 0x1808 -#define FBGCWrMask 0x1810 -#define FBGCColorLower 0x1818 -#define FBTXMemCtl 0x1820 -#define FBWrMaskk 0x1830 -#define FBGCColorUpper 0x1838 - -/* Core FIFO */ -#define OutputFIFO 0x2000 - -/* 500TX Internal Video Registers */ -#define VTGHLimit 0x3000 -#define VTGHSyncStart 0x3008 -#define VTGHSyncEnd 0x3010 -#define VTGHBlankEnd 0x3018 -#define VTGVLimit 0x3020 -#define VTGVSyncStart 0x3028 -#define VTGVSyncEnd 0x3030 -#define VTGVBlankEnd 0x3038 -#define VTGHGateStart 0x3040 -#define VTGHGateEnd 0x3048 -#define VTGVGateStart 0x3050 -#define VTGVGateEnd 0x3058 -#define VTGPolarity 0x3060 -#define VTGFrameRowAddr 0x3068 -#define VTGVLineNumber 0x3070 -#define VTGSerialClk 0x3078 -#define VTGModeCtl 0x3080 - -/* Permedia Video Control Registers */ -#define PMScreenBase 0x3000 -#define PMScreenStride 0x3008 -#define PMHTotal 0x3010 -#define PMHgEnd 0x3018 -#define PMHbEnd 0x3020 -#define PMHsStart 0x3028 -#define PMHsEnd 0x3030 -#define PMVTotal 0x3038 -#define PMVbEnd 0x3040 -#define PMVsStart 0x3048 -#define PMVsEnd 0x3050 -#define PMVideoControl 0x3058 -#define PMInterruptLine 0x3060 -#define PMDDCData 0x3068 -#define DataIn (1<<0) -#define ClkIn (1<<1) -#define DataOut (1<<2) -#define ClkOut (1<<3) -#define PMLineCount 0x3070 -#define PMFifoControl 0x3078 - -/* Permedia 2 RAMDAC Registers */ -#define PM2DACWriteAddress 0x4000 -#define PM2DACIndexReg 0x4000 -#define PM2DACData 0x4008 -#define PM2DACReadMask 0x4010 -#define PM2DACReadAddress 0x4018 -#define PM2DACCursorColorAddress 0x4020 -#define PM2DACCursorColorData 0x4028 -#define PM2DACIndexData 0x4050 -#define PM2DACCursorData 0x4058 -#define PM2DACCursorXLsb 0x4060 -#define PM2DACCursorXMsb 0x4068 -#define PM2DACCursorYLsb 0x4070 -#define PM2DACCursorYMsb 0x4078 -#define PM2DACCursorControl 0x06 -#define PM2DACIndexCMR 0x18 -#define PM2DAC_TRUECOLOR 0x80 -#define PM2DAC_RGB 0x20 -#define PM2DAC_GRAPHICS 0x10 -#define PM2DAC_PACKED 0x09 -#define PM2DAC_8888 0x08 -#define PM2DAC_565 0x06 -#define PM2DAC_4444 0x05 -#define PM2DAC_5551 0x04 -#define PM2DAC_2321 0x03 -#define PM2DAC_2320 0x02 -#define PM2DAC_332 0x01 -#define PM2DAC_CI8 0x00 -#define PM2DACIndexMDCR 0x19 -#define PM2DACIndexPalettePage 0x1c -#define PM2DACIndexMCR 0x1e -#define PM2DACIndexClockAM 0x20 -#define PM2DACIndexClockAN 0x21 -#define PM2DACIndexClockAP 0x22 -#define PM2DACIndexClockBM 0x23 -#define PM2DACIndexClockBN 0x24 -#define PM2DACIndexClockBP 0x25 -#define PM2DACIndexClockCM 0x26 -#define PM2DACIndexClockCN 0x27 -#define PM2DACIndexClockCP 0x28 -#define PM2DACIndexClockStatus 0x29 -#define PM2DACIndexMemClockM 0x30 -#define PM2DACIndexMemClockN 0x31 -#define PM2DACIndexMemClockP 0x32 -#define PM2DACIndexMemClockStatus 0x33 -#define PM2DACIndexColorKeyControl 0x40 -#define PM2DACIndexColorKeyOverlay 0x41 -#define PM2DACIndexColorKeyRed 0x42 -#define PM2DACIndexColorKeyGreen 0x43 -#define PM2DACIndexColorKeyBlue 0x44 - -/* Permedia 2V extensions */ -#define PM2VDACRDMiscControl 0x000 -#define PM2VDACRDSyncControl 0x001 -#define PM2VDACRDDACControl 0x002 -#define PM2VDACRDPixelSize 0x003 -#define PM2VDACRDColorFormat 0x004 -#define PM2VDACRDCursorMode 0x005 -#define PM2VDACRDCursorXLow 0x007 -#define PM2VDACRDCursorXHigh 0x008 -#define PM2VDACRDCursorYLow 0x009 -#define PM2VDACRDCursorYHigh 0x00A -#define PM2VDACRDCursorHotSpotX 0x00B -#define PM2VDACRDCursorHotSpotY 0x00C -#define PM2VDACRDOverlayKey 0x00D -#define PM2VDACRDPan 0x00E -#define PM2VDACRDSense 0x00F -#define PM2VDACRDCheckControl 0x018 -#define PM2VDACIndexClockControl 0x200 -#define PM2VDACRDDClk0PreScale 0x201 -#define PM2VDACRDDClk0FeedbackScale 0x202 -#define PM2VDACRDDClk0PostScale 0x203 -#define PM2VDACRDDClk1PreScale 0x204 -#define PM2VDACRDDClk1FeedbackScale 0x205 -#define PM2VDACRDDClk1PostScale 0x206 -#define PM2VDACRDMClkControl 0x20D -#define PM2VDACRDMClkPreScale 0x20E -#define PM2VDACRDMClkFeedbackScale 0x20F -#define PM2VDACRDMClkPostScale 0x210 -#define PM2VDACRDCursorPalette 0x303 -#define PM2VDACRDCursorPattern 0x400 -#define PM2VDACIndexRegLow 0x4020 -#define PM2VDACIndexRegHigh 0x4028 -#define PM2VDACIndexData 0x4030 -#define PM2VDACRDIndexControl 0x4038 - -/* Permedia 2 Video Streams Unit Registers */ -#define VSBIntFlag (1<<8) -#define VSAIntFlag (1<<9) - -#define VSConfiguration 0x5800 -#define VS_UnitMode_ROM 0 -#define VS_UnitMode_AB8 3 -#define VS_UnitMode_Mask 7 -#define VS_GPBusMode_A (1<<3) -#define VS_HRefPolarityA (1<<9) -#define VS_VRefPolarityA (1<<10) -#define VS_VActivePolarityA (1<<11) -#define VS_UseFieldA (1<<12) -#define VS_FieldPolarityA (1<<13) -#define VS_FieldEdgeA (1<<14) -#define VS_VActiveVBIA (1<<15) -#define VS_InterlaceA (1<<16) -#define VS_ReverseDataA (1<<17) -#define VS_HRefPolarityB (1<<18) -#define VS_VRefPolarityB (1<<19) -#define VS_VActivePolarityB (1<<20) -#define VS_UseFieldB (1<<21) -#define VS_FieldPolarityB (1<<22) -#define VS_FieldEdgeB (1<<23) -#define VS_VActiveVBIB (1<<24) -#define VS_InterlaceB (1<<25) -#define VS_ColorSpaceB_RGB (1<<26) -#define VS_ReverseDataB (1<<27) -#define VS_DoubleEdgeB (1<<28) - -#define VSStatus 0x5808 -#define VS_FieldOne0A (1<<9) -#define VS_FieldOne1A (1<<10) -#define VS_FieldOne2A (1<<11) -#define VS_InvalidInterlaceA (1<<12) -#define VS_FieldOne0B (1<<17) -#define VS_FieldOne1B (1<<18) -#define VS_FieldOne2B (1<<19) -#define VS_InvalidInterlaceB (1<<20) - -#define VSSerialBusControl 0x5810 - -#define VSABase 0x5900 -#define VSA_Video (1<<0) -#define VSA_VBI (1<<1) -#define VSA_BufferCtl (1<<2) -#define VSA_MirrorX (1<<7) -#define VSA_MirrorY (1<<8) -#define VSA_Discard_None (0<<9) -#define VSA_Discard_FieldOne (1<<9) -#define VSA_Discard_FieldTwo (2<<9) -#define VSA_CombineFields (1<<11) -#define VSA_LockToStreamB (1<<12) -#define VSBBase 0x5A00 -#define VSB_Video (1<<0) -#define VSB_VBI (1<<1) -#define VSB_BufferCtl (1<<2) -#define VSB_CombineFields (1<<3) -#define VSB_RGBOrder (1<<11) -#define VSB_GammaCorrect (1<<12) -#define VSB_LockToStreamA (1<<13) - -#define VSControl 0x0000 -#define VSInterrupt 0x0008 -#define VSCurrentLine 0x0010 -#define VSVideoAddressHost 0x0018 -#define VSVideoAddressIndex 0x0020 -#define VSVideoAddress0 0x0028 -#define VSVideoAddress1 0x0030 -#define VSVideoAddress2 0x0038 -#define VSVideoStride 0x0040 -#define VSVideoStartLine 0x0048 -#define VSVideoEndLine 0x0050 -#define VSVideoStartData 0x0058 -#define VSVideoEndData 0x0060 -#define VSVBIAddressHost 0x0068 -#define VSVBIAddressIndex 0x0070 -#define VSVBIAddress0 0x0078 -#define VSVBIAddress1 0x0080 -#define VSVBIAddress2 0x0088 -#define VSVBIStride 0x0090 -#define VSVBIStartLine 0x0098 -#define VSVBIEndLine 0x00A0 -#define VSVBIStartData 0x00A8 -#define VSVBIEndData 0x00B0 -#define VSFifoControl 0x00B8 - -/********************************** - * GLINT Delta Region 0 Registers * - **********************************/ - -/* Control Status Registers */ -#define DResetStatus 0x0800 -#define DIntEnable 0x0808 -#define DIntFlags 0x0810 -#define DErrorFlags 0x0838 -#define DTestRegister 0x0848 -#define DFIFODis 0x0868 - - - -/********************************** - * GLINT Gamma Region 0 Registers * - **********************************/ - -/* Control Status Registers */ -#define GInFIFOSpace 0x0018 -#define GDMAAddress 0x0028 -#define GDMACount 0x0030 -#define GDMAControl 0x0060 -#define GOutDMA 0x0080 -#define GOutDMACount 0x0088 -#define GResetStatus 0x0800 -#define GIntEnable 0x0808 -#define GIntFlags 0x0810 -#define GErrorFlags 0x0838 -#define GTestRegister 0x0848 -#define GFIFODis 0x0868 - -#define GChipConfig 0x0870 -#define GChipAGPCapable 1 << 0 -#define GChipAGPSideband 1 << 1 -#define GChipMultiGLINTApMask 3 << 19 -#define GChipMultiGLINTAp_0M 0 << 19 -#define GChipMultiGLINTAp_16M 1 << 19 -#define GChipMultiGLINTAp_32M 2 << 19 -#define GChipMultiGLINTAp_64M 3 << 19 - -#define GCSRAperture 0x0878 -#define GCSRSecondaryGLINTMapEn 1 << 0 - -#define GPageTableAddr 0x0c00 -#define GPageTableLength 0x0c08 -#define GDelayTimer 0x0c38 -#define GCommandMode 0x0c40 -#define GCommandIntEnable 0x0c48 -#define GCommandIntFlags 0x0c50 -#define GCommandErrorFlags 0x0c58 -#define GCommandStatus 0x0c60 -#define GCommandFaultingAddr 0x0c68 -#define GVertexFaultingAddr 0x0c70 -#define GWriteFaultingAddr 0x0c88 -#define GFeedbackSelectCount 0x0c98 -#define GGammaProcessorMode 0x0cb8 -#define GVGAShadow 0x0d00 -#define GMultGLINTAperture 0x0d08 -#define GMultGLINT1 0x0d10 -#define GMultGLINT2 0x0d18 - -/************************ - * GLINT Core Registers * - ************************/ - -#define GLINT_TAG(major,offset) (((major) << 7) | ((offset) << 3)) -#define GLINT_TAG_ADDR(major,offset) (0x8000 | GLINT_TAG((major),(offset))) - -#define UNIT_DISABLE 0 -#define UNIT_ENABLE 1 - -#define StartXDom GLINT_TAG_ADDR(0x00,0x00) -#define dXDom GLINT_TAG_ADDR(0x00,0x01) -#define StartXSub GLINT_TAG_ADDR(0x00,0x02) -#define dXSub GLINT_TAG_ADDR(0x00,0x03) -#define StartY GLINT_TAG_ADDR(0x00,0x04) -#define dY GLINT_TAG_ADDR(0x00,0x05) -#define GLINTCount GLINT_TAG_ADDR(0x00,0x06) -#define Render GLINT_TAG_ADDR(0x00,0x07) - #define AreaStippleEnable 0x00001 - #define LineStippleEnable 0x00002 - #define ResetLineStipple 0x00004 - #define FastFillEnable 0x00008 - #define PrimitiveLine 0 - #define PrimitiveTrapezoid 0x00040 - #define PrimitivePoint 0x00080 - #define PrimitiveRectangle 0x000C0 - #define AntialiasEnable 0x00100 - #define AntialiasingQuality 0x00200 - #define UsePointTable 0x00400 - #define SyncOnBitMask 0x00800 - #define SyncOnHostData 0x01000 - #define TextureEnable 0x02000 - #define FogEnable 0x04000 - #define CoverageEnable 0x08000 - #define SubPixelCorrectionEnable 0x10000 - #define SpanOperation 0x40000 - #define XPositive 1<<21 - #define YPositive 1<<22 - - -#define ContinueNewLine GLINT_TAG_ADDR(0x00,0x08) -#define ContinueNewDom GLINT_TAG_ADDR(0x00,0x09) -#define ContinueNewSub GLINT_TAG_ADDR(0x00,0x0a) -#define Continue GLINT_TAG_ADDR(0x00,0x0b) -#define FlushSpan GLINT_TAG_ADDR(0x00,0x0c) -#define BitMaskPattern GLINT_TAG_ADDR(0x00,0x0d) - -#define PointTable0 GLINT_TAG_ADDR(0x01,0x00) -#define PointTable1 GLINT_TAG_ADDR(0x01,0x01) -#define PointTable2 GLINT_TAG_ADDR(0x01,0x02) -#define PointTable3 GLINT_TAG_ADDR(0x01,0x03) -#define RasterizerMode GLINT_TAG_ADDR(0x01,0x04) -#define RMMultiGLINT 1<<17 -#define BitMaskPackingEachScanline 1<<9 -#define ForceBackgroundColor 1<<6 -#define InvertBitMask 1<<1 -#define YLimits GLINT_TAG_ADDR(0x01,0x05) -#define ScanLineOwnership GLINT_TAG_ADDR(0x01,0x06) -#define WaitForCompletion GLINT_TAG_ADDR(0x01,0x07) -#define PixelSize GLINT_TAG_ADDR(0x01,0x08) -#define XLimits GLINT_TAG_ADDR(0x01,0x09) /* PM only */ - -#define RectangleOrigin GLINT_TAG_ADDR(0x01,0x0A) /* PM2 only */ -#define RectangleSize GLINT_TAG_ADDR(0x01,0x0B) /* PM2 only */ - -#define PackedDataLimits GLINT_TAG_ADDR(0x02,0x0a) /* PM only */ - -#define ScissorMode GLINT_TAG_ADDR(0x03,0x00) - #define SCI_USER 0x01 - #define SCI_SCREEN 0x02 - #define SCI_USERANDSCREEN 0x03 - -#define ScissorMinXY GLINT_TAG_ADDR(0x03,0x01) -#define ScissorMaxXY GLINT_TAG_ADDR(0x03,0x02) -#define ScreenSize GLINT_TAG_ADDR(0x03,0x03) -#define AreaStippleMode GLINT_TAG_ADDR(0x03,0x04) - /* 0: */ - /* NoMirrorY */ - /* NoMirrorX */ - /* NoInvertPattern */ - /* YAddress_1bit */ - /* XAddress_1bit */ - /* UNIT_DISABLE */ - - #define ASM_XAddress_2bit 1 << 1 - #define ASM_XAddress_3bit 2 << 1 - #define ASM_XAddress_4bit 3 << 1 - #define ASM_XAddress_5bit 4 << 1 - #define ASM_YAddress_2bit 1 << 4 - #define ASM_YAddress_3bit 2 << 4 - #define ASM_YAddress_4bit 3 << 4 - #define ASM_YAddress_5bit 4 << 4 - #define ASM_InvertPattern 1 << 17 - #define ASM_MirrorX 1 << 18 - #define ASM_MirrorY 1 << 19 - -#define LineStippleMode GLINT_TAG_ADDR(0x03,0x05) -#define LoadLineStippleCounters GLINT_TAG_ADDR(0x03,0x06) -#define UpdateLineStippleCounters GLINT_TAG_ADDR(0x03,0x07) -#define SaveLineStippleState GLINT_TAG_ADDR(0x03,0x08) -#define WindowOrigin GLINT_TAG_ADDR(0x03,0x09) - -#define AreaStipplePattern0 GLINT_TAG_ADDR(0x04,0x00) -#define AreaStipplePattern1 GLINT_TAG_ADDR(0x04,0x01) -#define AreaStipplePattern2 GLINT_TAG_ADDR(0x04,0x02) -#define AreaStipplePattern3 GLINT_TAG_ADDR(0x04,0x03) -#define AreaStipplePattern4 GLINT_TAG_ADDR(0x04,0x04) -#define AreaStipplePattern5 GLINT_TAG_ADDR(0x04,0x05) -#define AreaStipplePattern6 GLINT_TAG_ADDR(0x04,0x06) -#define AreaStipplePattern7 GLINT_TAG_ADDR(0x04,0x07) - -#define TextureAddressMode GLINT_TAG_ADDR(0x07,0x00) -#define SStart GLINT_TAG_ADDR(0x07,0x01) -#define dSdx GLINT_TAG_ADDR(0x07,0x02) -#define dSdyDom GLINT_TAG_ADDR(0x07,0x03) -#define TStart GLINT_TAG_ADDR(0x07,0x04) -#define dTdx GLINT_TAG_ADDR(0x07,0x05) -#define dTdyDom GLINT_TAG_ADDR(0x07,0x06) -#define QStart GLINT_TAG_ADDR(0x07,0x07) -#define dQdx GLINT_TAG_ADDR(0x07,0x08) -#define dQdyDom GLINT_TAG_ADDR(0x07,0x09) -#define LOD GLINT_TAG_ADDR(0x07,0x0A) -#define dSdy GLINT_TAG_ADDR(0x07,0x0B) -#define dTdy GLINT_TAG_ADDR(0x07,0x0C) -#define dQdy GLINT_TAG_ADDR(0x07,0x0D) - -#define TextureReadMode GLINT_TAG_ADDR(0x09,0x00) -#define TextureFormat GLINT_TAG_ADDR(0x09,0x01) - #define Texture_4_Components 3 << 3 - #define Texture_Texel 0 - -#define TextureCacheControl GLINT_TAG_ADDR(0x09,0x02) - #define TextureCacheControlEnable 2 - #define TextureCacheControlInvalidate 1 - -#define GLINTBorderColor GLINT_TAG_ADDR(0x09,0x05) - -#define TexelLUTIndex GLINT_TAG_ADDR(0x09,0x08) -#define TexelLUTData GLINT_TAG_ADDR(0x09,0x09) -#define TexelLUTAddress GLINT_TAG_ADDR(0x09,0x0A) -#define TexelLUTTransfer GLINT_TAG_ADDR(0x09,0x0B) -#define TextureFilterMode GLINT_TAG_ADDR(0x09,0x0C) -#define TextureChromaUpper GLINT_TAG_ADDR(0x09,0x0D) -#define TextureChromaLower GLINT_TAG_ADDR(0x09,0x0E) - -#define TxBaseAddr0 GLINT_TAG_ADDR(0x0A,0x00) -#define TxBaseAddr1 GLINT_TAG_ADDR(0x0A,0x01) -#define TxBaseAddr2 GLINT_TAG_ADDR(0x0A,0x02) -#define TxBaseAddr3 GLINT_TAG_ADDR(0x0A,0x03) -#define TxBaseAddr4 GLINT_TAG_ADDR(0x0A,0x04) -#define TxBaseAddr5 GLINT_TAG_ADDR(0x0A,0x05) -#define TxBaseAddr6 GLINT_TAG_ADDR(0x0A,0x06) -#define TxBaseAddr7 GLINT_TAG_ADDR(0x0A,0x07) -#define TxBaseAddr8 GLINT_TAG_ADDR(0x0A,0x08) -#define TxBaseAddr9 GLINT_TAG_ADDR(0x0A,0x09) -#define TxBaseAddr10 GLINT_TAG_ADDR(0x0A,0x0A) -#define TxBaseAddr11 GLINT_TAG_ADDR(0x0A,0x0B) - -#define PMTextureBaseAddress GLINT_TAG_ADDR(0x0b,0x00) -#define PMTextureMapFormat GLINT_TAG_ADDR(0x0b,0x01) -#define PMTextureDataFormat GLINT_TAG_ADDR(0x0b,0x02) - -#define Texel0 GLINT_TAG_ADDR(0x0c,0x00) -#define Texel1 GLINT_TAG_ADDR(0x0c,0x01) -#define Texel2 GLINT_TAG_ADDR(0x0c,0x02) -#define Texel3 GLINT_TAG_ADDR(0x0c,0x03) -#define Texel4 GLINT_TAG_ADDR(0x0c,0x04) -#define Texel5 GLINT_TAG_ADDR(0x0c,0x05) -#define Texel6 GLINT_TAG_ADDR(0x0c,0x06) -#define Texel7 GLINT_TAG_ADDR(0x0c,0x07) -#define Interp0 GLINT_TAG_ADDR(0x0c,0x08) -#define Interp1 GLINT_TAG_ADDR(0x0c,0x09) -#define Interp2 GLINT_TAG_ADDR(0x0c,0x0a) -#define Interp3 GLINT_TAG_ADDR(0x0c,0x0b) -#define Interp4 GLINT_TAG_ADDR(0x0c,0x0c) -#define TextureFilter GLINT_TAG_ADDR(0x0c,0x0d) -#define PMTextureReadMode GLINT_TAG_ADDR(0x0c,0x0e) -#define TexelLUTMode GLINT_TAG_ADDR(0x0c,0x0f) - -#define TextureColorMode GLINT_TAG_ADDR(0x0d,0x00) - #define TextureTypeOpenGL 0 - #define TextureTypeApple 1 << 4 - #define TextureKsDDA 1 << 5 /* only Apple-Mode */ - #define TextureKdDDA 1 << 6 /* only Apple-Mode */ - -#define TextureEnvColor GLINT_TAG_ADDR(0x0d,0x01) -#define FogMode GLINT_TAG_ADDR(0x0d,0x02) - /* 0: */ - /* FOG RGBA */ - /* UNIT_DISABLE */ - - #define FOG_CI 0x0002 - -#define FogColor GLINT_TAG_ADDR(0x0d,0x03) -#define FStart GLINT_TAG_ADDR(0x0d,0x04) -#define dFdx GLINT_TAG_ADDR(0x0d,0x05) -#define dFdyDom GLINT_TAG_ADDR(0x0d,0x06) -#define KsStart GLINT_TAG_ADDR(0x0d,0x09) -#define dKsdx GLINT_TAG_ADDR(0x0d,0x0a) -#define dKsdyDom GLINT_TAG_ADDR(0x0d,0x0b) -#define KdStart GLINT_TAG_ADDR(0x0d,0x0c) -#define dKdStart GLINT_TAG_ADDR(0x0d,0x0d) -#define dKddyDom GLINT_TAG_ADDR(0x0d,0x0e) - -#define RStart GLINT_TAG_ADDR(0x0f,0x00) -#define dRdx GLINT_TAG_ADDR(0x0f,0x01) -#define dRdyDom GLINT_TAG_ADDR(0x0f,0x02) -#define GStart GLINT_TAG_ADDR(0x0f,0x03) -#define dGdx GLINT_TAG_ADDR(0x0f,0x04) -#define dGdyDom GLINT_TAG_ADDR(0x0f,0x05) -#define BStart GLINT_TAG_ADDR(0x0f,0x06) -#define dBdx GLINT_TAG_ADDR(0x0f,0x07) -#define dBdyDom GLINT_TAG_ADDR(0x0f,0x08) -#define AStart GLINT_TAG_ADDR(0x0f,0x09) -#define dAdx GLINT_TAG_ADDR(0x0f,0x0a) -#define dAdyDom GLINT_TAG_ADDR(0x0f,0x0b) -#define ColorDDAMode GLINT_TAG_ADDR(0x0f,0x0c) - /* 0: */ - #define CDDA_FlatShading 0 - /* UNIT_DISABLE */ - #define CDDA_GouraudShading 0x0002 - - -#define ConstantColor GLINT_TAG_ADDR(0x0f,0x0d) -#define GLINTColor GLINT_TAG_ADDR(0x0f,0x0e) -#define AlphaTestMode GLINT_TAG_ADDR(0x10,0x00) -#define AntialiasMode GLINT_TAG_ADDR(0x10,0x01) -#define AlphaBlendMode GLINT_TAG_ADDR(0x10,0x02) - /* 0: */ - /* SrcZERO */ - /* DstZERO */ - /* ColorFormat8888 */ - /* AlphaBuffer present */ - /* ColorOrderBGR */ - /* TypeOpenGL */ - /* DstFBData */ - /* UNIT_DISABLE */ - - #define ABM_SrcONE 1 << 1 - #define ABM_SrcDST_COLOR 2 << 1 - #define ABM_SrcONE_MINUS_DST_COLOR 3 << 1 - #define ABM_SrcSRC_ALPHA 4 << 1 - #define ABM_SrcONE_MINUS_SRC_ALPHA 5 << 1 - #define ABM_SrcDST_ALPHA 6 << 1 - #define ABM_SrcONE_MINUS_DST_ALPHA 7 << 1 - #define ABM_SrcSRC_ALPHA_SATURATE 8 << 1 - #define ABM_DstONE 1 << 5 - #define ABM_DstSRC_COLOR 2 << 5 - #define ABM_DstONE_MINUS_SRC_COLOR 3 << 5 - #define ABM_DstSRC_ALPHA 4 << 5 - #define ABM_DstONE_MINUS_SRC_ALPHA 5 << 5 - #define ABM_DstDST_ALPHA 6 << 5 - #define ABM_DstONE_MINUS_DST_ALPHA 7 << 5 - #define ABM_ColorFormat5555 1 << 8 - #define ABM_ColorFormat4444 2 << 8 - #define ABM_ColorFormat4444_Front 3 << 8 - #define ABM_ColorFormat4444_Back 4 << 8 - #define ABM_ColorFormat332_Front 5 << 8 - #define ABM_ColorFormat332_Back 6 << 8 - #define ABM_ColorFormat121_Front 7 << 8 - #define ABM_ColorFormat121_Back 8 << 8 - #define ABM_ColorFormat555_Back 13 << 8 - #define ABM_ColorFormat_CI8 14 << 8 - #define ABM_ColorFormat_CI4 15 << 8 - #define ABM_NoAlphaBuffer 0x1000 - #define ABM_ColorOrderRGB 0x2000 - #define ABM_TypeQuickDraw3D 0x4000 - #define ABM_DstFBSourceData 0x8000 - -#define DitherMode GLINT_TAG_ADDR(0x10,0x03) - /* 0: */ - /* ColorOrder BGR */ - /* AlphaDitherDefault */ - /* ColorFormat8888 */ - /* TruncateMode */ - /* DitherDisable */ - /* UNIT_DISABLE */ - - #define DTM_DitherEnable 1 << 1 - #define DTM_ColorFormat5555 1 << 2 - #define DTM_ColorFormat4444 2 << 2 - #define DTM_ColorFormat4444_Front 3 << 2 - #define DTM_ColorFormat4444_Back 4 << 2 - #define DTM_ColorFormat332_Front 5 << 2 - #define DTM_ColorFormat332_Back 6 << 2 - #define DTM_ColorFormat121_Front 7 << 2 - #define DTM_ColorFormat121_Back 8 << 2 - #define DTM_ColorFormat555_Back 13 << 2 - #define DTM_ColorFormat_CI8 14 << 2 - #define DTM_ColorFormat_CI4 15 << 2 - #define DTM_ColorOrderRGB 1 << 10 - #define DTM_NoAlphaDither 1 << 14 - #define DTM_RoundMode 1 << 15 - -#define FBSoftwareWriteMask GLINT_TAG_ADDR(0x10,0x04) -#define LogicalOpMode GLINT_TAG_ADDR(0x10,0x05) - #define Use_ConstantFBWriteData 0x40 - - -#define FBWriteData GLINT_TAG_ADDR(0x10,0x06) -#define RouterMode GLINT_TAG_ADDR(0x10,0x08) - #define ROUTER_Depth_Texture 1 - #define ROUTER_Texture_Depth 0 - - -#define LBReadMode GLINT_TAG_ADDR(0x11,0x00) - /* 0: */ - /* SrcNoRead */ - /* DstNoRead */ - /* DataLBDefault */ - /* WinTopLeft */ - /* NoPatch */ - /* ScanlineInterval1 */ - - #define LBRM_SrcEnable 1 << 9 - #define LBRM_DstEnable 1 << 10 - #define LBRM_DataLBStencil 1 << 16 - #define LBRM_DataLBDepth 2 << 16 - #define LBRM_WinBottomLeft 1 << 18 - #define LBRM_DoPatch 1 << 19 - - #define LBRM_ScanlineInt2 1 << 20 - #define LBRM_ScanlineInt4 2 << 20 - #define LBRM_ScanlineInt8 3 << 20 - - -#define LBReadFormat GLINT_TAG_ADDR(0x11,0x01) - #define LBRF_DepthWidth15 0x03 /* only permedia */ - #define LBRF_DepthWidth16 0x00 - #define LBRF_DepthWidth24 0x01 - #define LBRF_DepthWidth32 0x02 - - #define LBRF_StencilWidth0 (0 << 2) - #define LBRF_StencilWidth4 (1 << 2) - #define LBRF_StencilWidth8 (2 << 2) - - #define LBRF_StencilPos16 (0 << 4) - #define LBRF_StencilPos20 (1 << 4) - #define LBRF_StencilPos24 (2 << 4) - #define LBRF_StencilPos28 (3 << 4) - #define LBRF_StencilPos32 (4 << 4) - - #define LBRF_FrameCount0 (0 << 7) - #define LBRF_FrameCount4 (1 << 7) - #define LBRF_FrameCount8 (2 << 7) - - #define LBRF_FrameCountPos16 (0 << 9) - #define LBRF_FrameCountPos20 (1 << 9) - #define LBRF_FrameCountPos24 (2 << 9) - #define LBRF_FrameCountPos28 (3 << 9) - #define LBRF_FrameCountPos32 (4 << 9) - #define LBRF_FrameCountPos36 (5 << 9) - #define LBRF_FrameCountPos40 (6 << 9) - - #define LBRF_GIDWidth0 (0 << 12) - #define LBRF_GIDWidth4 (1 << 12) - - #define LBRF_GIDPos16 (0 << 13) - #define LBRF_GIDPos20 (1 << 13) - #define LBRF_GIDPos24 (2 << 13) - #define LBRF_GIDPos28 (3 << 13) - #define LBRF_GIDPos32 (4 << 13) - #define LBRF_GIDPos36 (5 << 13) - #define LBRF_GIDPos40 (6 << 13) - #define LBRF_GIDPos44 (7 << 13) - #define LBRF_GIDPos48 (8 << 13) - - #define LBRF_Compact32 (1 << 17) - - - -#define LBSourceOffset GLINT_TAG_ADDR(0x11,0x02) -#define LBStencil GLINT_TAG_ADDR(0x11,0x05) -#define LBDepth GLINT_TAG_ADDR(0x11,0x06) -#define LBWindowBase GLINT_TAG_ADDR(0x11,0x07) -#define LBWriteMode GLINT_TAG_ADDR(0x11,0x08) - #define LBWM_WriteEnable 0x1 - #define LBWM_UpLoad_LBDepth 0x2 - #define LBWM_UpLoad_LBStencil 0x4 - -#define LBWriteFormat GLINT_TAG_ADDR(0x11,0x09) - - -#define TextureData GLINT_TAG_ADDR(0x11,0x0d) -#define TextureDownloadOffset GLINT_TAG_ADDR(0x11,0x0e) -#define LBWindowOffset GLINT_TAG_ADDR(0x11,0x0f) - -#define GLINTWindow GLINT_TAG_ADDR(0x13,0x00) - #define GWIN_UnitEnable (1 << 0) - #define GWIN_ForceLBUpdate (1 << 3) - #define GWIN_LBUpdateSourceREG (1 << 4) - #define GWIN_LBUpdateSourceLB (0 << 4) - #define GWIN_StencilFCP (1 << 17) - #define GWIN_DepthFCP (1 << 18) - #define GWIN_OverrideWriteFilter (1 << 19) - - /* ??? is this needed, set by permedia (2) modules */ - #define GWIN_DisableLBUpdate 0x40000 - -#define StencilMode GLINT_TAG_ADDR(0x13,0x01) -#define StencilData GLINT_TAG_ADDR(0x13,0x02) -#define GLINTStencil GLINT_TAG_ADDR(0x13,0x03) -#define DepthMode GLINT_TAG_ADDR(0x13,0x04) - /* 0: */ - /* WriteDisable */ - /* SrcCompFragment */ - /* CompFuncNEVER */ - /* UNIT_DISABLE */ - - #define DPM_WriteEnable 1 << 1 - #define DPM_SrcCompLBData 1 << 2 - #define DPM_SrcCompDregister 2 << 2 - #define DPM_SrcCompLBSourceData 3 << 2 - #define DPM_CompFuncLESS 1 << 4 - #define DPM_CompFuncEQUAL 2 << 4 - #define DPM_CompFuncLESS_OR_EQ 3 << 4 - #define DPM_CompFuncGREATER 4 << 4 - #define DPM_CompFuncNOT_EQ 5 << 4 - #define DPM_CompFuncGREATER_OR_EQ 6 << 4 - #define DPM_CompFuncALWAYS 7 << 4 - -#define GLINTDepth GLINT_TAG_ADDR(0x13,0x05) -#define ZStartU GLINT_TAG_ADDR(0x13,0x06) -#define ZStartL GLINT_TAG_ADDR(0x13,0x07) -#define dZdxU GLINT_TAG_ADDR(0x13,0x08) -#define dZdxL GLINT_TAG_ADDR(0x13,0x09) -#define dZdyDomU GLINT_TAG_ADDR(0x13,0x0a) -#define dZdyDomL GLINT_TAG_ADDR(0x13,0x0b) -#define FastClearDepth GLINT_TAG_ADDR(0x13,0x0c) - -#define FBReadMode GLINT_TAG_ADDR(0x15,0x00) - /* 0: */ - /* SrcNoRead */ - /* DstNoRead */ - /* DataFBDefault */ - /* WinTopLeft */ - /* ScanlineInterval1 */ - - #define FBRM_SrcEnable 1 << 9 - #define FBRM_DstEnable 1 << 10 - #define FBRM_DataFBColor 1 << 15 - #define FBRM_WinBottomLeft 1 << 16 - #define FBRM_Packed 1 << 19 - #define FBRM_ScanlineInt2 1 << 23 - #define FBRM_ScanlineInt4 2 << 23 - #define FBRM_ScanlineInt8 3 << 23 - - -#define FBSourceOffset GLINT_TAG_ADDR(0x15,0x01) -#define FBPixelOffset GLINT_TAG_ADDR(0x15,0x02) -#define FBColor GLINT_TAG_ADDR(0x15,0x03) -#define FBData GLINT_TAG_ADDR(0x15,0x04) -#define FBSourceData GLINT_TAG_ADDR(0x15,0x05) - -#define FBWindowBase GLINT_TAG_ADDR(0x15,0x06) -#define FBWriteMode GLINT_TAG_ADDR(0x15,0x07) - /* 0: */ - /* FBWM_NoColorUpload */ - /* FBWM_WriteDisable */ - #define FBWM_WriteEnable 1 - #define FBWM_UploadColor 1 << 3 -/* Permedia3 extensions */ - #define FBWM_Enable0 1 << 12 - -#define FBHardwareWriteMask GLINT_TAG_ADDR(0x15,0x08) -#define FBBlockColor GLINT_TAG_ADDR(0x15,0x09) -#define FBReadPixel GLINT_TAG_ADDR(0x15,0x0a) /* PM */ -#define PatternRamMode GLINT_TAG_ADDR(0x15,0x0f) - -#define PatternRamData0 GLINT_TAG_ADDR(0x16,0x00) -#define PatternRamData1 GLINT_TAG_ADDR(0x16,0x01) -#define PatternRamData2 GLINT_TAG_ADDR(0x16,0x02) -#define PatternRamData3 GLINT_TAG_ADDR(0x16,0x03) -#define PatternRamData4 GLINT_TAG_ADDR(0x16,0x04) -#define PatternRamData5 GLINT_TAG_ADDR(0x16,0x05) -#define PatternRamData6 GLINT_TAG_ADDR(0x16,0x06) -#define PatternRamData7 GLINT_TAG_ADDR(0x16,0x07) - -#define FilterMode GLINT_TAG_ADDR(0x18,0x00) - /* 0: */ - /* CullDepthTags */ - /* CullDepthData */ - /* CullStencilTags */ - /* CullStencilData */ - /* CullColorTag */ - /* CullColorData */ - /* CullSyncTag */ - /* CullSyncData */ - /* CullStatisticTag */ - /* CullStatisticData */ - - #define FM_PassDepthTags 0x0010 - #define FM_PassDepthData 0x0020 - #define FM_PassStencilTags 0x0040 - #define FM_PassStencilData 0x0080 - #define FM_PassColorTag 0x0100 - #define FM_PassColorData 0x0200 - #define FM_PassSyncTag 0x0400 - #define FM_PassSyncData 0x0800 - #define FM_PassStatisticTag 0x1000 - #define FM_PassStatisticData 0x2000 - -#define Sync_tag 0x0188 - -#define StatisticMode GLINT_TAG_ADDR(0x18,0x01) -#define MinRegion GLINT_TAG_ADDR(0x18,0x02) -#define MaxRegion GLINT_TAG_ADDR(0x18,0x03) -#define ResetPickResult GLINT_TAG_ADDR(0x18,0x04) -#define MitHitRegion GLINT_TAG_ADDR(0x18,0x05) -#define MaxHitRegion GLINT_TAG_ADDR(0x18,0x06) -#define PickResult GLINT_TAG_ADDR(0x18,0x07) -#define GlintSync GLINT_TAG_ADDR(0x18,0x08) - -#define FBBlockColorU GLINT_TAG_ADDR(0x18,0x0d) -#define FBBlockColorL GLINT_TAG_ADDR(0x18,0x0e) -#define SuspendUntilFrameBlank GLINT_TAG_ADDR(0x18,0x0f) - -#define KsRStart GLINT_TAG_ADDR(0x19,0x00) -#define dKsRdx GLINT_TAG_ADDR(0x19,0x01) -#define dKsRdyDom GLINT_TAG_ADDR(0x19,0x02) -#define KsGStart GLINT_TAG_ADDR(0x19,0x03) -#define dKsGdx GLINT_TAG_ADDR(0x19,0x04) -#define dKsGdyDom GLINT_TAG_ADDR(0x19,0x05) -#define KsBStart GLINT_TAG_ADDR(0x19,0x06) -#define dKsBdx GLINT_TAG_ADDR(0x19,0x07) -#define dKsBdyDom GLINT_TAG_ADDR(0x19,0x08) - -#define KdRStart GLINT_TAG_ADDR(0x1A,0x00) -#define dKdRdx GLINT_TAG_ADDR(0x1A,0x01) -#define dKdRdyDom GLINT_TAG_ADDR(0x1A,0x02) -#define KdGStart GLINT_TAG_ADDR(0x1A,0x03) -#define dKdGdx GLINT_TAG_ADDR(0x1A,0x04) -#define dKdGdyDom GLINT_TAG_ADDR(0x1A,0x05) -#define KdBStart GLINT_TAG_ADDR(0x1A,0x06) -#define dKdBdx GLINT_TAG_ADDR(0x1A,0x07) -#define dKdBdyDom GLINT_TAG_ADDR(0x1A,0x08) - -#define FBSourceBase GLINT_TAG_ADDR(0x1B,0x00) -#define FBSourceDelta GLINT_TAG_ADDR(0x1B,0x01) -#define Config GLINT_TAG_ADDR(0x1B,0x02) -#define CFBRM_SrcEnable 1<<0 -#define CFBRM_DstEnable 1<<1 -#define CFBRM_Packed 1<<2 -#define CWM_Enable 1<<3 -#define CCDDA_Enable 1<<4 -#define CLogOp_Enable 1<<5 -#define ContextDump GLINT_TAG_ADDR(0x1B,0x08) -#define ContextRestore GLINT_TAG_ADDR(0x1B,0x09) -#define ContextData GLINT_TAG_ADDR(0x1B,0x0a) - -#define TexelLUT0 GLINT_TAG_ADDR(0x1D,0x00) -#define TexelLUT1 GLINT_TAG_ADDR(0x1D,0x01) -#define TexelLUT2 GLINT_TAG_ADDR(0x1D,0x02) -#define TexelLUT3 GLINT_TAG_ADDR(0x1D,0x03) -#define TexelLUT4 GLINT_TAG_ADDR(0x1D,0x04) -#define TexelLUT5 GLINT_TAG_ADDR(0x1D,0x05) -#define TexelLUT6 GLINT_TAG_ADDR(0x1D,0x06) -#define TexelLUT7 GLINT_TAG_ADDR(0x1D,0x07) -#define TexelLUT8 GLINT_TAG_ADDR(0x1D,0x08) -#define TexelLUT9 GLINT_TAG_ADDR(0x1D,0x09) -#define TexelLUT10 GLINT_TAG_ADDR(0x1D,0x0A) -#define TexelLUT11 GLINT_TAG_ADDR(0x1D,0x0B) -#define TexelLUT12 GLINT_TAG_ADDR(0x1D,0x0C) -#define TexelLUT13 GLINT_TAG_ADDR(0x1D,0x0D) -#define TexelLUT14 GLINT_TAG_ADDR(0x1D,0x0E) -#define TexelLUT15 GLINT_TAG_ADDR(0x1D,0x0F) - -#define YUVMode GLINT_TAG_ADDR(0x1E,0x00) -#define ChromaUpper GLINT_TAG_ADDR(0x1E,0x01) -#define ChromaLower GLINT_TAG_ADDR(0x1E,0x02) -#define ChromaTestMode GLINT_TAG_ADDR(0x1E,0x03) -#define AlphaMapUpperBound GLINT_TAG_ADDR(0x1E,0x03) /* PM2 */ -#define AlphaMapLowerBound GLINT_TAG_ADDR(0x1E,0x04) /* PM2 */ - - -/****************************** - * GLINT Delta Core Registers * - ******************************/ - -#define V0FixedTag GLINT_TAG_ADDR(0x20,0x00) -#define V1FixedTag GLINT_TAG_ADDR(0x21,0x00) -#define V2FixedTag GLINT_TAG_ADDR(0x22,0x00) -#define V0FloatTag GLINT_TAG_ADDR(0x23,0x00) -#define V1FloatTag GLINT_TAG_ADDR(0x24,0x00) -#define V2FloatTag GLINT_TAG_ADDR(0x25,0x00) - -#define VPAR_s 0x00 -#define VPAR_t 0x08 -#define VPAR_q 0x10 -#define VPAR_Ks 0x18 -#define VPAR_Kd 0x20 - -/* have changed colors in ramdac ! -#define VPAR_R 0x28 -#define VPAR_G 0x30 -#define VPAR_B 0x38 -#define VPAR_A 0x40 -*/ -#define VPAR_B 0x28 -#define VPAR_G 0x30 -#define VPAR_R 0x38 -#define VPAR_A 0x40 - -#define VPAR_f 0x48 - -#define VPAR_x 0x50 -#define VPAR_y 0x58 -#define VPAR_z 0x60 - -#define DeltaModeTag GLINT_TAG_ADDR(0x26,0x00) - /* 0: */ - /* GLINT_300SX */ - - /* DeltaMode Register Bit Field Assignments */ - #define DM_GLINT_300SX 0x0000 - #define DM_GLINT_500TX 0x0001 - #define DM_PERMEDIA 0x0002 - #define DM_Depth_16BPP (1 << 2) - #define DM_Depth_24BPP (2 << 2) - #define DM_Depth_32BPP (3 << 2) - #define DM_FogEnable 0x0010 - #define DM_TextureEnable 0x0020 - #define DM_SmoothShadingEnable 0x0040 - #define DM_DepthEnable 0x0080 - #define DM_SpecularTextureEnable 0x0100 - #define DM_DiffuseTextureEnable 0x0200 - #define DM_SubPixelCorrectionEnable 0x0400 - #define DM_DiamondExit 0x0800 - #define DM_NoDraw 0x1000 - #define DM_ClampEnable 0x2000 - #define DM_ClampedTexParMode 0x4000 - #define DM_NormalizedTexParMode 0xC000 - - - #define DDCMD_AreaStrippleEnable 0x0001 - #define DDCMD_LineStrippleEnable 0x0002 - #define DDCMD_ResetLineStripple 1 << 2 - #define DDCMD_FastFillEnable 1 << 3 - /* 2 Bits reserved */ - #define DDCMD_PrimitiveType_Point 2 << 6 - #define DDCMD_PrimitiveType_Line 0 << 6 - #define DDCMD_PrimitiveType_Trapezoid 1 << 6 - #define DDCMD_AntialiasEnable 1 << 8 - #define DDCMD_AntialiasingQuality 1 << 9 - #define DDCMD_UsePointTable 1 << 10 - #define DDCMD_SyncOnBitMask 1 << 11 - #define DDCMD_SyncOnHostDate 1 << 12 - #define DDCMD_TextureEnable 1 << 13 - #define DDCMD_FogEnable 1 << 14 - #define DDCMD_CoverageEnable 1 << 15 - #define DDCMD_SubPixelCorrectionEnable 1 << 16 - - - -#define DrawTriangle GLINT_TAG_ADDR(0x26,0x01) -#define RepeatTriangle GLINT_TAG_ADDR(0x26,0x02) -#define DrawLine01 GLINT_TAG_ADDR(0x26,0x03) -#define DrawLine10 GLINT_TAG_ADDR(0x26,0x04) -#define RepeatLine GLINT_TAG_ADDR(0x26,0x05) -#define BroadcastMask GLINT_TAG_ADDR(0x26,0x0F) - -/* Permedia 3 - Accelerator Extensions */ -#define FillRectanglePosition 0x8348 -#define FillRender2D 0x8350 -#define FBDstReadBufAddr0 0xAE80 -#define FBDstReadBufOffset0 0xAEA0 -#define FBDstReadBufWidth0 0xAEC0 -#define FBDstReadMode 0xAEE0 -#define FBDRM_Enable0 1<<8 -#define FBDRM_Blocking 1<<24 -#define FBDstReadEnables 0xAEE8 -#define FBSrcReadMode 0xAF00 -#define FBSRM_Blocking 1<<11 -#define FBSrcReadBufAddr 0xAF08 -#define FBSrcReadBufOffset0 0xAF10 -#define FBSrcReadBufWidth 0xAF18 -#define FBWriteBufAddr0 0xB000 -#define FBWriteBufOffset0 0xB020 -#define FBWriteBufWidth0 0xB040 -#define FBBlockColorBack 0xB0A0 -#define ForegroundColor 0xB0C0 -#define BackgroundColor 0xB0C8 -#define RectanglePosition 0xB600 -#define Render2D 0xB640 - -/* Colorformats */ -#define BGR555 1 -#define BGR565 16 -#define CI8 14 -#define CI4 15 - -#ifdef DEBUG -#define GLINT_WRITE_REG(v,r) \ - GLINT_VERB_WRITE_REG(pGlint,v,r,__FILE__,__LINE__) -#define GLINT_READ_REG(r) \ - GLINT_VERB_READ_REG(pGlint,r,__FILE__,__LINE__) -#else - -#define GLINT_WRITE_REG(v,r) \ - MMIO_OUT32(pGlint->IOBase + pGlint->IOOffset,(unsigned long)(r), (v)) -#define GLINT_READ_REG(r) \ - MMIO_IN32(pGlint->IOBase + pGlint->IOOffset,(unsigned long)(r)) - -#endif /* DEBUG */ - -#define GLINT_WAIT(n) \ -do{ \ - if (pGlint->InFifoSpace>=(n)) \ - pGlint->InFifoSpace -= (n); \ - else { \ - int tmp; \ - while((tmp=GLINT_READ_REG(InFIFOSpace))<(n)); \ - /* Clamp value due to bugs in PM3 */ \ - if (tmp > pGlint->FIFOSize) \ - tmp = pGlint->FIFOSize; \ - pGlint->InFifoSpace = tmp - (n); \ - } \ -}while(0) - -#define GLINTDACDelay(x) do { \ - int delay = x; \ - unsigned char tmp; \ - while(delay--){tmp = GLINT_READ_REG(InFIFOSpace);}; \ - } while(0) - -#define GLINT_MASK_WRITE_REG(v,m,r) \ - GLINT_WRITE_REG((GLINT_READ_REG(r)&(m))|(v),r) - -#define GLINT_SLOW_WRITE_REG(v,r) \ -do{ \ - mem_barrier(); \ - GLINT_WAIT(pGlint->FIFOSize); \ - mem_barrier(); \ - GLINT_WRITE_REG(v,r); \ -}while(0) - -#define GLINT_SET_INDEX(index) \ -do{ \ - GLINT_SLOW_WRITE_REG(((index)>>8)&0xff,PM2VDACIndexRegHigh); \ - GLINT_SLOW_WRITE_REG((index)&0xff,PM2VDACIndexRegLow); \ -} while(0) - -#define REPLICATE(r) \ -{ \ - if (pScrn->bitsPerPixel == 16) { \ - r &= 0xFFFF; \ - r |= (r<<16); \ - } else \ - if (pScrn->bitsPerPixel == 8) { \ - r &= 0xFF; \ - r |= (r<<8); \ - r |= (r<<16); \ - } \ -} - -#ifndef XF86DRI -#define LOADROP(rop) \ -{ \ - if (pGlint->ROP != rop) { \ - GLINT_WRITE_REG(rop<<1|UNIT_ENABLE, LogicalOpMode); \ - pGlint->ROP = rop; \ - } \ -} -#else -#define LOADROP(rop) \ - { \ - GLINT_WRITE_REG(rop<<1|UNIT_ENABLE, LogicalOpMode); \ - pGlint->ROP = rop; \ - } -#endif - -#define CHECKCLIPPING \ -{ \ - if (pGlint->ClippingOn) { \ - pGlint->ClippingOn = FALSE; \ - GLINT_WAIT(1); \ - GLINT_WRITE_REG(0, ScissorMode); \ - } \ -} - -#ifndef XF86DRI -#define DO_PLANEMASK(planemask) \ -{ \ - if (planemask != pGlint->planemask) { \ - pGlint->planemask = planemask; \ - REPLICATE(planemask); \ - GLINT_WRITE_REG(planemask, FBHardwareWriteMask);\ - } \ -} -#else -#define DO_PLANEMASK(planemask) \ - { \ - pGlint->planemask = planemask; \ - REPLICATE(planemask); \ - GLINT_WRITE_REG(planemask, FBHardwareWriteMask);\ - } -#endif - -/* Permedia Save/Restore functions */ - -#define STOREREG(address,value) \ - pReg->glintRegs[address >> 3] = value; - -#define SAVEREG(address) \ - pReg->glintRegs[address >> 3] = GLINT_READ_REG(address); - -#define RESTOREREG(address) \ - GLINT_SLOW_WRITE_REG(pReg->glintRegs[address >> 3], address); - -#define STOREDAC(address,value) \ - pReg->DacRegs[address] = value; - -#define P2VOUT(address) \ - Permedia2vOutIndReg(pScrn, address, 0x00, pReg->DacRegs[address]); - -#define P2VIN(address) \ - pReg->DacRegs[address] = Permedia2vInIndReg(pScrn, address); - -/* RamDac Save/Restore functions, used by external DAC's */ - -#define STORERAMDAC(address,value) \ - ramdacReg->DacRegs[address] = value; - -/* Multi Chip access */ - -#define ACCESSCHIP1() \ - pGlint->IOOffset = 0; - -#define ACCESSCHIP2() \ - pGlint->IOOffset = 0x10000; - -#endif diff --git a/src/video_out/vidix/drivers/mach64.h b/src/video_out/vidix/drivers/mach64.h deleted file mode 100644 index 807efdb8d..000000000 --- a/src/video_out/vidix/drivers/mach64.h +++ /dev/null @@ -1,2611 +0,0 @@ -/* - * mach64.h - * This software has been released under the terms of the GNU Public - * license. See http://www.gnu.org/copyleft/gpl.html for details. - * - * It's based on radeonfb, X11, GATOS sources -*/ - -#ifndef __MACH64_INCLUDED -#define __MACH64_INCLUDED 1 - -/* Note: this model of accessing to IO space is based on MMIO technology. -This means that this sources don't support ISA and VLB cards */ -#define BlockIOTag(val) (val) -#define IOPortTag(sparce,val) (val) - -/* MDA/[M]CGA/EGA/VGA I/O ports */ -#define GENVS 0x0102u /* Write (and Read on uC only) */ - -#define R_GENLPS 0x03b9u /* Read */ - -#define GENHP 0x03bfu - -#define ATTRX 0x03c0u -#define ATTRD 0x03c1u -#define GENS0 0x03c2u /* Read */ -#define GENMO 0x03c2u /* Write */ -#define GENENB 0x03c3u /* Read */ -#define SEQX 0x03c4u -#define SEQD 0x03c5u -#define VGA_DAC_MASK 0x03c6u -#define VGA_DAC_READ 0x03c7u -#define VGA_DAC_WRITE 0x03c8u -#define VGA_DAC_DATA 0x03c9u -#define R_GENFC 0x03cau /* Read */ -/* ? 0x03cbu */ -#define R_GENMO 0x03ccu /* Read */ -/* ? 0x03cdu */ -#define GRAX 0x03ceu -#define GRAD 0x03cfu - -#define GENB 0x03d9u - -#define GENLPS 0x03dcu /* Write */ -#define KCX 0x03ddu -#define KCD 0x03deu - -#define GENENA 0x46e8u /* Write */ - -/* I/O port base numbers */ -#define MonochromeIOBase 0x03b0u -#define ColourIOBase 0x03d0u - -/* Other MDA/[M]CGA/EGA/VGA I/O ports */ -/* ?(_IOBase) ((_IOBase) + 0x00u) */ /* CRTX synonym */ -/* ?(_IOBase) ((_IOBase) + 0x01u) */ /* CRTD synonym */ -/* ?(_IOBase) ((_IOBase) + 0x02u) */ /* CRTX synonym */ -/* ?(_IOBase) ((_IOBase) + 0x03u) */ /* CRTD synonym */ -#define CRTX(_IOBase) ((_IOBase) + 0x04u) -#define CRTD(_IOBase) ((_IOBase) + 0x05u) -/* ?(_IOBase) ((_IOBase) + 0x06u) */ -/* ?(_IOBase) ((_IOBase) + 0x07u) */ -#define GENMC(_IOBase) ((_IOBase) + 0x08u) -/* ?(_IOBase) ((_IOBase) + 0x09u) */ /* R_GENLPS/GENB */ -#define GENS1(_IOBase) ((_IOBase) + 0x0au) /* Read */ -#define GENFC(_IOBase) ((_IOBase) + 0x0au) /* Write */ -#define GENLPC(_IOBase) ((_IOBase) + 0x0bu) -/* ?(_IOBase) ((_IOBase) + 0x0cu) */ /* /GENLPS */ -/* ?(_IOBase) ((_IOBase) + 0x0du) */ /* /KCX */ -/* ?(_IOBase) ((_IOBase) + 0x0eu) */ /* /KCD */ -/* ?(_IOBase) ((_IOBase) + 0x0fu) */ /* GENHP/ */ - -/* 8514/A VESA approved register definitions */ -#define DISP_STAT 0x02e8u /* Read */ -#define SENSE 0x0001u /* Presumably belong here */ -#define VBLANK 0x0002u -#define HORTOG 0x0004u -#define H_TOTAL 0x02e8u /* Write */ -#define IBM_DAC_MASK 0x02eau -#define IBM_DAC_READ 0x02ebu -#define IBM_DAC_WRITE 0x02ecu -#define IBM_DAC_DATA 0x02edu -#define H_DISP 0x06e8u /* Write */ -#define H_SYNC_STRT 0x0ae8u /* Write */ -#define H_SYNC_WID 0x0ee8u /* Write */ -#define HSYNCPOL_POS 0x0000u -#define HSYNCPOL_NEG 0x0020u -#define H_POLARITY_POS HSYNCPOL_POS /* Sigh */ -#define H_POLARITY_NEG HSYNCPOL_NEG /* Sigh */ -#define V_TOTAL 0x12e8u /* Write */ -#define V_DISP 0x16e8u /* Write */ -#define V_SYNC_STRT 0x1ae8u /* Write */ -#define V_SYNC_WID 0x1ee8u /* Write */ -#define VSYNCPOL_POS 0x0000u -#define VSYNCPOL_NEG 0x0020u -#define V_POLARITY_POS VSYNCPOL_POS /* Sigh */ -#define V_POLARITY_NEG VSYNCPOL_NEG /* Sigh */ -#define DISP_CNTL 0x22e8u /* Write */ -#define ODDBNKENAB 0x0001u -#define MEMCFG_2 0x0000u -#define MEMCFG_4 0x0002u -#define MEMCFG_6 0x0004u -#define MEMCFG_8 0x0006u -#define DBLSCAN 0x0008u -#define INTERLACE 0x0010u -#define DISPEN_NC 0x0000u -#define DISPEN_ENAB 0x0020u -#define DISPEN_DISAB 0x0040u -#define R_H_TOTAL 0x26e8u /* Read */ -/* ? 0x2ae8u */ -/* ? 0x2ee8u */ -/* ? 0x32e8u */ -/* ? 0x36e8u */ -/* ? 0x3ae8u */ -/* ? 0x3ee8u */ -#define SUBSYS_STAT 0x42e8u /* Read */ -#define VBLNKFLG 0x0001u -#define PICKFLAG 0x0002u -#define INVALIDIO 0x0004u -#define GPIDLE 0x0008u -#define MONITORID_MASK 0x0070u -/* MONITORID_? 0x0000u */ -#define MONITORID_8507 0x0010u -#define MONITORID_8514 0x0020u -/* MONITORID_? 0x0030u */ -/* MONITORID_? 0x0040u */ -#define MONITORID_8503 0x0050u -#define MONITORID_8512 0x0060u -#define MONITORID_8513 0x0060u -#define MONITORID_NONE 0x0070u -#define _8PLANE 0x0080u -#define SUBSYS_CNTL 0x42e8u /* Write */ -#define RVBLNKFLG 0x0001u -#define RPICKFLAG 0x0002u -#define RINVALIDIO 0x0004u -#define RGPIDLE 0x0008u -#define IVBLNKFLG 0x0100u -#define IPICKFLAG 0x0200u -#define IINVALIDIO 0x0400u -#define IGPIDLE 0x0800u -#define CHPTEST_NC 0x0000u -#define CHPTEST_NORMAL 0x1000u -#define CHPTEST_ENAB 0x2000u -#define GPCTRL_NC 0x0000u -#define GPCTRL_ENAB 0x4000u -#define GPCTRL_RESET 0x8000u -#define ROM_PAGE_SEL 0x46e8u /* Write */ -#define ADVFUNC_CNTL 0x4ae8u /* Write */ -#define DISABPASSTHRU 0x0001u -#define CLOKSEL 0x0004u -/* ? 0x4ee8u */ -#define EXT_CONFIG_0 0x52e8u /* C & T 82C480 */ -#define EXT_CONFIG_1 0x56e8u /* C & T 82C480 */ -#define EXT_CONFIG_2 0x5ae8u /* C & T 82C480 */ -#define EXT_CONFIG_3 0x5ee8u /* C & T 82C480 */ -/* ? 0x62e8u */ -/* ? 0x66e8u */ -/* ? 0x6ae8u */ -/* ? 0x6ee8u */ -/* ? 0x72e8u */ -/* ? 0x76e8u */ -/* ? 0x7ae8u */ -/* ? 0x7ee8u */ -#define CUR_Y 0x82e8u -#define CUR_X 0x86e8u -#define DESTY_AXSTP 0x8ae8u /* Write */ -#define DESTX_DIASTP 0x8ee8u /* Write */ -#define ERR_TERM 0x92e8u -#define MAJ_AXIS_PCNT 0x96e8u /* Write */ -#define GP_STAT 0x9ae8u /* Read */ -#define GE_STAT 0x9ae8u /* Alias */ -#define DATARDY 0x0100u -#define DATA_READY DATARDY /* Alias */ -#define GPBUSY 0x0200u -#define CMD 0x9ae8u /* Write */ -#define WRTDATA 0x0001u -#define PLANAR 0x0002u -#define LASTPIX 0x0004u -#define LINETYPE 0x0008u -#define DRAW 0x0010u -#define INC_X 0x0020u -#define YMAJAXIS 0x0040u -#define INC_Y 0x0080u -#define PCDATA 0x0100u -#define _16BIT 0x0200u -#define CMD_NOP 0x0000u -#define CMD_OP_MSK 0xf000u -#define BYTSEQ 0x1000u -#define CMD_LINE 0x2000u -#define CMD_RECT 0x4000u -#define CMD_RECTV1 0x6000u -#define CMD_RECTV2 0x8000u -#define CMD_LINEAF 0xa000u -#define CMD_BITBLT 0xc000u -#define SHORT_STROKE 0x9ee8u /* Write */ -#define SSVDRAW 0x0010u -#define VECDIR_000 0x0000u -#define VECDIR_045 0x0020u -#define VECDIR_090 0x0040u -#define VECDIR_135 0x0060u -#define VECDIR_180 0x0080u -#define VECDIR_225 0x00a0u -#define VECDIR_270 0x00c0u -#define VECDIR_315 0x00e0u -#define BKGD_COLOR 0xa2e8u /* Write */ -#define FRGD_COLOR 0xa6e8u /* Write */ -#define WRT_MASK 0xaae8u /* Write */ -#define RD_MASK 0xaee8u /* Write */ -#define COLOR_CMP 0xb2e8u /* Write */ -#define BKGD_MIX 0xb6e8u /* Write */ -/* 0x001fu See MIX_* definitions below */ -#define BSS_BKGDCOL 0x0000u -#define BSS_FRGDCOL 0x0020u -#define BSS_PCDATA 0x0040u -#define BSS_BITBLT 0x0060u -#define FRGD_MIX 0xbae8u /* Write */ -/* 0x001fu See MIX_* definitions below */ -#define FSS_BKGDCOL 0x0000u -#define FSS_FRGDCOL 0x0020u -#define FSS_PCDATA 0x0040u -#define FSS_BITBLT 0x0060u -#define MULTIFUNC_CNTL 0xbee8u /* Write */ -#define MIN_AXIS_PCNT 0x0000u -#define SCISSORS_T 0x1000u -#define SCISSORS_L 0x2000u -#define SCISSORS_B 0x3000u -#define SCISSORS_R 0x4000u -#define M32_MEM_CNTL 0x5000u -#define HORCFG_4 0x0000u -#define HORCFG_5 0x0001u -#define HORCFG_8 0x0002u -#define HORCFG_10 0x0003u -#define VRTCFG_2 0x0000u -#define VRTCFG_4 0x0004u -#define VRTCFG_6 0x0008u -#define VRTCFG_8 0x000cu -#define BUFSWP 0x0010u -#define PATTERN_L 0x8000u -#define PATTERN_H 0x9000u -#define PIX_CNTL 0xa000u -#define PLANEMODE 0x0004u -#define COLCMPOP_F 0x0000u -#define COLCMPOP_T 0x0008u -#define COLCMPOP_GE 0x0010u -#define COLCMPOP_LT 0x0018u -#define COLCMPOP_NE 0x0020u -#define COLCMPOP_EQ 0x0028u -#define COLCMPOP_LE 0x0030u -#define COLCMPOP_GT 0x0038u -#define MIXSEL_FRGDMIX 0x0000u -#define MIXSEL_PATT 0x0040u -#define MIXSEL_EXPPC 0x0080u -#define MIXSEL_EXPBLT 0x00c0u -/* ? 0xc2e8u */ -/* ? 0xc6e8u */ -/* ? 0xcae8u */ -/* ? 0xcee8u */ -/* ? 0xd2e8u */ -/* ? 0xd6e8u */ -/* ? 0xdae8u */ -/* ? 0xdee8u */ -#define PIX_TRANS 0xe2e8u -/* ? 0xe6e8u */ -/* ? 0xeae8u */ -/* ? 0xeee8u */ -/* ? 0xf2e8u */ -/* ? 0xf6e8u */ -/* ? 0xfae8u */ -/* ? 0xfee8u */ - -/* ATI Mach8 & Mach32 register definitions */ -#define OVERSCAN_COLOR_8 0x02eeu /* Write */ /* Mach32 */ -#define OVERSCAN_BLUE_24 0x02efu /* Write */ /* Mach32 */ -#define OVERSCAN_GREEN_24 0x06eeu /* Write */ /* Mach32 */ -#define OVERSCAN_RED_24 0x06efu /* Write */ /* Mach32 */ -#define CURSOR_OFFSET_LO 0x0aeeu /* Write */ /* Mach32 */ -#define CURSOR_OFFSET_HI 0x0eeeu /* Write */ /* Mach32 */ -#define CONFIG_STATUS_1 0x12eeu /* Read */ -#define CLK_MODE 0x0001u /* Mach8 */ -#define BUS_16 0x0002u /* Mach8 */ -#define MC_BUS 0x0004u /* Mach8 */ -#define EEPROM_ENA 0x0008u /* Mach8 */ -#define DRAM_ENA 0x0010u /* Mach8 */ -#define MEM_INSTALLED 0x0060u /* Mach8 */ -#define ROM_ENA 0x0080u /* Mach8 */ -#define ROM_PAGE_ENA 0x0100u /* Mach8 */ -#define ROM_LOCATION 0xfe00u /* Mach8 */ -#define _8514_ONLY 0x0001u /* Mach32 */ -#define BUS_TYPE 0x000eu /* Mach32 */ -#define ISA_16_BIT 0x0000u /* Mach32 */ -#define EISA 0x0002u /* Mach32 */ -#define MICRO_C_16_BIT 0x0004u /* Mach32 */ -#define MICRO_C_8_BIT 0x0006u /* Mach32 */ -#define LOCAL_386SX 0x0008u /* Mach32 */ -#define LOCAL_386DX 0x000au /* Mach32 */ -#define LOCAL_486 0x000cu /* Mach32 */ -#define PCI 0x000eu /* Mach32 */ -#define MEM_TYPE 0x0070u /* Mach32 */ -#define CHIP_DIS 0x0080u /* Mach32 */ -#define TST_VCTR_ENA 0x0100u /* Mach32 */ -#define DACTYPE 0x0e00u /* Mach32 */ -#define MC_ADR_DECODE 0x1000u /* Mach32 */ -#define CARD_ID 0xe000u /* Mach32 */ -#define HORZ_CURSOR_POSN 0x12eeu /* Write */ /* Mach32 */ -#define CONFIG_STATUS_2 0x16eeu /* Read */ -#define SHARE_CLOCK 0x0001u /* Mach8 */ -#define HIRES_BOOT 0x0002u /* Mach8 */ -#define EPROM_16_ENA 0x0004u /* Mach8 */ -#define WRITE_PER_BIT 0x0008u /* Mach8 */ -#define FLASH_ENA 0x0010u /* Mach8 */ -#define SLOW_SEQ_EN 0x0001u /* Mach32 */ -#define MEM_ADDR_DIS 0x0002u /* Mach32 */ -#define ISA_16_ENA 0x0004u /* Mach32 */ -#define KOR_TXT_MODE_ENA 0x0008u /* Mach32 */ -#define LOCAL_BUS_SUPPORT 0x0030u /* Mach32 */ -#define LOCAL_BUS_CONFIG_2 0x0040u /* Mach32 */ -#define LOCAL_BUS_RD_DLY_ENA 0x0080u /* Mach32 */ -#define LOCAL_DAC_EN 0x0100u /* Mach32 */ -#define LOCAL_RDY_EN 0x0200u /* Mach32 */ -#define EEPROM_ADR_SEL 0x0400u /* Mach32 */ -#define GE_STRAP_SEL 0x0800u /* Mach32 */ -#define VESA_RDY 0x1000u /* Mach32 */ -#define Z4GB 0x2000u /* Mach32 */ -#define LOC2_MDRAM 0x4000u /* Mach32 */ -#define VERT_CURSOR_POSN 0x16eeu /* Write */ /* Mach32 */ -#define FIFO_TEST_DATA 0x1aeeu /* Read */ /* Mach32 */ -#define CURSOR_COLOR_0 0x1aeeu /* Write */ /* Mach32 */ -#define CURSOR_COLOR_1 0x1aefu /* Write */ /* Mach32 */ -#define HORZ_CURSOR_OFFSET 0x1eeeu /* Write */ /* Mach32 */ -#define VERT_CURSOR_OFFSET 0x1eefu /* Write */ /* Mach32 */ -#define PCI_CNTL 0x22eeu /* Mach32-PCI */ -#define CRT_PITCH 0x26eeu /* Write */ -#define CRT_OFFSET_LO 0x2aeeu /* Write */ -#define CRT_OFFSET_HI 0x2eeeu /* Write */ -#define LOCAL_CNTL 0x32eeu /* Mach32 */ -#define FIFO_OPT 0x36eeu /* Write */ /* Mach8 */ -#define MISC_OPTIONS 0x36eeu /* Mach32 */ -#define W_STATE_ENA 0x0000u /* Mach32 */ -#define HOST_8_ENA 0x0001u /* Mach32 */ -#define MEM_SIZE_ALIAS 0x000cu /* Mach32 */ -#define MEM_SIZE_512K 0x0000u /* Mach32 */ -#define MEM_SIZE_1M 0x0004u /* Mach32 */ -#define MEM_SIZE_2M 0x0008u /* Mach32 */ -#define MEM_SIZE_4M 0x000cu /* Mach32 */ -#define DISABLE_VGA 0x0010u /* Mach32 */ -#define _16_BIT_IO 0x0020u /* Mach32 */ -#define DISABLE_DAC 0x0040u /* Mach32 */ -#define DLY_LATCH_ENA 0x0080u /* Mach32 */ -#define TEST_MODE 0x0100u /* Mach32 */ -#define BLK_WR_ENA 0x0400u /* Mach32 */ -#define _64_DRAW_ENA 0x0800u /* Mach32 */ -#define FIFO_TEST_TAG 0x3aeeu /* Read */ /* Mach32 */ -#define EXT_CURSOR_COLOR_0 0x3aeeu /* Write */ /* Mach32 */ -#define EXT_CURSOR_COLOR_1 0x3eeeu /* Write */ /* Mach32 */ -#define MEM_BNDRY 0x42eeu /* Mach32 */ -#define MEM_PAGE_BNDRY 0x000fu /* Mach32 */ -#define MEM_BNDRY_ENA 0x0010u /* Mach32 */ -#define SHADOW_CTL 0x46eeu /* Write */ -#define CLOCK_SEL 0x4aeeu -/* DISABPASSTHRU 0x0001u See ADVFUNC_CNTL */ -#define VFIFO_DEPTH_1 0x0100u /* Mach32 */ -#define VFIFO_DEPTH_2 0x0200u /* Mach32 */ -#define VFIFO_DEPTH_3 0x0300u /* Mach32 */ -#define VFIFO_DEPTH_4 0x0400u /* Mach32 */ -#define VFIFO_DEPTH_5 0x0500u /* Mach32 */ -#define VFIFO_DEPTH_6 0x0600u /* Mach32 */ -#define VFIFO_DEPTH_7 0x0700u /* Mach32 */ -#define VFIFO_DEPTH_8 0x0800u /* Mach32 */ -#define VFIFO_DEPTH_9 0x0900u /* Mach32 */ -#define VFIFO_DEPTH_A 0x0a00u /* Mach32 */ -#define VFIFO_DEPTH_B 0x0b00u /* Mach32 */ -#define VFIFO_DEPTH_C 0x0c00u /* Mach32 */ -#define VFIFO_DEPTH_D 0x0d00u /* Mach32 */ -#define VFIFO_DEPTH_E 0x0e00u /* Mach32 */ -#define VFIFO_DEPTH_F 0x0f00u /* Mach32 */ -#define COMPOSITE_SYNC 0x1000u -/* ? 0x4eeeu */ -#define ROM_ADDR_1 0x52eeu -#define BIOS_BASE_SEGMENT 0x007fu /* Mach32 */ -/* ? 0xff80u */ /* Mach32 */ -#define ROM_ADDR_2 0x56eeu /* Sick ... */ -#define SHADOW_SET 0x5aeeu /* Write */ -#define MEM_CFG 0x5eeeu /* Mach32 */ -#define MEM_APERT_SEL 0x0003u /* Mach32 */ -#define MEM_APERT_PAGE 0x000cu /* Mach32 */ -#define MEM_APERT_LOC 0xfff0u /* Mach32 */ -#define EXT_GE_STATUS 0x62eeu /* Read */ /* Mach32 */ -#define HORZ_OVERSCAN 0x62eeu /* Write */ /* Mach32 */ -#define VERT_OVERSCAN 0x66eeu /* Write */ /* Mach32 */ -#define MAX_WAITSTATES 0x6aeeu -#define GE_OFFSET_LO 0x6eeeu /* Write */ -#define BOUNDS_LEFT 0x72eeu /* Read */ -#define GE_OFFSET_HI 0x72eeu /* Write */ -#define BOUNDS_TOP 0x76eeu /* Read */ -#define GE_PITCH 0x76eeu /* Write */ -#define BOUNDS_RIGHT 0x7aeeu /* Read */ -#define EXT_GE_CONFIG 0x7aeeu /* Write */ /* Mach32 */ -#define MONITOR_ALIAS 0x0007u /* Mach32 */ -/* MONITOR_? 0x0000u */ /* Mach32 */ -#define MONITOR_8507 0x0001u /* Mach32 */ -#define MONITOR_8514 0x0002u /* Mach32 */ -/* MONITOR_? 0x0003u */ /* Mach32 */ -/* MONITOR_? 0x0004u */ /* Mach32 */ -#define MONITOR_8503 0x0005u /* Mach32 */ -#define MONITOR_8512 0x0006u /* Mach32 */ -#define MONITOR_8513 0x0006u /* Mach32 */ -#define MONITOR_NONE 0x0007u /* Mach32 */ -#define ALIAS_ENA 0x0008u /* Mach32 */ -#define PIXEL_WIDTH_4 0x0000u /* Mach32 */ -#define PIXEL_WIDTH_8 0x0010u /* Mach32 */ -#define PIXEL_WIDTH_16 0x0020u /* Mach32 */ -#define PIXEL_WIDTH_24 0x0030u /* Mach32 */ -#define RGB16_555 0x0000u /* Mach32 */ -#define RGB16_565 0x0040u /* Mach32 */ -#define RGB16_655 0x0080u /* Mach32 */ -#define RGB16_664 0x00c0u /* Mach32 */ -#define MULTIPLEX_PIXELS 0x0100u /* Mach32 */ -#define RGB24 0x0000u /* Mach32 */ -#define RGBx24 0x0200u /* Mach32 */ -#define BGR24 0x0400u /* Mach32 */ -#define xBGR24 0x0600u /* Mach32 */ -#define DAC_8_BIT_EN 0x4000u /* Mach32 */ -#define ORDER_16BPP_565 RGB16_565 /* Mach32 */ -#define BOUNDS_BOTTOM 0x7eeeu /* Read */ -#define MISC_CNTL 0x7eeeu /* Write */ /* Mach32 */ -#define PATT_DATA_INDEX 0x82eeu -/* ? 0x86eeu */ -/* ? 0x8aeeu */ -#define R_EXT_GE_CONFIG 0x8eeeu /* Read */ /* Mach32 */ -#define PATT_DATA 0x8eeeu /* Write */ -#define R_MISC_CNTL 0x92eeu /* Read */ /* Mach32 */ -#define BRES_COUNT 0x96eeu -#define EXT_FIFO_STATUS 0x9aeeu /* Read */ -#define LINEDRAW_INDEX 0x9aeeu /* Write */ -/* ? 0x9eeeu */ -#define LINEDRAW_OPT 0xa2eeu -#define BOUNDS_RESET 0x0100u -#define CLIP_MODE_0 0x0000u /* Clip exception disabled */ -#define CLIP_MODE_1 0x0200u /* Line segments */ -#define CLIP_MODE_2 0x0400u /* Polygon boundary lines */ -#define CLIP_MODE_3 0x0600u /* Patterned lines */ -#define DEST_X_START 0xa6eeu /* Write */ -#define DEST_X_END 0xaaeeu /* Write */ -#define DEST_Y_END 0xaeeeu /* Write */ -#define R_H_TOTAL_DISP 0xb2eeu /* Read */ /* Mach32 */ -#define SRC_X_STRT 0xb2eeu /* Write */ -#define R_H_SYNC_STRT 0xb6eeu /* Read */ /* Mach32 */ -#define ALU_BG_FN 0xb6eeu /* Write */ -#define R_H_SYNC_WID 0xbaeeu /* Read */ /* Mach32 */ -#define ALU_FG_FN 0xbaeeu /* Write */ -#define SRC_X_END 0xbeeeu /* Write */ -#define R_V_TOTAL 0xc2eeu /* Read */ -#define SRC_Y_DIR 0xc2eeu /* Write */ -#define R_V_DISP 0xc6eeu /* Read */ /* Mach32 */ -#define EXT_SHORT_STROKE 0xc6eeu /* Write */ -#define R_V_SYNC_STRT 0xcaeeu /* Read */ /* Mach32 */ -#define SCAN_X 0xcaeeu /* Write */ -#define VERT_LINE_CNTR 0xceeeu /* Read */ /* Mach32 */ -#define DP_CONFIG 0xceeeu /* Write */ -#define READ_WRITE 0x0001u -#define DATA_WIDTH 0x0200u -#define DATA_ORDER 0x1000u -#define FG_COLOR_SRC_FG 0x2000u -#define FG_COLOR_SRC_BLIT 0x6000u -#define R_V_SYNC_WID 0xd2eeu /* Read */ -#define PATT_LENGTH 0xd2eeu /* Write */ -#define PATT_INDEX 0xd6eeu /* Write */ -#define READ_SRC_X 0xdaeeu /* Read */ /* Mach32 */ -#define EXT_SCISSOR_L 0xdaeeu /* Write */ -#define READ_SRC_Y 0xdeeeu /* Read */ /* Mach32 */ -#define EXT_SCISSOR_T 0xdeeeu /* Write */ -#define EXT_SCISSOR_R 0xe2eeu /* Write */ -#define EXT_SCISSOR_B 0xe6eeu /* Write */ -/* ? 0xeaeeu */ -#define DEST_COMP_FN 0xeeeeu /* Write */ -#define DEST_COLOR_CMP_MASK 0xf2eeu /* Write */ /* Mach32 */ -/* ? 0xf6eeu */ -#define CHIP_ID 0xfaeeu /* Read */ /* Mach32 */ -#define CHIP_CODE_0 0x001fu /* Mach32 */ -#define CHIP_CODE_1 0x03e0u /* Mach32 */ -#define CHIP_CLASS 0x0c00u /* Mach32 */ -#define CHIP_REV 0xf000u /* Mach32 */ -#define LINEDRAW 0xfeeeu /* Write */ - -/* ATI Mach64 register definitions */ -#define CRTC_H_TOTAL_DISP IOPortTag(0x00u, 0x00u) -# define CRTC_H_TOTAL 0x000001fful -/* ? 0x0000fe00ul */ -# define CRTC_H_DISP 0x01ff0000ul -/* ? 0xfe000000ul */ -#define CRTC_H_SYNC_STRT_WID IOPortTag(0x01u, 0x01u) -# define CRTC_H_SYNC_STRT 0x000000fful -# define CRTC_H_SYNC_DLY 0x00000700ul -/* ? 0x00000800ul */ -# define CRTC_H_SYNC_STRT_HI 0x00001000ul -/* ? 0x0000e000ul */ -# define CRTC_H_SYNC_WID 0x001f0000ul -# define CRTC_H_SYNC_POL 0x00200000ul -/* ? 0xffc00000ul */ -#define CRTC_V_TOTAL_DISP IOPortTag(0x02u, 0x02u) -# define CRTC_V_TOTAL 0x000007fful -/* ? 0x0000f800ul */ -# define CRTC_V_DISP 0x07ff0000ul -/* ? 0xf8000000ul */ -#define CRTC_V_SYNC_STRT_WID IOPortTag(0x03u, 0x03u) -# define CRTC_V_SYNC_STRT 0x000007fful -/* ? 0x0000f800ul */ -# define CRTC_V_SYNC_WID 0x001f0000ul -# define CRTC_V_SYNC_POL 0x00200000ul -/* ? 0xffc00000ul */ -#define CRTC_VLINE_CRNT_VLINE IOPortTag(0x04u, 0x04u) -#define CRTC_VLINE 0x000007fful -/* ? 0x0000f800ul */ -#define CRTC_CRNT_VLINE 0x07ff0000ul -/* ? 0xf8000000ul */ -#define CRTC_OFF_PITCH IOPortTag(0x05u, 0x05u) -# define CRTC_OFFSET 0x000ffffful -# define CRTC_OFFSET_VGA 0x0003fffful -# define CRTC_OFFSET_LOCK 0x00100000ul /* XC/XL */ -/* ? 0x00200000ul */ -# define CRTC_PITCH 0xffc00000ul -#define CRTC_INT_CNTL IOPortTag(0x06u, 0x06u) -# define CRTC_VBLANK 0x00000001ul -# define CRTC_VBLANK_INT_EN 0x00000002ul -# define CRTC_VBLANK_INT 0x00000004ul -# define CRTC_VLINE_INT_EN 0x00000008ul -# define CRTC_VLINE_INT 0x00000010ul -# define CRTC_VLINE_SYNC 0x00000020ul -# define CRTC_FRAME 0x00000040ul -# define CRTC_SNAPSHOT_INT_EN 0x00000080ul /* GTPro */ -# define CRTC_SNAPSHOT_INT 0x00000100ul /* GTPro */ -# define CRTC_I2C_INT_EN 0x00000200ul /* GTPro */ -# define CRTC_I2C_INT 0x00000400ul /* GTPro */ -# define CRTC2_VBLANK 0x00000800ul /* LTPro */ -# define CRTC2_VBLANK_INT_EN 0x00001000ul /* LTPro */ -# define CRTC2_VBLANK_INT 0x00002000ul /* LTPro */ -# define CRTC2_VLINE_INT_EN 0x00004000ul /* LTPro */ -# define CRTC2_VLINE_INT 0x00008000ul /* LTPro */ -# define CRTC_CAPBUF0_INT_EN 0x00010000ul /* VT/GT */ -# define CRTC_CAPBUF0_INT 0x00020000ul /* VT/GT */ -# define CRTC_CAPBUF1_INT_EN 0x00040000ul /* VT/GT */ -# define CRTC_CAPBUF1_INT 0x00080000ul /* VT/GT */ -# define CRTC_OVERLAY_EOF_INT_EN 0x00100000ul /* VT/GT */ -# define CRTC_OVERLAY_EOF_INT 0x00200000ul /* VT/GT */ -# define CRTC_ONESHOT_CAP_INT_EN 0x00400000ul /* VT/GT */ -# define CRTC_ONESHOT_CAP_INT 0x00800000ul /* VT/GT */ -# define CRTC_BUSMASTER_EOL_INT_EN 0x01000000ul /* VTB/GTB/LT */ -# define CRTC_BUSMASTER_EOL_INT 0x02000000ul /* VTB/GTB/LT */ -# define CRTC_GP_INT_EN 0x04000000ul /* VTB/GTB/LT */ -# define CRTC_GP_INT 0x08000000ul /* VTB/GTB/LT */ -# define CRTC2_VLINE_SYNC 0x10000000ul /* LTPro */ -# define CRTC_SNAPSHOT2_INT_EN 0x20000000ul /* LTPro */ -# define CRTC_SNAPSHOT2_INT 0x40000000ul /* LTPro */ -# define CRTC_VBLANK_BIT2_INT 0x80000000ul /* GTPro */ -# define CRTC_INT_ENS /* *** UPDATE ME *** */ \ - ( \ - CRTC_VBLANK_INT_EN | \ - CRTC_VLINE_INT_EN | \ - CRTC_SNAPSHOT_INT_EN | \ - CRTC_I2C_INT_EN | \ - CRTC2_VBLANK_INT_EN | \ - CRTC2_VLINE_INT_EN | \ - CRTC_CAPBUF0_INT_EN | \ - CRTC_CAPBUF1_INT_EN | \ - CRTC_OVERLAY_EOF_INT_EN | \ - CRTC_ONESHOT_CAP_INT_EN | \ - CRTC_BUSMASTER_EOL_INT_EN | \ - CRTC_GP_INT_EN | \ - CRTC_SNAPSHOT2_INT_EN | \ - 0 \ - ) -# define CRTC_INT_ACKS /* *** UPDATE ME *** */ \ - ( \ - CRTC_VBLANK_INT | \ - CRTC_VLINE_INT | \ - CRTC_SNAPSHOT_INT | \ - CRTC_I2C_INT | \ - CRTC2_VBLANK_INT | \ - CRTC2_VLINE_INT | \ - CRTC_CAPBUF0_INT | \ - CRTC_CAPBUF1_INT | \ - CRTC_OVERLAY_EOF_INT | \ - CRTC_ONESHOT_CAP_INT | \ - CRTC_BUSMASTER_EOL_INT | \ - CRTC_GP_INT | \ - CRTC_SNAPSHOT2_INT | \ - CRTC_VBLANK_BIT2_INT | \ - 0 \ - ) -#define CRTC_GEN_CNTL IOPortTag(0x07u, 0x07u) -# define CRTC_DBL_SCAN_EN 0x00000001ul -# define CRTC_INTERLACE_EN 0x00000002ul -# define CRTC_HSYNC_DIS 0x00000004ul -# define CRTC_VSYNC_DIS 0x00000008ul -# define CRTC_CSYNC_EN 0x00000010ul -# define CRTC_PIX_BY_2_EN 0x00000020ul -# define CRTC2_DBL_SCAN_EN 0x00000020ul /* LTPro */ -# define CRTC_DISPLAY_DIS 0x00000040ul -# define CRTC_VGA_XOVERSCAN 0x00000080ul -# define CRTC_PIX_WIDTH 0x00000700ul -# define CRTC_BYTE_PIX_ORDER 0x00000800ul -# define CRTC_VSYNC_INT_EN 0x00001000ul /* XC/XL */ -# define CRTC_VSYNC_INT 0x00002000ul /* XC/XL */ -# define CRTC_FIFO_OVERFILL 0x0000c000ul /* VT/GT */ -# define CRTC2_VSYNC_INT_EN 0x00004000ul /* XC/XL */ -# define CRTC2_VSYNC_INT 0x00008000ul /* XC/XL */ -# define CRTC_FIFO_LWM 0x000f0000ul -# define CRTC_HVSYNC_IO_DRIVE 0x00010000ul /* XC/XL */ -# define CRTC2_PIX_WIDTH 0x000e0000ul /* LTPro */ -# define CRTC_VGA_128KAP_PAGING 0x00100000ul /* VT/GT */ -# define CRTC_DISPREQ_ONLY 0x00200000ul /* VT/GT */ -# define CRTC_VFC_SYNC_TRISTATE 0x00200000ul /* VTB/GTB/LT */ -# define CRTC2_EN 0x00200000ul /* LTPro */ -# define CRTC_LOCK_REGS 0x00400000ul /* VT/GT */ -# define CRTC_SYNC_TRISTATE 0x00800000ul /* VT/GT */ -# define CRTC_EXT_DISP_EN 0x01000000ul -# define CRTC_EN 0x02000000ul -# define CRTC_DISP_REQ_EN 0x04000000ul -# define CRTC_VGA_LINEAR 0x08000000ul -# define CRTC_VSYNC_FALL_EDGE 0x10000000ul -# define CRTC_VGA_TEXT_132 0x20000000ul -# define CRTC_CNT_EN 0x40000000ul -# define CRTC_CUR_B_TEST 0x80000000ul -# define CRTC_INT_ENS_X /* *** UPDATE ME *** */ \ - ( \ - CRTC_VSYNC_INT_EN | \ - CRTC2_VSYNC_INT_EN | \ - 0 \ - ) -# define CRTC_INT_ACKS_X /* *** UPDATE ME *** */ \ - ( \ - CRTC_VSYNC_INT | \ - CRTC2_VSYNC_INT | \ - 0 \ - ) -#define DSP_CONFIG BlockIOTag(0x08u) /* VTB/GTB/LT */ -# define DSP_XCLKS_PER_QW 0x00003ffful -/* ? 0x00004000ul */ -# define DSP_FLUSH_WB 0x00008000ul -# define DSP_LOOP_LATENCY 0x000f0000ul -# define DSP_PRECISION 0x00700000ul -/* ? 0xff800000ul */ -#define DSP_ON_OFF BlockIOTag(0x09u) /* VTB/GTB/LT */ -# define DSP_OFF 0x000007fful -/* ? 0x0000f800ul */ -# define DSP_ON 0x07ff0000ul -/* ? 0xf8000000ul */ -#define TIMER_CONFIG BlockIOTag(0x0au) /* VTB/GTB/LT */ -#define MEM_BUF_CNTL BlockIOTag(0x0bu) /* VTB/GTB/LT */ -#define SHARED_CNTL BlockIOTag(0x0cu) /* VTB/GTB/LT */ -#define SHARED_MEM_CONFIG BlockIOTag(0x0du) /* VTB/GTB/LT */ -#define MEM_ADDR_CONFIG BlockIOTag(0x0du) /* GTPro */ -#define SHARED_CNTL_CTD BlockIOTag(0x0eu) /* CTD */ -/* ? 0x00fffffful */ -#define CTD_FIFO5 0x01000000ul -/* ? 0xfe000000ul */ -#define CRT_TRAP BlockIOTag(0x0eu) /* VTB/GTB/LT */ -#define DSTN_CONTROL BlockIOTag(0x0fu) /* LT */ -#define I2C_CNTL_0 BlockIOTag(0x0fu) /* GTPro */ -#define OVR_CLR IOPortTag(0x08u, 0x10u) -# define OVR_CLR_8 0x000000fful -# define OVR_CLR_B 0x0000ff00ul -# define OVR_CLR_G 0x00ff0000ul -# define OVR_CLR_R 0xff000000ul -#define OVR_WID_LEFT_RIGHT IOPortTag(0x09u, 0x11u) -# define OVR_WID_LEFT 0x0000003ful /* 0x0f on <LT */ -/* ? 0x0000ffc0ul */ -# define OVR_WID_RIGHT 0x003f0000ul /* 0x0f0000 on <LT */ -/* ? 0xffc00000ul */ -#define OVR_WID_TOP_BOTTOM IOPortTag(0x0au, 0x12u) -# define OVR_WID_TOP 0x000001fful /* 0x00ff on <LT */ -/* ? 0x0000fe00ul */ -# define OVR_WID_BOTTOM 0x01ff0000ul /* 0x00ff0000 on <LT */ -/* ? 0xfe000000ul */ -#define VGA_DSP_CONFIG BlockIOTag(0x13u) /* VTB/GTB/LT */ -# define VGA_DSP_XCLKS_PER_QW DSP_XCLKS_PER_QW -/* ? 0x000fc000ul */ -# define VGA_DSP_PREC_PCLKBY2 0x00700000ul -/* ? 0x00800000ul */ -# define VGA_DSP_PREC_PCLK 0x07000000ul -/* ? 0xf8000000ul */ -#define VGA_DSP_ON_OFF BlockIOTag(0x14u) /* VTB/GTB/LT */ -# define VGA_DSP_OFF DSP_OFF -/* ? 0x0000f800ul */ -# define VGA_DSP_ON DSP_ON -/* ? 0xf8000000ul */ -#define DSP2_CONFIG BlockIOTag(0x15u) /* LTPro */ -#define DSP2_ON_OFF BlockIOTag(0x16u) /* LTPro */ -#define EXT_CRTC_GEN_CNTL BlockIOTag(0x17u) /* VT-A4 (W) */ -#define CRTC2_OFF_PITCH BlockIOTag(0x17u) /* LTPro */ -#define CUR_CLR0 IOPortTag(0x0bu, 0x18u) -#define CUR_CLR1 IOPortTag(0x0cu, 0x19u) -/* These are for both CUR_CLR0 and CUR_CLR1 */ -# define CUR_CLR_I 0x000000fful -# define CUR_CLR_B 0x0000ff00ul -# define CUR_CLR_G 0x00ff0000ul -# define CUR_CLR_R 0xff000000ul -# define CUR_CLR (CUR_CLR_R | CUR_CLR_G | CUR_CLR_B) -#define CUR_OFFSET IOPortTag(0x0du, 0x1au) -#define CUR_HORZ_VERT_POSN IOPortTag(0x0eu, 0x1bu) -# define CUR_HORZ_POSN 0x000007fful -/* ? 0x0000f800ul */ -# define CUR_VERT_POSN 0x07ff0000ul -/* ? 0xf8000000ul */ -#define CUR_HORZ_VERT_OFF IOPortTag(0x0fu, 0x1cu) -# define CUR_HORZ_OFF 0x0000007ful -/* ? 0x0000ff80ul */ -# define CUR_VERT_OFF 0x007f0000ul -/* ? 0xff800000ul */ -#define CONFIG_PANEL BlockIOTag(0x1du) /* LT */ -# define PANEL_FORMAT 0x00000007ul -/* ? 0x00000008ul */ -# define PANEL_TYPE 0x000000f0ul -# define NO_OF_GREY 0x00000700ul -# define MOD_GEN 0x00001800ul -# define EXT_LVDS_CLK 0x00001800ul /* LTPro */ -# define BLINK_RATE 0x00006000ul -# define BLINK_RATE_PRO 0x00002000ul /* LTPro */ -# define DONT_SHADOW_HEND 0x00004000ul /* LTPro */ -# define DONT_USE_F32KHZ 0x00008000ul -# define LCD_IO_DRIVE 0x00008000ul /* XC/XL */ -# define FP_POL 0x00010000ul -# define LP_POL 0x00020000ul -# define DTMG_POL 0x00040000ul -# define SCK_POL 0x00080000ul -# define DITHER_SEL 0x00300000ul -# define INVERSE_VIDEO_EN 0x00400000ul -# define BL_CLK_SEL 0x01800000ul -# define BL_LEVEL 0x0e000000ul -# define BL_CLK_SEL_PRO 0x00800000ul /* LTPro */ -# define BL_LEVEL_PRO 0x03000000ul /* LTPro */ -# define BIAS_LEVEL_PRO 0x0c000000ul /* LTPro */ -# define HSYNC_DELAY 0xf0000000ul -#define TV_OUT_INDEX BlockIOTag(0x1du) /* LTPro */ -# define TV_REG_INDEX 0x000000fful -# define TV_ON 0x00000100ul -/* ? 0xfffffe00ul */ -#define GP_IO IOPortTag(0x1eu, 0x1eu) /* VT/GT */ -#define GP_IO_CNTL BlockIOTag(0x1fu) /* VT/GT */ -#define HW_DEBUG BlockIOTag(0x1fu) /* VTB/GTB/LT */ -# define FAST_SRCCOPY_DIS 0x00000001ul -# define BYPASS_SUBPIC_DBF 0x00000001ul /* XL/XC */ -# define SRC_AUTONA_FIX_DIS 0x00000002ul -# define SYNC_PD_EN 0x00000002ul /* Mobility */ -# define DISP_QW_FIX_DIS 0x00000004ul -# define GUIDST_WB_EXP_DIS 0x00000008ul -# define CYC_ALL_FIX_DIS 0x00000008ul /* GTPro */ -# define AGPPLL_FIX_EN 0x00000008ul /* Mobility */ -# define SRC_AUTONA_ALWAYS_EN 0x00000010ul -# define GUI_BEATS_HOST_P 0x00000010ul /* GTPro */ -# define DRV_CNTL_DQMB_WEB 0x00000020ul -# define FAST_FILL_SCISSOR_DIS 0x00000020ul /* GT2c/VT4 */ -# define INTER_BLIT_FIX_DIS 0x00000020ul /* GTPro */ -# define DRV_CNTL_MA 0x00000040ul -# define AUTO_BLKWRT_COLOR_DIS 0x00000040ul /* GT2c/VT4 */ -# define INTER_PRIM_DIS 0x00000040ul /* GTPro */ -# define DRV_CNTL_MD 0x00000080ul -# define CHG_DEV_ID 0x00000100ul -# define SRC_TRACK_DST_FIX_DIS 0x00000200ul -# define HCLK_FB_SKEW 0x00000380ul /* GT2c/VT4 */ -# define SRC_TRACK_DST_FIX_DIS_P 0x00000080ul /* GTPro */ -# define AUTO_BLKWRT_COLOR_DIS_P 0x00000100ul /* GTPro */ -# define INTER_LINE_OVERLAP_DIS 0x00000200ul /* GTPro */ -# define MEM_OE_PULLBACK 0x00000400ul -# define DBL_BUFFER_EN 0x00000400ul /* GTPro */ -# define MEM_WE_FIX_DIS 0x00000800ul -# define MEM_OE_PULLBACK_B 0x00000800ul /* GT2c/VT4 */ -# define CMDFIFO_SIZE_DIS_P 0x00000800ul /* GTPro */ -# define RD_EN_FIX_DIS 0x00001000ul -# define MEM_WE_FIX_DIS_B 0x00001000ul -# define AUTO_FF_DIS 0x00001000ul /* GTPro */ -# define CMDFIFO_SIZE_DIS 0x00002000ul /* GT2c/VT4 */ -# define AUTO_BLKWRT_DIS 0x00002000ul /* GTPro */ -# define GUI_BEATS_HOST 0x00004000ul /* GT2c/VT4 */ -# define ORED_INVLD_RB_CACHE 0x00004000ul /* GTPro */ -# define BLOCK_DBL_BUF 0x00008000ul /* GTPro */ -# define R2W_TURNAROUND_DELAY 0x00020000ul /* GT2c/VT4 */ -# define ENA_32BIT_DATA_BUS 0x00040000ul /* GT2c/VT4 */ -# define HCLK_FB_SKEW_P 0x00070000ul /* GTPro */ -# define ENA_FLASH_ROM 0x00080000ul /* GT2c/VT4 */ -# define DISABLE_SWITCH_FIX 0x00080000ul /* GTPro */ -# define MCLK_START_EN 0x00080000ul /* LTPro */ -# define SEL_VBLANK_BDL_BUF 0x00100000ul /* GTPro */ -# define CMDFIFO_64EN 0x00200000ul /* GTPro must be set if IDCT_EN */ -# define BM_FIX_DIS 0x00400000ul /* GTPro */ -# define Z_SWITCH_EN 0x00800000ul /* LTPro */ -# define FLUSH_HOST_WB 0x01000000ul /* GTPro */ -# define HW_DEBUG_WRITE_MSK_FIX_DIS 0x02000000ul /* LTPro */ -# define Z_NO_WRITE_EN 0x04000000ul /* LTPro */ -# define DISABLE_PCLK_RESET_P 0x08000000ul /* LTPro */ -# define PM_D3_SUPPORT_ENABLE_P 0x10000000ul /* LTPro */ -# define STARTCYCLE_FIX_ENABLE 0x20000000ul /* LTPro */ -# define DONT_RST_CHAREN 0x20000000ul /* XL/XC */ -# define C3_FIX_ENABLE 0x40000000ul /* LTPro */ -# define BM_HOSTRA_EN 0x40000000ul /* XL/XC */ -# define PKGBGAb 0x80000000ul /* XL/XC */ -# define AUTOEXP_HORZ_FIX 0x80000000ul /* Mobility */ -#define SCRATCH_REG0 IOPortTag(0x10u, 0x20u) -#define SCRATCH_REG1 IOPortTag(0x11u, 0x21u) -/* BIOS_BASE_SEGMENT 0x0000007ful */ /* As above */ -/* ? 0x00000f80ul */ -#define BIOS_INIT_DAC_SUBTYPE 0x0000f000ul -/* ? 0xffff0000ul */ -#define SCRATCH_REG2 BlockIOTag(0x22u) /* LT */ -#define SCRATCH_REG3 BlockIOTag(0x23u) /* GTPro */ -#define CLOCK_CNTL IOPortTag(0x12u, 0x24u) -# define CLOCK_BIT 0x00000004ul /* For ICS2595 */ -# define CLOCK_PULSE 0x00000008ul /* For ICS2595 */ -# define CLOCK_SELECT 0x0000000ful -# define CLOCK_DIVIDER 0x00000030ul -# define CLOCK_STROBE 0x00000040ul -# define CLOCK_DATA 0x00000080ul -/* ? 0x00000100ul */ -# define PLL_WR_EN 0x00000200ul /* For internal PLL */ -# define PLL_ADDR 0x0000fc00ul /* For internal PLL */ -# define PLL_DATA 0x00ff0000ul /* For internal PLL */ -/* ? 0xff000000ul */ -#define CONFIG_STAT64_1 BlockIOTag(0x25u) /* GTPro */ -# define CFG_SUBSYS_DEV_ID 0x000000fful -# define CFG_SUBSYS_VEN_ID 0x00ffff00ul -/* ? 0x1f000000ul */ -# define CFG_DIMM_TYPE 0xe0000000ul -# define CFG_PCI_SUBSYS_DEV_ID 0x0000fffful /* XC/XL */ -# define CFG_PCI_SUBSYS_VEN_ID 0xffff0000ul /* XC/XL */ -#define CONFIG_STAT64_2 BlockIOTag(0x26u) /* GTPro */ -# define CFG_DIMM_TYPE_3 0x00000001ul -/* ? 0x0000001eul */ -# define CFG_ROMWRTEN 0x00000020ul -# define CFG_AGPVCOGAIN 0x000000c0ul -# define CFG_PCI_TYPE 0x00000100ul -# define CFG_AGPSKEW 0x00000e00ul -# define CFG_X1CLKSKEW 0x00007000ul -# define CFG_PANEL_ID_P 0x000f8000ul /* LTPro */ -/* ? 0x00100000ul */ -# define CFG_PREFETCH_EN 0x00200000ul -# define CFG_ID_DISABLE 0x00400000ul -# define CFG_PRE_TESTEN 0x00800000ul -/* ? 0x01000000ul */ -# define CFG_PCI5VEN 0x02000000ul /* LTPro */ -# define CFG_VGA_DISABLE 0x04000000ul -# define CFG_ENINTB 0x08000000ul -/* ? 0x10000000ul */ -# define CFG_ROM_REMAP_2 0x20000000ul -# define CFG_IDSEL 0x40000000ul -/* ? 0x80000000ul */ -#define TV_OUT_DATA BlockIOTag(0x27u) /* LTPro */ -#define BUS_CNTL IOPortTag(0x13u, 0x28u) -# define BUS_WS 0x0000000ful -# define BUS_DBL_RESYNC 0x00000001ul /* VTB/GTB/LT */ -# define BUS_MSTR_RESET 0x00000002ul /* VTB/GTB/LT */ -# define BUS_FLUSH_BUF 0x00000004ul /* VTB/GTB/LT */ -# define BUS_STOP_REQ_DIS 0x00000008ul /* VTB/GTB/LT */ -# define BUS_ROM_WS 0x000000f0ul -# define BUS_APER_REG_DIS 0x00000010ul /* VTB/GTB/LT */ -# define BUS_EXTRA_PIPE_DIS 0x00000020ul /* VTB/GTB/LT */ -# define BUS_MASTER_DIS 0x00000040ul /* VTB/GTB/LT */ -# define BUS_ROM_WRT_EN 0x00000080ul /* GTPro */ -# define BUS_ROM_PAGE 0x00000f00ul -# define BUS_MINOR_REV_ID 0x00000700ul /* LTPro */ -# define BUS_EXT_REG_EN 0x08000000ul -/* First silicom - Prototype (A11) 0x00000000ul */ -/* Metal mask spin (A12 & A13) 0x00000100ul */ -/* All layer spin (A21) 0x00000200ul */ -/* Fast metal spin (A22) - Prod. 0x00000300ul */ -/* All layer spin (A31) 0x00000700ul */ -/* ? 0x00000800ul */ /* LTPro */ -# define BUS_CHIP_HIDDEN_REV 0x00000300ul /* XC/XL */ -/* ? 0x00001c00ul */ /* XC/XL */ -# define BUS_ROM_DIS 0x00001000ul -# define BUS_IO_16_EN 0x00002000ul /* GX */ -# define BUS_PCI_READ_RETRY_EN 0x00002000ul /* VTB/GTB/LT */ -# define BUS_DAC_SNOOP_EN 0x00004000ul -# define BUS_PCI_RETRY_EN 0x00008000ul /* VT/GT */ -# define BUS_PCI_WRT_RETRY_EN 0x00008000ul /* VTB/GTB/LT */ -# define BUS_FIFO_WS 0x000f0000ul -# define BUS_RETRY_WS 0x000f0000ul /* VTB/GTB/LT */ -# define BUS_FIFO_ERR_INT_EN 0x00100000ul -# define BUS_MSTR_RD_MULT 0x00100000ul /* VTB/GTB/LT */ -# define BUS_FIFO_ERR_INT 0x00200000ul -# define BUS_MSTR_RD_LINE 0x00200000ul /* VTB/GTB/LT */ -# define BUS_HOST_ERR_INT_EN 0x00400000ul -# define BUS_SUSPEND 0x00400000ul /* GTPro */ -# define BUS_HOST_ERR_INT 0x00800000ul -# define BUS_LAT16X 0x00800000ul /* GTPro */ -# define BUS_PCI_DAC_WS 0x07000000ul -# define BUS_RD_DISCARD_EN 0x01000000ul /* VTB/GTB/LT */ -# define BUS_RD_ABORT_EN 0x02000000ul /* VTB/GTB/LT */ -# define BUS_MSTR_WS 0x04000000ul /* VTB/GTB/LT */ -# define BUS_PCI_DAC_DLY 0x08000000ul -# define BUS_EXT_REG_EN 0x08000000ul /* VT/GT */ -# define BUS_PCI_MEMW_WS 0x10000000ul -# define BUS_MSTR_DISCONNECT_EN 0x10000000ul /* VTB/GTB/LT */ -# define BUS_PCI_BURST_DEC 0x20000000ul /* GX/CX */ -# define BUS_BURST 0x20000000ul /* 264xT */ -# define BUS_WRT_BURST 0x20000000ul /* VTB/GTB/LT */ -# define BUS_RDY_READ_DLY 0xc0000000ul -# define BUS_READ_BURST 0x40000000ul /* VTB/GTB/LT */ -# define BUS_RDY_READ_DLY_B 0x80000000ul /* VTB/GTB/LT */ -#define LCD_INDEX BlockIOTag(0x29u) /* LTPro */ -# define LCD_REG_INDEX 0x0000003ful -# define LCD_DISPLAY_DIS 0x00000100ul -# define LCD_SRC_SEL 0x00000200ul -# define LCD_SRC_SEL_CRTC1 0x00000000ul -# define LCD_SRC_SEL_CRTC2 0x00000200ul -# define LCD_CRTC2_DISPLAY_DIS 0x00000400ul -# define LCD_GUI_ACTIVE 0x00000800ul /* XC/XL */ -# define LCD_MONDET_SENSE 0x01000000ul /* XC/XL */ -# define LCD_MONDET_INT_POL 0x02000000ul /* XC/XL */ -# define LCD_MONDET_INT_EN 0x04000000ul /* XC/XL */ -# define LCD_MONDET_INT 0x08000000ul /* XC/XL */ -# define LCD_MONDET_EN 0x10000000ul /* XC/XL */ -# define LCD_EN_PL 0x20000000ul /* XC/XL */ -#define HFB_PITCH_ADDR BlockIOTag(0x2au) /* LT */ -#define LCD_DATA BlockIOTag(0x2au) /* LTPro */ -#define EXT_MEM_CNTL BlockIOTag(0x2bu) /* VTB/GTB/LT */ -#define MEM_CNTL IOPortTag(0x14u, 0x2cu) -# define CTL_MEM_SIZE 0x00000007ul -/* ? 0x00000008ul */ -# define CTL_MEM_REFRESH 0x00000078ul /* VT/GT */ -# define CTL_MEM_SIZEB 0x0000000ful /* VTB/GTB/LT */ -# define CTL_MEM_RD_LATCH_EN 0x00000010ul -# define CTL_MEM_RD_LATCH_DLY 0x00000020ul -# define CTL_MEM_LATENCY 0x00000030ul /* VTB/GTB/LT */ -# define CTL_MEM_SD_LATCH_EN 0x00000040ul -# define CTL_MEM_SD_LATCH_DLY 0x00000080ul -# define CTL_MEM_LATCH 0x000000c0ul /* VTB/GTB/LT */ -# define CTL_MEM_WDOE_CNTL 0x000000c0ul /* XC/XL */ -# define CTL_MEM_FULL_PLS 0x00000100ul -# define CTL_MEM_CYC_LNTH_AUX 0x00000180ul /* VT/GT */ -# define CTL_MEM_TRP 0x00000300ul /* VTB/GTB/LT */ -# define CTL_MEM_CYC_LNTH 0x00000600ul -# define CTL_MEM_REFRESH_RATE 0x00001800ul /* 264xT */ -# define CTL_MEM_TRCD 0x00000c00ul /* VTB/GTB/LT */ -# define CTL_MEM_WR_RDY_SEL 0x00000800ul /* GX/CX */ -# define CTL_MEM_EXT_RMW_CYC_EN 0x00001000ul /* GX/CX */ -# define CTL_MEM_TCRD 0x00001000ul /* VTB/GTB/LT */ -# define CTL_MEM_DLL_RESET 0x00002000ul /* VT/GT */ -# define CTL_MEM_TR2W 0x00002000ul /* GTPro */ -# define CTL_MEM_ACTV_PRE 0x0000c000ul /* VT/GT */ -# define CTL_MEM_CAS_PHASE 0x00004000ul /* GTPro */ -# define CTL_MEM_OE_PULLBACK 0x00008000ul /* GTPro */ -# define CTL_MEM_TWR 0x0000c000ul /* XC/XL */ -# define CTL_MEM_BNDRY 0x00030000ul -# define CTL_MEM_BNDRY_0K 0x00000000ul -# define CTL_MEM_BNDRY_256K 0x00010000ul -# define CTL_MEM_BNDRY_512K 0x00020000ul -# define CTL_MEM_BNDRY_1024K 0x00030000ul -# define CTL_MEM_DLL_GAIN_CNTL 0x00030000ul /* VT/GT */ -# define CTL_MEM_BNDRY_EN 0x00040000ul -# define CTL_MEM_SDRAM_RESET 0x00040000ul /* VT/GT */ -# define CTL_MEM_TRAS 0x00070000ul /* VTB/GTB/LT */ -# define CTL_MEM_TILE_SELECT 0x00180000ul /* VT/GT */ -# define CTL_MEM_REFRESH_DIS 0x00080000ul /* VTB/GTB/LT */ -# define CTL_MEM_LOW_LATENCY_MODE 0x00200000ul /* VT/GT */ -# define CTL_MEM_CDE_PULLBACK 0x00400000ul /* VT/GT */ -# define CTL_MEM_REFRESH_RATE_B 0x00f00000ul /* VTB/GTB/LT */ -# define CTL_MEM_PIX_WIDTH 0x07000000ul -# define CTL_MEM_LOWER_APER_ENDIAN 0x03000000ul /* VTB/GTB/LT */ -# define CTL_MEM_OE_SELECT 0x18000000ul /* VT/GT */ -# define CTL_MEM_UPPER_APER_ENDIAN 0x0c000000ul /* VTB/GTB/LT */ -/* ? 0xe0000000ul */ -# define CTL_MEM_PAGE_SIZE 0x30000000ul /* VTB/GTB/LT */ -#define MEM_VGA_WP_SEL IOPortTag(0x15u, 0x2du) -# define MEM_VGA_WPS0 0x0000fffful -# define MEM_VGA_WPS1 0xffff0000ul -#define MEM_VGA_RP_SEL IOPortTag(0x16u, 0x2eu) -# define MEM_VGA_RPS0 0x0000fffful -# define MEM_VGA_RPS1 0xffff0000ul -#define LT_GIO BlockIOTag(0x2fu) /* LT */ -#define I2C_CNTL_1 BlockIOTag(0x2fu) /* GTPro */ -#define DAC_REGS IOPortTag(0x17u, 0x30u) /* 4 separate bytes */ -# define M64_DAC_WRITE (DAC_REGS + 0) -# define M64_DAC_DATA (DAC_REGS + 1) -# define M64_DAC_MASK (DAC_REGS + 2) -# define M64_DAC_READ (DAC_REGS + 3) -#define DAC_CNTL IOPortTag(0x18u, 0x31u) -# define DAC_EXT_SEL 0x00000003ul -# define DAC_EXT_SEL_RS2 0x00000001ul -# define DAC_EXT_SEL_RS3 0x00000002ul -# define DAC_RANGE_CTL 0x00000003ul /* VTB/GTB/LT */ -# define DAC_BLANKING 0x00000004ul /* 264xT */ -# define DAC_CMP_DIS 0x00000008ul /* 264xT */ -# define DAC1_CLK_SEL 0x00000010ul /* LTPro */ -# define DAC_PALETTE_ACCESS_CNTL 0x00000020ul /* LTPro */ -# define DAC_PALETTE2_SNOOP_EN 0x00000040ul /* LTPro */ -# define DAC_CMP_OUTPUT 0x00000080ul /* 264xT */ -# define DAC_8BIT_EN 0x00000100ul -# define DAC_PIX_DLY 0x00000600ul -# define DAC_DIRECT 0x00000400ul /* VTB/GTB/LT */ -# define DAC_BLANK_ADJ 0x00001800ul -# define DAC_PAL_CLK_SEL 0x00000800ul /* VTB/GTB/LT */ -# define DAC_CRT_SENSE 0x00000800ul /* XC/XL */ -# define DAC_CRT_DETECTION_ON 0x00001000ul /* XC/XL */ -# define DAC_VGA_ADR_EN 0x00002000ul -# define DAC_FEA_CON_EN 0x00004000ul /* 264xT */ -# define DAC_PDMN 0x00008000ul /* 264xT */ -# define DAC_TYPE 0x00070000ul -/* ? 0x00f80000ul */ -# define DAC_MON_ID_STATE0 0x01000000ul /* GX-E+/CX */ -# define DAC_GIO_STATE_1 0x01000000ul /* 264xT */ -# define DAC_MON_ID_STATE1 0x02000000ul /* GX-E+/CX */ -# define DAC_GIO_STATE_0 0x02000000ul /* 264xT */ -# define DAC_MON_ID_STATE2 0x04000000ul /* GX-E+/CX */ -# define DAC_GIO_STATE_4 0x04000000ul /* 264xT */ -# define DAC_MON_ID_DIR0 0x08000000ul /* GX-E+/CX */ -# define DAC_GIO_DIR_1 0x08000000ul /* 264xT */ -# define DAC_MON_ID_DIR1 0x10000000ul /* GX-E+/CX */ -# define DAC_GIO_DIR_0 0x10000000ul /* 264xT */ -# define DAC_MON_ID_DIR2 0x20000000ul /* GX-E+/CX */ -# define DAC_GIO_DIR_4 0x20000000ul /* 264xT */ -# define DAC_MAN_CMP_STATE 0x40000000ul /* GX-E+ */ -# define DAC_RW_WS 0x80000000ul /* VT/GT */ -#define HORZ_STRETCHING BlockIOTag(0x32u) /* LT */ -# define HORZ_STRETCH_BLEND 0x00000ffful -# define HORZ_STRETCH_RATIO 0x0000fffful -# define HORZ_STRETCH_LOOP 0x00070000ul -# define HORZ_STRETCH_LOOP09 0x00000000ul -# define HORZ_STRETCH_LOOP11 0x00010000ul -# define HORZ_STRETCH_LOOP12 0x00020000ul -# define HORZ_STRETCH_LOOP14 0x00030000ul -# define HORZ_STRETCH_LOOP15 0x00040000ul -/* ? 0x00050000ul */ -/* ? 0x00060000ul */ -/* ? 0x00070000ul */ -/* ? 0x00080000ul */ -# define HORZ_PANEL_SIZE 0x0ff00000ul /* XC/XL */ -/* ? 0x10000000ul */ -# define AUTO_HORZ_RATIO 0x20000000ul /* XC/XL */ -# define HORZ_STRETCH_MODE 0x40000000ul -# define HORZ_STRETCH_EN 0x80000000ul -#define EXT_DAC_REGS BlockIOTag(0x32u) /* GTPro */ -#define VERT_STRETCHING BlockIOTag(0x33u) /* LT */ -# define VERT_STRETCH_RATIO0 0x000003fful -# define VERT_STRETCH_RATIO1 0x000ffc00ul -# define VERT_STRETCH_RATIO2 0x3ff00000ul -# define VERT_STRETCH_USE0 0x40000000ul -# define VERT_STRETCH_EN 0x80000000ul -#define GEN_TEST_CNTL IOPortTag(0x19u, 0x34u) -# define GEN_EE_DATA_OUT 0x00000001ul /* GX/CX */ -# define GEN_GIO2_DATA_OUT 0x00000001ul /* 264xT */ -# define GEN_EE_CLOCK 0x00000002ul /* GX/CX */ -/* ? 0x00000002ul */ /* 264xT */ -# define GEN_EE_CHIP_SEL 0x00000004ul /* GX/CX */ -# define GEN_GIO3_DATA_OUT 0x00000004ul /* 264xT */ -# define GEN_EE_DATA_IN 0x00000008ul /* GX/CX */ -# define GEN_GIO2_DATA_IN 0x00000008ul /* 264xT */ -# define GEN_EE_EN 0x00000010ul /* GX/CX */ -# define GEN_GIO2_ENABLE 0x00000010ul /* 264xT */ -# define GEN_ICON2_ENABLE 0x00000010ul /* XC/XL */ -# define GEN_OVR_OUTPUT_EN 0x00000020ul /* GX/CX */ -# define GEN_GIO2_WRITE 0x00000020ul /* 264xT */ -# define GEN_CUR2_ENABLE 0x00000020ul /* XC/XL */ -# define GEN_OVR_POLARITY 0x00000040ul /* GX/CX */ -# define GEN_ICON_ENABLE 0x00000040ul /* XC/XL */ -# define GEN_CUR_EN 0x00000080ul -# define GEN_GUI_EN 0x00000100ul /* GX/CX */ -# define GEN_GUI_RESETB 0x00000100ul /* 264xT */ -# define GEN_BLOCK_WR_EN 0x00000200ul /* GX */ -/* ? 0x00000200ul */ /* CX/264xT */ -# define GEN_SOFT_RESET 0x00000200ul /* VTB/GTB/LT */ -# define GEN_MEM_TRISTATE 0x00000400ul /* GTPro */ -/* ? 0x00000800ul */ -# define GEN_TEST_VECT_MODE 0x00003000ul /* VT/GT */ -/* ? 0x0000c000ul */ -# define GEN_TEST_FIFO_EN 0x00010000ul /* GX/CX */ -# define GEN_TEST_GUI_REGS_EN 0x00020000ul /* GX/CX */ -# define GEN_TEST_VECT_EN 0x00040000ul /* GX/CX */ -# define GEN_TEST_CRC_STR 0x00080000ul /* GX-C/-D */ -/* ? 0x00080000ul */ /* GX-E+/CX */ -# define GEN_TEST_MODE_T 0x000f0000ul /* 264xT */ -# define GEN_TEST_MODE 0x00700000ul /* GX/CX */ -# define GEN_TEST_CNT_EN 0x00100000ul /* 264xT */ -# define GEN_TEST_CRC_EN 0x00200000ul /* 264xT */ -/* ? 0x00400000ul */ /* 264xT */ -/* ? 0x00800000ul */ -# define GEN_TEST_MEM_WR 0x01000000ul /* GX-C/-D */ -# define GEN_TEST_MEM_STROBE 0x02000000ul /* GX-C/-D */ -# define GEN_TEST_DST_SS_EN 0x04000000ul /* GX/CX */ -# define GEN_TEST_DST_SS_STROBE 0x08000000ul /* GX/CX */ -# define GEN_TEST_SRC_SS_EN 0x10000000ul /* GX/CX */ -# define GEN_TEST_SRC_SS_STROBE 0x20000000ul /* GX/CX */ -# define GEN_TEST_CNT_VALUE 0x3f000000ul /* 264xT */ -# define GEN_TEST_CC_EN 0x40000000ul /* GX/CX */ -# define GEN_TEST_CC_STROBE 0x80000000ul /* GX/CX */ -/* ? 0xc0000000ul */ /* 264xT */ -# define GEN_DEBUG_MODE 0xff000000ul /* VTB/GTB/LT */ -# define GEN_DEBUG_MC_PARSER 0x2A000000ul /* Mobility pro */ -# define GEN_DEBUG_IDCT_PARSER 0x2B000000ul /* Mobility pro */ -# define GEN_DEBUG_MC_BUFFER 0x2C000000ul /* Mobility pro */ -# define GEN_DEBUG_IDCT_BUFFER 0x2E000000ul /* Mobility pro */ -# define GEN_DEBUG_IDCT1 0x90000000ul /* Mobility pro */ -# define GEN_DEBUG_IDCT2 0x91000000ul /* Mobility pro */ -# define GEN_DEBUG_IDCT3 0x92000000ul /* Mobility pro */ -#define LCD_GEN_CTRL BlockIOTag(0x35u) /* LT */ -# define CRT_ON 0x00000001ul -# define LCD_ON 0x00000002ul -# define HORZ_DIVBY2_EN 0x00000004ul -# define DONT_DS_ICON 0x00000008ul -# define LOCK_8DOT 0x00000010ul -# define ICON_ENABLE 0x00000020ul -# define DONT_SHADOW_VPAR 0x00000040ul -# define V2CLK_PM_EN 0x00000080ul -# define RST_FM 0x00000100ul -# define DISABLE_PCLK_RESET 0x00000200ul /* XC/XL */ -# define DIS_HOR_CRT_DIVBY2 0x00000400ul -# define SCLK_SEL 0x00000800ul -# define SCLK_DELAY 0x0000f000ul -# define TVCLK_PM_EN 0x00010000ul -# define VCLK_DAC_PM_EN 0x00020000ul -# define VCLK_LCD_OFF 0x00040000ul -# define SELECT_WAIT_4MS 0x00080000ul -# define XTALIN_PM_EN 0x00080000ul /* XC/XL */ -# define V2CLK_DAC_PM_EN 0x00100000ul -# define LVDS_EN 0x00200000ul -# define LVDS_PLL_EN 0x00400000ul -# define LVDS_PLL_RESET 0x00800000ul -# define LVDS_RESERVED_BITS 0x07000000ul -# define CRTC_RW_SELECT 0x08000000ul /* LTPro */ -# define USE_SHADOWED_VEND 0x10000000ul -# define USE_SHADOWED_ROWCUR 0x20000000ul -# define SHADOW_EN 0x40000000ul -# define SHADOW_RW_EN 0x80000000ul -#define CUSTOM_MACRO_CNTL BlockIOTag(0x35u) /* GTPro */ -# define IDCT_FIFO_EXTENSE 0x00000001ul -#define POWER_MANAGEMENT BlockIOTag(0x36u) /* LT */ -# define PWR_MGT_ON 0x00000001ul -# define PWR_MGT_MODE 0x00000006ul -# define AUTO_PWRUP_EN 0x00000008ul -# define ACTIVITY_PIN_ON 0x00000010ul -# define STANDBY_POL 0x00000020ul -# define SUSPEND_POL 0x00000040ul -# define SELF_REFRESH 0x00000080ul -# define ACTIVITY_PIN_EN 0x00000100ul -# define KEYBD_SNOOP 0x00000200ul -# define USE_F32KHZ 0x00000400ul /* LTPro */ -# define DONT_USE_XTALIN 0x00000400ul /* XC/XL */ -# define TRISTATE_MEM_EN 0x00000800ul /* LTPro */ -# define LCDENG_TEST_MODE 0x0000f000ul -# define STANDBY_COUNT 0x000f0000ul -# define SUSPEND_COUNT 0x00f00000ul -# define BAISON 0x01000000ul -# define BLON 0x02000000ul -# define DIGON 0x04000000ul -# define PM_D3_SUPPORT_ENABLE 0x08000000ul /* XC/XL */ -# define STANDBY_NOW 0x10000000ul -# define SUSPEND_NOW 0x20000000ul -# define PWR_MGT_STATUS 0xc0000000ul -#define CONFIG_CNTL IOPortTag(0x1au, 0x37u) -# define CFG_MEM_AP_SIZE 0x00000003ul -# define CFG_MEM_VGA_AP_EN 0x00000004ul -/* ? 0x00000008ul */ -# define CFG_MEM_AP_LOC 0x00003ff0ul -/* ? 0x0000c000ul */ -# define CFG_CARD_ID 0x00070000ul -# define CFG_VGA_DIS 0x00080000ul -/* ? 0x00f00000ul */ -# define CFG_CDE_WINDOW 0x3f000000ul /* VT/GT */ -/* ? 0xc0000000ul */ -#define CONFIG_CHIP_ID IOPortTag(0x1bu, 0x38u) /* Read */ -# define CFG_CHIP_TYPE0 0x000000fful -# define CFG_CHIP_TYPE1 0x0000ff00ul -# define CFG_CHIP_TYPE 0x0000fffful -# define CFG_CHIP_CLASS 0x00ff0000ul -# define CFG_CHIP_REV 0xff000000ul -# define CFG_CHIP_VERSION 0x07000000ul /* 264xT */ -# define CFG_CHIP_FOUNDRY 0x38000000ul /* 264xT */ -# define CFG_CHIP_REVISION 0xc0000000ul /* 264xT */ -#define CONFIG_STATUS64_0 IOPortTag(0x1cu, 0x39u) /* Read (R/W (264xT)) */ -# define CFG_BUS_TYPE 0x00000007ul /* GX/CX */ -# define CFG_MEM_TYPE_T 0x00000007ul /* 264xT */ -# define CFG_MEM_TYPE 0x00000038ul /* GX/CX */ -# define CFG_DUAL_CAS_EN_T 0x00000008ul /* 264xT */ -# define CFG_ROM_128K_EN 0x00000008ul /* VTB/GTB/LT */ -# define CFG_ROM_REMAP 0x00000008ul /* GTPro */ -# define CFG_VGA_EN_T 0x00000010ul /* VT/GT */ -# define CFG_CLOCK_EN 0x00000020ul /* 264xT */ -# define CFG_DUAL_CAS_EN 0x00000040ul /* GX/CX */ -# define CFG_VMC_SENSE 0x00000040ul /* VT/GT */ -# define CFG_SHARED_MEM_EN 0x00000040ul /* VTB/GTB/LT */ -# define CFG_LOCAL_BUS_OPTION 0x00000180ul /* GX/CX */ -# define CFG_VFC_SENSE 0x00000080ul /* VT/GT */ -# define CFG_INIT_DAC_TYPE 0x00000e00ul /* GX/CX */ -# define CFG_INIT_CARD_ID 0x00007000ul /* GX-C/-D */ -# define CFG_BLK_WR_SIZE 0x00001000ul /* GX-E+ */ -# define CFG_INT_QSF_EN 0x00002000ul /* GX-E+ */ -/* ? 0x00004000ul */ /* GX-E+ */ -/* ? 0x00007000ul */ /* CX */ -# define CFG_TRI_BUF_DIS 0x00008000ul /* GX/CX */ -# define CFG_BOARD_ID 0x0000ff00ul /* VT/GT */ -# define CFG_EXT_RAM_ADDR 0x003f0000ul /* GX/CX */ -# define CFG_PANEL_ID 0x001f0000ul /* LT */ -# define CFG_MACROVISION_EN 0x00200000ul /* GTPro */ -# define CFG_ROM_DIS 0x00400000ul /* GX/CX */ -# define CFG_PCI33EN 0x00400000ul /* GTPro */ -# define CFG_VGA_EN 0x00800000ul /* GX/CX */ -# define CFG_FULLAGP 0x00800000ul /* GTPro */ -# define CFG_ARITHMOS_ENABLE 0x00800000ul /* XC/XL */ -# define CFG_LOCAL_BUS_CFG 0x01000000ul /* GX/CX */ -# define CFG_CHIP_EN 0x02000000ul /* GX/CX */ -# define CFG_LOCAL_READ_DLY_DIS 0x04000000ul /* GX/CX */ -# define CFG_ROM_OPTION 0x08000000ul /* GX/CX */ -# define CFG_BUS_OPTION 0x10000000ul /* GX/CX */ -# define CFG_LOCAL_DAC_WR_EN 0x20000000ul /* GX/CX */ -# define CFG_VLB_RDY_DIS 0x40000000ul /* GX/CX */ -# define CFG_AP_4GBYTE_DIS 0x80000000ul /* GX/CX */ -#define CONFIG_STATUS64_1 IOPortTag(0x1du, 0x3au) /* Read */ -# define CFG_PCI_DAC_CFG 0x00000001ul /* GX/CX */ -/* ? 0x0000001eul */ /* GX/CX */ -# define CFG_1C8_IO_SEL 0x00000020ul /* GX/CX */ -/* ? 0xffffffc0ul */ /* GX/CX */ -# define CRC_SIG 0xfffffffful /* 264xT */ -#define MPP_CONFIG BlockIOTag(0x3bu) /* VTB/GTB/LT */ -#define MPP_STROBE_CONFIG BlockIOTag(0x3cu) /* VTB/GTB/LT */ -#define MPP_ADDR BlockIOTag(0x3du) /* VTB/GTB/LT */ -#define MPP_DATA BlockIOTag(0x3eu) /* VTB/GTB/LT */ -#define TVO_CNTL BlockIOTag(0x3fu) /* VTB/GTB/LT */ -/* GP_IO IOPortTag(0x1eu, 0x1eu) */ /* See above */ -/* CRTC_H_TOTAL_DISP IOPortTag(0x1fu, 0x00u) */ /* Duplicate */ -#define DST_OFF_PITCH BlockIOTag(0x40u) -# define DST_OFFSET 0x000ffffful -/* ? 0x00300000ul */ -# define DST_PITCH 0xffc00000ul -#define DST_X BlockIOTag(0x41u) -#define DST_Y BlockIOTag(0x42u) -#define DST_Y_X BlockIOTag(0x43u) -#define DST_WIDTH BlockIOTag(0x44u) -#define DST_HEIGHT BlockIOTag(0x45u) -#define DST_HEIGHT_WIDTH BlockIOTag(0x46u) -#define DST_X_WIDTH BlockIOTag(0x47u) -#define DST_BRES_LNTH BlockIOTag(0x48u) -#define DST_BRES_ERR BlockIOTag(0x49u) -#define DST_BRES_INC BlockIOTag(0x4au) -#define DST_BRES_DEC BlockIOTag(0x4bu) -#define DST_CNTL BlockIOTag(0x4cu) -# define DST_X_DIR 0x00000001ul -# define DST_Y_DIR 0x00000002ul -# define DST_Y_MAJOR 0x00000004ul -# define DST_X_TILE 0x00000008ul -# define DST_Y_TILE 0x00000010ul -# define DST_LAST_PEL 0x00000020ul -# define DST_POLYGON_EN 0x00000040ul -# define DST_24_ROT_EN 0x00000080ul -# define DST_24_ROT 0x00000700ul -# define DST_BRES_SIGN 0x00000800ul /* GX/CX */ -# define DST_BRES_ZERO 0x00000800ul /* CT */ -# define DST_POLYGON_RTEDGE_DIS 0x00001000ul /* CT */ -# define TRAIL_X_DIR 0x00002000ul /* GT */ -# define TRAP_FILL_DIR 0x00004000ul /* GT */ -# define TRAIL_BRES_SIGN 0x00008000ul /* GT */ -/* ? 0x00010000ul */ -# define BRES_SIGN_AUTO 0x00020000ul /* GT */ -/* ? 0x00040000ul */ -# define ALPHA_OVERLAP_ENB 0x00080000ul /* GTPro */ -# define SUB_PIX_ON 0x00100000ul /* GTPro */ -/* ? 0xffe00000ul */ -/* DST_Y_X BlockIOTag(0x4du) */ /* Duplicate */ -#define TRAIL_BRES_ERR BlockIOTag(0x4eu) /* GT */ -#define TRAIL_BRES_INC BlockIOTag(0x4fu) /* GT */ -#define TRAIL_BRES_DEC BlockIOTag(0x50u) /* GT */ -#define LEAD_BRES_LNTH BlockIOTag(0x51u) /* GT */ -#define Z_OFF_PITCH BlockIOTag(0x52u) /* GT */ -#define Z_CNTL BlockIOTag(0x53u) /* GT */ -#define ALPHA_TST_CNTL BlockIOTag(0x54u) /* GTPro */ -# define IDCT_EN 0x00008000UL -/* ? BlockIOTag(0x55u) */ -#define SECONDARY_STW_EXP BlockIOTag(0x56u) /* GTPro */ -#define SECONDARY_S_X_INC BlockIOTag(0x57u) /* GTPro */ -#define SECONDARY_S_Y_INC BlockIOTag(0x58u) /* GTPro */ -#define SECONDARY_S_START BlockIOTag(0x59u) /* GTPro */ -#define SECONDARY_W_X_INC BlockIOTag(0x5au) /* GTPro */ -#define SECONDARY_W_Y_INC BlockIOTag(0x5bu) /* GTPro */ -#define SECONDARY_W_START BlockIOTag(0x5cu) /* GTPro */ -#define SECONDARY_T_X_INC BlockIOTag(0x5du) /* GTPro */ -#define SECONDARY_T_Y_INC BlockIOTag(0x5eu) /* GTPro */ -#define SECONDARY_T_START BlockIOTag(0x5fu) /* GTPro */ -#define SRC_OFF_PITCH BlockIOTag(0x60u) -# define SRC_OFFSET 0x000ffffful -/* ? 0x00300000ul */ -# define SRC_PITCH 0xffc00000ul -#define SRC_X BlockIOTag(0x61u) -#define SRC_Y BlockIOTag(0x62u) -#define SRC_Y_X BlockIOTag(0x63u) -#define SRC_WIDTH1 BlockIOTag(0x64u) -#define SRC_HEIGHT1 BlockIOTag(0x65u) -#define SRC_HEIGHT1_WIDTH1 BlockIOTag(0x66u) -#define SRC_X_START BlockIOTag(0x67u) -#define SRC_Y_START BlockIOTag(0x68u) -#define SRC_Y_X_START BlockIOTag(0x69u) -#define SRC_WIDTH2 BlockIOTag(0x6au) -#define SRC_HEIGHT2 BlockIOTag(0x6bu) -#define SRC_HEIGHT2_WIDTH2 BlockIOTag(0x6cu) -#define SRC_CNTL BlockIOTag(0x6du) -# define SRC_PATT_EN 0x00000001ul -# define SRC_PATT_ROT_EN 0x00000002ul -# define SRC_LINEAR_EN 0x00000004ul -# define SRC_BYTE_ALIGN 0x00000008ul -# define SRC_LINE_X_DIR 0x00000010ul -# define SRC_8X8X8_BRUSH 0x00000020ul /* VTB/GTB */ -# define FAST_FILL_EN 0x00000040ul /* VTB/GTB */ -# define SRC_TRACK_DST 0x00000080ul /* VTB/GTB */ -# define BUS_MASTER_EN 0x00000100ul /* VTB/GTB */ -# define BUS_MASTER_SYNC 0x00000200ul /* VTB/GTB */ -# define BUS_MASTER_OP 0x00000c00ul /* VTB/GTB */ -# define BM_OP_FRAME_TO_SYSTEM (0 << 10) -# define BM_OP_SYSTEM_TO_FRAME (1 << 10) -# define BM_OP_REG_TO_SYSTEM (2 << 10) -# define BM_OP_SYSTEM_TO_REG (3 << 10) -# define SRC_8X8X8_BRUSH_LOADED 0x00001000ul /* VTB/GTB */ -# define COLOR_REG_WRITE_EN 0x00002000ul /* VTB/GTB */ -# define BLOCK_WRITE_EN 0x00004000ul /* VTB/GTB */ -/* ? 0xffff8000ul */ -/* ? BlockIOTag(0x6eu) */ -/* ? BlockIOTag(0x6fu) */ -#define SCALE_Y_OFF BlockIOTag(0x70u) /* GT */ -#define SCALE_OFF BlockIOTag(0x70u) /* GTPro */ -#define SECONDARY_SCALE_OFF BlockIOTag(0x70u) /* GTPro */ -#define TEX_0_OFF BlockIOTag(0x70u) /* GT */ -#define TEX_1_OFF BlockIOTag(0x71u) /* GT */ -#define TEX_2_OFF BlockIOTag(0x72u) /* GT */ -#define TEX_3_OFF BlockIOTag(0x73u) /* GT */ -#define TEX_4_OFF BlockIOTag(0x74u) /* GT */ -#define TEX_5_OFF BlockIOTag(0x75u) /* GT */ -#define TEX_6_OFF BlockIOTag(0x76u) /* GT */ -#define SCALE_WIDTH BlockIOTag(0x77u) /* GT */ -#define TEX_7_OFF BlockIOTag(0x77u) /* GT */ -#define SCALE_HEIGHT BlockIOTag(0x78u) /* GT */ -#define TEX_8_OFF BlockIOTag(0x78u) /* GT */ -#define TEX_9_OFF BlockIOTag(0x79u) /* GT */ -#define TEX_10_OFF BlockIOTag(0x7au) /* GT */ -#define S_Y_INC BlockIOTag(0x7bu) /* GT */ -#define SCALE_Y_PITCH BlockIOTag(0x7bu) /* GT */ -#define SCALE_X_INC BlockIOTag(0x7cu) /* GT */ -#define RED_X_INC BlockIOTag(0x7cu) /* GT */ -#define GREEN_X_INC BlockIOTag(0x7du) /* GT */ -#define SCALE_Y_INC BlockIOTag(0x7du) /* GT */ -#define SCALE_VACC BlockIOTag(0x7eu) /* GT */ -#define SCALE_3D_CNTL BlockIOTag(0x7fu) /* GT */ -# define SIGNED_DST_CLAMP 0x00008000UL /* MPEG's MC */ -#define HOST_DATA_0 BlockIOTag(0x80u) -#define HOST_DATA_1 BlockIOTag(0x81u) -#define HOST_DATA_2 BlockIOTag(0x82u) -#define HOST_DATA_3 BlockIOTag(0x83u) -#define HOST_DATA_4 BlockIOTag(0x84u) -#define HOST_DATA_5 BlockIOTag(0x85u) -#define HOST_DATA_6 BlockIOTag(0x86u) -#define HOST_DATA_7 BlockIOTag(0x87u) -#define HOST_DATA_8 BlockIOTag(0x88u) -#define HOST_DATA_9 BlockIOTag(0x89u) -#define HOST_DATA_A BlockIOTag(0x8au) -#define HOST_DATA_B BlockIOTag(0x8bu) -#define HOST_DATA_C BlockIOTag(0x8cu) -#define HOST_DATA_D BlockIOTag(0x8du) -#define HOST_DATA_E BlockIOTag(0x8eu) -#define HOST_DATA_F BlockIOTag(0x8fu) -#define HOST_CNTL BlockIOTag(0x90u) -#define HOST_BYTE_ALIGN 0x00000001ul -#define HOST_BIG_ENDIAN_EN 0x00000002ul /* GX-E/CT */ -/* ? 0xfffffffcul */ -#define BM_HOSTDATA BlockIOTag(0x91u) /* VTB/GTB write-only */ -#define BM_ADDR BlockIOTag(0x92u) /* VTB/GTB */ -# define GUIREG_ADDR 0x000000FFUL -# define GUIREG_COUNTER 0x003F0000UL -# define IDCT_FLAGS 0x60000000UL -# define IDCT_EOB 0x00000000UL -# define IDCT_TRIPLETS 0x20000000UL /* run, level, level */ -# define IDCT_AUTOINC 0x40000000UL -# define IDCT_STREAM 0x80000000UL -#define BM_DATA BlockIOTag(0x92u) /* VTB/GTB write-only */ -#define BM_GUI_TABLE_CMD BlockIOTag(0x93u) /* GTPro */ -# define CIRCULAR_BUF_SIZE_16KB (0 << 0) -# define CIRCULAR_BUF_SIZE_32KB (1 << 0) -# define CIRCULAR_BUF_SIZE_64KB (2 << 0) -# define CIRCULAR_BUF_SIZE_128KB (3 << 0) -# define LAST_DESCRIPTOR (1 << 31) -/* ? BlockIOTag(0x94u) */ -/* ? BlockIOTag(0x95u) */ -/* ? BlockIOTag(0x96u) */ -/* ? BlockIOTag(0x97u) */ -/* ? BlockIOTag(0x98u) */ -/* ? BlockIOTag(0x99u) */ -/* ? BlockIOTag(0x9au) */ -/* ? BlockIOTag(0x9bu) */ -/* ? BlockIOTag(0x9cu) */ -/* ? BlockIOTag(0x9du) */ -/* ? BlockIOTag(0x9eu) */ -/* ? BlockIOTag(0x9fu) */ -#define PAT_REG0 BlockIOTag(0xa0u) -#define PAT_REG1 BlockIOTag(0xa1u) -#define PAT_CNTL BlockIOTag(0xa2u) -# define PAT_MONO_EN 0x00000001ul -# define PAT_CLR_4x2_EN 0x00000002ul -# define PAT_CLR_8x1_EN 0x00000004ul -/* ? 0xfffffff8ul */ -/* ? BlockIOTag(0xa3u) */ -/* ? BlockIOTag(0xa4u) */ -/* ? BlockIOTag(0xa5u) */ -/* ? BlockIOTag(0xa6u) */ -/* ? BlockIOTag(0xa7u) */ -#define SC_LEFT BlockIOTag(0xa8u) -#define SC_RIGHT BlockIOTag(0xa9u) -#define SC_LEFT_RIGHT BlockIOTag(0xaau) -#define SC_TOP BlockIOTag(0xabu) -#define SC_BOTTOM BlockIOTag(0xacu) -#define SC_TOP_BOTTOM BlockIOTag(0xadu) -#define USR1_DST_OFF_PITCH BlockIOTag(0xaeu) /* LTPro */ -#define USR2_DST_OFF_PITCH BlockIOTag(0xafu) /* LTPro */ -#define DP_BKGD_CLR BlockIOTag(0xb0u) -#define DP_FRGD_CLR BlockIOTag(0xb1u) -#define DP_WRITE_MASK BlockIOTag(0xb2u) -#define DP_CHAIN_MASK BlockIOTag(0xb3u) -# define DP_CHAIN_1BPP 0x00000000ul /* Irrelevant */ -# define DP_CHAIN_4BPP 0x00008888ul -# define DP_CHAIN_8BPP 0x00008080ul -# define DP_CHAIN_8BPP_332 0x00009292ul -# define DP_CHAIN_15BPP_1555 0x00004210ul -# define DP_CHAIN_16BPP_565 0x00008410ul -# define DP_CHAIN_24BPP_888 0x00008080ul -# define DP_CHAIN_32BPP_8888 0x00008080ul -/* ? 0xffff0000ul */ -#define DP_PIX_WIDTH BlockIOTag(0xb4u) -# define DP_DST_PIX_WIDTH 0x0000000ful -# define COMPOSITE_PIX_WIDTH 0x000000f0ul /* GTPro */ -# define DP_SRC_PIX_WIDTH 0x00000f00ul -/* ? 0x00001000ul */ -# define DP_HOST_TRIPLE_EN 0x00002000ul /* GT2c/VT4 */ -# define DP_SRC_AUTONA_FIX_DIS 0x00004000ul /* GTB */ -# define DP_FAST_SRCCOPY_DIS 0x00008000ul /* GTB */ -# define DP_HOST_PIX_WIDTH 0x000f0000ul -# define DP_CI4_RGB_INDEX 0x00f00000ul /* GTB */ -# define DP_BYTE_PIX_ORDER 0x01000000ul -# define DP_CONVERSION_TEMP 0x02000000ul /* GTB */ -# define DP_CI4_RGB_LOW_NIBBLE 0x04000000ul /* GTB */ -# define DP_C14_RGB_HIGH_NIBBLE 0x08000000ul /* GTB */ -# define DP_SCALE_PIX_WIDTH 0xf0000000ul /* GTB */ -#define DP_MIX BlockIOTag(0xb5u) -# define BKGD_MIX_NOT_D (0 << 0) -# define BKGD_MIX_ZERO (1 << 0) -# define BKGD_MIX_ONE (2 << 0) -# define BKGD_MIX_D (3 << 0) -# define BKGD_MIX_NOT_S (4 << 0) -# define BKGD_MIX_D_XOR_S (5 << 0) -# define BKGD_MIX_NOT_D_XOR_S (6 << 0) -# define BKGD_MIX_S (7 << 0) -# define BKGD_MIX_NOT_D_OR_NOT_S (8 << 0) -# define BKGD_MIX_D_OR_NOT_S (9 << 0) -# define BKGD_MIX_NOT_D_OR_S (10 << 0) -# define BKGD_MIX_D_OR_S (11 << 0) -# define BKGD_MIX_D_AND_S (12 << 0) -# define BKGD_MIX_NOT_D_AND_S (13 << 0) -# define BKGD_MIX_D_AND_NOT_S (14 << 0) -# define BKGD_MIX_NOT_D_AND_NOT_S (15 << 0) -# define BKGD_MIX_D_PLUS_S_DIV2 (23 << 0) -# define FRGD_MIX_NOT_D (0 << 16) -# define FRGD_MIX_ZERO (1 << 16) -# define FRGD_MIX_ONE (2 << 16) -# define FRGD_MIX_D (3 << 16) -# define FRGD_MIX_NOT_S (4 << 16) -# define FRGD_MIX_D_XOR_S (5 << 16) -# define FRGD_MIX_NOT_D_XOR_S (6 << 16) -# define FRGD_MIX_S (7 << 16) -# define FRGD_MIX_NOT_D_OR_NOT_S (8 << 16) -# define FRGD_MIX_D_OR_NOT_S (9 << 16) -# define FRGD_MIX_NOT_D_OR_S (10 << 16) -# define FRGD_MIX_D_OR_S (11 << 16) -# define FRGD_MIX_D_AND_S (12 << 16) -# define FRGD_MIX_NOT_D_AND_S (13 << 16) -# define FRGD_MIX_D_AND_NOT_S (14 << 16) -# define FRGD_MIX_NOT_D_AND_NOT_S (15 << 16) -# define FRGD_MIX_D_PLUS_S_DIV2 (23 << 16) -#define DP_SRC BlockIOTag(0xb6u) -# define BKGD_SRC_BKGD_CLR (0 << 0) -# define BKGD_SRC_FRGD_CLR (1 << 0) -# define BKGD_SRC_HOST (2 << 0) -# define BKGD_SRC_BLIT (3 << 0) -# define BKGD_SRC_PATTERN (4 << 0) -# define BKGD_SRC_3D (5 << 0) -# define FRGD_SRC_BKGD_CLR (0 << 8) -# define FRGD_SRC_FRGD_CLR (1 << 8) -# define FRGD_SRC_HOST (2 << 8) -# define FRGD_SRC_BLIT (3 << 8) -# define FRGD_SRC_PATTERN (4 << 8) -# define FRGD_SRC_3D (5 << 8) -# define MONO_SRC_ONE (0 << 16) -# define MONO_SRC_PATTERN (1 << 16) -# define MONO_SRC_HOST (2 << 16) -# define MONO_SRC_BLIT (3 << 16) -#define DP_FRGD_CLR_MIX BlockIOTag(0xb7u) /* VTB/GTB */ -#define DP_FRGD_BKGD_CLR BlockIOTag(0xb8u) /* VTB/GTB */ -/* ? BlockIOTag(0xb9u) */ -#define DST_X_Y BlockIOTag(0xbau) /* VTB/GTB */ -#define DST_WIDTH_HEIGHT BlockIOTag(0xbbu) /* VTB/GTB */ -#define USR_DST_PITCH BlockIOTag(0xbcu) /* GTPro */ -/* ? BlockIOTag(0xbdu) */ -#define DP_SET_GUI_ENGINE2 BlockIOTag(0xbeu) /* GTPro */ -#define DP_SET_GUI_ENGINE BlockIOTag(0xbfu) /* VTB/GTB */ -#define CLR_CMP_CLR BlockIOTag(0xc0u) -#define CLR_CMP_MSK BlockIOTag(0xc1u) -#define CLR_CMP_CNTL BlockIOTag(0xc2u) -# define CLR_CMP_FN 0x00000007ul -# define CLR_CMP_FN_FALSE 0x00000000ul -# define CLR_CMP_FN_TRUE 0x00000001ul -/* ? 0x00000002ul */ -/* ? 0x00000003ul */ -# define CLR_CMP_FN_NOT_EQUAL 0x00000004ul -# define CLR_CMP_FN_EQUAL 0x00000005ul -/* ? 0x00000006ul */ -/* ? 0x00000007ul */ -/* ? 0x00fffff8ul */ -# define CLR_CMP_SRC 0x03000000ul -# define CLR_CMP_SRC_DST 0x00000000ul -# define CLR_CMP_SRC_2D 0x01000000ul -# define CLR_CMP_SRC_TEXEL 0x02000000ul -/* ? 0x03000000ul */ -/* ? 0xfc000000ul */ -/* ? BlockIOTag(0xc3u) */ -#define FIFO_STAT BlockIOTag(0xc4u) -# define FIFO_STAT_BITS 0x0000fffful -/* ? 0x7fff0000ul */ -# define FIFO_ERR 0x80000000ul -/* ? BlockIOTag(0xc5u) */ -/* ? BlockIOTag(0xc6u) */ -/* ? BlockIOTag(0xc7u) */ -#define CONTEXT_MASK BlockIOTag(0xc8u) -/* ? BlockIOTag(0xc9u) */ -/* ? BlockIOTag(0xcau) */ -#define CONTEXT_LOAD_CNTL BlockIOTag(0xcbu) -# define CONTEXT_LOAD_PTR 0x00007ffful -/* ? 0x00008000ul */ -# define CONTEXT_LOAD_CMD 0x00030000ul -# define CONTEXT_LOAD_NONE 0x00000000ul -# define CONTEXT_LOAD_ONLY 0x00010000ul -# define CONTEXT_LOAD_FILL 0x00020000ul -# define CONTEXT_LOAD_LINE 0x00030000ul -/* ? 0x7ffc0000ul */ -#define CONTEXT_LOAD_DIS 0x80000000ul -#define GUI_TRAJ_CNTL BlockIOTag(0xccu) -/* ? BlockIOTag(0xcdu) */ -#define GUI_STAT BlockIOTag(0xceu) -#define GUI_ACTIVE 0x00000001ul -/* ? 0x000000feul */ -#define DSTX_LT_SCISSOR_LEFT 0x00000100ul -#define DSTX_GT_SCISSOR_RIGHT 0x00000200ul -#define DSTY_LT_SCISSOR_TOP 0x00000400ul -#define DSTY_GT_SCISSOR_BOTTOM 0x00000800ul -/* ? 0x0000f000ul */ -#define GUI_FIFO 0x03ff0000ul /* VTB/GTB */ -/* ? 0xfc000000ul */ -/* ? BlockIOTag(0xcfu) */ -#define S_X_INC2 BlockIOTag(0xd0u) /* GTB */ -#define TEX_PALETTE_INDEX BlockIOTag(0xd0u) /* GTPro */ -#define S_Y_INC2 BlockIOTag(0xd1u) /* GTB */ -#define STW_EXP BlockIOTag(0xd1u) /* GTPro */ -#define S_XY_INC2 BlockIOTag(0xd2u) /* GTB */ -#define LOG_MAX_INC BlockIOTag(0xd2u) /* GTPro */ -#define S_XINC_START BlockIOTag(0xd3u) /* GTB */ -/* S_Y_INC BlockIOTag(0xd4u) */ /* Duplicate */ -/* SCALE_Y_PITCH BlockIOTag(0xd4u) */ /* Duplicate */ -#define S_START BlockIOTag(0xd5u) /* GTB */ -#define T_X_INC2 BlockIOTag(0xd6u) /* GTB */ -#define W_X_INC BlockIOTag(0xd6u) /* GTPro */ -#define T_Y_INC2 BlockIOTag(0xd7u) /* GTB */ -#define W_Y_INC BlockIOTag(0xd7u) /* GTPro */ -#define T_XY_INC2 BlockIOTag(0xd8u) /* GTB */ -#define W_START BlockIOTag(0xd8u) /* GTPro */ -#define T_XINC_START BlockIOTag(0xd9u) /* GTB */ -#define T_Y_INC BlockIOTag(0xdau) /* GTB */ -#define SECONDARY_SCALE_PITCH BlockIOTag(0xdau) /* GTPro */ -#define T_START BlockIOTag(0xdbu) /* GTB */ -#define TEX_SIZE_PITCH BlockIOTag(0xdcu) /* GTB */ -#define TEX_CNTL BlockIOTag(0xddu) /* GTPro */ -#define SECONDARY_TEX_OFFSET BlockIOTag(0xdeu) /* GTPro */ -#define TEX_PAL_WR BlockIOTag(0xdfu) /* GTB */ -#define TEX_PALETTE BlockIOTag(0xdfu) /* GTPro */ -#define SCALE_PITCH_BOTH BlockIOTag(0xe0u) /* GTPro */ -#define SECONDARY_SCALE_OFF_ACC BlockIOTag(0xe1u) /* GTPro */ -#define SCALE_OFF_ACC BlockIOTag(0xe2u) /* GTPro */ -#define SCALE_DST_Y_X BlockIOTag(0xe3u) /* GTPro */ -/* ? BlockIOTag(0xe4u) */ -/* ? BlockIOTag(0xe5u) */ -#define COMPOSITE_SHADOW_ID BlockIOTag(0xe6u) /* GTPro */ -#define SECONDARY_SCALE_X_INC BlockIOTag(0xe7u) /* GTPro */ -#define SPECULAR_RED_X_INC BlockIOTag(0xe7u) /* GTPro */ -#define SPECULAR_RED_Y_INC BlockIOTag(0xe8u) /* GTPro */ -#define SPECULAR_RED_START BlockIOTag(0xe9u) /* GTPro */ -#define SECONDARY_SCALE_HACC BlockIOTag(0xe9u) /* GTPro */ -#define SPECULAR_GREEN_X_INC BlockIOTag(0xeau) /* GTPro */ -#define SPECULAR_GREEN_Y_INC BlockIOTag(0xebu) /* GTPro */ -#define SPECULAR_GREEN_START BlockIOTag(0xecu) /* GTPro */ -#define SPECULAR_BLUE_X_INC BlockIOTag(0xedu) /* GTPro */ -#define SPECULAR_BLUE_Y_INC BlockIOTag(0xeeu) /* GTPro */ -#define SPECULAR_BLUE_START BlockIOTag(0xefu) /* GTPro */ -/* SCALE_X_INC BlockIOTag(0xf0u) */ /* Duplicate */ -/* RED_X_INC BlockIOTag(0xf0u) */ /* Duplicate */ -#define RED_Y_INC BlockIOTag(0xf1u) /* GTB */ -#define SCALE_HACC BlockIOTag(0xf2u) /* GTB */ -#define RED_START BlockIOTag(0xf2u) /* GTB */ -/* GREEN_X_INC BlockIOTag(0xf3u) */ /* Duplicate */ -/* SCALE_Y_INC BlockIOTag(0xf3u) */ /* Duplicate */ -#define GREEN_Y_INC BlockIOTag(0xf4u) /* GTB */ -#define SECONDARY_SCALE_Y_INC BlockIOTag(0xf4u) /* GTPro */ -#define SECONDARY_SCALE_VACC BlockIOTag(0xf5u) /* GTPro */ -#define GREEN_START BlockIOTag(0xf5u) /* GTB */ -#define BLUE_X_INC BlockIOTag(0xf6u) /* GTB */ -#define SCALE_XUV_INC BlockIOTag(0xf6u) /* GTB */ -#define BLUE_Y_INC BlockIOTag(0xf7u) /* GTB */ -#define BLUE_START BlockIOTag(0xf8u) /* GTB */ -#define SCALE_UV_HACC BlockIOTag(0xf8u) /* GTB */ -#define Z_X_INC BlockIOTag(0xf9u) /* GTB */ -#define Z_Y_INC BlockIOTag(0xfau) /* GTB */ -#define Z_START BlockIOTag(0xfbu) /* GTB */ -#define ALPHA_FOG_X_INC BlockIOTag(0xfcu) /* GTB */ -#define ALPHA_FOG_Y_INC BlockIOTag(0xfdu) /* GTB */ -#define ALPHA_FOG_START BlockIOTag(0xfeu) /* GTB */ -/* ? BlockIOTag(0xffu) */ -#define OVERLAY_Y_X_START BlockIOTag(0x100u) -# define OVERLAY_Y_START 0x000007FFUL -# define OVERLAY_X_START 0x07FF0000UL -# define OVERLAY_LOCK_START 0x80000000UL -#define OVERLAY_Y_X_END BlockIOTag(0x101u) -# define OVERLAY_Y_END 0x000007FFUL -# define OVERLAY_X_END 0x07FF0000UL -# define OVERLAY_LOCK_END 0x80000000UL -#define OVERLAY_VIDEO_KEY_CLR BlockIOTag(0x102u) -#define OVERLAY_VIDEO_KEY_MSK BlockIOTag(0x103u) -#define OVERLAY_GRAPHICS_KEY_CLR BlockIOTag(0x104u) -#define OVERLAY_GRAPHICS_KEY_MSK BlockIOTag(0x105u) -#define OVERLAY_KEY_CNTL BlockIOTag(0x106u) -# define VIDEO_KEY_FN_MASK 0x00000007L -# define VIDEO_KEY_FN_FALSE 0x00000000L -# define VIDEO_KEY_FN_TRUE 0x00000001L -# define VIDEO_KEY_FN_NE 0x00000004L -# define VIDEO_KEY_FN_EQ 0x00000005L // EQ and NE are exchanged relative to radeon -# define GRAPHIC_KEY_FN_MASK 0x00000070L -# define GRAPHIC_KEY_FN_FALSE 0x00000000L -# define GRAPHIC_KEY_FN_TRUE 0x00000010L -# define GRAPHIC_KEY_FN_NE 0x00000040L -# define GRAPHIC_KEY_FN_EQ 0x00000050L // EQ and NE are exchanged relative to radeon -# define CMP_MIX_MASK 0x00000100L -# define CMP_MIX_OR 0x00000000L -# define CMP_MIX_AND 0x00000100L -/* ? BlockIOTag(0x107u) */ -#define OVERLAY_SCALE_INC BlockIOTag(0x108u) -#define OVERLAY_SCALE_CNTL BlockIOTag(0x109u) -# define SCALE_PIX_EXPAND 0x00000001UL -# define SCALE_Y2R_TEMP 0x00000002UL -# define SCALE_HORZ_MODE 0x00000004UL -# define SCALE_VERT_MODE 0x00000008UL -# define SCALE_SIGNED_UV 0x00000010UL -# define SCALE_GAMMA_SEL_MSK 0x00000060UL -# define SCALE_GAMMA_SEL_BRIGHT 0x00000000UL -# define SCALE_GAMMA_SEL_G22 0x00000020UL -# define SCALE_GAMMA_SEL_G18 0x00000040UL -# define SCALE_GAMMA_SEL_G14 0x00000060UL -# define SCALE_SEL_DISP2 0x00000080UL /* pro only */ -# define SCALE_BANDWIDTH 0x04000000UL -# define SCALE_DIS_LIMIT 0x08000000UL -# define SCALE_CLK_FORCE_ON 0x20000000UL -# define OVERLAY_EN 0x40000000UL -# define SCALE_EN 0x80000000UL -#define SCALER_HEIGHT_WIDTH BlockIOTag(0x10au) -#define OVERLAY_TEST BlockIOTag(0x10bu) -# define SCALE_SUBPIC_ONLY 0x00000001UL -# define SCALE_Y2R_DIS 0x00000002UL -#define SCALER_THRESHOLD BlockIOTag(0x10cu) -#define SCALER_BUF0_OFFSET BlockIOTag(0x10du) /* VTB/GTB */ -#define SCALER_BUF1_OFFSET BlockIOTag(0x10eu) /* VTB/GTB */ -#define SCALER_BUF_PITCH BlockIOTag(0x10fu) /* VTB/GTB */ -#define CAPTURE_Y_X BlockIOTag(0x110u) -#define CAPTURE_START_END BlockIOTag(0x110u) /* VTB/GTB */ -#define CAPTURE_HEIGHT_WIDTH BlockIOTag(0x111u) -#define CAPTURE_X_WIDTH BlockIOTag(0x111u) /* VTB/GTB */ -#define VIDEO_FORMAT BlockIOTag(0x112u) -# define VIDEO_IN_MSK 0x0000000FUL -# define VIDEO_IN_VYUY422 0x0000000BUL -# define VIDEO_IN_YVYU422 0x0000000CUL -# define VIDEO_SIGNED_UV 0x00000010UL -# define SCALER_IN_MSK 0x000F0000UL -# define SCALER_IN_RGB15 0x00030000UL -# define SCALER_IN_RGB16 0x00040000UL -# define SCALER_IN_RGB32 0x00060000UL -# define SCALER_IN_YUV9 0x00090000UL -# define SCALER_IN_YUV12 0x000A0000UL -# define SCALER_IN_VYUY422 0x000B0000UL -# define SCALER_IN_YVYU422 0x000C0000UL -# define HOST_BYTE_SHIFT_EN 0x10000000UL -# define HOST_YUV_APER 0x20000000UL -# define HOST_MEM_MODE_MSK 0xC0000000UL -# define HOST_MEM_MODE_NORMAL 0x00000000UL -# define HOST_MEM_MODE_Y 0x40000000UL -# define HOST_MEM_MODE_U 0x80000000UL -# define HOST_MEM_MODE_V 0xC0000000UL -#define VIDEO_CONFIG BlockIOTag(0x113u) -#define VBI_START_END BlockIOTag(0x113u) /* VTB/GTB */ -#define CAPTURE_CONFIG BlockIOTag(0x114u) -#define TRIG_CNTL BlockIOTag(0x115u) -#define VIDEO_SYNC_TEST BlockIOTag(0x116u) -#define OVERLAY_EXCLUSIVE_HORZ BlockIOTag(0x116u) /* VTB/GTB */ -# define EXCLUSIVE_HORZ_START 0x000000FFUL -# define EXCLUSIVE_HORZ_END 0x0000FF00UL -# define EXCLUSIVE_BACK_PORSH 0x00FF0000UL -# define EXCLUSIVE_EN 0x80000000UL -#define EXT_CRTC_GEN_CNTL_R BlockIOTag(0x117u) /* VT-A4 (R) */ -#define OVERLAY_EXCLUSIVE_VERT BlockIOTag(0x117u) /* VTB/GTB */ -# define EXCLUSIVE_VERT_START 0x000007FFUL -# define EXCLUSIVE_VERT_END 0x07FF0000UL -#define VMC_CONFIG BlockIOTag(0x118u) -#define VBI_WIDTH BlockIOTag(0x118u) /* VTB/GTB */ -#define VMC_STATUS BlockIOTag(0x119u) -#define CAPTURE_DEBUG BlockIOTag(0x119u) /* VTB/GTB */ -#define VMC_CMD BlockIOTag(0x11au) -#define VIDEO_SYNC_TEST_B BlockIOTag(0x11au) /* VTB/GTB */ -# define TEST_CRTC_OVLSOF 0x00000001UL -# define TEST_CRTC_VOVLEN 0x00000002UL -# define TEST_VID_SOF 0x00000100UL -# define TEST_VID_EOF 0x00000200UL -# define TEST_VID_EOL 0x00000400UL -# define TEST_VID_FIELD 0x00000800UL -# define TEST_END_OF_VBI 0x00001000UL -# define TEST_BUSMASTER_EOL 0x00002000UL -# define TEST_SYNC_EN 0x80000000UL -#define VMC_ARG0 BlockIOTag(0x11bu) -#define VMC_ARG1 BlockIOTag(0x11cu) -#define SNAPSHOT_VH_COUNTS BlockIOTag(0x11cu) /* GTPro */ -#define VMC_SNOOP_ARG0 BlockIOTag(0x11du) -#define SNAPSHOT_F_COUNT BlockIOTag(0x11du) /* GTPro */ -#define VMC_SNOOP_ARG1 BlockIOTag(0x11eu) -#define N_VIF_COUNT BlockIOTag(0x11eu) /* GTPro */ -#define SNAPSHOT_VIF_COUNT BlockIOTag(0x11fu) /* GTPro */ -#define BUF0_OFFSET BlockIOTag(0x120u) -#define CAPTURE_BUF0_OFFSET BlockIOTag(0x120u) /* VTB/GTB */ -#define CAPTURE_BUF1_OFFSET BlockIOTag(0x121u) /* VTB/GTB */ -#define ONESHOT_BUF_OFFSET BlockIOTag(0x122u) /* VTB/GTB */ -#define BUF0_PITCH BlockIOTag(0x123u) -/* ? BlockIOTag(0x124u) */ -/* ? BlockIOTag(0x125u) */ -#define BUF1_OFFSET BlockIOTag(0x126u) -/* ? BlockIOTag(0x127u) */ -/* ? BlockIOTag(0x128u) */ -#define BUF1_PITCH BlockIOTag(0x129u) -/* ? BlockIOTag(0x12au) */ -#define BUF0_CAP_ODD_OFFSET BlockIOTag(0x12bu) -#define BUF1_CAP_ODD_OFFSET BlockIOTag(0x12cu) -#define SNAPSHOT2_VH_COUNTS BlockIOTag(0x12cu) /* LTPro */ -#define SNAPSHOT2_F_COUNT BlockIOTag(0x12du) /* LTPro */ -#define N_VIF2_COUNT BlockIOTag(0x12eu) /* LTPro */ -#define SNAPSHOT2_VIF_COUNT BlockIOTag(0x12fu) /* LTPro */ -#define VMC_STRM_DATA_0 BlockIOTag(0x130u) -/* MPP_CONFIG BlockIOTag(0x130u) */ /* See 0x3bu */ -#define VMC_STRM_DATA_1 BlockIOTag(0x131u) -/* MPP_STROBE_SEQ BlockIOTag(0x131u) */ /* See 0x3cu */ -#define VMC_STRM_DATA_2 BlockIOTag(0x132u) -/* MPP_ADDR BlockIOTag(0x132u) */ /* See 0x3du */ -#define VMC_STRM_DATA_3 BlockIOTag(0x133u) -/* MPP_DATA BlockIOTag(0x133u) */ /* See 0x3eu */ -#define VMC_STRM_DATA_4 BlockIOTag(0x134u) -#define VMC_STRM_DATA_5 BlockIOTag(0x135u) -#define VMC_STRM_DATA_6 BlockIOTag(0x136u) -#define VMC_STRM_DATA_7 BlockIOTag(0x137u) -#define VMC_STRM_DATA_8 BlockIOTag(0x138u) -#define VMC_STRM_DATA_9 BlockIOTag(0x139u) -#define VMC_STRM_DATA_A BlockIOTag(0x13au) -#define VMC_STRM_DATA_B BlockIOTag(0x13bu) -#define VMC_STRM_DATA_C BlockIOTag(0x13cu) -#define VMC_STRM_DATA_D BlockIOTag(0x13du) -#define VMC_STRM_DATA_E BlockIOTag(0x13eu) -#define VMC_STRM_DATA_F BlockIOTag(0x13fu) -/* TVO_CNTL BlockIOTag(0x140u) */ /* See 0x3fu */ -/* ? BlockIOTag(0x141u) */ -/* ? BlockIOTag(0x142u) */ -/* ? BlockIOTag(0x143u) */ -/* ? BlockIOTag(0x144u) */ -/* ? BlockIOTag(0x145u) */ -/* ? BlockIOTag(0x146u) */ -/* ? BlockIOTag(0x147u) */ -/* ? BlockIOTag(0x148u) */ -/* ? BlockIOTag(0x149u) */ -/* ? BlockIOTag(0x14au) */ -/* ? BlockIOTag(0x14bu) */ -/* ? BlockIOTag(0x14cu) */ -/* ? BlockIOTag(0x14du) */ -/* ? BlockIOTag(0x14eu) */ -/* ? BlockIOTag(0x14fu) */ -/* ? BlockIOTag(0x150u) */ -#define CRT_HORZ_VERT_LOAD BlockIOTag(0x151u) /* VTB/GTB */ -#define AGP_BASE BlockIOTag(0x152u) /* GTPro */ -#define AGP_CNTL BlockIOTag(0x153u) /* GTPro */ -#define SCALER_COLOUR_CNTL BlockIOTag(0x154u) /* GTPro */ -# define COLOUR_BRIGHTNESS 0x0000007FUL -# define COLOUR_SATURATION_U 0x00001F00UL -# define COLOUR_SATURATION_V 0x001F0000UL -# define SCALER_VERT_ADJ_UV 0x0FE00000UL -/*# define SCALER_VERT_ADJ_UV 0x0F000000UL (need testing) */ -# define SCALER_HORZ_ADJ_UV 0xF0000000UL -#define SCALER_H_COEFF0 BlockIOTag(0x155u) /* GTPro */ -#define SCALER_H_COEFF1 BlockIOTag(0x156u) /* GTPro */ -#define SCALER_H_COEFF2 BlockIOTag(0x157u) /* GTPro */ -#define SCALER_H_COEFF3 BlockIOTag(0x158u) /* GTPro */ -#define SCALER_H_COEFF4 BlockIOTag(0x159u) /* GTPro */ -/* ? BlockIOTag(0x15au) */ -/* ? BlockIOTag(0x15bu) */ -#define GUI_CMDFIFO_DEBUG BlockIOTag(0x15cu) /* GT2c/VT4 */ -#define GUI_CMDFIFO_DATA BlockIOTag(0x15du) /* GT2c/VT4 */ -#define GUI_CNTL BlockIOTag(0x15eu) /* GT2c/VT4 */ -# define CMDFIFO_SIZE_MASK 0x00000003ul -# define CMDFIFO_SIZE_192 0x00000000ul -# define CMDFIFO_SIZE_128 0x00000001ul -# define CMDFIFO_SIZE_64 0x00000002ul -/* ? 0x0000fffcul */ -# define IDCT_PRSR_MODE 0x00010000ul /* XL/XC */ -# define IDCT_BLOCK_GUI_INITIATOR 0x00020000ul /* XL/XC */ -/* ? 0xfffc0000ul */ -/* ? BlockIOTag(0x15fu) */ -/* BUS MASTERING */ -#define BM_FRAME_BUF_OFFSET BlockIOTag(0x160u) /* VTB/GTB read-only */ -#define BM_SYSTEM_MEM_ADDR BlockIOTag(0x161u) /* VTB/GTB read-only */ -#define BM_COMMAND BlockIOTag(0x162u) /* VTB/GTB read-only */ -# define BM_CMD_BYTE_COUNT 0x00001FFFUL -# define BM_CMD_HOLD_OFFSET 0x40000000UL -# define BM_CMD_EOL 0x80000000UL -#define BM_STATUS BlockIOTag(0x163u) /* VTB/GTB read-only */ -/* ? BlockIOTag(0x164u) */ -/* ? BlockIOTag(0x165u) */ -/* ? BlockIOTag(0x166u) */ -/* ? BlockIOTag(0x167u) */ -/* ? BlockIOTag(0x168u) */ -/* ? BlockIOTag(0x169u) */ -/* ? BlockIOTag(0x16au) */ -/* ? BlockIOTag(0x16bu) */ -/* ? BlockIOTag(0x16cu) */ -/* ? BlockIOTag(0x16du) */ -#define BM_GUI_TABLE BlockIOTag(0x16eu) /* VTB/GTB */ -#define BM_SYSTEM_TABLE BlockIOTag(0x16fu) /* VTB/GTB */ -# define DMA_GUI_COMMAND__BYTE_COUNT_MASK 0x001ffff0 -# define DMA_GUI_COMMAND__HOLD_VIDEO_OFFSET 0x40000000 -# define DMA_GUI_COMMAND__EOL 0x80000000 -# define SYSTEM_TRIGGER_MASK 0x7 -# define SYSTEM_TRIGGER_SYSTEM_TO_VIDEO 0x0 -# define SYSTEM_TRIGGER_VIDEO_TO_SYSTEM 0x1 -# define SYSTEM_TRIGGER_VIDEO_TO_SYSTEM_AFTER_BUF0_READY 0x2 -# define SYSTEM_TRIGGER_VIDEO_TO_SYSTEM_AFTER_BUF1_READY 0x3 -# define SYSTEM_TRIGGER_VIDEO_TO_SYSTEM_AFTER_SNAPSHOT_READY 0x4 -# define SYSTEM_TRIGGER_SYSTEM_TO_MPP 0x5 -/* ? BlockIOTag(0x170u) */ -/* ? BlockIOTag(0x171u) */ -/* ? BlockIOTag(0x172u) */ -/* ? BlockIOTag(0x173u) */ -/* ? BlockIOTag(0x174u) */ -#define SCALER_BUF0_OFFSET_V BlockIOTag(0x175u) /* GTPro */ -#define SCALER_BUF0_OFFSET_U BlockIOTag(0x176u) /* GTPro */ -#define SCALER_BUF1_OFFSET_V BlockIOTag(0x177u) /* GTPro */ -#define SCALER_BUF1_OFFSET_U BlockIOTag(0x178u) /* GTPro */ -/* ? BlockIOTag(0x179u) */ -/* ? BlockIOTag(0x17au) */ -/* ? BlockIOTag(0x17bu) */ -/* ? BlockIOTag(0x17cu) */ -/* ? BlockIOTag(0x17du) */ -/* ? BlockIOTag(0x17eu) */ -/* ? BlockIOTag(0x17fu) */ -/* ? BlockIOTag(0x180u) */ -/* ? BlockIOTag(0x181u) */ -/* ? BlockIOTag(0x182u) */ -/* ? BlockIOTag(0x183u) */ -/* ? BlockIOTag(0x184u) */ -/* ? BlockIOTag(0x185u) */ -/* ? BlockIOTag(0x186u) */ -/* ? BlockIOTag(0x187u) */ -/* ? BlockIOTag(0x188u) */ -/* ? BlockIOTag(0x189u) */ -/* ? BlockIOTag(0x18au) */ -/* ? BlockIOTag(0x18bu) */ -/* ? BlockIOTag(0x18cu) */ -/* ? BlockIOTag(0x18du) */ -/* ? BlockIOTag(0x18eu) */ -/* ? BlockIOTag(0x18fu) */ -#define VERTEX_1_S BlockIOTag(0x190u) /* GTPro */ -#define VERTEX_1_T BlockIOTag(0x191u) /* GTPro */ -#define VERTEX_1_W BlockIOTag(0x192u) /* GTPro */ -#define VERTEX_1_SPEC_ARGB BlockIOTag(0x193u) /* GTPro */ -#define VERTEX_1_Z BlockIOTag(0x194u) /* GTPro */ -#define VERTEX_1_ARGB BlockIOTag(0x195u) /* GTPro */ -#define VERTEX_1_X_Y BlockIOTag(0x196u) /* GTPro */ -#define ONE_OVER_AREA BlockIOTag(0x197u) /* GTPro */ -#define VERTEX_2_S BlockIOTag(0x198u) /* GTPro */ -#define VERTEX_2_T BlockIOTag(0x199u) /* GTPro */ -#define VERTEX_2_W BlockIOTag(0x19au) /* GTPro */ -#define VERTEX_2_SPEC_ARGB BlockIOTag(0x19bu) /* GTPro */ -#define VERTEX_2_Z BlockIOTag(0x19cu) /* GTPro */ -#define VERTEX_2_ARGB BlockIOTag(0x19du) /* GTPro */ -#define VERTEX_2_X_Y BlockIOTag(0x19eu) /* GTPro */ -/* ONE_OVER_AREA BlockIOTag(0x19fu) */ /* Duplicate */ -#define VERTEX_3_S BlockIOTag(0x1a0u) /* GTPro */ -#define VERTEX_3_T BlockIOTag(0x1a1u) /* GTPro */ -#define VERTEX_3_W BlockIOTag(0x1a2u) /* GTPro */ -#define VERTEX_3_SPEC_ARGB BlockIOTag(0x1a3u) /* GTPro */ -#define VERTEX_3_Z BlockIOTag(0x1a4u) /* GTPro */ -#define VERTEX_3_ARGB BlockIOTag(0x1a5u) /* GTPro */ -#define VERTEX_3_X_Y BlockIOTag(0x1a6u) /* GTPro */ -/* ONE_OVER_AREA BlockIOTag(0x1a7u) */ /* Duplicate */ -#define VERTEX_3_SECONDARY_S BlockIOTag(0x1a8u) /* GTPro */ -#define VERTEX_3_SECONDARY_T BlockIOTag(0x1a9u) /* GTPro */ -#define VERTEX_3_SECONDARY_W BlockIOTag(0x1aau) /* GTPro */ -/* VERTEX_1_S BlockIOTag(0x1abu) */ /* Duplicate */ -/* VERTEX_1_T BlockIOTag(0x1acu) */ /* Duplicate */ -/* VERTEX_1_W BlockIOTag(0x1adu) */ /* Duplicate */ -/* VERTEX_2_S BlockIOTag(0x1aeu) */ /* Duplicate */ -/* VERTEX_2_T BlockIOTag(0x1afu) */ /* Duplicate */ -/* VERTEX_2_W BlockIOTag(0x1b0u) */ /* Duplicate */ -/* VERTEX_3_S BlockIOTag(0x1b1u) */ /* Duplicate */ -/* VERTEX_3_T BlockIOTag(0x1b2u) */ /* Duplicate */ -/* VERTEX_3_W BlockIOTag(0x1b3u) */ /* Duplicate */ -/* VERTEX_1_SPEC_ARGB BlockIOTag(0x1b4u) */ /* Duplicate */ -/* VERTEX_2_SPEC_ARGB BlockIOTag(0x1b5u) */ /* Duplicate */ -/* VERTEX_3_SPEC_ARGB BlockIOTag(0x1b6u) */ /* Duplicate */ -/* VERTEX_1_Z BlockIOTag(0x1b7u) */ /* Duplicate */ -/* VERTEX_2_Z BlockIOTag(0x1b8u) */ /* Duplicate */ -/* VERTEX_3_Z BlockIOTag(0x1b9u) */ /* Duplicate */ -/* VERTEX_1_ARGB BlockIOTag(0x1bau) */ /* Duplicate */ -/* VERTEX_2_ARGB BlockIOTag(0x1bbu) */ /* Duplicate */ -/* VERTEX_3_ARGB BlockIOTag(0x1bcu) */ /* Duplicate */ -/* VERTEX_1_X_Y BlockIOTag(0x1bdu) */ /* Duplicate */ -/* VERTEX_2_X_Y BlockIOTag(0x1beu) */ /* Duplicate */ -/* VERTEX_3_X_Y BlockIOTag(0x1bfu) */ /* Duplicate */ -#define ONE_OVER_AREA_UC BlockIOTag(0x1c0u) /* GTPro */ -#define SETUP_CNTL BlockIOTag(0x1c1u) /* GTPro */ -/* ? BlockIOTag(0x1c2u) */ -/* ? BlockIOTag(0x1c3u) */ -/* ? BlockIOTag(0x1c4u) */ -/* ? BlockIOTag(0x1c5u) */ -/* ? BlockIOTag(0x1c6u) */ -/* ? BlockIOTag(0x1c7u) */ -/* ? BlockIOTag(0x1c8u) */ -/* ? BlockIOTag(0x1c9u) */ -#define VERTEX_1_SECONDARY_S BlockIOTag(0x1cau) /* GTPro */ -#define VERTEX_1_SECONDARY_T BlockIOTag(0x1cbu) /* GTPro */ -#define VERTEX_1_SECONDARY_W BlockIOTag(0x1ccu) /* GTPro */ -#define VERTEX_2_SECONDARY_S BlockIOTag(0x1cdu) /* GTPro */ -#define VERTEX_2_SECONDARY_T BlockIOTag(0x1ceu) /* GTPro */ -#define VERTEX_2_SECONDARY_W BlockIOTag(0x1cfu) /* GTPro */ -/* IDCT and DVD's subpicture direct support (Rage Mobility only) */ -#define SUBPIC_CNTL BlockIOTag(0x1d0u) -# define SUBPIC_ON 0x00000001UL -# define BTN_HLI_ON 0x00000002UL -# define SP_HORZ_MODE 0x00000010UL -# define SP_VERT_MODE 0x00000020UL -# define SP_ODD_FIELD 0x00000100UL -# define SP_BUF_SELECT 0x00000200UL -# define SP_NO_R_EDGE_BLEND 0x00000400UL -#define SUBPIC_DEFCOLON BlockIOTag(0x1d1u) -# define BKGD_PIX_CON 0x0000000FUL -# define PATT_PIX_CON 0x000000F0UL -# define EMPH_PIX1_CON 0x00000F00UL -# define EMPH_PIX2_CON 0x0000F000UL -# define BKGD_PIX_CLR 0x000F0000UL -# define PATT_PIX_CLR 0x00F00000UL -# define EMPH_PIX1_CLR 0x0F000000UL -# define EMPH_PIX2_CLR 0xF0000000UL -/* ? BlockIOTag(0x1d2u) */ -#define SUBPIC_Y_X_START BlockIOTag(0x1d3u) -#define SUBPIC_Y_X_END BlockIOTag(0x1d4u) -#define SUBPIC_V_INC BlockIOTag(0x1d5u) -#define SUBPIC_H_INC BlockIOTag(0x1d6u) -#define SUBPIC_BUF0_OFFSET BlockIOTag(0x1d7u) -#define SUBPIC_BUF1_OFFSET BlockIOTag(0x1d8u) -#define SUBPIC_LC0_OFFSET BlockIOTag(0x1d9u) -#define SUBPIC_LC1_OFFSET BlockIOTag(0x1dau) -#define SUBPIC_PITCH BlockIOTag(0x1dbu) -# define SUBPIC_BUF_PITCH 0x00000FC0UL -# define SUBPIC_LC_PITCH 0x0FC00000UL -#define SUBPIC_BTN_HLI_COLCON BlockIOTag(0x1dcu) -# define BTN_HLI_BKGD_PIX_CON 0x0000000FUL -# define BTN_HLI_PATT_PIX_CON 0x000000F0UL -# define BTN_HLI_EMPH_PIX1_CON 0x00000F00UL -# define BTN_HLI_EMPH_PIX2_CON 0x0000F000UL -# define BTN_HLI_BKGD_PIX_CLR 0x000F0000UL -# define BTN_HLI_PATT_PIX_CLR 0x00F00000UL -# define BTN_HLI_EMPH_PIX1_CLR 0x0F000000UL -# define BTN_HLI_EMPH_PIX2_CLR 0xF0000000UL -#define SUBPIC_BTN_Y_X_START BlockIOTag(0x1ddu) -#define SUBPIC_BTN_Y_X_END BlockIOTag(0x1deu) -#define SUBPIC_H_ACCUM_INIT BlockIOTag(0x1dfu) -#define IDCT_RUNS BlockIOTag(0x1e0u) -# define IDCT_RUNS_3 0x000000FFUL -# define IDCT_RUNS_2 0x0000FF00UL -# define IDCT_RUNS_1 0x00FF0000UL -# define IDCT_RUNS_0 0xFF000000UL -#define IDCT_LEVELS BlockIOTag(0x1e1u) -# define IDCT_LEVELS_HI 0x0000FFFFUL -# define IDCT_LEVELS_LO 0xFFFF0000UL -#define IDCT_RESERVE_REGISTER1 BlockIOTag(0x1e2u) -#define IDCT_RESERVE_REGISTER2 BlockIOTag(0x1e3u) -/* ? BlockIOTag(0x1e4u) */ -/* ? BlockIOTag(0x1e5u) */ -#define SUBPIC_V_ACCUM_INIT BlockIOTag(0x1e6u) -#define SUBPIC_PALETTE_INDEX BlockIOTag(0x1e7u) -#define SUBPIC_PALETTE_DATA BlockIOTag(0x1e8u) -/* ? BlockIOTag(0x1e9u) */ -/* ? BlockIOTag(0x1eau) */ -/* ? BlockIOTag(0x1ebu) */ -/* ? BlockIOTag(0x1ecu) */ -/* ? BlockIOTag(0x1edu) */ -/* ? BlockIOTag(0x1eeu) */ -#define IDCT_CONTROL BlockIOTag(0x1efu) -# define IDCT_LUMA_RD_FORMAT_MSK 0x00000003UL -# define IDCT_LUMA_RD_FORMAT_0123 0x00000000UL -# define IDCT_LUMA_RD_FORMAT_0246 0x00000001UL -# define IDCT_LUMA_RD_FORMAT_0819 0x00000002UL -# define IDCT_CHROMA_RD_FMT_MSK 0x0000000CUL -# define IDCT_CHROMA_RD_FMT_0123 0x00000000UL -# define IDCT_CHROMA_RD_FMT_0246 0x00000004UL -# define IDCT_CHROMA_RD_FMT_0819 0x00000008UL -# define IDCT_CTL_SCAN_PATTERN 0x00000010UL -# define IDCT_CTL_INTRA 0x00000020UL -# define IDCT_CTL_FLUSH 0x00000040UL -# define IDCT_CTL_PASSTHRU 0x00000080UL -# define IDCT_CTL_SW_RESET 0x00000100UL -# define IDCT_CONST_REQ 0x00000200UL -# define IDCT_SCRAMBLE 0x00000400UL -/* ? BlockIOTag(0x1f0u) */ -/* ? BlockIOTag(0x1f1u) */ -/* ? BlockIOTag(0x1f2u) */ -/* ? BlockIOTag(0x1f3u) */ -/* ? BlockIOTag(0x1f4u) */ -/* ? BlockIOTag(0x1f5u) */ -/* ? BlockIOTag(0x1f6u) */ -/* ? BlockIOTag(0x1f7u) */ -/* ? BlockIOTag(0x1f8u) */ -/* ? BlockIOTag(0x1f9u) */ -/* ? BlockIOTag(0x1fau) */ -/* ? BlockIOTag(0x1fbu) */ -/* ? BlockIOTag(0x1fcu) */ -/* ? BlockIOTag(0x1fdu) */ -/* ? BlockIOTag(0x1feu) */ -/* ? BlockIOTag(0x1ffu) */ - -/* Definitions for MEM_CNTL's CTL_MEM_?????_APER_ENDIAN fields */ -#define CTL_MEM_APER_BYTE_ENDIAN 0x00u -#define CTL_MEM_APER_WORD_ENDIAN 0x01u -#define CTL_MEM_APER_LONG_ENDIAN 0x02u -/* ? 0x03u */ - -/* Definitions for an ICS2595's programme word */ -#define ICS2595_CLOCK 0x000001f0ul -#define ICS2595_FB_DIV 0x0001fe00ul /* Feedback divider */ -#define ICS2595_POST_DIV 0x000c0000ul /* Post-divider */ -#define ICS2595_STOP 0x00300000ul /* Stop bits */ -#define ICS2595_TOGGLE (ICS2595_POST_DIV | ICS2595_STOP) - -/* Definitions for internal PLL registers on a 264xT */ -#define PLL_MPLL_CNTL 0x00u -#define MPLL_PC_GAIN 0x07u -#define MPLL_VC_GAIN 0x18u -#define MPLL_D_CYC 0x60u -#define MPLL_RANGE 0x80u -#define VPLL_CNTL 0x01u -#define VPLL_PC_GAIN 0x07u -#define VPLL_VC_GAIN 0x18u -#define VPLL_D_CYC 0x60u -#define VPLL_RANGE 0x80u -#define PLL_REF_DIV 0x02u -#define PLL_GEN_CNTL 0x03u -#define PLL_OVERRIDE 0x01u -#define PLL_SLEEP 0x01u /* GTPro */ -#define PLL_MCLK_RESET 0x02u -#define PLL_OSC_EN 0x04u -#define PLL_EXT_CLK_EN 0x08u -#define PLL_MCLK_SRC_SEL 0x70u -#define PLL_EXT_CLK_CNTL 0x80u /* CT/ET */ -#define PLL_DLL_PWDN 0x80u /* VTB/GTB/LT */ -#define PLL_MCLK_FB_DIV 0x04u -#define PLL_VCLK_CNTL 0x05u -#define PLL_VCLK_SRC_SEL 0x03u -#define PLL_VCLK_RESET 0x04u -#define PLL_VCLK_INVERT 0x08u -#define PLL_ECP_DIV 0x30u /* VT/GT */ -#define PLL_ERATE_GT_XRATE 0x40u /* VT/GT */ -#define PLL_SCALER_LOCK_EN 0x80u /* VT/GT */ -#define PLL_VCLK_POST_DIV 0x06u -#define PLL_VCLK0_POST_DIV 0x03u -#define PLL_VCLK1_POST_DIV 0x0cu -#define PLL_VCLK2_POST_DIV 0x30u -#define PLL_VCLK3_POST_DIV 0xc0u -#define PLL_VCLK0_FB_DIV 0x07u -#define PLL_VCLK1_FB_DIV 0x08u -#define PLL_VCLK2_FB_DIV 0x09u -#define PLL_VCLK3_FB_DIV 0x0au -#define PLL_XCLK_CNTL 0x0bu /* VT/GT */ -#define PLL_XCLK_MCLK_RATIO 0x03u -#define PLL_XCLK_SRC_SEL 0x07u /* VTB/GTB/LT */ -#define PLL_MFB_TIMES_4_2B 0x08u -#define PLL_VCLK0_XDIV 0x10u -#define PLL_VCLK1_XDIV 0x20u -#define PLL_VCLK2_XDIV 0x40u -#define PLL_VCLK3_XDIV 0x80u -#define PLL_FCP_CNTL 0x0cu /* VT/GT */ -#define PLL_FCP_POST_DIV 0x0fu -#define PLL_FCP_SRC_SEL 0x70u -#define PLL_DCLK_BY2_EN 0x80u -#define PLL_DLL_CNTL 0x0cu /* VTB/GTB/LT */ -#define PLL_DLL_REF_SRC 0x03u -#define PLL_DLL_FB_SRC 0x0cu -#define PLL_DLL_GAIN 0x30u -#define PLL_DLL_RESET 0x40u -#define PLL_DLL_HCLK_OUT_EN 0x80u -#define PLL_VFC_CNTL 0x0du /* VT/GT */ -#define PLL_DCLK_INVB 0x01u -#define PLL_DCLKBY2_EN 0x02u -#define PLL_VFC_2PHASE 0x04u -#define PLL_VFC_DELAY 0x18u -#define PLL_VFC_DCLKBY2_SHIFT 0x20u -/* ? 0x40u */ -#define PLL_TST_SRC_SEL_BIT5 0x80u /* VTB/GTB/LT */ -#define PLL_TEST_CNTL 0x0eu -#define PLL_TST_SRC_SEL 0x1fu -#define PLL_TST_DIVIDERS 0x20u -#define PLL_TST_MASK_READ 0x40u -#define PLL_TST_ANALOG_MON_EN 0x80u -#define PLL_TEST_COUNT 0x0fu -#define PLL_LVDSPLL_CNTL0 0x10u /* LT */ -#define PLL_FPDI_NS_TIMING 0x01u -#define PLL_CURR_LEVEL 0x0eu -#define PLL_LVDS_TEST_MODE 0xf0u -#define PLL_LVDSPLL_CNTL1 0x11u /* LT */ -#define PLL_LPPL_RANGE 0x01u -#define PLL_LPLL_DUTY 0x06u -#define PLL_LPLL_VC_GAIN 0x18u -#define PLL_LPLL_CP_GAIN 0xe0u -#define PLL_AGP1_CNTL 0x12u /* GTPro */ -#define PLL_AGP2_CNTL 0x13u /* GTPro */ -#define PLL_DLL2_CNTL 0x14u /* GTPro */ -#define PLL_SCLK_FB_DIV 0x15u /* GTPro */ -#define PLL_SPLL_CNTL1 0x16u /* GTPro */ -#define PLL_SPLL_CNTL2 0x17u /* GTPro */ -#define PLL_APLL_STRAPS 0x18u /* GTPro */ -#define PLL_EXT_VPLL_CNTL 0x19u /* GTPro */ -#define PLL_EXT_VPLL_REF_SRC 0x03u -#define PLL_EXT_VPLL_EN 0x04u -#define PLL_EXT_VPLL_VGA_EN 0x08u -#define PLL_EXT_VPLL_INSYNC 0x10u -/* ? 0x60u */ -#define PLL_EXT_V2PLL_EN 0x80u -#define PLL_EXT_VPLL_REF_DIV 0x1au /* GTPro */ -#define PLL_EXT_VPLL_FB_DIV 0x1bu /* GTPro */ -#define PLL_EXT_VPLL_MSB 0x1cu /* GTPro */ -#define PLL_HTOTAL_CNTL 0x1du /* GTPro */ -#define PLL_BYTE_CLK_CNTL 0x1eu /* GTPro */ -#define PLL_TV_REF_DIV 0x1fu /* LTPro */ -#define PLL_TV_FB_DIV 0x20u /* LTPro */ -#define PLL_TV_CNTL 0x21u /* LTPro */ -#define PLL_TV_GEN_CNTL 0x22u /* LTPro */ -#define PLL_V2_CNTL 0x23u /* LTPro */ -#define PLL_V2_GEN_CNTL 0x24u /* LTPro */ -#define PLL_V2_REF_DIV 0x25u /* LTPro */ -#define PLL_V2_FB_DIV 0x26u /* LTPro */ -#define PLL_V2_MSB 0x27u /* LTPro */ -#define PLL_HTOTAL2_CNTL 0x28u /* LTPro */ -#define PLL_YCLK_CNTL 0x29u /* XC/XL */ -#define PM_DYN_CLK_CNTL 0x2au /* XC/XL */ -/* ? 0x2bu */ -/* ? 0x2cu */ -/* ? 0x2du */ -/* ? 0x2eu */ -/* ? 0x2fu */ -/* ? 0x30u */ -/* ? 0x31u */ -/* ? 0x32u */ -/* ? 0x33u */ -/* ? 0x34u */ -/* ? 0x35u */ -/* ? 0x36u */ -/* ? 0x37u */ -/* ? 0x38u */ -/* ? 0x39u */ -/* ? 0x3au */ -/* ? 0x3bu */ -/* ? 0x3cu */ -/* ? 0x3du */ -/* ? 0x3eu */ -/* ? 0x3fu */ - -/* Definitions for an LTPro's 32-bit LCD registers */ -#define LCD_CONFIG_PANEL 0x00u /* See LT's CONFIG_PANEL (0x1d) */ -#define LCD_GEN_CNTL 0x01u /* See LT's LCD_GEN_CTRL (0x35) */ -#define LCD_DSTN_CONTROL 0x02u /* See LT's DSTN_CONTROL (0x1f) */ -#define LCD_HFB_PITCH_ADDR 0x03u /* See LT's HFB_PITCH_ADDR (0x2a) */ -#define LCD_HORZ_STRETCHING 0x04u /* See LT's HORZ_STRETCHING (0x32) */ -#define LCD_VERT_STRETCHING 0x05u /* See LT's VERT_STRETCHING (0x33) */ -#define LCD_EXT_VERT_STRETCH 0x06u -#define VERT_STRETCH_RATIO3 0x000003fful -#define FORCE_DAC_DATA 0x000000fful -#define FORCE_DAC_DATA_SEL 0x00000300ul -#define VERT_STRETCH_MODE 0x00000400ul -#define VERT_PANEL_SIZE 0x003ff800ul -#define AUTO_VERT_RATIO 0x00400000ul -#define USE_AUTO_FP_POS 0x00800000ul -#define USE_AUTO_LCD_VSYNC 0x01000000ul -/* ? 0xfe000000ul */ -#define LCD_LT_GIO 0x07u /* See LT's LT_GIO (0x2f) */ -#define LCD_POWER_MANAGEMENT 0x08u /* See LT's POWER_MANAGEMENT (0x36) */ -#define LCD_ZVGPIO 0x09u -#define LCD_ICON_CLR0 0x0au /* XC/XL */ -#define LCD_ICON_CLR1 0x0bu /* XC/XL */ -#define LCD_ICON_OFFSET 0x0cu /* XC/XL */ -#define LCD_ICON_HORZ_VERT_POSN 0x0du /* XC/XL */ -#define LCD_ICON_HORZ_VERT_OFF 0x0eu /* XC/XL */ -#define LCD_ICON2_CLR0 0x0fu /* XC/XL */ -#define LCD_ICON2_CLR1 0x10u /* XC/XL */ -#define LCD_ICON2_OFFSET 0x11u /* XC/XL */ -#define LCD_ICON2_HORZ_VERT_POSN 0x12u /* XC/XL */ -#define LCD_ICON2_HORZ_VERT_OFF 0x13u /* XC/XL */ -#define LCD_MISC_CNTL 0x14u /* XC/XL */ -#define BL_MOD_LEVEL 0x000000fful -#define BIAS_MOD_LEVEL 0x0000ff00ul -#define BLMOD_EN 0x00010000ul -#define BIASMOD_EN 0x00020000ul -/* ? 0x00040000ul */ -#define PWRSEQ_MODE 0x00080000ul -#define APC_EN 0x00100000ul -#define MONITOR_DET_EN 0x00200000ul -#define FORCE_DAC_DATA_SEL_X 0x00c00000ul -#define FORCE_DAC_DATA_X 0xff000000ul -#define LCD_TMDS_CNTL 0x15u /* XC/XL */ -#define LCD_TMDS_SYNC_CHAR_SETA 0x16u /* XC/XL */ -#define LCD_TMDS_SYNC_CHAR_SETB 0x17u /* XC/XL */ -#define LCD_TMDS_SRC 0x18u /* XC/XL */ -#define LCD_PLTSTBLK_CNTL 0x19u /* XC/XL */ -#define LCD_SYNC_GEN_CNTL 0x1au /* XC/XL */ -#define LCD_PATTERN_GEN_SEED 0x1bu /* XC/XL */ -#define LCD_APC_CNTL 0x1cu /* XC/XL */ -#define LCD_POWER_MANAGEMENT_2 0x1du /* XC/XL */ -#define LCD_XCLK_DISP_PM_EN 0x00000001ul -#define LCD_XCLK_DISP2_PM_EN 0x00000002ul /* Mobility */ -#define LCD_XCLK_VID_PM_EN 0x00000004ul -#define LCD_XCLK_SCL_PM_EN 0x00000008ul -#define LCD_XCLK_GUI_PM_EN 0x00000010ul -#define LCD_XCLK_SUB_PM_EN 0x00000020ul -/* ? 0x000000c0ul */ -#define LCD_MCLK_PM_EN 0x00000100ul -#define LCD_SS_EN 0x00000200ul -#define LCD_BLON_DIGON_EN 0x00000400ul -/* ? 0x00000800ul */ -#define LCD_PM_DYN_XCLK_SYNC 0x00003000ul -#define LCD_SEL_W4MS 0x00004000ul -/* ? 0x00008000ul */ -#define LCD_PM_DYN_XCLK_EN 0x00010000ul -#define LCD_PM_XCLK_ALWAYS 0x00020000ul -#define LCD_PM_DYN_XCLK_STATUS 0x00040000ul -#define LCD_PCI_ACC_DIS 0x00080000ul -#define LCD_PM_DYN_XCLK_DISP 0x00100000ul -#define LCD_PM_DYN_XCLK_DISP2 0x00200000ul /* Mobility */ -#define LCD_PM_DYN_XCLK_VID 0x00400000ul -#define LCD_PM_DYN_XCLK_HFB 0x00800000ul -#define LCD_PM_DYN_XCLK_SCL 0x01000000ul -#define LCD_PM_DYN_XCLK_SUB 0x02000000ul -#define LCD_PM_DYN_XCLK_GUI 0x04000000ul -#define LCD_PM_DYN_XCLK_HOST 0x08000000ul -/* ? 0xf0000000ul */ -#define LCD_PRI_ERR_PATTERN 0x1eu /* XC/XL */ -#define LCD_CUR_ERR_PATTERN 0x1fu /* XC/XL */ -#define LCD_PLTSTBLK_RPT 0x20u /* XC/XL */ -#define LCD_SYNC_RPT 0x21u /* XC/XL */ -#define LCD_CRC_PATTERN_RPT 0x22u /* XC/XL */ -#define LCD_PL_TRANSMITTER_CNTL 0x23u /* XC/XL */ -#define LCD_PL_PLL_CNTL 0x24u /* XC/XL */ -#define LCD_ALPHA_BLENDING 0x25u /* XC/XL */ -#define LCD_PORTRAIT_GEN_CNTL 0x26u /* XC/XL */ -#define LCD_APC_CTRL_IO 0x27u /* XC/XL */ -#define LCD_TEST_IO 0x28u /* XC/XL */ -/* ? 0x29u */ -#define LCD_DP1_MEM_ACCESS 0x2au /* XC/XL */ -#define LCD_DP0_MEM_ACCESS 0x2bu /* XC/XL */ -#define LCD_DP0_DEBUG_A 0x2cu /* XC/XL */ -#define LCD_DP0_DEBUG_B 0x2du /* XC/XL */ -#define LCD_DP1_DEBUG_A 0x2eu /* XC/XL */ -#define LCD_DP1_DEBUG_B 0x2fu /* XC/XL */ -#define LCD_DPCTRL_DEBUG_A 0x30u /* XC/XL */ -#define LCD_DPCTRL_DEBUG_B 0x31u /* XC/XL */ -#define LCD_MEMBLK_DEBUG 0x32u /* XC/XL */ -#define LCD_APC_LUT_AB 0x33u /* XC/XL */ -#define LCD_APC_LUT_CD 0x34u /* XC/XL */ -#define LCD_APC_LUT_EF 0x35u /* XC/XL */ -#define LCD_APC_LUT_GH 0x36u /* XC/XL */ -#define LCD_APC_LUT_IJ 0x37u /* XC/XL */ -#define LCD_APC_LUT_KL 0x38u /* XC/XL */ -#define LCD_APC_LUT_MN 0x39u /* XC/XL */ -#define LCD_APC_LUT_OP 0x3au /* XC/XL */ -/* ? 0x3bu */ -/* ? 0x3cu */ -/* ? 0x3du */ -/* ? 0x3eu */ -/* ? 0x3fu */ - -/* Definitions for an LTPro's TV registers */ -/* ? 0x00u */ -/* ? 0x01u */ -/* ? 0x02u */ -/* ? 0x03u */ -/* ? 0x04u */ -/* ? 0x05u */ -/* ? 0x06u */ -/* ? 0x07u */ -/* ? 0x08u */ -/* ? 0x09u */ -/* ? 0x0au */ -/* ? 0x0bu */ -/* ? 0x0cu */ -/* ? 0x0du */ -/* ? 0x0eu */ -/* ? 0x0fu */ -#define TV_MASTER_CNTL 0x10u -/* ? 0x11u */ -#define TV_RGB_CNTL 0x12u -/* ? 0x13u */ -#define TV_SYNC_CNTL 0x14u -/* ? 0x15u */ -/* ? 0x16u */ -/* ? 0x17u */ -/* ? 0x18u */ -/* ? 0x19u */ -/* ? 0x1au */ -/* ? 0x1bu */ -/* ? 0x1cu */ -/* ? 0x1du */ -/* ? 0x1eu */ -/* ? 0x1fu */ -#define TV_HTOTAL 0x20u -#define TV_HDISP 0x21u -#define TV_HSIZE 0x22u -#define TV_HSTART 0x23u -#define TV_HCOUNT 0x24u -#define TV_VTOTAL 0x25u -#define TV_VDISP 0x26u -#define TV_VCOUNT 0x27u -#define TV_FTOTAL 0x28u -#define TV_FCOUNT 0x29u -#define TV_FRESTART 0x2au -#define TV_HRESTART 0x2bu -#define TV_VRESTART 0x2cu -/* ? 0x2du */ -/* ? 0x2eu */ -/* ? 0x2fu */ -/* ? 0x30u */ -/* ? 0x31u */ -/* ? 0x32u */ -/* ? 0x33u */ -/* ? 0x34u */ -/* ? 0x35u */ -/* ? 0x36u */ -/* ? 0x37u */ -/* ? 0x38u */ -/* ? 0x39u */ -/* ? 0x3au */ -/* ? 0x3bu */ -/* ? 0x3cu */ -/* ? 0x3du */ -/* ? 0x3eu */ -/* ? 0x3fu */ -/* ? 0x40u */ -/* ? 0x41u */ -/* ? 0x42u */ -/* ? 0x43u */ -/* ? 0x44u */ -/* ? 0x45u */ -/* ? 0x46u */ -/* ? 0x47u */ -/* ? 0x48u */ -/* ? 0x49u */ -/* ? 0x4au */ -/* ? 0x4bu */ -/* ? 0x4cu */ -/* ? 0x4du */ -/* ? 0x4eu */ -/* ? 0x4fu */ -/* ? 0x50u */ -/* ? 0x51u */ -/* ? 0x52u */ -/* ? 0x53u */ -/* ? 0x54u */ -/* ? 0x55u */ -/* ? 0x56u */ -/* ? 0x57u */ -/* ? 0x58u */ -/* ? 0x59u */ -/* ? 0x5au */ -/* ? 0x5bu */ -/* ? 0x5cu */ -/* ? 0x5du */ -/* ? 0x5eu */ -/* ? 0x5fu */ -#define TV_HOST_READ_DATA 0x60u -#define TV_HOST_WRITE_DATA 0x61u -#define TV_HOST_RD_WT_CNTL 0x62u -/* ? 0x63u */ -/* ? 0x64u */ -/* ? 0x65u */ -/* ? 0x66u */ -/* ? 0x67u */ -/* ? 0x68u */ -/* ? 0x69u */ -/* ? 0x6au */ -/* ? 0x6bu */ -/* ? 0x6cu */ -/* ? 0x6du */ -/* ? 0x6eu */ -/* ? 0x6fu */ -#define TV_VSCALER_CNTL 0x70u -#define TV_TIMING_CNTL 0x71u -#define TV_GAMMA_CNTL 0x72u -#define TV_Y_FALL_CNTL 0x73u -#define TV_Y_RISE_CNTL 0x74u -#define TV_Y_SAW_TOOTH_CNTL 0x75u -/* ? 0x76u */ -/* ? 0x77u */ -/* ? 0x78u */ -/* ? 0x79u */ -/* ? 0x7au */ -/* ? 0x7bu */ -/* ? 0x7cu */ -/* ? 0x7du */ -/* ? 0x7eu */ -/* ? 0x7fu */ -#define TV_MODULATOR_CNTL1 0x80u -#define TV_MODULATOR_CNTL2 0x81u -/* ? 0x82u */ -/* ? 0x83u */ -/* ? 0x84u */ -/* ? 0x85u */ -/* ? 0x86u */ -/* ? 0x87u */ -/* ? 0x88u */ -/* ? 0x89u */ -/* ? 0x8au */ -/* ? 0x8bu */ -/* ? 0x8cu */ -/* ? 0x8du */ -/* ? 0x8eu */ -/* ? 0x8fu */ -#define TV_PRE_DAC_MUX_CNTL 0x90u -/* ? 0x91u */ -/* ? 0x92u */ -/* ? 0x93u */ -/* ? 0x94u */ -/* ? 0x95u */ -/* ? 0x96u */ -/* ? 0x97u */ -/* ? 0x98u */ -/* ? 0x99u */ -/* ? 0x9au */ -/* ? 0x9bu */ -/* ? 0x9cu */ -/* ? 0x9du */ -/* ? 0x9eu */ -/* ? 0x9fu */ -#define TV_DAC_CNTL 0xa0u -/* ? 0xa1u */ -/* ? 0xa2u */ -/* ? 0xa3u */ -/* ? 0xa4u */ -/* ? 0xa5u */ -/* ? 0xa6u */ -/* ? 0xa7u */ -/* ? 0xa8u */ -/* ? 0xa9u */ -/* ? 0xaau */ -/* ? 0xabu */ -/* ? 0xacu */ -/* ? 0xadu */ -/* ? 0xaeu */ -/* ? 0xafu */ -#define TV_CRC_CNTL 0xb0u -#define TV_VIDEO_PORT_SIG 0xb1u -/* ? 0xb2u */ -/* ? 0xb3u */ -/* ? 0xb4u */ -/* ? 0xb5u */ -/* ? 0xb6u */ -/* ? 0xb7u */ -#define TV_VBI_CC_CNTL 0xb8u -#define TV_VBI_EDS_CNTL 0xb9u -#define TV_VBI_20BIT_CNTL 0xbau -/* ? 0xbbu */ -/* ? 0xbcu */ -#define TV_VBI_DTO_CNTL 0xbdu -#define TV_VBI_LEVEL_CNTL 0xbeu -/* ? 0xbfu */ -#define TV_UV_ADR 0xc0u -#define TV_FIFO_TEST_CNTL 0xc1u -/* ? 0xc2u */ -/* ? 0xc3u */ -/* ? 0xc4u */ -/* ? 0xc5u */ -/* ? 0xc6u */ -/* ? 0xc7u */ -/* ? 0xc8u */ -/* ? 0xc9u */ -/* ? 0xcau */ -/* ? 0xcbu */ -/* ? 0xccu */ -/* ? 0xcdu */ -/* ? 0xceu */ -/* ? 0xcfu */ -/* ? 0xd0u */ -/* ? 0xd1u */ -/* ? 0xd2u */ -/* ? 0xd3u */ -/* ? 0xd4u */ -/* ? 0xd5u */ -/* ? 0xd6u */ -/* ? 0xd7u */ -/* ? 0xd8u */ -/* ? 0xd9u */ -/* ? 0xdau */ -/* ? 0xdbu */ -/* ? 0xdcu */ -/* ? 0xddu */ -/* ? 0xdeu */ -/* ? 0xdfu */ -/* ? 0xe0u */ -/* ? 0xe1u */ -/* ? 0xe2u */ -/* ? 0xe3u */ -/* ? 0xe4u */ -/* ? 0xe5u */ -/* ? 0xe6u */ -/* ? 0xe7u */ -/* ? 0xe8u */ -/* ? 0xe9u */ -/* ? 0xeau */ -/* ? 0xebu */ -/* ? 0xecu */ -/* ? 0xedu */ -/* ? 0xeeu */ -/* ? 0xefu */ -/* ? 0xf0u */ -/* ? 0xf1u */ -/* ? 0xf2u */ -/* ? 0xf3u */ -/* ? 0xf4u */ -/* ? 0xf5u */ -/* ? 0xf6u */ -/* ? 0xf7u */ -/* ? 0xf8u */ -/* ? 0xf9u */ -/* ? 0xfau */ -/* ? 0xfbu */ -/* ? 0xfcu */ -/* ? 0xfdu */ -/* ? 0xfeu */ -/* ? 0xffu */ - -/* Miscellaneous */ - -/* Current X, Y & Dest X, Y mask */ -#define COORD_MASK 0x07ffu - -/* Pixel widths */ -#define PIX_WIDTH_1BPP 0x00u -#define PIX_WIDTH_4BPP 0x01u /* CRTC2: 8bpp */ -#define PIX_WIDTH_8BPP 0x02u /* CRTC2: Undefined */ -#define PIX_WIDTH_15BPP 0x03u -#define PIX_WIDTH_16BPP 0x04u -#define PIX_WIDTH_24BPP 0x05u -#define PIX_WIDTH_32BPP 0x06u -#define PIX_WIDTH_YUV422 0x07u /* CRTC2 only */ - -/* Source definitions */ -#define SRC_BKGD 0x00u -#define SRC_FRGD 0x01u -#define SRC_HOST 0x02u -#define SRC_BLIT 0x03u -#define SRC_PATTERN 0x04u -#define SRC_SCALER_3D 0x05u -/* ? 0x06u */ -/* ? 0x07u */ - -/* The Mixes */ -#define MIX_MASK 0x001fu - -#define MIX_NOT_DST 0x0000u -#define MIX_0 0x0001u -#define MIX_1 0x0002u -#define MIX_DST 0x0003u -#define MIX_NOT_SRC 0x0004u -#define MIX_XOR 0x0005u -#define MIX_XNOR 0x0006u -#define MIX_SRC 0x0007u -#define MIX_NAND 0x0008u -#define MIX_NOT_SRC_OR_DST 0x0009u -#define MIX_SRC_OR_NOT_DST 0x000au -#define MIX_OR 0x000bu -#define MIX_AND 0x000cu -#define MIX_SRC_AND_NOT_DST 0x000du -#define MIX_NOT_SRC_AND_DST 0x000eu -#define MIX_NOR 0x000fu - -#define MIX_MIN 0x0010u -#define MIX_DST_MINUS_SRC 0x0011u -#define MIX_SRC_MINUS_DST 0x0012u -#define MIX_PLUS 0x0013u -#define MIX_MAX 0x0014u -#define MIX_HALF__DST_MINUS_SRC 0x0015u -#define MIX_HALF__SRC_MINUS_DST 0x0016u -#define MIX_AVERAGE 0x0017u -#define MIX_DST_MINUS_SRC_SAT 0x0018u -#define MIX_SRC_MINUS_DST_SAT 0x001au -#define MIX_HALF__DST_MINUS_SRC_SAT 0x001cu -#define MIX_HALF__SRC_MINUS_DST_SAT 0x001eu -#define MIX_AVERAGE_SAT 0x001fu -#define MIX_FN_PAINT MIX_SRC - - -#endif diff --git a/src/video_out/vidix/drivers/mach64_vid.c b/src/video_out/vidix/drivers/mach64_vid.c deleted file mode 100644 index 02447af19..000000000 --- a/src/video_out/vidix/drivers/mach64_vid.c +++ /dev/null @@ -1,1390 +0,0 @@ -/* - mach64_vid - VIDIX based video driver for Mach64 and 3DRage chips - Copyrights 2002 Nick Kurshev. This file is based on sources from - GATOS (gatos.sf.net) and X11 (www.xfree86.org) - Licence: GPL - WARNING: THIS DRIVER IS IN BETTA STAGE -*/ -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <math.h> -#include <inttypes.h> -#include <fcntl.h> -#include <limits.h> -#include <sys/mman.h> /* for m(un)lock */ -#ifdef HAVE_MALLOC_H -#include <malloc.h> -#ifdef HAVE_MEMALIGN -#define MACH64_ENABLE_BM 1 -#endif -#endif - -#include "vidix.h" -#include "fourcc.h" -#include "libdha.h" -#include "pci_ids.h" -#include "pci_names.h" -#include "bswap.h" - -#include "mach64.h" - -#define UNUSED(x) ((void)(x)) /**< Removes warning about unused arguments */ - -#define VIDIX_STATIC mach64_ - -#ifdef MACH64_ENABLE_BM - -#define cpu_to_le32(a) (a) -#define VIRT_TO_CARD(a,b,c) bm_virt_to_bus(a,b,c) -#pragma pack(1) -typedef struct -{ - uint32_t framebuf_offset; - uint32_t sys_addr; - uint32_t command; - uint32_t reserved; -} bm_list_descriptor; -#pragma pack() -static void *mach64_dma_desc_base[64]; -static unsigned long bus_addr_dma_desc = 0; -static unsigned long *dma_phys_addrs; -#endif - -static void *mach64_mmio_base = 0; -static void *mach64_mem_base = 0; -static int32_t mach64_overlay_offset = 0; -static uint32_t mach64_ram_size = 0; -static uint32_t mach64_buffer_base[64][3]; -static int num_mach64_buffers=-1; -static int supports_planar=0; -static int supports_colour_adj=0; -static int supports_idct=0; -static int supports_subpic=0; -static int supports_lcd_v_stretch=0; - -pciinfo_t pci_info; -static int probed = 0; -static int __verbose = 0; - -#define VERBOSE_LEVEL 2 - -typedef struct bes_registers_s -{ - /* base address of yuv framebuffer */ - uint32_t yuv_base; - uint32_t fourcc; - /* YUV BES registers */ - uint32_t reg_load_cntl; - uint32_t scale_inc; - uint32_t y_x_start; - uint32_t y_x_end; - uint32_t vid_buf_pitch; - uint32_t height_width; - - uint32_t scale_cntl; - uint32_t exclusive_horz; - uint32_t auto_flip_cntl; - uint32_t filter_cntl; - uint32_t key_cntl; - uint32_t test; - /* Configurable stuff */ - - int brightness; - int saturation; - - int ckey_on; - uint32_t graphics_key_clr; - uint32_t graphics_key_msk; - - int deinterlace_on; - uint32_t deinterlace_pattern; - -} bes_registers_t; - -static bes_registers_t besr; - -typedef struct video_registers_s -{ - const char * sname; - uint32_t name; - uint32_t value; -}video_registers_t; - -static bes_registers_t besr; - -/* Graphic keys */ -static vidix_grkey_t mach64_grkey; - -#define DECLARE_VREG(name) { #name, name, 0 } -static video_registers_t vregs[] = -{ - DECLARE_VREG(OVERLAY_SCALE_INC), - DECLARE_VREG(OVERLAY_Y_X_START), - DECLARE_VREG(OVERLAY_Y_X_END), - DECLARE_VREG(OVERLAY_SCALE_CNTL), - DECLARE_VREG(OVERLAY_EXCLUSIVE_HORZ), - DECLARE_VREG(OVERLAY_EXCLUSIVE_VERT), - DECLARE_VREG(OVERLAY_TEST), - DECLARE_VREG(SCALER_BUF_PITCH), - DECLARE_VREG(SCALER_HEIGHT_WIDTH), - DECLARE_VREG(SCALER_BUF0_OFFSET), - DECLARE_VREG(SCALER_BUF0_OFFSET_U), - DECLARE_VREG(SCALER_BUF0_OFFSET_V), - DECLARE_VREG(SCALER_BUF1_OFFSET), - DECLARE_VREG(SCALER_BUF1_OFFSET_U), - DECLARE_VREG(SCALER_BUF1_OFFSET_V), - DECLARE_VREG(SCALER_H_COEFF0), - DECLARE_VREG(SCALER_H_COEFF1), - DECLARE_VREG(SCALER_H_COEFF2), - DECLARE_VREG(SCALER_H_COEFF3), - DECLARE_VREG(SCALER_H_COEFF4), - DECLARE_VREG(SCALER_COLOUR_CNTL), - DECLARE_VREG(SCALER_THRESHOLD), - DECLARE_VREG(VIDEO_FORMAT), - DECLARE_VREG(VIDEO_CONFIG), - DECLARE_VREG(VIDEO_SYNC_TEST), - DECLARE_VREG(VIDEO_SYNC_TEST_B), - DECLARE_VREG(BUS_CNTL), - DECLARE_VREG(SRC_CNTL), - DECLARE_VREG(GUI_STAT), - DECLARE_VREG(BM_ADDR), - DECLARE_VREG(BM_DATA), - DECLARE_VREG(BM_HOSTDATA), - DECLARE_VREG(BM_GUI_TABLE_CMD), - DECLARE_VREG(BM_FRAME_BUF_OFFSET), - DECLARE_VREG(BM_SYSTEM_MEM_ADDR), - DECLARE_VREG(BM_COMMAND), - DECLARE_VREG(BM_STATUS), - DECLARE_VREG(BM_GUI_TABLE), - DECLARE_VREG(BM_SYSTEM_TABLE), - DECLARE_VREG(AGP_BASE), - DECLARE_VREG(AGP_CNTL), - DECLARE_VREG(CRTC_INT_CNTL) -}; - -/* VIDIX exports */ - -/* MMIO space*/ -#define GETREG(TYPE,PTR,OFFZ) (*((volatile TYPE*)((PTR)+(OFFZ)))) -#define SETREG(TYPE,PTR,OFFZ,VAL) (*((volatile TYPE*)((PTR)+(OFFZ))))=VAL - -#define INREG8(addr) GETREG(uint8_t,(uint32_t)mach64_mmio_base,((addr)^0x100)<<2) -#define OUTREG8(addr,val) SETREG(uint8_t,(uint32_t)mach64_mmio_base,((addr)^0x100)<<2,val) -static inline uint32_t INREG (uint32_t addr) { - uint32_t tmp = GETREG(uint32_t,(uint32_t)mach64_mmio_base,((addr)^0x100)<<2); - return le2me_32(tmp); -} -#define OUTREG(addr,val) SETREG(uint32_t,(uint32_t)mach64_mmio_base,((addr)^0x100)<<2,le2me_32(val)) - -#define OUTREGP(addr,val,mask) \ - do { \ - unsigned int _tmp = INREG(addr); \ - _tmp &= (mask); \ - _tmp |= (val); \ - OUTREG(addr, _tmp); \ - } while (0) - -static __inline__ int ATIGetMach64LCDReg(int _Index) -{ - OUTREG8(LCD_INDEX, _Index); - return INREG(LCD_DATA); -} - -static __inline__ uint32_t INPLL(uint32_t addr) -{ - uint32_t res; - uint32_t in; - - in= INREG(CLOCK_CNTL); - in &= ~((PLL_WR_EN | PLL_ADDR)); //clean some stuff - OUTREG(CLOCK_CNTL, in | (addr<<10)); - - /* read the register value */ - res = (INREG(CLOCK_CNTL)>>16)&0xFF; - return res; -} - -static __inline__ void OUTPLL(uint32_t addr,uint32_t val) -{ -//FIXME buggy but its not used - /* write addr byte */ - OUTREG8(CLOCK_CNTL + 1, (addr << 2) | PLL_WR_EN); - /* write the register value */ - OUTREG(CLOCK_CNTL + 2, val); - OUTREG8(CLOCK_CNTL + 1, (addr << 2) & ~PLL_WR_EN); -} - -#define OUTPLLP(addr,val,mask) \ - do { \ - unsigned int _tmp = INPLL(addr); \ - _tmp &= (mask); \ - _tmp |= (val); \ - OUTPLL(addr, _tmp); \ - } while (0) - -static void mach64_engine_reset( void ) -{ - /* Kill off bus mastering with extreme predjudice... */ - OUTREG(BUS_CNTL, INREG(BUS_CNTL) | BUS_MASTER_DIS); - OUTREG(CRTC_INT_CNTL,INREG(CRTC_INT_CNTL)&~(CRTC_BUSMASTER_EOL_INT|CRTC_BUSMASTER_EOL_INT_EN)); - /* Reset engine -- This is accomplished by setting bit 8 of the GEN_TEST_CNTL - register high, then low (per the documentation, it's on high to low transition - that the GUI engine gets reset...) */ - OUTREG( GEN_TEST_CNTL, INREG( GEN_TEST_CNTL ) | GEN_GUI_EN ); - OUTREG( GEN_TEST_CNTL, INREG( GEN_TEST_CNTL ) & ~GEN_GUI_EN ); -} - -static void mach64_fifo_wait(unsigned n) -{ - while ((INREG(FIFO_STAT) & 0xffff) > ((uint32_t)(0x8000 >> n))); -} - -static void mach64_wait_for_idle( void ) -{ - unsigned i; - mach64_fifo_wait(16); - for (i=0; i<2000000; i++) if((INREG(GUI_STAT) & GUI_ACTIVE) == 0) break; - if((INREG(GUI_STAT) & 1) != 0) mach64_engine_reset(); /* due card lookup */ -} - -static void mach64_wait_vsync( void ) -{ - int i; - - for(i=0; i<2000000; i++) - if( (INREG(CRTC_INT_CNTL)&CRTC_VBLANK)==0 ) break; - for(i=0; i<2000000; i++) - if( (INREG(CRTC_INT_CNTL)&CRTC_VBLANK) ) break; - -} - -static vidix_capability_t mach64_cap = -{ - "BES driver for Mach64/3DRage cards", - "Nick Kurshev and Michael Niedermayer", - TYPE_OUTPUT, - { 0, 0, 0, 0 }, - 2048, - 2048, - 4, - 4, - -1, - FLAG_UPSCALER|FLAG_DOWNSCALER, - VENDOR_ATI, - -1, - { 0, 0, 0, 0 } -}; - -static uint32_t mach64_vid_get_dbpp( void ) -{ - uint32_t dbpp,retval; - dbpp = (INREG(CRTC_GEN_CNTL)>>8)& 0x7; - switch(dbpp) - { - case 1: retval = 4; break; - case 2: retval = 8; break; - case 3: retval = 15; break; - case 4: retval = 16; break; - case 5: retval = 24; break; - default: retval=32; break; - } - return retval; -} - -static int mach64_is_dbl_scan( void ) -{ - return INREG(CRTC_GEN_CNTL) & CRTC_DBL_SCAN_EN; -} - -static int mach64_is_interlace( void ) -{ - return INREG(CRTC_GEN_CNTL) & CRTC_INTERLACE_EN; -} - -static uint32_t mach64_get_xres( void ) -{ - /* FIXME: currently we extract that from CRTC!!!*/ - uint32_t xres,h_total; - h_total = INREG(CRTC_H_TOTAL_DISP); - xres = (h_total >> 16) & 0xffff; - return (xres + 1)*8; -} - -static uint32_t mach64_get_yres( void ) -{ - /* FIXME: currently we extract that from CRTC!!!*/ - uint32_t yres,v_total; - v_total = INREG(CRTC_V_TOTAL_DISP); - yres = (v_total >> 16) & 0xffff; - return yres + 1; -} - -// returns the verical stretch factor in 16.16 -static int mach64_get_vert_stretch(void) -{ - int lcd_index; - int vert_stretching; - int ext_vert_stretch; - int ret; - int yres= mach64_get_yres(); - - if(!supports_lcd_v_stretch){ - if(__verbose>0) printf("[mach64] vertical stretching not supported\n"); - return 1<<16; - } - - lcd_index= INREG(LCD_INDEX); - - vert_stretching= ATIGetMach64LCDReg(LCD_VERT_STRETCHING); - if(!(vert_stretching&VERT_STRETCH_EN)) ret= 1<<16; - else - { - int panel_size; - - ext_vert_stretch= ATIGetMach64LCDReg(LCD_EXT_VERT_STRETCH); - panel_size= (ext_vert_stretch&VERT_PANEL_SIZE)>>11; - panel_size++; - - ret= ((yres<<16) + (panel_size>>1))/panel_size; - } - -// lcd_gen_ctrl = ATIGetMach64LCDReg(LCD_GEN_CNTL); - - OUTREG(LCD_INDEX, lcd_index); - - if(__verbose>0) printf("[mach64] vertical stretching factor= %d\n", ret); - - return ret; -} - -static void mach64_vid_make_default() -{ - mach64_fifo_wait(5); - OUTREG(SCALER_COLOUR_CNTL,0x00101000); - - besr.ckey_on=0; - besr.graphics_key_msk=0; - besr.graphics_key_clr=0; - - OUTREG(OVERLAY_GRAPHICS_KEY_MSK, besr.graphics_key_msk); - OUTREG(OVERLAY_GRAPHICS_KEY_CLR, besr.graphics_key_clr); - OUTREG(OVERLAY_KEY_CNTL,VIDEO_KEY_FN_TRUE|GRAPHIC_KEY_FN_EQ|CMP_MIX_AND); - -} - -static void mach64_vid_dump_regs( void ) -{ - size_t i; - printf("[mach64] *** Begin of DRIVER variables dump ***\n"); - printf("[mach64] mach64_mmio_base=%p\n",mach64_mmio_base); - printf("[mach64] mach64_mem_base=%p\n",mach64_mem_base); - printf("[mach64] mach64_overlay_off=%08X\n",mach64_overlay_offset); - printf("[mach64] mach64_ram_size=%08X\n",mach64_ram_size); - printf("[mach64] video mode: %ux%u@%u\n",mach64_get_xres(),mach64_get_yres(),mach64_vid_get_dbpp()); - printf("[mach64] *** Begin of OV0 registers dump ***\n"); - for(i=0;i<sizeof(vregs)/sizeof(video_registers_t);i++) - { - mach64_wait_for_idle(); - mach64_fifo_wait(2); - printf("[mach64] %s = %08X\n",vregs[i].sname,INREG(vregs[i].name)); - } - printf("[mach64] *** End of OV0 registers dump ***\n"); -} - - -unsigned int VIDIX_NAME(vixGetVersion)(void) -{ - return(VIDIX_VERSION); -} - -typedef struct ati_chip_id_s -{ - unsigned short id; - unsigned short is_agp; -}ati_chip_id_t; - -static ati_chip_id_t ati_card_ids[] = -{ - { DEVICE_ATI_215CT_MACH64_CT, 0 }, - { DEVICE_ATI_210888CX_MACH64_CX, 0 }, - { DEVICE_ATI_210888ET_MACH64_ET, 0 }, - { DEVICE_ATI_MACH64_VT, 0 }, - { DEVICE_ATI_210888GX_MACH64_GX, 0 }, - { DEVICE_ATI_264LT_MACH64_LT, 0 }, - { DEVICE_ATI_264VT_MACH64_VT, 0 }, - { DEVICE_ATI_264VT3_MACH64_VT3, 0 }, - { DEVICE_ATI_264VT4_MACH64_VT4, 0 }, - /**/ - { DEVICE_ATI_3D_RAGE_PRO, 1 }, - { DEVICE_ATI_3D_RAGE_PRO2, 1 }, - { DEVICE_ATI_3D_RAGE_PRO3, 0 }, - { DEVICE_ATI_3D_RAGE_PRO4, 0 }, - { DEVICE_ATI_RAGE_XC, 0 }, - { DEVICE_ATI_RAGE_XL_AGP, 1 }, - { DEVICE_ATI_RAGE_XC_AGP, 1 }, - { DEVICE_ATI_RAGE_XL, 0 }, - { DEVICE_ATI_3D_RAGE_PRO5, 0 }, - { DEVICE_ATI_3D_RAGE_PRO6, 0 }, - { DEVICE_ATI_RAGE_XL2, 0 }, - { DEVICE_ATI_RAGE_XC2, 0 }, - { DEVICE_ATI_3D_RAGE_I_II, 0 }, - { DEVICE_ATI_3D_RAGE_II, 0 }, - { DEVICE_ATI_3D_RAGE_IIC, 1 }, - { DEVICE_ATI_3D_RAGE_IIC2, 0 }, - { DEVICE_ATI_3D_RAGE_IIC3, 0 }, - { DEVICE_ATI_3D_RAGE_IIC4, 1 }, - { DEVICE_ATI_3D_RAGE_LT, 1 }, - { DEVICE_ATI_3D_RAGE_LT2, 1 }, - { DEVICE_ATI_3D_RAGE_LT_G, 0 }, - { DEVICE_ATI_3D_RAGE_LT3, 0 }, - { DEVICE_ATI_RAGE_MOBILITY_P_M, 1 }, - { DEVICE_ATI_RAGE_MOBILITY_L, 1 }, - { DEVICE_ATI_3D_RAGE_LT4, 0 }, - { DEVICE_ATI_3D_RAGE_LT5, 0 }, - { DEVICE_ATI_RAGE_MOBILITY_P_M2, 0 }, - { DEVICE_ATI_RAGE_MOBILITY_L2, 0 } -}; - -static int is_agp; - -static int find_chip(unsigned chip_id) -{ - unsigned i; - for(i = 0;i < sizeof(ati_card_ids)/sizeof(ati_chip_id_t);i++) - { - if(chip_id == ati_card_ids[i].id) return i; - } - return -1; -} - -int VIDIX_NAME(vixProbe)(int verbose,int force) -{ - pciinfo_t lst[MAX_PCI_DEVICES]; - unsigned i,num_pci; - int err; - __verbose = verbose; - err = pci_scan(lst,&num_pci); - if(err) - { - printf("[mach64] Error occured during pci scan: %s\n",strerror(err)); - return err; - } - else - { - err = ENXIO; - for(i=0;i<num_pci;i++) - { - if(lst[i].vendor == VENDOR_ATI) - { - int idx; - const char *dname; - idx = find_chip(lst[i].device); - if(idx == -1 && force == PROBE_NORMAL) continue; - dname = pci_device_name(VENDOR_ATI,lst[i].device); - dname = dname ? dname : "Unknown chip"; - printf("[mach64] Found chip: %s\n",dname); - if(force > PROBE_NORMAL) - { - printf("[mach64] Driver was forced. Was found %sknown chip\n",idx == -1 ? "un" : ""); - if(idx == -1) - printf("[mach64] Assuming it as Mach64\n"); - } - if(idx != -1) is_agp = ati_card_ids[idx].is_agp; - mach64_cap.device_id = lst[i].device; - err = 0; - memcpy(&pci_info,&lst[i],sizeof(pciinfo_t)); - probed=1; - break; - } - } - } - if(err && verbose) printf("[mach64] Can't find chip\n"); - return err; -} - -static void reset_regs( void ) -{ - size_t i; - for(i=0;i<sizeof(vregs)/sizeof(video_registers_t);i++) - { - mach64_fifo_wait(2); - OUTREG(vregs[i].name,0); - } -} - -typedef struct saved_regs_s -{ - uint32_t overlay_video_key_clr; - uint32_t overlay_video_key_msk; - uint32_t overlay_graphics_key_clr; - uint32_t overlay_graphics_key_msk; - uint32_t overlay_key_cntl; - uint32_t bus_cntl; -}saved_regs_t; -static saved_regs_t savreg; - -static void save_regs( void ) -{ - mach64_fifo_wait(6); - savreg.overlay_video_key_clr = INREG(OVERLAY_VIDEO_KEY_CLR); - savreg.overlay_video_key_msk = INREG(OVERLAY_VIDEO_KEY_MSK); - savreg.overlay_graphics_key_clr = INREG(OVERLAY_GRAPHICS_KEY_CLR); - savreg.overlay_graphics_key_msk = INREG(OVERLAY_GRAPHICS_KEY_MSK); - savreg.overlay_key_cntl = INREG(OVERLAY_KEY_CNTL); - savreg.bus_cntl = INREG(BUS_CNTL); -} - -static void restore_regs( void ) -{ - mach64_fifo_wait(6); - OUTREG(OVERLAY_VIDEO_KEY_CLR,savreg.overlay_video_key_clr); - OUTREG(OVERLAY_VIDEO_KEY_MSK,savreg.overlay_video_key_msk); - OUTREG(OVERLAY_GRAPHICS_KEY_CLR,savreg.overlay_graphics_key_clr); - OUTREG(OVERLAY_GRAPHICS_KEY_MSK,savreg.overlay_graphics_key_msk); - OUTREG(OVERLAY_KEY_CNTL,savreg.overlay_key_cntl); - OUTREG(BUS_CNTL,savreg.bus_cntl|BUS_MASTER_DIS); -} - -static int forced_irq=INT_MAX; - -#ifdef MACH64_ENABLE_BM -static int can_use_irq=0; -static int irq_installed=0; - -static void init_irq(void) -{ - irq_installed=1; - if(forced_irq != INT_MAX) pci_info.irq=forced_irq; - if(hwirq_install(pci_info.bus,pci_info.card,pci_info.func, - 2,CRTC_INT_CNTL,CRTC_BUSMASTER_EOL_INT) == 0) - { - can_use_irq=1; - if(__verbose) printf("[mach64] Will use %u irq line\n",pci_info.irq); - } - else - if(__verbose) printf("[mach64] Can't initialize irq handling: %s\n" - "[mach64]irq_param: line=%u pin=%u gnt=%u lat=%u\n" - ,strerror(errno) - ,pci_info.irq,pci_info.ipin,pci_info.gnt,pci_info.lat); -} -#endif - -int VIDIX_NAME(vixInit)(const char *args) -{ - int err; -#ifdef MACH64_ENABLE_BM - unsigned i; -#endif - if(!probed) - { - printf("[mach64] Driver was not probed but is being initializing\n"); - return EINTR; - } - if(__verbose>0) printf("[mach64] version %d args='%s'\n", VIDIX_VERSION,args); - if(args) - if(strncmp(args,"irq=",4) == 0) - { - forced_irq=atoi(&args[4]); - if(__verbose>0) printf("[mach64] forcing IRQ to %u\n",forced_irq); - } - - if((mach64_mmio_base = map_phys_mem(pci_info.base2,0x4000))==(void *)-1) return ENOMEM; - mach64_wait_for_idle(); - mach64_ram_size = INREG(MEM_CNTL) & CTL_MEM_SIZEB; - if (mach64_ram_size < 8) mach64_ram_size = (mach64_ram_size + 1) * 512; - else if (mach64_ram_size < 12) mach64_ram_size = (mach64_ram_size - 3) * 1024; - else mach64_ram_size = (mach64_ram_size - 7) * 2048; - mach64_ram_size *= 0x400; /* KB -> bytes */ - if((mach64_mem_base = map_phys_mem(pci_info.base0,mach64_ram_size))==(void *)-1) return ENOMEM; - memset(&besr,0,sizeof(bes_registers_t)); - printf("[mach64] Video memory = %uMb\n",mach64_ram_size/0x100000); - err = mtrr_set_type(pci_info.base0,mach64_ram_size,MTRR_TYPE_WRCOMB); - if(!err) printf("[mach64] Set write-combining type of video memory\n"); - - save_regs(); - /* check if planar formats are supported */ - supports_planar=0; - mach64_wait_for_idle(); - mach64_fifo_wait(2); - if(INREG(SCALER_BUF0_OFFSET_U)) supports_planar=1; - else - { - OUTREG(SCALER_BUF0_OFFSET_U, -1); - - mach64_wait_vsync(); - mach64_wait_for_idle(); - mach64_fifo_wait(2); - - if(INREG(SCALER_BUF0_OFFSET_U)) supports_planar=1; - } - printf("[mach64] Planar YUV formats are %s supported\n",supports_planar?"":"not"); - supports_colour_adj=0; - OUTREG(SCALER_COLOUR_CNTL,-1); - if(INREG(SCALER_COLOUR_CNTL)) supports_colour_adj=1; - supports_idct=0; - OUTREG(IDCT_CONTROL,-1); - if(INREG(IDCT_CONTROL)) supports_idct=1; - OUTREG(IDCT_CONTROL,0); - printf("[mach64] IDCT is %s supported\n",supports_idct?"":"not"); - supports_subpic=0; - OUTREG(SUBPIC_CNTL,-1); - if(INREG(SUBPIC_CNTL)) supports_subpic=1; - OUTREG(SUBPIC_CNTL,0); - printf("[mach64] subpictures are %s supported\n",supports_subpic?"":"not"); - if( mach64_cap.device_id==DEVICE_ATI_RAGE_MOBILITY_P_M - || mach64_cap.device_id==DEVICE_ATI_RAGE_MOBILITY_P_M2 - || mach64_cap.device_id==DEVICE_ATI_RAGE_MOBILITY_L - || mach64_cap.device_id==DEVICE_ATI_RAGE_MOBILITY_L2) - supports_lcd_v_stretch=1; - else - supports_lcd_v_stretch=0; - - reset_regs(); - mach64_vid_make_default(); - if(__verbose > VERBOSE_LEVEL) mach64_vid_dump_regs(); -#ifdef MACH64_ENABLE_BM - if(!(INREG(BUS_CNTL) & BUS_MASTER_DIS)) - OUTREG(BUS_CNTL,INREG(BUS_CNTL)|BUS_MSTR_RESET); - if(bm_open() == 0) - { - mach64_cap.flags |= FLAG_DMA | FLAG_EQ_DMA; - if((dma_phys_addrs = malloc(mach64_ram_size*sizeof(unsigned long)/4096)) == 0) - { - out_mem: - printf("[mach64] Can't allocate temporary buffer for DMA\n"); - mach64_cap.flags &= ~FLAG_DMA & ~FLAG_EQ_DMA; - return 0; - } - /* - WARNING: We MUST have continigous descriptors!!! - But: (720*720*2(YUV422)*16(sizeof(bm_descriptor)))/4096=4050 - Thus one 4K page is far enough to describe max movie size. - */ - for(i=0;i<64;i++) - if((mach64_dma_desc_base[i] = memalign(4096,mach64_ram_size*sizeof(bm_list_descriptor)/4096)) == 0) - goto out_mem; -#if 0 - if(!is_agp) - { - long tst; - if(pci_config_read(pci_info.bus,pci_info.card,pci_info.func,4,4,&pci_command) == 0) - pci_config_write(pci_info.bus,pci_info.card,pci_info.func,4,4,pci_command|0x14); - pci_config_read(pci_info.bus,pci_info.card,pci_info.func,4,4,&tst); - } -#endif - } - else - if(__verbose) printf("[mach64] Can't initialize busmastering: %s\n",strerror(errno)); -#endif - return 0; -} - -void VIDIX_NAME(vixDestroy)(void) -{ -#ifdef MACH64_ENABLE_BM - unsigned i; -#endif - restore_regs(); -#ifdef MACH64_ENABLE_BM - mach64_engine_reset(); -#endif - unmap_phys_mem(mach64_mem_base,mach64_ram_size); - unmap_phys_mem(mach64_mmio_base,0x4000); -#ifdef MACH64_ENABLE_BM - bm_close(); - if(can_use_irq && irq_installed) hwirq_uninstall(pci_info.bus,pci_info.card,pci_info.func); - if(dma_phys_addrs) free(dma_phys_addrs); - for(i=0;i<64;i++) - { - if(mach64_dma_desc_base[i]) free(mach64_dma_desc_base[i]); - } -#endif -} - -int VIDIX_NAME(vixGetCapability)(vidix_capability_t *to) -{ - memcpy(to, &mach64_cap, sizeof(vidix_capability_t)); - return 0; -} - -static unsigned mach64_query_pitch(unsigned fourcc,const vidix_yuv_t *spitch) -{ - unsigned pitch,spy,spv,spu; - spy = spv = spu = 0; - switch(spitch->y) - { - case 16: - case 32: - case 64: - case 128: - case 256: spy = spitch->y; break; - default: break; - } - switch(spitch->u) - { - case 16: - case 32: - case 64: - case 128: - case 256: spu = spitch->u; break; - default: break; - } - switch(spitch->v) - { - case 16: - case 32: - case 64: - case 128: - case 256: spv = spitch->v; break; - default: break; - } - switch(fourcc) - { - /* 4:2:0 */ - case IMGFMT_IYUV: - case IMGFMT_YV12: - case IMGFMT_I420: - if(spy > 16 && spu == spy/2 && spv == spy/2) pitch = spy; - else pitch = 32; - break; - case IMGFMT_YVU9: - if(spy > 32 && spu == spy/4 && spv == spy/4) pitch = spy; - else pitch = 64; - break; - default: - if(spy >= 16) pitch = spy; - else pitch = 16; - break; - } - return pitch; -} - -static void mach64_compute_framesize(vidix_playback_t *info) -{ - unsigned pitch,awidth; - pitch = mach64_query_pitch(info->fourcc,&info->src.pitch); - switch(info->fourcc) - { - case IMGFMT_I420: - case IMGFMT_YV12: - case IMGFMT_IYUV: - awidth = (info->src.w + (pitch-1)) & ~(pitch-1); - info->frame_size = awidth*(info->src.h+info->src.h/2); - break; - case IMGFMT_YVU9: - awidth = (info->src.w + (pitch-1)) & ~(pitch-1); - info->frame_size = awidth*(info->src.h+info->src.h/8); - break; -// case IMGFMT_RGB32: - case IMGFMT_BGR32: - awidth = (info->src.w*4 + (pitch-1)) & ~(pitch-1); - info->frame_size = (awidth*info->src.h); - break; - /* YUY2 YVYU, RGB15, RGB16 */ - default: - awidth = (info->src.w*2 + (pitch-1)) & ~(pitch-1); - info->frame_size = (awidth*info->src.h); - break; - } - info->frame_size+=256; // so we have some space for alignment & such - info->frame_size&=~16; -} - -static void mach64_vid_stop_video( void ) -{ - mach64_fifo_wait(14); - OUTREG(OVERLAY_SCALE_CNTL, 0x80000000); - OUTREG(OVERLAY_EXCLUSIVE_HORZ, 0); - OUTREG(OVERLAY_EXCLUSIVE_VERT, 0); - OUTREG(SCALER_H_COEFF0, 0x00002000); - OUTREG(SCALER_H_COEFF1, 0x0D06200D); - OUTREG(SCALER_H_COEFF2, 0x0D0A1C0D); - OUTREG(SCALER_H_COEFF3, 0x0C0E1A0C); - OUTREG(SCALER_H_COEFF4, 0x0C14140C); - OUTREG(VIDEO_FORMAT, 0xB000B); - OUTREG(OVERLAY_TEST, 0x0); -} - -static void mach64_vid_display_video( void ) -{ - uint32_t vf,sc,width; - mach64_fifo_wait(14); - - OUTREG(OVERLAY_Y_X_START, besr.y_x_start); - OUTREG(OVERLAY_Y_X_END, besr.y_x_end); - OUTREG(OVERLAY_SCALE_INC, besr.scale_inc); - OUTREG(SCALER_BUF_PITCH, besr.vid_buf_pitch); - OUTREG(SCALER_HEIGHT_WIDTH, besr.height_width); - OUTREG(SCALER_BUF0_OFFSET, mach64_buffer_base[0][0]); - OUTREG(SCALER_BUF0_OFFSET_U, mach64_buffer_base[0][1]); - OUTREG(SCALER_BUF0_OFFSET_V, mach64_buffer_base[0][2]); - OUTREG(SCALER_BUF1_OFFSET, mach64_buffer_base[0][0]); - OUTREG(SCALER_BUF1_OFFSET_U, mach64_buffer_base[0][1]); - OUTREG(SCALER_BUF1_OFFSET_V, mach64_buffer_base[0][2]); - mach64_wait_vsync(); - width = (besr.height_width >> 16 & 0x03FF); - sc = SCALE_EN | OVERLAY_EN | - SCALE_BANDWIDTH | /* reset bandwidth status */ - SCALE_PIX_EXPAND | /* dynamic range correct */ - SCALE_Y2R_TEMP; /* use the equal temparature for every component of RGB */ - /* Force clocks of scaler. */ - if(width > 360 && !supports_planar && !mach64_is_interlace()) - sc |= SCALE_CLK_FORCE_ON; - /* Do we need that? And how we can improve the quality of 3dRageII scaler ? - 3dRageII+ (non pro) is really crapped HW :( - ^^^^^^^^^^^^^^^^^^^ - !!SCALER_WIDTH <= 360 provides full scaling functionality !!!!!!!!!!!!! - !!360 < SCALER_WIDTH <= 720 provides scaling with vertical replication (crap) - !!SCALER_WIDTH > 720 is illegal. (no comments) - - As for me - I would prefer to limit movie's width with 360 but it provides only - half of picture but with perfect quality. (NK) */ - mach64_fifo_wait(10); - OUTREG(OVERLAY_SCALE_CNTL, sc); - mach64_wait_for_idle(); - - switch(besr.fourcc) - { - /* BGR formats */ - case IMGFMT_BGR15: vf = SCALER_IN_RGB15; break; - case IMGFMT_BGR16: vf = SCALER_IN_RGB16; break; - case IMGFMT_BGR32: vf = SCALER_IN_RGB32; break; - /* 4:2:0 */ - case IMGFMT_IYUV: - case IMGFMT_I420: - case IMGFMT_YV12: vf = SCALER_IN_YUV12; break; - /* 4:1:0 */ - case IMGFMT_YVU9: vf = SCALER_IN_YUV9; break; - /* 4:2:2 */ - case IMGFMT_YVYU: - case IMGFMT_UYVY: vf = SCALER_IN_YVYU422; break; - case IMGFMT_YUY2: - default: vf = SCALER_IN_VYUY422; break; - } - OUTREG(VIDEO_FORMAT,vf); - if(__verbose > VERBOSE_LEVEL) mach64_vid_dump_regs(); -} - -/* Goal of this function: hide RGB background and provide black screen around movie. - Useful in '-vo fbdev:vidix -fs -zoom' mode. - Reverse effect to colorkey */ -static void mach64_vid_exclusive( void ) -{ - unsigned screenw,screenh; - screenw = mach64_get_xres(); - screenh = mach64_get_yres(); - OUTREG(OVERLAY_EXCLUSIVE_VERT,(((screenh-1)<<16)&EXCLUSIVE_VERT_END)); - OUTREG(OVERLAY_EXCLUSIVE_HORZ,(((screenw/8+1)<<8)&EXCLUSIVE_HORZ_END)|EXCLUSIVE_EN); -} - -static void mach64_vid_non_exclusive( void ) -{ - OUTREG(OVERLAY_EXCLUSIVE_HORZ,0); -} - -static int mach64_vid_init_video( vidix_playback_t *config ) -{ - uint32_t src_w,src_h,dest_w,dest_h,pitch,h_inc,v_inc,left,leftUV,top,ecp,y_pos; - int is_420,best_pitch,mpitch; - int src_offset_y, src_offset_u, src_offset_v; - unsigned int i; - - mach64_vid_stop_video(); -/* warning, if left or top are != 0 this will fail, as the framesize is too small then */ - left = config->src.x; - top = config->src.y; - src_h = config->src.h; - src_w = config->src.w; - is_420 = 0; - if(config->fourcc == IMGFMT_YV12 || - config->fourcc == IMGFMT_I420 || - config->fourcc == IMGFMT_IYUV) is_420 = 1; - best_pitch = mach64_query_pitch(config->fourcc,&config->src.pitch); - mpitch = best_pitch-1; - switch(config->fourcc) - { - case IMGFMT_YVU9: - /* 4:2:0 */ - case IMGFMT_IYUV: - case IMGFMT_YV12: - case IMGFMT_I420: pitch = (src_w + mpitch) & ~mpitch; - config->dest.pitch.y = - config->dest.pitch.u = - config->dest.pitch.v = best_pitch; - besr.vid_buf_pitch= pitch; - break; - /* RGB 4:4:4:4 */ - case IMGFMT_RGB32: - case IMGFMT_BGR32: pitch = (src_w*4 + mpitch) & ~mpitch; - config->dest.pitch.y = - config->dest.pitch.u = - config->dest.pitch.v = best_pitch; - besr.vid_buf_pitch= pitch>>2; - break; - /* 4:2:2 */ - default: /* RGB15, RGB16, YVYU, UYVY, YUY2 */ - pitch = ((src_w*2) + mpitch) & ~mpitch; - config->dest.pitch.y = - config->dest.pitch.u = - config->dest.pitch.v = best_pitch; - besr.vid_buf_pitch= pitch>>1; - break; - } - dest_w = config->dest.w; - dest_h = config->dest.h; - besr.fourcc = config->fourcc; - ecp = (INPLL(PLL_VCLK_CNTL) & PLL_ECP_DIV) >> 4; -#if 0 -{ -int i; -for(i=0; i<32; i++){ - printf("%X ", INPLL(i)); -} -} -#endif - if(__verbose>0) printf("[mach64] ecp: %d\n", ecp); - v_inc = src_h * mach64_get_vert_stretch(); - - if(mach64_is_interlace()) v_inc<<=1; - if(mach64_is_dbl_scan() ) v_inc>>=1; - v_inc/= dest_h; - v_inc>>=4; // convert 16.16 -> 4.12 - - h_inc = (src_w << (12+ecp)) / dest_w; - /* keep everything in 4.12 */ - config->offsets[0] = 0; - for(i=1; i<config->num_frames; i++) - config->offsets[i] = config->offsets[i-1] + config->frame_size; - - /*FIXME the left / top stuff is broken (= zoom a src rectangle from a larger one) - 1. the framesize isnt known as the outer src rectangle dimensions arent known - 2. the mach64 needs aligned addresses so it cant work anyway - -> so we could shift the outer buffer to compensate that but that would mean - alignment problems for the code which writes into it - */ - - if(is_420) - { - config->offset.y= 0; - config->offset.u= (pitch*src_h + 15)&~15; - config->offset.v= (config->offset.u + (pitch*src_h>>2) + 15)&~15; - - src_offset_y= config->offset.y + top*pitch + left; - src_offset_u= config->offset.u + (top*pitch>>2) + (left>>1); - src_offset_v= config->offset.v + (top*pitch>>2) + (left>>1); - - if(besr.fourcc == IMGFMT_I420 || besr.fourcc == IMGFMT_IYUV) - { - uint32_t tmp; - tmp = config->offset.u; - config->offset.u = config->offset.v; - config->offset.v = tmp; - src_offset_u=config->offset.u; - src_offset_v=config->offset.v; - } - } - else if(besr.fourcc == IMGFMT_YVU9) - { - config->offset.y= 0; - config->offset.u= (pitch*src_h + 15)&~15; - config->offset.v= (config->offset.u + (pitch*src_h>>4) + 15)&~15; - - src_offset_y= config->offset.y + top*pitch + left; - src_offset_u= config->offset.u + (top*pitch>>4) + (left>>1); - src_offset_v= config->offset.v + (top*pitch>>4) + (left>>1); - } - else if(besr.fourcc == IMGFMT_BGR32) - { - config->offset.y = config->offset.u = config->offset.v = 0; - src_offset_y= src_offset_u= src_offset_v= top*pitch + (left << 2); - } - else - { - config->offset.y = config->offset.u = config->offset.v = 0; - src_offset_y= src_offset_u= src_offset_v= top*pitch + (left << 1); - } - - num_mach64_buffers= config->num_frames; - for(i=0; i<config->num_frames; i++) - { - mach64_buffer_base[i][0]= (mach64_overlay_offset + config->offsets[i] + src_offset_y)&~15; - mach64_buffer_base[i][1]= (mach64_overlay_offset + config->offsets[i] + src_offset_u)&~15; - mach64_buffer_base[i][2]= (mach64_overlay_offset + config->offsets[i] + src_offset_v)&~15; - } - - leftUV = (left >> 17) & 15; - left = (left >> 16) & 15; - besr.scale_inc = ( h_inc << 16 ) | v_inc; - y_pos = config->dest.y; - if(mach64_is_dbl_scan()) y_pos*=2; - else - if(mach64_is_interlace()) y_pos/=2; - besr.y_x_start = y_pos | (config->dest.x << 16); - y_pos =config->dest.y + dest_h; - if(mach64_is_dbl_scan()) y_pos*=2; - else - if(mach64_is_interlace()) y_pos/=2; - besr.y_x_end = y_pos | ((config->dest.x + dest_w) << 16); - besr.height_width = ((src_w - left)<<16) | (src_h - top); - return 0; -} - -static int is_supported_fourcc(uint32_t fourcc) -{ - switch(fourcc) - { - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_YVU9: - case IMGFMT_IYUV: - return supports_planar; - case IMGFMT_YUY2: - case IMGFMT_UYVY: - case IMGFMT_BGR15: - case IMGFMT_BGR16: - case IMGFMT_BGR32: - return 1; - default: - return 0; - } -} - -int VIDIX_NAME(vixQueryFourcc)(vidix_fourcc_t *to) -{ - if(is_supported_fourcc(to->fourcc)) - { - to->depth = VID_DEPTH_1BPP | VID_DEPTH_2BPP | - VID_DEPTH_4BPP | VID_DEPTH_8BPP | - VID_DEPTH_12BPP| VID_DEPTH_15BPP| - VID_DEPTH_16BPP| VID_DEPTH_24BPP| - VID_DEPTH_32BPP; - to->flags = VID_CAP_EXPAND | VID_CAP_SHRINK | VID_CAP_COLORKEY; - return 0; - } - else to->depth = to->flags = 0; - return ENOSYS; -} - -int VIDIX_NAME(vixConfigPlayback)(vidix_playback_t *info) -{ - unsigned rgb_size,nfr; - uint32_t mach64_video_size; - if(!is_supported_fourcc(info->fourcc)) return ENOSYS; - if(info->src.h > 720 || info->src.w > 720) - { - printf("[mach64] Can't apply width or height > 720\n"); - return EINVAL; - } - if(info->num_frames>VID_PLAY_MAXFRAMES) info->num_frames=VID_PLAY_MAXFRAMES; - - mach64_compute_framesize(info); - rgb_size = mach64_get_xres()*mach64_get_yres()*((mach64_vid_get_dbpp()+7)/8); - nfr = info->num_frames; - mach64_video_size = mach64_ram_size; - for(;nfr>0;nfr--) - { - mach64_overlay_offset = mach64_video_size - info->frame_size*nfr; - mach64_overlay_offset &= 0xffff0000; - if(mach64_overlay_offset >= (int)rgb_size ) break; - } - if(nfr <= 3) - { - nfr = info->num_frames; - for(;nfr>0;nfr--) - { - mach64_overlay_offset = mach64_video_size - info->frame_size*nfr; - mach64_overlay_offset &= 0xffff0000; - if(mach64_overlay_offset>=0) break; - } - } - if(nfr <= 0) return EINVAL; - info->num_frames=nfr; - num_mach64_buffers = info->num_frames; - info->dga_addr = (char *)mach64_mem_base + mach64_overlay_offset; - mach64_vid_init_video(info); - return 0; -} - -int VIDIX_NAME(vixPlaybackOn)(void) -{ - int err; - unsigned dw,dh; - dw = (besr.y_x_end >> 16) - (besr.y_x_start >> 16); - dh = (besr.y_x_end & 0xFFFF) - (besr.y_x_start & 0xFFFF); - if(dw == mach64_get_xres() || dh == mach64_get_yres()) mach64_vid_exclusive(); - else mach64_vid_non_exclusive(); - mach64_vid_display_video(); - err = INREG(SCALER_BUF_PITCH) == besr.vid_buf_pitch ? 0 : EINTR; - if(err) - { - printf("[mach64] *** Internal fatal error ***: Detected pitch corruption\n" - "[mach64] Try decrease number of buffers\n"); - } - return err; -} - -int VIDIX_NAME(vixPlaybackOff)(void) -{ - mach64_vid_stop_video(); - return 0; -} - -int VIDIX_NAME(vixPlaybackFrameSelect)(unsigned int frame) -{ - uint32_t off[6]; - int i; - int last_frame= (frame-1+num_mach64_buffers) % num_mach64_buffers; - /* - buf3-5 always should point onto second buffer for better - deinterlacing and TV-in - */ - if(num_mach64_buffers==1) return 0; - for(i=0; i<3; i++) - { - off[i] = mach64_buffer_base[frame][i]; - off[i+3]= mach64_buffer_base[last_frame][i]; - } - if(__verbose > VERBOSE_LEVEL) printf("mach64_vid: flip_page = %u\n",frame); - -#if 0 // delay routine so the individual frames can be ssen better -{ -volatile int i=0; -for(i=0; i<10000000; i++); -} -#endif - - mach64_wait_for_idle(); - mach64_fifo_wait(7); - - OUTREG(SCALER_BUF0_OFFSET, off[0]); - OUTREG(SCALER_BUF0_OFFSET_U, off[1]); - OUTREG(SCALER_BUF0_OFFSET_V, off[2]); - OUTREG(SCALER_BUF1_OFFSET, off[3]); - OUTREG(SCALER_BUF1_OFFSET_U, off[4]); - OUTREG(SCALER_BUF1_OFFSET_V, off[5]); - if(num_mach64_buffers==2) mach64_wait_vsync(); //only wait for vsync if we do double buffering - - if(__verbose > VERBOSE_LEVEL) mach64_vid_dump_regs(); - return 0; -} - -vidix_video_eq_t equal = -{ - VEQ_CAP_BRIGHTNESS | VEQ_CAP_SATURATION - , - 0, 0, 0, 0, 0, 0, 0, 0 }; - -int VIDIX_NAME(vixPlaybackGetEq)( vidix_video_eq_t * eq) -{ - memcpy(eq,&equal,sizeof(vidix_video_eq_t)); - if(!supports_colour_adj) eq->cap = VEQ_CAP_BRIGHTNESS; - return 0; -} - -int VIDIX_NAME(vixPlaybackSetEq)( const vidix_video_eq_t * eq) -{ - int br,sat; - if(eq->cap & VEQ_CAP_BRIGHTNESS) equal.brightness = eq->brightness; - if(eq->cap & VEQ_CAP_CONTRAST) equal.contrast = eq->contrast; - if(eq->cap & VEQ_CAP_SATURATION) equal.saturation = eq->saturation; - if(eq->cap & VEQ_CAP_HUE) equal.hue = eq->hue; - if(eq->cap & VEQ_CAP_RGB_INTENSITY) - { - equal.red_intensity = eq->red_intensity; - equal.green_intensity = eq->green_intensity; - equal.blue_intensity = eq->blue_intensity; - } - if(supports_colour_adj) - { - equal.flags = eq->flags; - br = equal.brightness * 64 / 1000; - if(br < -64) br = -64; if(br > 63) br = 63; - sat = (equal.saturation + 1000) * 16 / 1000; - if(sat < 0) sat = 0; if(sat > 31) sat = 31; - OUTREG(SCALER_COLOUR_CNTL, (br & 0x7f) | (sat << 8) | (sat << 16)); - } - else - { - unsigned gamma; - br = equal.brightness * 3 / 1000; - if(br < 0) br = 0; - switch(br) - { - default:gamma = SCALE_GAMMA_SEL_BRIGHT; break; - case 1: gamma = SCALE_GAMMA_SEL_G14; break; - case 2: gamma = SCALE_GAMMA_SEL_G18; break; - case 3: gamma = SCALE_GAMMA_SEL_G22; break; - } - OUTREG(OVERLAY_SCALE_CNTL,(INREG(OVERLAY_SCALE_CNTL) & ~SCALE_GAMMA_SEL_MSK) | gamma); - } - return 0; -} - -int VIDIX_NAME(vixGetGrKeys)(vidix_grkey_t *grkey) -{ - memcpy(grkey, &mach64_grkey, sizeof(vidix_grkey_t)); - return(0); -} - -int VIDIX_NAME(vixSetGrKeys)(const vidix_grkey_t *grkey) -{ - memcpy(&mach64_grkey, grkey, sizeof(vidix_grkey_t)); - - if(mach64_grkey.ckey.op == CKEY_TRUE) - { - besr.ckey_on=1; - - switch(mach64_vid_get_dbpp()) - { - case 15: - besr.graphics_key_msk=0x7FFF; - besr.graphics_key_clr= - ((mach64_grkey.ckey.blue &0xF8)>>3) - | ((mach64_grkey.ckey.green&0xF8)<<2) - | ((mach64_grkey.ckey.red &0xF8)<<7); - break; - case 16: - besr.graphics_key_msk=0xFFFF; - besr.graphics_key_clr= - ((mach64_grkey.ckey.blue &0xF8)>>3) - | ((mach64_grkey.ckey.green&0xFC)<<3) - | ((mach64_grkey.ckey.red &0xF8)<<8); - break; - case 24: - besr.graphics_key_msk=0xFFFFFF; - besr.graphics_key_clr= - ((mach64_grkey.ckey.blue &0xFF)) - | ((mach64_grkey.ckey.green&0xFF)<<8) - | ((mach64_grkey.ckey.red &0xFF)<<16); - break; - case 32: - besr.graphics_key_msk=0xFFFFFF; - besr.graphics_key_clr= - ((mach64_grkey.ckey.blue &0xFF)) - | ((mach64_grkey.ckey.green&0xFF)<<8) - | ((mach64_grkey.ckey.red &0xFF)<<16); - break; - default: - besr.ckey_on=0; - besr.graphics_key_msk=0; - besr.graphics_key_clr=0; - } - } - else - { - besr.ckey_on=0; - besr.graphics_key_msk=0; - besr.graphics_key_clr=0; - } - - mach64_fifo_wait(4); - OUTREG(OVERLAY_GRAPHICS_KEY_MSK, besr.graphics_key_msk); - OUTREG(OVERLAY_GRAPHICS_KEY_CLR, besr.graphics_key_clr); -// OUTREG(OVERLAY_VIDEO_KEY_MSK, 0); -// OUTREG(OVERLAY_VIDEO_KEY_CLR, 0); - if(besr.ckey_on) - OUTREG(OVERLAY_KEY_CNTL,VIDEO_KEY_FN_TRUE|GRAPHIC_KEY_FN_EQ|CMP_MIX_AND); - else - OUTREG(OVERLAY_KEY_CNTL,VIDEO_KEY_FN_TRUE|GRAPHIC_KEY_FN_TRUE|CMP_MIX_AND); - - return(0); -} - -#ifdef MACH64_ENABLE_BM -static int mach64_setup_frame( vidix_dma_t * dmai ) -{ - if(mach64_overlay_offset + dmai->dest_offset + dmai->size > mach64_ram_size) return E2BIG; - if(dmai->idx > VID_PLAY_MAXFRAMES-1) dmai->idx=0; - if(!(dmai->internal[dmai->idx] && (dmai->flags & BM_DMA_FIXED_BUFFS))) - { - bm_list_descriptor * list = (bm_list_descriptor *)mach64_dma_desc_base[dmai->idx]; - unsigned long dest_ptr; - unsigned i,n,count; - int retval; - n = dmai->size / 4096; - if(dmai->size % 4096) n++; - if((retval = VIRT_TO_CARD(dmai->src,dmai->size,dma_phys_addrs)) != 0) return retval; - dmai->internal[dmai->idx] = mach64_dma_desc_base[dmai->idx]; - dest_ptr = dmai->dest_offset; - count = dmai->size; -#if 0 -printf("MACH64_DMA_REQUEST va=%X size=%X\n",dmai->src,dmai->size); -#endif - for(i=0;i<n;i++) - { - list[i].framebuf_offset = mach64_overlay_offset + dest_ptr; /* offset within of video memory */ - list[i].sys_addr = dma_phys_addrs[i]; - list[i].command = (count > 4096 ? 4096 : (count | DMA_GUI_COMMAND__EOL)); - list[i].reserved = 0; -#if 0 -printf("MACH64_DMA_TABLE[%i] fboff=%X pa=%X cmd=%X rsrvd=%X\n",i,list[i].framebuf_offset,list[i].sys_addr,list[i].command,list[i].reserved); -#endif - dest_ptr += 4096; - count -= 4096; - } - cpu_flush(list,4096); - } - return 0; -} - -static int mach64_transfer_frame( unsigned long ba_dma_desc,int sync_mode ) -{ - uint32_t crtc_int; - mach64_wait_for_idle(); - mach64_fifo_wait(4); - OUTREG(BUS_CNTL,(INREG(BUS_CNTL)|BUS_EXT_REG_EN)&(~BUS_MASTER_DIS)); - crtc_int = INREG(CRTC_INT_CNTL); - if(sync_mode && can_use_irq) OUTREG(CRTC_INT_CNTL,crtc_int|CRTC_BUSMASTER_EOL_INT|CRTC_BUSMASTER_EOL_INT_EN); - else OUTREG(CRTC_INT_CNTL,crtc_int|CRTC_BUSMASTER_EOL_INT); - OUTREG(BM_SYSTEM_TABLE,ba_dma_desc|SYSTEM_TRIGGER_SYSTEM_TO_VIDEO); - if(__verbose > VERBOSE_LEVEL) mach64_vid_dump_regs(); -#if 0 - mach64_fifo_wait(4); - mach64_fifo_wait(16); - printf("MACH64_DMA_DBG: bm_fb_off=%08X bm_sysmem_addr=%08X bm_cmd=%08X bm_status=%08X bm_agp_base=%08X bm_agp_cntl=%08X\n", - INREG(BM_FRAME_BUF_OFFSET), - INREG(BM_SYSTEM_MEM_ADDR), - INREG(BM_COMMAND), - INREG(BM_STATUS), - INREG(AGP_BASE), - INREG(AGP_CNTL)); -#endif - return 0; -} - -int VIDIX_NAME(vixQueryDMAStatus)( void ) -{ - int bm_off; - unsigned crtc_int_cntl; - mach64_wait_for_idle(); - mach64_fifo_wait(2); - crtc_int_cntl = INREG(CRTC_INT_CNTL); - bm_off = crtc_int_cntl & CRTC_BUSMASTER_EOL_INT; -// if(bm_off) OUTREG(CRTC_INT_CNTL,crtc_int_cntl | CRTC_BUSMASTER_EOL_INT); - return bm_off?0:1; -} - -int VIDIX_NAME(vixPlaybackCopyFrame)( vidix_dma_t * dmai ) -{ - int retval,sync_mode; - if(!(dmai->flags & BM_DMA_FIXED_BUFFS)) if(bm_lock_mem(dmai->src,dmai->size) != 0) return errno; - sync_mode = (dmai->flags & BM_DMA_SYNC) == BM_DMA_SYNC; - if(sync_mode) - { - if(!irq_installed) init_irq(); - /* burn CPU instead of PCI bus here */ - while(vixQueryDMAStatus()!=0){ - if(can_use_irq) hwirq_wait(pci_info.irq); - else usleep(0); /* ugly but may help */ - } - } - mach64_engine_reset(); - retval = mach64_setup_frame(dmai); - VIRT_TO_CARD(mach64_dma_desc_base[dmai->idx],1,&bus_addr_dma_desc); - if(retval == 0) retval = mach64_transfer_frame(bus_addr_dma_desc,sync_mode); - if(!(dmai->flags & BM_DMA_FIXED_BUFFS)) bm_unlock_mem(dmai->src,dmai->size); - return retval; -} -#endif diff --git a/src/video_out/vidix/drivers/mga_vid.c b/src/video_out/vidix/drivers/mga_vid.c deleted file mode 100644 index eed2b9e65..000000000 --- a/src/video_out/vidix/drivers/mga_vid.c +++ /dev/null @@ -1,1567 +0,0 @@ -/* - * Matrox MGA driver - * - * ported to VIDIX by Alex Beregszaszi - * - * YUY2 support (see config.format) added by A'rpi/ESP-team - * double buffering added by A'rpi/ESP-team - * - * Brightness/contrast support by Nick Kurshev/Dariush Pietrzak (eyck) and me - * - * Fixed Brightness/Contrast - * Rewrite or read/write kabi@users.sf.net - * - * TODO: - * * fix memory size detection (current reading pci userconfig isn't - * working as requested - returns the max avail. ram on arch?) - * * translate all non-english comments to english - */ - -/* - * Original copyright: - * - * mga_vid.c - * - * Copyright (C) 1999 Aaron Holtzman - * - * Module skeleton based on gutted agpgart module by Jeff Hartmann - * <slicer@ionet.net> - * - * Matrox MGA G200/G400 YUV Video Interface module Version 0.1.0 - * - * BES == Back End Scaler - * - * This software has been released under the terms of the GNU Public - * license. See http://www.gnu.org/copyleft/gpl.html for details. - */ - -//#define CRTC2 - -// Set this value, if autodetection fails! (video ram size in megabytes) -//#define MGA_MEMORY_SIZE 16 - -/* No irq support in userspace implemented yet, do not enable this! */ -/* disable irq */ -#undef MGA_ALLOW_IRQ - -#define MGA_VSYNC_POS 2 - -#undef MGA_PCICONFIG_MEMDETECT - -#define MGA_DEFAULT_FRAMES 64 - -#define BES - -#ifdef MGA_TV -#undef BES -#define CRTC2 -#endif - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <math.h> -#include <inttypes.h> - -#include "vidix.h" -#include "fourcc.h" -#include "libdha.h" -#include "pci_ids.h" -#include "pci_names.h" - -#if !defined(ENOTSUP) && defined(EOPNOTSUPP) -#define ENOTSUP EOPNOTSUPP -#endif - -#ifdef CRTC2 -#define VIDIX_STATIC mga_crtc2_ -#define MGA_MSG "[mga_crtc2]" -#else -#define VIDIX_STATIC mga_ -#define MGA_MSG "[mga]" -#endif - -/* from radeon_vid */ -#define GETREG(TYPE,PTR,OFFZ) (*((volatile TYPE*)((PTR)+(OFFZ)))) -#define SETREG(TYPE,PTR,OFFZ,VAL) (*((volatile TYPE*)((PTR)+(OFFZ))))=VAL - -#define readb(addr) GETREG(uint8_t,(uint32_t)(mga_mmio_base + addr),0) -#define writeb(addr, val) SETREG(uint8_t,(uint32_t)(mga_mmio_base + addr),0,val) -#define readl(addr) GETREG(uint32_t,(uint32_t)(mga_mmio_base + addr),0) -#define writel(addr, val) SETREG(uint32_t,(uint32_t)(mga_mmio_base + addr),0,val) - -static int mga_verbose = 0; - -/* for device detection */ -static int probed = 0; -static pciinfo_t pci_info; - -/* internal booleans */ -static int mga_vid_in_use = 0; -static int is_g400 = 0; -static int vid_src_ready = 0; -static int vid_overlay_on = 0; - -/* mapped physical addresses */ -static uint8_t *mga_mmio_base = 0; -static uint8_t* mga_mem_base = 0; - -static int mga_src_base = 0; /* YUV buffer position in video memory */ - -static uint32_t mga_ram_size = 0; /* how much megabytes videoram we have */ - -/* Graphic keys */ -static vidix_grkey_t mga_grkey; - -static int colkey_saved = 0; -static int colkey_on = 0; -static unsigned char colkey_color[4]; -static unsigned char colkey_mask[4]; - -/* for IRQ */ -static int mga_irq = -1; - -static int mga_next_frame = 0; - -static vidix_capability_t mga_cap = -{ -#ifdef CRTC2 - "Matrox MGA G200/G4x0/G5x0 YUV Video - with second-head support", -#else - "Matrox MGA G200/G4x0/G5x0 YUV Video", -#endif - "Aaron Holtzman, Arpad Gereoffy, Alex Beregszaszi, Nick Kurshev", - TYPE_OUTPUT, - { 0, 0, 0, 0 }, - 2048, - 2048, - 4, - 4, - -1, - FLAG_UPSCALER | FLAG_DOWNSCALER | FLAG_EQUALIZER, - VENDOR_MATROX, - -1, /* will be set in VIDIX_NAME(vixProbe) */ - { 0, 0, 0, 0} -}; - -/* MATROX BES registers */ -typedef struct bes_registers_s -{ - //BES Control - uint32_t besctl; - //BES Global control - uint32_t besglobctl; - //Luma control (brightness and contrast) - uint32_t beslumactl; - //Line pitch - uint32_t bespitch; - - //Buffer A-1 Chroma 3 plane org - uint32_t besa1c3org; - //Buffer A-1 Chroma org - uint32_t besa1corg; - //Buffer A-1 Luma org - uint32_t besa1org; - - //Buffer A-2 Chroma 3 plane org - uint32_t besa2c3org; - //Buffer A-2 Chroma org - uint32_t besa2corg; - //Buffer A-2 Luma org - uint32_t besa2org; - - //Buffer B-1 Chroma 3 plane org - uint32_t besb1c3org; - //Buffer B-1 Chroma org - uint32_t besb1corg; - //Buffer B-1 Luma org - uint32_t besb1org; - - //Buffer B-2 Chroma 3 plane org - uint32_t besb2c3org; - //Buffer B-2 Chroma org - uint32_t besb2corg; - //Buffer B-2 Luma org - uint32_t besb2org; - - //BES Horizontal coord - uint32_t beshcoord; - //BES Horizontal inverse scaling [5.14] - uint32_t beshiscal; - //BES Horizontal source start [10.14] (for scaling) - uint32_t beshsrcst; - //BES Horizontal source ending [10.14] (for scaling) - uint32_t beshsrcend; - //BES Horizontal source last - uint32_t beshsrclst; - - - //BES Vertical coord - uint32_t besvcoord; - //BES Vertical inverse scaling [5.14] - uint32_t besviscal; - //BES Field 1 vertical source last position - uint32_t besv1srclst; - //BES Field 1 weight start - uint32_t besv1wght; - //BES Field 2 vertical source last position - uint32_t besv2srclst; - //BES Field 2 weight start - uint32_t besv2wght; - -} bes_registers_t; -static bes_registers_t regs; - -#ifdef CRTC2 -typedef struct crtc2_registers_s -{ - uint32_t c2ctl; - uint32_t c2datactl; - uint32_t c2misc; - uint32_t c2hparam; - uint32_t c2hsync; - uint32_t c2offset; - uint32_t c2pl2startadd0; - uint32_t c2pl2startadd1; - uint32_t c2pl3startadd0; - uint32_t c2pl3startadd1; - uint32_t c2preload; - uint32_t c2spicstartadd0; - uint32_t c2spicstartadd1; - uint32_t c2startadd0; - uint32_t c2startadd1; - uint32_t c2subpiclut; - uint32_t c2vcount; - uint32_t c2vparam; - uint32_t c2vsync; -} crtc2_registers_t; -static crtc2_registers_t cregs; -static crtc2_registers_t cregs_save; -#endif - -//All register offsets are converted to word aligned offsets (32 bit) -//because we want all our register accesses to be 32 bits -#define VCOUNT 0x1e20 - -#define PALWTADD 0x3c00 // Index register for X_DATAREG port -#define X_DATAREG 0x3c0a - -#define XMULCTRL 0x19 -#define BPP_8 0x00 -#define BPP_15 0x01 -#define BPP_16 0x02 -#define BPP_24 0x03 -#define BPP_32_DIR 0x04 -#define BPP_32_PAL 0x07 - -#define XCOLMSK 0x40 -#define X_COLKEY 0x42 -#define XKEYOPMODE 0x51 -#define XCOLMSK0RED 0x52 -#define XCOLMSK0GREEN 0x53 -#define XCOLMSK0BLUE 0x54 -#define XCOLKEY0RED 0x55 -#define XCOLKEY0GREEN 0x56 -#define XCOLKEY0BLUE 0x57 - -#ifdef CRTC2 -/*CRTC2 registers*/ -#define XMISCCTRL 0x1e -#define C2CTL 0x3c10 -#define C2DATACTL 0x3c4c -#define C2MISC 0x3c44 -#define C2HPARAM 0x3c14 -#define C2HSYNC 0x3c18 -#define C2OFFSET 0x3c40 -#define C2PL2STARTADD0 0x3c30 // like BESA1CORG -#define C2PL2STARTADD1 0x3c34 // like BESA2CORG -#define C2PL3STARTADD0 0x3c38 // like BESA1C3ORG -#define C2PL3STARTADD1 0x3c3c // like BESA2C3ORG -#define C2PRELOAD 0x3c24 -#define C2SPICSTARTADD0 0x3c54 -#define C2SPICSTARTADD1 0x3c58 -#define C2STARTADD0 0x3c28 // like BESA1ORG -#define C2STARTADD1 0x3c2c // like BESA2ORG -#define C2SUBPICLUT 0x3c50 -#define C2VCOUNT 0x3c48 -#define C2VPARAM 0x3c1c -#define C2VSYNC 0x3c20 -#endif /* CRTC2 */ - -// Backend Scaler registers -#define BESCTL 0x3d20 -#define BESGLOBCTL 0x3dc0 -#define BESLUMACTL 0x3d40 -#define BESPITCH 0x3d24 - -#define BESA1C3ORG 0x3d60 -#define BESA1CORG 0x3d10 -#define BESA1ORG 0x3d00 - -#define BESA2C3ORG 0x3d64 -#define BESA2CORG 0x3d14 -#define BESA2ORG 0x3d04 - -#define BESB1C3ORG 0x3d68 -#define BESB1CORG 0x3d18 -#define BESB1ORG 0x3d08 - -#define BESB2C3ORG 0x3d6C -#define BESB2CORG 0x3d1C -#define BESB2ORG 0x3d0C - -#define BESHCOORD 0x3d28 -#define BESHISCAL 0x3d30 -#define BESHSRCEND 0x3d3C -#define BESHSRCLST 0x3d50 -#define BESHSRCST 0x3d38 -#define BESV1WGHT 0x3d48 -#define BESV2WGHT 0x3d4c -#define BESV1SRCLST 0x3d54 -#define BESV2SRCLST 0x3d58 -#define BESVISCAL 0x3d34 -#define BESVCOORD 0x3d2c -#define BESSTATUS 0x3dc4 - -#define CRTCX 0x1fd4 -#define CRTCD 0x1fd5 -#define IEN 0x1e1c -#define ICLEAR 0x1e18 -#define STATUS 0x1e14 -#define CRTCEXTX 0x1fde -#define CRTCEXTD 0x1fdf - - -#ifdef CRTC2 -static void crtc2_frame_sel(int frame) -{ - switch(frame) { - case 0: - cregs.c2pl2startadd0=regs.besa1corg; - cregs.c2pl3startadd0=regs.besa1c3org; - cregs.c2startadd0=regs.besa1org; - break; - case 1: - cregs.c2pl2startadd0=regs.besa2corg; - cregs.c2pl3startadd0=regs.besa2c3org; - cregs.c2startadd0=regs.besa2org; - break; - case 2: - cregs.c2pl2startadd0=regs.besb1corg; - cregs.c2pl3startadd0=regs.besb1c3org; - cregs.c2startadd0=regs.besb1org; - break; - case 3: - cregs.c2pl2startadd0=regs.besb2corg; - cregs.c2pl3startadd0=regs.besb2c3org; - cregs.c2startadd0=regs.besb2org; - break; - } - writel(C2STARTADD0, cregs.c2startadd0); - writel(C2PL2STARTADD0, cregs.c2pl2startadd0); - writel(C2PL3STARTADD0, cregs.c2pl3startadd0); -} -#endif - -int VIDIX_NAME(vixPlaybackFrameSelect)(unsigned int frame) -{ - mga_next_frame = frame; - if (mga_verbose>1) printf(MGA_MSG" frameselect: %d\n", mga_next_frame); -#if MGA_ALLOW_IRQ - if (mga_irq == -1) -#endif - { -#ifdef BES - //we don't need the vcount protection as we're only hitting - //one register (and it doesn't seem to be double buffered) - regs.besctl = (regs.besctl & ~0x07000000) + (mga_next_frame << 25); - writel(BESCTL, regs.besctl); - - // writel( regs.besglobctl + ((readl(VCOUNT)+2)<<16), - writel(BESGLOBCTL, regs.besglobctl + (MGA_VSYNC_POS<<16)); -#endif -#ifdef CRTC2 - crtc2_frame_sel(mga_next_frame); -#endif - } - - return(0); -} - - -static void mga_vid_write_regs(int restore) -{ -#ifdef BES - //Make sure internal registers don't get updated until we're done - writel(BESGLOBCTL, (readl(VCOUNT)-1)<<16); - - // color or coordinate keying - - if (restore && colkey_saved) - { - // restore it - colkey_saved = 0; - - // Set color key registers: - writeb(PALWTADD, XKEYOPMODE); - writeb(X_DATAREG, colkey_on); - - writeb(PALWTADD, XCOLKEY0RED); - writeb(X_DATAREG, colkey_color[0]); - writeb(PALWTADD, XCOLKEY0GREEN); - writeb(X_DATAREG, colkey_color[1]); - writeb(PALWTADD, XCOLKEY0BLUE); - writeb(X_DATAREG, colkey_color[2]); - writeb(PALWTADD, X_COLKEY); - writeb(X_DATAREG, colkey_color[3]); - - writeb(PALWTADD, XCOLMSK0RED); - writeb(X_DATAREG, colkey_mask[0]); - writeb(PALWTADD, XCOLMSK0GREEN); - writeb(X_DATAREG, colkey_mask[1]); - writeb(PALWTADD, XCOLMSK0BLUE); - writeb(X_DATAREG, colkey_mask[2]); - writeb(PALWTADD, XCOLMSK); - writeb(X_DATAREG, colkey_mask[3]); - - printf(MGA_MSG" Restored colorkey (ON: %d %02X:%02X:%02X)\n", - colkey_on,colkey_color[0],colkey_color[1],colkey_color[2]); - - } else if (!colkey_saved) { - // save it - colkey_saved=1; - // Get color key registers: - writeb(PALWTADD, XKEYOPMODE); - colkey_on = readb(X_DATAREG) & 1; - - writeb(PALWTADD, XCOLKEY0RED); - colkey_color[0]=(unsigned char)readb(X_DATAREG); - writeb(PALWTADD, XCOLKEY0GREEN); - colkey_color[1]=(unsigned char)readb(X_DATAREG); - writeb(PALWTADD, XCOLKEY0BLUE); - colkey_color[2]=(unsigned char)readb(X_DATAREG); - writeb(PALWTADD, X_COLKEY); - colkey_color[3]=(unsigned char)readb(X_DATAREG); - - writeb(PALWTADD, XCOLMSK0RED); - colkey_mask[0]=(unsigned char)readb(X_DATAREG); - writeb(PALWTADD, XCOLMSK0GREEN); - colkey_mask[1]=(unsigned char)readb(X_DATAREG); - writeb(PALWTADD, XCOLMSK0BLUE); - colkey_mask[2]=(unsigned char)readb(X_DATAREG); - writeb(PALWTADD, XCOLMSK); - colkey_mask[3]=(unsigned char)readb(X_DATAREG); - - printf(MGA_MSG" Saved colorkey (ON: %d %02X:%02X:%02X)\n", - colkey_on,colkey_color[0],colkey_color[1],colkey_color[2]); - } - - if (!restore) - { - writeb(PALWTADD, XKEYOPMODE); - writeb(X_DATAREG, (mga_grkey.ckey.op == CKEY_TRUE)); - if ( mga_grkey.ckey.op == CKEY_TRUE ) - { - uint32_t r=0, g=0, b=0; - - writeb(PALWTADD, XMULCTRL); - switch (readb(X_DATAREG)) - { - case BPP_8: - /* Need to look up the color index, just using - color 0 for now. */ - break; - case BPP_15: - r = mga_grkey.ckey.red >> 3; - g = mga_grkey.ckey.green >> 3; - b = mga_grkey.ckey.blue >> 3; - break; - case BPP_16: - r = mga_grkey.ckey.red >> 3; - g = mga_grkey.ckey.green >> 2; - b = mga_grkey.ckey.blue >> 3; - break; - case BPP_24: - case BPP_32_DIR: - case BPP_32_PAL: - r = mga_grkey.ckey.red; - g = mga_grkey.ckey.green; - b = mga_grkey.ckey.blue; - break; - } - - // Disable color keying on alpha channel - writeb(PALWTADD, XCOLMSK); - writeb(X_DATAREG, 0x00); - writeb(PALWTADD, X_COLKEY); - writeb(X_DATAREG, 0x00); - - - // Set up color key registers - writeb(PALWTADD, XCOLKEY0RED); - writeb(X_DATAREG, r); - writeb(PALWTADD, XCOLKEY0GREEN); - writeb(X_DATAREG, g); - writeb(PALWTADD, XCOLKEY0BLUE); - writeb(X_DATAREG, b); - - // Set up color key mask registers - writeb(PALWTADD, XCOLMSK0RED); - writeb(X_DATAREG, 0xff); - writeb(PALWTADD, XCOLMSK0GREEN); - writeb(X_DATAREG, 0xff); - writeb(PALWTADD, XCOLMSK0BLUE); - writeb(X_DATAREG, 0xff); - } - } - - // Backend Scaler - writel(BESCTL, regs.besctl); - if (is_g400) - writel(BESLUMACTL, regs.beslumactl); - writel(BESPITCH, regs.bespitch); - - writel(BESA1ORG, regs.besa1org); - writel(BESA1CORG, regs.besa1corg); - writel(BESA2ORG, regs.besa2org); - writel(BESA2CORG, regs.besa2corg); - writel(BESB1ORG, regs.besb1org); - writel(BESB1CORG, regs.besb1corg); - writel(BESB2ORG, regs.besb2org); - writel(BESB2CORG, regs.besb2corg); - if(is_g400) - { - writel(BESA1C3ORG, regs.besa1c3org); - writel(BESA2C3ORG, regs.besa2c3org); - writel(BESB1C3ORG, regs.besb1c3org); - writel(BESB2C3ORG, regs.besb2c3org); - } - - writel(BESHCOORD, regs.beshcoord); - writel(BESHISCAL, regs.beshiscal); - writel(BESHSRCST, regs.beshsrcst); - writel(BESHSRCEND, regs.beshsrcend); - writel(BESHSRCLST, regs.beshsrclst); - - writel(BESVCOORD, regs.besvcoord); - writel(BESVISCAL, regs.besviscal); - - writel(BESV1SRCLST, regs.besv1srclst); - writel(BESV1WGHT, regs.besv1wght); - writel(BESV2SRCLST, regs.besv2srclst); - writel(BESV2WGHT, regs.besv2wght); - - //update the registers somewhere between 1 and 2 frames from now. - writel(BESGLOBCTL, regs.besglobctl + ((readl(VCOUNT)+2)<<16)); - - if (mga_verbose > 1) - { - printf(MGA_MSG" wrote BES registers\n"); - printf(MGA_MSG" BESCTL = 0x%08x\n", readl(BESCTL)); - printf(MGA_MSG" BESGLOBCTL = 0x%08x\n", readl(BESGLOBCTL)); - printf(MGA_MSG" BESSTATUS= 0x%08x\n", readl(BESSTATUS)); - } -#endif - -#ifdef CRTC2 -#if 0 - if (cregs_save.c2ctl == 0) - { - //int i; - cregs_save.c2ctl = readl(C2CTL); - cregs_save.c2datactl = readl(C2DATACTL); - cregs_save.c2misc = readl(C2MISC); - - //for (i = 0; i <= 8; i++) { writeb(CRTCEXTX, i); printf("CRTCEXT%d %x\n", i, readb(CRTCEXTD)); } - //printf("c2ctl:0x%08x c2datactl:0x%08x\n", cregs_save.c2ctl, cregs_save.c2datactl); - //printf("c2misc:0x%08x\n", readl(C2MISC)); - //printf("c2ctl:0x%08x c2datactl:0x%08x\n", cregs.c2ctl, cregs.c2datactl); - } - if (restore) - { - writel(C2CTL, cregs_save.c2ctl); - writel(C2DATACTL, cregs_save.c2datactl); - writel(C2MISC, cregs_save.c2misc); - return; - } -#endif - // writel(C2CTL, cregs.c2ctl); - - writel(C2CTL, ((readl(C2CTL) & ~0x03e00000) + (cregs.c2ctl & 0x03e00000))); - writel(C2DATACTL, ((readl(C2DATACTL) & ~0x000000ff) + (cregs.c2datactl & 0x000000ff))); - // ctrc2 - // disable CRTC2 acording to specs - // writel(C2CTL, cregs.c2ctl & 0xfffffff0); - // je to treba ??? - // writeb(XMISCCTRL, (readb(XMISCCTRL) & 0x19) | 0xa2); // MAFC - mfcsel & vdoutsel - // writeb(XMISCCTRL, (readb(XMISCCTRL) & 0x19) | 0x92); - // writeb(XMISCCTRL, (readb(XMISCCTRL) & ~0xe9) + 0xa2); - writel(C2DATACTL, cregs.c2datactl); -// writel(C2HPARAM, cregs.c2hparam); - writel(C2HSYNC, cregs.c2hsync); -// writel(C2VPARAM, cregs.c2vparam); - writel(C2VSYNC, cregs.c2vsync); - //xx - //writel(C2MISC, cregs.c2misc); - - if (mga_verbose > 1) printf(MGA_MSG" c2offset = %d\n", cregs.c2offset); - - writel(C2OFFSET, cregs.c2offset); - writel(C2STARTADD0, cregs.c2startadd0); - // writel(C2STARTADD1, cregs.c2startadd1); - writel(C2PL2STARTADD0, cregs.c2pl2startadd0); - // writel(C2PL2STARTADD1, cregs.c2pl2startadd1); - writel(C2PL3STARTADD0, cregs.c2pl3startadd0); - // writel(C2PL3STARTADD1, cregs.c2pl3startadd1); - writel(C2SPICSTARTADD0, cregs.c2spicstartadd0); - - //xx - //writel(C2SPICSTARTADD1, cregs.c2spicstartadd1); - - //set Color Lookup Table for Subpicture Layer - { - unsigned char r, g, b, y, cb, cr; - int i; - for (i = 0; i < 16; i++) { - - r = (i & 0x8) ? 0xff : 0x00; - g = (i & 0x4) ? ((i & 0x2) ? 0xff : 0xaa) : ((i & 0x2) ? 0x55 : 0x00); - b = (i & 0x1) ? 0xff : 0x00; - - y = ((r * 16829 + g * 33039 + b * 6416 + 0x8000) >> 16) + 16; - cb = ((r * -9714 + g * -19071 + b * 28784 + 0x8000) >> 16) + 128; - cr = ((r * 28784 + g * -24103 + b * -4681 + 0x8000) >> 16) + 128; - - cregs.c2subpiclut = (cr << 24) | (cb << 16) | (y << 8) | i; - writel(C2SUBPICLUT, cregs.c2subpiclut); - } - } - - //writel(C2PRELOAD, cregs.c2preload); - - // finaly enable everything -// writel(C2CTL, cregs.c2ctl); - // printf("c2ctl:0x%08x c2datactl:0x%08x\n",readl(C2CTL), readl(C2DATACTL)); - // printf("c2misc:0x%08x\n", readl(C2MISC)); -#endif -} - -#ifdef MGA_ALLOW_IRQ -static void enable_irq() -{ - long int cc; - - cc = readl(IEN); - // printf("*** !!! IRQREG = %d\n", (int)(cc&0xff)); - - writeb(CRTCX, 0x11); - - writeb(CRTCD, 0x20); /* clear 0, enable off */ - writeb(CRTCD, 0x00); /* enable on */ - writeb(CRTCD, 0x10); /* clear = 1 */ - - writel(BESGLOBCTL, regs.besglobctl); - - return; -} - -static void disable_irq() -{ - writeb(CRTCX, 0x11); - writeb(CRTCD, 0x20); /* clear 0, enable off */ - - return; -} - -void mga_handle_irq(int irq, void *dev_id/*, struct pt_regs *pregs*/) { - // static int frame=0; - // static int counter=0; - long int cc; - // if ( ! mga_enabled_flag ) return; - - // printf("vcount = %d\n",readl(VCOUNT)); - - //printf("mga_interrupt #%d\n", irq); - - if ( irq != -1 ) { - - cc = readl(STATUS); - if ( ! (cc & 0x10) ) return; /* vsyncpen */ - // debug_irqcnt++; - } - - // if ( debug_irqignore ) { - // debug_irqignore = 0; - - /* - if ( mga_conf_deinterlace ) { - if ( mga_first_field ) { - // printf("mga_interrupt first field\n"); - if ( syncfb_interrupt() ) - mga_first_field = 0; - } else { - // printf("mga_interrupt second field\n"); - mga_select_buffer( mga_current_field | 2 ); - mga_first_field = 1; - } - } else { - syncfb_interrupt(); - } - */ - - // frame=(frame+1)&1; - regs.besctl = (regs.besctl & ~0x07000000) + (mga_next_frame << 25); - writel(BESCTL, regs.besctl); - -#ifdef CRTC2 - crtc2_frame_sel(mga_next_frame); -#endif - -#if 0 - ++counter; - if(!(counter&63)){ - printf("mga irq counter = %d\n",counter); - } -#endif - - // } else { - // debug_irqignore = 1; - // } - - if ( irq != -1 ) { - writeb(CRTCX, 0x11); - writeb(CRTCD, 0); - writeb(CRTCD, 0x10); - } - - //writel(BESGLOBCTL, regs.besglobctl); - -} -#endif /* MGA_ALLOW_IRQ */ - -int VIDIX_NAME(vixConfigPlayback)(vidix_playback_t *config) -{ - unsigned int i; - int x, y, sw, sh, dw, dh; - int besleft, bestop, ifactor, ofsleft, ofstop, baseadrofs, weight, weights; -#ifdef CRTC2 -#define right_margin 0 -#define left_margin 18 -#define hsync_len 46 -#define lower_margin 10 -#define vsync_len 4 -#define upper_margin 39 - - unsigned int hdispend = (config->src.w + 31) & ~31; - unsigned int hsyncstart = hdispend + (right_margin & ~7); - unsigned int hsyncend = hsyncstart + (hsync_len & ~7); - unsigned int htotal = hsyncend + (left_margin & ~7); - unsigned int vdispend = config->src.h; - unsigned int vsyncstart = vdispend + lower_margin; - unsigned int vsyncend = vsyncstart + vsync_len; - unsigned int vtotal = vsyncend + upper_margin; -#endif - - if ((config->num_frames < 1) || (config->num_frames > MGA_DEFAULT_FRAMES)) - { - printf(MGA_MSG" illegal num_frames: %d, setting to %d\n", - config->num_frames, MGA_DEFAULT_FRAMES); - config->num_frames = MGA_DEFAULT_FRAMES; - } - for(;config->num_frames>0;config->num_frames--) - { - /*FIXME: this driver can use more frames but we need to apply - some tricks to avoid RGB-memory hits*/ - mga_src_base = ((mga_ram_size/2)*0x100000-(config->num_frames+1)*config->frame_size); - mga_src_base &= (~0xFFFF); /* 64k boundary */ - if(mga_src_base>=0) break; - } - if (mga_verbose > 1) printf(MGA_MSG" YUV buffer base: 0x%x\n", mga_src_base); - - config->dga_addr = mga_mem_base + mga_src_base; - - x = config->dest.x; - y = config->dest.y; - sw = config->src.w; - sh = config->src.h; - dw = config->dest.w; - dh = config->dest.h; - - if (mga_verbose) printf(MGA_MSG" Setting up a %dx%d-%dx%d video window (src %dx%d) format %X\n", - dw, dh, x, y, sw, sh, config->fourcc); - - if ((sw < 4) || (sh < 4) || (dw < 4) || (dh < 4)) - { - printf(MGA_MSG" Invalid src/dest dimensions\n"); - return(EINVAL); - } - - //FIXME check that window is valid and inside desktop - - // printf(MGA_MSG" vcount = %d\n", readl(VCOUNT)); - - sw += sw & 1; - switch(config->fourcc) - { - case IMGFMT_I420: - case IMGFMT_IYUV: - case IMGFMT_YV12: - sh+=sh&1; - config->dest.pitch.y=config->dest.pitch.u=config->dest.pitch.v=32; - config->frame_size = ((sw + 31) & ~31) * sh + (((sw + 31) & ~31) * sh) / 2; - break; - case IMGFMT_YUY2: - case IMGFMT_UYVY: - config->dest.pitch.y=16; - config->dest.pitch.u=config->dest.pitch.v=0; - config->frame_size = ((sw + 8) & ~8) * sh * 2; - break; - default: - printf(MGA_MSG" Unsupported pixel format: %x\n", config->fourcc); - return(ENOTSUP); - } - - config->offsets[0] = 0; - // config->offsets[1] = config->frame_size; - // config->offsets[2] = 2*config->frame_size; - // config->offsets[3] = 3*config->frame_size; - for (i = 1; i < config->num_frames+2; i++) - config->offsets[i] = i*config->frame_size; - - config->offset.y=0; - config->offset.v=((sw + 31) & ~31) * sh; - config->offset.u=config->offset.v+((sw + 31) & ~31) * sh /4; - - //FIXME figure out a better way to allocate memory on card - //allocate 2 megs - //mga_src_base = mga_mem_base + (MGA_VIDMEM_SIZE-2) * 0x100000; - //mga_src_base = (MGA_VIDMEM_SIZE-3) * 0x100000; - - - /* for G200 set Interleaved UV planes */ - if (!is_g400) - config->flags = VID_PLAY_INTERLEAVED_UV | INTERLEAVING_UV; - - //Setup the BES registers for a three plane 4:2:0 video source - - regs.besglobctl = 0; - - switch(config->fourcc) - { - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - regs.besctl = 1 // BES enabled - + (0<<6) // even start polarity - + (1<<10) // x filtering enabled - + (1<<11) // y filtering enabled - + (1<<16) // chroma upsampling - + (1<<17) // 4:2:0 mode - + (1<<18); // dither enabled -#if 0 - if(is_g400) - { - //zoom disabled, zoom filter disabled, 420 3 plane format, proc amp - //disabled, rgb mode disabled - regs.besglobctl = (1<<5); - } - else - { - //zoom disabled, zoom filter disabled, Cb samples in 0246, Cr - //in 1357, BES register update on besvcnt - regs.besglobctl = 0; - } -#endif - break; - - case IMGFMT_YUY2: - regs.besctl = 1 // BES enabled - + (0<<6) // even start polarity - + (1<<10) // x filtering enabled - + (1<<11) // y filtering enabled - + (1<<16) // chroma upsampling - + (0<<17) // 4:2:2 mode - + (1<<18); // dither enabled - - regs.besglobctl = 0; // YUY2 format selected - break; - - case IMGFMT_UYVY: - regs.besctl = 1 // BES enabled - + (0<<6) // even start polarity - + (1<<10) // x filtering enabled - + (1<<11) // y filtering enabled - + (1<<16) // chroma upsampling - + (0<<17) // 4:2:2 mode - + (1<<18); // dither enabled - - regs.besglobctl = 1<<6; // UYVY format selected - break; - - } - - //Disable contrast and brightness control - regs.besglobctl |= (1<<5) + (1<<7); - // we want to preserver these across restarts - //regs.beslumactl = (0x0 << 16) + 0x80; - - //Setup destination window boundaries - besleft = x > 0 ? x : 0; - bestop = y > 0 ? y : 0; - regs.beshcoord = (besleft<<16) + (x + dw-1); - regs.besvcoord = (bestop<<16) + (y + dh-1); - - //Setup source dimensions - regs.beshsrclst = (sw - 1) << 16; - switch(config->fourcc) - { - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - regs.bespitch = (sw + 31) & ~31; - break; - case IMGFMT_YUY2: - case IMGFMT_UYVY: - regs.bespitch = (sw + 8) & ~8; - break; - } - - //Setup horizontal scaling - ifactor = ((sw-1)<<14)/(dw-1); - ofsleft = besleft - x; - - regs.beshiscal = ifactor<<2; - regs.beshsrcst = (ofsleft*ifactor)<<2; - regs.beshsrcend = regs.beshsrcst + (((dw - ofsleft - 1) * ifactor) << 2); - - //Setup vertical scaling - ifactor = ((sh-1)<<14)/(dh-1); - ofstop = bestop - y; - - regs.besviscal = ifactor<<2; - - baseadrofs = ((ofstop*regs.besviscal)>>16)*regs.bespitch; - //frame_size = ((sw + 31) & ~31) * sh + (((sw + 31) & ~31) * sh) / 2; - regs.besa1org = (uint32_t) mga_src_base + baseadrofs; - regs.besa2org = (uint32_t) mga_src_base + baseadrofs + 1*config->frame_size; - regs.besb1org = (uint32_t) mga_src_base + baseadrofs + 2*config->frame_size; - regs.besb2org = (uint32_t) mga_src_base + baseadrofs + 3*config->frame_size; - - if (config->fourcc == IMGFMT_YV12 - || config->fourcc == IMGFMT_IYUV - || config->fourcc == IMGFMT_I420) - { - // planar YUV frames: - if (is_g400) - baseadrofs = (((ofstop*regs.besviscal)/4)>>16)*regs.bespitch; - else - baseadrofs = (((ofstop*regs.besviscal)/2)>>16)*regs.bespitch; - - if (config->fourcc == IMGFMT_YV12){ - regs.besa1corg = (uint32_t) mga_src_base + baseadrofs + regs.bespitch * sh ; - regs.besa2corg = (uint32_t) mga_src_base + baseadrofs + 1*config->frame_size + regs.bespitch * sh; - regs.besb1corg = (uint32_t) mga_src_base + baseadrofs + 2*config->frame_size + regs.bespitch * sh; - regs.besb2corg = (uint32_t) mga_src_base + baseadrofs + 3*config->frame_size + regs.bespitch * sh; - regs.besa1c3org = regs.besa1corg + ((regs.bespitch * sh) / 4); - regs.besa2c3org = regs.besa2corg + ((regs.bespitch * sh) / 4); - regs.besb1c3org = regs.besb1corg + ((regs.bespitch * sh) / 4); - regs.besb2c3org = regs.besb2corg + ((regs.bespitch * sh) / 4); - } else { - regs.besa1c3org = (uint32_t) mga_src_base + baseadrofs + regs.bespitch * sh ; - regs.besa2c3org = (uint32_t) mga_src_base + baseadrofs + 1*config->frame_size + regs.bespitch * sh; - regs.besb1c3org = (uint32_t) mga_src_base + baseadrofs + 2*config->frame_size + regs.bespitch * sh; - regs.besb2c3org = (uint32_t) mga_src_base + baseadrofs + 3*config->frame_size + regs.bespitch * sh; - regs.besa1corg = regs.besa1c3org + ((regs.bespitch * sh) / 4); - regs.besa2corg = regs.besa2c3org + ((regs.bespitch * sh) / 4); - regs.besb1corg = regs.besb1c3org + ((regs.bespitch * sh) / 4); - regs.besb2corg = regs.besb2c3org + ((regs.bespitch * sh) / 4); - } - } - - weight = ofstop * (regs.besviscal >> 2); - weights = weight < 0 ? 1 : 0; - regs.besv2wght = regs.besv1wght = (weights << 16) + ((weight & 0x3FFF) << 2); - regs.besv2srclst = regs.besv1srclst = sh - 1 - (((ofstop * regs.besviscal) >> 16) & 0x03FF); - -#ifdef CRTC2 - // pridat hlavni registry - tj. casovani ... - - - switch(config->fourcc){ - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - cregs.c2ctl = 1 // CRTC2 enabled - + (1<<1) // external clock - + (0<<2) // external clock - + (1<<3) // pixel clock enable - not needed ??? - + (0<<4) // high priority req - + (1<<5) // high priority req - + (0<<6) // high priority req - + (1<<8) // high priority req max - + (0<<9) // high priority req max - + (0<<10) // high priority req max - + (0<<20) // CRTC1 to DAC - + (1<<21) // 420 mode - + (1<<22) // 420 mode - + (1<<23) // 420 mode - + (0<<24) // single chroma line for 420 mode - need to be corrected - + (0<<25) /*/ interlace mode - need to be corrected*/ - + (0<<26) // field legth polariry - + (0<<27) // field identification polariry - + (1<<28) // VIDRST detection mode - + (0<<29) // VIDRST detection mode - + (1<<30) // Horizontal counter preload - + (1<<31) // Vertical counter preload - ; - cregs.c2datactl = 1 // disable dither - propably not needed, we are already in YUV mode - + (1<<1) // Y filter enable - + (1<<2) // CbCr filter enable - + (1<<3) // subpicture enable (enabled) - + (0<<4) // NTSC enable (disabled - PAL) - + (0<<5) // C2 static subpicture enable (disabled) - + (0<<6) // C2 subpicture offset division (disabled) - + (0<<7) // 422 subformat selection ! - /* + (0<<8) // 15 bpp high alpha - + (0<<9) // 15 bpp high alpha - + (0<<10) // 15 bpp high alpha - + (0<<11) // 15 bpp high alpha - + (0<<12) // 15 bpp high alpha - + (0<<13) // 15 bpp high alpha - + (0<<14) // 15 bpp high alpha - + (0<<15) // 15 bpp high alpha - + (0<<16) // 15 bpp low alpha - + (0<<17) // 15 bpp low alpha - + (0<<18) // 15 bpp low alpha - + (0<<19) // 15 bpp low alpha - + (0<<20) // 15 bpp low alpha - + (0<<21) // 15 bpp low alpha - + (0<<22) // 15 bpp low alpha - + (0<<23) // 15 bpp low alpha - + (0<<24) // static subpicture key - + (0<<25) // static subpicture key - + (0<<26) // static subpicture key - + (0<<27) // static subpicture key - + (0<<28) // static subpicture key - */ ; - break; - - case IMGFMT_YUY2: - cregs.c2ctl = 1 // CRTC2 enabled - + (1<<1) // external clock - + (0<<2) // external clock - + (1<<3) // pixel clock enable - not needed ??? - + (0<<4) // high priority req - acc to spec - + (1<<5) // high priority req - + (0<<6) // high priority req - // 7 reserved - + (1<<8) // high priority req max - + (0<<9) // high priority req max - + (0<<10) // high priority req max - // 11-19 reserved - + (0<<20) // CRTC1 to DAC - + (1<<21) // 422 mode - + (0<<22) // 422 mode - + (1<<23) // 422 mode - + (0<<24) // single chroma line for 420 mode - need to be corrected - + (0<<25) /*/ interlace mode - need to be corrected*/ - + (0<<26) // field legth polariry - + (0<<27) // field identification polariry - + (1<<28) // VIDRST detection mode - + (0<<29) // VIDRST detection mode - + (1<<30) // Horizontal counter preload - + (1<<31) // Vertical counter preload - ; - cregs.c2datactl = 1 // disable dither - propably not needed, we are already in YUV mode - + (1<<1) // Y filter enable - + (1<<2) // CbCr filter enable - + (1<<3) // subpicture enable (enabled) - + (0<<4) // NTSC enable (disabled - PAL) - + (0<<5) // C2 static subpicture enable (disabled) - + (0<<6) // C2 subpicture offset division (disabled) - + (0<<7) // 422 subformat selection ! - /* + (0<<8) // 15 bpp high alpha - + (0<<9) // 15 bpp high alpha - + (0<<10) // 15 bpp high alpha - + (0<<11) // 15 bpp high alpha - + (0<<12) // 15 bpp high alpha - + (0<<13) // 15 bpp high alpha - + (0<<14) // 15 bpp high alpha - + (0<<15) // 15 bpp high alpha - + (0<<16) // 15 bpp low alpha - + (0<<17) // 15 bpp low alpha - + (0<<18) // 15 bpp low alpha - + (0<<19) // 15 bpp low alpha - + (0<<20) // 15 bpp low alpha - + (0<<21) // 15 bpp low alpha - + (0<<22) // 15 bpp low alpha - + (0<<23) // 15 bpp low alpha - + (0<<24) // static subpicture key - + (0<<25) // static subpicture key - + (0<<26) // static subpicture key - + (0<<27) // static subpicture key - + (0<<28) // static subpicture key - */ ; - break; - - case IMGFMT_UYVY: - cregs.c2ctl = 1 // CRTC2 enabled - + (1<<1) // external clock - + (0<<2) // external clock - + (1<<3) // pixel clock enable - not needed ??? - + (0<<4) // high priority req - + (1<<5) // high priority req - + (0<<6) // high priority req - + (1<<8) // high priority req max - + (0<<9) // high priority req max - + (0<<10) // high priority req max - + (0<<20) // CRTC1 to DAC - + (1<<21) // 422 mode - + (0<<22) // 422 mode - + (1<<23) // 422 mode - + (1<<24) // single chroma line for 420 mode - need to be corrected - + (1<<25) /*/ interlace mode - need to be corrected*/ - + (0<<26) // field legth polariry - + (0<<27) // field identification polariry - + (1<<28) // VIDRST detection mode - + (0<<29) // VIDRST detection mode - + (1<<30) // Horizontal counter preload - + (1<<31) // Vertical counter preload - ; - cregs.c2datactl = 0 // enable dither - propably not needed, we are already in YUV mode - + (1<<1) // Y filter enable - + (1<<2) // CbCr filter enable - + (1<<3) // subpicture enable (enabled) - + (0<<4) // NTSC enable (disabled - PAL) - + (0<<5) // C2 static subpicture enable (disabled) - + (0<<6) // C2 subpicture offset division (disabled) - + (1<<7) // 422 subformat selection ! - /* + (0<<8) // 15 bpp high alpha - + (0<<9) // 15 bpp high alpha - + (0<<10) // 15 bpp high alpha - + (0<<11) // 15 bpp high alpha - + (0<<12) // 15 bpp high alpha - + (0<<13) // 15 bpp high alpha - + (0<<14) // 15 bpp high alpha - + (0<<15) // 15 bpp high alpha - + (0<<16) // 15 bpp low alpha - + (0<<17) // 15 bpp low alpha - + (0<<18) // 15 bpp low alpha - + (0<<19) // 15 bpp low alpha - + (0<<20) // 15 bpp low alpha - + (0<<21) // 15 bpp low alpha - + (0<<22) // 15 bpp low alpha - + (0<<23) // 15 bpp low alpha - + (0<<24) // static subpicture key - + (0<<25) // static subpicture key - + (0<<26) // static subpicture key - + (0<<27) // static subpicture key - + (0<<28) // static subpicture key - */ ; - break; - } - - cregs.c2hparam=((hdispend - 8) << 16) | (htotal - 8); - cregs.c2hsync=((hsyncend - 8) << 16) | (hsyncstart - 8); - - cregs.c2misc=0 // CRTCV2 656 togg f0 - +(0<<1) // CRTCV2 656 togg f0 - +(0<<2) // CRTCV2 656 togg f0 - +(0<<4) // CRTCV2 656 togg f1 - +(0<<5) // CRTCV2 656 togg f1 - +(0<<6) // CRTCV2 656 togg f1 - +(0<<8) // Hsync active high - +(0<<9) // Vsync active high - // 16-27 c2vlinecomp - nevim co tam dat - ; - cregs.c2offset=(regs.bespitch << 1); - - cregs.c2pl2startadd0=regs.besa1corg; - //cregs.c2pl2startadd1=regs.besa2corg; - cregs.c2pl3startadd0=regs.besa1c3org; - //cregs.c2pl3startadd1=regs.besa2c3org; - - cregs.c2preload=(vsyncstart << 16) | (hsyncstart); // from - - memset(config->dga_addr + config->offsets[config->num_frames], 0, config->frame_size); // clean spic area - cregs.c2spicstartadd0=(uint32_t) mga_src_base + baseadrofs + config->num_frames*config->frame_size; - //cregs.c2spicstartadd1=0; // not used - - cregs.c2startadd0=regs.besa1org; - //cregs.c2startadd1=regs.besa2org; - - cregs.c2subpiclut=0; //not used - - cregs.c2vparam=((vdispend - 1) << 16) | (vtotal - 1); - cregs.c2vsync=((vsyncend - 1) << 16) | (vsyncstart - 1); -#endif /* CRTC2 */ - - mga_vid_write_regs(0); - return(0); -} - -int VIDIX_NAME(vixPlaybackOn)(void) -{ - if (mga_verbose) printf(MGA_MSG" playback on\n"); - - vid_src_ready = 1; - if(vid_overlay_on) - { - regs.besctl |= 1; - mga_vid_write_regs(0); - } -#ifdef MGA_ALLOW_IRQ - if (mga_irq != -1) - enable_irq(); -#endif - mga_next_frame=0; - - return(0); -} - -int VIDIX_NAME(vixPlaybackOff)(void) -{ - if (mga_verbose) printf(MGA_MSG" playback off\n"); - - vid_src_ready = 0; -#ifdef MGA_ALLOW_IRQ - if (mga_irq != -1) - disable_irq(); -#endif - regs.besctl &= ~1; - regs.besglobctl &= ~(1<<6); /* UYVY format selected */ - mga_vid_write_regs(0); - - return(0); -} - -int VIDIX_NAME(vixProbe)(int verbose,int force) -{ - pciinfo_t lst[MAX_PCI_DEVICES]; - unsigned int i, num_pci; - int err; - - if (verbose) printf(MGA_MSG" probe\n"); - - mga_verbose = verbose; - - is_g400 = -1; - - err = pci_scan(lst, &num_pci); - if (err) - { - printf(MGA_MSG" Error occured during pci scan: %s\n", strerror(err)); - return(err); - } - - if (mga_verbose) - printf(MGA_MSG" found %d pci devices\n", num_pci); - - for (i = 0; i < num_pci; i++) - { - if (mga_verbose > 1) - printf(MGA_MSG" pci[%d] vendor: %d device: %d\n", - i, lst[i].vendor, lst[i].device); - if (lst[i].vendor == VENDOR_MATROX) - { - switch(lst[i].device) - { - case DEVICE_MATROX_MGA_G550_AGP: - printf(MGA_MSG" Found MGA G550\n"); - is_g400 = 1; - goto card_found; - case DEVICE_MATROX_MGA_G400_AGP: - printf(MGA_MSG" Found MGA G400/G450\n"); - is_g400 = 1; - goto card_found; -#ifndef CRTC2 - case DEVICE_MATROX_MGA_G200_AGP: - printf(MGA_MSG" Found MGA G200 AGP\n"); - is_g400 = 0; - goto card_found; - case DEVICE_MATROX_MGA_G200: - printf(MGA_MSG" Found MGA G200 PCI\n"); - is_g400 = 0; - goto card_found; -#endif - } - } - } - - if (is_g400 == -1) - { - if(verbose) - printf(MGA_MSG" Can't find chip\n\n"); - return(ENXIO); - } - -card_found: - probed = 1; - memcpy(&pci_info, &lst[i], sizeof(pciinfo_t)); - - mga_cap.device_id = pci_info.device; /* set device id in capabilites */ - - return(0); -} - -int VIDIX_NAME(vixInit)(const char *args) -{ - unsigned int card_option = 0; - int err; - - /* reset Brightness & Constrast here */ - regs.beslumactl = (0x0 << 16) + 0x80; - - if (mga_verbose) printf(MGA_MSG" init\n"); - - mga_vid_in_use = 0; - - if (!probed) - { - printf(MGA_MSG" driver was not probed but is being initializing\n"); - return(EINTR); - } - -#ifdef MGA_PCICONFIG_MEMDETECT - pci_config_read(pci_info.bus, pci_info.card, pci_info.func, - 0x40, 4, &card_option); - if (mga_verbose > 1) printf(MGA_MSG" OPTION word: 0x%08X mem: 0x%02X %s\n", card_option, - (card_option>>10)&0x17, ((card_option>>14)&1)?"SGRAM":"SDRAM"); -#endif - - if (mga_ram_size) - { - printf(MGA_MSG" RAMSIZE forced to %d MB\n", mga_ram_size); - } - else - { -#ifdef MGA_MEMORY_SIZE - mga_ram_size = MGA_MEMORY_SIZE; - printf(MGA_MSG" hard-coded RAMSIZE is %d MB\n", (unsigned int) mga_ram_size); -#else - if (is_g400) - { - switch((card_option>>10)&0x17) - { - // SDRAM: - case 0x00: - case 0x04: mga_ram_size = 16; break; - case 0x03: mga_ram_size = 32; break; - // SGRAM: - case 0x10: - case 0x14: mga_ram_size = 32; break; - case 0x11: - case 0x12: mga_ram_size = 16; break; - default: - mga_ram_size = 16; - printf(MGA_MSG" Couldn't detect RAMSIZE, assuming 16MB!\n"); - } - } - else - { - switch((card_option>>10)&0x17) - { - // case 0x10: - // case 0x13: mga_ram_size = 8; break; - default: mga_ram_size = 8; - } - } - -#if 0 - // printf("List resources -----------\n"); - for(temp=0;temp<DEVICE_COUNT_RESOURCE;temp++){ - struct resource *res=&pci_dev->resource[temp]; - if(res->flags){ - int size=(1+res->end-res->start)>>20; - printf("res %d: start: 0x%X end: 0x%X (%d MB) flags=0x%X\n",temp,res->start,res->end,size,res->flags); - if(res->flags&(IORESOURCE_MEM|IORESOURCE_PREFETCH)){ - if(size>mga_ram_size && size<=64) mga_ram_size=size; - } - } - } -#endif - - printf(MGA_MSG" detected RAMSIZE is %d MB\n", (unsigned int) mga_ram_size); -#endif - } - - if (mga_ram_size) - { - if ((mga_ram_size < 4) || (mga_ram_size > 64)) - { - printf(MGA_MSG" invalid RAMSIZE: %d MB\n", mga_ram_size); - return(EINVAL); - } - } - - if (mga_verbose > 1) printf(MGA_MSG" hardware addresses: mmio: 0x%lx, framebuffer: 0x%lx\n", - pci_info.base1, pci_info.base0); - - mga_mmio_base = map_phys_mem(pci_info.base1,0x4000); - mga_mem_base = map_phys_mem(pci_info.base0,mga_ram_size*1024*1024); - - if (mga_verbose > 1) printf(MGA_MSG" MMIO at %p, IRQ: %d, framebuffer: %p\n", - mga_mmio_base, mga_irq, mga_mem_base); - err = mtrr_set_type(pci_info.base0,mga_ram_size*1024*1024,MTRR_TYPE_WRCOMB); - if(!err) printf(MGA_MSG" Set write-combining type of video memory\n"); -#ifdef MGA_ALLOW_IRQ - if (mga_irq != -1) - { - int tmp = request_irq(mga_irq, mga_handle_irq, SA_INTERRUPT | SA_SHIRQ, "Syncfb Time Base", &mga_irq); - if (tmp) - { - printf("syncfb (mga): cannot register irq %d (Err: %d)\n", mga_irq, tmp); - mga_irq=-1; - } - else - { - printf("syncfb (mga): registered irq %d\n", mga_irq); - } - } - else - { - printf("syncfb (mga): No valid irq was found\n"); - mga_irq=-1; - } -#else - printf(MGA_MSG" IRQ support disabled\n"); - mga_irq=-1; -#endif -#ifdef CRTC2 - memset(&cregs_save, 0, sizeof(cregs_save)); -#endif - return(0); -} - -void VIDIX_NAME(vixDestroy)(void) -{ - if (mga_verbose) printf(MGA_MSG" destroy\n"); - - /* FIXME turn off BES */ - vid_src_ready = 0; - regs.besctl &= ~1; - regs.besglobctl &= ~(1<<6); // UYVY format selected - // mga_config.colkey_on=0; //!!! - mga_vid_write_regs(1); - mga_vid_in_use = 0; - -#ifdef MGA_ALLOW_IRQ - if (mga_irq != -1) - free_irq(mga_irq, &mga_irq); -#endif - - if (mga_mmio_base) - unmap_phys_mem(mga_mmio_base, 0x4000); - if (mga_mem_base) - unmap_phys_mem(mga_mem_base, mga_ram_size); - return; -} - -int VIDIX_NAME(vixQueryFourcc)(vidix_fourcc_t *to) -{ - int supports=0; - if (mga_verbose) printf(MGA_MSG" query fourcc (%x)\n", to->fourcc); - - switch(to->fourcc) - { - case IMGFMT_YV12: - case IMGFMT_IYUV: - case IMGFMT_I420: - supports = is_g400 ? 1 : 0; - case IMGFMT_NV12: - supports = is_g400 ? 0 : 1; - case IMGFMT_YUY2: - case IMGFMT_UYVY: - supports = 1; - break; - default: - supports = 0; - } - - if(!supports) - { - to->depth = to->flags = 0; - return(ENOTSUP); - } - to->depth = VID_DEPTH_12BPP | - VID_DEPTH_15BPP | VID_DEPTH_16BPP | - VID_DEPTH_24BPP | VID_DEPTH_32BPP; - to->flags = VID_CAP_EXPAND | VID_CAP_SHRINK | VID_CAP_COLORKEY; - return(0); -} - -unsigned int VIDIX_NAME(vixGetVersion)(void) -{ - return(VIDIX_VERSION); -} - -int VIDIX_NAME(vixGetCapability)(vidix_capability_t *to) -{ - memcpy(to, &mga_cap, sizeof(vidix_capability_t)); - return(0); -} - -int VIDIX_NAME(vixGetGrKeys)(vidix_grkey_t *grkey) -{ - memcpy(grkey, &mga_grkey, sizeof(vidix_grkey_t)); - return(0); -} - -int VIDIX_NAME(vixSetGrKeys)(const vidix_grkey_t *grkey) -{ - memcpy(&mga_grkey, grkey, sizeof(vidix_grkey_t)); - return(0); -} - -int VIDIX_NAME(vixPlaybackSetEq)( const vidix_video_eq_t * eq) -{ - uint32_t luma; - float factor = 255.0 / 2000; - - /* contrast and brightness control isn't supported on G200 - alex */ - if (!is_g400) - { - if (mga_verbose) printf(MGA_MSG" equalizer isn't supported with G200\n"); - return(ENOTSUP); - } - - luma = regs.beslumactl; - - if (eq->cap & VEQ_CAP_BRIGHTNESS) - { - luma &= 0xffff; - luma |= (((int)(eq->brightness * factor) & 0xff) << 16); - } - if (eq->cap & VEQ_CAP_CONTRAST) - { - luma &= 0xffff << 16; - luma |= ((int)((eq->contrast + 1000) * factor) & 0xff); - } - - regs.beslumactl = luma; -#ifdef BES - writel(BESLUMACTL, regs.beslumactl); -#endif - return(0); -} - -int VIDIX_NAME(vixPlaybackGetEq)( vidix_video_eq_t * eq) -{ - float factor = 2000.0 / 255; - - /* contrast and brightness control isn't supported on G200 - alex */ - if (!is_g400) - { - if (mga_verbose) printf(MGA_MSG" equalizer isn't supported with G200\n"); - return(ENOTSUP); - } - - // BESLUMACTL is WO only registr! - // this will not work: regs.beslumactl = readl(BESLUMACTL); - eq->brightness = ((signed char)((regs.beslumactl >> 16) & 0xff)) * factor; - eq->contrast = (regs.beslumactl & 0xFF) * factor - 1000; - eq->cap = VEQ_CAP_BRIGHTNESS | VEQ_CAP_CONTRAST; - - return(0); -} diff --git a/src/video_out/vidix/drivers/nvidia_vid.c b/src/video_out/vidix/drivers/nvidia_vid.c deleted file mode 100644 index 34fa27cb7..000000000 --- a/src/video_out/vidix/drivers/nvidia_vid.c +++ /dev/null @@ -1,976 +0,0 @@ -/* - nvidia_vid - VIDIX based video driver for NVIDIA chips - Copyrights 2003 - 2004 Sascha Sommer. This file is based on sources from - RIVATV (rivatv.sf.net) - Licence: GPL - WARNING: THIS DRIVER IS IN BETA STAGE - - multi buffer support and TNT2 fixes by Dmitry Baryshkov -*/ - - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include <unistd.h> - - -#include "vidix.h" -#include "fourcc.h" -#include "libdha.h" -#include "pci_ids.h" -#include "pci_names.h" -#include "bswap.h" - - -pciinfo_t pci_info; - - -#define MAX_FRAMES 3 -#define NV04_BES_SIZE 1024*2000*4 - - -static vidix_capability_t nvidia_cap = { - "NVIDIA RIVA OVERLAY DRIVER", - "Sascha Sommer <saschasommer@freenet.de>", - TYPE_OUTPUT, - { 0, 0, 0, 0 }, - 2046, - 2046, - 4, - 4, - -1, - FLAG_UPSCALER|FLAG_DOWNSCALER, - VENDOR_NVIDIA2, - -1, - { 0, 0, 0, 0 } -}; - - -unsigned int vixGetVersion(void){ - return(VIDIX_VERSION); -} - - -#define NV_ARCH_03 0x03 -#define NV_ARCH_04 0x04 -#define NV_ARCH_10 0x10 -#define NV_ARCH_20 0x20 -#define NV_ARCH_30 0x30 - -struct nvidia_cards { - unsigned short chip_id; - unsigned short arch; -}; - -static struct nvidia_cards nvidia_card_ids[] = { - /*NV03*/ - {DEVICE_NVIDIA2_RIVA128, NV_ARCH_03}, - {DEVICE_NVIDIA2_RIVA128ZX,NV_ARCH_03}, - /*NV04*/ - {DEVICE_NVIDIA_NV4_RIVA_TNT,NV_ARCH_04}, - {DEVICE_NVIDIA_NV5_RIVA_TNT2,NV_ARCH_04}, - {DEVICE_NVIDIA_NV5_RIVA_TNT22,NV_ARCH_04}, - {DEVICE_NVIDIA_NV5_RIVA_TNT23,NV_ARCH_04}, - {DEVICE_NVIDIA_NV6_VANTA,NV_ARCH_04}, - {DEVICE_NVIDIA_NV6_VANTA2,NV_ARCH_04}, - {DEVICE_NVIDIA2_TNT,NV_ARCH_04}, - {DEVICE_NVIDIA2_TNT2,NV_ARCH_04}, - {DEVICE_NVIDIA2_VTNT2,NV_ARCH_04}, - {DEVICE_NVIDIA2_UTNT2 ,NV_ARCH_04}, - {DEVICE_NVIDIA2_ITNT2,NV_ARCH_04}, - {DEVICE_NVIDIA_NV5_ALADDIN_TNT2,NV_ARCH_30}, - /*NV10*/ - {DEVICE_NVIDIA_NV18_GEFORCE_PCX,NV_ARCH_10}, - {DEVICE_NVIDIA_NV10_GEFORCE_256,NV_ARCH_10}, - {DEVICE_NVIDIA_NV10DDR_GEFORCE_256,NV_ARCH_10}, - {DEVICE_NVIDIA_NV10GL_QUADRO,NV_ARCH_10}, - {DEVICE_NVIDIA_NV11_GEFORCE2_MX_MX,NV_ARCH_10}, - {DEVICE_NVIDIA_NV11DDR_GEFORCE2_MX,NV_ARCH_10}, - {DEVICE_NVIDIA_NV11_GEFORCE2_GO,NV_ARCH_10}, - {DEVICE_NVIDIA_NV11GL_QUADRO2_MXR_EX,NV_ARCH_10}, - {DEVICE_NVIDIA_NV15_GEFORCE2_GTS_PRO,NV_ARCH_10}, - {DEVICE_NVIDIA_NV15DDR_GEFORCE2_TI,NV_ARCH_10}, - {DEVICE_NVIDIA_NV15BR_GEFORCE2_ULTRA,NV_ARCH_10}, - {DEVICE_NVIDIA_NV15GL_QUADRO2_PRO,NV_ARCH_10}, - {DEVICE_NVIDIA_NV17_GEFORCE4_MX,NV_ARCH_10}, - {DEVICE_NVIDIA_NV17_GEFORCE4_MX2,NV_ARCH_10}, - {DEVICE_NVIDIA_NV17_GEFORCE4_MX3,NV_ARCH_10}, - {DEVICE_NVIDIA_NV17_GEFORCE4_MX4,NV_ARCH_10}, - {DEVICE_NVIDIA_NV17_GEFORCE4_440,NV_ARCH_10}, - {DEVICE_NVIDIA_NV17_GEFORCE4_420,NV_ARCH_10}, - {DEVICE_NVIDIA_NV17_GEFORCE4_4202,NV_ARCH_10}, - {DEVICE_NVIDIA_NV17GL_QUADRO4_550,NV_ARCH_10}, - {DEVICE_NVIDIA_NV17_GEFORCE4_4402,NV_ARCH_10}, - {DEVICE_NVIDIA_NV17GL_QUADRO4_200_400,NV_ARCH_10}, - {DEVICE_NVIDIA_NV17GL_QUADRO4_5502,NV_ARCH_10}, - {DEVICE_NVIDIA_NV17GL_QUADRO4_5503,NV_ARCH_10}, - {DEVICE_NVIDIA_NV17_GEFORCE4_410,NV_ARCH_10}, - {DEVICE_NVIDIA_NV18_GEFORCE4_MX,NV_ARCH_10}, - {DEVICE_NVIDIA_NV18_GEFORCE4_MX2,NV_ARCH_10}, - {DEVICE_NVIDIA_NV18_GEFORCE4_MX3,NV_ARCH_10}, - {DEVICE_NVIDIA_NV18_GEFORCE4_MX4,NV_ARCH_10}, - {DEVICE_NVIDIA_NV18M_GEFORCE4_448,NV_ARCH_10}, - {DEVICE_NVIDIA_NV18M_GEFORCE4_488,NV_ARCH_10}, - {DEVICE_NVIDIA_NV18GL_QUADRO4_580,NV_ARCH_10}, - {DEVICE_NVIDIA_NV18GL_QUADRO4_NVS,NV_ARCH_10}, - {DEVICE_NVIDIA_NV18GL_QUADRO4_380,NV_ARCH_10}, - {DEVICE_NVIDIA_NV18M_GEFORCE4_4482,NV_ARCH_10}, - {DEVICE_NVIDIA_NVCRUSH11_GEFORCE2_MX,NV_ARCH_10}, - {DEVICE_NVIDIA_NFORCE2_AGP_DIFFERENT,NV_ARCH_10}, - {DEVICE_NVIDIA_NFORCE2_AGP,NV_ARCH_10}, - {DEVICE_NVIDIA_NV18_GEFORCE4_MX5,NV_ARCH_10}, - /*NV20*/ - {DEVICE_NVIDIA_NV20_GEFORCE3,NV_ARCH_20}, - {DEVICE_NVIDIA_NV20_GEFORCE3_TI,NV_ARCH_20}, - {DEVICE_NVIDIA_NV20_GEFORCE3_TI2,NV_ARCH_20}, - {DEVICE_NVIDIA_NV20DCC_QUADRO_DCC,NV_ARCH_20}, - {DEVICE_NVIDIA_NV25_GEFORCE4_TI,NV_ARCH_20}, - {DEVICE_NVIDIA_NV25_GEFORCE4_TI2,NV_ARCH_20}, - {DEVICE_NVIDIA_NV25_GEFORCE4_TI3,NV_ARCH_20}, - {DEVICE_NVIDIA_NV25_GEFORCE4_TI4,NV_ARCH_20}, - {DEVICE_NVIDIA_NV25GL_QUADRO4_900,NV_ARCH_20}, - {DEVICE_NVIDIA_NV25GL_QUADRO4_750,NV_ARCH_20}, - {DEVICE_NVIDIA_NV25GL_QUADRO4_700,NV_ARCH_20}, - {DEVICE_NVIDIA_NV28_GEFORCE4_TI,NV_ARCH_20}, - {DEVICE_NVIDIA_NV28_GEFORCE4_TI2,NV_ARCH_20}, - {DEVICE_NVIDIA_NV28_GEFORCE4_TI3,NV_ARCH_20}, - {DEVICE_NVIDIA_NV28_GEFORCE4_TI4,NV_ARCH_20}, - {DEVICE_NVIDIA_NV28GL_QUADRO4_980,NV_ARCH_20}, - {DEVICE_NVIDIA_NV28GL_QUADRO4_780,NV_ARCH_20}, - {DEVICE_NVIDIA_NV28GLM_QUADRO4_700,NV_ARCH_20}, - /*NV30*/ - {DEVICE_NVIDIA_NV30_GEFORCE_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV30_GEFORCE_FX2,NV_ARCH_30}, - {DEVICE_NVIDIA_NV30_GEFORCE_FX3,NV_ARCH_30}, - {DEVICE_NVIDIA_NV30GL_QUADRO_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV30GL_QUADRO_FX2,NV_ARCH_30}, - {DEVICE_NVIDIA_NV31_GEFORCE_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV31_GEFORCE_FX2,NV_ARCH_30}, - {DEVICE_NVIDIA_NV31,NV_ARCH_30}, - {DEVICE_NVIDIA_NV31_GEFORCE_FX3,NV_ARCH_30}, - {DEVICE_NVIDIA_NV312,NV_ARCH_30}, - {DEVICE_NVIDIA_NV313,NV_ARCH_30}, - {DEVICE_NVIDIA_NV31M_GEFORCE_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV31M_GEFORCE_FX2,NV_ARCH_30}, - {DEVICE_NVIDIA_NVIDIA_QUADRO_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV314,NV_ARCH_30}, - {DEVICE_NVIDIA_NV315,NV_ARCH_30}, - {DEVICE_NVIDIA_NV316,NV_ARCH_30}, - {DEVICE_NVIDIA_NV34_GEFORCE_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV34_GEFORCE_FX2,NV_ARCH_30}, - {DEVICE_NVIDIA_NV34_GEFORCE_FX3,NV_ARCH_30}, - {DEVICE_NVIDIA_NV34_GEFORCE_FX4,NV_ARCH_30}, - {DEVICE_NVIDIA_NV34M_GEFORCE_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV34M_GEFORCE_FX2,NV_ARCH_30}, - {DEVICE_NVIDIA_NV34_GEFORCE_FX5,NV_ARCH_30}, - {DEVICE_NVIDIA_NV34_GEFORCE_FX6,NV_ARCH_30}, - {DEVICE_NVIDIA_NV34M_GEFORCE_FX3,NV_ARCH_30}, - {DEVICE_NVIDIA_NV34M_GEFORCE_FX4,NV_ARCH_30}, - {DEVICE_NVIDIA_NV34GL_QUADRO_NVS,NV_ARCH_30}, - {DEVICE_NVIDIA_NV34GL_QUADRO_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV34GLM_GEFORCE_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV34_GEFORCE_FX7,NV_ARCH_30}, - {DEVICE_NVIDIA_NV34,NV_ARCH_30}, - {DEVICE_NVIDIA_NV35_GEFORCE_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV35_GEFORCE_FX2,NV_ARCH_30}, - {DEVICE_NVIDIA_NV35_GEFORCE_FX3,NV_ARCH_30}, - {DEVICE_NVIDIA_NV38_GEFORCE_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV35_GEFORCE_FX4,NV_ARCH_30}, - {DEVICE_NVIDIA_NV35GL_QUADRO_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV35GL_QUADRO_FX2,NV_ARCH_30}, - {DEVICE_NVIDIA_NV36_1_GEFORCE_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV36_2_GEFORCE_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV36_GEFORCE_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV36_4_GEFORCE_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV36_5,NV_ARCH_30}, - {DEVICE_NVIDIA_NV36_GEFORCE_FX2,NV_ARCH_30}, - {DEVICE_NVIDIA_NV36_GEFORCE_FX3,NV_ARCH_30}, - {DEVICE_NVIDIA_NV36,NV_ARCH_30}, - {DEVICE_NVIDIA_NV362,NV_ARCH_30}, - {DEVICE_NVIDIA_NV36_QUADRO_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV36GL_QUADRO_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV36GL,NV_ARCH_30}, - {DEVICE_NVIDIA_NV36_GEFORCE_PCX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV35_GEFORCE_PCX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV37GL_QUADRO_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV37GL_QUADRO_FX2,NV_ARCH_30}, - {DEVICE_NVIDIA_NV38GL_QUADRO_FX,NV_ARCH_30}, - /* FIXME are they different? */ - {DEVICE_NVIDIA_NV40_GEFORCE_6800,NV_ARCH_30}, - {DEVICE_NVIDIA_NV40_GEFORCE_68002,NV_ARCH_30}, - {DEVICE_NVIDIA_NV40_2,NV_ARCH_30}, - {DEVICE_NVIDIA_NV40_3,NV_ARCH_30}, - {DEVICE_NVIDIA_NV40_GEFORCE_68003,NV_ARCH_30}, - {DEVICE_NVIDIA_NV40GL,NV_ARCH_30}, - {DEVICE_NVIDIA_NV40GL_QUADRO_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV41_0,NV_ARCH_30}, - {DEVICE_NVIDIA_NV41_1,NV_ARCH_30}, - {DEVICE_NVIDIA_NV41_2,NV_ARCH_30}, - {DEVICE_NVIDIA_NV41_8,NV_ARCH_30}, - {DEVICE_NVIDIA_NV41GL,NV_ARCH_30}, - {DEVICE_NVIDIA_NV40_GEFORCE_6800_GEFORCE,NV_ARCH_30}, - {DEVICE_NVIDIA_NV43_GEFORCE_6600_GEFORCE,NV_ARCH_30}, - {DEVICE_NVIDIA_NV43_GEFORCE_6600,NV_ARCH_30}, - {DEVICE_NVIDIA_NV45GL_QUADRO_FX,NV_ARCH_30}, - {DEVICE_NVIDIA_NV40_GEFORCE_68004,NV_ARCH_30} -}; - - -static int find_chip(unsigned chip_id){ - unsigned i; - for(i = 0;i < sizeof(nvidia_card_ids)/sizeof(struct nvidia_cards);i++) - { - if(chip_id == nvidia_card_ids[i].chip_id)return i; - } - return -1; -} - -int vixProbe(int verbose, int force){ - pciinfo_t lst[MAX_PCI_DEVICES]; - unsigned i,num_pci; - int err; - - if (force) - printf("[nvidia_vid]: warning: forcing not supported yet!\n"); - err = pci_scan(lst,&num_pci); - if(err){ - printf("[nvidia_vid] Error occurred during pci scan: %s\n",strerror(err)); - return err; - } - else { - err = ENXIO; - for(i=0; i < num_pci; i++){ - if(lst[i].vendor == VENDOR_NVIDIA2 || lst[i].vendor == VENDOR_NVIDIA){ - int idx; - const char *dname; - idx = find_chip(lst[i].device); - if(idx == -1) - continue; - dname = pci_device_name(lst[i].vendor, lst[i].device); - dname = dname ? dname : "Unknown chip"; - printf("[nvidia_vid] Found chip: %s\n", dname); - nvidia_cap.device_id = lst[i].device; - err = 0; - memcpy(&pci_info, &lst[i], sizeof(pciinfo_t)); - break; - } - } - } - if(err && verbose) printf("[nvidia_vid] Can't find chip\n"); - return err; -} - - - - -/* - * PCI-Memory IO access macros. - */ -#define VID_WR08(p,i,val) (((uint8_t *)(p))[(i)]=(val)) -#define VID_RD08(p,i) (((uint8_t *)(p))[(i)]) - -#define VID_WR32(p,i,val) (((uint32_t *)(p))[(i)/4]=(val)) -#define VID_RD32(p,i) (((uint32_t *)(p))[(i)/4]) - -#ifndef USE_RMW_CYCLES -/* - * Can be used to inhibit READ-MODIFY-WRITE cycles. On by default. - */ - -#define MEM_BARRIER() __asm__ __volatile__ ("" : : : "memory") - -#undef VID_WR08 -#define VID_WR08(p,i,val) ({ MEM_BARRIER(); ((uint8_t *)(p))[(i)]=(val); }) -#undef VID_RD08 -#define VID_RD08(p,i) ({ MEM_BARRIER(); ((uint8_t *)(p))[(i)]; }) - -#undef VID_WR32 -#define VID_WR32(p,i,val) ({ MEM_BARRIER(); ((uint32_t *)(p))[(i)/4]=(val); }) -#undef VID_RD32 -#define VID_RD32(p,i) ({ MEM_BARRIER(); ((uint32_t *)(p))[(i)/4]; }) -#endif /* USE_RMW_CYCLES */ - -#define VID_AND32(p,i,val) VID_WR32(p,i,VID_RD32(p,i)&(val)) -#define VID_OR32(p,i,val) VID_WR32(p,i,VID_RD32(p,i)|(val)) -#define VID_XOR32(p,i,val) VID_WR32(p,i,VID_RD32(p,i)^(val)) - - - - - - -struct rivatv_chip { - volatile uint32_t *PMC; /* general control */ - volatile uint32_t *PME; /* multimedia port */ - volatile uint32_t *PFB; /* framebuffer control */ - volatile uint32_t *PVIDEO; /* overlay control */ - volatile uint8_t *PCIO; /* SVGA (CRTC, ATTR) registers */ - volatile uint8_t *PVIO; /* SVGA (MISC, GRAPH, SEQ) registers */ - volatile uint32_t *PRAMIN; /* instance memory */ - volatile uint32_t *PRAMHT; /* hash table */ - volatile uint32_t *PRAMFC; /* fifo context table */ - volatile uint32_t *PRAMRO; /* fifo runout table */ - volatile uint32_t *PFIFO; /* fifo control region */ - volatile uint32_t *FIFO; /* fifo channels (USER) */ - volatile uint32_t *PGRAPH; /* graphics engine */ - - unsigned long fbsize; /* framebuffer size */ - int arch; /* compatible NV_ARCH_XX define */ - int realarch; /* real architecture */ - void (* lock) (struct rivatv_chip *, int); -}; -typedef struct rivatv_chip rivatv_chip; - - -struct rivatv_info { - unsigned int use_colorkey; - unsigned int colorkey; /* saved xv colorkey*/ - unsigned int vidixcolorkey; /*currently used colorkey*/ - unsigned int depth; - unsigned int format; - unsigned int pitch; - unsigned int width,height; - unsigned int d_width,d_height; /*scaled width && height*/ - unsigned int wx,wy; /*window x && y*/ - unsigned int screen_x; /*screen width*/ - unsigned int screen_y; /*screen height*/ - unsigned long buffer_size; /* size of the image buffer */ - struct rivatv_chip chip; /* NV architecture structure */ - void* video_base; /* virtual address of control region */ - void* control_base; /* virtual address of fb region */ - unsigned long picture_base; /* direct pointer to video picture */ - unsigned long picture_offset; /* offset of video picture in frame buffer */ -// struct rivatv_dma dma; /* DMA structure */ - unsigned int cur_frame; - unsigned int num_frames; /* number of buffers */ - int bps; /* bytes per line */ -}; -typedef struct rivatv_info rivatv_info; - -//framebuffer size funcs -static unsigned long rivatv_fbsize_nv03 (struct rivatv_chip *chip){ - if (VID_RD32 (chip->PFB, 0) & 0x00000020) { - if (((VID_RD32 (chip->PMC, 0) & 0xF0) == 0x20) - && ((VID_RD32 (chip->PMC, 0) & 0x0F) >= 0x02)) { - /* SDRAM 128 ZX. */ - return ((1 << (VID_RD32 (chip->PFB, 0) & 0x03)) * 1024 * 1024); - } - else { - return 1024 * 1024 * 8; - } - } - else { - /* SGRAM 128. */ - switch (chip->PFB[0x00000000] & 0x00000003) { - case 0: - return 1024 * 1024 * 8; - break; - case 2: - return 1024 * 1024 * 4; - break; - default: - return 1024 * 1024 * 2; - break; - } - } -} -static unsigned long rivatv_fbsize_nv04 (struct rivatv_chip *chip){ - if (VID_RD32 (chip->PFB, 0) & 0x00000100) { - return ((VID_RD32 (chip->PFB, 0) >> 12) & 0x0F) * 1024 * 1024 * 2 - + 1024 * 1024 * 2; - } else { - switch (VID_RD32 (chip->PFB, 0) & 0x00000003) { - case 0: - return 1024 * 1024 * 32; - break; - case 1: - return 1024 * 1024 * 4; - break; - case 2: - return 1024 * 1024 * 8; - break; - case 3: - default: - return 1024 * 1024 * 16; - break; - } - } -} - -static unsigned long rivatv_fbsize_nv10 (struct rivatv_chip *chip){ - return ((VID_RD32 (chip->PFB, 0x20C) >> 20) & 0x000000FF) * 1024 * 1024; -} - -//lock funcs -static void rivatv_lock_nv03 (struct rivatv_chip *chip, int LockUnlock){ - VID_WR08 (chip->PVIO, 0x3C4, 0x06); - VID_WR08 (chip->PVIO, 0x3C5, LockUnlock ? 0x99 : 0x57); -} - -static void rivatv_lock_nv04 (struct rivatv_chip *chip, int LockUnlock){ - VID_WR08 (chip->PCIO, 0x3C4, 0x06); - VID_WR08 (chip->PCIO, 0x3C5, LockUnlock ? 0x99 : 0x57); - VID_WR08 (chip->PCIO, 0x3D4, 0x1F); - VID_WR08 (chip->PCIO, 0x3D5, LockUnlock ? 0x99 : 0x57); -} - - - - -/* Enable PFB (Framebuffer), PVIDEO (Overlay unit) and PME (Mediaport) if neccessary. */ -static void rivatv_enable_PMEDIA (struct rivatv_info *info){ - uint32_t reg; - - /* switch off interrupts once for a while */ -// VID_WR32 (info->chip.PME, 0x200140, 0x00); -// VID_WR32 (info->chip.PMC, 0x000140, 0x00); - - reg = VID_RD32 (info->chip.PMC, 0x000200); - - /* NV3 (0x10100010): NV03_PMC_ENABLE_PMEDIA, NV03_PMC_ENABLE_PFB, NV03_PMC_ENABLE_PVIDEO */ - - if ((reg & 0x10100010) != 0x10100010) { - printf("PVIDEO and PFB disabled, enabling...\n"); - VID_OR32 (info->chip.PMC, 0x000200, 0x10100010); - } - - /* save the current colorkey */ - switch (info->chip.arch ) { - case NV_ARCH_10: - case NV_ARCH_20: - case NV_ARCH_30: - /* NV_PVIDEO_COLOR_KEY */ - info->colorkey = VID_RD32 (info->chip.PVIDEO, 0xB00); - break; - case NV_ARCH_03: - case NV_ARCH_04: - /* NV_PVIDEO_KEY */ - info->colorkey = VID_RD32 (info->chip.PVIDEO, 0x240); - break; - } - - - /* re-enable interrupts again */ -// VID_WR32 (info->chip.PMC, 0x000140, 0x01); -// VID_WR32 (info->chip.PME, 0x200140, 0x01); -} - -/* Stop overlay video. */ -static void rivatv_overlay_stop (struct rivatv_info *info) { - switch (info->chip.arch ) { - case NV_ARCH_10: - case NV_ARCH_20: - case NV_ARCH_30: - /* NV_PVIDEO_COLOR_KEY */ - /* Xv-Extension-Hack: Restore previously saved value. */ - VID_WR32 (info->chip.PVIDEO, 0xB00, info->colorkey); - /* NV_PVIDEO_STOP */ - VID_OR32 (info->chip.PVIDEO, 0x704, 0x11); - /* NV_PVIDEO_BUFFER */ - VID_AND32 (info->chip.PVIDEO, 0x700, ~0x11); - /* NV_PVIDEO_INTR_EN_BUFFER */ -// VID_AND32 (info->chip.PVIDEO, 0x140, ~0x11); - break; - case NV_ARCH_03: - case NV_ARCH_04: - /* NV_PVIDEO_KEY */ - VID_WR32 (info->chip.PVIDEO, 0x240, info->colorkey); - /* NV_PVIDEO_OVERLAY_VIDEO_OFF */ - VID_AND32 (info->chip.PVIDEO, 0x244, ~0x01); - /* NV_PVIDEO_INTR_EN_0_NOTIFY */ -// VID_AND32 (info->chip.PVIDEO, 0x140, ~0x01); - /* NV_PVIDEO_OE_STATE */ - VID_WR32 (info->chip.PVIDEO, 0x224, 0); - /* NV_PVIDEO_SU_STATE */ - VID_WR32 (info->chip.PVIDEO, 0x228, 0); - /* NV_PVIDEO_RM_STATE */ - VID_WR32 (info->chip.PVIDEO, 0x22C, 0); - break; - } -} - -/* Get pan offset of the physical screen. */ -static uint32_t rivatv_overlay_pan (struct rivatv_info *info){ - uint32_t pan; - info->chip.lock (&info->chip, 0); - VID_WR08 (info->chip.PCIO, 0x3D4, 0x0D); - pan = VID_RD08 (info->chip.PCIO, 0x3D5); - VID_WR08 (info->chip.PCIO, 0x3D4, 0x0C); - pan |= VID_RD08 (info->chip.PCIO, 0x3D5) << 8; - VID_WR08 (info->chip.PCIO, 0x3D4, 0x19); - pan |= (VID_RD08 (info->chip.PCIO, 0x3D5) & 0x1F) << 16; - VID_WR08 (info->chip.PCIO, 0x3D4, 0x2D); - pan |= (VID_RD08 (info->chip.PCIO, 0x3D5) & 0x60) << 16; - return pan << 2; -} - -/* Compute and set colorkey depending on the colour depth. */ -static void rivatv_overlay_colorkey (rivatv_info* info, unsigned int chromakey){ - uint32_t r, g, b, key = 0; - - r = (chromakey & 0x00FF0000) >> 16; - g = (chromakey & 0x0000FF00) >> 8; - b = chromakey & 0x000000FF; - switch (info->depth) { - case 15: - key = ((r >> 3) << 10) | ((g >> 3) << 5) | ((b >> 3)); -#ifndef WIN32 - key = key | 0x00008000; -#endif - break; - case 16: // XXX unchecked - key = ((r >> 3) << 11) | ((g >> 2) << 5) | ((b >> 3)); -#ifndef WIN32 - key = key | 0x00008000; -#endif - break; - case 24: // XXX unchecked, maybe swap order of masking - FIXME Can the card be in 24 bit mode anyway? - key = (chromakey & 0x00FFFFFF) | 0x00800000; - break; - case 32: - key = chromakey; -#ifndef WIN32 - key = key | 0x80000000; -#endif - break; - } - //printf("[nvidia_vid] depth=%d %08X \n", info->depth, chromakey); - switch (info->chip.arch) { - case NV_ARCH_10: - case NV_ARCH_20: - case NV_ARCH_30: - VID_WR32 (info->chip.PVIDEO, 0xB00, key); - break; - case NV_ARCH_03: - case NV_ARCH_04: - VID_WR32 (info->chip.PVIDEO, 0x240, key); - break; - } -} - -static void nv_getscreenproperties(struct rivatv_info *info){ - uint32_t bpp=0; - info->chip.lock(&info->chip, 0); - /*get screen depth*/ - VID_WR08(info->chip.PCIO, 0x03D4,0x28); - bpp = VID_RD08(info->chip.PCIO,0x03D5)&0x3; - if(bpp==3)bpp=4; - if((bpp == 2) && (info->chip.PVIDEO[0x00000600/4] & 0x00001000) == 0x0)info->depth=15; - else info->depth = bpp*8; - /*get screen width*/ - VID_WR08(info->chip.PCIO, 0x03D4, 0x1); - info->screen_x = (1 + VID_RD08(info->chip.PCIO, 0x3D5)) * 8; - /*get screen height*/ - /* get first 8 bits in VT_DISPLAY_END*/ - VID_WR08(info->chip.PCIO, 0x03D4, 0x12); - info->screen_y = VID_RD08(info->chip.PCIO,0x03D5); - VID_WR08(info->chip.PCIO,0x03D4,0x07); - /* get 9th bit in CRTC_OVERFLOW*/ - info->screen_y |= (VID_RD08(info->chip.PCIO,0x03D5) &0x02)<<7; - /* and the 10th in CRTC_OVERFLOW*/ - info->screen_y |=(VID_RD08(info->chip.PCIO,0x03D5) &0x40)<<3; - ++info->screen_y; -} - - - - -/* Start overlay video. */ -static void rivatv_overlay_start (struct rivatv_info *info,int bufno){ - uint32_t base, size, offset, xscale, yscale, pan; - uint32_t value; - int x=info->wx?info->wx:8, y=info->wy?info->wy:8; - int lwidth=info->d_width, lheight=info->d_height; - int bps; - int i; - - size = info->buffer_size; - base = info->picture_offset; - offset = bufno*size; - /*update depth & dimensions here because it may change with vo vesa or vo fbdev*/ - nv_getscreenproperties(info); - - if(info->depth){ -// bps = info->screen_x * ((info->depth+1)/8); - /* get pan offset of the physical screen */ - pan = rivatv_overlay_pan (info); - /* adjust window position depending on the pan offset */ - bps = 0; - info->chip.lock (&info->chip, 0); - for (i = 0; (i < 1024) && (bps == 0); i++) - { - if (info->chip.arch != NV_ARCH_03) - bps = info->chip.PGRAPH[0x00000670/4]; - else - bps = info->chip.PGRAPH[0x00000650/4]; - } - if (bps == 0) - { - fprintf(stderr, "[nvidia_vid] reading bps returned 0!!!\n"); - if (info->bps != 0) - bps = info->bps; - } - else - { - info->bps = bps; - } - - if (bps != 0) - { - x = info->wx - (pan % bps) * 8 / info->depth; - y = info->wy - (pan / bps); - } - } - - /* adjust negative output window variables */ - if (x < 0) { - lwidth = info->d_width + x; - offset += (-x * info->width / info->d_width) << 1; -// offset += (-window->x * port->vld_width / window->width) << 1; - x = 0; - } - if (y < 0) { - lheight = info->d_height + y; - offset += (-y * info->height / info->d_height * info->width) << 1; -// offset += (-window->y * port->vld_height / window->height * port->org_width) << 1; - y = 0; - } - - switch (info->chip.arch) { - case NV_ARCH_10: - case NV_ARCH_20: - case NV_ARCH_30: - - /* NV_PVIDEO_BASE */ - VID_WR32 (info->chip.PVIDEO, 0x900 + 0, base + offset); - //VID_WR32 (info->chip.PVIDEO, 0x900 + 4, base); - /* NV_PVIDEO_LIMIT */ - VID_WR32 (info->chip.PVIDEO, 0x908 + 0, base + offset + size - 1); - //VID_WR32 (info->chip.PVIDEO, 0x908 + 4, base + size - 1); - - /* extra code for NV20 && NV30 architectures */ - if (info->chip.arch == NV_ARCH_20 || info->chip.arch == NV_ARCH_30) { - VID_WR32 (info->chip.PVIDEO, 0x800 + 0, base + offset); - //VID_WR32 (info->chip.PVIDEO, 0x800 + 4, base); - VID_WR32 (info->chip.PVIDEO, 0x808 + 0, base + offset + size - 1); - //VID_WR32 (info->chip.PVIDEO, 0x808 + 4, base + size - 1); - } - - /* NV_PVIDEO_LUMINANCE */ - VID_WR32 (info->chip.PVIDEO, 0x910 + 0, 0x00001000); - //VID_WR32 (info->chip.PVIDEO, 0x910 + 4, 0x00001000); - /* NV_PVIDEO_CHROMINANCE */ - VID_WR32 (info->chip.PVIDEO, 0x918 + 0, 0x00001000); - //VID_WR32 (info->chip.PVIDEO, 0x918 + 4, 0x00001000); - - /* NV_PVIDEO_OFFSET */ - VID_WR32 (info->chip.PVIDEO, 0x920 + 0, 0x0); - //VID_WR32 (info->chip.PVIDEO, 0x920 + 4, offset + pitch); - /* NV_PVIDEO_SIZE_IN */ - VID_WR32 (info->chip.PVIDEO, 0x928 + 0, ((info->height) << 16) | info->width); - //VID_WR32 (info->chip.PVIDEO, 0x928 + 4, ((port->org_height/2) << 16) | port->org_width); - /* NV_PVIDEO_POINT_IN */ - VID_WR32 (info->chip.PVIDEO, 0x930 + 0, 0x00000000); - //VID_WR32 (info->chip.PVIDEO, 0x930 + 4, 0x00000000); - /* NV_PVIDEO_DS_DX_RATIO */ - VID_WR32 (info->chip.PVIDEO, 0x938 + 0, (info->width << 20) / info->d_width); - //VID_WR32 (info->chip.PVIDEO, 0x938 + 4, (port->org_width << 20) / window->width); - /* NV_PVIDEO_DT_DY_RATIO */ - VID_WR32 (info->chip.PVIDEO, 0x940 + 0, ((info->height) << 20) / info->d_height); - //VID_WR32 (info->chip.PVIDEO, 0x940 + 4, ((port->org_height/2) << 20) / window->height); - - /* NV_PVIDEO_POINT_OUT */ - VID_WR32 (info->chip.PVIDEO, 0x948 + 0, ((y + 0) << 16) | x); - //VID_WR32 (info->chip.PVIDEO, 0x948 + 4, ((y + 0) << 16) | x); - /* NV_PVIDEO_SIZE_OUT */ - VID_WR32 (info->chip.PVIDEO, 0x950 + 0, (lheight << 16) | lwidth); - //VID_WR32 (info->chip.PVIDEO, 0x950 + 4, (height << 16) | width); - - /* NV_PVIDEO_FORMAT */ - value = info->pitch; - if(info->use_colorkey)value |= 1 << 20; - if(info->format == IMGFMT_YUY2)value |= 1 << 16; - VID_WR32 (info->chip.PVIDEO, 0x958 + 0, value); - //VID_WR32 (info->chip.PVIDEO, 0x958 + 4, (pitch << 1) | 0x00100000); - - /* NV_PVIDEO_INTR_EN_BUFFER */ -// VID_OR32 (info->chip.PVIDEO, 0x140, 0x01/*0x11*/); - /* NV_PVIDEO_STOP */ - VID_WR32 (info->chip.PVIDEO, 0x704,0x0); - /* NV_PVIDEO_BUFFER */ - VID_WR32 (info->chip.PVIDEO, 0x700, 0x01/*0x11*/); - break; - - case NV_ARCH_03: - case NV_ARCH_04: - - - /* NV_PVIDEO_OE_STATE */ - VID_WR32 (info->chip.PVIDEO, 0x224, 0); - /* NV_PVIDEO_SU_STATE */ - VID_WR32 (info->chip.PVIDEO, 0x228, 0); - /* NV_PVIDEO_RM_STATE */ - VID_WR32 (info->chip.PVIDEO, 0x22C, 0); - - /* NV_PVIDEO_BUFF0_START_ADDRESS */ - VID_WR32 (info->chip.PVIDEO, 0x20C + 0, base + offset + 0); - VID_WR32 (info->chip.PVIDEO, 0x20C + 4, base + offset + 0); - /* NV_PVIDEO_BUFF0_PITCH_LENGTH */ - VID_WR32 (info->chip.PVIDEO, 0x214 + 0, info->pitch); - VID_WR32 (info->chip.PVIDEO, 0x214 + 4, info->pitch); - - /* NV_PVIDEO_WINDOW_START */ - VID_WR32 (info->chip.PVIDEO, 0x230, (y << 16) | x); - /* NV_PVIDEO_WINDOW_SIZE */ - VID_WR32 (info->chip.PVIDEO, 0x234, (lheight << 16) | lwidth); - /* NV_PVIDEO_STEP_SIZE */ - yscale = ((info->height - 1) << 11) / (info->d_height - 1); - xscale = ((info->width - 1) << 11) / (info->d_width - 1); - VID_WR32 (info->chip.PVIDEO, 0x200, (yscale << 16) | xscale); - - /* NV_PVIDEO_RED_CSC_OFFSET */ - VID_WR32 (info->chip.PVIDEO, 0x280, 0x69); - /* NV_PVIDEO_GREEN_CSC_OFFSET */ - VID_WR32 (info->chip.PVIDEO, 0x284, 0x3e); - /* NV_PVIDEO_BLUE_CSC_OFFSET */ - VID_WR32 (info->chip.PVIDEO, 0x288, 0x89); - /* NV_PVIDEO_CSC_ADJUST */ - VID_WR32 (info->chip.PVIDEO, 0x28C, 0x00000); /* No colour correction! */ - - /* NV_PVIDEO_CONTROL_Y (BLUR_ON, LINE_HALF) */ - VID_WR32 (info->chip.PVIDEO, 0x204, 0x001); - /* NV_PVIDEO_CONTROL_X (WEIGHT_HEAVY, SHARPENING_ON, SMOOTHING_ON) */ - VID_WR32 (info->chip.PVIDEO, 0x208, 0x111); /*directx overlay 0x110 */ - - /* NV_PVIDEO_FIFO_BURST_LENGTH */ - VID_WR32 (info->chip.PVIDEO, 0x23C, 0x03); - /* NV_PVIDEO_FIFO_THRES_SIZE */ - VID_WR32 (info->chip.PVIDEO, 0x238, 0x38); /*windows uses 0x40*/ - - /* NV_PVIDEO_BUFF0_OFFSET */ - VID_WR32 (info->chip.PVIDEO, 0x21C + 0, 0); - VID_WR32 (info->chip.PVIDEO, 0x21C + 4, 0); - - /* NV_PVIDEO_INTR_EN_0_NOTIFY_ENABLED */ -// VID_OR32 (info->chip.PVIDEO, 0x140, 0x01); - - /* NV_PVIDEO_OVERLAY (KEY_ON, VIDEO_ON, FORMAT_CCIR) */ - value = 0x1; /*video on*/ - if(info->format==IMGFMT_YUY2)value |= 0x100; - if(info->use_colorkey)value |=0x10; - VID_WR32 (info->chip.PVIDEO, 0x244, value); - - /* NV_PVIDEO_SU_STATE */ - VID_XOR32 (info->chip.PVIDEO, 0x228, 1 << 16); - break; - } - /*set colorkey*/ - rivatv_overlay_colorkey(info,info->vidixcolorkey); - -} - - - - - - - -static rivatv_info* info; - - - - -int vixInit(const char *args){ - int mtrr; - info = (rivatv_info*)calloc(1,sizeof(rivatv_info)); - info->control_base = map_phys_mem(pci_info.base0, 0x00C00000 + 0x00008000); - info->chip.arch = nvidia_card_ids[find_chip(pci_info.device)].arch; - printf("[nvidia_vid] arch %x register base %x\n",info->chip.arch,(unsigned int)info->control_base); - info->chip.PFIFO = (uint32_t *) (info->control_base + 0x00002000); - info->chip.FIFO = (uint32_t *) (info->control_base + 0x00800000); - info->chip.PMC = (uint32_t *) (info->control_base + 0x00000000); - info->chip.PFB = (uint32_t *) (info->control_base + 0x00100000); - info->chip.PME = (uint32_t *) (info->control_base + 0x00000000); - info->chip.PCIO = (uint8_t *) (info->control_base + 0x00601000); - info->chip.PVIO = (uint8_t *) (info->control_base + 0x000C0000); - info->chip.PGRAPH = (uint32_t *) (info->control_base + 0x00400000); - /* setup chip specific functions */ - switch (info->chip.arch) { - case NV_ARCH_03: - info->chip.lock = rivatv_lock_nv03; - info->chip.fbsize = rivatv_fbsize_nv03 (&info->chip); - info->chip.PVIDEO = (uint32_t *) (info->control_base + 0x00680000); - break; - case NV_ARCH_04: - info->chip.lock = rivatv_lock_nv04; - info->chip.fbsize = rivatv_fbsize_nv04 (&info->chip); - info->chip.PRAMIN = (uint32_t *) (info->control_base + 0x00700000); - info->chip.PVIDEO = (uint32_t *) (info->control_base + 0x00680000); - break; - case NV_ARCH_10: - case NV_ARCH_20: - case NV_ARCH_30: - info->chip.lock = rivatv_lock_nv04; - info->chip.fbsize = rivatv_fbsize_nv10 (&info->chip); - info->chip.PRAMIN = (uint32_t *) (info->control_base + 0x00700000); - info->chip.PVIDEO = (uint32_t *) (info->control_base + 0x00008000); - break; - } - switch (info->chip.arch) { - case NV_ARCH_03: - { - /* This maps framebuffer @6MB, thus 2MB are left for video. */ - info->video_base = map_phys_mem(pci_info.base1, info->chip.fbsize); - /* This may trash your screen for resolutions greater than 1024x768, sorry. */ - info->picture_offset = 1024*768* 4 * ((info->chip.fbsize > 4194304)?2:1); - info->picture_base = (uint32_t) info->video_base + info->picture_offset; - info->chip.PRAMIN = (uint32_t *) (info->video_base + 0x00C00000); - break; - } - case NV_ARCH_04: - case NV_ARCH_10: - case NV_ARCH_20: - case NV_ARCH_30: - { - info->video_base = map_phys_mem(pci_info.base1, info->chip.fbsize); - info->picture_offset = info->chip.fbsize - NV04_BES_SIZE; -// info->picture_base = (unsigned long)map_phys_mem(pci_info.base1+info->picture_offset,NV04_BES_SIZE); - info->picture_base = (uint32_t) info->video_base + info->picture_offset; - break; - } - } - - printf("[nvidia_vid] detected memory size %u MB\n",(uint32_t)(info->chip.fbsize /1024/1024)); - - if ((mtrr = mtrr_set_type(pci_info.base1, info->chip.fbsize, MTRR_TYPE_WRCOMB))!= 0) - printf("[nvidia_vid] unable to setup MTRR: %s\n", strerror(mtrr)); - else - printf("[nvidia_vid] MTRR set up\n"); - - nv_getscreenproperties(info); - if(!info->depth)printf("[nvidia_vid] text mode: %ux%u\n",info->screen_x,info->screen_y); - else printf("[nvidia_vid] video mode: %ux%u@%u\n",info->screen_x,info->screen_y, info->depth); - - - rivatv_enable_PMEDIA(info); - info->cur_frame = 0; - info->use_colorkey = 0; - - return 0; -} - -void vixDestroy(void){ - unmap_phys_mem(info->control_base ,0x00C00000 + 0x00008000); - unmap_phys_mem(info->video_base, info->chip.fbsize); - free(info); -} - -int vixGetCapability(vidix_capability_t *to){ - memcpy(to, &nvidia_cap, sizeof(vidix_capability_t)); - return 0; -} - -inline static int is_supported_fourcc(uint32_t fourcc) -{ - if (fourcc == IMGFMT_UYVY || fourcc == IMGFMT_YUY2) - return 1; - else - return 0; -} - -int vixQueryFourcc(vidix_fourcc_t *to){ - if(is_supported_fourcc(to->fourcc)){ - to->depth = VID_DEPTH_1BPP | VID_DEPTH_2BPP | - VID_DEPTH_4BPP | VID_DEPTH_8BPP | - VID_DEPTH_12BPP| VID_DEPTH_15BPP| - VID_DEPTH_16BPP| VID_DEPTH_24BPP| - VID_DEPTH_32BPP; - to->flags = VID_CAP_EXPAND | VID_CAP_SHRINK | VID_CAP_COLORKEY; - return 0; - } - else to->depth = to->flags = 0; - return ENOSYS; -} - -int vixConfigPlayback(vidix_playback_t *vinfo){ - uint32_t i; - printf("called %s\n", __FUNCTION__); - if (! is_supported_fourcc(vinfo->fourcc)) - return ENOSYS; - - info->width = vinfo->src.w; - info->height = vinfo->src.h; - - info->d_width = vinfo->dest.w; - info->d_height = vinfo->dest.h; - info->wx = vinfo->dest.x; - info->wy = vinfo->dest.y; - info->format = vinfo->fourcc; - - printf("[nvidia_vid] setting up a %dx%d-%dx%d video window (src %dx%d), format 0x%X\n", - info->d_width, info->d_height, info->wx, info->wy, info->width, info->height, vinfo->fourcc); - - - vinfo->dga_addr=(void*)(info->picture_base); - - switch (vinfo->fourcc) - { - case IMGFMT_YUY2: - case IMGFMT_UYVY: - - vinfo->dest.pitch.y = 16; - vinfo->dest.pitch.u = 0; - vinfo->dest.pitch.v = 0; - - vinfo->offset.y = 0; - vinfo->offset.v = 0; - vinfo->offset.u = 0; - info->pitch = ((info->width << 1) + (vinfo->dest.pitch.y-1)) & ~(vinfo->dest.pitch.y-1); - vinfo->frame_size = info->pitch * info->height; - break; - } - info->buffer_size = vinfo->frame_size; - info->num_frames = vinfo->num_frames= (info->chip.fbsize - info->picture_offset)/vinfo->frame_size; - if(vinfo->num_frames > MAX_FRAMES)vinfo->num_frames = MAX_FRAMES; -// vinfo->num_frames = 1; -// printf("[nvidia_vid] Number of frames %i\n",vinfo->num_frames); - for(i=0;i <vinfo->num_frames;i++)vinfo->offsets[i] = vinfo->frame_size*i; - return 0; -} - -int vixPlaybackOn(void){ - rivatv_overlay_start(info,info->cur_frame); - return 0; -} - -int vixPlaybackOff(void){ - rivatv_overlay_stop(info); - return 0; -} - -int vixSetGrKeys( const vidix_grkey_t * grkey){ - if (grkey->ckey.op == CKEY_FALSE) - { - info->use_colorkey = 0; - printf("[nvidia_vid] colorkeying disabled\n"); - } - else { - info->use_colorkey = 1; - info->vidixcolorkey = ((grkey->ckey.red<<16)|(grkey->ckey.green<<8)|grkey->ckey.blue); - printf("[nvidia_vid] set colorkey 0x%x\n",info->vidixcolorkey); - } - if(info->d_width && info->d_height)rivatv_overlay_start(info,0); - return 0; -} - -int vixPlaybackFrameSelect(unsigned int frame){ -// printf("selecting buffer %d\n", frame); - rivatv_overlay_start(info, frame); - if (info->num_frames >= 1) - info->cur_frame = frame/*(frame+1)%info->num_frames*/; - return 0; -} - diff --git a/src/video_out/vidix/drivers/pm2_vid.c b/src/video_out/vidix/drivers/pm2_vid.c deleted file mode 100644 index 075b178de..000000000 --- a/src/video_out/vidix/drivers/pm2_vid.c +++ /dev/null @@ -1,357 +0,0 @@ -/** - Driver for 3DLabs Permedia 2. - - Copyright (C) 2002 MÃ¥ns RullgÃ¥rd - - 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 -**/ - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include <sys/types.h> -#include <unistd.h> - -#include "vidix.h" -#include "fourcc.h" -#include "libdha.h" -#include "pci_ids.h" -#include "pci_names.h" - -#include "glint_regs.h" - -#define VIDIX_STATIC pm2_ - -/* MBytes of video memory to use */ -#define PM2_VIDMEM 6 - -#if 0 -#define TRACE_ENTER() fprintf(stderr, "%s: enter\n", __FUNCTION__) -#define TRACE_EXIT() fprintf(stderr, "%s: exit\n", __FUNCTION__) -#else -#define TRACE_ENTER() -#define TRACE_EXIT() -#endif - -#define WRITE_REG(offset,val) \ - *(volatile u_long *)(((u_char *)(pm2_reg_base)) + offset) = (val) -#define READ_REG(offset) \ - *(volatile unsigned long *)(((unsigned char *)(pm2_reg_base)) + offset) - -pciinfo_t pci_info; - -void *pm2_reg_base; -void *pm2_mem; - -int pm2_vidmem = PM2_VIDMEM; - -static vidix_capability_t pm2_cap = -{ - "3DLabs Permedia2 driver", - "MÃ¥ns RullgÃ¥rd <mru@users.sf.net>", - TYPE_OUTPUT, - { 0, 0, 0, 0 }, - 2048, - 2048, - 4, - 4, - -1, - FLAG_UPSCALER|FLAG_DOWNSCALER, - VENDOR_3DLABS, - -1, - { 0, 0, 0, 0 } -}; - - -unsigned int VIDIX_NAME(vixGetVersion)(void) -{ - return(VIDIX_VERSION); -} - -static u_int pm2_card_ids[] = -{ - (VENDOR_3DLABS << 16) | DEVICE_3DLABS_PERMEDIA2, - (VENDOR_TEXAS << 16) | DEVICE_TEXAS_TVP4020_PERMEDIA_2 -}; - -static int find_chip(u_int vendor, u_int chip_id) -{ - u_int vci = (vendor << 16) | chip_id; - unsigned i; - for(i = 0; i < sizeof(pm2_card_ids)/sizeof(u_int); i++){ - if(vci == pm2_card_ids[i]) return i; - } - return -1; -} - -int VIDIX_NAME(vixProbe)(int verbose, int force) -{ - pciinfo_t lst[MAX_PCI_DEVICES]; - unsigned i,num_pci; - int err; - - err = pci_scan(lst,&num_pci); - if(err) - { - printf("[pm2] Error occured during pci scan: %s\n",strerror(err)); - return err; - } - else - { - err = ENXIO; - for(i=0; i < num_pci; i++) - { - int idx; - const char *dname; - idx = find_chip(lst[i].vendor, lst[i].device); - if(idx == -1) - continue; - dname = pci_device_name(lst[i].vendor, lst[i].device); - dname = dname ? dname : "Unknown chip"; - printf("[pm2] Found chip: %s\n", dname); - pm2_cap.device_id = lst[i].device; - err = 0; - memcpy(&pci_info, &lst[i], sizeof(pciinfo_t)); - break; - } - } - if(err && verbose) printf("[pm2] Can't find chip.\n"); - return err; -} - -#define PRINT_REG(reg) \ -{ \ - long _foo = READ_REG(reg); \ - printf("[pm2] " #reg " (%x) = %#lx (%li)\n", reg, _foo, _foo); \ -} - -int VIDIX_NAME(vixInit)(const char *args) -{ - char *vm; - pm2_reg_base = map_phys_mem(pci_info.base0, 0x10000); - pm2_mem = map_phys_mem(pci_info.base1, 1 << 23); - if((vm = getenv("PM2_VIDMEM"))){ - pm2_vidmem = strtol(vm, NULL, 0); - } - return 0; -} - -void VIDIX_NAME(vixDestroy)(void) -{ - unmap_phys_mem(pm2_reg_base, 0x10000); - unmap_phys_mem(pm2_mem, 1 << 23); -} - -int VIDIX_NAME(vixGetCapability)(vidix_capability_t *to) -{ - memcpy(to, &pm2_cap, sizeof(vidix_capability_t)); - return 0; -} - -static int is_supported_fourcc(uint32_t fourcc) -{ - switch(fourcc){ - case IMGFMT_YUY2: - return 1; - default: - return 0; - } -} - -int VIDIX_NAME(vixQueryFourcc)(vidix_fourcc_t *to) -{ - if(is_supported_fourcc(to->fourcc)) - { - to->depth = VID_DEPTH_1BPP | VID_DEPTH_2BPP | - VID_DEPTH_4BPP | VID_DEPTH_8BPP | - VID_DEPTH_12BPP| VID_DEPTH_15BPP| - VID_DEPTH_16BPP| VID_DEPTH_24BPP| - VID_DEPTH_32BPP; - to->flags = VID_CAP_EXPAND | VID_CAP_SHRINK | VID_CAP_COLORKEY; - return 0; - } - else to->depth = to->flags = 0; - return ENOSYS; -} - -#define FORMAT_YUV422 ((1 << 6) | 3 | (1 << 4)) - -#define PPROD(a,b,c) (a | (b << 3) | (c << 6)) - -static u_int ppcodes[][2] = { - {0, 0}, - {32, PPROD(1, 0, 0)}, - {64, PPROD(1, 1, 0)}, - {96, PPROD(1, 1, 1)}, - {128, PPROD(2, 1, 1)}, - {160, PPROD(2, 2, 1)}, - {192, PPROD(2, 2, 2)}, - {224, PPROD(3, 2, 1)}, - {256, PPROD(3, 2, 2)}, - {288, PPROD(3, 3, 1)}, - {320, PPROD(3, 3, 2)}, - {384, PPROD(3, 3, 3)}, - {416, PPROD(4, 3, 1)}, - {448, PPROD(4, 3, 2)}, - {512, PPROD(4, 3, 3)}, - {544, PPROD(4, 4, 1)}, - {576, PPROD(4, 4, 2)}, - {640, PPROD(4, 4, 3)}, - {768, PPROD(4, 4, 4)}, - {800, PPROD(5, 4, 1)}, - {832, PPROD(5, 4, 2)}, - {896, PPROD(5, 4, 3)}, - {1024, PPROD(5, 4, 4)}, - {1056, PPROD(5, 5, 1)}, - {1088, PPROD(5, 5, 2)}, - {1152, PPROD(5, 5, 3)}, - {1280, PPROD(5, 5, 4)}, - {1536, PPROD(5, 5, 5)}, - {1568, PPROD(6, 5, 1)}, - {1600, PPROD(6, 5, 2)}, - {1664, PPROD(6, 5, 3)}, - {1792, PPROD(6, 5, 4)}, - {2048, PPROD(6, 5, 5)} -}; - -static int frames[VID_PLAY_MAXFRAMES]; - -int VIDIX_NAME(vixConfigPlayback)(vidix_playback_t *info) -{ - u_int src_w, drw_w; - u_int src_h, drw_h; - long base0; - u_int stride, sstr; - u_int format; - unsigned int i; - u_int ppcode = 0, sppc = 0; - u_int pitch = 0; - - TRACE_ENTER(); - - switch(info->fourcc){ - case IMGFMT_YUY2: - format = FORMAT_YUV422; - break; - default: - return -1; - } - - src_w = info->src.w; - src_h = info->src.h; - - drw_w = info->dest.w; - drw_h = info->dest.h; - - sstr = READ_REG(PMScreenStride) * 2; - - stride = 0; - for(i = 1; i < sizeof(ppcodes) / sizeof(ppcodes[0]); i++){ - if((!stride) && (ppcodes[i][0] >= src_w)){ - stride = ppcodes[i][0]; - ppcode = ppcodes[i][1]; - pitch = ppcodes[i][0] - ppcodes[i-1][0]; - } - if(ppcodes[i][0] == sstr) - sppc = ppcodes[i][1]; - } - - if(!stride) - return -1; - - info->num_frames = pm2_vidmem*1024*1024 / (stride * src_h * 2); - if(info->num_frames > VID_PLAY_MAXFRAMES) - info->num_frames = VID_PLAY_MAXFRAMES; - - /* Use end of video memory. Assume the card has 8 MB */ - base0 = (8 - pm2_vidmem)*1024*1024; - info->dga_addr = pm2_mem + base0; - - info->dest.pitch.y = pitch*2; - info->dest.pitch.u = 0; - info->dest.pitch.v = 0; - info->offset.y = 0; - info->offset.v = 0; - info->offset.u = 0; - info->frame_size = stride * src_h * 2; - - for(i = 0; i < info->num_frames; i++){ - info->offsets[i] = info->frame_size * i; - frames[i] = (base0 + info->offsets[i]) >> 1; - } - - WRITE_REG(WindowOrigin, 0); - WRITE_REG(dY, 1 << 16); - WRITE_REG(RasterizerMode, 0); - WRITE_REG(ScissorMode, 0); - WRITE_REG(AreaStippleMode, 0); - WRITE_REG(StencilMode, 0); - WRITE_REG(TextureAddressMode, 1); - - WRITE_REG(dSdyDom, 0); - WRITE_REG(dTdx, 0); - - WRITE_REG(PMTextureMapFormat, (1 << 19) | ppcode); - WRITE_REG(PMTextureDataFormat, format); - WRITE_REG(PMTextureReadMode, (1 << 17) | /* FilterMode */ - (11 << 13) | (11 << 9) /* TextureSize log2 */ | 1); - WRITE_REG(ColorDDAMode, 0); - WRITE_REG(TextureColorMode, (0 << 4) /* RGB */ | (3 << 1) /* Copy */ | 1); - WRITE_REG(AlphaBlendMode, 0); - WRITE_REG(DitherMode, (1 << 10) | 1); - WRITE_REG(LogicalOpMode, 0); - WRITE_REG(FBReadMode, sppc); - WRITE_REG(FBHardwareWriteMask, 0xFFFFFFFF); - WRITE_REG(FBWriteMode, 1); - WRITE_REG(YUVMode, 1); - - WRITE_REG(SStart, 0); - WRITE_REG(TStart, 0); - - WRITE_REG(dSdx, (src_w << 20) / drw_w); - WRITE_REG(dTdyDom, (src_h << 20) / drw_h); - WRITE_REG(RectangleOrigin, info->dest.x | (info->dest.y << 16)); - WRITE_REG(RectangleSize, (drw_h << 16) | drw_w); - - TRACE_EXIT(); - return 0; -} - -int VIDIX_NAME(vixPlaybackOn)(void) -{ - TRACE_ENTER(); - - TRACE_EXIT(); - return 0; -} - -int VIDIX_NAME(vixPlaybackOff)(void) -{ - WRITE_REG(YUVMode, 0); - WRITE_REG(TextureColorMode, 0); - WRITE_REG(TextureAddressMode, 0); - WRITE_REG(TextureReadMode, 0); - return 0; -} - -int VIDIX_NAME(vixPlaybackFrameSelect)(unsigned int frame) -{ - WRITE_REG(PMTextureBaseAddress, frames[frame]); - WRITE_REG(Render, PrimitiveRectangle | XPositive | YPositive | - TextureEnable); - return 0; -} diff --git a/src/video_out/vidix/drivers/pm3_regs.h b/src/video_out/vidix/drivers/pm3_regs.h deleted file mode 100644 index 44cc92dca..000000000 --- a/src/video_out/vidix/drivers/pm3_regs.h +++ /dev/null @@ -1,1253 +0,0 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/pm3_regs.h,v 1.9 2001/11/20 00:09:15 alanh Exp $ */ - -/* - * glint register file - * - * Copyright by Sven Luther - * Authors: Sven Luther, <luther@dpt-info.u-strasbg.fr> - * Thomas Witzel, <twitzel@nmr.mgh.harvard.edu> - * - * this work is sponsored by Appian Graphics. - * - */ - -#ifndef _PM3_REG_H_ -#define _PM3_REG_H_ - -#define PM3FIFOSize 120 - -#define PM3Tag(r) ((r>>3)&0x7ff) - -#define PM3OutputFIFO 0x2000 - -/********************************************** -* GLINT Permedia3 Control Status registers * -***********************************************/ -/* Control Status Registers */ -#define PM3ResetStatus 0x0000 -#define PM3IntEnable 0x0008 -#define PM3IntFlags 0x0010 -#define PM3InFIFOSpace 0x0018 -#define PM3OutFIFOWords 0x0020 -#define PM3DMAAddress 0x0028 -#define PM3DMACount 0x0030 -#define PM3ErrorFlags 0x0038 -#define PM3VClkCtl 0x0040 -#define PM3TestRegister 0x0048 -#define PM3Aperture0 0x0050 -#define PM3Aperture1 0x0058 -#define PM3DMAControl 0x0060 -#define PM3FIFODis 0x0068 -#define PM3ChipConfig 0x0070 -#define PM3AGPControl 0x0078 - -#define PM3GPOutDMAAddress 0x0080 -#define PM3PCIFeedbackCount 0x0088 -#define PM3PCIAbortStatus 0x0090 -#define PM3PCIAbortAddress 0x0098 - -#define PM3PCIPLLStatus 0x00f0 - -#define PM3HostTextureAddress 0x0100 -#define PM3TextureDownloadControl 0x0108 -#define PM3TextureOperation 0x0110 -#define PM3LogicalTexturePage 0x0118 -#define PM3TexDMAAddress 0x0120 -#define PM3TexFIFOSpace 0x0128 - -/********************************************** -* GLINT Permedia3 Region 0 Bypass Controls * -***********************************************/ -#define PM3ByAperture1Mode 0x0300 - #define PM3ByApertureMode_BYTESWAP_ABCD (0<<0) - #define PM3ByApertureMode_BYTESWAP_BADC (1<<0) - #define PM3ByApertureMode_BYTESWAP_CDAB (2<<0) - #define PM3ByApertureMode_BYTESWAP_DCBA (3<<0) - #define PM3ByApertureMode_PATCH_DISABLE (0<<2) - #define PM3ByApertureMode_PATCH_ENABLE (1<<2) - #define PM3ByApertureMode_FORMAT_RAW (0<<3) - #define PM3ByApertureMode_FORMAT_YUYV (1<<3) - #define PM3ByApertureMode_FORMAT_UYVY (2<<3) - #define PM3ByApertureMode_PIXELSIZE_8BIT (0<<5) - #define PM3ByApertureMode_PIXELSIZE_16BIT (1<<5) - #define PM3ByApertureMode_PIXELSIZE_32BIT (2<<5) - #define PM3ByApertureMode_EFFECTIVE_STRIDE_1024 (0<<7) - #define PM3ByApertureMode_EFFECTIVE_STRIDE_2048 (1<<7) - #define PM3ByApertureMode_EFFECTIVE_STRIDE_4096 (2<<7) - #define PM3ByApertureMode_EFFECTIVE_STRIDE_8192 (3<<7) - #define PM3ByApertureMode_PATCH_OFFSET_X(off) (((off)&7f)<<9) - #define PM3ByApertureMode_PATCH_OFFSET_Y(off) (((off)&7f)<<16) - #define PM3ByApertureMode_FRAMEBUFFER (0<<21) - #define PM3ByApertureMode_LOCALBUFFER (1<<21) - #define PM3ByApertureMode_DOUBLE_WRITE_OFF (0<<22) - #define PM3ByApertureMode_DOUBLE_WRITE_1MB (1<<22) - #define PM3ByApertureMode_DOUBLE_WRITE_2MB (2<<22) - #define PM3ByApertureMode_DOUBLE_WRITE_4MB (3<<22) - #define PM3ByApertureMode_DOUBLE_WRITE_8MB (4<<22) - #define PM3ByApertureMode_DOUBLE_WRITE_16MB (5<<22) - #define PM3ByApertureMode_DOUBLE_WRITE_32MB (6<<22) -#define PM3Aperture1Stride 0x0308 -#define PM3Aperture1YStart 0x0310 -#define PM3Aperture1UStart 0x0318 -#define PM3Aperture1VStart 0x0320 - -#define PM3ByAperture2Mode 0x0328 -#define PM3Aperture2Stride 0x0330 -#define PM3Aperture2YStart 0x0338 -#define PM3Aperture2UStart 0x0340 -#define PM3Aperture2VStart 0x0348 - -#define PM3ByDMAReadCommandBase 0x0378 -#define PM3ByDMAReadCommandCount 0x0380 -#define PM3ByDMAReadMode 0x0350 - #define PM3ByDMAReadMode_ByteSwap_NONE (0<<0) - #define PM3ByDMAReadMode_ByteSwap_BYTE (1<<0) - #define PM3ByDMAReadMode_ByteSwap_HWORD (2<<0) - #define PM3ByDMAReadMode_ByteSwap_FULL (3<<0) - #define PM3ByDMAReadMode_PatchEnable (1<<2) - #define PM3ByDMAReadMode_Format_RAW (0<<3) - #define PM3ByDMAReadMode_Format_YUYV (1<<3) - #define PM3ByDMAReadMode_Format_UYVY (2<<3) - #define PM3ByDMAReadMode_PixelSize(s) (((s>>4)&3)<<5) - #define PM3ByDMAReadMode_EffectiveStride(s) ((s&3)<<7) - #define PM3ByDMAReadMode_PatchOffsetX(x) ((x&0x3f)<<9) - #define PM3ByDMAReadMode_PatchOffsetY(y) ((y&0x3f)<<16) - #define PM3ByDMAReadMode_Buffer_FB (0<<21) - #define PM3ByDMAReadMode_Buffer_LB (1<<21) - #define PM3ByDMAReadMode_Active (1<<22) - #define PM3ByDMAReadMode_MemType_PCI (0<<23) - #define PM3ByDMAReadMode_MemType_AGP (1<<23) - #define PM3ByDMAReadMode_Burst(b) ((b&7)<<24) - #define PM3ByDMAReadMode_Align (1<<27) -#define PM3ByDMAReadStride 0x0358 -#define PM3ByDMAReadUStart 0x0368 -#define PM3ByDMAReadVStart 0x0370 -#define PM3ByDMAReadYStart 0x0360 - - -/********************************************** -* GLINT Permedia3 Memory Control (0x1000) * -***********************************************/ -#define PM3MemCounter 0x1000 -#define PM3MemBypassWriteMask 0x1008 -#define PM3MemScratch 0x1010 -#define PM3LocalMemCaps 0x1018 - #define PM3LocalMemCaps_NoWriteMask (1<<28) -#define PM3LocalMemTimings 0x1020 -#define PM3LocalMemControl 0x1028 -#define PM3LocalMemRefresh 0x1030 -#define PM3LocalMemPowerDown 0x1038 -#define PM3RemoteMemControl 0x1100 - -/********************************************** -* GLINT Permedia3 Video Control (0x3000) * -***********************************************/ - -#define PM3ScreenBase 0x3000 -#define PM3ScreenStride 0x3008 -#define PM3HTotal 0x3010 -#define PM3HgEnd 0x3018 -#define PM3HbEnd 0x3020 -#define PM3HsStart 0x3028 -#define PM3HsEnd 0x3030 -#define PM3VTotal 0x3038 -#define PM3VbEnd 0x3040 -#define PM3VsStart 0x3048 -#define PM3VsEnd 0x3050 -#define PM3VideoControl 0x3058 - #define PM3VideoControl_DISABLE (0<<0) - #define PM3VideoControl_ENABLE (1<<0) - #define PM3VideoControl_BLANK_ACTIVE_HIGH (0<<1) - #define PM3VideoControl_BLANK_ACTIVE_LOW (1<<1) - #define PM3VideoControl_LINE_DOUBLE_OFF (0<<2) - #define PM3VideoControl_LINE_DOUBLE_ON (1<<2) - #define PM3VideoControl_HSYNC_FORCE_HIGH (0<<3) - #define PM3VideoControl_HSYNC_ACTIVE_HIGH (1<<3) - #define PM3VideoControl_HSYNC_FORCE_LOW (2<<3) - #define PM3VideoControl_HSYNC_ACTIVE_LOW (3<<3) - #define PM3VideoControl_VSYNC_FORCE_HIGH (0<<5) - #define PM3VideoControl_VSYNC_ACTIVE_HIGH (1<<5) - #define PM3VideoControl_VSYNC_FORCE_LOW (2<<5) - #define PM3VideoControl_VSYNC_ACTIVE_LOW (3<<5) - #define PM3VideoControl_BYTE_DOUBLE_OFF (0<<7) - #define PM3VideoControl_BYTE_DOUBLE_ON (1<<7) - #define PM3VideoControl_BUFFER_SWAP_SYNCON_FRAMEBLANK (0<<9) - #define PM3VideoControl_BUFFER_SWAP_FREE_RUNNING (1<<9) - #define PM3VideoControl_BUFFER_SWAP_LIMITETO_FRAMERATE (2<<9) - #define PM3VideoControl_STEREO_DISABLE (0<<11) - #define PM3VideoControl_STEREO_ENABLE (1<<11) - #define PM3VideoControl_RIGHT_EYE_ACTIVE_HIGH (0<<12) - #define PM3VideoControl_RIGHT_EYE_ACTIVE_LOW (1<<12) - #define PM3VideoControl_VIDEO_EXT_LOW (0<<14) - #define PM3VideoControl_VIDEO_EXT_HIGH (1<<14) - #define PM3VideoControl_SYNC_MODE_INDEPENDENT (0<<16) - #define PM3VideoControl_SYNC_MODE_SYNCTO_VSA (1<<16) - #define PM3VideoControl_SYNC_MODE_SYNCTO_VSB (2<<16) - #define PM3VideoControl_PATCH_DISABLE (0<<18) - #define PM3VideoControl_PATCH_ENABLE (1<<18) - #define PM3VideoControl_PIXELSIZE_8BIT (0<<19) - #define PM3VideoControl_PIXELSIZE_16BIT (1<<19) - #define PM3VideoControl_PIXELSIZE_32BIT (2<<19) - #define PM3VideoControl_DISPLAY_DISABLE (0<<21) - #define PM3VideoControl_DISPLAY_ENABLE (1<<21) - #define PM3VideoControl_PATCH_OFFSET_X(off) (((off)&0x3f)<<22) - #define PM3VideoControl_PATCH_OFFSET_Y(off) (((off)&0x3f)<<28) -#define PM3InterruptLine 0x3060 -#define PM3DisplayData 0x3068 -#define PM3VerticalLineCount 0x3070 -#define PM3FifoControl 0x3078 -#define PM3ScreenBaseRight 0x3080 -#define PM3MiscControl 0x3088 - -#define PM3VideoOverlayUpdate 0x3100 - #define PM3VideoOverlayUpdate_DISABLE (0<<0) - #define PM3VideoOverlayUpdate_ENABLE (1<<0) -#define PM3VideoOverlayMode 0x3108 - #define PM3VideoOverlayMode_DISABLE (0<<0) - #define PM3VideoOverlayMode_ENABLE (1<<0) - #define PM3VideoOverlayMode_BUFFERSYNC_MANUAL (0<<1) - #define PM3VideoOverlayMode_BUFFERSYNC_VIDEOSTREAMA (1<<1) - #define PM3VideoOverlayMode_BUFFERSYNC_VIDEOSTREAMB (2<<1) - #define PM3VideoOverlayMode_FIELDPOLARITY_NORMAL (0<<4) - #define PM3VideoOverlayMode_FIELDPOLARITY_INVERT (1<<4) - #define PM3VideoOverlayMode_PIXELSIZE_8BIT (0<<5) - #define PM3VideoOverlayMode_PIXELSIZE_16BIT (1<<5) - #define PM3VideoOverlayMode_PIXELSIZE_32BIT (2<<5) - #define PM3VideoOverlayMode_COLORFORMAT_RGB8888 ((0<<7)|(1<<12)|(2<<5)) - #define PM3VideoOverlayMode_COLORFORMAT_RGB4444 ((1<<7)|(1<<12)|(1<<5)) - #define PM3VideoOverlayMode_COLORFORMAT_RGB5551 ((2<<7)|(1<<12)|(1<<5)) - #define PM3VideoOverlayMode_COLORFORMAT_RGB565 ((3<<7)|(1<<12)|(1<<5)) - #define PM3VideoOverlayMode_COLORFORMAT_RGB332 ((4<<7)|(1<<12)|(0<<5)) - #define PM3VideoOverlayMode_COLORFORMAT_BGR8888 ((0<<7)|(2<<5)) - #define PM3VideoOverlayMode_COLORFORMAT_BGR4444 ((1<<7)|(1<<5)) - #define PM3VideoOverlayMode_COLORFORMAT_BGR5551 ((2<<7)|(1<<5)) - #define PM3VideoOverlayMode_COLORFORMAT_BGR565 ((3<<7)|(1<<5)) - #define PM3VideoOverlayMode_COLORFORMAT_BGR332 ((4<<7)|(0<<5)) - #define PM3VideoOverlayMode_COLORFORMAT_CI8 ((5<<7)|(1<<12)|(0<<5)) - #define PM3VideoOverlayMode_COLORFORMAT_VUY444 ((2<<10)|(1<<12)|(2<<5)) - #define PM3VideoOverlayMode_COLORFORMAT_YUV444 ((2<<10)|(2<<5)) - #define PM3VideoOverlayMode_COLORFORMAT_VUY422 ((1<<10)|(1<<12)|(1<<5)) - #define PM3VideoOverlayMode_COLORFORMAT_YUV422 ((1<<10)|(1<<5)) - #define PM3VideoOverlayMode_COLORORDER_BGR (0<<12) - #define PM3VideoOverlayMode_COLORORDER_RGB (1<<12) - #define PM3VideoOverlayMode_LINEARCOLOREXT_OFF (0<<13) - #define PM3VideoOverlayMode_LINEARCOLOREXT_ON (1<<13) - #define PM3VideoOverlayMode_FILTER_MASK (3<<14) - #define PM3VideoOverlayMode_FILTER_OFF (0<<14) - #define PM3VideoOverlayMode_FILTER_FULL (1<<14) - #define PM3VideoOverlayMode_FILTER_PARTIAL (2<<14) - #define PM3VideoOverlayMode_DEINTERLACE_OFF (0<<16) - #define PM3VideoOverlayMode_DEINTERLACE_BOB (1<<16) - #define PM3VideoOverlayMode_PATCHMODE_OFF (0<<18) - #define PM3VideoOverlayMode_PATCHMODE_ON (1<<18) - #define PM3VideoOverlayMode_FLIP_VIDEO (0<<20) - #define PM3VideoOverlayMode_FLIP_VIDEOSTREAMA (1<<20) - #define PM3VideoOverlayMode_FLIP_VIDEOSTREAMB (2<<20) - #define PM3VideoOverlayMode_MIRROR_MASK (3<<23) - #define PM3VideoOverlayMode_MIRRORX_OFF (0<<23) - #define PM3VideoOverlayMode_MIRRORX_ON (1<<23) - #define PM3VideoOverlayMode_MIRRORY_OFF (0<<24) - #define PM3VideoOverlayMode_MIRRORY_ON (1<<24) -#define PM3VideoOverlayFifoControl 0x3110 -#define PM3VideoOverlayIndex 0x3118 -#define PM3VideoOverlayBase 0x3120 -#define PM3VideoOverlayBase0 0x3120 -#define PM3VideoOverlayBase1 0x3128 -#define PM3VideoOverlayBase2 0x3130 -#define PM3VideoOverlayStride 0x3138 - #define PM3VideoOverlayStride_STRIDE(s) (((s)&0xfff)<<0) -#define PM3VideoOverlayWidth 0x3140 - #define PM3VideoOverlayWidth_WIDTH(w) (((w)&0xfff)<<0) -#define PM3VideoOverlayHeight 0x3148 - #define PM3VideoOverlayHeight_HEIGHT(h) (((h)&0xfff)<<0) -#define PM3VideoOverlayOrigin 0x3150 - #define PM3VideoOverlayOrigin_XORIGIN(x) (((x)&0xfff)<<0) - #define PM3VideoOverlayOrigin_YORIGIN(y) (((y)&0xfff)<<16) -#define PM3VideoOverlayShrinkXDelta 0x3158 - #define PM3VideoOverlayShrinkXDelta_NONE (1<<16) - #define PM3VideoOverlayShrinkXDelta_DELTA(s,d) \ - ((((s)<<16)/(d))&0x0ffffff0) -#define PM3VideoOverlayZoomXDelta 0x3160 - #define PM3VideoOverlayZoomXDelta_NONE (1<<16) - #define PM3VideoOverlayZoomXDelta_DELTA(s,d) \ - ((((s)<<16)/(d))&0x0001fff0) -#define PM3VideoOverlayYDelta 0x3168 - #define PM3VideoOverlayYDelta_NONE (1<<16) - #define PM3VideoOverlayYDelta_DELTA(s,d) \ - ((((s)<<16)/(d))&0x0ffffff0) -#define PM3VideoOverlayFieldOffset 0x3170 -#define PM3VideoOverlayStatus 0x3178 - -/********************************************** -* GLINT Permedia3 RAMDAC Registers (0x4000) * -***********************************************/ -/* Direct Registers */ -#define PM3RD_PaletteWriteAddress 0x4000 -#define PM3RD_PaletteData 0x4008 -#define PM3RD_PixelMask 0x4010 -#define PM3RD_PaletteReadAddress 0x4018 - -#define PM3RD_IndexLow 0x4020 -#define PM3RD_IndexHigh 0x4028 -#define PM3RD_IndexedData 0x4030 -#define PM3RD_IndexControl 0x4038 - #define PM3RD_IndexControl_AUTOINCREMENT_ENABLE (1<<0) - #define PM3RD_IndexControl_AUTOINCREMENT_DISABLE (0<<0) - -/* Indirect Registers */ -#define PM3RD_MiscControl 0x000 - #define PM3RD_MiscControl_HIGHCOLOR_RES_DISABLE (0<<0) - #define PM3RD_MiscControl_HIGHCOLOR_RES_ENABLE (1<<0) - #define PM3RD_MiscControl_PIXELDOUBLE_DISABLE (0<<1) - #define PM3RD_MiscControl_PIXELDOUBLE_ENABLE (1<<1) - #define PM3RD_MiscControl_LASTREAD_ADDR_DISABLE (0<<2) - #define PM3RD_MiscControl_LASTREAD_ADDR_ENABLE (1<<2) - #define PM3RD_MiscControl_DIRECTCOLOR_DISABLE (0<<3) - #define PM3RD_MiscControl_DIRECTCOLOR_ENABLE (1<<3) - #define PM3RD_MiscControl_OVERLAY_DISABLE (0<<4) - #define PM3RD_MiscControl_OVERLAY_ENABLE (1<<4) - #define PM3RD_MiscControl_PIXELDOUBLE_BUFFER_DISABLE (0<<5) - #define PM3RD_MiscControl_PIXELDOUBLE_BUFFER_ENABLE (1<<5) - #define PM3RD_MiscControl_VSB_OUTPUT_DISABLE (0<<6) - #define PM3RD_MiscControl_VSB_OUTPUT_ENABLE (1<<6) - #define PM3RD_MiscControl_STEREODOUBLE_BUFFER_DISABLE (0<<7) - #define PM3RD_MiscControl_STEREODOUBLE_BUFFER_ENABLE (1<<7) -#define PM3RD_SyncControl 0x001 - #define PM3RD_SyncControl_HSYNC_ACTIVE_LOW (0<<0) - #define PM3RD_SyncControl_HSYNC_ACTIVE_HIGH (1<<0) - #define PM3RD_SyncControl_HSYNC_FORCE_ACTIVE (3<<0) - #define PM3RD_SyncControl_HSYNC_FORCE_INACTIVE (4<<0) - #define PM3RD_SyncControl_HSYNC_TRI_STATE (2<<0) - #define PM3RD_SyncControl_VSYNC_ACTIVE_LOW (0<<3) - #define PM3RD_SyncControl_VSYNC_ACTIVE_HIGH (1<<3) - #define PM3RD_SyncControl_VSYNC_TRI_STATE (2<<3) - #define PM3RD_SyncControl_VSYNC_FORCE_ACTIVE (3<<3) - #define PM3RD_SyncControl_VSYNC_FORCE_INACTIVE (4<<3) - #define PM3RD_SyncControl_HSYNC_OVERRIDE_SETBY_HSYNC (0<<6) - #define PM3RD_SyncControl_HSYNC_OVERRIDE_FORCE_HIGH (1<<6) - #define PM3RD_SyncControl_VSYNC_OVERRIDE_SETBY_VSYNC (0<<7) - #define PM3RD_SyncControl_VSYNC_OVERRIDE_FORCE_HIGH (1<<7) -#define PM3RD_DACControl 0x002 - #define PM3RD_DACControl_DAC_POWER_ON (0<<0) - #define PM3RD_DACControl_DAC_POWER_OFF (1<<0) - #define PM3RD_DACControl_SYNC_ON_GREEN_DISABLE (0<<3) - #define PM3RD_DACControl_SYNC_ON_GREEN_ENABLE (1<<3) - #define PM3RD_DACControl_BLANK_RED_DAC_DISABLE (0<<4) - #define PM3RD_DACControl_BLANK_RED_DAC_ENABLE (1<<4) - #define PM3RD_DACControl_BLANK_GREEN_DAC_DISABLE (0<<5) - #define PM3RD_DACControl_BLANK_GREEN_DAC_ENABLE (1<<5) - #define PM3RD_DACControl_BLANK_BLUE_DAC_DISABLE (0<<6) - #define PM3RD_DACControl_BLANK_BLUE_DAC_ENABLE (1<<6) - #define PM3RD_DACControl_BLANK_PEDESTAL_DISABLE (0<<7) - #define PM3RD_DACControl_BLANK_PEDESTAL_ENABLE (1<<7) -#define PM3RD_PixelSize 0x003 - #define PM3RD_PixelSize_24_BIT_PIXELS (4<<0) - #define PM3RD_PixelSize_32_BIT_PIXELS (2<<0) - #define PM3RD_PixelSize_16_BIT_PIXELS (1<<0) - #define PM3RD_PixelSize_8_BIT_PIXELS (0<<0) -#define PM3RD_ColorFormat 0x004 - #define PM3RD_ColorFormat_LINEAR_COLOR_EXT_ENABLE (1<<6) - #define PM3RD_ColorFormat_LINEAR_COLOR_EXT_DISABLE (0<<6) - #define PM3RD_ColorFormat_COLOR_ORDER_BLUE_LOW (1<<5) - #define PM3RD_ColorFormat_COLOR_ORDER_RED_LOW (0<<5) - #define PM3RD_ColorFormat_COLOR_FORMAT_MASK (0x1f<<0) - #define PM3RD_ColorFormat_8888_COLOR (0<<0) - #define PM3RD_ColorFormat_5551_FRONT_COLOR (1<<0) - #define PM3RD_ColorFormat_4444_COLOR (2<<0) - #define PM3RD_ColorFormat_332_FRONT_COLOR (5<<0) - #define PM3RD_ColorFormat_332_BACK_COLOR (6<<0) - #define PM3RD_ColorFormat_2321_FRONT_COLOR (9<<0) - #define PM3RD_ColorFormat_2321_BACK_COLOR (10<<0) - #define PM3RD_ColorFormat_232_FRONTOFF_COLOR (11<<0) - #define PM3RD_ColorFormat_232_BACKOFF_COLOR (12<<0) - #define PM3RD_ColorFormat_5551_BACK_COLOR (13<<0) - #define PM3RD_ColorFormat_CI8_COLOR (14<<0) - #define PM3RD_ColorFormat_565_FRONT_COLOR (16<<0) - #define PM3RD_ColorFormat_565_BACK_COLOR (17<<0) -#define PM3RD_CursorMode 0x005 - #define PM3RD_CursorMode_CURSOR_DISABLE (0<<0) - #define PM3RD_CursorMode_CURSOR_ENABLE (1<<0) - #define PM3RD_CursorMode_FORMAT_64x64_2BPE_P0123 (0<<2) - #define PM3RD_CursorMode_FORMAT_32x32_2BPE_P0 (1<<2) - #define PM3RD_CursorMode_FORMAT_32x32_2BPE_P1 (2<<2) - #define PM3RD_CursorMode_FORMAT_32x32_2BPE_P2 (3<<2) - #define PM3RD_CursorMode_FORMAT_32x32_2BPE_P3 (4<<2) - #define PM3RD_CursorMode_FORMAT_32x32_4BPE_P01 (5<<2) - #define PM3RD_CursorMode_FORMAT_32x32_4BPE_P23 (6<<2) - #define PM3RD_CursorMode_TYPE_MS (0<<4) - #define PM3RD_CursorMode_TYPE_X (1<<4) - #define PM3RD_CursorMode_REVERSE_PIXEL_ORDER_DISABLE (0<<6) - #define PM3RD_CursorMode_REVERSE_PIXEL_ORDER_ENABLE (1<<6) - #define PM3RD_CursorMode_REVERSE_PIXEL_ORDER_3_COLOR (2<<6) - #define PM3RD_CursorMode_REVERSE_PIXEL_ORDER_15_COLOR (3<<6) -#define PM3RD_CursorControl 0x006 - #define PM3RD_CursorControl_DOUBLE_X_DISABLED (0<<0) - #define PM3RD_CursorControl_DOUBLE_X_ENABLED (1<<0) - #define PM3RD_CursorControl_DOUBLE_Y_DISABLED (0<<1) - #define PM3RD_CursorControl_DOUBLE_Y_ENABLED (1<<1) - #define PM3RD_CursorControl_READBACK_POS_DISABLED (0<<2) - #define PM3RD_CursorControl_READBACK_POS_ENABLED (1<<2) - -#define PM3RD_CursorXLow 0x007 -#define PM3RD_CursorXHigh 0x008 -#define PM3RD_CursorYLow 0x009 -#define PM3RD_CursorYHigh 0x00a -#define PM3RD_CursorHotSpotX 0x00b -#define PM3RD_CursorHotSpotY 0x00c -#define PM3RD_OverlayKey 0x00d -#define PM3RD_Pan 0x00e - #define PM3RD_Pan_DISABLE (0<<0) - #define PM3RD_Pan_ENABLE (1<<0) - #define PM3RD_Pan_GATE_DISABLE (0<<1) - #define PM3RD_Pan_GATE_ENABLE (1<<1) -#define PM3RD_Sense 0x00f - -#define PM3RD_CheckControl 0x018 - #define PM3RD_CheckControl_PIXEL_DISABLED (0<<0) - #define PM3RD_CheckControl_PIXEL_ENABLED (1<<0) - #define PM3RD_CheckControl_LUT_DISABLED (0<<1) - #define PM3RD_CheckControl_LUT_ENABLED (1<<1) -#define PM3RD_CheckPixelRed 0x019 -#define PM3RD_CheckPixelGreen 0x01a -#define PM3RD_CheckPixelBlue 0x01b -#define PM3RD_CheckLUTRed 0x01c -#define PM3RD_CheckLUTGreen 0x01d -#define PM3RD_CheckLUTBlue 0x01e -#define PM3RD_Scratch 0x01f - -#define PM3RD_VideoOverlayControl 0x020 - #define PM3RD_VideoOverlayControl_DISABLE (0<<0) - #define PM3RD_VideoOverlayControl_ENABLE (1<<0) - #define PM3RD_VideoOverlayControl_MODE_MASK (3<<1) - #define PM3RD_VideoOverlayControl_MODE_MAINKEY (0<<1) - #define PM3RD_VideoOverlayControl_MODE_OVERLAYKEY (1<<1) - #define PM3RD_VideoOverlayControl_MODE_ALWAYS (2<<1) - #define PM3RD_VideoOverlayControl_MODE_BLEND (3<<1) - #define PM3RD_VideoOverlayControl_DIRECTCOLOR_DISABLED (0<<3) - #define PM3RD_VideoOverlayControl_DIRECTCOLOR_ENABLED (1<<3) - #define PM3RD_VideoOverlayControl_BLENDSRC_MAIN (0<<4) - #define PM3RD_VideoOverlayControl_BLENDSRC_REGISTER (1<<4) - #define PM3RD_VideoOverlayControl_KEY_COLOR (0<<5) - #define PM3RD_VideoOverlayControl_KEY_ALPHA (1<<5) -#define PM3RD_VideoOverlayXStartLow 0x021 -#define PM3RD_VideoOverlayXStartHigh 0x022 -#define PM3RD_VideoOverlayYStartLow 0x023 -#define PM3RD_VideoOverlayYStartHigh 0x024 -#define PM3RD_VideoOverlayXEndLow 0x025 -#define PM3RD_VideoOverlayXEndHigh 0x026 -#define PM3RD_VideoOverlayYEndLow 0x027 -#define PM3RD_VideoOverlayYEndHigh 0x028 -#define PM3RD_VideoOverlayKeyR 0x029 -#define PM3RD_VideoOverlayKeyG 0x02a -#define PM3RD_VideoOverlayKeyB 0x02b -#define PM3RD_VideoOverlayBlend 0x02c - #define PM3RD_VideoOverlayBlend_FACTOR_0_PERCENT (0<<6) - #define PM3RD_VideoOverlayBlend_FACTOR_25_PERCENT (1<<6) - #define PM3RD_VideoOverlayBlend_FACTOR_75_PERCENT (2<<6) - #define PM3RD_VideoOverlayBlend_FACTOR_100_PERCENT (3<<6) - -#define PM3RD_DClkSetup1 0x1f0 -#define PM3RD_DClkSetup2 0x1f1 -#define PM3RD_KClkSetup1 0x1f2 -#define PM3RD_KClkSetup2 0x1f3 - -#define PM3RD_DClkControl 0x200 - #define PM3RD_DClkControl_SOURCE_PLL (0<<4) - #define PM3RD_DClkControl_SOURCE_VSA (1<<4) - #define PM3RD_DClkControl_SOURCE_VSB (2<<4) - #define PM3RD_DClkControl_SOURCE_EXT (3<<4) - #define PM3RD_DClkControl_STATE_RUN (2<<2) - #define PM3RD_DClkControl_STATE_HIGH (1<<2) - #define PM3RD_DClkControl_STATE_LOW (0<<2) - #define PM3RD_DClkControl_LOCKED (1<<1) - #define PM3RD_DClkControl_NOT_LOCKED (0<<1) - #define PM3RD_DClkControl_ENABLE (1<<0) - #define PM3RD_DClkControl_DISABLE (0<<0) -#define PM3RD_DClk0PreScale 0x201 -#define PM3RD_DClk0FeedbackScale 0x202 -#define PM3RD_DClk0PostScale 0x203 -#define PM3RD_DClk1PreScale 0x204 -#define PM3RD_DClk1FeedbackScale 0x205 -#define PM3RD_DClk1PostScale 0x206 -#define PM3RD_DClk2PreScale 0x207 -#define PM3RD_DClk2FeedbackScale 0x208 -#define PM3RD_DClk2PostScale 0x209 -#define PM3RD_DClk3PreScale 0x20a -#define PM3RD_DClk3FeedbackScale 0x20b -#define PM3RD_DClk3PostScale 0x20c -#define PM3RD_KClkControl 0x20d - #define PM3RD_KClkControl_DISABLE (0<<0) - #define PM3RD_KClkControl_ENABLE (1<<0) - #define PM3RD_KClkControl_NOT_LOCKED (0<<1) - #define PM3RD_KClkControl_LOCKED (1<<1) - #define PM3RD_KClkControl_STATE_LOW (0<<2) - #define PM3RD_KClkControl_STATE_HIGH (1<<2) - #define PM3RD_KClkControl_STATE_RUN (2<<2) - #define PM3RD_KClkControl_STATE_LOW_POWER (3<<2) - #define PM3RD_KClkControl_SOURCE_PCLK (0<<4) - #define PM3RD_KClkControl_SOURCE_HALF_PCLK (1<<4) - #define PM3RD_KClkControl_SOURCE_PLL (2<<4) -#define PM3RD_KClkPreScale 0x20e -#define PM3RD_KClkFeedbackScale 0x20f -#define PM3RD_KClkPostScale 0x210 -#define PM3RD_MClkControl 0x211 - #define PM3RD_MClkControl_DISABLE (0<<0) - #define PM3RD_MClkControl_ENABLE (1<<0) - #define PM3RD_MClkControl_NOT_LOCKED (0<<1) - #define PM3RD_MClkControl_LOCKED (1<<1) - #define PM3RD_MClkControl_STATE_LOW (0<<2) - #define PM3RD_MClkControl_STATE_HIGH (1<<2) - #define PM3RD_MClkControl_STATE_RUN (2<<2) - #define PM3RD_MClkControl_STATE_LOW_POWER (3<<2) - #define PM3RD_MClkControl_SOURCE_PCLK (0<<4) - #define PM3RD_MClkControl_SOURCE_HALF_PCLK (1<<4) - #define PM3RD_MClkControl_SOURCE_HALF_EXT (3<<4) - #define PM3RD_MClkControl_SOURCE_EXT (4<<4) - #define PM3RD_MClkControl_SOURCE_HALF_KCLK (5<<4) - #define PM3RD_MClkControl_SOURCE_KCLK (6<<4) -#define PM3RD_MClkPreScale 0x212 -#define PM3RD_MClkFeedbackScale 0x213 -#define PM3RD_MClkPostScale 0x214 -#define PM3RD_SClkControl 0x215 - #define PM3RD_SClkControl_DISABLE (0<<0) - #define PM3RD_SClkControl_ENABLE (1<<0) - #define PM3RD_SClkControl_NOT_LOCKED (0<<1) - #define PM3RD_SClkControl_LOCKED (1<<1) - #define PM3RD_SClkControl_STATE_LOW (0<<2) - #define PM3RD_SClkControl_STATE_HIGH (1<<2) - #define PM3RD_SClkControl_STATE_RUN (2<<2) - #define PM3RD_SClkControl_STATE_LOW_POWER (3<<2) - #define PM3RD_SClkControl_SOURCE_PCLK (0<<4) - #define PM3RD_SClkControl_SOURCE_HALF_PCLK (1<<4) - #define PM3RD_SClkControl_SOURCE_HALF_EXT (3<<4) - #define PM3RD_SClkControl_SOURCE_EXT (4<<4) - #define PM3RD_SClkControl_SOURCE_HALF_KCLK (5<<4) - #define PM3RD_SClkControl_SOURCE_KCLK (6<<4) -#define PM3RD_SClkPreScale 0x216 -#define PM3RD_SClkFeedbackScale 0x217 -#define PM3RD_SClkPostScale 0x218 - -#define PM3RD_CursorPalette(p) (0x303+(p)) -#define PM3RD_CursorPattern(p) (0x400+(p)) -/****************************************************** -* GLINT Permedia3 Video Streaming Registers (0x5000) * -*******************************************************/ - -#define PM3VSConfiguration 0x5800 - -/********************************************** -* GLINT Permedia3 Core Registers (0x8000+) * -***********************************************/ -#define PM3AALineWidth 0x94c0 -#define PM3AAPointsize 0x94a0 -#define PM3AlphaBlendAlphaMode 0xafa8 -#define PM3AlphaBlendAlphaModeAnd 0xad30 -#define PM3AlphaBlendAlphaModeOr 0xad38 -#define PM3AlphaBlendColorMode 0xafa0 -#define PM3AlphaBlendColorModeAnd 0xacb0 -#define PM3AlphaBlendColorModeOr 0xacb8 -#define PM3AlphaDestColor 0xaf88 -#define PM3AlphaSourceColor 0xaf80 -#define PM3AlphaTestMode 0x8800 -#define PM3AlphaTestModeAnd 0xabf0 -#define PM3AlphaTestModeOr 0xabf8 -#define PM3AntialiasMode 0x8808 -#define PM3AntialiasModeAnd 0xac00 -#define PM3AntialiasModeOr 0xac08 -#define PM3AreaStippleMode 0x81a0 -/* ... */ -#define PM3BackgroundColor 0xb0c8 -#define PM3BasePageOfWorkingSet 0xb4c8 -/* ... */ -#define PM3ChromaTestMode 0x8f18 -/* ... */ -#define PM3ColorDDAMode 0x87e0 -#define PM3ColorDDAModeAnd 0xabe0 -#define PM3ColorDDAModeOr 0xabe8 -#define PM3CommandInterrupt 0xa990 -#define PM3ConstantColorDDA 0xafb0 - #define PM3ConstantColorDDA_R(r) ((r)&0xff) - #define PM3ConstantColorDDA_G(g) (((g)&0xff)<<8) - #define PM3ConstantColorDDA_B(b) (((b)&0xff)<<16) - #define PM3ConstantColorDDA_A(a) (((a)&0xff)<<24) -#define PM3ContextData 0x8dd0 -#define PM3ContextDump 0x8dc0 -#define PM3ContextRestore 0x8dc8 -#define PM3Continue 0x8058 -#define PM3ContinueNewDom 0x8048 -#define PM3ContinueNewLine 0x8040 -#define PM3ContinueNewSub 0x8050 -#define PM3Count 0x8030 -/* ... */ -#define PM3DeltaControl 0x9350 -#define PM3DeltaControlAnd 0xab20 -#define PM3DeltaControlOr 0xab28 -#define PM3DeltaMode 0x9300 -#define PM3DeltaModeAnd 0xaad0 -#define PM3DeltaModeOr 0xaad8 - -#define PM3DepthMode 0x89a0 -/* ... */ -#define PM3DitherMode 0x8818 -#define PM3DitherModeAnd 0xacd0 -#define PM3DitherModeOr 0xacd8 -/* ... */ -#define PM3DMARectangleRead 0xa9a8 - #define PM3DMARectangleRead_Width(w) (w&0xfff) - #define PM3DMARectangleRead_Height(h) ((h&0xfff)<<12) - #define PM3DMARectangleRead_PixelSize(s) ((s&0x3)<<24) - #define PM3DMARectangleRead_Pack (1<<26) - #define PM3DMARectangleRead_ByteSwap(b) ((b&0x3)<<27) - #define PM3DMARectangleRead_Alignment (1<<30) -#define PM3DMARectangleReadAddress 0xa9b0 -#define PM3DMARectangleReadLinePitch 0xa9b8 -#define PM3DMARectangleReadTarget 0xa9c0 -/* ... */ -#define PM3DownloadAddress 0xb0d0 -#define PM3DownloadData 0xb0d8 -/* ... */ -#define PM3dBdx 0x87b8 -#define PM3dBdyDom 0x87c0 -#define PM3dGdx 0x87a0 -#define PM3dGdyDom 0x87a8 -#define PM3dQdx 0x83c0 -#define PM3dQdyDom 0x83c8 -#define PM3dRdx 0x8788 -#define PM3dRdyDom 0x8790 -#define PM3dSdx 0x8390 -#define PM3dSdy 0x83d8 -#define PM3dSdyDom 0x8398 -#define PM3dTdx 0x83a8 -#define PM3dTdy 0x83e0 -#define PM3dTdyDom 0x83b0 -#define PM3dXDom 0x8008 -#define PM3dXSub 0x8018 -#define PM3dY 0x8028 -/* ... */ -#define PM3FBBlockColor 0x8ac8 -#define PM3FBBlockColor0 0xb060 -#define PM3FBBlockColor1 0xb068 -#define PM3FBBlockColor2 0xb070 -#define PM3FBBlockColor3 0xb078 -#define PM3FBBlockColorBack 0xb0a0 -#define PM3FBBlockColorBack0 0xb080 -#define PM3FBBlockColorBack1 0xb088 -#define PM3FBBlockColorBack2 0xb090 -#define PM3FBBlockColorBack3 0xb098 -#define PM3FBColor 0x8a98 -#define PM3FBDestReadBufferAddr0 0xae80 -#define PM3FBDestReadBufferAddr1 0xae88 -#define PM3FBDestReadBufferAddr2 0xae90 -#define PM3FBDestReadBufferAddr3 0xae98 -#define PM3FBDestReadBufferOffset0 0xaea0 -#define PM3FBDestReadBufferOffset1 0xaea8 -#define PM3FBDestReadBufferOffset2 0xaeb0 -#define PM3FBDestReadBufferOffset3 0xaeb8 - #define PM3FBDestReadBufferOffset_XOffset(x) ((x)&0xffff) - #define PM3FBDestReadBufferOffset_YOffset(y) (((y)&0xffff)<<16) -#define PM3FBDestReadBufferWidth0 0xaec0 -#define PM3FBDestReadBufferWidth1 0xaec8 -#define PM3FBDestReadBufferWidth2 0xaed0 -#define PM3FBDestReadBufferWidth3 0xaed8 - #define PM3FBDestReadBufferWidth_Width(w) ((w)&0x0fff) - -#define PM3FBDestReadEnables 0xaee8 -#define PM3FBDestReadEnablesAnd 0xad20 -#define PM3FBDestReadEnablesOr 0xad28 - #define PM3FBDestReadEnables_E(e) ((e)&0xff) - #define PM3FBDestReadEnables_E0 (1<<0) - #define PM3FBDestReadEnables_E1 (1<<1) - #define PM3FBDestReadEnables_E2 (1<<2) - #define PM3FBDestReadEnables_E3 (1<<3) - #define PM3FBDestReadEnables_E4 (1<<4) - #define PM3FBDestReadEnables_E5 (1<<5) - #define PM3FBDestReadEnables_E6 (1<<6) - #define PM3FBDestReadEnables_E7 (1<<7) - #define PM3FBDestReadEnables_R(r) (((r)&0xff)<<8) - #define PM3FBDestReadEnables_R0 (1<<8) - #define PM3FBDestReadEnables_R1 (1<<9) - #define PM3FBDestReadEnables_R2 (1<<10) - #define PM3FBDestReadEnables_R3 (1<<11) - #define PM3FBDestReadEnables_R4 (1<<12) - #define PM3FBDestReadEnables_R5 (1<<13) - #define PM3FBDestReadEnables_R6 (1<<14) - #define PM3FBDestReadEnables_R7 (1<<15) - #define PM3FBDestReadEnables_ReferenceAlpha(a) (((a)&0xff)<<24) - -#define PM3FBDestReadMode 0xaee0 -#define PM3FBDestReadModeAnd 0xac90 -#define PM3FBDestReadModeOr 0xac98 - #define PM3FBDestReadMode_ReadDisable (0<<0) - #define PM3FBDestReadMode_ReadEnable (1<<0) - #define PM3FBDestReadMode_StripePitch(sp) (((sp)&0x7)<<2) - #define PM3FBDestReadMode_StripeHeight(sh) (((sh)&0x7)<<7) - #define PM3FBDestReadMode_Enable0 (1<<8) - #define PM3FBDestReadMode_Enable1 (1<<9) - #define PM3FBDestReadMode_Enable2 (1<<10) - #define PM3FBDestReadMode_Enable3 (1<<11) - #define PM3FBDestReadMode_Layout0(l) (((l)&0x3)<<12) - #define PM3FBDestReadMode_Layout1(l) (((l)&0x3)<<14) - #define PM3FBDestReadMode_Layout2(l) (((l)&0x3)<<16) - #define PM3FBDestReadMode_Layout3(l) (((l)&0x3)<<18) - #define PM3FBDestReadMode_Origin0 (1<<20) - #define PM3FBDestReadMode_Origin1 (1<<21) - #define PM3FBDestReadMode_Origin2 (1<<22) - #define PM3FBDestReadMode_Origin3 (1<<23) - #define PM3FBDestReadMode_Blocking (1<<24) - #define PM3FBDestReadMode_UseReadEnabled (1<<26) - #define PM3FBDestReadMode_AlphaFiltering (1<<27) - -#define PM3FBHardwareWriteMask 0x8ac0 -#define PM3FBSoftwareWriteMask 0x8820 -#define PM3FBData 0x8aa0 -#define PM3FBSourceData 0x8aa8 -#define PM3FBSourceReadBufferAddr 0xaf08 -#define PM3FBSourceReadBufferOffset 0xaf10 - #define PM3FBSourceReadBufferOffset_XOffset(x) ((x)&0xffff) - #define PM3FBSourceReadBufferOffset_YOffset(y) (((y)&0xffff)<<16) -#define PM3FBSourceReadBufferWidth 0xaf18 - #define PM3FBSourceReadBufferWidth_Width(w) ((w)&0x0fff) -#define PM3FBSourceReadMode 0xaf00 -#define PM3FBSourceReadModeAnd 0xaca0 -#define PM3FBSourceReadModeOr 0xaca8 - #define PM3FBSourceReadMode_ReadDisable (0<<0) - #define PM3FBSourceReadMode_ReadEnable (1<<0) - #define PM3FBSourceReadMode_StripePitch(sp) (((sp)&0x7)<<2) - #define PM3FBSourceReadMode_StripeHeight(sh) (((sh)&0x7)<<7) - #define PM3FBSourceReadMode_Layout(l) (((l)&0x3)<<8) - #define PM3FBSourceReadMode_Origin (1<<10) - #define PM3FBSourceReadMode_Blocking (1<<11) - #define PM3FBSourceReadMode_UseTexelCoord (1<<13) - #define PM3FBSourceReadMode_WrapXEnable (1<<14) - #define PM3FBSourceReadMode_WrapYEnable (1<<15) - #define PM3FBSourceReadMode_WrapX(w) (((w)&0xf)<<16) - #define PM3FBSourceReadMode_WrapY(w) (((w)&0xf)<<20) - #define PM3FBSourceReadMode_ExternalSourceData (1<<24) -#define PM3FBWriteBufferAddr0 0xb000 -#define PM3FBWriteBufferAddr1 0xb008 -#define PM3FBWriteBufferAddr2 0xb010 -#define PM3FBWriteBufferAddr3 0xb018 - -#define PM3FBWriteBufferOffset0 0xb020 -#define PM3FBWriteBufferOffset1 0xb028 -#define PM3FBWriteBufferOffset2 0xb030 -#define PM3FBWriteBufferOffset3 0xb038 - #define PM3FBWriteBufferOffset_XOffset(x) ((x)&0xffff) - #define PM3FBWriteBufferOffset_YOffset(y) (((y)&0xffff)<<16) - -#define PM3FBWriteBufferWidth0 0xb040 -#define PM3FBWriteBufferWidth1 0xb048 -#define PM3FBWriteBufferWidth2 0xb050 -#define PM3FBWriteBufferWidth3 0xb058 - #define PM3FBWriteBufferWidth_Width(w) ((w)&0x0fff) - -#define PM3FBWriteMode 0x8ab8 -#define PM3FBWriteModeAnd 0xacf0 -#define PM3FBWriteModeOr 0xacf8 - #define PM3FBWriteMode_WriteDisable 0<<0 - #define PM3FBWriteMode_WriteEnable 1<<0 - #define PM3FBWriteMode_Replicate 1<<4 - #define PM3FBWriteMode_OpaqueSpan 1<<5 - #define PM3FBWriteMode_StripePitch(p) (((p)&0x7)<<6) - #define PM3FBWriteMode_StripeHeight(h) (((h)&0x7)<<9) - #define PM3FBWriteMode_Enable0 1<<12 - #define PM3FBWriteMode_Enable1 1<<13 - #define PM3FBWriteMode_Enable2 1<<14 - #define PM3FBWriteMode_Enable3 1<<15 - #define PM3FBWriteMode_Layout0(l) (((l)&0x3)<<16) - #define PM3FBWriteMode_Layout1(l) (((l)&0x3)<<18) - #define PM3FBWriteMode_Layout2(l) (((l)&0x3)<<20) - #define PM3FBWriteMode_Layout3(l) (((l)&0x3)<<22) - #define PM3FBWriteMode_Origin0 1<<24 - #define PM3FBWriteMode_Origin1 1<<25 - #define PM3FBWriteMode_Origin2 1<<26 - #define PM3FBWriteMode_Origin3 1<<27 - -#define PM3FogMode 0x8690 -#define PM3ForegroundColor 0xb0c0 -/* ... */ -#define PM3GIDMode 0xb538 -#define PM3GIDModeAnd 0xb5b0 -#define PM3GIDModeOr 0xb5b8 -/* ... */ -#define PM3HeadPhysicalPageAllocation0 0xb480 -#define PM3HeadPhysicalPageAllocation1 0xb488 -#define PM3HeadPhysicalPageAllocation2 0xb490 -#define PM3HeadPhysicalPageAllocation3 0xb498 -/* ... */ -#define PM3LBDestReadBufferAddr 0xb510 -#define PM3LBDestReadBufferOffset 0xb518 -#define PM3LBDestReadEnables 0xb508 -#define PM3LBDestReadEnablesAnd 0xb590 -#define PM3LBDestReadEnablesOr 0xb598 -#define PM3LBDestReadMode 0xb500 -#define PM3LBDestReadModeAnd 0xb580 -#define PM3LBDestReadModeOr 0xb588 - #define PM3LBDestReadMode_Disable (0<<0) - #define PM3LBDestReadMode_Enable (1<<0) - #define PM3LBDestReadMode_StripePitch(p) (((p)&0x7)<<2) - #define PM3LBDestReadMode_StripeHeight(h) (((h)&0x7)<<5) - #define PM3LBDestReadMode_Layout (1<<8) - #define PM3LBDestReadMode_Origin (1<<9) - #define PM3LBDestReadMode_UserReadEnables (1<<10) - #define PM3LBDestReadMode_Packed16 (1<<11) - #define PM3LBDestReadMode_Width(w) (((w)&0xfff)<<12) -#define PM3LBReadFormat 0x8888 - #define PM3LBReadFormat_DepthWidth(w) (((w)&0x3)<<0) - #define PM3LBReadFormat_StencilWidth(w) (((w)&0xf)<<2) - #define PM3LBReadFormat_StencilPosition(p) (((p)&0x1f)<<6) - #define PM3LBReadFormat_FCPWidth(w) (((w)&0xf)<<11) - #define PM3LBReadFormat_FCPPosition(p) (((p)&0x1f)<<15) - #define PM3LBReadFormat_GIDWidth(w) (((w)&0x7)<<20) - #define PM3LBReadFormat_GIDPosition(p) (((p)&0x1f)<<23) -#define PM3LBSourceReadBufferAddr 0xb528 -#define PM3LBSourceReadBufferOffset 0xb530 -#define PM3LBSourceReadMode 0xb520 -#define PM3LBSourceReadModeAnd 0xb5a0 -#define PM3LBSourceReadModeOr 0xb5a8 - #define PM3LBSourceReadMode_Enable (1<<0) - #define PM3LBSourceReadMode_StripePitch(p) (((p)&0x7)<<2) - #define PM3LBSourceReadMode_StripeHeight(h) (((h)&0x7)<<5) - #define PM3LBSourceReadMode_Layout (1<<8) - #define PM3LBSourceReadMode_Origin (1<<9) - #define PM3LBSourceReadMode_Packed16 (1<<10) - #define PM3LBSourceReadMode_Width(w) (((w)&0xfff)<<11) -#define PM3LBStencil 0x88a8 -#define PM3LBWriteBufferAddr 0xb540 -#define PM3LBWriteBufferOffset 0xb548 -#define PM3LBWriteFormat 0x88c8 - #define PM3LBWriteFormat_DepthWidth(w) (((w)&0x3)<<0) - #define PM3LBWriteFormat_StencilWidth(w) (((w)&0xf)<<2) - #define PM3LBWriteFormat_StencilPosition(p) (((p)&0x1f)<<6) - #define PM3LBWriteFormat_GIDWidth(w) (((w)&0x7)<<20) - #define PM3LBWriteFormat_GIDPosition(p) (((p)&0x1f)<<23) -#define PM3LBWriteMode 0x88c0 -#define PM3LBWriteModeAnd 0xac80 -#define PM3LBWriteModeOr 0xac88 - #define PM3LBWriteMode_WriteDisable (0<<0) - #define PM3LBWriteMode_WriteEnable (1<<0) - #define PM3LBWriteMode_StripePitch(p) (((p)&0x7)<<3) - #define PM3LBWriteMode_StripeHeight(h) (((h)&0x7)<<6) - #define PM3LBWriteMode_Layout (1<<9) - #define PM3LBWriteMode_Origin (1<<10) - #define PM3LBWriteMode_Packed16 (1<<11) - #define PM3LBWriteMode_Width(w) (((w)&0xfff)<<12) -/* ... */ -#define PM3LineStippleMode 0x81a8 -#define PM3LineStippleModeAnd 0xabc0 -#define PM3LineStippleModeOr 0xabc8 -#define PM3LoadLineStippleCounters 0x81b0 -/* ... */ -#define PM3LogicalOpMode 0x8828 -#define PM3LogicalOpModeAnd 0xace0 -#define PM3LogicalOpModeOr 0xace8 - #define PM3LogicalOpMode_Disable (0<<0) - #define PM3LogicalOpMode_Enable (1<<0) - #define PM3LogicalOpMode_LogicOp(op) (((op)&0xf)<<1) - #define PM3LogicalOpMode_UseConstantWriteData_Disable (0<<5) - #define PM3LogicalOpMode_UseConstantWriteData_Enable (1<<5) - #define PM3LogicalOpMode_Background_Disable (0<<6) - #define PM3LogicalOpMode_Background_Enable (1<<6) - #define PM3LogicalOpMode_Background_LogicOp(op) (((op)&0xf)<<7) - #define PM3LogicalOpMode_UseConstantSource_Disable (0<<11) - #define PM3LogicalOpMode_UseConstantSource_Enable (1<<11) - -#define PM3LogicalTexturePageAddr 0xb4d0 -#define PM3LogicalTexturePageTableLength 0xb4d8 -/* ... */ -#define PM3LUT 0x8e80 -/* ... */ -#define PM3LUT 0x8e80 -#define PM3LUTAddress 0x84d0 -#define PM3LUTData 0x84c8 -#define PM3LUTIndex 0x84c0 -#define PM3LUTMode 0xb378 -#define PM3LUTModeAnd 0xad70 -#define PM3LUTModeOr 0xad78 -#define PM3LUTTransfer 0x84d8 -/* ... */ -#define PM3PhysicalPageAllocationTableAddr 0xb4c0 -/* ... */ -#define PM3PixelSize 0x80c0 - #define PM3PixelSize_GLOBAL_32BIT (0<<0) - #define PM3PixelSize_GLOBAL_16BIT (1<<0) - #define PM3PixelSize_GLOBAL_8BIT (2<<0) - #define PM3PixelSize_RASTERIZER_32BIT (0<<2) - #define PM3PixelSize_RASTERIZER_16BIT (1<<2) - #define PM3PixelSize_RASTERIZER_8BIT (2<<2) - #define PM3PixelSize_SCISSOR_AND_STIPPLE_32BIT (0<<4) - #define PM3PixelSize_SCISSOR_AND_STIPPLE_16BIT (1<<4) - #define PM3PixelSize_SCISSOR_AND_STIPPLE_8BIT (2<<4) - #define PM3PixelSize_TEXTURE_32BIT (0<<6) - #define PM3PixelSize_TEXTURE_16BIT (1<<6) - #define PM3PixelSize_TEXTURE_8BIT (2<<6) - #define PM3PixelSize_LUT_32BIT (0<<8) - #define PM3PixelSize_LUT_16BIT (1<<8) - #define PM3PixelSize_LUT_8BIT (2<<8) - #define PM3PixelSize_FRAMEBUFFER_32BIT (0<<10) - #define PM3PixelSize_FRAMEBUFFER_16BIT (1<<10) - #define PM3PixelSize_FRAMEBUFFER_8BIT (2<<10) - #define PM3PixelSize_LOGICAL_OP_32BIT (0<<12) - #define PM3PixelSize_LOGICAL_OP_16BIT (1<<12) - #define PM3PixelSize_LOGICAL_OP_8BIT (2<<12) - #define PM3PixelSize_LOCALBUFFER_32BIT (0<<14) - #define PM3PixelSize_LOCALBUFFER_16BIT (1<<14) - #define PM3PixelSize_LOCALBUFFER_8BIT (2<<14) - #define PM3PixelSize_SETUP_32BIT (0<<16) - #define PM3PixelSize_SETUP_16BIT (1<<16) - #define PM3PixelSize_SETUP_8BIT (2<<16) - #define PM3PixelSize_GLOBAL (0<<31) - #define PM3PixelSize_INDIVIDUAL (1<<31) -/* ... */ -#define PM3QStart 0x83b8 - -#define PM3Render 0x8038 - #define PM3Render_AreaStipple_Disable (0<<0) - #define PM3Render_AreaStipple_Enable (1<<0) - #define PM3Render_LineStipple_Disable (0<<1) - #define PM3Render_LineStipple_Enable (1<<1) - #define PM3Render_ResetLine_Disable (0<<2) - #define PM3Render_ResetLine_Enable (1<<2) - #define PM3Render_FastFill_Disable (0<<3) - #define PM3Render_FastFill_Enable (1<<3) - #define PM3Render_Primitive_Line (0<<6) - #define PM3Render_Primitive_Trapezoid (1<<6) - #define PM3Render_Primitive_Point (2<<6) - #define PM3Render_Antialias_Disable (0<<8) - #define PM3Render_Antialias_Enable (1<<8) - #define PM3Render_Antialias_SubPixelRes_4x4 (0<<9) - #define PM3Render_Antialias_SubPixelRes_8x8 (1<<9) - #define PM3Render_UsePointTable_Disable (0<<10) - #define PM3Render_UsePointTable_Enable (1<<10) - #define PM3Render_SyncOnbitMask_Disable (0<<11) - #define PM3Render_SyncOnBitMask_Enable (1<<11) - #define PM3Render_SyncOnHostData_Disable (0<<12) - #define PM3Render_SyncOnHostData_Enable (1<<12) - #define PM3Render_Texture_Disable (0<<13) - #define PM3Render_Texture_Enable (1<<13) - #define PM3Render_Fog_Disable (0<<14) - #define PM3Render_Fog_Enable (1<<14) - #define PM3Render_Coverage_Disable (0<<15) - #define PM3Render_Coverage_Enable (1<<15) - #define PM3Render_SubPixelCorrection_Disable (0<<16) - #define PM3Render_SubPixelCorrection_Enable (1<<16) - #define PM3Render_SpanOperation_Disable (0<<18) - #define PM3Render_SpanOperation_Enable (1<<18) - #define PM3Render_FBSourceRead_Disable (0<<27) - #define PM3Render_FBSourceRead_Enable (1<<27) -#define PM3RasterizerMode 0x80a0 -#define PM3RasterizerModeAnd 0xaba0 -#define PM3RasterizerModeOr 0xabb8 -#define PM3RectangleHeight 0x94e0 -#define PM3RepeatLine 0x9328 -#define PM3ResetPickResult 0x8c20 -#define PM3RLEMask 0x8c48 -#define PM3RouterMode 0x8840 -#define PM3RStart 0x8780 -#define PM3S1Start 0x8400 -#define PM3aveLineStippleCounters 0x81c0 -#define PM3ScissorMaxXY 0x8190 -#define PM3ScissorMinXY 0x8188 -#define PM3ScissorMode 0x8180 -#define PM3ScissorModeAnd 0xabb0 -#define PM3ScissorModeOr 0xabb8 -#define PM3ScreenSize 0x8198 -#define PM3Security 0x8908 -#define PM3SetLogicalTexturePage 0xb360 -#define PM3SizeOfFramebuffer 0xb0a8 -#define PM3SStart 0x8388 -#define PM3StartXDom 0x8000 -#define PM3StartXSub 0x8010 -#define PM3StartY 0x8020 -/* ... */ -#define PM3SpanColorMask 0x8168 - -#define PM3StencilMode 0x8988 -/* ... */ -#define PM3TailPhysicalPageAllocation0 0xb4a0 -#define PM3TailPhysicalPageAllocation1 0xb4a8 -#define PM3TailPhysicalPageAllocation2 0xb4b0 -#define PM3TailPhysicalPageAllocation3 0xb4b8 -/* ... */ -#define PM3TextureApplicationMode 0x8680 -#define PM3TextureApplicationModeAnd 0xac50 -#define PM3TextureApplicationModeOr 0xac58 -#define PM3TextureBaseAddr0 0x8500 -#define PM3TextureBaseAddr1 0x8508 -#define PM3TextureBaseAddr2 0x8510 -#define PM3TextureBaseAddr3 0x8518 -#define PM3TextureBaseAddr4 0x8520 -#define PM3TextureBaseAddr5 0x8528 -#define PM3TextureBaseAddr6 0x8530 -#define PM3TextureBaseAddr7 0x8538 -#define PM3TextureBaseAddr8 0x8540 -#define PM3TextureBaseAddr9 0x8548 -#define PM3TextureBaseAddr10 0x8550 -#define PM3TextureBaseAddr11 0x8558 -#define PM3TextureBaseAddr12 0x8560 -#define PM3TextureBaseAddr13 0x8568 -#define PM3TextureBaseAddr14 0x8570 -#define PM3TextureBaseAddr15 0x8578 -#define PM3TextureCacheControl 0x8490 -#define PM3TextureChromaLower0 0x84f0 -#define PM3TextureChromaLower1 0x8608 -#define PM3TextureChromaUpper0 0x84e8 -#define PM3TextureChromaUpper1 0x8600 -#define PM3TextureCompositeAlphaMode0 0xb310 -#define PM3TextureCompositeAlphaMode0And 0xb390 -#define PM3TextureCompositeAlphaMode0Or 0xb398 -#define PM3TextureCompositeAlphaMode1 0xb320 -#define PM3TextureCompositeAlphaMode1And 0xb3b0 -#define PM3TextureCompositeAlphaMode1Or 0xb3b8 -#define PM3TextureCompositeColorMode0 0xb308 -#define PM3TextureCompositeColorMode0And 0xb380 -#define PM3TextureCompositeColorMode0Or 0xb388 -#define PM3TextureCompositeColorMode1 0xb318 -#define PM3TextureCompositeColorMode1And 0xb3a0 -#define PM3TextureCompositeColorMode1Or 0xb3a8 -#define PM3TextureCompositeFactor0 0xb328 -#define PM3TextureCompositeFactor1 0xb330 -#define PM3TextureCompositeMode 0xb300 -#define PM3TextureCoordMode 0x8380 -#define PM3TextureCoordModeAnd 0xac20 -#define PM3TextureCoordModeOr 0xac28 -#define PM3TextureData 0x88e8 -/* -#define PM3TextureDownloadControl 0x0108 -*/ -#define PM3TextureDownloadOffset 0x88f0 -#define PM3TextureEnvColor 0x8688 -#define PM3TextureFilterMode 0x84e0 -#define PM3TextureFilterModeAnd 0xad50 -#define PM3TextureFilterModeOr 0xad58 -#define PM3TextureIndexMode0 0xb338 -#define PM3TextureIndexMode0And 0xb3c0 -#define PM3TextureIndexMode0Or 0xb3c8 -#define PM3TextureIndexMode1 0xb340 -#define PM3TextureIndexMode1And 0xb3d0 -#define PM3TextureIndexMode1Or 0xb3d8 -#define PM3TextureLODBiasS 0x8450 -#define PM3TextureLODBiasT 0x8458 -/* ... */ -#define PM3TextureMapSize 0xb428 -#define PM3TextureMapWidth0 0x8580 -#define PM3TextureMapWidth1 0x8588 - #define PM3TextureMapWidth_Width(w) ((w&0xfff)<<0) - #define PM3TextureMapWidth_BorderLayout (1<<12) - #define PM3TextureMapWidth_Layout_Linear (0<<13) - #define PM3TextureMapWidth_Layout_Patch64 (1<<13) - #define PM3TextureMapWidth_Layout_Patch32_2 (2<<13) - #define PM3TextureMapWidth_Layout_Patch2 (3<<13) - #define PM3TextureMapWidth_HostTexture (1<<15) -#define PM3TextureReadMode0 0xb400 -#define PM3TextureReadMode0And 0xac30 -#define PM3TextureReadMode0Or 0xac38 -#define PM3TextureReadMode1 0xb408 -#define PM3TextureReadMode1And 0xad40 -#define PM3TextureReadMode1Or 0xad48 - -#define PM3TouchLogicalPage 0xb370 - #define PM3TouchLogicalPage_Page(p) (p&0xffff) - #define PM3TouchLogicalPage_Count(c) ((c&0x3fff)<<16) - #define PM3TouchLogicalPage_Mode(m) ((m&0x3)<<30) - -#define PM3TStart 0x83a0 - -#define PM3UpdateLogicalTextureInfo 0xb368 - #define PM3UpdateLogicalTextureInfo_Length(l) ((l)&0x1ff) - #define PM3UpdateLogicalTextureInfo_MemoryPool(m) (((m)&0x3)<<9) - #define PM3UpdateLogicalTextureInfo_VirtualHostPage (1<<11) - #define PM3UpdateLogicalTextureInfo_HostPage(p) (((p)&0xfffff)<<12) - -/* ... */ -#define PM3WaitForCompletion 0x80b8 -#define PM3Window 0x8980 - #define PM3Window_ForceLBUpdate (1<<3) - #define PM3Window_LBUpdateSource (1<<4) - #define PM3Window_FrameCount(c) (((c)&0xff)<<9) - #define PM3Window_StencilFCP (1<<17) - #define PM3Window_DepthFCP (1<<18) - #define PM3Window_OverrideWriteFiltering (1<<19) -#define PM3WindowAnd 0xab80 -#define PM3WindowOr 0xab88 -#define PM3WindowOrigin 0x81c8 -#define PM3XBias 0x9480 -#define PM3YBias 0x9488 -#define PM3YLimits 0x80a8 -#define PM3YUVMode 0x8f00 -#define PM3ZFogBias 0x86b8 -#define PM3ZStart 0xadd8 -#define PM3ZStartL 0x89b8 -#define PM3ZStartU 0x89b0 - - -/********************************************** -* GLINT Permedia3 2D setup Unit * -***********************************************/ -#define PM3Config2D 0xb618 - #define PM3Config2D_OpaqueSpan (1<<0) - #define PM3Config2D_MultiRXBlit (1<<1) - #define PM3Config2D_UserScissorEnable (1<<2) - #define PM3Config2D_FBDestReadEnable (1<<3) - #define PM3Config2D_AlphaBlendEnable (1<<4) - #define PM3Config2D_DitherEnable (1<<5) - #define PM3Config2D_ForegroundROPEnable (1<<6) - #define PM3Config2D_ForegroundROP(rop) (((rop)&0xf)<<7) - #define PM3Config2D_BackgroundROPEnable (1<<11) - #define PM3Config2D_BackgroundROP(rop) (((rop)&0xf)<<12) - #define PM3Config2D_UseConstantSource (1<<16) - #define PM3Config2D_FBWriteEnable (1<<17) - #define PM3Config2D_Blocking (1<<18) - #define PM3Config2D_ExternalSourceData (1<<19) - #define PM3Config2D_LUTModeEnable (1<<20) -#define PM3DownloadGlyphwidth 0xb658 - #define PM3DownloadGlyphwidth_GlyphWidth(gw) ((gw)&0xffff) -#define PM3DownloadTarget 0xb650 - #define PM3DownloadTarget_TagName(tag) ((tag)&0x1fff) -#define PM3GlyphData 0xb660 -#define PM3GlyphPosition 0xb608 - #define PM3GlyphPosition_XOffset(x) ((x)&0xffff) - #define PM3GlyphPosition_YOffset(y) (((y)&0xffff)<<16) -#define PM3Packed4Pixels 0xb668 -#define PM3Packed8Pixels 0xb630 -#define PM3Packed16Pixels 0xb638 -#define PM3RectanglePosition 0xb600 - #define PM3RectanglePosition_XOffset(x) ((x)&0xffff) - #define PM3RectanglePosition_YOffset(y) (((y)&0xffff)<<16) -#define PM3Render2D 0xb640 - #define PM3Render2D_Width(w) ((w)&0x0fff) - #define PM3Render2D_Operation_Normal (0<<12) - #define PM3Render2D_Operation_SyncOnHostData (1<<12) - #define PM3Render2D_Operation_SyncOnBitMask (2<<12) - #define PM3Render2D_Operation_PatchOrderRendering (3<<12) - #define PM3Render2D_FBSourceReadEnable (1<<14) - #define PM3Render2D_SpanOperation (1<<15) - #define PM3Render2D_Height(h) (((h)&0x0fff)<<16) - #define PM3Render2D_XPositive (1<<28) - #define PM3Render2D_YPositive (1<<29) - #define PM3Render2D_AreaStippleEnable (1<<30) - #define PM3Render2D_TextureEnable (1<<31) -#define PM3Render2DGlyph 0xb648 - #define PM3Render2DGlyph_Width(w) ((w)&0x7f) - #define PM3Render2DGlyph_Height(h) (((h)&0x7f)<<7) - #define PM3Render2DGlyph_XOffset(x) (((x)&0x1ff)<<14) - #define PM3Render2DGlyph_YOffset(y) (((y)&0x1ff)<<23) -#define PM3RenderPatchOffset 0xb610 - #define PM3RenderPatchOffset_XOffset(x) ((x)&0xffff) - #define PM3RenderPatchOffset_YOffset(y) (((y)&0xffff)<<16) -#define PM3RLCount 0xb678 - #define PM3RLCount_Count(c) ((c)&0x0fff) -#define PM3RLData 0xb670 - -/********************************************** -* GLINT Permedia3 Alias Register * -***********************************************/ -#define PM3FillBackgroundColor 0x8330 -#define PM3FillConfig2D0 0x8338 -#define PM3FillConfig2D1 0x8360 - #define PM3FillConfig2D_OpaqueSpan 1<<0 - #define PM3FillConfig2D_MultiRXBlit 1<<1 - #define PM3FillConfig2D_UserScissorEnable 1<<2 - #define PM3FillConfig2D_FBDestReadEnable 1<<3 - #define PM3FillConfig2D_AlphaBlendEnable 1<<4 - #define PM3FillConfig2D_DitherEnable 1<<5 - #define PM3FillConfig2D_ForegroundROPEnable 1<<6 - #define PM3FillConfig2D_ForegroundROP(rop) (((rop)&0xf)<<7) - #define PM3FillConfig2D_BackgroundROPEnable 1<<11 - #define PM3FillConfig2D_BackgroundROP(rop) (((rop)&0xf)<<12) - #define PM3FillConfig2D_UseConstantSource 1<<16 - #define PM3FillConfig2D_FBWriteEnable 1<<17 - #define PM3FillConfig2D_Blocking 1<<18 - #define PM3FillConfig2D_ExternalSourceData 1<<19 - #define PM3FillConfig2D_LUTModeEnable 1<<20 -#define PM3FillFBDestReadBufferAddr 0x8310 -#define PM3FillFBSourceReadBufferAddr 0x8308 -#define PM3FillFBSourceReadBufferOffset 0x8340 - #define PM3FillFBSourceReadBufferOffset_XOffset(x) ((x)&0xffff) - #define PM3FillFBSourceReadBufferOffset_YOffset(y) (((y)&0xffff)<<16) -#define PM3FillFBWriteBufferAddr 0x8300 -#define PM3FillForegroundColor0 0x8328 -#define PM3FillForegroundColor1 0x8358 -#define PM3FillGlyphPosition 0x8368 - #define PM3FillGlyphPosition_XOffset(x) ((x)&0xffff) - #define PM3FillGlyphPosition_YOffset(y) (((y)&0xffff)<<16) -#define PM3FillRectanglePosition 0x8348 - #define PM3FillRectanglePosition_XOffset(x) ((x)&0xffff) - #define PM3FillRectanglePosition_YOffset(y) (((y)&0xffff)<<16) - -/********************************************** -* GLINT Permedia3 Macros * -***********************************************/ - -#ifdef __alpha__ -#define mem_barrier() asm volatile ("mb" : : : "memory") -#define write_mem_barrier() asm volatile ("wmb" : : : "memory") -#else -#define mem_barrier() -#define write_mem_barrier() -#endif - -extern void *pm3_reg_base; - -#define WRITE_REG(offset,val) \ - do { \ - write_mem_barrier(); \ - *(volatile uint32_t *) \ - (((unsigned char *)(pm3_reg_base)) + offset) = (val); \ - } while(0) - -static inline uint32_t -READ_REG(uint32_t offset) -{ - mem_barrier(); - return *(volatile uint32_t *)(((unsigned char *)(pm3_reg_base)) + offset); -} - -#define UPDATE_SET_REG(offset,val) \ - { \ - unsigned long temp; \ - temp = READ_REG(offset); \ - WRITE_REG(offset,temp|(val)); \ - } - -#define UPDATE_CLEAR_REG(offset,val) \ - { \ - unsigned long temp; \ - temp = READ_REG(offset); \ - WRITE_REG(offset,temp&(~(val))); \ - } - -#define WAIT_FIFO(n) while(READ_REG(PM3InFIFOSpace) < (n)) - -#define RAMDAC_DELAY(x) do { \ - int delay = x; \ - unsigned char tmp; \ - while(delay--){tmp = READ_REG(PM3InFIFOSpace);}; \ -} while(0) - -#define SLOW_WRITE_REG(v,r) \ -do{ \ - RAMDAC_DELAY(5); \ - WRITE_REG(v,r); \ - RAMDAC_DELAY(5); \ -}while(0) - -#define RAMDAC_SET_INDEX(index) \ -{ \ - SLOW_WRITE_REG (PM3RD_IndexHigh,(index>>8)&0xff); \ - SLOW_WRITE_REG (PM3RD_IndexLow,index&0xff); \ -} - -#define RAMDAC_SET_REG(index, data) \ -{ \ - RAMDAC_SET_INDEX(index); \ - SLOW_WRITE_REG(PM3RD_IndexedData, data); \ -} - -#define RAMDAC_GET_REG(index, temp) \ -{ \ - RAMDAC_SET_INDEX(index); \ - temp = READ_REG(PM3RD_IndexedData); \ -} - -#endif /* _PM3_REG_H_ */ diff --git a/src/video_out/vidix/drivers/pm3_vid.c b/src/video_out/vidix/drivers/pm3_vid.c deleted file mode 100644 index 72a6523b3..000000000 --- a/src/video_out/vidix/drivers/pm3_vid.c +++ /dev/null @@ -1,573 +0,0 @@ -/** - Driver for 3DLabs GLINT R3 and Permedia3 chips. - - Copyright (C) 2002, 2003 MÃ¥ns RullgÃ¥rd - - 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 -**/ - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include <unistd.h> -#include <sys/mman.h> - -#include "vidix.h" -#include "fourcc.h" -#include "libdha.h" -#include "pci_ids.h" -#include "pci_names.h" - -#include "pm3_regs.h" - -#define VIDIX_STATIC pm3_ - -/* MBytes of video memory to use */ -#define PM3_VIDMEM 24 - -#if 0 -#define TRACE_ENTER() fprintf(stderr, "%s: enter\n", __FUNCTION__) -#define TRACE_EXIT() fprintf(stderr, "%s: exit\n", __FUNCTION__) -#else -#define TRACE_ENTER() -#define TRACE_EXIT() -#endif - -static pciinfo_t pci_info; - -void *pm3_reg_base; -static void *pm3_mem; - -static int pm3_vidmem = PM3_VIDMEM; -static int pm3_blank = 0; -static int pm3_dma = 0; - -static int pm3_ckey_red, pm3_ckey_green, pm3_ckey_blue; - -static u_int page_size; - -static vidix_capability_t pm3_cap = -{ - "3DLabs GLINT R3/Permedia3 driver", - "MÃ¥ns RullgÃ¥rd <mru@users.sf.net>", - TYPE_OUTPUT, - { 0, 0, 0, 0 }, - 2048, - 2048, - 4, - 4, - -1, - FLAG_UPSCALER | FLAG_DOWNSCALER, - VENDOR_3DLABS, - -1, - { 0, 0, 0, 0 } -}; - - -unsigned int VIDIX_NAME(vixGetVersion)(void) -{ - return(VIDIX_VERSION); -} - -static unsigned short pm3_card_ids[] = -{ - DEVICE_3DLABS_GLINT_R3 -}; - -static int find_chip(unsigned chip_id) -{ - unsigned i; - for(i = 0;i < sizeof(pm3_card_ids)/sizeof(unsigned short);i++) - { - if(chip_id == pm3_card_ids[i]) return i; - } - return -1; -} - -int VIDIX_NAME(vixProbe)(int verbose, int force) -{ - pciinfo_t lst[MAX_PCI_DEVICES]; - unsigned i,num_pci; - int err; - - err = pci_scan(lst,&num_pci); - if(err) - { - printf("[pm3] Error occured during pci scan: %s\n",strerror(err)); - return err; - } - else - { - err = ENXIO; - for(i=0; i < num_pci; i++) - { - if(lst[i].vendor == VENDOR_3DLABS) - { - int idx; - const char *dname; - idx = find_chip(lst[i].device); - if(idx == -1) - continue; - dname = pci_device_name(VENDOR_3DLABS, lst[i].device); - dname = dname ? dname : "Unknown chip"; - printf("[pm3] Found chip: %s with IRQ %i\n", - dname, lst[i].irq); - pm3_cap.device_id = lst[i].device; - err = 0; - memcpy(&pci_info, &lst[i], sizeof(pciinfo_t)); - break; - } - } - } - if(err && verbose) printf("[pm3] Can't find chip\n"); - return err; -} - -#define PRINT_REG(reg) \ -{ \ - long _foo = READ_REG(reg); \ - printf("[pm3] " #reg " (%x) = %#lx (%li)\n", reg, _foo, _foo); \ -} - -int VIDIX_NAME(vixInit)(const char *args) -{ - if(args != NULL){ - char *ac = strdup(args), *s, *opt; - - opt = strtok_r(ac, ",", &s); - while(opt){ - char *a = strchr(opt, '='); - - if(a) - *a++ = 0; - if(!strcmp(opt, "mem")){ - if(a) - pm3_vidmem = strtol(a, NULL, 0); - } else if(!strcmp(opt, "blank")){ - pm3_blank = a? strtol(a, NULL, 0): 1; - } - - opt = strtok_r(NULL, ",", &s); - } - - free(ac); - } - - pm3_reg_base = map_phys_mem(pci_info.base0, 0x20000); - pm3_mem = map_phys_mem(pci_info.base1, 0x2000000); - - if(bm_open() == 0){ - fprintf(stderr, "[pm3] DMA available.\n"); - pm3_cap.flags |= FLAG_DMA | FLAG_SYNC_DMA; - page_size = sysconf(_SC_PAGESIZE); - hwirq_install(pci_info.bus, pci_info.card, pci_info.func, - 0, PM3IntFlags, -1); - WRITE_REG(PM3IntEnable, (1 << 7)); - pm3_dma = 1; - } - - RAMDAC_GET_REG(PM3RD_VideoOverlayKeyR, pm3_ckey_red); - RAMDAC_GET_REG(PM3RD_VideoOverlayKeyG, pm3_ckey_green); - RAMDAC_GET_REG(PM3RD_VideoOverlayKeyB, pm3_ckey_blue); - - return 0; -} - -void VIDIX_NAME(vixDestroy)(void) -{ - if(pm3_dma) - WRITE_REG(PM3IntEnable, 0); - - RAMDAC_SET_REG(PM3RD_VideoOverlayKeyR, pm3_ckey_red); - RAMDAC_SET_REG(PM3RD_VideoOverlayKeyG, pm3_ckey_green); - RAMDAC_SET_REG(PM3RD_VideoOverlayKeyB, pm3_ckey_blue); - - unmap_phys_mem(pm3_reg_base, 0x20000); - unmap_phys_mem(pm3_mem, 0x2000000); - hwirq_uninstall(pci_info.bus, pci_info.card, pci_info.func); - bm_close(); -} - -int VIDIX_NAME(vixGetCapability)(vidix_capability_t *to) -{ - memcpy(to, &pm3_cap, sizeof(vidix_capability_t)); - return 0; -} - -static int is_supported_fourcc(uint32_t fourcc) -{ - switch(fourcc){ - case IMGFMT_YUY2: - case IMGFMT_UYVY: - return 1; - default: - return 0; - } -} - -int VIDIX_NAME(vixQueryFourcc)(vidix_fourcc_t *to) -{ - if(is_supported_fourcc(to->fourcc)) - { - to->depth = VID_DEPTH_1BPP | VID_DEPTH_2BPP | - VID_DEPTH_4BPP | VID_DEPTH_8BPP | - VID_DEPTH_12BPP| VID_DEPTH_15BPP| - VID_DEPTH_16BPP| VID_DEPTH_24BPP| - VID_DEPTH_32BPP; - to->flags = VID_CAP_EXPAND | VID_CAP_SHRINK | VID_CAP_COLORKEY; - return 0; - } - else to->depth = to->flags = 0; - return ENOSYS; -} - -static int frames[VID_PLAY_MAXFRAMES], vid_base; -static int overlay_mode, overlay_control, video_control, int_enable; -static int rdoverlay_mode; -static int src_w, drw_w; -static int src_h, drw_h; -static int drw_x, drw_y; - -#define FORMAT_RGB8888 PM3VideoOverlayMode_COLORFORMAT_RGB8888 -#define FORMAT_RGB4444 PM3VideoOverlayMode_COLORFORMAT_RGB4444 -#define FORMAT_RGB5551 PM3VideoOverlayMode_COLORFORMAT_RGB5551 -#define FORMAT_RGB565 PM3VideoOverlayMode_COLORFORMAT_RGB565 -#define FORMAT_RGB332 PM3VideoOverlayMode_COLORFORMAT_RGB332 -#define FORMAT_BGR8888 PM3VideoOverlayMode_COLORFORMAT_BGR8888 -#define FORMAT_BGR4444 PM3VideoOverlayMode_COLORFORMAT_BGR4444 -#define FORMAT_BGR5551 PM3VideoOverlayMode_COLORFORMAT_BGR5551 -#define FORMAT_BGR565 PM3VideoOverlayMode_COLORFORMAT_BGR565 -#define FORMAT_BGR332 PM3VideoOverlayMode_COLORFORMAT_BGR332 -#define FORMAT_CI8 PM3VideoOverlayMode_COLORFORMAT_CI8 -#define FORMAT_VUY444 PM3VideoOverlayMode_COLORFORMAT_VUY444 -#define FORMAT_YUV444 PM3VideoOverlayMode_COLORFORMAT_YUV444 -#define FORMAT_VUY422 PM3VideoOverlayMode_COLORFORMAT_VUY422 -#define FORMAT_YUV422 PM3VideoOverlayMode_COLORFORMAT_YUV422 - -/* Notice, have to check that we dont overflow the deltas here ... */ -static void -compute_scale_factor(int* src_w, int* dst_w, - u_int* shrink_delta, u_int* zoom_delta) -{ - /* NOTE: If we don't return reasonable values here then the video - * unit can potential shut off and won't display an image until re-enabled. - * Seems as though the zoom_delta is o.k, and I've not had the problem. - * The 'shrink_delta' is prone to this the most - FIXME ! */ - - if (*src_w >= *dst_w) { - *src_w &= ~0x3; - *dst_w &= ~0x3; - *shrink_delta = (((*src_w << 16) / *dst_w) + 0x0f) & 0x0ffffff0; - *zoom_delta = 1<<16; - if ( ((*shrink_delta * *dst_w) >> 16) & 0x03 ) - *shrink_delta += 0x10; - } else { - *src_w &= ~0x3; - *dst_w &= ~0x3; - *zoom_delta = (((*src_w << 16) / *dst_w) + 0x0f) & 0x0001fff0; - *shrink_delta = 1<<16; - if ( ((*zoom_delta * *dst_w) >> 16) & 0x03 ) - *zoom_delta += 0x10; - } -} - -static void -pm3_setup_overlay(vidix_playback_t *info) -{ - u_int shrink, zoom; - int format = 0; - int filter = 0; - int sw = src_w; - - switch(info->fourcc){ - case IMGFMT_YUY2: - format = FORMAT_YUV422; - break; - case IMGFMT_UYVY: - format = FORMAT_VUY422; - break; - } - - compute_scale_factor(&sw, &drw_w, &shrink, &zoom); - - WAIT_FIFO(9); - WRITE_REG(PM3VideoOverlayBase0, vid_base >> 1); - WRITE_REG(PM3VideoOverlayStride, PM3VideoOverlayStride_STRIDE(src_w)); - WRITE_REG(PM3VideoOverlayWidth, PM3VideoOverlayWidth_WIDTH(sw)); - WRITE_REG(PM3VideoOverlayHeight, PM3VideoOverlayHeight_HEIGHT(src_h)); - WRITE_REG(PM3VideoOverlayOrigin, 0); - - /* Scale the source to the destinationsize */ - if (src_w == drw_w) { - WRITE_REG(PM3VideoOverlayShrinkXDelta, 1<<16); - WRITE_REG(PM3VideoOverlayZoomXDelta, 1<<16); - } else { - WRITE_REG(PM3VideoOverlayShrinkXDelta, shrink); - WRITE_REG(PM3VideoOverlayZoomXDelta, zoom); - filter = PM3VideoOverlayMode_FILTER_PARTIAL; - } - if (src_h == drw_h) { - WRITE_REG(PM3VideoOverlayYDelta, PM3VideoOverlayYDelta_NONE); - } else { - WRITE_REG(PM3VideoOverlayYDelta, - PM3VideoOverlayYDelta_DELTA(src_h, drw_h)); - filter = PM3VideoOverlayMode_FILTER_FULL; - } - - WRITE_REG(PM3VideoOverlayIndex, 0); - - /* Now set the ramdac video overlay region and mode */ - RAMDAC_SET_REG(PM3RD_VideoOverlayXStartLow, (drw_x & 0xff)); - RAMDAC_SET_REG(PM3RD_VideoOverlayXStartHigh, (drw_x & 0xf00)>>8); - RAMDAC_SET_REG(PM3RD_VideoOverlayXEndLow, (drw_x+drw_w) & 0xff); - RAMDAC_SET_REG(PM3RD_VideoOverlayXEndHigh, - ((drw_x+drw_w) & 0xf00)>>8); - RAMDAC_SET_REG(PM3RD_VideoOverlayYStartLow, (drw_y & 0xff)); - RAMDAC_SET_REG(PM3RD_VideoOverlayYStartHigh, (drw_y & 0xf00)>>8); - RAMDAC_SET_REG(PM3RD_VideoOverlayYEndLow, (drw_y+drw_h) & 0xff); - RAMDAC_SET_REG(PM3RD_VideoOverlayYEndHigh, - ((drw_y+drw_h) & 0xf00)>>8); - - overlay_mode = - 1 << 5 | - format | - filter | - PM3VideoOverlayMode_BUFFERSYNC_MANUAL | - PM3VideoOverlayMode_FLIP_VIDEO; - - overlay_control = - PM3RD_VideoOverlayControl_KEY_COLOR | - PM3RD_VideoOverlayControl_DIRECTCOLOR_ENABLED; -} - -extern int -VIDIX_NAME(vixSetGrKeys)(const vidix_grkey_t *key) -{ - if(key->ckey.op == CKEY_TRUE){ - RAMDAC_SET_REG(PM3RD_VideoOverlayKeyR, key->ckey.red); - RAMDAC_SET_REG(PM3RD_VideoOverlayKeyG, key->ckey.green); - RAMDAC_SET_REG(PM3RD_VideoOverlayKeyB, key->ckey.blue); - rdoverlay_mode = PM3RD_VideoOverlayControl_MODE_MAINKEY; - } else { - rdoverlay_mode = PM3RD_VideoOverlayControl_MODE_ALWAYS; - } - RAMDAC_SET_REG(PM3RD_VideoOverlayControl, - overlay_control | rdoverlay_mode); - - return 0; -} - -extern int -VIDIX_NAME(vixGetGrKeys)(vidix_grkey_t *key) -{ - RAMDAC_GET_REG(PM3RD_VideoOverlayKeyR, key->ckey.red); - RAMDAC_GET_REG(PM3RD_VideoOverlayKeyG, key->ckey.green); - RAMDAC_GET_REG(PM3RD_VideoOverlayKeyB, key->ckey.blue); - return 0; -} - -extern int -VIDIX_NAME(vixConfigPlayback)(vidix_playback_t *info) -{ - unsigned int i; - u_int frame_size; - u_int vidmem_size; - u_int max_frames; - - TRACE_ENTER(); - - src_w = info->src.w; - src_h = info->src.h; - drw_w = info->dest.w; - drw_h = info->dest.h; - drw_x = info->dest.x; - drw_y = info->dest.y; - - frame_size = src_w * src_h * 2; - vidmem_size = pm3_vidmem*1024*1024; - max_frames = vidmem_size / frame_size; - if(max_frames > VID_PLAY_MAXFRAMES) - max_frames = VID_PLAY_MAXFRAMES; - - src_h--; /* ugh */ - - if(info->num_frames > max_frames) - info->num_frames = max_frames; - vidmem_size = info->num_frames * frame_size; - - /* Use end of video memory. Assume the card has 32 MB */ - vid_base = 32*1024*1024 - vidmem_size; - info->dga_addr = pm3_mem + vid_base; - - info->dest.pitch.y = 2; - info->dest.pitch.u = 0; - info->dest.pitch.v = 0; - info->offset.y = 0; - info->offset.v = 0; - info->offset.u = 0; - info->frame_size = frame_size; - - for(i = 0; i < info->num_frames; i++){ - info->offsets[i] = frame_size * i; - frames[i] = (vid_base + info->offsets[i]) >> 1; - } - - pm3_setup_overlay(info); - - video_control = READ_REG(PM3VideoControl); - int_enable = READ_REG(PM3IntEnable); - - TRACE_EXIT(); - return 0; -} - -int VIDIX_NAME(vixPlaybackOn)(void) -{ - TRACE_ENTER(); - - WRITE_REG(PM3VideoOverlayMode, - overlay_mode | PM3VideoOverlayMode_ENABLE); - overlay_control |= PM3RD_VideoOverlayControl_ENABLE; - RAMDAC_SET_REG(PM3RD_VideoOverlayControl, - overlay_control | rdoverlay_mode); - WRITE_REG(PM3VideoOverlayUpdate, PM3VideoOverlayUpdate_ENABLE); - - if(pm3_blank) - WRITE_REG(PM3VideoControl, - video_control | PM3VideoControl_DISPLAY_ENABLE); - - TRACE_EXIT(); - return 0; -} - -int VIDIX_NAME(vixPlaybackOff)(void) -{ - overlay_control &= ~PM3RD_VideoOverlayControl_ENABLE; - RAMDAC_SET_REG(PM3RD_VideoOverlayControl, - PM3RD_VideoOverlayControl_DISABLE); - WRITE_REG(PM3VideoOverlayMode, - PM3VideoOverlayMode_DISABLE); - - if(video_control) - WRITE_REG(PM3VideoControl, - video_control & ~PM3VideoControl_DISPLAY_ENABLE); - - return 0; -} - -int VIDIX_NAME(vixPlaybackFrameSelect)(unsigned int frame) -{ - WRITE_REG(PM3VideoOverlayBase0, frames[frame]); - - return 0; -} - -struct pm3_bydma_cmd { - uint32_t bus_addr; - uint32_t fb_addr; - uint32_t mask; - uint32_t count; -}; - -struct pm3_bydma_frame { - struct pm3_bydma_cmd *cmds; - u_long bus_addr; - uint32_t count; -}; - -static struct pm3_bydma_frame * -pm3_setup_bydma(vidix_dma_t *dma, struct pm3_bydma_frame *bdf) -{ - u_int size = dma->size; - u_int pages = (size + page_size-1) / page_size; - unsigned long baddr[pages]; - u_int i; - uint32_t dest; - - if(bm_virt_to_bus(dma->src, dma->size, baddr)) - return NULL; - - if(!bdf){ - bdf = malloc(sizeof(*bdf)); - bdf->cmds = valloc(pages * sizeof(struct pm3_bydma_cmd)); - if(dma->flags & BM_DMA_FIXED_BUFFS){ - mlock(bdf->cmds, page_size); - } - } - - dest = vid_base + dma->dest_offset; - for(i = 0; i < pages; i++, dest += page_size, size -= page_size){ - bdf->cmds[i].bus_addr = baddr[i]; - bdf->cmds[i].fb_addr = dest; - bdf->cmds[i].mask = ~0; - bdf->cmds[i].count = ((size > page_size)? page_size: size) / 16; - } - - bdf->count = pages; - - if(bm_virt_to_bus(bdf->cmds, page_size, &bdf->bus_addr) != 0){ - free(bdf->cmds); - free(bdf); - return NULL; - } - - return bdf; -} - -extern int -VIDIX_NAME(vixPlaybackCopyFrame)(vidix_dma_t *dma) -{ - u_int frame = dma->idx; - struct pm3_bydma_frame *bdf; - - bdf = dma->internal[frame]; - if(!bdf || !(dma->flags & BM_DMA_FIXED_BUFFS)) - bdf = pm3_setup_bydma(dma, bdf); - if(!bdf) - return -1; - - if(!dma->internal[frame]) - dma->internal[frame] = bdf; - - if(dma->flags & BM_DMA_SYNC){ - hwirq_wait(pci_info.irq); - } - - WAIT_FIFO(3); - WRITE_REG(PM3ByDMAReadCommandBase, bdf->bus_addr); - WRITE_REG(PM3ByDMAReadCommandCount, bdf->count); - WRITE_REG(PM3ByDMAReadMode, - PM3ByDMAReadMode_ByteSwap_NONE | - PM3ByDMAReadMode_Format_RAW | - PM3ByDMAReadMode_PixelSize(16) | - PM3ByDMAReadMode_Active | - PM3ByDMAReadMode_Burst(7) | - PM3ByDMAReadMode_Align); - - if(dma->flags & BM_DMA_BLOCK){ - hwirq_wait(pci_info.irq); - } - - return 0; -} - -extern int -VIDIX_NAME(vixQueryDMAStatus)(void) -{ - uint32_t bdm = READ_REG(PM3ByDMAReadMode); - return (bdm & PM3ByDMAReadMode_Active)? 1: 0; -} diff --git a/src/video_out/vidix/drivers/radeon.h b/src/video_out/vidix/drivers/radeon.h deleted file mode 100644 index 090fbf8df..000000000 --- a/src/video_out/vidix/drivers/radeon.h +++ /dev/null @@ -1,2221 +0,0 @@ -/* - * radeon.h - * This software has been released under the terms of the GNU Public - * license. See http://www.gnu.org/copyleft/gpl.html for details. - * - * This collection of definition was written by Nick Kurshev - * It's based on radeonfb, X11, GATOS sources - * and partly compatible with Rage128 set (in OV0, CAP0, CAP1 parts) -*/ - -#ifndef _RADEON_H -#define _RADEON_H - -#define RADEON_REGSIZE 0x4000 -#define MM_INDEX 0x0000 -/* MM_INDEX bit constants */ -# define MM_APER 0x80000000 -#define MM_DATA 0x0004 -#define BUS_CNTL 0x0030 -/* BUS_CNTL bit constants */ -# define BUS_DBL_RESYNC 0x00000001 -# define BUS_MSTR_RESET 0x00000002 -# define BUS_FLUSH_BUF 0x00000004 -# define BUS_STOP_REQ_DIS 0x00000008 -# define BUS_ROTATION_DIS 0x00000010 -# define BUS_MASTER_DIS 0x00000040 -# define BUS_ROM_WRT_EN 0x00000080 -# define BUS_DIS_ROM 0x00001000 -# define BUS_PCI_READ_RETRY_EN 0x00002000 -# define BUS_AGP_AD_STEPPING_EN 0x00004000 -# define BUS_PCI_WRT_RETRY_EN 0x00008000 -# define BUS_MSTR_RD_MULT 0x00100000 -# define BUS_MSTR_RD_LINE 0x00200000 -# define BUS_SUSPEND 0x00400000 -# define LAT_16X 0x00800000 -# define BUS_RD_DISCARD_EN 0x01000000 -# define BUS_RD_ABORT_EN 0x02000000 -# define BUS_MSTR_WS 0x04000000 -# define BUS_PARKING_DIS 0x08000000 -# define BUS_MSTR_DISCONNECT_EN 0x10000000 -# define BUS_WRT_BURST 0x20000000 -# define BUS_READ_BURST 0x40000000 -# define BUS_RDY_READ_DLY 0x80000000 -#define HI_STAT 0x004C -#define BUS_CNTL1 0x0034 -# define BUS_WAIT_ON_LOCK_EN (1 << 4) -#define I2C_CNTL_0 0x0090 -# define I2C_DONE (1<<0) -# define I2C_NACK (1<<1) -# define I2C_HALT (1<<2) -# define I2C_SOFT_RST (1<<5) -# define I2C_DRIVE_EN (1<<6) -# define I2C_DRIVE_SEL (1<<7) -# define I2C_START (1<<8) -# define I2C_STOP (1<<9) -# define I2C_RECEIVE (1<<10) -# define I2C_ABORT (1<<11) -# define I2C_GO (1<<12) -# define I2C_SEL (1<<16) -# define I2C_EN (1<<17) -#define I2C_CNTL_1 0x0094 -#define I2C_DATA 0x0098 -#define CONFIG_CNTL 0x00E0 -/* CONFIG_CNTL bit constants */ -# define CFG_VGA_RAM_EN 0x00000100 -#ifdef RAGE128 -#define GEN_RESET_CNTL 0x00f0 -# define SOFT_RESET_GUI 0x00000001 -# define SOFT_RESET_VCLK 0x00000100 -# define SOFT_RESET_PCLK 0x00000200 -# define SOFT_RESET_ECP 0x00000400 -# define SOFT_RESET_DISPENG_XCLK 0x00000800 -# define SOFT_RESET_MEMCTLR_XCLK 0x00001000 -#endif -#define CONFIG_MEMSIZE 0x00F8 -#define CONFIG_APER_0_BASE 0x0100 -#define CONFIG_APER_1_BASE 0x0104 -#define CONFIG_APER_SIZE 0x0108 -#define CONFIG_REG_1_BASE 0x010C -#define CONFIG_REG_APER_SIZE 0x0110 -#define PAD_AGPINPUT_DELAY 0x0164 -#define PAD_CTLR_STRENGTH 0x0168 -#define PAD_CTLR_UPDATE 0x016C -#define AGP_CNTL 0x0174 -# define AGP_APER_SIZE_256MB (0x00 << 0) -# define AGP_APER_SIZE_128MB (0x20 << 0) -# define AGP_APER_SIZE_64MB (0x30 << 0) -# define AGP_APER_SIZE_32MB (0x38 << 0) -# define AGP_APER_SIZE_16MB (0x3c << 0) -# define AGP_APER_SIZE_8MB (0x3e << 0) -# define AGP_APER_SIZE_4MB (0x3f << 0) -# define AGP_APER_SIZE_MASK (0x3f << 0) -#define AMCGPIO_A_REG 0x01a0 -#define AMCGPIO_EN_REG 0x01a8 -#define AMCGPIO_MASK 0x0194 -#define AMCGPIO_Y_REG 0x01a4 -/*#define BM_STATUS 0x0160*/ -#define MPP_TB_CONFIG 0x01c0 /* ? */ -#define MPP_GP_CONFIG 0x01c8 /* ? */ -#define VENDOR_ID 0x0F00 -#define DEVICE_ID 0x0F02 -#define COMMAND 0x0F04 -#define STATUS 0x0F06 -#define REVISION_ID 0x0F08 -#define REGPROG_INF 0x0F09 -#define SUB_CLASS 0x0F0A -#define CACHE_LINE 0x0F0C -#define LATENCY 0x0F0D -#define HEADER 0x0F0E -#define BIST 0x0F0F -#define REG_MEM_BASE 0x0F10 -#define REG_IO_BASE 0x0F14 -#define REG_REG_BASE 0x0F18 -#define ADAPTER_ID 0x0F2C -#define BIOS_ROM 0x0F30 -#define CAPABILITIES_PTR 0x0F34 -#define INTERRUPT_LINE 0x0F3C -#define INTERRUPT_PIN 0x0F3D -#define MIN_GRANT 0x0F3E -#define MAX_LATENCY 0x0F3F -#define ADAPTER_ID_W 0x0F4C -#define PMI_CAP_ID 0x0F50 -#define PMI_NXT_CAP_PTR 0x0F51 -#define PMI_PMC_REG 0x0F52 -#define PM_STATUS 0x0F54 -#define PMI_DATA 0x0F57 -#define AGP_CAP_ID 0x0F58 -#define AGP_STATUS 0x0F5C -# define AGP_1X_MODE 0x01 -# define AGP_2X_MODE 0x02 -# define AGP_4X_MODE 0x04 -# define AGP_MODE_MASK 0x07 -#define AGP_COMMAND 0x0F60 - -/* Video muxer unit */ -#define VIDEOMUX_CNTL 0x0190 -#define VIPPAD_MASK 0x0198 -#define VIPPAD1_A 0x01AC -#define VIPPAD1_EN 0x01B0 -#define VIPPAD1_Y 0x01B4 - -#define AIC_CTRL 0x01D0 -#define AIC_STAT 0x01D4 -#define AIC_PT_BASE 0x01D8 -#define AIC_LO_ADDR 0x01DC -#define AIC_HI_ADDR 0x01E0 -#define AIC_TLB_ADDR 0x01E4 -#define AIC_TLB_DATA 0x01E8 -#define DAC_CNTL 0x0058 -/* DAC_CNTL bit constants */ -# define DAC_RANGE_CNTL_MSK 0x00000003 -# define DAC_RANGE_PAL 0x00000000 -# define DAC_RANGE_NTSC 0x00000001 -# define DAC_RANGE_PS2 0x00000002 -# define DAC_BLANKING 0x00000004 -# define DAC_CMP_EN 0x00000008 -# define DAC_CMP_OUTPUT 0x00000080 -# define DAC_8BIT_EN 0x00000100 -# define DAC_4BPP_PIX_ORDER 0x00000200 -# define DAC_TVO_EN 0x00000400 -# define DAC_TVO_OVR_EXCL 0x00000800 -# define DAC_TVO_16BPP_DITH_EN 0x00001000 -# define DAC_VGA_ADR_EN (1 << 13) -# define DAC_PWDN (1 << 15) -# define DAC_CRC_EN 0x00080000 -# define DAC_MASK_ALL (0xff << 24) -# define DAC_RANGE_CNTL (3 << 0) -#define DAC_CNTL2 0x007c -/* DAC_CNTL2 bit constants */ -# define DAC2_DAC_CLK_SEL (1 << 0) -# define DAC2_DAC2_CLK_SEL (1 << 1) -# define DAC2_PALETTE_ACC_CTL (1 << 5) -#define TV_DAC_CNTL 0x088c -/* TV_DAC_CNTL bit constants */ -# define TV_DAC_STD_MASK 0x0300 -# define TV_DAC_RDACPD (1 << 24) -# define TV_DAC_GDACPD (1 << 25) -# define TV_DAC_BDACPD (1 << 26) -#define CRTC_GEN_CNTL 0x0050 -/* CRTC_GEN_CNTL bit constants */ -# define CRTC_DBL_SCAN_EN 0x00000001 -# define CRTC_INTERLACE_EN (1 << 1) -# define CRTC_CSYNC_EN (1 << 4) -# define CRTC_CUR_EN 0x00010000 -# define CRTC_CUR_MODE_MASK (7 << 17) -# define CRTC_ICON_EN (1 << 20) -# define CRTC_EXT_DISP_EN (1 << 24) -# define CRTC_EN (1 << 25) -# define CRTC_DISP_REQ_EN_B (1 << 26) -#define CRTC2_GEN_CNTL 0x03f8 -/* CRTC2_GEN_CNTL bit constants */ -# define CRTC2_DBL_SCAN_EN (1 << 0) -# define CRTC2_INTERLACE_EN (1 << 1) -# define CRTC2_SYNC_TRISTAT (1 << 4) -# define CRTC2_HSYNC_TRISTAT (1 << 5) -# define CRTC2_VSYNC_TRISTAT (1 << 6) -# define CRTC2_CRT2_ON (1 << 7) -# define CRTC2_ICON_EN (1 << 15) -# define CRTC2_CUR_EN (1 << 16) -# define CRTC2_CUR_MODE_MASK (7 << 20) -# define CRTC2_DISP_DIS (1 << 23) -# define CRTC2_EN (1 << 25) -# define CRTC2_DISP_REQ_EN_B (1 << 26) -# define CRTC2_HSYNC_DIS (1 << 28) -# define CRTC2_VSYNC_DIS (1 << 29) -#define MEM_CNTL 0x0140 -/* MEM_CNTL bit constants */ -# define MEM_CTLR_STATUS_IDLE 0x00000000 -# define MEM_CTLR_STATUS_BUSY 0x00100000 -# define MEM_SEQNCR_STATUS_IDLE 0x00000000 -# define MEM_SEQNCR_STATUS_BUSY 0x00200000 -# define MEM_ARBITER_STATUS_IDLE 0x00000000 -# define MEM_ARBITER_STATUS_BUSY 0x00400000 -# define MEM_REQ_UNLOCK 0x00000000 -# define MEM_REQ_LOCK 0x00800000 -#define EXT_MEM_CNTL 0x0144 -#define MC_AGP_LOCATION 0x014C -#define MEM_IO_CNTL_A0 0x0178 -#define MEM_INIT_LATENCY_TIMER 0x0154 -#define MEM_SDRAM_MODE_REG 0x0158 -#define AGP_BASE 0x0170 -#ifdef RAGE128 -#define PCI_GART_PAGE 0x017c -#define PC_NGUI_MODE 0x0180 -#define PC_NGUI_CTLSTAT 0x0184 -# define PC_FLUSH_GUI (3 << 0) -# define PC_RI_GUI (1 << 2) -# define PC_FLUSH_ALL 0x00ff -# define PC_BUSY (1 << 31) -#define PC_MISC_CNTL 0x0188 -#else -#define MEM_IO_CNTL_A1 0x017C -#define MEM_IO_CNTL_B0 0x0180 -#define MEM_IO_CNTL_B1 0x0184 -#define MC_DEBUG 0x0188 -#endif -#define MC_STATUS 0x0150 -#define MEM_IO_OE_CNTL 0x018C -#define MC_FB_LOCATION 0x0148 -#define HOST_PATH_CNTL 0x0130 -#define MEM_VGA_WP_SEL 0x0038 -#define MEM_VGA_RP_SEL 0x003C -#define HDP_DEBUG 0x0138 -#define SW_SEMAPHORE 0x013C -#define SURFACE_CNTL 0x0B00 -/* SURFACE_CNTL bit constants */ -# define SURF_TRANSLATION_DIS (1 << 8) -# define NONSURF_AP0_SWP_16BPP (1 << 20) -# define NONSURF_AP0_SWP_32BPP (2 << 20) -#define SURFACE0_LOWER_BOUND 0x0B04 -#define SURFACE1_LOWER_BOUND 0x0B14 -#define SURFACE2_LOWER_BOUND 0x0B24 -#define SURFACE3_LOWER_BOUND 0x0B34 -#define SURFACE4_LOWER_BOUND 0x0B44 -#define SURFACE5_LOWER_BOUND 0x0B54 -#define SURFACE6_LOWER_BOUND 0x0B64 -#define SURFACE7_LOWER_BOUND 0x0B74 -#define SURFACE0_UPPER_BOUND 0x0B08 -#define SURFACE1_UPPER_BOUND 0x0B18 -#define SURFACE2_UPPER_BOUND 0x0B28 -#define SURFACE3_UPPER_BOUND 0x0B38 -#define SURFACE4_UPPER_BOUND 0x0B48 -#define SURFACE5_UPPER_BOUND 0x0B58 -#define SURFACE6_UPPER_BOUND 0x0B68 -#define SURFACE7_UPPER_BOUND 0x0B78 -#define SURFACE0_INFO 0x0B0C -#define SURFACE1_INFO 0x0B1C -#define SURFACE2_INFO 0x0B2C -#define SURFACE3_INFO 0x0B3C -#define SURFACE4_INFO 0x0B4C -#define SURFACE5_INFO 0x0B5C -#define SURFACE6_INFO 0x0B6C -#define SURFACE7_INFO 0x0B7C -#define SURFACE_ACCESS_FLAGS 0x0BF8 -#define SURFACE_ACCESS_CLR 0x0BFC -#define GEN_INT_CNTL 0x0040 -#define GEN_INT_STATUS 0x0044 -# define VSYNC_INT_AK (1 << 2) -# define VSYNC_INT (1 << 2) -#define CRTC_EXT_CNTL 0x0054 -/* CRTC_EXT_CNTL bit constants */ -# define CRTC_VGA_XOVERSCAN (1 << 0) -# define VGA_ATI_LINEAR 0x00000008 -# define VGA_128KAP_PAGING 0x00000010 -# define XCRT_CNT_EN (1 << 6) -# define CRTC_HSYNC_DIS (1 << 8) -# define CRTC_VSYNC_DIS (1 << 9) -# define CRTC_DISPLAY_DIS (1 << 10) -# define CRTC_SYNC_TRISTAT (1 << 11) -# define CRTC_CRT_ON (1 << 15) -#define CRTC_EXT_CNTL_DPMS_BYTE 0x0055 -# define CRTC_HSYNC_DIS_BYTE (1 << 0) -# define CRTC_VSYNC_DIS_BYTE (1 << 1) -# define CRTC_DISPLAY_DIS_BYTE (1 << 2) -#define RB3D_CNTL 0x1C3C -#define WAIT_UNTIL 0x1720 -# define EVENT_CRTC_OFFSET 0x00000001 -# define EVENT_RE_CRTC_VLINE 0x00000002 -# define EVENT_FE_CRTC_VLINE 0x00000004 -# define EVENT_CRTC_VLINE 0x00000008 -# define EVENT_BM_VIP0_IDLE 0x00000010 -# define EVENT_BM_VIP1_IDLE 0x00000020 -# define EVENT_BM_VIP2_IDLE 0x00000040 -# define EVENT_BM_VIP3_IDLE 0x00000080 -# define EVENT_BM_VIDCAP_IDLE 0x00000100 -# define EVENT_BM_GUI_IDLE 0x00000200 -# define EVENT_CMDFIFO 0x00000400 -# define EVENT_OV0_FLIP 0x00000800 -# define EVENT_CMDFIFO_ENTRIES 0x07F00000 -#define ISYNC_CNTL 0x1724 -#define RBBM_GUICNTL 0x172C -#define RBBM_STATUS 0x0E40 -# define RBBM_FIFOCNT_MASK 0x007f -# define RBBM_ACTIVE (1 << 31) -#define RBBM_STATUS_alt_1 0x1740 -#define RBBM_CNTL 0x00EC -#define RBBM_CNTL_alt_1 0x0E44 -#define RBBM_SOFT_RESET 0x00F0 -/* RBBM_SOFT_RESET bit constants */ -# define SOFT_RESET_CP (1 << 0) -# define SOFT_RESET_HI (1 << 1) -# define SOFT_RESET_SE (1 << 2) -# define SOFT_RESET_RE (1 << 3) -# define SOFT_RESET_PP (1 << 4) -# define SOFT_RESET_E2 (1 << 5) -# define SOFT_RESET_RB (1 << 6) -# define SOFT_RESET_HDP (1 << 7) -#define RBBM_SOFT_RESET_alt_1 0x0E48 -#define NQWAIT_UNTIL 0x0E50 -#define RBBM_DEBUG 0x0E6C -#define RBBM_CMDFIFO_ADDR 0x0E70 -#define RBBM_CMDFIFO_DATAL 0x0E74 -#define RBBM_CMDFIFO_DATAH 0x0E78 -#define RBBM_CMDFIFO_STAT 0x0E7C -#define CRTC_STATUS 0x005C -/* CRTC_STATUS bit constants */ -# define CRTC_VBLANK 0x00000001 -# define CRTC_VBLANK_SAVE ( 1 << 1) -#define GPIO_VGA_DDC 0x0060 -#define GPIO_DVI_DDC 0x0064 -#define GPIO_MONID 0x0068 -#define PALETTE_INDEX 0x00B0 -#define PALETTE_DATA 0x00B4 -#define PALETTE_30_DATA 0x00B8 -#define CRTC_H_TOTAL_DISP 0x0200 -# define CRTC_H_TOTAL (0x03ff << 0) -# define CRTC_H_TOTAL_SHIFT 0 -# define CRTC_H_DISP (0x01ff << 16) -# define CRTC_H_DISP_SHIFT 16 -#define CRTC2_H_TOTAL_DISP 0x0300 -# define CRTC2_H_TOTAL (0x03ff << 0) -# define CRTC2_H_TOTAL_SHIFT 0 -# define CRTC2_H_DISP (0x01ff << 16) -# define CRTC2_H_DISP_SHIFT 16 -#define CRTC_H_SYNC_STRT_WID 0x0204 -# define CRTC_H_SYNC_STRT_PIX (0x07 << 0) -# define CRTC_H_SYNC_STRT_CHAR (0x3ff << 3) -# define CRTC_H_SYNC_STRT_CHAR_SHIFT 3 -# define CRTC_H_SYNC_WID (0x3f << 16) -# define CRTC_H_SYNC_WID_SHIFT 16 -# define CRTC_H_SYNC_POL (1 << 23) -#define CRTC2_H_SYNC_STRT_WID 0x0304 -# define CRTC2_H_SYNC_STRT_PIX (0x07 << 0) -# define CRTC2_H_SYNC_STRT_CHAR (0x3ff << 3) -# define CRTC2_H_SYNC_STRT_CHAR_SHIFT 3 -# define CRTC2_H_SYNC_WID (0x3f << 16) -# define CRTC2_H_SYNC_WID_SHIFT 16 -# define CRTC2_H_SYNC_POL (1 << 23) -#define CRTC_V_TOTAL_DISP 0x0208 -# define CRTC_V_TOTAL (0x07ff << 0) -# define CRTC_V_TOTAL_SHIFT 0 -# define CRTC_V_DISP (0x07ff << 16) -# define CRTC_V_DISP_SHIFT 16 -#define CRTC2_V_TOTAL_DISP 0x0308 -# define CRTC2_V_TOTAL (0x07ff << 0) -# define CRTC2_V_TOTAL_SHIFT 0 -# define CRTC2_V_DISP (0x07ff << 16) -# define CRTC2_V_DISP_SHIFT 16 -#define CRTC_V_SYNC_STRT_WID 0x020C -# define CRTC_V_SYNC_STRT (0x7ff << 0) -# define CRTC_V_SYNC_STRT_SHIFT 0 -# define CRTC_V_SYNC_WID (0x1f << 16) -# define CRTC_V_SYNC_WID_SHIFT 16 -# define CRTC_V_SYNC_POL (1 << 23) -#define CRTC2_V_SYNC_STRT_WID 0x030C -# define CRTC2_V_SYNC_STRT (0x7ff << 0) -# define CRTC2_V_SYNC_STRT_SHIFT 0 -# define CRTC2_V_SYNC_WID (0x1f << 16) -# define CRTC2_V_SYNC_WID_SHIFT 16 -# define CRTC2_V_SYNC_POL (1 << 23) -#define CRTC_VLINE_CRNT_VLINE 0x0210 -# define CRTC_CRNT_VLINE_MASK (0x7ff << 16) -#define CRTC2_VLINE_CRNT_VLINE 0x0310 -#define CRTC_CRNT_FRAME 0x0214 -#define CRTC2_CRNT_FRAME 0x0314 -#define CRTC_GUI_TRIG_VLINE 0x0218 -#define CRTC2_GUI_TRIG_VLINE 0x0318 -#define CRTC_DEBUG 0x021C -#define CRTC2_DEBUG 0x031C -#define CRTC_OFFSET_RIGHT 0x0220 -#define CRTC_OFFSET 0x0224 -#define CRTC2_OFFSET 0x0324 -#define CRTC_OFFSET_CNTL 0x0228 -# define CRTC_TILE_EN (1 << 15) -#define CRTC2_OFFSET_CNTL 0x0328 -# define CRTC2_TILE_EN (1 << 15) -#define CRTC_PITCH 0x022C -#define CRTC2_PITCH 0x032C -#define TMDS_CRC 0x02a0 -#define OVR_CLR 0x0230 -#define OVR_WID_LEFT_RIGHT 0x0234 -#define OVR_WID_TOP_BOTTOM 0x0238 -#define DISPLAY_BASE_ADDR 0x023C -#define SNAPSHOT_VH_COUNTS 0x0240 -#define SNAPSHOT_F_COUNT 0x0244 -#define N_VIF_COUNT 0x0248 -#define SNAPSHOT_VIF_COUNT 0x024C -#define FP_CRTC_H_TOTAL_DISP 0x0250 -#define FP_CRTC2_H_TOTAL_DISP 0x0350 -#define FP_CRTC_V_TOTAL_DISP 0x0254 -#define FP_CRTC2_V_TOTAL_DISP 0x0354 -# define FP_CRTC_H_TOTAL_MASK 0x000003ff -# define FP_CRTC_H_DISP_MASK 0x01ff0000 -# define FP_CRTC_V_TOTAL_MASK 0x00000fff -# define FP_CRTC_V_DISP_MASK 0x0fff0000 -# define FP_H_SYNC_STRT_CHAR_MASK 0x00001ff8 -# define FP_H_SYNC_WID_MASK 0x003f0000 -# define FP_V_SYNC_STRT_MASK 0x00000fff -# define FP_V_SYNC_WID_MASK 0x001f0000 -# define FP_CRTC_H_TOTAL_SHIFT 0x00000000 -# define FP_CRTC_H_DISP_SHIFT 0x00000010 -# define FP_CRTC_V_TOTAL_SHIFT 0x00000000 -# define FP_CRTC_V_DISP_SHIFT 0x00000010 -# define FP_H_SYNC_STRT_CHAR_SHIFT 0x00000003 -# define FP_H_SYNC_WID_SHIFT 0x00000010 -# define FP_V_SYNC_STRT_SHIFT 0x00000000 -# define FP_V_SYNC_WID_SHIFT 0x00000010 -#define CRT_CRTC_H_SYNC_STRT_WID 0x0258 -#define CRT_CRTC_V_SYNC_STRT_WID 0x025C -#define CUR_OFFSET 0x0260 -#define CUR_HORZ_VERT_POSN 0x0264 -#define CUR_HORZ_VERT_OFF 0x0268 -/* CUR_OFFSET, CUR_HORZ_VERT_POSN, CUR_HORZ_VERT_OFF bit constants */ -# define CUR_LOCK 0x80000000 -#define CUR_CLR0 0x026C -#define CUR_CLR1 0x0270 -#define CUR2_OFFSET 0x0360 -#define CUR2_HORZ_VERT_POSN 0x0364 -#define CUR2_HORZ_VERT_OFF 0x0368 -# define CUR2_LOCK (1 << 31) -#define CUR2_CLR0 0x036c -#define CUR2_CLR1 0x0370 -#define FP_HORZ_VERT_ACTIVE 0x0278 -#define CRTC_MORE_CNTL 0x027C -#define DAC_EXT_CNTL 0x0280 -#define FP_GEN_CNTL 0x0284 -/* FP_GEN_CNTL bit constants */ -# define FP_FPON (1 << 0) -# define FP_TMDS_EN (1 << 2) -# define FP_EN_TMDS (1 << 7) -# define FP_DETECT_SENSE (1 << 8) -# define FP_SEL_CRTC2 (1 << 13) -# define FP_CRTC_DONT_SHADOW_HPAR (1 << 15) -# define FP_CRTC_DONT_SHADOW_VPAR (1 << 16) -# define FP_CRTC_DONT_SHADOW_HEND (1 << 17) -# define FP_CRTC_USE_SHADOW_VEND (1 << 18) -# define FP_RMX_HVSYNC_CONTROL_EN (1 << 20) -# define FP_DFP_SYNC_SEL (1 << 21) -# define FP_CRTC_LOCK_8DOT (1 << 22) -# define FP_CRT_SYNC_SEL (1 << 23) -# define FP_USE_SHADOW_EN (1 << 24) -# define FP_CRT_SYNC_ALT (1 << 26) -#define FP2_GEN_CNTL 0x0288 -/* FP2_GEN_CNTL bit constants */ -# define FP2_FPON (1 << 0) -# define FP2_TMDS_EN (1 << 2) -# define FP2_EN_TMDS (1 << 7) -# define FP2_DETECT_SENSE (1 << 8) -# define FP2_SEL_CRTC2 (1 << 13) -# define FP2_FP_POL (1 << 16) -# define FP2_LP_POL (1 << 17) -# define FP2_SCK_POL (1 << 18) -# define FP2_LCD_CNTL_MASK (7 << 19) -# define FP2_PAD_FLOP_EN (1 << 22) -# define FP2_CRC_EN (1 << 23) -# define FP2_CRC_READ_EN (1 << 24) -#define FP_HORZ_STRETCH 0x028C -#define FP_HORZ2_STRETCH 0x038C -# define HORZ_STRETCH_RATIO_MASK 0xffff -# define HORZ_STRETCH_RATIO_MAX 4096 -# define HORZ_PANEL_SIZE (0x1ff << 16) -# define HORZ_PANEL_SHIFT 16 -# define HORZ_STRETCH_PIXREP (0 << 25) -# define HORZ_STRETCH_BLEND (1 << 26) -# define HORZ_STRETCH_ENABLE (1 << 25) -# define HORZ_AUTO_RATIO (1 << 27) -# define HORZ_FP_LOOP_STRETCH (0x7 << 28) -# define HORZ_AUTO_RATIO_INC (1 << 31) -#define FP_VERT_STRETCH 0x0290 -#define FP_VERT2_STRETCH 0x0390 -# define VERT_PANEL_SIZE (0xfff << 12) -# define VERT_PANEL_SHIFT 12 -# define VERT_STRETCH_RATIO_MASK 0xfff -# define VERT_STRETCH_RATIO_SHIFT 0 -# define VERT_STRETCH_RATIO_MAX 4096 -# define VERT_STRETCH_ENABLE (1 << 25) -# define VERT_STRETCH_LINEREP (0 << 26) -# define VERT_STRETCH_BLEND (1 << 26) -# define VERT_AUTO_RATIO_EN (1 << 27) -# define VERT_STRETCH_RESERVED 0xf1000000 -#define FP_H_SYNC_STRT_WID 0x02C4 -#define FP_H2_SYNC_STRT_WID 0x03C4 -#define FP_V_SYNC_STRT_WID 0x02C8 -#define FP_V2_SYNC_STRT_WID 0x03C8 -#define LVDS_GEN_CNTL 0x02d0 -# define LVDS_ON (1 << 0) -# define LVDS_DISPLAY_DIS (1 << 1) -# define LVDS_PANEL_TYPE (1 << 2) -# define LVDS_PANEL_FORMAT (1 << 3) -# define LVDS_EN (1 << 7) -# define LVDS_DIGON (1 << 18) -# define LVDS_BLON (1 << 19) -# define LVDS_SEL_CRTC2 (1 << 23) -#define LVDS_PLL_CNTL 0x02d4 -# define HSYNC_DELAY_SHIFT 28 -# define HSYNC_DELAY_MASK (0xf << 28) -#define AUX_WINDOW_HORZ_CNTL 0x02D8 -#define AUX_WINDOW_VERT_CNTL 0x02DC -#define DDA_CONFIG 0x02e0 -#define DDA_ON_OFF 0x02e4 - -#define GRPH_BUFFER_CNTL 0x02F0 -#define VGA_BUFFER_CNTL 0x02F4 - -/* first overlay unit (there is only one) */ - -#define OV0_Y_X_START 0x0400 -#define OV0_Y_X_END 0x0404 -#define OV0_PIPELINE_CNTL 0x0408 -#define OV0_EXCLUSIVE_HORZ 0x0408 -# define EXCL_HORZ_START_MASK 0x000000ff -# define EXCL_HORZ_END_MASK 0x0000ff00 -# define EXCL_HORZ_BACK_PORCH_MASK 0x00ff0000 -# define EXCL_HORZ_EXCLUSIVE_EN 0x80000000 -#define OV0_EXCLUSIVE_VERT 0x040C -# define EXCL_VERT_START_MASK 0x000003ff -# define EXCL_VERT_END_MASK 0x03ff0000 -#define OV0_REG_LOAD_CNTL 0x0410 -# define REG_LD_CTL_LOCK 0x00000001L -# define REG_LD_CTL_VBLANK_DURING_LOCK 0x00000002L -# define REG_LD_CTL_STALL_GUI_UNTIL_FLIP 0x00000004L -# define REG_LD_CTL_LOCK_READBACK 0x00000008L -#define OV0_SCALE_CNTL 0x0420 -# define SCALER_PIX_EXPAND 0x00000001L -# define SCALER_Y2R_TEMP 0x00000002L -#ifdef RAGE128 -# define SCALER_HORZ_PICK_NEAREST 0x00000003L -# define SCALER_VERT_PICK_NEAREST 0x00000004L -#else -# define SCALER_HORZ_PICK_NEAREST 0x00000004L -# define SCALER_VERT_PICK_NEAREST 0x00000008L -#endif -# define SCALER_SIGNED_UV 0x00000010L -# define SCALER_GAMMA_SEL_MASK 0x00000060L -# define SCALER_GAMMA_SEL_BRIGHT 0x00000000L -# define SCALER_GAMMA_SEL_G22 0x00000020L -# define SCALER_GAMMA_SEL_G18 0x00000040L -# define SCALER_GAMMA_SEL_G14 0x00000060L -# define SCALER_COMCORE_SHIFT_UP_ONE 0x00000080L -# define SCALER_SURFAC_FORMAT 0x00000f00L -# define SCALER_SOURCE_UNK0 0x00000000L /* 2 bpp ??? */ -# define SCALER_SOURCE_UNK1 0x00000100L /* 4 bpp ??? */ -# define SCALER_SOURCE_UNK2 0x00000200L /* 8 bpp ??? */ -# define SCALER_SOURCE_15BPP 0x00000300L -# define SCALER_SOURCE_16BPP 0x00000400L -/*# define SCALER_SOURCE_24BPP 0x00000500L*/ -# define SCALER_SOURCE_32BPP 0x00000600L -# define SCALER_SOURCE_UNK3 0x00000700L /* 8BPP_RGB332 ??? */ -# define SCALER_SOURCE_UNK4 0x00000800L /* 8BPP_Y8 ??? */ -# define SCALER_SOURCE_YUV9 0x00000900L /* 8BPP_RGB8 */ -# define SCALER_SOURCE_YUV12 0x00000A00L -# define SCALER_SOURCE_VYUY422 0x00000B00L -# define SCALER_SOURCE_YVYU422 0x00000C00L -# define SCALER_SOURCE_UNK5 0x00000D00L /* ??? */ -# define SCALER_SOURCE_UNK6 0x00000E00L /* 32BPP_AYUV444 */ -# define SCALER_SOURCE_UNK7 0x00000F00L /* 16BPP_ARGB4444 */ -# define SCALER_ADAPTIVE_DEINT 0x00001000L -# define R200_SCALER_TEMPORAL_DEINT 0x00002000L -# define SCALER_UNKNOWN_FLAG1 0x00004000L /* ??? */ -# define SCALER_SMART_SWITCH 0x00008000L -#ifdef RAGE128 -# define SCALER_BURST_PER_PLANE 0x00ff0000L -#else -# define SCALER_BURST_PER_PLANE 0x007f0000L -#endif -# define SCALER_DOUBLE_BUFFER 0x01000000L -# define SCALER_UNKNOWN_FLAG3 0x02000000L /* ??? */ -# define SCALER_UNKNOWN_FLAG4 0x04000000L /* ??? */ -# define SCALER_DIS_LIMIT 0x08000000L -# define SCALER_PRG_LOAD_START 0x10000000L -# define SCALER_INT_EMU 0x20000000L -# define SCALER_ENABLE 0x40000000L -# define SCALER_SOFT_RESET 0x80000000L -#define OV0_V_INC 0x0424 -#define OV0_P1_V_ACCUM_INIT 0x0428 -# define OV0_P1_MAX_LN_IN_PER_LN_OUT 0x00000003L -# define OV0_P1_V_ACCUM_INIT_MASK 0x01ff8000L -#define OV0_P23_V_ACCUM_INIT 0x042C -# define OV0_P23_MAX_LN_IN_PER_LN_OUT 0x00000003L -# define OV0_P23_V_ACCUM_INIT_MASK 0x01ff8000L -#define OV0_P1_BLANK_LINES_AT_TOP 0x0430 -# define P1_BLNK_LN_AT_TOP_M1_MASK 0x00000fffL -# define P1_ACTIVE_LINES_M1 0x0fff0000L -#define OV0_P23_BLANK_LINES_AT_TOP 0x0434 -# define P23_BLNK_LN_AT_TOP_M1_MASK 0x000007ffL -# define P23_ACTIVE_LINES_M1 0x07ff0000L -#ifndef RAGE128 -#define OV0_BASE_ADDR 0x043C -#endif -#define OV0_VID_BUF0_BASE_ADRS 0x0440 -# define VIF_BUF0_PITCH_SEL 0x00000001L -# define VIF_BUF0_TILE_ADRS 0x00000002L -# define VIF_BUF0_BASE_ADRS_MASK 0x03fffff0L -# define VIF_BUF0_1ST_LINE_LSBS_MASK 0x48000000L -#define OV0_VID_BUF1_BASE_ADRS 0x0444 -# define VIF_BUF1_PITCH_SEL 0x00000001L -# define VIF_BUF1_TILE_ADRS 0x00000002L -# define VIF_BUF1_BASE_ADRS_MASK 0x03fffff0L -# define VIF_BUF1_1ST_LINE_LSBS_MASK 0x48000000L -#define OV0_VID_BUF2_BASE_ADRS 0x0448 -# define VIF_BUF2_PITCH_SEL 0x00000001L -# define VIF_BUF2_TILE_ADRS 0x00000002L -# define VIF_BUF2_BASE_ADRS_MASK 0x03fffff0L -# define VIF_BUF2_1ST_LINE_LSBS_MASK 0x48000000L -#define OV0_VID_BUF3_BASE_ADRS 0x044C -# define VIF_BUF3_PITCH_SEL 0x00000001L -# define VIF_BUF3_TILE_ADRS 0x00000002L -# define VIF_BUF3_BASE_ADRS_MASK 0x03fffff0L -# define VIF_BUF3_1ST_LINE_LSBS_MASK 0x48000000L -#define OV0_VID_BUF4_BASE_ADRS 0x0450 -# define VIF_BUF4_PITCH_SEL 0x00000001L -# define VIF_BUF4_TILE_ADRS 0x00000002L -# define VIF_BUF4_BASE_ADRS_MASK 0x03fffff0L -# define VIF_BUF4_1ST_LINE_LSBS_MASK 0x48000000L -#define OV0_VID_BUF5_BASE_ADRS 0x0454 -# define VIF_BUF5_PITCH_SEL 0x00000001L -# define VIF_BUF5_TILE_ADRS 0x00000002L -# define VIF_BUF5_BASE_ADRS_MASK 0x03fffff0L -# define VIF_BUF5_1ST_LINE_LSBS_MASK 0x48000000L -#define OV0_VID_BUF_PITCH0_VALUE 0x0460 -#define OV0_VID_BUF_PITCH1_VALUE 0x0464 -#define OV0_AUTO_FLIP_CNTL 0x0470 -# define OV0_AUTO_FLIP_CNTL_SOFT_BUF_NUM 0x00000007 -# define OV0_AUTO_FLIP_CNTL_SOFT_REPEAT_FIELD 0x00000008 -# define OV0_AUTO_FLIP_CNTL_SOFT_BUF_ODD 0x00000010 -# define OV0_AUTO_FLIP_CNTL_IGNORE_REPEAT_FIELD 0x00000020 -# define OV0_AUTO_FLIP_CNTL_SOFT_EOF_TOGGLE 0x00000040 -# define OV0_AUTO_FLIP_CNTL_VID_PORT_SELECT 0x00000300 -# define OV0_AUTO_FLIP_CNTL_P1_FIRST_LINE_EVEN 0x00010000 -# define OV0_AUTO_FLIP_CNTL_SHIFT_EVEN_DOWN 0x00040000 -# define OV0_AUTO_FLIP_CNTL_SHIFT_ODD_DOWN 0x00080000 -# define OV0_AUTO_FLIP_CNTL_FIELD_POL_SOURCE 0x00800000 -#define OV0_DEINTERLACE_PATTERN 0x0474 -#define OV0_SUBMIT_HISTORY 0x0478 -#define OV0_H_INC 0x0480 -#define OV0_STEP_BY 0x0484 -#define OV0_P1_H_ACCUM_INIT 0x0488 -#define OV0_P23_H_ACCUM_INIT 0x048C -#define OV0_P1_X_START_END 0x0494 -#define OV0_P2_X_START_END 0x0498 -#define OV0_P3_X_START_END 0x049C -#define OV0_FILTER_CNTL 0x04A0 -# define FILTER_PROGRAMMABLE_COEF 0x00000000 -# define FILTER_HARD_SCALE_HORZ_Y 0x00000001 -# define FILTER_HARD_SCALE_HORZ_UV 0x00000002 -# define FILTER_HARD_SCALE_VERT_Y 0x00000004 -# define FILTER_HARD_SCALE_VERT_UV 0x00000008 -# define FILTER_HARDCODED_COEF 0x0000000F -# define FILTER_COEF_MASK 0x0000000F -/* When bit is set hard coded coefficients are used. */ - -/* - Top quality 4x4-tap filtered vertical and horizontal scaler. - It allows up to 64:1 upscaling and downscaling without - performance or quality degradation. -*/ -#define OV0_FOUR_TAP_COEF_0 0x04B0 -# define OV0_FOUR_TAP_PHASE_0_TAP_0 0x0000000F -# define OV0_FOUR_TAP_PHASE_0_TAP_1 0x00007F00 -# define OV0_FOUR_TAP_PHASE_0_TAP_2 0x007F0000 -# define OV0_FOUR_TAP_PHASE_0_TAP_3 0x0F000000 -#define OV0_FOUR_TAP_COEF_1 0x04B4 -# define OV0_FOUR_TAP_PHASE_1_5_TAP_0 0x0000000F -# define OV0_FOUR_TAP_PHASE_1_5_TAP_1 0x00007F00 -# define OV0_FOUR_TAP_PHASE_1_5_TAP_2 0x007F0000 -# define OV0_FOUR_TAP_PHASE_1_5_TAP_3 0x0F000000 -#define OV0_FOUR_TAP_COEF_2 0x04B8 -# define OV0_FOUR_TAP_PHASE_2_6_TAP_0 0x0000000F -# define OV0_FOUR_TAP_PHASE_2_6_TAP_1 0x00007F00 -# define OV0_FOUR_TAP_PHASE_2_6_TAP_2 0x007F0000 -# define OV0_FOUR_TAP_PHASE_2_6_TAP_3 0x0F000000 -#define OV0_FOUR_TAP_COEF_3 0x04BC -# define OV0_FOUR_TAP_PHASE_3_7_TAP_0 0x0000000F -# define OV0_FOUR_TAP_PHASE_3_7_TAP_1 0x00007F00 -# define OV0_FOUR_TAP_PHASE_3_7_TAP_2 0x007F0000 -# define OV0_FOUR_TAP_PHASE_3_7_TAP_3 0x0F000000 -#define OV0_FOUR_TAP_COEF_4 0x04C0 -# define OV0_FOUR_TAP_PHASE_4_TAP_0 0x0000000F -# define OV0_FOUR_TAP_PHASE_4_TAP_1 0x00007F00 -# define OV0_FOUR_TAP_PHASE_4_TAP_2 0x007F0000 -# define OV0_FOUR_TAP_PHASE_4_TAP_3 0x0F000000 -/* 0th_tap means that the left most of top most pixel in a set of four will - be multiplied by this coefficient. */ - -#define OV0_FLAG_CNTL 0x04DC -#ifdef RAGE128 -#define OV0_COLOUR_CNTL 0x04E0 -# define COLOUR_CNTL_BRIGHTNESS 0x0000007F -# define COLOUR_CNTL_SATURATION 0x001F1F00 -#else -/* NB: radeons have no COLOUR_CNTL register */ -#define OV0_SLICE_CNTL 0x04E0 -# define SLICE_CNTL_DISABLE 0x40000000 -#endif -/* Video and graphics keys allow alpha blending, color correction - and many other video effects */ -#define OV0_VID_KEY_CLR 0x04E4 -#define OV0_VID_KEY_MSK 0x04E8 -#define OV0_GRAPHICS_KEY_CLR 0x04EC -#define OV0_GRAPHICS_KEY_MSK 0x04F0 -#define OV0_KEY_CNTL 0x04F4 -#ifdef RAGE128 -# define VIDEO_KEY_FN_MASK 0x00000007L -# define VIDEO_KEY_FN_FALSE 0x00000000L -# define VIDEO_KEY_FN_TRUE 0x00000001L -# define VIDEO_KEY_FN_EQ 0x00000004L -# define VIDEO_KEY_FN_NE 0x00000005L -# define GRAPHIC_KEY_FN_MASK 0x00000070L -# define GRAPHIC_KEY_FN_FALSE 0x00000000L -# define GRAPHIC_KEY_FN_TRUE 0x00000010L -# define GRAPHIC_KEY_FN_EQ 0x00000040L -# define GRAPHIC_KEY_FN_NE 0x00000050L -#else -# define VIDEO_KEY_FN_MASK 0x00000003L -# define VIDEO_KEY_FN_FALSE 0x00000000L -# define VIDEO_KEY_FN_TRUE 0x00000001L -# define VIDEO_KEY_FN_EQ 0x00000002L -# define VIDEO_KEY_FN_NE 0x00000003L -# define GRAPHIC_KEY_FN_MASK 0x00000030L -# define GRAPHIC_KEY_FN_FALSE 0x00000000L -# define GRAPHIC_KEY_FN_TRUE 0x00000010L -# define GRAPHIC_KEY_FN_EQ 0x00000020L -# define GRAPHIC_KEY_FN_NE 0x00000030L -#endif -# define CMP_MIX_MASK 0x00000100L -# define CMP_MIX_OR 0x00000000L -# define CMP_MIX_AND 0x00000100L -#define OV0_TEST 0x04F8 -# define OV0_SCALER_Y2R_DISABLE 0x00000001L -# define OV0_SUBPIC_ONLY 0x00000008L -# define OV0_EXTENSE 0x00000010L -# define OV0_SWAP_UV 0x00000020L -#define OV0_COL_CONV 0x04FC -# define OV0_CB_TO_B 0x0000007FL -# define OV0_CB_TO_G 0x0000FF00L -# define OV0_CR_TO_G 0x00FF0000L -# define OV0_CR_TO_R 0x7F000000L -# define OV0_NEW_COL_CONV 0x80000000L -#define OV0_LIN_TRANS_A 0x0D20 -#define OV0_LIN_TRANS_B 0x0D24 -#define OV0_LIN_TRANS_C 0x0D28 -#define OV0_LIN_TRANS_D 0x0D2C -#define OV0_LIN_TRANS_E 0x0D30 -#define OV0_LIN_TRANS_F 0x0D34 -#define OV0_GAMMA_0_F 0x0D40 -#define OV0_GAMMA_10_1F 0x0D44 -#define OV0_GAMMA_20_3F 0x0D48 -#define OV0_GAMMA_40_7F 0x0D4C -/* These registers exist on R200 only */ -#define OV0_GAMMA_80_BF 0x0E00 -#define OV0_GAMMA_C0_FF 0x0E04 -#define OV0_GAMMA_100_13F 0x0E08 -#define OV0_GAMMA_140_17F 0x0E0C -#define OV0_GAMMA_180_1BF 0x0E10 -#define OV0_GAMMA_1C0_1FF 0x0E14 -#define OV0_GAMMA_200_23F 0x0E18 -#define OV0_GAMMA_240_27F 0x0E1C -#define OV0_GAMMA_280_2BF 0x0E20 -#define OV0_GAMMA_2C0_2FF 0x0E24 -#define OV0_GAMMA_300_33F 0x0E28 -#define OV0_GAMMA_340_37F 0x0E2C -/* End of R200 specific definitions */ -#define OV0_GAMMA_380_3BF 0x0D50 -#define OV0_GAMMA_3C0_3FF 0x0D54 - -/* - IDCT ENGINE: - It's MPEG-2 hardware decoder which incorporates run-level decode, de-zigzag - and IDCT into an IDCT engine to complement the motion compensation engine. -*/ -#define IDCT_RUNS 0x1F80 -#define IDCT_LEVELS 0x1F84 -#define IDCT_AUTH_CONTROL 0x1F88 -#define IDCT_AUTH 0x1F8C -#define IDCT_CONTROL 0x1FBC - -#define SE_MC_SRC2_CNTL 0x19D4 -# define SECONDARY_SCALE_HACC 0x00001FFFL -# define SECONDARY_SCALE_VACC 0x0FFF0000L -# define SECONDARY_SCALE_PICTH_ADJ 0xC0000000L -#define SE_MC_SRC1_CNTL 0x19D8 -# define SCALE_HACC 0x00001FFFL -# define SCALE_VACC 0x0FFF0000L -# define IDCT_EN 0x10000000L -# define SECONDARY_TEX_EN 0x20000000L -# define SCALE_PICTH_ADJ 0xC0000000L -#define SE_MC_DST_CNTL 0x19DC -# define DST_Y 0x00003FFFL -# define DST_X 0x3FFF0000L -# define DST_PITCH_ADJ 0xC0000000L -#define SE_MC_CNTL_START 0x19E0 -# define SCALE_OFFSET_PTR 0x0000000FL -# define DST_OFFSET 0x00FFFFF0L -# define ALPHA_EN 0x01000000L -# define SECONDARY_OFFSET_PTR 0x1E000000L -# define MC_DST_HEIGHT_WIDTH 0xE0000000L -#ifndef RAGE128 -#define SE_MC_BUF_BASE 0x19E4 -#define PP_MC_CONTEXT 0x19E8 -#define PP_MISC 0x1C14 -#endif -/* - SUBPICTURE UNIT: - Decompressing, scaling and alpha blending the compressed bitmap on the fly. - Provide optimal DVD subpicture qualtity. -*/ -#define SUBPIC_CNTL 0x0540 -#define SUBPIC_DEFCOLCON 0x0544 -#define SUBPIC_Y_X_START 0x054C -#define SUBPIC_Y_X_END 0x0550 -#define SUBPIC_V_INC 0x0554 -#define SUBPIC_H_INC 0x0558 -#define SUBPIC_BUF0_OFFSET 0x055C -#define SUBPIC_BUF1_OFFSET 0x0560 -#define SUBPIC_LC0_OFFSET 0x0564 -#define SUBPIC_LC1_OFFSET 0x0568 -#define SUBPIC_PITCH 0x056C -#define SUBPIC_BTN_HLI_COLCON 0x0570 -#define SUBPIC_BTN_HLI_Y_X_START 0x0574 -#define SUBPIC_BTN_HLI_Y_X_END 0x0578 -#define SUBPIC_PALETTE_INDEX 0x057C -#define SUBPIC_PALETTE_DATA 0x0580 -#define SUBPIC_H_ACCUM_INIT 0x0584 -#define SUBPIC_V_ACCUM_INIT 0x0588 - -#define CP_RB_BASE 0x0700 -#define CP_RB_CNTL 0x0704 -#define CP_RB_RPTR_ADDR 0x070C -#define CP_RB_RPTR 0x0710 -#define CP_RB_WPTR 0x0714 -#define CP_RB_WPTR_DELAY 0x0718 -#define CP_IB_BASE 0x0738 -#define CP_IB_BUFSZ 0x073C -#define CP_CSQ_CNTL 0x0740 -#define SCRATCH_UMSK 0x0770 -#define SCRATCH_ADDR 0x0774 -#ifndef RAGE128 -#define DMA_GUI_TABLE_ADDR 0x0780 -# define DMA_GUI_COMMAND__BYTE_COUNT_MASK 0x001fffff -# define DMA_GUI_COMMAND__INTDIS 0x40000000 -# define DMA_GUI_COMMAND__EOL 0x80000000 -#define DMA_GUI_SRC_ADDR 0x0784 -#define DMA_GUI_DST_ADDR 0x0788 -#define DMA_GUI_COMMAND 0x078C -#define DMA_GUI_STATUS 0x0790 -#define DMA_GUI_ACT_DSCRPTR 0x0794 -#define DMA_VID_TABLE_ADDR 0x07A0 -#define DMA_VID_SRC_ADDR 0x07A4 -#define DMA_VID_DST_ADDR 0x07A8 -#define DMA_VID_COMMAND 0x07AC -#define DMA_VID_STATUS 0x07B0 -#define DMA_VID_ACT_DSCRPTR 0x07B4 -#endif -#define CP_ME_CNTL 0x07D0 -#define CP_ME_RAM_ADDR 0x07D4 -#define CP_ME_RAM_RADDR 0x07D8 -#define CP_ME_RAM_DATAH 0x07DC -#define CP_ME_RAM_DATAL 0x07E0 -#define CP_CSQ_ADDR 0x07F0 -#define CP_CSQ_DATA 0x07F4 -#define CP_CSQ_STAT 0x07F8 - -#define DISP_MISC_CNTL 0x0D00 -# define SOFT_RESET_GRPH_PP (1 << 0) -#define DAC_MACRO_CNTL 0x0D04 -#define DISP_PWR_MAN 0x0D08 -#define DISP_TEST_DEBUG_CNTL 0x0D10 -#define DISP_HW_DEBUG 0x0D14 -#define DAC_CRC_SIG1 0x0D18 -#define DAC_CRC_SIG2 0x0D1C - -/* first capture unit */ - -#define VID_BUFFER_CONTROL 0x0900 -#define CAP_INT_CNTL 0x0908 -#define CAP_INT_STATUS 0x090C -#define FCP_CNTL 0x0910 -# define FCP_CNTL__PCICLK 0 -# define FCP_CNTL__PCLK 1 -# define FCP_CNTL__PCLKb 2 -# define FCP_CNTL__HREF 3 -# define FCP_CNTL__GND 4 -# define FCP_CNTL__HREFb 5 - -#define CAP0_BUF0_OFFSET 0x0920 -#define CAP0_BUF1_OFFSET 0x0924 -#define CAP0_BUF0_EVEN_OFFSET 0x0928 -#define CAP0_BUF1_EVEN_OFFSET 0x092C -#define CAP0_BUF_PITCH 0x0930 -#define CAP0_V_WINDOW 0x0934 -#define CAP0_H_WINDOW 0x0938 -#define CAP0_VBI0_OFFSET 0x093C -#define CAP0_VBI1_OFFSET 0x0940 -#define CAP0_VBI_V_WINDOW 0x0944 -#define CAP0_VBI_H_WINDOW 0x0948 -#define CAP0_PORT_MODE_CNTL 0x094C -#define CAP0_TRIG_CNTL 0x0950 -#define CAP0_DEBUG 0x0954 -#define CAP0_CONFIG 0x0958 -# define CAP0_CONFIG_CONTINUOS 0x00000001 -# define CAP0_CONFIG_START_FIELD_EVEN 0x00000002 -# define CAP0_CONFIG_START_BUF_GET 0x00000004 -# define CAP0_CONFIG_START_BUF_SET 0x00000008 -# define CAP0_CONFIG_BUF_TYPE_ALT 0x00000010 -# define CAP0_CONFIG_BUF_TYPE_FRAME 0x00000020 -# define CAP0_CONFIG_ONESHOT_MODE_FRAME 0x00000040 -# define CAP0_CONFIG_BUF_MODE_DOUBLE 0x00000080 -# define CAP0_CONFIG_BUF_MODE_TRIPLE 0x00000100 -# define CAP0_CONFIG_MIRROR_EN 0x00000200 -# define CAP0_CONFIG_ONESHOT_MIRROR_EN 0x00000400 -# define CAP0_CONFIG_VIDEO_SIGNED_UV 0x00000800 -# define CAP0_CONFIG_ANC_DECODE_EN 0x00001000 -# define CAP0_CONFIG_VBI_EN 0x00002000 -# define CAP0_CONFIG_SOFT_PULL_DOWN_EN 0x00004000 -# define CAP0_CONFIG_VIP_EXTEND_FLAG_EN 0x00008000 -# define CAP0_CONFIG_FAKE_FIELD_EN 0x00010000 -# define CAP0_CONFIG_ODD_ONE_MORE_LINE 0x00020000 -# define CAP0_CONFIG_EVEN_ONE_MORE_LINE 0x00040000 -# define CAP0_CONFIG_HORZ_DIVIDE_2 0x00080000 -# define CAP0_CONFIG_HORZ_DIVIDE_4 0x00100000 -# define CAP0_CONFIG_VERT_DIVIDE_2 0x00200000 -# define CAP0_CONFIG_VERT_DIVIDE_4 0x00400000 -# define CAP0_CONFIG_FORMAT_BROOKTREE 0x00000000 -# define CAP0_CONFIG_FORMAT_CCIR656 0x00800000 -# define CAP0_CONFIG_FORMAT_ZV 0x01000000 -# define CAP0_CONFIG_FORMAT_VIP 0x01800000 -# define CAP0_CONFIG_FORMAT_TRANSPORT 0x02000000 -# define CAP0_CONFIG_HORZ_DECIMATOR 0x04000000 -# define CAP0_CONFIG_VIDEO_IN_YVYU422 0x00000000 -# define CAP0_CONFIG_VIDEO_IN_VYUY422 0x20000000 -# define CAP0_CONFIG_VBI_DIVIDE_2 0x40000000 -# define CAP0_CONFIG_VBI_DIVIDE_4 0x80000000 -#define CAP0_ANC_ODD_OFFSET 0x095C -#define CAP0_ANC_EVEN_OFFSET 0x0960 -#define CAP0_ANC_H_WINDOW 0x0964 -#define CAP0_VIDEO_SYNC_TEST 0x0968 -#define CAP0_ONESHOT_BUF_OFFSET 0x096C -#define CAP0_BUF_STATUS 0x0970 -#ifdef RAGE128 -#define CAP0_DWNSC_XRATIO 0x0978 -#define CAP0_XSHARPNESS 0x097C -#else -/* #define CAP0_DWNSC_XRATIO 0x0978 */ -/* #define CAP0_XSHARPNESS 0x097C */ -#endif -#define CAP0_VBI2_OFFSET 0x0980 -#define CAP0_VBI3_OFFSET 0x0984 -#define CAP0_ANC2_OFFSET 0x0988 -#define CAP0_ANC3_OFFSET 0x098C - -/* second capture unit */ - -#define CAP1_BUF0_OFFSET 0x0990 -#define CAP1_BUF1_OFFSET 0x0994 -#define CAP1_BUF0_EVEN_OFFSET 0x0998 -#define CAP1_BUF1_EVEN_OFFSET 0x099C - -#define CAP1_BUF_PITCH 0x09A0 -#define CAP1_V_WINDOW 0x09A4 -#define CAP1_H_WINDOW 0x09A8 -#define CAP1_VBI_ODD_OFFSET 0x09AC -#define CAP1_VBI_EVEN_OFFSET 0x09B0 -#define CAP1_VBI_V_WINDOW 0x09B4 -#define CAP1_VBI_H_WINDOW 0x09B8 -#define CAP1_PORT_MODE_CNTL 0x09BC -#define CAP1_TRIG_CNTL 0x09C0 -#define CAP1_DEBUG 0x09C4 -#define CAP1_CONFIG 0x09C8 -#define CAP1_ANC_ODD_OFFSET 0x09CC -#define CAP1_ANC_EVEN_OFFSET 0x09D0 -#define CAP1_ANC_H_WINDOW 0x09D4 -#define CAP1_VIDEO_SYNC_TEST 0x09D8 -#define CAP1_ONESHOT_BUF_OFFSET 0x09DC -#define CAP1_BUF_STATUS 0x09E0 -#define CAP1_DWNSC_XRATIO 0x09E8 -#define CAP1_XSHARPNESS 0x09EC - -#define DISP_MERGE_CNTL 0x0D60 -#define DISP_OUTPUT_CNTL 0x0D64 -# define DISP_DAC_SOURCE_MASK 0x03 -# define DISP_DAC_SOURCE_CRTC2 0x01 -#define DISP_LIN_TRANS_GRPH_A 0x0D80 -#define DISP_LIN_TRANS_GRPH_B 0x0D84 -#define DISP_LIN_TRANS_GRPH_C 0x0D88 -#define DISP_LIN_TRANS_GRPH_D 0x0D8C -#define DISP_LIN_TRANS_GRPH_E 0x0D90 -#define DISP_LIN_TRANS_GRPH_F 0x0D94 -#define DISP_LIN_TRANS_VID_A 0x0D98 -#define DISP_LIN_TRANS_VID_B 0x0D9C -#define DISP_LIN_TRANS_VID_C 0x0DA0 -#define DISP_LIN_TRANS_VID_D 0x0DA4 -#define DISP_LIN_TRANS_VID_E 0x0DA8 -#define DISP_LIN_TRANS_VID_F 0x0DAC -#define RMX_HORZ_FILTER_0TAP_COEF 0x0DB0 -#define RMX_HORZ_FILTER_1TAP_COEF 0x0DB4 -#define RMX_HORZ_FILTER_2TAP_COEF 0x0DB8 -#define RMX_HORZ_PHASE 0x0DBC -#define DAC_EMBEDDED_SYNC_CNTL 0x0DC0 -#define DAC_BROAD_PULSE 0x0DC4 -#define DAC_SKEW_CLKS 0x0DC8 -#define DAC_INCR 0x0DCC -#define DAC_NEG_SYNC_LEVEL 0x0DD0 -#define DAC_POS_SYNC_LEVEL 0x0DD4 -#define DAC_BLANK_LEVEL 0x0DD8 -#define CLOCK_CNTL_INDEX 0x0008 -/* CLOCK_CNTL_INDEX bit constants */ -# define PLL_WR_EN 0x00000080 -# define PLL_DIV_SEL (3 << 8) -# define PLL2_DIV_SEL_MASK ~(3 << 8) -#define CLOCK_CNTL_DATA 0x000C -#define CP_RB_CNTL 0x0704 -#define CP_RB_BASE 0x0700 -#define CP_RB_RPTR_ADDR 0x070C -#define CP_RB_RPTR 0x0710 -#define CP_RB_WPTR 0x0714 -#define CP_RB_WPTR_DELAY 0x0718 -#define CP_IB_BASE 0x0738 -#define CP_IB_BUFSZ 0x073C -#define SCRATCH_REG0 0x15E0 -#define GUI_SCRATCH_REG0 0x15E0 -#define SCRATCH_REG1 0x15E4 -#define GUI_SCRATCH_REG1 0x15E4 -#define SCRATCH_REG2 0x15E8 -#define GUI_SCRATCH_REG2 0x15E8 -#define SCRATCH_REG3 0x15EC -#define GUI_SCRATCH_REG3 0x15EC -#define SCRATCH_REG4 0x15F0 -#define GUI_SCRATCH_REG4 0x15F0 -#define SCRATCH_REG5 0x15F4 -#define GUI_SCRATCH_REG5 0x15F4 -#define SCRATCH_UMSK 0x0770 -#define SCRATCH_ADDR 0x0774 -#define DP_BRUSH_FRGD_CLR 0x147C -#define DP_BRUSH_BKGD_CLR 0x1478 -#define DST_LINE_START 0x1600 -#define DST_LINE_END 0x1604 -#define SRC_OFFSET 0x15AC -#define SRC_PITCH 0x15B0 -#define SRC_TILE 0x1704 -#define SRC_PITCH_OFFSET 0x1428 -#define SRC_X 0x1414 -#define SRC_Y 0x1418 -#define DST_WIDTH_X 0x1588 -#define DST_HEIGHT_WIDTH_8 0x158C -#define SRC_X_Y 0x1590 -#define SRC_Y_X 0x1434 -#define DST_Y_X 0x1438 -#define DST_WIDTH_HEIGHT 0x1598 -#define DST_HEIGHT_WIDTH 0x143c -#ifdef RAGE128 -#define GUI_STAT 0x1740 -# define GUI_FIFOCNT_MASK 0x0fff -# define PM4_BUSY (1 << 16) -# define MICRO_BUSY (1 << 17) -# define FPU_BUSY (1 << 18) -# define VC_BUSY (1 << 19) -# define IDCT_BUSY (1 << 20) -# define ENG_EV_BUSY (1 << 21) -# define SETUP_BUSY (1 << 22) -# define EDGE_WALK_BUSY (1 << 23) -# define ADDRESSING_BUSY (1 << 24) -# define ENG_3D_BUSY (1 << 25) -# define ENG_2D_SM_BUSY (1 << 26) -# define ENG_2D_BUSY (1 << 27) -# define GUI_WB_BUSY (1 << 28) -# define CACHE_BUSY (1 << 29) -# define GUI_ACTIVE (1 << 31) -#endif -#define SRC_CLUT_ADDRESS 0x1780 -#define SRC_CLUT_DATA 0x1784 -#define SRC_CLUT_DATA_RD 0x1788 -#define HOST_DATA0 0x17C0 -#define HOST_DATA1 0x17C4 -#define HOST_DATA2 0x17C8 -#define HOST_DATA3 0x17CC -#define HOST_DATA4 0x17D0 -#define HOST_DATA5 0x17D4 -#define HOST_DATA6 0x17D8 -#define HOST_DATA7 0x17DC -#define HOST_DATA_LAST 0x17E0 -#define DP_SRC_ENDIAN 0x15D4 -#define DP_SRC_FRGD_CLR 0x15D8 -#define DP_SRC_BKGD_CLR 0x15DC -#define DP_WRITE_MASK 0x16cc -#define SC_LEFT 0x1640 -#define SC_RIGHT 0x1644 -#define SC_TOP 0x1648 -#define SC_BOTTOM 0x164C -#define SRC_SC_RIGHT 0x1654 -#define SRC_SC_BOTTOM 0x165C -#define DP_CNTL 0x16C0 -/* DP_CNTL bit constants */ -# define DST_X_RIGHT_TO_LEFT 0x00000000 -# define DST_X_LEFT_TO_RIGHT 0x00000001 -# define DST_Y_BOTTOM_TO_TOP 0x00000000 -# define DST_Y_TOP_TO_BOTTOM 0x00000002 -# define DST_X_MAJOR 0x00000000 -# define DST_Y_MAJOR 0x00000004 -# define DST_X_TILE 0x00000008 -# define DST_Y_TILE 0x00000010 -# define DST_LAST_PEL 0x00000020 -# define DST_TRAIL_X_RIGHT_TO_LEFT 0x00000000 -# define DST_TRAIL_X_LEFT_TO_RIGHT 0x00000040 -# define DST_TRAP_FILL_RIGHT_TO_LEFT 0x00000000 -# define DST_TRAP_FILL_LEFT_TO_RIGHT 0x00000080 -# define DST_BRES_SIGN 0x00000100 -# define DST_HOST_BIG_ENDIAN_EN 0x00000200 -# define DST_POLYLINE_NONLAST 0x00008000 -# define DST_RASTER_STALL 0x00010000 -# define DST_POLY_EDGE 0x00040000 -#define DP_CNTL_XDIR_YDIR_YMAJOR 0x16D0 -/* DP_CNTL_XDIR_YDIR_YMAJOR bit constants (short version of DP_CNTL) */ -# define DST_X_MAJOR_S 0x00000000 -# define DST_Y_MAJOR_S 0x00000001 -# define DST_Y_BOTTOM_TO_TOP_S 0x00000000 -# define DST_Y_TOP_TO_BOTTOM_S 0x00008000 -# define DST_X_RIGHT_TO_LEFT_S 0x00000000 -# define DST_X_LEFT_TO_RIGHT_S 0x80000000 -#define DP_DATATYPE 0x16C4 -/* DP_DATATYPE bit constants */ -# define DST_8BPP 0x00000002 -# define DST_15BPP 0x00000003 -# define DST_16BPP 0x00000004 -# define DST_24BPP 0x00000005 -# define DST_32BPP 0x00000006 -# define DST_8BPP_RGB332 0x00000007 -# define DST_8BPP_Y8 0x00000008 -# define DST_8BPP_RGB8 0x00000009 -# define DST_16BPP_VYUY422 0x0000000b -# define DST_16BPP_YVYU422 0x0000000c -# define DST_32BPP_AYUV444 0x0000000e -# define DST_16BPP_ARGB4444 0x0000000f -# define BRUSH_SOLIDCOLOR 0x00000d00 -# define SRC_MONO 0x00000000 -# define SRC_MONO_LBKGD 0x00010000 -# define SRC_DSTCOLOR 0x00030000 -# define BYTE_ORDER_MSB_TO_LSB 0x00000000 -# define BYTE_ORDER_LSB_TO_MSB 0x40000000 -# define DP_CONVERSION_TEMP 0x80000000 -# define HOST_BIG_ENDIAN_EN (1 << 29) -#define DP_MIX 0x16C8 -/* DP_MIX bit constants */ -# define DP_SRC_RECT 0x00000200 -# define DP_SRC_HOST 0x00000300 -# define DP_SRC_HOST_BYTEALIGN 0x00000400 -#define DP_WRITE_MSK 0x16CC -#define DP_XOP 0x17F8 -#define CLR_CMP_CLR_SRC 0x15C4 -#define CLR_CMP_CLR_DST 0x15C8 -#define CLR_CMP_CNTL 0x15C0 -/* CLR_CMP_CNTL bit constants */ -# define COMPARE_SRC_FALSE 0x00000000 -# define COMPARE_SRC_TRUE 0x00000001 -# define COMPARE_SRC_NOT_EQUAL 0x00000004 -# define COMPARE_SRC_EQUAL 0x00000005 -# define COMPARE_SRC_EQUAL_FLIP 0x00000007 -# define COMPARE_DST_FALSE 0x00000000 -# define COMPARE_DST_TRUE 0x00000100 -# define COMPARE_DST_NOT_EQUAL 0x00000400 -# define COMPARE_DST_EQUAL 0x00000500 -# define COMPARE_DESTINATION 0x00000000 -# define COMPARE_SOURCE 0x01000000 -# define COMPARE_SRC_AND_DST 0x02000000 -#define CLR_CMP_MSK 0x15CC -#define DSTCACHE_MODE 0x1710 -#define DSTCACHE_CTLSTAT 0x1714 -/* DSTCACHE_CTLSTAT bit constants */ -# define RB2D_DC_FLUSH (3 << 0) -# define RB2D_DC_FLUSH_ALL 0xf -# define RB2D_DC_BUSY (1 << 31) -#define DEFAULT_OFFSET 0x16e0 -#define DEFAULT_PITCH_OFFSET 0x16E0 -#define DEFAULT_SC_BOTTOM_RIGHT 0x16E8 -/* DEFAULT_SC_BOTTOM_RIGHT bit constants */ -# define DEFAULT_SC_RIGHT_MAX (0x1fff << 0) -# define DEFAULT_SC_BOTTOM_MAX (0x1fff << 16) -#define DP_GUI_MASTER_CNTL 0x146C -/* DP_GUI_MASTER_CNTL bit constants */ -# define GMC_SRC_PITCH_OFFSET_DEFAULT 0x00000000 -# define GMC_SRC_PITCH_OFFSET_LEAVE 0x00000001 -# define GMC_DST_PITCH_OFFSET_DEFAULT 0x00000000 -# define GMC_DST_PITCH_OFFSET_LEAVE 0x00000002 -# define GMC_SRC_CLIP_DEFAULT 0x00000000 -# define GMC_SRC_CLIP_LEAVE 0x00000004 -# define GMC_DST_CLIP_DEFAULT 0x00000000 -# define GMC_DST_CLIP_LEAVE 0x00000008 -# define GMC_BRUSH_8x8MONO 0x00000000 -# define GMC_BRUSH_8x8MONO_LBKGD 0x00000010 -# define GMC_BRUSH_8x1MONO 0x00000020 -# define GMC_BRUSH_8x1MONO_LBKGD 0x00000030 -# define GMC_BRUSH_1x8MONO 0x00000040 -# define GMC_BRUSH_1x8MONO_LBKGD 0x00000050 -# define GMC_BRUSH_32x1MONO 0x00000060 -# define GMC_BRUSH_32x1MONO_LBKGD 0x00000070 -# define GMC_BRUSH_32x32MONO 0x00000080 -# define GMC_BRUSH_32x32MONO_LBKGD 0x00000090 -# define GMC_BRUSH_8x8COLOR 0x000000a0 -# define GMC_BRUSH_8x1COLOR 0x000000b0 -# define GMC_BRUSH_1x8COLOR 0x000000c0 -# define GMC_BRUSH_SOLID_COLOR 0x000000d0 -# define GMC_DST_8BPP 0x00000200 -# define GMC_DST_15BPP 0x00000300 -# define GMC_DST_16BPP 0x00000400 -# define GMC_DST_24BPP 0x00000500 -# define GMC_DST_32BPP 0x00000600 -# define GMC_DST_8BPP_RGB332 0x00000700 -# define GMC_DST_8BPP_Y8 0x00000800 -# define GMC_DST_8BPP_RGB8 0x00000900 -# define GMC_DST_16BPP_VYUY422 0x00000b00 -# define GMC_DST_16BPP_YVYU422 0x00000c00 -# define GMC_DST_32BPP_AYUV444 0x00000e00 -# define GMC_DST_16BPP_ARGB4444 0x00000f00 -# define GMC_SRC_MONO 0x00000000 -# define GMC_SRC_MONO_LBKGD 0x00001000 -# define GMC_SRC_DSTCOLOR 0x00003000 -# define GMC_BYTE_ORDER_MSB_TO_LSB 0x00000000 -# define GMC_BYTE_ORDER_LSB_TO_MSB 0x00004000 -# define GMC_DP_CONVERSION_TEMP_9300 0x00008000 -# define GMC_DP_CONVERSION_TEMP_6500 0x00000000 -# define GMC_DP_SRC_RECT 0x02000000 -# define GMC_DP_SRC_HOST 0x03000000 -# define GMC_DP_SRC_HOST_BYTEALIGN 0x04000000 -# define GMC_3D_FCN_EN_CLR 0x00000000 -# define GMC_3D_FCN_EN_SET 0x08000000 -# define GMC_DST_CLR_CMP_FCN_LEAVE 0x00000000 -# define GMC_DST_CLR_CMP_FCN_CLEAR 0x10000000 -# define GMC_AUX_CLIP_LEAVE 0x00000000 -# define GMC_AUX_CLIP_CLEAR 0x20000000 -# define GMC_WRITE_MASK_LEAVE 0x00000000 -# define GMC_WRITE_MASK_SET 0x40000000 -# define GMC_CLR_CMP_CNTL_DIS (1 << 28) -# define GMC_SRC_DATATYPE_COLOR (3 << 12) -# define ROP3_S 0x00cc0000 -# define ROP3_SRCCOPY 0x00cc0000 -# define ROP3_P 0x00f00000 -# define ROP3_PATCOPY 0x00f00000 -# define DP_SRC_SOURCE_MASK (7 << 24) -# define GMC_BRUSH_NONE (15 << 4) -# define DP_SRC_SOURCE_MEMORY (2 << 24) -# define GMC_BRUSH_SOLIDCOLOR 0x000000d0 -#define SC_TOP_LEFT 0x16EC -#define SC_BOTTOM_RIGHT 0x16F0 -#define SRC_SC_BOTTOM_RIGHT 0x16F4 -#define RB2D_DSTCACHE_CTLSTAT 0x342C -#define RB2D_DSTCACHE_MODE 0x3428 - -#define BASE_CODE 0x0f0b/*0x0f08*/ -#define RADEON_BIOS_0_SCRATCH 0x0010 -#define RADEON_BIOS_1_SCRATCH 0x0014 -#define RADEON_BIOS_2_SCRATCH 0x0018 -#define RADEON_BIOS_3_SCRATCH 0x001c -#define RADEON_BIOS_4_SCRATCH 0x0020 -#define RADEON_BIOS_5_SCRATCH 0x0024 -#define RADEON_BIOS_6_SCRATCH 0x0028 -#define RADEON_BIOS_7_SCRATCH 0x002c - - -#define CLK_PIN_CNTL 0x0001 -#define PPLL_CNTL 0x0002 -# define PPLL_RESET (1 << 0) -# define PPLL_SLEEP (1 << 1) -# define PPLL_ATOMIC_UPDATE_EN (1 << 16) -# define PPLL_VGA_ATOMIC_UPDATE_EN (1 << 17) -# define PPLL_ATOMIC_UPDATE_VSYNC (1 << 18) -#define PPLL_REF_DIV 0x0003 -# define PPLL_REF_DIV_MASK 0x03ff -# define PPLL_ATOMIC_UPDATE_R (1 << 15) /* same as _W */ -# define PPLL_ATOMIC_UPDATE_W (1 << 15) /* same as _R */ -#define PPLL_DIV_0 0x0004 -#define PPLL_DIV_1 0x0005 -#define PPLL_DIV_2 0x0006 -#define PPLL_DIV_3 0x0007 -#define VCLK_ECP_CNTL 0x0008 -# define VCLK_SRC_SEL_MASK 0x03 -# define VCLK_SRC_SEL_CPUCLK 0x00 -# define VCLK_SRC_SEL_PSCANCLK 0x01 -# define VCLK_SRC_SEL_BYTECLK 0x02 -# define VCLK_SRC_SEL_PPLLCLK 0x03 -#define HTOTAL_CNTL 0x0009 -#define HTOTAL2_CNTL 0x002e /* PLL */ -#define M_SPLL_REF_FB_DIV 0x000a -#define AGP_PLL_CNTL 0x000b -#define SPLL_CNTL 0x000c -#define SCLK_CNTL 0x000d -# define DYN_STOP_LAT_MASK 0x00007ff8 -# define CP_MAX_DYN_STOP_LAT 0x0008 -# define SCLK_FORCEON_MASK 0xffff8000 -#define SCLK_MORE_CNTL 0x0035 /* PLL */ -# define SCLK_MORE_FORCEON 0x0700 -#define MPLL_CNTL 0x000e -#ifdef RAGE128 -#define MCLK_CNTL 0x000f /* PLL */ -# define FORCE_GCP (1 << 16) -# define FORCE_PIPE3D_CP (1 << 17) -# define FORCE_RCP (1 << 18) -#else -#define MCLK_CNTL 0x0012 -/* MCLK_CNTL bit constants */ -# define FORCEON_MCLKA (1 << 16) -# define FORCEON_MCLKB (1 << 17) -# define FORCEON_YCLKA (1 << 18) -# define FORCEON_YCLKB (1 << 19) -# define FORCEON_MC (1 << 20) -# define FORCEON_AIC (1 << 21) -#endif -#define PLL_TEST_CNTL 0x0013 -#define P2PLL_CNTL 0x002a /* P2PLL */ -# define P2PLL_RESET (1 << 0) -# define P2PLL_SLEEP (1 << 1) -# define P2PLL_ATOMIC_UPDATE_EN (1 << 16) -# define P2PLL_VGA_ATOMIC_UPDATE_EN (1 << 17) -# define P2PLL_ATOMIC_UPDATE_VSYNC (1 << 18) -#define P2PLL_DIV_0 0x002c -# define P2PLL_FB0_DIV_MASK 0x07ff -# define P2PLL_POST0_DIV_MASK 0x00070000 -#define P2PLL_REF_DIV 0x002B /* PLL */ -# define P2PLL_REF_DIV_MASK 0x03ff -# define P2PLL_ATOMIC_UPDATE_R (1 << 15) /* same as _W */ -# define P2PLL_ATOMIC_UPDATE_W (1 << 15) /* same as _R */ -#define PIXCLKS_CNTL 0x002d -# define PIX2CLK_SRC_SEL_MASK 0x03 -# define PIX2CLK_SRC_SEL_CPUCLK 0x00 -# define PIX2CLK_SRC_SEL_PSCANCLK 0x01 -# define PIX2CLK_SRC_SEL_BYTECLK 0x02 -# define PIX2CLK_SRC_SEL_P2PLLCLK 0x03 - -/* masks */ - -#define CONFIG_MEMSIZE_MASK 0x1f000000 -#define MEM_CFG_TYPE 0x40000000 -#define DST_OFFSET_MASK 0x003fffff -#define DST_PITCH_MASK 0x3fc00000 -#define DEFAULT_TILE_MASK 0xc0000000 -#define PPLL_DIV_SEL_MASK 0x00000300 -#define PPLL_FB3_DIV_MASK 0x000007ff -#define PPLL_POST3_DIV_MASK 0x00070000 - -/* BUS MASTERING */ -#ifdef RAGE128 -#define BM_FRAME_BUF_OFFSET 0xA00 -#define BM_SYSTEM_MEM_ADDR 0xA04 -#define BM_COMMAND 0xA08 -# define BM_INTERRUPT_DIS 0x08000000 -# define BM_TRANSFER_DEST_REG 0x10000000 -# define BM_FORCE_TO_PCI 0x20000000 -# define BM_FRAME_OFFSET_HOLD 0x40000000 -# define BM_END_OF_LIST 0x80000000 -#define BM_STATUS 0xA0c -#define BM_QUEUE_STATUS 0xA10 -#define BM_QUEUE_FREE_STATUS 0xA14 -#define BM_CHUNK_0_VAL 0xA18 -# define BM_PTR_FORCE_TO_PCI 0x00200000 -# define BM_PM4_RD_FORCE_TO_PCI 0x00400000 -# define BM_GLOBAL_FORCE_TO_PCI 0x00800000 -# define BM_VIP3_NOCHUNK 0x10000000 -# define BM_VIP2_NOCHUNK 0x20000000 -# define BM_VIP1_NOCHUNK 0x40000000 -# define BM_VIP0_NOCHUNK 0x80000000 -#define BM_CHUNK_1_VAL 0xA1C -#define BM_VIP0_BUF 0xA20 -# define SYSTEM_TRIGGER_SYSTEM_TO_VIDEO 0x0 -# define SYSTEM_TRIGGER_VIDEO_TO_SYSTEM 0x1 -#define BM_VIP0_ACTIVE 0xA24 -#define BM_VIP1_BUF 0xA30 -#define BM_VIP1_ACTIVE 0xA34 -#define BM_VIP2_BUF 0xA40 -#define BM_VIP2_ACTIVE 0xA44 -#define BM_VIP3_BUF 0xA50 -#define BM_VIP3_ACTIVE 0xA54 -#define BM_VIDCAP_BUF0 0xA60 -#define BM_VIDCAP_BUF1 0xA64 -#define BM_VIDCAP_BUF2 0xA68 -#define BM_VIDCAP_ACTIVE 0xA6c -#define BM_GUI 0xA80 -#define BM_ABORT 0xA88 -#endif -/* RAGE THEATER REGISTERS */ - -#define DMA_VIPH0_COMMAND 0x0A00 -#define DMA_VIPH1_COMMAND 0x0A04 -#define DMA_VIPH2_COMMAND 0x0A08 -#define DMA_VIPH3_COMMAND 0x0A0C -#define DMA_VIPH_STATUS 0x0A10 -#define DMA_VIPH_CHUNK_0 0x0A18 -#define DMA_VIPH_CHUNK_1_VAL 0x0A1C -#define DMA_VIP0_TABLE_ADDR 0x0A20 -#define DMA_VIPH0_ACTIVE 0x0A24 -#define DMA_VIP1_TABLE_ADDR 0x0A30 -#define DMA_VIPH1_ACTIVE 0x0A34 -#define DMA_VIP2_TABLE_ADDR 0x0A40 -#define DMA_VIPH2_ACTIVE 0x0A44 -#define DMA_VIP3_TABLE_ADDR 0x0A50 -#define DMA_VIPH3_ACTIVE 0x0A54 -#define DMA_VIPH_ABORT 0x0A88 - -#define VIPH_CH0_DATA 0x0c00 -#define VIPH_CH1_DATA 0x0c04 -#define VIPH_CH2_DATA 0x0c08 -#define VIPH_CH3_DATA 0x0c0c -#define VIPH_CH0_ADDR 0x0c10 -#define VIPH_CH1_ADDR 0x0c14 -#define VIPH_CH2_ADDR 0x0c18 -#define VIPH_CH3_ADDR 0x0c1c -#define VIPH_CH0_SBCNT 0x0c20 -#define VIPH_CH1_SBCNT 0x0c24 -#define VIPH_CH2_SBCNT 0x0c28 -#define VIPH_CH3_SBCNT 0x0c2c -#define VIPH_CH0_ABCNT 0x0c30 -#define VIPH_CH1_ABCNT 0x0c34 -#define VIPH_CH2_ABCNT 0x0c38 -#define VIPH_CH3_ABCNT 0x0c3c -#define VIPH_CONTROL 0x0c40 -#define VIPH_DV_LAT 0x0c44 -#define VIPH_BM_CHUNK 0x0c48 -#define VIPH_DV_INT 0x0c4c -#define VIPH_TIMEOUT_STAT 0x0c50 - -#define VIPH_REG_DATA 0x0084 -#define VIPH_REG_ADDR 0x0080 - -/* Address Space Rage Theatre Registers (VIP Access) */ -#define VIP_VIP_VENDOR_DEVICE_ID 0x0000 -#define VIP_VIP_SUB_VENDOR_DEVICE_ID 0x0004 -#define VIP_VIP_COMMAND_STATUS 0x0008 -#define VIP_VIP_REVISION_ID 0x000c -#define VIP_HW_DEBUG 0x0010 -#define VIP_SW_SCRATCH 0x0014 -#define VIP_I2C_CNTL_0 0x0020 -#define VIP_I2C_CNTL_1 0x0024 -#define VIP_I2C_DATA 0x0028 -#define VIP_INT_CNTL 0x002c -#define VIP_GPIO_INOUT 0x0030 -#define VIP_GPIO_CNTL 0x0034 -#define VIP_CLKOUT_GPIO_CNTL 0x0038 -#define VIP_RIPINTF_PORT_CNTL 0x003c -#define VIP_ADC_CNTL 0x0400 -#define VIP_ADC_DEBUG 0x0404 -#define VIP_STANDARD_SELECT 0x0408 -#define VIP_THERMO2BIN_STATUS 0x040c -#define VIP_COMB_CNTL0 0x0440 -#define VIP_COMB_CNTL1 0x0444 -#define VIP_COMB_CNTL2 0x0448 -#define VIP_COMB_LINE_LENGTH 0x044c -#define VIP_NOISE_CNTL0 0x0450 -#define VIP_HS_PLINE 0x0480 -#define VIP_HS_DTOINC 0x0484 -#define VIP_HS_PLLGAIN 0x0488 -#define VIP_HS_MINMAXWIDTH 0x048c -#define VIP_HS_GENLOCKDELAY 0x0490 -#define VIP_HS_WINDOW_LIMIT 0x0494 -#define VIP_HS_WINDOW_OC_SPEED 0x0498 -#define VIP_HS_PULSE_WIDTH 0x049c -#define VIP_HS_PLL_ERROR 0x04a0 -#define VIP_HS_PLL_FS_PATH 0x04a4 -#define VIP_SG_BLACK_GATE 0x04c0 -#define VIP_SG_SYNCTIP_GATE 0x04c4 -#define VIP_SG_UVGATE_GATE 0x04c8 -#define VIP_LP_AGC_CLAMP_CNTL0 0x0500 -#define VIP_LP_AGC_CLAMP_CNTL1 0x0504 -#define VIP_LP_BRIGHTNESS 0x0508 -#define VIP_LP_CONTRAST 0x050c -#define VIP_LP_SLICE_LIMIT 0x0510 -#define VIP_LP_WPA_CNTL0 0x0514 -#define VIP_LP_WPA_CNTL1 0x0518 -#define VIP_LP_BLACK_LEVEL 0x051c -#define VIP_LP_SLICE_LEVEL 0x0520 -#define VIP_LP_SYNCTIP_LEVEL 0x0524 -#define VIP_LP_VERT_LOCKOUT 0x0528 -#define VIP_VS_DETECTOR_CNTL 0x0540 -#define VIP_VS_BLANKING_CNTL 0x0544 -#define VIP_VS_FIELD_ID_CNTL 0x0548 -#define VIP_VS_COUNTER_CNTL 0x054c -#define VIP_VS_FRAME_TOTAL 0x0550 -#define VIP_VS_LINE_COUNT 0x0554 -#define VIP_CP_PLL_CNTL0 0x0580 -#define VIP_CP_PLL_CNTL1 0x0584 -#define VIP_CP_HUE_CNTL 0x0588 -#define VIP_CP_BURST_GAIN 0x058c -#define VIP_CP_AGC_CNTL 0x0590 -#define VIP_CP_ACTIVE_GAIN 0x0594 -#define VIP_CP_PLL_STATUS0 0x0598 -#define VIP_CP_PLL_STATUS1 0x059c -#define VIP_CP_PLL_STATUS2 0x05a0 -#define VIP_CP_PLL_STATUS3 0x05a4 -#define VIP_CP_PLL_STATUS4 0x05a8 -#define VIP_CP_PLL_STATUS5 0x05ac -#define VIP_CP_PLL_STATUS6 0x05b0 -#define VIP_CP_PLL_STATUS7 0x05b4 -#define VIP_CP_DEBUG_FORCE 0x05b8 -#define VIP_CP_VERT_LOCKOUT 0x05bc -#define VIP_H_ACTIVE_WINDOW 0x05c0 -#define VIP_V_ACTIVE_WINDOW 0x05c4 -#define VIP_H_VBI_WINDOW 0x05c8 -#define VIP_V_VBI_WINDOW 0x05cc -#define VIP_VBI_CONTROL 0x05d0 -#define VIP_DECODER_DEBUG_CNTL 0x05d4 -#define VIP_SINGLE_STEP_DATA 0x05d8 -#define VIP_MASTER_CNTL 0x0040 -#define VIP_RGB_CNTL 0x0048 -#define VIP_CLKOUT_CNTL 0x004c -#define VIP_SYNC_CNTL 0x0050 -#define VIP_I2C_CNTL 0x0054 -#define VIP_HTOTAL 0x0080 -#define VIP_HDISP 0x0084 -#define VIP_HSIZE 0x0088 -#define VIP_HSTART 0x008c -#define VIP_HCOUNT 0x0090 -#define VIP_VTOTAL 0x0094 -#define VIP_VDISP 0x0098 -#define VIP_VCOUNT 0x009c -#define VIP_VFTOTAL 0x00a0 -#define VIP_DFCOUNT 0x00a4 -#define VIP_DFRESTART 0x00a8 -#define VIP_DHRESTART 0x00ac -#define VIP_DVRESTART 0x00b0 -#define VIP_SYNC_SIZE 0x00b4 -#define VIP_TV_PLL_FINE_CNTL 0x00b8 -#define VIP_CRT_PLL_FINE_CNTL 0x00bc -#define VIP_TV_PLL_CNTL 0x00c0 -#define VIP_CRT_PLL_CNTL 0x00c4 -#define VIP_PLL_CNTL0 0x00c8 -#define VIP_PLL_TEST_CNTL 0x00cc -#define VIP_CLOCK_SEL_CNTL 0x00d0 -#define VIP_VIN_PLL_CNTL 0x00d4 -#define VIP_VIN_PLL_FINE_CNTL 0x00d8 -#define VIP_AUD_PLL_CNTL 0x00e0 -#define VIP_AUD_PLL_FINE_CNTL 0x00e4 -#define VIP_AUD_CLK_DIVIDERS 0x00e8 -#define VIP_AUD_DTO_INCREMENTS 0x00ec -#define VIP_L54_PLL_CNTL 0x00f0 -#define VIP_L54_PLL_FINE_CNTL 0x00f4 -#define VIP_L54_DTO_INCREMENTS 0x00f8 -#define VIP_PLL_CNTL1 0x00fc -#define VIP_FRAME_LOCK_CNTL 0x0100 -#define VIP_SYNC_LOCK_CNTL 0x0104 -#define VIP_TVO_SYNC_PAT_ACCUM 0x0108 -#define VIP_TVO_SYNC_THRESHOLD 0x010c -#define VIP_TVO_SYNC_PAT_EXPECT 0x0110 -#define VIP_DELAY_ONE_MAP_A 0x0114 -#define VIP_DELAY_ONE_MAP_B 0x0118 -#define VIP_DELAY_ZERO_MAP_A 0x011c -#define VIP_DELAY_ZERO_MAP_B 0x0120 -#define VIP_TVO_DATA_DELAY_A 0x0140 -#define VIP_TVO_DATA_DELAY_B 0x0144 -#define VIP_HOST_READ_DATA 0x0180 -#define VIP_HOST_WRITE_DATA 0x0184 -#define VIP_HOST_RD_WT_CNTL 0x0188 -#define VIP_VSCALER_CNTL1 0x01c0 -#define VIP_TIMING_CNTL 0x01c4 -#define VIP_VSCALER_CNTL2 0x01c8 -#define VIP_Y_FALL_CNTL 0x01cc -#define VIP_Y_RISE_CNTL 0x01d0 -#define VIP_Y_SAW_TOOTH_CNTL 0x01d4 -#define VIP_UPSAMP_AND_GAIN_CNTL 0x01e0 -#define VIP_GAIN_LIMIT_SETTINGS 0x01e4 -#define VIP_LINEAR_GAIN_SETTINGS 0x01e8 -#define VIP_MODULATOR_CNTL1 0x0200 -#define VIP_MODULATOR_CNTL2 0x0204 -#define VIP_MV_MODE_CNTL 0x0208 -#define VIP_MV_STRIPE_CNTL 0x020c -#define VIP_MV_LEVEL_CNTL1 0x0210 -#define VIP_MV_LEVEL_CNTL2 0x0214 -#define VIP_PRE_DAC_MUX_CNTL 0x0240 -#define VIP_TV_DAC_CNTL 0x0280 -#define VIP_CRC_CNTL 0x02c0 -#define VIP_VIDEO_PORT_SIG 0x02c4 -#define VIP_VBI_CC_CNTL 0x02c8 -#define VIP_VBI_EDS_CNTL 0x02cc -#define VIP_VBI_20BIT_CNTL 0x02d0 -#define VIP_VBI_DTO_CNTL 0x02d4 -#define VIP_VBI_LEVEL_CNTL 0x02d8 -#define VIP_UV_ADR 0x0300 -#define VIP_MV_STATUS 0x0330 -#define VIP_UPSAMP_COEFF0_0 0x0340 -#define VIP_UPSAMP_COEFF0_1 0x0344 -#define VIP_UPSAMP_COEFF0_2 0x0348 -#define VIP_UPSAMP_COEFF1_0 0x034c -#define VIP_UPSAMP_COEFF1_1 0x0350 -#define VIP_UPSAMP_COEFF1_2 0x0354 -#define VIP_UPSAMP_COEFF2_0 0x0358 -#define VIP_UPSAMP_COEFF2_1 0x035c -#define VIP_UPSAMP_COEFF2_2 0x0360 -#define VIP_UPSAMP_COEFF3_0 0x0364 -#define VIP_UPSAMP_COEFF3_1 0x0368 -#define VIP_UPSAMP_COEFF3_2 0x036c -#define VIP_UPSAMP_COEFF4_0 0x0370 -#define VIP_UPSAMP_COEFF4_1 0x0374 -#define VIP_UPSAMP_COEFF4_2 0x0378 -#define VIP_TV_DTO_INCREMENTS 0x0390 -#define VIP_CRT_DTO_INCREMENTS 0x0394 -#define VIP_VSYNC_DIFF_CNTL 0x03a0 -#define VIP_VSYNC_DIFF_LIMITS 0x03a4 -#define VIP_VSYNC_DIFF_RD_DATA 0x03a8 -#define VIP_SCALER_IN_WINDOW 0x0618 -#define VIP_SCALER_OUT_WINDOW 0x061c -#define VIP_H_SCALER_CONTROL 0x0600 -#define VIP_V_SCALER_CONTROL 0x0604 -#define VIP_V_DEINTERLACE_CONTROL 0x0608 -#define VIP_VBI_SCALER_CONTROL 0x060c -#define VIP_DVS_PORT_CTRL 0x0610 -#define VIP_DVS_PORT_READBACK 0x0614 -#define VIP_FIFOA_CONFIG 0x0800 -#define VIP_FIFOB_CONFIG 0x0804 -#define VIP_FIFOC_CONFIG 0x0808 -#define VIP_SPDIF_PORT_CNTL 0x080c -#define VIP_SPDIF_CHANNEL_STAT 0x0810 -#define VIP_SPDIF_AC3_PREAMBLE 0x0814 -#define VIP_I2S_TRANSMIT_CNTL 0x0818 -#define VIP_I2S_RECEIVE_CNTL 0x081c -#define VIP_SPDIF_TX_CNT_REG 0x0820 -#define VIP_IIS_TX_CNT_REG 0x0824 - -/* Status defines */ -#define VIP_BUSY 0 -#define VIP_IDLE 1 -#define VIP_RESET 2 - -#define VIPH_TIMEOUT_STAT__VIPH_REG_STAT 0x00000010 -#define VIPH_TIMEOUT_STAT__VIPH_REG_AK 0x00000010 -#define VIPH_TIMEOUT_STAT__VIPH_REGR_DIS 0x01000000 -#define TEST_DEBUG_CNTL__TEST_DEBUG_OUT_EN 0x00000001 - -#define RT_ATI_ID 0x4D541002 - -/* Register/Field values: */ -#define RT_COMP0 0x0 -#define RT_COMP1 0x1 -#define RT_COMP2 0x2 -#define RT_YF_COMP3 0x3 -#define RT_YR_COMP3 0x4 -#define RT_YCF_COMP4 0x5 -#define RT_YCR_COMP4 0x6 - -/* Video standard defines */ -#define RT_NTSC 0x0 -#define RT_PAL 0x1 -#define RT_SECAM 0x2 -#define extNONE 0x0000 -#define extNTSC 0x0100 -#define extRsvd 0x0200 -#define extPAL 0x0300 -#define extPAL_M 0x0400 -#define extPAL_N 0x0500 -#define extSECAM 0x0600 -#define extPAL_NCOMB 0x0700 -#define extNTSC_J 0x0800 -#define extNTSC_443 0x0900 -#define extPAL_BGHI 0x0A00 -#define extPAL_60 0x0B00 - /* these are used in MSP3430 */ -#define extPAL_DK1 0x0C00 -#define extPAL_AUTO 0x0D00 - -#define RT_FREF_2700 6 -#define RT_FREF_2950 5 - -#define RT_COMPOSITE 0x0 -#define RT_SVIDEO 0x1 - -#define RT_NORM_SHARPNESS 0x03 -#define RT_HIGH_SHARPNESS 0x0F - -#define RT_HUE_PAL_DEF 0x00 - -#define RT_DECINTERLACED 0x1 -#define RT_DECNONINTERLACED 0x0 - -#define NTSC_LINES 525 -#define PAL_SECAM_LINES 625 - -#define RT_ASYNC_ENABLE 0x0 -#define RT_ASYNC_DISABLE 0x1 -#define RT_ASYNC_RESET 0x1 - -#define RT_VINRST_ACTIVE 0x0 -#define RT_VINRST_RESET 0x1 -#define RT_L54RST_RESET 0x1 - -#define RT_REF_CLK 0x0 -#define RT_PLL_VIN_CLK 0x1 - -#define RT_VIN_ASYNC_RST 0x20 -#define RT_DVS_ASYNC_RST 0x80 - -#define RT_ADC_ENABLE 0x0 -#define RT_ADC_DISABLE 0x1 - -#define RT_DVSDIR_IN 0x0 -#define RT_DVSDIR_OUT 0x1 - -#define RT_DVSCLK_HIGH 0x0 -#define RT_DVSCLK_LOW 0x1 - -#define RT_DVSCLK_SEL_8FS 0x0 -#define RT_DVSCLK_SEL_27MHZ 0x1 - -#define RT_DVS_CONTSTREAM 0x1 -#define RT_DVS_NONCONTSTREAM 0x0 - -#define RT_DVSDAT_HIGH 0x0 -#define RT_DVSDAT_LOW 0x1 - -#define RT_ADC_CNTL_DEFAULT 0x03252338 - -/* COMB_CNTL0 FILTER SETTINGS FOR DIFFERENT STANDARDS: */ -#define RT_NTSCM_COMB_CNTL0_COMPOSITE 0x09438090 -#define RT_NTSCM_COMB_CNTL0_SVIDEO 0x48540000 - -#define RT_PAL_COMB_CNTL0_COMPOSITE 0x09438090 -#define RT_PAL_COMB_CNTL0_SVIDEO 0x40348090 - -#define RT_SECAM_COMB_CNTL0_COMPOSITE 0xD0108090 /* instead of orig 0xD0088090 - eric*/ -#define RT_SECAM_COMB_CNTL0_SVIDEO 0x50148090 - -#define RT_PALN_COMB_CNTL0_COMPOSITE 0x09438090 -#define RT_PALN_COMB_CNTL0_SVIDEO 0x40348090 - -#define RT_PALM_COMB_CNTL0_COMPOSITE 0x09438090 -#define RT_PALM_COMB_CNTL0_SVIDEO 0x40348090 -/* End of filter settings. */ - -/* COMB_CNTL1 FILTER SETTINGS FOR DIFFERENT STANDARDS: */ -#define RT_NTSCM_COMB_CNTL1_COMPOSITE 0x00000010 -#define RT_NTSCM_COMB_CNTL1_SVIDEO 0x00000081 - -#define RT_PAL_COMB_CNTL1_COMPOSITE 0x00000010 -#define RT_PAL_COMB_CNTL1_SVIDEO 0x000000A1 - -#define RT_SECAM_COMB_CNTL1_COMPOSITE 0x00000091 -#define RT_SECAM_COMB_CNTL1_SVIDEO 0x00000081 - -#define RT_PALN_COMB_CNTL1_COMPOSITE 0x00000010 -#define RT_PALN_COMB_CNTL1_SVIDEO 0x000000A1 - -#define RT_PALM_COMB_CNTL1_COMPOSITE 0x00000010 -#define RT_PALM_COMB_CNTL1_SVIDEO 0x000000A1 -/* End of filter settings. */ - -/* COMB_CNTL2 FILTER SETTINGS FOR DIFFERENT STANDARDS: */ -#define RT_NTSCM_COMB_CNTL2_COMPOSITE 0x16161010 -#define RT_NTSCM_COMB_CNTL2_SVIDEO 0xFFFFFFFF - -#define RT_PAL_COMB_CNTL2_COMPOSITE 0x06080102 /* instead of 0x16161010 - Ivo */ -#define RT_PAL_COMB_CNTL2_SVIDEO 0x06080102 - -#define RT_SECAM_COMB_CNTL2_COMPOSITE 0xffffffff /* instead of 0x06080102 - eric */ -#define RT_SECAM_COMB_CNTL2_SVIDEO 0x06080102 - -#define RT_PALN_COMB_CNTL2_COMPOSITE 0x06080102 -#define RT_PALN_COMB_CNTL2_SVIDEO 0x06080102 - -#define RT_PALM_COMB_CNTL2_COMPOSITE 0x06080102 -#define RT_PALM_COMB_CNTL2_SVIDEO 0x06080102 -/* End of filter settings. */ - -/* COMB_LINE_LENGTH FILTER SETTINGS FOR DIFFERENT STANDARDS: */ -#define RT_NTSCM_COMB_LENGTH_COMPOSITE 0x0718038A -#define RT_NTSCM_COMB_LENGTH_SVIDEO 0x0718038A - -#define RT_PAL_COMB_LENGTH_COMPOSITE 0x08DA046B -#define RT_PAL_COMB_LENGTH_SVIDEO 0x08DA046B - -#define RT_SECAM_COMB_LENGTH_COMPOSITE 0x08DA046A -#define RT_SECAM_COMB_LENGTH_SVIDEO 0x08DA046A - -#define RT_PALN_COMB_LENGTH_COMPOSITE 0x07260391 -#define RT_PALN_COMB_LENGTH_SVIDEO 0x07260391 - -#define RT_PALM_COMB_LENGTH_COMPOSITE 0x07160389 -#define RT_PALM_COMB_LENGTH_SVIDEO 0x07160389 -/* End of filter settings. */ - -/* LP_AGC_CLAMP_CNTL0 */ -#define RT_NTSCM_SYNCTIP_REF0 0x00000037 -#define RT_NTSCM_SYNCTIP_REF1 0x00000029 -#define RT_NTSCM_CLAMP_REF 0x0000003B -#define RT_NTSCM_PEAKWHITE 0x000000FF -#define RT_NTSCM_VBI_PEAKWHITE 0x000000C2 - -#define RT_NTSCM_WPA_THRESHOLD 0x00000406 -#define RT_NTSCM_WPA_TRIGGER_LO 0x000000B3 - -#define RT_NTSCM_WPA_TRIGGER_HIGH 0x0000021B - -#define RT_NTSCM_LP_LOCKOUT_START 0x00000206 -#define RT_NTSCM_LP_LOCKOUT_END 0x00000021 -#define RT_NTSCM_CH_DTO_INC 0x00400000 -#define RT_NTSCM_CH_PLL_SGAIN 0x00000001 -#define RT_NTSCM_CH_PLL_FGAIN 0x00000002 - -#define RT_NTSCM_CR_BURST_GAIN 0x0000007A -#define RT_NTSCM_CB_BURST_GAIN 0x000000AC - -#define RT_NTSCM_CH_HEIGHT 0x000000CD -#define RT_NTSCM_CH_KILL_LEVEL 0x000000C0 -#define RT_NTSCM_CH_AGC_ERROR_LIM 0x00000002 -#define RT_NTSCM_CH_AGC_FILTER_EN 0x00000000 -#define RT_NTSCM_CH_AGC_LOOP_SPEED 0x00000000 - -#define RT_NTSCM_CRDR_ACTIVE_GAIN 0x0000007A -#define RT_NTSCM_CBDB_ACTIVE_GAIN 0x000000AC - -#define RT_NTSCM_VERT_LOCKOUT_START 0x00000207 -#define RT_NTSCM_VERT_LOCKOUT_END 0x0000000E - -#define RT_NTSCJ_SYNCTIP_REF0 0x00000004 -#define RT_NTSCJ_SYNCTIP_REF1 0x00000012 -#define RT_NTSCJ_CLAMP_REF 0x0000003B -#define RT_NTSCJ_PEAKWHITE 0x000000CB -#define RT_NTSCJ_VBI_PEAKWHITE 0x000000C2 -#define RT_NTSCJ_WPA_THRESHOLD 0x000004B0 -#define RT_NTSCJ_WPA_TRIGGER_LO 0x000000B4 -#define RT_NTSCJ_WPA_TRIGGER_HIGH 0x0000021C -#define RT_NTSCJ_LP_LOCKOUT_START 0x00000206 -#define RT_NTSCJ_LP_LOCKOUT_END 0x00000021 - -#define RT_NTSCJ_CR_BURST_GAIN 0x00000071 -#define RT_NTSCJ_CB_BURST_GAIN 0x0000009F -#define RT_NTSCJ_CH_HEIGHT 0x000000CD -#define RT_NTSCJ_CH_KILL_LEVEL 0x000000C0 -#define RT_NTSCJ_CH_AGC_ERROR_LIM 0x00000002 -#define RT_NTSCJ_CH_AGC_FILTER_EN 0x00000000 -#define RT_NTSCJ_CH_AGC_LOOP_SPEED 0x00000000 - -#define RT_NTSCJ_CRDR_ACTIVE_GAIN 0x00000071 -#define RT_NTSCJ_CBDB_ACTIVE_GAIN 0x0000009F -#define RT_NTSCJ_VERT_LOCKOUT_START 0x00000207 -#define RT_NTSCJ_VERT_LOCKOUT_END 0x0000000E - -#define RT_PAL_SYNCTIP_REF0 0x37 /* instead of 0x00000004 - Ivo */ -#define RT_PAL_SYNCTIP_REF1 0x26 /* instead of 0x0000000F - Ivo */ -#define RT_PAL_CLAMP_REF 0x0000003B -#define RT_PAL_PEAKWHITE 0xFF /* instead of 0x000000C1 - Ivo */ -#define RT_PAL_VBI_PEAKWHITE 0xC6 /* instead of 0x000000C7 - Ivo */ -#define RT_PAL_WPA_THRESHOLD 0x59C /* instead of 0x000006A4 - Ivo */ - -#define RT_PAL_WPA_TRIGGER_LO 0x00000096 -#define RT_PAL_WPA_TRIGGER_HIGH 0x000001C2 -#define RT_PAL_LP_LOCKOUT_START 0x00000263 -#define RT_PAL_LP_LOCKOUT_END 0x0000002C - -#define RT_PAL_CH_DTO_INC 0x00400000 -#define RT_PAL_CH_PLL_SGAIN 1 /* instead of 0x00000002 - Ivo */ -#define RT_PAL_CH_PLL_FGAIN 2 /* instead of 0x00000001 - Ivo */ -#define RT_PAL_CR_BURST_GAIN 0x0000007A -#define RT_PAL_CB_BURST_GAIN 0x000000AB -#define RT_PAL_CH_HEIGHT 0x0000009C -#define RT_PAL_CH_KILL_LEVEL 4 /* instead of 0x00000090 - Ivo */ -#define RT_PAL_CH_AGC_ERROR_LIM 1 /* instead of 0x00000002 - Ivo */ -#define RT_PAL_CH_AGC_FILTER_EN 1 /* instead of 0x00000000 - Ivo */ -#define RT_PAL_CH_AGC_LOOP_SPEED 0x00000000 - -#define RT_PAL_CRDR_ACTIVE_GAIN 0x9E /* instead of 0x0000007A - Ivo */ -#define RT_PAL_CBDB_ACTIVE_GAIN 0xDF /* instead of 0x000000AB - Ivo */ -#define RT_PAL_VERT_LOCKOUT_START 0x00000269 -#define RT_PAL_VERT_LOCKOUT_END 0x00000012 - -#define RT_SECAM_SYNCTIP_REF0 0x37 /* instead of 0x00000004 - Ivo */ -#define RT_SECAM_SYNCTIP_REF1 0x26 /* instead of 0x0000000F - Ivo */ -#define RT_SECAM_CLAMP_REF 0x0000003B -#define RT_SECAM_PEAKWHITE 0xFF /* instead of 0x000000C1 - Ivo */ -#define RT_SECAM_VBI_PEAKWHITE 0xC6 /* instead of 0x000000C7 - Ivo */ -#define RT_SECAM_WPA_THRESHOLD 0x57A /* instead of 0x6A4, instead of 0x0000059C is Ivo's value , -eric*/ - -#define RT_SECAM_WPA_TRIGGER_LO 0x96 /* instead of 0x0000026B - eric */ -#define RT_SECAM_WPA_TRIGGER_HIGH 0x000001C2 -#define RT_SECAM_LP_LOCKOUT_START 0x263 /* instead of 0x0000026B - eric */ -#define RT_SECAM_LP_LOCKOUT_END 0x2b /* instead of 0x0000002C -eric */ - -#define RT_SECAM_CH_DTO_INC 0x003E7A28 -#define RT_SECAM_CH_PLL_SGAIN 0x4 /* instead of 0x00000006 -Volodya */ -#define RT_SECAM_CH_PLL_FGAIN 0x7 /* instead of 0x00000006 -Volodya */ - -#define RT_SECAM_CR_BURST_GAIN 0x1FF /* instead of 0x00000200 -Volodya */ -#define RT_SECAM_CB_BURST_GAIN 0x1FF /* instead of 0x00000200 -Volodya */ -#define RT_SECAM_CH_HEIGHT 0x00000066 -#define RT_SECAM_CH_KILL_LEVEL 0x00000060 -#define RT_SECAM_CH_AGC_ERROR_LIM 0x00000003 -#define RT_SECAM_CH_AGC_FILTER_EN 0x00000000 -#define RT_SECAM_CH_AGC_LOOP_SPEED 0x00000000 - -#define RT_SECAM_CRDR_ACTIVE_GAIN 0x11B /* instead of 0x00000200 - eric */ -#define RT_SECAM_CBDB_ACTIVE_GAIN 0x15A /* instead of 0x00000200 - eric */ -#define RT_SECAM_VERT_LOCKOUT_START 0x00000269 -#define RT_SECAM_VERT_LOCKOUT_END 0x00000012 - -#define RT_PAL_VS_FIELD_BLANK_END 0x2A /* instead of 0x0000002C - Ivo*/ -#define RT_NTSCM_VS_FIELD_BLANK_END 0x0000000A - -#define RT_NTSCM_FIELD_IDLOCATION 0x00000105 -#define RT_PAL_FIELD_IDLOCATION 0x00000137 - -#define RT_NTSCM_H_ACTIVE_START 0x00000070 -#define RT_NTSCM_H_ACTIVE_END 0x00000363 - -#define RT_PAL_H_ACTIVE_START 0x0000009A -#define RT_PAL_H_ACTIVE_END 0x00000439 - -#define RT_NTSCM_V_ACTIVE_START ((22-4)*2+1) -#define RT_NTSCM_V_ACTIVE_END ((22+240-4)*2+1) - -#define RT_PAL_V_ACTIVE_START 0x2E /* instead of 0x00000023 (Same as SECAM) - Ivo */ -#define RT_PAL_V_ACTIVE_END 0x269 /* instead of 0x00000262 - Ivo */ - -/* VBI */ -#define RT_NTSCM_H_VBI_WIND_START 0x00000049 -#define RT_NTSCM_H_VBI_WIND_END 0x00000366 - -#define RT_PAL_H_VBI_WIND_START 0x00000084 -#define RT_PAL_H_VBI_WIND_END 0x0000041F - -#define RT_NTSCM_V_VBI_WIND_START fld_V_VBI_WIND_START_def -#define RT_NTSCM_V_VBI_WIND_END fld_V_VBI_WIND_END_def - -#define RT_PAL_V_VBI_WIND_START 0x8 /* instead of 0x0000000B - Ivo */ -#define RT_PAL_V_VBI_WIND_END 0x2D /* instead of 0x00000022 - Ivo */ - -#define RT_VBI_CAPTURE_EN 0x00000001 /* Enable */ -#define RT_VBI_CAPTURE_DIS 0x00000000 /* Disable */ -#define RT_RAW_CAPTURE 0x00000002 /* Use raw Video Capture. */ - -#define RT_NTSCM_VSYNC_INT_TRIGGER 0x2AA -#define RT_PALSEM_VSYNC_INT_TRIGGER 0x353 - -#define RT_NTSCM_VSYNC_INT_HOLD 0x17 -#define RT_PALSEM_VSYNC_INT_HOLD 0x1C - -#define RT_NTSCM_VS_FIELD_BLANK_START 0x206 -#define RT_PALSEM_VS_FIELD_BLANK_START 0x26D /* instead of 0x26C - Ivo */ - -#define RT_FIELD_FLIP_EN 0x4 -#define RT_V_FIELD_FLIP_INVERTED 0x2000 - -#define RT_NTSCM_H_IN_START 0x70 -#define RT_PAL_H_IN_START 154 /* instead of 144 - Ivo */ -#define RT_SECAM_H_IN_START 0x91 /* instead of 0x9A, Ivo value is 154, instead of 144 - Volodya, - eric */ -#define RT_NTSC_H_ACTIVE_SIZE 744 -#define RT_PAL_H_ACTIVE_SIZE 928 /* instead of 927 - Ivo */ -#define RT_SECAM_H_ACTIVE_SIZE 932 /* instead of 928, instead of 927 - Ivo, - eric */ -#define RT_NTSCM_V_IN_START (0x23) -#define RT_PAL_V_IN_START 44 /* instead of (45-6) - Ivo */ -#define RT_SECAM_V_IN_START 0x2C /* instead of (45-6) - Volodya */ -#define RT_NTSCM_V_ACTIVE_SIZE 480 -#define RT_PAL_V_ACTIVE_SIZE 572 /* instead of 575 - Ivo */ -#define RT_SECAM_V_ACTIVE_SIZE 570 /* instead of 572, instead of 575 - Ivo, - eric */ - -#define RT_NTSCM_WIN_CLOSE_LIMIT 0x4D -#define RT_NTSCJ_WIN_CLOSE_LIMIT 0x4D -#define RT_NTSC443_WIN_CLOSE_LIMIT 0x5F -#define RT_PALM_WIN_CLOSE_LIMIT 0x4D -#define RT_PALN_WIN_CLOSE_LIMIT 0x5F -#define RT_SECAM_WIN_CLOSE_LIMIT 0xC7 /* instead of 0x5F - eric */ - -#define RT_NTSCM_VS_FIELD_BLANK_START 0x206 - -#define RT_NTSCM_HS_PLL_SGAIN 0x5 -#define RT_NTSCM_HS_PLL_FGAIN 0x7 - -#define RT_NTSCM_H_OUT_WIND_WIDTH 0x2F4 -#define RT_NTSCM_V_OUT_WIND_HEIGHT 0xF0 - -#define TV 0x1 -#define LINEIN 0x2 -#define MUTE 0x3 - -#define DEC_COMPOSITE 0 -#define DEC_SVIDEO 1 -#define DEC_TUNER 2 - -#define DEC_NTSC 0 -#define DEC_PAL 1 -#define DEC_SECAM 2 -#define DEC_NTSC_J 8 - -#define DEC_SMOOTH 0 -#define DEC_SHARP 1 - -/* RT Register Field Defaults: */ -#define fld_tmpReg1_def 0x00000000 -#define fld_tmpReg2_def 0x00000001 -#define fld_tmpReg3_def 0x00000002 - -#define fld_LP_CONTRAST_def 0x0000006e -#define fld_LP_BRIGHTNESS_def 0x00003ff0 -#define fld_CP_HUE_CNTL_def 0x00000000 -#define fld_LUMA_FILTER_def 0x00000001 -#define fld_H_SCALE_RATIO_def 0x00010000 -#define fld_H_SHARPNESS_def 0x00000000 - -#define fld_V_SCALE_RATIO_def 0x00000800 -#define fld_V_DEINTERLACE_ON_def 0x00000001 -#define fld_V_BYPSS_def 0x00000000 -#define fld_V_DITHER_ON_def 0x00000001 -#define fld_EVENF_OFFSET_def 0x00000000 -#define fld_ODDF_OFFSET_def 0x00000000 - -#define fld_INTERLACE_DETECTED_def 0x00000000 - -#define fld_VS_LINE_COUNT_def 0x00000000 -#define fld_VS_DETECTED_LINES_def 0x00000000 -#define fld_VS_ITU656_VB_def 0x00000000 - -#define fld_VBI_CC_DATA_def 0x00000000 -#define fld_VBI_CC_WT_def 0x00000000 -#define fld_VBI_CC_WT_ACK_def 0x00000000 -#define fld_VBI_CC_HOLD_def 0x00000000 -#define fld_VBI_DECODE_EN_def 0x00000000 - -#define fld_VBI_CC_DTO_P_def 0x00001802 -#define fld_VBI_20BIT_DTO_P_def 0x0000155c - -#define fld_VBI_CC_LEVEL_def 0x0000003f -#define fld_VBI_20BIT_LEVEL_def 0x00000059 -#define fld_VBI_CLK_RUNIN_GAIN_def 0x0000010f - -#define fld_H_VBI_WIND_START_def 0x00000041 -#define fld_H_VBI_WIND_END_def 0x00000366 - -#define fld_V_VBI_WIND_START_def 0x0D -#define fld_V_VBI_WIND_END_def 0x24 - -#define fld_VBI_20BIT_DATA0_def 0x00000000 -#define fld_VBI_20BIT_DATA1_def 0x00000000 -#define fld_VBI_20BIT_WT_def 0x00000000 -#define fld_VBI_20BIT_WT_ACK_def 0x00000000 -#define fld_VBI_20BIT_HOLD_def 0x00000000 - -#define fld_VBI_CAPTURE_ENABLE_def 0x00000000 - -#define fld_VBI_EDS_DATA_def 0x00000000 -#define fld_VBI_EDS_WT_def 0x00000000 -#define fld_VBI_EDS_WT_ACK_def 0x00000000 -#define fld_VBI_EDS_HOLD_def 0x00000000 - -#define fld_VBI_SCALING_RATIO_def 0x00010000 -#define fld_VBI_ALIGNER_ENABLE_def 0x00000000 - -#define fld_H_ACTIVE_START_def 0x00000070 -#define fld_H_ACTIVE_END_def 0x000002f0 - -#define fld_V_ACTIVE_START_def ((22-4)*2+1) -#define fld_V_ACTIVE_END_def ((22+240-4)*2+2) - -#define fld_CH_HEIGHT_def 0x000000CD -#define fld_CH_KILL_LEVEL_def 0x000000C0 -#define fld_CH_AGC_ERROR_LIM_def 0x00000002 -#define fld_CH_AGC_FILTER_EN_def 0x00000000 -#define fld_CH_AGC_LOOP_SPEED_def 0x00000000 - -#define fld_HUE_ADJ_def 0x00000000 - -#define fld_STANDARD_SEL_def 0x00000000 -#define fld_STANDARD_YC_def 0x00000000 - -#define fld_ADC_PDWN_def 0x00000001 -#define fld_INPUT_SELECT_def 0x00000000 - -#define fld_ADC_PREFLO_def 0x00000003 -#define fld_H_SYNC_PULSE_WIDTH_def 0x00000000 -#define fld_HS_GENLOCKED_def 0x00000000 -#define fld_HS_SYNC_IN_WIN_def 0x00000000 - -#define fld_VIN_ASYNC_RST_def 0x00000001 -#define fld_DVS_ASYNC_RST_def 0x00000001 - -/* Vendor IDs: */ -#define fld_VIP_VENDOR_ID_def 0x00001002 -#define fld_VIP_DEVICE_ID_def 0x00004d54 -#define fld_VIP_REVISION_ID_def 0x00000001 - -/* AGC Delay Register */ -#define fld_BLACK_INT_START_def 0x00000031 -#define fld_BLACK_INT_LENGTH_def 0x0000000f - -#define fld_UV_INT_START_def 0x0000003b -#define fld_U_INT_LENGTH_def 0x0000000f -#define fld_V_INT_LENGTH_def 0x0000000f -#define fld_CRDR_ACTIVE_GAIN_def 0x0000007a -#define fld_CBDB_ACTIVE_GAIN_def 0x000000ac - -#define fld_DVS_DIRECTION_def 0x00000000 -#define fld_DVS_VBI_CARD8_SWAP_def 0x00000000 -#define fld_DVS_CLK_SELECT_def 0x00000000 -#define fld_CONTINUOUS_STREAM_def 0x00000000 -#define fld_DVSOUT_CLK_DRV_def 0x00000001 -#define fld_DVSOUT_DATA_DRV_def 0x00000001 - -#define fld_COMB_CNTL0_def 0x09438090 -#define fld_COMB_CNTL1_def 0x00000010 - -#define fld_COMB_CNTL2_def 0x16161010 -#define fld_COMB_LENGTH_def 0x0718038A - -#define fld_SYNCTIP_REF0_def 0x00000037 -#define fld_SYNCTIP_REF1_def 0x00000029 -#define fld_CLAMP_REF_def 0x0000003B -#define fld_AGC_PEAKWHITE_def 0x000000FF -#define fld_VBI_PEAKWHITE_def 0x000000D2 - -#define fld_WPA_THRESHOLD_def 0x000003B0 - -#define fld_WPA_TRIGGER_LO_def 0x000000B4 -#define fld_WPA_TRIGGER_HIGH_def 0x0000021C - -#define fld_LOCKOUT_START_def 0x00000206 -#define fld_LOCKOUT_END_def 0x00000021 - -#define fld_CH_DTO_INC_def 0x00400000 -#define fld_PLL_SGAIN_def 0x00000001 -#define fld_PLL_FGAIN_def 0x00000002 - -#define fld_CR_BURST_GAIN_def 0x0000007a -#define fld_CB_BURST_GAIN_def 0x000000ac - -#define fld_VERT_LOCKOUT_START_def 0x00000207 -#define fld_VERT_LOCKOUT_END_def 0x0000000E - -#define fld_H_IN_WIND_START_def 0x00000070 -#define fld_V_IN_WIND_START_def 0x00000027 - -#define fld_H_OUT_WIND_WIDTH_def 0x000002f4 - -#define fld_V_OUT_WIND_WIDTH_def 0x000000f0 - -#define fld_HS_LINE_TOTAL_def 0x0000038E - -#define fld_MIN_PULSE_WIDTH_def 0x0000002F -#define fld_MAX_PULSE_WIDTH_def 0x00000046 - -#define fld_WIN_CLOSE_LIMIT_def 0x0000004D -#define fld_WIN_OPEN_LIMIT_def 0x000001B7 - -#define fld_VSYNC_INT_TRIGGER_def 0x000002AA - -#define fld_VSYNC_INT_HOLD_def 0x0000001D - -#define fld_VIN_M0_def 0x00000039 -#define fld_VIN_N0_def 0x0000014c -#define fld_MNFLIP_EN_def 0x00000000 -#define fld_VIN_P_def 0x00000006 -#define fld_REG_CLK_SEL_def 0x00000000 - -#define fld_VIN_M1_def 0x00000000 -#define fld_VIN_N1_def 0x00000000 -#define fld_VIN_DRIVER_SEL_def 0x00000000 -#define fld_VIN_MNFLIP_REQ_def 0x00000000 -#define fld_VIN_MNFLIP_DONE_def 0x00000000 -#define fld_TV_LOCK_TO_VIN_def 0x00000000 -#define fld_TV_P_FOR_WINCLK_def 0x00000004 - -#define fld_VINRST_def 0x00000001 -#define fld_VIN_CLK_SEL_def 0x00000000 - -#define fld_VS_FIELD_BLANK_START_def 0x00000206 - -#define fld_VS_FIELD_BLANK_END_def 0x0000000A - -/*#define fld_VS_FIELD_IDLOCATION_def 0x00000105 */ -#define fld_VS_FIELD_IDLOCATION_def 0x00000001 -#define fld_VS_FRAME_TOTAL_def 0x00000217 - -#define fld_SYNC_TIP_START_def 0x00000372 -#define fld_SYNC_TIP_LENGTH_def 0x0000000F - -#define fld_GAIN_FORCE_DATA_def 0x00000000 -#define fld_GAIN_FORCE_EN_def 0x00000000 -#define fld_I_CLAMP_SEL_def 0x00000003 -#define fld_I_AGC_SEL_def 0x00000001 -#define fld_EXT_CLAMP_CAP_def 0x00000001 -#define fld_EXT_AGC_CAP_def 0x00000001 -#define fld_DECI_DITHER_EN_def 0x00000001 -#define fld_ADC_PREFHI_def 0x00000000 -#define fld_ADC_CH_GAIN_SEL_def 0x00000001 - -#define fld_HS_PLL_SGAIN_def 0x00000003 - -#define fld_NREn_def 0x00000000 -#define fld_NRGainCntl_def 0x00000000 -#define fld_NRBWTresh_def 0x00000000 -#define fld_NRGCTresh_def 0x00000000 -#define fld_NRCoefDespeclMode_def 0x00000000 - -#define fld_GPIO_5_OE_def 0x00000000 -#define fld_GPIO_6_OE_def 0x00000000 - -#define fld_GPIO_5_OUT_def 0x00000000 -#define fld_GPIO_6_OUT_def 0x00000000 - -/* End of field default values. */ - -#endif /* RADEON_H */ diff --git a/src/video_out/vidix/drivers/radeon_vid.c b/src/video_out/vidix/drivers/radeon_vid.c deleted file mode 100644 index de4e66194..000000000 --- a/src/video_out/vidix/drivers/radeon_vid.c +++ /dev/null @@ -1,3366 +0,0 @@ -/* - radeon_vid - VIDIX based video driver for Radeon and Rage128 chips - Copyrights 2002 Nick Kurshev. This file is based on sources from - GATOS (gatos.sf.net) and X11 (www.xfree86.org) - Licence: GPL -*/ - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <math.h> -#include <inttypes.h> -#include <sys/types.h> -#include <sys/mman.h> -#include "bswap.h" -#include "pci_ids.h" -#include "pci_names.h" -#include "vidix.h" -#include "fourcc.h" -#include "libdha.h" -#include "radeon.h" - -#ifdef RAGE128 -#define RADEON_MSG "[rage128]" -#define X_ADJUST 0 -#else -#define RADEON_MSG "[radeon]" -#define X_ADJUST (((besr.chip_flags&R_OVL_SHIFT)==R_OVL_SHIFT)?8:0) -#ifndef RADEON -#define RADEON -#endif -#endif - -#define RADEON_ASSERT(msg) printf(RADEON_MSG"################# FATAL:"msg); - -#ifdef RAGE128 -#define VIDIX_STATIC rage128_ -#else -#define VIDIX_STATIC radeo_ -#endif - -//#undef RADEON_ENABLE_BM /* unfinished stuff. May corrupt your filesystem ever */ -#define RADEON_ENABLE_BM 1 - -#ifdef RADEON_ENABLE_BM -static void * radeon_dma_desc_base = 0; -static unsigned long bus_addr_dma_desc = 0; -static unsigned long *dma_phys_addrs = 0; -#pragma pack(1) -typedef struct -{ - uint32_t framebuf_offset; - uint32_t sys_addr; - uint32_t command; - uint32_t reserved; -} bm_list_descriptor; -#pragma pack() -#endif - -#define VERBOSE_LEVEL 0 -static int __verbose = 0; -typedef struct bes_registers_s -{ - /* base address of yuv framebuffer */ - uint32_t yuv_base; - uint32_t fourcc; - uint32_t surf_id; - int load_prg_start; - int horz_pick_nearest; - int vert_pick_nearest; - int swap_uv; /* for direct support of bgr fourccs */ - uint32_t dest_bpp; - /* YUV BES registers */ - uint32_t reg_load_cntl; - uint32_t h_inc; - uint32_t step_by; - uint32_t y_x_start; - uint32_t y_x_end; - uint32_t v_inc; - uint32_t p1_blank_lines_at_top; - uint32_t p23_blank_lines_at_top; - uint32_t vid_buf_pitch0_value; - uint32_t vid_buf_pitch1_value; - uint32_t p1_x_start_end; - uint32_t p2_x_start_end; - uint32_t p3_x_start_end; - uint32_t base_addr; - uint32_t vid_buf_base_adrs_y[VID_PLAY_MAXFRAMES]; - uint32_t vid_buf_base_adrs_u[VID_PLAY_MAXFRAMES]; - uint32_t vid_buf_base_adrs_v[VID_PLAY_MAXFRAMES]; - uint32_t vid_nbufs; - - uint32_t p1_v_accum_init; - uint32_t p1_h_accum_init; - uint32_t p23_v_accum_init; - uint32_t p23_h_accum_init; - uint32_t scale_cntl; - uint32_t exclusive_horz; - uint32_t auto_flip_cntl; - uint32_t filter_cntl; - uint32_t four_tap_coeff[5]; - uint32_t key_cntl; - uint32_t test; - /* Configurable stuff */ - int double_buff; - - int brightness; - int saturation; - - uint32_t graphics_key_clr; - uint32_t graphics_key_msk; - uint32_t ckey_cntl; - - int deinterlace_on; - uint32_t deinterlace_pattern; - unsigned chip_flags; -} bes_registers_t; - -typedef struct video_registers_s -{ - const char * sname; - uint32_t name; - uint32_t value; -}video_registers_t; - -static bes_registers_t besr; -#define DECLARE_VREG(name) { #name, name, 0 } -static video_registers_t vregs[] = -{ - DECLARE_VREG(VIDEOMUX_CNTL), - DECLARE_VREG(VIPPAD_MASK), - DECLARE_VREG(VIPPAD1_A), - DECLARE_VREG(VIPPAD1_EN), - DECLARE_VREG(VIPPAD1_Y), - DECLARE_VREG(OV0_Y_X_START), - DECLARE_VREG(OV0_Y_X_END), - DECLARE_VREG(OV0_PIPELINE_CNTL), - DECLARE_VREG(OV0_EXCLUSIVE_HORZ), - DECLARE_VREG(OV0_EXCLUSIVE_VERT), - DECLARE_VREG(OV0_REG_LOAD_CNTL), - DECLARE_VREG(OV0_SCALE_CNTL), - DECLARE_VREG(OV0_V_INC), - DECLARE_VREG(OV0_P1_V_ACCUM_INIT), - DECLARE_VREG(OV0_P23_V_ACCUM_INIT), - DECLARE_VREG(OV0_P1_BLANK_LINES_AT_TOP), - DECLARE_VREG(OV0_P23_BLANK_LINES_AT_TOP), -#ifdef RADEON - DECLARE_VREG(OV0_BASE_ADDR), -#endif - DECLARE_VREG(OV0_VID_BUF0_BASE_ADRS), - DECLARE_VREG(OV0_VID_BUF1_BASE_ADRS), - DECLARE_VREG(OV0_VID_BUF2_BASE_ADRS), - DECLARE_VREG(OV0_VID_BUF3_BASE_ADRS), - DECLARE_VREG(OV0_VID_BUF4_BASE_ADRS), - DECLARE_VREG(OV0_VID_BUF5_BASE_ADRS), - DECLARE_VREG(OV0_VID_BUF_PITCH0_VALUE), - DECLARE_VREG(OV0_VID_BUF_PITCH1_VALUE), - DECLARE_VREG(OV0_AUTO_FLIP_CNTL), - DECLARE_VREG(OV0_DEINTERLACE_PATTERN), - DECLARE_VREG(OV0_SUBMIT_HISTORY), - DECLARE_VREG(OV0_H_INC), - DECLARE_VREG(OV0_STEP_BY), - DECLARE_VREG(OV0_P1_H_ACCUM_INIT), - DECLARE_VREG(OV0_P23_H_ACCUM_INIT), - DECLARE_VREG(OV0_P1_X_START_END), - DECLARE_VREG(OV0_P2_X_START_END), - DECLARE_VREG(OV0_P3_X_START_END), - DECLARE_VREG(OV0_FILTER_CNTL), - DECLARE_VREG(OV0_FOUR_TAP_COEF_0), - DECLARE_VREG(OV0_FOUR_TAP_COEF_1), - DECLARE_VREG(OV0_FOUR_TAP_COEF_2), - DECLARE_VREG(OV0_FOUR_TAP_COEF_3), - DECLARE_VREG(OV0_FOUR_TAP_COEF_4), - DECLARE_VREG(OV0_FLAG_CNTL), -#ifdef RAGE128 - DECLARE_VREG(OV0_COLOUR_CNTL), -#else - DECLARE_VREG(OV0_SLICE_CNTL), -#endif - DECLARE_VREG(OV0_VID_KEY_CLR), - DECLARE_VREG(OV0_VID_KEY_MSK), - DECLARE_VREG(OV0_GRAPHICS_KEY_CLR), - DECLARE_VREG(OV0_GRAPHICS_KEY_MSK), - DECLARE_VREG(OV0_KEY_CNTL), - DECLARE_VREG(OV0_TEST), - DECLARE_VREG(OV0_LIN_TRANS_A), - DECLARE_VREG(OV0_LIN_TRANS_B), - DECLARE_VREG(OV0_LIN_TRANS_C), - DECLARE_VREG(OV0_LIN_TRANS_D), - DECLARE_VREG(OV0_LIN_TRANS_E), - DECLARE_VREG(OV0_LIN_TRANS_F), - DECLARE_VREG(OV0_GAMMA_0_F), - DECLARE_VREG(OV0_GAMMA_10_1F), - DECLARE_VREG(OV0_GAMMA_20_3F), - DECLARE_VREG(OV0_GAMMA_40_7F), - DECLARE_VREG(OV0_GAMMA_380_3BF), - DECLARE_VREG(OV0_GAMMA_3C0_3FF), - DECLARE_VREG(SUBPIC_CNTL), - DECLARE_VREG(SUBPIC_DEFCOLCON), - DECLARE_VREG(SUBPIC_Y_X_START), - DECLARE_VREG(SUBPIC_Y_X_END), - DECLARE_VREG(SUBPIC_V_INC), - DECLARE_VREG(SUBPIC_H_INC), - DECLARE_VREG(SUBPIC_BUF0_OFFSET), - DECLARE_VREG(SUBPIC_BUF1_OFFSET), - DECLARE_VREG(SUBPIC_LC0_OFFSET), - DECLARE_VREG(SUBPIC_LC1_OFFSET), - DECLARE_VREG(SUBPIC_PITCH), - DECLARE_VREG(SUBPIC_BTN_HLI_COLCON), - DECLARE_VREG(SUBPIC_BTN_HLI_Y_X_START), - DECLARE_VREG(SUBPIC_BTN_HLI_Y_X_END), - DECLARE_VREG(SUBPIC_PALETTE_INDEX), - DECLARE_VREG(SUBPIC_PALETTE_DATA), - DECLARE_VREG(SUBPIC_H_ACCUM_INIT), - DECLARE_VREG(SUBPIC_V_ACCUM_INIT), - DECLARE_VREG(IDCT_RUNS), - DECLARE_VREG(IDCT_LEVELS), - DECLARE_VREG(IDCT_AUTH_CONTROL), - DECLARE_VREG(IDCT_AUTH), - DECLARE_VREG(IDCT_CONTROL), -#ifdef RAGE128 - DECLARE_VREG(BM_FRAME_BUF_OFFSET), - DECLARE_VREG(BM_SYSTEM_MEM_ADDR), - DECLARE_VREG(BM_COMMAND), - DECLARE_VREG(BM_STATUS), - DECLARE_VREG(BM_QUEUE_STATUS), - DECLARE_VREG(BM_QUEUE_FREE_STATUS), - DECLARE_VREG(BM_CHUNK_0_VAL), - DECLARE_VREG(BM_CHUNK_1_VAL), - DECLARE_VREG(BM_VIP0_BUF), - DECLARE_VREG(BM_VIP0_ACTIVE), - DECLARE_VREG(BM_VIP1_BUF), - DECLARE_VREG(BM_VIP1_ACTIVE), - DECLARE_VREG(BM_VIP2_BUF), - DECLARE_VREG(BM_VIP2_ACTIVE), - DECLARE_VREG(BM_VIP3_BUF), - DECLARE_VREG(BM_VIP3_ACTIVE), - DECLARE_VREG(BM_VIDCAP_BUF0), - DECLARE_VREG(BM_VIDCAP_BUF1), - DECLARE_VREG(BM_VIDCAP_BUF2), - DECLARE_VREG(BM_VIDCAP_ACTIVE), - DECLARE_VREG(BM_GUI), - DECLARE_VREG(BM_ABORT) -#else - DECLARE_VREG(DMA_GUI_TABLE_ADDR), - DECLARE_VREG(DMA_GUI_SRC_ADDR), - DECLARE_VREG(DMA_GUI_DST_ADDR), - DECLARE_VREG(DMA_GUI_COMMAND), - DECLARE_VREG(DMA_GUI_STATUS), - DECLARE_VREG(DMA_GUI_ACT_DSCRPTR), - DECLARE_VREG(DMA_VID_SRC_ADDR), - DECLARE_VREG(DMA_VID_DST_ADDR), - DECLARE_VREG(DMA_VID_COMMAND), - DECLARE_VREG(DMA_VID_STATUS), - DECLARE_VREG(DMA_VID_ACT_DSCRPTR), -#endif -}; - -#define R_FAMILY 0x000000FF -#define R_100 0x00000001 -#define R_120 0x00000002 -#define R_150 0x00000003 -#define R_200 0x00000004 -#define R_250 0x00000005 -#define R_280 0x00000006 -#define R_300 0x00000007 -#define R_350 0x00000008 -#define R_370 0x00000010 -#define R_380 0x00000020 -#define R_420 0x00000040 -#define R_OVL_SHIFT 0x00000100 -#define R_INTEGRATED 0x00000200 -#define R_PCIE 0x00000400 - -typedef struct ati_card_ids_s -{ - unsigned short id; - unsigned flags; -}ati_card_ids_t; - -static const ati_card_ids_t ati_card_ids[] = -{ -#ifdef RAGE128 - /* - This driver should be compatible with Rage128 (pro) chips. - (include adaptive deinterlacing!!!). - Moreover: the same logic can be used with Mach64 chips. - (I mean: mach64xx, 3d rage, 3d rage IIc, 3D rage pro, 3d rage mobility). - but they are incompatible by i/o ports. So if enthusiasts will want - then they can redefine OUTREG and INREG macros and redefine OV0_* - constants. Also it seems that mach64 chips supports only: YUY2, YV12, UYVY - fourccs (422 and 420 formats only). - */ -/* Rage128 Pro GL */ - { DEVICE_ATI_RAGE_128_PA_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PB_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PC_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PD_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PE_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PF_PRO, 0 }, -/* Rage128 Pro VR */ - { DEVICE_ATI_RAGE_128_PG_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PH_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PI_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PJ_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PK_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PL_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PM_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PN_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PO_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PP_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PQ_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PR_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PS_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PT_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PU_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PV_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PW_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PX_PRO, 0 }, -/* Rage128 GL */ - { DEVICE_ATI_RAGE_128_RE_SG, 0 }, - { DEVICE_ATI_RAGE_128_RF_SG, 0 }, - { DEVICE_ATI_RAGE_128_RG, 0 }, - { DEVICE_ATI_RAGE_128_RK_VR, 0 }, - { DEVICE_ATI_RAGE_128_RL_VR, 0 }, - { DEVICE_ATI_RAGE_128_SE_4X, 0 }, - { DEVICE_ATI_RAGE_128_SF_4X, 0 }, - { DEVICE_ATI_RAGE_128_SG_4X, 0 }, - { DEVICE_ATI_RAGE_128_SH, 0 }, - { DEVICE_ATI_RAGE_128_SK_4X, 0 }, - { DEVICE_ATI_RAGE_128_SL_4X, 0 }, - { DEVICE_ATI_RAGE_128_SM_4X, 0 }, - { DEVICE_ATI_RAGE_128_4X, 0 }, - { DEVICE_ATI_RAGE_128_PRO, 0 }, - { DEVICE_ATI_RAGE_128_PRO2, 0 }, - { DEVICE_ATI_RAGE_128_PRO3, 0 }, -/* these seem to be based on rage 128 instead of mach64 */ - { DEVICE_ATI_RAGE_MOBILITY_M3, 0 }, - { DEVICE_ATI_RAGE_MOBILITY_M32, 0 }, -#else -/* Radeon1 (indeed: Rage 256 Pro ;) */ - { DEVICE_ATI_RADEON_R100_QD, R_100|R_OVL_SHIFT }, - { DEVICE_ATI_RADEON_R100_QE, R_100|R_OVL_SHIFT }, - { DEVICE_ATI_RADEON_R100_QF, R_100|R_OVL_SHIFT }, - { DEVICE_ATI_RADEON_R100_QG, R_100|R_OVL_SHIFT }, - { DEVICE_ATI_RADEON_IGP_320, R_150|R_OVL_SHIFT|R_INTEGRATED }, - { DEVICE_ATI_RADEON_MOBILITY_U1, R_150|R_OVL_SHIFT|R_INTEGRATED }, - { DEVICE_ATI_RADEON_RV100_QY, R_120|R_OVL_SHIFT }, - { DEVICE_ATI_RADEON_RV100_QZ, R_120|R_OVL_SHIFT }, - { DEVICE_ATI_RADEON_MOBILITY_M7, R_150|R_OVL_SHIFT }, - { DEVICE_ATI_RADEON_RV200_LX, R_150|R_OVL_SHIFT }, - { DEVICE_ATI_RADEON_MOBILITY_M6, R_120|R_OVL_SHIFT }, - { DEVICE_ATI_RADEON_MOBILITY_M62, R_120|R_OVL_SHIFT }, -/* Radeon2 (indeed: Rage 512 Pro ;) */ - { DEVICE_ATI_R200_BB_RADEON, R_200 }, - { DEVICE_ATI_R200_BC_RADEON, R_200 }, - { DEVICE_ATI_RADEON_R200_QH, R_200 }, - { DEVICE_ATI_RADEON_R200_QI, R_200 }, - { DEVICE_ATI_RADEON_R200_QJ, R_200 }, - { DEVICE_ATI_RADEON_R200_QK, R_200 }, - { DEVICE_ATI_RADEON_R200_QL, R_200 }, - { DEVICE_ATI_RADEON_R200_QM, R_200 }, - { DEVICE_ATI_RADEON_R200_QN, R_200 }, - { DEVICE_ATI_RADEON_R200_QO, R_200 }, - { DEVICE_ATI_RADEON_R200_QH2, R_200 }, - { DEVICE_ATI_RADEON_R200_QI2, R_200 }, - { DEVICE_ATI_RADEON_R200_QJ2, R_200 }, - { DEVICE_ATI_RADEON_R200_QK2, R_200 }, - { DEVICE_ATI_RADEON_R200_QL2, R_200 }, - { DEVICE_ATI_RADEON_RV200_QW, R_150|R_OVL_SHIFT }, - { DEVICE_ATI_RADEON_RV200_QX, R_150|R_OVL_SHIFT }, - { DEVICE_ATI_RADEON_IGP330_340_350,R_200|R_INTEGRATED }, - { DEVICE_ATI_RADEON_IGP_330M_340M_350M,R_200|R_INTEGRATED }, - { DEVICE_ATI_RADEON_RV250_IG, R_250|R_OVL_SHIFT }, - { DEVICE_ATI_RADEON_7000_IGP, R_250|R_OVL_SHIFT|R_INTEGRATED }, - { DEVICE_ATI_RADEON_MOBILITY_7000, R_250|R_OVL_SHIFT|R_INTEGRATED }, - { DEVICE_ATI_RADEON_RV250_ID, R_250|R_OVL_SHIFT }, - { DEVICE_ATI_RADEON_RV250_IE, R_250|R_OVL_SHIFT }, - { DEVICE_ATI_RADEON_RV250_IF, R_250|R_OVL_SHIFT }, - { DEVICE_ATI_RADEON_RV250_IG, R_250|R_OVL_SHIFT }, - { DEVICE_ATI_RADEON_R250_LD, R_250|R_OVL_SHIFT }, - { DEVICE_ATI_RADEON_R250_LE, R_250|R_OVL_SHIFT }, - { DEVICE_ATI_RADEON_R250_LF, R_250|R_OVL_SHIFT }, - { DEVICE_ATI_RADEON_R250_LG, R_250|R_OVL_SHIFT }, - { DEVICE_ATI_RV280_RADEON_92003, R_280 }, - { DEVICE_ATI_RV280_RADEON_92004, R_280 }, - { DEVICE_ATI_RV280_RADEON_92005, R_280 }, -/* Radeon3 (indeed: Rage 1024 Pro ;) */ - { DEVICE_ATI_R300_AG_FIREGL, R_300 }, - { DEVICE_ATI_RADEON_R300_ND, R_300 }, - { DEVICE_ATI_RADEON_R300_NE, R_300 }, - { DEVICE_ATI_RADEON_R300_NG, R_300 }, - { DEVICE_ATI_R300_AD_RADEON, R_300 }, - { DEVICE_ATI_R300_AE_RADEON, R_300 }, - { DEVICE_ATI_R300_AF_RADEON, R_300 }, - { DEVICE_ATI_RADEON_9100_IGP2, R_300|R_OVL_SHIFT|R_INTEGRATED }, - { DEVICE_ATI_RS300M_AGP_RADEON, R_300|R_INTEGRATED }, - { DEVICE_ATI_R350_AH_RADEON, R_350 }, - { DEVICE_ATI_R350_AI_RADEON, R_350 }, - { DEVICE_ATI_R350_AJ_RADEON, R_350 }, - { DEVICE_ATI_R350_AK_FIRE, R_350 }, - { DEVICE_ATI_RADEON_R350_RADEON2, R_350 }, - { DEVICE_ATI_RADEON_R350_RADEON3, R_350 }, - { DEVICE_ATI_RV350_NJ_RADEON, R_350 }, - { DEVICE_ATI_R350_NK_FIRE, R_350 }, - { DEVICE_ATI_RV350_AP_RADEON, R_350 }, - { DEVICE_ATI_RV350_AQ_RADEON, R_350 }, - { DEVICE_ATI_RV350_AR_RADEON, R_350 }, - { DEVICE_ATI_RV350_AS_RADEON, R_350 }, - { DEVICE_ATI_RV350_AT_FIRE, R_350 }, - { DEVICE_ATI_RV350_AU_FIRE, R_350 }, - { DEVICE_ATI_RV350_AV_FIRE, R_350 }, - { DEVICE_ATI_RV350_AW_FIRE, R_350 }, - { DEVICE_ATI_RV350_MOBILITY_RADEON, R_350 }, - { DEVICE_ATI_RV350_NF_RADEON, R_300 }, - { DEVICE_ATI_RV350_NJ_RADEON, R_300 }, - { DEVICE_ATI_M10_NQ_RADEON, R_350 }, - { DEVICE_ATI_RV350_MOBILITY_RADEON2, R_350 }, - { DEVICE_ATI_M10_NS_RADEON, R_350 }, - { DEVICE_ATI_M10_NT_FIREGL, R_350 }, - { DEVICE_ATI_M11_NV_FIREGL, R_350 }, - { DEVICE_ATI_RV370_5B60_RADEON, R_370|R_PCIE }, - { DEVICE_ATI_RV370_5B62_RADEON, R_370|R_PCIE }, - { DEVICE_ATI_RV370_5B64_FIREGL, R_370|R_PCIE }, - { DEVICE_ATI_RV370_5B65_FIREGL, R_370|R_PCIE }, - { DEVICE_ATI_RV380_0X3E50_RADEON, R_380|R_PCIE }, - { DEVICE_ATI_RV380_0X3E54_FIREGL, R_380|R_PCIE }, - { DEVICE_ATI_RV380_RADEON_X600, R_380|R_PCIE }, - { DEVICE_ATI_R420_JH_RADEON, R_420|R_PCIE }, - { DEVICE_ATI_R420_JI_RADEON, R_420|R_PCIE }, - { DEVICE_ATI_R420_JJ_RADEON, R_420|R_PCIE }, - { DEVICE_ATI_R420_JK_RADEON, R_420|R_PCIE }, - { DEVICE_ATI_R420_JL_RADEON, R_420|R_PCIE }, - { DEVICE_ATI_R420_JM_FIREGL, R_420|R_PCIE }, - { DEVICE_ATI_M18_JN_RADEON, R_420|R_PCIE }, - { DEVICE_ATI_R420_JP_RADEON, R_420|R_PCIE }, - { DEVICE_ATI_R420_JM_FIREGL, R_420|R_PCIE }, - { DEVICE_ATI_R423_5F57_RADEON, R_420|R_PCIE } -#endif -}; - - -static void * radeon_mmio_base = 0; -static void * radeon_mem_base = 0; -static int32_t radeon_overlay_off = 0; -static uint32_t radeon_ram_size = 0; - -#define GETREG(TYPE,PTR,OFFZ) (*((volatile TYPE*)((PTR)+(OFFZ)))) -#define SETREG(TYPE,PTR,OFFZ,VAL) (*((volatile TYPE*)((PTR)+(OFFZ))))=VAL - -#define INREG8(addr) GETREG(uint8_t,(uint32_t)(radeon_mmio_base),addr) -#define OUTREG8(addr,val) SETREG(uint8_t,(uint32_t)(radeon_mmio_base),addr,val) -static inline uint32_t INREG (uint32_t addr) { - uint32_t tmp = GETREG(uint32_t,(uint32_t)(radeon_mmio_base),addr); - return le2me_32(tmp); -} -#define OUTREG(addr,val) SETREG(uint32_t,(uint32_t)(radeon_mmio_base),addr,le2me_32(val)) -#define OUTREGP(addr,val,mask) \ - do { \ - unsigned int _tmp = INREG(addr); \ - _tmp &= (mask); \ - _tmp |= (val); \ - OUTREG(addr, _tmp); \ - } while (0) - - -static __inline__ uint32_t INPLL(uint32_t addr) -{ - OUTREG8(CLOCK_CNTL_INDEX, addr & 0x0000001f); - return (INREG(CLOCK_CNTL_DATA)); -} - -#define OUTPLL(addr,val) OUTREG8(CLOCK_CNTL_INDEX, (addr & 0x0000001f) | 0x00000080); \ - OUTREG(CLOCK_CNTL_DATA, val) -#define OUTPLLP(addr,val,mask) \ - do { \ - unsigned int _tmp = INPLL(addr); \ - _tmp &= (mask); \ - _tmp |= (val); \ - OUTPLL(addr, _tmp); \ - } while (0) - -static uint32_t radeon_vid_get_dbpp( void ) -{ - uint32_t dbpp,retval; - dbpp = (INREG(CRTC_GEN_CNTL)>>8)& 0xF; - switch(dbpp) - { - case DST_8BPP: retval = 8; break; - case DST_15BPP: retval = 15; break; - case DST_16BPP: retval = 16; break; - case DST_24BPP: retval = 24; break; - default: retval=32; break; - } - return retval; -} - -static int radeon_is_dbl_scan( void ) -{ - return (INREG(CRTC_GEN_CNTL))&CRTC_DBL_SCAN_EN; -} - -static int radeon_is_interlace( void ) -{ - return (INREG(CRTC_GEN_CNTL))&CRTC_INTERLACE_EN; -} - -static uint32_t radeon_get_xres( void ) -{ - /* FIXME: currently we extract that from CRTC!!!*/ - uint32_t xres,h_total; - h_total = INREG(CRTC_H_TOTAL_DISP); - xres = (h_total >> 16) & 0xffff; - return (xres + 1)*8; -} - -static uint32_t radeon_get_yres( void ) -{ - /* FIXME: currently we extract that from CRTC!!!*/ - uint32_t yres,v_total; - v_total = INREG(CRTC_V_TOTAL_DISP); - yres = (v_total >> 16) & 0xffff; - return yres + 1; -} - -static void radeon_wait_vsync(void) -{ - int i; - - OUTREG(GEN_INT_STATUS, VSYNC_INT_AK); - for (i = 0; i < 2000000; i++) - { - if (INREG(GEN_INT_STATUS) & VSYNC_INT) break; - } -} - -#ifdef RAGE128 -static void _radeon_engine_idle(void); -static void _radeon_fifo_wait(unsigned); -#define radeon_engine_idle() _radeon_engine_idle() -#define radeon_fifo_wait(entries) _radeon_fifo_wait(entries) -/* Flush all dirty data in the Pixel Cache to memory. */ -static __inline__ void radeon_engine_flush ( void ) -{ - unsigned i; - - OUTREGP(PC_NGUI_CTLSTAT, PC_FLUSH_ALL, ~PC_FLUSH_ALL); - for (i = 0; i < 2000000; i++) { - if (!(INREG(PC_NGUI_CTLSTAT) & PC_BUSY)) break; - } -} - -/* Reset graphics card to known state. */ -static void radeon_engine_reset( void ) -{ - uint32_t clock_cntl_index; - uint32_t mclk_cntl; - uint32_t gen_reset_cntl; - - radeon_engine_flush(); - - clock_cntl_index = INREG(CLOCK_CNTL_INDEX); - mclk_cntl = INPLL(MCLK_CNTL); - - OUTPLL(MCLK_CNTL, mclk_cntl | FORCE_GCP | FORCE_PIPE3D_CP); - - gen_reset_cntl = INREG(GEN_RESET_CNTL); - - OUTREG(GEN_RESET_CNTL, gen_reset_cntl | SOFT_RESET_GUI); - INREG(GEN_RESET_CNTL); - OUTREG(GEN_RESET_CNTL, - gen_reset_cntl & (uint32_t)(~SOFT_RESET_GUI)); - INREG(GEN_RESET_CNTL); - - OUTPLL(MCLK_CNTL, mclk_cntl); - OUTREG(CLOCK_CNTL_INDEX, clock_cntl_index); - OUTREG(GEN_RESET_CNTL, gen_reset_cntl); -} -#else - -static __inline__ void radeon_engine_flush ( void ) -{ - int i; - - /* initiate flush */ - OUTREGP(RB2D_DSTCACHE_CTLSTAT, RB2D_DC_FLUSH_ALL, - ~RB2D_DC_FLUSH_ALL); - - for (i=0; i < 2000000; i++) { - if (!(INREG(RB2D_DSTCACHE_CTLSTAT) & RB2D_DC_BUSY)) - break; - } -} - -static void _radeon_engine_idle(void); -static void _radeon_fifo_wait(unsigned); -#define radeon_engine_idle() _radeon_engine_idle() -#define radeon_fifo_wait(entries) _radeon_fifo_wait(entries) - -static void radeon_engine_reset( void ) -{ - uint32_t clock_cntl_index, mclk_cntl, rbbm_soft_reset; - - radeon_engine_flush (); - - clock_cntl_index = INREG(CLOCK_CNTL_INDEX); - mclk_cntl = INPLL(MCLK_CNTL); - - OUTPLL(MCLK_CNTL, (mclk_cntl | - FORCEON_MCLKA | - FORCEON_MCLKB | - FORCEON_YCLKA | - FORCEON_YCLKB | - FORCEON_MC | - FORCEON_AIC)); - rbbm_soft_reset = INREG(RBBM_SOFT_RESET); - - OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset | - SOFT_RESET_CP | - SOFT_RESET_HI | - SOFT_RESET_SE | - SOFT_RESET_RE | - SOFT_RESET_PP | - SOFT_RESET_E2 | - SOFT_RESET_RB | - SOFT_RESET_HDP); - INREG(RBBM_SOFT_RESET); - OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset & (uint32_t) - ~(SOFT_RESET_CP | - SOFT_RESET_HI | - SOFT_RESET_SE | - SOFT_RESET_RE | - SOFT_RESET_PP | - SOFT_RESET_E2 | - SOFT_RESET_RB | - SOFT_RESET_HDP)); - INREG(RBBM_SOFT_RESET); - - OUTPLL(MCLK_CNTL, mclk_cntl); - OUTREG(CLOCK_CNTL_INDEX, clock_cntl_index); - OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset); - - return; -} -#endif -static void radeon_engine_restore( void ) -{ -#ifndef RAGE128 - int pitch64; - uint32_t xres,yres,bpp; - radeon_fifo_wait(1); - xres = radeon_get_xres(); - yres = radeon_get_yres(); - bpp = radeon_vid_get_dbpp(); - /* turn of all automatic flushing - we'll do it all */ - OUTREG(RB2D_DSTCACHE_MODE, 0); - - pitch64 = ((xres * (bpp / 8) + 0x3f)) >> 6; - - radeon_fifo_wait(1); - OUTREG(DEFAULT_OFFSET, (INREG(DEFAULT_OFFSET) & 0xC0000000) | - (pitch64 << 22)); - - radeon_fifo_wait(1); -#if defined(WORDS_BIGENDIAN) - OUTREGP(DP_DATATYPE, - HOST_BIG_ENDIAN_EN, ~HOST_BIG_ENDIAN_EN); -#else - OUTREGP(DP_DATATYPE, 0, ~HOST_BIG_ENDIAN_EN); -#endif - - radeon_fifo_wait(1); - OUTREG(DEFAULT_SC_BOTTOM_RIGHT, (DEFAULT_SC_RIGHT_MAX - | DEFAULT_SC_BOTTOM_MAX)); - radeon_fifo_wait(1); - OUTREG(DP_GUI_MASTER_CNTL, (INREG(DP_GUI_MASTER_CNTL) - | GMC_BRUSH_SOLID_COLOR - | GMC_SRC_DATATYPE_COLOR)); - - radeon_fifo_wait(7); - OUTREG(DST_LINE_START, 0); - OUTREG(DST_LINE_END, 0); - OUTREG(DP_BRUSH_FRGD_CLR, 0xffffffff); - OUTREG(DP_BRUSH_BKGD_CLR, 0x00000000); - OUTREG(DP_SRC_FRGD_CLR, 0xffffffff); - OUTREG(DP_SRC_BKGD_CLR, 0x00000000); - OUTREG(DP_WRITE_MASK, 0xffffffff); - - radeon_engine_idle(); -#endif -} -#ifdef RAGE128 -static void _radeon_fifo_wait (unsigned entries) -{ - unsigned i; - - for(;;) - { - for (i=0; i<2000000; i++) - if ((INREG(GUI_STAT) & GUI_FIFOCNT_MASK) >= entries) - return; - radeon_engine_reset(); - radeon_engine_restore(); - } -} - -static void _radeon_engine_idle ( void ) -{ - unsigned i; - - /* ensure FIFO is empty before waiting for idle */ - radeon_fifo_wait (64); - for(;;) - { - for (i=0; i<2000000; i++) { - if ((INREG(GUI_STAT) & GUI_ACTIVE) == 0) { - radeon_engine_flush (); - return; - } - } - radeon_engine_reset(); - radeon_engine_restore(); - } -} -#else -static void _radeon_fifo_wait (unsigned entries) -{ - unsigned i; - - for(;;) - { - for (i=0; i<2000000; i++) - if ((INREG(RBBM_STATUS) & RBBM_FIFOCNT_MASK) >= entries) - return; - radeon_engine_reset(); - radeon_engine_restore(); - } -} -static void _radeon_engine_idle ( void ) -{ - int i; - - /* ensure FIFO is empty before waiting for idle */ - radeon_fifo_wait (64); - for(;;) - { - for (i=0; i<2000000; i++) { - if (((INREG(RBBM_STATUS) & RBBM_ACTIVE)) == 0) { - radeon_engine_flush (); - return; - } - } - radeon_engine_reset(); - radeon_engine_restore(); - } -} -#endif - -#ifndef RAGE128 -/* Reference color space transform data */ -typedef struct tagREF_TRANSFORM -{ - float RefLuma; - float RefRCb; - float RefRCr; - float RefGCb; - float RefGCr; - float RefBCb; - float RefBCr; -} REF_TRANSFORM; - -/* Parameters for ITU-R BT.601 and ITU-R BT.709 colour spaces */ -REF_TRANSFORM trans[2] = -{ - {1.1678, 0.0, 1.6007, -0.3929, -0.8154, 2.0232, 0.0}, /* BT.601 */ - {1.1678, 0.0, 1.7980, -0.2139, -0.5345, 2.1186, 0.0} /* BT.709 */ -}; -/**************************************************************************** - * SetTransform * - * Function: Calculates and sets color space transform from supplied * - * reference transform, gamma, brightness, contrast, hue and * - * saturation. * - * Inputs: bright - brightness * - * cont - contrast * - * sat - saturation * - * hue - hue * - * red_intensity - intense of red component * - * green_intensity - intense of green component * - * blue_intensity - intense of blue component * - * ref - index to the table of refernce transforms * - * Outputs: NONE * - ****************************************************************************/ - -static void radeon_set_transform(float bright, float cont, float sat, - float hue, float red_intensity, - float green_intensity,float blue_intensity, - unsigned ref) -{ - float OvHueSin, OvHueCos; - float CAdjLuma, CAdjOff; - float RedAdj,GreenAdj,BlueAdj; - float CAdjRCb, CAdjRCr; - float CAdjGCb, CAdjGCr; - float CAdjBCb, CAdjBCr; - float OvLuma, OvROff, OvGOff, OvBOff; - float OvRCb, OvRCr; - float OvGCb, OvGCr; - float OvBCb, OvBCr; - float Loff = 64.0; - float Coff = 512.0f; - - uint32_t dwOvLuma, dwOvROff, dwOvGOff, dwOvBOff; - uint32_t dwOvRCb, dwOvRCr; - uint32_t dwOvGCb, dwOvGCr; - uint32_t dwOvBCb, dwOvBCr; - - if (ref >= 2) return; - - OvHueSin = sin((double)hue); - OvHueCos = cos((double)hue); - - CAdjLuma = cont * trans[ref].RefLuma; - CAdjOff = cont * trans[ref].RefLuma * bright * 1023.0; - RedAdj = cont * trans[ref].RefLuma * red_intensity * 1023.0; - GreenAdj = cont * trans[ref].RefLuma * green_intensity * 1023.0; - BlueAdj = cont * trans[ref].RefLuma * blue_intensity * 1023.0; - - CAdjRCb = sat * -OvHueSin * trans[ref].RefRCr; - CAdjRCr = sat * OvHueCos * trans[ref].RefRCr; - CAdjGCb = sat * (OvHueCos * trans[ref].RefGCb - OvHueSin * trans[ref].RefGCr); - CAdjGCr = sat * (OvHueSin * trans[ref].RefGCb + OvHueCos * trans[ref].RefGCr); - CAdjBCb = sat * OvHueCos * trans[ref].RefBCb; - CAdjBCr = sat * OvHueSin * trans[ref].RefBCb; - -#if 0 /* default constants */ - CAdjLuma = 1.16455078125; - - CAdjRCb = 0.0; - CAdjRCr = 1.59619140625; - CAdjGCb = -0.39111328125; - CAdjGCr = -0.8125; - CAdjBCb = 2.01708984375; - CAdjBCr = 0; -#endif - OvLuma = CAdjLuma; - OvRCb = CAdjRCb; - OvRCr = CAdjRCr; - OvGCb = CAdjGCb; - OvGCr = CAdjGCr; - OvBCb = CAdjBCb; - OvBCr = CAdjBCr; - OvROff = RedAdj + CAdjOff - - OvLuma * Loff - (OvRCb + OvRCr) * Coff; - OvGOff = GreenAdj + CAdjOff - - OvLuma * Loff - (OvGCb + OvGCr) * Coff; - OvBOff = BlueAdj + CAdjOff - - OvLuma * Loff - (OvBCb + OvBCr) * Coff; -#if 0 /* default constants */ - OvROff = -888.5; - OvGOff = 545; - OvBOff = -1104; -#endif - - dwOvROff = ((int)(OvROff * 2.0)) & 0x1fff; - dwOvGOff = (int)(OvGOff * 2.0) & 0x1fff; - dwOvBOff = (int)(OvBOff * 2.0) & 0x1fff; - /* Whatever docs say about R200 having 3.8 format instead of 3.11 - as in Radeon is a lie */ -#if 0 - if(!IsR200) - { -#endif - dwOvLuma =(((int)(OvLuma * 2048.0))&0x7fff)<<17; - dwOvRCb = (((int)(OvRCb * 2048.0))&0x7fff)<<1; - dwOvRCr = (((int)(OvRCr * 2048.0))&0x7fff)<<17; - dwOvGCb = (((int)(OvGCb * 2048.0))&0x7fff)<<1; - dwOvGCr = (((int)(OvGCr * 2048.0))&0x7fff)<<17; - dwOvBCb = (((int)(OvBCb * 2048.0))&0x7fff)<<1; - dwOvBCr = (((int)(OvBCr * 2048.0))&0x7fff)<<17; -#if 0 - } - else - { - dwOvLuma = (((int)(OvLuma * 256.0))&0x7ff)<<20; - dwOvRCb = (((int)(OvRCb * 256.0))&0x7ff)<<4; - dwOvRCr = (((int)(OvRCr * 256.0))&0x7ff)<<20; - dwOvGCb = (((int)(OvGCb * 256.0))&0x7ff)<<4; - dwOvGCr = (((int)(OvGCr * 256.0))&0x7ff)<<20; - dwOvBCb = (((int)(OvBCb * 256.0))&0x7ff)<<4; - dwOvBCr = (((int)(OvBCr * 256.0))&0x7ff)<<20; - } -#endif - OUTREG(OV0_LIN_TRANS_A, dwOvRCb | dwOvLuma); - OUTREG(OV0_LIN_TRANS_B, dwOvROff | dwOvRCr); - OUTREG(OV0_LIN_TRANS_C, dwOvGCb | dwOvLuma); - OUTREG(OV0_LIN_TRANS_D, dwOvGOff | dwOvGCr); - OUTREG(OV0_LIN_TRANS_E, dwOvBCb | dwOvLuma); - OUTREG(OV0_LIN_TRANS_F, dwOvBOff | dwOvBCr); -} - -/* Gamma curve definition */ -typedef struct -{ - unsigned int gammaReg; - unsigned int gammaSlope; - unsigned int gammaOffset; -}GAMMA_SETTINGS; - -/* Recommended gamma curve parameters */ -GAMMA_SETTINGS r200_def_gamma[18] = -{ - {OV0_GAMMA_0_F, 0x100, 0x0000}, - {OV0_GAMMA_10_1F, 0x100, 0x0020}, - {OV0_GAMMA_20_3F, 0x100, 0x0040}, - {OV0_GAMMA_40_7F, 0x100, 0x0080}, - {OV0_GAMMA_80_BF, 0x100, 0x0100}, - {OV0_GAMMA_C0_FF, 0x100, 0x0100}, - {OV0_GAMMA_100_13F, 0x100, 0x0200}, - {OV0_GAMMA_140_17F, 0x100, 0x0200}, - {OV0_GAMMA_180_1BF, 0x100, 0x0300}, - {OV0_GAMMA_1C0_1FF, 0x100, 0x0300}, - {OV0_GAMMA_200_23F, 0x100, 0x0400}, - {OV0_GAMMA_240_27F, 0x100, 0x0400}, - {OV0_GAMMA_280_2BF, 0x100, 0x0500}, - {OV0_GAMMA_2C0_2FF, 0x100, 0x0500}, - {OV0_GAMMA_300_33F, 0x100, 0x0600}, - {OV0_GAMMA_340_37F, 0x100, 0x0600}, - {OV0_GAMMA_380_3BF, 0x100, 0x0700}, - {OV0_GAMMA_3C0_3FF, 0x100, 0x0700} -}; - -GAMMA_SETTINGS r100_def_gamma[6] = -{ - {OV0_GAMMA_0_F, 0x100, 0x0000}, - {OV0_GAMMA_10_1F, 0x100, 0x0020}, - {OV0_GAMMA_20_3F, 0x100, 0x0040}, - {OV0_GAMMA_40_7F, 0x100, 0x0080}, - {OV0_GAMMA_380_3BF, 0x100, 0x0100}, - {OV0_GAMMA_3C0_3FF, 0x100, 0x0100} -}; - -static void make_default_gamma_correction( void ) -{ - size_t i; - if((besr.chip_flags & R_100)==R_100|| - (besr.chip_flags & R_120)==R_120|| - (besr.chip_flags & R_150)==R_150){ - OUTREG(OV0_LIN_TRANS_A, 0x12A00000); - OUTREG(OV0_LIN_TRANS_B, 0x199018FE); - OUTREG(OV0_LIN_TRANS_C, 0x12A0F9B0); - OUTREG(OV0_LIN_TRANS_D, 0xF2F0043B); - OUTREG(OV0_LIN_TRANS_E, 0x12A02050); - OUTREG(OV0_LIN_TRANS_F, 0x0000174E); - for(i=0; i<6; i++){ - OUTREG(r100_def_gamma[i].gammaReg, - (r100_def_gamma[i].gammaSlope<<16) | - r100_def_gamma[i].gammaOffset); - } - } - else{ - OUTREG(OV0_LIN_TRANS_A, 0x12a20000); - OUTREG(OV0_LIN_TRANS_B, 0x198a190e); - OUTREG(OV0_LIN_TRANS_C, 0x12a2f9da); - OUTREG(OV0_LIN_TRANS_D, 0xf2fe0442); - OUTREG(OV0_LIN_TRANS_E, 0x12a22046); - OUTREG(OV0_LIN_TRANS_F, 0x175f); - /* Default Gamma, - Of 18 segments for gamma cure, all segments in R200 are programmable, - while only lower 4 and upper 2 segments are programmable in Radeon*/ - for(i=0; i<18; i++){ - OUTREG(r200_def_gamma[i].gammaReg, - (r200_def_gamma[i].gammaSlope<<16) | - r200_def_gamma[i].gammaOffset); - } - } -} -#endif - -static void radeon_vid_make_default(void) -{ -#ifdef RAGE128 - besr.saturation = 0x0F; - besr.brightness = 0; - OUTREG(OV0_COLOUR_CNTL,0x000F0F00UL); /* Default brihgtness and saturation for Rage128 */ -#else - make_default_gamma_correction(); -#endif - besr.deinterlace_pattern = 0x900AAAAA; - OUTREG(OV0_DEINTERLACE_PATTERN,besr.deinterlace_pattern); - besr.deinterlace_on=1; - besr.double_buff=1; - besr.graphics_key_msk=0; - besr.graphics_key_clr=0; - besr.ckey_cntl = VIDEO_KEY_FN_TRUE|GRAPHIC_KEY_FN_TRUE|CMP_MIX_AND; -} - - -unsigned VIDIX_NAME(vixGetVersion)( void ) { return VIDIX_VERSION; } - - -static int find_chip(unsigned chip_id) -{ - unsigned i; - for(i = 0;i < sizeof(ati_card_ids)/sizeof(ati_card_ids_t);i++) - { - if(chip_id == ati_card_ids[i].id) return i; - } - return -1; -} - -static pciinfo_t pci_info; -static int probed=0; - -vidix_capability_t def_cap = -{ -#ifdef RAGE128 - "BES driver for rage128 cards", -#else - "BES driver for radeon cards", -#endif - "Nick Kurshev", - TYPE_OUTPUT | TYPE_FX, - { 0, 0, 0, 0 }, - 2048, - 2048, - 4, - 4, - -1, - FLAG_UPSCALER | FLAG_DOWNSCALER | FLAG_EQUALIZER, - VENDOR_ATI, - 0, - { 0, 0, 0, 0} -}; - - -int VIDIX_NAME(vixProbe)( int verbose,int force ) -{ - pciinfo_t lst[MAX_PCI_DEVICES]; - unsigned i,num_pci; - int err; - __verbose = verbose; - err = pci_scan(lst,&num_pci); - if(err) - { - printf(RADEON_MSG" Error occured during pci scan: %s\n",strerror(err)); - return err; - } - else - { - err = ENXIO; - for(i=0;i<num_pci;i++) - { - if(lst[i].vendor == VENDOR_ATI) - { - int idx; - const char *dname; - idx = find_chip(lst[i].device); - if(idx == -1 && force == PROBE_NORMAL) continue; - dname = pci_device_name(VENDOR_ATI,lst[i].device); - dname = dname ? dname : "Unknown chip"; - printf(RADEON_MSG" Found chip: %s\n",dname); - memset(&besr,0,sizeof(bes_registers_t)); - if(force > PROBE_NORMAL) - { - printf(RADEON_MSG" Driver was forced. Was found %sknown chip\n",idx == -1 ? "un" : ""); - if(idx == -1) -#ifdef RAGE128 - printf(RADEON_MSG" Assuming it as Rage128\n"); -#else - printf(RADEON_MSG" Assuming it as Radeon1\n"); -#endif - besr.chip_flags=R_100|R_OVL_SHIFT; - } - if(idx != -1) besr.chip_flags=ati_card_ids[idx].flags; - def_cap.device_id = lst[i].device; - err = 0; - memcpy(&pci_info,&lst[i],sizeof(pciinfo_t)); - probed=1; - break; - } - } - } - if(err && verbose) printf(RADEON_MSG" Can't find chip\n"); - return err; -} - -#ifndef RAGE128 -enum radeon_montype -{ - MT_NONE, - MT_CRT, /* CRT-(cathode ray tube) analog monitor. (15-pin VGA connector) */ - MT_LCD, /* Liquid Crystal Display */ - MT_DFP, /* DFP-digital flat panel monitor. (24-pin DVI-I connector) */ - MT_CTV, /* Composite TV out (not in VE) */ - MT_STV /* S-Video TV out (probably in VE only) */ -}; - -typedef struct radeon_info_s -{ - int hasCRTC2; - int crtDispType; - int dviDispType; -}rinfo_t; - -static rinfo_t rinfo; - -static char * GET_MON_NAME(int type) -{ - char *pret; - switch(type) - { - case MT_NONE: pret = "no"; break; - case MT_CRT: pret = "CRT"; break; - case MT_DFP: pret = "DFP"; break; - case MT_LCD: pret = "LCD"; break; - case MT_CTV: pret = "CTV"; break; - case MT_STV: pret = "STV"; break; - default: pret = "Unknown"; - } - return pret; -} - -static void radeon_get_moninfo (rinfo_t *rinfo) -{ - unsigned int tmp; - - tmp = INREG(RADEON_BIOS_4_SCRATCH); - - if (rinfo->hasCRTC2) { - /* primary DVI port */ - if (tmp & 0x08) - rinfo->dviDispType = MT_DFP; - else if (tmp & 0x4) - rinfo->dviDispType = MT_LCD; - else if (tmp & 0x200) - rinfo->dviDispType = MT_CRT; - else if (tmp & 0x10) - rinfo->dviDispType = MT_CTV; - else if (tmp & 0x20) - rinfo->dviDispType = MT_STV; - - /* secondary CRT port */ - if (tmp & 0x2) - rinfo->crtDispType = MT_CRT; - else if (tmp & 0x800) - rinfo->crtDispType = MT_DFP; - else if (tmp & 0x400) - rinfo->crtDispType = MT_LCD; - else if (tmp & 0x1000) - rinfo->crtDispType = MT_CTV; - else if (tmp & 0x2000) - rinfo->crtDispType = MT_STV; - } else { - rinfo->dviDispType = MT_NONE; - - tmp = INREG(FP_GEN_CNTL); - - if (tmp & FP_EN_TMDS) - rinfo->crtDispType = MT_DFP; - else - rinfo->crtDispType = MT_CRT; - } -} -#endif - -typedef struct saved_regs_s -{ - uint32_t ov0_vid_key_clr; - uint32_t ov0_vid_key_msk; - uint32_t ov0_graphics_key_clr; - uint32_t ov0_graphics_key_msk; - uint32_t ov0_key_cntl; -}saved_regs_t; -static saved_regs_t savreg; - -static void save_regs( void ) -{ - radeon_fifo_wait(6); - savreg.ov0_vid_key_clr = INREG(OV0_VID_KEY_CLR); - savreg.ov0_vid_key_msk = INREG(OV0_VID_KEY_MSK); - savreg.ov0_graphics_key_clr = INREG(OV0_GRAPHICS_KEY_CLR); - savreg.ov0_graphics_key_msk = INREG(OV0_GRAPHICS_KEY_MSK); - savreg.ov0_key_cntl = INREG(OV0_KEY_CNTL); -} - -static void restore_regs( void ) -{ - radeon_fifo_wait(6); - OUTREG(OV0_VID_KEY_CLR,savreg.ov0_vid_key_clr); - OUTREG(OV0_VID_KEY_MSK,savreg.ov0_vid_key_msk); - OUTREG(OV0_GRAPHICS_KEY_CLR,savreg.ov0_graphics_key_clr); - OUTREG(OV0_GRAPHICS_KEY_MSK,savreg.ov0_graphics_key_msk); - OUTREG(OV0_KEY_CNTL,savreg.ov0_key_cntl); -} - -int VIDIX_NAME(vixInit)( const char *args ) -{ - int err; - if(!probed) - { - printf(RADEON_MSG" Driver was not probed but is being initializing\n"); - return EINTR; - } - if((radeon_mmio_base = map_phys_mem(pci_info.base2,0xFFFF))==(void *)-1) return ENOMEM; - radeon_ram_size = INREG(CONFIG_MEMSIZE); - /* mem size is bits [28:0], mask off the rest. Range: from 1Mb up to 512 Mb */ - radeon_ram_size &= CONFIG_MEMSIZE_MASK; -#ifdef RADEON - /* according to XFree86 4.2.0, some production M6's return 0 for 8MB */ - if (radeon_ram_size == 0 && - (def_cap.device_id == DEVICE_ATI_RADEON_MOBILITY_M6 || - def_cap.device_id == DEVICE_ATI_RADEON_MOBILITY_M62)) - { - printf(RADEON_MSG" Workarounding buggy Radeon Mobility M6 (0 vs. 8MB ram)\n"); - radeon_ram_size = 8192*1024; - } -#else - /* Rage Mobility (rage128) also has memsize bug */ - if (radeon_ram_size == 0 && - (def_cap.device_id == DEVICE_ATI_RAGE_MOBILITY_M3 || - def_cap.device_id == DEVICE_ATI_RAGE_MOBILITY_M32)) - { - printf(RADEON_MSG" Workarounding buggy Rage Mobility M3 (0 vs. 8MB ram)\n"); - radeon_ram_size = 8192*1024; - } -#endif - if((radeon_mem_base = map_phys_mem(pci_info.base0,radeon_ram_size))==(void *)-1) return ENOMEM; - radeon_vid_make_default(); - printf(RADEON_MSG" Video memory = %uMb\n",radeon_ram_size/0x100000); - err = mtrr_set_type(pci_info.base0,radeon_ram_size,MTRR_TYPE_WRCOMB); - if(!err) printf(RADEON_MSG" Set write-combining type of video memory\n"); -#ifndef RAGE128 - { - memset(&rinfo,0,sizeof(rinfo_t)); - if((besr.chip_flags&R_100) != R_100) rinfo.hasCRTC2 = 1; - - radeon_get_moninfo(&rinfo); - if(rinfo.hasCRTC2) { - printf(RADEON_MSG" DVI port has %s monitor connected\n",GET_MON_NAME(rinfo.dviDispType)); - printf(RADEON_MSG" CRT port has %s monitor connected\n",GET_MON_NAME(rinfo.crtDispType)); - } - else - printf(RADEON_MSG" CRT port has %s monitor connected\n",GET_MON_NAME(rinfo.crtDispType)); - } -#endif -#ifdef RADEON_ENABLE_BM - if(bm_open() == 0) - { - if((dma_phys_addrs = malloc(radeon_ram_size*sizeof(unsigned long)/4096)) != 0) - def_cap.flags |= FLAG_DMA | FLAG_EQ_DMA; - else - printf(RADEON_MSG" Can't allocate temopary buffer for DMA\n"); - } - else - if(__verbose) printf(RADEON_MSG" Can't initialize busmastering: %s\n",strerror(errno)); -#endif - save_regs(); - return 0; -} - -void VIDIX_NAME(vixDestroy)( void ) -{ - restore_regs(); - unmap_phys_mem(radeon_mem_base,radeon_ram_size); - unmap_phys_mem(radeon_mmio_base,0xFFFF); - bm_close(); -} - -int VIDIX_NAME(vixGetCapability)(vidix_capability_t *to) -{ - memcpy(to,&def_cap,sizeof(vidix_capability_t)); - return 0; -} - -/* - Full list of fourcc which are supported by Win2K radeon driver: - YUY2, UYVY, DDES, OGLT, OGL2, OGLS, OGLB, OGNT, OGNZ, OGNS, - IF09, YVU9, IMC4, M2IA, IYUV, VBID, DXT1, DXT2, DXT3, DXT4, DXT5 -*/ -typedef struct fourcc_desc_s -{ - uint32_t fourcc; - unsigned max_srcw; -}fourcc_desc_t; - -fourcc_desc_t supported_fourcc[] = -{ - { IMGFMT_Y800, 1567 }, - { IMGFMT_YVU9, 1567 }, - { IMGFMT_IF09, 1567 }, - { IMGFMT_YV12, 1567 }, - { IMGFMT_I420, 1567 }, - { IMGFMT_IYUV, 1567 }, - { IMGFMT_UYVY, 1551 }, - { IMGFMT_YUY2, 1551 }, - { IMGFMT_YVYU, 1551 }, - { IMGFMT_RGB15, 1551 }, - { IMGFMT_BGR15, 1551 }, - { IMGFMT_RGB16, 1551 }, - { IMGFMT_BGR16, 1551 }, - { IMGFMT_RGB32, 775 }, - { IMGFMT_BGR32, 775 } -}; - -__inline__ static int is_supported_fourcc(uint32_t fourcc,unsigned srcw) -{ - unsigned i; - for(i=0;i<sizeof(supported_fourcc)/sizeof(fourcc_desc_t);i++) - { - if(fourcc==supported_fourcc[i].fourcc && - srcw <=supported_fourcc[i].max_srcw) return 1; - } - return 0; -} - -int VIDIX_NAME(vixQueryFourcc)(vidix_fourcc_t *to) -{ - if(is_supported_fourcc(to->fourcc,to->srcw)) - { - to->depth = VID_DEPTH_1BPP | VID_DEPTH_2BPP | - VID_DEPTH_4BPP | VID_DEPTH_8BPP | - VID_DEPTH_12BPP| VID_DEPTH_15BPP| - VID_DEPTH_16BPP| VID_DEPTH_24BPP| - VID_DEPTH_32BPP; - to->flags = VID_CAP_EXPAND | VID_CAP_SHRINK | VID_CAP_COLORKEY; - return 0; - } - else to->depth = to->flags = 0; - return ENOSYS; -} - -static double H_scale_ratio; -static void radeon_vid_dump_regs( void ) -{ - size_t i; - printf(RADEON_MSG"*** Begin of DRIVER variables dump ***\n"); - printf(RADEON_MSG"radeon_mmio_base=%p\n",radeon_mmio_base); - printf(RADEON_MSG"radeon_mem_base=%p\n",radeon_mem_base); - printf(RADEON_MSG"radeon_overlay_off=%08X\n",radeon_overlay_off); - printf(RADEON_MSG"radeon_ram_size=%08X\n",radeon_ram_size); - printf(RADEON_MSG"video mode: %ux%u@%u\n",radeon_get_xres(),radeon_get_yres(),radeon_vid_get_dbpp()); - printf(RADEON_MSG"H_scale_ratio=%8.2f\n",H_scale_ratio); - printf(RADEON_MSG"*** Begin of OV0 registers dump ***\n"); - for(i=0;i<sizeof(vregs)/sizeof(video_registers_t);i++) - printf(RADEON_MSG"%s = %08X\n",vregs[i].sname,INREG(vregs[i].name)); - printf(RADEON_MSG"*** End of OV0 registers dump ***\n"); -} - -static void radeon_vid_stop_video( void ) -{ - radeon_engine_idle(); - OUTREG(OV0_SCALE_CNTL, SCALER_SOFT_RESET); - OUTREG(OV0_EXCLUSIVE_HORZ, 0); - OUTREG(OV0_AUTO_FLIP_CNTL, 0); /* maybe */ - OUTREG(OV0_FILTER_CNTL, FILTER_HARDCODED_COEF); -#ifdef RAGE128 - OUTREG(OV0_KEY_CNTL, GRAPHIC_KEY_FN_NE); -#else - OUTREG(OV0_KEY_CNTL, GRAPHIC_KEY_FN_EQ); -#endif - OUTREG(OV0_TEST, 0); -} - -static void radeon_vid_display_video( void ) -{ - int bes_flags; - radeon_fifo_wait(2); - OUTREG(OV0_REG_LOAD_CNTL, REG_LD_CTL_LOCK); - radeon_engine_idle(); - while(!(INREG(OV0_REG_LOAD_CNTL)®_LD_CTL_LOCK_READBACK)); - radeon_fifo_wait(15); - - /* Shutdown capturing */ - OUTREG(FCP_CNTL, FCP_CNTL__GND); - OUTREG(CAP0_TRIG_CNTL, 0); - - OUTREG(VID_BUFFER_CONTROL, (1<<16) | 0x01); - OUTREG(DISP_TEST_DEBUG_CNTL, 0); - - OUTREG(OV0_AUTO_FLIP_CNTL,OV0_AUTO_FLIP_CNTL_SOFT_BUF_ODD); - - if(besr.deinterlace_on) OUTREG(OV0_DEINTERLACE_PATTERN,besr.deinterlace_pattern); -#ifdef RAGE128 - OUTREG(OV0_COLOUR_CNTL, (besr.brightness & 0x7f) | - (besr.saturation << 8) | - (besr.saturation << 16)); -#endif - radeon_fifo_wait(2); - OUTREG(OV0_GRAPHICS_KEY_MSK, besr.graphics_key_msk); - OUTREG(OV0_GRAPHICS_KEY_CLR, besr.graphics_key_clr); - OUTREG(OV0_KEY_CNTL,besr.ckey_cntl); - - OUTREG(OV0_H_INC, besr.h_inc); - OUTREG(OV0_STEP_BY, besr.step_by); - OUTREG(OV0_Y_X_START, besr.y_x_start); - OUTREG(OV0_Y_X_END, besr.y_x_end); - OUTREG(OV0_V_INC, besr.v_inc); - OUTREG(OV0_P1_BLANK_LINES_AT_TOP, besr.p1_blank_lines_at_top); - OUTREG(OV0_P23_BLANK_LINES_AT_TOP, besr.p23_blank_lines_at_top); - OUTREG(OV0_VID_BUF_PITCH0_VALUE, besr.vid_buf_pitch0_value); - OUTREG(OV0_VID_BUF_PITCH1_VALUE, besr.vid_buf_pitch1_value); - OUTREG(OV0_P1_X_START_END, besr.p1_x_start_end); - OUTREG(OV0_P2_X_START_END, besr.p2_x_start_end); - OUTREG(OV0_P3_X_START_END, besr.p3_x_start_end); -#ifdef RADEON - OUTREG(OV0_BASE_ADDR, besr.base_addr); -#endif - OUTREG(OV0_VID_BUF0_BASE_ADRS, besr.vid_buf_base_adrs_y[0]); - OUTREG(OV0_VID_BUF1_BASE_ADRS, besr.vid_buf_base_adrs_v[0]); - OUTREG(OV0_VID_BUF2_BASE_ADRS, besr.vid_buf_base_adrs_u[0]); - radeon_fifo_wait(9); - OUTREG(OV0_VID_BUF3_BASE_ADRS, besr.vid_buf_base_adrs_y[0]); - OUTREG(OV0_VID_BUF4_BASE_ADRS, besr.vid_buf_base_adrs_v[0]); - OUTREG(OV0_VID_BUF5_BASE_ADRS, besr.vid_buf_base_adrs_u[0]); - OUTREG(OV0_P1_V_ACCUM_INIT, besr.p1_v_accum_init); - OUTREG(OV0_P1_H_ACCUM_INIT, besr.p1_h_accum_init); - OUTREG(OV0_P23_H_ACCUM_INIT, besr.p23_h_accum_init); - OUTREG(OV0_P23_V_ACCUM_INIT, besr.p23_v_accum_init); - - bes_flags = SCALER_ENABLE | - SCALER_SMART_SWITCH | - SCALER_Y2R_TEMP | - SCALER_PIX_EXPAND; - if(besr.double_buff) bes_flags |= SCALER_DOUBLE_BUFFER; - if(besr.deinterlace_on) bes_flags |= SCALER_ADAPTIVE_DEINT; - if(besr.horz_pick_nearest) bes_flags |= SCALER_HORZ_PICK_NEAREST; - if(besr.vert_pick_nearest) bes_flags |= SCALER_VERT_PICK_NEAREST; -#ifdef RAGE128 - bes_flags |= SCALER_BURST_PER_PLANE; -#endif - bes_flags |= (besr.surf_id << 8) & SCALER_SURFAC_FORMAT; - if(besr.load_prg_start) bes_flags |= SCALER_PRG_LOAD_START; - OUTREG(OV0_SCALE_CNTL, bes_flags); -#ifndef RAGE128 - if(rinfo.hasCRTC2 && - (rinfo.dviDispType == MT_CTV || rinfo.dviDispType == MT_STV)) - { - /* TODO: suppress scaler output to CRTC here and enable TVO only */ - } -#endif - radeon_fifo_wait(6); - OUTREG(OV0_FILTER_CNTL,besr.filter_cntl); - OUTREG(OV0_FOUR_TAP_COEF_0,besr.four_tap_coeff[0]); - OUTREG(OV0_FOUR_TAP_COEF_1,besr.four_tap_coeff[1]); - OUTREG(OV0_FOUR_TAP_COEF_2,besr.four_tap_coeff[2]); - OUTREG(OV0_FOUR_TAP_COEF_3,besr.four_tap_coeff[3]); - OUTREG(OV0_FOUR_TAP_COEF_4,besr.four_tap_coeff[4]); - if(besr.swap_uv) OUTREG(OV0_TEST,INREG(OV0_TEST)|OV0_SWAP_UV); - OUTREG(OV0_REG_LOAD_CNTL, 0); - if(__verbose > VERBOSE_LEVEL) printf(RADEON_MSG"we wanted: scaler=%08X\n",bes_flags); - if(__verbose > VERBOSE_LEVEL) radeon_vid_dump_regs(); -} - -/* Goal of this function: hide RGB background and provide black screen around movie. - Useful in '-vo fbdev:vidix -fs -zoom' mode. - Reverse effect to colorkey */ -#ifdef RAGE128 -static void radeon_vid_exclusive( void ) -{ -/* this function works only with Rage128. - Radeon should has something the same */ - unsigned screenw,screenh; - screenw = radeon_get_xres(); - screenh = radeon_get_yres(); - radeon_fifo_wait(2); - OUTREG(OV0_EXCLUSIVE_VERT,(((screenh-1)<<16)&EXCL_VERT_END_MASK)); - OUTREG(OV0_EXCLUSIVE_HORZ,(((screenw/8+1)<<8)&EXCL_HORZ_END_MASK)|EXCL_HORZ_EXCLUSIVE_EN); -} - -static void radeon_vid_non_exclusive( void ) -{ - OUTREG(OV0_EXCLUSIVE_HORZ,0); -} -#endif - -static unsigned radeon_query_pitch(unsigned fourcc,const vidix_yuv_t *spitch) -{ - unsigned pitch,spy,spv,spu; - spy = spv = spu = 0; - switch(spitch->y) - { - case 16: - case 32: - case 64: - case 128: - case 256: spy = spitch->y; break; - default: break; - } - switch(spitch->u) - { - case 16: - case 32: - case 64: - case 128: - case 256: spu = spitch->u; break; - default: break; - } - switch(spitch->v) - { - case 16: - case 32: - case 64: - case 128: - case 256: spv = spitch->v; break; - default: break; - } - switch(fourcc) - { - /* 4:2:0 */ - case IMGFMT_IYUV: - case IMGFMT_YV12: - case IMGFMT_I420: - if(spy > 16 && spu == spy/2 && spv == spy/2) pitch = spy; - else pitch = 32; - break; - case IMGFMT_IF09: - case IMGFMT_YVU9: - if(spy >= 64 && spu == spy/4 && spv == spy/4) pitch = spy; - else pitch = 64; - break; - default: - if(spy >= 16) pitch = spy; - else pitch = 16; - break; - } - return pitch; -} - -static void Calc_H_INC_STEP_BY ( - int fieldvalue_OV0_SURFACE_FORMAT, - double H_scale_ratio, - int DisallowFourTapVertFiltering, - int DisallowFourTapUVVertFiltering, - uint32_t *val_OV0_P1_H_INC, - uint32_t *val_OV0_P1_H_STEP_BY, - uint32_t *val_OV0_P23_H_INC, - uint32_t *val_OV0_P23_H_STEP_BY, - int *P1GroupSize, - int *P1StepSize, - int *P23StepSize ) -{ - - double ClocksNeededFor16Pixels; - - switch (fieldvalue_OV0_SURFACE_FORMAT) - { - case 3: - case 4: /*16BPP (ARGB1555 and RGB565) */ - /* All colour components are fetched in pairs */ - *P1GroupSize = 2; - /* We don't support four tap in this mode because G's are split between two bytes. In theory we could support it if */ - /* we saved part of the G when fetching the R, and then filter the G, followed by the B in the following cycles. */ - if (H_scale_ratio>=.5) - { - /* We are actually generating two pixels (but 3 colour components) per tick. Thus we don't have to skip */ - /* until we reach .5. P1 and P23 are the same. */ - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 1; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 1; - *P1StepSize = 1; - *P23StepSize = 1; - } - else if (H_scale_ratio>=.25) - { - /* Step by two */ - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*2)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 2; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*2)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 2; - *P1StepSize = 2; - *P23StepSize = 2; - } - else if (H_scale_ratio>=.125) - { - /* Step by four */ - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 3; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 3; - *P1StepSize = 4; - *P23StepSize = 4; - } - else if (H_scale_ratio>=.0625) - { - /* Step by eight */ - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*8)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 4; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*8)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 4; - *P1StepSize = 8; - *P23StepSize = 8; - } - else if (H_scale_ratio>=0.03125) - { - /* Step by sixteen */ - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 5; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 5; - *P1StepSize = 16; - *P23StepSize = 16; - } - else - { - H_scale_ratio=0.03125; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 5; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 5; - *P1StepSize = 16; - *P23StepSize = 16; - } - break; - case 6: /*32BPP RGB */ - if (H_scale_ratio>=1.5 && !DisallowFourTapVertFiltering) - { - /* All colour components are fetched in pairs */ - *P1GroupSize = 2; - /* With four tap filtering, we can generate two colour components every clock, or two pixels every three */ - /* clocks. This means that we will have four tap filtering when scaling 1.5 or more. */ - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 0; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 0; - *P1StepSize = 1; - *P23StepSize = 1; - } - else if (H_scale_ratio>=0.75) - { - /* Four G colour components are fetched at once */ - *P1GroupSize = 4; - /* R and B colour components are fetched in pairs */ - /* With two tap filtering, we can generate four colour components every clock. */ - /* This means that we will have two tap filtering when scaling 1.0 or more. */ - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 1; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 1; - *P1StepSize = 1; - *P23StepSize = 1; - } - else if (H_scale_ratio>=0.375) - { - /* Step by two. */ - /* Four G colour components are fetched at once */ - *P1GroupSize = 4; - /* R and B colour components are fetched in pairs */ - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*2)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 2; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*2)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 2; - *P1StepSize = 2; - *P23StepSize = 2; - } - else if (H_scale_ratio>=0.25) - { - /* Step by two. */ - /* Four G colour components are fetched at once */ - *P1GroupSize = 4; - /* R and B colour components are fetched in pairs */ - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*2)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 2; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 3; - *P1StepSize = 2; - *P23StepSize = 4; - } - else if (H_scale_ratio>=0.1875) - { - /* Step by four */ - /* Four G colour components are fetched at once */ - *P1GroupSize = 4; - /* R and B colour components are fetched in pairs */ - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 3; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 3; - *P1StepSize = 4; - *P23StepSize = 4; - } - else if (H_scale_ratio>=0.125) - { - /* Step by four */ - /* Four G colour components are fetched at once */ - *P1GroupSize = 4; - /* R and B colour components are fetched in pairs */ - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 3; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*8)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 4; - *P1StepSize = 4; - *P23StepSize = 8; - } - else if (H_scale_ratio>=0.09375) - { - /* Step by eight */ - /* Four G colour components are fetched at once */ - *P1GroupSize = 4; - /* R and B colour components are fetched in pairs */ - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*8)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 4; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*8)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 4; - *P1StepSize = 8; - *P23StepSize = 8; - } - else if (H_scale_ratio>=0.0625) - { - /* Step by eight */ - /* Four G colour components are fetched at once */ - *P1GroupSize = 4; - /* R and B colour components are fetched in pairs */ - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 5; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 5; - *P1StepSize = 16; - *P23StepSize = 16; - } - else - { - H_scale_ratio=0.0625; - *P1GroupSize = 4; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 5; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 5; - *P1StepSize = 16; - *P23StepSize = 16; - } - break; - case 9: - /*ToDo_Active: In mode 9 there is a possibility that HScale ratio may be set to an illegal value, so we have extra conditions in the if statement. For consistancy, these conditions be added to the other modes as well. */ - /* four tap on both (unless Y is too wide) */ - if ((H_scale_ratio>=(ClocksNeededFor16Pixels=8+2+2) / 16.0) && - ((uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5)<=0x3000) && - ((uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5)<=0x2000) && - !DisallowFourTapVertFiltering && !DisallowFourTapUVVertFiltering) - { /*0.75 */ - /* Colour components are fetched in pairs */ - *P1GroupSize = 2; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 0; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 0; - *P1StepSize = 1; - *P23StepSize = 1; - } - /* two tap on Y (because it is too big for four tap), four tap on UV */ - else if ((H_scale_ratio>=(ClocksNeededFor16Pixels=4+2+2) / 16.0) && - ((uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5)<=0x3000) && - ((uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5)<=0x2000) && - DisallowFourTapVertFiltering && !DisallowFourTapUVVertFiltering) - { /*0.75 */ - *P1GroupSize = 4; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 1; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 0; - *P1StepSize = 1; - *P23StepSize = 1; - } - /* We scale the Y with the four tap filters, but UV's are generated - with dual two tap configuration. */ - else if ((H_scale_ratio>=(ClocksNeededFor16Pixels=8+1+1) / 16.0) && - ((uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5)<=0x3000) && - ((uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5)<=0x2000) && - !DisallowFourTapVertFiltering) - { /*0.625 */ - *P1GroupSize = 2; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 0; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 1; - *P1StepSize = 1; - *P23StepSize = 1; - } - /* We scale the Y, U, and V with the two tap filters */ - else if ((H_scale_ratio>=(ClocksNeededFor16Pixels=4+1+1) / 16.0) && - ((uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5)<=0x3000) && - ((uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5)<=0x2000)) - { /*0.375 */ - *P1GroupSize = 4; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 1; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 1; - *P1StepSize = 1; - *P23StepSize = 1; - } - /* We scale step the U and V by two to allow more bandwidth for fetching Y's, - thus we won't drop Y's yet. */ - else if ((H_scale_ratio>=(ClocksNeededFor16Pixels=4+.5+.5) / 16.0) && - ((uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5)<=0x3000) && - ((uint16_t)((1/(H_scale_ratio*4*2)) * (1<<0xc) + 0.5)<=0x2000)) - { /*>=0.3125 and >.333333~ */ - *P1GroupSize = 4; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 1; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*4*2)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 2; - *P1StepSize = 1; - *P23StepSize = 2; - } - /* We step the Y, U, and V by two. */ - else if ((H_scale_ratio>=(ClocksNeededFor16Pixels=2+.5+.5) / 16.0) && - ((uint16_t)((1/(H_scale_ratio*2)) * (1<<0xc) + 0.5)<=0x3000) && - ((uint16_t)((1/(H_scale_ratio*4*2)) * (1<<0xc) + 0.5)<=0x2000)) - { - *P1GroupSize = 4; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*2)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 2; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*4*2)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 2; - *P1StepSize = 2; - *P23StepSize = 2; - } - /* We step the Y by two and the U and V by four. */ - else if ((H_scale_ratio>=(ClocksNeededFor16Pixels=2+.25+.25) / 16.0) && - ((uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5)<=0x3000) && - ((uint16_t)((1/(H_scale_ratio*4*4)) * (1<<0xc) + 0.5)<=0x2000)) - { - *P1GroupSize = 4; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*2)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 2; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*4*4)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 3; - *P1StepSize = 2; - *P23StepSize = 4; - } - /* We step the Y, U, and V by four. */ - else if ((H_scale_ratio>=(ClocksNeededFor16Pixels=1+.25+.25) / 16.0) && - ((uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5)<=0x3000) && - ((uint16_t)((1/(H_scale_ratio*4*4)) * (1<<0xc) + 0.5)<=0x2000)) - { - *P1GroupSize = 4; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 3; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*4*4)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 3; - *P1StepSize = 4; - *P23StepSize = 4; - } - /* We would like to step the Y by four and the U and V by eight, but we can't mix step by 3 and step by 4 for packed modes */ - - /* We step the Y, U, and V by eight. */ - else if ((H_scale_ratio>=(ClocksNeededFor16Pixels=.5+.125+.125) / 16.0) && - ((uint16_t)((1/(H_scale_ratio*8)) * (1<<0xc) + 0.5)<=0x3000) && - ((uint16_t)((1/(H_scale_ratio*4*8)) * (1<<0xc) + 0.5)<=0x2000)) - { - *P1GroupSize = 4; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*8)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 4; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*4*8)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 4; - *P1StepSize = 8; - *P23StepSize = 8; - } - /* We step the Y by eight and the U and V by sixteen. */ - else if ((H_scale_ratio>=(ClocksNeededFor16Pixels=.5+.0625+.0625) / 16.0) && - ((uint16_t)((1/(H_scale_ratio*8)) * (1<<0xc) + 0.5)<=0x3000) && - ((uint16_t)((1/(H_scale_ratio*4*16)) * (1<<0xc) + 0.5)<=0x2000)) - { - *P1GroupSize = 4; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*8)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 4; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*4*16)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 5; - *P1StepSize = 8; - *P23StepSize = 16; - } - /* We step the Y, U, and V by sixteen. */ - else if ((H_scale_ratio>=(ClocksNeededFor16Pixels=.25+.0625+.0625) / 16.0) && - ((uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5)<=0x3000) && - ((uint16_t)((1/(H_scale_ratio*4*16)) * (1<<0xc) + 0.5)<=0x2000)) - { - *P1GroupSize = 4; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 5; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*4*16)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 5; - *P1StepSize = 16; - *P23StepSize = 16; - } - else - { - H_scale_ratio=(ClocksNeededFor16Pixels=.25+.0625+.0625) / 16; - *P1GroupSize = 4; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 5; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*4*16)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 5; - *P1StepSize = 16; - *P23StepSize = 16; - } - break; - case 10: - case 11: - case 12: - case 13: - case 14: /* YUV12, VYUY422, YUYV422, YOverPkCRCB12, YWovenWithPkCRCB12 */ - /* We scale the Y, U, and V with the four tap filters */ - /* four tap on both (unless Y is too wide) */ - if ((H_scale_ratio>=(ClocksNeededFor16Pixels=8+4+4) / 16.0) && - !DisallowFourTapVertFiltering && !DisallowFourTapUVVertFiltering) - { /*0.75 */ - *P1GroupSize = 2; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 0; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*2)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 0; - *P1StepSize = 1; - *P23StepSize = 1; - } - /* two tap on Y (because it is too big for four tap), four tap on UV */ - else if ((H_scale_ratio>=(ClocksNeededFor16Pixels=4+4+4) / 16.0) && - DisallowFourTapVertFiltering && !DisallowFourTapUVVertFiltering) - { /*0.75 */ - *P1GroupSize = 4; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 1; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*2)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 0; - *P1StepSize = 1; - *P23StepSize = 1; - } - /* We scale the Y with the four tap filters, but UV's are generated - with dual two tap configuration. */ - else if ((H_scale_ratio>=(ClocksNeededFor16Pixels=8+2+2) / 16.0) && - !DisallowFourTapVertFiltering) - { /*0.625 */ - *P1GroupSize = 2; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 0; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*2)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 1; - *P1StepSize = 1; - *P23StepSize = 1; - } - /* We scale the Y, U, and V with the two tap filters */ - else if (H_scale_ratio>=(ClocksNeededFor16Pixels=4+2+2) / 16.0) - { /*0.375 */ - *P1GroupSize = 4; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 1; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*2)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 1; - *P1StepSize = 1; - *P23StepSize = 1; - } - /* We scale step the U and V by two to allow more bandwidth for - fetching Y's, thus we won't drop Y's yet. */ - else if (H_scale_ratio>=(ClocksNeededFor16Pixels=4+1+1) / 16.0) - { /*0.312 */ - *P1GroupSize = 4; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 1; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*2*2)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 2; - *P1StepSize = 1; - *P23StepSize = 2; - } - /* We step the Y, U, and V by two. */ - else if (H_scale_ratio>=(ClocksNeededFor16Pixels=2+1+1) / 16.0) - { - *P1GroupSize = 4; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*2)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 2; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*2*2)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 2; - *P1StepSize = 2; - *P23StepSize = 2; - } - /* We step the Y by two and the U and V by four. */ - else if (H_scale_ratio>=(ClocksNeededFor16Pixels=2+.5+.5) / 16.0) - { - *P1GroupSize = 4; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*2)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 2; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*2*4)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 3; - *P1StepSize = 2; - *P23StepSize = 4; - } - /* We step the Y, U, and V by four. */ - else if (H_scale_ratio>=(ClocksNeededFor16Pixels=1+.5+.5) / 16.0) - { - *P1GroupSize = 4; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 3; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*2*4)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 3; - *P1StepSize = 4; - *P23StepSize = 4; - } - /* We step the Y by four and the U and V by eight. */ - else if ((H_scale_ratio>=(ClocksNeededFor16Pixels=1+.25+.25) / 16.0) && - (fieldvalue_OV0_SURFACE_FORMAT==10)) - { - *P1GroupSize = 4; - /* Can't mix step by 3 and step by 4 for packed modes */ - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*4)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 3; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*2*8)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 4; - *P1StepSize = 4; - *P23StepSize = 8; - } - /* We step the Y, U, and V by eight. */ - else if (H_scale_ratio>=(ClocksNeededFor16Pixels=.5+.25+.25) / 16.0) - { - *P1GroupSize = 4; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*8)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 4; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*2*8)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 4; - *P1StepSize = 8; - *P23StepSize = 8; - } - /* We step the Y by eight and the U and V by sixteen. */ - else if ((H_scale_ratio>=(ClocksNeededFor16Pixels=.5+.125+.125) / 16.0) && (fieldvalue_OV0_SURFACE_FORMAT==10)) - { - *P1GroupSize = 4; - /* Step by 5 not supported for packed modes */ - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*8)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 4; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*2*16)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 5; - *P1StepSize = 8; - *P23StepSize = 16; - } - /* We step the Y, U, and V by sixteen. */ - else if ((H_scale_ratio>=(ClocksNeededFor16Pixels=.25+.125+.125) / 16.0) && - (fieldvalue_OV0_SURFACE_FORMAT==10)) - { - *P1GroupSize = 4; - /* Step by 5 not supported for packed modes */ - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 5; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*2*16)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 5; - *P1StepSize = 16; - *P23StepSize = 16; - } - else - { - if (fieldvalue_OV0_SURFACE_FORMAT==10) - { - H_scale_ratio=(ClocksNeededFor16Pixels=.25+.125+.125) / 16; - *P1GroupSize = 4; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*16)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 5; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*2*16)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 5; - *P1StepSize = 16; - *P23StepSize = 16; - } - else - { - H_scale_ratio=(ClocksNeededFor16Pixels=.5+.25+.25) / 16; - *P1GroupSize = 4; - *val_OV0_P1_H_INC = (uint16_t)((1/(H_scale_ratio*8)) * (1<<0xc) + 0.5); - *val_OV0_P1_H_STEP_BY = 4; - *val_OV0_P23_H_INC = (uint16_t)((1/(H_scale_ratio*2*8)) * (1<<0xc) + 0.5); - *val_OV0_P23_H_STEP_BY = 4; - *P1StepSize = 8; - *P23StepSize = 8; - } - } - break; - default: break; - - } - besr.h_inc = (*(val_OV0_P1_H_INC)&0x3fff) | ((*(val_OV0_P23_H_INC)&0x3fff)<<16); - besr.step_by = (*(val_OV0_P1_H_STEP_BY)&0x7) | ((*(val_OV0_P23_H_STEP_BY)&0x7)<<8); -} - -/* ********************************************************* */ -/* ** Setup Black Bordering */ -/* ********************************************************* */ - -static void ComputeBorders( vidix_playback_t *config, int VertUVSubSample ) -{ - double tempBLANK_LINES_AT_TOP; - unsigned TopLine,BottomLine,SourceLinesUsed,TopUVLine,BottomUVLine,SourceUVLinesUsed; - uint32_t val_OV0_P1_ACTIVE_LINES_M1,val_OV0_P1_BLNK_LN_AT_TOP_M1; - uint32_t val_OV0_P23_ACTIVE_LINES_M1,val_OV0_P23_BLNK_LN_AT_TOP_M1; - - if (floor(config->src.y)<0) { - tempBLANK_LINES_AT_TOP = -floor(config->src.y); - TopLine = 0; - } - else { - tempBLANK_LINES_AT_TOP = 0; - TopLine = (int)floor(config->src.y); - } - /* Round rSrcBottom up and subtract one */ - if (ceil(config->src.y+config->src.h) > config->src.h) - { - BottomLine = config->src.h - 1; - } - else - { - BottomLine = (int)ceil(config->src.y+config->src.h) - 1; - } - - if (BottomLine >= TopLine) - { - SourceLinesUsed = BottomLine - TopLine + 1; - } - else - { - /*CYCACC_ASSERT(0, "SourceLinesUsed less than or equal to zero.") */ - SourceLinesUsed = 1; - } - - { - int SourceHeightInPixels; - SourceHeightInPixels = BottomLine - TopLine + 1; - } - - val_OV0_P1_ACTIVE_LINES_M1 = SourceLinesUsed - 1; - val_OV0_P1_BLNK_LN_AT_TOP_M1 = ((int)tempBLANK_LINES_AT_TOP-1) & 0xfff; - - TopUVLine = ((int)(config->src.y/VertUVSubSample) < 0) ? 0: (int)(config->src.y/VertUVSubSample); /* Round rSrcTop down */ - BottomUVLine = (ceil(((config->src.y+config->src.h)/VertUVSubSample)) > (config->src.h/VertUVSubSample)) - ? (config->src.h/VertUVSubSample)-1 : (u_int)ceil(((config->src.y+config->src.h)/VertUVSubSample))-1; - - if (BottomUVLine >= TopUVLine) - { - SourceUVLinesUsed = BottomUVLine - TopUVLine + 1; - } - else - { - /*CYCACC_ASSERT(0, "SourceUVLinesUsed less than or equal to zero.") */ - SourceUVLinesUsed = 1; - } - val_OV0_P23_ACTIVE_LINES_M1 = SourceUVLinesUsed - 1; - val_OV0_P23_BLNK_LN_AT_TOP_M1 = ((int)(tempBLANK_LINES_AT_TOP/VertUVSubSample)-1) & 0x7ff; - besr.p1_blank_lines_at_top = (val_OV0_P1_BLNK_LN_AT_TOP_M1 & 0xfff) | - ((val_OV0_P1_ACTIVE_LINES_M1 & 0xfff) << 16); - besr.p23_blank_lines_at_top = (val_OV0_P23_BLNK_LN_AT_TOP_M1 & 0x7ff) | - ((val_OV0_P23_ACTIVE_LINES_M1 & 0x7ff) << 16); -} - - -static void ComputeXStartEnd( - int is_400, - uint32_t LeftPixel,uint32_t LeftUVPixel, - uint32_t MemWordsInBytes,uint32_t BytesPerPixel, - uint32_t SourceWidthInPixels, uint32_t P1StepSize, - uint32_t BytesPerUVPixel,uint32_t SourceUVWidthInPixels, - uint32_t P23StepSize, uint32_t *p1_x_start, uint32_t *p2_x_start ) -{ - uint32_t val_OV0_P1_X_START,val_OV0_P2_X_START,val_OV0_P3_X_START; - uint32_t val_OV0_P1_X_END,val_OV0_P2_X_END,val_OV0_P3_X_END; - /* ToDo_Active: At the moment we are not using iOV0_VID_BUF?_START_PIX, but instead // are using iOV0_P?_X_START and iOV0_P?_X_END. We should use "start pix" and // "width" to derive the start and end. */ - - val_OV0_P1_X_START = (int)LeftPixel % (MemWordsInBytes/BytesPerPixel); - val_OV0_P1_X_END = (int)((val_OV0_P1_X_START + SourceWidthInPixels - 1) / P1StepSize) * P1StepSize; - - val_OV0_P2_X_START = val_OV0_P2_X_END = 0; - switch (besr.surf_id) - { - case 9: - case 10: - case 13: - case 14: /* ToDo_Active: The driver must insure that the initial value is */ - /* a multiple of a power of two when decimating */ - val_OV0_P2_X_START = (int)LeftUVPixel % - (MemWordsInBytes/BytesPerUVPixel); - val_OV0_P2_X_END = (int)((val_OV0_P2_X_START + - SourceUVWidthInPixels - 1) / P23StepSize) * P23StepSize; - break; - case 11: - case 12: val_OV0_P2_X_START = (int)LeftUVPixel % (MemWordsInBytes/(BytesPerPixel*2)); - val_OV0_P2_X_END = (int)((val_OV0_P2_X_START + SourceUVWidthInPixels - 1) / P23StepSize) * P23StepSize; - break; - case 3: - case 4: val_OV0_P2_X_START = val_OV0_P1_X_START; - /* This value is needed only to allow proper setting of */ - /* val_OV0_PRESHIFT_P23_TO */ - /* val_OV0_P2_X_END = 0; */ - break; - case 6: val_OV0_P2_X_START = (int)LeftPixel % (MemWordsInBytes/BytesPerPixel); - val_OV0_P2_X_END = (int)((val_OV0_P1_X_START + SourceWidthInPixels - 1) / P23StepSize) * P23StepSize; - break; - default: /* insert debug statement here. */ - RADEON_ASSERT("unknown fourcc\n"); - break; - } - val_OV0_P3_X_START = val_OV0_P2_X_START; - val_OV0_P3_X_END = val_OV0_P2_X_END; - - besr.p1_x_start_end = (val_OV0_P1_X_END&0x7ff) | ((val_OV0_P1_X_START&0x7ff)<<16); - besr.p2_x_start_end = (val_OV0_P2_X_END&0x7ff) | ((val_OV0_P2_X_START&0x7ff)<<16); - besr.p3_x_start_end = (val_OV0_P3_X_END&0x7ff) | ((val_OV0_P3_X_START&0x7ff)<<16); - if(is_400) - { - besr.p2_x_start_end = 0; - besr.p3_x_start_end = 0; - } - *p1_x_start = val_OV0_P1_X_START; - *p2_x_start = val_OV0_P2_X_START; -} - -static void ComputeAccumInit( - uint32_t val_OV0_P1_X_START,uint32_t val_OV0_P2_X_START, - uint32_t val_OV0_P1_H_INC,uint32_t val_OV0_P23_H_INC, - uint32_t val_OV0_P1_H_STEP_BY,uint32_t val_OV0_P23_H_STEP_BY, - uint32_t CRT_V_INC, - uint32_t P1GroupSize, uint32_t P23GroupSize, - uint32_t val_OV0_P1_MAX_LN_IN_PER_LN_OUT, - uint32_t val_OV0_P23_MAX_LN_IN_PER_LN_OUT) -{ - uint32_t val_OV0_P1_H_ACCUM_INIT,val_OV0_PRESHIFT_P1_TO; - uint32_t val_OV0_P23_H_ACCUM_INIT,val_OV0_PRESHIFT_P23_TO; - uint32_t val_OV0_P1_V_ACCUM_INIT,val_OV0_P23_V_ACCUM_INIT; - /* 2.5 puts the kernal 50% of the way between the source pixel that is off screen */ - /* and the first on-screen source pixel. "(float)valOV0_P?_H_INC / (1<<0xc)" is */ - /* the distance (in source pixel coordinates) to the center of the first */ - /* destination pixel. Need to add additional pixels depending on how many pixels */ - /* are fetched at a time and how many pixels in a set are masked. */ - /* P23 values are always fetched in groups of two or four. If the start */ - /* pixel does not fall on the boundary, then we need to shift preshift for */ - /* some additional pixels */ - - { - double ExtraHalfPixel; - double tempAdditionalShift; - double tempP1HStartPoint; - double tempP23HStartPoint; - double tempP1Init; - double tempP23Init; - - if (besr.horz_pick_nearest) ExtraHalfPixel = 0.5; - else ExtraHalfPixel = 0.0; - tempAdditionalShift = val_OV0_P1_X_START % P1GroupSize + ExtraHalfPixel; - tempP1HStartPoint = tempAdditionalShift + 2.5 + ((float)val_OV0_P1_H_INC / (1<<0xd)); - tempP1Init = (double)((int)(tempP1HStartPoint * (1<<0x5) + 0.5)) / (1<<0x5); - - /* P23 values are always fetched in pairs. If the start pixel is odd, then we */ - /* need to shift an additional pixel */ - /* Note that if the pitch is a multiple of two, and if we store fields using */ - /* the traditional planer format where the V plane and the U plane share the */ - /* same pitch, then OverlayRegFields->val_OV0_P2_X_START % P23Group */ - /* OverlayRegFields->val_OV0_P3_X_START % P23GroupSize. Either way */ - /* it is a requirement that the U and V start on the same polarity byte */ - /* (even or odd). */ - tempAdditionalShift = val_OV0_P2_X_START % P23GroupSize + ExtraHalfPixel; - tempP23HStartPoint = tempAdditionalShift + 2.5 + ((float)val_OV0_P23_H_INC / (1<<0xd)); - tempP23Init = (double)((int)(tempP23HStartPoint * (1<<0x5) + 0.5)) / (1 << 0x5); - val_OV0_P1_H_ACCUM_INIT = (int)((tempP1Init - (int)tempP1Init) * (1<<0x5)); - val_OV0_PRESHIFT_P1_TO = (int)tempP1Init; - val_OV0_P23_H_ACCUM_INIT = (int)((tempP23Init - (int)tempP23Init) * (1<<0x5)); - val_OV0_PRESHIFT_P23_TO = (int)tempP23Init; - } - - /* ************************************************************** */ - /* ** Calculate values for initializing the vertical accumulators */ - /* ************************************************************** */ - - { - double ExtraHalfLine; - double ExtraFullLine; - double tempP1VStartPoint; - double tempP23VStartPoint; - - if (besr.vert_pick_nearest) ExtraHalfLine = 0.5; - else ExtraHalfLine = 0.0; - - if (val_OV0_P1_H_STEP_BY==0)ExtraFullLine = 1.0; - else ExtraFullLine = 0.0; - - tempP1VStartPoint = 1.5 + ExtraFullLine + ExtraHalfLine + ((float)CRT_V_INC / (1<<0xd)); - if (tempP1VStartPoint>2.5 + 2*ExtraFullLine) - { - tempP1VStartPoint = 2.5 + 2*ExtraFullLine; - } - val_OV0_P1_V_ACCUM_INIT = (int)(tempP1VStartPoint * (1<<0x5) + 0.5); - - if (val_OV0_P23_H_STEP_BY==0)ExtraFullLine = 1.0; - else ExtraFullLine = 0.0; - - switch (besr.surf_id) - { - case 10: - case 13: - case 14: tempP23VStartPoint = 1.5 + ExtraFullLine + ExtraHalfLine + - ((float)CRT_V_INC / (1<<0xe)); - break; - case 9: tempP23VStartPoint = 1.5 + ExtraFullLine + ExtraHalfLine + - ((float)CRT_V_INC / (1<<0xf)); - break; - case 3: - case 4: - case 6: - case 11: - case 12: tempP23VStartPoint = 0; - break; - default: tempP23VStartPoint = 0xFFFF;/* insert debug statement here */ - break; - } - - if (tempP23VStartPoint>2.5 + 2*ExtraFullLine) - { - tempP23VStartPoint = 2.5 + 2*ExtraFullLine; - } - - val_OV0_P23_V_ACCUM_INIT = (int)(tempP23VStartPoint * (1<<0x5) + 0.5); - } - besr.p1_h_accum_init = ((val_OV0_P1_H_ACCUM_INIT&0x1f)<<15) |((val_OV0_PRESHIFT_P1_TO&0xf)<<28); - besr.p1_v_accum_init = (val_OV0_P1_MAX_LN_IN_PER_LN_OUT&0x3) |((val_OV0_P1_V_ACCUM_INIT&0x7ff)<<15); - besr.p23_h_accum_init= ((val_OV0_P23_H_ACCUM_INIT&0x1f)<<15) |((val_OV0_PRESHIFT_P23_TO&0xf)<<28); - besr.p23_v_accum_init= (val_OV0_P23_MAX_LN_IN_PER_LN_OUT&0x3)|((val_OV0_P23_V_ACCUM_INIT&0x3ff)<<15); -} - -typedef struct RangeAndCoefSet { - double Range; - signed char CoefSet[5][4]; -} RANGEANDCOEFSET; - -/* Filter Setup Routine */ -static void FilterSetup ( uint32_t val_OV0_P1_H_INC ) -{ - static RANGEANDCOEFSET ArrayOfSets[] = { - {0.25, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.26, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.27, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.28, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.29, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.30, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.31, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.32, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.33, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.34, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.35, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.36, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.37, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.38, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.39, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.40, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.41, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.42, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.43, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.44, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.45, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.46, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.47, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.48, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.49, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.50, {{ 7, 16, 9, 0}, { 7, 16, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 3, 13, 13, 3}, }}, - {0.51, {{ 7, 17, 8, 0}, { 6, 17, 9, 0}, { 5, 15, 11, 1}, { 4, 15, 12, 1}, { 2, 14, 14, 2}, }}, - {0.52, {{ 7, 17, 8, 0}, { 6, 17, 9, 0}, { 5, 16, 11, 0}, { 3, 15, 13, 1}, { 2, 14, 14, 2}, }}, - {0.53, {{ 7, 17, 8, 0}, { 6, 17, 9, 0}, { 5, 16, 11, 0}, { 3, 15, 13, 1}, { 2, 14, 14, 2}, }}, - {0.54, {{ 7, 17, 8, 0}, { 6, 17, 9, 0}, { 4, 17, 11, 0}, { 3, 15, 13, 1}, { 2, 14, 14, 2}, }}, - {0.55, {{ 7, 18, 7, 0}, { 6, 17, 9, 0}, { 4, 17, 11, 0}, { 3, 15, 13, 1}, { 1, 15, 15, 1}, }}, - {0.56, {{ 7, 18, 7, 0}, { 5, 18, 9, 0}, { 4, 17, 11, 0}, { 2, 17, 13, 0}, { 1, 15, 15, 1}, }}, - {0.57, {{ 7, 18, 7, 0}, { 5, 18, 9, 0}, { 4, 17, 11, 0}, { 2, 17, 13, 0}, { 1, 15, 15, 1}, }}, - {0.58, {{ 7, 18, 7, 0}, { 5, 18, 9, 0}, { 4, 17, 11, 0}, { 2, 17, 13, 0}, { 1, 15, 15, 1}, }}, - {0.59, {{ 7, 18, 7, 0}, { 5, 18, 9, 0}, { 4, 17, 11, 0}, { 2, 17, 13, 0}, { 1, 15, 15, 1}, }}, - {0.60, {{ 7, 18, 8, -1}, { 6, 17, 10, -1}, { 4, 17, 11, 0}, { 2, 17, 13, 0}, { 1, 15, 15, 1}, }}, - {0.61, {{ 7, 18, 8, -1}, { 6, 17, 10, -1}, { 4, 17, 11, 0}, { 2, 17, 13, 0}, { 1, 15, 15, 1}, }}, - {0.62, {{ 7, 18, 8, -1}, { 6, 17, 10, -1}, { 4, 17, 11, 0}, { 2, 17, 13, 0}, { 1, 15, 15, 1}, }}, - {0.63, {{ 7, 18, 8, -1}, { 6, 17, 10, -1}, { 4, 17, 11, 0}, { 2, 17, 13, 0}, { 1, 15, 15, 1}, }}, - {0.64, {{ 7, 18, 8, -1}, { 6, 17, 10, -1}, { 4, 17, 12, -1}, { 2, 17, 13, 0}, { 1, 15, 15, 1}, }}, - {0.65, {{ 7, 18, 8, -1}, { 6, 17, 10, -1}, { 4, 17, 12, -1}, { 2, 17, 13, 0}, { 0, 16, 16, 0}, }}, - {0.66, {{ 7, 18, 8, -1}, { 6, 18, 10, -2}, { 4, 17, 12, -1}, { 2, 17, 13, 0}, { 0, 16, 16, 0}, }}, - {0.67, {{ 7, 20, 7, -2}, { 5, 19, 10, -2}, { 3, 18, 12, -1}, { 2, 17, 13, 0}, { 0, 16, 16, 0}, }}, - {0.68, {{ 7, 20, 7, -2}, { 5, 19, 10, -2}, { 3, 19, 12, -2}, { 1, 18, 14, -1}, { 0, 16, 16, 0}, }}, - {0.69, {{ 7, 20, 7, -2}, { 5, 19, 10, -2}, { 3, 19, 12, -2}, { 1, 18, 14, -1}, { 0, 16, 16, 0}, }}, - {0.70, {{ 7, 20, 7, -2}, { 5, 20, 9, -2}, { 3, 19, 12, -2}, { 1, 18, 14, -1}, { 0, 16, 16, 0}, }}, - {0.71, {{ 7, 20, 7, -2}, { 5, 20, 9, -2}, { 3, 19, 12, -2}, { 1, 18, 14, -1}, { 0, 16, 16, 0}, }}, - {0.72, {{ 7, 20, 7, -2}, { 5, 20, 9, -2}, { 2, 20, 12, -2}, { 0, 19, 15, -2}, {-1, 17, 17, -1}, }}, - {0.73, {{ 7, 20, 7, -2}, { 4, 21, 9, -2}, { 2, 20, 12, -2}, { 0, 19, 15, -2}, {-1, 17, 17, -1}, }}, - {0.74, {{ 6, 22, 6, -2}, { 4, 21, 9, -2}, { 2, 20, 12, -2}, { 0, 19, 15, -2}, {-1, 17, 17, -1}, }}, - {0.75, {{ 6, 22, 6, -2}, { 4, 21, 9, -2}, { 1, 21, 12, -2}, { 0, 19, 15, -2}, {-1, 17, 17, -1}, }}, - {0.76, {{ 6, 22, 6, -2}, { 4, 21, 9, -2}, { 1, 21, 12, -2}, { 0, 19, 15, -2}, {-1, 17, 17, -1}, }}, - {0.77, {{ 6, 22, 6, -2}, { 3, 22, 9, -2}, { 1, 22, 12, -3}, { 0, 19, 15, -2}, {-2, 18, 18, -2}, }}, - {0.78, {{ 6, 21, 6, -1}, { 3, 22, 9, -2}, { 1, 22, 12, -3}, { 0, 19, 15, -2}, {-2, 18, 18, -2}, }}, - {0.79, {{ 5, 23, 5, -1}, { 3, 22, 9, -2}, { 0, 23, 12, -3}, {-1, 21, 15, -3}, {-2, 18, 18, -2}, }}, - {0.80, {{ 5, 23, 5, -1}, { 3, 23, 8, -2}, { 0, 23, 12, -3}, {-1, 21, 15, -3}, {-2, 18, 18, -2}, }}, - {0.81, {{ 5, 23, 5, -1}, { 2, 24, 8, -2}, { 0, 23, 12, -3}, {-1, 21, 15, -3}, {-2, 18, 18, -2}, }}, - {0.82, {{ 5, 23, 5, -1}, { 2, 24, 8, -2}, { 0, 23, 12, -3}, {-1, 21, 15, -3}, {-3, 19, 19, -3}, }}, - {0.83, {{ 5, 23, 5, -1}, { 2, 24, 8, -2}, { 0, 23, 11, -2}, {-2, 22, 15, -3}, {-3, 19, 19, -3}, }}, - {0.84, {{ 4, 25, 4, -1}, { 1, 25, 8, -2}, { 0, 23, 11, -2}, {-2, 22, 15, -3}, {-3, 19, 19, -3}, }}, - {0.85, {{ 4, 25, 4, -1}, { 1, 25, 8, -2}, { 0, 23, 11, -2}, {-2, 22, 15, -3}, {-3, 19, 19, -3}, }}, - {0.86, {{ 4, 24, 4, 0}, { 1, 25, 7, -1}, {-1, 24, 11, -2}, {-2, 22, 15, -3}, {-3, 19, 19, -3}, }}, - {0.87, {{ 4, 24, 4, 0}, { 1, 25, 7, -1}, {-1, 24, 11, -2}, {-2, 22, 15, -3}, {-3, 19, 19, -3}, }}, - {0.88, {{ 3, 26, 3, 0}, { 0, 26, 7, -1}, {-1, 24, 11, -2}, {-3, 23, 15, -3}, {-3, 19, 19, -3}, }}, - {0.89, {{ 3, 26, 3, 0}, { 0, 26, 7, -1}, {-1, 24, 11, -2}, {-3, 23, 15, -3}, {-3, 19, 19, -3}, }}, - {0.90, {{ 3, 26, 3, 0}, { 0, 26, 7, -1}, {-2, 25, 11, -2}, {-3, 23, 15, -3}, {-3, 19, 19, -3}, }}, - {0.91, {{ 3, 26, 3, 0}, { 0, 27, 6, -1}, {-2, 25, 11, -2}, {-3, 23, 15, -3}, {-3, 19, 19, -3}, }}, - {0.92, {{ 2, 28, 2, 0}, { 0, 27, 6, -1}, {-2, 25, 11, -2}, {-3, 23, 15, -3}, {-3, 19, 19, -3}, }}, - {0.93, {{ 2, 28, 2, 0}, { 0, 26, 6, 0}, {-2, 25, 10, -1}, {-3, 23, 15, -3}, {-3, 19, 19, -3}, }}, - {0.94, {{ 2, 28, 2, 0}, { 0, 26, 6, 0}, {-2, 25, 10, -1}, {-3, 23, 15, -3}, {-3, 19, 19, -3}, }}, - {0.95, {{ 1, 30, 1, 0}, {-1, 28, 5, 0}, {-3, 26, 10, -1}, {-3, 23, 14, -2}, {-3, 19, 19, -3}, }}, - {0.96, {{ 1, 30, 1, 0}, {-1, 28, 5, 0}, {-3, 26, 10, -1}, {-3, 23, 14, -2}, {-3, 19, 19, -3}, }}, - {0.97, {{ 1, 30, 1, 0}, {-1, 28, 5, 0}, {-3, 26, 10, -1}, {-3, 23, 14, -2}, {-3, 19, 19, -3}, }}, - {0.98, {{ 1, 30, 1, 0}, {-2, 29, 5, 0}, {-3, 27, 9, -1}, {-3, 23, 14, -2}, {-3, 19, 19, -3}, }}, - {0.99, {{ 0, 32, 0, 0}, {-2, 29, 5, 0}, {-3, 27, 9, -1}, {-4, 24, 14, -2}, {-3, 19, 19, -3}, }}, - {1.00, {{ 0, 32, 0, 0}, {-2, 29, 5, 0}, {-3, 27, 9, -1}, {-4, 24, 14, -2}, {-3, 19, 19, -3}, }} - }; - - double DSR; - - unsigned ArrayElement; - - DSR = (double)(1<<0xc)/val_OV0_P1_H_INC; - if (DSR<.25) DSR=.25; - if (DSR>1) DSR=1; - - ArrayElement = (int)((DSR-0.25) * 100); - besr.four_tap_coeff[0] = (ArrayOfSets[ArrayElement].CoefSet[0][0] & 0xf) | - ((ArrayOfSets[ArrayElement].CoefSet[0][1] & 0x7f)<<8) | - ((ArrayOfSets[ArrayElement].CoefSet[0][2] & 0x7f)<<16) | - ((ArrayOfSets[ArrayElement].CoefSet[0][3] & 0xf)<<24); - besr.four_tap_coeff[1] = (ArrayOfSets[ArrayElement].CoefSet[1][0] & 0xf) | - ((ArrayOfSets[ArrayElement].CoefSet[1][1] & 0x7f)<<8) | - ((ArrayOfSets[ArrayElement].CoefSet[1][2] & 0x7f)<<16) | - ((ArrayOfSets[ArrayElement].CoefSet[1][3] & 0xf)<<24); - besr.four_tap_coeff[2] = (ArrayOfSets[ArrayElement].CoefSet[2][0] & 0xf) | - ((ArrayOfSets[ArrayElement].CoefSet[2][1] & 0x7f)<<8) | - ((ArrayOfSets[ArrayElement].CoefSet[2][2] & 0x7f)<<16) | - ((ArrayOfSets[ArrayElement].CoefSet[2][3] & 0xf)<<24); - besr.four_tap_coeff[3] = (ArrayOfSets[ArrayElement].CoefSet[3][0] & 0xf) | - ((ArrayOfSets[ArrayElement].CoefSet[3][1] & 0x7f)<<8) | - ((ArrayOfSets[ArrayElement].CoefSet[3][2] & 0x7f)<<16) | - ((ArrayOfSets[ArrayElement].CoefSet[3][3] & 0xf)<<24); - besr.four_tap_coeff[4] = (ArrayOfSets[ArrayElement].CoefSet[4][0] & 0xf) | - ((ArrayOfSets[ArrayElement].CoefSet[4][1] & 0x7f)<<8) | - ((ArrayOfSets[ArrayElement].CoefSet[4][2] & 0x7f)<<16) | - ((ArrayOfSets[ArrayElement].CoefSet[4][3] & 0xf)<<24); -/* - For more details, refer to Microsoft's draft of PC99. -*/ -} - -/* The minimal value of horizontal scale ratio when hard coded coefficients - are suitable for the best quality. */ -/* FIXME: Should it be 0.9 for Rage128 ??? */ -const double MinHScaleHard=0.75; - -static int radeon_vid_init_video( vidix_playback_t *config ) -{ - double V_scale_ratio; - uint32_t i,src_w,src_h,dest_w,dest_h,pitch,left,leftUV,top,h_inc; - uint32_t val_OV0_P1_H_INC,val_OV0_P1_H_STEP_BY,val_OV0_P23_H_INC,val_OV0_P23_H_STEP_BY; - uint32_t val_OV0_P1_X_START,val_OV0_P2_X_START; - uint32_t val_OV0_P1_MAX_LN_IN_PER_LN_OUT,val_OV0_P23_MAX_LN_IN_PER_LN_OUT; - uint32_t CRT_V_INC; - uint32_t BytesPerOctWord,LogMemWordsInBytes,MemWordsInBytes,LogTileWidthInMemWords; - uint32_t TileWidthInMemWords,TileWidthInBytes,LogTileHeight,TileHeight; - uint32_t PageSizeInBytes,OV0LB_Rows; - uint32_t SourceWidthInMemWords,SourceUVWidthInMemWords; - uint32_t SourceWidthInPixels,SourceUVWidthInPixels; - uint32_t RightPixel,RightUVPixel,LeftPixel,LeftUVPixel; - int is_400,is_410,is_420,best_pitch,mpitch; - int horz_repl_factor,interlace_factor; - int BytesPerPixel,BytesPerUVPixel,HorzUVSubSample,VertUVSubSample; - int DisallowFourTapVertFiltering,DisallowFourTapUVVertFiltering; - - radeon_vid_stop_video(); - left = config->src.x << 16; - top = config->src.y << 16; - src_h = config->src.h; - src_w = config->src.w; - is_400 = is_410 = is_420 = 0; - if(config->fourcc == IMGFMT_YV12 || - config->fourcc == IMGFMT_I420 || - config->fourcc == IMGFMT_IYUV) is_420 = 1; - if(config->fourcc == IMGFMT_YVU9 || - config->fourcc == IMGFMT_IF09) is_410 = 1; - if(config->fourcc == IMGFMT_Y800) is_400 = 1; - best_pitch = radeon_query_pitch(config->fourcc,&config->src.pitch); - mpitch = best_pitch-1; - BytesPerOctWord = 16; - LogMemWordsInBytes = 4; - MemWordsInBytes = 1<<LogMemWordsInBytes; - LogTileWidthInMemWords = 2; - TileWidthInMemWords = 1<<LogTileWidthInMemWords; - TileWidthInBytes = 1<<(LogTileWidthInMemWords+LogMemWordsInBytes); - LogTileHeight = 4; - TileHeight = 1<<LogTileHeight; - PageSizeInBytes = 64*MemWordsInBytes; - OV0LB_Rows = 96; - h_inc = 1; - switch(config->fourcc) - { - /* 4:0:0*/ - case IMGFMT_Y800: - /* 4:1:0*/ - case IMGFMT_YVU9: - case IMGFMT_IF09: - /* 4:2:0 */ - case IMGFMT_IYUV: - case IMGFMT_YV12: - case IMGFMT_I420: pitch = (src_w + mpitch) & ~mpitch; - config->dest.pitch.y = - config->dest.pitch.u = - config->dest.pitch.v = best_pitch; - break; - /* RGB 4:4:4:4 */ - case IMGFMT_RGB32: - case IMGFMT_BGR32: pitch = (src_w*4 + mpitch) & ~mpitch; - config->dest.pitch.y = - config->dest.pitch.u = - config->dest.pitch.v = best_pitch; - break; - /* 4:2:2 */ - - default: /* RGB15, RGB16, YVYU, UYVY, YUY2 */ - pitch = ((src_w*2) + mpitch) & ~mpitch; - config->dest.pitch.y = - config->dest.pitch.u = - config->dest.pitch.v = best_pitch; - break; - } - besr.load_prg_start=0; - besr.swap_uv=0; - switch(config->fourcc) - { - case IMGFMT_RGB15: - besr.swap_uv=1; - case IMGFMT_BGR15: besr.surf_id = SCALER_SOURCE_15BPP>>8; - besr.load_prg_start = 1; - break; - case IMGFMT_RGB16: - besr.swap_uv=1; - case IMGFMT_BGR16: besr.surf_id = SCALER_SOURCE_16BPP>>8; - besr.load_prg_start = 1; - break; - case IMGFMT_RGB32: - besr.swap_uv=1; - case IMGFMT_BGR32: besr.surf_id = SCALER_SOURCE_32BPP>>8; - besr.load_prg_start = 1; - break; - /* 4:1:0*/ - case IMGFMT_IF09: - case IMGFMT_YVU9: besr.surf_id = SCALER_SOURCE_YUV9>>8; - break; - /* 4:0:0*/ - case IMGFMT_Y800: - /* 4:2:0 */ - case IMGFMT_IYUV: - case IMGFMT_I420: - case IMGFMT_YV12: besr.surf_id = SCALER_SOURCE_YUV12>>8; - break; - /* 4:2:2 */ - case IMGFMT_YVYU: - case IMGFMT_UYVY: besr.surf_id = SCALER_SOURCE_YVYU422>>8; - break; - case IMGFMT_YUY2: - default: besr.surf_id = SCALER_SOURCE_VYUY422>>8; - break; - } - switch (besr.surf_id) - { - case 3: - case 4: - case 11: - case 12: BytesPerPixel = 2; - break; - case 6: BytesPerPixel = 4; - break; - case 9: - case 10: - case 13: - case 14: BytesPerPixel = 1; - break; - default: BytesPerPixel = 0;/*insert a debug statement here. */ - break; - } - switch (besr.surf_id) - { - case 3: - case 4: BytesPerUVPixel = 0; - break;/* In RGB modes, the BytesPerUVPixel is don't care */ - case 11: - case 12: BytesPerUVPixel = 2; - break; - case 6: BytesPerUVPixel = 0; - break; /* In RGB modes, the BytesPerUVPixel is don't care */ - case 9: - case 10: BytesPerUVPixel = 1; - break; - case 13: - case 14: BytesPerUVPixel = 2; - break; - default: BytesPerUVPixel = 0;/* insert a debug statement here. */ - break; - - } - switch (besr.surf_id) - { - case 3: - case 4: - case 6: HorzUVSubSample = 1; - break; - case 9: HorzUVSubSample = 4; - break; - case 10: - case 11: - case 12: - case 13: - case 14: HorzUVSubSample = 2; - break; - default: HorzUVSubSample = 0;/* insert debug statement here. */ - break; - } - switch (besr.surf_id) - { - case 3: - case 4: - case 6: - case 11: - case 12: VertUVSubSample = 1; - break; - case 9: VertUVSubSample = 4; - break; - case 10: - case 13: - case 14: VertUVSubSample = 2; - break; - default: VertUVSubSample = 0;/* insert debug statment here. */ - break; - } - DisallowFourTapVertFiltering = 0; /* Allow it by default */ - DisallowFourTapUVVertFiltering = 0; /* Allow it by default */ - LeftPixel = config->src.x; - RightPixel = config->src.w-1; - if(floor(config->src.x/HorzUVSubSample)<0) LeftUVPixel = 0; - else LeftUVPixel = (int)floor(config->src.x/HorzUVSubSample); - if(ceil((config->src.x+config->src.w)/HorzUVSubSample) > config->src.w/HorzUVSubSample) - RightUVPixel = config->src.w/HorzUVSubSample - 1; - else RightUVPixel = (int)ceil((config->src.x+config->src.w)/HorzUVSubSample) - 1; - /* Top, Bottom and Right Crops can be out of range. The driver will program the hardware - // to create a black border at the top and bottom. This is useful for DVD letterboxing. */ - SourceWidthInPixels = (int)(config->src.w + 1); - SourceUVWidthInPixels = (int)(RightUVPixel - LeftUVPixel + 1); - - SourceWidthInMemWords = (int)(ceil(RightPixel*BytesPerPixel / MemWordsInBytes) - - floor(LeftPixel*BytesPerPixel / MemWordsInBytes) + 1); - /* SourceUVWidthInMemWords means Source_U_or_V_or_UV_WidthInMemWords depending on whether the UV is packed together of not. */ - SourceUVWidthInMemWords = (int)(ceil(RightUVPixel*BytesPerUVPixel / - MemWordsInBytes) - floor(LeftUVPixel*BytesPerUVPixel / - MemWordsInBytes) + 1); - - switch (besr.surf_id) - { - case 9: - case 10: if ((ceil(SourceWidthInMemWords/2)-1) * 2 > OV0LB_Rows-1) - { - RADEON_ASSERT("ceil(SourceWidthInMemWords/2)-1) * 2 > OV0LB_Rows-1\n"); - } - else if ((SourceWidthInMemWords-1) * 2 > OV0LB_Rows-1) - { - DisallowFourTapVertFiltering = 1; - } - - if ((ceil(SourceUVWidthInMemWords/2)-1) * 4 + 1 > OV0LB_Rows-1) - { - /*CYCACC_ASSERT(0, "Image U plane width spans more octwords than supported by hardware.") */ - } - else if ((SourceUVWidthInMemWords-1) * 4 + 1 > OV0LB_Rows-1) - { - DisallowFourTapUVVertFiltering = 1; - } - - if ((ceil(SourceUVWidthInMemWords/2)-1) * 4 + 3 > OV0LB_Rows-1) - { - /*CYCACC_ASSERT(0, "Image V plane width spans more octwords than supported by hardware.") */ - } - else if ((SourceUVWidthInMemWords-1) * 4 + 3 > OV0LB_Rows-1) - { - DisallowFourTapUVVertFiltering = 1; - } - break; - case 13: - case 14: if ((ceil(SourceWidthInMemWords/2)-1) * 2 > OV0LB_Rows-1) - { - RADEON_ASSERT("ceil(SourceWidthInMemWords/2)-1) * 2 > OV0LB_Rows-1\n"); - } - else if ((SourceWidthInMemWords-1) * 2 > OV0LB_Rows-1) - { - DisallowFourTapVertFiltering = 1; - } - - if ((ceil(SourceUVWidthInMemWords/2)-1) * 2 + 1 > OV0LB_Rows-1) - { - /*CYCACC_ASSERT(0, "Image UV plane width spans more octwords than supported by hardware.") */ - } - else if ((SourceUVWidthInMemWords-1) * 2 + 1 > OV0LB_Rows-1) - { - DisallowFourTapUVVertFiltering = 1; - } - break; - case 3: - case 4: - case 6: - case 11: - case 12: if ((ceil(SourceWidthInMemWords/2)-1) > OV0LB_Rows-1) - { - RADEON_ASSERT("(ceil(SourceWidthInMemWords/2)-1) > OV0LB_Rows-1\n") - } - else if ((SourceWidthInMemWords-1) > OV0LB_Rows-1) - { - DisallowFourTapVertFiltering = 1; - } - break; - default: /* insert debug statement here. */ - break; - } - dest_w = config->dest.w; - dest_h = config->dest.h; - if(radeon_is_dbl_scan()) dest_h *= 2; - besr.dest_bpp = radeon_vid_get_dbpp(); - besr.fourcc = config->fourcc; - if(radeon_is_interlace()) interlace_factor = 2; - else interlace_factor = 1; - /* TODO: must be checked in doublescan mode!!! */ - if((besr.chip_flags&R_INTEGRATED)==R_INTEGRATED) - { - /* Force the overlay clock on for integrated chips */ - OUTPLL(VCLK_ECP_CNTL, (INPLL(VCLK_ECP_CNTL) | (1<<18))); - } - horz_repl_factor = 1 << (uint32_t)((INPLL(VCLK_ECP_CNTL) & 0x300) >> 8); - H_scale_ratio = (double)ceil(((double)dest_w+1)/horz_repl_factor)/src_w; - V_scale_ratio = (double)(dest_h+1)/src_h; - if(H_scale_ratio < 0.5 && V_scale_ratio < 0.5) - { - val_OV0_P1_MAX_LN_IN_PER_LN_OUT = 3; - val_OV0_P23_MAX_LN_IN_PER_LN_OUT = 2; - } - else - if(H_scale_ratio < 1 && V_scale_ratio < 1) - { - val_OV0_P1_MAX_LN_IN_PER_LN_OUT = 2; - val_OV0_P23_MAX_LN_IN_PER_LN_OUT = 1; - } - else - { - val_OV0_P1_MAX_LN_IN_PER_LN_OUT = 1; - val_OV0_P23_MAX_LN_IN_PER_LN_OUT = 1; - } - /* N.B.: Indeed it has 6.12 format but shifted on 8 to the left!!! */ - besr.v_inc = (uint16_t)((1./V_scale_ratio)*(1<<12)*interlace_factor+0.5); - CRT_V_INC = besr.v_inc/interlace_factor; - besr.v_inc <<= 8; - { - int ThereIsTwoTapVerticalFiltering,DoNotUseMostRecentlyFetchedLine; - int P1GroupSize; - int P23GroupSize; - int P1StepSize; - int P23StepSize; - - Calc_H_INC_STEP_BY( - besr.surf_id, - H_scale_ratio, - DisallowFourTapVertFiltering, - DisallowFourTapUVVertFiltering, - &val_OV0_P1_H_INC, - &val_OV0_P1_H_STEP_BY, - &val_OV0_P23_H_INC, - &val_OV0_P23_H_STEP_BY, - &P1GroupSize, - &P1StepSize, - &P23StepSize); - - if(H_scale_ratio > MinHScaleHard) - { - h_inc = (src_w << 12) / dest_w; - besr.step_by = 0x0101; - switch (besr.surf_id) - { - case 3: - case 4: - case 6: - besr.h_inc = (h_inc)|(h_inc<<16); - break; - case 9: - besr.h_inc = h_inc | ((h_inc >> 2) << 16); - break; - default: - besr.h_inc = h_inc | ((h_inc >> 1) << 16); - break; - } - } - - P23GroupSize = 2; /* Current vaue for all modes */ - - besr.horz_pick_nearest=0; - DoNotUseMostRecentlyFetchedLine=0; - ThereIsTwoTapVerticalFiltering = (val_OV0_P1_H_STEP_BY!=0) || (val_OV0_P23_H_STEP_BY!=0); - if (ThereIsTwoTapVerticalFiltering && DoNotUseMostRecentlyFetchedLine) - besr.vert_pick_nearest = 1; - else - besr.vert_pick_nearest = 0; - - ComputeXStartEnd(is_400,LeftPixel,LeftUVPixel,MemWordsInBytes,BytesPerPixel, - SourceWidthInPixels,P1StepSize,BytesPerUVPixel, - SourceUVWidthInPixels,P23StepSize,&val_OV0_P1_X_START,&val_OV0_P2_X_START); - - if(H_scale_ratio > MinHScaleHard) - { - unsigned tmp; - tmp = (left & 0x0003ffff) + 0x00028000 + (h_inc << 3); - besr.p1_h_accum_init = ((tmp << 4) & 0x000f8000) | - ((tmp << 12) & 0xf0000000); - - tmp = (top & 0x0000ffff) + 0x00018000; - besr.p1_v_accum_init = ((tmp << 4) & OV0_P1_V_ACCUM_INIT_MASK) - |(OV0_P1_MAX_LN_IN_PER_LN_OUT & 1); - tmp = ((left >> 1) & 0x0001ffff) + 0x00028000 + (h_inc << 2); - besr.p23_h_accum_init = ((tmp << 4) & 0x000f8000) | - ((tmp << 12) & 0x70000000); - - tmp = ((top >> 1) & 0x0000ffff) + 0x00018000; - besr.p23_v_accum_init = (is_420||is_410) ? - ((tmp << 4) & OV0_P23_V_ACCUM_INIT_MASK) - |(OV0_P23_MAX_LN_IN_PER_LN_OUT & 1) : 0; - } - else - ComputeAccumInit( val_OV0_P1_X_START,val_OV0_P2_X_START, - val_OV0_P1_H_INC,val_OV0_P23_H_INC, - val_OV0_P1_H_STEP_BY,val_OV0_P23_H_STEP_BY, - CRT_V_INC,P1GroupSize,P23GroupSize, - val_OV0_P1_MAX_LN_IN_PER_LN_OUT, - val_OV0_P23_MAX_LN_IN_PER_LN_OUT); - } - - /* keep everything in 16.16 */ - besr.base_addr = INREG(DISPLAY_BASE_ADDR); - config->offsets[0] = 0; - for(i=1;i<besr.vid_nbufs;i++) - config->offsets[i] = config->offsets[i-1]+config->frame_size; - if(is_420 || is_410 || is_400) - { - uint32_t d1line,d2line,d3line; - d1line = top*pitch; - if(is_420) - { - d2line = src_h*pitch+(d1line>>2); - d3line = d2line+((src_h*pitch)>>2); - } - else - if(is_410) - { - d2line = src_h*pitch+(d1line>>4); - d3line = d2line+((src_h*pitch)>>4); - } - else - { - d2line = 0; - d3line = 0; - } - d1line += (left >> 16) & ~15; - if(is_420) - { - d2line += (left >> 17) & ~15; - d3line += (left >> 17) & ~15; - } - else /* is_410 */ - { - d2line += (left >> 18) & ~15; - d3line += (left >> 18) & ~15; - } - config->offset.y = d1line & VIF_BUF0_BASE_ADRS_MASK; - if(is_400) - { - config->offset.v = 0; - config->offset.u = 0; - } - else - { - config->offset.v = d2line & VIF_BUF1_BASE_ADRS_MASK; - config->offset.u = d3line & VIF_BUF2_BASE_ADRS_MASK; - } - for(i=0;i<besr.vid_nbufs;i++) - { - besr.vid_buf_base_adrs_y[i]=((radeon_overlay_off+config->offsets[i]+config->offset.y)&VIF_BUF0_BASE_ADRS_MASK); - if(is_400) - { - besr.vid_buf_base_adrs_v[i]=0; - besr.vid_buf_base_adrs_u[i]=0; - } - else - { - besr.vid_buf_base_adrs_v[i]=((radeon_overlay_off+config->offsets[i]+config->offset.v)&VIF_BUF1_BASE_ADRS_MASK)|VIF_BUF1_PITCH_SEL; - besr.vid_buf_base_adrs_u[i]=((radeon_overlay_off+config->offsets[i]+config->offset.u)&VIF_BUF2_BASE_ADRS_MASK)|VIF_BUF2_PITCH_SEL; - } - } - config->offset.y = ((besr.vid_buf_base_adrs_y[0])&VIF_BUF0_BASE_ADRS_MASK) - radeon_overlay_off; - if(is_400) - { - config->offset.v = 0; - config->offset.u = 0; - } - else - { - config->offset.v = ((besr.vid_buf_base_adrs_v[0])&VIF_BUF1_BASE_ADRS_MASK) - radeon_overlay_off; - config->offset.u = ((besr.vid_buf_base_adrs_u[0])&VIF_BUF2_BASE_ADRS_MASK) - radeon_overlay_off; - } - if(besr.fourcc == IMGFMT_I420 || besr.fourcc == IMGFMT_IYUV) - { - uint32_t tmp; - tmp = config->offset.u; - config->offset.u = config->offset.v; - config->offset.v = tmp; - } - } - else - { - config->offset.y = config->offset.u = config->offset.v = ((left & ~7) << 1)&VIF_BUF0_BASE_ADRS_MASK; - for(i=0;i<besr.vid_nbufs;i++) - { - besr.vid_buf_base_adrs_y[i] = - besr.vid_buf_base_adrs_u[i] = - besr.vid_buf_base_adrs_v[i] = radeon_overlay_off + config->offsets[i] + config->offset.y; - } - } - leftUV = (left >> (is_410?18:17)) & 15; - left = (left >> 16) & 15; - besr.y_x_start = (config->dest.x+X_ADJUST) | (config->dest.y << 16); - besr.y_x_end = (config->dest.x + dest_w+X_ADJUST) | ((config->dest.y + dest_h) << 16); - ComputeBorders(config,VertUVSubSample); - besr.vid_buf_pitch0_value = pitch; - besr.vid_buf_pitch1_value = is_410 ? pitch>>2 : is_420 ? pitch>>1 : pitch; - /* ********************************************************* */ - /* ** Calculate programmable coefficients as needed */ - /* ********************************************************* */ - - /* ToDo_Active: When in pick nearest mode, we need to program the filter tap zero */ - /* coefficients to 0, 32, 0, 0. Or use hard coded coefficients. */ - if(H_scale_ratio > MinHScaleHard) besr.filter_cntl |= FILTER_HARDCODED_COEF; - else - { - FilterSetup (val_OV0_P1_H_INC); - /* ToDo_Active: Must add the smarts into the driver to decide what type of filtering it */ - /* would like to do. For now, we let the test application decide. */ - besr.filter_cntl = FILTER_PROGRAMMABLE_COEF; - if(DisallowFourTapVertFiltering) - besr.filter_cntl |= FILTER_HARD_SCALE_VERT_Y; - if(DisallowFourTapUVVertFiltering) - besr.filter_cntl |= FILTER_HARD_SCALE_VERT_UV; - } - return 0; -} - -static void radeon_compute_framesize(vidix_playback_t *info) -{ - unsigned pitch,awidth,dbpp; - pitch = radeon_query_pitch(info->fourcc,&info->src.pitch); - dbpp = radeon_vid_get_dbpp(); - switch(info->fourcc) - { - case IMGFMT_Y800: - awidth = (info->src.w + (pitch-1)) & ~(pitch-1); - info->frame_size = awidth*info->src.h; - break; - case IMGFMT_YVU9: - case IMGFMT_IF09: - awidth = (info->src.w + (pitch-1)) & ~(pitch-1); - info->frame_size = awidth*(info->src.h+info->src.h/8); - break; - case IMGFMT_I420: - case IMGFMT_YV12: - case IMGFMT_IYUV: - awidth = (info->src.w + (pitch-1)) & ~(pitch-1); - info->frame_size = awidth*(info->src.h+info->src.h/2); - break; - case IMGFMT_RGB32: - case IMGFMT_BGR32: - awidth = (info->src.w*4 + (pitch-1)) & ~(pitch-1); - info->frame_size = awidth*info->src.h; - break; - /* YUY2 YVYU, RGB15, RGB16 */ - default: - awidth = (info->src.w*2 + (pitch-1)) & ~(pitch-1); - info->frame_size = awidth*info->src.h; - break; - } - info->frame_size = (info->frame_size+4095)&~4095; -} - -int VIDIX_NAME(vixConfigPlayback)(vidix_playback_t *info) -{ - unsigned rgb_size,nfr; - uint32_t radeon_video_size; - if(!is_supported_fourcc(info->fourcc,info->src.w)) return ENOSYS; - if(info->num_frames>VID_PLAY_MAXFRAMES) info->num_frames=VID_PLAY_MAXFRAMES; - if(info->num_frames==1) besr.double_buff=0; - else besr.double_buff=1; - radeon_compute_framesize(info); - - rgb_size = radeon_get_xres()*radeon_get_yres()*((radeon_vid_get_dbpp()+7)/8); - nfr = info->num_frames; - radeon_video_size = radeon_ram_size; -#ifdef RADEON_ENABLE_BM - if(def_cap.flags & FLAG_DMA) - { - /* every descriptor describes one 4K page and takes 16 bytes in memory - Note: probably it's ont good idea to locate them in video memory - but as initial release it's OK */ - radeon_video_size -= radeon_ram_size * sizeof(bm_list_descriptor) / 4096; - radeon_dma_desc_base = (void *) pci_info.base0 + radeon_video_size; - } -#endif - for(;nfr>0; nfr--) - { - radeon_overlay_off = radeon_video_size - info->frame_size*nfr; - radeon_overlay_off &= 0xffff0000; - if(radeon_overlay_off >= (int)rgb_size ) break; - } - if(nfr <= 3) - { - nfr = info->num_frames; - for(;nfr>0; nfr--) - { - radeon_overlay_off = radeon_video_size - info->frame_size*nfr; - radeon_overlay_off &= 0xffff0000; - if(radeon_overlay_off > 0) break; - } - } - if(nfr <= 0) return EINVAL; - info->num_frames = nfr; - besr.vid_nbufs = info->num_frames; - info->dga_addr = (char *)radeon_mem_base + radeon_overlay_off; - radeon_vid_init_video(info); - return 0; -} - -int VIDIX_NAME(vixPlaybackOn)( void ) -{ -#ifdef RAGE128 - unsigned dw,dh; -#endif - radeon_vid_display_video(); -#ifdef RAGE128 - dh = (besr.y_x_end >> 16) - (besr.y_x_start >> 16); - dw = (besr.y_x_end & 0xFFFF) - (besr.y_x_start & 0xFFFF); - if(dw == radeon_get_xres() || dh == radeon_get_yres()) radeon_vid_exclusive(); - else radeon_vid_non_exclusive(); -#endif - return 0; -} - -int VIDIX_NAME(vixPlaybackOff)( void ) -{ - radeon_vid_stop_video(); - return 0; -} - -int VIDIX_NAME(vixPlaybackFrameSelect)(unsigned frame) -{ - uint32_t off[6]; - int prev_frame= (frame-1+besr.vid_nbufs) % besr.vid_nbufs; - /* - buf3-5 always should point onto second buffer for better - deinterlacing and TV-in - */ - if(!besr.double_buff) return 0; - if(frame > besr.vid_nbufs) frame = besr.vid_nbufs-1; - if(prev_frame > (int)besr.vid_nbufs) prev_frame = besr.vid_nbufs-1; - off[0] = besr.vid_buf_base_adrs_y[frame]; - off[1] = besr.vid_buf_base_adrs_v[frame]; - off[2] = besr.vid_buf_base_adrs_u[frame]; - off[3] = besr.vid_buf_base_adrs_y[prev_frame]; - off[4] = besr.vid_buf_base_adrs_v[prev_frame]; - off[5] = besr.vid_buf_base_adrs_u[prev_frame]; - radeon_fifo_wait(8); - OUTREG(OV0_REG_LOAD_CNTL, REG_LD_CTL_LOCK); - radeon_engine_idle(); - while(!(INREG(OV0_REG_LOAD_CNTL)®_LD_CTL_LOCK_READBACK)); - OUTREG(OV0_VID_BUF0_BASE_ADRS, off[0]); - OUTREG(OV0_VID_BUF1_BASE_ADRS, off[1]); - OUTREG(OV0_VID_BUF2_BASE_ADRS, off[2]); - OUTREG(OV0_VID_BUF3_BASE_ADRS, off[3]); - OUTREG(OV0_VID_BUF4_BASE_ADRS, off[4]); - OUTREG(OV0_VID_BUF5_BASE_ADRS, off[5]); - OUTREG(OV0_REG_LOAD_CNTL, 0); - if(besr.vid_nbufs == 2) radeon_wait_vsync(); - if(__verbose > VERBOSE_LEVEL) radeon_vid_dump_regs(); - return 0; -} - -vidix_video_eq_t equal = -{ - VEQ_CAP_BRIGHTNESS | VEQ_CAP_SATURATION -#ifndef RAGE128 - | VEQ_CAP_CONTRAST | VEQ_CAP_HUE | VEQ_CAP_RGB_INTENSITY -#endif - , - 0, 0, 0, 0, 0, 0, 0, 0 }; - -int VIDIX_NAME(vixPlaybackGetEq)( vidix_video_eq_t * eq) -{ - memcpy(eq,&equal,sizeof(vidix_video_eq_t)); - return 0; -} - -#ifndef RAGE128 -#define RTFSaturation(a) (1.0 + ((a)*1.0)/1000.0) -#define RTFBrightness(a) (((a)*1.0)/2000.0) -#define RTFIntensity(a) (((a)*1.0)/2000.0) -#define RTFContrast(a) (1.0 + ((a)*1.0)/1000.0) -#define RTFHue(a) (((a)*3.1416)/1000.0) -#define RTFCheckParam(a) {if((a)<-1000) (a)=-1000; if((a)>1000) (a)=1000;} -#endif - -int VIDIX_NAME(vixPlaybackSetEq)( const vidix_video_eq_t * eq) -{ -#ifdef RAGE128 - int br,sat; -#else - int itu_space; -#endif - if(eq->cap & VEQ_CAP_BRIGHTNESS) equal.brightness = eq->brightness; - if(eq->cap & VEQ_CAP_CONTRAST) equal.contrast = eq->contrast; - if(eq->cap & VEQ_CAP_SATURATION) equal.saturation = eq->saturation; - if(eq->cap & VEQ_CAP_HUE) equal.hue = eq->hue; - if(eq->cap & VEQ_CAP_RGB_INTENSITY) - { - equal.red_intensity = eq->red_intensity; - equal.green_intensity = eq->green_intensity; - equal.blue_intensity = eq->blue_intensity; - } - equal.flags = eq->flags; -#ifdef RAGE128 - br = equal.brightness * 64 / 1000; - if(br < -64) br = -64; if(br > 63) br = 63; - sat = (equal.saturation*31 + 31000) / 2000; - if(sat < 0) sat = 0; if(sat > 31) sat = 31; - OUTREG(OV0_COLOUR_CNTL, (br & 0x7f) | (sat << 8) | (sat << 16)); -#else - itu_space = equal.flags == VEQ_FLG_ITU_R_BT_709 ? 1 : 0; - RTFCheckParam(equal.brightness); - RTFCheckParam(equal.saturation); - RTFCheckParam(equal.contrast); - RTFCheckParam(equal.hue); - RTFCheckParam(equal.red_intensity); - RTFCheckParam(equal.green_intensity); - RTFCheckParam(equal.blue_intensity); - radeon_set_transform(RTFBrightness(equal.brightness), - RTFContrast(equal.contrast), - RTFSaturation(equal.saturation), - RTFHue(equal.hue), - RTFIntensity(equal.red_intensity), - RTFIntensity(equal.green_intensity), - RTFIntensity(equal.blue_intensity), - itu_space); -#endif - return 0; -} - -int VIDIX_NAME(vixPlaybackSetDeint)( const vidix_deinterlace_t * info) -{ - unsigned sflg; - switch(info->flags) - { - default: - case CFG_NON_INTERLACED: - besr.deinterlace_on = 0; - break; - case CFG_EVEN_ODD_INTERLACING: - case CFG_INTERLACED: - besr.deinterlace_on = 1; - besr.deinterlace_pattern = 0x900AAAAA; - break; - case CFG_ODD_EVEN_INTERLACING: - besr.deinterlace_on = 1; - besr.deinterlace_pattern = 0x00055555; - break; - case CFG_UNIQUE_INTERLACING: - besr.deinterlace_on = 1; - besr.deinterlace_pattern = info->deinterlace_pattern; - break; - } - OUTREG(OV0_REG_LOAD_CNTL, REG_LD_CTL_LOCK); - radeon_engine_idle(); - while(!(INREG(OV0_REG_LOAD_CNTL)®_LD_CTL_LOCK_READBACK)); - radeon_fifo_wait(15); - sflg = INREG(OV0_SCALE_CNTL); - if(besr.deinterlace_on) - { - OUTREG(OV0_SCALE_CNTL,sflg | SCALER_ADAPTIVE_DEINT); - OUTREG(OV0_DEINTERLACE_PATTERN,besr.deinterlace_pattern); - } - else OUTREG(OV0_SCALE_CNTL,sflg & (~SCALER_ADAPTIVE_DEINT)); - OUTREG(OV0_REG_LOAD_CNTL, 0); - return 0; -} - -int VIDIX_NAME(vixPlaybackGetDeint)( vidix_deinterlace_t * info) -{ - if(!besr.deinterlace_on) info->flags = CFG_NON_INTERLACED; - else - { - info->flags = CFG_UNIQUE_INTERLACING; - info->deinterlace_pattern = besr.deinterlace_pattern; - } - return 0; -} - - -/* Graphic keys */ -static vidix_grkey_t radeon_grkey; - -static void set_gr_key( void ) -{ - if(radeon_grkey.ckey.op == CKEY_TRUE) - { - int dbpp=radeon_vid_get_dbpp(); - - switch(dbpp) - { - case 15: -#ifndef RAGE128 - besr.graphics_key_clr= - ((radeon_grkey.ckey.blue &0xF8)) - | ((radeon_grkey.ckey.green&0xF8)<<8) - | ((radeon_grkey.ckey.red &0xF8)<<16); -#else - besr.graphics_key_clr= - ((radeon_grkey.ckey.blue &0xF8)>>3) - | ((radeon_grkey.ckey.green&0xF8)<<2) - | ((radeon_grkey.ckey.red &0xF8)<<7); -#endif - break; - case 16: -#ifndef RAGE128 - besr.graphics_key_clr= - ((radeon_grkey.ckey.blue &0xF8)) - | ((radeon_grkey.ckey.green&0xFC)<<8) - | ((radeon_grkey.ckey.red &0xF8)<<16); -#else - besr.graphics_key_clr= - ((radeon_grkey.ckey.blue &0xF8)>>3) - | ((radeon_grkey.ckey.green&0xFC)<<3) - | ((radeon_grkey.ckey.red &0xF8)<<8); -#endif - break; - case 24: - case 32: - besr.graphics_key_clr= - ((radeon_grkey.ckey.blue &0xFF)) - | ((radeon_grkey.ckey.green&0xFF)<<8) - | ((radeon_grkey.ckey.red &0xFF)<<16); - break; - default: - besr.graphics_key_msk=0; - besr.graphics_key_clr=0; - } -#ifdef RAGE128 - besr.graphics_key_msk=(1<<dbpp)-1; - besr.ckey_cntl = VIDEO_KEY_FN_TRUE|GRAPHIC_KEY_FN_NE|CMP_MIX_AND; -#else - besr.graphics_key_msk=besr.graphics_key_clr; - besr.ckey_cntl = VIDEO_KEY_FN_TRUE|CMP_MIX_AND|GRAPHIC_KEY_FN_EQ; -#endif - } - else - { - besr.graphics_key_msk=0; - besr.graphics_key_clr=0; - besr.ckey_cntl = VIDEO_KEY_FN_TRUE|GRAPHIC_KEY_FN_TRUE|CMP_MIX_AND; - } - radeon_fifo_wait(3); - OUTREG(OV0_GRAPHICS_KEY_MSK, besr.graphics_key_msk); - OUTREG(OV0_GRAPHICS_KEY_CLR, besr.graphics_key_clr); - OUTREG(OV0_KEY_CNTL,besr.ckey_cntl); -} - -int VIDIX_NAME(vixGetGrKeys)(vidix_grkey_t *grkey) -{ - memcpy(grkey, &radeon_grkey, sizeof(vidix_grkey_t)); - return(0); -} - -int VIDIX_NAME(vixSetGrKeys)(const vidix_grkey_t *grkey) -{ - memcpy(&radeon_grkey, grkey, sizeof(vidix_grkey_t)); - set_gr_key(); - return(0); -} - -#ifdef RADEON_ENABLE_BM -static int radeon_setup_frame( vidix_dma_t * dmai ) -{ - bm_list_descriptor * list = (bm_list_descriptor *)radeon_dma_desc_base; - unsigned long dest_ptr; - unsigned i,n,count; - int retval; - if(dmai->dest_offset + dmai->size > radeon_ram_size) return E2BIG; - n = dmai->size / 4096; - if(dmai->size % 4096) n++; - if((retval = bm_virt_to_bus(dmai->src,dmai->size,dma_phys_addrs)) != 0) return retval; - dest_ptr = dmai->dest_offset; - count = dmai->size; - for(i=0;i<n;i++) - { - list[i].framebuf_offset = radeon_overlay_off + dest_ptr; - list[i].sys_addr = dma_phys_addrs[i]; -#ifdef RAGE128 - list[i].command = (count > 4096 ? 4096 : count | BM_END_OF_LIST)|BM_FORCE_TO_PCI; -#else - list[i].command = (count > 4096 ? 4096 : count | DMA_GUI_COMMAND__EOL); -#endif - list[i].reserved = 0; -printf("RADEON_DMA_TABLE[%i] %X %X %X %X\n",i,list[i].framebuf_offset,list[i].sys_addr,list[i].command,list[i].reserved); - dest_ptr += 4096; - count -= 4096; - } - return 0; -} - -static int radeon_transfer_frame( void ) -{ - unsigned i; - radeon_engine_idle(); - for(i=0;i<1000;i++) INREG(BUS_CNTL); /* FlushWriteCombining */ - OUTREG(BUS_CNTL,(INREG(BUS_CNTL) | BUS_STOP_REQ_DIS)&(~BUS_MASTER_DIS)); -#ifdef RAGE128 - OUTREG(BM_CHUNK_0_VAL,0x000000FF | BM_GLOBAL_FORCE_TO_PCI); - OUTREG(BM_CHUNK_1_VAL,0x0F0F0F0F); - OUTREG(BM_VIP0_BUF,bus_addr_dma_desc|SYSTEM_TRIGGER_SYSTEM_TO_VIDEO); -// OUTREG(GEN_INT_STATUS,INREG(GEN_INT_STATUS)|0x00010000); -#else - OUTREG(MC_FB_LOCATION, - ((pci_info.base0>>16)&0xffff)| - ((pci_info.base0+INREG(CONFIG_APER_SIZE)-1)&0xffff0000)); - if((INREG(MC_AGP_LOCATION)&0xffff)!= - (((pci_info.base0+INREG(CONFIG_APER_SIZE))>>16)&0xffff)) - /*Radeon memory controller is misconfigured*/ - return EINVAL; - OUTREG(DMA_VID_ACT_DSCRPTR,bus_addr_dma_desc); -// OUTREG(GEN_INT_STATUS,INREG(GEN_INT_STATUS)|(1<<30)); -#endif - OUTREG(GEN_INT_STATUS,INREG(GEN_INT_STATUS)|0x00010000); - return 0; -} - - -int VIDIX_NAME(vixPlaybackCopyFrame)( vidix_dma_t * dmai ) -{ - int retval; - if(mlock(dmai->src,dmai->size) != 0) return errno; - retval = radeon_setup_frame(dmai); - if(retval == 0) retval = radeon_transfer_frame(); - munlock(dmai->src,dmai->size); - return retval; -} - -int VIDIX_NAME(vixQueryDMAStatus)( void ) -{ - int bm_active; -#if 1 //def RAGE128 - bm_active=(INREG(GEN_INT_STATUS)&0x00010000)==0?1:0; -#else - bm_active=(INREG(GEN_INT_STATUS)&(1<<30))==0?1:0; -#endif - return bm_active?1:0; -} -#endif diff --git a/src/video_out/vidix/drivers/savage_regs.h b/src/video_out/vidix/drivers/savage_regs.h deleted file mode 100644 index a8a44c7c3..000000000 --- a/src/video_out/vidix/drivers/savage_regs.h +++ /dev/null @@ -1,304 +0,0 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/savage/savage_regs.h,v 1.10 2001/11/04 22:17:48 alanh Exp $ */ - -#ifndef _SAVAGE_REGS_H -#define _SAVAGE_REGS_H - -/* These are here until xf86PciInfo.h is updated. */ - -#ifndef PCI_CHIP_S3TWISTER_P -#define PCI_CHIP_S3TWISTER_P 0x8d01 -#endif -#ifndef PCI_CHIP_S3TWISTER_K -#define PCI_CHIP_S3TWISTER_K 0x8d02 -#endif -#ifndef PCI_CHIP_SUPSAV_MX128 -#define PCI_CHIP_SUPSAV_MX128 0x8c22 -#define PCI_CHIP_SUPSAV_MX64 0x8c24 -#define PCI_CHIP_SUPSAV_MX64C 0x8c26 -#define PCI_CHIP_SUPSAV_IX128SDR 0x8c2a -#define PCI_CHIP_SUPSAV_IX128DDR 0x8c2b -#define PCI_CHIP_SUPSAV_IX64SDR 0x8c2c -#define PCI_CHIP_SUPSAV_IX64DDR 0x8c2d -#define PCI_CHIP_SUPSAV_IXCSDR 0x8c2e -#define PCI_CHIP_SUPSAV_IXCDDR 0x8c2f -#endif -#ifndef PCI_CHIP_PROSAVAGE_DDR -#define PCI_CHIP_PROSAVAGE_DDR 0x8d03 -#define PCI_CHIP_PROSAVAGE_DDRK 0x8d04 -#endif - -#define S3_SAVAGE3D_SERIES(chip) ((chip>=S3_SAVAGE3D) && (chip<=S3_SAVAGE_MX)) - -#define S3_SAVAGE4_SERIES(chip) ((chip==S3_SAVAGE4) || (chip==S3_PROSAVAGE)) - -#define S3_SAVAGE_MOBILE_SERIES(chip) ((chip==S3_SAVAGE_MX) || (chip==S3_SUPERSAVAGE)) - -#define S3_SAVAGE_SERIES(chip) ((chip>=S3_SAVAGE3D) && (chip<=S3_SAVAGE2000)) - - -/* Chip tags. These are used to group the adapters into - * related families. - */ - - -enum S3CHIPTAGS { - S3_UNKNOWN = 0, - S3_SAVAGE3D, - S3_SAVAGE_MX, - S3_SAVAGE4, - S3_PROSAVAGE, - S3_SUPERSAVAGE, - S3_SAVAGE2000, - S3_LAST -}; - -typedef struct { - unsigned int mode, refresh; - unsigned char SR08, SR0E, SR0F; - unsigned char SR10, SR11, SR12, SR13, SR15, SR18, SR1B, SR29, SR30; - unsigned char SR54[8]; - unsigned char Clock; - unsigned char CR31, CR32, CR33, CR34, CR36, CR3A, CR3B, CR3C; - unsigned char CR40, CR41, CR42, CR43, CR45; - unsigned char CR50, CR51, CR53, CR55, CR58, CR5B, CR5D, CR5E; - unsigned char CR60, CR63, CR65, CR66, CR67, CR68, CR69, CR6D, CR6F; - unsigned char CR86, CR88; - unsigned char CR90, CR91, CRB0; - unsigned int STREAMS[22]; /* yuck, streams regs */ - unsigned int MMPR0, MMPR1, MMPR2, MMPR3; -} SavageRegRec, *SavageRegPtr; - - - -#define BIOS_BSIZE 1024 -#define BIOS_BASE 0xc0000 - -#define SAVAGE_NEWMMIO_REGBASE_S3 0x1000000 /* 16MB */ -#define SAVAGE_NEWMMIO_REGBASE_S4 0x0000000 -#define SAVAGE_NEWMMIO_REGSIZE 0x0080000 /* 512kb */ -#define SAVAGE_NEWMMIO_VGABASE 0x8000 - -#define BASE_FREQ 14.31818 - -#define FIFO_CONTROL_REG 0x8200 -#define MIU_CONTROL_REG 0x8204 -#define STREAMS_TIMEOUT_REG 0x8208 -#define MISC_TIMEOUT_REG 0x820c - -/* Stream Processor 1 */ - -/* Primary Stream 1 Frame Buffer Address 0 */ -#define PRI_STREAM_FBUF_ADDR0 0x81c0 -/* Primary Stream 1 Frame Buffer Address 0 */ -#define PRI_STREAM_FBUF_ADDR1 0x81c4 -/* Primary Stream 1 Stride */ -#define PRI_STREAM_STRIDE 0x81c8 -/* Primary Stream 1 Frame Buffer Size */ -#define PRI_STREAM_BUFFERSIZE 0x8214 - -/* Secondary stream 1 Color/Chroma Key Control */ -#define SEC_STREAM_CKEY_LOW 0x8184 -/* Secondary stream 1 Chroma Key Upper Bound */ -#define SEC_STREAM_CKEY_UPPER 0x8194 -/* Blend Control of Secondary Stream 1 & 2 */ -#define BLEND_CONTROL 0x8190 -/* Secondary Stream 1 Color conversion/Adjustment 1 */ -#define SEC_STREAM_COLOR_CONVERT1 0x8198 -/* Secondary Stream 1 Color conversion/Adjustment 2 */ -#define SEC_STREAM_COLOR_CONVERT2 0x819c -/* Secondary Stream 1 Color conversion/Adjustment 3 */ -#define SEC_STREAM_COLOR_CONVERT3 0x81e4 -/* Secondary Stream 1 Horizontal Scaling */ -#define SEC_STREAM_HSCALING 0x81a0 -/* Secondary Stream 1 Frame Buffer Size */ -#define SEC_STREAM_BUFFERSIZE 0x81a8 -/* Secondary Stream 1 Horizontal Scaling Normalization (2K only) */ -#define SEC_STREAM_HSCALE_NORMALIZE 0x81ac -/* Secondary Stream 1 Horizontal Scaling */ -#define SEC_STREAM_VSCALING 0x81e8 -/* Secondary Stream 1 Frame Buffer Address 0 */ -#define SEC_STREAM_FBUF_ADDR0 0x81d0 -/* Secondary Stream 1 Frame Buffer Address 1 */ -#define SEC_STREAM_FBUF_ADDR1 0x81d4 -/* Secondary Stream 1 Frame Buffer Address 2 */ -#define SEC_STREAM_FBUF_ADDR2 0x81ec -/* Secondary Stream 1 Stride */ -#define SEC_STREAM_STRIDE 0x81d8 -/* Secondary Stream 1 Window Start Coordinates */ -#define SEC_STREAM_WINDOW_START 0x81f8 -/* Secondary Stream 1 Window Size */ -#define SEC_STREAM_WINDOW_SZ 0x81fc -/* Secondary Streams Tile Offset */ -#define SEC_STREAM_TILE_OFF 0x821c -/* Secondary Stream 1 Opaque Overlay Control */ -#define SEC_STREAM_OPAQUE_OVERLAY 0x81dc - - -/* Stream Processor 2 */ - -/* Primary Stream 2 Frame Buffer Address 0 */ -#define PRI_STREAM2_FBUF_ADDR0 0x81b0 -/* Primary Stream 2 Frame Buffer Address 1 */ -#define PRI_STREAM2_FBUF_ADDR1 0x81b4 -/* Primary Stream 2 Stride */ -#define PRI_STREAM2_STRIDE 0x81b8 -/* Primary Stream 2 Frame Buffer Size */ -#define PRI_STREAM2_BUFFERSIZE 0x8218 - -/* Secondary Stream 2 Color/Chroma Key Control */ -#define SEC_STREAM2_CKEY_LOW 0x8188 -/* Secondary Stream 2 Chroma Key Upper Bound */ -#define SEC_STREAM2_CKEY_UPPER 0x818c -/* Secondary Stream 2 Horizontal Scaling */ -#define SEC_STREAM2_HSCALING 0x81a4 -/* Secondary Stream 2 Horizontal Scaling */ -#define SEC_STREAM2_VSCALING 0x8204 -/* Secondary Stream 2 Frame Buffer Size */ -#define SEC_STREAM2_BUFFERSIZE 0x81ac -/* Secondary Stream 2 Frame Buffer Address 0 */ -#define SEC_STREAM2_FBUF_ADDR0 0x81bc -/* Secondary Stream 2 Frame Buffer Address 1 */ -#define SEC_STREAM2_FBUF_ADDR1 0x81e0 -/* Secondary Stream 2 Frame Buffer Address 2 */ -#define SEC_STREAM2_FBUF_ADDR2 0x8208 -/* Multiple Buffer/LPB and Secondary Stream 2 Stride */ -#define SEC_STREAM2_STRIDE_LPB 0x81cc -/* Secondary Stream 2 Color conversion/Adjustment 1 */ -#define SEC_STREAM2_COLOR_CONVERT1 0x81f0 -/* Secondary Stream 2 Color conversion/Adjustment 2 */ -#define SEC_STREAM2_COLOR_CONVERT2 0x81f4 -/* Secondary Stream 2 Color conversion/Adjustment 3 */ -#define SEC_STREAM2_COLOR_CONVERT3 0x8200 -/* Secondary Stream 2 Window Start Coordinates */ -#define SEC_STREAM2_WINDOW_START 0x820c -/* Secondary Stream 2 Window Size */ -#define SEC_STREAM2_WINDOW_SZ 0x8210 -/* Secondary Stream 2 Opaque Overlay Control */ -#define SEC_STREAM2_OPAQUE_OVERLAY 0x8180 - - -/* savage 2000 */ -#define SEC_STREAM_COLOR_CONVERT0_2000 0x8198 -#define SEC_STREAM_COLOR_CONVERT1_2000 0x819c -#define SEC_STREAM_COLOR_CONVERT2_2000 0x81e0 -#define SEC_STREAM_COLOR_CONVERT3_2000 0x81e4 - -#define SUBSYS_STAT_REG 0x8504 - -#define SRC_BASE 0xa4d4 -#define DEST_BASE 0xa4d8 -#define CLIP_L_R 0xa4dc -#define CLIP_T_B 0xa4e0 -#define DEST_SRC_STR 0xa4e4 -#define MONO_PAT_0 0xa4e8 -#define MONO_PAT_1 0xa4ec - -/* Constants for CR69. */ - -#define CRT_ACTIVE 0x01 -#define LCD_ACTIVE 0x02 -#define TV_ACTIVE 0x04 -#define CRT_ATTACHED 0x10 -#define LCD_ATTACHED 0x20 -#define TV_ATTACHED 0x40 - - -/* - * reads from SUBSYS_STAT - */ -#define STATUS_WORD0 (INREG(0x48C00)) -#define ALT_STATUS_WORD0 (INREG(0x48C60)) -#define MAXLOOP 0xffffff -#define IN_SUBSYS_STAT() (INREG(SUBSYS_STAT_REG)) - -#define MAXFIFO 0x7f00 - -/* - * NOTE: don't remove 'VGAIN8(vgaCRIndex);'. - * If not present it will cause lockups on Savage4. - * Ask S3, why. - */ -/*#define VerticalRetraceWait() \ -{ \ - VGAIN8(0x3d0+4); \ - VGAOUT8(0x3d0+4, 0x17); \ - if (VGAIN8(0x3d0+5) & 0x80) { \ - while ((VGAIN8(0x3d0 + 0x0a) & 0x08) == 0x08) ; \ - while ((VGAIN8(0x3d0 + 0x0a) & 0x08) == 0x00) ; \ - } \ -} -*/ - -#define VerticalRetraceWait() \ -do { \ - VGAIN8(0x3d4); \ - VGAOUT8(0x3d4, 0x17); \ - if (VGAIN8(0x3d5) & 0x80) { \ - int i = 0x10000; \ - while ((VGAIN8(0x3da) & 0x08) == 0x08 && i--) ; \ - i = 0x10000; \ - while ((VGAIN8(0x3da) & 0x08) == 0x00 && i--) ; \ - } \ -} while (0) - - -#define I2C_REG 0xa0 -#define InI2CREG(a) \ -{ \ - VGAOUT8(0x3d0 + 4, I2C_REG); \ - a = VGAIN8(0x3d0 + 5); \ -} - -#define OutI2CREG(a) \ -{ \ - VGAOUT8(0x3d0 + 4, I2C_REG); \ - VGAOUT8(0x3d0 + 5, a); \ -} - -#define HZEXP_COMP_1 0x54 -#define HZEXP_BORDER 0x58 -#define HZEXP_FACTOR_IGA1 0x59 - -#define VTEXP_COMP_1 0x56 -#define VTEXP_BORDER 0x5a -#define VTEXP_FACTOR_IGA1 0x5b - -#define EC1_CENTER_ON 0x10 -#define EC1_EXPAND_ON 0x0c - -#define MODE_24 24 - -#if (MODE_24 == 32) -# define BYTES_PP24 4 -#else -# define BYTES_PP24 3 -#endif - -#define OVERLAY_DEPTH 16 - -#define STREAMS_MODE32 0x7 -#define STREAMS_MODE24 0x6 -#define STREAMS_MODE16 0x5 /* @@@ */ - - -#define DEPTH_BPP(depth) (depth == 24 ? (BYTES_PP24 << 3) : (depth + 7) & ~0x7) -#define DEPTH_2ND(depth) (depth > 8 ? depth\ - : OVERLAY_DEPTH) -#define SSTREAMS_MODE(bpp) (bpp > 16 ? (bpp > 24 ? STREAMS_MODE32 :\ - STREAMS_MODE24) : STREAMS_MODE16) - -#define HSCALING_Shift 0 -#define HSCALING_Mask (((1L << 16)-1) << HSCALING_Shift) -#define HSCALING(w0,w1) ((((unsigned int)(((double)w0/(double)w1) * (1 << 15))) \ - << HSCALING_Shift) \ - & HSCALING_Mask) - -#define VSCALING_Shift 0 -#define VSCALING_Mask (((1L << 20)-1) << VSCALING_Shift) -#define VSCALING(h0,h1) ((((unsigned int) (((double)h0/(double)h1) * (1 << 15))) \ - << VSCALING_Shift) \ - & VSCALING_Mask) - - -#endif /* _SAVAGE_REGS_H */ - diff --git a/src/video_out/vidix/drivers/savage_vid.c b/src/video_out/vidix/drivers/savage_vid.c deleted file mode 100644 index 2ac76198d..000000000 --- a/src/video_out/vidix/drivers/savage_vid.c +++ /dev/null @@ -1,1472 +0,0 @@ -/* - Driver for S3 Savage Series - - Copyright (C) 2004 by Reza Jelveh - - Based on the X11 driver and nvidia vid - - Thanks to Alex Deucher for Support - - 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 - - Changes: - 2004-11-09 - Initial version - - To Do: - -*/ - - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include <unistd.h> -#include <math.h> - -#include "vidix.h" -#include "fourcc.h" -#include "libdha.h" -#include "pci_ids.h" -#include "pci_names.h" - -#include "savage_regs.h" - - -#define VF_STREAMS_ON 0x0001 -#define BASE_PAD 0xf -#define FRAMEBUFFER_SIZE 1024*2000*4 -/************************************** - S3 streams processor -**************************************/ - -#define EXT_MISC_CTRL2 0x67 - -/* New streams */ - -/* CR67[2] = 1 : enable stream 1 */ -#define ENABLE_STREAM1 0x04 -/* CR67[1] = 1 : enable stream 2 */ -#define ENABLE_STREAM2 0x02 -/* mask to clear CR67[2,1] */ -#define NO_STREAMS 0xF9 -/* CR67[3] = 1 : Mem-mapped regs */ -#define USE_MM_FOR_PRI_STREAM 0x08 - -#define HDM_SHIFT 16 -#define HDSCALE_4 (2 << HDM_SHIFT) -#define HDSCALE_8 (3 << HDM_SHIFT) -#define HDSCALE_16 (4 << HDM_SHIFT) -#define HDSCALE_32 (5 << HDM_SHIFT) -#define HDSCALE_64 (6 << HDM_SHIFT) - -/* Old Streams */ - -#define ENABLE_STREAMS_OLD 0x0c -#define NO_STREAMS_OLD 0xf3 -/* CR69[0] = 1 : Mem-mapped regs */ -#define USE_MM_FOR_PRI_STREAM_OLD 0x01 - -static void SavageStreamsOn(void); - -/* - * There are two different streams engines used in the Savage line. - * The old engine is in the 3D, 4, Pro, and Twister. - * The new engine is in the 2000, MX, IX, and Super. - */ - - -/* streams registers for old engine */ -#define PSTREAM_CONTROL_REG 0x8180 -#define COL_CHROMA_KEY_CONTROL_REG 0x8184 -#define SSTREAM_CONTROL_REG 0x8190 -#define CHROMA_KEY_UPPER_BOUND_REG 0x8194 -#define SSTREAM_STRETCH_REG 0x8198 -#define COLOR_ADJUSTMENT_REG 0x819C -#define BLEND_CONTROL_REG 0x81A0 -#define PSTREAM_FBADDR0_REG 0x81C0 -#define PSTREAM_FBADDR1_REG 0x81C4 -#define PSTREAM_STRIDE_REG 0x81C8 -#define DOUBLE_BUFFER_REG 0x81CC -#define SSTREAM_FBADDR0_REG 0x81D0 -#define SSTREAM_FBADDR1_REG 0x81D4 -#define SSTREAM_STRIDE_REG 0x81D8 -#define SSTREAM_VSCALE_REG 0x81E0 -#define SSTREAM_VINITIAL_REG 0x81E4 -#define SSTREAM_LINES_REG 0x81E8 -#define STREAMS_FIFO_REG 0x81EC -#define PSTREAM_WINDOW_START_REG 0x81F0 -#define PSTREAM_WINDOW_SIZE_REG 0x81F4 -#define SSTREAM_WINDOW_START_REG 0x81F8 -#define SSTREAM_WINDOW_SIZE_REG 0x81FC -#define FIFO_CONTROL 0x8200 -#define PSTREAM_FBSIZE_REG 0x8300 -#define SSTREAM_FBSIZE_REG 0x8304 -#define SSTREAM_FBADDR2_REG 0x8308 - -#define OS_XY(x,y) (((x+1)<<16)|(y+1)) -#define OS_WH(x,y) (((x-1)<<16)|(y)) - -#define PCI_COMMAND_MEM 0x2 -#define MAX_FRAMES 3 -/** - * @brief Information on PCI device. - */ -pciinfo_t pci_info; - -/** - * @brief Unichrome driver colorkey settings. - */ -/* static vidix_grkey_t savage_grkey; */ - -/* static int frames[VID_PLAY_MAXFRAMES]; */ -uint8_t *vio; -uint8_t mclk_save[3]; - -#define outb(reg,val) OUTPORT8(reg,val) -#define inb(reg) INPORT8(reg) -#define outw(reg,val) OUTPORT16(reg,val) -#define inw(reg) INPORT16(reg) -#define outl(reg,val) OUTPORT32(reg,val) -#define inl(reg) INPORT32(reg) - - -/* - * PCI-Memory IO access macros. - */ -#define VID_WR08(p,i,val) (((uint8_t *)(p))[(i)]=(val)) -#define VID_RD08(p,i) (((uint8_t *)(p))[(i)]) - -#define VID_WR32(p,i,val) (((uint32_t *)(p))[(i)/4]=(val)) -#define VID_RD32(p,i) (((uint32_t *)(p))[(i)/4]) - -#ifndef USE_RMW_CYCLES -/* - * Can be used to inhibit READ-MODIFY-WRITE cycles. On by default. - */ - -#define MEM_BARRIER() __asm__ __volatile__ ("" : : : "memory") - -#undef VID_WR08 -#define VID_WR08(p,i,val) ({ MEM_BARRIER(); ((uint8_t *)(p))[(i)]=(val); }) -#undef VID_RD08 -#define VID_RD08(p,i) ({ MEM_BARRIER(); ((uint8_t *)(p))[(i)]; }) - -#undef VID_WR16 -#define VID_WR16(p,i,val) ({ MEM_BARRIER(); ((uint16_t *)(p))[(i)/2]=(val); }) -#undef VID_RD16 -#define VID_RD16(p,i) ({ MEM_BARRIER(); ((uint16_t *)(p))[(i)/2]; }) - -#undef VID_WR32 -#define VID_WR32(p,i,val) ({ MEM_BARRIER(); ((uint32_t *)(p))[(i)/4]=(val); }) -#undef VID_RD32 -#define VID_RD32(p,i) ({ MEM_BARRIER(); ((uint32_t *)(p))[(i)/4]; }) -#endif /* USE_RMW_CYCLES */ - -#define VID_AND32(p,i,val) VID_WR32(p,i,VID_RD32(p,i)&(val)) -#define VID_OR32(p,i,val) VID_WR32(p,i,VID_RD32(p,i)|(val)) -#define VID_XOR32(p,i,val) VID_WR32(p,i,VID_RD32(p,i)^(val)) - - -/* from x driver */ - -#define VGAIN8(addr) VID_RD08(info->control_base+0x8000, addr) -#define VGAIN16(addr) VID_RD16(info->control_base+0x8000, addr) -#define VGAIN(addr) VID_RD32(info->control_base+0x8000, addr) - -#define VGAOUT8(addr,val) VID_WR08(info->control_base+0x8000, addr, val) -#define VGAOUT16(addr,val) VID_WR16(info->control_base+0x8000, addr, val) -#define VGAOUT(addr,val) VID_WR32(info->control_base+0x8000, addr, val) - -#define INREG(addr) VID_RD32(info->control_base, addr) -#define OUTREG(addr,val) VID_WR32(info->control_base, addr, val) -#define INREG8(addr) VID_RD08(info->control_base, addr) -#define OUTREG8(addr,val) VID_WR08(info->control_base, addr, val) -#define INREG16(addr) VID_RD16(info->control_base, addr) -#define OUTREG16(addr,val) VID_WR16(info->control_base, addr, val) - -#define ALIGN_TO(v, n) (((v) + (n-1)) & ~(n-1)) - - -void debugout(unsigned int addr, unsigned int val); - - -struct savage_chip { - volatile uint32_t *PMC; /* general control */ - volatile uint32_t *PME; /* multimedia port */ - volatile uint32_t *PFB; /* framebuffer control */ - volatile uint32_t *PVIDEO; /* overlay control */ - volatile uint8_t *PCIO; /* SVGA (CRTC, ATTR) registers */ - volatile uint8_t *PVIO; /* SVGA (MISC, GRAPH, SEQ) registers */ - volatile uint32_t *PRAMIN; /* instance memory */ - volatile uint32_t *PRAMHT; /* hash table */ - volatile uint32_t *PRAMFC; /* fifo context table */ - volatile uint32_t *PRAMRO; /* fifo runout table */ - volatile uint32_t *PFIFO; /* fifo control region */ - volatile uint32_t *FIFO; /* fifo channels (USER) */ - volatile uint32_t *PGRAPH; /* graphics engine */ - - int arch; /* compatible NV_ARCH_XX define */ - unsigned long fbsize; /* framebuffer size */ - void (* lock) (struct savage_chip *, int); -}; -typedef struct savage_chip savage_chip; - - -struct savage_info { - unsigned int use_colorkey; - unsigned int colorkey; /* saved xv colorkey*/ - unsigned int vidixcolorkey; /*currently used colorkey*/ - unsigned int depth; - unsigned int bpp; - unsigned int videoFlags; - unsigned int format; - unsigned int pitch; - unsigned int blendBase; - unsigned int lastKnownPitch; - unsigned int displayWidth, displayHeight; - unsigned int brightness,hue,saturation,contrast; - unsigned int src_w,src_h; - unsigned int drw_w,drw_h; /*scaled width && height*/ - unsigned int wx,wy; /*window x && y*/ - unsigned int screen_x; /*screen width*/ - unsigned int screen_y; /*screen height*/ - unsigned long buffer_size; /* size of the image buffer */ - struct savage_chip chip; /* NV architecture structure */ - void* video_base; /* virtual address of control region */ - void* control_base; /* virtual address of fb region */ - unsigned long picture_base; /* direct pointer to video picture */ - unsigned long picture_offset; /* offset of video picture in frame buffer */ -// struct savage_dma dma; /* DMA structure */ - unsigned int cur_frame; - unsigned int num_frames; /* number of buffers */ - int bps; /* bytes per line */ - void (*SavageWaitIdle) (); - void (*SavageWaitFifo) (int space); -}; -typedef struct savage_info savage_info; - - -static savage_info* info; - - -/** - * @brief Unichrome driver vidix capabilities. - */ -static vidix_capability_t savage_cap = { - "Savage/ProSavage/Twister vidix", - "Reza Jelveh <reza.jelveh@tuhh.de>", - TYPE_OUTPUT, - {0, 0, 0, 0}, - 4096, - 4096, - 4, - 4, - -1, - FLAG_UPSCALER | FLAG_DOWNSCALER, - VENDOR_S3_INC, - -1, - {0, 0, 0, 0} -}; - -struct savage_cards { - unsigned short chip_id; - unsigned short arch; -}; - - -static -unsigned int GetBlendForFourCC( int id ) -{ - switch( id ) { - case IMGFMT_YUY2: - case IMGFMT_YV12: - case IMGFMT_I420: - return 1; - case IMGFMT_Y211: - return 4; - case IMGFMT_RGB15: - return 3; - case IMGFMT_RGB16: - return 5; - default: - return 0; - } -} - -/** - * @brief list of card IDs compliant with the Unichrome driver . - */ -static struct savage_cards savage_card_ids[] = { - /*[ProSavage PN133] AGP4X VGA Controller (Twister)*/ - { PCI_CHIP_S3TWISTER_P, S3_PROSAVAGE }, - /*[ProSavage KN133] AGP4X VGA Controller (TwisterK)*/ - { PCI_CHIP_S3TWISTER_K, S3_PROSAVAGE }, - /*ProSavage DDR*/ - { PCI_CHIP_PROSAVAGE_DDR , S3_PROSAVAGE }, - /*[ProSavageDDR P4M266 K] */ - { PCI_CHIP_PROSAVAGE_DDRK , S3_PROSAVAGE }, -}; - -static void SavageSetColorOld(void) -{ - - - if( - (info->format == IMGFMT_RGB15) || - (info->format == IMGFMT_RGB16) - ) - { - OUTREG( COLOR_ADJUSTMENT_REG, 0 ); - } - else - { - /* Change 0..255 into 0..15 */ - long sat = info->saturation * 16 / 256; - double hue = info->hue * 0.017453292; - unsigned long hs1 = ((long)(sat * cos(hue))) & 0x1f; - unsigned long hs2 = ((long)(sat * sin(hue))) & 0x1f; - - OUTREG( COLOR_ADJUSTMENT_REG, - 0x80008000 | - (info->brightness + 128) | - ((info->contrast & 0xf8) << (12-7)) | - (hs1 << 16) | - (hs2 << 24) - ); - debugout( COLOR_ADJUSTMENT_REG, - 0x80008000 | - (info->brightness + 128) | - ((info->contrast & 0xf8) << (12-7)) | - (hs1 << 16) | - (hs2 << 24) - ); - - } -} - -static void SavageSetColorKeyOld(void) -{ - int red, green, blue; - - /* Here, we reset the colorkey and all the controls. */ - - red = (info->vidixcolorkey & 0x00FF0000) >> 16; - green = (info->vidixcolorkey & 0x0000FF00) >> 8; - blue = info->vidixcolorkey & 0x000000FF; - - if( !info->vidixcolorkey ) { - printf("SavageSetColorKey disabling colorkey\n"); - OUTREG( COL_CHROMA_KEY_CONTROL_REG, 0 ); - OUTREG( CHROMA_KEY_UPPER_BOUND_REG, 0 ); - OUTREG( BLEND_CONTROL_REG, 0 ); - } - else { - switch (info->depth) { - // FIXME: isnt fixed yet - case 8: - OUTREG( COL_CHROMA_KEY_CONTROL_REG, - 0x37000000 | (info->vidixcolorkey & 0xFF) ); - OUTREG( CHROMA_KEY_UPPER_BOUND_REG, - 0x00000000 | (info->vidixcolorkey & 0xFF) ); - break; - case 15: - /* 15 bpp 555 */ - red&=0x1f; - green&=0x1f; - blue&=0x1f; - OUTREG( COL_CHROMA_KEY_CONTROL_REG, - 0x05000000 | (red<<19) | (green<<11) | (blue<<3) ); - OUTREG( CHROMA_KEY_UPPER_BOUND_REG, - 0x00000000 | (red<<19) | (green<<11) | (blue<<3) ); - break; - case 16: - /* 16 bpp 565 */ - red&=0x1f; - green&=0x3f; - blue&=0x1f; - OUTREG( COL_CHROMA_KEY_CONTROL_REG, - 0x16000000 | (red<<19) | (green<<10) | (blue<<3) ); - OUTREG( CHROMA_KEY_UPPER_BOUND_REG, - 0x00020002 | (red<<19) | (green<<10) | (blue<<3) ); - break; - case 24: - /* 24 bpp 888 */ - OUTREG( COL_CHROMA_KEY_CONTROL_REG, - 0x17000000 | (red<<16) | (green<<8) | (blue) ); - OUTREG( CHROMA_KEY_UPPER_BOUND_REG, - 0x00000000 | (red<<16) | (green<<8) | (blue) ); - break; - } - - /* We use destination colorkey */ - OUTREG( BLEND_CONTROL_REG, 0x05000000 ); - } -} - - -static void SavageDisplayVideoOld(void) -{ - int vgaCRIndex, vgaCRReg, vgaIOBase; - unsigned int ssControl; - int cr92; - - - vgaIOBase = 0x3d0; - vgaCRIndex = vgaIOBase + 4; - vgaCRReg = vgaIOBase + 5; - -// if( psav->videoFourCC != id ) -// SavageStreamsOff(pScrn); - - if( !info->videoFlags & VF_STREAMS_ON ) - { - SavageStreamsOn(); - // SavageResetVideo(); - SavageSetColorOld(); - SavageSetColorKeyOld(); - } - - - - - /* Set surface format. */ - - OUTREG(SSTREAM_CONTROL_REG,GetBlendForFourCC(info->format) << 24 | info->src_w); - - debugout(SSTREAM_CONTROL_REG,GetBlendForFourCC(info->format) << 24 | info->src_w); - - /* Calculate horizontal scale factor. */ - - //FIXME: enable scaling - OUTREG(SSTREAM_STRETCH_REG, (info->src_w << 15) / info->drw_w ); -// debugout(SSTREAM_STRETCH_REG, 1 << 15); - - OUTREG(SSTREAM_LINES_REG, info->src_h ); - debugout(SSTREAM_LINES_REG, info->src_h ); - - - OUTREG(SSTREAM_VINITIAL_REG, 0 ); - debugout(SSTREAM_VINITIAL_REG, 0 ); - /* Calculate vertical scale factor. */ - -// OUTREG(SSTREAM_VSCALE_REG, 1 << 15); - OUTREG(SSTREAM_VSCALE_REG, VSCALING(info->src_h,info->drw_h) ); - debugout(SSTREAM_VSCALE_REG, VSCALING(info->src_h,info->drw_h) ); -// OUTREG(SSTREAM_VSCALE_REG, (info->src_h << 15) / info->drw_h ); - - /* Set surface location and stride. */ - - OUTREG(SSTREAM_FBADDR0_REG, info->picture_offset ); - debugout(SSTREAM_FBADDR0_REG, info->picture_offset ); - - OUTREG(SSTREAM_FBADDR1_REG, 0 ); - debugout(SSTREAM_FBADDR1_REG, 0 ); - - OUTREG(SSTREAM_STRIDE_REG, info->pitch ); - debugout(SSTREAM_STRIDE_REG, info->pitch ); - - OUTREG(SSTREAM_WINDOW_START_REG, OS_XY(info->wx, info->wy) ); - debugout(SSTREAM_WINDOW_START_REG, OS_XY(info->wx, info->wy) ); - OUTREG(SSTREAM_WINDOW_SIZE_REG, OS_WH(info->drw_w, info->drw_h) ); - debugout(SSTREAM_WINDOW_SIZE_REG, OS_WH(info->drw_w, info->drw_h) ); - - - - ssControl = 0; - - if( info->src_w > (info->drw_w << 1) ) - { - /* BUGBUG shouldn't this be >=? */ - if( info->src_w <= (info->drw_w << 2) ) - ssControl |= HDSCALE_4; - else if( info->src_w > (info->drw_w << 3) ) - ssControl |= HDSCALE_8; - else if( info->src_w > (info->drw_w << 4) ) - ssControl |= HDSCALE_16; - else if( info->src_w > (info->drw_w << 5) ) - ssControl |= HDSCALE_32; - else if( info->src_w > (info->drw_w << 6) ) - ssControl |= HDSCALE_64; - } - - ssControl |= info->src_w; - ssControl |= (1 << 24); - - //FIXME: enable scaling - OUTREG(SSTREAM_CONTROL_REG, ssControl); - debugout(SSTREAM_CONTROL_REG, ssControl); - - // FIXME: this should actually be enabled - - info->pitch = (info->pitch + 7) / 8; - VGAOUT8(vgaCRIndex, 0x92); - cr92 = VGAIN8(vgaCRReg); - VGAOUT8(vgaCRReg, (cr92 & 0x40) | (info->pitch >> 8) | 0x80); - VGAOUT8(vgaCRIndex, 0x93); - VGAOUT8(vgaCRReg, info->pitch); - OUTREG(STREAMS_FIFO_REG, 2 | 25 << 5 | 32 << 11); - - - - -} - -static void SavageInitStreamsOld() -{ - /*unsigned long jDelta;*/ - unsigned long format = 0; - - /* - * For the OLD streams engine, several of these registers - * cannot be touched unless streams are on. Seems backwards to me; - * I'd want to set 'em up, then cut 'em loose. - */ - - - /*jDelta = pScrn->displayWidth * (pScrn->bitsPerPixel + 7) / 8;*/ - switch( info->depth ) { - case 8: format = 0 << 24; break; - case 15: format = 3 << 24; break; - case 16: format = 5 << 24; break; - case 24: format = 7 << 24; break; - } -#warning enable this again - OUTREG(PSTREAM_FBSIZE_REG, - info->screen_y * info->screen_x * (info->bpp >> 3)); - - OUTREG( PSTREAM_WINDOW_START_REG, OS_XY(0,0) ); - OUTREG( PSTREAM_WINDOW_SIZE_REG, OS_WH(info->screen_x, info->screen_y) ); - OUTREG( PSTREAM_FBADDR1_REG, 0 ); - /*OUTREG( PSTREAM_STRIDE_REG, jDelta );*/ - OUTREG( PSTREAM_CONTROL_REG, format ); - OUTREG( PSTREAM_FBADDR0_REG, 0 ); - - /*OUTREG( PSTREAM_FBSIZE_REG, jDelta * pScrn->virtualY >> 3 );*/ - - OUTREG( COL_CHROMA_KEY_CONTROL_REG, 0 ); - OUTREG( SSTREAM_CONTROL_REG, 0 ); - OUTREG( CHROMA_KEY_UPPER_BOUND_REG, 0 ); - OUTREG( SSTREAM_STRETCH_REG, 0 ); - OUTREG( COLOR_ADJUSTMENT_REG, 0 ); - OUTREG( BLEND_CONTROL_REG, 1 << 24 ); - OUTREG( DOUBLE_BUFFER_REG, 0 ); - OUTREG( SSTREAM_FBADDR0_REG, 0 ); - OUTREG( SSTREAM_FBADDR1_REG, 0 ); - OUTREG( SSTREAM_FBADDR2_REG, 0 ); - OUTREG( SSTREAM_FBSIZE_REG, 0 ); - OUTREG( SSTREAM_STRIDE_REG, 0 ); - OUTREG( SSTREAM_VSCALE_REG, 0 ); - OUTREG( SSTREAM_LINES_REG, 0 ); - OUTREG( SSTREAM_VINITIAL_REG, 0 ); -#warning is this needed? - OUTREG( SSTREAM_WINDOW_START_REG, OS_XY(0xfffe, 0xfffe) ); - OUTREG( SSTREAM_WINDOW_SIZE_REG, OS_WH(10,2) ); - -} - -static void SavageStreamsOn() -{ - unsigned char jStreamsControl; - unsigned short vgaCRIndex = 0x3d0 + 4; - unsigned short vgaCRReg = 0x3d0 + 5; - -// xf86ErrorFVerb(STREAMS_TRACE, "SavageStreamsOn\n" ); - - /* Sequence stolen from streams.c in M7 NT driver */ - - - enable_app_io (); - - /* Unlock extended registers. */ - - /* FIXME: it looks like mmaped io is broken with vgaout16 */ - VGAOUT16(vgaCRIndex, 0x4838 ); - VGAOUT16(vgaCRIndex, 0xa039); - VGAOUT16(0x3c4, 0x0608); - - - - VGAOUT8( vgaCRIndex, EXT_MISC_CTRL2 ); - - if( S3_SAVAGE_MOBILE_SERIES(info->chip.arch) ) - { -// SavageInitStreamsNew( pScrn ); - - jStreamsControl = VGAIN8( vgaCRReg ) | ENABLE_STREAM1; - - /* Wait for VBLANK. */ - VerticalRetraceWait(); - /* Fire up streams! */ - VGAOUT16( vgaCRIndex, (jStreamsControl << 8) | EXT_MISC_CTRL2 ); - /* These values specify brightness, contrast, saturation and hue. */ - OUTREG( SEC_STREAM_COLOR_CONVERT1, 0x0000C892 ); - OUTREG( SEC_STREAM_COLOR_CONVERT2, 0x00039F9A ); - OUTREG( SEC_STREAM_COLOR_CONVERT3, 0x01F1547E ); - } - else if (info->chip.arch == S3_SAVAGE2000) - { -// SavageInitStreams2000( pScrn ); - - jStreamsControl = VGAIN8( vgaCRReg ) | ENABLE_STREAM1; - - /* Wait for VBLANK. */ - VerticalRetraceWait(); - /* Fire up streams! */ - VGAOUT16( vgaCRIndex, (jStreamsControl << 8) | EXT_MISC_CTRL2 ); - /* These values specify brightness, contrast, saturation and hue. */ - OUTREG( SEC_STREAM_COLOR_CONVERT0_2000, 0x0000C892 ); - OUTREG( SEC_STREAM_COLOR_CONVERT1_2000, 0x00033400 ); - OUTREG( SEC_STREAM_COLOR_CONVERT2_2000, 0x000001CF ); - OUTREG( SEC_STREAM_COLOR_CONVERT3_2000, 0x01F1547E ); - } - else - { - jStreamsControl = VGAIN8( vgaCRReg ) | ENABLE_STREAMS_OLD; - - /* Wait for VBLANK. */ - - VerticalRetraceWait(); - - /* Fire up streams! */ - - VGAOUT16( vgaCRIndex, (jStreamsControl << 8) | EXT_MISC_CTRL2 ); - - SavageInitStreamsOld( ); - } - - /* Wait for VBLANK. */ - - VerticalRetraceWait(); - - /* Turn on secondary stream TV flicker filter, once we support TV. */ - - /* SR70 |= 0x10 */ - - info->videoFlags |= VF_STREAMS_ON; - -} - - - - -static void savage_getscreenproperties(struct savage_info *info){ - unsigned char bpp=0; - /* uint32_t width=0; unused */ - - uint32_t vgaIOBase, vgaCRIndex, vgaCRReg; - - vgaIOBase = 0x3d0; - vgaCRIndex = vgaIOBase + 4; - vgaCRReg = vgaIOBase + 5; - - - /* a little reversed from x driver source code */ - VGAOUT8(vgaCRIndex, 0x67); - bpp = VGAIN8(vgaCRReg); - - - switch (bpp&0xf0) { - case 0x00: - case 0x10: - info->depth=8; - info->bpp=8; - break; - case 0x20: - case 0x30: - info->depth=15; - info->bpp=16; - break; - case 0x40: - case 0x50: - info->depth=16; - info->bpp=16; - break; - case 0x70: - case 0xd0: - info->depth=24; - info->bpp=32; - break; - - - } - - - VGAOUT8(vgaCRIndex, 0x1); - info->screen_x = (1 + VGAIN8(vgaCRReg)) <<3; - /*get screen height*/ - /* get first 8 bits in VT_DISPLAY_END*/ - VGAOUT8(0x03D4, 0x12); - info->screen_y = VGAIN8(0x03D5); - VGAOUT8(0x03D4,0x07); - /* get 9th bit in CRTC_OVERFLOW*/ - info->screen_y |= (VGAIN8(0x03D5) &0x02)<<7; - /* and the 10th in CRTC_OVERFLOW*/ - info->screen_y |=(VGAIN8(0x03D5) &0x40)<<3; - ++info->screen_y; - - printf("screen_x = %d, screen_y = %d, bpp = %d\n",info->screen_x,info->screen_y,info->bpp); -} - - -static void SavageStreamsOff() -{ - unsigned char jStreamsControl; - unsigned short vgaCRIndex = 0x3d0 + 4; - unsigned short vgaCRReg = 0x3d0 + 5; - - - /* Unlock extended registers. */ - - VGAOUT16(vgaCRIndex, 0x4838); - VGAOUT16(vgaCRIndex, 0xa039); - VGAOUT16(0x3c4, 0x0608); - - VGAOUT8( vgaCRIndex, EXT_MISC_CTRL2 ); - if( S3_SAVAGE_MOBILE_SERIES(info->chip.arch) || - (info->chip.arch == S3_SUPERSAVAGE) || - (info->chip.arch == S3_SAVAGE2000) ) - jStreamsControl = VGAIN8( vgaCRReg ) & NO_STREAMS; - else - jStreamsControl = VGAIN8( vgaCRReg ) & NO_STREAMS_OLD; - - /* Wait for VBLANK. */ - - VerticalRetraceWait(); - - /* Kill streams. */ - - VGAOUT16(vgaCRIndex, (jStreamsControl << 8) | EXT_MISC_CTRL2 ); - - VGAOUT16(vgaCRIndex, 0x0093 ); - VGAOUT8( vgaCRIndex, 0x92 ); - VGAOUT8( vgaCRReg, VGAIN8(vgaCRReg) & 0x40 ); - - info->videoFlags &= ~VF_STREAMS_ON; -} - - -/** - * @brief Check age of driver. - * - * @return vidix version number. - */ -unsigned int -vixGetVersion (void) -{ - return (VIDIX_VERSION); -} - -/** - * @brief Find chip index in Unichrome compliant devices list. - * - * @param chip_id PCI device ID. - * - * @returns index position in savage_card_ids if successful. - * -1 if chip_id is not a compliant chipset ID. - */ - -static int find_chip(unsigned chip_id){ - unsigned i; - for(i = 0;i < sizeof(savage_card_ids)/sizeof(struct savage_cards);i++) - { - if(chip_id == savage_card_ids[i].chip_id)return i; - } - return -1; -} - -/** - * @brief Probe hardware to find some useable chipset. - * - * @param verbose specifies verbose level. - * @param force specifies force mode : driver should ignore - * device_id (danger but useful for new devices) - * - * @returns 0 if it can handle something in PC. - * a negative error code otherwise. - */ - -int vixProbe(int verbose, int force){ - pciinfo_t lst[MAX_PCI_DEVICES]; - unsigned i,num_pci; - int err; - - if (force) - printf("[savage_vid]: warning: forcing not supported yet!\n"); - err = pci_scan(lst,&num_pci); - if(err){ - printf("[savage_vid] Error occurred during pci scan: %s\n",strerror(err)); - return err; - } - else { - err = ENXIO; - for(i=0; i < num_pci; i++){ - if(lst[i].vendor == VENDOR_S3_INC) { - int idx; - const char *dname; - idx = find_chip(lst[i].device); - if(idx == -1) - continue; - dname = pci_device_name(lst[i].vendor, lst[i].device); - dname = dname ? dname : "Unknown chip"; - printf("[savage_vid] Found chip: %s\n", dname); - savage_cap.device_id = lst[i].device; - err = 0; - memcpy(&pci_info, &lst[i], sizeof(pciinfo_t)); - break; - } - } - } - if(err && verbose) printf("[savage_vid] Can't find chip\n"); - return err; -} - -/** - * @brief Initializes driver. - * - * @returns 0 if ok. - * a negative error code otherwise. - */ -int -vixInit (const char *args) -{ - int mtrr; - unsigned char config1, /* m, n, n1, n2, sr8, cr3f, cr66 = 0, */ tmp; - - static unsigned char RamSavage3D[] = { 8, 4, 4, 2 }; - static unsigned char RamSavage4[] = { 2, 4, 8, 12, 16, 32, 64, 32 }; - static unsigned char RamSavageMX[] = { 2, 8, 4, 16, 8, 16, 4, 16 }; - static unsigned char RamSavageNB[] = { 0, 2, 4, 8, 16, 32, 16, 2 }; - - int videoRam /*, videoRambytes */; - - uint32_t vgaIOBase, vgaCRIndex, vgaCRReg ; - - unsigned char val; - - vgaIOBase = 0x3d0; - vgaCRIndex = vgaIOBase + 4; - vgaCRReg = vgaIOBase + 5; - - fprintf(stderr, "vixInit enter \n"); -// //getc(stdin); - - info = (savage_info*)calloc(1,sizeof(savage_info)); - - - /* need this if we want direct outb and inb access? */ - enable_app_io (); - - /* 12mb + 32kb ? */ - /* allocate some space for control registers */ - info->chip.arch = savage_card_ids[find_chip(pci_info.device)].arch; - - if (info->chip.arch == S3_SAVAGE3D) { - info->control_base = map_phys_mem(pci_info.base0+SAVAGE_NEWMMIO_REGBASE_S3, SAVAGE_NEWMMIO_REGSIZE); - } - else { - info->control_base = map_phys_mem(pci_info.base0+SAVAGE_NEWMMIO_REGBASE_S4, SAVAGE_NEWMMIO_REGSIZE); - } - -// info->chip.PCIO = (uint8_t *) (info->control_base + SAVAGE_NEWMMIO_VGABASE); - - // FIXME: enable mmio? - val = VGAIN8 (0x3c3); - VGAOUT8 (0x3c3, val | 0x01); - val = VGAIN8 (0x3cc); - VGAOUT8 (0x3c2, val | 0x01); - - if (info->chip.arch >= S3_SAVAGE4) - { - VGAOUT8 (0x3d4, 0x40); - val = VGAIN8 (0x3d5); - VGAOUT8 (0x3d5, val | 1); - } - - - - /* unprotect CRTC[0-7] */ - VGAOUT8(vgaCRIndex, 0x11); - tmp = VGAIN8(vgaCRReg); -// printf("$########## tmp = %d\n",tmp); - VGAOUT8(vgaCRReg, tmp & 0x7f); - - - /* unlock extended regs */ - VGAOUT16(vgaCRIndex, 0x4838); - VGAOUT16(vgaCRIndex, 0xa039); - VGAOUT16(0x3c4, 0x0608); - - VGAOUT8(vgaCRIndex, 0x40); - tmp = VGAIN8(vgaCRReg); - VGAOUT8(vgaCRReg, tmp & ~0x01); - - /* unlock sys regs */ - VGAOUT8(vgaCRIndex, 0x38); - VGAOUT8(vgaCRReg, 0x48); - - /* Unlock system registers. */ - VGAOUT16(vgaCRIndex, 0x4838); - - /* Next go on to detect amount of installed ram */ - - VGAOUT8(vgaCRIndex, 0x36); /* for register CR36 (CONFG_REG1), */ - config1 = VGAIN8(vgaCRReg); /* get amount of vram installed */ - - - switch( info->chip.arch ) { - case S3_SAVAGE3D: - videoRam = RamSavage3D[ (config1 & 0xC0) >> 6 ] * 1024; - break; - - case S3_SAVAGE4: - /* - * The Savage4 has one ugly special case to consider. On - * systems with 4 banks of 2Mx32 SDRAM, the BIOS says 4MB - * when it really means 8MB. Why do it the same when you - * can do it different... - */ - VGAOUT8(0x3d4, 0x68); /* memory control 1 */ - if( (VGAIN8(0x3d5) & 0xC0) == (0x01 << 6) ) - RamSavage4[1] = 8; - - /*FALLTHROUGH*/ - - case S3_SAVAGE2000: - videoRam = RamSavage4[ (config1 & 0xE0) >> 5 ] * 1024; - break; - - case S3_SAVAGE_MX: - videoRam = RamSavageMX[ (config1 & 0x0E) >> 1 ] * 1024; - break; - - case S3_PROSAVAGE: - videoRam = RamSavageNB[ (config1 & 0xE0) >> 5 ] * 1024; - break; - - default: - /* How did we get here? */ - videoRam = 0; - break; - } - - - printf("###### videoRam = %d\n",videoRam); - info->chip.fbsize = videoRam * 1024; - - - /* reset graphics engine to avoid memory corruption */ -#if 0 - VGAOUT8 (0x3d4, 0x66); - cr66 = VGAIN8 (0x3d5); - VGAOUT8 (0x3d5, cr66 | 0x02); - udelay (10000); - - VGAOUT8 (0x3d4, 0x66); - VGAOUT8 (0x3d5, cr66 & ~0x02); /* clear reset flag */ -#endif - /* udelay (10000); */ - - /* This maps framebuffer @6MB, thus 2MB are left for video. */ - if (info->chip.arch == S3_SAVAGE3D) { - info->video_base = map_phys_mem(pci_info.base0, info->chip.fbsize); - info->picture_offset = 1024*768* 4 * ((info->chip.fbsize > 4194304)?2:1); - } - else { - info->video_base = map_phys_mem(pci_info.base1, info->chip.fbsize); - info->picture_offset = info->chip.fbsize - FRAMEBUFFER_SIZE; -// info->picture_offset = 1024*1024* 4 * 2; - } - if ( info->video_base < 0 ){ - printf("errno = %s\n", strerror(errno)); - return -1; - } - - - info->picture_base = (uint32_t) info->video_base + info->picture_offset; - - if ( info->chip.arch == S3_SAVAGE3D ){ - mtrr = mtrr_set_type(pci_info.base0, info->chip.fbsize, MTRR_TYPE_WRCOMB); - } - else{ - mtrr = mtrr_set_type(pci_info.base1, info->chip.fbsize, MTRR_TYPE_WRCOMB); - } - - if (mtrr!= 0) - printf("[savage_vid] unable to setup MTRR: %s\n", strerror(mtrr)); - else - printf("[savage_vid] MTRR set up\n"); - - /* This may trash your screen for resolutions greater than 1024x768, sorry. */ - - - savage_getscreenproperties(info); -// return -1; - info->videoFlags = 0; - - SavageStreamsOn(); - //getc(stdin); - //FIXME ADD - return 0; -} - -/** - * @brief Destroys driver. - */ -void -vixDestroy (void) -{ - unmap_phys_mem(info->video_base, info->chip.fbsize); - unmap_phys_mem(info->control_base, SAVAGE_NEWMMIO_REGSIZE); - //FIXME ADD -} - -/** - * @brief Get chipset's hardware capabilities. - * - * @param to Pointer to the vidix_capability_t structure to be filled. - * - * @returns 0. - */ -int -vixGetCapability (vidix_capability_t * to) -{ - memcpy (to, &savage_cap, sizeof (vidix_capability_t)); - return 0; -} - -/** - * @brief Report if the video FourCC is supported by hardware. - * - * @param fourcc input image format. - * - * @returns 1 if the fourcc is supported. - * 0 otherwise. - */ -static int -is_supported_fourcc (uint32_t fourcc) -{ - switch (fourcc) - { -//FIXME: YV12 isnt working properly yet -// case IMGFMT_YV12: -// case IMGFMT_I420: - case IMGFMT_UYVY: - case IMGFMT_YVYU: - case IMGFMT_YUY2: - case IMGFMT_RGB15: - case IMGFMT_RGB16: -// case IMGFMT_BGR32: - return 1; - default: - return 0; - } -} - -/** - * @brief Try to configure video memory for given fourcc. - * - * @param to Pointer to the vidix_fourcc_t structure to be filled. - * - * @returns 0 if ok. - * errno otherwise. - */ -int -vixQueryFourcc (vidix_fourcc_t * to) -{ - if (is_supported_fourcc (to->fourcc)) - { - to->depth = VID_DEPTH_1BPP | VID_DEPTH_2BPP | - VID_DEPTH_4BPP | VID_DEPTH_8BPP | - VID_DEPTH_12BPP | VID_DEPTH_15BPP | - VID_DEPTH_16BPP | VID_DEPTH_24BPP | VID_DEPTH_32BPP; - to->flags = VID_CAP_EXPAND | VID_CAP_SHRINK | VID_CAP_COLORKEY; - return 0; - } - else - to->depth = to->flags = 0; - - return ENOSYS; -} - -/** - * @brief Get the GrKeys - * - * @param grkey Pointer to the vidix_grkey_t structure to be filled by driver. - * - * @return 0. - */ -/*int -vixGetGrKeys (vidix_grkey_t * grkey) -{ - -// if(info->d_width && info->d_height)savage_overlay_start(info,0); - - return (0); -} - * */ - -/** - * @brief Set the GrKeys - * - * @param grkey Colorkey to be set. - * - * @return 0. - */ -int -vixSetGrKeys (const vidix_grkey_t * grkey) -{ - if (grkey->ckey.op == CKEY_FALSE) - { - info->use_colorkey = 0; - info->vidixcolorkey=0; - printf("[savage_vid] colorkeying disabled\n"); - } - else { - info->use_colorkey = 1; - info->vidixcolorkey = ((grkey->ckey.red<<16)|(grkey->ckey.green<<8)|grkey->ckey.blue); - - printf("[savage_vid] set colorkey 0x%x\n",info->vidixcolorkey); - } - //FIXME: freezes if streams arent enabled - SavageSetColorKeyOld(); - return (0); -} - -/** - * @brief Unichrome driver equalizer capabilities. - */ -vidix_video_eq_t equal = { - VEQ_CAP_BRIGHTNESS | VEQ_CAP_SATURATION | VEQ_CAP_HUE, - 300, 100, 0, 0, 0, 0, 0, 0 -}; - - -/** - * @brief Get the equalizer capabilities. - * - * @param eq Pointer to the vidix_video_eq_t structure to be filled by driver. - * - * @return 0. - */ -int -vixPlaybackGetEq (vidix_video_eq_t * eq) -{ - memcpy (eq, &equal, sizeof (vidix_video_eq_t)); - return 0; -} - -/** - * @brief Set the equalizer capabilities for color correction - * - * @param eq equalizer capabilities to be set. - * - * @return 0. - */ -int -vixPlaybackSetEq (const vidix_video_eq_t * eq) -{ - return 0; -} - -/** - * @brief Y, U, V offsets. - */ -/* static int YOffs, UOffs, VOffs; */ - -/** - * @brief Configure driver for playback. Driver should prepare BES. - * - * @param info configuration description for playback. - * - * @returns 0 in case of success. - * -1 otherwise. - */ -int -vixConfigPlayback (vidix_playback_t * vinfo) -{ - int uv_size, swap_uv; - unsigned int i; -#if 0 - int extfifo_on; - int srcPitch,srcPitch2; - - /* Overlay register settings */ - uint32_t win_start, win_end; - uint32_t zoom, mini; - uint32_t dcount, falign, qwfetch; - uint32_t y_start, u_start, v_start; - uint32_t v_ctrl, fifo_ctrl; -#endif - - if (!is_supported_fourcc (vinfo->fourcc)) - return -1; - - - - info->src_w = vinfo->src.w; - info->src_h = vinfo->src.h; - - info->drw_w = vinfo->dest.w; - info->drw_h = vinfo->dest.h; - - info->wx = vinfo->dest.x; - info->wy = vinfo->dest.y; - info->format = vinfo->fourcc; - - info->lastKnownPitch = 0; - info->brightness = 0; - info->contrast = 128; - info->saturation = 128; - info->hue = 0; - - - vinfo->dga_addr=(void*)(info->picture_base); - - - vinfo->offset.y = 0; - vinfo->offset.v = 0; - vinfo->offset.u = 0; - - vinfo->dest.pitch.y = 32; - vinfo->dest.pitch.u = 32; - vinfo->dest.pitch.v = 32; - // vinfo->dest.pitch.u = 0; - // vinfo->dest.pitch.v = 0; - - - info->pitch = ((info->src_w << 1) + 15) & ~15; - - swap_uv = 0; - switch (vinfo->fourcc) - { - case IMGFMT_YUY2: - case IMGFMT_UYVY: - - info->pitch = ((info->src_w << 1) + (vinfo->dest.pitch.y-1)) & ~(vinfo->dest.pitch.y-1); - - info->pitch = info->src_w << 1; - info->pitch = ALIGN_TO (info->src_w << 1, 32); - uv_size = 0; - break; - case IMGFMT_YV12: - swap_uv = 1; - - - - /* - srcPitch = (info->src_w + 3) & ~3; - vinfo->offset.u = srcPitch * info->src_h; - srcPitch2 = ((info->src_w >> 1) + 3) & ~3; - vinfo->offset.v = (srcPitch2 * (info->src_h >> 1)) + vinfo->offset.v; - - vinfo->dest.pitch.y=srcPitch ; - vinfo->dest.pitch.v=srcPitch2 ; - vinfo->dest.pitch.u=srcPitch2 ; - */ - - - info->pitch = ALIGN_TO (info->src_w, 32); - uv_size = (info->pitch >> 1) * (info->src_h >> 1); - - vinfo->offset.y = 0; - vinfo->offset.v = vinfo->offset.y + info->pitch * info->src_h; - vinfo->offset.u = vinfo->offset.v + uv_size; - vinfo->frame_size = vinfo->offset.u + uv_size; -/* YOffs = info->offset.y; - UOffs = (swap_uv ? vinfo->offset.v : vinfo->offset.u); - VOffs = (swap_uv ? vinfo->offset.u : vinfo->offset.v); - */ -// vinfo->offset.y = info->src_w; -// vinfo->offset.v = vinfo->offset.y + info->src_w /2 * info->src_h; -// vinfo->offset.u = vinfo->offset.v + (info->src_w >> 1) * (info->src_h >> 1) ; - - break; - } - info->pitch |= ((info->pitch >> 1) << 16); - - vinfo->frame_size = info->pitch * info->src_h; - - printf("$#### destination pitch = %u\n", info->pitch&0xffff); - - - - - info->buffer_size = vinfo->frame_size; - info->num_frames = vinfo->num_frames= (info->chip.fbsize - info->picture_offset)/vinfo->frame_size; - if(vinfo->num_frames > MAX_FRAMES)vinfo->num_frames = MAX_FRAMES; -// vinfo->num_frames = 1; -// printf("[nvidia_vid] Number of frames %i\n",vinfo->num_frames); - for(i=0;i <vinfo->num_frames;i++)vinfo->offsets[i] = vinfo->frame_size*i; - - return 0; -} - -/** - * @brief Set playback on : driver should activate BES on this call. - * - * @return 0. - */ -int -vixPlaybackOn (void) -{ - // FIXME: enable - SavageDisplayVideoOld(); -//FIXME ADD - return 0; -} - -/** - * @brief Set playback off : driver should deactivate BES on this call. - * - * @return 0. - */ -int -vixPlaybackOff (void) -{ - // otherwise we wont disable streams properly in new xorg - // FIXME: shouldnt this be enabled? -// SavageStreamsOn(); - SavageStreamsOff(); -// info->vidixcolorkey=0x0; - -// OUTREG( SSTREAM_WINDOW_START_REG, OS_XY(0xfffe, 0xfffe) ); -// SavageSetColorKeyOld(); -//FIXME ADD - return 0; -} - -/** - * @brief Driver should prepare and activate corresponded frame. - * - * @param frame the frame index. - * - * @return 0. - * - * @note This function is used only for double and triple buffering - * and never used for single buffering playback. - */ -#if 0 -int -vixPlaybackFrameSelect (unsigned int frame) -{ -////FIXME ADD -// savage_overlay_start(info, frame); - //if (info->num_frames >= 1) -// info->cur_frame = frame//(frame+1)%info->num_frames; -// -// savage4_waitidle(info); - - printf("vixPlaybackFrameSelect Leave\n" ); - // FIXME: does this work to avoid tearing? -// VerticalRetraceWait(); - - return 0; -} - -#endif - - - -void debugout(unsigned int addr, unsigned int val){ - return ; - switch ( addr ){ - case PSTREAM_CONTROL_REG: - fprintf(stderr,"PSTREAM_CONTROL_REG"); - break; - case COL_CHROMA_KEY_CONTROL_REG: - fprintf(stderr,"COL_CHROMA_KEY_CONTROL_REG"); - break; - case SSTREAM_CONTROL_REG: - fprintf(stderr,"SSTREAM_CONTROL_REG"); - break; - case CHROMA_KEY_UPPER_BOUND_REG: - fprintf(stderr,"CHROMA_KEY_UPPER_BOUND_REG"); - break; - case SSTREAM_STRETCH_REG: - fprintf(stderr,"SSTREAM_STRETCH_REG"); - break; - case COLOR_ADJUSTMENT_REG: - fprintf(stderr,"COLOR_ADJUSTMENT_REG"); - break; - case BLEND_CONTROL_REG: - fprintf(stderr,"BLEND_CONTROL_REG"); - break; - case PSTREAM_FBADDR0_REG: - fprintf(stderr,"PSTREAM_FBADDR0_REG"); - break; - case PSTREAM_FBADDR1_REG: - fprintf(stderr,"PSTREAM_FBADDR1_REG"); - break; - case PSTREAM_STRIDE_REG: - fprintf(stderr,"PSTREAM_STRIDE_REG"); - break; - case DOUBLE_BUFFER_REG: - fprintf(stderr,"DOUBLE_BUFFER_REG"); - break; - case SSTREAM_FBADDR0_REG: - fprintf(stderr,"SSTREAM_FBADDR0_REG"); - break; - case SSTREAM_FBADDR1_REG: - fprintf(stderr,"SSTREAM_FBADDR1_REG"); - break; - case SSTREAM_STRIDE_REG: - fprintf(stderr,"SSTREAM_STRIDE_REG"); - break; - case SSTREAM_VSCALE_REG: - fprintf(stderr,"SSTREAM_VSCALE_REG"); - break; - case SSTREAM_VINITIAL_REG: - fprintf(stderr,"SSTREAM_VINITIAL_REG"); - break; - case SSTREAM_LINES_REG: - fprintf(stderr,"SSTREAM_LINES_REG"); - break; - case STREAMS_FIFO_REG: - fprintf(stderr,"STREAMS_FIFO_REG"); - break; - case PSTREAM_WINDOW_START_REG: - fprintf(stderr,"PSTREAM_WINDOW_START_REG"); - break; - case PSTREAM_WINDOW_SIZE_REG: - fprintf(stderr,"PSTREAM_WINDOW_SIZE_REG"); - break; - case SSTREAM_WINDOW_START_REG: - fprintf(stderr,"SSTREAM_WINDOW_START_REG"); - break; - case SSTREAM_WINDOW_SIZE_REG: - fprintf(stderr,"SSTREAM_WINDOW_SIZE_REG"); - break; - case FIFO_CONTROL: - fprintf(stderr,"FIFO_CONTROL"); - break; - case PSTREAM_FBSIZE_REG: - fprintf(stderr,"PSTREAM_FBSIZE_REG"); - break; - case SSTREAM_FBSIZE_REG: - fprintf(stderr,"SSTREAM_FBSIZE_REG"); - break; - case SSTREAM_FBADDR2_REG: - fprintf(stderr,"SSTREAM_FBADDR2_REG"); - break; - - } - fprintf(stderr,":\t\t 0x%08X = %u\n",val,val); -} - - - diff --git a/src/video_out/vidix/drivers/sis_bridge.c b/src/video_out/vidix/drivers/sis_bridge.c deleted file mode 100644 index f6916ae87..000000000 --- a/src/video_out/vidix/drivers/sis_bridge.c +++ /dev/null @@ -1,835 +0,0 @@ -/** - Video bridge detection for SiS 300 and 310/325 series chips. - - Copyright 2003 Jake Page, Sugar Media. - - Based on SiS Xv driver: - Copyright 2002-2003 by Thomas Winischhofer, Vienna, Austria. - - 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 - -**/ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -#include "libdha.h" - -#include "sis_regs.h" -#include "sis_defs.h" - -void sis_init_video_bridge(void); - -static void sis_ddc2_delay(unsigned short delaytime) -{ - unsigned short i; - int temp; - - for (i = 0; i < delaytime; i++) { - inSISIDXREG(SISSR, 0x05, temp); - } -} - - -static int sis_do_sense(int tempbl, int tempbh, int tempcl, int tempch) -{ - int temp; - - outSISIDXREG(SISPART4, 0x11, tempbl); - temp = tempbh | tempcl; - setSISIDXREG(SISPART4, 0x10, 0xe0, temp); - //usleep(200000); - sis_ddc2_delay(0x1000); - tempch &= 0x7f; - inSISIDXREG(SISPART4, 0x03, temp); - temp ^= 0x0e; - temp &= tempch; - return (temp == tempch); -} - - -/* sense connected devices on 30x bridge */ -static void sis_sense_30x() -{ - unsigned char backupP4_0d, backupP2_00, biosflag; - unsigned char testsvhs_tempbl, testsvhs_tempbh; - unsigned char testsvhs_tempcl, testsvhs_tempch; - unsigned char testcvbs_tempbl, testcvbs_tempbh; - unsigned char testcvbs_tempcl, testcvbs_tempch; - unsigned char testvga2_tempbl, testvga2_tempbh; - unsigned char testvga2_tempcl, testvga2_tempch; - int myflag, result = 0, i, j, haveresult; -#if 0 - unsigned short temp; -#endif - - inSISIDXREG(SISPART4, 0x0d, backupP4_0d); - outSISIDXREG(SISPART4, 0x0d, (backupP4_0d | 0x04)); - - inSISIDXREG(SISPART2, 0x00, backupP2_00); - outSISIDXREG(SISPART2, 0x00, (backupP2_00 | 0x1c)); - - sis_do_sense(0, 0, 0, 0); - - if ((sis_vga_engine == SIS_315_VGA) || - (sis_device_id == DEVICE_SIS_300)) { -#if 0 - if (0 /*pSiS->sishw_ext.UseROM */ ) { - if (sis_vga_engine == SIS_300_VGA) - temp = 0xfe; - else { - temp = 0xf3; - if (sis_device_id == DEVICE_SIS_330) - temp = 0x11b; - } - if (pSiS->BIOS[temp] & 0x08) { - if (sis_verbose > 1) { - printf - ("[SiS] SiS30x: Video bridge has DVI-I TMDS/VGA combo connector\n"); - } - orSISIDXREG(SISCR, 0x32, 0x80); - } else { - andSISIDXREG(SISCR, 0x32, 0x7f); - } - } -#endif - } - - if (sis_vga_engine == SIS_300_VGA) { - if (0 /*pSiS->sishw_ext.UseROM */ ) { -#if 0 - testvga2_tempbh = pSiS->BIOS[0xf9]; - testvga2_tempbl = pSiS->BIOS[0xf8]; - testsvhs_tempbh = pSiS->BIOS[0xfb]; - testsvhs_tempbl = pSiS->BIOS[0xfa]; - testcvbs_tempbh = pSiS->BIOS[0xfd]; - testcvbs_tempbl = pSiS->BIOS[0xfc]; - biosflag = pSiS->BIOS[0xfe]; -#endif - } else { - testvga2_tempbh = 0x00; - testvga2_tempbl = 0xd1; - testsvhs_tempbh = 0x00; - testsvhs_tempbl = 0xb9; - testcvbs_tempbh = 0x00; - testcvbs_tempbl = 0xb3; - biosflag = 0; - } - if (sis_vbflags & (VB_301B | VB_302B | VB_301LV | VB_302LV)) { - testvga2_tempbh = 0x01; - testvga2_tempbl = 0x90; - testsvhs_tempbh = 0x01; - testsvhs_tempbl = 0x6b; - testcvbs_tempbh = 0x01; - testcvbs_tempbl = 0x74; - } - inSISIDXREG(SISPART4, 0x01, myflag); - if (myflag & 0x04) { - testvga2_tempbh = 0x00; - testvga2_tempbl = 0xfd; - testsvhs_tempbh = 0x00; - testsvhs_tempbl = 0xdd; - testcvbs_tempbh = 0x00; - testcvbs_tempbl = 0xee; - } - testvga2_tempch = 0x0e; - testvga2_tempcl = 0x08; - testsvhs_tempch = 0x06; - testsvhs_tempcl = 0x04; - testcvbs_tempch = 0x08; - testcvbs_tempcl = 0x04; - - if (sis_device_id == DEVICE_SIS_300) { - inSISIDXREG(SISSR, 0x3b, myflag); - if (!(myflag & 0x01)) { - testvga2_tempbh = 0x00; - testvga2_tempbl = 0x00; - testvga2_tempch = 0x00; - testvga2_tempcl = 0x00; - } - } - } else { - if (0 /*pSiS->sishw_ext.UseROM */ ) { -#if 0 - if (sis_device_id == DEVICE_SIS_330) { - testvga2_tempbh = pSiS->BIOS[0xe6]; - testvga2_tempbl = pSiS->BIOS[0xe5]; - testsvhs_tempbh = pSiS->BIOS[0xe8]; - testsvhs_tempbl = pSiS->BIOS[0xe7]; - testcvbs_tempbh = pSiS->BIOS[0xea]; - testcvbs_tempbl = pSiS->BIOS[0xe9]; - biosflag = pSiS->BIOS[0x11b]; - } else { - testvga2_tempbh = pSiS->BIOS[0xbe]; - testvga2_tempbl = pSiS->BIOS[0xbd]; - testsvhs_tempbh = pSiS->BIOS[0xc0]; - testsvhs_tempbl = pSiS->BIOS[0xbf]; - testcvbs_tempbh = pSiS->BIOS[0xc2]; - testcvbs_tempbl = pSiS->BIOS[0xc1]; - biosflag = pSiS->BIOS[0xf3]; - } -#endif - } else { - testvga2_tempbh = 0x00; - testvga2_tempbl = 0xd1; - testsvhs_tempbh = 0x00; - testsvhs_tempbl = 0xb9; - testcvbs_tempbh = 0x00; - testcvbs_tempbl = 0xb3; - biosflag = 0; - } - - if (sis_vbflags & (VB_301B | VB_302B | VB_301LV | VB_302LV)) { - if (0 /*pSiS->sishw_ext.UseROM */ ) { -#if 0 - if (sis_device_id == DEVICE_SIS_330) { - testvga2_tempbh = pSiS->BIOS[0xec]; - testvga2_tempbl = pSiS->BIOS[0xeb]; - testsvhs_tempbh = pSiS->BIOS[0xee]; - testsvhs_tempbl = pSiS->BIOS[0xed]; - testcvbs_tempbh = pSiS->BIOS[0xf0]; - testcvbs_tempbl = pSiS->BIOS[0xef]; - } else { - testvga2_tempbh = pSiS->BIOS[0xc4]; - testvga2_tempbl = pSiS->BIOS[0xc3]; - testsvhs_tempbh = pSiS->BIOS[0xc6]; - testsvhs_tempbl = pSiS->BIOS[0xc5]; - testcvbs_tempbh = pSiS->BIOS[0xc8]; - testcvbs_tempbl = pSiS->BIOS[0xc7]; - } -#endif - } else { - if (sis_vbflags & (VB_301B | VB_302B)) { - testvga2_tempbh = 0x01; - testvga2_tempbl = 0x90; - testsvhs_tempbh = 0x01; - testsvhs_tempbl = 0x6b; - testcvbs_tempbh = 0x01; - testcvbs_tempbl = 0x74; - } else { - testvga2_tempbh = 0x00; - testvga2_tempbl = 0x00; - testsvhs_tempbh = 0x02; - testsvhs_tempbl = 0x00; - testcvbs_tempbh = 0x01; - testcvbs_tempbl = 0x00; - } - } - } - if (sis_vbflags & (VB_301 | VB_301B | VB_302B)) { - inSISIDXREG(SISPART4, 0x01, myflag); - if (myflag & 0x04) { - testvga2_tempbh = 0x00; - testvga2_tempbl = 0xfd; - testsvhs_tempbh = 0x00; - testsvhs_tempbl = 0xdd; - testcvbs_tempbh = 0x00; - testcvbs_tempbl = 0xee; - } - } - if (sis_vbflags & (VB_301LV | VB_302LV)) { - /* TW: No VGA2 or SCART on LV bridges */ - testvga2_tempbh = 0x00; - testvga2_tempbl = 0x00; - testvga2_tempch = 0x00; - testvga2_tempcl = 0x00; - testsvhs_tempch = 0x04; - testsvhs_tempcl = 0x08; - testcvbs_tempch = 0x08; - testcvbs_tempcl = 0x08; - } else { - testvga2_tempch = 0x0e; - testvga2_tempcl = 0x08; - testsvhs_tempch = 0x06; - testsvhs_tempcl = 0x04; - testcvbs_tempch = 0x08; - testcvbs_tempcl = 0x04; - } - } - - /* XXX: ?? andSISIDXREG(SISCR, 0x32, ~0x14); */ - /* pSiS->postVBCR32 &= ~0x14; */ - - /* scan for VGA2/SCART */ - if (testvga2_tempch || testvga2_tempcl || - testvga2_tempbh || testvga2_tempbl) { - - haveresult = 0; - for (j = 0; j < 10; j++) { - result = 0; - for (i = 0; i < 3; i++) { - if (sis_do_sense(testvga2_tempbl, testvga2_tempbh, - testvga2_tempcl, testvga2_tempch)) - result++; - } - if ((result == 0) || (result >= 2)) - break; - } - if (result) { - if (biosflag & 0x01) { - if (sis_verbose > 1) { - printf - ("[SiS] SiS30x: Detected TV connected to SCART output\n"); - } - sis_vbflags |= TV_SCART; - orSISIDXREG(SISCR, 0x32, 0x04); - /*pSiS->postVBCR32 |= 0x04; */ - } else { - if (sis_verbose > 1) { - printf - ("[SiS] SiS30x: Detected secondary VGA connection\n"); - } - sis_vbflags |= VGA2_CONNECTED; - orSISIDXREG(SISCR, 0x32, 0x10); - /*pSiS->postVBCR32 |= 0x10; */ - } - } - } - - /* scanning for TV */ - - /* XXX: ?? andSISIDXREG(SISCR, 0x32, ~0x03); */ - /* pSiS->postVBCR32 &= ~0x03; */ - - result = sis_do_sense(testsvhs_tempbl, testsvhs_tempbh, - testsvhs_tempcl, testsvhs_tempch); - - - haveresult = 0; - for (j = 0; j < 10; j++) { - result = 0; - for (i = 0; i < 3; i++) { - if (sis_do_sense(testsvhs_tempbl, testsvhs_tempbh, - testsvhs_tempcl, testsvhs_tempch)) - result++; - } - if ((result == 0) || (result >= 2)) - break; - } - if (result) { - if (sis_verbose > 1) { - printf - ("[SiS] SiS30x: Detected TV connected to SVIDEO output\n"); - } - /* TW: So we can be sure that there IS a SVIDEO output */ - sis_vbflags |= TV_SVIDEO; - orSISIDXREG(SISCR, 0x32, 0x02); - //pSiS->postVBCR32 |= 0x02; - } - - if ((biosflag & 0x02) || (!(result))) { - haveresult = 0; - for (j = 0; j < 10; j++) { - result = 0; - for (i = 0; i < 3; i++) { - if (sis_do_sense(testcvbs_tempbl, testcvbs_tempbh, - testcvbs_tempcl, testcvbs_tempch)) - result++; - } - if ((result == 0) || (result >= 2)) - break; - } - if (result) { - if (sis_verbose > 1) { - printf - ("[SiS] SiS30x: Detected TV connected to COMPOSITE output\n"); - } - sis_vbflags |= TV_AVIDEO; - orSISIDXREG(SISCR, 0x32, 0x01); - //pSiS->postVBCR32 |= 0x01; - } - } - - sis_do_sense(0, 0, 0, 0); - - outSISIDXREG(SISPART2, 0x00, backupP2_00); - outSISIDXREG(SISPART4, 0x0d, backupP4_0d); -} - - -static void sis_detect_crt1() -{ - unsigned char CR32; - unsigned char CRT1Detected = 0; - unsigned char OtherDevices = 0; - - if (!(sis_vbflags & VB_VIDEOBRIDGE)) { - sis_crt1_off = 0; - return; - } - - inSISIDXREG(SISCR, 0x32, CR32); - - if (CR32 & 0x20) - CRT1Detected = 1; - if (CR32 & 0x5F) - OtherDevices = 1; - - if (sis_crt1_off == -1) { - if (!CRT1Detected) { - /* BIOS detected no CRT1. */ - /* If other devices exist, switch it off */ - if (OtherDevices) - sis_crt1_off = 1; - else - sis_crt1_off = 0; - } else { - /* BIOS detected CRT1, leave/switch it on */ - sis_crt1_off = 0; - } - } - if (sis_verbose > 0) { - printf("[SiS] %sCRT1 connection detected\n", - sis_crt1_off ? "No " : ""); - } -} - -#if 0 /* not used yet */ -static void sis_detect_lcd() -{ - unsigned char CR32; -#if 0 - /* not supported yet? */ - unsigned char CR36, CR37; -#endif - - if (!(sis_vbflags & VB_VIDEOBRIDGE)) { - return; - } - - inSISIDXREG(SISCR, 0x32, CR32); - - if (CR32 & 0x08) - sis_vbflags |= CRT2_LCD; - - /* DDC detection of LCD - not supported yet */ - - /* Get other misc info about LCD - not supported */ -} -#endif - -static void sis_detect_tv() -{ - unsigned char SR16, SR38, CR32, CR38 = 0, CR79; - int temp = 0; - - if (!(sis_vbflags & VB_VIDEOBRIDGE)) - return; - - inSISIDXREG(SISCR, 0x32, CR32); - inSISIDXREG(SISSR, 0x16, SR16); - inSISIDXREG(SISSR, 0x38, SR38); - switch (sis_vga_engine) { - case SIS_300_VGA: - if (sis_device_id == DEVICE_SIS_630_VGA) - temp = 0x35; - break; - case SIS_315_VGA: - temp = 0x38; - break; - } - if (temp) { - inSISIDXREG(SISCR, temp, CR38); - } - - if (CR32 & 0x47) - sis_vbflags |= CRT2_TV; - - if (CR32 & 0x04) - sis_vbflags |= TV_SCART; - else if (CR32 & 0x02) - sis_vbflags |= TV_SVIDEO; - else if (CR32 & 0x01) - sis_vbflags |= TV_AVIDEO; - else if (CR32 & 0x40) - sis_vbflags |= (TV_SVIDEO | TV_HIVISION); - else if ((CR38 & 0x04) && (sis_vbflags & (VB_301LV | VB_302LV))) - sis_vbflags |= TV_HIVISION_LV; - else if ((CR38 & 0x04) && (sis_vbflags & VB_CHRONTEL)) - sis_vbflags |= (TV_CHSCART | TV_PAL); - else if ((CR38 & 0x08) && (sis_vbflags & VB_CHRONTEL)) - sis_vbflags |= (TV_CHHDTV | TV_NTSC); - - if (sis_vbflags & (TV_SCART | TV_SVIDEO | TV_AVIDEO | TV_HIVISION)) { - if (sis_vga_engine == SIS_300_VGA) { - /* TW: Should be SR38 here as well, but this - * does not work. Looks like a BIOS bug (2.04.5c). - */ - if (SR16 & 0x20) - sis_vbflags |= TV_PAL; - else - sis_vbflags |= TV_NTSC; - } else if ((sis_device_id == DEVICE_SIS_550_VGA)) { - inSISIDXREG(SISCR, 0x79, CR79); - if (CR79 & 0x08) { - inSISIDXREG(SISCR, 0x79, CR79); - CR79 >>= 5; - } - if (CR79 & 0x01) { - sis_vbflags |= TV_PAL; - if (CR38 & 0x40) - sis_vbflags |= TV_PALM; - else if (CR38 & 0x80) - sis_vbflags |= TV_PALN; - } else - sis_vbflags |= TV_NTSC; - } else if ((sis_device_id == DEVICE_SIS_650_VGA)) { - inSISIDXREG(SISCR, 0x79, CR79); - if (CR79 & 0x20) { - sis_vbflags |= TV_PAL; - if (CR38 & 0x40) - sis_vbflags |= TV_PALM; - else if (CR38 & 0x80) - sis_vbflags |= TV_PALN; - } else - sis_vbflags |= TV_NTSC; - } else { /* 315, 330 */ - if (SR38 & 0x01) { - sis_vbflags |= TV_PAL; - if (CR38 & 0x40) - sis_vbflags |= TV_PALM; - else if (CR38 & 0x80) - sis_vbflags |= TV_PALN; - } else - sis_vbflags |= TV_NTSC; - } - } - - if (sis_vbflags & - (TV_SCART | TV_SVIDEO | TV_AVIDEO | TV_HIVISION | TV_CHSCART | - TV_CHHDTV)) { - if (sis_verbose > 0) { - printf("[SiS] %sTV standard %s\n", - (sis_vbflags & (TV_CHSCART | TV_CHHDTV)) ? "Using " : - "Detected default ", - (sis_vbflags & TV_NTSC) ? ((sis_vbflags & TV_CHHDTV) ? - "480i HDTV" : "NTSC") - : ((sis_vbflags & TV_PALM) ? "PALM" - : ((sis_vbflags & TV_PALN) ? "PALN" : "PAL"))); - } - } - -} - - -static void sis_detect_crt2() -{ - unsigned char CR32; - - if (!(sis_vbflags & VB_VIDEOBRIDGE)) - return; - - /* CRT2-VGA not supported on LVDS and 30xLV */ - if (sis_vbflags & (VB_LVDS | VB_301LV | VB_302LV)) - return; - - inSISIDXREG(SISCR, 0x32, CR32); - - if (CR32 & 0x10) - sis_vbflags |= CRT2_VGA; - -#if 0 - if (!(pSiS->nocrt2ddcdetection)) { - if (sis_vbflags & (VB_301B | VB_302B)) { - if (!(sis_vbflags & (CRT2_VGA | CRT2_LCD))) { - printf - ("[SiS] BIOS detected no secondary VGA, sensing via DDC\n"); - if (SiS_SenseVGA2DDC(pSiS->SiS_Pr, pSiS)) { - printf - ("[SiS] DDC error during secondary VGA detection\n"); - } else { - inSISIDXREG(SISCR, 0x32, CR32); - if (CR32 & 0x10) { - sis_vbflags |= CRT2_VGA; - /*pSiS->postVBCR32 |= 0x10; */ - printf - ("[SiS] Detected secondary VGA connection\n"); - } else { - printf - ("[SiS] No secondary VGA connection detected\n"); - } - } - } - } - } -#endif - -} - - -/* Preinit: detect video bridge and sense connected devs */ -static void sis_detect_video_bridge() -{ - int temp, temp1, temp2; - - - sis_vbflags = 0; - - if (sis_vga_engine != SIS_300_VGA && sis_vga_engine != SIS_315_VGA) - return; - - inSISIDXREG(SISPART4, 0x00, temp); - temp &= 0x0F; - if (temp == 1) { - inSISIDXREG(SISPART4, 0x01, temp1); - temp1 &= 0xff; - if (temp1 >= 0xE0) { - sis_vbflags |= VB_302LV; - //pSiS->sishw_ext.ujVBChipID = VB_CHIP_302LV; - if (sis_verbose > 1) { - printf - ("[SiS] Detected SiS302LV video bridge (ID 1; Revision 0x%x)\n", - temp1); - } - - } else if (temp1 >= 0xD0) { - sis_vbflags |= VB_301LV; - //pSiS->sishw_ext.ujVBChipID = VB_CHIP_301LV; - if (sis_verbose > 1) { - printf - ("[SiS] Detected SiS301LV video bridge (ID 1; Revision 0x%x)\n", - temp1); - } - } else if (temp1 >= 0xB0) { - sis_vbflags |= VB_301B; - //pSiS->sishw_ext.ujVBChipID = VB_CHIP_301B; - inSISIDXREG(SISPART4, 0x23, temp2); - if (!(temp2 & 0x02)) - sis_vbflags |= VB_30xBDH; - if (sis_verbose > 1) { - printf - ("[SiS] Detected SiS301B%s video bridge (Revision 0x%x)\n", - (temp2 & 0x02) ? "" : " (DH)", temp1); - } - } else { - sis_vbflags |= VB_301; - //pSiS->sishw_ext.ujVBChipID = VB_CHIP_301; - if (sis_verbose > 1) { - printf - ("[SiS] Detected SiS301 video bridge (Revision 0x%x)\n", - temp1); - } - } - - sis_sense_30x(); - - } else if (temp == 2) { - - inSISIDXREG(SISPART4, 0x01, temp1); - temp1 &= 0xff; - if (temp1 >= 0xE0) { - sis_vbflags |= VB_302LV; - //pSiS->sishw_ext.ujVBChipID = VB_CHIP_302LV; - if (sis_verbose > 1) { - printf - ("[SiS] Detected SiS302LV video bridge (ID 2; Revision 0x%x)\n", - temp1); - } - } else if (temp1 >= 0xD0) { - sis_vbflags |= VB_301LV; - //pSiS->sishw_ext.ujVBChipID = VB_CHIP_301LV; - if (sis_verbose > 1) { - printf - ("[SiS] Detected SiS301LV video bridge (ID 2; Revision 0x%x)\n", - temp1); - } - } else { - sis_vbflags |= VB_302B; - //pSiS->sishw_ext.ujVBChipID = VB_CHIP_302B; - inSISIDXREG(SISPART4, 0x23, temp2); - if (!(temp & 0x02)) - sis_vbflags |= VB_30xBDH; - if (sis_verbose > 1) { - printf - ("[SiS] Detected SiS302B%s video bridge (Revision 0x%x)\n", - (temp2 & 0x02) ? "" : " (DH)", temp1); - } - } - - sis_sense_30x(); - - } else if (temp == 3) { - if (sis_verbose > 1) { - printf("[SiS] Detected SiS303 video bridge - not supported\n"); - } - } else { - /* big scary mess of code to handle unknown or Chrontel LVDS */ - /* skipping it for now */ - if (sis_verbose > 1) { - printf - ("[SiS] Detected Chrontel video bridge - not supported\n"); - } - } - - /* this is probably not relevant to video overlay driver... */ - /* detects if brdige uses LCDA for low res text modes */ - if (sis_vga_engine == SIS_315_VGA) { - if (sis_vbflags & (VB_302B | VB_301LV | VB_302LV)) { -#if 0 - if (pSiS->sisfblcda != 0xff) { - if ((pSiS->sisfblcda & 0x03) == 0x03) { - //pSiS->SiS_Pr->SiS_UseLCDA = TRUE; - sis_vbflags |= VB_USELCDA; - } - } else -#endif - { - inSISIDXREG(SISCR, 0x34, temp); - if (temp <= 0x13) { - inSISIDXREG(SISCR, 0x38, temp); - if ((temp & 0x03) == 0x03) { - //pSiS->SiS_Pr->SiS_UseLCDA = TRUE; - sis_vbflags |= VB_USELCDA; - } else { - inSISIDXREG(SISCR, 0x30, temp); - if (temp & 0x20) { - inSISIDXREG(SISPART1, 0x13, temp); - if (temp & 0x40) { - //pSiS->SiS_Pr->SiS_UseLCDA = TRUE; - sis_vbflags |= VB_USELCDA; - } - } - } - } - } - if (sis_vbflags & VB_USELCDA) { - /* printf("Bridge uses LCDA for low resolution and text modes\n"); */ - } - } - } - - -} - - -/* detect video bridge type and sense connected devices */ -void sis_init_video_bridge() -{ - - sis_detect_video_bridge(); - - sis_detect_crt1(); - //sis_detect_lcd(); /* not fully ready probably */ - sis_detect_tv(); - sis_detect_crt2(); - - sis_detected_crt2_devices = - sis_vbflags & (CRT2_LCD | CRT2_TV | CRT2_VGA); - - // force crt2 type - if (sis_force_crt2_type == CRT2_DEFAULT) { - if (sis_vbflags & CRT2_VGA) - sis_force_crt2_type = CRT2_VGA; - else if (sis_vbflags & CRT2_LCD) - sis_force_crt2_type = CRT2_LCD; - else if (sis_vbflags & CRT2_TV) - sis_force_crt2_type = CRT2_TV; - } - - switch (sis_force_crt2_type) { - case CRT2_TV: - sis_vbflags = sis_vbflags & ~(CRT2_LCD | CRT2_VGA); - if (sis_vbflags & VB_VIDEOBRIDGE) - sis_vbflags = sis_vbflags | CRT2_TV; - else - sis_vbflags = sis_vbflags & ~(CRT2_TV); - break; - case CRT2_LCD: - sis_vbflags = sis_vbflags & ~(CRT2_TV | CRT2_VGA); - if ((sis_vbflags & VB_VIDEOBRIDGE) /* XXX: && (pSiS->VBLCDFlags) */ - ) - sis_vbflags = sis_vbflags | CRT2_LCD; - else { - sis_vbflags = sis_vbflags & ~(CRT2_LCD); - if (sis_verbose > 0) { - printf - ("[SiS] Can't force CRT2 to LCD, no panel detected\n"); - } - } - break; - case CRT2_VGA: - if (sis_vbflags & VB_LVDS) { - if (sis_verbose > 0) { - printf("[SiS] LVDS does not support secondary VGA\n"); - } - break; - } - if (sis_vbflags & (VB_301LV | VB_302LV)) { - if (sis_verbose > 0) { - printf - ("[SiS] SiS30xLV bridge does not support secondary VGA\n"); - } - break; - } - sis_vbflags = sis_vbflags & ~(CRT2_TV | CRT2_LCD); - if (sis_vbflags & VB_VIDEOBRIDGE) - sis_vbflags = sis_vbflags | CRT2_VGA; - else - sis_vbflags = sis_vbflags & ~(CRT2_VGA); - break; - default: - sis_vbflags &= ~(CRT2_TV | CRT2_LCD | CRT2_VGA); - } - - /* CRT2 gamma correction?? */ - - /* other force modes: */ - /* have a 'force tv type' (svideo, composite, scart) option? */ - /* have a 'force crt1 type' (to turn it off, etc??) */ - - /* TW: Check if CRT1 used (or needed; this eg. if no CRT2 detected) */ - if (sis_vbflags & VB_VIDEOBRIDGE) { - - /* TW: No CRT2 output? Then we NEED CRT1! - * We also need CRT1 if depth = 8 and bridge=LVDS|630+301B - */ - if ((!(sis_vbflags & (CRT2_VGA | CRT2_LCD | CRT2_TV))) || ( /*(pScrn->bitsPerPixel == 8) && */ - ((sis_vbflags & (VB_LVDS | VB_CHRONTEL)) || ((sis_vga_engine == SIS_300_VGA) && (sis_vbflags & VB_301B))))) { - sis_crt1_off = 0; - } - /* TW: No CRT2 output? Then we can't use hw overlay on CRT2 */ - if (!(sis_vbflags & (CRT2_VGA | CRT2_LCD | CRT2_TV))) - sis_overlay_on_crt1 = 1; - - } else { /* TW: no video bridge? */ - - /* Then we NEED CRT1... */ - sis_crt1_off = 0; - /* ... and can't use CRT2 for overlay output */ - sis_overlay_on_crt1 = 1; - } - - /* tvstandard options ? */ - - // determine using CRT1 or CRT2? - /* -> NO dualhead right now... */ - if (sis_vbflags & DISPTYPE_DISP2) { - if (sis_crt1_off) { - sis_vbflags |= VB_DISPMODE_SINGLE; - /* TW: No CRT1? Then we use the video overlay on CRT2 */ - sis_overlay_on_crt1 = 0; - } else /* TW: CRT1 and CRT2 - mirror or dual head ----- */ - sis_vbflags |= (VB_DISPMODE_MIRROR | DISPTYPE_CRT1); - } else { /* TW: CRT1 only ------------------------------- */ - sis_vbflags |= (VB_DISPMODE_SINGLE | DISPTYPE_CRT1); - } - - if (sis_verbose > 0) { - printf("[SiS] Using hardware overlay on CRT%d\n", - sis_overlay_on_crt1 ? 1 : 2); - } - -} diff --git a/src/video_out/vidix/drivers/sis_defs.h b/src/video_out/vidix/drivers/sis_defs.h deleted file mode 100644 index 79a61a19b..000000000 --- a/src/video_out/vidix/drivers/sis_defs.h +++ /dev/null @@ -1,106 +0,0 @@ -/** - SiS graphics misc definitions. - - Taken from SiS Xv driver: - Copyright 2002-2003 by Thomas Winischhofer, Vienna, Austria. - - 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 - -**/ - -#ifndef VIDIX_SIS_DEFS_H -#define VIDIX_SIS_DEFS_H - -/** PCI IDs **/ -#define VENDOR_SIS 0x1039 - -#define DEVICE_SIS_300 0x0300 -#define DEVICE_SIS_315H 0x0310 -#define DEVICE_SIS_315 0x0315 -#define DEVICE_SIS_315PRO 0x0325 -#define DEVICE_SIS_330 0x0330 -#define DEVICE_SIS_540 0x0540 -#define DEVICE_SIS_540_VGA 0x5300 -#define DEVICE_SIS_550 0x0550 -#define DEVICE_SIS_550_VGA 0x5315 -#define DEVICE_SIS_630 0x0630 -#define DEVICE_SIS_630_VGA 0x6300 -#define DEVICE_SIS_650 0x0650 -#define DEVICE_SIS_650_VGA 0x6325 -#define DEVICE_SIS_730 0x0730 - - -/* TW: VBFlags */ -#define CRT2_DEFAULT 0x00000001 -#define CRT2_LCD 0x00000002 /* TW: Never change the order of the CRT2_XXX entries */ -#define CRT2_TV 0x00000004 /* (see SISCycleCRT2Type()) */ -#define CRT2_VGA 0x00000008 -#define CRT2_ENABLE (CRT2_LCD | CRT2_TV | CRT2_VGA) -#define DISPTYPE_DISP2 CRT2_ENABLE -#define TV_NTSC 0x00000010 -#define TV_PAL 0x00000020 -#define TV_HIVISION 0x00000040 -#define TV_HIVISION_LV 0x00000080 -#define TV_TYPE (TV_NTSC | TV_PAL | TV_HIVISION | TV_HIVISION_LV) -#define TV_AVIDEO 0x00000100 -#define TV_SVIDEO 0x00000200 -#define TV_SCART 0x00000400 -#define TV_INTERFACE (TV_AVIDEO | TV_SVIDEO | TV_SCART | TV_CHSCART | TV_CHHDTV) -#define VB_USELCDA 0x00000800 -#define TV_PALM 0x00001000 -#define TV_PALN 0x00002000 -#define TV_CHSCART 0x00008000 -#define TV_CHHDTV 0x00010000 -#define VGA2_CONNECTED 0x00040000 -#define DISPTYPE_CRT1 0x00080000 /* TW: CRT1 connected and used */ -#define DISPTYPE_DISP1 DISPTYPE_CRT1 -#define VB_301 0x00100000 /* Video bridge type */ -#define VB_301B 0x00200000 -#define VB_302B 0x00400000 -#define VB_30xBDH 0x00800000 /* 30xB DH version (w/o LCD support) */ -#define VB_LVDS 0x01000000 -#define VB_CHRONTEL 0x02000000 -#define VB_301LV 0x04000000 -#define VB_302LV 0x08000000 -#define VB_30xLV VB_301LV -#define VB_30xLVX VB_302LV -#define VB_TRUMPION 0x10000000 -#define VB_VIDEOBRIDGE (VB_301|VB_301B|VB_302B|VB_301LV|VB_302LV| \ - VB_LVDS|VB_CHRONTEL|VB_TRUMPION) /* TW */ -#define VB_SISBRIDGE (VB_301|VB_301B|VB_302B|VB_301LV|VB_302LV) -#define SINGLE_MODE 0x20000000 /* TW: CRT1 or CRT2; determined by DISPTYPE_CRTx */ -#define VB_DISPMODE_SINGLE SINGLE_MODE /* TW: alias */ -#define MIRROR_MODE 0x40000000 /* TW: CRT1 + CRT2 identical (mirror mode) */ -#define VB_DISPMODE_MIRROR MIRROR_MODE /* TW: alias */ -#define DUALVIEW_MODE 0x80000000 /* TW: CRT1 + CRT2 independent (dual head mode) */ -#define VB_DISPMODE_DUAL DUALVIEW_MODE /* TW: alias */ -#define DISPLAY_MODE (SINGLE_MODE | MIRROR_MODE | DUALVIEW_MODE) /* TW */ - -/* SiS vga engine type */ -#define UNKNOWN_VGA 0 -#define SIS_300_VGA 1 -#define SIS_315_VGA 2 - -extern unsigned int sis_verbose; -extern unsigned short sis_iobase; -extern unsigned int sis_vga_engine; -extern unsigned int sis_vbflags; -extern unsigned int sis_overlay_on_crt1; -extern unsigned int sis_crt1_off; -extern unsigned int sis_detected_crt2_devices; -extern unsigned int sis_force_crt2_type; -extern unsigned int sis_device_id; - -#endif /* VIDIX_SIS_DEFS_H */ diff --git a/src/video_out/vidix/drivers/sis_regs.h b/src/video_out/vidix/drivers/sis_regs.h deleted file mode 100644 index 0157e049a..000000000 --- a/src/video_out/vidix/drivers/sis_regs.h +++ /dev/null @@ -1,412 +0,0 @@ -/** - SiS register definitions and access macros. - From SiS X11 driver. - - Copyright 2001-2003 by Thomas Winischhofer, Vienna, Austria. - - 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 - -**/ - -#ifndef VIDIX_SIS_REGS_H -#define VIDIX_SIS_REGS_H - -#define inSISREG(base) INPORT8(base) -#define outSISREG(base,val) OUTPORT8(base, val) -#define orSISREG(base,val) do { \ - unsigned char __Temp = INPORT8(base); \ - outSISREG(base, __Temp | (val)); \ - } while (0) -#define andSISREG(base,val) do { \ - unsigned char __Temp = INPORT8(base); \ - outSISREG(base, __Temp & (val)); \ - } while (0) - -#define inSISIDXREG(base,idx,var) do { \ - OUTPORT8(base, idx); var=INPORT8((base)+1); \ - } while (0) -#define outSISIDXREG(base,idx,val) do { \ - OUTPORT8(base, idx); OUTPORT8((base)+1, val); \ - } while (0) -#define orSISIDXREG(base,idx,val) do { \ - unsigned char __Temp; \ - OUTPORT8(base, idx); \ - __Temp = INPORT8((base)+1)|(val); \ - outSISIDXREG(base,idx,__Temp); \ - } while (0) -#define andSISIDXREG(base,idx,and) do { \ - unsigned char __Temp; \ - OUTPORT8(base, idx); \ - __Temp = INPORT8((base)+1)&(and); \ - outSISIDXREG(base,idx,__Temp); \ - } while (0) -#define setSISIDXREG(base,idx,and,or) do { \ - unsigned char __Temp; \ - OUTPORT8(base, idx); \ - __Temp = (INPORT8((base)+1)&(and))|(or); \ - outSISIDXREG(base,idx,__Temp); \ - } while (0) - -#define BITMASK(h,l) (((unsigned)(1U << ((h)-(l)+1))-1)<<(l)) -#define GENMASK(mask) BITMASK(1?mask,0?mask) - -#define GETBITS(var,mask) (((var) & GENMASK(mask)) >> (0?mask)) -#define SETBITS(val,mask) ((val) << (0?mask)) -#define SETBIT(n) (1<<(n)) - -#define GETBITSTR(val,from,to) ((GETBITS(val,from)) << (0?to)) -#define SETVARBITS(var,val,from,to) (((var)&(~(GENMASK(to)))) | \ - GETBITSTR(val,from,to)) -#define GETVAR8(var) ((var)&0xFF) -#define SETVAR8(var,val) (var) = GETVAR8(val) - -/* #define VGA_RELIO_BASE 0x380 */ - -#define AROFFSET 0x40 /* VGA_ATTR_INDEX - VGA_RELIO_BASE */ -#define ARROFFSET 0x41 /* VGA_ATTR_DATA_R - VGA_RELIO_BASE */ -#define GROFFSET 0x4e /* VGA_GRAPH_INDEX - VGA_RELIO_BASE */ -#define SROFFSET 0x44 /* VGA_SEQ_INDEX - VGA_RELIO_BASE */ -#define CROFFSET 0x54 /* VGA_CRTC_INDEX_OFFSET + VGA_IOBASE_COLOR - VGA_RELIO_BASE */ -#define MISCROFFSET 0x4c /* VGA_MISC_OUT_R - VGA_RELIO_BASE */ -#define MISCWOFFSET 0x42 /* VGA_MISC_OUT_W - VGA_RELIO_BASE */ -#define INPUTSTATOFFSET 0x5A -#define PART1OFFSET 0x04 -#define PART2OFFSET 0x10 -#define PART3OFFSET 0x12 -#define PART4OFFSET 0x14 -#define PART5OFFSET 0x16 -#define VIDEOOFFSET 0x02 -#define COLREGOFFSET 0x48 - -#define SIS_IOBASE sis_iobase /* var defined in sis_vid.c */ -#define SISAR SIS_IOBASE + AROFFSET -#define SISARR SIS_IOBASE + ARROFFSET -#define SISGR SIS_IOBASE + GROFFSET -#define SISSR SIS_IOBASE + SROFFSET -#define SISCR SIS_IOBASE + CROFFSET -#define SISMISCR SIS_IOBASE + MISCROFFSET -#define SISMISCW SIS_IOBASE + MISCWOFFSET -#define SISINPSTAT SIS_IOBASE + INPUTSTATOFFSET -#define SISPART1 SIS_IOBASE + PART1OFFSET -#define SISPART2 SIS_IOBASE + PART2OFFSET -#define SISPART3 SIS_IOBASE + PART3OFFSET -#define SISPART4 SIS_IOBASE + PART4OFFSET -#define SISPART5 SIS_IOBASE + PART5OFFSET -#define SISVID SIS_IOBASE + VIDEOOFFSET -#define SISCOLIDX SIS_IOBASE + COLREGOFFSET -#define SISCOLDATA SIS_IOBASE + COLREGOFFSET + 1 -#define SISCOL2IDX SISPART5 -#define SISCOL2DATA SISPART5 + 1 - - -#define vc_index_offset 0x00 /* Video capture - unused */ -#define vc_data_offset 0x01 -#define vi_index_offset VIDEOOFFSET -#define vi_data_offset (VIDEOOFFSET + 1) -#define crt2_index_offset PART1OFFSET -#define crt2_port_offset (PART1OFFSET + 1) -#define sr_index_offset SROFFSET -#define sr_data_offset (SROFFSET + 1) -#define cr_index_offset CROFFSET -#define cr_data_offset (CROFFSET + 1) -#define input_stat INPUTSTATOFFSET - -/* For old chipsets (5597/5598, 6326, 530/620) ------------ */ -/* SR (3C4) */ -#define BankReg 0x06 -#define ClockReg 0x07 -#define CPUThreshold 0x08 -#define CRTThreshold 0x09 -#define CRTCOff 0x0A -#define DualBanks 0x0B -#define MMIOEnable 0x0B -#define RAMSize 0x0C -#define Mode64 0x0C -#define ExtConfStatus1 0x0E -#define ClockBase 0x13 -#define LinearAdd0 0x20 -#define LinearAdd1 0x21 -#define GraphEng 0x27 -#define MemClock0 0x28 -#define MemClock1 0x29 -#define XR2A 0x2A -#define XR2B 0x2B -#define TurboQueueBase 0x2C -#define FBSize 0x2F -#define ExtMiscCont5 0x34 -#define ExtMiscCont9 0x3C - -/* 3x4 */ -#define Offset 0x13 - -/* SiS Registers for 300, 540, 630, 730, 315, 550, 650, 740 */ - -/* VGA standard register */ -#define Index_SR_Graphic_Mode 0x06 -#define Index_SR_RAMDAC_Ctrl 0x07 -#define Index_SR_Threshold_Ctrl1 0x08 -#define Index_SR_Threshold_Ctrl2 0x09 -#define Index_SR_Misc_Ctrl 0x0F -#define Index_SR_DDC 0x11 -#define Index_SR_Feature_Connector_Ctrl 0x12 -#define Index_SR_DRAM_Sizing 0x14 -#define Index_SR_DRAM_State_Machine_Ctrl 0x15 -#define Index_SR_AGP_PCI_State_Machine 0x21 -#define Index_SR_Internal_MCLK0 0x28 -#define Index_SR_Internal_MCLK1 0x29 -#define Index_SR_Internal_DCLK1 0x2B -#define Index_SR_Internal_DCLK2 0x2C -#define Index_SR_Internal_DCLK3 0x2D -#define Index_SR_Ext_Clock_Sel 0x32 -#define Index_SR_Int_Status 0x34 -#define Index_SR_Int_Enable 0x35 -#define Index_SR_Int_Reset 0x36 -#define Index_SR_Power_On_Trap 0x38 -#define Index_SR_Power_On_Trap2 0x39 -#define Index_SR_Power_On_Trap3 0x3A - -/* video registers (300/630/730/315/550/650/740 only) */ -#define Index_VI_Passwd 0x00 - -/* Video overlay horizontal start/end, unit=screen pixels */ -#define Index_VI_Win_Hor_Disp_Start_Low 0x01 -#define Index_VI_Win_Hor_Disp_End_Low 0x02 -#define Index_VI_Win_Hor_Over 0x03 /* Overflow */ - -/* Video overlay vertical start/end, unit=screen pixels */ -#define Index_VI_Win_Ver_Disp_Start_Low 0x04 -#define Index_VI_Win_Ver_Disp_End_Low 0x05 -#define Index_VI_Win_Ver_Over 0x06 /* Overflow */ - -/* Y Plane (4:2:0) or YUV (4:2:2) buffer start address, unit=word */ -#define Index_VI_Disp_Y_Buf_Start_Low 0x07 -#define Index_VI_Disp_Y_Buf_Start_Middle 0x08 -#define Index_VI_Disp_Y_Buf_Start_High 0x09 - -/* U Plane (4:2:0) buffer start address, unit=word */ -#define Index_VI_U_Buf_Start_Low 0x0A -#define Index_VI_U_Buf_Start_Middle 0x0B -#define Index_VI_U_Buf_Start_High 0x0C - -/* V Plane (4:2:0) buffer start address, unit=word */ -#define Index_VI_V_Buf_Start_Low 0x0D -#define Index_VI_V_Buf_Start_Middle 0x0E -#define Index_VI_V_Buf_Start_High 0x0F - -/* Pitch for Y, UV Planes, unit=word */ -#define Index_VI_Disp_Y_Buf_Pitch_Low 0x10 -#define Index_VI_Disp_UV_Buf_Pitch_Low 0x11 -#define Index_VI_Disp_Y_UV_Buf_Pitch_Middle 0x12 - -/* What is this ? */ -#define Index_VI_Disp_Y_Buf_Preset_Low 0x13 -#define Index_VI_Disp_Y_Buf_Preset_Middle 0x14 - -#define Index_VI_UV_Buf_Preset_Low 0x15 -#define Index_VI_UV_Buf_Preset_Middle 0x16 -#define Index_VI_Disp_Y_UV_Buf_Preset_High 0x17 - -/* Scaling control registers */ -#define Index_VI_Hor_Post_Up_Scale_Low 0x18 -#define Index_VI_Hor_Post_Up_Scale_High 0x19 -#define Index_VI_Ver_Up_Scale_Low 0x1A -#define Index_VI_Ver_Up_Scale_High 0x1B -#define Index_VI_Scale_Control 0x1C - -/* Playback line buffer control */ -#define Index_VI_Play_Threshold_Low 0x1D -#define Index_VI_Play_Threshold_High 0x1E -#define Index_VI_Line_Buffer_Size 0x1F - -/* Destination color key */ -#define Index_VI_Overlay_ColorKey_Red_Min 0x20 -#define Index_VI_Overlay_ColorKey_Green_Min 0x21 -#define Index_VI_Overlay_ColorKey_Blue_Min 0x22 -#define Index_VI_Overlay_ColorKey_Red_Max 0x23 -#define Index_VI_Overlay_ColorKey_Green_Max 0x24 -#define Index_VI_Overlay_ColorKey_Blue_Max 0x25 - -/* Source color key, YUV color space */ -#define Index_VI_Overlay_ChromaKey_Red_Y_Min 0x26 -#define Index_VI_Overlay_ChromaKey_Green_U_Min 0x27 -#define Index_VI_Overlay_ChromaKey_Blue_V_Min 0x28 -#define Index_VI_Overlay_ChromaKey_Red_Y_Max 0x29 -#define Index_VI_Overlay_ChromaKey_Green_U_Max 0x2A -#define Index_VI_Overlay_ChromaKey_Blue_V_Max 0x2B - -/* Contrast enhancement and brightness control */ -#define Index_VI_Contrast_Factor 0x2C /* obviously unused/undefined */ -#define Index_VI_Brightness 0x2D -#define Index_VI_Contrast_Enh_Ctrl 0x2E - -#define Index_VI_Key_Overlay_OP 0x2F - -#define Index_VI_Control_Misc0 0x30 -#define Index_VI_Control_Misc1 0x31 -#define Index_VI_Control_Misc2 0x32 - -/* TW: Subpicture registers */ -#define Index_VI_SubPict_Buf_Start_Low 0x33 -#define Index_VI_SubPict_Buf_Start_Middle 0x34 -#define Index_VI_SubPict_Buf_Start_High 0x35 - -/* TW: What is this ? */ -#define Index_VI_SubPict_Buf_Preset_Low 0x36 -#define Index_VI_SubPict_Buf_Preset_Middle 0x37 - -/* TW: Subpicture pitch, unit=16 bytes */ -#define Index_VI_SubPict_Buf_Pitch 0x38 - -/* TW: Subpicture scaling control */ -#define Index_VI_SubPict_Hor_Scale_Low 0x39 -#define Index_VI_SubPict_Hor_Scale_High 0x3A -#define Index_VI_SubPict_Vert_Scale_Low 0x3B -#define Index_VI_SubPict_Vert_Scale_High 0x3C - -#define Index_VI_SubPict_Scale_Control 0x3D -/* (0x40 = enable/disable subpicture) */ - -/* TW: Subpicture line buffer control */ -#define Index_VI_SubPict_Threshold 0x3E - -/* TW: What is this? */ -#define Index_VI_FIFO_Max 0x3F - -/* TW: Subpicture palette; 16 colors, total 32 bytes address space */ -#define Index_VI_SubPict_Pal_Base_Low 0x40 -#define Index_VI_SubPict_Pal_Base_High 0x41 - -/* I wish I knew how to use these ... */ -#define Index_MPEG_Read_Ctrl0 0x60 /* MPEG auto flip */ -#define Index_MPEG_Read_Ctrl1 0x61 /* MPEG auto flip */ -#define Index_MPEG_Read_Ctrl2 0x62 /* MPEG auto flip */ -#define Index_MPEG_Read_Ctrl3 0x63 /* MPEG auto flip */ - -/* TW: MPEG AutoFlip scale */ -#define Index_MPEG_Ver_Up_Scale_Low 0x64 -#define Index_MPEG_Ver_Up_Scale_High 0x65 - -#define Index_MPEG_Y_Buf_Preset_Low 0x66 -#define Index_MPEG_Y_Buf_Preset_Middle 0x67 -#define Index_MPEG_UV_Buf_Preset_Low 0x68 -#define Index_MPEG_UV_Buf_Preset_Middle 0x69 -#define Index_MPEG_Y_UV_Buf_Preset_High 0x6A - -/* TW: The following registers only exist on the 310/325 series */ - -/* TW: Bit 16:24 of Y_U_V buf start address (?) */ -#define Index_VI_Y_Buf_Start_Over 0x6B -#define Index_VI_U_Buf_Start_Over 0x6C -#define Index_VI_V_Buf_Start_Over 0x6D - -#define Index_VI_Disp_Y_Buf_Pitch_High 0x6E -#define Index_VI_Disp_UV_Buf_Pitch_High 0x6F - -/* Hue and saturation */ -#define Index_VI_Hue 0x70 -#define Index_VI_Saturation 0x71 - -#define Index_VI_SubPict_Start_Over 0x72 -#define Index_VI_SubPict_Buf_Pitch_High 0x73 - -#define Index_VI_Control_Misc3 0x74 - - -/* TW: Bits (and helpers) for Index_VI_Control_Misc0 */ -#define VI_Misc0_Enable_Overlay 0x02 -#define VI_Misc0_420_Plane_Enable 0x04 /* Select Plane or Packed mode */ -#define VI_Misc0_422_Enable 0x20 /* Select 422 or 411 mode */ -#define VI_Misc0_Fmt_YVU420P 0x0C /* YUV420 Planar (I420, YV12) */ -#define VI_Misc0_Fmt_YUYV 0x28 /* YUYV Packed (YUY2) */ -#define VI_Misc0_Fmt_UYVY 0x08 /* (UYVY) */ - -/* TW: Bits for Index_VI_Control_Misc1 */ -/* #define VI_Misc1_? 0x01 */ -#define VI_Misc1_BOB_Enable 0x02 -#define VI_Misc1_Line_Merge 0x04 -#define VI_Misc1_Field_Mode 0x08 -/* #define VI_Misc1_? 0x10 */ -#define VI_Misc1_Non_Interleave 0x20 /* 300 series only? */ -#define VI_Misc1_Buf_Addr_Lock 0x20 /* 310 series only? */ -/* #define VI_Misc1_? 0x40 */ -/* #define VI_Misc1_? 0x80 */ - -/* TW: Bits for Index_VI_Control_Misc2 */ -#define VI_Misc2_Select_Video2 0x01 -#define VI_Misc2_Video2_On_Top 0x02 -/* #define VI_Misc2_? 0x04 */ -#define VI_Misc2_Vertical_Interpol 0x08 -#define VI_Misc2_Dual_Line_Merge 0x10 -#define VI_Misc2_All_Line_Merge 0x20 /* 310 series only? */ -#define VI_Misc2_Auto_Flip_Enable 0x40 /* 300 series only? */ -#define VI_Misc2_Video_Reg_Write_Enable 0x80 /* 310 series only? */ - -/* TW: Bits for Index_VI_Control_Misc3 */ -#define VI_Misc3_Submit_Video_1 0x01 /* AKA "address ready" */ -#define VI_Misc3_Submit_Video_2 0x02 /* AKA "address ready" */ -#define VI_Misc3_Submit_SubPict 0x04 /* AKA "address ready" */ - -/* TW: Values for Index_VI_Key_Overlay_OP (0x2F) */ -#define VI_ROP_Never 0x00 -#define VI_ROP_DestKey 0x03 -#define VI_ROP_Always 0x0F - -/* - * CRT_2 function control register --------------------------------- - */ -#define Index_CRT2_FC_CONTROL 0x00 -#define Index_CRT2_FC_SCREEN_HIGH 0x04 -#define Index_CRT2_FC_SCREEN_MID 0x05 -#define Index_CRT2_FC_SCREEN_LOW 0x06 -#define Index_CRT2_FC_ENABLE_WRITE 0x24 -#define Index_CRT2_FC_VR 0x25 -#define Index_CRT2_FC_VCount 0x27 -#define Index_CRT2_FC_VCount1 0x28 - -#define Index_310_CRT2_FC_VR 0x30 /* d[1] = vertical retrace */ -#define Index_310_CRT2_FC_RT 0x33 /* d[7] = retrace in progress */ - -/* video attributes - these should probably be configurable on the fly - * so users with different desktop sizes can keep - * captured data off the desktop - */ -#define _VINWID 704 -#define _VINHGT _VINHGT_NTSC -#define _VINHGT_NTSC 240 -#define _VINHGT_PAL 290 -#define _VIN_WINDOW (704 * 291 * 2) -#define _VBI_WINDOW (704 * 64 * 2) - -#define _VIN_FIELD_EVEN 1 -#define _VIN_FIELD_ODD 2 -#define _VIN_FIELD_BOTH 4 - - -/* i2c registers (TW; not on 300/310/325 series) */ -#define X_INDEXREG 0x14 -#define X_PORTREG 0x15 -#define X_DATA 0x0f -#define I2C_SCL 0x00 -#define I2C_SDA 0x01 -#define I2C_DELAY 10 - -/* mmio registers for video */ -#define REG_PRIM_CRT_COUNTER 0x8514 - -/* TW: MPEG MMIO registers (630 and later) ----------------------------*/ - -/* Not public (yet?) */ - -#endif /* VIDIX_SIS_REGS_H */ diff --git a/src/video_out/vidix/drivers/sis_vid.c b/src/video_out/vidix/drivers/sis_vid.c deleted file mode 100644 index c3ef2bdcf..000000000 --- a/src/video_out/vidix/drivers/sis_vid.c +++ /dev/null @@ -1,1562 +0,0 @@ -/** - VIDIX driver for SiS 300 and 310/325 series chips. - - Copyright 2003 Jake Page, Sugar Media. - - Based on SiS Xv driver: - Copyright 2002-2003 by Thomas Winischhofer, Vienna, Austria. - - 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 - - 2003/10/08 integrated into mplayer/vidix architecture -- Alex Beregszaszi -**/ - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include <unistd.h> - -#include "vidix.h" -#include "fourcc.h" -#include "libdha.h" -#include "pci_ids.h" -#include "pci_names.h" - -#include "sis_regs.h" -#include "sis_defs.h" - - -/** Random defines **/ - -#define WATCHDOG_DELAY 500000 /* Watchdog counter for retrace waiting */ -#define IMAGE_MIN_WIDTH 32 /* Min and max source image sizes */ -#define IMAGE_MIN_HEIGHT 24 -#define IMAGE_MAX_WIDTH 720 -#define IMAGE_MAX_HEIGHT 576 -#define IMAGE_MAX_WIDTH_M650 1920 -#define IMAGE_MAX_HEIGHT_M650 1080 - -#define OVERLAY_MIN_WIDTH 32 /* Minimum overlay sizes */ -#define OVERLAY_MIN_HEIGHT 24 - -#define DISPMODE_SINGLE1 0x1 /* TW: CRT1 only */ -#define DISPMODE_SINGLE2 0x2 /* TW: CRT2 only */ -#define DISPMODE_MIRROR 0x4 /* TW: CRT1 + CRT2 MIRROR */ - -#define VMODE_INTERLACED 0x1 -#define VMODE_DOUBLESCAN 0x2 - -typedef struct { - short x1, y1, x2, y2; -} BoxRec; - -typedef struct { - int pixelFormat; - - uint16_t pitch; - uint16_t origPitch; - - uint8_t keyOP; - uint16_t HUSF; - uint16_t VUSF; - uint8_t IntBit; - uint8_t wHPre; - - uint16_t srcW; - uint16_t srcH; - - BoxRec dstBox; - - uint32_t PSY; - uint32_t PSV; - uint32_t PSU; - uint8_t bobEnable; - - uint8_t contrastCtrl; - uint8_t contrastFactor; - - uint8_t lineBufSize; - - uint8_t(*VBlankActiveFunc) (); - - uint16_t SCREENheight; - -} SISOverlayRec, *SISOverlayPtr; - - -/** static variable definitions **/ -static int sis_probed = 0; -static pciinfo_t pci_info; -unsigned int sis_verbose = 0; - -static void *sis_mem_base; -/* static void *sis_reg_base; */ -unsigned short sis_iobase; - -unsigned int sis_vga_engine = UNKNOWN_VGA; -static unsigned int sis_displaymode = DISPMODE_SINGLE1; -static unsigned int sis_has_two_overlays = 0; -static unsigned int sis_bridge_is_slave = 0; -static unsigned int sis_shift_value = 1; -static unsigned int sis_vmode = 0; -unsigned int sis_vbflags = DISPTYPE_DISP1; -unsigned int sis_overlay_on_crt1 = 1; -unsigned int sis_crt1_off = -1; -unsigned int sis_detected_crt2_devices; -unsigned int sis_force_crt2_type = CRT2_DEFAULT; -unsigned int sis_device_id = -1; - -static int sis_format; -static int sis_Yoff = 0; -static int sis_Voff = 0; -static int sis_Uoff = 0; -static int sis_screen_width = 640; -static int sis_screen_height = 480; - -static int sis_frames[VID_PLAY_MAXFRAMES]; - -static vidix_grkey_t sis_grkey; - -static vidix_capability_t sis_cap = { - "SiS 300/310/325 Video Driver", - "Jake Page", - TYPE_OUTPUT, - {0, 0, 0, 0}, - 2048, - 2048, - 4, - 4, - -1, - FLAG_UPSCALER | FLAG_DOWNSCALER | FLAG_EQUALIZER, - VENDOR_SIS, - -1, - {0, 0, 0, 0} -}; - -vidix_video_eq_t sis_equal = { - VEQ_CAP_BRIGHTNESS | VEQ_CAP_CONTRAST, - 200, 0, 0, 0, 0, 0, 0, 0 -}; - -static unsigned short sis_card_ids[] = { - DEVICE_SIS_300, - DEVICE_SIS_315H, - DEVICE_SIS_315, - DEVICE_SIS_315PRO, - DEVICE_SIS_330, - DEVICE_SIS_540_VGA, - DEVICE_SIS_550_VGA, - DEVICE_SIS_630_VGA, - DEVICE_SIS_650_VGA -}; - -/** function declarations **/ - -extern void sis_init_video_bridge(); - - -static void set_overlay(SISOverlayPtr pOverlay, int index); -static void close_overlay(void); -static void calc_scale_factor(SISOverlayPtr pOverlay, - int index, int iscrt2); -static void set_line_buf_size(SISOverlayPtr pOverlay); -static void merge_line_buf(int enable); -static void set_format(SISOverlayPtr pOverlay); -static void set_colorkey(void); - -static void set_brightness(uint8_t brightness); -static void set_contrast(uint8_t contrast); -static void set_saturation(char saturation); -static void set_hue(uint8_t hue); -#if 0 -static void set_alpha(uint8_t alpha); -#endif - -/* IO Port access functions */ -static uint8_t getvideoreg(uint8_t reg) -{ - uint8_t ret; - inSISIDXREG(SISVID, reg, ret); - return (ret); -} - -static void setvideoreg(uint8_t reg, uint8_t data) -{ - outSISIDXREG(SISVID, reg, data); -} - -static void setvideoregmask(uint8_t reg, uint8_t data, uint8_t mask) -{ - uint8_t old; - - inSISIDXREG(SISVID, reg, old); - data = (data & mask) | (old & (~mask)); - outSISIDXREG(SISVID, reg, data); -} - -static void setsrregmask(uint8_t reg, uint8_t data, uint8_t mask) -{ - uint8_t old; - - inSISIDXREG(SISSR, reg, old); - data = (data & mask) | (old & (~mask)); - outSISIDXREG(SISSR, reg, data); -} - -/* vblank checking*/ -static uint8_t vblank_active_CRT1() -{ - /* this may be too simplistic? */ - return (inSISREG(SISINPSTAT) & 0x08); -} - -static uint8_t vblank_active_CRT2() -{ - uint8_t ret; - if (sis_vga_engine == SIS_315_VGA) { - inSISIDXREG(SISPART1, Index_310_CRT2_FC_VR, ret); - } else { - inSISIDXREG(SISPART1, Index_CRT2_FC_VR, ret); - } - return ((ret & 0x02) ^ 0x02); -} - - -unsigned int vixGetVersion(void) -{ - return (VIDIX_VERSION); -} - -static int find_chip(unsigned chip_id) -{ - unsigned i; - for (i = 0; i < sizeof(sis_card_ids) / sizeof(unsigned short); i++) { - if (chip_id == sis_card_ids[i]) - return i; - } - return -1; -} - -int vixProbe(int verbose, int force) -{ - pciinfo_t lst[MAX_PCI_DEVICES]; - unsigned i, num_pci; - int err; - - sis_verbose = verbose; - force = force; - err = pci_scan(lst, &num_pci); - if (err) { - printf("[SiS] Error occurred during pci scan: %s\n", strerror(err)); - return err; - } else if(!enable_app_io()){ - err = ENXIO; - for (i = 0; i < num_pci; i++) { - if (lst[i].vendor == VENDOR_SIS) { - int idx; - const char *dname; - idx = find_chip(lst[i].device); - if (idx == -1) - continue; - dname = pci_device_name(VENDOR_SIS, lst[i].device); - dname = dname ? dname : "Unknown chip"; - if (sis_verbose > 0) - printf("[SiS] Found chip: %s (0x%X)\n", - dname, lst[i].device); - sis_device_id = sis_cap.device_id = lst[i].device; - err = 0; - memcpy(&pci_info, &lst[i], sizeof(pciinfo_t)); - - sis_has_two_overlays = 0; - switch (sis_cap.device_id) { - case DEVICE_SIS_300: - case DEVICE_SIS_630_VGA: - sis_has_two_overlays = 1; - case DEVICE_SIS_540_VGA: - sis_vga_engine = SIS_300_VGA; - break; - case DEVICE_SIS_330: - case DEVICE_SIS_550_VGA: - sis_has_two_overlays = 1; - case DEVICE_SIS_315H: - case DEVICE_SIS_315: - case DEVICE_SIS_315PRO: - case DEVICE_SIS_650_VGA: - /* M650 & 651 have 2 overlays */ - /* JCP: I think this works, but not really tested yet */ - { - unsigned char CR5F; - unsigned char tempreg1, tempreg2; - - inSISIDXREG(SISCR, 0x5F, CR5F); - CR5F &= 0xf0; - andSISIDXREG(SISCR, 0x5c, 0x07); - inSISIDXREG(SISCR, 0x5c, tempreg1); - tempreg1 &= 0xf8; - setSISIDXREG(SISCR, 0x5c, 0x07, 0xf8); - inSISIDXREG(SISCR, 0x5c, tempreg2); - tempreg2 &= 0xf8; - if ((!tempreg1) || (tempreg2)) { - if (CR5F & 0x80) { - sis_has_two_overlays = 1; - } - } else { - sis_has_two_overlays = 1; /* ? */ - } - if (sis_has_two_overlays) { - if (sis_verbose > 0) - printf - ("[SiS] detected M650/651 with 2 overlays\n"); - } - } - sis_vga_engine = SIS_315_VGA; - break; - default: - /* should never get here */ - sis_vga_engine = UNKNOWN_VGA; - break; - } - } - } - } else { - err = EPERM; - } - - if (err && sis_verbose) { - printf("[SiS] Can't find chip\n"); - } else { - sis_probed = 1; - } - - return err; -} - -int vixInit(const char *args) -{ - uint8_t sr_data, cr_data, cr_data2; - char *env_overlay_crt; - - if (!sis_probed) { - printf("[SiS] driver was not probed but is being initialized\n"); - return (EINTR); - } - - /* JCP: this is WRONG. Need to coordinate w/ sisfb to use correct mem */ - /* map 16MB scary hack for now. */ - sis_mem_base = map_phys_mem(pci_info.base0, 0x1000000); - /* sis_reg_base = map_phys_mem(pci_info.base1, 0x20000); */ - sis_iobase = pci_info.base2 & 0xFFFC; - - /* would like to use fb ioctl - or some other method - here to get - current resolution. */ - inSISIDXREG(SISCR, 0x12, cr_data); - inSISIDXREG(SISCR, 0x07, cr_data2); - sis_screen_height = - ((cr_data & 0xff) | ((uint16_t) (cr_data2 & 0x02) << 7) | - ((uint16_t) (cr_data2 & 0x40) << 3) | ((uint16_t) (cr_data & 0x02) - << 9)) + 1; - - inSISIDXREG(SISSR, 0x0b, sr_data); - inSISIDXREG(SISCR, 0x01, cr_data); - sis_screen_width = (((cr_data & 0xff) | - ((uint16_t) (sr_data & 0x0C) << 6)) + 1) * 8; - - inSISIDXREG(SISSR, Index_SR_Graphic_Mode, sr_data); - if (sr_data & 0x20) /* interlaced mode */ - sis_vmode |= VMODE_INTERLACED; - -#if 0 /* getting back false data here... */ - /* CR9 bit 7 set = double scan active */ - inSISIDXREG(SISCR, 0x09, cr_data); - if (cr_data & 0x40) { - sis_vmode |= VMODE_DOUBLESCAN; - } -#endif - - /* JCP: eventually I'd like to replace this with a call to sisfb - SISFB_GET_INFO ioctl to get video bridge info. Not for now, - since it requires a very new and not widely distributed version. */ - sis_init_video_bridge(); - - env_overlay_crt = getenv("VIDIX_CRT"); - if (env_overlay_crt) { - int crt = atoi(env_overlay_crt); - if (crt == 1 || crt == 2) { - sis_overlay_on_crt1 = (crt == 1); - if (sis_verbose > 0) { - printf - ("[SiS] override: using overlay on CRT%d from VIDIX_CRT\n", - crt); - } - } - } - - return 0; -} - -void vixDestroy(void) -{ - /* unmap_phys_mem(sis_reg_base, 0x20000); */ - /* JCP: see above, hence also a hack. */ - unmap_phys_mem(sis_mem_base, 0x1000000); -} - -int vixGetCapability(vidix_capability_t * to) -{ - memcpy(to, &sis_cap, sizeof(vidix_capability_t)); - return 0; -} - -static int is_supported_fourcc(uint32_t fourcc) -{ - switch (fourcc) { - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_UYVY: - case IMGFMT_YUY2: - case IMGFMT_RGB15: - case IMGFMT_RGB16: - return 1; - default: - return 0; - } -} - -int vixQueryFourcc(vidix_fourcc_t * to) -{ - if (is_supported_fourcc(to->fourcc)) { - to->depth = VID_DEPTH_8BPP | VID_DEPTH_16BPP | VID_DEPTH_32BPP; - to->flags = VID_CAP_EXPAND | VID_CAP_SHRINK | VID_CAP_COLORKEY; - return 0; - } else - to->depth = to->flags = 0; - return ENOSYS; -} - -static int bridge_in_slave_mode() -{ - unsigned char usScratchP1_00; - - if (!(sis_vbflags & VB_VIDEOBRIDGE)) - return 0; - - inSISIDXREG(SISPART1, 0x00, usScratchP1_00); - if (((sis_vga_engine == SIS_300_VGA) - && (usScratchP1_00 & 0xa0) == 0x20) - || ((sis_vga_engine == SIS_315_VGA) - && (usScratchP1_00 & 0x50) == 0x10)) { - return 1; - } else { - return 0; - } -} - -/* This does not handle X dual head mode, since 1) vidix doesn't support it - and 2) it doesn't make sense for other gfx drivers */ -static void set_dispmode() -{ - sis_bridge_is_slave = 0; - - if (bridge_in_slave_mode()) - sis_bridge_is_slave = 1; - - if ((sis_vbflags & VB_DISPMODE_MIRROR) || - (sis_bridge_is_slave && (sis_vbflags & DISPTYPE_DISP2))) { - if (sis_has_two_overlays) - sis_displaymode = DISPMODE_MIRROR; /* TW: CRT1+CRT2 (2 overlays) */ - else if (!sis_overlay_on_crt1) - sis_displaymode = DISPMODE_SINGLE2; - else - sis_displaymode = DISPMODE_SINGLE1; - } else { - if (sis_vbflags & DISPTYPE_DISP1) { - sis_displaymode = DISPMODE_SINGLE1; /* TW: CRT1 only */ - } else { - sis_displaymode = DISPMODE_SINGLE2; /* TW: CRT2 only */ - } - } -} - -static void set_disptype_regs() -{ - switch (sis_displaymode) { - case DISPMODE_SINGLE1: /* TW: CRT1 only */ - if (sis_verbose > 2) { - printf("[SiS] Setting up overlay on CRT1\n"); - } - if (sis_has_two_overlays) { - setsrregmask(0x06, 0x00, 0xc0); - setsrregmask(0x32, 0x00, 0xc0); - } else { - setsrregmask(0x06, 0x00, 0xc0); - setsrregmask(0x32, 0x00, 0xc0); - } - break; - case DISPMODE_SINGLE2: /* TW: CRT2 only */ - if (sis_verbose > 2) { - printf("[SiS] Setting up overlay on CRT2\n"); - } - if (sis_has_two_overlays) { - setsrregmask(0x06, 0x80, 0xc0); - setsrregmask(0x32, 0x80, 0xc0); - } else { - setsrregmask(0x06, 0x40, 0xc0); - setsrregmask(0x32, 0x40, 0xc0); - } - break; - case DISPMODE_MIRROR: /* TW: CRT1 + CRT2 */ - default: - if (sis_verbose > 2) { - printf("[SiS] Setting up overlay on CRT1 AND CRT2!\n"); - } - setsrregmask(0x06, 0x80, 0xc0); - setsrregmask(0x32, 0x80, 0xc0); - break; - } -} - -static void init_overlay() -{ - /* Initialize first overlay (CRT1) */ - - /* Write-enable video registers */ - setvideoregmask(Index_VI_Control_Misc2, 0x80, 0x81); - - /* Disable overlay */ - setvideoregmask(Index_VI_Control_Misc0, 0x00, 0x02); - - /* Disable bobEnable */ - setvideoregmask(Index_VI_Control_Misc1, 0x02, 0x02); - - /* Reset scale control and contrast */ - setvideoregmask(Index_VI_Scale_Control, 0x60, 0x60); - setvideoregmask(Index_VI_Contrast_Enh_Ctrl, 0x04, 0x1F); - - setvideoreg(Index_VI_Disp_Y_Buf_Preset_Low, 0x00); - setvideoreg(Index_VI_Disp_Y_Buf_Preset_Middle, 0x00); - setvideoreg(Index_VI_UV_Buf_Preset_Low, 0x00); - setvideoreg(Index_VI_UV_Buf_Preset_Middle, 0x00); - setvideoreg(Index_VI_Disp_Y_UV_Buf_Preset_High, 0x00); - setvideoreg(Index_VI_Play_Threshold_Low, 0x00); - setvideoreg(Index_VI_Play_Threshold_High, 0x00); - - /* may not want to init these here, could already be set to other - values by app? */ - setvideoregmask(Index_VI_Control_Misc2, 0x00, 0x01); - setvideoregmask(Index_VI_Contrast_Enh_Ctrl, 0x04, 0x07); - setvideoreg(Index_VI_Brightness, 0x20); - if (sis_vga_engine == SIS_315_VGA) { - setvideoreg(Index_VI_Hue, 0x00); - setvideoreg(Index_VI_Saturation, 0x00); - } - - /* Initialize second overlay (CRT2) */ - if (sis_has_two_overlays) { - /* Write-enable video registers */ - setvideoregmask(Index_VI_Control_Misc2, 0x81, 0x81); - - /* Disable overlay */ - setvideoregmask(Index_VI_Control_Misc0, 0x00, 0x02); - - /* Disable bobEnable */ - setvideoregmask(Index_VI_Control_Misc1, 0x02, 0x02); - - /* Reset scale control and contrast */ - setvideoregmask(Index_VI_Scale_Control, 0x60, 0x60); - setvideoregmask(Index_VI_Contrast_Enh_Ctrl, 0x04, 0x1F); - - setvideoreg(Index_VI_Disp_Y_Buf_Preset_Low, 0x00); - setvideoreg(Index_VI_Disp_Y_Buf_Preset_Middle, 0x00); - setvideoreg(Index_VI_UV_Buf_Preset_Low, 0x00); - setvideoreg(Index_VI_UV_Buf_Preset_Middle, 0x00); - setvideoreg(Index_VI_Disp_Y_UV_Buf_Preset_High, 0x00); - setvideoreg(Index_VI_Play_Threshold_Low, 0x00); - setvideoreg(Index_VI_Play_Threshold_High, 0x00); - - setvideoregmask(Index_VI_Control_Misc2, 0x01, 0x01); - setvideoregmask(Index_VI_Contrast_Enh_Ctrl, 0x04, 0x07); - setvideoreg(Index_VI_Brightness, 0x20); - if (sis_vga_engine == SIS_315_VGA) { - setvideoreg(Index_VI_Hue, 0x00); - setvideoreg(Index_VI_Saturation, 0x00); - } - } -} - -int vixConfigPlayback(vidix_playback_t * info) -{ - SISOverlayRec overlay; - int srcOffsetX = 0, srcOffsetY = 0; - int sx, sy; - int index = 0, iscrt2 = 0; - int total_size; - - short src_w, drw_w; - short src_h, drw_h; - short src_x, drw_x; - short src_y, drw_y; - long dga_offset; - int pitch; - unsigned int i; - - if (!is_supported_fourcc(info->fourcc)) - return -1; - - /* set chipset/engine.dependent config info */ - /* which CRT to use, etc.? */ - switch (sis_vga_engine) { - case SIS_315_VGA: - sis_shift_value = 1; - sis_equal.cap |= VEQ_CAP_SATURATION | VEQ_CAP_HUE; - break; - case SIS_300_VGA: - default: - sis_shift_value = 2; - break; - } - - sis_displaymode = DISPMODE_SINGLE1; /* xV driver code in set_dispmode() */ - set_dispmode(); - - set_disptype_regs(); - - init_overlay(); - - /* get basic dimension info */ - src_x = info->src.x; - src_y = info->src.y; - src_w = info->src.w; - src_h = info->src.h; - - drw_x = info->dest.x; - drw_y = info->dest.y; - drw_w = info->dest.w; - drw_h = info->dest.h; - - switch (info->fourcc) { - case IMGFMT_YV12: - case IMGFMT_I420: - pitch = (src_w + 7) & ~7; - total_size = (pitch * src_h * 3) >> 1; - break; - case IMGFMT_YUY2: - case IMGFMT_UYVY: - case IMGFMT_RGB15: - case IMGFMT_RGB16: - pitch = ((src_w << 1) + 3) & ~3; - total_size = pitch * src_h; - break; - default: - return -1; - } - - /* "allocate" memory for overlay! */ - /* start at 8MB = sisfb's "dri reserved space" - - really shouldn't hardcode though */ - /* XXX: JCP - this can use the sisfb FBIO_ALLOC ioctl to safely - allocate "video heap" memory... */ - dga_offset = 0x800000; - - /* use 7MB for now. need to calc/get real info from sisfb? */ - /* this can result in a LOT of frames - probably not necessary */ - info->num_frames = 0x700000 / (total_size * 2); - if (info->num_frames > VID_PLAY_MAXFRAMES) - info->num_frames = VID_PLAY_MAXFRAMES; - - info->dga_addr = sis_mem_base + dga_offset; - info->dest.pitch.y = 16; - info->dest.pitch.u = 16; - info->dest.pitch.v = 16; - info->offset.y = 0; - info->offset.u = 0; - info->offset.v = 0; - info->frame_size = (total_size * 2); /* why times 2 ? */ - for (i = 0; i < info->num_frames; i++) { - info->offsets[i] = info->frame_size * i; - /* save ptrs to mem buffers */ - sis_frames[i] = (dga_offset + info->offsets[i]); - } - - memset(&overlay, 0, sizeof(overlay)); - overlay.pixelFormat = sis_format = info->fourcc; - overlay.pitch = overlay.origPitch = pitch; - - - overlay.keyOP = (sis_grkey.ckey.op == CKEY_TRUE ? - VI_ROP_DestKey : VI_ROP_Always); - - overlay.bobEnable = 0x00; - - overlay.SCREENheight = sis_screen_height; - - /* probably will not support X virtual screen > phys very well? */ - overlay.dstBox.x1 = drw_x; /* - pScrn->frameX0; */ - overlay.dstBox.x2 = drw_x + drw_w; /* - pScrn->frameX0; ??? */ - overlay.dstBox.y1 = drw_y; /* - pScrn->frameY0; */ - overlay.dstBox.y2 = drw_y + drw_h; /* - pScrn->frameY0; ??? */ - - if ((overlay.dstBox.x1 > overlay.dstBox.x2) || - (overlay.dstBox.y1 > overlay.dstBox.y2)) - return -1; - - if ((overlay.dstBox.x2 < 0) || (overlay.dstBox.y2 < 0)) - return -1; - - if (overlay.dstBox.x1 < 0) { - srcOffsetX = src_w * (-overlay.dstBox.x1) / drw_w; - overlay.dstBox.x1 = 0; - } - if (overlay.dstBox.y1 < 0) { - srcOffsetY = src_h * (-overlay.dstBox.y1) / drw_h; - overlay.dstBox.y1 = 0; - } - - switch (info->fourcc) { - case IMGFMT_YV12: - info->dest.pitch.y = 16; - sx = (src_x + srcOffsetX) & ~7; - sy = (src_y + srcOffsetY) & ~1; - info->offset.y = sis_Yoff = sx + sy * pitch; - /* JCP: NOTE reversed u & v here! Not sure why this is needed. - maybe mplayer & sis define U & V differently?? */ - info->offset.u = sis_Voff = - src_h * pitch + ((sx + sy * pitch / 2) >> 1); - info->offset.v = sis_Uoff = - src_h * pitch * 5 / 4 + ((sx + sy * pitch / 2) >> 1); - - overlay.PSY = (sis_frames[0] + sis_Yoff) >> sis_shift_value; - overlay.PSV = (sis_frames[0] + sis_Voff) >> sis_shift_value; - overlay.PSU = (sis_frames[0] + sis_Uoff) >> sis_shift_value; - break; - case IMGFMT_I420: - sx = (src_x + srcOffsetX) & ~7; - sy = (src_y + srcOffsetY) & ~1; - info->offset.y = sis_Yoff = sx + sy * pitch; - /* JCP: see above... */ - info->offset.u = sis_Voff = - src_h * pitch * 5 / 4 + ((sx + sy * pitch / 2) >> 1); - info->offset.v = sis_Uoff = - src_h * pitch + ((sx + sy * pitch / 2) >> 1); - - overlay.PSY = (sis_frames[0] + sis_Yoff) >> sis_shift_value; - overlay.PSV = (sis_frames[0] + sis_Voff) >> sis_shift_value; - overlay.PSU = (sis_frames[0] + sis_Uoff) >> sis_shift_value; - break; - case IMGFMT_YUY2: - case IMGFMT_UYVY: - case IMGFMT_RGB16: - case IMGFMT_RGB15: - default: - sx = (src_x + srcOffsetX) & ~1; - sy = (src_y + srcOffsetY); - info->offset.y = sis_Yoff = sx * 2 + sy * pitch; - - overlay.PSY = (sis_frames[0] + sis_Yoff) >> sis_shift_value; - break; - } - - /* FIXME: is it possible that srcW < 0? */ - overlay.srcW = src_w - (sx - src_x); - overlay.srcH = src_h - (sy - src_y); - - /* JCP: what to do about this? */ -#if 0 - if ((pPriv->oldx1 != overlay.dstBox.x1) || - (pPriv->oldx2 != overlay.dstBox.x2) || - (pPriv->oldy1 != overlay.dstBox.y1) || - (pPriv->oldy2 != overlay.dstBox.y2)) { - pPriv->mustwait = 1; - pPriv->oldx1 = overlay.dstBox.x1; - pPriv->oldx2 = overlay.dstBox.x2; - pPriv->oldy1 = overlay.dstBox.y1; - pPriv->oldy2 = overlay.dstBox.y2; - } -#endif - - /* set merge line buffer */ - merge_line_buf(overlay.srcW > 384); - - /* calculate line buffer length */ - set_line_buf_size(&overlay); - - if (sis_displaymode == DISPMODE_SINGLE2) { - if (sis_has_two_overlays) { - /* TW: On chips with two overlays we use - * overlay 2 for CRT2 */ - index = 1; - iscrt2 = 1; - } else { - /* TW: On chips with only one overlay we - * use that only overlay for CRT2 */ - index = 0; - iscrt2 = 1; - } - overlay.VBlankActiveFunc = vblank_active_CRT2; - /* overlay.GetScanLineFunc = get_scanline_CRT2; */ - } else { - index = 0; - iscrt2 = 0; - overlay.VBlankActiveFunc = vblank_active_CRT1; - /* overlay.GetScanLineFunc = get_scanline_CRT1; */ - } - - /* calc scale factor (to use below) */ - calc_scale_factor(&overlay, index, iscrt2); - - /* Select video1 (used for CRT1) or video2 (used for CRT2) */ - setvideoregmask(Index_VI_Control_Misc2, index, 0x01); - - set_format(&overlay); - - set_colorkey(); - - vixPlaybackSetEq(&sis_equal); - - /* set up video overlay registers */ - set_overlay(&overlay, index); - - /* prevent badness if bits are not at default setting */ - setvideoregmask(Index_VI_Control_Misc1, 0x00, 0x01); - setvideoregmask(Index_VI_Control_Misc2, 0x00, 0x04); - - /* JCP: Xv driver implementation loops back over above code to - setup mirror CRT2 */ - - return 0; -} - -int vixPlaybackOn(void) -{ - setvideoregmask(Index_VI_Control_Misc0, 0x02, 0x02); - return 0; -} - -int vixPlaybackOff(void) -{ - unsigned char sridx, cridx; - sridx = inSISREG(SISSR); - cridx = inSISREG(SISCR); - close_overlay(); - outSISREG(SISSR, sridx); - outSISREG(SISCR, cridx); - - return 0; -} - -int vixPlaybackFrameSelect(unsigned int frame) -{ - uint8_t data; - int index = 0; - uint32_t PSY; - - if (sis_displaymode == DISPMODE_SINGLE2 && sis_has_two_overlays) { - index = 1; - } - - PSY = (sis_frames[frame] + sis_Yoff) >> sis_shift_value; - - /* Unlock address registers */ - data = getvideoreg(Index_VI_Control_Misc1); - setvideoreg(Index_VI_Control_Misc1, data | 0x20); - /* TEST: Is this required? */ - setvideoreg(Index_VI_Control_Misc1, data | 0x20); - /* TEST end */ - /* TEST: Is this required? */ - if (sis_vga_engine == SIS_315_VGA) - setvideoreg(Index_VI_Control_Misc3, 0x00); - /* TEST end */ - - /* set Y start address */ - setvideoreg(Index_VI_Disp_Y_Buf_Start_Low, (uint8_t) (PSY)); - setvideoreg(Index_VI_Disp_Y_Buf_Start_Middle, (uint8_t) ((PSY) >> 8)); - setvideoreg(Index_VI_Disp_Y_Buf_Start_High, (uint8_t) ((PSY) >> 16)); - /* set 310/325 series overflow bits for Y plane */ - if (sis_vga_engine == SIS_315_VGA) { - setvideoreg(Index_VI_Y_Buf_Start_Over, - ((uint8_t) ((PSY) >> 24) & 0x01)); - } - - /* Set U/V data if using plane formats */ - if ((sis_format == IMGFMT_YV12) || (sis_format == IMGFMT_I420)) { - - uint32_t PSU, PSV; - - PSU = (sis_frames[frame] + sis_Uoff) >> sis_shift_value; - PSV = (sis_frames[frame] + sis_Voff) >> sis_shift_value; - - /* set U/V start address */ - setvideoreg(Index_VI_U_Buf_Start_Low, (uint8_t) PSU); - setvideoreg(Index_VI_U_Buf_Start_Middle, (uint8_t) (PSU >> 8)); - setvideoreg(Index_VI_U_Buf_Start_High, (uint8_t) (PSU >> 16)); - - setvideoreg(Index_VI_V_Buf_Start_Low, (uint8_t) PSV); - setvideoreg(Index_VI_V_Buf_Start_Middle, (uint8_t) (PSV >> 8)); - setvideoreg(Index_VI_V_Buf_Start_High, (uint8_t) (PSV >> 16)); - - /* 310/325 series overflow bits */ - if (sis_vga_engine == SIS_315_VGA) { - setvideoreg(Index_VI_U_Buf_Start_Over, - ((uint8_t) (PSU >> 24) & 0x01)); - setvideoreg(Index_VI_V_Buf_Start_Over, - ((uint8_t) (PSV >> 24) & 0x01)); - } - } - - if (sis_vga_engine == SIS_315_VGA) { - /* Trigger register copy for 310 series */ - setvideoreg(Index_VI_Control_Misc3, 1 << index); - } - - /* Lock the address registers */ - setvideoregmask(Index_VI_Control_Misc1, 0x00, 0x20); - - return 0; -} - -int vixGetGrKeys(vidix_grkey_t * grkey) -{ - memcpy(grkey, &sis_grkey, sizeof(vidix_grkey_t)); - return 0; -} - -int vixSetGrKeys(const vidix_grkey_t * grkey) -{ - memcpy(&sis_grkey, grkey, sizeof(vidix_grkey_t)); - set_colorkey(); - return 0; -} - -int vixPlaybackGetEq(vidix_video_eq_t * eq) -{ - memcpy(eq, &sis_equal, sizeof(vidix_video_eq_t)); - return 0; -} - -int vixPlaybackSetEq(const vidix_video_eq_t * eq) -{ - int br, sat, cr, hue; - if (eq->cap & VEQ_CAP_BRIGHTNESS) - sis_equal.brightness = eq->brightness; - if (eq->cap & VEQ_CAP_CONTRAST) - sis_equal.contrast = eq->contrast; - if (eq->cap & VEQ_CAP_SATURATION) - sis_equal.saturation = eq->saturation; - if (eq->cap & VEQ_CAP_HUE) - sis_equal.hue = eq->hue; - if (eq->cap & VEQ_CAP_RGB_INTENSITY) { - sis_equal.red_intensity = eq->red_intensity; - sis_equal.green_intensity = eq->green_intensity; - sis_equal.blue_intensity = eq->blue_intensity; - } - sis_equal.flags = eq->flags; - - cr = (sis_equal.contrast + 1000) * 7 / 2000; - if (cr < 0) - cr = 0; - if (cr > 7) - cr = 7; - - br = sis_equal.brightness * 127 / 1000; - if (br < -128) - br = -128; - if (br > 127) - br = 127; - - sat = (sis_equal.saturation * 7) / 1000; - if (sat < -7) - sat = -7; - if (sat > 7) - sat = 7; - - hue = sis_equal.hue * 7 / 1000; - if (hue < -8) - hue = -8; - if (hue > 7) - hue = 7; - - set_brightness(br); - set_contrast(cr); - if (sis_vga_engine == SIS_315_VGA) { - set_saturation(sat); - set_hue(hue); - } - - return 0; -} - -static void set_overlay(SISOverlayPtr pOverlay, int index) -{ - uint16_t pitch = 0; - uint8_t h_over = 0, v_over = 0; - uint16_t top, bottom, left, right; - uint16_t screenX = sis_screen_width; - uint16_t screenY = sis_screen_height; - uint8_t data; - uint32_t watchdog; - - top = pOverlay->dstBox.y1; - bottom = pOverlay->dstBox.y2; - if (bottom > screenY) { - bottom = screenY; - } - - left = pOverlay->dstBox.x1; - right = pOverlay->dstBox.x2; - if (right > screenX) { - right = screenX; - } - - /* JCP: these aren't really tested... */ - /* TW: DoubleScan modes require Y coordinates * 2 */ - if (sis_vmode & VMODE_DOUBLESCAN) { - top <<= 1; - bottom <<= 1; - } - /* TW: Interlace modes require Y coordinates / 2 */ - if (sis_vmode & VMODE_INTERLACED) { - top >>= 1; - bottom >>= 1; - } - - h_over = (((left >> 8) & 0x0f) | ((right >> 4) & 0xf0)); - v_over = (((top >> 8) & 0x0f) | ((bottom >> 4) & 0xf0)); - - pitch = pOverlay->pitch >> sis_shift_value; - - /* set line buffer size */ - setvideoreg(Index_VI_Line_Buffer_Size, pOverlay->lineBufSize); - - /* set color key mode */ - setvideoregmask(Index_VI_Key_Overlay_OP, pOverlay->keyOP, 0x0F); - - /* TW: We don't have to wait for vertical retrace in all cases */ - /* JCP: be safe for now. */ - if (1 /*pPriv->mustwait */ ) { - watchdog = WATCHDOG_DELAY; - while (pOverlay->VBlankActiveFunc() && --watchdog); - watchdog = WATCHDOG_DELAY; - while ((!pOverlay->VBlankActiveFunc()) && --watchdog); - if (!watchdog && sis_verbose > 0) { - printf("[SiS]: timed out waiting for vertical retrace\n"); - } - } - - /* Unlock address registers */ - data = getvideoreg(Index_VI_Control_Misc1); - setvideoreg(Index_VI_Control_Misc1, data | 0x20); - /* TEST: Is this required? */ - setvideoreg(Index_VI_Control_Misc1, data | 0x20); - /* TEST end */ - - /* TEST: Is this required? */ - if (sis_vga_engine == SIS_315_VGA) - setvideoreg(Index_VI_Control_Misc3, 0x00); - /* TEST end */ - - /* Set Y buf pitch */ - setvideoreg(Index_VI_Disp_Y_Buf_Pitch_Low, (uint8_t) (pitch)); - setvideoregmask(Index_VI_Disp_Y_UV_Buf_Pitch_Middle, - (uint8_t) (pitch >> 8), 0x0f); - - /* Set Y start address */ - setvideoreg(Index_VI_Disp_Y_Buf_Start_Low, (uint8_t) (pOverlay->PSY)); - setvideoreg(Index_VI_Disp_Y_Buf_Start_Middle, - (uint8_t) ((pOverlay->PSY) >> 8)); - setvideoreg(Index_VI_Disp_Y_Buf_Start_High, - (uint8_t) ((pOverlay->PSY) >> 16)); - - /* set 310/325 series overflow bits for Y plane */ - if (sis_vga_engine == SIS_315_VGA) { - setvideoreg(Index_VI_Disp_Y_Buf_Pitch_High, - (uint8_t) (pitch >> 12)); - setvideoreg(Index_VI_Y_Buf_Start_Over, - ((uint8_t) ((pOverlay->PSY) >> 24) & 0x01)); - } - - /* Set U/V data if using plane formats */ - if ((pOverlay->pixelFormat == IMGFMT_YV12) || - (pOverlay->pixelFormat == IMGFMT_I420)) { - - uint32_t PSU, PSV; - - PSU = pOverlay->PSU; - PSV = pOverlay->PSV; - - /* Set U/V pitch */ - setvideoreg(Index_VI_Disp_UV_Buf_Pitch_Low, - (uint8_t) (pitch >> 1)); - setvideoregmask(Index_VI_Disp_Y_UV_Buf_Pitch_Middle, - (uint8_t) (pitch >> 5), 0xf0); - - /* set U/V start address */ - setvideoreg(Index_VI_U_Buf_Start_Low, (uint8_t) PSU); - setvideoreg(Index_VI_U_Buf_Start_Middle, (uint8_t) (PSU >> 8)); - setvideoreg(Index_VI_U_Buf_Start_High, (uint8_t) (PSU >> 16)); - - setvideoreg(Index_VI_V_Buf_Start_Low, (uint8_t) PSV); - setvideoreg(Index_VI_V_Buf_Start_Middle, (uint8_t) (PSV >> 8)); - setvideoreg(Index_VI_V_Buf_Start_High, (uint8_t) (PSV >> 16)); - - /* 310/325 series overflow bits */ - if (sis_vga_engine == SIS_315_VGA) { - setvideoreg(Index_VI_Disp_UV_Buf_Pitch_High, - (uint8_t) (pitch >> 13)); - setvideoreg(Index_VI_U_Buf_Start_Over, - ((uint8_t) (PSU >> 24) & 0x01)); - setvideoreg(Index_VI_V_Buf_Start_Over, - ((uint8_t) (PSV >> 24) & 0x01)); - } - } - - if (sis_vga_engine == SIS_315_VGA) { - /* Trigger register copy for 310 series */ - setvideoreg(Index_VI_Control_Misc3, 1 << index); - } - - /* set scale factor */ - setvideoreg(Index_VI_Hor_Post_Up_Scale_Low, - (uint8_t) (pOverlay->HUSF)); - setvideoreg(Index_VI_Hor_Post_Up_Scale_High, - (uint8_t) ((pOverlay->HUSF) >> 8)); - setvideoreg(Index_VI_Ver_Up_Scale_Low, (uint8_t) (pOverlay->VUSF)); - setvideoreg(Index_VI_Ver_Up_Scale_High, - (uint8_t) ((pOverlay->VUSF) >> 8)); - - setvideoregmask(Index_VI_Scale_Control, (pOverlay->IntBit << 3) - | (pOverlay->wHPre), 0x7f); - - /* set destination window position */ - setvideoreg(Index_VI_Win_Hor_Disp_Start_Low, (uint8_t) left); - setvideoreg(Index_VI_Win_Hor_Disp_End_Low, (uint8_t) right); - setvideoreg(Index_VI_Win_Hor_Over, (uint8_t) h_over); - - setvideoreg(Index_VI_Win_Ver_Disp_Start_Low, (uint8_t) top); - setvideoreg(Index_VI_Win_Ver_Disp_End_Low, (uint8_t) bottom); - setvideoreg(Index_VI_Win_Ver_Over, (uint8_t) v_over); - - setvideoregmask(Index_VI_Control_Misc1, pOverlay->bobEnable, 0x1a); - - /* Lock the address registers */ - setvideoregmask(Index_VI_Control_Misc1, 0x00, 0x20); -} - - -/* TW: Overlay MUST NOT be switched off while beam is over it */ -static void close_overlay() -{ - uint32_t watchdog; - - if ((sis_displaymode == DISPMODE_SINGLE2) || - (sis_displaymode == DISPMODE_MIRROR)) { - if (sis_has_two_overlays) { - setvideoregmask(Index_VI_Control_Misc2, 0x01, 0x01); - watchdog = WATCHDOG_DELAY; - while (vblank_active_CRT2() && --watchdog); - watchdog = WATCHDOG_DELAY; - while ((!vblank_active_CRT2()) && --watchdog); - setvideoregmask(Index_VI_Control_Misc0, 0x00, 0x02); - watchdog = WATCHDOG_DELAY; - while (vblank_active_CRT2() && --watchdog); - watchdog = WATCHDOG_DELAY; - while ((!vblank_active_CRT2()) && --watchdog); - } else if (sis_displaymode == DISPMODE_SINGLE2) { - setvideoregmask(Index_VI_Control_Misc2, 0x00, 0x01); - watchdog = WATCHDOG_DELAY; - while (vblank_active_CRT1() && --watchdog); - watchdog = WATCHDOG_DELAY; - while ((!vblank_active_CRT1()) && --watchdog); - setvideoregmask(Index_VI_Control_Misc0, 0x00, 0x02); - watchdog = WATCHDOG_DELAY; - while (vblank_active_CRT1() && --watchdog); - watchdog = WATCHDOG_DELAY; - while ((!vblank_active_CRT1()) && --watchdog); - } - } - if ((sis_displaymode == DISPMODE_SINGLE1) || - (sis_displaymode == DISPMODE_MIRROR)) { - setvideoregmask(Index_VI_Control_Misc2, 0x00, 0x01); - watchdog = WATCHDOG_DELAY; - while (vblank_active_CRT1() && --watchdog); - watchdog = WATCHDOG_DELAY; - while ((!vblank_active_CRT1()) && --watchdog); - setvideoregmask(Index_VI_Control_Misc0, 0x00, 0x02); - watchdog = WATCHDOG_DELAY; - while (vblank_active_CRT1() && --watchdog); - watchdog = WATCHDOG_DELAY; - while ((!vblank_active_CRT1()) && --watchdog); - } -} - - -static void -calc_scale_factor(SISOverlayPtr pOverlay, int index, int iscrt2) -{ - uint32_t i = 0, mult = 0; - int flag = 0; - - int dstW = pOverlay->dstBox.x2 - pOverlay->dstBox.x1; - int dstH = pOverlay->dstBox.y2 - pOverlay->dstBox.y1; - int srcW = pOverlay->srcW; - int srcH = pOverlay->srcH; - /* uint16_t LCDheight = pSiS->LCDheight; */ - int srcPitch = pOverlay->origPitch; - int origdstH = dstH; - - /* get rid of warnings for now */ - index = index; - iscrt2 = iscrt2; - -#if 0 /* JCP: don't bother with this for now. */ - /* TW: Stretch image due to idiotic LCD "auto"-scaling on LVDS (and 630+301B) */ - if (pSiS->VBFlags & CRT2_LCD) { - if (sis_bridge_is_slave) { - if (pSiS->VBFlags & VB_LVDS) { - dstH = (dstH * LCDheight) / pOverlay->SCREENheight; - } else if ((sis_vga_engine == SIS_300_VGA) && - (pSiS-> - VBFlags & (VB_301B | VB_302B | VB_301LV | - VB_302LV))) { - dstH = (dstH * LCDheight) / pOverlay->SCREENheight; - } - } else if (iscrt2) { - if (pSiS->VBFlags & VB_LVDS) { - dstH = (dstH * LCDheight) / pOverlay->SCREENheight; - if (sis_displaymode == DISPMODE_MIRROR) - flag = 1; - } else if ((sis_vga_engine == SIS_300_VGA) && - (pSiS-> - VBFlags & (VB_301B | VB_302B | VB_301LV | - VB_302LV))) { - dstH = (dstH * LCDheight) / pOverlay->SCREENheight; - if (sis_displaymode == DISPMODE_MIRROR) - flag = 1; - } - } - } -#endif - - /* TW: For double scan modes, we need to double the height - * (Perhaps we also need to scale LVDS, but I'm not sure.) - * On 310/325 series, we need to double the width as well. - * Interlace mode vice versa. - */ - if (sis_vmode & VMODE_DOUBLESCAN) { - dstH = origdstH << 1; - flag = 0; - if (sis_vga_engine == SIS_315_VGA) { - dstW <<= 1; - } - } - if (sis_vmode & VMODE_INTERLACED) { - dstH = origdstH >> 1; - flag = 0; - } - - if (dstW < OVERLAY_MIN_WIDTH) - dstW = OVERLAY_MIN_WIDTH; - if (dstW == srcW) { - pOverlay->HUSF = 0x00; - pOverlay->IntBit = 0x05; - pOverlay->wHPre = 0; - } else if (dstW > srcW) { - dstW += 2; - pOverlay->HUSF = (srcW << 16) / dstW; - pOverlay->IntBit = 0x04; - pOverlay->wHPre = 0; - } else { - int tmpW = dstW; - - /* TW: It seems, the hardware can't scale below factor .125 (=1/8) if the - pitch isn't a multiple of 256. - TODO: Test this on the 310/325 series! - */ - if ((srcPitch % 256) || (srcPitch < 256)) { - if (((dstW * 1000) / srcW) < 125) - dstW = tmpW = ((srcW * 125) / 1000) + 1; - } - - i = 0; - pOverlay->IntBit = 0x01; - while (srcW >= tmpW) { - tmpW <<= 1; - i++; - } - pOverlay->wHPre = (uint8_t) (i - 1); - dstW <<= (i - 1); - if ((srcW % dstW)) - pOverlay->HUSF = ((srcW - dstW) << 16) / dstW; - else - pOverlay->HUSF = 0x00; - } - - if (dstH < OVERLAY_MIN_HEIGHT) - dstH = OVERLAY_MIN_HEIGHT; - if (dstH == srcH) { - pOverlay->VUSF = 0x00; - pOverlay->IntBit |= 0x0A; - } else if (dstH > srcH) { - dstH += 0x02; - pOverlay->VUSF = (srcH << 16) / dstH; - pOverlay->IntBit |= 0x08; - } else { - uint32_t realI; - - i = realI = srcH / dstH; - pOverlay->IntBit |= 0x02; - - if (i < 2) { - pOverlay->VUSF = ((srcH - dstH) << 16) / dstH; - /* TW: Needed for LCD-scaling modes */ - if ((flag) && (mult = (srcH / origdstH)) >= 2) - pOverlay->pitch /= mult; - } else { -#if 0 - if (((pOverlay->bobEnable & 0x08) == 0x00) && - (((srcPitch * i) >> 2) > 0xFFF)) { - pOverlay->bobEnable |= 0x08; - srcPitch >>= 1; - } -#endif - if (((srcPitch * i) >> 2) > 0xFFF) { - i = (0xFFF * 2 / srcPitch); - pOverlay->VUSF = 0xFFFF; - } else { - dstH = i * dstH; - if (srcH % dstH) - pOverlay->VUSF = ((srcH - dstH) << 16) / dstH; - else - pOverlay->VUSF = 0x00; - } - /* set video frame buffer offset */ - pOverlay->pitch = (uint16_t) (srcPitch * i); - } - } -} - -static void set_line_buf_size(SISOverlayPtr pOverlay) -{ - uint8_t preHIDF; - uint32_t i; - uint32_t line = pOverlay->srcW; - - if ((pOverlay->pixelFormat == IMGFMT_YV12) || - (pOverlay->pixelFormat == IMGFMT_I420)) { - preHIDF = pOverlay->wHPre & 0x07; - switch (preHIDF) { - case 3: - if ((line & 0xffffff00) == line) - i = (line >> 8); - else - i = (line >> 8) + 1; - pOverlay->lineBufSize = (uint8_t) (i * 32 - 1); - break; - case 4: - if ((line & 0xfffffe00) == line) - i = (line >> 9); - else - i = (line >> 9) + 1; - pOverlay->lineBufSize = (uint8_t) (i * 64 - 1); - break; - case 5: - if ((line & 0xfffffc00) == line) - i = (line >> 10); - else - i = (line >> 10) + 1; - pOverlay->lineBufSize = (uint8_t) (i * 128 - 1); - break; - case 6: - if ((line & 0xfffff800) == line) - i = (line >> 11); - else - i = (line >> 11) + 1; - pOverlay->lineBufSize = (uint8_t) (i * 256 - 1); - break; - default: - if ((line & 0xffffff80) == line) - i = (line >> 7); - else - i = (line >> 7) + 1; - pOverlay->lineBufSize = (uint8_t) (i * 16 - 1); - break; - } - } else { /* YUV2, UYVY */ - if ((line & 0xffffff8) == line) - i = (line >> 3); - else - i = (line >> 3) + 1; - pOverlay->lineBufSize = (uint8_t) (i - 1); - } -} - -static void merge_line_buf(int enable) -{ - if (enable) { - switch (sis_displaymode) { - case DISPMODE_SINGLE1: - if (sis_has_two_overlays) { - /* dual line merge */ - setvideoregmask(Index_VI_Control_Misc2, 0x10, 0x11); - setvideoregmask(Index_VI_Control_Misc1, 0x00, 0x04); - } else { - setvideoregmask(Index_VI_Control_Misc2, 0x10, 0x11); - setvideoregmask(Index_VI_Control_Misc1, 0x00, 0x04); - } - break; - case DISPMODE_SINGLE2: - if (sis_has_two_overlays) { - /* line merge */ - setvideoregmask(Index_VI_Control_Misc2, 0x01, 0x11); - setvideoregmask(Index_VI_Control_Misc1, 0x04, 0x04); - } else { - setvideoregmask(Index_VI_Control_Misc2, 0x10, 0x11); - setvideoregmask(Index_VI_Control_Misc1, 0x00, 0x04); - } - break; - case DISPMODE_MIRROR: - default: - /* line merge */ - setvideoregmask(Index_VI_Control_Misc2, 0x00, 0x11); - setvideoregmask(Index_VI_Control_Misc1, 0x04, 0x04); - if (sis_has_two_overlays) { - /* line merge */ - setvideoregmask(Index_VI_Control_Misc2, 0x01, 0x11); - setvideoregmask(Index_VI_Control_Misc1, 0x04, 0x04); - } - break; - } - } else { - switch (sis_displaymode) { - case DISPMODE_SINGLE1: - setvideoregmask(Index_VI_Control_Misc2, 0x00, 0x11); - setvideoregmask(Index_VI_Control_Misc1, 0x00, 0x04); - break; - case DISPMODE_SINGLE2: - if (sis_has_two_overlays) { - setvideoregmask(Index_VI_Control_Misc2, 0x01, 0x11); - setvideoregmask(Index_VI_Control_Misc1, 0x00, 0x04); - } else { - setvideoregmask(Index_VI_Control_Misc2, 0x00, 0x11); - setvideoregmask(Index_VI_Control_Misc1, 0x00, 0x04); - } - break; - case DISPMODE_MIRROR: - default: - setvideoregmask(Index_VI_Control_Misc2, 0x00, 0x11); - setvideoregmask(Index_VI_Control_Misc1, 0x00, 0x04); - if (sis_has_two_overlays) { - setvideoregmask(Index_VI_Control_Misc2, 0x01, 0x11); - setvideoregmask(Index_VI_Control_Misc1, 0x00, 0x04); - } - break; - } - } -} - - -static void set_format(SISOverlayPtr pOverlay) -{ - uint8_t fmt; - - switch (pOverlay->pixelFormat) { - case IMGFMT_YV12: - case IMGFMT_I420: - fmt = 0x0c; - break; - case IMGFMT_YUY2: - fmt = 0x28; - break; - case IMGFMT_UYVY: - fmt = 0x08; - break; - case IMGFMT_RGB15: /* D[5:4] : 00 RGB555, 01 RGB 565 */ - fmt = 0x00; - break; - case IMGFMT_RGB16: - fmt = 0x10; - break; - default: - fmt = 0x00; - break; - } - setvideoregmask(Index_VI_Control_Misc0, fmt, 0x7c); -} - -static void set_colorkey() -{ - uint8_t r, g, b; - - b = (uint8_t) sis_grkey.ckey.blue; - g = (uint8_t) sis_grkey.ckey.green; - r = (uint8_t) sis_grkey.ckey.red; - - /* set color key mode */ - setvideoregmask(Index_VI_Key_Overlay_OP, - sis_grkey.ckey.op == CKEY_TRUE ? - VI_ROP_DestKey : VI_ROP_Always, 0x0F); - - /* set colorkey values */ - setvideoreg(Index_VI_Overlay_ColorKey_Blue_Min, (uint8_t) b); - setvideoreg(Index_VI_Overlay_ColorKey_Green_Min, (uint8_t) g); - setvideoreg(Index_VI_Overlay_ColorKey_Red_Min, (uint8_t) r); - - setvideoreg(Index_VI_Overlay_ColorKey_Blue_Max, (uint8_t) b); - setvideoreg(Index_VI_Overlay_ColorKey_Green_Max, (uint8_t) g); - setvideoreg(Index_VI_Overlay_ColorKey_Red_Max, (uint8_t) r); -} - -static void set_brightness(uint8_t brightness) -{ - setvideoreg(Index_VI_Brightness, brightness); -} - -static void set_contrast(uint8_t contrast) -{ - setvideoregmask(Index_VI_Contrast_Enh_Ctrl, contrast, 0x07); -} - -/* Next 3 functions are 310/325 series only */ - -static void set_saturation(char saturation) -{ - uint8_t temp = 0; - - if (saturation < 0) { - temp |= 0x88; - saturation = -saturation; - } - temp |= (saturation & 0x07); - temp |= ((saturation & 0x07) << 4); - - setvideoreg(Index_VI_Saturation, temp); -} - -static void set_hue(uint8_t hue) -{ - setvideoreg(Index_VI_Hue, (hue & 0x08) ? (hue ^ 0x07) : hue); -} - -#if 0 -/* JCP: not used (I don't think it's correct anyway) */ -static void set_alpha(uint8_t alpha) -{ - uint8_t data; - - data = getvideoreg(Index_VI_Key_Overlay_OP); - data &= 0x0F; - setvideoreg(Index_VI_Key_Overlay_OP, data | (alpha << 4)); -} -#endif diff --git a/src/video_out/vidix/drivers/unichrome_regs.h b/src/video_out/vidix/drivers/unichrome_regs.h deleted file mode 100644 index 15795f126..000000000 --- a/src/video_out/vidix/drivers/unichrome_regs.h +++ /dev/null @@ -1,635 +0,0 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via.h,v 1.5 2004/01/05 00:34:17 dawes Exp $ */ -/* - * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. - * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sub license, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL - * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef _VIA_H_ -#define _VIA_H_ 1 - -/* Video status flag */ - -#define VIDEO_SHOW 0x80000000 /*Video on*/ -#define VIDEO_HIDE 0x00000000 /*Video off*/ -#define VIDEO_MPEG_INUSE 0x08000000 /*Video is used with MPEG */ -#define VIDEO_HQV_INUSE 0x04000000 /*Video is used with HQV*/ -#define VIDEO_CAPTURE0_INUSE 0x02000000 /*Video is used with CAPTURE 0*/ -#define VIDEO_CAPTURE1_INUSE 0x00000000 /*Video is used with CAPTURE 1*/ -#define VIDEO_1_INUSE 0x01000000 /*Video 1 is used with software flip*/ -#define VIDEO_3_INUSE 0x00000000 /*Video 3 is used with software flip*/ -#define MPEG_USE_V1 0x00010000 /*[16] : 1:MPEG use V1, 0:MPEG use V3*/ -#define MPEG_USE_V3 0x00000000 /*[16] : 1:MPEG use V1, 0:MPEG use V3*/ -#define MPEG_USE_HQV 0x00020000 /*[17] : 1:MPEG use HQV,0:MPEG not use HQV*/ -#define MPEG_USE_HW_FLIP 0x00040000 /*[18] : 1:MPEG use H/W flip,0:MPEG use S/W flip*/ -#define MPEG_USE_SW_FLIP 0x00000000 /*[18] : 1:MPEG use H/W flip,0:MPEG use S/W flip*/ -#define CAP0_USE_V1 0x00001000 /*[12] : 1:Capture 0 use V1, 0:Capture 0 use V3*/ -#define CAP0_USE_V3 0x00000000 /*[12] : 1:Capture 0 use V1, 0:Capture 0 use V3*/ -#define CAP0_USE_HQV 0x00002000 /*[13] : 1:Capture 0 use HQV,0:Capture 0 not use HQV*/ -#define CAP0_USE_HW_FLIP 0x00004000 /*[14] : 1:Capture 0 use H/W flip,0:Capture 0 use S/W flip*/ -#define CAP0_USE_CCIR656 0x00008000 /*[15] : 1:Capture 0 use CCIR656,0:Capture 0 CCIR601*/ -#define CAP1_USE_V1 0x00000100 /*[ 8] : 1:Capture 1 use V1, 0:Capture 1 use V3*/ -#define CAP1_USE_V3 0x00000000 /*[ 8] : 1:Capture 1 use V1, 0:Capture 1 use V3*/ -#define CAP1_USE_HQV 0x00000200 /*[ 9] : 1:Capture 1 use HQV,0:Capture 1 not use HQV*/ -#define CAP1_USE_HW_FLIP 0x00000400 /*[10] : 1:Capture 1 use H/W flip,0:Capture 1 use S/W flip */ -#define SW_USE_V1 0x00000010 /*[ 4] : 1:Capture 1 use V1, 0:Capture 1 use V3 */ -#define SW_USE_V3 0x00000000 /*[ 4] : 1:Capture 1 use V1, 0:Capture 1 use V3 */ -#define SW_USE_HQV 0x00000020 /*[ 5] : 1:Capture 1 use HQV,0:Capture 1 not use HQV */ - -/* -#define VIDEO1_INUSE 0x00000010 //[ 4] : 1:Video 1 is used with S/W flip -#define VIDEO1_USE_HQV 0x00000020 //[ 5] : 1:Video 1 use HQV with S/W flip -#define VIDEO3_INUSE 0x00000001 //[ 0] : 1:Video 3 is used with S/W flip -#define VIDEO3_USE_HQV 0x00000002 //[ 1] : 1:Video 3 use HQV with S/W flip -*/ - -/* H/W registers for Video Engine */ - -/* - * bus master - */ -#define PCI_MASTER_ENABLE 0x01 -#define PCI_MASTER_SCATTER 0x00 -#define PCI_MASTER_SINGLE 0x02 -#define PCI_MASTER_GUI 0x00 -#define PCI_MASTER_VIDEO 0x04 -#define PCI_MASTER_INPUT 0x00 -#define PCI_MASTER_OUTPUT 0x08 - -/* - * video registers - */ -#define V_FLAGS 0x00 -#define V_CAP_STATUS 0x04 -#define V_FLIP_STATUS 0x04 -#define V_ALPHA_WIN_START 0x08 -#define V_ALPHA_WIN_END 0x0C -#define V_ALPHA_CONTROL 0x10 -#define V_CRT_STARTADDR 0x14 -#define V_CRT_STARTADDR_2 0x18 -#define V_ALPHA_STRIDE 0x1C -#define V_COLOR_KEY 0x20 -#define V_ALPHA_STARTADDR 0x24 -#define V_CHROMAKEY_LOW 0x28 -#define V_CHROMAKEY_HIGH 0x2C -#define V1_CONTROL 0x30 -#define V12_QWORD_PER_LINE 0x34 -#define V1_STARTADDR_1 0x38 -#define V1_STARTADDR_Y1 V1_STARTADDR_1 -#define V1_STRIDE 0x3C -#define V1_WIN_START_Y 0x40 -#define V1_WIN_START_X 0x42 -#define V1_WIN_END_Y 0x44 -#define V1_WIN_END_X 0x46 -#define V1_STARTADDR_2 0x48 -#define V1_STARTADDR_Y2 V1_STARTADDR_2 -#define V1_ZOOM_CONTROL 0x4C -#define V1_MINI_CONTROL 0x50 -#define V1_STARTADDR_0 0x54 -#define V1_STARTADDR_Y0 V1_STARTADDR_0 -#define V_FIFO_CONTROL 0x58 -#define V1_STARTADDR_3 0x5C -#define V1_STARTADDR_Y3 V1_STARTADDR_3 -#define HI_CONTROL 0x60 -#define SND_COLOR_KEY 0x64 -#define ALPHA_V3_PREFIFO_CONTROL 0x68 -#define V1_SOURCE_HEIGHT 0x6C -#define HI_TRANSPARENT_COLOR 0x70 -#define V_DISPLAY_TEMP 0x74 /* No use */ -#define ALPHA_V3_FIFO_CONTROL 0x78 -#define V3_SOURCE_WIDTH 0x7C -#define V3_COLOR_KEY 0x80 -#define V1_ColorSpaceReg_1 0x84 -#define V1_ColorSpaceReg_2 0x88 -#define V1_STARTADDR_CB0 0x8C -#define V1_OPAQUE_CONTROL 0x90 /* To be deleted */ -#define V3_OPAQUE_CONTROL 0x94 /* To be deleted */ -#define V_COMPOSE_MODE 0x98 -#define V3_STARTADDR_2 0x9C -#define V3_CONTROL 0xA0 -#define V3_STARTADDR_0 0xA4 -#define V3_STARTADDR_1 0xA8 -#define V3_STRIDE 0xAC -#define V3_WIN_START_Y 0xB0 -#define V3_WIN_START_X 0xB2 -#define V3_WIN_END_Y 0xB4 -#define V3_WIN_END_X 0xB6 -#define V3_ALPHA_QWORD_PER_LINE 0xB8 -#define V3_ZOOM_CONTROL 0xBC -#define V3_MINI_CONTROL 0xC0 -#define V3_ColorSpaceReg_1 0xC4 -#define V3_ColorSpaceReg_2 0xC8 -#define V3_DISPLAY_TEMP 0xCC /* No use */ -#define V1_STARTADDR_CB1 0xE4 -#define V1_STARTADDR_CB2 0xE8 -#define V1_STARTADDR_CB3 0xEC -#define V1_STARTADDR_CR0 0xF0 -#define V1_STARTADDR_CR1 0xF4 -#define V1_STARTADDR_CR2 0xF8 -#define V1_STARTADDR_CR3 0xFC - -/* Video Capture Engine Registers - * Capture Port 1 - */ -#define CAP0_MASKS 0x100 -#define CAP1_MASKS 0x104 -#define CAP0_CONTROL 0x110 -#define CAP0_H_RANGE 0x114 -#define CAP0_V_RANGE 0x118 -#define CAP0_SCAL_CONTROL 0x11C -#define CAP0_VBI_H_RANGE 0x120 -#define CAP0_VBI_V_RANGE 0x124 -#define CAP0_VBI_STARTADDR 0x128 -#define CAP0_VBI_STRIDE 0x12C -#define CAP0_ANCIL_COUNT 0x130 -#define CAP0_MAXCOUNT 0x134 -#define CAP0_VBIMAX_COUNT 0x138 -#define CAP0_DATA_COUNT 0x13C -#define CAP0_FB_STARTADDR0 0x140 -#define CAP0_FB_STARTADDR1 0x144 -#define CAP0_FB_STARTADDR2 0x148 -#define CAP0_STRIDE 0x150 -/* Capture Port 2 */ -#define CAP1_CONTROL 0x154 -#define CAP1_SCAL_CONTROL 0x160 -#define CAP1_VBI_H_RANGE 0x164 /*To be deleted*/ -#define CAP1_VBI_V_RANGE 0x168 /*To be deleted*/ -#define CAP1_VBI_STARTADDR 0x16C /*To be deleted*/ -#define CAP1_VBI_STRIDE 0x170 /*To be deleted*/ -#define CAP1_ANCIL_COUNT 0x174 /*To be deleted*/ -#define CAP1_MAXCOUNT 0x178 -#define CAP1_VBIMAX_COUNT 0x17C /*To be deleted*/ -#define CAP1_DATA_COUNT 0x180 -#define CAP1_FB_STARTADDR0 0x184 -#define CAP1_FB_STARTADDR1 0x188 -#define CAP1_STRIDE 0x18C - -/* SUBPICTURE Registers */ -#define SUBP_CONTROL_STRIDE 0x1C0 -#define SUBP_STARTADDR 0x1C4 -#define RAM_TABLE_CONTROL 0x1C8 -#define RAM_TABLE_READ 0x1CC - -/* HQV Registers */ -#define HQV_CONTROL 0x1D0 -#define HQV_SRC_STARTADDR_Y 0x1D4 -#define HQV_SRC_STARTADDR_U 0x1D8 -#define HQV_SRC_STARTADDR_V 0x1DC -#define HQV_SRC_FETCH_LINE 0x1E0 -#define HQV_FILTER_CONTROL 0x1E4 -#define HQV_MINIFY_CONTROL 0x1E8 -#define HQV_DST_STARTADDR0 0x1EC -#define HQV_DST_STARTADDR1 0x1F0 -#define HQV_DST_STARTADDR2 0x1FC -#define HQV_DST_STRIDE 0x1F4 -#define HQV_SRC_STRIDE 0x1F8 - - -/* - * Video command definition - */ -/* #define V_ALPHA_CONTROL 0x210 */ -#define ALPHA_WIN_EXPIRENUMBER_4 0x00040000 -#define ALPHA_WIN_CONSTANT_FACTOR_4 0x00004000 -#define ALPHA_WIN_CONSTANT_FACTOR_12 0x0000c000 -#define ALPHA_WIN_BLENDING_CONSTANT 0x00000000 -#define ALPHA_WIN_BLENDING_ALPHA 0x00000001 -#define ALPHA_WIN_BLENDING_GRAPHIC 0x00000002 -#define ALPHA_WIN_PREFIFO_THRESHOLD_12 0x000c0000 -#define ALPHA_WIN_FIFO_THRESHOLD_8 0x000c0000 -#define ALPHA_WIN_FIFO_DEPTH_16 0x00100000 - -/* V_CHROMAKEY_LOW 0x228 */ -#define V_CHROMAKEY_V3 0x80000000 - -/* V1_CONTROL 0x230 */ -#define V1_ENABLE 0x00000001 -#define V1_FULL_SCREEN 0x00000002 -#define V1_YUV422 0x00000000 -#define V1_RGB32 0x00000004 -#define V1_RGB15 0x00000008 -#define V1_RGB16 0x0000000C -#define V1_YCbCr420 0x00000010 -#define V1_COLORSPACE_SIGN 0x00000080 -#define V1_SRC_IS_FIELD_PIC 0x00000200 -#define V1_SRC_IS_FRAME_PIC 0x00000000 -#define V1_BOB_ENABLE 0x00400000 -#define V1_FIELD_BASE 0x00000000 -#define V1_FRAME_BASE 0x01000000 -#define V1_SWAP_SW 0x00000000 -#define V1_SWAP_HW_HQV 0x02000000 -#define V1_SWAP_HW_CAPTURE 0x04000000 -#define V1_SWAP_HW_MC 0x06000000 -/* #define V1_DOUBLE_BUFFERS 0x00000000 */ -/* #define V1_QUADRUPLE_BUFFERS 0x18000000 */ -#define V1_EXPIRE_NUM 0x00050000 -#define V1_EXPIRE_NUM_A 0x000a0000 -#define V1_EXPIRE_NUM_F 0x000f0000 /* jason */ -#define V1_FIFO_EXTENDED 0x00200000 -#define V1_ON_CRT 0x00000000 -#define V1_ON_SND_DISPLAY 0x80000000 -#define V1_FIFO_32V1_32V2 0x00000000 -#define V1_FIFO_48V1_32V2 0x00200000 - -/* V12_QWORD_PER_LINE 0x234 */ -#define V1_FETCH_COUNT 0x3ff00000 -#define V1_FETCHCOUNT_ALIGNMENT 0x0000000f -#define V1_FETCHCOUNT_UNIT 0x00000004 /* Doubld QWORD */ - -/* V1_STRIDE */ -#define V1_STRIDE_YMASK 0x00001fff -#define V1_STRIDE_UVMASK 0x1ff00000 - -/* V1_ZOOM_CONTROL 0x24C */ -#define V1_X_ZOOM_ENABLE 0x80000000 -#define V1_Y_ZOOM_ENABLE 0x00008000 - -/* V1_MINI_CONTROL 0x250 */ -#define V1_X_INTERPOLY 0x00000002 /* X interpolation */ -#define V1_Y_INTERPOLY 0x00000001 /* Y interpolation */ -#define V1_YCBCR_INTERPOLY 0x00000004 /* Y, Cb, Cr all interpolation */ -#define V1_X_DIV_2 0x01000000 -#define V1_X_DIV_4 0x03000000 -#define V1_X_DIV_8 0x05000000 -#define V1_X_DIV_16 0x07000000 -#define V1_Y_DIV_2 0x00010000 -#define V1_Y_DIV_4 0x00030000 -#define V1_Y_DIV_8 0x00050000 -#define V1_Y_DIV_16 0x00070000 - -/* V1_STARTADDR0 0x254 */ -#define SW_FLIP_ODD 0x08000000 - -/* V_FIFO_CONTROL 0x258 - * IA2 has 32 level FIFO for packet mode video format - * 32 level FIFO for planar mode video YV12. with extension reg 230 bit 21 enable - * 16 level FIFO for planar mode video YV12. with extension reg 230 bit 21 disable - * BCos of 128 bits. 1 level in IA2 = 2 level in VT3122 - */ -#define V1_FIFO_DEPTH12 0x0000000B -#define V1_FIFO_DEPTH16 0x0000000F -#define V1_FIFO_DEPTH32 0x0000001F -#define V1_FIFO_DEPTH48 0x0000002F -#define V1_FIFO_DEPTH64 0x0000003F -#define V1_FIFO_THRESHOLD6 0x00000600 -#define V1_FIFO_THRESHOLD8 0x00000800 -#define V1_FIFO_THRESHOLD12 0x00000C00 -#define V1_FIFO_THRESHOLD16 0x00001000 -#define V1_FIFO_THRESHOLD24 0x00001800 -#define V1_FIFO_THRESHOLD32 0x00002000 -#define V1_FIFO_THRESHOLD40 0x00002800 -#define V1_FIFO_THRESHOLD48 0x00003000 -#define V1_FIFO_THRESHOLD56 0x00003800 -#define V1_FIFO_THRESHOLD61 0x00003D00 -#define V1_FIFO_PRETHRESHOLD10 0x0A000000 -#define V1_FIFO_PRETHRESHOLD12 0x0C000000 -#define V1_FIFO_PRETHRESHOLD29 0x1d000000 -#define V1_FIFO_PRETHRESHOLD40 0x28000000 -#define V1_FIFO_PRETHRESHOLD44 0x2c000000 -#define V1_FIFO_PRETHRESHOLD56 0x38000000 -#define V1_FIFO_PRETHRESHOLD61 0x3D000000 - -/* ALPHA_V3_FIFO_CONTROL 0x278 - * IA2 has 32 level FIFO for packet mode video format - * 32 level FIFO for planar mode video YV12. with extension reg 230 bit 21 enable - * 16 level FIFO for planar mode video YV12. with extension reg 230 bit 21 disable - * 8 level FIFO for ALPHA - * BCos of 128 bits. 1 level in IA2 = 2 level in VT3122 - */ -#define V3_FIFO_DEPTH16 0x0000000F -#define V3_FIFO_DEPTH24 0x00000017 -#define V3_FIFO_DEPTH32 0x0000001F -#define V3_FIFO_DEPTH48 0x0000002F -#define V3_FIFO_DEPTH64 0x0000003F -#define V3_FIFO_THRESHOLD8 0x00000800 -#define V3_FIFO_THRESHOLD12 0x00000C00 -#define V3_FIFO_THRESHOLD16 0x00001000 -#define V3_FIFO_THRESHOLD24 0x00001800 -#define V3_FIFO_THRESHOLD32 0x00002000 -#define V3_FIFO_THRESHOLD40 0x00002800 -#define V3_FIFO_THRESHOLD48 0x00003000 -#define V3_FIFO_THRESHOLD56 0x00003800 -#define V3_FIFO_THRESHOLD61 0x00003D00 -#define V3_FIFO_PRETHRESHOLD10 0x0000000A -#define V3_FIFO_PRETHRESHOLD12 0x0000000C -#define V3_FIFO_PRETHRESHOLD29 0x0000001d -#define V3_FIFO_PRETHRESHOLD40 0x00000028 -#define V3_FIFO_PRETHRESHOLD44 0x0000002c -#define V3_FIFO_PRETHRESHOLD56 0x00000038 -#define V3_FIFO_PRETHRESHOLD61 0x0000003D -#define V3_FIFO_MASK 0x0000007F -#define ALPHA_FIFO_DEPTH8 0x00070000 -#define ALPHA_FIFO_THRESHOLD4 0x04000000 -#define ALPHA_FIFO_MASK 0xffff0000 -#define ALPHA_FIFO_PRETHRESHOLD4 0x00040000 - -/* IA2 */ -#define ColorSpaceValue_1 0x140020f2 -#define ColorSpaceValue_2 0x0a0a2c00 - -#define ColorSpaceValue_1_3123C0 0x13000DED -#define ColorSpaceValue_2_3123C0 0x13171000 - -/* For TV setting */ -#define ColorSpaceValue_1TV 0x140020f2 -#define ColorSpaceValue_2TV 0x0a0a2c00 - -/* V_COMPOSE_MODE 0x298 */ -#define SELECT_VIDEO_IF_COLOR_KEY 0x00000001 /* select video if (color key),otherwise select graphics */ -#define SELECT_VIDEO3_IF_COLOR_KEY 0x00000020 /* For 3123C0, select video3 if (color key),otherwise select graphics */ -#define SELECT_VIDEO_IF_CHROMA_KEY 0x00000002 /* 0x0000000a //select video if (chroma key ),otherwise select graphics */ -#define ALWAYS_SELECT_VIDEO 0x00000000 /* always select video,Chroma key and Color key disable */ -#define COMPOSE_V1_V3 0x00000000 /* V1 on top of V3 */ -#define COMPOSE_V3_V1 0x00100000 /* V3 on top of V1 */ -#define COMPOSE_V1_TOP 0x00000000 -#define COMPOSE_V3_TOP 0x00100000 -#define V1_COMMAND_FIRE 0x80000000 /* V1 commands fire */ -#define V3_COMMAND_FIRE 0x40000000 /* V3 commands fire */ -#define V_COMMAND_LOAD 0x20000000 /* Video register always loaded */ -#define V_COMMAND_LOAD_VBI 0x10000000 /* Video register always loaded at vbi without waiting source flip */ -#define V3_COMMAND_LOAD 0x08000000 /* CLE_C0 Video3 register always loaded */ -#define V3_COMMAND_LOAD_VBI 0x00000100 /* CLE_C0 Video3 register always loaded at vbi without waiting source flip */ -#define SECOND_DISPLAY_COLOR_KEY_ENABLE 0x00010000 - -/* V3_ZOOM_CONTROL 0x2bc */ -#define V3_X_ZOOM_ENABLE 0x80000000 -#define V3_Y_ZOOM_ENABLE 0x00008000 - -/* V3_MINI_CONTROL 0x2c0 */ -#define V3_X_INTERPOLY 0x00000002 /* X interpolation */ -#define V3_Y_INTERPOLY 0x00000001 /* Y interpolation */ -#define V3_YCBCR_INTERPOLY 0x00000004 /* Y, Cb, Cr all interpolation */ -#define V3_X_DIV_2 0x01000000 -#define V3_X_DIV_4 0x03000000 -#define V3_X_DIV_8 0x05000000 -#define V3_X_DIV_16 0x07000000 -#define V3_Y_DIV_2 0x00010000 -#define V3_Y_DIV_4 0x00030000 -#define V3_Y_DIV_8 0x00050000 -#define V3_Y_DIV_16 0x00070000 - -/* SUBP_CONTROL_STRIDE 0x3c0 */ -#define SUBP_HQV_ENABLE 0x00010000 -#define SUBP_IA44 0x00020000 -#define SUBP_AI44 0x00000000 -#define SUBP_STRIDE_MASK 0x00001fff -#define SUBP_CONTROL_MASK 0x00070000 - -/* RAM_TABLE_CONTROL 0x3c8 */ -#define RAM_TABLE_RGB_ENABLE 0x00000007 - -/* CAPTURE0_CONTROL 0x310 */ -#define C0_ENABLE 0x00000001 -#define BUFFER_2_MODE 0x00000000 -#define BUFFER_3_MODE 0x00000004 -#define BUFFER_4_MODE 0x00000006 -#define SWAP_YUYV 0x00000000 -#define SWAP_UYVY 0x00000100 -#define SWAP_YVYU 0x00000200 -#define SWAP_VYUY 0x00000300 -#define IN_601_8 0x00000000 -#define IN_656_8 0x00000010 -#define IN_601_16 0x00000020 -#define IN_656_16 0x00000030 -#define DEINTER_ODD 0x00000000 -#define DEINTER_EVEN 0x00001000 -#define DEINTER_ODD_EVEN 0x00002000 -#define DEINTER_FRAME 0x00003000 -#define VIP_1 0x00000000 -#define VIP_2 0x00000400 -#define H_FILTER_2 0x00010000 -#define H_FILTER_4 0x00020000 -#define H_FILTER_8_1331 0x00030000 -#define H_FILTER_8_12221 0x00040000 -#define VIP_ENABLE 0x00000008 -#define EN_FIELD_SIG 0x00000800 -#define VREF_INVERT 0x00100000 -#define FIELD_INPUT_INVERSE 0x00400000 -#define FIELD_INVERSE 0x40000000 - -#define C1_H_MINI_EN 0x00000800 -#define C0_H_MINI_EN 0x00000800 -#define C1_V_MINI_EN 0x04000000 -#define C0_V_MINI_EN 0x04000000 -#define C1_H_MINI_2 0x00000400 - -/* CAPTURE1_CONTROL 0x354 */ -#define C1_ENABLE 0x00000001 - -/* V3_CONTROL 0x2A0 */ -#define V3_ENABLE 0x00000001 -#define V3_FULL_SCREEN 0x00000002 -#define V3_YUV422 0x00000000 -#define V3_RGB32 0x00000004 -#define V3_RGB15 0x00000008 -#define V3_RGB16 0x0000000C -#define V3_COLORSPACE_SIGN 0x00000080 -#define V3_EXPIRE_NUM 0x00040000 -#define V3_EXPIRE_NUM_F 0x000f0000 -#define V3_BOB_ENABLE 0x00400000 -#define V3_FIELD_BASE 0x00000000 -#define V3_FRAME_BASE 0x01000000 -#define V3_SWAP_SW 0x00000000 -#define V3_SWAP_HW_HQV 0x02000000 -#define V3_FLIP_HW_CAPTURE0 0x04000000 -#define V3_FLIP_HW_CAPTURE1 0x06000000 - -/* V3_ALPHA_FETCH_COUNT 0x2B8 */ -#define V3_FETCH_COUNT 0x3ff00000 -#define ALPHA_FETCH_COUNT 0x000003ff - -/* HQV_CONTROL 0x3D0 */ -#define HQV_RGB32 0x00000000 -#define HQV_RGB16 0x20000000 -#define HQV_RGB15 0x30000000 -#define HQV_YUV422 0x80000000 -#define HQV_YUV420 0xC0000000 -#define HQV_ENABLE 0x08000000 -#define HQV_SRC_SW 0x00000000 -#define HQV_SRC_MC 0x01000000 -#define HQV_SRC_CAPTURE0 0x02000000 -#define HQV_SRC_CAPTURE1 0x03000000 -#define HQV_FLIP_EVEN 0x00000000 -#define HQV_FLIP_ODD 0x00000020 -#define HQV_SW_FLIP 0x00000010 /* Write 1 to flip HQV buffer */ -#define HQV_DEINTERLACE 0x00010000 /* First line of odd field will be repeated 3 times */ -#define HQV_FIELD_2_FRAME 0x00020000 /* Src is field. Display each line 2 times */ -#define HQV_FRAME_2_FIELD 0x00040000 /* Src is field. Display field */ -#define HQV_FRAME_UV 0x00000000 /* Src is Non-interleaved */ -#define HQV_FIELD_UV 0x00100000 /* Src is interleaved */ -#define HQV_IDLE 0x00000008 -#define HQV_FLIP_STATUS 0x00000001 -#define HQV_DOUBLE_BUFF 0x00000000 -#define HQV_TRIPLE_BUFF 0x04000000 -#define HQV_SUBPIC_FLIP 0x00008000 -#define HQV_FIFO_STATUS 0x00001000 - -/* HQV_FILTER_CONTROL 0x3E4 */ -#define HQV_H_LOWPASS_2TAP 0x00000001 -#define HQV_H_LOWPASS_4TAP 0x00000002 -#define HQV_H_LOWPASS_8TAP1 0x00000003 /* To be deleted */ -#define HQV_H_LOWPASS_8TAP2 0x00000004 /* To be deleted */ -#define HQV_H_HIGH_PASS 0x00000008 -#define HQV_H_LOW_PASS 0x00000000 -#define HQV_V_LOWPASS_2TAP 0x00010000 -#define HQV_V_LOWPASS_4TAP 0x00020000 -#define HQV_V_LOWPASS_8TAP1 0x00030000 -#define HQV_V_LOWPASS_8TAP2 0x00040000 -#define HQV_V_HIGH_PASS 0x00080000 -#define HQV_V_LOW_PASS 0x00000000 -#define HQV_H_HIPASS_F1_DEFAULT 0x00000040 -#define HQV_H_HIPASS_F2_DEFAULT 0x00000000 -#define HQV_V_HIPASS_F1_DEFAULT 0x00400000 -#define HQV_V_HIPASS_F2_DEFAULT 0x00000000 -#define HQV_H_HIPASS_F1_2TAP 0x00000050 -#define HQV_H_HIPASS_F2_2TAP 0x00000100 -#define HQV_V_HIPASS_F1_2TAP 0x00500000 -#define HQV_V_HIPASS_F2_2TAP 0x01000000 -#define HQV_H_HIPASS_F1_4TAP 0x00000060 -#define HQV_H_HIPASS_F2_4TAP 0x00000200 -#define HQV_V_HIPASS_F1_4TAP 0x00600000 -#define HQV_V_HIPASS_F2_4TAP 0x02000000 -#define HQV_H_HIPASS_F1_8TAP 0x00000080 -#define HQV_H_HIPASS_F2_8TAP 0x00000400 -#define HQV_V_HIPASS_F1_8TAP 0x00800000 -#define HQV_V_HIPASS_F2_8TAP 0x04000000 -/* IA2 NEW */ -#define HQV_V_FILTER2 0x00080000 -#define HQV_H_FILTER2 0x00000008 -#define HQV_H_TAP2_11 0x00000041 -#define HQV_H_TAP4_121 0x00000042 -#define HQV_H_TAP4_1111 0x00000401 -#define HQV_H_TAP8_1331 0x00000221 -#define HQV_H_TAP8_12221 0x00000402 -#define HQV_H_TAP16_1991 0x00000159 -#define HQV_H_TAP16_141041 0x0000026A -#define HQV_H_TAP32 0x0000015A -#define HQV_V_TAP2_11 0x00410000 -#define HQV_V_TAP4_121 0x00420000 -#define HQV_V_TAP4_1111 0x04010000 -#define HQV_V_TAP8_1331 0x02210000 -#define HQV_V_TAP8_12221 0x04020000 -#define HQV_V_TAP16_1991 0x01590000 -#define HQV_V_TAP16_141041 0x026A0000 -#define HQV_V_TAP32 0x015A0000 -#define HQV_V_FILTER_DEFAULT 0x00420000 -#define HQV_H_FILTER_DEFAULT 0x00000040 - - - - -/* HQV_MINI_CONTROL 0x3E8 */ -#define HQV_H_MINIFY_ENABLE 0x00000800 -#define HQV_V_MINIFY_ENABLE 0x08000000 -#define HQV_VDEBLOCK_FILTER 0x80000000 -#define HQV_HDEBLOCK_FILTER 0x00008000 - - -#define CHROMA_KEY_LOW 0x00FFFFFF -#define CHROMA_KEY_HIGH 0x00FFFFFF - -/* V_CAP_STATUS */ -#define V_ST_UPDATE_NOT_YET 0x00000003 -#define V1_ST_UPDATE_NOT_YET 0x00000001 -#define V3_ST_UPDATE_NOT_YET 0x00000008 - -#define VBI_STATUS 0x00000002 - -/* - * Macros for Video MMIO - */ -#ifndef V4L2 -#define VIDInB(port) *((volatile CARD8 *)(pVia->VidMapBase + (port))) -#define VIDInW(port) *((volatile CARD16 *)(pVia->VidMapBase + (port))) -#define VIDInD(port) *((volatile CARD32 *)(pVia->VidMapBase + (port))) -#define VIDOutB(port, data) *((volatile CARD8 *)(pVia->VidMapBase + (port))) = (data) -#define VIDOutW(port, data) *((volatile CARD16 *)(pVia->VidMapBase + (port))) = (data) -#define VIDOutD(port, data) *((volatile CARD32 *)(pVia->VidMapBase + (port))) = (data) -#define MPGOutD(port, data) *((volatile CARD32 *)(lpMPEGMMIO +(port))) = (data) -#define MPGInD(port) *((volatile CARD32 *)(lpMPEGMMIO +(port))) -#endif - -/* - * Macros for GE MMIO - */ -#define GEInW(port) *((volatile CARD16 *)(lpGEMMIO + (port))) -#define GEInD(port) *((volatile CARD32 *)(lpGEMMIO + (port))) -#define GEOutW(port, data) *((volatile CARD16 *)(lpGEMMIO + (port))) = (data) -#define GEOutD(port, data) *((volatile CARD32 *)(lpGEMMIO + (port))) = (data) - -/* - * MPEG 1/2 Slice Engine (at 0xC00 relative to base) - */ - -#define MPG_CONTROL 0x00 -#define MPG_CONTROL_STRUCT 0x03 -#define MPG_CONTROL_STRUCT_TOP 0x01 -#define MPG_CONTROL_STRUCT_BOTTOM 0x02 -#define MPG_CONTROL_STRUCT_FRAME 0x03 - /* Use TOP if interlaced */ -#define MPG_CONTROL_TYPE 0x3C -#define MPG_CONTROL_TYPE_I (0x01 << 2) -#define MPG_CONTROL_TYPE_B (0x02 << 2) -#define MPG_CONTROL_TYPE_P (0x03 << 3) -#define MPG_CONTROL_ALTSCAN 0x40 -#define MPG_BLOCK 0x08 /* Unsure */ -#define MPG_COMMAND 0x0C -#define MPG_DATA1 0x10 -#define MPG_DATA2 0x14 -#define MPG_DATA3 0x18 -#define MPG_DATA4 0x1C - -#define MPG_YPHYSICAL(x) (0x20 + 12*(x)) -#define MPG_CbPHYSICAL(x) (0x24 + 12*(x)) -#define MPG_CrPHYSICAL(x) (0x28 + 12*(x)) - -#define MPG_PITCH 0x50 -#define MPG_STATUS 0x54 - -#define MPG_MATRIX_IDX 0x5C -#define MPG_MATRIX_IDX_INTRA 0x00 -#define MPG_MATRIX_IDX_NON 0x01 -#define MPG_MATRIX_DATA 0x60 - -#define MPG_SLICE_CTRL_1 0x90 -#define MPG_SLICE_MBAMAX 0x2FFF -#define MPG_SLICE_PREDICTIVE_DCT 0x4000 -#define MPG_SLICE_TOP_FIRST 0x8000 -#define MPG_SLICE_MACROBLOCK_WIDTH(x) ((x)<<18) /* in 64's */ -#define MPG_SLICE_CTRL_2 0x94 -#define MPG_SLICE_CONCEAL_MVEC 0x0000001 -#define MPG_SLICE_QSCALE_TYPE 0x0000002 -#define MPG_SLICE_DCPRECISION 0x000000C -#define MPG_SLICE_MACROBQUOT 0x0FFFFF0 -#define MPG_SLICE_INTRAVLC 0x1000000 -#define MPG_SLICE_CTRL_3 0x98 -#define MPG_SLICE_FHMVR 0x0000003 -#define MPG_SLICE_FVMVR 0x000000C -#define MPG_SLICE_BHMVR 0x0000030 -#define MPG_SLICE_BVMVR 0x00000C0 -#define MPG_SLICE_SECOND_FIELD 0x0100000 -#define MPG_SLICE_RESET 0x0400000 -#define MPG_SLICE_LENGTH 0x9C -#define MPG_SLICE_DATA 0xA0 - - - -#endif /* _VIA_H_ */ diff --git a/src/video_out/vidix/drivers/unichrome_vid.c b/src/video_out/vidix/drivers/unichrome_vid.c deleted file mode 100644 index b5ff314e6..000000000 --- a/src/video_out/vidix/drivers/unichrome_vid.c +++ /dev/null @@ -1,772 +0,0 @@ -/* - Driver for VIA CLE266 Unichrome - Version 0.1.0 - - Copyright (C) 2004 by Timothy Lee - - Based on Cyberblade/i driver by Alastair M. Robison. - - Thanks to Gilles Frattini for bugfixes - - 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 - - Changes: - 2004-03-10 - Initial version - - To Do: -*/ - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include <unistd.h> - -#include "vidix.h" -#include "fourcc.h" -#include "libdha.h" -#include "pci_ids.h" -#include "pci_names.h" - -#include "unichrome_regs.h" - -pciinfo_t pci_info; - -uint8_t *uc_mem; -static vidix_grkey_t uc_grkey; -static int frames[VID_PLAY_MAXFRAMES]; -uint8_t *vio; -uint8_t mclk_save[3]; - -#define VIA_OUT(hwregs, reg, val) *(volatile uint32_t *)((hwregs) + (reg)) = (val) -#define VIA_IN(hwregs, reg) *(volatile uint32_t *)((hwregs) + (reg)) -#define VGA_OUT8(hwregs, reg, val) *(volatile uint8_t *)((hwregs) + (reg) + 0x8000) = (val) -#define VGA_IN8(hwregs, reg) *(volatile uint8_t *)((hwregs) + (reg) + 0x8000) -#define VIDEO_OUT(hwregs, reg, val) VIA_OUT((hwregs)+0x200, reg, val) -#define VIDEO_IN(hwregs, reg) VIA_IN((hwregs)+0x200, reg) - -#define outb(val,reg) OUTPORT8(reg,val) -#define inb(reg) INPORT8(reg) - -#define ALIGN_TO(v, n) (((v) + (n-1)) & ~(n-1)) -#define UC_MAP_V1_FIFO_CONTROL(depth, pre_thr, thr) \ - (((depth)-1) | ((thr) << 8) | ((pre_thr) << 24)) - -#define FRAMEBUFFER_START 0x600000 -#define FRAMEBUFFER_SIZE 0x200000 - -#ifdef DEBUG_LOGFILE -FILE *logfile=0; -#define LOGWRITE(x) {if(logfile) fprintf(logfile,x);} -#else -#define LOGWRITE(x) -#endif - - -static vidix_capability_t uc_cap = -{ - "VIA CLE266 Unichrome driver", - "Timothy Lee <timothy@siriushk.com>", - TYPE_OUTPUT, - { 0, 0, 0, 0 }, - 4096, - 4096, - 4, - 4, - -1, - FLAG_UPSCALER|FLAG_DOWNSCALER, - VENDOR_VIA2, - -1, - { 0, 0, 0, 0 } -}; - - -unsigned int vixGetVersion(void) -{ - return(VIDIX_VERSION); -} - - -static unsigned short uc_card_ids[] = -{ - DEVICE_VIA2_VT8623_APOLLO_CLE266 -}; - - -static int find_chip(unsigned chip_id) -{ - unsigned i; - for(i = 0;i < sizeof(uc_card_ids)/sizeof(unsigned short);i++) - { - if(chip_id == uc_card_ids[i]) return i; - } - return -1; -} - - -/** - * Map hw settings for vertical scaling. - * - * @param sh source height - * @param dh destination height - * @param zoom will hold vertical setting of zoom register. - * @param mini will hold vertical setting of mini register. - * - * @returns 1 if successful. - * 0 if the zooming factor is too large or small. - * - * @note Derived from VIA's V4L driver. - * See ddover.c, DDOVER_HQVCalcZoomHeight() - */ - -static int uc_ovl_map_vzoom(int sh, int dh, uint32_t* zoom, uint32_t* mini) -{ - uint32_t sh1, tmp, d; - int zoom_ok = 1; - - if (sh == dh) { // No zoom - // Do nothing - } - else if (sh < dh) { // Zoom in - - tmp = (sh * 0x0400) / dh; - zoom_ok = !(tmp > 0x3ff); - - *zoom |= (tmp & 0x3ff) | V1_Y_ZOOM_ENABLE; - *mini |= V1_Y_INTERPOLY | V1_YCBCR_INTERPOLY; - } - else { // sw > dh - Zoom out - - // Find a suitable divider (1 << d) = {2, 4, 8 or 16} - - sh1 = sh; - for (d = 1; d < 5; d++) { - sh1 >>= 1; - if (sh1 <= dh) break; - } - if (d == 5) { // Too small. - d = 4; - zoom_ok = 0; - } - - *mini |= ((d<<1)-1) << 16; // <= {1,3,5,7} << 16 - - // Add scaling - - if (sh1 < dh) { - tmp = (sh1 * 0x400) / dh; - *zoom |= ((tmp & 0x3ff) | V1_Y_ZOOM_ENABLE); - *mini |= V1_Y_INTERPOLY | V1_YCBCR_INTERPOLY; - } - } - - return zoom_ok; -} - - -/** - * Map hw settings for horizontal scaling. - * - * @param sw source width - * @param dw destination width - * - * @param zoom will hold horizontal setting of zoom register. - * @param mini will hold horizontal setting of mini register. - * @param falign will hold fetch aligment - * @param dcount will hold display count - * - * @returns 1 if successful. - * 0 if the zooming factor is too large or small. - * - * @note Derived from VIA's V4L driver. - * See ddover.c, DDOVER_HQVCalcZoomWidth() and DDOver_GetDisplayCount() - */ -static int uc_ovl_map_hzoom(int sw, int dw, uint32_t* zoom, uint32_t* mini, - int* falign, int* dcount) -{ - uint32_t tmp, sw1, d; - int md; // Minify-divider - int zoom_ok = 1; - - md = 1; - *falign = 0; - - if (sw == dw) { // No zoom - // Do nothing - } - else if (sw < dw) { // Zoom in - - tmp = (sw * 0x0800) / dw; - zoom_ok = !(tmp > 0x7ff); - - *zoom |= ((tmp & 0x7ff) << 16) | V1_X_ZOOM_ENABLE; - *mini |= V1_X_INTERPOLY; - } - else { // sw > dw - Zoom out - - // Find a suitable divider (1 << d) = {2, 4, 8 or 16} - - sw1 = sw; - for (d = 1; d < 5; d++) { - sw1 >>= 1; - if (sw1 <= dw) break; - } - if (d == 5) { // Too small. - d = 4; - zoom_ok = 0; - } - - md = 1 << d; // <= {2,4,8,16} - *falign = ((md<<1)-1) & 0xf; // <= {3,7,15,15} - *mini |= V1_X_INTERPOLY; - *mini |= ((d<<1)-1) << 24; // <= {1,3,5,7} << 24 - - // Add scaling - - if (sw1 < dw) { - //CLE bug - //tmp = sw1*0x0800 / dw; - tmp = (sw1 - 2) * 0x0800 / dw; - *zoom |= ((tmp & 0x7ff) << 16) | V1_X_ZOOM_ENABLE; - } - } - - *dcount = sw - md; - - return zoom_ok; -} - - -/** - * @param format overlay pixel format - * @param sw source width - * - * @returns qword fetch register setting - * - * @note Derived from VIA's V4L driver. See ddover.c, DDOver_GetFetch() - * @note Only call after uc_ovl_map_hzoom() - */ -static uint32_t uc_ovl_map_qwfetch(uint32_t format, int sw) -{ - uint32_t fetch = 0; - - switch (format) { - case IMGFMT_YV12: - case IMGFMT_I420: - fetch = ALIGN_TO(sw, 32) >> 4; - break; - case IMGFMT_UYVY: - case IMGFMT_YVYU: - case IMGFMT_YUY2: - fetch = (ALIGN_TO(sw << 1, 16) >> 4) + 1; - break; - case IMGFMT_BGR15: - case IMGFMT_BGR16: - fetch = (ALIGN_TO(sw << 1, 16) >> 4) + 1; - break; - case IMGFMT_BGR32: - fetch = (ALIGN_TO(sw << 2, 16) >> 4) + 1; - break; - default: - printf("[unichrome] Unexpected pixelformat!"); - break; - } - - if (fetch < 4) - fetch = 4; - - return fetch; -} - - -/** - * Map pixel format. - * - * @note Derived from VIA's V4L driver. See ddover.c, DDOver_GetV1Format() - */ -static uint32_t uc_ovl_map_format(uint32_t format) -{ - switch (format) { - case IMGFMT_UYVY: - case IMGFMT_YVYU: - case IMGFMT_YUY2: - return V1_COLORSPACE_SIGN | V1_YUV422; - case IMGFMT_IYUV: - return V1_COLORSPACE_SIGN | V1_YCbCr420 | V1_SWAP_SW; - case IMGFMT_YV12: - case IMGFMT_I420: - return V1_COLORSPACE_SIGN | V1_YCbCr420; - case IMGFMT_BGR15: - return V1_RGB15; - case IMGFMT_BGR16: - return V1_RGB16; - case IMGFMT_BGR32: - return V1_RGB32; - default : - printf("[unichrome] Unexpected pixelformat!"); - return V1_YUV422; - } -} - - -/** - * Calculate V1 control and fifo-control register values - * @param format pixel format - * @param sw source width - * @param hwrev CLE266 hardware revision - * @param extfifo_on set this 1 if the extended FIFO is enabled - * @param control will hold value for V1_CONTROL - * @param fifo will hold value for V1_FIFO_CONTROL - */ -static void uc_ovl_map_v1_control(uint32_t format, int sw, - int hwrev, int extfifo_on, - uint32_t* control, uint32_t* fifo) -{ - *control = V1_BOB_ENABLE | uc_ovl_map_format(format); - - if (hwrev == 0x10) { - *control |= V1_EXPIRE_NUM_F; - } - else { - if (extfifo_on) { - *control |= V1_EXPIRE_NUM_A | V1_FIFO_EXTENDED; - } - else { - *control |= V1_EXPIRE_NUM; - } - } - - if ((format == IMGFMT_YV12) || (format == IMGFMT_I420)) { - //Minified video will be skewed without this workaround. - if (sw <= 80) { //Fetch count <= 5 - *fifo = UC_MAP_V1_FIFO_CONTROL(16,0,0); - } - else { - if (hwrev == 0x10) - *fifo = UC_MAP_V1_FIFO_CONTROL(64,56,56); - else - *fifo = UC_MAP_V1_FIFO_CONTROL(16,12,8); - } - } - else { - if (hwrev == 0x10) { - *fifo = UC_MAP_V1_FIFO_CONTROL(64,56,56); // Default rev 0x10 - } - else { - if (extfifo_on) - *fifo = UC_MAP_V1_FIFO_CONTROL(48,40,40); - else - *fifo = UC_MAP_V1_FIFO_CONTROL(32,29,16); // Default - } - } -} - - -static void uc_ovl_setup_fifo(int *extfifo_on, int dst_w) -{ - if (dst_w <= 1024) - { - // Disable extended FIFO - outb(0x16, 0x3c4); outb(mclk_save[0], 0x3c5); - outb(0x17, 0x3c4); outb(mclk_save[1], 0x3c5); - outb(0x18, 0x3c4); outb(mclk_save[2], 0x3c5); - *extfifo_on = 0; - } - else - { - // Enable extended FIFO - outb(0x17, 0x3c4); outb(0x2f, 0x3c5); - outb(0x16, 0x3c4); outb((mclk_save[0] & 0xf0) | 0x14, 0x3c5); - outb(0x18, 0x3c4); outb(0x56, 0x3c5); - *extfifo_on = 1; - } -} - - -static void uc_ovl_vcmd_wait(volatile uint8_t* vio) -{ - while ((VIDEO_IN(vio, V_COMPOSE_MODE) - & (V1_COMMAND_FIRE | V3_COMMAND_FIRE))); -} - - -int vixProbe(int verbose, int force) -{ - pciinfo_t lst[MAX_PCI_DEVICES]; - unsigned i,num_pci; - int err; - err = pci_scan(lst,&num_pci); - if(err) - { - printf("[unichrome] Error occurred during pci scan: %s\n",strerror(err)); - return err; - } - else - { - err = ENXIO; - for(i=0; i < num_pci; i++) - { - if(lst[i].vendor == VENDOR_VIA2) - { - int idx; - const char *dname; - idx = find_chip(lst[i].device); - if(idx == -1) - continue; - dname = pci_device_name(VENDOR_VIA2, lst[i].device); - dname = dname ? dname : "Unknown chip"; - printf("[unichrome] Found chip: %s\n", dname); - uc_cap.device_id = lst[i].device; - err = 0; - memcpy(&pci_info, &lst[i], sizeof(pciinfo_t)); - break; - } - } - } - - if(err && verbose) printf("[unichrome] Can't find chip\n"); - return err; -} - - -int vixInit(const char *args) -{ - long tmp; - uc_mem = map_phys_mem(pci_info.base0, 0x800000); - enable_app_io(); - - outb(0x2f, 0x3c4); - tmp = inb(0x3c5) << 0x18; - vio = map_phys_mem(tmp,0x1000); - - outb(0x16, 0x3c4); mclk_save[0] = inb(0x3c5); - outb(0x17, 0x3c4); mclk_save[1] = inb(0x3c5); - outb(0x18, 0x3c4); mclk_save[2] = inb(0x3c5); - - uc_grkey.ckey.blue = 0x00; - uc_grkey.ckey.green = 0x00; - uc_grkey.ckey.red = 0x00; - -#ifdef DEBUG_LOGFILE - logfile=fopen("/tmp/uc_vidix.log","w"); -#endif - return 0; -} - -void vixDestroy(void) -{ -#ifdef DEBUG_LOGFILE - if(logfile) - fclose(logfile); -#endif - outb(0x16, 0x3c4); outb(mclk_save[0], 0x3c5); - outb(0x17, 0x3c4); outb(mclk_save[1], 0x3c5); - outb(0x18, 0x3c4); outb(mclk_save[2], 0x3c5); - - disable_app_io(); - unmap_phys_mem(uc_mem, 0x800000); - unmap_phys_mem(vio, 0x1000); -} - - -int vixGetCapability(vidix_capability_t *to) -{ - memcpy(to, &uc_cap, sizeof(vidix_capability_t)); - return 0; -} - - -static int is_supported_fourcc(uint32_t fourcc) -{ - switch(fourcc) - { - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_UYVY: - case IMGFMT_YVYU: - case IMGFMT_YUY2: - case IMGFMT_BGR15: - case IMGFMT_BGR16: - case IMGFMT_BGR32: - return 1; - default: - return 0; - } -} - -int vixQueryFourcc(vidix_fourcc_t *to) -{ - if(is_supported_fourcc(to->fourcc)) - { - to->depth = VID_DEPTH_1BPP | VID_DEPTH_2BPP | - VID_DEPTH_4BPP | VID_DEPTH_8BPP | - VID_DEPTH_12BPP| VID_DEPTH_15BPP| - VID_DEPTH_16BPP| VID_DEPTH_24BPP| - VID_DEPTH_32BPP; - to->flags = VID_CAP_EXPAND | VID_CAP_SHRINK | VID_CAP_COLORKEY; - return 0; - } - else - to->depth = to->flags = 0; - return ENOSYS; -} - - -int vixGetGrKeys(vidix_grkey_t *grkey) -{ - memcpy(grkey, &uc_grkey, sizeof(vidix_grkey_t)); - return(0); -} - - -int vixSetGrKeys(const vidix_grkey_t *grkey) -{ - unsigned long dwCompose = VIDEO_IN(vio, V_COMPOSE_MODE) & ~0x0f; - memcpy(&uc_grkey, grkey, sizeof(vidix_grkey_t)); - if (uc_grkey.ckey.op != CKEY_FALSE) - { - // Set colorkey - // (how do I detect BPP in hardware??) - unsigned long ckey; - if (1) // Assume 16-bit graphics - { - ckey = (grkey->ckey.blue & 0x1f) - | ((grkey->ckey.green & 0x3f) << 5) - | ((grkey->ckey.red & 0x1f) << 11); - } - else - { - ckey = (grkey->ckey.blue) - | (grkey->ckey.green << 8) - | (grkey->ckey.red << 16); - } - VIDEO_OUT(vio, V_COLOR_KEY, ckey); - dwCompose |= SELECT_VIDEO_IF_COLOR_KEY; - } - - // Execute the changes - VIDEO_OUT(vio, V_COMPOSE_MODE, dwCompose | V1_COMMAND_FIRE); - return(0); -} - - -vidix_video_eq_t equal = -{ - VEQ_CAP_BRIGHTNESS | VEQ_CAP_SATURATION | VEQ_CAP_HUE, - 300, 100, 0, 0, 0, 0, 0, 0 -}; - -int vixPlaybackGetEq( vidix_video_eq_t * eq) -{ - memcpy(eq,&equal,sizeof(vidix_video_eq_t)); - return 0; -} - -int vixPlaybackSetEq( const vidix_video_eq_t * eq) -{ - return 0; -} - - -static int YOffs,UOffs,VOffs; - -int vixConfigPlayback(vidix_playback_t *info) -{ - int src_w, drw_w; - int src_h, drw_h; - long base0, pitch; - int uv_size, swap_uv; - unsigned int i; - int extfifo_on; - - // Overlay register settings - uint32_t win_start, win_end; - uint32_t zoom, mini; - uint32_t dcount, falign, qwfetch; - uint32_t v_ctrl, fifo_ctrl; - - if(!is_supported_fourcc(info->fourcc)) - return -1; - - src_w = info->src.w; - src_h = info->src.h; - - drw_w = info->dest.w; - drw_h = info->dest.h; - - // Setup FIFO - uc_ovl_setup_fifo(&extfifo_on, src_w); - - // Get image format, FIFO size, etc. - uc_ovl_map_v1_control(info->fourcc, src_w, 3, extfifo_on, - &v_ctrl, &fifo_ctrl); - - // Setup layer window - win_start = (info->dest.x << 16) | info->dest.y; - win_end = ((info->dest.x + drw_w - 1) << 16) | - (info->dest.y + drw_h - 1); - - // Get scaling and data-fetch parameters - zoom = 0; - mini = 0; - uc_ovl_map_vzoom(src_h, drw_h, &zoom, &mini); - uc_ovl_map_hzoom(src_w, drw_w, &zoom, &mini, &falign, &dcount); - qwfetch = uc_ovl_map_qwfetch(info->fourcc, src_w); - - // Calculate buffer sizes - swap_uv = 0; - switch(info->fourcc) - { - default: - case IMGFMT_YV12: - swap_uv = 1; - case IMGFMT_I420: - case IMGFMT_UYVY: - case IMGFMT_YVYU: - pitch = ALIGN_TO (src_w, 32); - uv_size = (pitch >> 1) * (src_h >> 1); - break; - - case IMGFMT_YUY2: - case IMGFMT_BGR15: - case IMGFMT_BGR16: - pitch = ALIGN_TO (src_w << 1, 32); - uv_size = 0; - break; - - case IMGFMT_BGR32: - pitch = ALIGN_TO (src_w << 2, 32); - uv_size = 0; - break; - } - if ((src_w > 4096) || (src_h > 4096) || - (src_w < 32) || (src_h < 1) || (pitch > 0x1fff)) - { - printf("[unichrome] Layer size out of bounds\n"); - } - - // Calculate offsets - info->offset.y = 0; - info->offset.v = info->offset.y + pitch * src_h; - info->offset.u = info->offset.v + uv_size; - info->frame_size = info->offset.u + uv_size; - YOffs = info->offset.y; - UOffs = (swap_uv ? info->offset.v : info->offset.u); - VOffs = (swap_uv ? info->offset.u : info->offset.v); - - /* Assume we have 2 MB to play with */ - info->num_frames = FRAMEBUFFER_SIZE / info->frame_size; - if(info->num_frames > VID_PLAY_MAXFRAMES) - info->num_frames = VID_PLAY_MAXFRAMES; - - /* Start at 6 MB. Let's hope it's not in use. */ - base0 = FRAMEBUFFER_START; - info->dga_addr = uc_mem + base0; - - info->dest.pitch.y = 32; - info->dest.pitch.u = 32; - info->dest.pitch.v = 32; - - for(i = 0; i < info->num_frames; i++) - { - info->offsets[i] = info->frame_size * i; - frames[i] = base0+info->offsets[i]; - } - - // Write to the hardware - uc_ovl_vcmd_wait(vio); - - // Configure diy_pitchlay parameters now - if (v_ctrl & V1_COLORSPACE_SIGN) - { - VIDEO_OUT (vio, V1_ColorSpaceReg_2, ColorSpaceValue_2); - VIDEO_OUT (vio, V1_ColorSpaceReg_1, ColorSpaceValue_1); - } - - VIDEO_OUT(vio, V1_CONTROL, v_ctrl); - VIDEO_OUT(vio, V_FIFO_CONTROL, fifo_ctrl); - - VIDEO_OUT(vio, V1_WIN_START_Y, win_start); - VIDEO_OUT(vio, V1_WIN_END_Y, win_end); - - VIDEO_OUT(vio, V1_SOURCE_HEIGHT, (src_h << 16) | dcount); - - VIDEO_OUT(vio, V12_QWORD_PER_LINE, qwfetch << 20); - VIDEO_OUT(vio, V1_STRIDE, pitch | ((pitch >> 1) << 16)); - - VIDEO_OUT(vio, V1_MINI_CONTROL, mini); - VIDEO_OUT(vio, V1_ZOOM_CONTROL, zoom); - - // Configure buffer address and execute the changes now! - vixPlaybackFrameSelect(0); - - return 0; -} - - -int vixPlaybackOn(void) -{ - LOGWRITE("Enable overlay\n"); - - // Turn on overlay - VIDEO_OUT(vio, V1_CONTROL, VIDEO_IN(vio, V1_CONTROL) | V1_ENABLE); - - // Execute the changes - VIDEO_OUT(vio, V_COMPOSE_MODE, - VIDEO_IN(vio, V_COMPOSE_MODE) | V1_COMMAND_FIRE); - - return 0; -} - - -int vixPlaybackOff(void) -{ - LOGWRITE("Disable overlay\n"); - - uc_ovl_vcmd_wait(vio); - - // Restore FIFO - VIDEO_OUT(vio, V_FIFO_CONTROL, UC_MAP_V1_FIFO_CONTROL(16,12,8)); - - // Turn off overlay - VIDEO_OUT(vio, V1_CONTROL, VIDEO_IN(vio, V1_CONTROL) & ~V1_ENABLE); - - // Execute the changes - VIDEO_OUT(vio, V_COMPOSE_MODE, - VIDEO_IN(vio, V_COMPOSE_MODE) | V1_COMMAND_FIRE); - - return 0; -} - - -int vixPlaybackFrameSelect(unsigned int frame) -{ - LOGWRITE("Frame select\n"); - - uc_ovl_vcmd_wait(vio); - - // Configure buffer address - VIDEO_OUT(vio, V1_STARTADDR_Y0, frames[frame]+YOffs); - VIDEO_OUT(vio, V1_STARTADDR_CB0, frames[frame]+UOffs); - VIDEO_OUT(vio, V1_STARTADDR_CR0, frames[frame]+VOffs); - - // Execute the changes - VIDEO_OUT(vio, V_COMPOSE_MODE, - VIDEO_IN(vio, V_COMPOSE_MODE) | V1_COMMAND_FIRE); - - return 0; -} - diff --git a/src/video_out/vidix/fourcc.h b/src/video_out/vidix/fourcc.h deleted file mode 100644 index 891f0b6ff..000000000 --- a/src/video_out/vidix/fourcc.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * fourcc.h - * This file is part of VIDIX - * Copyright 2002 Nick Kurshev - * Licence: GPL - * This interface is based on v4l2, fbvid.h, mga_vid.h projects - * and personally my ideas. -*/ -#ifndef FOURCC_H -#define FOURCC_H - -/* Four-character-code (FOURCC) */ -#define vid_fourcc(a,b,c,d)\ - (((unsigned)(a)<<0)|((unsigned)(b)<<8)|((unsigned)(c)<<16)|((unsigned)(d)<<24)) - -/* RGB fourcc */ -#define IMGFMT_RGB332 vid_fourcc('R','G','B','1') /* 8 RGB-3-3-2 */ -#define IMGFMT_RGB555 vid_fourcc('R','G','B','O') /* 16 RGB-5-5-5 */ -#define IMGFMT_RGB565 vid_fourcc('R','G','B','P') /* 16 RGB-5-6-5 */ -#define IMGFMT_RGB555X vid_fourcc('R','G','B','Q') /* 16 RGB-5-5-5 BE */ -#define IMGFMT_RGB565X vid_fourcc('R','G','B','R') /* 16 RGB-5-6-5 BE */ -#define IMGFMT_BGR15 vid_fourcc('B','G','R',15) /* 15 BGR-5-5-5 */ -#define IMGFMT_RGB15 vid_fourcc('R','G','B',15) /* 15 RGB-5-5-5 */ -#define IMGFMT_BGR16 vid_fourcc('B','G','R',16) /* 32 BGR-5-6-5 */ -#define IMGFMT_RGB16 vid_fourcc('R','G','B',16) /* 32 RGB-5-6-5 */ -#define IMGFMT_BGR24 vid_fourcc('B','G','R',24) /* 24 BGR-8-8-8 */ -#define IMGFMT_RGB24 vid_fourcc('R','G','B',24) /* 24 RGB-8-8-8 */ -#define IMGFMT_BGR32 vid_fourcc('B','G','R',32) /* 32 BGR-8-8-8-8 */ -#define IMGFMT_RGB32 vid_fourcc('R','G','B',32) /* 32 RGB-8-8-8-8 */ - -/* Planar YUV Formats */ -#define IMGFMT_YVU9 vid_fourcc('Y','V','U','9') /* 9 YVU 4:1:0 */ -#define IMGFMT_IF09 vid_fourcc('I','F','0','9') /* 9.5 YUV 4:1:0 */ -#define IMGFMT_YV12 vid_fourcc('Y','V','1','2') /* 12 YVU 4:2:0 */ -#define IMGFMT_I420 vid_fourcc('I','4','2','0') /* 12 YUV 4:2:0 */ -#define IMGFMT_IYUV vid_fourcc('I','Y','U','V') /* 12 YUV 4:2:0 */ -#define IMGFMT_CLPL vid_fourcc('C','L','P','L') /* 12 */ -#define IMGFMT_Y800 vid_fourcc('Y','8','0','0') /* 8 Y Grayscale */ -#define IMGFMT_NV12 vid_fourcc('N','V','1','2') /* 8 Y Grayscale */ -#define IMGFMT_Y8 vid_fourcc('Y','8',' ',' ') /* 8 Y Grayscale */ - -/* Packed YUV Formats */ -#define IMGFMT_IUYV vid_fourcc('I','U','Y','V') /* 16 line order {0,2,4,...1,3,5} */ -#define IMGFMT_IY41 vid_fourcc('I','Y','4','1') /* 12 line order {0,2,4,...1,3,5} */ -#define IMGFMT_IYU1 vid_fourcc('I','Y','U','1') /* 12 IEEE 1394 Digital Camera */ -#define IMGFMT_IYU2 vid_fourcc('I','Y','U','2') /* 24 IEEE 1394 Digital Camera */ -#define IMGFMT_UYVY vid_fourcc('U','Y','V','Y') /* 16 UYVY 4:2:2 */ -#define IMGFMT_UYNV vid_fourcc('U','Y','N','V') /* 16 UYVY 4:2:2 */ -#define IMGFMT_cyuv vid_fourcc('c','y','u','v') /* 16 */ -#define IMGFMT_Y422 vid_fourcc('Y','4','2','2') /* 16 UYVY 4:2:2 */ -#define IMGFMT_YUY2 vid_fourcc('Y','U','Y','2') /* 16 YUYV 4:2:2 */ -#define IMGFMT_YUNV vid_fourcc('Y','U','N','V') /* 16 YUYV 4:2:2 */ -#define IMGFMT_YVYU vid_fourcc('Y','V','Y','U') /* 16 YVYU 4:2:2 */ -#define IMGFMT_Y41P vid_fourcc('Y','4','1','P') /* 12 YUV 4:1:1 */ -#define IMGFMT_Y211 vid_fourcc('Y','2','1','1') /* 8.5 YUV 2:1:1 */ -#define IMGFMT_Y41T vid_fourcc('Y','4','1','T') /* 12 YUV 4:1:1 */ -#define IMGFMT_Y42T vid_fourcc('Y','4','2','T') /* 16 UYVU 4:2:2 */ -#define IMGFMT_V422 vid_fourcc('V','4','2','2') /* 16 YUY2 4:2:2 */ -#define IMGFMT_V655 vid_fourcc('V','6','5','5') /* 16 YUV 4:2:2 */ -#define IMGFMT_CLJR vid_fourcc('C','L','J','R') /* 7.9 YUV 4:1:1 */ -#define IMGFMT_YUVP vid_fourcc('Y','U','V','P') /* 24 Y0U0Y1V0 */ -#define IMGFMT_UYVP vid_fourcc('U','Y','V','P') /* 24 U0Y0V0Y1 */ -#define IMGFMT_411P vid_fourcc('4','1','1','P') /* 12 alias of Y41B */ -#define IMGFMT_422P vid_fourcc('4','2','2','P') /* 16 alias of Y42B */ -#define IMGFMT_444P vid_fourcc('4','4','4','P') /* 24 alias of Y44B */ - -/* Vendor-specific formats */ -#define IMGFMT_WNVA vid_fourcc('W','N','V','A') /* Winnov hw compress */ - -#endif diff --git a/src/video_out/vidix/vidix.h b/src/video_out/vidix/vidix.h deleted file mode 100644 index bcf6b4ae0..000000000 --- a/src/video_out/vidix/vidix.h +++ /dev/null @@ -1,312 +0,0 @@ -/* - * vidix.h - * VIDIX - VIDeo Interface for *niX - * This interface is introduced as universal one to MPEG decoder, - * BES == Back End Scaler and YUV2RGB hw accelerators. - * In the future it may be expanded up to capturing and audio things. - * Main goal of this this interface imlpementation is providing DGA - * everywhere where it's possible (unlike X11 and other). - * Copyright 2002 Nick Kurshev - * Licence: GPL - * This interface is based on v4l2, fbvid.h, mga_vid.h projects - * and personally my ideas. - * NOTE: This interface is introduces as driver interface. - * Don't use it for APP. -*/ -#ifndef VIDIX_H -#define VIDIX_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define VIDIX_VERSION 100 - - /* returns driver version */ -extern unsigned vixGetVersion( void ); - -#define PROBE_NORMAL 0 /* normal probing */ -#define PROBE_FORCE 1 /* ignore device_id but recognize device if it's known */ - /* Probes video hw. - verbose - specifies verbose level. - force - specifies force mode - driver should ignore - device_id (danger but useful for new devices) - Returns 0 if ok else errno */ -extern int vixProbe( int verbose, int force ); - /* Initializes driver. - args - specifies driver specific parameters - Returns 0 if ok else errno */ -extern int vixInit( const char *args ); - /* Destroys driver */ -extern void vixDestroy( void ); - -typedef struct vidix_capability_s -{ - char name[64]; /* Driver name */ - char author[64]; /* Author name */ -#define TYPE_OUTPUT 0x00000000 /* Is a video playback device */ -#define TYPE_CAPTURE 0x00000001 /* Is a capture device */ -#define TYPE_CODEC 0x00000002 /* Device supports hw (de)coding */ -#define TYPE_FX 0x00000004 /* Is a video effects device */ - int type; /* Device type, see below */ - unsigned reserved0[4]; - int maxwidth; - int maxheight; - int minwidth; - int minheight; - int maxframerate; /* -1 if unlimited */ -#define FLAG_NONE 0x00000000 /* No flags defined */ -#define FLAG_DMA 0x00000001 /* Card can use DMA */ -#define FLAG_EQ_DMA 0x00000002 /* Card can use DMA only if src pitch == dest pitch */ -#define FLAG_SYNC_DMA 0x00000004 /* Possible to wait for DMA - * to finish. See - * BM_DMA_SYNC and - * BM_DMA_BLOCK below */ -#define FLAG_UPSCALER 0x00000010 /* Card supports hw upscaling */ -#define FLAG_DOWNSCALER 0x00000020 /* Card supports hw downscaling */ -#define FLAG_SUBPIC 0x00001000 /* Card supports DVD subpictures */ -#define FLAG_EQUALIZER 0x00002000 /* Card supports equalizer */ - unsigned flags; /* Feature flags, see above */ - unsigned short vendor_id; - unsigned short device_id; - unsigned reserved1[4]; -}vidix_capability_t; - - /* Should fill at least type before init. - Returns 0 if ok else errno */ -extern int vixGetCapability(vidix_capability_t *); - -typedef struct vidix_fourcc_s -{ - unsigned fourcc; /* input: requested fourcc */ - unsigned srcw; /* input: hint: width of source */ - unsigned srch; /* input: hint: height of source */ -#define VID_DEPTH_NONE 0x0000 -#define VID_DEPTH_1BPP 0x0001 -#define VID_DEPTH_2BPP 0x0002 -#define VID_DEPTH_4BPP 0x0004 -#define VID_DEPTH_8BPP 0x0008 -#define VID_DEPTH_12BPP 0x0010 -#define VID_DEPTH_15BPP 0x0020 -#define VID_DEPTH_16BPP 0x0040 -#define VID_DEPTH_24BPP 0x0080 -#define VID_DEPTH_32BPP 0x0100 - unsigned depth; /* output: screen depth for given fourcc */ -#define VID_CAP_NONE 0x0000 -#define VID_CAP_EXPAND 0x0001 /* if overlay can be bigger than source */ -#define VID_CAP_SHRINK 0x0002 /* if overlay can be smaller than source */ -#define VID_CAP_BLEND 0x0004 /* if overlay can be blended with framebuffer */ -#define VID_CAP_COLORKEY 0x0008 /* if overlay can be restricted to a colorkey */ -#define VID_CAP_ALPHAKEY 0x0010 /* if overlay can be restricted to an alpha channel */ -#define VID_CAP_COLORKEY_ISRANGE 0x0020 /* if the colorkey can be a range */ -#define VID_CAP_ALPHAKEY_ISRANGE 0x0040 /* if the alphakey can be a range */ -#define VID_CAP_COLORKEY_ISMAIN 0x0080 /* colorkey is checked against framebuffer */ -#define VID_CAP_COLORKEY_ISOVERLAY 0x0100 /* colorkey is checked against overlay */ -#define VID_CAP_ALPHAKEY_ISMAIN 0x0200 /* alphakey is checked against framebuffer */ -#define VID_CAP_ALPHAKEY_ISOVERLAY 0x0400 /* alphakey is checked against overlay */ - unsigned flags; /* output: capability */ -}vidix_fourcc_t; - - /* Returns 0 if ok else errno */ -extern int vixQueryFourcc(vidix_fourcc_t *); - -typedef struct vidix_yuv_s -{ - unsigned y,u,v,a; -}vidix_yuv_t; - -typedef struct vidix_rect_s -{ - unsigned x,y,w,h; /* in pixels */ - vidix_yuv_t pitch; /* line-align in bytes */ -}vidix_rect_t; - -typedef struct vidix_color_key_s -{ -#define CKEY_FALSE 0 -#define CKEY_TRUE 1 -#define CKEY_EQ 2 -#define CKEY_NEQ 3 - unsigned op; /* defines logical operation */ - unsigned char red; - unsigned char green; - unsigned char blue; - unsigned char reserved; -}vidix_ckey_t; - -typedef struct vidix_video_key_s -{ -#define VKEY_FALSE 0 -#define VKEY_TRUE 1 -#define VKEY_EQ 2 -#define VKEY_NEQ 3 - unsigned op; /* defines logical operation */ - unsigned char key[8]; -}vidix_vkey_t; - -typedef struct vidix_playback_s -{ - unsigned fourcc; /* app -> driver: movies's fourcc */ - unsigned capability; /* app -> driver: what capability to use */ - unsigned blend_factor; /* app -> driver: blending factor */ - vidix_rect_t src; /* app -> driver: original movie size */ - vidix_rect_t dest; /* app -> driver: destinition movie size. driver->app dest_pitch */ -#define VID_PLAY_INTERLEAVED_UV 0x00000001 /* driver -> app: interleaved UV planes */ -#define INTERLEAVING_UV 0x00001000 /* UVUVUVUVUV used by Matrox G200 */ -#define INTERLEAVING_VU 0x00001001 /* VUVUVUVUVU */ - int flags; - /* memory model */ - unsigned frame_size; /* driver -> app: destinition frame size */ - unsigned num_frames; /* app -> driver: after call: driver -> app */ -#define VID_PLAY_MAXFRAMES 1024 /* unreal limitation */ - unsigned offsets[VID_PLAY_MAXFRAMES]; /* driver -> app */ - vidix_yuv_t offset; /* driver -> app: relative offsets within frame for yuv planes */ - void* dga_addr; /* driver -> app: linear address */ -}vidix_playback_t; - - /* Returns 0 if ok else errno */ -extern int vixConfigPlayback(vidix_playback_t *); - - /* Returns 0 if ok else errno */ -extern int vixPlaybackOn( void ); - - /* Returns 0 if ok else errno */ -extern int vixPlaybackOff( void ); - - /* Returns 0 if ok else errno */ -extern int vixPlaybackFrameSelect( unsigned frame_idx ); - -typedef struct vidix_grkey_s -{ - vidix_ckey_t ckey; /* app -> driver: color key */ - vidix_vkey_t vkey; /* app -> driver: video key */ -#define KEYS_PUT 0 -#define KEYS_AND 1 -#define KEYS_OR 2 -#define KEYS_XOR 3 - unsigned key_op; /* app -> driver: keys operations */ -}vidix_grkey_t; - - /* Returns 0 if ok else errno */ -extern int vixGetGrKeys( vidix_grkey_t * ); - - /* Returns 0 if ok else errno */ -extern int vixSetGrKeys( const vidix_grkey_t * ); - - -typedef struct vidix_video_eq_s -{ -#define VEQ_CAP_NONE 0x00000000UL -#define VEQ_CAP_BRIGHTNESS 0x00000001UL -#define VEQ_CAP_CONTRAST 0x00000002UL -#define VEQ_CAP_SATURATION 0x00000004UL -#define VEQ_CAP_HUE 0x00000008UL -#define VEQ_CAP_RGB_INTENSITY 0x00000010UL - int cap; /* on get_eq should contain capability of equalizer - on set_eq should contain using fields */ -/* end-user app can have presets like: cold-normal-hot picture and so on */ - int brightness; /* -1000 : +1000 */ - int contrast; /* -1000 : +1000 */ - int saturation; /* -1000 : +1000 */ - int hue; /* -1000 : +1000 */ - int red_intensity; /* -1000 : +1000 */ - int green_intensity;/* -1000 : +1000 */ - int blue_intensity; /* -1000 : +1000 */ -#define VEQ_FLG_ITU_R_BT_601 0x00000000 /* ITU-R BT.601 colour space (default) */ -#define VEQ_FLG_ITU_R_BT_709 0x00000001 /* ITU-R BT.709 colour space */ -#define VEQ_FLG_ITU_MASK 0x0000000f - int flags; /* currently specifies ITU YCrCb color space to use */ -}vidix_video_eq_t; - - /* Returns 0 if ok else errno */ -extern int vixPlaybackGetEq( vidix_video_eq_t * ); - - /* Returns 0 if ok else errno */ -extern int vixPlaybackSetEq( const vidix_video_eq_t * ); - -typedef struct vidix_deinterlace_s -{ -#define CFG_NON_INTERLACED 0x00000000 /* stream is not interlaced */ -#define CFG_INTERLACED 0x00000001 /* stream is interlaced */ -#define CFG_EVEN_ODD_INTERLACING 0x00000002 /* first frame contains even fields but second - odd */ -#define CFG_ODD_EVEN_INTERLACING 0x00000004 /* first frame contains odd fields but second - even */ -#define CFG_UNIQUE_INTERLACING 0x00000008 /* field deinterlace_pattern is valid */ -#define CFG_UNKNOWN_INTERLACING 0x0000000f /* unknown deinterlacing - use adaptive if it's possible */ - unsigned flags; - unsigned deinterlace_pattern; /* app -> driver: deinterlace pattern if flag CFG_UNIQUE_INTERLACING is set */ -}vidix_deinterlace_t; - - /* Returns 0 if ok else errno */ -extern int vixPlaybackGetDeint( vidix_deinterlace_t * ); - - /* Returns 0 if ok else errno */ -extern int vixPlaybackSetDeint( const vidix_deinterlace_t * ); - -typedef struct vidix_slice_s -{ - void* address; /* app -> driver */ - unsigned size; /* app -> driver */ - vidix_rect_t slice; /* app -> driver */ -}vidix_slice_t; - -typedef struct vidix_dma_s -{ - void * src; /* app -> driver. Virtual address of source */ - unsigned dest_offset; /* app -> driver. Destinition offset within of video memory */ - unsigned size; /* app -> driver. Size of transaction */ -#define BM_DMA_ASYNC 0 -#define BM_DMA_SYNC 1 /* await previous dma transfer completion */ -#define BM_DMA_FIXED_BUFFS 2 /* app -> driver: app uses buffers which are fixed in memory */ -#define BM_DMA_BLOCK 4 /* block until the transfer is complete */ - unsigned flags; /* app -> driver */ - unsigned idx; /* app -> driver: idx of src buffer */ - void * internal[VID_PLAY_MAXFRAMES]; /* for internal use by driver */ -}vidix_dma_t; - - /* Returns 0 if ok else errno */ -extern int vixPlaybackCopyFrame( vidix_dma_t * ); - - /* Returns 0 if DMA is available else errno (EBUSY) */ -extern int vixQueryDMAStatus( void ); -/* - This structure is introdused to support OEM effects like: - - sharpness - - exposure - - (auto)gain - - H(V)flip - - black level - - white balance - and many other -*/ -typedef struct vidix_oem_fx_s -{ -#define FX_TYPE_BOOLEAN 0x00000000 -#define FX_TYPE_INTEGER 0x00000001 - int type; /* type of effects */ - int num; /* app -> driver: effect number. From 0 to max number of effects */ - int minvalue; /* min value of effect. 0 - for boolean */ - int maxvalue; /* max value of effect. 1 - for boolean */ - int value; /* current value of effect on 'get'; required on set */ - char * name[80]; /* effect name to display */ -}vidix_oem_fx_t; - - /* Returns 0 if ok else errno */ -extern int vixQueryNumOemEffects( unsigned * number ); - - /* Returns 0 if ok else errno */ -extern int vixGetOemEffect( vidix_oem_fx_t * ); - - /* Returns 0 if ok else errno */ -extern int vixSetOemEffect( const vidix_oem_fx_t * ); - -#ifdef VIDIX_BUILD_STATIC -#define VIDIX_NAME(name) VIDIX_STATIC##name -#else -#define VIDIX_NAME(name) name -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/video_out/vidix/vidix.txt b/src/video_out/vidix/vidix.txt deleted file mode 100644 index e642147b4..000000000 --- a/src/video_out/vidix/vidix.txt +++ /dev/null @@ -1,247 +0,0 @@ - VIDIX - VIDeo Interface for *niX - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -This interface was designed and introduced as interface to userspace drivers -to provide DGA everywhere where it's possible (unline X11). -I hope that these drivers will be portable same as X11 (not only on *nix). - -What is it: -- It's portable successor of mga_vid technology which is located in user-space. -- Unlikely X11 it's provides DGA everywhere where it's possible. -- Unlikely v4l it provides interface for video playback -- Unlikely linux's drivers it uses mathematics library. - -Why it was developed: -As said Vladimir Dergachev -(http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/gatos/km/km.rfc.txt): -"0) Motivation - v4l, v4l2 and Xv are all suffering from the same problem: attempt to fit - existing multimedia devices into a fixed scheme." -Well - I tried to implement something similar by motivation. - -How it works: -~~~~~~~~~~~~~ - -This interface is almost finished. But I guess it can be expanded by developer's -requests. -So any suggestions, reports, criticism are gladly accepted. - -1) APP calls vixGetVersion to check age of driver ;) -2) APP calls vixProbe. Driver should return 0 if it can handle something in PC. -3) APP calls vixGetCapability. Driver should return filled - vidix_capability_t.type field at least. -4) If above calls were succesful then APP calls vixInit function - (Driver can have not exported this function in this case call will be - skiped). -5) After initializing of driver APP calls vixGetCapability again - (In this case driver must fill every field of struct) -6) APP calls vixQueryFourcc. Driver should answer - can it configure - video memory for given fourcc or not. -7) APP calls vixConfigPlayback. Driver should prepare BES on this call. - APP pass to driver following info: - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - vidix_playback_t.fourcc - contains fourcc of movie - vidix_playback_t.capability - currently contsinas copy of vidix_capability_t.flags - vidix_playback_t.blend_factor- currently unused - vidix_playback_t.src - x,y,w,h fields contain original movie size - (in pixels) x and y often are nulls. - vidix_playback_t.src.pitch.y These fields contain source pitches - vidix_playback_t.src.pitch.u - for each Y,U,V plane in bytes. - vidix_playback_t.src.pitch.v (For packed fourcc only Y value is used) - They are hints for driver to use same destinition - pitches as in source memory (to speed up - memcpy process). - Note: when source pitches are unknown or - variable these field will be filled into 0. - vidix_playback_t.dest - x,y,w,h fields contains destinition rectange - on the screen in pixels. - vidix_playback_t.num_frames - maximal # of frames which can be used by APP. - (Currently 10). - Driver should fill following fields: - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - vidix_playback_t.num_frames - real # of frames which will be used by driver. - (Should be less or equal to app's num_frames). - - vidix_playback_t.dest.pitch.y These fields should contain alignment - vidix_playback_t.dest.pitch.u - for each Y,U,V plane in bytes. - vidix_playback_t.dest.pitch.v (For packed fourcc only Y value is used) - - vidix_playback_t.frame_size - Driver should tell to app which size of - source frame (src.w and src.h) should - use APP (according to pitches and offsets) - - vidix_playback_t.offsets - offsets from begin of BES memory for each frame - - vidix_playback_t.offset.y These field should contain offset - vidix_playback_t.offset.u - for each Y,U,V plane within frame. - vidix_playback_t.offset.v (For packed fourcc only Y value is used) - - vidix_playback_t.dga_addr - Address of BES memory. - -Also see this picture: - -VIDEO MEMORY layout: - +----------- It's begin of video memory End of video memory--------------+ - | | - v v - [ RGB memory | YUV memory | UNDEF ] - ^ - | - +---- begin of BES memory - -BES MEMORY layout: - +-------- begin of BES memory - | - v - [ | | | | | - ^ ^ ^ ^ ^ - | | | | + BEGIN of second frame - | | | + BEGIN of V plane - | | + BEGIN of U plane - | +------- BEGIN of Y plane - | - +--------- BEGIN of first frame - -This means that in general case: -offset of frame != offset of BES -offset of Y plane != offset of first frame - -But often: vidix_playback_t.offsets[0] = vidix_playback_t.offset.y = 0; - -Formula: (For Y plane) copy source to: - vidix_playback_t.dga_addr + - vidix_playback_t.offsets[i] + - vidix_playback_t.offset.y - -8) APP calls vixPlaybackOn. Driver should activate BES on this call. -9) PLAYBACK. Driver should sleep here ;) - But during playback can be called: - vixFrameSelect (if this function is exported) - Driver should prepare and activate corresponded frame. - This function is used only for double and trilpe buffering and - never used for single buffering playback. - vixGet(Set)GrKeys (if this function is exported) - This interface should be tuned but intriduced for overlapped playback - and video effects (TYPE_FX) - vixPlaybackGet(Set)Eq (if this function is exported) - For color correction. -10) APP calls vixPlaybackOff. Driver should deactivate BES on this call. -11) If vixDestroy is defined APP calls this function before unloading driver - from memory. - - -What functions are mandatory: -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -vixGetVersion -vixProbe -vixGetCapability -vixQueryFourcc -vixConfigPlayback -vixPlaybackOn -vixPlaybackOff - -All other functions are optionaly. - -BUSMASTERING -************ - -Busmastering is technique to implement data transfer through DMA. -This technique is intended to free CPU for other useful work to -speedup movie playback. The speedup will be different on different -CPUs OSes and videocards. Only thing which SHOULD be implemented -it's the fact that frame should be transfered faster than 1/fps. -(I.e. faster than 33ms for 30 fps or faster than 40ms for 25 fps) -VIDIX implementation of BM (busmastering) is slightly specific. -During driver development you should keep in mind the next rules: -1. BM is implemented as parallel process which should work - simultaneously with frame decoding. -2. To have possibility to use busmastering by non-ROOT users - driver should rather call functions from libdha than from libc. - (Example: driver should call bm_lock_mem instead of mlock) -3. To speedup data transfer player will pass pointer to the DMA buffer - which will have the same structure (planes and strides) as video memory - (In this connexion driver should allocate frames in video memory - same as if BM would not be implemented). - -Interface: -~~~~~~~~~~ - -The interface of BM is implemented through 2 functions: - vixPlaybackCopyFrame - vixQueryDMAStatus - - -vixPlaybackCopyFrame - -should prepare engine to copy frame from -system memory into video framebuffer. After that driver should -send command into engine to start data transfer and return -control immediatedly. - -The structure vidix_dma_s in details: - -typedef struct vidix_dma_s -{ - /* - app -> driver. - Virtual address of source. - Note: source buffer is allocated by using malloc - or memalign(); - */ - void * src; - /* - app -> driver. - Destinition offset within of video memory. - It will point offset within of YUV memory where - destinition data should be stored. - */ - unsigned dest_offset; - /* app -> driver. Size of data to be transfered in bytes. */ - unsigned size; - /* - can accept ORed values of BM_DMA* definitions - BM_DMA_ASYNC - default value which indicates that transactiion - should work asynchronously. - BM_DMA_SYNC - may be ignored due speedup reasons - BM_DMA_FIXED_BUFFS - indicates that player was started by ROOT - and source DMA buffers were already locked in memory - through mlock(). - /* app -> driver: idx of src buffer. - if BM_DMA_FIXED_BUFFS flags is set then this field - indicates which from buffers currently is passed - into driver. This field maybe ignored by driver but - it would be better to use that for minor speedup - of engine preparing. */ - unsigned idx; - /* for internal use by driver. - Driver may use them on its opinion */ - void * internal[VID_PLAY_MAXFRAMES]; -}vidix_dma_t; - - -vixQueryDMAStatus - -should check out DMA status and return 1 if BM is busy -and 0 otherwise. Note: this function shouldn't wait any -changes in DMA state. - -A few words about of non-linux systems -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Well, there is only one problem which stops us to use BM on -nono-linux systems: it's lacking of possibility to perform -convertion from virtual to physical address in user-space. -This problem is sloved by so-called dhahelper driver for -linux. What about of other OSes then this driver requires -to be ported first. (Of course, except of DOS and DOS32 -where these convertions are unnecessary). - -Useful links: -~~~~~~~~~~~~~ -Guide to DTV http://www.digitaltelevision.com/dtvbook/toc.shtml -Fourcc http://www.webartz.com/fourcc/ -MPEG http://www.mpeg.org/MPEG/index.html -Analog colors http://www.miranda.com/en/app_notes/TN/TN-05/TN-05.htm - -Please send your suggestions, reports, feedback to mplayerxp-general@lists.sourceforge.net - -Best regards! Nick Kurshev. diff --git a/src/video_out/vidix/vidixlib.c b/src/video_out/vidix/vidixlib.c deleted file mode 100644 index 37af2035b..000000000 --- a/src/video_out/vidix/vidixlib.c +++ /dev/null @@ -1,482 +0,0 @@ -/* - * vidixlib.c - * VIDIXLib - Library for VIDeo Interface for *niX - * This interface is introduced as universal one to MPEG decoder, - * BES == Back End Scaler and YUV2RGB hw accelerators. - * In the future it may be expanded up to capturing and audio things. - * Main goal of this this interface imlpementation is providing DGA - * everywhere where it's possible (unlike X11 and other). - * Copyright 2002 Nick Kurshev - * Licence: GPL - * This interface is based on v4l2, fbvid.h, mga_vid.h projects - * and personally my ideas. - * NOTE: This interface is introduces as APP interface. - * Don't use it for driver. - * It provides multistreaming. This mean that APP can handle - * several streams simultaneously. (Example: Video capturing and video - * playback or capturing, video playback, audio encoding and so on). -*/ -#include <stdlib.h> -#include <stdio.h> -#include <errno.h> -#include <string.h> -#include <inttypes.h> - -#include <dlfcn.h> /* GLIBC specific. Exists under cygwin too! */ -#include <dirent.h> - -#include "vidixlib.h" -#include "bswap.h" - -#define t_vdl(p) (((vdl_stream_t *)p)) - -typedef struct vdl_stream_s -{ - void * handle; - int (*get_caps)(vidix_capability_t *); - int (*query_fourcc)(vidix_fourcc_t *); - int (*config_playback)(vidix_playback_t *); - int (*playback_on)( void ); - int (*playback_off)( void ); - /* Functions below can be missed in driver ;) */ - int (*init)(const char *); - void (*destroy)(void); - int (*frame_sel)( unsigned frame_idx ); - int (*get_eq)( vidix_video_eq_t * ); - int (*set_eq)( const vidix_video_eq_t * ); - int (*get_deint)( vidix_deinterlace_t * ); - int (*set_deint)( const vidix_deinterlace_t * ); - int (*copy_frame)( const vidix_dma_t * ); - int (*query_dma)( void ); - int (*get_gkey)( vidix_grkey_t * ); - int (*set_gkey)( const vidix_grkey_t * ); - int (*get_num_fx)( unsigned * ); - int (*get_fx)( vidix_oem_fx_t * ); - int (*set_fx)( const vidix_oem_fx_t * ); -}vdl_stream_t; - -static char drv_name[FILENAME_MAX]; -static int dl_idx = -1; -/* currently available driver for static linking */ -static const char* const drv_snames[] = { -#ifdef VIDIX_BUILD_STATIC - "genfb_", - "mach64_", - "mga_crtc2_", - "mga_", - "nvidia_", - "pm2_", - "pm3_", - "radeo_", - "rage128_", -#endif - NULL -}; - -extern unsigned vdlGetVersion( void ) -{ - return VIDIX_VERSION; -} - -static void* dlsymm(void* handle, const char* fce) -{ - char b[100]; -#if defined(__OpenBSD__) && !defined(__ELF__) - b[0] = '_'; - b[1] = 0; -#else - b[0] = 0; -#endif - if (dl_idx >= 0) strcat(b, drv_snames[dl_idx]); - strcat(b, fce); - //printf("Handle %p %s\n", handle, b); - return dlsym(handle, b); -} - -static int vdl_fill_driver(VDL_HANDLE stream) -{ - t_vdl(stream)->init = dlsymm(t_vdl(stream)->handle,"vixInit"); - t_vdl(stream)->destroy = dlsymm(t_vdl(stream)->handle,"vixDestroy"); - t_vdl(stream)->get_caps = dlsymm(t_vdl(stream)->handle,"vixGetCapability"); - t_vdl(stream)->query_fourcc = dlsymm(t_vdl(stream)->handle,"vixQueryFourcc"); - t_vdl(stream)->config_playback= dlsymm(t_vdl(stream)->handle,"vixConfigPlayback"); - t_vdl(stream)->playback_on = dlsymm(t_vdl(stream)->handle,"vixPlaybackOn"); - t_vdl(stream)->playback_off = dlsymm(t_vdl(stream)->handle,"vixPlaybackOff"); - t_vdl(stream)->frame_sel = dlsymm(t_vdl(stream)->handle,"vixPlaybackFrameSelect"); - t_vdl(stream)->get_eq = dlsymm(t_vdl(stream)->handle,"vixPlaybackGetEq"); - t_vdl(stream)->set_eq = dlsymm(t_vdl(stream)->handle,"vixPlaybackSetEq"); - t_vdl(stream)->get_gkey = dlsymm(t_vdl(stream)->handle,"vixGetGrKeys"); - t_vdl(stream)->set_gkey = dlsymm(t_vdl(stream)->handle,"vixSetGrKeys"); - t_vdl(stream)->get_deint = dlsymm(t_vdl(stream)->handle,"vixPlaybackGetDeint"); - t_vdl(stream)->set_deint = dlsymm(t_vdl(stream)->handle,"vixPlaybackSetDeint"); - t_vdl(stream)->copy_frame = dlsymm(t_vdl(stream)->handle,"vixPlaybackCopyFrame"); - t_vdl(stream)->query_dma = dlsymm(t_vdl(stream)->handle,"vixQueryDMAStatus"); - t_vdl(stream)->get_num_fx = dlsymm(t_vdl(stream)->handle,"vixQueryNumOemEffects"); - t_vdl(stream)->get_fx = dlsymm(t_vdl(stream)->handle,"vixGetOemEffect"); - t_vdl(stream)->set_fx = dlsymm(t_vdl(stream)->handle,"vixSetOemEffect"); - /* check driver viability */ - if(!( t_vdl(stream)->get_caps && t_vdl(stream)->query_fourcc && - t_vdl(stream)->config_playback && t_vdl(stream)->playback_on && - t_vdl(stream)->playback_off)) - { - printf("vidixlib: Incomplete driver: some of essential features are missed in it.\n"); - return 0; - } - return 1; -} - -#ifndef RTLD_GLOBAL -#define RTLD_GLOBAL RTLD_LAZY -#endif -#ifndef RTLD_NOW -#define RTLD_NOW RTLD_LAZY -#endif - -static int vdl_probe_driver(VDL_HANDLE stream,const char *path,const char *name,unsigned cap,int verbose) -{ - vidix_capability_t vid_cap; - unsigned (*_ver)(void); - int (*_probe)(int,int); - int (*_cap)(vidix_capability_t*); - strncpy(drv_name,path,sizeof(drv_name)); - drv_name[sizeof(drv_name) - 1] = '\0'; - strncat(drv_name,name,sizeof(drv_name) - strlen(drv_name) - 1); - if(verbose) printf("vidixlib: PROBING: %s\n",drv_name); - - { - const char* slash = strrchr(drv_name, '/'); - if (slash) { - for (dl_idx = 0; drv_snames[dl_idx]; dl_idx++) { - if (!strncmp(slash + 1, drv_snames[dl_idx], strlen(drv_snames[dl_idx]))) - break; // locate the name - } - if (!drv_snames[dl_idx]) dl_idx = -1; - } - } - if (dl_idx < 0) - if(!(t_vdl(stream)->handle = dlopen(drv_name,RTLD_LAZY|RTLD_GLOBAL))) { - if(verbose) printf("vidixlib: %s not driver: %s\n",drv_name,dlerror()); - return 0; - } - _ver = dlsymm(t_vdl(stream)->handle,"vixGetVersion"); - _probe = dlsymm(t_vdl(stream)->handle,"vixProbe"); - _cap = dlsymm(t_vdl(stream)->handle,"vixGetCapability"); - if(_ver) - { - if((*_ver)() != VIDIX_VERSION) - { - if(verbose) printf("vidixlib: %s has wrong version\n",drv_name); - err: - dlclose(t_vdl(stream)->handle); - t_vdl(stream)->handle = 0; - dl_idx = -1; - return 0; - } - } - else - { - fatal_err: - if(verbose) printf("vidixlib: %s has no function definition\n",drv_name); - goto err; - } - if(_probe) { if((*_probe)(verbose,PROBE_NORMAL) != 0) goto err; } - else goto fatal_err; - if(_cap) { if((*_cap)(&vid_cap) != 0) goto err; } - else goto fatal_err; - if((vid_cap.type & cap) != cap) - { - if(verbose) printf("vidixlib: Found %s but has no required capability\n",drv_name); - goto err; - } - if(verbose) printf("vidixlib: %s probed o'k\n",drv_name); - return 1; -} - -static int vdl_find_driver(VDL_HANDLE stream,const char *path,unsigned cap,int verbose) -{ - DIR *dstream; - struct dirent *name; - int done = 0; - if(!(dstream = opendir(path))) return 0; - while(!done) - { - name = readdir(dstream); - if(name) - { - if(name->d_name[0] != '.' && strstr(name->d_name, ".so")) - if(vdl_probe_driver(stream,path,name->d_name,cap,verbose)) break; - } - else done = 1; - } - closedir(dstream); - return done?0:1; -} - -VDL_HANDLE vdlOpen(const char *path,const char *name,unsigned cap,int verbose) -{ - vdl_stream_t *stream; - const char *drv_args=NULL; - int errcode; - if(!(stream = malloc(sizeof(vdl_stream_t)))) return NULL; - memset(stream,0,sizeof(vdl_stream_t)); - if(name) - { - unsigned (*ver)(void); - int (*probe)(int,int); - unsigned version = 0; - unsigned char *arg_sep; - arg_sep = strchr(name,':'); - if(arg_sep) { *arg_sep='\0'; drv_args = &arg_sep[1]; } - strncpy(drv_name,path,sizeof(drv_name)); - drv_name[sizeof(drv_name) - 1] = '\0'; - strncat(drv_name,name,sizeof(drv_name) - strlen(drv_name) - 1); - { - const char* slash = strrchr(drv_name, '/'); - if (slash) { - for (dl_idx = 0; drv_snames[dl_idx]; dl_idx++) { - if (!strncmp(slash + 1, drv_snames[dl_idx], strlen(drv_snames[dl_idx]))) - break; // locate the name - } - if (!drv_snames[dl_idx]) dl_idx = -1; - } - } - if (dl_idx < 0) - if(!(t_vdl(stream)->handle = dlopen(drv_name,RTLD_NOW|RTLD_GLOBAL))) - { - if (verbose) - printf("vidixlib: dlopen error: %s\n", dlerror()); - err: - vdlClose(stream); - return NULL; - } - ver = dlsymm(t_vdl(stream)->handle,"vixGetVersion"); - if(ver) version = (*ver)(); - if(version != VIDIX_VERSION) - goto err; - probe = dlsymm(t_vdl(stream)->handle,"vixProbe"); - if(probe) { if((*probe)(verbose,PROBE_FORCE)!=0) goto err; } - else goto err; - fill: - if(!vdl_fill_driver(stream)) goto err; - goto ok; - } - else - if(vdl_find_driver(stream,path,cap,verbose)) - { - if(verbose) printf("vidixlib: will use %s driver\n",drv_name); - goto fill; - } - else goto err; - ok: - if(t_vdl(stream)->init) - { - if(verbose) printf("vidixlib: Attempt to initialize driver at: %p\n",t_vdl(stream)->init); - if((errcode=t_vdl(stream)->init(drv_args))!=0) - { - if(verbose) printf("vidixlib: Can't init driver: %s\n",strerror(errcode)); - goto err; - } - } - if(verbose) printf("vidixlib: '%s'successfully loaded\n",drv_name); - return stream; -} - -void vdlClose(VDL_HANDLE stream) -{ - if(t_vdl(stream)->destroy) t_vdl(stream)->destroy(); - if(t_vdl(stream)->handle) dlclose(t_vdl(stream)->handle); - memset(stream,0,sizeof(vdl_stream_t)); /* <- it's not stupid */ - free(stream); - dl_idx = -1; -} - -int vdlGetCapability(VDL_HANDLE handle, vidix_capability_t *cap) -{ - return t_vdl(handle)->get_caps(cap); -} - -#define MPLAYER_IMGFMT_RGB (('R'<<24)|('G'<<16)|('B'<<8)) -#define MPLAYER_IMGFMT_BGR (('B'<<24)|('G'<<16)|('R'<<8)) -#define MPLAYER_IMGFMT_RGB_MASK 0xFFFFFF00 - -static uint32_t normalize_fourcc(uint32_t fourcc) -{ - if((fourcc & MPLAYER_IMGFMT_RGB_MASK) == (MPLAYER_IMGFMT_RGB|0) || - (fourcc & MPLAYER_IMGFMT_RGB_MASK) == (MPLAYER_IMGFMT_BGR|0)) - return bswap_32(fourcc); - else return fourcc; -} - -int vdlQueryFourcc(VDL_HANDLE handle,vidix_fourcc_t *f) -{ - f->fourcc = normalize_fourcc(f->fourcc); - return t_vdl(handle)->query_fourcc(f); -} - -int vdlConfigPlayback(VDL_HANDLE handle,vidix_playback_t *p) -{ - p->fourcc = normalize_fourcc(p->fourcc); - return t_vdl(handle)->config_playback(p); -} - -int vdlPlaybackOn(VDL_HANDLE handle) -{ - return t_vdl(handle)->playback_on(); -} - -int vdlPlaybackOff(VDL_HANDLE handle) -{ - return t_vdl(handle)->playback_off(); -} - -int vdlPlaybackFrameSelect(VDL_HANDLE handle, unsigned frame_idx ) -{ - return t_vdl(handle)->frame_sel ? t_vdl(handle)->frame_sel(frame_idx) : ENOSYS; -} - -int vdlPlaybackGetEq(VDL_HANDLE handle, vidix_video_eq_t * e) -{ - return t_vdl(handle)->get_eq ? t_vdl(handle)->get_eq(e) : ENOSYS; -} - -int vdlPlaybackSetEq(VDL_HANDLE handle, const vidix_video_eq_t * e) -{ - return t_vdl(handle)->set_eq ? t_vdl(handle)->set_eq(e) : ENOSYS; -} - -int vdlPlaybackCopyFrame(VDL_HANDLE handle, vidix_dma_t * f) -{ - return t_vdl(handle)->copy_frame ? t_vdl(handle)->copy_frame(f) : ENOSYS; -} - -int vdlQueryDMAStatus(VDL_HANDLE handle ) -{ - return t_vdl(handle)->query_dma ? t_vdl(handle)->query_dma() : ENOSYS; -} - -int vdlGetGrKeys(VDL_HANDLE handle, vidix_grkey_t * k) -{ - return t_vdl(handle)->get_gkey ? t_vdl(handle)->get_gkey(k) : ENOSYS; -} - -int vdlSetGrKeys(VDL_HANDLE handle, const vidix_grkey_t * k) -{ - return t_vdl(handle)->set_gkey ? t_vdl(handle)->set_gkey(k) : ENOSYS; -} - -int vdlPlaybackGetDeint(VDL_HANDLE handle, vidix_deinterlace_t * d) -{ - return t_vdl(handle)->get_deint ? t_vdl(handle)->get_deint(d) : ENOSYS; -} - -int vdlPlaybackSetDeint(VDL_HANDLE handle, const vidix_deinterlace_t * d) -{ - return t_vdl(handle)->set_deint ? t_vdl(handle)->set_deint(d) : ENOSYS; -} - -int vdlQueryNumOemEffects(VDL_HANDLE handle, unsigned * number ) -{ - return t_vdl(handle)->get_num_fx ? t_vdl(handle)->get_num_fx(number) : ENOSYS; -} - -int vdlGetOemEffect(VDL_HANDLE handle, vidix_oem_fx_t * f) -{ - return t_vdl(handle)->get_fx ? t_vdl(handle)->get_fx(f) : ENOSYS; -} - -int vdlSetOemEffect(VDL_HANDLE handle, const vidix_oem_fx_t * f) -{ - return t_vdl(handle)->set_fx ? t_vdl(handle)->set_fx(f) : ENOSYS; -} - -/* ABI related extensions */ -vidix_capability_t * vdlAllocCapabilityS( void ) -{ - vidix_capability_t *retval; - retval=malloc(sizeof(vidix_capability_t)); - if(retval) memset(retval,0,sizeof(vidix_capability_t)); - return retval; -} - -vidix_fourcc_t * vdlAllocFourccS( void ) -{ - vidix_fourcc_t *retval; - retval=malloc(sizeof(vidix_fourcc_t)); - if(retval) memset(retval,0,sizeof(vidix_fourcc_t)); - return retval; -} - -vidix_yuv_t * vdlAllocYUVS( void ) -{ - vidix_yuv_t *retval; - retval=malloc(sizeof(vidix_yuv_t)); - if(retval) memset(retval,0,sizeof(vidix_yuv_t)); - return retval; -} - -vidix_rect_t * vdlAllocRectS( void ) -{ - vidix_rect_t *retval; - retval=malloc(sizeof(vidix_rect_t)); - if(retval) memset(retval,0,sizeof(vidix_rect_t)); - return retval; -} - -vidix_playback_t * vdlAllocPlaybackS( void ) -{ - vidix_playback_t *retval; - retval=malloc(sizeof(vidix_playback_t)); - if(retval) memset(retval,0,sizeof(vidix_playback_t)); - return retval; -} - -vidix_grkey_t * vdlAllocGrKeyS( void ) -{ - vidix_grkey_t *retval; - retval=malloc(sizeof(vidix_grkey_t)); - if(retval) memset(retval,0,sizeof(vidix_grkey_t)); - return retval; -} - -vidix_video_eq_t * vdlAllocVideoEqS( void ) -{ - vidix_video_eq_t *retval; - retval=malloc(sizeof(vidix_video_eq_t)); - if(retval) memset(retval,0,sizeof(vidix_video_eq_t)); - return retval; -} - -vidix_deinterlace_t * vdlAllocDeinterlaceS( void ) -{ - vidix_deinterlace_t *retval; - retval=malloc(sizeof(vidix_deinterlace_t)); - if(retval) memset(retval,0,sizeof(vidix_deinterlace_t)); - return retval; -} - -vidix_dma_t * vdlAllocDmaS( void ) -{ - vidix_dma_t *retval; - retval=malloc(sizeof(vidix_dma_t)); - if(retval) memset(retval,0,sizeof(vidix_dma_t)); - return retval; -} - -vidix_oem_fx_t * vdlAllocOemFxS( void ) -{ - vidix_oem_fx_t *retval; - retval=malloc(sizeof(vidix_oem_fx_t)); - if(retval) memset(retval,0,sizeof(vidix_oem_fx_t)); - return retval; -} - -void vdlFreeCapabilityS(vidix_capability_t * _this) { free(_this); } -void vdlFreeFourccS( vidix_fourcc_t * _this ) { free(_this); } -void vdlFreePlaybackS( vidix_playback_t * _this ) { free(_this); } -void vdlFreeYUVS( vidix_yuv_t * _this) { free(_this); } -void vdlFreeRectS( vidix_rect_t * _this) { free(_this); } -void vdlFreeGrKeyS( vidix_grkey_t * _this) { free(_this); } -void vdlFreeVideoEqS( vidix_video_eq_t * _this) { free(_this); } -void vdlFreeDeinterlaceS( vidix_deinterlace_t * _this) { free(_this); } -void vdlFreeDmaS( vidix_dma_t * _this) { free(_this); } -void vdlFreeOemFxS( vidix_oem_fx_t * _this) { free(_this); } diff --git a/src/video_out/vidix/vidixlib.h b/src/video_out/vidix/vidixlib.h deleted file mode 100644 index ebc3dd309..000000000 --- a/src/video_out/vidix/vidixlib.h +++ /dev/null @@ -1,128 +0,0 @@ -/* - * vidixlib.h - * VIDIXLib - Library for VIDeo Interface for *niX - * This interface is introduced as universal one to MPEG decoder, - * BES == Back End Scaler and YUV2RGB hw accelerators. - * In the future it may be expanded up to capturing and audio things. - * Main goal of this this interface imlpementation is providing DGA - * everywhere where it's possible (unlike X11 and other). - * Copyright 2002 Nick Kurshev - * Licence: GPL - * This interface is based on v4l2, fbvid.h, mga_vid.h projects - * and personally my ideas. - * NOTE: This interface is introduces as APP interface. - * Don't use it for driver. - * It provides multistreaming. This mean that APP can handle - * several streams simultaneously. (Example: Video capturing and video - * playback or capturing, video playback, audio encoding and so on). -*/ -#ifndef VIDIXLIB_H -#define VIDIXLIB_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "vidix.h" - -typedef void * VDL_HANDLE; - - /* returns library version */ -extern unsigned vdlGetVersion( void ); - - /* Opens corresponded video driver and returns handle - of associated stream. - path - specifies path where drivers are located. - name - specifies prefered driver name (can be NULL). - cap - specifies driver capability (TYPE_* constants). - verbose - specifies verbose level - returns !0 if ok else NULL. - */ -extern VDL_HANDLE vdlOpen(const char *path,const char *name,unsigned cap,int verbose); - /* Closes stream and corresponded driver. */ -extern void vdlClose(VDL_HANDLE stream); - - /* Queries driver capabilities. Return 0 if ok else errno */ -extern int vdlGetCapability(VDL_HANDLE, vidix_capability_t *); - - /* Queries support for given fourcc. Returns 0 if ok else errno */ -extern int vdlQueryFourcc(VDL_HANDLE,vidix_fourcc_t *); - - /* Returns 0 if ok else errno */ -extern int vdlConfigPlayback(VDL_HANDLE, vidix_playback_t *); - - /* Returns 0 if ok else errno */ -extern int vdlPlaybackOn(VDL_HANDLE); - - /* Returns 0 if ok else errno */ -extern int vdlPlaybackOff(VDL_HANDLE); - - /* Returns 0 if ok else errno */ -extern int vdlPlaybackFrameSelect(VDL_HANDLE, unsigned frame_idx ); - - /* Returns 0 if ok else errno */ -extern int vdlGetGrKeys(VDL_HANDLE, vidix_grkey_t * ); - - /* Returns 0 if ok else errno */ -extern int vdlSetGrKeys(VDL_HANDLE, const vidix_grkey_t * ); - - /* Returns 0 if ok else errno */ -extern int vdlPlaybackGetEq(VDL_HANDLE, vidix_video_eq_t * ); - - /* Returns 0 if ok else errno */ -extern int vdlPlaybackSetEq(VDL_HANDLE, const vidix_video_eq_t * ); - - /* Returns 0 if ok else errno */ -extern int vdlPlaybackGetDeint(VDL_HANDLE, vidix_deinterlace_t * ); - - /* Returns 0 if ok else errno */ -extern int vdlPlaybackSetDeint(VDL_HANDLE, const vidix_deinterlace_t * ); - - /* Returns 0 if ok else errno */ -extern int vdlQueryNumOemEffects(VDL_HANDLE, unsigned * number ); - - /* Returns 0 if ok else errno */ -extern int vdlGetOemEffect(VDL_HANDLE, vidix_oem_fx_t * ); - - /* Returns 0 if ok else errno */ -extern int vdlSetOemEffect(VDL_HANDLE, const vidix_oem_fx_t * ); - - - /* Returns 0 if ok else errno */ -extern int vdlPlaybackCopyFrame(VDL_HANDLE, vidix_dma_t * ); - - /* Returns 0 if DMA is available else errno (EBUSY) */ -extern int vdlQueryDMAStatus( VDL_HANDLE ); - -/* - ABI related extensions. - Note: you should use this functions if you are using shared version - of vidix. -*/ -extern vidix_capability_t * vdlAllocCapabilityS( void ); -extern vidix_fourcc_t * vdlAllocFourccS( void ); -extern vidix_playback_t * vdlAllocPlaybackS( void ); -extern vidix_yuv_t * vdlAllocYUVS( void ); -extern vidix_rect_t * vdlAllocRectS( void ); -extern vidix_grkey_t * vdlAllocGrKeyS( void ); -extern vidix_video_eq_t * vdlAllocVideoEqS( void ); -extern vidix_deinterlace_t * vdlAllocDeinterlaceS( void ); -extern vidix_dma_t * vdlAllocDmaS( void ); -extern vidix_oem_fx_t * vdlAllocOemFxS( void ); - -extern void vdlFreeCapabilityS(vidix_capability_t * ); -extern void vdlFreeFourccS( vidix_fourcc_t * ); -extern void vdlFreePlaybackS( vidix_playback_t * ); -extern void vdlFreeYUVS( vidix_yuv_t * ); -extern void vdlFreeRectS( vidix_rect_t * ); -extern void vdlFreeGrKeyS( vidix_grkey_t * ); -extern void vdlFreeVideoEqS( vidix_video_eq_t * ); -extern void vdlFreeDeinterlaceS( vidix_deinterlace_t * ); -extern void vdlFreeDmaS( vidix_dma_t * ); -extern void vdlFreeOemFxS( vidix_oem_fx_t * ); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/video_out/xxmc.h b/src/video_out/xxmc.h index d5c067d36..dd836d08b 100644 --- a/src/video_out/xxmc.h +++ b/src/video_out/xxmc.h @@ -87,7 +87,6 @@ #include "xine.h" #include "video_out.h" #include "xine_internal.h" -#include "deinterlace.h" #include "xineutils.h" #include "vo_scale.h" #include "x11osd.h" |