From 5d6b51256bd21d5a656126e39e9288bc58613b4d Mon Sep 17 00:00:00 2001 From: Cristian Tuns Date: Tue, 1 Aug 2023 09:37:39 -0400 Subject: [PATCH] Backed out 57 changesets (bug 1839389, bug 1840869, bug 1840399, bug 1840402, bug 1823953, bug 1828912, bug 1826382, bug 1837160, bug 1839391, bug 1833654) for causing build bustages in ogg_ CLOSED TREE Backed out changeset 61356e1447e3 (bug 1823953) Backed out changeset 85785505b6d6 (bug 1823953) Backed out changeset 46a61cbfe8a8 (bug 1833654) Backed out changeset 83e3de80337b (bug 1833654) Backed out changeset 1a10c12874ac (bug 1840399) Backed out changeset 6b087145b67f (bug 1833654) Backed out changeset b9ac857ad43f (bug 1840399) Backed out changeset 4b841e8dd033 (bug 1823953) Backed out changeset 650e35803834 (bug 1823953) Backed out changeset c11b58ac0709 (bug 1823953) Backed out changeset c0249c90bc31 (bug 1823953) Backed out changeset 8929288d5aec (bug 1823953) Backed out changeset 828792b886bd (bug 1823953) Backed out changeset 873f1d4a8875 (bug 1840869) Backed out changeset a25abd05302c (bug 1823953) Backed out changeset d4b1eb442c36 (bug 1840399) Backed out changeset c25509d72a96 (bug 1840399) Backed out changeset 0f72a0626a28 (bug 1840402) Backed out changeset 82e7574364ce (bug 1840399) Backed out changeset 93073105f063 (bug 1840399) Backed out changeset 56ec8e3405e9 (bug 1840399) Backed out changeset ff15dad37ab8 (bug 1840399) Backed out changeset 0655ebd61eda (bug 1840399) Backed out changeset 7bca1ae06c7d (bug 1828912) Backed out changeset 8a5a849cfe5f (bug 1828912) Backed out changeset 3d8422a2038a (bug 1828912) Backed out changeset f08ee5de9370 (bug 1823953) Backed out changeset a4eb210620ff (bug 1823953) Backed out changeset aa8914cd55be (bug 1839391) Backed out changeset 3ea1f43e4024 (bug 1823953) Backed out changeset 3efe02ffa1c8 (bug 1826382) Backed out changeset 81c4553ec23d (bug 1839391) Backed out changeset 130894e4a781 (bug 1839391) Backed out changeset 9a0247b0fc85 (bug 1839391) Backed out changeset 11a923064382 (bug 1839391) Backed out changeset 98ffb66160c3 (bug 1837160) Backed out changeset a80dda9a220a (bug 1837160) Backed out changeset 251b4ef97a2b (bug 1837160) Backed out changeset 7372632eb32f (bug 1837160) Backed out changeset c5d54bc3ee26 (bug 1839389) Backed out changeset b232ec1bbc2d (bug 1833654) Backed out changeset fc7ba125c2fe (bug 1833654) Backed out changeset 8a47f6882e61 (bug 1823953) Backed out changeset e29810541b53 (bug 1828912) Backed out changeset bcf10730c8c9 (bug 1828912) Backed out changeset 8df8290b6c33 (bug 1826382) Backed out changeset 2811d12803cf (bug 1826382) Backed out changeset 3fc718561ec9 (bug 1826382) Backed out changeset 7827183776e1 (bug 1823953) Backed out changeset a3eb5f228d9a (bug 1826382) Backed out changeset 3113ad2e0987 (bug 1823953) Backed out changeset 4b1dc01525af (bug 1823953) Backed out changeset f7f4a7585ceb (bug 1823953) Backed out changeset 93042f1becec (bug 1823953) Backed out changeset b9ca30a0a066 (bug 1823953) Backed out changeset 1000c4a6a92a (bug 1823953) Backed out changeset 05dc13775fd6 (bug 1823953) --- .prettierignore | 1 + CLOBBER | 3 +- browser/installer/package-manifest.in | 2 - config/external/gkcodecs/gkcodecs.symbols | 63 - config/external/gkcodecs/moz.build | 16 - config/external/moz.build | 4 +- config/system-headers.mozbuild | 5 - dom/media/AudioConfig.h | 6 + dom/media/AudioSampleFormat.h | 25 +- dom/media/GraphDriver.cpp | 8 +- dom/media/MediaData.h | 72 +- dom/media/MediaFormatReader.cpp | 82 +- dom/media/MediaFormatReader.h | 45 +- dom/media/MediaInfo.h | 19 +- dom/media/VideoUtils.cpp | 17 +- dom/media/VideoUtils.h | 6 +- dom/media/VorbisUtils.h | 27 + dom/media/encoder/OpusTrackEncoder.cpp | 13 + dom/media/ipc/MediaIPCUtils.h | 4 +- dom/media/ipc/RemoteMediaData.cpp | 6 +- dom/media/ipc/RemoteMediaData.h | 1 + dom/media/mediasource/SourceBuffer.cpp | 2 +- dom/media/mediasource/TrackBuffersManager.cpp | 62 +- dom/media/mediasource/TrackBuffersManager.h | 29 +- dom/media/moz.build | 1 + dom/media/mp3/MP3Demuxer.cpp | 7 + dom/media/mp4/DecoderData.cpp | 7 +- dom/media/mp4/MoofParser.cpp | 7 +- dom/media/mp4/MoofParser.h | 2 +- dom/media/ogg/OggCodecState.cpp | 229 +- dom/media/ogg/OggCodecState.h | 110 +- dom/media/ogg/OggDemuxer.cpp | 282 +-- dom/media/ogg/OggDemuxer.h | 62 +- dom/media/ogg/OpusParser.cpp | 10 +- dom/media/ogg/OpusParser.h | 2 +- dom/media/platforms/agnostic/OpusDecoder.cpp | 32 +- .../platforms/agnostic/TheoraDecoder.cpp | 1 - dom/media/platforms/agnostic/TheoraDecoder.h | 3 +- .../platforms/agnostic/VorbisDecoder.cpp | 7 +- dom/media/platforms/agnostic/VorbisDecoder.h | 6 +- .../platforms/android/RemoteDataDecoder.cpp | 53 +- dom/media/platforms/apple/AppleATDecoder.cpp | 7 + .../platforms/ffmpeg/FFmpegAudioDecoder.cpp | 515 ++-- .../platforms/ffmpeg/FFmpegAudioDecoder.h | 30 +- .../platforms/ffmpeg/FFmpegDataDecoder.cpp | 9 +- .../platforms/ffmpeg/FFmpegDataDecoder.h | 2 +- .../platforms/ffmpeg/FFmpegDecoderModule.h | 7 +- .../platforms/ffmpeg/FFmpegLibWrapper.cpp | 32 +- dom/media/platforms/ffmpeg/FFmpegLibWrapper.h | 12 +- dom/media/platforms/ffmpeg/FFmpegLibs.h | 4 - .../platforms/ffmpeg/FFmpegVideoDecoder.cpp | 2 +- dom/media/platforms/wrappers/AudioTrimmer.cpp | 59 +- dom/media/platforms/wrappers/AudioTrimmer.h | 5 +- dom/media/test/bug603918.webm | Bin 0 -> 103227 bytes dom/media/test/bug603918.webm^headers^ | 1 + dom/media/test/manifest.js | 10 +- dom/media/test/mochitest.ini | 2 + dom/media/test/mochitest_background_video.ini | 2 + dom/media/test/mochitest_bugs.ini | 2 + dom/media/test/mochitest_compat.ini | 2 + dom/media/test/mochitest_eme.ini | 2 + dom/media/test/mochitest_media_recorder.ini | 2 + dom/media/test/mochitest_seek.ini | 2 + dom/media/test/mochitest_stream.ini | 2 + dom/media/wave/WaveDemuxer.cpp | 183 +- dom/media/wave/WaveDemuxer.h | 61 +- dom/media/webaudio/WebAudioUtils.cpp | 25 + dom/media/webaudio/blink/HRTFElevation.cpp | 33 +- dom/media/webaudio/test/audio-expected.wav | Bin 190764 -> 190764 bytes .../webaudio/test/test_mediaDecoding.html | 601 +++-- dom/media/webaudio/test/ting-44.1k-1ch.wav | Bin 61228 -> 61228 bytes dom/media/webaudio/test/ting-44.1k-2ch.wav | Bin 122412 -> 122412 bytes dom/media/webaudio/test/ting-48k-1ch.wav | Bin 66638 -> 66638 bytes dom/media/webaudio/test/ting-48k-2ch.wav | Bin 133232 -> 133232 bytes dom/media/webm/WebMDemuxer.cpp | 49 +- dom/media/webm/WebMDemuxer.h | 5 - dom/webidl/MediaDebugInfo.webidl | 2 +- .../browser/browser_utility_audio_shutdown.js | 4 +- ipc/glue/test/browser/head.js | 8 +- media/ffvpx/README_MOZILLA | 16 +- media/ffvpx/config_components_audio_only.h | 18 +- media/ffvpx/config_components_audio_video.h | 87 +- media/ffvpx/ffvpxcommon.mozbuild | 2 - media/ffvpx/libavcodec/aarch64/neon.S | 11 - media/ffvpx/libavcodec/allcodecs.c | 2 +- media/ffvpx/libavcodec/av1dec.c | 185 -- media/ffvpx/libavcodec/av1dec.h | 8 - media/ffvpx/libavcodec/avcodec.h | 59 +- media/ffvpx/libavcodec/codec_desc.c | 2 - media/ffvpx/libavcodec/codec_list.c | 27 - media/ffvpx/libavcodec/decode.c | 25 +- media/ffvpx/libavcodec/libdav1d.c | 61 +- media/ffvpx/libavcodec/libopus.c | 47 - media/ffvpx/libavcodec/libopus.h | 27 - media/ffvpx/libavcodec/libopusdec.c | 252 -- media/ffvpx/libavcodec/libvorbisdec.c | 224 -- media/ffvpx/libavcodec/moz.build | 10 - media/ffvpx/libavcodec/options_table.h | 2 - media/ffvpx/libavcodec/pcm.c | 630 ----- media/ffvpx/libavcodec/pcm_tablegen.h | 143 -- media/ffvpx/libavcodec/profiles.c | 24 +- media/ffvpx/libavcodec/profiles.h | 2 - media/ffvpx/libavcodec/pthread_frame.c | 10 +- media/ffvpx/libavcodec/version.h | 4 +- media/ffvpx/libavcodec/version_major.h | 1 - media/ffvpx/libavcodec/vorbis_data.c | 2201 ----------------- media/ffvpx/libavcodec/vorbis_data.h | 34 - media/ffvpx/libavutil/avutil.symbols | 10 +- media/ffvpx/libavutil/frame.c | 8 - media/ffvpx/libavutil/frame.h | 40 +- media/ffvpx/libavutil/hdr_dynamic_metadata.c | 385 --- media/ffvpx/libavutil/hdr_dynamic_metadata.h | 368 --- media/ffvpx/libavutil/hwcontext_vaapi.c | 2 + media/ffvpx/libavutil/moz.build | 1 - media/ffvpx/libavutil/version.h | 4 +- media/libogg/moz.build | 3 +- media/libopus/moz.build | 8 +- media/libspeex_resampler/src/moz.build | 8 +- media/libtheora/moz.build | 3 +- media/libtremor/COPYING | 28 + media/libtremor/README | 46 + media/libtremor/README_MOZILLA | 7 + media/libtremor/bug1117571-r19420.patch | 18 + media/libtremor/bug719612.patch | 21 + media/libtremor/include/tremor/ivorbiscodec.h | 204 ++ media/libtremor/include/tremor/moz.build | 10 + media/libtremor/lib/asm_arm.h | 245 ++ media/libtremor/lib/backends.h | 131 + media/libtremor/lib/block.h | 24 + media/libtremor/lib/codebook.h | 101 + media/libtremor/lib/codec_internal.h | 92 + media/libtremor/lib/lsp_lookup.h | 136 + media/libtremor/lib/mdct.h | 52 + media/libtremor/lib/mdct_lookup.h | 540 ++++ media/libtremor/lib/misc.h | 250 ++ media/libtremor/lib/moz.build | 35 + media/libtremor/lib/os.h | 64 + media/libtremor/lib/registry.h | 40 + media/libtremor/lib/tremor_block.c | 497 ++++ media/libtremor/lib/tremor_codebook.c | 391 +++ media/libtremor/lib/tremor_floor0.c | 438 ++++ media/libtremor/lib/tremor_floor1.c | 461 ++++ media/libtremor/lib/tremor_info.c | 390 +++ media/libtremor/lib/tremor_mapping0.c | 328 +++ media/libtremor/lib/tremor_mdct.c | 510 ++++ media/libtremor/lib/tremor_registry.c | 50 + media/libtremor/lib/tremor_res012.c | 374 +++ media/libtremor/lib/tremor_sharedbook.c | 447 ++++ media/libtremor/lib/tremor_synthesis.c | 131 + media/libtremor/lib/tremor_window.c | 83 + media/libtremor/lib/window.h | 27 + media/libtremor/lib/window_lookup.h | 2084 ++++++++++++++++ media/libtremor/moz.build | 11 + media/libtremor/update.sh | 34 + media/libvorbis/moz.build | 8 +- mobile/android/installer/package-manifest.in | 1 - modules/libpref/init/StaticPrefList.yaml | 27 - mozglue/build/TsanOptions.cpp | 1 - .../third_party/opus/src/include/opus.h | 2 +- .../opus/src/include/opus_multistream.h | 2 +- toolkit/content/license.html | 1 + toolkit/library/moz.build | 1 - toolkit/moz.configure | 27 +- tools/rewriting/ThirdPartyPaths.txt | 1 + .../android/bindings/MediaCodec-classes.txt | 2 - 165 files changed, 9843 insertions(+), 6505 deletions(-) delete mode 100644 config/external/gkcodecs/gkcodecs.symbols delete mode 100644 config/external/gkcodecs/moz.build create mode 100644 dom/media/VorbisUtils.h create mode 100644 dom/media/test/bug603918.webm create mode 100644 dom/media/test/bug603918.webm^headers^ delete mode 100644 media/ffvpx/libavcodec/libopus.c delete mode 100644 media/ffvpx/libavcodec/libopus.h delete mode 100644 media/ffvpx/libavcodec/libopusdec.c delete mode 100644 media/ffvpx/libavcodec/libvorbisdec.c delete mode 100644 media/ffvpx/libavcodec/pcm.c delete mode 100644 media/ffvpx/libavcodec/pcm_tablegen.h delete mode 100644 media/ffvpx/libavcodec/vorbis_data.c delete mode 100644 media/ffvpx/libavcodec/vorbis_data.h delete mode 100644 media/ffvpx/libavutil/hdr_dynamic_metadata.c delete mode 100644 media/ffvpx/libavutil/hdr_dynamic_metadata.h create mode 100644 media/libtremor/COPYING create mode 100644 media/libtremor/README create mode 100644 media/libtremor/README_MOZILLA create mode 100644 media/libtremor/bug1117571-r19420.patch create mode 100644 media/libtremor/bug719612.patch create mode 100644 media/libtremor/include/tremor/ivorbiscodec.h create mode 100644 media/libtremor/include/tremor/moz.build create mode 100644 media/libtremor/lib/asm_arm.h create mode 100644 media/libtremor/lib/backends.h create mode 100644 media/libtremor/lib/block.h create mode 100644 media/libtremor/lib/codebook.h create mode 100644 media/libtremor/lib/codec_internal.h create mode 100644 media/libtremor/lib/lsp_lookup.h create mode 100644 media/libtremor/lib/mdct.h create mode 100644 media/libtremor/lib/mdct_lookup.h create mode 100644 media/libtremor/lib/misc.h create mode 100644 media/libtremor/lib/moz.build create mode 100644 media/libtremor/lib/os.h create mode 100644 media/libtremor/lib/registry.h create mode 100644 media/libtremor/lib/tremor_block.c create mode 100644 media/libtremor/lib/tremor_codebook.c create mode 100644 media/libtremor/lib/tremor_floor0.c create mode 100644 media/libtremor/lib/tremor_floor1.c create mode 100644 media/libtremor/lib/tremor_info.c create mode 100644 media/libtremor/lib/tremor_mapping0.c create mode 100644 media/libtremor/lib/tremor_mdct.c create mode 100644 media/libtremor/lib/tremor_registry.c create mode 100644 media/libtremor/lib/tremor_res012.c create mode 100644 media/libtremor/lib/tremor_sharedbook.c create mode 100644 media/libtremor/lib/tremor_synthesis.c create mode 100644 media/libtremor/lib/tremor_window.c create mode 100644 media/libtremor/lib/window.h create mode 100644 media/libtremor/lib/window_lookup.h create mode 100644 media/libtremor/moz.build create mode 100755 media/libtremor/update.sh diff --git a/.prettierignore b/.prettierignore index e1bdfd2ee437..ae03dc691ebd 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1368,6 +1368,7 @@ media/libpng/ media/libsoundtouch/ media/libspeex_resampler/ media/libtheora/ +media/libtremor/ media/libvorbis/ media/libvpx/ media/libwebp/ diff --git a/CLOBBER b/CLOBBER index cbef5801de7b..361877374292 100644 --- a/CLOBBER +++ b/CLOBBER @@ -22,4 +22,5 @@ # changes to stick? As of bug 928195, this shouldn't be necessary! Please # don't change CLOBBER for WebIDL changes any more. -Modified system_headers to use in bug 1823953. + +Merge day clobber 2023-07-31 \ No newline at end of file diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in index 511f77a85ab9..04b247c165ee 100644 --- a/browser/installer/package-manifest.in +++ b/browser/installer/package-manifest.in @@ -151,7 +151,6 @@ @BINPATH@/@DLL_PREFIX@mozsqlite3@DLL_SUFFIX@ #endif @BINPATH@/@DLL_PREFIX@lgpllibs@DLL_SUFFIX@ -@BINPATH@/@DLL_PREFIX@gkcodecs@DLL_SUFFIX@ #ifdef MOZ_FFVPX @BINPATH@/@DLL_PREFIX@mozavutil@DLL_SUFFIX@ @BINPATH@/@DLL_PREFIX@mozavcodec@DLL_SUFFIX@ @@ -457,7 +456,6 @@ i686/xul.dll i686/nss3.dll i686/mozglue.dll i686/lgpllibs.dll -i686/gkcodecs.dll i686/msvcp140.dll i686/vcruntime140.dll i686/vcruntime140_1.dll diff --git a/config/external/gkcodecs/gkcodecs.symbols b/config/external/gkcodecs/gkcodecs.symbols deleted file mode 100644 index 324183313443..000000000000 --- a/config/external/gkcodecs/gkcodecs.symbols +++ /dev/null @@ -1,63 +0,0 @@ -ogg_calloc_func -ogg_free_func -ogg_malloc_func -ogg_realloc_func -ogg_set_mem_functions -ogg_stream_clear -ogg_stream_eos -ogg_stream_flush -ogg_stream_init -ogg_stream_packetin -ogg_stream_pageout -opus_decode -opus_decoder_create -opus_decoder_ctl -opus_decoder_destroy -opus_encode -opus_encode_float -opus_encoder_create -opus_encoder_ctl -opus_encoder_destroy -opus_get_version_string -opus_multistream_decode -opus_multistream_decode_float -opus_multistream_decoder_create -opus_multistream_decoder_ctl -opus_multistream_decoder_destroy -opus_multistream_encode -opus_multistream_encoder_create -opus_multistream_encoder_ctl -opus_multistream_encoder_destroy -opus_packet_get_nb_channels -opus_packet_get_nb_frames -opus_packet_get_samples_per_frame -opus_packet_parse -opus_strerror -vorbis_block_clear -vorbis_block_init -vorbis_comment_clear -vorbis_comment_init -vorbis_dsp_clear -vorbis_info_clear -vorbis_info_init -vorbis_packet_blocksize -vorbis_synthesis -vorbis_synthesis_blockin -vorbis_synthesis_headerin -vorbis_synthesis_init -vorbis_synthesis_pcmout -vorbis_synthesis_read -vorbis_synthesis_restart -th_info_init -th_setup_free -th_decode_free -th_comment_clear -th_decode_headerin -th_packet_isheader -th_granule_frame -th_decode_packetin -th_decode_ycbcr_out -th_comment_init -th_packet_iskeyframe -th_info_clear -th_decode_alloc diff --git a/config/external/gkcodecs/moz.build b/config/external/gkcodecs/moz.build deleted file mode 100644 index 58e189d51c29..000000000000 --- a/config/external/gkcodecs/moz.build +++ /dev/null @@ -1,16 +0,0 @@ -# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- -# vim: set filetype=python: -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -# The gkcodecs library contains code from third-party libraries implementing -# encoding an decoding for particular audio codecs. -# -# They are compiled in a separate shared library to be able to be available -# both from libxul (when decoding using the codec integration layer Gecko -# provides) and from ffmpeg (when decoding trough ffmpeg). - -GeckoSharedLibrary("gkcodecs", linkage=None) -SHARED_LIBRARY_NAME = "gkcodecs" -SYMBOLS_FILE = "gkcodecs.symbols" diff --git a/config/external/moz.build b/config/external/moz.build index e1e089325f06..a0877c9d717e 100644 --- a/config/external/moz.build +++ b/config/external/moz.build @@ -7,7 +7,6 @@ external_dirs = [] DIRS += [ - "gkcodecs", "lgpllibs", "rlbox", "sqlite", @@ -39,6 +38,9 @@ external_dirs += ["modules/xz-embedded"] if CONFIG["MOZ_VORBIS"]: external_dirs += ["media/libvorbis"] +if CONFIG["MOZ_TREMOR"]: + external_dirs += ["media/libtremor"] + if not CONFIG["MOZ_SYSTEM_LIBVPX"]: external_dirs += ["media/libvpx"] diff --git a/config/system-headers.mozbuild b/config/system-headers.mozbuild index dc7f580453a7..d9489c8f15e4 100644 --- a/config/system-headers.mozbuild +++ b/config/system-headers.mozbuild @@ -1012,11 +1012,6 @@ system_headers = [ 'wx/xrc/xmlres.h', 'xlocale.h', 'zmouse.h', - 'vorbis/codec.h', - 'opus/opus.h', - 'opus/opus_multistream.h', - 'ogg/ogg.h', - 'theora/theoradec.h' ] if CONFIG['MOZ_X11']: diff --git a/dom/media/AudioConfig.h b/dom/media/AudioConfig.h index c9abf69ee9c6..d0433b108393 100644 --- a/dom/media/AudioConfig.h +++ b/dom/media/AudioConfig.h @@ -210,7 +210,13 @@ class AudioConfig { FORMAT_S24, FORMAT_S32, FORMAT_FLT, +# if defined(MOZ_SAMPLE_TYPE_FLOAT32) FORMAT_DEFAULT = FORMAT_FLT +# elif defined(MOZ_SAMPLE_TYPE_S16) + FORMAT_DEFAULT = FORMAT_S16 +# else +# error "Not supported audio type" +# endif }; AudioConfig(const ChannelLayout& aChannelLayout, uint32_t aRate, diff --git a/dom/media/AudioSampleFormat.h b/dom/media/AudioSampleFormat.h index 33e4e85a058a..f53021262bdb 100644 --- a/dom/media/AudioSampleFormat.h +++ b/dom/media/AudioSampleFormat.h @@ -25,8 +25,12 @@ enum AudioSampleFormat { AUDIO_FORMAT_S16, // Signed 32-bit float samples AUDIO_FORMAT_FLOAT32, - // The format used for output by AudioStream. +// The format used for output by AudioStream. +#ifdef MOZ_SAMPLE_TYPE_S16 + AUDIO_OUTPUT_FORMAT = AUDIO_FORMAT_S16 +#else AUDIO_OUTPUT_FORMAT = AUDIO_FORMAT_FLOAT32 +#endif }; enum { MAX_AUDIO_SAMPLE_SIZE = sizeof(float) }; @@ -37,15 +41,15 @@ class AudioSampleTraits; template <> class AudioSampleTraits { public: - using Type = float; + typedef float Type; }; template <> class AudioSampleTraits { public: - using Type = int16_t; + typedef int16_t Type; }; -using AudioDataValue = AudioSampleTraits::Type; +typedef AudioSampleTraits::Type AudioDataValue; template class AudioSampleTypeToFormat; @@ -70,11 +74,9 @@ class AudioSampleTypeToFormat { * http://blog.bjornroche.com/2009/12/linearity-and-dynamic-range-in-int.html */ inline float AudioSampleToFloat(float aValue) { return aValue; } -inline float AudioSampleToFloat(int16_t aValue) { - return static_cast(aValue) / 32768.0f; -} +inline float AudioSampleToFloat(int16_t aValue) { return aValue / 32768.0f; } inline float AudioSampleToFloat(int32_t aValue) { - return static_cast(aValue) / (float)(1U << 31); + return aValue / (float)(1U << 31); } template @@ -96,8 +98,7 @@ T UInt8bitToAudioSample(uint8_t aValue); template <> inline float UInt8bitToAudioSample(uint8_t aValue) { - return static_cast(aValue) * (static_cast(2) / UINT8_MAX) - - static_cast(1); + return aValue * (static_cast(2) / UINT8_MAX) - static_cast(1); } template <> inline int16_t UInt8bitToAudioSample(uint8_t aValue) { @@ -109,7 +110,7 @@ T IntegerToAudioSample(int16_t aValue); template <> inline float IntegerToAudioSample(int16_t aValue) { - return static_cast(aValue) / 32768.0f; + return aValue / 32768.0f; } template <> inline int16_t IntegerToAudioSample(int16_t aValue) { @@ -121,7 +122,7 @@ T Int24bitToAudioSample(int32_t aValue); template <> inline float Int24bitToAudioSample(int32_t aValue) { - return static_cast(aValue) / static_cast(1 << 23); + return aValue / static_cast(1 << 23); } template <> inline int16_t Int24bitToAudioSample(int32_t aValue) { diff --git a/dom/media/GraphDriver.cpp b/dom/media/GraphDriver.cpp index 702f4dc98649..30e298eb1d6e 100644 --- a/dom/media/GraphDriver.cpp +++ b/dom/media/GraphDriver.cpp @@ -7,7 +7,6 @@ #include "GraphDriver.h" #include "AudioNodeEngine.h" -#include "cubeb/cubeb.h" #include "mozilla/dom/AudioContext.h" #include "mozilla/dom/AudioDeviceInfo.h" #include "mozilla/dom/BaseAudioContextBinding.h" @@ -592,7 +591,14 @@ void AudioCallbackDriver::Init() { "This is blocking and should never run on the main thread."); output.rate = mSampleRate; + +#ifdef MOZ_SAMPLE_TYPE_S16 + MOZ_ASSERT(AUDIO_OUTPUT_FORMAT == AUDIO_FORMAT_S16); + output.format = CUBEB_SAMPLE_S16NE; +#else + MOZ_ASSERT(AUDIO_OUTPUT_FORMAT == AUDIO_FORMAT_FLOAT32); output.format = CUBEB_SAMPLE_FLOAT32NE; +#endif if (!mOutputChannelCount) { LOG(LogLevel::Warning, ("Output number of channels is 0.")); diff --git a/dom/media/MediaData.h b/dom/media/MediaData.h index c6addcd7333a..0ecfaa790429 100644 --- a/dom/media/MediaData.h +++ b/dom/media/MediaData.h @@ -59,11 +59,10 @@ class TrackInfoSharedPtr; // becomes: // AlignedFloatBuffer buffer(samples); // if (!buffer) { return NS_ERROR_OUT_OF_MEMORY; } -class InflatableShortBuffer; + template class AlignedBuffer { public: - friend InflatableShortBuffer; AlignedBuffer() : mData(nullptr), mLength(0), mBuffer(nullptr), mCapacity(0) {} @@ -84,7 +83,7 @@ class AlignedBuffer { AlignedBuffer(const AlignedBuffer& aOther) : AlignedBuffer(aOther.Data(), aOther.Length()) {} - AlignedBuffer(AlignedBuffer&& aOther) noexcept + AlignedBuffer(AlignedBuffer&& aOther) : mData(aOther.mData), mLength(aOther.mLength), mBuffer(std::move(aOther.mBuffer)), @@ -94,7 +93,7 @@ class AlignedBuffer { aOther.mCapacity = 0; } - AlignedBuffer& operator=(AlignedBuffer&& aOther) noexcept { + AlignedBuffer& operator=(AlignedBuffer&& aOther) { this->~AlignedBuffer(); new (this) AlignedBuffer(std::move(aOther)); return *this; @@ -247,41 +246,10 @@ class AlignedBuffer { size_t mCapacity{}; // in bytes }; -using AlignedByteBuffer = AlignedBuffer; -using AlignedFloatBuffer = AlignedBuffer; -using AlignedShortBuffer = AlignedBuffer; -using AlignedAudioBuffer = AlignedBuffer; - -// A buffer in which int16_t audio can be written to, and then converted to -// float32 audio without reallocating. -// This class is useful when an API hands out int16_t audio but the samples -// need to be immediately converted to f32. -class InflatableShortBuffer { - public: - explicit InflatableShortBuffer(size_t aElementCount) - : mBuffer(aElementCount * 2) {} - AlignedFloatBuffer Inflate() { - // Convert the data from int16_t to f32 in place, in the same buffer. - // The reason this works is because the buffer has in fact twice the - // capacity, and the loop goes backward. - float* output = reinterpret_cast(mBuffer.mData); - for (size_t i = Length() - 1; i--;) { - output[i] = AudioSampleToFloat(mBuffer.mData[i]); - } - AlignedFloatBuffer rv; - rv.mBuffer = std::move(mBuffer.mBuffer); - rv.mCapacity = mBuffer.mCapacity; - rv.mLength = Length(); - rv.mData = output; - return rv; - } - size_t Length() const { return mBuffer.mLength / 2; } - int16_t* get() const { return mBuffer.get(); } - explicit operator bool() const { return mBuffer.mData != nullptr; } - - protected: - AlignedShortBuffer mBuffer; -}; +typedef AlignedBuffer AlignedByteBuffer; +typedef AlignedBuffer AlignedFloatBuffer; +typedef AlignedBuffer AlignedShortBuffer; +typedef AlignedBuffer AlignedAudioBuffer; // Container that holds media samples. class MediaData { @@ -448,16 +416,16 @@ class VideoInfo; // Holds a decoded video frame, in YCbCr format. These are queued in the reader. class VideoData : public MediaData { public: - using IntRect = gfx::IntRect; - using IntSize = gfx::IntSize; - using ColorDepth = gfx::ColorDepth; - using ColorRange = gfx::ColorRange; - using YUVColorSpace = gfx::YUVColorSpace; - using ColorSpace2 = gfx::ColorSpace2; - using ChromaSubsampling = gfx::ChromaSubsampling; - using ImageContainer = layers::ImageContainer; - using Image = layers::Image; - using PlanarYCbCrImage = layers::PlanarYCbCrImage; + typedef gfx::IntRect IntRect; + typedef gfx::IntSize IntSize; + typedef gfx::ColorDepth ColorDepth; + typedef gfx::ColorRange ColorRange; + typedef gfx::YUVColorSpace YUVColorSpace; + typedef gfx::ColorSpace2 ColorSpace2; + typedef gfx::ChromaSubsampling ChromaSubsampling; + typedef layers::ImageContainer ImageContainer; + typedef layers::Image Image; + typedef layers::PlanarYCbCrImage PlanarYCbCrImage; static const Type sType = Type::VIDEO_DATA; static const char* sTypeName; @@ -475,7 +443,7 @@ class VideoData : public MediaData { uint32_t mSkip; }; - Plane mPlanes[3]{}; + Plane mPlanes[3]; YUVColorSpace mYUVColorSpace = YUVColorSpace::Identity; ColorSpace2 mColorPrimaries = ColorSpace2::UNKNOWN; ColorDepth mColorDepth = ColorDepth::COLOR_8; @@ -689,6 +657,10 @@ class MediaRawData final : public MediaData { // Indicates that this is the last packet of the stream. bool mEOS = false; + // Indicate to the audio decoder that mDiscardPadding frames should be + // trimmed. + uint32_t mDiscardPadding = 0; + RefPtr mTrackInfo; // May contain the original start time and duration of the frames. diff --git a/dom/media/MediaFormatReader.cpp b/dom/media/MediaFormatReader.cpp index 103e327ab8d9..5f7fc4635135 100644 --- a/dom/media/MediaFormatReader.cpp +++ b/dom/media/MediaFormatReader.cpp @@ -56,7 +56,7 @@ mozilla::LazyLogModule gMediaDemuxerLog("MediaDemuxer"); namespace mozilla { -using MediaDataDecoderID = void*; +typedef void* MediaDataDecoderID; /** * This class tracks shutdown promises to ensure all decoders are shut down @@ -73,7 +73,7 @@ class MediaFormatReader::ShutdownPromisePool { RefPtr Shutdown(); // Track a shutdown promise. - void Track(const RefPtr& aPromise); + void Track(RefPtr aPromise); // Shut down a decoder and track its shutdown promise. void ShutdownDecoder(already_AddRefed aDecoder) { @@ -96,7 +96,7 @@ RefPtr MediaFormatReader::ShutdownPromisePool::Shutdown() { } void MediaFormatReader::ShutdownPromisePool::Track( - const RefPtr& aPromise) { + RefPtr aPromise) { MOZ_DIAGNOSTIC_ASSERT(!mShutdown); MOZ_DIAGNOSTIC_ASSERT(!mPromises.Contains(aPromise)); mPromises.Insert(aPromise); @@ -1069,7 +1069,7 @@ bool MediaFormatReader::ResolveSetCDMPromiseIfDone(TrackType aTrack) { if (mSetCDMForTracks.isEmpty()) { LOGV("%s : Done ", __func__); - mSetCDMPromise.Resolve(/* aResolveValue = */ true, __func__); + mSetCDMPromise.Resolve(/* aIgnored = */ true, __func__); if (HasAudio()) { ScheduleUpdate(TrackInfo::kAudioTrack); } @@ -1135,8 +1135,7 @@ RefPtr MediaFormatReader::SetCDMProxy(CDMProxy* aProxy) { // 3) A null cdm proxy is set // the promise can be resolved directly. mSetCDMForTracks.clear(); - return SetCDMPromise::CreateAndResolve(/* aResolveValue = */ true, - __func__); + return SetCDMPromise::CreateAndResolve(/* aIgnored = */ true, __func__); } RefPtr p = mSetCDMPromise.Ensure(__func__); @@ -1560,16 +1559,16 @@ void MediaFormatReader::DoDemuxVideo() { p->Then( OwnerThread(), __func__, [self, perfRecorder(std::move(perfRecorder))]( - const RefPtr& aSamples) mutable { + RefPtr aSamples) mutable { perfRecorder.Record(); - self->OnVideoDemuxCompleted(aSamples); + self->OnVideoDemuxCompleted(std::move(aSamples)); }, [self](const MediaResult& aError) { self->OnVideoDemuxFailed(aError); }) ->Track(mVideo.mDemuxRequest); } void MediaFormatReader::OnVideoDemuxCompleted( - const RefPtr& aSamples) { + RefPtr aSamples) { AUTO_PROFILER_LABEL("MediaFormatReader::OnVideoDemuxCompleted", MEDIA_PLAYBACK); LOGV("%zu video samples demuxed (sid:%d)", aSamples->GetSamples().Length(), @@ -1655,16 +1654,16 @@ void MediaFormatReader::DoDemuxAudio() { p->Then( OwnerThread(), __func__, [self, perfRecorder(std::move(perfRecorder))]( - const RefPtr& aSamples) mutable { + RefPtr aSamples) mutable { perfRecorder.Record(); - self->OnAudioDemuxCompleted(aSamples); + self->OnAudioDemuxCompleted(std::move(aSamples)); }, [self](const MediaResult& aError) { self->OnAudioDemuxFailed(aError); }) ->Track(mAudio.mDemuxRequest); } void MediaFormatReader::OnAudioDemuxCompleted( - const RefPtr& aSamples) { + RefPtr aSamples) { LOGV("%zu audio samples demuxed (sid:%d)", aSamples->GetSamples().Length(), aSamples->GetSamples()[0]->mTrackInfo ? aSamples->GetSamples()[0]->mTrackInfo->GetID() @@ -1685,7 +1684,7 @@ void MediaFormatReader::NotifyNewOutput( DDLOG(DDLogCategory::Log, aTrack == TrackInfo::kAudioTrack ? "decoded_audio" : "decoded_video", "no output samples"); - } else { + } else for (auto&& sample : aResults) { if (DecoderDoctorLogger::IsDDLoggingEnabled()) { switch (sample->mType) { @@ -1760,7 +1759,6 @@ void MediaFormatReader::NotifyNewOutput( decoder.mNumOfConsecutiveUtilityCrashes = 0; } } - } LOG("Done processing new %s samples", TrackTypeToStr(aTrack)); if (!aResults.IsEmpty()) { @@ -2685,7 +2683,7 @@ RefPtr MediaFormatReader::WaitForData( return p; } -nsresult MediaFormatReader::ResetDecode(const TrackSet& aTracks) { +nsresult MediaFormatReader::ResetDecode(TrackSet aTracks) { AUTO_PROFILER_LABEL("MediaFormatReader::ResetDecode", MEDIA_PLAYBACK); MOZ_ASSERT(OnTaskQueue()); LOGV(""); @@ -3306,34 +3304,29 @@ void MediaFormatReader::GetDebugInfo(dom::MediaFormatReaderDebugInfo& aInfo) { aInfo.mAudioState.mWaitingPromise = !mAudio.mWaitingPromise.IsEmpty(); aInfo.mAudioState.mHasDemuxRequest = mAudio.mDemuxRequest.Exists(); aInfo.mAudioState.mDemuxQueueSize = - AssertedCast(mAudio.mQueuedSamples.Length()); + uint32_t(mAudio.mQueuedSamples.Length()); aInfo.mAudioState.mHasDecoder = mAudio.mDecodeRequest.Exists(); aInfo.mAudioState.mTimeTreshold = mAudio.mTimeThreshold ? mAudio.mTimeThreshold.ref().Time().ToSeconds() : -1.0; aInfo.mAudioState.mTimeTresholdHasSeeked = mAudio.mTimeThreshold ? mAudio.mTimeThreshold.ref().mHasSeeked : false; - aInfo.mAudioState.mNumSamplesInput = - AssertedCast(mAudio.mNumSamplesInput); - aInfo.mAudioState.mNumSamplesOutput = - AssertedCast(mAudio.mNumSamplesOutput); - aInfo.mAudioState.mQueueSize = - AssertedCast(size_t(mAudio.mSizeOfQueue)); - aInfo.mAudioState.mPending = AssertedCast(mAudio.mOutput.Length()); + aInfo.mAudioState.mNumSamplesInput = mAudio.mNumSamplesInput; + aInfo.mAudioState.mNumSamplesOutput = mAudio.mNumSamplesOutput; + aInfo.mAudioState.mQueueSize = size_t(mAudio.mSizeOfQueue); + aInfo.mAudioState.mPending = mAudio.mOutput.Length(); aInfo.mAudioState.mWaitingForData = mAudio.mWaitingForData; aInfo.mAudioState.mDemuxEOS = mAudio.mDemuxEOS; aInfo.mAudioState.mDrainState = int32_t(mAudio.mDrainState); aInfo.mAudioState.mWaitingForKey = mAudio.mWaitingForKey; - aInfo.mAudioState.mLastStreamSourceID = - AssertedCast(mAudio.mLastStreamSourceID); + aInfo.mAudioState.mLastStreamSourceID = mAudio.mLastStreamSourceID; } CopyUTF8toUTF16(audioDecoderName, aInfo.mAudioDecoderName); CopyUTF8toUTF16(audioType, aInfo.mAudioType); - aInfo.mAudioChannels = AssertedCast(audioInfo.mChannels); + aInfo.mAudioChannels = audioInfo.mChannels; aInfo.mAudioRate = audioInfo.mRate; - aInfo.mAudioFramesDecoded = - AssertedCast(mAudio.mNumSamplesOutputTotal); + aInfo.mAudioFramesDecoded = mAudio.mNumSamplesOutputTotal; VideoInfo videoInfo; if (HasVideo()) { @@ -3346,26 +3339,22 @@ void MediaFormatReader::GetDebugInfo(dom::MediaFormatReaderDebugInfo& aInfo) { aInfo.mVideoState.mWaitingPromise = !mVideo.mWaitingPromise.IsEmpty(); aInfo.mVideoState.mHasDemuxRequest = mVideo.mDemuxRequest.Exists(); aInfo.mVideoState.mDemuxQueueSize = - AssertedCast(mVideo.mQueuedSamples.Length()); + uint32_t(mVideo.mQueuedSamples.Length()); aInfo.mVideoState.mHasDecoder = mVideo.mDecodeRequest.Exists(); aInfo.mVideoState.mTimeTreshold = mVideo.mTimeThreshold ? mVideo.mTimeThreshold.ref().Time().ToSeconds() : -1.0; aInfo.mVideoState.mTimeTresholdHasSeeked = mVideo.mTimeThreshold ? mVideo.mTimeThreshold.ref().mHasSeeked : false; - aInfo.mVideoState.mNumSamplesInput = - AssertedCast(mVideo.mNumSamplesInput); - aInfo.mVideoState.mNumSamplesOutput = - AssertedCast(mVideo.mNumSamplesOutput); - aInfo.mVideoState.mQueueSize = - AssertedCast(size_t(mVideo.mSizeOfQueue)); - aInfo.mVideoState.mPending = AssertedCast(mVideo.mOutput.Length()); + aInfo.mVideoState.mNumSamplesInput = mVideo.mNumSamplesInput; + aInfo.mVideoState.mNumSamplesOutput = mVideo.mNumSamplesOutput; + aInfo.mVideoState.mQueueSize = size_t(mVideo.mSizeOfQueue); + aInfo.mVideoState.mPending = mVideo.mOutput.Length(); aInfo.mVideoState.mWaitingForData = mVideo.mWaitingForData; aInfo.mVideoState.mDemuxEOS = mVideo.mDemuxEOS; aInfo.mVideoState.mDrainState = int32_t(mVideo.mDrainState); aInfo.mVideoState.mWaitingForKey = mVideo.mWaitingForKey; - aInfo.mVideoState.mLastStreamSourceID = - AssertedCast(mVideo.mLastStreamSourceID); + aInfo.mVideoState.mLastStreamSourceID = mVideo.mLastStreamSourceID; } CopyUTF8toUTF16(videoDecoderName, aInfo.mVideoDecoderName); @@ -3376,19 +3365,14 @@ void MediaFormatReader::GetDebugInfo(dom::MediaFormatReaderDebugInfo& aInfo) { videoInfo.mDisplay.height < 0 ? 0 : videoInfo.mDisplay.height; aInfo.mVideoRate = mVideo.mMeanRate.Mean(); aInfo.mVideoHardwareAccelerated = VideoIsHardwareAccelerated(); - aInfo.mVideoNumSamplesOutputTotal = - AssertedCast(mVideo.mNumSamplesOutputTotal); - aInfo.mVideoNumSamplesSkippedTotal = - AssertedCast(mVideo.mNumSamplesSkippedTotal); + aInfo.mVideoNumSamplesOutputTotal = mVideo.mNumSamplesOutputTotal; + aInfo.mVideoNumSamplesSkippedTotal = mVideo.mNumSamplesSkippedTotal; // Looking at dropped frames FrameStatisticsData stats = mFrameStats->GetFrameStatisticsData(); - aInfo.mFrameStats.mDroppedDecodedFrames = - AssertedCast(stats.mDroppedDecodedFrames); - aInfo.mFrameStats.mDroppedSinkFrames = - AssertedCast(stats.mDroppedSinkFrames); - aInfo.mFrameStats.mDroppedCompositorFrames = - AssertedCast(stats.mDroppedCompositorFrames); + aInfo.mFrameStats.mDroppedDecodedFrames = stats.mDroppedDecodedFrames; + aInfo.mFrameStats.mDroppedSinkFrames = stats.mDroppedSinkFrames; + aInfo.mFrameStats.mDroppedCompositorFrames = stats.mDroppedCompositorFrames; } void MediaFormatReader::SetVideoNullDecode(bool aIsNullDecode) { @@ -3419,7 +3403,7 @@ void MediaFormatReader::SetNullDecode(TrackType aTrack, bool aIsNullDecode) { void MediaFormatReader::OnFirstDemuxCompleted( TrackInfo::TrackType aType, - const RefPtr& aSamples) { + RefPtr aSamples) { AUTO_PROFILER_LABEL("MediaFormatReader::OnFirstDemuxCompleted", MEDIA_PLAYBACK); MOZ_ASSERT(OnTaskQueue()); diff --git a/dom/media/MediaFormatReader.h b/dom/media/MediaFormatReader.h index fcc3f2003652..ebbca0e17931 100644 --- a/dom/media/MediaFormatReader.h +++ b/dom/media/MediaFormatReader.h @@ -56,7 +56,7 @@ struct MetadataHolder { UniquePtr mTags; }; -using MediaDecoderOwnerID = void*; +typedef void* MediaDecoderOwnerID; struct MOZ_STACK_CLASS MediaFormatReaderInit { MediaResource* mResource = nullptr; @@ -75,8 +75,8 @@ class MediaFormatReader final : public SupportsThreadSafeWeakPtr, public DecoderDoctorLifeLogger { static const bool IsExclusive = true; - using TrackType = TrackInfo::TrackType; - using NotifyDataArrivedPromise = MozPromise; + typedef TrackInfo::TrackType TrackType; + typedef MozPromise NotifyDataArrivedPromise; public: MOZ_DECLARE_REFCOUNTED_TYPENAME(MediaFormatReader) @@ -161,7 +161,7 @@ class MediaFormatReader final // // aParam is a set of TrackInfo::TrackType enums specifying which // queues need to be reset, defaulting to both audio and video tracks. - nsresult ResetDecode(const TrackSet& aTracks); + nsresult ResetDecode(TrackSet aTracks); // Destroys the decoding state. The reader cannot be made usable again. // This is different from ReleaseMediaResources() as it is irreversable, @@ -501,34 +501,31 @@ class MediaFormatReader final // if we have too many, or if warnings should be treated as errors. return mNumOfConsecutiveDecodingError > mMaxConsecutiveDecodingError || StaticPrefs::media_playback_warnings_as_errors(); - } - if (mError.ref() == NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER) { + } else if (mError.ref() == NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER) { // If the caller asked for a new decoder we shouldn't treat // it as fatal. return false; - } - if (mError.ref() == - NS_ERROR_DOM_MEDIA_REMOTE_DECODER_CRASHED_RDD_OR_GPU_ERR) { + } else if (mError.ref() == + NS_ERROR_DOM_MEDIA_REMOTE_DECODER_CRASHED_RDD_OR_GPU_ERR) { // Allow RDD crashes to be non-fatal, but give up // if we have too many, or if warnings should be treated as errors. return mNumOfConsecutiveRDDOrGPUCrashes > mMaxConsecutiveRDDOrGPUCrashes || StaticPrefs::media_playback_warnings_as_errors(); - } - if (mError.ref() == - NS_ERROR_DOM_MEDIA_REMOTE_DECODER_CRASHED_UTILITY_ERR) { + } else if (mError.ref() == + NS_ERROR_DOM_MEDIA_REMOTE_DECODER_CRASHED_UTILITY_ERR) { bool tooManyConsecutiveCrashes = mNumOfConsecutiveUtilityCrashes > mMaxConsecutiveUtilityCrashes; // TODO: Telemetry? return tooManyConsecutiveCrashes || StaticPrefs::media_playback_warnings_as_errors(); - } - if (mError.ref() == - NS_ERROR_DOM_MEDIA_REMOTE_DECODER_CRASHED_MF_CDM_ERR) { + } else if (mError.ref() == + NS_ERROR_DOM_MEDIA_REMOTE_DECODER_CRASHED_MF_CDM_ERR) { return false; + } else { + // All other error types are fatal + return true; } - // All other error types are fatal - return true; } // If set, all decoded samples prior mTimeThreshold will be dropped. @@ -653,8 +650,7 @@ class MediaFormatReader final if (aValue == media::TimeUnit::Zero()) { return; } - mMean += static_cast((1.0f / aValue.ToSeconds() - mMean) / - static_cast(++mCount)); + mMean += (1.0f / aValue.ToSeconds() - mMean) / ++mCount; } void Reset() { @@ -738,15 +734,13 @@ class MediaFormatReader final void OnDemuxFailed(TrackType aTrack, const MediaResult& aError); void DoDemuxVideo(); - void OnVideoDemuxCompleted( - const RefPtr& aSamples); + void OnVideoDemuxCompleted(RefPtr aSamples); void OnVideoDemuxFailed(const MediaResult& aError) { OnDemuxFailed(TrackType::kVideoTrack, aError); } void DoDemuxAudio(); - void OnAudioDemuxCompleted( - const RefPtr& aSamples); + void OnAudioDemuxCompleted(RefPtr aSamples); void OnAudioDemuxFailed(const MediaResult& aError) { OnDemuxFailed(TrackType::kAudioTrack, aError); } @@ -824,9 +818,8 @@ class MediaFormatReader final MediaEventListener mOnTrackWaitingForKeyListener; - void OnFirstDemuxCompleted( - TrackInfo::TrackType aType, - const RefPtr& aSamples); + void OnFirstDemuxCompleted(TrackInfo::TrackType aType, + RefPtr aSamples); void OnFirstDemuxFailed(TrackInfo::TrackType aType, const MediaResult& aError); diff --git a/dom/media/MediaInfo.h b/dom/media/MediaInfo.h index da0de17df2fb..c692b94d6463 100644 --- a/dom/media/MediaInfo.h +++ b/dom/media/MediaInfo.h @@ -37,7 +37,7 @@ class MetadataTag { } }; -using MetadataTags = nsTHashMap; +typedef nsTHashMap MetadataTags; // Start codec specific data structs. If modifying these remember to also // modify the MediaIPCUtils so that any new members are sent across IPC. @@ -128,10 +128,11 @@ struct Mp3CodecSpecificData { struct OpusCodecSpecificData { bool operator==(const OpusCodecSpecificData& rhs) const { - return mContainerCodecDelayFrames == rhs.mContainerCodecDelayFrames && + return mContainerCodecDelayMicroSeconds == + rhs.mContainerCodecDelayMicroSeconds && *mHeadersBinaryBlob == *rhs.mHeadersBinaryBlob; } - // The codec delay (aka pre-skip) in audio frames. + // The codec delay (aka pre-skip) in microseconds. // See https://tools.ietf.org/html/rfc7845#section-4.2 for more info. // This member should store the codec delay parsed from the container file. // In some cases (such as the ogg container), this information is derived @@ -139,7 +140,7 @@ struct OpusCodecSpecificData { // separately redundant. However, other containers store the delay in // addition to the header blob, in which case we can check this container // delay against the header delay to ensure they're consistent. - int64_t mContainerCodecDelayFrames{-1}; + int64_t mContainerCodecDelayMicroSeconds{-1}; // A binary blob of opus header data, specifically the Identification Header. // See https://datatracker.ietf.org/doc/html/rfc7845.html#section-5.1 @@ -400,10 +401,10 @@ class VideoInfo : public TrackInfo { return imageRect; } - imageRect.x = AssertedCast((imageRect.x * aWidth) / mImage.width); - imageRect.y = AssertedCast((imageRect.y * aHeight) / mImage.height); - imageRect.SetWidth(AssertedCast(w)); - imageRect.SetHeight(AssertedCast(h)); + imageRect.x = (imageRect.x * aWidth) / mImage.width; + imageRect.y = (imageRect.y * aHeight) / mImage.height; + imageRect.SetWidth(w); + imageRect.SetHeight(h); return imageRect; } @@ -540,7 +541,7 @@ class EncryptionInfo { // Encryption data. CopyableTArray mInitData; }; - using InitDatas = CopyableTArray; + typedef CopyableTArray InitDatas; // True if the stream has encryption metadata bool IsEncrypted() const { return mEncrypted; } diff --git a/dom/media/VideoUtils.cpp b/dom/media/VideoUtils.cpp index 296b97dadb07..485f426fcaf3 100644 --- a/dom/media/VideoUtils.cpp +++ b/dom/media/VideoUtils.cpp @@ -12,6 +12,7 @@ #include "MediaContainerType.h" #include "MediaResource.h" #include "TimeUnits.h" +#include "VorbisUtils.h" #include "mozilla/Base64.h" #include "mozilla/dom/ContentChild.h" #include "mozilla/SchedulerGroup.h" @@ -51,8 +52,8 @@ CheckedInt64 SaferMultDiv(int64_t aValue, uint64_t aMul, uint64_t aDiv) { if (aMul > INT64_MAX || aDiv > INT64_MAX) { return CheckedInt64(INT64_MAX) + 1; // Return an invalid checked int. } - int64_t mul = AssertedCast(aMul); - int64_t div = AssertedCast(aDiv); + int64_t mul = aMul; + int64_t div = aDiv; int64_t major = aValue / div; int64_t remainder = aValue % div; return CheckedInt64(remainder) * mul / div + CheckedInt64(major) * mul; @@ -95,12 +96,10 @@ static int32_t ConditionDimension(float aValue) { void ScaleDisplayByAspectRatio(gfx::IntSize& aDisplay, float aAspectRatio) { if (aAspectRatio > 1.0) { // Increase the intrinsic width - aDisplay.width = - ConditionDimension(aAspectRatio * AssertedCast(aDisplay.width)); + aDisplay.width = ConditionDimension(aAspectRatio * aDisplay.width); } else { // Increase the intrinsic height - aDisplay.height = - ConditionDimension(AssertedCast(aDisplay.height) / aAspectRatio); + aDisplay.height = ConditionDimension(aDisplay.height / aAspectRatio); } } @@ -1051,7 +1050,11 @@ bool ParseCodecsString(const nsAString& aCodecs, expectMoreTokens = tokenizer.separatorAfterCurrentToken(); aOutCodecs.AppendElement(token); } - return !expectMoreTokens; + if (expectMoreTokens) { + // Last codec name was empty + return false; + } + return true; } bool ParseMIMETypeString(const nsAString& aMIMEType, diff --git a/dom/media/VideoUtils.h b/dom/media/VideoUtils.h index cc2fb899620f..cd7251525d1e 100644 --- a/dom/media/VideoUtils.h +++ b/dom/media/VideoUtils.h @@ -437,8 +437,8 @@ enum class StringListRangeEmptyItems { template class StringListRange { - using CharType = typename String::char_type; - using Pointer = const CharType*; + typedef typename String::char_type CharType; + typedef const CharType* Pointer; public: // Iterator into range, trims items and optionally skips empty items. @@ -453,7 +453,7 @@ class StringListRange { } // DereferencedType should be 'const nsDependent[C]String' pointing into // mList (which is 'const ns[C]String&'). - using DereferencedType = decltype(Substring(Pointer(), Pointer())); + typedef decltype(Substring(Pointer(), Pointer())) DereferencedType; DereferencedType operator*() { return Substring(mStart, mEnd); } private: diff --git a/dom/media/VorbisUtils.h b/dom/media/VorbisUtils.h new file mode 100644 index 000000000000..3d8ac74b0078 --- /dev/null +++ b/dom/media/VorbisUtils.h @@ -0,0 +1,27 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:set ts=2 sw=2 sts=2 et cindent: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef VORBISUTILS_H_ +#define VORBISUTILS_H_ + +#ifdef MOZ_SAMPLE_TYPE_S16 +# include +typedef ogg_int32_t VorbisPCMValue; + +# define MOZ_CLIP_TO_15(x) ((x) < -32768 ? -32768 : (x) <= 32767 ? (x) : 32767) +// Convert the output of vorbis_synthesis_pcmout to a AudioDataValue +# define MOZ_CONVERT_VORBIS_SAMPLE(x) \ + (static_cast(MOZ_CLIP_TO_15((x) >> 9))) + +#else /* MOZ_SAMPLE_TYPE_FLOAT32 */ + +typedef float VorbisPCMValue; + +# define MOZ_CONVERT_VORBIS_SAMPLE(x) (x) + +#endif + +#endif /* VORBISUTILS_H_ */ diff --git a/dom/media/encoder/OpusTrackEncoder.cpp b/dom/media/encoder/OpusTrackEncoder.cpp index 1238ef8ea01c..16b71d378e8f 100644 --- a/dom/media/encoder/OpusTrackEncoder.cpp +++ b/dom/media/encoder/OpusTrackEncoder.cpp @@ -338,10 +338,17 @@ nsresult OpusTrackEncoder::Encode(AudioSegment* aSegment) { // really predict the output frame count at each call. resamplingDest.SetLength(outframes * mChannels); +#if MOZ_SAMPLE_TYPE_S16 + short* in = reinterpret_cast(pcm.Elements()); + short* out = reinterpret_cast(resamplingDest.Elements()); + speex_resampler_process_interleaved_int(mResampler, in, &inframes, out, + &outframes); +#else float* in = reinterpret_cast(pcm.Elements()); float* out = reinterpret_cast(resamplingDest.Elements()); speex_resampler_process_interleaved_float(mResampler, in, &inframes, out, &outframes); +#endif MOZ_ASSERT(pcm.Length() >= mResampledLeftover.Length()); PodCopy(pcm.Elements(), mResampledLeftover.Elements(), @@ -399,9 +406,15 @@ nsresult OpusTrackEncoder::Encode(AudioSegment* aSegment) { frameData->SetLength(MAX_DATA_BYTES); // result is returned as opus error code if it is negative. result = 0; +#ifdef MOZ_SAMPLE_TYPE_S16 + const opus_int16* pcmBuf = static_cast(pcm.Elements()); + result = opus_encode(mEncoder, pcmBuf, NumOutputFramesPerPacket(), + frameData->Elements(), MAX_DATA_BYTES); +#else const float* pcmBuf = static_cast(pcm.Elements()); result = opus_encode_float(mEncoder, pcmBuf, NumOutputFramesPerPacket(), frameData->Elements(), MAX_DATA_BYTES); +#endif frameData->SetLength(result >= 0 ? result : 0); if (result < 0) { diff --git a/dom/media/ipc/MediaIPCUtils.h b/dom/media/ipc/MediaIPCUtils.h index 1a7ed735f2e1..ddf37bd6449b 100644 --- a/dom/media/ipc/MediaIPCUtils.h +++ b/dom/media/ipc/MediaIPCUtils.h @@ -146,11 +146,11 @@ struct ParamTraits { using paramType = mozilla::OpusCodecSpecificData; static void Write(MessageWriter* aWriter, const paramType& aParam) { - WriteParam(aWriter, aParam.mContainerCodecDelayFrames); + WriteParam(aWriter, aParam.mContainerCodecDelayMicroSeconds); WriteParam(aWriter, *aParam.mHeadersBinaryBlob); } static bool Read(MessageReader* aReader, paramType* aResult) { - return ReadParam(aReader, &aResult->mContainerCodecDelayFrames) && + return ReadParam(aReader, &aResult->mContainerCodecDelayMicroSeconds) && ReadParam(aReader, aResult->mHeadersBinaryBlob.get()); } }; diff --git a/dom/media/ipc/RemoteMediaData.cpp b/dom/media/ipc/RemoteMediaData.cpp index 6334a3bd6d55..bd323b733347 100644 --- a/dom/media/ipc/RemoteMediaData.cpp +++ b/dom/media/ipc/RemoteMediaData.cpp @@ -146,7 +146,8 @@ bool ArrayOfRemoteMediaRawData::Fill( mSamples.AppendElement(RemoteMediaRawData{ MediaDataIPDL(entry->mOffset, entry->mTime, entry->mTimecode, entry->mDuration, entry->mKeyframe), - entry->mEOS, height, entry->mOriginalPresentationWindow, + entry->mEOS, height, entry->mDiscardPadding, + entry->mOriginalPresentationWindow, entry->mCrypto.IsEncrypted() && entry->mShouldCopyCryptoToRemoteRawData ? Some(CryptoInfo{ entry->mCrypto.mCryptoScheme, @@ -210,6 +211,7 @@ already_AddRefed ArrayOfRemoteMediaRawData::ElementAt( rawData->mDuration = sample.mBase.duration(); rawData->mKeyframe = sample.mBase.keyframe(); rawData->mEOS = sample.mEOS; + rawData->mDiscardPadding = sample.mDiscardPadding; rawData->mExtraData = mExtraDatas.MediaByteBufferAt(aIndex); if (sample.mCryptoConfig) { CryptoSample& cypto = rawData->GetWritableCrypto(); @@ -254,6 +256,7 @@ ipc::IPDLParamTraits::Write( WriteIPDLParam(aWriter, aActor, aVar.mBase); WriteIPDLParam(aWriter, aActor, aVar.mEOS); WriteIPDLParam(aWriter, aActor, aVar.mHeight); + WriteIPDLParam(aWriter, aActor, aVar.mDiscardPadding); WriteIPDLParam(aWriter, aActor, aVar.mOriginalPresentationWindow); WriteIPDLParam(aWriter, aActor, aVar.mCryptoConfig); } @@ -265,6 +268,7 @@ ipc::IPDLParamTraits::Read( return ReadIPDLParam(aReader, aActor, &aVar->mBase) && ReadIPDLParam(aReader, aActor, &aVar->mEOS) && ReadIPDLParam(aReader, aActor, &aVar->mHeight) && + ReadIPDLParam(aReader, aActor, &aVar->mDiscardPadding) && ReadIPDLParam(aReader, aActor, &aVar->mOriginalPresentationWindow) && ReadIPDLParam(aReader, aActor, &aVar->mCryptoConfig); }; diff --git a/dom/media/ipc/RemoteMediaData.h b/dom/media/ipc/RemoteMediaData.h index 1797a81ea0dd..8055a397d9bb 100644 --- a/dom/media/ipc/RemoteMediaData.h +++ b/dom/media/ipc/RemoteMediaData.h @@ -234,6 +234,7 @@ class ArrayOfRemoteMediaRawData { bool mEOS; // This will be zero for audio. int32_t mHeight; + uint32_t mDiscardPadding; Maybe mOriginalPresentationWindow; Maybe mCryptoConfig; }; diff --git a/dom/media/mediasource/SourceBuffer.cpp b/dom/media/mediasource/SourceBuffer.cpp index 1414b2723acd..cc5293f27d8a 100644 --- a/dom/media/mediasource/SourceBuffer.cpp +++ b/dom/media/mediasource/SourceBuffer.cpp @@ -42,7 +42,7 @@ extern mozilla::LogModule* GetMediaSourceAPILog(); namespace mozilla { using media::TimeUnit; -using AppendState = SourceBufferAttributes::AppendState; +typedef SourceBufferAttributes::AppendState AppendState; namespace dom { diff --git a/dom/media/mediasource/TrackBuffersManager.cpp b/dom/media/mediasource/TrackBuffersManager.cpp index abf10032e458..5d32c8e3223e 100644 --- a/dom/media/mediasource/TrackBuffersManager.cpp +++ b/dom/media/mediasource/TrackBuffersManager.cpp @@ -49,8 +49,8 @@ using dom::SourceBufferAppendMode; using media::TimeInterval; using media::TimeIntervals; using media::TimeUnit; -using AppendBufferResult = SourceBufferTask::AppendBufferResult; -using AppendState = SourceBufferAttributes::AppendState; +typedef SourceBufferTask::AppendBufferResult AppendBufferResult; +typedef SourceBufferAttributes::AppendState AppendState; static const char* AppendStateToStr(AppendState aState) { switch (aState) { @@ -557,7 +557,7 @@ void TrackBuffersManager::DoEvictData(const TimeUnit& aPlaybackTime, if (frame->GetEndTime() >= lowerLimit) { break; } - partialEvict += AssertedCast(frame->ComputedSizeOfIncludingThis()); + partialEvict += frame->ComputedSizeOfIncludingThis(); } const int64_t finalSize = mSizeSourceBuffer - aSizeToEvict; @@ -596,7 +596,7 @@ void TrackBuffersManager::DoEvictData(const TimeUnit& aPlaybackTime, // Don't evict before the end of the current segment TimeUnit upperLimit = futureBuffered[0].mEnd; uint32_t evictedFramesStartIndex = buffer.Length(); - for (uint32_t i = buffer.Length() - 1; i-- > 0;) { + for (int32_t i = buffer.Length() - 1; i >= 0; i--) { const auto& frame = buffer[i]; if (frame->mTime <= upperLimit || toEvict < 0) { // We've reached a frame that shouldn't be evicted -> Evict after it -> @@ -605,7 +605,7 @@ void TrackBuffersManager::DoEvictData(const TimeUnit& aPlaybackTime, evictedFramesStartIndex = i + 1; break; } - toEvict -= AssertedCast(frame->ComputedSizeOfIncludingThis()); + toEvict -= frame->ComputedSizeOfIncludingThis(); } if (evictedFramesStartIndex < buffer.Length()) { MSE_DEBUG("Step2. Evicting %" PRId64 " bytes from trailing data", @@ -616,8 +616,7 @@ void TrackBuffersManager::DoEvictData(const TimeUnit& aPlaybackTime, } RefPtr -TrackBuffersManager::CodedFrameRemovalWithPromise( - const TimeInterval& aInterval) { +TrackBuffersManager::CodedFrameRemovalWithPromise(TimeInterval aInterval) { mTaskQueueCapability->AssertOnCurrentThread(); RefPtr task = new RangeRemovalTask(aInterval); @@ -627,7 +626,7 @@ TrackBuffersManager::CodedFrameRemovalWithPromise( return p; } -bool TrackBuffersManager::CodedFrameRemoval(const TimeInterval& aInterval) { +bool TrackBuffersManager::CodedFrameRemoval(TimeInterval aInterval) { MOZ_ASSERT(OnTaskQueue()); AUTO_PROFILER_LABEL("TrackBuffersManager::CodedFrameRemoval", MEDIA_PLAYBACK); MSE_DEBUG("From %.2fs to %.2f", aInterval.mStart.ToSeconds(), @@ -652,7 +651,7 @@ bool TrackBuffersManager::CodedFrameRemoval(const TimeInterval& aInterval) { bool dataRemoved = false; // 3. For each track buffer in this source buffer, run the following steps: - for (auto* track : GetTracksList()) { + for (auto track : GetTracksList()) { MSE_DEBUGV("Processing %s track", track->mInfo->mMimeType.get()); // 1. Let remove end timestamp be the current value of duration // See bug: https://www.w3.org/Bugs/Public/show_bug.cgi?id=28727 @@ -1625,7 +1624,7 @@ void TrackBuffersManager::MaybeDispatchEncryptedEvent( } void TrackBuffersManager::OnVideoDemuxCompleted( - const RefPtr& aSamples) { + RefPtr aSamples) { mTaskQueueCapability->AssertOnCurrentThread(); MSE_DEBUG("%zu video samples demuxed", aSamples->GetSamples().Length()); mVideoTracks.mDemuxRequest.Complete(); @@ -1649,7 +1648,7 @@ void TrackBuffersManager::DoDemuxAudio() { } void TrackBuffersManager::OnAudioDemuxCompleted( - const RefPtr& aSamples) { + RefPtr aSamples) { mTaskQueueCapability->AssertOnCurrentThread(); MSE_DEBUG("%zu audio samples demuxed", aSamples->GetSamples().Length()); // When using MSE, it's possible for each fragments to have their own @@ -1796,7 +1795,7 @@ TimeInterval TrackBuffersManager::PresentationInterval( TimeInterval(aSamples[0]->mTime, aSamples[0]->GetEndTime()); for (uint32_t i = 1; i < aSamples.Length(); i++) { - const auto& sample = aSamples[i]; + auto& sample = aSamples[i]; presentationInterval = presentationInterval.Span( TimeInterval(sample->mTime, sample->GetEndTime())); } @@ -2703,7 +2702,7 @@ uint32_t TrackBuffersManager::SkipToNextRandomAccessPoint( TimeUnit nextSampleTimecode = trackData.mNextSampleTimecode; TimeUnit nextSampleTime = trackData.mNextSampleTime; uint32_t i = trackData.mNextGetSampleIndex.ref(); - uint32_t originalPos = i; + int32_t originalPos = i; for (; i < track.Length(); i++) { const MediaRawData* sample = @@ -2730,7 +2729,7 @@ uint32_t TrackBuffersManager::SkipToNextRandomAccessPoint( } else if (i > 0) { // Go back to the previous keyframe or the original position so the next // demux can succeed and be decoded. - for (uint32_t j = i - 1; j-- > originalPos;) { + for (int j = i - 1; j >= originalPos; j--) { const RefPtr& sample = track[j]; if (sample->mKeyframe) { trackData.mNextSampleTimecode = sample->mTimecode; @@ -2866,12 +2865,11 @@ already_AddRefed TrackBuffersManager::GetSample( int32_t TrackBuffersManager::FindCurrentPosition(TrackInfo::TrackType aTrack, const TimeUnit& aFuzz) const { MOZ_ASSERT(OnTaskQueue()); - const auto& trackData = GetTracksData(aTrack); + auto& trackData = GetTracksData(aTrack); const TrackBuffer& track = GetTrackBuffer(aTrack); - int32_t trackLength = AssertedCast(track.Length()); // Perform an exact search first. - for (int32_t i = 0; i < trackLength; i++) { + for (uint32_t i = 0; i < track.Length(); i++) { const RefPtr& sample = track[i]; TimeInterval sampleInterval{sample->mTimecode, sample->GetEndTimecode()}; @@ -2885,7 +2883,7 @@ int32_t TrackBuffersManager::FindCurrentPosition(TrackInfo::TrackType aTrack, } } - for (int32_t i = 0; i < trackLength; i++) { + for (uint32_t i = 0; i < track.Length(); i++) { const RefPtr& sample = track[i]; TimeInterval sampleInterval{sample->mTimecode, sample->GetEndTimecode(), aFuzz}; @@ -2902,7 +2900,7 @@ int32_t TrackBuffersManager::FindCurrentPosition(TrackInfo::TrackType aTrack, // We couldn't find our sample by decode timestamp. Attempt to find it using // presentation timestamp. There will likely be small jerkiness. - for (int32_t i = 0; i < trackLength; i++) { + for (uint32_t i = 0; i < track.Length(); i++) { const RefPtr& sample = track[i]; TimeInterval sampleInterval{sample->mTime, sample->GetEndTime(), aFuzz}; @@ -3027,14 +3025,11 @@ void TrackBuffersManager::GetDebugInfo( if (HasAudio()) { aInfo.mNextSampleTime = mAudioTracks.mNextSampleTime.ToSeconds(); - aInfo.mNumSamples = - AssertedCast(mAudioTracks.mBuffers[0].Length()); - aInfo.mBufferSize = AssertedCast(mAudioTracks.mSizeBuffer); - aInfo.mEvictable = AssertedCast(Evictable(TrackInfo::kAudioTrack)); - aInfo.mNextGetSampleIndex = - AssertedCast(mAudioTracks.mNextGetSampleIndex.valueOr(-1)); - aInfo.mNextInsertionIndex = - AssertedCast(mAudioTracks.mNextInsertionIndex.valueOr(-1)); + aInfo.mNumSamples = mAudioTracks.mBuffers[0].Length(); + aInfo.mBufferSize = mAudioTracks.mSizeBuffer; + aInfo.mEvictable = Evictable(TrackInfo::kAudioTrack); + aInfo.mNextGetSampleIndex = mAudioTracks.mNextGetSampleIndex.valueOr(-1); + aInfo.mNextInsertionIndex = mAudioTracks.mNextInsertionIndex.valueOr(-1); media::TimeIntervals ranges = SafeBuffered(TrackInfo::kAudioTrack); dom::Sequence items; for (uint32_t i = 0; i < ranges.Length(); ++i) { @@ -3049,14 +3044,11 @@ void TrackBuffersManager::GetDebugInfo( aInfo.mRanges = std::move(items); } else if (HasVideo()) { aInfo.mNextSampleTime = mVideoTracks.mNextSampleTime.ToSeconds(); - aInfo.mNumSamples = - AssertedCast(mVideoTracks.mBuffers[0].Length()); - aInfo.mBufferSize = AssertedCast(mVideoTracks.mSizeBuffer); - aInfo.mEvictable = AssertedCast(Evictable(TrackInfo::kVideoTrack)); - aInfo.mNextGetSampleIndex = - AssertedCast(mVideoTracks.mNextGetSampleIndex.valueOr(-1)); - aInfo.mNextInsertionIndex = - AssertedCast(mVideoTracks.mNextInsertionIndex.valueOr(-1)); + aInfo.mNumSamples = mVideoTracks.mBuffers[0].Length(); + aInfo.mBufferSize = mVideoTracks.mSizeBuffer; + aInfo.mEvictable = Evictable(TrackInfo::kVideoTrack); + aInfo.mNextGetSampleIndex = mVideoTracks.mNextGetSampleIndex.valueOr(-1); + aInfo.mNextInsertionIndex = mVideoTracks.mNextInsertionIndex.valueOr(-1); media::TimeIntervals ranges = SafeBuffered(TrackInfo::kVideoTrack); dom::Sequence items; for (uint32_t i = 0; i < ranges.Length(); ++i) { diff --git a/dom/media/mediasource/TrackBuffersManager.h b/dom/media/mediasource/TrackBuffersManager.h index c72f2f5453a5..45f232065b6f 100644 --- a/dom/media/mediasource/TrackBuffersManager.h +++ b/dom/media/mediasource/TrackBuffersManager.h @@ -74,11 +74,11 @@ class TrackBuffersManager final BUFFER_FULL, }; - using TrackType = TrackInfo::TrackType; - using MediaType = MediaData::Type; - using TrackBuffer = nsTArray>; - using AppendPromise = SourceBufferTask::AppendPromise; - using RangeRemovalPromise = SourceBufferTask::RangeRemovalPromise; + typedef TrackInfo::TrackType TrackType; + typedef MediaData::Type MediaType; + typedef nsTArray> TrackBuffer; + typedef SourceBufferTask::AppendPromise AppendPromise; + typedef SourceBufferTask::RangeRemovalPromise RangeRemovalPromise; // Interface for SourceBuffer TrackBuffersManager(MediaSourceDecoder* aParentDecoder, @@ -182,7 +182,8 @@ class TrackBuffersManager final void AddSizeOfResources(MediaSourceDecoder::ResourceSizes* aSizes) const; private: - using CodedFrameProcessingPromise = MozPromise; + typedef MozPromise + CodedFrameProcessingPromise; ~TrackBuffersManager(); // All following functions run on the taskqueue. @@ -205,8 +206,8 @@ class TrackBuffersManager final // Called by ResetParserState. void CompleteResetParserState() MOZ_REQUIRES(mTaskQueueCapability); RefPtr CodedFrameRemovalWithPromise( - const media::TimeInterval& aInterval) MOZ_REQUIRES(mTaskQueueCapability); - bool CodedFrameRemoval(const media::TimeInterval& aInterval) + media::TimeInterval aInterval) MOZ_REQUIRES(mTaskQueueCapability); + bool CodedFrameRemoval(media::TimeInterval aInterval) MOZ_REQUIRES(mTaskQueueCapability); // Removes all coded frames -- this is not to spec and should be used as a // last resort to clear buffers only if other methods cannot. @@ -267,7 +268,7 @@ class TrackBuffersManager final MOZ_GUARDED_BY(mTaskQueueCapability); void OnDemuxerInitDone(const MediaResult& aResult); - void OnDemuxerInitFailed(const MediaResult& aError); + void OnDemuxerInitFailed(const MediaResult& aFailure); void OnDemuxerResetDone(const MediaResult& aResult) MOZ_REQUIRES(mTaskQueueCapability); MozPromiseRequestHolder mDemuxerInitRequest; @@ -275,16 +276,14 @@ class TrackBuffersManager final void OnDemuxFailed(TrackType aTrack, const MediaResult& aError) MOZ_REQUIRES(mTaskQueueCapability); void DoDemuxVideo() MOZ_REQUIRES(mTaskQueueCapability); - void OnVideoDemuxCompleted( - const RefPtr& aSamples); + void OnVideoDemuxCompleted(RefPtr aSamples); void OnVideoDemuxFailed(const MediaResult& aError) { mVideoTracks.mDemuxRequest.Complete(); mTaskQueueCapability->AssertOnCurrentThread(); OnDemuxFailed(TrackType::kVideoTrack, aError); } void DoDemuxAudio() MOZ_REQUIRES(mTaskQueueCapability); - void OnAudioDemuxCompleted( - const RefPtr& aSamples); + void OnAudioDemuxCompleted(RefPtr aSamples); void OnAudioDemuxFailed(const MediaResult& aError) { mAudioTracks.mDemuxRequest.Complete(); mTaskQueueCapability->AssertOnCurrentThread(); @@ -388,8 +387,8 @@ class TrackBuffersManager final mEvictable = 0; mLastIndex = 0; } - uint32_t mEvictable = 0; - uint32_t mLastIndex = 0; + uint32_t mEvictable; + uint32_t mLastIndex; }; // Size of data that can be safely evicted during the next eviction // cycle. diff --git a/dom/media/moz.build b/dom/media/moz.build index 3ea9d5ebec25..5762db10dc57 100644 --- a/dom/media/moz.build +++ b/dom/media/moz.build @@ -207,6 +207,7 @@ EXPORTS += [ "VideoLimits.h", "VideoSegment.h", "VideoUtils.h", + "VorbisUtils.h", "WavDumper.h", "XiphExtradata.h", ] diff --git a/dom/media/mp3/MP3Demuxer.cpp b/dom/media/mp3/MP3Demuxer.cpp index ad2c3c6f7041..25d878b3be5c 100644 --- a/dom/media/mp3/MP3Demuxer.cpp +++ b/dom/media/mp3/MP3Demuxer.cpp @@ -121,6 +121,13 @@ bool MP3TrackDemuxer::Init() { mInfo->mBitDepth = 16; mInfo->mMimeType = "audio/mpeg"; mInfo->mDuration = Duration().valueOr(TimeUnit::FromInfinity()); + Mp3CodecSpecificData mp3CodecData{}; + if (mEncoderDelay) { + mp3CodecData.mEncoderDelayFrames = mEncoderDelay; + mp3CodecData.mEncoderPaddingFrames = mEncoderPadding; + } + mInfo->mCodecSpecificConfig = + AudioCodecSpecificVariant{std::move(mp3CodecData)}; MP3LOG("Init mInfo={mRate=%d mChannels=%d mBitDepth=%d mDuration=%s (%lfs)}", mInfo->mRate, mInfo->mChannels, mInfo->mBitDepth, diff --git a/dom/media/mp4/DecoderData.cpp b/dom/media/mp4/DecoderData.cpp index ad79d7cfd4d4..b7c9c869545e 100644 --- a/dom/media/mp4/DecoderData.cpp +++ b/dom/media/mp4/DecoderData.cpp @@ -172,13 +172,14 @@ MediaResult MP4AudioInfo::Update(const Mp4parseTrackInfo* aTrack, mp4ParseSampleCodecSpecific.length >= 12) { uint16_t preskip = mozilla::LittleEndian::readUint16( mp4ParseSampleCodecSpecific.data + 10); - opusCodecSpecificData.mContainerCodecDelayFrames = preskip; + opusCodecSpecificData.mContainerCodecDelayMicroSeconds = + mozilla::FramesToUsecs(preskip, 48000).value(); LOG("Opus stream in MP4 container, %" PRId64 " microseconds of encoder delay (%" PRIu16 ").", - opusCodecSpecificData.mContainerCodecDelayFrames, preskip); + opusCodecSpecificData.mContainerCodecDelayMicroSeconds, preskip); } else { // This file will error later as it will be rejected by the opus decoder. - opusCodecSpecificData.mContainerCodecDelayFrames = 0; + opusCodecSpecificData.mContainerCodecDelayMicroSeconds = 0; } opusCodecSpecificData.mHeadersBinaryBlob->AppendElements( mp4ParseSampleCodecSpecific.data, mp4ParseSampleCodecSpecific.length); diff --git a/dom/media/mp4/MoofParser.cpp b/dom/media/mp4/MoofParser.cpp index d29f6839038a..71d39395029b 100644 --- a/dom/media/mp4/MoofParser.cpp +++ b/dom/media/mp4/MoofParser.cpp @@ -1044,12 +1044,7 @@ Result Edts::Parse(Box& aBox) { if (media_time == -1 && i) { LOG_WARN(Edts, "Multiple empty edit, not handled"); } else if (media_time == -1) { - if (segment_duration > std::numeric_limits::max()) { - NS_WARNING("Segment duration higher than int64_t max."); - mEmptyOffset = std::numeric_limits::max(); - } else { - mEmptyOffset = static_cast(segment_duration); - } + mEmptyOffset = segment_duration; emptyEntry = true; } else if (i > 1 || (i > 0 && !emptyEntry)) { LOG_WARN(Edts, diff --git a/dom/media/mp4/MoofParser.h b/dom/media/mp4/MoofParser.h index 1c3a1a5ce6c9..f644157308ab 100644 --- a/dom/media/mp4/MoofParser.h +++ b/dom/media/mp4/MoofParser.h @@ -235,7 +235,7 @@ struct SampleDescriptionEntry { // Used to indicate in variants if all tracks should be parsed. struct ParseAllTracks {}; -using TrackParseMode = Variant; +typedef Variant TrackParseMode; class Moof final : public Atom { public: diff --git a/dom/media/ogg/OggCodecState.cpp b/dom/media/ogg/OggCodecState.cpp index bc6bc888e5ff..c20a6a17bce8 100644 --- a/dom/media/ogg/OggCodecState.cpp +++ b/dom/media/ogg/OggCodecState.cpp @@ -13,7 +13,6 @@ #include #include #include -#include #include "OggCodecState.h" #include "OggRLBox.h" @@ -22,6 +21,7 @@ #include "VideoUtils.h" #include "XiphExtradata.h" #include "nsDebug.h" +#include "opus/opus_multistream.h" namespace mozilla { @@ -269,15 +269,15 @@ already_AddRefed OggCodecState::PacketOutAsMediaRawData() { return nullptr; } - TimeUnit endTimestamp = Time(packet->granulepos); - NS_ASSERTION(endTimestamp.IsPositiveOrZero(), "timestamp invalid"); + int64_t end_tstamp = Time(packet->granulepos); + NS_ASSERTION(end_tstamp >= 0, "timestamp invalid"); - TimeUnit duration = PacketDuration(packet.get()); - NS_ASSERTION(duration.IsPositiveOrZero(), "duration invalid"); + int64_t duration = PacketDuration(packet.get()); + NS_ASSERTION(duration >= 0, "duration invalid"); - sample->mTimecode = Time(packet->granulepos); - sample->mTime = endTimestamp - duration; - sample->mDuration = duration; + sample->mTimecode = TimeUnit::FromMicroseconds(packet->granulepos); + sample->mTime = TimeUnit::FromMicroseconds(end_tstamp - duration); + sample->mDuration = TimeUnit::FromMicroseconds(duration); sample->mKeyframe = IsKeyframe(packet.get()); sample->mEOS = packet->e_o_s; @@ -441,19 +441,18 @@ bool TheoraState::DecodeHeader(OggPacketPtr aPacket) { // header packets. Assume bad input. // Our caller will deactivate the bitstream. return false; - } - if (ret > 0 && isSetupHeader && mPacketCount == 3) { + } else if (ret > 0 && isSetupHeader && mPacketCount == 3) { // Successfully read the three header packets. mDoneReadingHeaders = true; } return true; } -TimeUnit TheoraState::Time(int64_t aGranulepos) { +int64_t TheoraState::Time(int64_t granulepos) { if (!mActive) { - return TimeUnit::Invalid(); + return -1; } - return TheoraState::Time(&mTheoraInfo, aGranulepos); + return TheoraState::Time(&mTheoraInfo, granulepos); } bool TheoraState::IsHeader(ogg_packet* aPacket) { @@ -465,9 +464,9 @@ bool TheoraState::IsHeader(ogg_packet* aPacket) { (((_info)->version_minor > (_min) || (_info)->version_minor == (_min)) && \ (_info)->version_subminor >= (_sub))) -TimeUnit TheoraState::Time(th_info* aInfo, int64_t aGranulepos) { +int64_t TheoraState::Time(th_info* aInfo, int64_t aGranulepos) { if (aGranulepos < 0 || aInfo->fps_numerator == 0) { - return TimeUnit::Invalid(); + return -1; } // Implementation of th_granule_frame inlined here to operate // on the th_info structure instead of the theora_state. @@ -478,38 +477,35 @@ TimeUnit TheoraState::Time(th_info* aInfo, int64_t aGranulepos) { CheckedInt64 t = ((CheckedInt64(frameno) + 1) * USECS_PER_S) * aInfo->fps_denominator; if (!t.isValid()) { - return TimeUnit::Invalid(); + return -1; } t /= aInfo->fps_numerator; - // TODO -- use rationals here - return TimeUnit::FromMicroseconds(t.value()); + return t.isValid() ? t.value() : -1; } -TimeUnit TheoraState::StartTime(int64_t aGranulepos) { - if (aGranulepos < 0 || !mActive || mTheoraInfo.fps_numerator == 0) { - return TimeUnit::Invalid(); +int64_t TheoraState::StartTime(int64_t granulepos) { + if (granulepos < 0 || !mActive || mTheoraInfo.fps_numerator == 0) { + return -1; } CheckedInt64 t = - (CheckedInt64(th_granule_frame(mCtx, aGranulepos)) * USECS_PER_S) * + (CheckedInt64(th_granule_frame(mCtx, granulepos)) * USECS_PER_S) * mTheoraInfo.fps_denominator; if (!t.isValid()) { - return TimeUnit::Invalid(); + return -1; } - // TODO -- use rationals here - return TimeUnit::FromMicroseconds(t.value() / mTheoraInfo.fps_numerator); + return t.value() / mTheoraInfo.fps_numerator; } -TimeUnit TheoraState::PacketDuration(ogg_packet* aPacket) { +int64_t TheoraState::PacketDuration(ogg_packet* aPacket) { if (!mActive || mTheoraInfo.fps_numerator == 0) { - return TimeUnit::Invalid(); + return -1; } CheckedInt64 t = SaferMultDiv(mTheoraInfo.fps_denominator, USECS_PER_S, mTheoraInfo.fps_numerator); - return t.isValid() ? TimeUnit::FromMicroseconds(t.value()) - : TimeUnit::Invalid(); + return t.isValid() ? t.value() : -1; } -TimeUnit TheoraState::MaxKeyframeOffset() { +int64_t TheoraState::MaxKeyframeOffset() { // Determine the maximum time in microseconds by which a key frame could // offset for the theora bitstream. Theora granulepos encode time as: // ((key_frame_number << granule_shift) + frame_offset). @@ -525,13 +521,13 @@ TimeUnit TheoraState::MaxKeyframeOffset() { (mTheoraInfo.fps_denominator * USECS_PER_S) / mTheoraInfo.fps_numerator; // Total time in usecs keyframe can be offset from any given frame. - return TimeUnit::FromMicroseconds(frameDuration * keyframeDiff); + return frameDuration * keyframeDiff; } -bool TheoraState::IsKeyframe(ogg_packet* aPacket) { +bool TheoraState::IsKeyframe(ogg_packet* pkt) { // first bit of packet is 1 for header, 0 for data // second bit of packet is 1 for inter frame, 0 for intra frame - return (aPacket->bytes >= 1 && (aPacket->packet[0] & 0x40) == 0x00); + return (pkt->bytes >= 1 && (pkt->packet[0] & 0x40) == 0x00); } nsresult TheoraState::PageIn(tainted_opaque_ogg aPage) { @@ -590,8 +586,7 @@ void TheoraState::ReconstructTheoraGranulepos() { ogg_int64_t version_3_2_1 = TheoraVersion(&mTheoraInfo, 3, 2, 1); ogg_int64_t lastFrame = th_granule_frame(mCtx, lastGranulepos) + version_3_2_1; - ogg_int64_t firstFrame = - AssertedCast(lastFrame - mUnstamped.Length() + 1); + ogg_int64_t firstFrame = lastFrame - mUnstamped.Length() + 1; // Until we encounter a keyframe, we'll assume that the "keyframe" // segment of the granulepos is the first frame, or if that causes @@ -721,8 +716,7 @@ bool VorbisState::DecodeHeader(OggPacketPtr aPacket) { // header packets. Assume bad input. Our caller will deactivate the // bitstream. return false; - } - if (!ret && isSetupHeader && mPacketCount == 3) { + } else if (!ret && isSetupHeader && mPacketCount == 3) { // Successfully read the three header packets. // The bitstream remains active. mDoneReadingHeaders = true; @@ -773,32 +767,33 @@ bool VorbisState::Init() { return true; } -TimeUnit VorbisState::Time(int64_t aGranulepos) { +int64_t VorbisState::Time(int64_t granulepos) { if (!mActive) { - return TimeUnit::Invalid(); + return -1; } - return VorbisState::Time(&mVorbisInfo, aGranulepos); + return VorbisState::Time(&mVorbisInfo, granulepos); } -TimeUnit VorbisState::Time(vorbis_info* aInfo, int64_t aGranulepos) { +int64_t VorbisState::Time(vorbis_info* aInfo, int64_t aGranulepos) { if (aGranulepos == -1 || aInfo->rate == 0) { - return TimeUnit::Invalid(); + return -1; } - return TimeUnit(aGranulepos, aInfo->rate); + CheckedInt64 t = SaferMultDiv(aGranulepos, USECS_PER_S, aInfo->rate); + return t.isValid() ? t.value() : 0; } -TimeUnit VorbisState::PacketDuration(ogg_packet* aPacket) { +int64_t VorbisState::PacketDuration(ogg_packet* aPacket) { if (!mActive) { - return TimeUnit::Invalid(); + return -1; } if (aPacket->granulepos == -1) { - return TimeUnit::Invalid(); + return -1; } // @FIXME store these in a more stable place if (mVorbisPacketSamples.count(aPacket) == 0) { // We haven't seen this packet, don't know its size? - return TimeUnit::Invalid(); + return -1; } long samples = mVorbisPacketSamples[aPacket]; @@ -905,8 +900,8 @@ void VorbisState::ReconstructVorbisGranulepos() { } bool unknownGranulepos = last->granulepos == -1; - int64_t totalSamples = 0; - for (int32_t i = AssertedCast(mUnstamped.Length() - 1); i > 0; i--) { + int totalSamples = 0; + for (int32_t i = mUnstamped.Length() - 1; i > 0; i--) { auto& packet = mUnstamped[i]; auto& prev = mUnstamped[i - 1]; ogg_int64_t granulepos = packet->granulepos; @@ -1030,7 +1025,7 @@ bool OpusState::Init(void) { mInfo.mBitDepth = 16; // Save preskip & the first header packet for the Opus decoder OpusCodecSpecificData opusData; - opusData.mContainerCodecDelayFrames = mParser->mPreSkip; + opusData.mContainerCodecDelayMicroSeconds = Time(0, mParser->mPreSkip); if (!mHeaders.PeekFront()) { return false; @@ -1086,22 +1081,22 @@ UniquePtr OpusState::GetTags() { } /* Return the timestamp (in microseconds) equivalent to a granulepos. */ -TimeUnit OpusState::Time(int64_t aGranulepos) { +int64_t OpusState::Time(int64_t aGranulepos) { if (!mActive) { - return TimeUnit::Invalid(); + return -1; } return Time(mParser->mPreSkip, aGranulepos); } -TimeUnit OpusState::Time(int aPreSkip, int64_t aGranulepos) { +int64_t OpusState::Time(int aPreSkip, int64_t aGranulepos) { if (aGranulepos < 0) { - return TimeUnit::Invalid(); + return -1; } - int64_t offsetGranulePos = aGranulepos - aPreSkip; // Ogg Opus always runs at a granule rate of 48 kHz. - return TimeUnit(offsetGranulePos, 48000); + CheckedInt64 t = SaferMultDiv(aGranulepos - aPreSkip, USECS_PER_S, 48000); + return t.isValid() ? t.value() : -1; } bool OpusState::IsHeader(ogg_packet* aPacket) { @@ -1147,8 +1142,7 @@ nsresult OpusState::PageIn(tainted_opaque_ogg aPage) { // It even works before we've created the actual Opus decoder. static int GetOpusDeltaGP(ogg_packet* packet) { int nframes; - nframes = opus_packet_get_nb_frames(packet->packet, - AssertedCast(packet->bytes)); + nframes = opus_packet_get_nb_frames(packet->packet, packet->bytes); if (nframes > 0) { return nframes * opus_packet_get_samples_per_frame(packet->packet, 48000); } @@ -1156,8 +1150,9 @@ static int GetOpusDeltaGP(ogg_packet* packet) { return nframes; } -TimeUnit OpusState::PacketDuration(ogg_packet* aPacket) { - return TimeUnit(GetOpusDeltaGP(aPacket), 48000); +int64_t OpusState::PacketDuration(ogg_packet* aPacket) { + CheckedInt64 t = SaferMultDiv(GetOpusDeltaGP(aPacket), USECS_PER_S, 48000); + return t.isValid() ? t.value() : -1; } bool OpusState::ReconstructOpusGranulepos(void) { @@ -1173,9 +1168,8 @@ bool OpusState::ReconstructOpusGranulepos(void) { if (mPrevPageGranulepos != -1) { // If this file only has one page and the final granule position is // smaller than the pre-skip amount, we MUST reject the stream. - if (!mDoneReadingHeaders && last->granulepos < mParser->mPreSkip) { + if (!mDoneReadingHeaders && last->granulepos < mParser->mPreSkip) return false; - } int64_t last_gp = last->granulepos; gp = mPrevPageGranulepos; // Loop through the packets forwards, adding the current packet's @@ -1201,11 +1195,12 @@ bool OpusState::ReconstructOpusGranulepos(void) { } mPrevPageGranulepos = last_gp; return true; + } else { + NS_WARNING("No previous granule position to use for Opus end trimming."); + // If we don't have a previous granule position, fall through. + // We simply won't trim any samples from the end. + // TODO: Are we guaranteed to have seen a previous page if there is one? } - NS_WARNING("No previous granule position to use for Opus end trimming."); - // If we don't have a previous granule position, fall through. - // We simply won't trim any samples from the end. - // TODO: Are we guaranteed to have seen a previous page if there is one? } auto& last = mUnstamped.LastElement(); @@ -1268,16 +1263,7 @@ already_AddRefed OpusState::PacketOutAsMediaRawData() { int64_t startFrame = mPrevPacketGranulepos; frames -= std::max( 0, std::min(endFrame - startFrame, static_cast(frames))); - TimeUnit toTrim = TimeUnit(frames, 48000); - LOG(LogLevel::Debug, - ("Trimming last opus packet: [%s, %s] to [%s, %s]", - data->mTime.ToString().get(), data->GetEndTime().ToString().get(), - data->mTime.ToString().get(), - (data->mTime + data->mDuration - toTrim).ToString().get())); - - data->mOriginalPresentationWindow = - Some(media::TimeInterval{data->mTime, data->mTime + data->mDuration}); - data->mDuration -= toTrim; + data->mDiscardPadding = frames; } // Save this packet's granule position in case we need to perform end @@ -1301,16 +1287,19 @@ bool FlacState::DecodeHeader(OggPacketPtr aPacket) { return true; } -TimeUnit FlacState::Time(int64_t aGranulepos) { +int64_t FlacState::Time(int64_t granulepos) { if (!mParser.mInfo.IsValid()) { - return TimeUnit::Invalid(); + return -1; } - return TimeUnit(aGranulepos, mParser.mInfo.mRate); + CheckedInt64 t = SaferMultDiv(granulepos, USECS_PER_S, mParser.mInfo.mRate); + if (!t.isValid()) { + return -1; + } + return t.value(); } -TimeUnit FlacState::PacketDuration(ogg_packet* aPacket) { - return TimeUnit(mParser.BlockDuration(aPacket->packet, aPacket->bytes), - mParser.mInfo.mRate); +int64_t FlacState::PacketDuration(ogg_packet* aPacket) { + return mParser.BlockDuration(aPacket->packet, aPacket->bytes); } bool FlacState::IsHeader(ogg_packet* aPacket) { @@ -1368,7 +1357,7 @@ bool FlacState::ReconstructFlacGranulepos(void) { // packet's duration from its granulepos to get the value // for the current packet. for (uint32_t i = mUnstamped.Length() - 1; i > 0; i--) { - int64_t offset = + int offset = mParser.BlockDuration(mUnstamped[i]->packet, mUnstamped[i]->bytes); // Check for error (negative offset) and overflow. if (offset >= 0) { @@ -1496,8 +1485,7 @@ bool SkeletonState::DecodeIndex(ogg_packet* aPacket) { int64_t numKeyPoints = LittleEndian::readInt64(aPacket->packet + INDEX_NUM_KEYPOINTS_OFFSET); - TimeUnit endTime = TimeUnit::Zero(); - TimeUnit startTime = TimeUnit::Zero(); + int64_t endTime = 0, startTime = 0; const unsigned char* p = aPacket->packet; int64_t timeDenom = @@ -1511,10 +1499,21 @@ bool SkeletonState::DecodeIndex(ogg_packet* aPacket) { // Extract the start time. int64_t timeRawInt = LittleEndian::readInt64(p + INDEX_FIRST_NUMER_OFFSET); - startTime = TimeUnit(timeRawInt, timeDenom); + CheckedInt64 t = SaferMultDiv(timeRawInt, USECS_PER_S, timeDenom); + if (!t.isValid()) { + return (mActive = false); + } else { + startTime = t.value(); + } + // Extract the end time. timeRawInt = LittleEndian::readInt64(p + INDEX_LAST_NUMER_OFFSET); - endTime = TimeUnit(timeRawInt, timeDenom); + t = SaferMultDiv(timeRawInt, USECS_PER_S, timeDenom); + if (!t.isValid()) { + return (mActive = false); + } else { + endTime = t.value(); + } // Check the numKeyPoints value read, ensure we're not going to run out of // memory while trying to decode the index packet. @@ -1524,10 +1523,8 @@ bool SkeletonState::DecodeIndex(ogg_packet* aPacket) { return (mActive = false); } - int64_t sizeofIndex = - AssertedCast(aPacket->bytes - INDEX_KEYPOINT_OFFSET); - int64_t maxNumKeyPoints = - AssertedCast(sizeofIndex / MIN_KEY_POINT_SIZE); + int64_t sizeofIndex = aPacket->bytes - INDEX_KEYPOINT_OFFSET; + int64_t maxNumKeyPoints = sizeofIndex / MIN_KEY_POINT_SIZE; if (aPacket->bytes < minPacketSize.value() || numKeyPoints > maxNumKeyPoints || numKeyPoints < 0) { // Packet size is less than the theoretical minimum size, or the packet is @@ -1548,7 +1545,7 @@ bool SkeletonState::DecodeIndex(ogg_packet* aPacket) { const unsigned char* limit = aPacket->packet + aPacket->bytes; int64_t numKeyPointsRead = 0; CheckedInt64 offset = 0; - TimeUnit time = TimeUnit::Zero(); + CheckedInt64 time = 0; while (p < limit && numKeyPointsRead < numKeyPoints) { int64_t delta = 0; p = ReadVariableLengthInt(p, limit, delta); @@ -1558,15 +1555,19 @@ bool SkeletonState::DecodeIndex(ogg_packet* aPacket) { return (mActive = false); } p = ReadVariableLengthInt(p, limit, delta); - time += TimeUnit(delta, timeDenom); - if (!time.IsValid() || time > endTime || time < startTime) { + time += delta; + if (!time.isValid() || time.value() > endTime || time.value() < startTime) { return (mActive = false); } - keyPoints->Add(offset.value(), time); + CheckedInt64 timeUsecs = SaferMultDiv(time.value(), USECS_PER_S, timeDenom); + if (!timeUsecs.isValid()) { + return (mActive = false); + } + keyPoints->Add(offset.value(), timeUsecs.value()); numKeyPointsRead++; } - uint32_t keyPointsRead = keyPoints->Length(); + int32_t keyPointsRead = keyPoints->Length(); if (keyPointsRead > 0) { mIndex.InsertOrUpdate(serialno, std::move(keyPoints)); } @@ -1577,7 +1578,7 @@ bool SkeletonState::DecodeIndex(ogg_packet* aPacket) { } nsresult SkeletonState::IndexedSeekTargetForTrack(uint32_t aSerialno, - const TimeUnit& aTarget, + int64_t aTarget, nsKeyPoint& aResult) { nsKeyFrameIndex* index = nullptr; mIndex.Get(aSerialno, &index); @@ -1588,15 +1589,14 @@ nsresult SkeletonState::IndexedSeekTargetForTrack(uint32_t aSerialno, } // Binary search to find the last key point with time less than target. - uint32_t start = 0; - uint32_t end = index->Length() - 1; + int start = 0; + int end = index->Length() - 1; while (end > start) { - uint32_t mid = start + ((end - start + 1) >> 1); + int mid = start + ((end - start + 1) >> 1); if (index->Get(mid).mTime == aTarget) { start = mid; break; - } - if (index->Get(mid).mTime < aTarget) { + } else if (index->Get(mid).mTime < aTarget) { start = mid; } else { end = mid - 1; @@ -1608,7 +1608,7 @@ nsresult SkeletonState::IndexedSeekTargetForTrack(uint32_t aSerialno, return NS_OK; } -nsresult SkeletonState::IndexedSeekTarget(const TimeUnit& aTarget, +nsresult SkeletonState::IndexedSeekTarget(int64_t aTarget, nsTArray& aTracks, nsSeekTarget& aResult) { if (!mActive || mVersion < SKELETON_VERSION(4, 0)) { @@ -1630,20 +1630,21 @@ nsresult SkeletonState::IndexedSeekTarget(const TimeUnit& aTarget, if (r.IsNull()) { return NS_ERROR_FAILURE; } - LOG(LogLevel::Debug, ("Indexed seek target for time %s is offset %" PRId64, - aTarget.ToString().get(), r.mKeyPoint.mOffset)); + LOG(LogLevel::Debug, + ("Indexed seek target for time %" PRId64 " is offset %" PRId64, aTarget, + r.mKeyPoint.mOffset)); aResult = r; return NS_OK; } nsresult SkeletonState::GetDuration(const nsTArray& aTracks, - TimeUnit& aDuration) { + int64_t& aDuration) { if (!mActive || mVersion < SKELETON_VERSION(4, 0) || !HasIndex() || aTracks.Length() == 0) { return NS_ERROR_FAILURE; } - TimeUnit endTime = TimeUnit::FromNegativeInfinity(); - TimeUnit startTime = TimeUnit::FromInfinity(); + int64_t endTime = INT64_MIN; + int64_t startTime = INT64_MAX; for (uint32_t i = 0; i < aTracks.Length(); i++) { nsKeyFrameIndex* index = nullptr; mIndex.Get(aTracks[i], &index); @@ -1659,8 +1660,9 @@ nsresult SkeletonState::GetDuration(const nsTArray& aTracks, } } NS_ASSERTION(endTime > startTime, "Duration must be positive"); - aDuration = endTime - startTime; - return aDuration.IsValid() ? NS_OK : NS_ERROR_FAILURE; + CheckedInt64 duration = CheckedInt64(endTime) - startTime; + aDuration = duration.isValid() ? duration.value() : 0; + return duration.isValid() ? NS_OK : NS_ERROR_FAILURE; } bool SkeletonState::DecodeFisbone(ogg_packet* aPacket) { @@ -1760,10 +1762,9 @@ bool SkeletonState::DecodeHeader(OggPacketPtr aPacket) { aPacket->packet + SKELETON_PRESENTATION_TIME_NUMERATOR_OFFSET); int64_t d = LittleEndian::readInt64( aPacket->packet + SKELETON_PRESENTATION_TIME_DENOMINATOR_OFFSET); - mPresentationTime = d == 0 ? 0 - : AssertedCast(static_cast(n) / - static_cast(d)) * - USECS_PER_S; + mPresentationTime = + d == 0 ? 0 + : (static_cast(n) / static_cast(d)) * USECS_PER_S; mVersion = SKELETON_VERSION(verMajor, verMinor); // We can only care to parse Skeleton version 4.0+. diff --git a/dom/media/ogg/OggCodecState.h b/dom/media/ogg/OggCodecState.h index 4133fd05072e..b8a38578759a 100644 --- a/dom/media/ogg/OggCodecState.h +++ b/dom/media/ogg/OggCodecState.h @@ -3,7 +3,6 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include "Intervals.h" #if !defined(OggCodecState_h_) # define OggCodecState_h_ @@ -17,7 +16,11 @@ # include # include -# include +# ifdef MOZ_TREMOR +# include +# else +# include +# endif // Uncomment the following to validate that we're predicting the number // of Vorbis samples in each packet correctly. @@ -100,7 +103,7 @@ class OggPacketQueue : private nsDeque { // converting granulepos to timestamps. class OggCodecState { public: - using MetadataTags = mozilla::MetadataTags; + typedef mozilla::MetadataTags MetadataTags; // Ogg types we know about enum CodecType { TYPE_VORBIS = 0, @@ -133,39 +136,28 @@ class OggCodecState { // Build a hash table with tag metadata parsed from the stream. virtual UniquePtr GetTags() { return nullptr; } - using TimeUnit = media::TimeUnit; - // Returns the end time that a granulepos represents. - virtual TimeUnit Time(int64_t aGranulepos) { return TimeUnit::Invalid(); } + virtual int64_t Time(int64_t granulepos) { return -1; } // Returns the start time that a granulepos represents. - virtual TimeUnit StartTime(int64_t aGranulepos) { - return TimeUnit::Invalid(); - } + virtual int64_t StartTime(int64_t granulepos) { return -1; } // Returns the duration of the given packet, if it can be determined. - virtual TimeUnit PacketDuration(ogg_packet* aPacket) { - return TimeUnit::Invalid(); - } + virtual int64_t PacketDuration(ogg_packet* aPacket) { return -1; } // Returns the start time of the given packet, if it can be determined. - virtual TimeUnit PacketStartTime(ogg_packet* aPacket) { + virtual int64_t PacketStartTime(ogg_packet* aPacket) { if (aPacket->granulepos < 0) { - return TimeUnit::Invalid(); - } - TimeUnit endTime = Time(aPacket->granulepos); - TimeUnit duration = PacketDuration(aPacket); - // When looping, it's possible to find header packets there because the - // demuxing restarts from the beginning of the stream. Just skip and retry - // with the next packet. - if (!duration.IsValid()) { - return TimeUnit::Invalid(); + return -1; } + int64_t endTime = Time(aPacket->granulepos); + int64_t duration = PacketDuration(aPacket); if (duration > endTime) { // Audio preskip may eat a whole packet or more. - return TimeUnit::Zero(); + return 0; + } else { + return endTime - duration; } - return endTime - duration; } // Initializes the codec state. @@ -231,7 +223,7 @@ class OggCodecState { // Returns the maximum number of microseconds which a keyframe can be offset // from any given interframe.b - virtual TimeUnit MaxKeyframeOffset() { return TimeUnit::Zero(); } + virtual int64_t MaxKeyframeOffset() { return 0; } // Public access for mTheoraInfo.keyframe_granule_shift virtual int32_t KeyFrameGranuleJobs() { return 0; } @@ -313,8 +305,8 @@ class VorbisState : public OggCodecState { CodecType GetType() override { return TYPE_VORBIS; } bool DecodeHeader(OggPacketPtr aPacket) override; - TimeUnit Time(int64_t aGranulepos) override; - TimeUnit PacketDuration(ogg_packet* aPacket) override; + int64_t Time(int64_t granulepos) override; + int64_t PacketDuration(ogg_packet* aPacket) override; bool Init() override; nsresult Reset() override; bool IsHeader(ogg_packet* aPacket) override; @@ -326,14 +318,14 @@ class VorbisState : public OggCodecState { private: AudioInfo mInfo; - vorbis_info mVorbisInfo = {}; - vorbis_comment mComment = {}; - vorbis_dsp_state mDsp = {}; - vorbis_block mBlock = {}; + vorbis_info mVorbisInfo; + vorbis_comment mComment; + vorbis_dsp_state mDsp; + vorbis_block mBlock; OggPacketQueue mHeaders; // Returns the end time that a granulepos represents. - static TimeUnit Time(vorbis_info* aInfo, int64_t aGranulePos); + static int64_t Time(vorbis_info* aInfo, int64_t aGranulePos); // Reconstructs the granulepos of Vorbis packets stored in the mUnstamped // array. @@ -388,26 +380,26 @@ class TheoraState : public OggCodecState { CodecType GetType() override { return TYPE_THEORA; } bool DecodeHeader(OggPacketPtr aPacket) override; - TimeUnit Time(int64_t aGranulepos) override; - TimeUnit StartTime(int64_t aGranulepos) override; - TimeUnit PacketDuration(ogg_packet* aPacket) override; + int64_t Time(int64_t granulepos) override; + int64_t StartTime(int64_t granulepos) override; + int64_t PacketDuration(ogg_packet* aPacket) override; bool Init() override; nsresult Reset() override; bool IsHeader(ogg_packet* aPacket) override; bool IsKeyframe(ogg_packet* aPacket) override; nsresult PageIn(tainted_opaque_ogg aPage) override; const TrackInfo* GetInfo() const override { return &mInfo; } - TimeUnit MaxKeyframeOffset() override; + int64_t MaxKeyframeOffset() override; int32_t KeyFrameGranuleJobs() override { return mTheoraInfo.keyframe_granule_shift; } private: // Returns the end time that a granulepos represents. - static TimeUnit Time(th_info* aInfo, int64_t aGranulePos); + static int64_t Time(th_info* aInfo, int64_t aGranulePos); - th_info mTheoraInfo = {}; - th_comment mComment = {}; + th_info mTheoraInfo; + th_comment mComment; th_setup_info* mSetup; th_dec_ctx* mCtx; @@ -430,8 +422,8 @@ class OpusState : public OggCodecState { CodecType GetType() override { return TYPE_OPUS; } bool DecodeHeader(OggPacketPtr aPacket) override; - TimeUnit Time(int64_t aGranulepos) override; - TimeUnit PacketDuration(ogg_packet* aPacket) override; + int64_t Time(int64_t aGranulepos) override; + int64_t PacketDuration(ogg_packet* aPacket) override; bool Init() override; nsresult Reset() override; nsresult Reset(bool aStart); @@ -441,7 +433,7 @@ class OpusState : public OggCodecState { const TrackInfo* GetInfo() const override { return &mInfo; } // Returns the end time that a granulepos represents. - static TimeUnit Time(int aPreSkip, int64_t aGranulepos); + static int64_t Time(int aPreSkip, int64_t aGranulepos); // Construct and return a table of tags from the metadata header. UniquePtr GetTags() override; @@ -506,7 +498,7 @@ class SkeletonState : public OggCodecState { CodecType GetType() override { return TYPE_SKELETON; } bool DecodeHeader(OggPacketPtr aPacket) override; - TimeUnit Time(int64_t aGranulepos) override { return TimeUnit::Invalid(); } + int64_t Time(int64_t granulepos) override { return -1; } bool IsHeader(ogg_packet* aPacket) override { return true; } // Return true if the given time (in milliseconds) is within @@ -517,18 +509,18 @@ class SkeletonState : public OggCodecState { // and its presentation time. class nsKeyPoint { public: - nsKeyPoint() : mOffset(INT64_MAX), mTime(TimeUnit::Invalid()) {} + nsKeyPoint() : mOffset(INT64_MAX), mTime(INT64_MAX) {} - nsKeyPoint(int64_t aOffset, TimeUnit aTime) + nsKeyPoint(int64_t aOffset, int64_t aTime) : mOffset(aOffset), mTime(aTime) {} // Offset from start of segment/link-in-the-chain in bytes. int64_t mOffset; - // Presentation time - TimeUnit mTime; + // Presentation time in usecs. + int64_t mTime; - bool IsNull() { return mOffset == INT64_MAX && !mTime.IsValid(); } + bool IsNull() { return mOffset == INT64_MAX && mTime == INT64_MAX; } }; // Stores a keyframe's byte-offset, presentation time and the serialno @@ -544,8 +536,7 @@ class SkeletonState : public OggCodecState { // Determines from the seek index the keyframe which you must seek back to // in order to get all keyframes required to render all streams with // serialnos in aTracks, at time aTarget. - nsresult IndexedSeekTarget(const TimeUnit& aTarget, - nsTArray& aTracks, + nsresult IndexedSeekTarget(int64_t aTarget, nsTArray& aTracks, nsSeekTarget& aResult); bool HasIndex() const { return mIndex.Count() > 0; } @@ -554,7 +545,7 @@ class SkeletonState : public OggCodecState { // an index. aTracks must be filled with the serialnos of the active tracks. // The duration is calculated as the greatest end time of all active tracks, // minus the smalled start time of all the active tracks. - nsresult GetDuration(const nsTArray& aTracks, TimeUnit& aDuration); + nsresult GetDuration(const nsTArray& aTracks, int64_t& aDuration); private: // Decodes an index packet. Returns false on failure. @@ -564,8 +555,7 @@ class SkeletonState : public OggCodecState { // Gets the keypoint you must seek to in order to get the keyframe required // to render the stream at time aTarget on stream with serial aSerialno. - nsresult IndexedSeekTargetForTrack(uint32_t aSerialno, - const TimeUnit& aTarget, + nsresult IndexedSeekTargetForTrack(uint32_t aSerialno, int64_t aTarget, nsKeyPoint& aResult); // Version of the decoded skeleton track, as per the SKELETON_VERSION macro. @@ -581,15 +571,15 @@ class SkeletonState : public OggCodecState { // stream. class nsKeyFrameIndex { public: - nsKeyFrameIndex(const TimeUnit& aStartTime, const TimeUnit& aEndTime) + nsKeyFrameIndex(int64_t aStartTime, int64_t aEndTime) : mStartTime(aStartTime), mEndTime(aEndTime) { MOZ_COUNT_CTOR(nsKeyFrameIndex); } MOZ_COUNTED_DTOR(nsKeyFrameIndex) - void Add(int64_t aOffset, const TimeUnit& aTime) { - mKeyPoints.AppendElement(nsKeyPoint(aOffset, aTime)); + void Add(int64_t aOffset, int64_t aTimeMs) { + mKeyPoints.AppendElement(nsKeyPoint(aOffset, aTimeMs)); } const nsKeyPoint& Get(uint32_t aIndex) const { return mKeyPoints[aIndex]; } @@ -597,10 +587,10 @@ class SkeletonState : public OggCodecState { uint32_t Length() const { return mKeyPoints.Length(); } // Presentation time of the first sample in this stream in usecs. - const TimeUnit mStartTime; + const int64_t mStartTime; // End time of the last sample in this stream in usecs. - const TimeUnit mEndTime; + const int64_t mEndTime; private: nsTArray mKeyPoints; @@ -617,8 +607,8 @@ class FlacState : public OggCodecState { CodecType GetType() override { return TYPE_FLAC; } bool DecodeHeader(OggPacketPtr aPacket) override; - TimeUnit Time(int64_t aGranulepos) override; - TimeUnit PacketDuration(ogg_packet* aPacket) override; + int64_t Time(int64_t granulepos) override; + int64_t PacketDuration(ogg_packet* aPacket) override; bool IsHeader(ogg_packet* aPacket) override; nsresult PageIn(tainted_opaque_ogg aPage) override; diff --git a/dom/media/ogg/OggDemuxer.cpp b/dom/media/ogg/OggDemuxer.cpp index 12fc7bfe9f5e..aaa9e8ea1490 100644 --- a/dom/media/ogg/OggDemuxer.cpp +++ b/dom/media/ogg/OggDemuxer.cpp @@ -8,7 +8,6 @@ #include "OggRLBox.h" #include "MediaDataDemuxer.h" #include "OggCodecState.h" -#include "TimeUnits.h" #include "XiphExtradata.h" #include "mozilla/AbstractThread.h" #include "mozilla/Atomics.h" @@ -18,7 +17,6 @@ #include "mozilla/SharedThreadPool.h" #include "mozilla/Telemetry.h" #include "mozilla/TimeStamp.h" -#include "nsDebug.h" #include "nsAutoRef.h" #include "nsError.h" @@ -57,7 +55,7 @@ using media::TimeUnit; // seek target. This is becaue it's usually quicker to just keep downloading // from an exisiting connection than to do another bisection inside that // small range, which would open a new HTTP connetion. -static const TimeUnit OGG_SEEK_FUZZ_USECS = TimeUnit::FromMicroseconds(500000); +static const uint32_t OGG_SEEK_FUZZ_USECS = 500000; // The number of microseconds of "pre-roll" we use for Opus streams. // The specification recommends 80 ms. @@ -188,16 +186,14 @@ bool OggDemuxer::HasVideo() const { return mTheoraState; } bool OggDemuxer::HaveStartTime() const { return mStartTime.isSome(); } -TimeUnit OggDemuxer::StartTime() const { - return mStartTime.refOr(TimeUnit::Zero()); -} +int64_t OggDemuxer::StartTime() const { return mStartTime.refOr(0); } bool OggDemuxer::HaveStartTime(TrackInfo::TrackType aType) { return OggState(aType).mStartTime.isSome(); } -TimeUnit OggDemuxer::StartTime(TrackInfo::TrackType aType) { - return OggState(aType).mStartTime.refOr(TimeUnit::Zero()); +int64_t OggDemuxer::StartTime(TrackInfo::TrackType aType) { + return OggState(aType).mStartTime.refOr(TimeUnit::Zero()).ToMicroseconds(); } RefPtr OggDemuxer::Init() { @@ -386,11 +382,10 @@ void OggDemuxer::SetupTargetSkeleton() { // the end of resource to get it. nsTArray tracks; BuildSerialList(tracks); - TimeUnit duration = TimeUnit::Zero(); + int64_t duration = 0; if (NS_SUCCEEDED(mSkeletonState->GetDuration(tracks, duration))) { - OGG_DEBUG("Got duration from Skeleton index %s", - duration.ToString().get()); - mInfo.mMetadataDuration.emplace(duration); + OGG_DEBUG("Got duration from Skeleton index %" PRId64, duration); + mInfo.mMetadataDuration.emplace(TimeUnit::FromMicroseconds(duration)); } } } @@ -570,10 +565,10 @@ nsresult OggDemuxer::ReadMetadata() { SetupMediaTracksInfo(serials); if (HasAudio() || HasVideo()) { - TimeUnit startTime = TimeUnit::Invalid(); + int64_t startTime = -1; FindStartTime(startTime); - if (startTime.IsValid()) { - OGG_DEBUG("Detected stream start time %s", startTime.ToString().get()); + if (startTime >= 0) { + OGG_DEBUG("Detected stream start time %" PRId64, startTime); mStartTime.emplace(startTime); } @@ -585,14 +580,14 @@ nsresult OggDemuxer::ReadMetadata() { MOZ_ASSERT(length > 0, "Must have a content length to get end time"); - TimeUnit endTime = RangeEndTime(TrackInfo::kAudioTrack, length); + int64_t endTime = RangeEndTime(TrackInfo::kAudioTrack, length); - if (endTime.IsValid()) { - mInfo.mUnadjustedMetadataEndTime.emplace(endTime); - mInfo.mMetadataDuration.emplace(endTime - - mStartTime.refOr(TimeUnit::Zero())); - OGG_DEBUG("Got Ogg duration from seeking to end %s", - endTime.ToString().get()); + if (endTime != -1) { + mInfo.mUnadjustedMetadataEndTime.emplace( + TimeUnit::FromMicroseconds(endTime)); + mInfo.mMetadataDuration.emplace( + TimeUnit::FromMicroseconds(endTime - mStartTime.refOr(0))); + OGG_DEBUG("Got Ogg duration from seeking to end %" PRId64, endTime); } } if (mInfo.mMetadataDuration.isNothing()) { @@ -935,7 +930,7 @@ TimeIntervals OggDemuxer::GetBuffered(TrackInfo::TrackType aType) { // we special-case (startOffset == 0) so that the first // buffered range always appears to be buffered from the media start // time, rather than from the end-time of the first page. - TimeUnit startTime = (startOffset == 0) ? StartTime() : TimeUnit::Invalid(); + int64_t startTime = (startOffset == 0) ? StartTime() : -1; // Find the start time of the range. Read pages until we find one with a // granulepos which we can convert into a timestamp to use as the time of @@ -947,7 +942,7 @@ TimeIntervals OggDemuxer::GetBuffered(TrackInfo::TrackType aType) { } auto clean_page = MakeScopeExit([&] { mSandbox->free_in_sandbox(page); }); - while (!startTime.IsValid()) { + while (startTime == -1) { int32_t discard; PageSyncResult pageSyncResult = PageSync(mSandbox.get(), Resource(aType), sync.mState, true, @@ -986,22 +981,22 @@ TimeIntervals OggDemuxer::GetBuffered(TrackInfo::TrackType aType) { (serial == mVorbisState->mSerial) .unverified_safe_because(time_interval_reason)) { startTime = mVorbisState->Time(granulepos); - MOZ_ASSERT(startTime.IsPositive(), "Must have positive start time"); + MOZ_ASSERT(startTime > 0, "Must have positive start time"); } else if (aType == TrackInfo::kAudioTrack && mOpusState && (serial == mOpusState->mSerial) .unverified_safe_because(time_interval_reason)) { startTime = mOpusState->Time(granulepos); - MOZ_ASSERT(startTime.IsPositive(), "Must have positive start time"); + MOZ_ASSERT(startTime > 0, "Must have positive start time"); } else if (aType == TrackInfo::kAudioTrack && mFlacState && (serial == mFlacState->mSerial) .unverified_safe_because(time_interval_reason)) { startTime = mFlacState->Time(granulepos); - MOZ_ASSERT(startTime.IsPositive(), "Must have positive start time"); + MOZ_ASSERT(startTime > 0, "Must have positive start time"); } else if (aType == TrackInfo::kVideoTrack && mTheoraState && (serial == mTheoraState->mSerial) .unverified_safe_because(time_interval_reason)) { startTime = mTheoraState->Time(granulepos); - MOZ_ASSERT(startTime.IsPositive(), "Must have positive start time"); + MOZ_ASSERT(startTime > 0, "Must have positive start time"); } else if (mCodecStore.Contains( serial.unverified_safe_because(time_interval_reason))) { // Stream is not the theora or vorbis stream we're playing, @@ -1029,13 +1024,14 @@ TimeIntervals OggDemuxer::GetBuffered(TrackInfo::TrackType aType) { } } - if (startTime.IsValid()) { + if (startTime != -1) { // We were able to find a start time for that range, see if we can // find an end time. - TimeUnit endTime = RangeEndTime(aType, startOffset, endOffset, true); - if (endTime.IsValid() && endTime > startTime) { + int64_t endTime = RangeEndTime(aType, startOffset, endOffset, true); + if (endTime > startTime) { buffered += - TimeInterval(startTime - StartTime(), endTime - StartTime()); + TimeInterval(TimeUnit::FromMicroseconds(startTime - StartTime()), + TimeUnit::FromMicroseconds(endTime - StartTime())); } } } @@ -1043,38 +1039,38 @@ TimeIntervals OggDemuxer::GetBuffered(TrackInfo::TrackType aType) { return buffered; } -void OggDemuxer::FindStartTime(TimeUnit& aOutStartTime) { +void OggDemuxer::FindStartTime(int64_t& aOutStartTime) { // Extract the start times of the bitstreams in order to calculate // the duration. - TimeUnit videoStartTime = TimeUnit::FromInfinity(); - TimeUnit audioStartTime = TimeUnit::FromInfinity(); + int64_t videoStartTime = INT64_MAX; + int64_t audioStartTime = INT64_MAX; if (HasVideo()) { FindStartTime(TrackInfo::kVideoTrack, videoStartTime); - if (!videoStartTime.IsPosInf()) { - OGG_DEBUG("OggDemuxer::FindStartTime() video=%s", - videoStartTime.ToString().get()); - mVideoOggState.mStartTime = Some(videoStartTime); + if (videoStartTime != INT64_MAX) { + OGG_DEBUG("OggDemuxer::FindStartTime() video=%" PRId64, videoStartTime); + mVideoOggState.mStartTime = + Some(TimeUnit::FromMicroseconds(videoStartTime)); } } if (HasAudio()) { FindStartTime(TrackInfo::kAudioTrack, audioStartTime); - if (!audioStartTime.IsPosInf()) { - OGG_DEBUG("OggDemuxer::FindStartTime() audio=%s", - audioStartTime.ToString().get()); - mAudioOggState.mStartTime = Some(audioStartTime); + if (audioStartTime != INT64_MAX) { + OGG_DEBUG("OggDemuxer::FindStartTime() audio=%" PRId64, audioStartTime); + mAudioOggState.mStartTime = + Some(TimeUnit::FromMicroseconds(audioStartTime)); } } - TimeUnit startTime = std::min(videoStartTime, audioStartTime); - if (!startTime.IsPosInf()) { + int64_t startTime = std::min(videoStartTime, audioStartTime); + if (startTime != INT64_MAX) { aOutStartTime = startTime; } } void OggDemuxer::FindStartTime(TrackInfo::TrackType aType, - TimeUnit& aOutStartTime) { - TimeUnit startTime = TimeUnit::FromInfinity(); + int64_t& aOutStartTime) { + int64_t startTime = INT64_MAX; OggCodecState* state = GetTrackCodecState(aType); ogg_packet* pkt = GetNextPacket(aType); @@ -1082,21 +1078,22 @@ void OggDemuxer::FindStartTime(TrackInfo::TrackType aType, startTime = state->PacketStartTime(pkt); } - if (!startTime.IsInfinite()) { + if (startTime != INT64_MAX) { aOutStartTime = startTime; } } nsresult OggDemuxer::SeekInternal(TrackInfo::TrackType aType, const TimeUnit& aTarget) { - OGG_DEBUG("About to seek to %s", aTarget.ToString().get()); + int64_t target = aTarget.ToMicroseconds(); + OGG_DEBUG("About to seek to %" PRId64, target); nsresult res; - TimeUnit adjustedTarget = aTarget; - TimeUnit startTime = StartTime(aType); - TimeUnit endTime = - mInfo.mMetadataDuration.valueOr(TimeUnit::Zero()) + startTime; + int64_t adjustedTarget = target; + int64_t startTime = StartTime(aType); + int64_t endTime = mInfo.mMetadataDuration->ToMicroseconds() + startTime; if (aType == TrackInfo::kAudioTrack && mOpusState) { - adjustedTarget = std::max(startTime, aTarget - OGG_SEEK_OPUS_PREROLL); + adjustedTarget = + std::max(startTime, target - OGG_SEEK_OPUS_PREROLL.ToMicroseconds()); } if (!HaveStartTime(aType) || adjustedTarget == startTime) { @@ -1123,19 +1120,19 @@ nsresult OggDemuxer::SeekInternal(TrackInfo::TrackType aType, // Figure out if the seek target lies in a buffered range. SeekRange r = - SelectSeekRange(aType, ranges, aTarget, startTime, endTime, true); + SelectSeekRange(aType, ranges, target, startTime, endTime, true); if (!r.IsNull()) { // We know the buffered range in which the seek target lies, do a // bisection search in that buffered range. - res = SeekInBufferedRange(aType, aTarget, adjustedTarget, startTime, + res = SeekInBufferedRange(aType, target, adjustedTarget, startTime, endTime, ranges, r); NS_ENSURE_SUCCESS(res, res); } else { // The target doesn't lie in a buffered range. Perform a bisection // search over the whole media, using the known buffered ranges to // reduce the search space. - res = SeekInUnbuffered(aType, aTarget, startTime, endTime, ranges); + res = SeekInUnbuffered(aType, target, startTime, endTime, ranges); NS_ENSURE_SUCCESS(res, res); } } @@ -1158,19 +1155,12 @@ nsresult OggDemuxer::SeekInternal(TrackInfo::TrackType aType, OGG_DEBUG("End of stream reached before keyframe found in indexed seek"); break; } - // Skip any header packet, this can be the case when looping and not parsing - // the headers again. - if (state->IsHeader(packet)) { - OggPacketPtr drop(state->PacketOut()); - continue; - } - TimeUnit startTstamp = state->PacketStartTime(packet); + int64_t startTstamp = state->PacketStartTime(packet); if (foundKeyframe && startTstamp > adjustedTarget) { break; } if (state->IsKeyframe(packet)) { - OGG_DEBUG("keyframe found after seeking at %s", - startTstamp.ToString().get()); + OGG_DEBUG("keyframe found after seeking at %" PRId64, startTstamp); tempPackets.Erase(); foundKeyframe = true; } @@ -1201,7 +1191,7 @@ OggDemuxer::IndexedSeekResult OggDemuxer::RollbackIndexedSeek( } OggDemuxer::IndexedSeekResult OggDemuxer::SeekToKeyframeUsingIndex( - TrackInfo::TrackType aType, const TimeUnit& aTarget) { + TrackInfo::TrackType aType, int64_t aTarget) { if (!HasSkeleton() || !mSkeletonState->HasIndex()) { return SEEK_INDEX_FAIL; } @@ -1407,14 +1397,12 @@ RefPtr OggTrackDemuxer::Seek( } RefPtr OggTrackDemuxer::NextSample() { - OGG_DEBUG("OggTrackDemuxer::NextSample"); if (mQueuedSample) { RefPtr nextSample = mQueuedSample; mQueuedSample = nullptr; if (mType == TrackInfo::kAudioTrack) { nextSample->mTrackInfo = mParent->mSharedAudioTrackInfo; } - OGG_DEBUG("OggTrackDemuxer::NextSample (queued)"); return nextSample; } ogg_packet* packet = mParent->GetNextPacket(mType); @@ -1447,41 +1435,6 @@ RefPtr OggTrackDemuxer::NextSample() { if (!data->mTime.IsValid()) { return nullptr; } - TimeUnit mediaStartTime = mParent->mStartTime.valueOr(TimeUnit::Zero()); - TimeUnit mediaEndTime = - mediaStartTime + - mParent->mInfo.mMetadataDuration.valueOr(TimeUnit::FromInfinity()); - // Trim packets that end after the media duration. - if (mType == TrackInfo::kAudioTrack) { - OGG_DEBUG("Check trimming %s > %s", data->GetEndTime().ToString().get(), - mediaEndTime.ToString().get()); - // Because of a quirk of this demuxer, this needs to be >=. It looks - // useless, because `toTrim` is going to be 0, but it allows setting - // `mOriginalPresentationWindow`, so that the trimming logic will later - // remove extraneous frames. - // This demuxer sets the end time of a packet to be the end time that - // should be played, not the end time that corresponds to the number of - // decoded frames, that we can only have after decoding. - // >= allows detecting the last packet, and trimming it appropriately, - // after decoding has happened, with the AudioTrimmer. - if (data->GetEndTime() >= mediaEndTime) { - TimeUnit toTrim = data->GetEndTime() - mediaEndTime; - TimeUnit originalDuration = data->mDuration; - OGG_DEBUG( - "Demuxed past media end time, trimming: packet [%s,%s] to [%s,%s]", - data->mTime.ToString().get(), data->GetEndTime().ToString().get(), - data->mTime.ToString().get(), - (data->mTime + originalDuration).ToString().get()); - data->mOriginalPresentationWindow = - Some(TimeInterval{data->mTime, data->GetEndTime()}); - data->mDuration -= toTrim; - } - } - - OGG_DEBUG("OGG packet demuxed: [%s,%s] (duration: %s, type: %s)", - data->mTime.ToString().get(), data->GetEndTime().ToString().get(), - data->mDuration.ToString().get(), - mType == TrackInfo::kAudioTrack ? "audio" : "video"); return data; } @@ -1580,15 +1533,15 @@ tainted_opaque_ogg OggDemuxer::GetPageChecksum( return ret.to_opaque(); } -TimeUnit OggDemuxer::RangeStartTime(TrackInfo::TrackType aType, - int64_t aOffset) { +int64_t OggDemuxer::RangeStartTime(TrackInfo::TrackType aType, + int64_t aOffset) { int64_t position = Resource(aType)->Tell(); nsresult res = Resource(aType)->Seek(nsISeekableStream::NS_SEEK_SET, aOffset); - NS_ENSURE_SUCCESS(res, TimeUnit::Zero()); - TimeUnit startTime = TimeUnit::Zero(); + NS_ENSURE_SUCCESS(res, 0); + int64_t startTime = 0; FindStartTime(aType, startTime); res = Resource(aType)->Seek(nsISeekableStream::NS_SEEK_SET, position); - NS_ENSURE_SUCCESS(res, TimeUnit::Invalid()); + NS_ENSURE_SUCCESS(res, -1); return startTime; } @@ -1607,19 +1560,19 @@ struct nsDemuxerAutoOggSyncState { tainted_ogg mState; }; -TimeUnit OggDemuxer::RangeEndTime(TrackInfo::TrackType aType, - int64_t aEndOffset) { +int64_t OggDemuxer::RangeEndTime(TrackInfo::TrackType aType, + int64_t aEndOffset) { int64_t position = Resource(aType)->Tell(); - TimeUnit endTime = RangeEndTime(aType, 0, aEndOffset, false); + int64_t endTime = RangeEndTime(aType, 0, aEndOffset, false); nsresult res = Resource(aType)->Seek(nsISeekableStream::NS_SEEK_SET, position); - NS_ENSURE_SUCCESS(res, TimeUnit::Invalid()); + NS_ENSURE_SUCCESS(res, -1); return endTime; } -TimeUnit OggDemuxer::RangeEndTime(TrackInfo::TrackType aType, - int64_t aStartOffset, int64_t aEndOffset, - bool aCachedDataOnly) { +int64_t OggDemuxer::RangeEndTime(TrackInfo::TrackType aType, + int64_t aStartOffset, int64_t aEndOffset, + bool aCachedDataOnly) { nsDemuxerAutoOggSyncState sync(*mSandbox); // We need to find the last page which ends before aEndOffset that @@ -1633,13 +1586,13 @@ TimeUnit OggDemuxer::RangeEndTime(TrackInfo::TrackType aType, int64_t readStartOffset = aEndOffset; int64_t readLimitOffset = aEndOffset; int64_t readHead = aEndOffset; - TimeUnit endTime = TimeUnit::Invalid(); + int64_t endTime = -1; uint32_t checksumAfterSeek = 0; uint32_t prevChecksumAfterSeek = 0; bool mustBackOff = false; tainted_ogg page = mSandbox->malloc_in_sandbox(); if (!page) { - return TimeUnit::Invalid(); + return -1; } auto clean_page = MakeScopeExit([&] { mSandbox->free_in_sandbox(page); }); while (true) { @@ -1656,14 +1609,14 @@ TimeUnit OggDemuxer::RangeEndTime(TrackInfo::TrackType aType, seek_ret, (static_cast(checker = val), checker.isValid()), &failedVerify); if (failedVerify) { - return TimeUnit::Invalid(); + return -1; } if (ret.unverified_safe_because(RLBOX_OGG_STATE_ASSERT_REASON) == 0) { // We need more data if we've not encountered a page we've seen before, // or we've read to the end of file. if (mustBackOff || readHead == aEndOffset || readHead == aStartOffset) { - if (endTime.IsValid() || readStartOffset == 0) { + if (endTime != -1 || readStartOffset == 0) { // We have encountered a page before, or we're at the end of file. break; } @@ -1698,15 +1651,15 @@ TimeUnit OggDemuxer::RangeEndTime(TrackInfo::TrackType aType, if (aCachedDataOnly) { res = Resource(aType)->GetResource()->ReadFromCache(buffer, readHead, bytesToRead); - NS_ENSURE_SUCCESS(res, TimeUnit::Invalid()); + NS_ENSURE_SUCCESS(res, -1); bytesRead = bytesToRead; } else { MOZ_ASSERT(readHead < aEndOffset, "resource pos must be before range end"); res = Resource(aType)->Seek(nsISeekableStream::NS_SEEK_SET, readHead); - NS_ENSURE_SUCCESS(res, TimeUnit::Invalid()); + NS_ENSURE_SUCCESS(res, -1); res = Resource(aType)->Read(buffer, bytesToRead, &bytesRead); - NS_ENSURE_SUCCESS(res, TimeUnit::Invalid()); + NS_ENSURE_SUCCESS(res, -1); } readHead += bytesRead; if (readHead > readLimitOffset) { @@ -1720,11 +1673,11 @@ TimeUnit OggDemuxer::RangeEndTime(TrackInfo::TrackType aType, int wrote_success = CopyAndVerifyOrFail(ret, val == 0 || val == -1, &failedWroteVerify); if (failedWroteVerify) { - return TimeUnit::Invalid(); + return -1; } if (wrote_success != 0) { - endTime = TimeUnit::Invalid(); + endTime = -1; break; } continue; @@ -1774,12 +1727,12 @@ TimeUnit OggDemuxer::RangeEndTime(TrackInfo::TrackType aType, // It's probably from a new "link" in a "chained" ogg. Don't // bother even trying to find a duration... SetChained(); - endTime = TimeUnit::Invalid(); + endTime = -1; break; } - TimeUnit t = codecState->Time(granulepos); - if (t.IsValid()) { + int64_t t = codecState->Time(granulepos); + if (t != -1) { endTime = t; } } @@ -1796,16 +1749,15 @@ nsresult OggDemuxer::GetSeekRanges(TrackInfo::TrackType aType, for (uint32_t index = 0; index < cached.Length(); index++) { auto& range = cached[index]; - TimeUnit startTime = TimeUnit::Invalid(); - TimeUnit endTime = TimeUnit::Invalid(); + int64_t startTime = -1; + int64_t endTime = -1; if (NS_FAILED(Reset(aType))) { return NS_ERROR_FAILURE; } int64_t startOffset = range.mStart; int64_t endOffset = range.mEnd; startTime = RangeStartTime(aType, startOffset); - if (startTime.IsValid() && - ((endTime = RangeEndTime(aType, endOffset)).IsValid())) { + if (startTime != -1 && ((endTime = RangeEndTime(aType, endOffset)) != -1)) { NS_WARNING_ASSERTION(startTime < endTime, "Start time must be before end time"); aRanges.AppendElement( @@ -1820,12 +1772,11 @@ nsresult OggDemuxer::GetSeekRanges(TrackInfo::TrackType aType, OggDemuxer::SeekRange OggDemuxer::SelectSeekRange( TrackInfo::TrackType aType, const nsTArray& ranges, - const TimeUnit& aTarget, const TimeUnit& aStartTime, - const TimeUnit& aEndTime, bool aExact) { + int64_t aTarget, int64_t aStartTime, int64_t aEndTime, bool aExact) { int64_t so = 0; int64_t eo = Resource(aType)->GetLength(); - TimeUnit st = aStartTime; - TimeUnit et = aEndTime; + int64_t st = aStartTime; + int64_t et = aEndTime; for (uint32_t i = 0; i < ranges.Length(); i++) { const SeekRange& r = ranges[i]; if (r.mTimeStart < aTarget) { @@ -1849,18 +1800,17 @@ OggDemuxer::SeekRange OggDemuxer::SelectSeekRange( } nsresult OggDemuxer::SeekInBufferedRange(TrackInfo::TrackType aType, - const TimeUnit& aTarget, - TimeUnit& aAdjustedTarget, - const TimeUnit& aStartTime, - const TimeUnit& aEndTime, + int64_t aTarget, + int64_t aAdjustedTarget, + int64_t aStartTime, int64_t aEndTime, const nsTArray& aRanges, const SeekRange& aRange) { - OGG_DEBUG("Seeking in buffered data to %s using bisection search", - aTarget.ToString().get()); + OGG_DEBUG("Seeking in buffered data to %" PRId64 " using bisection search", + aTarget); if (aType == TrackInfo::kVideoTrack || aAdjustedTarget >= aTarget) { // We know the exact byte range in which the target must lie. It must // be buffered in the media cache. Seek there. - nsresult res = SeekBisection(aType, aTarget, aRange, TimeUnit::Zero()); + nsresult res = SeekBisection(aType, aTarget, aRange, 0); if (NS_FAILED(res) || aType != TrackInfo::kVideoTrack) { return res; } @@ -1875,7 +1825,7 @@ nsresult OggDemuxer::SeekInBufferedRange(TrackInfo::TrackType aType, MOZ_ASSERT(packet->granulepos != -1, "Must have a granulepos"); int shift = mTheoraState->KeyFrameGranuleJobs(); int64_t keyframeGranulepos = (packet->granulepos >> shift) << shift; - TimeUnit keyframeTime = mTheoraState->StartTime(keyframeGranulepos); + int64_t keyframeTime = mTheoraState->StartTime(keyframeGranulepos); SEEK_LOG(LogLevel::Debug, ("Keyframe for %lld is at %lld, seeking back to it", frameTime, keyframeTime)); @@ -1893,12 +1843,11 @@ nsresult OggDemuxer::SeekInBufferedRange(TrackInfo::TrackType aType, } nsresult OggDemuxer::SeekInUnbuffered(TrackInfo::TrackType aType, - const TimeUnit& aTarget, - const TimeUnit& aStartTime, - const TimeUnit& aEndTime, + int64_t aTarget, int64_t aStartTime, + int64_t aEndTime, const nsTArray& aRanges) { - OGG_DEBUG("Seeking in unbuffered data to %s using bisection search", - aTarget.ToString().get()); + OGG_DEBUG("Seeking in unbuffered data to %" PRId64 " using bisection search", + aTarget); // If we've got an active Theora bitstream, determine the maximum possible // time in usecs which a keyframe could be before a given interframe. We @@ -1912,15 +1861,16 @@ nsresult OggDemuxer::SeekInUnbuffered(TrackInfo::TrackType aType, // as the extra decoding causes a noticeable speed hit when all the data // is buffered (compared to just doing a bisection to exactly find the // keyframe). - TimeUnit keyframeOffset = TimeUnit::Zero(); + int64_t keyframeOffsetMs = 0; if (aType == TrackInfo::kVideoTrack && mTheoraState) { - keyframeOffset = mTheoraState->MaxKeyframeOffset(); + keyframeOffsetMs = mTheoraState->MaxKeyframeOffset(); } // Add in the Opus pre-roll if necessary, as well. if (aType == TrackInfo::kAudioTrack && mOpusState) { - keyframeOffset = std::max(keyframeOffset, OGG_SEEK_OPUS_PREROLL); + keyframeOffsetMs = + std::max(keyframeOffsetMs, OGG_SEEK_OPUS_PREROLL.ToMilliseconds()); } - TimeUnit seekTarget = std::max(aStartTime, aTarget - keyframeOffset); + int64_t seekTarget = std::max(aStartTime, aTarget - keyframeOffsetMs); // Minimize the bisection search space using the known timestamps from the // buffered ranges. SeekRange k = @@ -1928,10 +1878,8 @@ nsresult OggDemuxer::SeekInUnbuffered(TrackInfo::TrackType aType, return SeekBisection(aType, seekTarget, k, OGG_SEEK_FUZZ_USECS); } -nsresult OggDemuxer::SeekBisection(TrackInfo::TrackType aType, - const TimeUnit& aTarget, - const SeekRange& aRange, - const TimeUnit& aFuzz) { +nsresult OggDemuxer::SeekBisection(TrackInfo::TrackType aType, int64_t aTarget, + const SeekRange& aRange, uint32_t aFuzz) { nsresult res; if (aTarget <= aRange.mTimeStart) { @@ -1946,15 +1894,13 @@ nsresult OggDemuxer::SeekBisection(TrackInfo::TrackType aType, // Bisection search, find start offset of last page with end time less than // the seek target. ogg_int64_t startOffset = aRange.mOffsetStart; - ogg_int64_t startTime = aRange.mTimeStart.ToMicroseconds(); + ogg_int64_t startTime = aRange.mTimeStart; ogg_int64_t startLength = 0; // Length of the page at startOffset. ogg_int64_t endOffset = aRange.mOffsetEnd; - ogg_int64_t endTime = aRange.mTimeEnd.ToMicroseconds(); + ogg_int64_t endTime = aRange.mTimeEnd; - ogg_int64_t seekTarget = aTarget.ToMicroseconds(); - int64_t seekLowerBound = - std::max(static_cast(0), - aTarget.ToMicroseconds() - aFuzz.ToMicroseconds()); + ogg_int64_t seekTarget = aTarget; + int64_t seekLowerBound = std::max(static_cast(0), aTarget - aFuzz); int hops = 0; DebugOnly previousGuess = -1; int backsteps = 0; @@ -2112,17 +2058,17 @@ nsresult OggDemuxer::SeekBisection(TrackInfo::TrackType aType, if (aType == TrackInfo::kAudioTrack && granulepos > 0 && audioTime == -1) { if (mVorbisState && serial == mVorbisState->mSerial) { - audioTime = mVorbisState->Time(granulepos).ToMicroseconds(); + audioTime = mVorbisState->Time(granulepos); } else if (mOpusState && serial == mOpusState->mSerial) { - audioTime = mOpusState->Time(granulepos).ToMicroseconds(); + audioTime = mOpusState->Time(granulepos); } else if (mFlacState && serial == mFlacState->mSerial) { - audioTime = mFlacState->Time(granulepos).ToMicroseconds(); + audioTime = mFlacState->Time(granulepos); } } if (aType == TrackInfo::kVideoTrack && granulepos > 0 && serial == mTheoraState->mSerial && videoTime == -1) { - videoTime = mTheoraState->Time(granulepos).ToMicroseconds(); + videoTime = mTheoraState->Time(granulepos); } if (pageOffset + pageLength >= endOffset) { @@ -2169,7 +2115,7 @@ nsresult OggDemuxer::SeekBisection(TrackInfo::TrackType aType, // last page before the target, and the first page after the target. SEEK_LOG(LogLevel::Debug, ("Terminating seek at offset=%lld", startOffset)); - MOZ_ASSERT(startTime < aTarget.ToMicroseconds(), + MOZ_ASSERT(startTime < aTarget, "Start time must always be less than target"); res = Resource(aType)->Seek(nsISeekableStream::NS_SEEK_SET, startOffset); NS_ENSURE_SUCCESS(res, res); diff --git a/dom/media/ogg/OggDemuxer.h b/dom/media/ogg/OggDemuxer.h index 03c4dc1b2520..8a65398cf9dd 100644 --- a/dom/media/ogg/OggDemuxer.h +++ b/dom/media/ogg/OggDemuxer.h @@ -54,8 +54,8 @@ class OggDemuxer : public MediaDataDemuxer, tainted_opaque_ogg mState; }; media::TimeIntervals GetBuffered(TrackInfo::TrackType aType); - void FindStartTime(media::TimeUnit& aOutStartTime); - void FindStartTime(TrackInfo::TrackType, media::TimeUnit& aOutStartTime); + void FindStartTime(int64_t& aOutStartTime); + void FindStartTime(TrackInfo::TrackType, int64_t& aOutStartTime); nsresult SeekInternal(TrackInfo::TrackType aType, const media::TimeUnit& aTarget); @@ -68,7 +68,7 @@ class OggDemuxer : public MediaDataDemuxer, SEEK_FATAL_ERROR // Error returned by a stream operation. }; IndexedSeekResult SeekToKeyframeUsingIndex(TrackInfo::TrackType aType, - const media::TimeUnit& aTarget); + int64_t aTarget); // Rolls back a seek-using-index attempt, returning a failure error code. IndexedSeekResult RollbackIndexedSeek(TrackInfo::TrackType aType, @@ -80,36 +80,29 @@ class OggDemuxer : public MediaDataDemuxer, // (because it's cached). class SeekRange { public: - SeekRange() - : mOffsetStart(0), - mOffsetEnd(0), - mTimeStart(media::TimeUnit::Zero()), - mTimeEnd(media::TimeUnit::Zero()) {} + SeekRange() : mOffsetStart(0), mOffsetEnd(0), mTimeStart(0), mTimeEnd(0) {} - SeekRange(int64_t aOffsetStart, int64_t aOffsetEnd, - const media::TimeUnit& aTimeStart, - const media::TimeUnit& aTimeEnd) + SeekRange(int64_t aOffsetStart, int64_t aOffsetEnd, int64_t aTimeStart, + int64_t aTimeEnd) : mOffsetStart(aOffsetStart), mOffsetEnd(aOffsetEnd), mTimeStart(aTimeStart), mTimeEnd(aTimeEnd) {} bool IsNull() const { - return mOffsetStart == 0 && mOffsetEnd == 0 && mTimeStart.IsZero() && - mTimeEnd.IsZero(); + return mOffsetStart == 0 && mOffsetEnd == 0 && mTimeStart == 0 && + mTimeEnd == 0; } int64_t mOffsetStart, mOffsetEnd; // in bytes. - media::TimeUnit mTimeStart, mTimeEnd; + int64_t mTimeStart, mTimeEnd; // in usecs. }; nsresult GetSeekRanges(TrackInfo::TrackType aType, nsTArray& aRanges); SeekRange SelectSeekRange(TrackInfo::TrackType aType, - const nsTArray& ranges, - const media::TimeUnit& aTarget, - const media::TimeUnit& aStartTime, - const media::TimeUnit& aEndTime, bool aExact); + const nsTArray& ranges, int64_t aTarget, + int64_t aStartTime, int64_t aEndTime, bool aExact); // Seeks to aTarget usecs in the buffered range aRange using bisection search, // or to the keyframe prior to aTarget if we have video. aAdjustedTarget is @@ -117,11 +110,9 @@ class OggDemuxer : public MediaDataDemuxer, // necessary. aStartTime must be the presentation time at the start of media, // and aEndTime the time at end of media. aRanges must be the time/byte ranges // buffered in the media cache as per GetSeekRanges(). - nsresult SeekInBufferedRange(TrackInfo::TrackType aType, - const media::TimeUnit& aTarget, - media::TimeUnit& aAdjustedTarget, - const media::TimeUnit& aStartTime, - const media::TimeUnit& aEndTime, + nsresult SeekInBufferedRange(TrackInfo::TrackType aType, int64_t aTarget, + int64_t aAdjustedTarget, int64_t aStartTime, + int64_t aEndTime, const nsTArray& aRanges, const SeekRange& aRange); @@ -131,10 +122,8 @@ class OggDemuxer : public MediaDataDemuxer, // search space. aStartTime must be the presentation time at the start of // media, and aEndTime the time at end of media. aRanges must be the time/byte // ranges buffered in the media cache as per GetSeekRanges(). - nsresult SeekInUnbuffered(TrackInfo::TrackType aType, - const media::TimeUnit& aTarget, - const media::TimeUnit& aStartTime, - const media::TimeUnit& aEndTime, + nsresult SeekInUnbuffered(TrackInfo::TrackType aType, int64_t aTarget, + int64_t aStartTime, int64_t aEndTime, const nsTArray& aRanges); // Performs a seek bisection to move the media stream's read cursor to the @@ -143,9 +132,8 @@ class OggDemuxer : public MediaDataDemuxer, // i.e. it will only read inside of the aRange's start and end offsets. // aFuzz is the number of usecs of leniency we'll allow; we'll terminate the // seek when we land in the range (aTime - aFuzz, aTime) usecs. - nsresult SeekBisection(TrackInfo::TrackType aType, - const media::TimeUnit& aTarget, - const SeekRange& aRange, const media::TimeUnit& aFuzz); + nsresult SeekBisection(TrackInfo::TrackType aType, int64_t aTarget, + const SeekRange& aRange, uint32_t aFuzz); // Chunk size to read when reading Ogg files. Average Ogg page length // is about 4300 bytes, so we read the file in chunks larger than that. @@ -223,7 +211,7 @@ class OggDemuxer : public MediaDataDemuxer, // Get the end time of aEndOffset. This is the playback position we'd reach // after playback finished at aEndOffset. - media::TimeUnit RangeEndTime(TrackInfo::TrackType aType, int64_t aEndOffset); + int64_t RangeEndTime(TrackInfo::TrackType aType, int64_t aEndOffset); // Get the end time of aEndOffset, without reading before aStartOffset. // This is the playback position we'd reach after playback finished at @@ -232,13 +220,13 @@ class OggDemuxer : public MediaDataDemuxer, // regular blocking reads from the media stream. If bool aCachedDataOnly // is true, this can safely be called on the main thread, otherwise it // must be called on the state machine thread. - media::TimeUnit RangeEndTime(TrackInfo::TrackType aType, int64_t aStartOffset, - int64_t aEndOffset, bool aCachedDataOnly); + int64_t RangeEndTime(TrackInfo::TrackType aType, int64_t aStartOffset, + int64_t aEndOffset, bool aCachedDataOnly); // Get the start time of the range beginning at aOffset. This is the start // time of the first aType sample we'd be able to play if we // started playback at aOffset. - media::TimeUnit RangeStartTime(TrackInfo::TrackType aType, int64_t aOffset); + int64_t RangeStartTime(TrackInfo::TrackType aType, int64_t aOffset); // All invocations of libogg functionality from the demuxer is sandboxed using // wasm library sandboxes on supported platforms. These functions that create @@ -301,7 +289,7 @@ class OggDemuxer : public MediaDataDemuxer, OggStateContext mAudioOggState; OggStateContext mVideoOggState; - Maybe mStartTime; + Maybe mStartTime; // Booleans to indicate if we have audio and/or video data bool HasVideo() const; @@ -311,8 +299,8 @@ class OggDemuxer : public MediaDataDemuxer, } bool HaveStartTime() const; bool HaveStartTime(TrackInfo::TrackType aType); - media::TimeUnit StartTime() const; - media::TimeUnit StartTime(TrackInfo::TrackType aType); + int64_t StartTime() const; + int64_t StartTime(TrackInfo::TrackType aType); // The picture region inside Theora frame to be displayed, if we have // a Theora video track. diff --git a/dom/media/ogg/OpusParser.cpp b/dom/media/ogg/OpusParser.cpp index 69389f81724b..918888ea8c8a 100644 --- a/dom/media/ogg/OpusParser.cpp +++ b/dom/media/ogg/OpusParser.cpp @@ -10,9 +10,9 @@ #include "OpusParser.h" #include "VideoUtils.h" -#include +#include "opus/opus.h" extern "C" { -#include +#include "opus/opus_multistream.h" } #include @@ -39,7 +39,7 @@ OpusParser::OpusParser() } bool OpusParser::DecodeHeader(unsigned char* aData, size_t aLength) { - if (aLength < 19 || memcmp(aData, "OpusHead", 8) != 0) { + if (aLength < 19 || memcmp(aData, "OpusHead", 8)) { OPUS_LOG(LogLevel::Debug, ("Invalid Opus file: unrecognized header")); return false; } @@ -143,9 +143,7 @@ bool OpusParser::DecodeHeader(unsigned char* aData, size_t aLength) { } bool OpusParser::DecodeTags(unsigned char* aData, size_t aLength) { - if (aLength < 16 || memcmp(aData, "OpusTags", 8) != 0) { - return false; - } + if (aLength < 16 || memcmp(aData, "OpusTags", 8)) return false; // Copy out the raw comment lines, but only do basic validation // checks against the string packing: too little data, too many diff --git a/dom/media/ogg/OpusParser.h b/dom/media/ogg/OpusParser.h index 10a7ef285fd0..fc2fc5094d15 100644 --- a/dom/media/ogg/OpusParser.h +++ b/dom/media/ogg/OpusParser.h @@ -32,7 +32,7 @@ class OpusParser { int mChannelMapping; // Channel mapping family. int mStreams; // Number of packed streams in each packet. int mCoupledStreams; // Number of packed coupled streams in each packet. - unsigned char mMappingTable[255] = {}; // Channel mapping table. + unsigned char mMappingTable[255]; // Channel mapping table. // Granule position (end sample) of the last decoded Opus packet. This is // used to calculate the amount we should trim from the last packet. diff --git a/dom/media/platforms/agnostic/OpusDecoder.cpp b/dom/media/platforms/agnostic/OpusDecoder.cpp index 130f25ab9f8e..715fa848dc4a 100644 --- a/dom/media/platforms/agnostic/OpusDecoder.cpp +++ b/dom/media/platforms/agnostic/OpusDecoder.cpp @@ -12,12 +12,13 @@ #include "TimeUnits.h" #include "VideoUtils.h" #include "VorbisDecoder.h" // For VorbisLayout +#include "VorbisUtils.h" #include "mozilla/EndianUtils.h" #include "mozilla/PodOperations.h" #include "mozilla/SyncRunnable.h" -#include +#include "opus/opus.h" extern "C" { -#include +#include "opus/opus_multistream.h" } #define OPUS_DEBUG(arg, ...) \ @@ -102,14 +103,14 @@ RefPtr OpusDataDecoder::Init() { mSkip = mOpusParser->mPreSkip; mPaddingDiscarded = false; - if (opusCodecSpecificData.mContainerCodecDelayFrames != - mOpusParser->mPreSkip) { + if (opusCodecSpecificData.mContainerCodecDelayMicroSeconds != + FramesToUsecs(mOpusParser->mPreSkip, mOpusParser->mRate).value()) { NS_WARNING( "Invalid Opus header: container CodecDelay and Opus pre-skip do not " "match!"); } - OPUS_DEBUG("Opus preskip in extradata: %" PRId64 " frames", - opusCodecSpecificData.mContainerCodecDelayFrames); + OPUS_DEBUG("Opus preskip in extradata: %" PRId64 "us", + opusCodecSpecificData.mContainerCodecDelayMicroSeconds); if (mInfo.mRate != (uint32_t)mOpusParser->mRate) { NS_WARNING("Invalid Opus header: container and codec rate do not match!"); @@ -275,6 +276,25 @@ RefPtr OpusDataDecoder::Decode( aSample->mTime.ToSeconds(), aSample->GetEndTime().ToSeconds()); } + if (aSample->mDiscardPadding > 0) { + OPUS_DEBUG("Opus decoder discarding %u of %d frames", + aSample->mDiscardPadding, frames); + // Padding discard is only supposed to happen on the final packet. + // Record the discard so we can return an error if another packet is + // decoded. + if (aSample->mDiscardPadding > uint32_t(frames)) { + // Discarding more than the entire packet is invalid. + OPUS_DEBUG("Opus error, discard padding larger than packet"); + return DecodePromise::CreateAndReject( + MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, + RESULT_DETAIL("Discard padding larger than packet")), + __func__); + } + + mPaddingDiscarded = true; + frames = frames - aSample->mDiscardPadding; + } + // Apply the header gain if one was specified. #ifdef MOZ_SAMPLE_TYPE_FLOAT32 if (mOpusParser->mGain != 1.0f) { diff --git a/dom/media/platforms/agnostic/TheoraDecoder.cpp b/dom/media/platforms/agnostic/TheoraDecoder.cpp index 2b63e9a67bc9..468eda901411 100644 --- a/dom/media/platforms/agnostic/TheoraDecoder.cpp +++ b/dom/media/platforms/agnostic/TheoraDecoder.cpp @@ -7,7 +7,6 @@ #include "TheoraDecoder.h" #include -#include #include "ImageContainer.h" #include "TimeUnits.h" diff --git a/dom/media/platforms/agnostic/TheoraDecoder.h b/dom/media/platforms/agnostic/TheoraDecoder.h index f209bb61ec4d..23e994b667a1 100644 --- a/dom/media/platforms/agnostic/TheoraDecoder.h +++ b/dom/media/platforms/agnostic/TheoraDecoder.h @@ -9,7 +9,8 @@ # include # include "PlatformDecoderModule.h" -# include +# include "ogg/ogg.h" +# include "theora/theoradec.h" namespace mozilla { diff --git a/dom/media/platforms/agnostic/VorbisDecoder.cpp b/dom/media/platforms/agnostic/VorbisDecoder.cpp index fe1498174909..01c0e8dbe534 100644 --- a/dom/media/platforms/agnostic/VorbisDecoder.cpp +++ b/dom/media/platforms/agnostic/VorbisDecoder.cpp @@ -7,6 +7,7 @@ #include "VorbisDecoder.h" #include "VideoUtils.h" +#include "VorbisUtils.h" #include "XiphExtradata.h" #include "mozilla/Logging.h" #include "mozilla/PodOperations.h" @@ -178,7 +179,7 @@ RefPtr VorbisDataDecoder::Decode( LOG(LogLevel::Warning, ("vorbis_synthesis_blockin returned an error")); } - float** pcm = 0; + VorbisPCMValue** pcm = 0; int32_t frames = vorbis_synthesis_pcmout(&mVorbisDsp, &pcm); if (frames == 0) { return DecodePromise::CreateAndResolve(DecodedData(), __func__); @@ -195,9 +196,9 @@ RefPtr VorbisDataDecoder::Decode( MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__), __func__); } for (uint32_t j = 0; j < channels; ++j) { - float* channel = pcm[j]; + VorbisPCMValue* channel = pcm[j]; for (uint32_t i = 0; i < uint32_t(frames); ++i) { - buffer[i * channels + j] = channel[i]; + buffer[i * channels + j] = MOZ_CONVERT_VORBIS_SAMPLE(channel[i]); } } diff --git a/dom/media/platforms/agnostic/VorbisDecoder.h b/dom/media/platforms/agnostic/VorbisDecoder.h index b460fbb6c26a..ce61ccdcad52 100644 --- a/dom/media/platforms/agnostic/VorbisDecoder.h +++ b/dom/media/platforms/agnostic/VorbisDecoder.h @@ -10,7 +10,11 @@ # include "PlatformDecoderModule.h" # include "mozilla/Maybe.h" -# include +# ifdef MOZ_TREMOR +# include "tremor/ivorbiscodec.h" +# else +# include "vorbis/codec.h" +# endif namespace mozilla { diff --git a/dom/media/platforms/android/RemoteDataDecoder.cpp b/dom/media/platforms/android/RemoteDataDecoder.cpp index 3dd7083e5b6e..5233f9ac90b0 100644 --- a/dom/media/platforms/android/RemoteDataDecoder.cpp +++ b/dom/media/platforms/android/RemoteDataDecoder.cpp @@ -248,17 +248,15 @@ class RemoteVideoDecoder final : public RemoteDataDecoder { nsCString GetCodecName() const override { if (mMediaInfoFlag & MediaInfoFlag::VIDEO_H264) { return "h264"_ns; - } - if (mMediaInfoFlag & MediaInfoFlag::VIDEO_VP8) { + } else if (mMediaInfoFlag & MediaInfoFlag::VIDEO_VP8) { return "vp8"_ns; - } - if (mMediaInfoFlag & MediaInfoFlag::VIDEO_VP9) { + } else if (mMediaInfoFlag & MediaInfoFlag::VIDEO_VP9) { return "vp9"_ns; - } - if (mMediaInfoFlag & MediaInfoFlag::VIDEO_AV1) { + } else if (mMediaInfoFlag & MediaInfoFlag::VIDEO_AV1) { return "av1"_ns; + } else { + return "unknown"_ns; } - return "unknown"_ns; } RefPtr Decode( @@ -728,11 +726,8 @@ class RemoteAudioDecoder final : public RemoteDataDecoder { AssertOnThread(); - LOG("ProcessOutput"); - if (ShouldDiscardSample(aSample->Session()) || !aBuffer->IsValid()) { aSample->Dispose(); - LOG("Discarding sample"); return; } @@ -757,44 +752,34 @@ class RemoteAudioDecoder final : public RemoteDataDecoder { if (!ok || (IsSampleTimeSmallerThanFirstDemuxedSampleTime(presentationTimeUs) && !isEOS)) { - LOG("ProcessOutput: decoding error ok[%s], pts[%" PRId64 "], eos[%s]", - ok ? "true" : "false", presentationTimeUs, isEOS ? "true" : "false"); Error(MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__)); return; } if (size > 0) { - const int32_t sampleSize = sizeof(int16_t); - const int32_t numSamples = size / sampleSize; +#ifdef MOZ_SAMPLE_TYPE_S16 + const int32_t numSamples = size / 2; +#else +# error We only support 16-bit integer PCM +#endif - InflatableShortBuffer audio(numSamples); + AlignedAudioBuffer audio(numSamples); if (!audio) { Error(MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__)); - LOG("OOM while allocating temporary output buffer"); return; } + jni::ByteBuffer::LocalRef dest = jni::ByteBuffer::New(audio.get(), size); aBuffer->WriteToByteBuffer(dest, offset, size); - AlignedFloatBuffer converted = audio.Inflate(); - TimeUnit pts = TimeUnit::FromMicroseconds(presentationTimeUs); - - LOG("Decoded: %u frames of %s audio, pts: %s, %d channels, %" PRId32 - " Hz", - numSamples / mOutputChannels, - sampleSize == sizeof(int16_t) ? "int16" : "f32", pts.ToString().get(), - mOutputChannels, mOutputSampleRate); - - RefPtr data = new AudioData( - 0, pts, std::move(converted), mOutputChannels, mOutputSampleRate); + RefPtr data = + new AudioData(0, TimeUnit::FromMicroseconds(presentationTimeUs), + std::move(audio), mOutputChannels, mOutputSampleRate); UpdateOutputStatus(std::move(data)); - } else { - LOG("ProcessOutput but size 0"); } if (isEOS) { - LOG("EOS: drain complete"); DrainComplete(); } } @@ -830,8 +815,6 @@ already_AddRefed RemoteDataDecoder::CreateAudioDecoder( java::sdk::MediaFormat::CreateAudioFormat(config.mMimeType, config.mRate, config.mChannels, &format), nullptr); - // format->SetInteger(java::sdk::MediaFormat::KEY_PCM_ENCODING, - // java::sdk::AudioFormat::ENCODING_PCM_FLOAT); RefPtr decoder = new RemoteAudioDecoder(config, format, aDrmStubId); @@ -910,7 +893,7 @@ RefPtr RemoteDataDecoder::Drain() { } RefPtr RemoteDataDecoder::Shutdown() { - LOG("Shutdown"); + LOG(""); AssertOnThread(); SetState(State::SHUTDOWN); if (mJavaDecoder) { @@ -1084,14 +1067,10 @@ void RemoteDataDecoder::UpdateInputStatus(int64_t aTimestamp, bool aProcessed) { void RemoteDataDecoder::UpdateOutputStatus(RefPtr&& aSample) { AssertOnThread(); if (GetState() == State::SHUTDOWN) { - LOG("Update output status, but decoder has been shut down, dropping the " - "decoded results"); return; } if (IsUsefulData(aSample)) { mDecodedData.AppendElement(std::move(aSample)); - } else { - LOG("Decoded data, but not considered useful"); } ReturnDecodedData(); } diff --git a/dom/media/platforms/apple/AppleATDecoder.cpp b/dom/media/platforms/apple/AppleATDecoder.cpp index ed64b62d6063..13a6be3e3187 100644 --- a/dom/media/platforms/apple/AppleATDecoder.cpp +++ b/dom/media/platforms/apple/AppleATDecoder.cpp @@ -545,8 +545,15 @@ MediaResult AppleATDecoder::SetupDecoder(MediaRawData* aSample) { mOutputFormat.mFormatID = kAudioFormatLinearPCM; mOutputFormat.mSampleRate = inputFormat.mSampleRate; mOutputFormat.mChannelsPerFrame = inputFormat.mChannelsPerFrame; +#if defined(MOZ_SAMPLE_TYPE_FLOAT32) mOutputFormat.mBitsPerChannel = 32; mOutputFormat.mFormatFlags = kLinearPCMFormatFlagIsFloat | 0; +#elif defined(MOZ_SAMPLE_TYPE_S16) + mOutputFormat.mBitsPerChannel = 16; + mOutputFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | 0; +#else +# error Unknown audio sample type +#endif // Set up the decoder so it gives us one sample per frame mOutputFormat.mFramesPerPacket = 1; mOutputFormat.mBytesPerPacket = mOutputFormat.mBytesPerFrame = diff --git a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp index 98310eecd241..b6b3d7687eab 100644 --- a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp +++ b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp @@ -5,16 +5,10 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "FFmpegAudioDecoder.h" -#include "AudioSampleFormat.h" #include "FFmpegLog.h" #include "TimeUnits.h" #include "VideoUtils.h" #include "BufferReader.h" -#include "libavutil/dict.h" -#include "libavutil/samplefmt.h" -#if defined(FFVPX_VERSION) -# include "libavutil/channel_layout.h" -#endif #include "mozilla/StaticPrefs_media.h" #include "mozilla/Telemetry.h" @@ -22,39 +16,56 @@ namespace mozilla { using TimeUnit = media::TimeUnit; -FFmpegAudioDecoder::FFmpegAudioDecoder( - FFmpegLibWrapper* aLib, const CreateDecoderParams& aDecoderParams) - : FFmpegDataDecoder(aLib, GetCodecId(aDecoderParams.AudioConfig().mMimeType, - aDecoderParams.AudioConfig())), - mAudioInfo(aDecoderParams.AudioConfig()) { +FFmpegAudioDecoder::FFmpegAudioDecoder(FFmpegLibWrapper* aLib, + const AudioInfo& aConfig) + : FFmpegDataDecoder(aLib, GetCodecId(aConfig.mMimeType)) { MOZ_COUNT_CTOR(FFmpegAudioDecoder); if (mCodecID == AV_CODEC_ID_AAC && - mAudioInfo.mCodecSpecificConfig.is()) { + aConfig.mCodecSpecificConfig.is()) { const AacCodecSpecificData& aacCodecSpecificData = - mAudioInfo.mCodecSpecificConfig.as(); + aConfig.mCodecSpecificConfig.as(); mExtraData = new MediaByteBuffer; // Ffmpeg expects the DecoderConfigDescriptor blob. mExtraData->AppendElements( *aacCodecSpecificData.mDecoderConfigDescriptorBinaryBlob); - FFMPEG_LOG("FFmpegAudioDecoder ctor (aac)"); + mEncoderDelay = aacCodecSpecificData.mEncoderDelayFrames; + mEncoderPaddingOrTotalFrames = aacCodecSpecificData.mMediaFrameCount; + FFMPEG_LOG("FFmpegAudioDecoder (aac), found encoder delay (%" PRIu32 + ") and total frame count (%" PRIu64 + ") in codec-specific side data", + mEncoderDelay, TotalFrames()); return; } if (mCodecID == AV_CODEC_ID_MP3) { - // Nothing to do - return; + // Downgraded from diagnostic assert due to BMO 1776524 on Android. + MOZ_ASSERT(aConfig.mCodecSpecificConfig.is()); + // Gracefully handle bad data. If don't hit the preceding assert once this + // has been shipped for awhile, we can remove it and make the following code + // non-conditional. + if (aConfig.mCodecSpecificConfig.is()) { + const Mp3CodecSpecificData& mp3CodecSpecificData = + aConfig.mCodecSpecificConfig.as(); + mEncoderDelay = mp3CodecSpecificData.mEncoderDelayFrames; + mEncoderPaddingOrTotalFrames = mp3CodecSpecificData.mEncoderPaddingFrames; + FFMPEG_LOG("FFmpegAudioDecoder (mp3), found encoder delay (%" PRIu32 + ")" + "and padding values (%" PRIu64 ") in codec-specific side-data", + mEncoderDelay, Padding()); + return; + } } if (mCodecID == AV_CODEC_ID_FLAC) { MOZ_DIAGNOSTIC_ASSERT( - mAudioInfo.mCodecSpecificConfig.is()); + aConfig.mCodecSpecificConfig.is()); // Gracefully handle bad data. If don't hit the preceding assert once this // has been shipped for awhile, we can remove it and make the following code // non-conditional. - if (mAudioInfo.mCodecSpecificConfig.is()) { + if (aConfig.mCodecSpecificConfig.is()) { const FlacCodecSpecificData& flacCodecSpecificData = - mAudioInfo.mCodecSpecificConfig.as(); + aConfig.mCodecSpecificConfig.as(); if (flacCodecSpecificData.mStreamInfoBinaryBlob->IsEmpty()) { // Flac files without headers will be missing stream info. In this case // we don't want to feed ffmpeg empty extra data as it will fail, just @@ -69,39 +80,21 @@ FFmpegAudioDecoder::FFmpegAudioDecoder( } } - // Vorbis and Opus are handled by this case. + // Gracefully handle failure to cover all codec specific cases above. Once + // we're confident there is no fall through from these cases above, we should + // remove this code. RefPtr audioCodecSpecificBinaryBlob = - GetAudioCodecSpecificBlob(mAudioInfo.mCodecSpecificConfig); + GetAudioCodecSpecificBlob(aConfig.mCodecSpecificConfig); if (audioCodecSpecificBinaryBlob && audioCodecSpecificBinaryBlob->Length()) { // Use a new MediaByteBuffer as the object will be modified during // initialization. mExtraData = new MediaByteBuffer; mExtraData->AppendElements(*audioCodecSpecificBinaryBlob); } - - if (mCodecID == AV_CODEC_ID_OPUS) { - mDefaultPlaybackDeviceMono = aDecoderParams.mOptions.contains( - CreateDecoderParams::Option::DefaultPlaybackDeviceMono); - } } RefPtr FFmpegAudioDecoder::Init() { - AVDictionary* options = nullptr; - if (mCodecID == AV_CODEC_ID_OPUS) { - // Opus has a special feature for stereo coding where it represent wide - // stereo channels by 180-degree out of phase. This improves quality, but - // needs to be disabled when the output is downmixed to mono. Playback - // number of channels are set in AudioSink, using the same method - // `DecideAudioPlaybackChannels()`, and triggers downmix if needed. - if (mDefaultPlaybackDeviceMono || - DecideAudioPlaybackChannels(mAudioInfo) == 1) { - mLib->av_dict_set(&options, "apply_phase_inv", "false", 0); - } - } - - MediaResult rv = InitDecoder(&options); - - mLib->av_dict_free(&options); + MediaResult rv = InitDecoder(); return NS_SUCCEEDED(rv) ? InitPromise::CreateAndResolve(TrackInfo::kAudioTrack, __func__) @@ -117,22 +110,11 @@ void FFmpegAudioDecoder::InitCodecContext() { // FFmpeg takes this as a suggestion for what format to use for audio samples. // LibAV 0.8 produces rubbish float interleaved samples, request 16 bits // audio. +#ifdef MOZ_SAMPLE_TYPE_S16 + mCodecContext->request_sample_fmt = AV_SAMPLE_FMT_S16; +#else mCodecContext->request_sample_fmt = (mLib->mVersion == 53) ? AV_SAMPLE_FMT_S16 : AV_SAMPLE_FMT_FLT; -#ifdef FFVPX_VERSION - // AudioInfo's layout first 32-bits are bit-per-bit compatible with - // WAVEFORMATEXTENSIBLE and FFmpeg's AVChannel enum. We can cast here. - mCodecContext->ch_layout.nb_channels = - AssertedCast(mAudioInfo.mChannels); - if (mAudioInfo.mChannelMap != AudioConfig::ChannelLayout::UNKNOWN_MAP) { - mLib->av_channel_layout_from_mask( - &mCodecContext->ch_layout, - AssertedCast(mAudioInfo.mChannelMap)); - } else { - mLib->av_channel_layout_default(&mCodecContext->ch_layout, - AssertedCast(mAudioInfo.mChannels)); - } - mCodecContext->sample_rate = AssertedCast(mAudioInfo.mRate); #endif } @@ -144,6 +126,61 @@ static AlignedAudioBuffer CopyAndPackAudio(AVFrame* aFrame, return audio; } +#ifdef MOZ_SAMPLE_TYPE_S16 + if (aFrame->format == AV_SAMPLE_FMT_FLT) { + // Audio data already packed. Need to convert from 32 bits Float to S16 + AudioDataValue* tmp = audio.get(); + float* data = reinterpret_cast(aFrame->data)[0]; + for (uint32_t frame = 0; frame < aNumAFrames; frame++) { + for (uint32_t channel = 0; channel < aNumChannels; channel++) { + *tmp++ = FloatToAudioSample(*data++); + } + } + } else if (aFrame->format == AV_SAMPLE_FMT_FLTP) { + // Planar audio data. Convert it from 32 bits float to S16 + // and pack it into something we can understand. + AudioDataValue* tmp = audio.get(); + float** data = reinterpret_cast(aFrame->data); + for (uint32_t frame = 0; frame < aNumAFrames; frame++) { + for (uint32_t channel = 0; channel < aNumChannels; channel++) { + *tmp++ = FloatToAudioSample(data[channel][frame]); + } + } + } else if (aFrame->format == AV_SAMPLE_FMT_S16) { + // Audio data already packed. No need to do anything other than copy it + // into a buffer we own. + memcpy(audio.get(), aFrame->data[0], + aNumChannels * aNumAFrames * sizeof(AudioDataValue)); + } else if (aFrame->format == AV_SAMPLE_FMT_S16P) { + // Planar audio data. Pack it into something we can understand. + AudioDataValue* tmp = audio.get(); + AudioDataValue** data = reinterpret_cast(aFrame->data); + for (uint32_t frame = 0; frame < aNumAFrames; frame++) { + for (uint32_t channel = 0; channel < aNumChannels; channel++) { + *tmp++ = data[channel][frame]; + } + } + } else if (aFrame->format == AV_SAMPLE_FMT_S32) { + // Audio data already packed. Need to convert from S32 to S16 + AudioDataValue* tmp = audio.get(); + int32_t* data = reinterpret_cast(aFrame->data)[0]; + for (uint32_t frame = 0; frame < aNumAFrames; frame++) { + for (uint32_t channel = 0; channel < aNumChannels; channel++) { + *tmp++ = *data++ / (1U << 16); + } + } + } else if (aFrame->format == AV_SAMPLE_FMT_S32P) { + // Planar audio data. Convert it from S32 to S16 + // and pack it into something we can understand. + AudioDataValue* tmp = audio.get(); + int32_t** data = reinterpret_cast(aFrame->data); + for (uint32_t frame = 0; frame < aNumAFrames; frame++) { + for (uint32_t channel = 0; channel < aNumChannels; channel++) { + *tmp++ = data[channel][frame] / (1U << 16); + } + } + } +#else if (aFrame->format == AV_SAMPLE_FMT_FLT) { // Audio data already packed. No need to do anything other than copy it // into a buffer we own. @@ -196,193 +233,22 @@ static AlignedAudioBuffer CopyAndPackAudio(AVFrame* aFrame, *tmp++ = AudioSampleToFloat(data[channel][frame]); } } - } else if (aFrame->format == AV_SAMPLE_FMT_U8) { - // Interleaved audio data. Convert it from u8 to the expected sample-format - AudioDataValue* tmp = audio.get(); - uint8_t* data = reinterpret_cast(aFrame->data)[0]; - for (uint32_t frame = 0; frame < aNumAFrames; frame++) { - for (uint32_t channel = 0; channel < aNumChannels; channel++) { - *tmp++ = UInt8bitToAudioSample(*data++); - } - } - } else if (aFrame->format == AV_SAMPLE_FMT_U8P) { - // Planar audio data. Convert it from u8 to the expected sample-format - // and pack it into something we can understand. - AudioDataValue* tmp = audio.get(); - uint8_t** data = reinterpret_cast(aFrame->data); - for (uint32_t frame = 0; frame < aNumAFrames; frame++) { - for (uint32_t channel = 0; channel < aNumChannels; channel++) { - *tmp++ = UInt8bitToAudioSample(data[channel][frame]); - } - } } +#endif return audio; } using ChannelLayout = AudioConfig::ChannelLayout; -MediaResult FFmpegAudioDecoder::PostProcessOutput( - bool aDecoded, MediaRawData* aSample, DecodedData& aResults, - bool* aGotFrame, int32_t aSubmitted) { - media::TimeUnit pts = aSample->mTime; - - if (mFrame->format != AV_SAMPLE_FMT_FLT && - mFrame->format != AV_SAMPLE_FMT_FLTP && - mFrame->format != AV_SAMPLE_FMT_S16 && - mFrame->format != AV_SAMPLE_FMT_S16P && - mFrame->format != AV_SAMPLE_FMT_S32 && - mFrame->format != AV_SAMPLE_FMT_S32P && - mFrame->format != AV_SAMPLE_FMT_U8 && - mFrame->format != AV_SAMPLE_FMT_U8P) { - return MediaResult( - NS_ERROR_DOM_MEDIA_DECODE_ERR, - RESULT_DETAIL("FFmpeg audio decoder outputs unsupported audio format")); - } - - if (aSubmitted < 0) { - FFMPEG_LOG("Got %d more frame from packet", mFrame->nb_samples); - } - - FFMPEG_LOG("FFmpegAudioDecoder decoded: [%s,%s] (Duration: %s) [%s]", - aSample->mTime.ToString().get(), - aSample->GetEndTime().ToString().get(), - aSample->mDuration.ToString().get(), - mLib->av_get_sample_fmt_name(mFrame->format)); - - uint32_t numChannels = mCodecContext->channels; - uint32_t samplingRate = mCodecContext->sample_rate; - - AlignedAudioBuffer audio = - CopyAndPackAudio(mFrame, numChannels, mFrame->nb_samples); - if (!audio) { - FFMPEG_LOG("CopyAndPackAudio error (OOM)"); - return MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__); - } - - media::TimeUnit duration = TimeUnit(mFrame->nb_samples, samplingRate); - if (!duration.IsValid()) { - FFMPEG_LOG("Duration isn't valid (%d + %d)", mFrame->nb_samples, - samplingRate); - return MediaResult(NS_ERROR_DOM_MEDIA_OVERFLOW_ERR, - RESULT_DETAIL("Invalid sample duration")); - } - - media::TimeUnit newpts = pts + duration; - if (!newpts.IsValid()) { - FFMPEG_LOG("New pts isn't valid (%lf + %lf)", pts.ToSeconds(), - duration.ToSeconds()); - return MediaResult( - NS_ERROR_DOM_MEDIA_OVERFLOW_ERR, - RESULT_DETAIL("Invalid count of accumulated audio samples")); - } - - RefPtr data = - new AudioData(aSample->mOffset, pts, std::move(audio), numChannels, - samplingRate, mCodecContext->channel_layout); - MOZ_ASSERT(duration == data->mDuration, "must be equal"); - aResults.AppendElement(std::move(data)); - - pts = newpts; - - if (aGotFrame) { - *aGotFrame = true; - } - return NS_OK; +uint64_t FFmpegAudioDecoder::Padding() const { + MOZ_ASSERT(mCodecID == AV_CODEC_ID_MP3); + return mEncoderPaddingOrTotalFrames; } - -#if LIBAVCODEC_VERSION_MAJOR < 59 -MediaResult FFmpegAudioDecoder::DecodeUsingFFmpeg( - AVPacket* aPacket, bool& aDecoded, MediaRawData* aSample, - DecodedData& aResults, bool* aGotFrame) { - int decoded = 0; - int rv = - mLib->avcodec_decode_audio4(mCodecContext, mFrame, &decoded, aPacket); - aDecoded = decoded == 1; - if (rv < 0) { - NS_WARNING("FFmpeg audio decoder error."); - return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR, - RESULT_DETAIL("FFmpeg audio error")); - } - PostProcessOutput(decoded, aSample, aResults, aGotFrame, 0); - return NS_OK; +uint64_t FFmpegAudioDecoder::TotalFrames() const { + MOZ_ASSERT(mCodecID == AV_CODEC_ID_AAC); + return mEncoderPaddingOrTotalFrames; } -#else -# define AVRESULT_OK 0 - -MediaResult FFmpegAudioDecoder::DecodeUsingFFmpeg( - AVPacket* aPacket, bool& aDecoded, MediaRawData* aSample, - DecodedData& aResults, bool* aGotFrame) { - // This in increment whenever avcodec_send_packet succeeds, and decremented - // whenever avcodec_receive_frame succeeds. Because it is possible to have - // multiple AVFrames from a single AVPacket, this number can be negative. - // This is used to ensure that pts and duration are correctly set on the - // resulting audio buffers. - int32_t submitted = 0; - int ret = mLib->avcodec_send_packet(mCodecContext, aPacket); - switch (ret) { - case AVRESULT_OK: - submitted++; - break; - case AVERROR(EAGAIN): - FFMPEG_LOG(" av_codec_send_packet: EAGAIN."); - MOZ_ASSERT(false, "EAGAIN"); - break; - case AVERROR_EOF: - FFMPEG_LOG(" End of stream."); - return MediaResult(NS_ERROR_DOM_MEDIA_END_OF_STREAM, - RESULT_DETAIL("End of stream")); - default: - NS_WARNING("FFmpeg audio decoder error (avcodec_send_packet)."); - return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR, - RESULT_DETAIL("FFmpeg audio error")); - } - - MediaResult rv; - - while (ret == 0) { - aDecoded = false; - ret = mLib->avcodec_receive_frame(mCodecContext, mFrame); - switch (ret) { - case AVRESULT_OK: - aDecoded = true; - submitted--; - if (submitted < 0) { - FFMPEG_LOG("Multiple AVFrame from a single AVPacket"); - } - break; - case AVERROR(EAGAIN): { - // Quirk of the vorbis decoder -- the first packet doesn't return audio. - if (submitted == 1 && mCodecID == AV_CODEC_ID_VORBIS) { - AlignedAudioBuffer buf; - aResults.AppendElement( - new AudioData(0, TimeUnit::Zero(), std::move(buf), - mAudioInfo.mChannels, mAudioInfo.mRate)); - } - FFMPEG_LOG(" EAGAIN (packets submitted: %" PRIu32 ").", submitted); - rv = NS_OK; - break; - } - case AVERROR_EOF: { - FFMPEG_LOG(" End of stream."); - rv = MediaResult(NS_ERROR_DOM_MEDIA_END_OF_STREAM, - RESULT_DETAIL("End of stream")); - break; - } - default: - FFMPEG_LOG(" avcodec_receive_packet error."); - NS_WARNING("FFmpeg audio decoder error (avcodec_receive_packet)."); - rv = MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR, - RESULT_DETAIL("FFmpeg audio error")); - } - if (aDecoded) { - PostProcessOutput(aDecoded, aSample, aResults, aGotFrame, submitted); - } - } - - return NS_OK; -} -#endif MediaResult FFmpegAudioDecoder::DoDecode(MediaRawData* aSample, uint8_t* aData, int aSize, @@ -393,11 +259,6 @@ MediaResult FFmpegAudioDecoder::DoDecode(MediaRawData* aSample, AVPacket packet; mLib->av_init_packet(&packet); - FFMPEG_LOG("FFmpegAudioDecoder::DoDecode: %d bytes, [%s,%s] (Duration: %s)", - aSize, aSample->mTime.ToString().get(), - aSample->GetEndTime().ToString().get(), - aSample->mDuration.ToString().get()); - packet.data = const_cast(aData); packet.size = aSize; @@ -412,14 +273,121 @@ MediaResult FFmpegAudioDecoder::DoDecode(MediaRawData* aSample, RESULT_DETAIL("FFmpeg audio decoder failed to allocate frame")); } - bool decoded = false; - auto rv = DecodeUsingFFmpeg(&packet, decoded, aSample, aResults, aGotFrame); - NS_ENSURE_SUCCESS(rv, rv); + int64_t samplePosition = aSample->mOffset; + + while (packet.size > 0) { + int decoded = false; + int bytesConsumed = -1; +#if LIBAVCODEC_VERSION_MAJOR < 59 + bytesConsumed = + mLib->avcodec_decode_audio4(mCodecContext, mFrame, &decoded, &packet); + if (bytesConsumed < 0) { + NS_WARNING("FFmpeg audio decoder error."); + return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR, + RESULT_DETAIL("FFmpeg audio error:%d", bytesConsumed)); + } +#else +# define AVRESULT_OK 0 + int ret = mLib->avcodec_send_packet(mCodecContext, &packet); + switch (ret) { + case AVRESULT_OK: + bytesConsumed = packet.size; + break; + case AVERROR(EAGAIN): + break; + case AVERROR_EOF: + FFMPEG_LOG(" End of stream."); + return MediaResult(NS_ERROR_DOM_MEDIA_END_OF_STREAM, + RESULT_DETAIL("End of stream")); + default: + NS_WARNING("FFmpeg audio decoder error."); + return MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR, + RESULT_DETAIL("FFmpeg audio error")); + } + + ret = mLib->avcodec_receive_frame(mCodecContext, mFrame); + switch (ret) { + case AVRESULT_OK: + decoded = true; + break; + case AVERROR(EAGAIN): + break; + case AVERROR_EOF: { + FFMPEG_LOG(" End of stream."); + return MediaResult(NS_ERROR_DOM_MEDIA_END_OF_STREAM, + RESULT_DETAIL("End of stream")); + } + } +#endif + + if (decoded) { + if (mFrame->format != AV_SAMPLE_FMT_FLT && + mFrame->format != AV_SAMPLE_FMT_FLTP && + mFrame->format != AV_SAMPLE_FMT_S16 && + mFrame->format != AV_SAMPLE_FMT_S16P && + mFrame->format != AV_SAMPLE_FMT_S32 && + mFrame->format != AV_SAMPLE_FMT_S32P) { + return MediaResult( + NS_ERROR_DOM_MEDIA_DECODE_ERR, + RESULT_DETAIL( + "FFmpeg audio decoder outputs unsupported audio format")); + } + uint32_t numChannels = mCodecContext->channels; + uint32_t samplingRate = mCodecContext->sample_rate; + + AlignedAudioBuffer audio = + CopyAndPackAudio(mFrame, numChannels, mFrame->nb_samples); + if (!audio) { + FFMPEG_LOG("FFmpegAudioDecoder: OOM"); + return MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__); + } + + FFMPEG_LOG("Packet decoded: [%s, %s] (%" PRId64 "us, %d frames)", + aSample->mTime.ToString().get(), + aSample->GetEndTime().ToString().get(), + aSample->mDuration.ToMicroseconds(), mFrame->nb_samples); + + media::TimeUnit duration = TimeUnit(mFrame->nb_samples, samplingRate); + if (!duration.IsValid()) { + FFMPEG_LOG("FFmpegAudioDecoder: invalid duration"); + return MediaResult(NS_ERROR_DOM_MEDIA_OVERFLOW_ERR, + RESULT_DETAIL("Invalid sample duration")); + } + + media::TimeUnit pts = aSample->mTime; + media::TimeUnit newpts = pts + duration; + if (!newpts.IsValid()) { + FFMPEG_LOG("FFmpegAudioDecoder: invalid PTS."); + return MediaResult( + NS_ERROR_DOM_MEDIA_OVERFLOW_ERR, + RESULT_DETAIL("Invalid count of accumulated audio samples")); + } + + RefPtr data = + new AudioData(samplePosition, pts, std::move(audio), numChannels, + samplingRate, mCodecContext->channel_layout); + MOZ_ASSERT(duration == data->mDuration, "must be equal"); + aResults.AppendElement(std::move(data)); + + pts = newpts; + + if (aGotFrame) { + *aGotFrame = true; + } + } + // The packet wasn't sent to ffmpeg, another attempt will happen next + // iteration. + if (bytesConsumed != -1) { + packet.data += bytesConsumed; + packet.size -= bytesConsumed; + samplePosition += bytesConsumed; + } + } return NS_OK; } -AVCodecID FFmpegAudioDecoder::GetCodecId(const nsACString& aMimeType, - const AudioInfo& aInfo) { +AVCodecID FFmpegAudioDecoder::GetCodecId( + const nsACString& aMimeType) { if (aMimeType.EqualsLiteral("audio/mpeg")) { #ifdef FFVPX_VERSION if (!StaticPrefs::media_ffvpx_mp3_enabled()) { @@ -434,65 +402,6 @@ AVCodecID FFmpegAudioDecoder::GetCodecId(const nsACString& aMimeType, if (aMimeType.EqualsLiteral("audio/mp4a-latm")) { return AV_CODEC_ID_AAC; } - if (aMimeType.EqualsLiteral("audio/vorbis")) { -#ifdef FFVPX_VERSION - if (!StaticPrefs::media_ffvpx_vorbis_enabled()) { - return AV_CODEC_ID_NONE; - } -#endif - return AV_CODEC_ID_VORBIS; - } -#ifdef FFVPX_VERSION - if (aMimeType.EqualsLiteral("audio/opus")) { - if (!StaticPrefs::media_ffvpx_opus_enabled()) { - return AV_CODEC_ID_NONE; - } - return AV_CODEC_ID_OPUS; - } -#endif -#ifdef FFVPX_VERSION - if (aMimeType.Find("wav") != kNotFound) { - if (!StaticPrefs::media_ffvpx_wav_enabled()) { - return AV_CODEC_ID_NONE; - } - if (aMimeType.EqualsLiteral("audio/x-wav") || - aMimeType.EqualsLiteral("audio/wave; codecs=1") || - aMimeType.EqualsLiteral("audio/wave; codecs=65534")) { - // find the pcm format - switch (aInfo.mBitDepth) { - case 8: - return AV_CODEC_ID_PCM_U8; - case 16: - return AV_CODEC_ID_PCM_S16LE; - case 24: - return AV_CODEC_ID_PCM_S24LE; - case 32: - return AV_CODEC_ID_PCM_S32LE; - case 0: - // ::Init will find and use the right type here, this is just - // returning something that means that this media type can be decoded. - // This happens when attempting to find what decoder to use for a - // media type, without actually having looked at the actual - // bytestream. This decoder can decode all usual PCM bytestream - // anyway. - return AV_CODEC_ID_PCM_S16LE; - default: - return AV_CODEC_ID_NONE; - }; - } - if (aMimeType.EqualsLiteral("audio/wave; codecs=3")) { - return AV_CODEC_ID_PCM_F32LE; - } - // A-law - if (aMimeType.EqualsLiteral("audio/wave; codecs=6")) { - return AV_CODEC_ID_PCM_MULAW; - } - // Mu-law - if (aMimeType.EqualsLiteral("audio/wave; codecs=7")) { - return AV_CODEC_ID_PCM_MULAW; - } - } -#endif return AV_CODEC_ID_NONE; } diff --git a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.h b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.h index a86fb72edd08..63f7f463b265 100644 --- a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.h +++ b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.h @@ -25,14 +25,12 @@ class FFmpegAudioDecoder : public FFmpegDataDecoder, public DecoderDoctorLifeLogger> { public: - FFmpegAudioDecoder(FFmpegLibWrapper* aLib, - const CreateDecoderParams& aDecoderParams); + FFmpegAudioDecoder(FFmpegLibWrapper* aLib, const AudioInfo& aConfig); virtual ~FFmpegAudioDecoder(); RefPtr Init() override; void InitCodecContext() MOZ_REQUIRES(sMutex) override; - static AVCodecID GetCodecId(const nsACString& aMimeType, - const AudioInfo& aInfo); + static AVCodecID GetCodecId(const nsACString& aMimeType); nsCString GetDescriptionName() const override { #ifdef USING_MOZFFVPX return "ffvpx audio decoder"_ns; @@ -45,15 +43,21 @@ class FFmpegAudioDecoder private: MediaResult DoDecode(MediaRawData* aSample, uint8_t* aData, int aSize, bool* aGotFrame, DecodedData& aResults) override; - MediaResult DecodeUsingFFmpeg(AVPacket* aPacket, bool& aDecoded, - MediaRawData* aSample, DecodedData& aResults, - bool* aGotFrame); - MediaResult PostProcessOutput(bool aDecoded, MediaRawData* aSample, - DecodedData& aResults, bool* aGotFrame, - int32_t aSubmitted); - const AudioInfo mAudioInfo; - // True if the audio will be downmixed and rendered in mono. - bool mDefaultPlaybackDeviceMono; + // This method is to be called only when decoding mp3, in order to correctly + // discard padding frames. + uint64_t Padding() const; + // This method is to be called only when decoding AAC, in order to correctly + // discard padding frames, based on the number of frames decoded and the total + // frame count of the media. + uint64_t TotalFrames() const; + // The number of frames of encoder delay, that need to be discarded at the + // beginning of the stream. + uint32_t mEncoderDelay = 0; + // This holds either the encoder padding (when this decoder decodes mp3), or + // the total frame count of the media (when this decoder decodes AAC). + // It is best accessed via the `Padding` and `TotalFrames` methods, for + // clarity. + uint64_t mEncoderPaddingOrTotalFrames = 0; }; } // namespace mozilla diff --git a/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp index 3443af555233..c9dafba40caa 100644 --- a/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp +++ b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp @@ -5,7 +5,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include -#include "libavutil/dict.h" #ifdef __GNUC__ # include #endif @@ -73,7 +72,7 @@ MediaResult FFmpegDataDecoder::AllocateExtraData() { // Note: This doesn't run on the ffmpeg TaskQueue, it runs on some other media // taskqueue -MediaResult FFmpegDataDecoder::InitDecoder(AVDictionary** aOptions) { +MediaResult FFmpegDataDecoder::InitDecoder() { FFMPEG_LOG("Initialising FFmpeg decoder"); AVCodec* codec = FindAVCodec(mLib, mCodecID); @@ -125,10 +124,7 @@ MediaResult FFmpegDataDecoder::InitDecoder(AVDictionary** aOptions) { } #endif - if (mLib->avcodec_open2(mCodecContext, codec, aOptions) < 0) { - if (mCodecContext->extradata) { - mLib->av_freep(&mCodecContext->extradata); - } + if (mLib->avcodec_open2(mCodecContext, codec, nullptr) < 0) { mLib->av_freep(&mCodecContext); FFMPEG_LOG(" Couldn't open avcodec"); return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, @@ -221,7 +217,6 @@ RefPtr FFmpegDataDecoder::Drain() { RefPtr FFmpegDataDecoder::ProcessDrain() { MOZ_ASSERT(mTaskQueue->IsOnCurrentThread()); - FFMPEG_LOG("FFmpegDataDecoder: draining buffers"); RefPtr empty(new MediaRawData()); empty->mTimecode = mLastInputDts; bool gotFrame = false; diff --git a/dom/media/platforms/ffmpeg/FFmpegDataDecoder.h b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.h index 732b4bf777a2..e68588157b34 100644 --- a/dom/media/platforms/ffmpeg/FFmpegDataDecoder.h +++ b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.h @@ -51,7 +51,7 @@ class FFmpegDataDecoder virtual void ProcessShutdown(); virtual void InitCodecContext() MOZ_REQUIRES(sMutex) {} AVFrame* PrepareFrame(); - MediaResult InitDecoder(AVDictionary** aOptions); + MediaResult InitDecoder(); MediaResult AllocateExtraData(); MediaResult DoDecode(MediaRawData* aSample, bool* aGotFrame, DecodedData& aResults); diff --git a/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h b/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h index ed61fc6fc587..3b1a5b673abf 100644 --- a/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h +++ b/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h @@ -52,7 +52,8 @@ class FFmpegDecoderModule : public PlatformDecoderModule { media::DecodeSupport::Unsupported) { return nullptr; } - RefPtr decoder = new FFmpegAudioDecoder(mLib, aParams); + RefPtr decoder = + new FFmpegAudioDecoder(mLib, aParams.AudioConfig()); return decoder.forget(); } @@ -89,9 +90,7 @@ class FFmpegDecoderModule : public PlatformDecoderModule { } AVCodecID videoCodec = FFmpegVideoDecoder::GetCodecId(mimeType); - AVCodecID audioCodec = FFmpegAudioDecoder::GetCodecId( - mimeType, - trackInfo.GetAsAudioInfo() ? *trackInfo.GetAsAudioInfo() : AudioInfo()); + AVCodecID audioCodec = FFmpegAudioDecoder::GetCodecId(mimeType); if (audioCodec == AV_CODEC_ID_NONE && videoCodec == AV_CODEC_ID_NONE) { MOZ_LOG(sPDMLog, LogLevel::Debug, ("FFmpeg decoder rejects requested type '%s'", diff --git a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp index f2cbe0f425d1..c5e1d5244fce 100644 --- a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp +++ b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp @@ -117,12 +117,12 @@ FFmpegLibWrapper::LinkResult FFmpegLibWrapper::Link() { #define AV_FUNC_OPTION_SILENT(func, ver) \ if ((ver)&version) { \ - if (!((func) = (decltype(func))PR_FindSymbol( \ + if (!(func = (decltype(func))PR_FindSymbol( \ ((ver)&AV_FUNC_AVUTIL_MASK) ? mAVUtilLib : mAVCodecLib, \ #func))) { \ } \ } else { \ - (func) = (decltype(func))nullptr; \ + func = (decltype(func))nullptr; \ } #define AV_FUNC_OPTION(func, ver) \ @@ -133,7 +133,7 @@ FFmpegLibWrapper::LinkResult FFmpegLibWrapper::Link() { #define AV_FUNC(func, ver) \ AV_FUNC_OPTION(func, ver) \ - if ((ver)&version && !(func)) { \ + if ((ver)&version && !func) { \ Unlink(); \ return isFFMpeg ? LinkResult::MissingFFMpegFunction \ : LinkResult::MissingLibAVFunction; \ @@ -182,8 +182,6 @@ FFmpegLibWrapper::LinkResult FFmpegLibWrapper::Link() { AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60)) AV_FUNC(av_image_check_size, AV_FUNC_AVUTIL_ALL) AV_FUNC(av_image_get_buffer_size, AV_FUNC_AVUTIL_ALL) - AV_FUNC_OPTION(av_channel_layout_default, AV_FUNC_AVUTIL_60) - AV_FUNC_OPTION(av_channel_layout_from_mask, AV_FUNC_AVUTIL_60) AV_FUNC_OPTION(av_buffer_get_opaque, (AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57 | AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60)) @@ -201,11 +199,6 @@ FFmpegLibWrapper::LinkResult FFmpegLibWrapper::Link() { AV_FUNC(avcodec_descriptor_get, AV_FUNC_53 | AV_FUNC_55 | AV_FUNC_56 | AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60) - AV_FUNC(av_get_sample_fmt_name, AV_FUNC_AVUTIL_ALL); - AV_FUNC(av_dict_set, AV_FUNC_AVUTIL_57 | AV_FUNC_AVUTIL_58 | - AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60) - AV_FUNC(av_dict_free, AV_FUNC_AVUTIL_57 | AV_FUNC_AVUTIL_58 | - AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60) #ifdef MOZ_WIDGET_GTK AV_FUNC_OPTION_SILENT(avcodec_get_hw_config, @@ -233,8 +226,9 @@ FFmpegLibWrapper::LinkResult FFmpegLibWrapper::Link() { AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60) AV_FUNC_OPTION_SILENT(av_hwframe_ctx_alloc, AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60) - AV_FUNC_OPTION_SILENT(avcodec_get_name, - AV_FUNC_57 | AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60) + AV_FUNC_OPTION_SILENT(av_dict_set, AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60) + AV_FUNC_OPTION_SILENT(av_dict_free, AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60) + AV_FUNC_OPTION_SILENT(avcodec_get_name, AV_FUNC_58 | AV_FUNC_59 | AV_FUNC_60) AV_FUNC_OPTION_SILENT(av_get_pix_fmt_string, AV_FUNC_AVUTIL_58 | AV_FUNC_AVUTIL_59 | AV_FUNC_AVUTIL_60) @@ -243,9 +237,9 @@ FFmpegLibWrapper::LinkResult FFmpegLibWrapper::Link() { #undef AV_FUNC_OPTION #ifdef MOZ_WIDGET_GTK -# define VA_FUNC_OPTION_SILENT(func) \ - if (!((func) = (decltype(func))PR_FindSymbol(mVALib, #func))) { \ - (func) = (decltype(func))nullptr; \ +# define VA_FUNC_OPTION_SILENT(func) \ + if (!(func = (decltype(func))PR_FindSymbol(mVALib, #func))) { \ + func = (decltype(func))nullptr; \ } // mVALib is optional and may not be present. @@ -257,9 +251,9 @@ FFmpegLibWrapper::LinkResult FFmpegLibWrapper::Link() { } # undef VA_FUNC_OPTION_SILENT -# define VAD_FUNC_OPTION_SILENT(func) \ - if (!((func) = (decltype(func))PR_FindSymbol(mVALibDrm, #func))) { \ - FFMPEG_LOG("Couldn't load function " #func); \ +# define VAD_FUNC_OPTION_SILENT(func) \ + if (!(func = (decltype(func))PR_FindSymbol(mVALibDrm, #func))) { \ + FFMPEG_LOG("Couldn't load function " #func); \ } // mVALibDrm is optional and may not be present. @@ -343,7 +337,7 @@ void FFmpegLibWrapper::LinkVAAPILibs() { #ifdef MOZ_WIDGET_GTK bool FFmpegLibWrapper::IsVAAPIAvailable() { -# define VA_FUNC_LOADED(func) ((func) != nullptr) +# define VA_FUNC_LOADED(func) (func != nullptr) return VA_FUNC_LOADED(avcodec_get_hw_config) && VA_FUNC_LOADED(av_hwdevice_ctx_alloc) && VA_FUNC_LOADED(av_hwdevice_ctx_init) && diff --git a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h index cbde46d8fe4f..957cac0c79ba 100644 --- a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h +++ b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.h @@ -17,7 +17,6 @@ struct AVPacket; struct AVDictionary; struct AVCodecParserContext; struct PRLibrary; -struct AVChannelLayout; #ifdef MOZ_WIDGET_GTK struct AVCodecHWConfig; struct AVVAAPIHWConfig; @@ -123,14 +122,6 @@ struct MOZ_ONLY_USED_TO_AVOID_STATIC_CONSTRUCTORS FFmpegLibWrapper { void* log_ctx); int (*av_image_get_buffer_size)(int pix_fmt, int width, int height, int align); - const char* (*av_get_sample_fmt_name)(int sample_fmt); - void (*av_channel_layout_default)(AVChannelLayout* ch_layout, - int nb_channels); - void (*av_channel_layout_from_mask)(AVChannelLayout* ch_layout, - uint64_t mask); - int (*av_dict_set)(AVDictionary** pm, const char* key, const char* value, - int flags); - void (*av_dict_free)(AVDictionary** m); // libavutil v55 and later only AVFrame* (*av_frame_alloc)(); @@ -164,6 +155,9 @@ struct MOZ_ONLY_USED_TO_AVOID_STATIC_CONSTRUCTORS FFmpegLibWrapper { int (*av_hwdevice_ctx_create_derived)(AVBufferRef** dst_ctx, int type, AVBufferRef* src_ctx, int flags); AVBufferRef* (*av_hwframe_ctx_alloc)(AVBufferRef* device_ctx); + int (*av_dict_set)(AVDictionary** pm, const char* key, const char* value, + int flags); + void (*av_dict_free)(AVDictionary** m); const char* (*avcodec_get_name)(int id); char* (*av_get_pix_fmt_string)(char* buf, int buf_size, int pix_fmt); diff --git a/dom/media/platforms/ffmpeg/FFmpegLibs.h b/dom/media/platforms/ffmpeg/FFmpegLibs.h index 6fd55c4360d8..1c185cb95d90 100644 --- a/dom/media/platforms/ffmpeg/FFmpegLibs.h +++ b/dom/media/platforms/ffmpeg/FFmpegLibs.h @@ -28,13 +28,9 @@ extern "C" { #endif // LIBAVCODEC_VERSION_MAJOR >= 58 #if LIBAVCODEC_VERSION_MAJOR < 55 -// This value is not defined in older version of libavcodec -# define CODEC_ID_OPUS 86076 # define AV_CODEC_ID_VP6F CODEC_ID_VP6F # define AV_CODEC_ID_H264 CODEC_ID_H264 # define AV_CODEC_ID_AAC CODEC_ID_AAC -# define AV_CODEC_ID_VORBIS CODEC_ID_VORBIS -# define AV_CODEC_ID_OPUS CODEC_ID_OPUS # define AV_CODEC_ID_MP3 CODEC_ID_MP3 # define AV_CODEC_ID_VP8 CODEC_ID_VP8 # define AV_CODEC_ID_NONE CODEC_ID_NONE diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp index 749a27ee5e22..05c6281daea4 100644 --- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp +++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp @@ -588,7 +588,7 @@ RefPtr FFmpegVideoDecoder::Init() { } #endif // MOZ_WAYLAND_USE_HWDECODE - rv = InitDecoder(nullptr); + rv = InitDecoder(); if (NS_SUCCEEDED(rv)) { return InitPromise::CreateAndResolve(TrackInfo::kVideoTrack, __func__); } diff --git a/dom/media/platforms/wrappers/AudioTrimmer.cpp b/dom/media/platforms/wrappers/AudioTrimmer.cpp index f23e6868464d..8ed466001b13 100644 --- a/dom/media/platforms/wrappers/AudioTrimmer.cpp +++ b/dom/media/platforms/wrappers/AudioTrimmer.cpp @@ -28,13 +28,13 @@ RefPtr AudioTrimmer::Decode( MediaRawData* aSample) { MOZ_ASSERT(mThread->IsOnCurrentThread(), "We're not on the thread we were first initialized on"); - LOG("AudioTrimmer::Decode"); - PrepareTrimmers(aSample); + RefPtr sample = aSample; + PrepareTrimmers(sample); RefPtr self = this; - RefPtr p = mDecoder->Decode(aSample)->Then( + RefPtr p = mDecoder->Decode(sample)->Then( GetCurrentSerialEventTarget(), __func__, - [self](DecodePromise::ResolveOrRejectValue&& aValue) { - return self->HandleDecodedResult(std::move(aValue)); + [self, sample](DecodePromise::ResolveOrRejectValue&& aValue) { + return self->HandleDecodedResult(std::move(aValue), sample); }); return p; } @@ -42,7 +42,6 @@ RefPtr AudioTrimmer::Decode( RefPtr AudioTrimmer::Flush() { MOZ_ASSERT(mThread->IsOnCurrentThread(), "We're not on the thread we were first initialized on"); - LOG("Flushing"); RefPtr p = mDecoder->Flush(); mTrimmers.Clear(); return p; @@ -55,7 +54,7 @@ RefPtr AudioTrimmer::Drain() { RefPtr p = mDecoder->Drain()->Then( GetCurrentSerialEventTarget(), __func__, [self = RefPtr{this}](DecodePromise::ResolveOrRejectValue&& aValue) { - return self->HandleDecodedResult(std::move(aValue)); + return self->HandleDecodedResult(std::move(aValue), nullptr); }); return p; } @@ -95,37 +94,32 @@ MediaDataDecoder::ConversionRequired AudioTrimmer::NeedsConversion() const { } RefPtr AudioTrimmer::HandleDecodedResult( - DecodePromise::ResolveOrRejectValue&& aValue) { + DecodePromise::ResolveOrRejectValue&& aValue, MediaRawData* aRaw) { MOZ_ASSERT(mThread->IsOnCurrentThread(), "We're not on the thread we were first initialized on"); if (aValue.IsReject()) { return DecodePromise::CreateAndReject(std::move(aValue.RejectValue()), __func__); } + TimeUnit rawStart = aRaw ? aRaw->mTime : TimeUnit::Zero(); + TimeUnit rawEnd = aRaw ? aRaw->GetEndTime() : TimeUnit::Zero(); MediaDataDecoder::DecodedData results = std::move(aValue.ResolveValue()); - LOG("HandleDecodedResults: %zu decoded data, %zu trimmers", results.Length(), - mTrimmers.Length()); if (results.IsEmpty()) { // No samples returned, we assume this is due to the latency of the // decoder and that the related decoded sample will be returned during // the next call to Decode(). - LOGV("No sample returned -- decoder has latency"); - return DecodePromise::CreateAndResolve(std::move(results), __func__); + LOGV("No sample returned for sample[%s, %s]", rawStart.ToString().get(), + rawEnd.ToString().get()); } - for (uint32_t i = 0; i < results.Length();) { const RefPtr& data = results[i]; MOZ_ASSERT(data->mType == MediaData::Type::AUDIO_DATA); - - if (!data->mDuration.IsValid()) { - return DecodePromise::CreateAndReject(std::move(aValue.RejectValue()), - __func__); - } TimeInterval sampleInterval(data->mTime, data->GetEndTime()); if (mTrimmers.IsEmpty()) { // mTrimmers being empty can only occurs if the decoder returned more // frames than we pushed in. We can't handle this case, abort trimming. - LOG("decoded buffer [%s, %s] has no trimming information)", + LOG("sample[%s, %s] (decoded[%s, %s] no trimming information)", + rawStart.ToString().get(), rawEnd.ToString().get(), sampleInterval.mStart.ToString().get(), sampleInterval.mEnd.ToString().get()); i++; @@ -136,23 +130,28 @@ RefPtr AudioTrimmer::HandleDecodedResult( mTrimmers.RemoveElementAt(0); if (!trimmer) { // Those frames didn't need trimming. - LOGV("decoded buffer [%s, %s] doesn't need trimming", + LOGV("sample[%s, %s] (decoded[%s, %s] no trimming needed", + rawStart.ToString().get(), rawEnd.ToString().get(), sampleInterval.mStart.ToString().get(), sampleInterval.mEnd.ToString().get()); i++; continue; } if (!trimmer->Intersects(sampleInterval)) { - LOGV("decoded buffer [%s, %s] would be empty after trimming, dropping it", - sampleInterval.mStart.ToString().get(), - sampleInterval.mEnd.ToString().get()); + LOGV( + "sample[%s, %s] (decoded[%s, %s] would be empty after trimming, " + "dropping it", + rawStart.ToString().get(), rawEnd.ToString().get(), + sampleInterval.mStart.ToString().get(), + sampleInterval.mEnd.ToString().get()); results.RemoveElementAt(i); continue; } - LOGV("Trimming sample[%s,%s] to [%s,%s]", + LOGV("Trimming sample[%s,%s] to [%s,%s] (raw was:[%s, %s])", sampleInterval.mStart.ToString().get(), sampleInterval.mEnd.ToString().get(), trimmer->mStart.ToString().get(), - trimmer->mEnd.ToString().get()); + trimmer->mEnd.ToString().get(), rawStart.ToString().get(), + rawEnd.ToString().get()); TimeInterval trim({std::max(trimmer->mStart, sampleInterval.mStart), std::min(trimmer->mEnd, sampleInterval.mEnd)}); @@ -162,8 +161,7 @@ RefPtr AudioTrimmer::HandleDecodedResult( Unused << ok; if (sample->Frames() == 0) { LOGV("sample[%s, %s] is empty after trimming, dropping it", - sampleInterval.mStart.ToString().get(), - sampleInterval.mEnd.ToString().get()); + rawStart.ToString().get(), rawEnd.ToString().get()); results.RemoveElementAt(i); continue; } @@ -186,7 +184,12 @@ RefPtr AudioTrimmer::DecodeBatch( ->Then(GetCurrentSerialEventTarget(), __func__, [self = RefPtr{this}]( DecodePromise::ResolveOrRejectValue&& aValue) { - return self->HandleDecodedResult(std::move(aValue)); + // If the decoder returned less samples than what we fed it. + // We can assume that this is due to the decoder encoding + // delay and that all decoded frames have been shifted by n = + // compressedSamples.Length() - decodedSamples.Length() and + // that the first n compressed samples returned nothing. + return self->HandleDecodedResult(std::move(aValue), nullptr); }); return p; } diff --git a/dom/media/platforms/wrappers/AudioTrimmer.h b/dom/media/platforms/wrappers/AudioTrimmer.h index afaf6ac23d17..e841a5919f82 100644 --- a/dom/media/platforms/wrappers/AudioTrimmer.h +++ b/dom/media/platforms/wrappers/AudioTrimmer.h @@ -41,9 +41,10 @@ class AudioTrimmer final : public MediaDataDecoder { private: ~AudioTrimmer() = default; - // Apply trimming information on decoded data. + // Apply trimming information on decoded data. aRaw can be null as it's only + // used for logging purposes. RefPtr HandleDecodedResult( - DecodePromise::ResolveOrRejectValue&& aValue); + DecodePromise::ResolveOrRejectValue&& aValue, MediaRawData* aRaw); void PrepareTrimmers(MediaRawData* aRaw); const RefPtr mDecoder; nsCOMPtr mThread; diff --git a/dom/media/test/bug603918.webm b/dom/media/test/bug603918.webm new file mode 100644 index 0000000000000000000000000000000000000000..c430e97f404b3f7ac87c86a0594f57fb6285e0d8 GIT binary patch literal 103227 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

4m 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

GEVGx41w|hZ?9|G#N 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⁢Df>f>6GdJ;9l+SNvY`%T5TJiFdYR9-ufA&C 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 z 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

pge+)21??+Oc;{10VMxyYr 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 literal 0 HcmV?d00001 diff --git a/dom/media/test/bug603918.webm^headers^ b/dom/media/test/bug603918.webm^headers^ new file mode 100644 index 000000000000..4030ea1d3ddb --- /dev/null +++ b/dom/media/test/bug603918.webm^headers^ @@ -0,0 +1 @@ +Cache-Control: no-store diff --git a/dom/media/test/manifest.js b/dom/media/test/manifest.js index fd1259434a66..1cbc6b70b680 100644 --- a/dom/media/test/manifest.js +++ b/dom/media/test/manifest.js @@ -929,15 +929,19 @@ var gErrorTests = [ { name: "448636.ogv", type: "video/ogg" }, { name: "bug504843.ogv", type: "video/ogg" }, { name: "bug501279.ogg", type: "audio/ogg" }, + { name: "bug603918.webm", type: "video/webm" }, { name: "bug604067.webm", type: "video/webm" }, { name: "bug1535980.webm", type: "video/webm" }, { name: "bug1799787.webm", type: "video/webm" }, { name: "bogus.duh", type: "bogus/duh" }, ]; -// Playing this file errors out after receiving "loadedmetadata", we still want -// to check the duration in "onerror" and make sure it is still available. -var gDurationTests = [{ name: "bug604067.webm", duration: 6.076 }]; +// These files would get error after receiving "loadedmetadata", we would like +// to check duration in "onerror" and make sure the duration is still available. +var gDurationTests = [ + { name: "bug603918.webm", duration: 6.076 }, + { name: "bug604067.webm", duration: 6.076 }, +]; // These are files that have nontrivial duration and are useful for seeking within. var gSeekTests = [ diff --git a/dom/media/test/mochitest.ini b/dom/media/test/mochitest.ini index 449c12aa5d5d..42f8bf6c0982 100644 --- a/dom/media/test/mochitest.ini +++ b/dom/media/test/mochitest.ini @@ -462,6 +462,8 @@ support-files = bug556821.ogv^headers^ bug557094.ogv bug557094.ogv^headers^ + bug603918.webm + bug603918.webm^headers^ bug604067.webm bug604067.webm^headers^ bug1066943.webm diff --git a/dom/media/test/mochitest_background_video.ini b/dom/media/test/mochitest_background_video.ini index 1a2d85c8c1ad..bc65f6372652 100644 --- a/dom/media/test/mochitest_background_video.ini +++ b/dom/media/test/mochitest_background_video.ini @@ -460,6 +460,8 @@ support-files = bug556821.ogv^headers^ bug557094.ogv bug557094.ogv^headers^ + bug603918.webm + bug603918.webm^headers^ bug604067.webm bug604067.webm^headers^ bug1066943.webm diff --git a/dom/media/test/mochitest_bugs.ini b/dom/media/test/mochitest_bugs.ini index 29b8d36fff3f..26693a416c7d 100644 --- a/dom/media/test/mochitest_bugs.ini +++ b/dom/media/test/mochitest_bugs.ini @@ -459,6 +459,8 @@ support-files = bug556821.ogv^headers^ bug557094.ogv bug557094.ogv^headers^ + bug603918.webm + bug603918.webm^headers^ bug604067.webm bug604067.webm^headers^ bug1066943.webm diff --git a/dom/media/test/mochitest_compat.ini b/dom/media/test/mochitest_compat.ini index 9a8e89df2d39..14257aae326f 100644 --- a/dom/media/test/mochitest_compat.ini +++ b/dom/media/test/mochitest_compat.ini @@ -468,6 +468,8 @@ support-files = bug556821.ogv^headers^ bug557094.ogv bug557094.ogv^headers^ + bug603918.webm + bug603918.webm^headers^ bug604067.webm bug604067.webm^headers^ bug1066943.webm diff --git a/dom/media/test/mochitest_eme.ini b/dom/media/test/mochitest_eme.ini index 9e0d06ef4ad4..f17644799e1b 100644 --- a/dom/media/test/mochitest_eme.ini +++ b/dom/media/test/mochitest_eme.ini @@ -461,6 +461,8 @@ support-files = bug556821.ogv^headers^ bug557094.ogv bug557094.ogv^headers^ + bug603918.webm + bug603918.webm^headers^ bug604067.webm bug604067.webm^headers^ bug1066943.webm diff --git a/dom/media/test/mochitest_media_recorder.ini b/dom/media/test/mochitest_media_recorder.ini index 9a3a9edfa743..066f7ba980a2 100644 --- a/dom/media/test/mochitest_media_recorder.ini +++ b/dom/media/test/mochitest_media_recorder.ini @@ -460,6 +460,8 @@ support-files = bug556821.ogv^headers^ bug557094.ogv bug557094.ogv^headers^ + bug603918.webm + bug603918.webm^headers^ bug604067.webm bug604067.webm^headers^ bug1066943.webm diff --git a/dom/media/test/mochitest_seek.ini b/dom/media/test/mochitest_seek.ini index 38da40dd7d98..7ee0501e96e9 100644 --- a/dom/media/test/mochitest_seek.ini +++ b/dom/media/test/mochitest_seek.ini @@ -460,6 +460,8 @@ support-files = bug556821.ogv^headers^ bug557094.ogv bug557094.ogv^headers^ + bug603918.webm + bug603918.webm^headers^ bug604067.webm bug604067.webm^headers^ bug1066943.webm diff --git a/dom/media/test/mochitest_stream.ini b/dom/media/test/mochitest_stream.ini index 75aa88292dc7..0ecb048cd87a 100644 --- a/dom/media/test/mochitest_stream.ini +++ b/dom/media/test/mochitest_stream.ini @@ -461,6 +461,8 @@ support-files = bug556821.ogv^headers^ bug557094.ogv bug557094.ogv^headers^ + bug603918.webm + bug603918.webm^headers^ bug604067.webm bug604067.webm^headers^ bug1066943.webm diff --git a/dom/media/wave/WaveDemuxer.cpp b/dom/media/wave/WaveDemuxer.cpp index 760745d8e18e..814883dc541a 100644 --- a/dom/media/wave/WaveDemuxer.cpp +++ b/dom/media/wave/WaveDemuxer.cpp @@ -94,30 +94,30 @@ bool WAVTrackDemuxer::Init() { return false; } - uint32_t chunkName = mHeaderParser.GiveHeader().ChunkName(); - uint32_t chunkSize = mHeaderParser.GiveHeader().ChunkSize(); + uint32_t aChunkName = mHeaderParser.GiveHeader().ChunkName(); + uint32_t aChunkSize = mHeaderParser.GiveHeader().ChunkSize(); - if (chunkName == FRMT_CODE) { + if (aChunkName == FRMT_CODE) { if (!FmtChunkParserInit()) { return false; } - } else if (chunkName == LIST_CODE) { + } else if (aChunkName == LIST_CODE) { mHeaderParser.Reset(); - uint64_t endOfListChunk = static_cast(mOffset) + chunkSize; + uint64_t endOfListChunk = static_cast(mOffset) + aChunkSize; if (endOfListChunk > UINT32_MAX) { return false; } - if (!ListChunkParserInit(chunkSize)) { + if (!ListChunkParserInit(aChunkSize)) { mOffset = endOfListChunk; } - } else if (chunkName == DATA_CODE) { - mDataLength = chunkSize; + } else if (aChunkName == DATA_CODE) { + mDataLength = aChunkSize; if (mFirstChunkOffset != mOffset) { mFirstChunkOffset = mOffset; } break; } else { - mOffset += chunkSize; // Skip other irrelevant chunks. + mOffset += aChunkSize; // Skip other irrelevant chunks. } if (mOffset & 1) { // Wave files are 2-byte aligned so we need to round up @@ -138,25 +138,22 @@ bool WAVTrackDemuxer::Init() { } } - mSamplesPerSecond = mFmtChunk.SampleRate(); - mChannels = mFmtChunk.Channels(); - if (!mSamplesPerSecond || !mChannels || !mFmtChunk.ValidBitsPerSamples()) { + mSamplesPerSecond = mFmtParser.FmtChunk().SampleRate(); + mChannels = mFmtParser.FmtChunk().Channels(); + mSampleFormat = mFmtParser.FmtChunk().SampleFormat(); + if (!mSamplesPerSecond || !mChannels || !mSampleFormat) { return false; } - mSamplesPerChunk = - DATA_CHUNK_SIZE * 8 / mChannels / mFmtChunk.ValidBitsPerSamples(); - mSampleFormat = mFmtChunk.ValidBitsPerSamples(); + mSamplesPerChunk = DATA_CHUNK_SIZE * 8 / mChannels / mSampleFormat; mInfo->mRate = mSamplesPerSecond; mInfo->mChannels = mChannels; - mInfo->mBitDepth = mFmtChunk.ValidBitsPerSamples(); - mInfo->mProfile = AssertedCast(mFmtChunk.WaveFormat() & 0x00FF); - mInfo->mExtendedProfile = - AssertedCast(mFmtChunk.WaveFormat() & 0xFF00 >> 8); + mInfo->mBitDepth = mSampleFormat; + mInfo->mProfile = mFmtParser.FmtChunk().WaveFormat() & 0x00FF; + mInfo->mExtendedProfile = (mFmtParser.FmtChunk().WaveFormat() & 0xFF00) >> 8; mInfo->mMimeType = "audio/wave; codecs="; - mInfo->mMimeType.AppendInt(mFmtChunk.WaveFormat()); + mInfo->mMimeType.AppendInt(mFmtParser.FmtChunk().WaveFormat()); mInfo->mDuration = Duration(); - mInfo->mChannelMap = mFmtChunk.ChannelMap(); return mInfo->mDuration.IsPositive(); } @@ -176,8 +173,8 @@ bool WAVTrackDemuxer::HeaderParserInit() { if (!header) { return false; } - BufferReader headerReader(header->Data(), 8); - Unused << mHeaderParser.Parse(headerReader); + BufferReader HeaderReader(header->Data(), 8); + Unused << mHeaderParser.Parse(HeaderReader); return true; } @@ -186,8 +183,9 @@ bool WAVTrackDemuxer::FmtChunkParserInit() { if (!fmtChunk) { return false; } - nsTArray fmtChunkData(fmtChunk->Data(), fmtChunk->Size()); - mFmtChunk.Init(std::move(fmtChunkData)); + BufferReader fmtReader(fmtChunk->Data(), + mHeaderParser.GiveHeader().ChunkSize()); + Unused << mFmtParser.Parse(fmtReader); return true; } @@ -347,6 +345,7 @@ void WAVTrackDemuxer::Reset() { mParser.Reset(); mHeaderParser.Reset(); mRIFFParser.Reset(); + mFmtParser.Reset(); } RefPtr @@ -355,9 +354,7 @@ WAVTrackDemuxer::SkipToNextRandomAccessPoint(const TimeUnit& aTimeThreshold) { SkipFailureHolder(NS_ERROR_DOM_MEDIA_DEMUXER_ERR, 0), __func__); } -int64_t WAVTrackDemuxer::GetResourceOffset() const { - return AssertedCast(mOffset); -} +int64_t WAVTrackDemuxer::GetResourceOffset() const { return mOffset; } TimeIntervals WAVTrackDemuxer::GetBuffered() { TimeUnit duration = Duration(); @@ -393,8 +390,9 @@ TimeUnit WAVTrackDemuxer::Duration(int64_t aNumDataChunks) const { if (!mSamplesPerSecond || !mSamplesPerChunk) { return TimeUnit(); } - const int64_t frames = mSamplesPerChunk * aNumDataChunks; - return TimeUnit(frames, mSamplesPerSecond); + const double usPerDataChunk = + USECS_PER_S * static_cast(mSamplesPerChunk) / mSamplesPerSecond; + return TimeUnit::FromMicroseconds(aNumDataChunks * usPerDataChunk); } TimeUnit WAVTrackDemuxer::DurationFromBytes(uint32_t aNumBytes) const { @@ -404,14 +402,21 @@ TimeUnit WAVTrackDemuxer::DurationFromBytes(uint32_t aNumBytes) const { uint64_t numSamples = aNumBytes * 8 / mChannels / mSampleFormat; - return TimeUnit(numSamples, mSamplesPerSecond); + uint64_t numUSeconds = USECS_PER_S * numSamples / mSamplesPerSecond; + + if (USECS_PER_S * numSamples % mSamplesPerSecond > mSamplesPerSecond / 2) { + numUSeconds++; + } + + return TimeUnit::FromMicroseconds(numUSeconds); } MediaByteRange WAVTrackDemuxer::FindNextChunk() { if (mOffset + DATA_CHUNK_SIZE < mFirstChunkOffset + mDataLength) { return {mOffset, mOffset + DATA_CHUNK_SIZE}; + } else { + return {mOffset, mFirstChunkOffset + mDataLength}; } - return {mOffset, mFirstChunkOffset + mDataLength}; } MediaByteRange WAVTrackDemuxer::FindChunkHeader() { @@ -451,8 +456,8 @@ already_AddRefed WAVTrackDemuxer::GetNextChunk( return nullptr; } - const uint32_t read = Read(chunkWriter->Data(), datachunk->mOffset, - AssertedCast(datachunk->Size())); + const uint32_t read = + Read(chunkWriter->Data(), datachunk->mOffset, datachunk->Size()); if (read != aRange.Length()) { return nullptr; @@ -493,8 +498,8 @@ already_AddRefed WAVTrackDemuxer::GetFileHeader( return nullptr; } - const uint32_t read = Read(headerWriter->Data(), fileHeader->mOffset, - AssertedCast(fileHeader->Size())); + const uint32_t read = + Read(headerWriter->Data(), fileHeader->mOffset, fileHeader->Size()); if (read != aRange.Length()) { return nullptr; @@ -514,9 +519,8 @@ uint64_t WAVTrackDemuxer::ChunkIndexFromTime( if (!mSamplesPerChunk || !mSamplesPerSecond) { return 0; } - double chunkDurationS = - mSamplesPerChunk / static_cast(mSamplesPerSecond); - int64_t chunkIndex = std::floor(aTime.ToSeconds() / chunkDurationS); + uint64_t chunkIndex = + (aTime.ToSeconds() * mSamplesPerSecond / mSamplesPerChunk) - 1; return chunkIndex; } @@ -526,12 +530,12 @@ void WAVTrackDemuxer::UpdateState(const MediaByteRange& aRange) { mTotalChunkLen += static_cast(aRange.Length()); } -int64_t WAVTrackDemuxer::Read(uint8_t* aBuffer, int64_t aOffset, - int64_t aSize) { +uint32_t WAVTrackDemuxer::Read(uint8_t* aBuffer, int64_t aOffset, + int32_t aSize) { const int64_t streamLen = StreamLength(); if (mInfo && streamLen > 0) { int64_t max = streamLen > aOffset ? streamLen - aOffset : 0; - aSize = std::min(aSize, max); + aSize = std::min(aSize, max); } uint32_t read = 0; const nsresult rv = mSource.ReadAt(aOffset, reinterpret_cast(aBuffer), @@ -583,11 +587,11 @@ bool RIFFParser::RIFFHeader::ParseNext(uint8_t c) { bool RIFFParser::RIFFHeader::IsValid(int aPos) const { if (aPos > -1 && aPos < 4) { return RIFF[aPos] == mRaw[aPos]; - } - if (aPos > 7 && aPos < 12) { + } else if (aPos > 7 && aPos < 12) { return WAVE[aPos - 8] == mRaw[aPos]; + } else { + return true; } - return true; } bool RIFFParser::RIFFHeader::IsValid() const { return mPos >= RIFF_CHUNK_SIZE; } @@ -653,62 +657,71 @@ void HeaderParser::ChunkHeader::Update(uint8_t c) { } } -// FormatChunk +// FormatParser -void FormatChunk::Init(nsTArray&& aData) { mRaw = std::move(aData); } +Result FormatParser::Parse(BufferReader& aReader) { + for (auto res = aReader.ReadU8(); + res.isOk() && !mFmtChunk.ParseNext(res.unwrap()); + res = aReader.ReadU8()) { + } -uint16_t FormatChunk::WaveFormat() const { return (mRaw[1] << 8) | (mRaw[0]); } + if (mFmtChunk.IsValid()) { + return FMT_CHUNK_MIN_SIZE; + } -uint16_t FormatChunk::Channels() const { return (mRaw[3] << 8) | (mRaw[2]); } + return 0; +} -uint32_t FormatChunk::SampleRate() const { +void FormatParser::Reset() { mFmtChunk.Reset(); } + +const FormatParser::FormatChunk& FormatParser::FmtChunk() const { + return mFmtChunk; +} + +// FormatParser::FormatChunk + +FormatParser::FormatChunk::FormatChunk() { Reset(); } + +void FormatParser::FormatChunk::Reset() { + memset(mRaw, 0, sizeof(mRaw)); + mPos = 0; +} + +uint16_t FormatParser::FormatChunk::WaveFormat() const { + return (mRaw[1] << 8) | (mRaw[0]); +} + +uint16_t FormatParser::FormatChunk::Channels() const { + return (mRaw[3] << 8) | (mRaw[2]); +} + +uint32_t FormatParser::FormatChunk::SampleRate() const { return static_cast((mRaw[7] << 24) | (mRaw[6] << 16) | (mRaw[5] << 8) | (mRaw[4])); } -uint16_t FormatChunk::AverageBytesPerSec() const { - return static_cast((mRaw[11] << 24) | (mRaw[10] << 16) | - (mRaw[9] << 8) | (mRaw[8])); +uint16_t FormatParser::FormatChunk::FrameSize() const { + return (mRaw[13] << 8) | (mRaw[12]); } -uint16_t FormatChunk::BlockAlign() const { - return static_cast(mRaw[13] << 8) | (mRaw[12]); -} - -uint16_t FormatChunk::ValidBitsPerSamples() const { +uint16_t FormatParser::FormatChunk::SampleFormat() const { return (mRaw[15] << 8) | (mRaw[14]); } -uint16_t FormatChunk::ExtraFormatInfoSize() const { - uint16_t value = static_cast(mRaw[17] << 8) | (mRaw[16]); - if (WaveFormat() != 0xFFFE && value != 0) { - NS_WARNING( - "Found non-zero extra format info length and the wave format" - " isn't WAVEFORMATEXTENSIBLE."); - return 0; - } - if (WaveFormat() == 0xFFFE && value < 22) { - NS_WARNING( - "Wave format is WAVEFORMATEXTENSIBLE and extra data size isn't at" - " least 22 bytes"); - return 0; - } - return value; +bool FormatParser::FormatChunk::ParseNext(uint8_t c) { + Update(c); + return IsValid(); } -AudioConfig::ChannelLayout::ChannelMap FormatChunk::ChannelMap() const { - // Integer or float files -- regular mapping - if (WaveFormat() == 1 || WaveFormat() == 2) { - return AudioConfig::ChannelLayout(Channels()).Map(); +bool FormatParser::FormatChunk::IsValid() const { + return (FrameSize() == SampleRate() * Channels() / 8) && + (mPos >= FMT_CHUNK_MIN_SIZE); +} + +void FormatParser::FormatChunk::Update(uint8_t c) { + if (mPos < FMT_CHUNK_MIN_SIZE) { + mRaw[mPos++] = c; } - if (ExtraFormatInfoSize() < 22) { - MOZ_ASSERT(Channels() <= 2); - return AudioConfig::ChannelLayout::UNKNOWN_MAP; - } - // ChannelLayout::ChannelMap is by design bit-per-bit compatible with - // WAVEFORMATEXTENSIBLE's dwChannelMask attribute, we can just cast here. - return static_cast( - mRaw[21] | mRaw[20] | mRaw[19] | mRaw[18]); } // DataParser diff --git a/dom/media/wave/WaveDemuxer.h b/dom/media/wave/WaveDemuxer.h index 09393ad4a490..a7ab65c00259 100644 --- a/dom/media/wave/WaveDemuxer.h +++ b/dom/media/wave/WaveDemuxer.h @@ -73,9 +73,9 @@ class RIFFParser { private: bool Update(uint8_t c); - uint8_t mRaw[RIFF_CHUNK_SIZE] = {}; + uint8_t mRaw[RIFF_CHUNK_SIZE]; - int mPos = 0; + int mPos; }; RIFFHeader mRiffHeader; @@ -108,32 +108,49 @@ class HeaderParser { private: void Update(uint8_t c); - uint8_t mRaw[CHUNK_HEAD_SIZE] = {}; + uint8_t mRaw[CHUNK_HEAD_SIZE]; - int mPos = 0; + int mPos; }; ChunkHeader mHeader; }; -class FormatChunk { - public: - FormatChunk() = default; - void Init(nsTArray&& aData); - bool IsValid() const; +class FormatParser { + private: + class FormatChunk; - uint16_t WaveFormat() const; - uint16_t Channels() const; - uint32_t SampleRate() const; - uint16_t ExtraFormatInfoSize() const; - uint16_t SampleFormat() const; - uint16_t AverageBytesPerSec() const; - uint16_t BlockAlign() const; - uint16_t ValidBitsPerSamples() const; - AudioConfig::ChannelLayout::ChannelMap ChannelMap() const; + public: + const FormatChunk& FmtChunk() const; + + Result Parse(BufferReader& aReader); + + void Reset(); private: - nsTArray mRaw; + class FormatChunk { + public: + FormatChunk(); + void Reset(); + + uint16_t WaveFormat() const; + uint16_t Channels() const; + uint32_t SampleRate() const; + uint16_t FrameSize() const; + uint16_t SampleFormat() const; + + bool IsValid() const; + bool ParseNext(uint8_t c); + + private: + void Update(uint8_t c); + + uint8_t mRaw[FMT_CHUNK_MIN_SIZE]; + + int mPos; + }; + + FormatChunk mFmtChunk; }; class DataParser { @@ -153,7 +170,7 @@ class DataParser { void Reset(); private: - int mPos = 0; // To Check Alignment + int mPos; // To Check Alignment }; DataChunk mChunk; @@ -215,7 +232,7 @@ class WAVTrackDemuxer : public MediaTrackDemuxer, uint64_t OffsetFromChunkIndex(uint32_t aChunkIndex) const; uint64_t ChunkIndexFromTime(const media::TimeUnit& aTime) const; - int64_t Read(uint8_t* aBuffer, int64_t aOffset, int64_t aSize); + uint32_t Read(uint8_t* aBuffer, int64_t aOffset, int32_t aSize); MediaResourceIndex mSource; @@ -223,7 +240,7 @@ class WAVTrackDemuxer : public MediaTrackDemuxer, RIFFParser mRIFFParser; HeaderParser mHeaderParser; - FormatChunk mFmtChunk; + FormatParser mFmtParser; // ListChunkParser mListChunkParser; uint64_t mOffset; diff --git a/dom/media/webaudio/WebAudioUtils.cpp b/dom/media/webaudio/WebAudioUtils.cpp index 928cc8955df7..699f39753298 100644 --- a/dom/media/webaudio/WebAudioUtils.cpp +++ b/dom/media/webaudio/WebAudioUtils.cpp @@ -38,8 +38,20 @@ int WebAudioUtils::SpeexResamplerProcess(SpeexResamplerState* aResampler, uint32_t aChannel, const float* aIn, uint32_t* aInLen, float* aOut, uint32_t* aOutLen) { +#ifdef MOZ_SAMPLE_TYPE_S16 + AutoTArray tmp1; + AutoTArray tmp2; + tmp1.SetLength(*aInLen); + tmp2.SetLength(*aOutLen); + ConvertAudioSamples(aIn, tmp1.Elements(), *aInLen); + int result = speex_resampler_process_int( + aResampler, aChannel, tmp1.Elements(), aInLen, tmp2.Elements(), aOutLen); + ConvertAudioSamples(tmp2.Elements(), aOut, *aOutLen); + return result; +#else return speex_resampler_process_float(aResampler, aChannel, aIn, aInLen, aOut, aOutLen); +#endif } int WebAudioUtils::SpeexResamplerProcess(SpeexResamplerState* aResampler, @@ -47,17 +59,29 @@ int WebAudioUtils::SpeexResamplerProcess(SpeexResamplerState* aResampler, uint32_t* aInLen, float* aOut, uint32_t* aOutLen) { AutoTArray tmp; +#ifdef MOZ_SAMPLE_TYPE_S16 + tmp.SetLength(*aOutLen); + int result = speex_resampler_process_int(aResampler, aChannel, aIn, aInLen, + tmp.Elements(), aOutLen); + ConvertAudioSamples(tmp.Elements(), aOut, *aOutLen); + return result; +#else tmp.SetLength(*aInLen); ConvertAudioSamples(aIn, tmp.Elements(), *aInLen); int result = speex_resampler_process_float( aResampler, aChannel, tmp.Elements(), aInLen, aOut, aOutLen); return result; +#endif } int WebAudioUtils::SpeexResamplerProcess(SpeexResamplerState* aResampler, uint32_t aChannel, const int16_t* aIn, uint32_t* aInLen, int16_t* aOut, uint32_t* aOutLen) { +#ifdef MOZ_SAMPLE_TYPE_S16 + return speex_resampler_process_int(aResampler, aChannel, aIn, aInLen, aOut, + aOutLen); +#else AutoTArray tmp1; AutoTArray tmp2; tmp1.SetLength(*aInLen); @@ -67,6 +91,7 @@ int WebAudioUtils::SpeexResamplerProcess(SpeexResamplerState* aResampler, aResampler, aChannel, tmp1.Elements(), aInLen, tmp2.Elements(), aOutLen); ConvertAudioSamples(tmp2.Elements(), aOut, *aOutLen); return result; +#endif } void WebAudioUtils::LogToDeveloperConsole(uint64_t aWindowID, diff --git a/dom/media/webaudio/blink/HRTFElevation.cpp b/dom/media/webaudio/blink/HRTFElevation.cpp index 38ac0f8614ac..af4e52038404 100644 --- a/dom/media/webaudio/blink/HRTFElevation.cpp +++ b/dom/media/webaudio/blink/HRTFElevation.cpp @@ -109,9 +109,20 @@ nsReturnRef HRTFElevation::calculateKernelForAzimuthElevation( const int16_t(&impulse_response_data)[ResponseFrameSize] = irc_composite_c_r0195[elevationIndex].azimuths[azimuthIndex]; + // When libspeex_resampler is compiled with FIXED_POINT, samples in + // speex_resampler_process_float are rounded directly to int16_t, which + // only works well if the floats are in the range +/-32767. On such + // platforms it's better to resample before converting to float anyway. +#ifdef MOZ_SAMPLE_TYPE_S16 +# define RESAMPLER_PROCESS speex_resampler_process_int + const int16_t* response = impulse_response_data; + const int16_t* resampledResponse; +#else +# define RESAMPLER_PROCESS speex_resampler_process_float float response[ResponseFrameSize]; ConvertAudioSamples(impulse_response_data, response, ResponseFrameSize); float* resampledResponse; +#endif // Note that depending on the fftSize returned by the panner, we may be // truncating the impulse response. @@ -129,8 +140,8 @@ nsReturnRef HRTFElevation::calculateKernelForAzimuthElevation( // Feed the input buffer into the resampler. spx_uint32_t in_len = ResponseFrameSize; spx_uint32_t out_len = resampled.Length(); - speex_resampler_process_float(resampler, 0, response, &in_len, - resampled.Elements(), &out_len); + RESAMPLER_PROCESS(resampler, 0, response, &in_len, resampled.Elements(), + &out_len); if (out_len < resampled.Length()) { // The input should have all been processed. @@ -139,8 +150,8 @@ nsReturnRef HRTFElevation::calculateKernelForAzimuthElevation( spx_uint32_t out_index = out_len; in_len = speex_resampler_get_input_latency(resampler); out_len = resampled.Length() - out_index; - speex_resampler_process_float(resampler, 0, nullptr, &in_len, - resampled.Elements() + out_index, &out_len); + RESAMPLER_PROCESS(resampler, 0, nullptr, &in_len, + resampled.Elements() + out_index, &out_len); out_index += out_len; // There may be some uninitialized samples remaining for very low // sample rates. @@ -150,8 +161,18 @@ nsReturnRef HRTFElevation::calculateKernelForAzimuthElevation( speex_resampler_reset_mem(resampler); } - return HRTFKernel::create(resampledResponse, resampledResponseLength, - sampleRate); +#ifdef MOZ_SAMPLE_TYPE_S16 + AutoTArray floatArray; + floatArray.SetLength(resampledResponseLength); + float* floatResponse = floatArray.Elements(); + ConvertAudioSamples(resampledResponse, floatResponse, + resampledResponseLength); +#else + float* floatResponse = resampledResponse; +#endif +#undef RESAMPLER_PROCESS + + return HRTFKernel::create(floatResponse, resampledResponseLength, sampleRate); } // The range of elevations for the IRCAM impulse responses varies depending on diff --git a/dom/media/webaudio/test/audio-expected.wav b/dom/media/webaudio/test/audio-expected.wav index 384f76318a88da0d94ce41894d5ad783e61ee086..1519270776f9500cecc1242c16c2afc0ba392f0a 100644 GIT binary patch delta 159127 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 PaHKyG{xmcxG9U4Oj73El delta 159127 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 R)R7^f4CJHe*!Whc{{uK!A0+?) diff --git a/dom/media/webaudio/test/test_mediaDecoding.html b/dom/media/webaudio/test/test_mediaDecoding.html index 6ee9b24215ef..d796ef6add4c 100644 --- a/dom/media/webaudio/test/test_mediaDecoding.html +++ b/dom/media/webaudio/test/test_mediaDecoding.html @@ -1,25 +1,24 @@ - + - - Test the decodeAudioData API and Resampling - - - - - -

+
+  Test the decodeAudioData API and Resampling
+  
+  
+
+
+
 
 
 
 
- + diff --git a/dom/media/webaudio/test/ting-44.1k-1ch.wav b/dom/media/webaudio/test/ting-44.1k-1ch.wav index dd731e354c562575bedac0bcdd5ceae2ba634d3c..6854c9d8983f181ea5b654f0a48161f822165e69 100644 GIT binary patch literal 61228 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

e$`1mg&CLmeHo zDt#xme~JC}vv>u+?O+|xxQnQRJ?6+@4XMR{s|q&yezLj|G`gd}XE9}|iqA&;73zC> zb);#}tL3JO*W=#NSDYPE_q?LF`!a1>QeD@%UgLrG*lM5EjTHJc3lI0B$*SncN5XtH zi_e9=hB z+D2!r3?t=2UN_nKdb4YwK1;wmc{D^MuVl+Yr^QQqozTD@jcc8O$j5o41W&cAIa~d? zy$Um_vDx^vL?^C~taC!1o<%{#swmQN@F<$+c2&=p)JzKA-)d}~@yBubxqt`0^R((_ zW;xS%&x*ASOux%@qv_fhD`sV3jC2fRWEtKa!XBM{4WhSRhUA0#LXEIUs?0phSDLQy z&FcMHdhBKFwGA_EcJ3|uVx_zl$ySLfk?~mMHAr3okwI3!U8Ph2A47C>qA}|CUZ<=s zC-ByKESxGwl$limP8_Vm5Y+m?Uexgs@j5~C#PHQtC<-Z-e6MxXX^s9zpuFos?Q-j8 z?i;jQ=rM{vP%dX=!$&E=?cURxEqBOe%W+Q;l+>^3iXB3tw4DlbDX#gNBKt;+uM*p% z#6S~@;-FbANsdS2;_>2h;BR%tC)_i?3p*z|;|=N|RV>o9vPA_4={ z)wl9ANH!fQLMvS%!>+DKF|(6K{Yq~vMu&a2U8XlV|L=XBWZC5b-LaNB*Sq1l7iCoh zlf5bSD=79#orPa8cuUvKan)+EmMK^4(@Cl$6JDV{*h_`dnbR~aeO7a3Vw^InWmk72eb-R@KRTq_(OAa@V`7|W+O`aF}BkX!m-mBtXbkIj}q$T&5@gECTv z>&=J11MW3zVH}w%x>ZK?rPo$J}u$9<0) zdwmtj7rcjHhS8SC}+RD+}NGlR#vi0RI3@i=6B ziXSes4tEF5-i@{Y&Iax9;w|Di-g?LlEE40IXT``jF#jp-vl+kc53AZlS!EIrFTq!H zVYja{Rk+F|QQwTm>gp^c$zpHIwejL9AD{iIpIHxYRPtHSSLhh_Qvs{x!qh;K+)D0j zpk}&`2263TRs7rzKDJY1o%Fe;=w1&}5`#z02~K7E1r_u%21snUt&wb%;gbn%*G z-R2-nWUD&wp~iaZ7cB6ZoR`bRQ^e#BRxg%sm+^2iRy#mR=Hh^K`DLhR8EvG~MA(}& z%XaZ{MsML3Hk*nwc8TXm{<;L87GmVSj{lTB;>Aj^tNabwrL4N45r#Zhdkm%Xi>^s) zmHtiky_Y(}1fKH=l+OGfw$5>_QQkewScmxj4~#N5%#3xgTo!bdVxBAI+h|t|R*YNf z{>>I6SHV;z29Bi$pK!#_xGIC~Hu6_c4=?rJRBUqz-M7cpwqT2G>g}&|k4n70@$Uit zuChYcP#32M%S}@AbS~O!}jvUR=l-u9uZwG_JO6d9|-wMB5OEf6)xL(gpv6$mZ}dl&6+L z#eZo2pXlj*s zWPrBe9jy6sdK>GN?uXDb_smv3uY7sBCp(nW`AI6sc51*M%W5qLiRfILzGw(6-*q~9%EF8bb)$crbSq7v)2cra|)bvREzyt{;DvFeUP*T|IC-2 zAENeyC&jhpId^6mWg~c6FaB>+%MI84NWvi@n2fc;oI$ail8=I%RH<_5ZET(<4;3TB zxiXLSCVTG?mhY+SmB2-;zg&*l0{ej?OIERVV4n%t|2w;{ACQGs^WC0shMwlg zn22KU9ffn+o7rI1K*)}OHtg%U>vpBRjWfo`N!Qw^x{JNuf~L1uGWxXfaQHxd5`^CV1h|H6P>**_T+O-&;iiF5>OF zp4pHq$F`*U8j7>~_+gD~a|2tAr7oxcp}tzMS%oOru4X9YnF=geU*2tj)BYj~ju_*5 uSbN>qCZnh&V+??iSMkkCv&@2$dUD_re(R)b5(mXWT~(l?(?h;n8}WZ+wBjNF diff --git a/dom/media/webaudio/test/ting-44.1k-2ch.wav b/dom/media/webaudio/test/ting-44.1k-2ch.wav index b2ef11ecbe2f2edbebc04eab5870027bfae2a995..703d8858928dcad42d3cf9c41d3f30670b3acd92 100644 GIT binary patch literal 122412 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⪙ika%pnL2K@n?=~@4oMBjnGRccNWZM!F_sb_;5Hb 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 diff --git a/dom/media/webaudio/test/ting-48k-1ch.wav b/dom/media/webaudio/test/ting-48k-1ch.wav index 91874dfbb2705ca6dc23c861f5992e2714198ca5..8fe471666c49cd80179523d9509674b0d7b4ee5c 100644 GIT binary patch literal 66638 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 diff --git a/dom/media/webaudio/test/ting-48k-2ch.wav b/dom/media/webaudio/test/ting-48k-2ch.wav index 6adb8d3e5d8c24f4fea9d4e1be986f7b77bf8dfe..ad4d0466da0de3bdb436e256d145b4dee111b8d7 100644 GIT binary patch literal 133232 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%0DsUefgv7thcCXQE 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ⓈnmjUyVCSnszQEq~o;I8-= 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 literal 133232 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 FegQt)AJqT= diff --git a/dom/media/webm/WebMDemuxer.cpp b/dom/media/webm/WebMDemuxer.cpp index 0ef8f790c171..fce8f0e51290 100644 --- a/dom/media/webm/WebMDemuxer.cpp +++ b/dom/media/webm/WebMDemuxer.cpp @@ -235,7 +235,6 @@ already_AddRefed WebMDemuxer::GetTrackDemuxer( } void WebMDemuxer::Reset(TrackInfo::TrackType aType) { - mProcessedDiscardPadding = false; if (aType == TrackInfo::kVideoTrack) { mVideoPackets.Reset(); } else { @@ -417,12 +416,11 @@ nsresult WebMDemuxer::ReadMetadata() { uint64_t codecDelayUs = params.codec_delay / 1000; mInfo.mAudio.mMimeType = "audio/opus"; OpusCodecSpecificData opusCodecSpecificData; - opusCodecSpecificData.mContainerCodecDelayFrames = - AssertedCast(USECS_PER_S * codecDelayUs / 48000); + opusCodecSpecificData.mContainerCodecDelayMicroSeconds = + AssertedCast(codecDelayUs); mInfo.mAudio.mCodecSpecificConfig = AudioCodecSpecificVariant{std::move(opusCodecSpecificData)}; - WEBM_DEBUG("Preroll for Opus: %" PRIu64 " frames", - opusCodecSpecificData.mContainerCodecDelayFrames); + WEBM_DEBUG("Preroll for Opus: %" PRIu64, codecDelayUs); } mSeekPreroll = params.seek_preroll; mInfo.mAudio.mRate = AssertedCast(params.rate); @@ -584,7 +582,6 @@ nsresult WebMDemuxer::GetNextPacket(TrackInfo::TrackType aType, unsigned int count = 0; r = nestegg_packet_count(holder->Packet(), &count); if (r == -1) { - WEBM_DEBUG("nestegg_packet_count: error"); return NS_ERROR_DOM_MEDIA_DEMUXER_ERR; } int64_t tstamp = holder->Timestamp(); @@ -597,7 +594,6 @@ nsresult WebMDemuxer::GetNextPacket(TrackInfo::TrackType aType, RefPtr next_holder; rv = NextPacket(aType, next_holder); if (NS_FAILED(rv) && rv != NS_ERROR_DOM_MEDIA_END_OF_STREAM) { - WEBM_DEBUG("NextPacket: error"); return rv; } @@ -639,7 +635,6 @@ nsresult WebMDemuxer::GetNextPacket(TrackInfo::TrackType aType, } if (mIsMediaSource && next_tstamp == INT64_MIN) { - WEBM_DEBUG("WebM is a media source, and next timestamp computation filed."); return NS_ERROR_DOM_MEDIA_END_OF_STREAM; } @@ -726,13 +721,13 @@ nsresult WebMDemuxer::GetNextPacket(TrackInfo::TrackType aType, sample = new MediaRawData(data, length, alphaData, alphaLength); if ((length && !sample->Data()) || (alphaLength && !sample->AlphaData())) { - WEBM_DEBUG("Couldn't allocate MediaRawData: OOM"); + // OOM. return NS_ERROR_OUT_OF_MEMORY; } } else { sample = new MediaRawData(data, length); if (length && !sample->Data()) { - WEBM_DEBUG("Couldn't allocate MediaRawData: OOM"); + // OOM. return NS_ERROR_OUT_OF_MEMORY; } } @@ -744,25 +739,20 @@ nsresult WebMDemuxer::GetNextPacket(TrackInfo::TrackType aType, sample->mOffset = holder->Offset(); sample->mKeyframe = isKeyframe; if (discardPadding && i == count - 1) { - sample->mOriginalPresentationWindow = - Some(media::TimeInterval{sample->mTime, sample->GetEndTime()}); + CheckedInt64 discardFrames; if (discardPadding < 0) { - // This will ensure decoding will error out, and the file is rejected. - sample->mDuration = TimeUnit::Invalid(); + // This is an invalid value as discard padding should never be negative. + // Set to maximum value so that the decoder will reject it as it's + // greater than the number of frames available. + discardFrames = INT32_MAX; + WEBM_DEBUG("Invalid negative discard padding"); } else { - TimeUnit padding = TimeUnit::FromNanoseconds(discardPadding); - if (padding > sample->mDuration || mProcessedDiscardPadding) { - WEBM_DEBUG( - "Padding frames larger than packet size, flagging the packet for " - "error (padding: %s, duration: %s, already processed: %s)", - padding.ToString().get(), sample->mDuration.ToString().get(), - mProcessedDiscardPadding ? "true" : "false"); - sample->mDuration = TimeUnit::Invalid(); - } else { - sample->mDuration -= padding; - } + discardFrames = TimeUnitToFrames( + TimeUnit::FromNanoseconds(discardPadding), mInfo.mAudio.mRate); + } + if (discardFrames.isValid()) { + sample->mDiscardPadding = discardFrames.value(); } - mProcessedDiscardPadding = true; } if (packetEncryption == NESTEGG_PACKET_HAS_SIGNAL_BYTE_ENCRYPTED || @@ -876,7 +866,6 @@ nsresult WebMDemuxer::NextPacket(TrackInfo::TrackType aType, bool hasType = isVideo ? mHasVideo : mHasAudio; if (!hasType) { - WEBM_DEBUG("No media type found"); return NS_ERROR_DOM_MEDIA_DEMUXER_ERR; } @@ -898,7 +887,6 @@ nsresult WebMDemuxer::NextPacket(TrackInfo::TrackType aType, return rv; } if (!holder) { - WEBM_DEBUG("Couldn't demux packet"); return NS_ERROR_DOM_MEDIA_DEMUXER_ERR; } @@ -915,24 +903,20 @@ nsresult WebMDemuxer::DemuxPacket(TrackInfo::TrackType aType, int r = nestegg_read_packet(Context(aType), &packet); if (r == 0) { nestegg_read_reset(Context(aType)); - WEBM_DEBUG("EOS"); return NS_ERROR_DOM_MEDIA_END_OF_STREAM; } else if (r < 0) { - WEBM_DEBUG("nestegg_read_packet: error"); return NS_ERROR_DOM_MEDIA_DEMUXER_ERR; } unsigned int track = 0; r = nestegg_packet_track(packet, &track); if (r == -1) { - WEBM_DEBUG("nestegg_packet_track: error"); return NS_ERROR_DOM_MEDIA_DEMUXER_ERR; } int64_t offset = Resource(aType).Tell(); RefPtr holder = new NesteggPacketHolder(); if (!holder->Init(packet, offset, track, false)) { - WEBM_DEBUG("NesteggPacketHolder::Init: error"); return NS_ERROR_DOM_MEDIA_DEMUXER_ERR; } @@ -1172,7 +1156,6 @@ nsresult WebMTrackDemuxer::NextSample(RefPtr& aData) { aData = mSamples.PopFront(); return NS_OK; } - WEBM_DEBUG("WebMTrackDemuxer::NextSample: error"); return rv; } diff --git a/dom/media/webm/WebMDemuxer.h b/dom/media/webm/WebMDemuxer.h index 3b3bdc21e2b4..3d8ff67f9ede 100644 --- a/dom/media/webm/WebMDemuxer.h +++ b/dom/media/webm/WebMDemuxer.h @@ -238,11 +238,6 @@ class WebMDemuxer : public MediaDataDemuxer, // as nestegg only performs 1-byte read at a time. int64_t mLastWebMBlockOffset; const bool mIsMediaSource; - // Discard padding in WebM cannot occur more than once. This is set to true if - // a discard padding element has been found and processed, and the decoding is - // expected to error out if another discard padding element is found - // subsequently in the byte stream. - bool mProcessedDiscardPadding = false; EncryptionInfo mCrypto; }; diff --git a/dom/webidl/MediaDebugInfo.webidl b/dom/webidl/MediaDebugInfo.webidl index 46192d8e5989..21140e9b8b18 100644 --- a/dom/webidl/MediaDebugInfo.webidl +++ b/dom/webidl/MediaDebugInfo.webidl @@ -169,7 +169,7 @@ dictionary MediaStateDebugInfo { long demuxEOS = 0; long drainState = 0; boolean waitingForKey = false; - long long lastStreamSourceID = 0; + long lastStreamSourceID = 0; }; dictionary MediaFrameStats { diff --git a/ipc/glue/test/browser/browser_utility_audio_shutdown.js b/ipc/glue/test/browser/browser_utility_audio_shutdown.js index a0a4be63f6f6..31811cfd5567 100644 --- a/ipc/glue/test/browser/browser_utility_audio_shutdown.js +++ b/ipc/glue/test/browser/browser_utility_audio_shutdown.js @@ -42,7 +42,7 @@ add_setup(async function setup() { }); add_task(async function testKill() { - await runTest("small-shot.ogg", "Utility Generic", "ffvpx audio decoder"); + await runTest("small-shot.ogg", "Utility Generic", "vorbis audio decoder"); await cleanUtilityProcessShutdown( "audioDecoder_Generic", @@ -59,7 +59,7 @@ add_task(async function testKill() { }); add_task(async function testShutdown() { - await runTest("small-shot.ogg", "Utility Generic", "ffvpx audio decoder"); + await runTest("small-shot.ogg", "Utility Generic", "vorbis audio decoder"); const audioDecoderPid = await findGenericAudioDecoder(); ok(audioDecoderPid > 0, `Valid PID found: ${audioDecoderPid}`); diff --git a/ipc/glue/test/browser/head.js b/ipc/glue/test/browser/head.js index e51885754b8c..3b4f6361c170 100644 --- a/ipc/glue/test/browser/head.js +++ b/ipc/glue/test/browser/head.js @@ -110,19 +110,19 @@ function audioTestData() { expectations: { Android: { process: "Utility Generic", - decoder: "ffvpx audio decoder", + decoder: "vorbis audio decoder", }, Linux: { process: "Utility Generic", - decoder: "ffvpx audio decoder", + decoder: "vorbis audio decoder", }, WINNT: { process: "Utility Generic", - decoder: "ffvpx audio decoder", + decoder: "vorbis audio decoder", }, Darwin: { process: "Utility Generic", - decoder: "ffvpx audio decoder", + decoder: "vorbis audio decoder", }, }, }, diff --git a/media/ffvpx/README_MOZILLA b/media/ffvpx/README_MOZILLA index a05244d842a8..fdd0bc3531aa 100644 --- a/media/ffvpx/README_MOZILLA +++ b/media/ffvpx/README_MOZILLA @@ -2,20 +2,16 @@ This directory contains files used in gecko builds from FFmpeg (http://ffmpeg.org). The current files are from FFmpeg as of -revision -37cde570bc2dcd64a15c5d9a37b9fa0d78d84f9f +revision fed07efcde72824ac1ada80d4af4e91ac4fcfc14 git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg -git checkout 37cde570bc2dcd64a15c5d9a37b9fa0d78d84f9f +git checkout fed07efcde72824ac1ada80d4af4e91ac4fcfc14 All source files match their path from the library's source archive. -Currently, we only use the vp8, vp9, av1 (via libdav1d), mp3, flac, vorbis (via -libvorbis), opus (via libopus) and PCM portion of the library. If this changes, -configuration files will most likely need to be updated. - -Decoding AV1 via libdav1d and libvorbis is supported, although the decoder -libraries are vendored separately, `ffvpx` only contains the code to use -those libraries through the `ffmpeg` API. +Currently, we only use the vp8, vp9, av1 (libdav1d), mp3, and flac portion of +the library. If this changes, configuration files will most likely need to be +updated. Decoding AV1 via libdav1d is supported, although the decoder +(libdav1d) is vendored separately, `ffvpx` only contains the code to use `libdav1d` through the `ffmpeg` API. The ffmpeg project recommends to use ffmpeg's tip, not a particular release. diff --git a/media/ffvpx/config_components_audio_only.h b/media/ffvpx/config_components_audio_only.h index 4aafc5c339c8..6ca57dbaebb2 100644 --- a/media/ffvpx/config_components_audio_only.h +++ b/media/ffvpx/config_components_audio_only.h @@ -424,34 +424,34 @@ #define CONFIG_WS_SND1_DECODER 0 #define CONFIG_XMA1_DECODER 0 #define CONFIG_XMA2_DECODER 0 -#define CONFIG_PCM_ALAW_DECODER 1 +#define CONFIG_PCM_ALAW_DECODER 0 #define CONFIG_PCM_BLURAY_DECODER 0 #define CONFIG_PCM_DVD_DECODER 0 #define CONFIG_PCM_F16LE_DECODER 0 #define CONFIG_PCM_F24LE_DECODER 0 #define CONFIG_PCM_F32BE_DECODER 0 -#define CONFIG_PCM_F32LE_DECODER 1 +#define CONFIG_PCM_F32LE_DECODER 0 #define CONFIG_PCM_F64BE_DECODER 0 #define CONFIG_PCM_F64LE_DECODER 0 #define CONFIG_PCM_LXF_DECODER 0 -#define CONFIG_PCM_MULAW_DECODER 1 +#define CONFIG_PCM_MULAW_DECODER 0 #define CONFIG_PCM_S8_DECODER 0 #define CONFIG_PCM_S8_PLANAR_DECODER 0 #define CONFIG_PCM_S16BE_DECODER 0 #define CONFIG_PCM_S16BE_PLANAR_DECODER 0 -#define CONFIG_PCM_S16LE_DECODER 1 +#define CONFIG_PCM_S16LE_DECODER 0 #define CONFIG_PCM_S16LE_PLANAR_DECODER 0 #define CONFIG_PCM_S24BE_DECODER 0 #define CONFIG_PCM_S24DAUD_DECODER 0 -#define CONFIG_PCM_S24LE_DECODER 1 +#define CONFIG_PCM_S24LE_DECODER 0 #define CONFIG_PCM_S24LE_PLANAR_DECODER 0 #define CONFIG_PCM_S32BE_DECODER 0 -#define CONFIG_PCM_S32LE_DECODER 1 +#define CONFIG_PCM_S32LE_DECODER 0 #define CONFIG_PCM_S32LE_PLANAR_DECODER 0 #define CONFIG_PCM_S64BE_DECODER 0 #define CONFIG_PCM_S64LE_DECODER 0 #define CONFIG_PCM_SGA_DECODER 0 -#define CONFIG_PCM_U8_DECODER 1 +#define CONFIG_PCM_U8_DECODER 0 #define CONFIG_PCM_U16BE_DECODER 0 #define CONFIG_PCM_U16LE_DECODER 0 #define CONFIG_PCM_U24BE_DECODER 0 @@ -567,11 +567,11 @@ #define CONFIG_LIBOPENCORE_AMRNB_DECODER 0 #define CONFIG_LIBOPENCORE_AMRWB_DECODER 0 #define CONFIG_LIBOPENJPEG_DECODER 0 -#define CONFIG_LIBOPUS_DECODER 1 +#define CONFIG_LIBOPUS_DECODER 0 #define CONFIG_LIBRSVG_DECODER 0 #define CONFIG_LIBSPEEX_DECODER 0 #define CONFIG_LIBUAVS3D_DECODER 0 -#define CONFIG_LIBVORBIS_DECODER 1 +#define CONFIG_LIBVORBIS_DECODER 0 #define CONFIG_LIBVPX_VP8_DECODER 0 #define CONFIG_LIBVPX_VP9_DECODER 0 #define CONFIG_LIBZVBI_TELETEXT_DECODER 0 diff --git a/media/ffvpx/config_components_audio_video.h b/media/ffvpx/config_components_audio_video.h index 95df8a4bacab..31547214e041 100644 --- a/media/ffvpx/config_components_audio_video.h +++ b/media/ffvpx/config_components_audio_video.h @@ -8,7 +8,6 @@ #define CONFIG_CHOMP_BSF 0 #define CONFIG_DUMP_EXTRADATA_BSF 0 #define CONFIG_DCA_CORE_BSF 0 -#define CONFIG_DTS2PTS_BSF 0 #define CONFIG_DV_ERROR_MARKER_BSF 0 #define CONFIG_EAC3_CORE_BSF 0 #define CONFIG_EXTRACT_EXTRADATA_BSF 0 @@ -20,7 +19,6 @@ #define CONFIG_HEVC_METADATA_BSF 0 #define CONFIG_HEVC_MP4TOANNEXB_BSF 0 #define CONFIG_IMX_DUMP_HEADER_BSF 0 -#define CONFIG_MEDIA100_TO_MJPEGB_BSF 0 #define CONFIG_MJPEG2JPEG_BSF 0 #define CONFIG_MJPEGA_DUMP_HEADER_BSF 0 #define CONFIG_MP3_HEADER_DECOMPRESS_BSF 0 @@ -164,7 +162,6 @@ #define CONFIG_M101_DECODER 0 #define CONFIG_MAGICYUV_DECODER 0 #define CONFIG_MDEC_DECODER 0 -#define CONFIG_MEDIA100_DECODER 0 #define CONFIG_MIMIC_DECODER 0 #define CONFIG_MJPEG_DECODER 0 #define CONFIG_MJPEGB_DECODER 0 @@ -214,7 +211,6 @@ #define CONFIG_PGM_DECODER 0 #define CONFIG_PGMYUV_DECODER 0 #define CONFIG_PGX_DECODER 0 -#define CONFIG_PHM_DECODER 0 #define CONFIG_PHOTOCD_DECODER 0 #define CONFIG_PICTOR_DECODER 0 #define CONFIG_PIXLET_DECODER 0 @@ -232,7 +228,6 @@ #define CONFIG_R210_DECODER 0 #define CONFIG_RASC_DECODER 0 #define CONFIG_RAWVIDEO_DECODER 0 -#define CONFIG_RKA_DECODER 0 #define CONFIG_RL2_DECODER 0 #define CONFIG_ROQ_DECODER 0 #define CONFIG_RPZA_DECODER 0 @@ -308,8 +303,6 @@ #define CONFIG_VP9_RKMPP_DECODER 0 #define CONFIG_VP9_V4L2M2M_DECODER 0 #define CONFIG_VQA_DECODER 0 -#define CONFIG_VQC_DECODER 0 -#define CONFIG_WBMP_DECODER 0 #define CONFIG_WEBP_DECODER 0 #define CONFIG_WCMV_DECODER 0 #define CONFIG_WRAPPED_AVFRAME_DECODER 0 @@ -344,7 +337,6 @@ #define CONFIG_ALS_DECODER 0 #define CONFIG_AMRNB_DECODER 0 #define CONFIG_AMRWB_DECODER 0 -#define CONFIG_APAC_DECODER 0 #define CONFIG_APE_DECODER 0 #define CONFIG_APTX_DECODER 0 #define CONFIG_APTX_HD_DECODER 0 @@ -357,7 +349,6 @@ #define CONFIG_BINKAUDIO_DCT_DECODER 0 #define CONFIG_BINKAUDIO_RDFT_DECODER 0 #define CONFIG_BMV_AUDIO_DECODER 0 -#define CONFIG_BONK_DECODER 0 #define CONFIG_COOK_DECODER 0 #define CONFIG_DCA_DECODER 0 #define CONFIG_DFPWM_DECODER 0 @@ -374,14 +365,12 @@ #define CONFIG_FASTAUDIO_DECODER 0 #define CONFIG_FFWAVESYNTH_DECODER 0 #define CONFIG_FLAC_DECODER 1 -#define CONFIG_FTR_DECODER 0 #define CONFIG_G723_1_DECODER 0 #define CONFIG_G729_DECODER 0 #define CONFIG_GSM_DECODER 0 #define CONFIG_GSM_MS_DECODER 0 #define CONFIG_HCA_DECODER 0 #define CONFIG_HCOM_DECODER 0 -#define CONFIG_HDR_DECODER 0 #define CONFIG_IAC_DECODER 0 #define CONFIG_ILBC_DECODER 0 #define CONFIG_IMC_DECODER 0 @@ -389,7 +378,6 @@ #define CONFIG_MACE3_DECODER 0 #define CONFIG_MACE6_DECODER 0 #define CONFIG_METASOUND_DECODER 0 -#define CONFIG_MISC4_DECODER 0 #define CONFIG_MLP_DECODER 0 #define CONFIG_MP1_DECODER 0 #define CONFIG_MP1FLOAT_DECODER 0 @@ -426,8 +414,7 @@ #define CONFIG_TTA_DECODER 0 #define CONFIG_TWINVQ_DECODER 0 #define CONFIG_VMDAUDIO_DECODER 0 -#define CONFIG_VORBIS_DECODER 1 -#define CONFIG_WAVARC_DECODER 0 +#define CONFIG_VORBIS_DECODER 0 #define CONFIG_WAVPACK_DECODER 0 #define CONFIG_WMALOSSLESS_DECODER 0 #define CONFIG_WMAPRO_DECODER 0 @@ -437,34 +424,34 @@ #define CONFIG_WS_SND1_DECODER 0 #define CONFIG_XMA1_DECODER 0 #define CONFIG_XMA2_DECODER 0 -#define CONFIG_PCM_ALAW_DECODER 1 +#define CONFIG_PCM_ALAW_DECODER 0 #define CONFIG_PCM_BLURAY_DECODER 0 #define CONFIG_PCM_DVD_DECODER 0 #define CONFIG_PCM_F16LE_DECODER 0 #define CONFIG_PCM_F24LE_DECODER 0 #define CONFIG_PCM_F32BE_DECODER 0 -#define CONFIG_PCM_F32LE_DECODER 1 +#define CONFIG_PCM_F32LE_DECODER 0 #define CONFIG_PCM_F64BE_DECODER 0 #define CONFIG_PCM_F64LE_DECODER 0 #define CONFIG_PCM_LXF_DECODER 0 -#define CONFIG_PCM_MULAW_DECODER 1 +#define CONFIG_PCM_MULAW_DECODER 0 #define CONFIG_PCM_S8_DECODER 0 #define CONFIG_PCM_S8_PLANAR_DECODER 0 #define CONFIG_PCM_S16BE_DECODER 0 #define CONFIG_PCM_S16BE_PLANAR_DECODER 0 -#define CONFIG_PCM_S16LE_DECODER 1 +#define CONFIG_PCM_S16LE_DECODER 0 #define CONFIG_PCM_S16LE_PLANAR_DECODER 0 #define CONFIG_PCM_S24BE_DECODER 0 #define CONFIG_PCM_S24DAUD_DECODER 0 -#define CONFIG_PCM_S24LE_DECODER 1 +#define CONFIG_PCM_S24LE_DECODER 0 #define CONFIG_PCM_S24LE_PLANAR_DECODER 0 #define CONFIG_PCM_S32BE_DECODER 0 -#define CONFIG_PCM_S32LE_DECODER 1 +#define CONFIG_PCM_S32LE_DECODER 0 #define CONFIG_PCM_S32LE_PLANAR_DECODER 0 #define CONFIG_PCM_S64BE_DECODER 0 #define CONFIG_PCM_S64LE_DECODER 0 #define CONFIG_PCM_SGA_DECODER 0 -#define CONFIG_PCM_U8_DECODER 1 +#define CONFIG_PCM_U8_DECODER 0 #define CONFIG_PCM_U16BE_DECODER 0 #define CONFIG_PCM_U16LE_DECODER 0 #define CONFIG_PCM_U24BE_DECODER 0 @@ -472,7 +459,6 @@ #define CONFIG_PCM_U32BE_DECODER 0 #define CONFIG_PCM_U32LE_DECODER 0 #define CONFIG_PCM_VIDC_DECODER 0 -#define CONFIG_CBD2_DPCM_DECODER 0 #define CONFIG_DERF_DPCM_DECODER 0 #define CONFIG_GREMLIN_DPCM_DECODER 0 #define CONFIG_INTERPLAY_DPCM_DECODER 0 @@ -480,7 +466,6 @@ #define CONFIG_SDX2_DPCM_DECODER 0 #define CONFIG_SOL_DPCM_DECODER 0 #define CONFIG_XAN_DPCM_DECODER 0 -#define CONFIG_WADY_DPCM_DECODER 0 #define CONFIG_ADPCM_4XM_DECODER 0 #define CONFIG_ADPCM_ADX_DECODER 0 #define CONFIG_ADPCM_AFC_DECODER 0 @@ -530,7 +515,6 @@ #define CONFIG_ADPCM_THP_LE_DECODER 0 #define CONFIG_ADPCM_VIMA_DECODER 0 #define CONFIG_ADPCM_XA_DECODER 0 -#define CONFIG_ADPCM_XMD_DECODER 0 #define CONFIG_ADPCM_YAMAHA_DECODER 0 #define CONFIG_ADPCM_ZORK_DECODER 0 #define CONFIG_SSA_DECODER 0 @@ -583,11 +567,11 @@ #define CONFIG_LIBOPENCORE_AMRNB_DECODER 0 #define CONFIG_LIBOPENCORE_AMRWB_DECODER 0 #define CONFIG_LIBOPENJPEG_DECODER 0 -#define CONFIG_LIBOPUS_DECODER 1 +#define CONFIG_LIBOPUS_DECODER 0 #define CONFIG_LIBRSVG_DECODER 0 #define CONFIG_LIBSPEEX_DECODER 0 #define CONFIG_LIBUAVS3D_DECODER 0 -#define CONFIG_LIBVORBIS_DECODER 1 +#define CONFIG_LIBVORBIS_DECODER 0 #define CONFIG_LIBVPX_VP8_DECODER 0 #define CONFIG_LIBVPX_VP9_DECODER 0 #define CONFIG_LIBZVBI_TELETEXT_DECODER 0 @@ -597,7 +581,6 @@ #define CONFIG_LIBAOM_AV1_DECODER 0 #define CONFIG_AV1_DECODER 1 #define CONFIG_AV1_CUVID_DECODER 0 -#define CONFIG_AV1_MEDIACODEC_DECODER 0 #define CONFIG_AV1_QSV_DECODER 0 #define CONFIG_LIBOPENH264_DECODER 0 #define CONFIG_H264_CUVID_DECODER 0 @@ -616,8 +599,6 @@ #define CONFIG_VP9_CUVID_DECODER 0 #define CONFIG_VP9_MEDIACODEC_DECODER 0 #define CONFIG_VP9_QSV_DECODER 0 -#define CONFIG_VNULL_DECODER 0 -#define CONFIG_ANULL_DECODER 0 #define CONFIG_A64MULTI_ENCODER 0 #define CONFIG_A64MULTI5_ENCODER 0 #define CONFIG_ALIAS_PIX_ENCODER 0 @@ -648,7 +629,6 @@ #define CONFIG_H261_ENCODER 0 #define CONFIG_H263_ENCODER 0 #define CONFIG_H263P_ENCODER 0 -#define CONFIG_H264_MEDIACODEC_ENCODER 0 #define CONFIG_HAP_ENCODER 0 #define CONFIG_HUFFYUV_ENCODER 0 #define CONFIG_JPEG2000_ENCODER 0 @@ -668,7 +648,6 @@ #define CONFIG_PFM_ENCODER 0 #define CONFIG_PGM_ENCODER 0 #define CONFIG_PGMYUV_ENCODER 0 -#define CONFIG_PHM_ENCODER 0 #define CONFIG_PNG_ENCODER 0 #define CONFIG_PPM_ENCODER 0 #define CONFIG_PRORES_ENCODER 0 @@ -699,7 +678,6 @@ #define CONFIG_V410_ENCODER 0 #define CONFIG_VBN_ENCODER 0 #define CONFIG_VC2_ENCODER 0 -#define CONFIG_WBMP_ENCODER 0 #define CONFIG_WRAPPED_AVFRAME_ENCODER 0 #define CONFIG_WMV1_ENCODER 0 #define CONFIG_WMV2_ENCODER 0 @@ -721,7 +699,6 @@ #define CONFIG_EAC3_ENCODER 0 #define CONFIG_FLAC_ENCODER 0 #define CONFIG_G723_1_ENCODER 0 -#define CONFIG_HDR_ENCODER 0 #define CONFIG_MLP_ENCODER 0 #define CONFIG_MP2_ENCODER 0 #define CONFIG_MP2FIXED_ENCODER 0 @@ -833,9 +810,6 @@ #define CONFIG_AAC_MF_ENCODER 0 #define CONFIG_AC3_MF_ENCODER 0 #define CONFIG_H263_V4L2M2M_ENCODER 0 -#define CONFIG_AV1_NVENC_ENCODER 0 -#define CONFIG_AV1_QSV_ENCODER 0 -#define CONFIG_AV1_AMF_ENCODER 0 #define CONFIG_LIBOPENH264_ENCODER 0 #define CONFIG_H264_AMF_ENCODER 0 #define CONFIG_H264_MF_ENCODER 0 @@ -846,7 +820,6 @@ #define CONFIG_H264_VAAPI_ENCODER 0 #define CONFIG_H264_VIDEOTOOLBOX_ENCODER 0 #define CONFIG_HEVC_AMF_ENCODER 0 -#define CONFIG_HEVC_MEDIACODEC_ENCODER 0 #define CONFIG_HEVC_MF_ENCODER 0 #define CONFIG_HEVC_NVENC_ENCODER 0 #define CONFIG_HEVC_QSV_ENCODER 0 @@ -866,8 +839,6 @@ #define CONFIG_VP8_VAAPI_ENCODER 0 #define CONFIG_VP9_VAAPI_ENCODER 0 #define CONFIG_VP9_QSV_ENCODER 0 -#define CONFIG_VNULL_ENCODER 0 -#define CONFIG_ANULL_ENCODER 0 #define CONFIG_AV1_D3D11VA_HWACCEL 0 #define CONFIG_AV1_D3D11VA2_HWACCEL 0 #define CONFIG_AV1_DXVA2_HWACCEL 0 @@ -950,7 +921,6 @@ #define CONFIG_DVDSUB_PARSER 0 #define CONFIG_DVD_NAV_PARSER 0 #define CONFIG_FLAC_PARSER 0 -#define CONFIG_FTR_PARSER 0 #define CONFIG_G723_1_PARSER 0 #define CONFIG_G729_PARSER 0 #define CONFIG_GIF_PARSER 0 @@ -959,10 +929,8 @@ #define CONFIG_H263_PARSER 0 #define CONFIG_H264_PARSER 0 #define CONFIG_HEVC_PARSER 0 -#define CONFIG_HDR_PARSER 0 #define CONFIG_IPU_PARSER 0 #define CONFIG_JPEG2000_PARSER 0 -#define CONFIG_MISC4_PARSER 0 #define CONFIG_MJPEG_PARSER 0 #define CONFIG_MLP_PARSER 0 #define CONFIG_MPEG4VIDEO_PARSER 0 @@ -985,7 +953,6 @@ #define CONFIG_WEBP_PARSER 0 #define CONFIG_XBM_PARSER 0 #define CONFIG_XMA_PARSER 0 -#define CONFIG_XWD_PARSER 0 #define CONFIG_ALSA_INDEV 0 #define CONFIG_ANDROID_CAMERA_INDEV 0 #define CONFIG_AVFOUNDATION_INDEV 0 @@ -1033,7 +1000,6 @@ #define CONFIG_ADELAY_FILTER 0 #define CONFIG_ADENORM_FILTER 0 #define CONFIG_ADERIVATIVE_FILTER 0 -#define CONFIG_ADRC_FILTER 0 #define CONFIG_ADYNAMICEQUALIZER_FILTER 0 #define CONFIG_ADYNAMICSMOOTH_FILTER 0 #define CONFIG_AECHO_FILTER 0 @@ -1156,7 +1122,6 @@ #define CONFIG_VOLUME_FILTER 0 #define CONFIG_VOLUMEDETECT_FILTER 0 #define CONFIG_AEVALSRC_FILTER 0 -#define CONFIG_AFDELAYSRC_FILTER 0 #define CONFIG_AFIRSRC_FILTER 0 #define CONFIG_ANOISESRC_FILTER 0 #define CONFIG_ANULLSRC_FILTER 0 @@ -1174,11 +1139,9 @@ #define CONFIG_AVGBLUR_FILTER 0 #define CONFIG_AVGBLUR_OPENCL_FILTER 0 #define CONFIG_AVGBLUR_VULKAN_FILTER 0 -#define CONFIG_BACKGROUNDKEY_FILTER 0 #define CONFIG_BBOX_FILTER 0 #define CONFIG_BENCH_FILTER 0 #define CONFIG_BILATERAL_FILTER 0 -#define CONFIG_BILATERAL_CUDA_FILTER 0 #define CONFIG_BITPLANENOISE_FILTER 0 #define CONFIG_BLACKDETECT_FILTER 0 #define CONFIG_BLACKFRAME_FILTER 0 @@ -1194,7 +1157,6 @@ #define CONFIG_CHROMABER_VULKAN_FILTER 0 #define CONFIG_CHROMAHOLD_FILTER 0 #define CONFIG_CHROMAKEY_FILTER 0 -#define CONFIG_CHROMAKEY_CUDA_FILTER 0 #define CONFIG_CHROMANR_FILTER 0 #define CONFIG_CHROMASHIFT_FILTER 0 #define CONFIG_CIESCOPE_FILTER 0 @@ -1211,14 +1173,12 @@ #define CONFIG_COLORMAP_FILTER 0 #define CONFIG_COLORMATRIX_FILTER 0 #define CONFIG_COLORSPACE_FILTER 0 -#define CONFIG_COLORSPACE_CUDA_FILTER 0 #define CONFIG_COLORTEMPERATURE_FILTER 0 #define CONFIG_CONVOLUTION_FILTER 0 #define CONFIG_CONVOLUTION_OPENCL_FILTER 0 #define CONFIG_CONVOLVE_FILTER 0 #define CONFIG_COPY_FILTER 0 #define CONFIG_COREIMAGE_FILTER 0 -#define CONFIG_CORR_FILTER 0 #define CONFIG_COVER_RECT_FILTER 0 #define CONFIG_CROP_FILTER 0 #define CONFIG_CROPDETECT_FILTER 0 @@ -1401,7 +1361,6 @@ #define CONFIG_READVITC_FILTER 0 #define CONFIG_REALTIME_FILTER 0 #define CONFIG_REMAP_FILTER 0 -#define CONFIG_REMAP_OPENCL_FILTER 0 #define CONFIG_REMOVEGRAIN_FILTER 0 #define CONFIG_REMOVELOGO_FILTER 0 #define CONFIG_REPEATFIELDS_FILTER 0 @@ -1453,7 +1412,6 @@ #define CONFIG_SPP_FILTER 0 #define CONFIG_SR_FILTER 0 #define CONFIG_SSIM_FILTER 0 -#define CONFIG_SSIM360_FILTER 0 #define CONFIG_STEREO3D_FILTER 0 #define CONFIG_STREAMSELECT_FILTER 0 #define CONFIG_SUBTITLES_FILTER 0 @@ -1518,12 +1476,6 @@ #define CONFIG_ZMQ_FILTER 0 #define CONFIG_ZOOMPAN_FILTER 0 #define CONFIG_ZSCALE_FILTER 0 -#define CONFIG_HSTACK_VAAPI_FILTER 0 -#define CONFIG_VSTACK_VAAPI_FILTER 0 -#define CONFIG_XSTACK_VAAPI_FILTER 0 -#define CONFIG_HSTACK_QSV_FILTER 0 -#define CONFIG_VSTACK_QSV_FILTER 0 -#define CONFIG_XSTACK_QSV_FILTER 0 #define CONFIG_ALLRGB_FILTER 0 #define CONFIG_ALLYUV_FILTER 0 #define CONFIG_CELLAUTO_FILTER 0 @@ -1531,7 +1483,6 @@ #define CONFIG_COLORCHART_FILTER 0 #define CONFIG_COLORSPECTRUM_FILTER 0 #define CONFIG_COREIMAGESRC_FILTER 0 -#define CONFIG_DDAGRAB_FILTER 0 #define CONFIG_FREI0R_SRC_FILTER 0 #define CONFIG_GRADIENTS_FILTER 0 #define CONFIG_HALDCLUTSRC_FILTER 0 @@ -1550,7 +1501,6 @@ #define CONFIG_TESTSRC2_FILTER 0 #define CONFIG_YUVTESTSRC_FILTER 0 #define CONFIG_NULLSINK_FILTER 0 -#define CONFIG_A3DSCOPE_FILTER 0 #define CONFIG_ABITSCOPE_FILTER 0 #define CONFIG_ADRAWGRAPH_FILTER 0 #define CONFIG_AGRAPHMONITOR_FILTER 0 @@ -1559,7 +1509,6 @@ #define CONFIG_AVECTORSCOPE_FILTER 0 #define CONFIG_CONCAT_FILTER 0 #define CONFIG_SHOWCQT_FILTER 0 -#define CONFIG_SHOWCWT_FILTER 0 #define CONFIG_SHOWFREQS_FILTER 0 #define CONFIG_SHOWSPATIAL_FILTER 0 #define CONFIG_SHOWSPECTRUM_FILTER 0 @@ -1593,7 +1542,6 @@ #define CONFIG_AMRNB_DEMUXER 0 #define CONFIG_AMRWB_DEMUXER 0 #define CONFIG_ANM_DEMUXER 0 -#define CONFIG_APAC_DEMUXER 0 #define CONFIG_APC_DEMUXER 0 #define CONFIG_APE_DEMUXER 0 #define CONFIG_APM_DEMUXER 0 @@ -1627,7 +1575,6 @@ #define CONFIG_BFSTM_DEMUXER 0 #define CONFIG_BRSTM_DEMUXER 0 #define CONFIG_BOA_DEMUXER 0 -#define CONFIG_BONK_DEMUXER 0 #define CONFIG_C93_DEMUXER 0 #define CONFIG_CAF_DEMUXER 0 #define CONFIG_CAVSVIDEO_DEMUXER 0 @@ -1712,7 +1659,6 @@ #define CONFIG_JV_DEMUXER 0 #define CONFIG_KUX_DEMUXER 0 #define CONFIG_KVAG_DEMUXER 0 -#define CONFIG_LAF_DEMUXER 0 #define CONFIG_LMLM4_DEMUXER 0 #define CONFIG_LOAS_DEMUXER 0 #define CONFIG_LUODAT_DEMUXER 0 @@ -1795,7 +1741,6 @@ #define CONFIG_RAWVIDEO_DEMUXER 0 #define CONFIG_REALTEXT_DEMUXER 0 #define CONFIG_REDSPARK_DEMUXER 0 -#define CONFIG_RKA_DEMUXER 0 #define CONFIG_RL2_DEMUXER 0 #define CONFIG_RM_DEMUXER 0 #define CONFIG_ROQ_DEMUXER 0 @@ -1811,7 +1756,6 @@ #define CONFIG_SBG_DEMUXER 0 #define CONFIG_SCC_DEMUXER 0 #define CONFIG_SCD_DEMUXER 0 -#define CONFIG_SDNS_DEMUXER 0 #define CONFIG_SDP_DEMUXER 0 #define CONFIG_SDR2_DEMUXER 0 #define CONFIG_SDS_DEMUXER 0 @@ -1863,8 +1807,6 @@ #define CONFIG_VPLAYER_DEMUXER 0 #define CONFIG_VQF_DEMUXER 0 #define CONFIG_W64_DEMUXER 0 -#define CONFIG_WADY_DEMUXER 0 -#define CONFIG_WAVARC_DEMUXER 0 #define CONFIG_WAV_DEMUXER 0 #define CONFIG_WC3_DEMUXER 0 #define CONFIG_WEBM_DASH_MANIFEST_DEMUXER 0 @@ -1877,7 +1819,6 @@ #define CONFIG_WV_DEMUXER 0 #define CONFIG_XA_DEMUXER 0 #define CONFIG_XBIN_DEMUXER 0 -#define CONFIG_XMD_DEMUXER 0 #define CONFIG_XMV_DEMUXER 0 #define CONFIG_XVAG_DEMUXER 0 #define CONFIG_XWMA_DEMUXER 0 @@ -1890,7 +1831,6 @@ #define CONFIG_IMAGE_EXR_PIPE_DEMUXER 0 #define CONFIG_IMAGE_GEM_PIPE_DEMUXER 0 #define CONFIG_IMAGE_GIF_PIPE_DEMUXER 0 -#define CONFIG_IMAGE_HDR_PIPE_DEMUXER 0 #define CONFIG_IMAGE_J2K_PIPE_DEMUXER 0 #define CONFIG_IMAGE_JPEG_PIPE_DEMUXER 0 #define CONFIG_IMAGE_JPEGLS_PIPE_DEMUXER 0 @@ -1898,11 +1838,9 @@ #define CONFIG_IMAGE_PAM_PIPE_DEMUXER 0 #define CONFIG_IMAGE_PBM_PIPE_DEMUXER 0 #define CONFIG_IMAGE_PCX_PIPE_DEMUXER 0 -#define CONFIG_IMAGE_PFM_PIPE_DEMUXER 0 #define CONFIG_IMAGE_PGMYUV_PIPE_DEMUXER 0 #define CONFIG_IMAGE_PGM_PIPE_DEMUXER 0 #define CONFIG_IMAGE_PGX_PIPE_DEMUXER 0 -#define CONFIG_IMAGE_PHM_PIPE_DEMUXER 0 #define CONFIG_IMAGE_PHOTOCD_PIPE_DEMUXER 0 #define CONFIG_IMAGE_PICTOR_PIPE_DEMUXER 0 #define CONFIG_IMAGE_PNG_PIPE_DEMUXER 0 @@ -2105,7 +2043,6 @@ #define CONFIG_CONCATF_PROTOCOL 0 #define CONFIG_CRYPTO_PROTOCOL 0 #define CONFIG_DATA_PROTOCOL 0 -#define CONFIG_FD_PROTOCOL 0 #define CONFIG_FFRTMPCRYPT_PROTOCOL 0 #define CONFIG_FFRTMPHTTP_PROTOCOL 0 #define CONFIG_FILE_PROTOCOL 0 @@ -2149,6 +2086,6 @@ #define CONFIG_LIBSSH_PROTOCOL 0 #define CONFIG_LIBSMBCLIENT_PROTOCOL 0 #define CONFIG_LIBZMQ_PROTOCOL 0 -#define CONFIG_IPFS_GATEWAY_PROTOCOL 0 -#define CONFIG_IPNS_GATEWAY_PROTOCOL 0 +#define CONFIG_IPFS_PROTOCOL 0 +#define CONFIG_IPNS_PROTOCOL 0 #endif /* FFMPEG_CONFIG_COMPONENTS_H */ diff --git a/media/ffvpx/ffvpxcommon.mozbuild b/media/ffvpx/ffvpxcommon.mozbuild index 96a69b27f3a1..3035d9da0e4f 100644 --- a/media/ffvpx/ffvpxcommon.mozbuild +++ b/media/ffvpx/ffvpxcommon.mozbuild @@ -22,8 +22,6 @@ if CONFIG['FFVPX_ASFLAGS']: LOCAL_INCLUDES += ['/media/ffvpx'] -USE_LIBS += [ 'gkcodecs' ] - # We allow warnings for third-party code that can be updated from upstream. AllowCompilerWarnings() diff --git a/media/ffvpx/libavcodec/aarch64/neon.S b/media/ffvpx/libavcodec/aarch64/neon.S index bc105e48619c..1ad32c359d41 100644 --- a/media/ffvpx/libavcodec/aarch64/neon.S +++ b/media/ffvpx/libavcodec/aarch64/neon.S @@ -1,8 +1,6 @@ /* * This file is part of FFmpeg. * - * Copyright (c) 2023 J. Dekker - * * FFmpeg 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 @@ -18,15 +16,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -.macro clip min, max, regs:vararg -.irp x, \regs - smax \x, \x, \min -.endr -.irp x, \regs - smin \x, \x, \max -.endr -.endm - .macro transpose_8x8B r0, r1, r2, r3, r4, r5, r6, r7, r8, r9 trn1 \r8\().8B, \r0\().8B, \r1\().8B trn2 \r9\().8B, \r0\().8B, \r1\().8B diff --git a/media/ffvpx/libavcodec/allcodecs.c b/media/ffvpx/libavcodec/allcodecs.c index 385ee348035d..e593ad19afc1 100644 --- a/media/ffvpx/libavcodec/allcodecs.c +++ b/media/ffvpx/libavcodec/allcodecs.c @@ -798,7 +798,7 @@ extern const FFCodec ff_libvorbis_decoder; extern const FFCodec ff_libvpx_vp8_encoder; extern const FFCodec ff_libvpx_vp8_decoder; extern FFCodec ff_libvpx_vp9_encoder; -extern const FFCodec ff_libvpx_vp9_decoder; +extern FFCodec ff_libvpx_vp9_decoder; /* preferred over libwebp */ extern const FFCodec ff_libwebp_anim_encoder; extern const FFCodec ff_libwebp_encoder; diff --git a/media/ffvpx/libavcodec/av1dec.c b/media/ffvpx/libavcodec/av1dec.c index 807852e317e8..d83c902f1f82 100644 --- a/media/ffvpx/libavcodec/av1dec.c +++ b/media/ffvpx/libavcodec/av1dec.c @@ -20,14 +20,11 @@ #include "config_components.h" -#include "libavutil/hdr_dynamic_metadata.h" #include "libavutil/film_grain_params.h" -#include "libavutil/mastering_display_metadata.h" #include "libavutil/pixdesc.h" #include "libavutil/opt.h" #include "avcodec.h" #include "av1dec.h" -#include "atsc_a53.h" #include "bytestream.h" #include "codec_internal.h" #include "decode.h" @@ -648,7 +645,6 @@ fail: static av_cold int av1_decode_free(AVCodecContext *avctx) { AV1DecContext *s = avctx->priv_data; - AV1RawMetadataITUTT35 itut_t35; for (int i = 0; i < FF_ARRAY_ELEMS(s->ref); i++) { av1_frame_unref(avctx, &s->ref[i]); @@ -659,14 +655,8 @@ static av_cold int av1_decode_free(AVCodecContext *avctx) av_buffer_unref(&s->seq_ref); av_buffer_unref(&s->header_ref); - av_buffer_unref(&s->cll_ref); - av_buffer_unref(&s->mdcv_ref); av_freep(&s->tile_group_info); - while (s->itut_t35_fifo && av_fifo_read(s->itut_t35_fifo, &itut_t35, 1) >= 0) - av_buffer_unref(&itut_t35.payload_ref); - av_fifo_freep2(&s->itut_t35_fifo); - ff_cbs_fragment_free(&s->current_obu); ff_cbs_close(&s->cbc); @@ -752,16 +742,6 @@ static int update_context_with_frame_header(AVCodecContext *avctx, return 0; } -static const CodedBitstreamUnitType decompose_unit_types[] = { - AV1_OBU_FRAME, - AV1_OBU_FRAME_HEADER, - AV1_OBU_METADATA, - AV1_OBU_REDUNDANT_FRAME_HEADER, - AV1_OBU_SEQUENCE_HEADER, - AV1_OBU_TEMPORAL_DELIMITER, - AV1_OBU_TILE_GROUP, -}; - static av_cold int av1_decode_init(AVCodecContext *avctx) { AV1DecContext *s = avctx->priv_data; @@ -791,14 +771,6 @@ static av_cold int av1_decode_init(AVCodecContext *avctx) if (ret < 0) return ret; - s->cbc->decompose_unit_types = decompose_unit_types; - s->cbc->nb_decompose_unit_types = FF_ARRAY_ELEMS(decompose_unit_types); - - s->itut_t35_fifo = av_fifo_alloc2(1, sizeof(AV1RawMetadataITUTT35), - AV_FIFO_FLAG_AUTO_GROW); - if (!s->itut_t35_fifo) - return AVERROR(ENOMEM); - av_opt_set_int(s->cbc->priv_data, "operating_point", s->operating_point, 0); if (avctx->extradata && avctx->extradata_size) { @@ -880,108 +852,6 @@ fail: return ret; } -static int export_itut_t35(AVCodecContext *avctx, AVFrame *frame, - const AV1RawMetadataITUTT35 *itut_t35) -{ - GetByteContext gb; - int ret, provider_code; - - bytestream2_init(&gb, itut_t35->payload, itut_t35->payload_size); - - provider_code = bytestream2_get_be16(&gb); - switch (provider_code) { - case 0x31: { // atsc_provider_code - uint32_t user_identifier = bytestream2_get_be32(&gb); - switch (user_identifier) { - case MKBETAG('G', 'A', '9', '4'): { // closed captions - AVBufferRef *buf = NULL; - - ret = ff_parse_a53_cc(&buf, gb.buffer, bytestream2_get_bytes_left(&gb)); - if (ret < 0) - return ret; - if (!ret) - break; - - if (!av_frame_new_side_data_from_buf(frame, AV_FRAME_DATA_A53_CC, buf)) - av_buffer_unref(&buf); - - avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS; - break; - } - default: // ignore unsupported identifiers - break; - } - break; - } - case 0x3C: { // smpte_provider_code - AVDynamicHDRPlus *hdrplus; - int provider_oriented_code = bytestream2_get_be16(&gb); - int application_identifier = bytestream2_get_byte(&gb); - - if (itut_t35->itu_t_t35_country_code != 0xB5 || - provider_oriented_code != 1 || application_identifier != 4) - break; - - hdrplus = av_dynamic_hdr_plus_create_side_data(frame); - if (!hdrplus) - return AVERROR(ENOMEM); - - ret = av_dynamic_hdr_plus_from_t35(hdrplus, gb.buffer, - bytestream2_get_bytes_left(&gb)); - if (ret < 0) - return ret; - break; - } - default: // ignore unsupported provider codes - break; - } - - return 0; -} - -static int export_metadata(AVCodecContext *avctx, AVFrame *frame) -{ - AV1DecContext *s = avctx->priv_data; - AV1RawMetadataITUTT35 itut_t35; - int ret = 0; - - if (s->mdcv) { - AVMasteringDisplayMetadata *mastering = av_mastering_display_metadata_create_side_data(frame); - if (!mastering) - return AVERROR(ENOMEM); - - for (int i = 0; i < 3; i++) { - mastering->display_primaries[i][0] = av_make_q(s->mdcv->primary_chromaticity_x[i], 1 << 16); - mastering->display_primaries[i][1] = av_make_q(s->mdcv->primary_chromaticity_y[i], 1 << 16); - } - mastering->white_point[0] = av_make_q(s->mdcv->white_point_chromaticity_x, 1 << 16); - mastering->white_point[1] = av_make_q(s->mdcv->white_point_chromaticity_y, 1 << 16); - - mastering->max_luminance = av_make_q(s->mdcv->luminance_max, 1 << 8); - mastering->min_luminance = av_make_q(s->mdcv->luminance_min, 1 << 14); - - mastering->has_primaries = 1; - mastering->has_luminance = 1; - } - - if (s->cll) { - AVContentLightMetadata *light = av_content_light_metadata_create_side_data(frame); - if (!light) - return AVERROR(ENOMEM); - - light->MaxCLL = s->cll->max_cll; - light->MaxFALL = s->cll->max_fall; - } - - while (av_fifo_read(s->itut_t35_fifo, &itut_t35, 1) >= 0) { - if (ret >= 0) - ret = export_itut_t35(avctx, frame, &itut_t35); - av_buffer_unref(&itut_t35.payload_ref); - } - - return ret; -} - static int export_film_grain(AVCodecContext *avctx, AVFrame *frame) { AV1DecContext *s = avctx->priv_data; @@ -1058,12 +928,6 @@ static int set_output_frame(AVCodecContext *avctx, AVFrame *frame, if (ret < 0) return ret; - ret = export_metadata(avctx, frame); - if (ret < 0) { - av_frame_unref(frame); - return ret; - } - if (avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN) { ret = export_film_grain(avctx, frame); if (ret < 0) { @@ -1074,11 +938,7 @@ static int set_output_frame(AVCodecContext *avctx, AVFrame *frame, frame->pts = pkt->pts; frame->pkt_dts = pkt->dts; -#if FF_API_FRAME_PKT -FF_DISABLE_DEPRECATION_WARNINGS frame->pkt_size = pkt->size; -FF_ENABLE_DEPRECATION_WARNINGS -#endif *got_frame = 1; @@ -1313,47 +1173,7 @@ static int av1_decode_frame(AVCodecContext *avctx, AVFrame *frame, case AV1_OBU_TILE_LIST: case AV1_OBU_TEMPORAL_DELIMITER: case AV1_OBU_PADDING: - break; case AV1_OBU_METADATA: - switch (obu->obu.metadata.metadata_type) { - case AV1_METADATA_TYPE_HDR_CLL: - av_buffer_unref(&s->cll_ref); - s->cll_ref = av_buffer_ref(unit->content_ref); - if (!s->cll_ref) { - s->cll = NULL; - ret = AVERROR(ENOMEM); - goto end; - } - s->cll = &obu->obu.metadata.metadata.hdr_cll; - break; - case AV1_METADATA_TYPE_HDR_MDCV: - av_buffer_unref(&s->mdcv_ref); - s->mdcv_ref = av_buffer_ref(unit->content_ref); - if (!s->mdcv_ref) { - s->mdcv = NULL; - ret = AVERROR(ENOMEM); - goto end; - } - s->mdcv = &obu->obu.metadata.metadata.hdr_mdcv; - break; - case AV1_METADATA_TYPE_ITUT_T35: { - AV1RawMetadataITUTT35 itut_t35; - memcpy(&itut_t35, &obu->obu.metadata.metadata.itut_t35, sizeof(itut_t35)); - itut_t35.payload_ref = av_buffer_ref(obu->obu.metadata.metadata.itut_t35.payload_ref); - if (!itut_t35.payload_ref) { - ret = AVERROR(ENOMEM); - goto end; - } - ret = av_fifo_write(s->itut_t35_fifo, &itut_t35, 1); - if (ret < 0) { - av_buffer_unref(&itut_t35.payload_ref); - goto end; - } - break; - } - default: - break; - } break; default: av_log(avctx, AV_LOG_DEBUG, @@ -1398,7 +1218,6 @@ end: static void av1_decode_flush(AVCodecContext *avctx) { AV1DecContext *s = avctx->priv_data; - AV1RawMetadataITUTT35 itut_t35; for (int i = 0; i < FF_ARRAY_ELEMS(s->ref); i++) av1_frame_unref(avctx, &s->ref[i]); @@ -1407,10 +1226,6 @@ static void av1_decode_flush(AVCodecContext *avctx) s->operating_point_idc = 0; s->raw_frame_header = NULL; s->raw_seq = NULL; - s->cll = NULL; - s->mdcv = NULL; - while (av_fifo_read(s->itut_t35_fifo, &itut_t35, 1) >= 0) - av_buffer_unref(&itut_t35.payload_ref); ff_cbs_flush(s->cbc); } diff --git a/media/ffvpx/libavcodec/av1dec.h b/media/ffvpx/libavcodec/av1dec.h index cef899f81f7d..82c7084e99fb 100644 --- a/media/ffvpx/libavcodec/av1dec.h +++ b/media/ffvpx/libavcodec/av1dec.h @@ -23,7 +23,6 @@ #include -#include "libavutil/fifo.h" #include "libavutil/buffer.h" #include "libavutil/frame.h" #include "libavutil/pixfmt.h" @@ -74,13 +73,6 @@ typedef struct AV1DecContext { AVBufferRef *header_ref; AV1RawFrameHeader *raw_frame_header; TileGroupInfo *tile_group_info; - - AVBufferRef *cll_ref; - AV1RawMetadataHDRCLL *cll; - AVBufferRef *mdcv_ref; - AV1RawMetadataHDRMDCV *mdcv; - AVFifo *itut_t35_fifo; - uint16_t tile_num; uint16_t tg_start; uint16_t tg_end; diff --git a/media/ffvpx/libavcodec/avcodec.h b/media/ffvpx/libavcodec/avcodec.h index 30f1d312f4eb..9a0fe97cad10 100644 --- a/media/ffvpx/libavcodec/avcodec.h +++ b/media/ffvpx/libavcodec/avcodec.h @@ -771,13 +771,11 @@ typedef struct AVCodecContext { */ float dark_masking; -#if FF_API_SLICE_OFFSET /** * slice count * - encoding: Set by libavcodec. * - decoding: Set by user (or 0). */ - attribute_deprecated int slice_count; /** @@ -785,9 +783,7 @@ typedef struct AVCodecContext { * - encoding: Set/allocated by libavcodec. * - decoding: Set/allocated by user (or NULL). */ - attribute_deprecated int *slice_offset; -#endif /** * sample aspect ratio (0 if unknown) @@ -1588,19 +1584,12 @@ typedef struct AVCodecContext { #define FF_PROFILE_DNXHR_HQX 4 #define FF_PROFILE_DNXHR_444 5 -#define FF_PROFILE_DTS 20 -#define FF_PROFILE_DTS_ES 30 -#define FF_PROFILE_DTS_96_24 40 -#define FF_PROFILE_DTS_HD_HRA 50 -#define FF_PROFILE_DTS_HD_MA 60 -#define FF_PROFILE_DTS_EXPRESS 70 -#define FF_PROFILE_DTS_HD_MA_X 61 -#define FF_PROFILE_DTS_HD_MA_X_IMAX 62 - - -#define FF_PROFILE_EAC3_DDP_ATMOS 30 - -#define FF_PROFILE_TRUEHD_ATMOS 30 +#define FF_PROFILE_DTS 20 +#define FF_PROFILE_DTS_ES 30 +#define FF_PROFILE_DTS_96_24 40 +#define FF_PROFILE_DTS_HD_HRA 50 +#define FF_PROFILE_DTS_HD_MA 60 +#define FF_PROFILE_DTS_EXPRESS 70 #define FF_PROFILE_MPEG2_422 0 #define FF_PROFILE_MPEG2_HIGH 1 @@ -2429,16 +2418,9 @@ int avcodec_parameters_to_context(AVCodecContext *codec, * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for * retrieving a codec. * - * Depending on the codec, you might need to set options in the codec context - * also for decoding (e.g. width, height, or the pixel or audio sample format in - * the case the information is not available in the bitstream, as when decoding - * raw audio or video). + * @note Always call this function before using decoding routines (such as + * @ref avcodec_receive_frame()). * - * Options in the codec context can be set either by setting them in the options - * AVDictionary, or by setting the values in the context itself, directly or by - * using the av_opt_set() API before calling this function. - * - * Example: * @code * av_dict_set(&opts, "b", "2.5M", 0); * codec = avcodec_find_decoder(AV_CODEC_ID_H264); @@ -2451,36 +2433,17 @@ int avcodec_parameters_to_context(AVCodecContext *codec, * exit(1); * @endcode * - * In the case AVCodecParameters are available (e.g. when demuxing a stream - * using libavformat, and accessing the AVStream contained in the demuxer), the - * codec parameters can be copied to the codec context using - * avcodec_parameters_to_context(), as in the following example: - * - * @code - * AVStream *stream = ...; - * context = avcodec_alloc_context3(codec); - * if (avcodec_parameters_to_context(context, stream->codecpar) < 0) - * exit(1); - * if (avcodec_open2(context, codec, NULL) < 0) - * exit(1); - * @endcode - * - * @note Always call this function before using decoding routines (such as - * @ref avcodec_receive_frame()). - * * @param avctx The context to initialize. * @param codec The codec to open this context for. If a non-NULL codec has been * previously passed to avcodec_alloc_context3() or * for this context, then this parameter MUST be either NULL or * equal to the previously passed codec. - * @param options A dictionary filled with AVCodecContext and codec-private - * options, which are set on top of the options already set in - * avctx, can be NULL. On return this object will be filled with - * options that were not found in the avctx codec context. + * @param options A dictionary filled with AVCodecContext and codec-private options. + * On return this object will be filled with options that were not found. * * @return zero on success, a negative value on error * @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(), - * av_dict_set(), av_opt_set(), av_opt_find(), avcodec_parameters_to_context() + * av_dict_set(), av_opt_find(). */ int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options); diff --git a/media/ffvpx/libavcodec/codec_desc.c b/media/ffvpx/libavcodec/codec_desc.c index e80ac0770064..199f62df15b1 100644 --- a/media/ffvpx/libavcodec/codec_desc.c +++ b/media/ffvpx/libavcodec/codec_desc.c @@ -2931,7 +2931,6 @@ static const AVCodecDescriptor codec_descriptors[] = { .name = "eac3", .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52B (AC-3, E-AC-3)"), .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY, - .profiles = NULL_IF_CONFIG_SMALL(ff_eac3_profiles), }, { .id = AV_CODEC_ID_SIPR, @@ -2960,7 +2959,6 @@ static const AVCodecDescriptor codec_descriptors[] = { .name = "truehd", .long_name = NULL_IF_CONFIG_SMALL("TrueHD"), .props = AV_CODEC_PROP_LOSSLESS, - .profiles = NULL_IF_CONFIG_SMALL(ff_truehd_profiles), }, { .id = AV_CODEC_ID_MP4ALS, diff --git a/media/ffvpx/libavcodec/codec_list.c b/media/ffvpx/libavcodec/codec_list.c index 60df66a4b759..db49c8fffb06 100644 --- a/media/ffvpx/libavcodec/codec_list.c +++ b/media/ffvpx/libavcodec/codec_list.c @@ -16,32 +16,5 @@ static const FFCodec * const codec_list[] = { #endif #if CONFIG_AV1_DECODER &ff_av1_decoder, -#endif -#if CONFIG_LIBVORBIS_DECODER - &ff_libvorbis_decoder, -#endif -#if CONFIG_PCM_ALAW_DECODER - &ff_pcm_alaw_decoder, -#endif -#if CONFIG_PCM_F32LE_DECODER - &ff_pcm_f32le_decoder, -#endif -#if CONFIG_PCM_MULAW_DECODER - &ff_pcm_mulaw_decoder, -#endif -#if CONFIG_PCM_S16LE_DECODER - &ff_pcm_s16le_decoder, -#endif -#if CONFIG_PCM_S24LE_DECODER - &ff_pcm_s24le_decoder, -#endif -#if CONFIG_PCM_S32LE_DECODER - &ff_pcm_s32le_decoder, -#endif -#if CONFIG_PCM_U8_DECODER - &ff_pcm_u8_decoder, -#endif -#if CONFIG_LIBOPUS_DECODER - &ff_libopus_decoder, #endif NULL }; diff --git a/media/ffvpx/libavcodec/decode.c b/media/ffvpx/libavcodec/decode.c index 40f5a3ba5989..be2be81089fc 100644 --- a/media/ffvpx/libavcodec/decode.c +++ b/media/ffvpx/libavcodec/decode.c @@ -139,10 +139,8 @@ static int extract_packet_props(AVCodecInternal *avci, const AVPacket *pkt) av_packet_unref(avci->last_pkt_props); if (pkt) { ret = av_packet_copy_props(avci->last_pkt_props, pkt); -#if FF_API_FRAME_PKT if (!ret) - avci->last_pkt_props->stream_index = pkt->size; // Needed for ff_decode_frame_props(). -#endif + avci->last_pkt_props->opaque = (void *)(intptr_t)pkt->size; // Needed for ff_decode_frame_props(). } return ret; } @@ -289,12 +287,8 @@ static inline int decode_simple_internal(AVCodecContext *avctx, AVFrame *frame, if (!(codec->caps_internal & FF_CODEC_CAP_SETS_PKT_DTS)) frame->pkt_dts = pkt->dts; if (avctx->codec->type == AVMEDIA_TYPE_VIDEO) { -#if FF_API_FRAME_PKT -FF_DISABLE_DEPRECATION_WARNINGS if(!avctx->has_b_frames) frame->pkt_pos = pkt->pos; -FF_ENABLE_DEPRECATION_WARNINGS -#endif //FIXME these should be under if(!avctx->has_b_frames) /* get_buffer is supposed to set frame parameters */ if (!(avctx->codec->capabilities & AV_CODEC_CAP_DR1)) { @@ -466,10 +460,8 @@ FF_ENABLE_DEPRECATION_WARNINGS pkt->pts = AV_NOPTS_VALUE; pkt->dts = AV_NOPTS_VALUE; if (!(codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) { -#if FF_API_FRAME_PKT // See extract_packet_props() comment. - avci->last_pkt_props->stream_index = avci->last_pkt_props->stream_index - consumed; -#endif + avci->last_pkt_props->opaque = (void *)((intptr_t)avci->last_pkt_props->opaque - consumed); avci->last_pkt_props->pts = AV_NOPTS_VALUE; avci->last_pkt_props->dts = AV_NOPTS_VALUE; } @@ -555,7 +547,6 @@ static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame) if (codec->cb_type == FF_CODEC_CB_TYPE_RECEIVE_FRAME) { ret = codec->cb.receive_frame(avctx, frame); - emms_c(); } else ret = decode_simple_receive_frame(avctx, frame); @@ -1321,13 +1312,9 @@ int ff_decode_frame_props_from_pkt(const AVCodecContext *avctx, }; frame->pts = pkt->pts; - frame->duration = pkt->duration; -#if FF_API_FRAME_PKT -FF_DISABLE_DEPRECATION_WARNINGS frame->pkt_pos = pkt->pos; + frame->duration = pkt->duration; frame->pkt_size = pkt->size; -FF_ENABLE_DEPRECATION_WARNINGS -#endif for (int i = 0; i < FF_ARRAY_ELEMS(sd); i++) { size_t size; @@ -1368,11 +1355,7 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame) int ret = ff_decode_frame_props_from_pkt(avctx, frame, pkt); if (ret < 0) return ret; -#if FF_API_FRAME_PKT -FF_DISABLE_DEPRECATION_WARNINGS - frame->pkt_size = pkt->stream_index; -FF_ENABLE_DEPRECATION_WARNINGS -#endif + frame->pkt_size = (int)(intptr_t)pkt->opaque; } #if FF_API_REORDERED_OPAQUE FF_DISABLE_DEPRECATION_WARNINGS diff --git a/media/ffvpx/libavcodec/libdav1d.c b/media/ffvpx/libavcodec/libdav1d.c index ddf2311a41a7..2488a709c722 100644 --- a/media/ffvpx/libavcodec/libdav1d.c +++ b/media/ffvpx/libavcodec/libdav1d.c @@ -24,7 +24,6 @@ #include "libavutil/avassert.h" #include "libavutil/cpu.h" #include "libavutil/film_grain_params.h" -#include "libavutil/hdr_dynamic_metadata.h" #include "libavutil/mastering_display_metadata.h" #include "libavutil/imgutils.h" #include "libavutil/opt.h" @@ -512,57 +511,29 @@ FF_ENABLE_DEPRECATION_WARNINGS } if (p->itut_t35) { GetByteContext gb; - int provider_code; + unsigned int user_identifier; bytestream2_init(&gb, p->itut_t35->payload, p->itut_t35->payload_size); + bytestream2_skip(&gb, 1); // terminal provider code + bytestream2_skip(&gb, 1); // terminal provider oriented code + user_identifier = bytestream2_get_be32(&gb); + switch (user_identifier) { + case MKBETAG('G', 'A', '9', '4'): { // closed captions + AVBufferRef *buf = NULL; - provider_code = bytestream2_get_be16(&gb); - switch (provider_code) { - case 0x31: { // atsc_provider_code - uint32_t user_identifier = bytestream2_get_be32(&gb); - switch (user_identifier) { - case MKBETAG('G', 'A', '9', '4'): { // closed captions - AVBufferRef *buf = NULL; - - res = ff_parse_a53_cc(&buf, gb.buffer, bytestream2_get_bytes_left(&gb)); - if (res < 0) - goto fail; - if (!res) - break; - - if (!av_frame_new_side_data_from_buf(frame, AV_FRAME_DATA_A53_CC, buf)) - av_buffer_unref(&buf); - - c->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS; - break; - } - default: // ignore unsupported identifiers - break; - } - break; - } - case 0x3C: { // smpte_provider_code - AVDynamicHDRPlus *hdrplus; - int provider_oriented_code = bytestream2_get_be16(&gb); - int application_identifier = bytestream2_get_byte(&gb); - - if (p->itut_t35->country_code != 0xB5 || - provider_oriented_code != 1 || application_identifier != 4) - break; - - hdrplus = av_dynamic_hdr_plus_create_side_data(frame); - if (!hdrplus) { - res = AVERROR(ENOMEM); - goto fail; - } - - res = av_dynamic_hdr_plus_from_t35(hdrplus, gb.buffer, - bytestream2_get_bytes_left(&gb)); + res = ff_parse_a53_cc(&buf, gb.buffer, bytestream2_get_bytes_left(&gb)); if (res < 0) goto fail; + if (!res) + break; + + if (!av_frame_new_side_data_from_buf(frame, AV_FRAME_DATA_A53_CC, buf)) + av_buffer_unref(&buf); + + c->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS; break; } - default: // ignore unsupported provider codes + default: // ignore unsupported identifiers break; } } diff --git a/media/ffvpx/libavcodec/libopus.c b/media/ffvpx/libavcodec/libopus.c deleted file mode 100644 index 3d3b740a83c3..000000000000 --- a/media/ffvpx/libavcodec/libopus.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - * libopus encoder/decoder common code - * Copyright (c) 2012 Nicolas George - * - * This file is part of FFmpeg. - * - * FFmpeg 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. - * - * FFmpeg 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include "libavutil/error.h" -#include "libopus.h" - -int ff_opus_error_to_averror(int err) -{ - switch (err) { - case OPUS_BAD_ARG: - return AVERROR(EINVAL); - case OPUS_BUFFER_TOO_SMALL: - return AVERROR_UNKNOWN; - case OPUS_INTERNAL_ERROR: - return AVERROR(EFAULT); - case OPUS_INVALID_PACKET: - return AVERROR_INVALIDDATA; - case OPUS_UNIMPLEMENTED: - return AVERROR(ENOSYS); - case OPUS_INVALID_STATE: - return AVERROR_UNKNOWN; - case OPUS_ALLOC_FAIL: - return AVERROR(ENOMEM); - default: - return AVERROR(EINVAL); - } -} diff --git a/media/ffvpx/libavcodec/libopus.h b/media/ffvpx/libavcodec/libopus.h deleted file mode 100644 index a8223d1d6f1d..000000000000 --- a/media/ffvpx/libavcodec/libopus.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * libopus encoder/decoder common code - * Copyright (c) 2012 Nicolas George - * - * This file is part of FFmpeg. - * - * FFmpeg 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. - * - * FFmpeg 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef AVCODEC_LIBOPUS_H -#define AVCODEC_LIBOPUS_H - -int ff_opus_error_to_averror(int err); - -#endif /* AVCODEC_LIBOPUS_H */ diff --git a/media/ffvpx/libavcodec/libopusdec.c b/media/ffvpx/libavcodec/libopusdec.c deleted file mode 100644 index 9b9a61034308..000000000000 --- a/media/ffvpx/libavcodec/libopusdec.c +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Opus decoder using libopus - * Copyright (c) 2012 Nicolas George - * - * This file is part of FFmpeg. - * - * FFmpeg 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. - * - * FFmpeg 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include - -#include "libavutil/internal.h" -#include "libavutil/intreadwrite.h" -#include "libavutil/ffmath.h" -#include "libavutil/opt.h" - -#include "avcodec.h" -#include "codec_internal.h" -#include "decode.h" -#include "internal.h" -#include "mathops.h" -#include "libopus.h" -#include "vorbis_data.h" - -struct libopus_context { - AVClass *class; - OpusMSDecoder *dec; - int pre_skip; -#ifndef OPUS_SET_GAIN - union { int i; double d; } gain; -#endif -#ifdef OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST - int apply_phase_inv; -#endif -}; - -#define OPUS_HEAD_SIZE 19 - -static av_cold int libopus_decode_init(AVCodecContext *avc) -{ - struct libopus_context *opus = avc->priv_data; - int ret, channel_map = 0, gain_db = 0, nb_streams, nb_coupled, channels; - uint8_t mapping_arr[8] = { 0, 1 }, *mapping; - - channels = avc->extradata_size >= 10 ? avc->extradata[9] : (avc->ch_layout.nb_channels == 1) ? 1 : 2; - if (channels <= 0) { - av_log(avc, AV_LOG_WARNING, - "Invalid number of channels %d, defaulting to stereo\n", channels); - channels = 2; - } - - avc->sample_rate = 48000; - avc->sample_fmt = avc->request_sample_fmt == AV_SAMPLE_FMT_FLT ? - AV_SAMPLE_FMT_FLT : AV_SAMPLE_FMT_S16; - av_channel_layout_uninit(&avc->ch_layout); - if (channels > 8) { - avc->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC; - avc->ch_layout.nb_channels = channels; - } else { - av_channel_layout_copy(&avc->ch_layout, &ff_vorbis_ch_layouts[channels - 1]); - } - - if (avc->extradata_size >= OPUS_HEAD_SIZE) { - opus->pre_skip = AV_RL16(avc->extradata + 10); - gain_db = sign_extend(AV_RL16(avc->extradata + 16), 16); - channel_map = AV_RL8 (avc->extradata + 18); - } - if (avc->extradata_size >= OPUS_HEAD_SIZE + 2 + channels) { - nb_streams = avc->extradata[OPUS_HEAD_SIZE + 0]; - nb_coupled = avc->extradata[OPUS_HEAD_SIZE + 1]; - if (nb_streams + nb_coupled != channels) - av_log(avc, AV_LOG_WARNING, "Inconsistent channel mapping.\n"); - mapping = avc->extradata + OPUS_HEAD_SIZE + 2; - } else { - if (channels > 2 || channel_map) { - av_log(avc, AV_LOG_ERROR, - "No channel mapping for %d channels.\n", channels); - return AVERROR(EINVAL); - } - nb_streams = 1; - nb_coupled = channels > 1; - mapping = mapping_arr; - } - - if (channels > 2 && channels <= 8) { - const uint8_t *vorbis_offset = ff_vorbis_channel_layout_offsets[channels - 1]; - int ch; - - /* Remap channels from Vorbis order to ffmpeg order */ - for (ch = 0; ch < channels; ch++) - mapping_arr[ch] = mapping[vorbis_offset[ch]]; - mapping = mapping_arr; - } - - opus->dec = opus_multistream_decoder_create(avc->sample_rate, channels, - nb_streams, nb_coupled, - mapping, &ret); - if (!opus->dec) { - av_log(avc, AV_LOG_ERROR, "Unable to create decoder: %s\n", - opus_strerror(ret)); - return ff_opus_error_to_averror(ret); - } - -#ifdef OPUS_SET_GAIN - ret = opus_multistream_decoder_ctl(opus->dec, OPUS_SET_GAIN(gain_db)); - if (ret != OPUS_OK) - av_log(avc, AV_LOG_WARNING, "Failed to set gain: %s\n", - opus_strerror(ret)); -#else - { - double gain_lin = ff_exp10(gain_db / (20.0 * 256)); - if (avc->sample_fmt == AV_SAMPLE_FMT_FLT) - opus->gain.d = gain_lin; - else - opus->gain.i = FFMIN(gain_lin * 65536, INT_MAX); - } -#endif - -#ifdef OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST - ret = opus_multistream_decoder_ctl(opus->dec, - OPUS_SET_PHASE_INVERSION_DISABLED(!opus->apply_phase_inv)); - if (ret != OPUS_OK) - av_log(avc, AV_LOG_WARNING, - "Unable to set phase inversion: %s\n", - opus_strerror(ret)); -#endif - - /* Decoder delay (in samples) at 48kHz */ - avc->delay = avc->internal->skip_samples = opus->pre_skip; - - return 0; -} - -static av_cold int libopus_decode_close(AVCodecContext *avc) -{ - struct libopus_context *opus = avc->priv_data; - - if (opus->dec) { - opus_multistream_decoder_destroy(opus->dec); - opus->dec = NULL; - } - return 0; -} - -#define MAX_FRAME_SIZE (960 * 6) - -static int libopus_decode(AVCodecContext *avc, AVFrame *frame, - int *got_frame_ptr, AVPacket *pkt) -{ - struct libopus_context *opus = avc->priv_data; - int ret, nb_samples; - - frame->nb_samples = MAX_FRAME_SIZE; - if ((ret = ff_get_buffer(avc, frame, 0)) < 0) - return ret; - - if (avc->sample_fmt == AV_SAMPLE_FMT_S16) - nb_samples = opus_multistream_decode(opus->dec, pkt->data, pkt->size, - (opus_int16 *)frame->data[0], - frame->nb_samples, 0); - else - nb_samples = opus_multistream_decode_float(opus->dec, pkt->data, pkt->size, - (float *)frame->data[0], - frame->nb_samples, 0); - - if (nb_samples < 0) { - av_log(avc, AV_LOG_ERROR, "Decoding error: %s\n", - opus_strerror(nb_samples)); - return ff_opus_error_to_averror(nb_samples); - } - -#ifndef OPUS_SET_GAIN - { - int i = avc->ch_layout.nb_channels * nb_samples; - if (avc->sample_fmt == AV_SAMPLE_FMT_FLT) { - float *pcm = (float *)frame->data[0]; - for (; i > 0; i--, pcm++) - *pcm = av_clipf(*pcm * opus->gain.d, -1, 1); - } else { - int16_t *pcm = (int16_t *)frame->data[0]; - for (; i > 0; i--, pcm++) - *pcm = av_clip_int16(((int64_t)opus->gain.i * *pcm) >> 16); - } - } -#endif - - frame->nb_samples = nb_samples; - *got_frame_ptr = 1; - - return pkt->size; -} - -static void libopus_flush(AVCodecContext *avc) -{ - struct libopus_context *opus = avc->priv_data; - - opus_multistream_decoder_ctl(opus->dec, OPUS_RESET_STATE); - /* The stream can have been extracted by a tool that is not Opus-aware. - Therefore, any packet can become the first of the stream. */ - avc->internal->skip_samples = opus->pre_skip; -} - - -#define OFFSET(x) offsetof(struct libopus_context, x) -#define FLAGS AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM -static const AVOption libopusdec_options[] = { -#ifdef OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST - { "apply_phase_inv", "Apply intensity stereo phase inversion", OFFSET(apply_phase_inv), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, FLAGS }, -#endif - { NULL }, -}; - -static const AVClass libopusdec_class = { - .class_name = "libopusdec", - .item_name = av_default_item_name, - .option = libopusdec_options, - .version = LIBAVUTIL_VERSION_INT, -}; - - -const FFCodec ff_libopus_decoder = { - .p.name = "libopus", - CODEC_LONG_NAME("libopus Opus"), - .p.type = AVMEDIA_TYPE_AUDIO, - .p.id = AV_CODEC_ID_OPUS, - .priv_data_size = sizeof(struct libopus_context), - .init = libopus_decode_init, - .close = libopus_decode_close, - FF_CODEC_DECODE_CB(libopus_decode), - .flush = libopus_flush, - .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF, - .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | - FF_CODEC_CAP_INIT_CLEANUP, - .p.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLT, - AV_SAMPLE_FMT_S16, - AV_SAMPLE_FMT_NONE }, - .p.priv_class = &libopusdec_class, - .p.wrapper_name = "libopus", -}; diff --git a/media/ffvpx/libavcodec/libvorbisdec.c b/media/ffvpx/libavcodec/libvorbisdec.c deleted file mode 100644 index a5e7a691d66f..000000000000 --- a/media/ffvpx/libavcodec/libvorbisdec.c +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright (c) 2002 Mark Hills - * - * This file is part of FFmpeg. - * - * FFmpeg 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. - * - * FFmpeg 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include "avcodec.h" -#include "bytestream.h" -#include "codec_internal.h" -#include "decode.h" - -typedef struct OggVorbisDecContext { - vorbis_info vi; /**< vorbis_info used during init */ - vorbis_dsp_state vd; /**< DSP state used for analysis */ - vorbis_block vb; /**< vorbis_block used for analysis */ - vorbis_comment vc; /**< VorbisComment info */ - ogg_packet op; /**< ogg packet */ -} OggVorbisDecContext; - -static int oggvorbis_decode_close(AVCodecContext *avccontext); - -static int oggvorbis_decode_init(AVCodecContext *avccontext) { - OggVorbisDecContext *context = avccontext->priv_data ; - uint8_t *p= avccontext->extradata; - int i, hsizes[3], ret; - unsigned char *headers[3], *extradata = avccontext->extradata; - - if(! avccontext->extradata_size || ! p) { - av_log(avccontext, AV_LOG_ERROR, "vorbis extradata absent\n"); - return AVERROR(EINVAL); - } - - vorbis_info_init(&context->vi) ; - vorbis_comment_init(&context->vc) ; - - if(p[0] == 0 && p[1] == 30) { - int sizesum = 0; - for(i = 0; i < 3; i++){ - hsizes[i] = bytestream_get_be16((const uint8_t **)&p); - sizesum += 2 + hsizes[i]; - if (sizesum > avccontext->extradata_size) { - av_log(avccontext, AV_LOG_ERROR, "vorbis extradata too small\n"); - ret = AVERROR_INVALIDDATA; - goto error; - } - - headers[i] = p; - p += hsizes[i]; - } - } else if(*p == 2) { - unsigned int offset = 1; - unsigned int sizesum = 1; - p++; - for(i=0; i<2; i++) { - hsizes[i] = 0; - while((*p == 0xFF) && (sizesum < avccontext->extradata_size)) { - hsizes[i] += 0xFF; - offset++; - sizesum += 1 + 0xFF; - p++; - } - hsizes[i] += *p; - offset++; - sizesum += 1 + *p; - if(sizesum > avccontext->extradata_size) { - av_log(avccontext, AV_LOG_ERROR, - "vorbis header sizes damaged\n"); - ret = AVERROR_INVALIDDATA; - goto error; - } - p++; - } - hsizes[2] = avccontext->extradata_size - hsizes[0]-hsizes[1]-offset; -#if 0 - av_log(avccontext, AV_LOG_DEBUG, - "vorbis header sizes: %d, %d, %d, / extradata_len is %d \n", - hsizes[0], hsizes[1], hsizes[2], avccontext->extradata_size); -#endif - headers[0] = extradata + offset; - headers[1] = extradata + offset + hsizes[0]; - headers[2] = extradata + offset + hsizes[0] + hsizes[1]; - } else { - av_log(avccontext, AV_LOG_ERROR, - "vorbis initial header len is wrong: %d\n", *p); - ret = AVERROR_INVALIDDATA; - goto error; - } - - for(i=0; i<3; i++){ - context->op.b_o_s= i==0; - context->op.bytes = hsizes[i]; - context->op.packet = headers[i]; - if(vorbis_synthesis_headerin(&context->vi, &context->vc, &context->op)<0){ - av_log(avccontext, AV_LOG_ERROR, "%d. vorbis header damaged\n", i+1); - ret = AVERROR_INVALIDDATA; - goto error; - } - } - - av_channel_layout_uninit(&avccontext->ch_layout); - avccontext->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC; - avccontext->ch_layout.nb_channels = context->vi.channels; - avccontext->sample_rate = context->vi.rate; - avccontext->sample_fmt = AV_SAMPLE_FMT_S16; - avccontext->time_base= (AVRational){1, avccontext->sample_rate}; - - vorbis_synthesis_init(&context->vd, &context->vi); - vorbis_block_init(&context->vd, &context->vb); - - return 0 ; - - error: - oggvorbis_decode_close(avccontext); - return ret; -} - - -static inline int conv(int samples, float **pcm, char *buf, int channels) { - int i, j; - ogg_int16_t *ptr, *data = (ogg_int16_t*)buf ; - float *mono ; - - for(i = 0 ; i < channels ; i++){ - ptr = &data[i]; - mono = pcm[i] ; - - for(j = 0 ; j < samples ; j++) { - *ptr = av_clip_int16(mono[j] * 32767.f); - ptr += channels; - } - } - - return 0 ; -} - -static int oggvorbis_decode_frame(AVCodecContext *avccontext, AVFrame *frame, - int *got_frame_ptr, AVPacket *avpkt) -{ - OggVorbisDecContext *context = avccontext->priv_data ; - float **pcm ; - ogg_packet *op= &context->op; - int samples, total_samples, total_bytes; - int ret; - int16_t *output; - - if(!avpkt->size){ - //FIXME flush - return 0; - } - - frame->nb_samples = 8192*4; - if ((ret = ff_get_buffer(avccontext, frame, 0)) < 0) - return ret; - output = (int16_t *)frame->data[0]; - - - op->packet = avpkt->data; - op->bytes = avpkt->size; - -// av_log(avccontext, AV_LOG_DEBUG, "%d %d %d %"PRId64" %"PRId64" %d %d\n", op->bytes, op->b_o_s, op->e_o_s, op->granulepos, op->packetno, buf_size, context->vi.rate); - -/* for(i=0; ibytes; i++) - av_log(avccontext, AV_LOG_DEBUG, "%02X ", op->packet[i]); - av_log(avccontext, AV_LOG_DEBUG, "\n");*/ - - if(vorbis_synthesis(&context->vb, op) == 0) - vorbis_synthesis_blockin(&context->vd, &context->vb) ; - - total_samples = 0 ; - total_bytes = 0 ; - - while((samples = vorbis_synthesis_pcmout(&context->vd, &pcm)) > 0) { - conv(samples, pcm, (char*)output + total_bytes, context->vi.channels) ; - total_bytes += samples * 2 * context->vi.channels ; - total_samples += samples ; - vorbis_synthesis_read(&context->vd, samples) ; - } - - frame->nb_samples = total_samples; - *got_frame_ptr = total_samples > 0; - return avpkt->size; -} - - -static int oggvorbis_decode_close(AVCodecContext *avccontext) { - OggVorbisDecContext *context = avccontext->priv_data ; - - vorbis_block_clear(&context->vb); - vorbis_dsp_clear(&context->vd); - vorbis_info_clear(&context->vi) ; - vorbis_comment_clear(&context->vc) ; - - return 0 ; -} - - -const FFCodec ff_libvorbis_decoder = { - .p.name = "libvorbis", - CODEC_LONG_NAME("libvorbis"), - .p.type = AVMEDIA_TYPE_AUDIO, - .p.id = AV_CODEC_ID_VORBIS, - .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_CHANNEL_CONF, - .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE, - .priv_data_size = sizeof(OggVorbisDecContext), - .init = oggvorbis_decode_init, - FF_CODEC_DECODE_CB(oggvorbis_decode_frame), - .close = oggvorbis_decode_close, -}; diff --git a/media/ffvpx/libavcodec/moz.build b/media/ffvpx/libavcodec/moz.build index 750def0cb3fc..5675c28234a1 100644 --- a/media/ffvpx/libavcodec/moz.build +++ b/media/ffvpx/libavcodec/moz.build @@ -46,9 +46,6 @@ SOURCES += [ 'jfdctfst.c', 'jfdctint.c', 'jrevdct.c', - 'libopus.c', - 'libopusdec.c', - 'libvorbisdec.c', 'log2_tab.c', 'mpegaudio.c', 'mpegaudiodata.c', @@ -64,7 +61,6 @@ SOURCES += [ 'options.c', 'parser.c', 'parsers.c', - 'pcm.c', 'profiles.c', 'pthread.c', 'pthread_frame.c', @@ -75,7 +71,6 @@ SOURCES += [ 'utils.c', 'version.c', 'vlc.c', - 'vorbis_data.c', 'vorbis_parser.c', 'xiph.c' ] @@ -130,11 +125,6 @@ if not CONFIG['MOZ_FFVPX_AUDIOONLY']: 'mozva' ] -LOCAL_INCLUDES += [ - '/media/libopus/include', - '/media/libvorbis', -] - if CONFIG['MOZ_LIBAV_FFT']: SOURCES += [ 'avfft.c', diff --git a/media/ffvpx/libavcodec/options_table.h b/media/ffvpx/libavcodec/options_table.h index f331ce28619d..4fea57673ad0 100644 --- a/media/ffvpx/libavcodec/options_table.h +++ b/media/ffvpx/libavcodec/options_table.h @@ -177,9 +177,7 @@ static const AVOption avcodec_options[] = { {"xvidmmx", "deprecated, for compatibility only", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_XVID }, INT_MIN, INT_MAX, V|E|D, "idct"}, {"faani", "floating point AAN IDCT", 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_FAAN }, INT_MIN, INT_MAX, V|D|E, "idct"}, {"simpleauto", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_IDCT_SIMPLEAUTO }, INT_MIN, INT_MAX, V|E|D, "idct"}, -#if FF_API_SLICE_OFFSET {"slice_count", NULL, OFFSET(slice_count), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX}, -#endif {"ec", "set error concealment strategy", OFFSET(error_concealment), AV_OPT_TYPE_FLAGS, {.i64 = 3 }, INT_MIN, INT_MAX, V|D, "ec"}, {"guess_mvs", "iterative motion vector (MV) search (slow)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_EC_GUESS_MVS }, INT_MIN, INT_MAX, V|D, "ec"}, {"deblock", "use strong deblock filter for damaged MBs", 0, AV_OPT_TYPE_CONST, {.i64 = FF_EC_DEBLOCK }, INT_MIN, INT_MAX, V|D, "ec"}, diff --git a/media/ffvpx/libavcodec/pcm.c b/media/ffvpx/libavcodec/pcm.c deleted file mode 100644 index 23955ba2ddfd..000000000000 --- a/media/ffvpx/libavcodec/pcm.c +++ /dev/null @@ -1,630 +0,0 @@ -/* - * PCM codecs - * Copyright (c) 2001 Fabrice Bellard - * - * This file is part of FFmpeg. - * - * FFmpeg 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. - * - * FFmpeg 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/** - * @file - * PCM codecs - */ - -#include "config.h" -#include "config_components.h" -#include "libavutil/attributes.h" -#include "libavutil/float_dsp.h" -#include "libavutil/reverse.h" -#include "libavutil/thread.h" -#include "avcodec.h" -#include "bytestream.h" -#include "codec_internal.h" -#include "decode.h" -#include "encode.h" -#include "pcm_tablegen.h" - -static av_cold int pcm_encode_init(AVCodecContext *avctx) -{ - avctx->frame_size = 0; -#if !CONFIG_HARDCODED_TABLES - switch (avctx->codec->id) { -#define INIT_ONCE(id, name) \ - case AV_CODEC_ID_PCM_ ## id: \ - if (CONFIG_PCM_ ## id ## _ENCODER) { \ - static AVOnce init_static_once = AV_ONCE_INIT; \ - ff_thread_once(&init_static_once, pcm_ ## name ## _tableinit); \ - } \ - break - INIT_ONCE(ALAW, alaw); - INIT_ONCE(MULAW, ulaw); - INIT_ONCE(VIDC, vidc); - default: - break; - } -#endif - - avctx->bits_per_coded_sample = av_get_bits_per_sample(avctx->codec->id); - avctx->block_align = avctx->ch_layout.nb_channels * avctx->bits_per_coded_sample / 8; - avctx->bit_rate = avctx->block_align * 8LL * avctx->sample_rate; - - return 0; -} - -/** - * Write PCM samples macro - * @param type Datatype of native machine format - * @param endian bytestream_put_xxx() suffix - * @param src Source pointer (variable name) - * @param dst Destination pointer (variable name) - * @param n Total number of samples (variable name) - * @param shift Bitshift (bits) - * @param offset Sample value offset - */ -#define ENCODE(type, endian, src, dst, n, shift, offset) \ - samples_ ## type = (const type *) src; \ - for (; n > 0; n--) { \ - register type v = (*samples_ ## type++ >> shift) + offset; \ - bytestream_put_ ## endian(&dst, v); \ - } - -#define ENCODE_PLANAR(type, endian, dst, n, shift, offset) \ - n /= avctx->ch_layout.nb_channels; \ - for (c = 0; c < avctx->ch_layout.nb_channels; c++) { \ - int i; \ - samples_ ## type = (const type *) frame->extended_data[c]; \ - for (i = n; i > 0; i--) { \ - register type v = (*samples_ ## type++ >> shift) + offset; \ - bytestream_put_ ## endian(&dst, v); \ - } \ - } - -static int pcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, - const AVFrame *frame, int *got_packet_ptr) -{ - int n, c, sample_size, v, ret; - const short *samples; - unsigned char *dst; - const uint8_t *samples_uint8_t; - const int16_t *samples_int16_t; - const int32_t *samples_int32_t; - const int64_t *samples_int64_t; - const uint16_t *samples_uint16_t; - const uint32_t *samples_uint32_t; - - sample_size = av_get_bits_per_sample(avctx->codec->id) / 8; - n = frame->nb_samples * avctx->ch_layout.nb_channels; - samples = (const short *)frame->data[0]; - - if ((ret = ff_get_encode_buffer(avctx, avpkt, n * sample_size, 0)) < 0) - return ret; - dst = avpkt->data; - - switch (avctx->codec->id) { - case AV_CODEC_ID_PCM_U32LE: - ENCODE(uint32_t, le32, samples, dst, n, 0, 0x80000000) - break; - case AV_CODEC_ID_PCM_U32BE: - ENCODE(uint32_t, be32, samples, dst, n, 0, 0x80000000) - break; - case AV_CODEC_ID_PCM_S24LE: - ENCODE(int32_t, le24, samples, dst, n, 8, 0) - break; - case AV_CODEC_ID_PCM_S24LE_PLANAR: - ENCODE_PLANAR(int32_t, le24, dst, n, 8, 0) - break; - case AV_CODEC_ID_PCM_S24BE: - ENCODE(int32_t, be24, samples, dst, n, 8, 0) - break; - case AV_CODEC_ID_PCM_U24LE: - ENCODE(uint32_t, le24, samples, dst, n, 8, 0x800000) - break; - case AV_CODEC_ID_PCM_U24BE: - ENCODE(uint32_t, be24, samples, dst, n, 8, 0x800000) - break; - case AV_CODEC_ID_PCM_S24DAUD: - for (; n > 0; n--) { - uint32_t tmp = ff_reverse[(*samples >> 8) & 0xff] + - (ff_reverse[*samples & 0xff] << 8); - tmp <<= 4; // sync flags would go here - bytestream_put_be24(&dst, tmp); - samples++; - } - break; - case AV_CODEC_ID_PCM_U16LE: - ENCODE(uint16_t, le16, samples, dst, n, 0, 0x8000) - break; - case AV_CODEC_ID_PCM_U16BE: - ENCODE(uint16_t, be16, samples, dst, n, 0, 0x8000) - break; - case AV_CODEC_ID_PCM_S8: - ENCODE(uint8_t, byte, samples, dst, n, 0, -128) - break; - case AV_CODEC_ID_PCM_S8_PLANAR: - ENCODE_PLANAR(uint8_t, byte, dst, n, 0, -128) - break; -#if HAVE_BIGENDIAN - case AV_CODEC_ID_PCM_S64LE: - case AV_CODEC_ID_PCM_F64LE: - ENCODE(int64_t, le64, samples, dst, n, 0, 0) - break; - case AV_CODEC_ID_PCM_S32LE: - case AV_CODEC_ID_PCM_F32LE: - ENCODE(int32_t, le32, samples, dst, n, 0, 0) - break; - case AV_CODEC_ID_PCM_S32LE_PLANAR: - ENCODE_PLANAR(int32_t, le32, dst, n, 0, 0) - break; - case AV_CODEC_ID_PCM_S16LE: - ENCODE(int16_t, le16, samples, dst, n, 0, 0) - break; - case AV_CODEC_ID_PCM_S16LE_PLANAR: - ENCODE_PLANAR(int16_t, le16, dst, n, 0, 0) - break; - case AV_CODEC_ID_PCM_F64BE: - case AV_CODEC_ID_PCM_F32BE: - case AV_CODEC_ID_PCM_S64BE: - case AV_CODEC_ID_PCM_S32BE: - case AV_CODEC_ID_PCM_S16BE: -#else - case AV_CODEC_ID_PCM_S64BE: - case AV_CODEC_ID_PCM_F64BE: - ENCODE(int64_t, be64, samples, dst, n, 0, 0) - break; - case AV_CODEC_ID_PCM_F32BE: - case AV_CODEC_ID_PCM_S32BE: - ENCODE(int32_t, be32, samples, dst, n, 0, 0) - break; - case AV_CODEC_ID_PCM_S16BE: - ENCODE(int16_t, be16, samples, dst, n, 0, 0) - break; - case AV_CODEC_ID_PCM_S16BE_PLANAR: - ENCODE_PLANAR(int16_t, be16, dst, n, 0, 0) - break; - case AV_CODEC_ID_PCM_F64LE: - case AV_CODEC_ID_PCM_F32LE: - case AV_CODEC_ID_PCM_S64LE: - case AV_CODEC_ID_PCM_S32LE: - case AV_CODEC_ID_PCM_S16LE: -#endif /* HAVE_BIGENDIAN */ - case AV_CODEC_ID_PCM_U8: - memcpy(dst, samples, n * sample_size); - break; -#if HAVE_BIGENDIAN - case AV_CODEC_ID_PCM_S16BE_PLANAR: -#else - case AV_CODEC_ID_PCM_S16LE_PLANAR: - case AV_CODEC_ID_PCM_S32LE_PLANAR: -#endif /* HAVE_BIGENDIAN */ - n /= avctx->ch_layout.nb_channels; - for (c = 0; c < avctx->ch_layout.nb_channels; c++) { - const uint8_t *src = frame->extended_data[c]; - bytestream_put_buffer(&dst, src, n * sample_size); - } - break; - case AV_CODEC_ID_PCM_ALAW: - for (; n > 0; n--) { - v = *samples++; - *dst++ = linear_to_alaw[(v + 32768) >> 2]; - } - break; - case AV_CODEC_ID_PCM_MULAW: - for (; n > 0; n--) { - v = *samples++; - *dst++ = linear_to_ulaw[(v + 32768) >> 2]; - } - break; - case AV_CODEC_ID_PCM_VIDC: - for (; n > 0; n--) { - v = *samples++; - *dst++ = linear_to_vidc[(v + 32768) >> 2]; - } - break; - default: - return -1; - } - - *got_packet_ptr = 1; - return 0; -} - -typedef struct PCMDecode { - short table[256]; - void (*vector_fmul_scalar)(float *dst, const float *src, float mul, - int len); - float scale; -} PCMDecode; - -static av_cold int pcm_decode_init(AVCodecContext *avctx) -{ - PCMDecode *s = avctx->priv_data; - AVFloatDSPContext *fdsp; - int i; - - switch (avctx->codec_id) { - case AV_CODEC_ID_PCM_ALAW: - for (i = 0; i < 256; i++) - s->table[i] = alaw2linear(i); - break; - case AV_CODEC_ID_PCM_MULAW: - for (i = 0; i < 256; i++) - s->table[i] = ulaw2linear(i); - break; - case AV_CODEC_ID_PCM_VIDC: - for (i = 0; i < 256; i++) - s->table[i] = vidc2linear(i); - break; - case AV_CODEC_ID_PCM_F16LE: - case AV_CODEC_ID_PCM_F24LE: - if (avctx->bits_per_coded_sample < 1 || avctx->bits_per_coded_sample > 24) - return AVERROR_INVALIDDATA; - - s->scale = 1. / (1 << (avctx->bits_per_coded_sample - 1)); - fdsp = avpriv_float_dsp_alloc(0); - if (!fdsp) - return AVERROR(ENOMEM); - s->vector_fmul_scalar = fdsp->vector_fmul_scalar; - av_free(fdsp); - break; - default: - break; - } - - avctx->sample_fmt = avctx->codec->sample_fmts[0]; - - if (avctx->sample_fmt == AV_SAMPLE_FMT_S32) - avctx->bits_per_raw_sample = av_get_bits_per_sample(avctx->codec_id); - - return 0; -} - -/** - * Read PCM samples macro - * @param size Data size of native machine format - * @param endian bytestream_get_xxx() endian suffix - * @param src Source pointer (variable name) - * @param dst Destination pointer (variable name) - * @param n Total number of samples (variable name) - * @param shift Bitshift (bits) - * @param offset Sample value offset - */ -#define DECODE(size, endian, src, dst, n, shift, offset) \ - for (; n > 0; n--) { \ - uint ## size ## _t v = bytestream_get_ ## endian(&src); \ - AV_WN ## size ## A(dst, (uint ## size ## _t)(v - offset) << shift); \ - dst += size / 8; \ - } - -#define DECODE_PLANAR(size, endian, src, dst, n, shift, offset) \ - n /= channels; \ - for (c = 0; c < avctx->ch_layout.nb_channels; c++) { \ - int i; \ - dst = frame->extended_data[c]; \ - for (i = n; i > 0; i--) { \ - uint ## size ## _t v = bytestream_get_ ## endian(&src); \ - AV_WN ## size ## A(dst, (uint ## size ##_t)(v - offset) << shift); \ - dst += size / 8; \ - } \ - } - -static int pcm_decode_frame(AVCodecContext *avctx, AVFrame *frame, - int *got_frame_ptr, AVPacket *avpkt) -{ - const uint8_t *src = avpkt->data; - int buf_size = avpkt->size; - PCMDecode *s = avctx->priv_data; - int channels = avctx->ch_layout.nb_channels; - int sample_size, c, n, ret, samples_per_block; - uint8_t *samples; - int32_t *dst_int32_t; - - sample_size = av_get_bits_per_sample(avctx->codec_id) / 8; - - /* av_get_bits_per_sample returns 0 for AV_CODEC_ID_PCM_DVD */ - samples_per_block = 1; - if (avctx->codec_id == AV_CODEC_ID_PCM_LXF) { - /* we process 40-bit blocks per channel for LXF */ - samples_per_block = 2; - sample_size = 5; - } - - if (sample_size == 0) { - av_log(avctx, AV_LOG_ERROR, "Invalid sample_size\n"); - return AVERROR(EINVAL); - } - - if (channels == 0) { - av_log(avctx, AV_LOG_ERROR, "Invalid number of channels\n"); - return AVERROR(EINVAL); - } - - if (avctx->codec_id != avctx->codec->id) { - av_log(avctx, AV_LOG_ERROR, "codec ids mismatch\n"); - return AVERROR(EINVAL); - } - - n = channels * sample_size; - - if (n && buf_size % n) { - if (buf_size < n) { - av_log(avctx, AV_LOG_ERROR, - "Invalid PCM packet, data has size %d but at least a size of %d was expected\n", - buf_size, n); - return AVERROR_INVALIDDATA; - } else - buf_size -= buf_size % n; - } - - n = buf_size / sample_size; - - /* get output buffer */ - frame->nb_samples = n * samples_per_block / channels; - if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) - return ret; - samples = frame->data[0]; - - switch (avctx->codec_id) { - case AV_CODEC_ID_PCM_U32LE: - DECODE(32, le32, src, samples, n, 0, 0x80000000) - break; - case AV_CODEC_ID_PCM_U32BE: - DECODE(32, be32, src, samples, n, 0, 0x80000000) - break; - case AV_CODEC_ID_PCM_S24LE: - DECODE(32, le24, src, samples, n, 8, 0) - break; - case AV_CODEC_ID_PCM_S24LE_PLANAR: - DECODE_PLANAR(32, le24, src, samples, n, 8, 0); - break; - case AV_CODEC_ID_PCM_S24BE: - DECODE(32, be24, src, samples, n, 8, 0) - break; - case AV_CODEC_ID_PCM_U24LE: - DECODE(32, le24, src, samples, n, 8, 0x800000) - break; - case AV_CODEC_ID_PCM_U24BE: - DECODE(32, be24, src, samples, n, 8, 0x800000) - break; - case AV_CODEC_ID_PCM_S24DAUD: - for (; n > 0; n--) { - uint32_t v = bytestream_get_be24(&src); - v >>= 4; // sync flags are here - AV_WN16A(samples, ff_reverse[(v >> 8) & 0xff] + - (ff_reverse[v & 0xff] << 8)); - samples += 2; - } - break; - case AV_CODEC_ID_PCM_U16LE: - DECODE(16, le16, src, samples, n, 0, 0x8000) - break; - case AV_CODEC_ID_PCM_U16BE: - DECODE(16, be16, src, samples, n, 0, 0x8000) - break; - case AV_CODEC_ID_PCM_S8: - for (; n > 0; n--) - *samples++ = *src++ + 128; - break; - case AV_CODEC_ID_PCM_SGA: - for (; n > 0; n--) { - int sign = *src >> 7; - int magn = *src & 0x7f; - *samples++ = sign ? 128 - magn : 128 + magn; - src++; - } - break; - case AV_CODEC_ID_PCM_S8_PLANAR: - n /= avctx->ch_layout.nb_channels; - for (c = 0; c < avctx->ch_layout.nb_channels; c++) { - int i; - samples = frame->extended_data[c]; - for (i = n; i > 0; i--) - *samples++ = *src++ + 128; - } - break; -#if HAVE_BIGENDIAN - case AV_CODEC_ID_PCM_S64LE: - case AV_CODEC_ID_PCM_F64LE: - DECODE(64, le64, src, samples, n, 0, 0) - break; - case AV_CODEC_ID_PCM_S32LE: - case AV_CODEC_ID_PCM_F32LE: - case AV_CODEC_ID_PCM_F24LE: - case AV_CODEC_ID_PCM_F16LE: - DECODE(32, le32, src, samples, n, 0, 0) - break; - case AV_CODEC_ID_PCM_S32LE_PLANAR: - DECODE_PLANAR(32, le32, src, samples, n, 0, 0); - break; - case AV_CODEC_ID_PCM_S16LE: - DECODE(16, le16, src, samples, n, 0, 0) - break; - case AV_CODEC_ID_PCM_S16LE_PLANAR: - DECODE_PLANAR(16, le16, src, samples, n, 0, 0); - break; - case AV_CODEC_ID_PCM_F64BE: - case AV_CODEC_ID_PCM_F32BE: - case AV_CODEC_ID_PCM_S64BE: - case AV_CODEC_ID_PCM_S32BE: - case AV_CODEC_ID_PCM_S16BE: -#else - case AV_CODEC_ID_PCM_S64BE: - case AV_CODEC_ID_PCM_F64BE: - DECODE(64, be64, src, samples, n, 0, 0) - break; - case AV_CODEC_ID_PCM_F32BE: - case AV_CODEC_ID_PCM_S32BE: - DECODE(32, be32, src, samples, n, 0, 0) - break; - case AV_CODEC_ID_PCM_S16BE: - DECODE(16, be16, src, samples, n, 0, 0) - break; - case AV_CODEC_ID_PCM_S16BE_PLANAR: - DECODE_PLANAR(16, be16, src, samples, n, 0, 0); - break; - case AV_CODEC_ID_PCM_F64LE: - case AV_CODEC_ID_PCM_F32LE: - case AV_CODEC_ID_PCM_F24LE: - case AV_CODEC_ID_PCM_F16LE: - case AV_CODEC_ID_PCM_S64LE: - case AV_CODEC_ID_PCM_S32LE: - case AV_CODEC_ID_PCM_S16LE: -#endif /* HAVE_BIGENDIAN */ - case AV_CODEC_ID_PCM_U8: - memcpy(samples, src, n * sample_size); - break; -#if HAVE_BIGENDIAN - case AV_CODEC_ID_PCM_S16BE_PLANAR: -#else - case AV_CODEC_ID_PCM_S16LE_PLANAR: - case AV_CODEC_ID_PCM_S32LE_PLANAR: -#endif /* HAVE_BIGENDIAN */ - n /= avctx->ch_layout.nb_channels; - for (c = 0; c < avctx->ch_layout.nb_channels; c++) { - samples = frame->extended_data[c]; - bytestream_get_buffer(&src, samples, n * sample_size); - } - break; - case AV_CODEC_ID_PCM_ALAW: - case AV_CODEC_ID_PCM_MULAW: - case AV_CODEC_ID_PCM_VIDC: - for (; n > 0; n--) { - AV_WN16A(samples, s->table[*src++]); - samples += 2; - } - break; - case AV_CODEC_ID_PCM_LXF: - { - int i; - n /= channels; - for (c = 0; c < channels; c++) { - dst_int32_t = (int32_t *)frame->extended_data[c]; - for (i = 0; i < n; i++) { - // extract low 20 bits and expand to 32 bits - *dst_int32_t++ = ((uint32_t)src[2]<<28) | - (src[1] << 20) | - (src[0] << 12) | - ((src[2] & 0x0F) << 8) | - src[1]; - // extract high 20 bits and expand to 32 bits - *dst_int32_t++ = ((uint32_t)src[4]<<24) | - (src[3] << 16) | - ((src[2] & 0xF0) << 8) | - (src[4] << 4) | - (src[3] >> 4); - src += 5; - } - } - break; - } - default: - return -1; - } - - if (avctx->codec_id == AV_CODEC_ID_PCM_F16LE || - avctx->codec_id == AV_CODEC_ID_PCM_F24LE) { - s->vector_fmul_scalar((float *)frame->extended_data[0], - (const float *)frame->extended_data[0], - s->scale, FFALIGN(frame->nb_samples * avctx->ch_layout.nb_channels, 4)); - emms_c(); - } - - *got_frame_ptr = 1; - - return buf_size; -} - -#define PCM_ENCODER_0(id_, sample_fmt_, name_, long_name_) -#define PCM_ENCODER_1(id_, sample_fmt_, name_, long_name_) \ -const FFCodec ff_ ## name_ ## _encoder = { \ - .p.name = #name_, \ - CODEC_LONG_NAME(long_name_), \ - .p.type = AVMEDIA_TYPE_AUDIO, \ - .p.id = AV_CODEC_ID_ ## id_, \ - .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_VARIABLE_FRAME_SIZE | \ - AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE, \ - .init = pcm_encode_init, \ - FF_CODEC_ENCODE_CB(pcm_encode_frame), \ - .p.sample_fmts = (const enum AVSampleFormat[]){ sample_fmt_, \ - AV_SAMPLE_FMT_NONE }, \ -} - -#define PCM_ENCODER_2(cf, id, sample_fmt, name, long_name) \ - PCM_ENCODER_ ## cf(id, sample_fmt, name, long_name) -#define PCM_ENCODER_3(cf, id, sample_fmt, name, long_name) \ - PCM_ENCODER_2(cf, id, sample_fmt, name, long_name) -#define PCM_ENCODER(id, sample_fmt, name, long_name) \ - PCM_ENCODER_3(CONFIG_ ## id ## _ENCODER, id, sample_fmt, name, long_name) - -#define PCM_DECODER_0(id, sample_fmt, name, long_name) -#define PCM_DECODER_1(id_, sample_fmt_, name_, long_name_) \ -const FFCodec ff_ ## name_ ## _decoder = { \ - .p.name = #name_, \ - CODEC_LONG_NAME(long_name_), \ - .p.type = AVMEDIA_TYPE_AUDIO, \ - .p.id = AV_CODEC_ID_ ## id_, \ - .priv_data_size = sizeof(PCMDecode), \ - .init = pcm_decode_init, \ - FF_CODEC_DECODE_CB(pcm_decode_frame), \ - .p.capabilities = AV_CODEC_CAP_DR1, \ - .p.sample_fmts = (const enum AVSampleFormat[]){ sample_fmt_, \ - AV_SAMPLE_FMT_NONE }, \ -} - -#define PCM_DECODER_2(cf, id, sample_fmt, name, long_name) \ - PCM_DECODER_ ## cf(id, sample_fmt, name, long_name) -#define PCM_DECODER_3(cf, id, sample_fmt, name, long_name) \ - PCM_DECODER_2(cf, id, sample_fmt, name, long_name) -#define PCM_DECODER(id, sample_fmt, name, long_name) \ - PCM_DECODER_3(CONFIG_ ## id ## _DECODER, id, sample_fmt, name, long_name) - -#define PCM_CODEC(id, sample_fmt_, name, long_name_) \ - PCM_ENCODER(id, sample_fmt_, name, long_name_); \ - PCM_DECODER(id, sample_fmt_, name, long_name_) - -/* Note: Do not forget to add new entries to the Makefile as well. */ -PCM_CODEC (PCM_ALAW, AV_SAMPLE_FMT_S16, pcm_alaw, "PCM A-law / G.711 A-law"); -PCM_DECODER(PCM_F16LE, AV_SAMPLE_FMT_FLT, pcm_f16le, "PCM 16.8 floating point little-endian"); -PCM_DECODER(PCM_F24LE, AV_SAMPLE_FMT_FLT, pcm_f24le, "PCM 24.0 floating point little-endian"); -PCM_CODEC (PCM_F32BE, AV_SAMPLE_FMT_FLT, pcm_f32be, "PCM 32-bit floating point big-endian"); -PCM_CODEC (PCM_F32LE, AV_SAMPLE_FMT_FLT, pcm_f32le, "PCM 32-bit floating point little-endian"); -PCM_CODEC (PCM_F64BE, AV_SAMPLE_FMT_DBL, pcm_f64be, "PCM 64-bit floating point big-endian"); -PCM_CODEC (PCM_F64LE, AV_SAMPLE_FMT_DBL, pcm_f64le, "PCM 64-bit floating point little-endian"); -PCM_DECODER(PCM_LXF, AV_SAMPLE_FMT_S32P,pcm_lxf, "PCM signed 20-bit little-endian planar"); -PCM_CODEC (PCM_MULAW, AV_SAMPLE_FMT_S16, pcm_mulaw, "PCM mu-law / G.711 mu-law"); -PCM_CODEC (PCM_S8, AV_SAMPLE_FMT_U8, pcm_s8, "PCM signed 8-bit"); -PCM_CODEC (PCM_S8_PLANAR, AV_SAMPLE_FMT_U8P, pcm_s8_planar, "PCM signed 8-bit planar"); -PCM_CODEC (PCM_S16BE, AV_SAMPLE_FMT_S16, pcm_s16be, "PCM signed 16-bit big-endian"); -PCM_CODEC (PCM_S16BE_PLANAR, AV_SAMPLE_FMT_S16P,pcm_s16be_planar, "PCM signed 16-bit big-endian planar"); -PCM_CODEC (PCM_S16LE, AV_SAMPLE_FMT_S16, pcm_s16le, "PCM signed 16-bit little-endian"); -PCM_CODEC (PCM_S16LE_PLANAR, AV_SAMPLE_FMT_S16P,pcm_s16le_planar, "PCM signed 16-bit little-endian planar"); -PCM_CODEC (PCM_S24BE, AV_SAMPLE_FMT_S32, pcm_s24be, "PCM signed 24-bit big-endian"); -PCM_CODEC (PCM_S24DAUD, AV_SAMPLE_FMT_S16, pcm_s24daud, "PCM D-Cinema audio signed 24-bit"); -PCM_CODEC (PCM_S24LE, AV_SAMPLE_FMT_S32, pcm_s24le, "PCM signed 24-bit little-endian"); -PCM_CODEC (PCM_S24LE_PLANAR, AV_SAMPLE_FMT_S32P,pcm_s24le_planar, "PCM signed 24-bit little-endian planar"); -PCM_CODEC (PCM_S32BE, AV_SAMPLE_FMT_S32, pcm_s32be, "PCM signed 32-bit big-endian"); -PCM_CODEC (PCM_S32LE, AV_SAMPLE_FMT_S32, pcm_s32le, "PCM signed 32-bit little-endian"); -PCM_CODEC (PCM_S32LE_PLANAR, AV_SAMPLE_FMT_S32P,pcm_s32le_planar, "PCM signed 32-bit little-endian planar"); -PCM_CODEC (PCM_U8, AV_SAMPLE_FMT_U8, pcm_u8, "PCM unsigned 8-bit"); -PCM_CODEC (PCM_U16BE, AV_SAMPLE_FMT_S16, pcm_u16be, "PCM unsigned 16-bit big-endian"); -PCM_CODEC (PCM_U16LE, AV_SAMPLE_FMT_S16, pcm_u16le, "PCM unsigned 16-bit little-endian"); -PCM_CODEC (PCM_U24BE, AV_SAMPLE_FMT_S32, pcm_u24be, "PCM unsigned 24-bit big-endian"); -PCM_CODEC (PCM_U24LE, AV_SAMPLE_FMT_S32, pcm_u24le, "PCM unsigned 24-bit little-endian"); -PCM_CODEC (PCM_U32BE, AV_SAMPLE_FMT_S32, pcm_u32be, "PCM unsigned 32-bit big-endian"); -PCM_CODEC (PCM_U32LE, AV_SAMPLE_FMT_S32, pcm_u32le, "PCM unsigned 32-bit little-endian"); -PCM_CODEC (PCM_S64BE, AV_SAMPLE_FMT_S64, pcm_s64be, "PCM signed 64-bit big-endian"); -PCM_CODEC (PCM_S64LE, AV_SAMPLE_FMT_S64, pcm_s64le, "PCM signed 64-bit little-endian"); -PCM_CODEC (PCM_VIDC, AV_SAMPLE_FMT_S16, pcm_vidc, "PCM Archimedes VIDC"); -PCM_DECODER(PCM_SGA, AV_SAMPLE_FMT_U8, pcm_sga, "PCM SGA"); diff --git a/media/ffvpx/libavcodec/pcm_tablegen.h b/media/ffvpx/libavcodec/pcm_tablegen.h deleted file mode 100644 index 7274c3cd1722..000000000000 --- a/media/ffvpx/libavcodec/pcm_tablegen.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Header file for hardcoded PCM tables - * - * Copyright (c) 2010 Reimar Döffinger - * - * This file is part of FFmpeg. - * - * FFmpeg 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. - * - * FFmpeg 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef AVCODEC_PCM_TABLEGEN_H -#define AVCODEC_PCM_TABLEGEN_H - -#include -#include "libavutil/attributes.h" - -/* from g711.c by SUN microsystems (unrestricted use) */ - -#define SIGN_BIT (0x80) /* Sign bit for a A-law byte. */ -#define QUANT_MASK (0xf) /* Quantization field mask. */ -#define NSEGS (8) /* Number of A-law segments. */ -#define SEG_SHIFT (4) /* Left shift for segment number. */ -#define SEG_MASK (0x70) /* Segment field mask. */ - -#define BIAS (0x84) /* Bias for linear code. */ - -#define VIDC_SIGN_BIT (1) -#define VIDC_QUANT_MASK (0x1E) -#define VIDC_QUANT_SHIFT (1) -#define VIDC_SEG_SHIFT (5) -#define VIDC_SEG_MASK (0xE0) - -/* alaw2linear() - Convert an A-law value to 16-bit linear PCM */ -static av_cold int alaw2linear(unsigned char a_val) -{ - int t; - int seg; - - a_val ^= 0x55; - - t = a_val & QUANT_MASK; - seg = ((unsigned)a_val & SEG_MASK) >> SEG_SHIFT; - if(seg) t= (t + t + 1 + 32) << (seg + 2); - else t= (t + t + 1 ) << 3; - - return (a_val & SIGN_BIT) ? t : -t; -} - -static av_cold int ulaw2linear(unsigned char u_val) -{ - int t; - - /* Complement to obtain normal u-law value. */ - u_val = ~u_val; - - /* - * Extract and bias the quantization bits. Then - * shift up by the segment number and subtract out the bias. - */ - t = ((u_val & QUANT_MASK) << 3) + BIAS; - t <<= ((unsigned)u_val & SEG_MASK) >> SEG_SHIFT; - - return (u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS); -} - -static av_cold int vidc2linear(unsigned char u_val) -{ - int t; - - /* - * Extract and bias the quantization bits. Then - * shift up by the segment number and subtract out the bias. - */ - t = (((u_val & VIDC_QUANT_MASK) >> VIDC_QUANT_SHIFT) << 3) + BIAS; - t <<= ((unsigned)u_val & VIDC_SEG_MASK) >> VIDC_SEG_SHIFT; - - return (u_val & VIDC_SIGN_BIT) ? (BIAS - t) : (t - BIAS); -} - -#if CONFIG_HARDCODED_TABLES -#define pcm_alaw_tableinit() -#define pcm_ulaw_tableinit() -#define pcm_vidc_tableinit() -#include "libavcodec/pcm_tables.h" -#else -/* 16384 entries per table */ -static uint8_t linear_to_alaw[16384]; -static uint8_t linear_to_ulaw[16384]; -static uint8_t linear_to_vidc[16384]; - -static av_cold void build_xlaw_table(uint8_t *linear_to_xlaw, - int (*xlaw2linear)(unsigned char), - int mask) -{ - int i, j, v, v1, v2; - - j = 1; - linear_to_xlaw[8192] = mask; - for(i=0;i<127;i++) { - v1 = xlaw2linear(i ^ mask); - v2 = xlaw2linear((i + 1) ^ mask); - v = (v1 + v2 + 4) >> 3; - for(;jslice_count && src->slice_offset) { if (dst->slice_count < src->slice_count) { int err = av_reallocp_array(&dst->slice_offset, src->slice_count, @@ -387,8 +385,6 @@ FF_DISABLE_DEPRECATION_WARNINGS src->slice_count * sizeof(*dst->slice_offset)); } dst->slice_count = src->slice_count; -FF_ENABLE_DEPRECATION_WARNINGS -#endif av_packet_unref(dst->internal->last_pkt_props); err = av_packet_copy_props(dst->internal->last_pkt_props, src->internal->last_pkt_props); @@ -690,11 +686,7 @@ void ff_frame_thread_free(AVCodecContext *avctx, int thread_count) av_freep(&ctx->priv_data); } -#if FF_API_SLICE_OFFSET -FF_DISABLE_DEPRECATION_WARNINGS av_freep(&ctx->slice_offset); -FF_ENABLE_DEPRECATION_WARNINGS -#endif av_buffer_unref(&ctx->internal->pool); av_packet_free(&ctx->internal->last_pkt_props); @@ -911,8 +903,10 @@ static int thread_get_buffer_internal(AVCodecContext *avctx, AVFrame *f, int fla return ff_get_buffer(avctx, f, flags); p = avctx->internal->thread_ctx; +FF_DISABLE_DEPRECATION_WARNINGS if (atomic_load(&p->state) != STATE_SETTING_UP && ffcodec(avctx->codec)->update_thread_context) { +FF_ENABLE_DEPRECATION_WARNINGS av_log(avctx, AV_LOG_ERROR, "get_buffer() cannot be called after ff_thread_finish_setup()\n"); return -1; } diff --git a/media/ffvpx/libavcodec/version.h b/media/ffvpx/libavcodec/version.h index 39dbec020812..7aa95fc3f1c1 100644 --- a/media/ffvpx/libavcodec/version.h +++ b/media/ffvpx/libavcodec/version.h @@ -29,8 +29,8 @@ #include "version_major.h" -#define LIBAVCODEC_VERSION_MINOR 6 -#define LIBAVCODEC_VERSION_MICRO 101 +#define LIBAVCODEC_VERSION_MINOR 5 +#define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ diff --git a/media/ffvpx/libavcodec/version_major.h b/media/ffvpx/libavcodec/version_major.h index 40db213499a6..c2f118b26204 100644 --- a/media/ffvpx/libavcodec/version_major.h +++ b/media/ffvpx/libavcodec/version_major.h @@ -45,7 +45,6 @@ #define FF_API_AVCODEC_CHROMA_POS (LIBAVCODEC_VERSION_MAJOR < 61) #define FF_API_VT_HWACCEL_CONTEXT (LIBAVCODEC_VERSION_MAJOR < 61) #define FF_API_AVCTX_FRAME_NUMBER (LIBAVCODEC_VERSION_MAJOR < 61) -#define FF_API_SLICE_OFFSET (LIBAVCODEC_VERSION_MAJOR < 61) // reminder to remove CrystalHD decoders on next major bump #define FF_CODEC_CRYSTAL_HD (LIBAVCODEC_VERSION_MAJOR < 61) diff --git a/media/ffvpx/libavcodec/vorbis_data.c b/media/ffvpx/libavcodec/vorbis_data.c deleted file mode 100644 index 1ebe146d8f35..000000000000 --- a/media/ffvpx/libavcodec/vorbis_data.c +++ /dev/null @@ -1,2201 +0,0 @@ -/* - * copyright (c) 2005 Denes Balatoni ( dbalatoni programozo hu ) - * - * This file is part of FFmpeg. - * - * FFmpeg 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. - * - * FFmpeg 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "libavutil/channel_layout.h" -#include "libavutil/mem_internal.h" - -#include "vorbis_data.h" - -const uint8_t ff_vorbis_channel_layout_offsets[8][8] = { - { 0 }, - { 0, 1 }, - { 0, 2, 1 }, - { 0, 1, 2, 3 }, - { 0, 2, 1, 3, 4 }, - { 0, 2, 1, 5, 3, 4 }, - { 0, 2, 1, 6, 5, 3, 4 }, - { 0, 2, 1, 7, 5, 6, 3, 4 }, -}; - -#if FF_API_OLD_CHANNEL_LAYOUT -const uint64_t ff_vorbis_channel_layouts[9] = { - AV_CH_LAYOUT_MONO, - AV_CH_LAYOUT_STEREO, - AV_CH_LAYOUT_SURROUND, - AV_CH_LAYOUT_QUAD, - AV_CH_LAYOUT_5POINT0_BACK, - AV_CH_LAYOUT_5POINT1_BACK, - AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER, - AV_CH_LAYOUT_7POINT1, - 0 -}; -#endif - -const AVChannelLayout ff_vorbis_ch_layouts[9] = { - AV_CHANNEL_LAYOUT_MONO, - AV_CHANNEL_LAYOUT_STEREO, - AV_CHANNEL_LAYOUT_SURROUND, - AV_CHANNEL_LAYOUT_QUAD, - AV_CHANNEL_LAYOUT_5POINT0_BACK, - AV_CHANNEL_LAYOUT_5POINT1_BACK, - { - .nb_channels = 7, - .order = AV_CHANNEL_ORDER_NATIVE, - .u.mask = AV_CH_LAYOUT_5POINT1 | AV_CH_BACK_CENTER, - }, - AV_CHANNEL_LAYOUT_7POINT1, - { 0 } -}; - -DECLARE_ALIGNED(16, static const float, vwin64)[32] = { - 0.0009460463F, 0.0085006468F, 0.0235352254F, 0.0458950567F, - 0.0753351908F, 0.1115073077F, 0.1539457973F, 0.2020557475F, - 0.2551056759F, 0.3122276645F, 0.3724270287F, 0.4346027792F, - 0.4975789974F, 0.5601459521F, 0.6211085051F, 0.6793382689F, - 0.7338252629F, 0.7837245849F, 0.8283939355F, 0.8674186656F, - 0.9006222429F, 0.9280614787F, 0.9500073081F, 0.9669131782F, - 0.9793740220F, 0.9880792941F, 0.9937636139F, 0.9971582668F, - 0.9989462667F, 0.9997230082F, 0.9999638688F, 0.9999995525F, -}; - -DECLARE_ALIGNED(16, static const float, vwin128)[64] = { - 0.0002365472F, 0.0021280687F, 0.0059065254F, 0.0115626550F, - 0.0190823442F, 0.0284463735F, 0.0396300935F, 0.0526030430F, - 0.0673285281F, 0.0837631763F, 0.1018564887F, 0.1215504095F, - 0.1427789367F, 0.1654677960F, 0.1895342001F, 0.2148867160F, - 0.2414252576F, 0.2690412240F, 0.2976177952F, 0.3270303960F, - 0.3571473350F, 0.3878306189F, 0.4189369387F, 0.4503188188F, - 0.4818259135F, 0.5133064334F, 0.5446086751F, 0.5755826278F, - 0.6060816248F, 0.6359640047F, 0.6650947483F, 0.6933470543F, - 0.7206038179F, 0.7467589810F, 0.7717187213F, 0.7954024542F, - 0.8177436264F, 0.8386902831F, 0.8582053981F, 0.8762669622F, - 0.8928678298F, 0.9080153310F, 0.9217306608F, 0.9340480615F, - 0.9450138200F, 0.9546851041F, 0.9631286621F, 0.9704194171F, - 0.9766389810F, 0.9818741197F, 0.9862151938F, 0.9897546035F, - 0.9925852598F, 0.9947991032F, 0.9964856900F, 0.9977308602F, - 0.9986155015F, 0.9992144193F, 0.9995953200F, 0.9998179155F, - 0.9999331503F, 0.9999825563F, 0.9999977357F, 0.9999999720F, -}; - -DECLARE_ALIGNED(16, static const float, vwin256)[128] = { - 0.0000591390F, 0.0005321979F, 0.0014780301F, 0.0028960636F, - 0.0047854363F, 0.0071449926F, 0.0099732775F, 0.0132685298F, - 0.0170286741F, 0.0212513119F, 0.0259337111F, 0.0310727950F, - 0.0366651302F, 0.0427069140F, 0.0491939614F, 0.0561216907F, - 0.0634851102F, 0.0712788035F, 0.0794969160F, 0.0881331402F, - 0.0971807028F, 0.1066323515F, 0.1164803426F, 0.1267164297F, - 0.1373318534F, 0.1483173323F, 0.1596630553F, 0.1713586755F, - 0.1833933062F, 0.1957555184F, 0.2084333404F, 0.2214142599F, - 0.2346852280F, 0.2482326664F, 0.2620424757F, 0.2761000481F, - 0.2903902813F, 0.3048975959F, 0.3196059553F, 0.3344988887F, - 0.3495595160F, 0.3647705766F, 0.3801144597F, 0.3955732382F, - 0.4111287047F, 0.4267624093F, 0.4424557009F, 0.4581897696F, - 0.4739456913F, 0.4897044744F, 0.5054471075F, 0.5211546088F, - 0.5368080763F, 0.5523887395F, 0.5678780103F, 0.5832575361F, - 0.5985092508F, 0.6136154277F, 0.6285587300F, 0.6433222619F, - 0.6578896175F, 0.6722449294F, 0.6863729144F, 0.7002589187F, - 0.7138889597F, 0.7272497662F, 0.7403288154F, 0.7531143679F, - 0.7655954985F, 0.7777621249F, 0.7896050322F, 0.8011158947F, - 0.8122872932F, 0.8231127294F, 0.8335866365F, 0.8437043850F, - 0.8534622861F, 0.8628575905F, 0.8718884835F, 0.8805540765F, - 0.8888543947F, 0.8967903616F, 0.9043637797F, 0.9115773078F, - 0.9184344360F, 0.9249394562F, 0.9310974312F, 0.9369141608F, - 0.9423961446F, 0.9475505439F, 0.9523851406F, 0.9569082947F, - 0.9611289005F, 0.9650563408F, 0.9687004405F, 0.9720714191F, - 0.9751798427F, 0.9780365753F, 0.9806527301F, 0.9830396204F, - 0.9852087111F, 0.9871715701F, 0.9889398207F, 0.9905250941F, - 0.9919389832F, 0.9931929973F, 0.9942985174F, 0.9952667537F, - 0.9961087037F, 0.9968351119F, 0.9974564312F, 0.9979827858F, - 0.9984239359F, 0.9987892441F, 0.9990876435F, 0.9993276081F, - 0.9995171241F, 0.9996636648F, 0.9997741654F, 0.9998550016F, - 0.9999119692F, 0.9999502656F, 0.9999744742F, 0.9999885497F, - 0.9999958064F, 0.9999989077F, 0.9999998584F, 0.9999999983F, -}; - -DECLARE_ALIGNED(16, static const float, vwin512)[256] = { - 0.0000147849F, 0.0001330607F, 0.0003695946F, 0.0007243509F, - 0.0011972759F, 0.0017882983F, 0.0024973285F, 0.0033242588F, - 0.0042689632F, 0.0053312973F, 0.0065110982F, 0.0078081841F, - 0.0092223540F, 0.0107533880F, 0.0124010466F, 0.0141650703F, - 0.0160451800F, 0.0180410758F, 0.0201524373F, 0.0223789233F, - 0.0247201710F, 0.0271757958F, 0.0297453914F, 0.0324285286F, - 0.0352247556F, 0.0381335972F, 0.0411545545F, 0.0442871045F, - 0.0475306997F, 0.0508847676F, 0.0543487103F, 0.0579219038F, - 0.0616036982F, 0.0653934164F, 0.0692903546F, 0.0732937809F, - 0.0774029356F, 0.0816170305F, 0.0859352485F, 0.0903567428F, - 0.0948806375F, 0.0995060259F, 0.1042319712F, 0.1090575056F, - 0.1139816300F, 0.1190033137F, 0.1241214941F, 0.1293350764F, - 0.1346429333F, 0.1400439046F, 0.1455367974F, 0.1511203852F, - 0.1567934083F, 0.1625545735F, 0.1684025537F, 0.1743359881F, - 0.1803534820F, 0.1864536069F, 0.1926349000F, 0.1988958650F, - 0.2052349715F, 0.2116506555F, 0.2181413191F, 0.2247053313F, - 0.2313410275F, 0.2380467105F, 0.2448206500F, 0.2516610835F, - 0.2585662164F, 0.2655342226F, 0.2725632448F, 0.2796513950F, - 0.2867967551F, 0.2939973773F, 0.3012512852F, 0.3085564739F, - 0.3159109111F, 0.3233125375F, 0.3307592680F, 0.3382489922F, - 0.3457795756F, 0.3533488602F, 0.3609546657F, 0.3685947904F, - 0.3762670121F, 0.3839690896F, 0.3916987634F, 0.3994537572F, - 0.4072317788F, 0.4150305215F, 0.4228476653F, 0.4306808783F, - 0.4385278181F, 0.4463861329F, 0.4542534630F, 0.4621274424F, - 0.4700057001F, 0.4778858615F, 0.4857655502F, 0.4936423891F, - 0.5015140023F, 0.5093780165F, 0.5172320626F, 0.5250737772F, - 0.5329008043F, 0.5407107971F, 0.5485014192F, 0.5562703465F, - 0.5640152688F, 0.5717338914F, 0.5794239366F, 0.5870831457F, - 0.5947092801F, 0.6023001235F, 0.6098534829F, 0.6173671907F, - 0.6248391059F, 0.6322671161F, 0.6396491384F, 0.6469831217F, - 0.6542670475F, 0.6614989319F, 0.6686768267F, 0.6757988210F, - 0.6828630426F, 0.6898676592F, 0.6968108799F, 0.7036909564F, - 0.7105061843F, 0.7172549043F, 0.7239355032F, 0.7305464154F, - 0.7370861235F, 0.7435531598F, 0.7499461068F, 0.7562635986F, - 0.7625043214F, 0.7686670148F, 0.7747504721F, 0.7807535410F, - 0.7866751247F, 0.7925141825F, 0.7982697296F, 0.8039408387F, - 0.8095266395F, 0.8150263196F, 0.8204391248F, 0.8257643590F, - 0.8310013848F, 0.8361496236F, 0.8412085555F, 0.8461777194F, - 0.8510567129F, 0.8558451924F, 0.8605428730F, 0.8651495278F, - 0.8696649882F, 0.8740891432F, 0.8784219392F, 0.8826633797F, - 0.8868135244F, 0.8908724888F, 0.8948404441F, 0.8987176157F, - 0.9025042831F, 0.9062007791F, 0.9098074886F, 0.9133248482F, - 0.9167533451F, 0.9200935163F, 0.9233459472F, 0.9265112712F, - 0.9295901680F, 0.9325833632F, 0.9354916263F, 0.9383157705F, - 0.9410566504F, 0.9437151618F, 0.9462922398F, 0.9487888576F, - 0.9512060252F, 0.9535447882F, 0.9558062262F, 0.9579914516F, - 0.9601016078F, 0.9621378683F, 0.9641014348F, 0.9659935361F, - 0.9678154261F, 0.9695683830F, 0.9712537071F, 0.9728727198F, - 0.9744267618F, 0.9759171916F, 0.9773453842F, 0.9787127293F, - 0.9800206298F, 0.9812705006F, 0.9824637665F, 0.9836018613F, - 0.9846862258F, 0.9857183066F, 0.9866995544F, 0.9876314227F, - 0.9885153662F, 0.9893528393F, 0.9901452948F, 0.9908941823F, - 0.9916009470F, 0.9922670279F, 0.9928938570F, 0.9934828574F, - 0.9940354423F, 0.9945530133F, 0.9950369595F, 0.9954886562F, - 0.9959094633F, 0.9963007242F, 0.9966637649F, 0.9969998925F, - 0.9973103939F, 0.9975965351F, 0.9978595598F, 0.9981006885F, - 0.9983211172F, 0.9985220166F, 0.9987045311F, 0.9988697776F, - 0.9990188449F, 0.9991527924F, 0.9992726499F, 0.9993794157F, - 0.9994740570F, 0.9995575079F, 0.9996306699F, 0.9996944099F, - 0.9997495605F, 0.9997969190F, 0.9998372465F, 0.9998712678F, - 0.9998996704F, 0.9999231041F, 0.9999421807F, 0.9999574732F, - 0.9999695157F, 0.9999788026F, 0.9999857885F, 0.9999908879F, - 0.9999944746F, 0.9999968817F, 0.9999984010F, 0.9999992833F, - 0.9999997377F, 0.9999999317F, 0.9999999911F, 0.9999999999F, -}; - -DECLARE_ALIGNED(16, static const float, vwin1024)[512] = { - 0.0000036962F, 0.0000332659F, 0.0000924041F, 0.0001811086F, - 0.0002993761F, 0.0004472021F, 0.0006245811F, 0.0008315063F, - 0.0010679699F, 0.0013339631F, 0.0016294757F, 0.0019544965F, - 0.0023090133F, 0.0026930125F, 0.0031064797F, 0.0035493989F, - 0.0040217533F, 0.0045235250F, 0.0050546946F, 0.0056152418F, - 0.0062051451F, 0.0068243817F, 0.0074729278F, 0.0081507582F, - 0.0088578466F, 0.0095941655F, 0.0103596863F, 0.0111543789F, - 0.0119782122F, 0.0128311538F, 0.0137131701F, 0.0146242260F, - 0.0155642855F, 0.0165333111F, 0.0175312640F, 0.0185581042F, - 0.0196137903F, 0.0206982797F, 0.0218115284F, 0.0229534910F, - 0.0241241208F, 0.0253233698F, 0.0265511886F, 0.0278075263F, - 0.0290923308F, 0.0304055484F, 0.0317471241F, 0.0331170013F, - 0.0345151222F, 0.0359414274F, 0.0373958560F, 0.0388783456F, - 0.0403888325F, 0.0419272511F, 0.0434935347F, 0.0450876148F, - 0.0467094213F, 0.0483588828F, 0.0500359261F, 0.0517404765F, - 0.0534724575F, 0.0552317913F, 0.0570183983F, 0.0588321971F, - 0.0606731048F, 0.0625410369F, 0.0644359070F, 0.0663576272F, - 0.0683061077F, 0.0702812571F, 0.0722829821F, 0.0743111878F, - 0.0763657775F, 0.0784466526F, 0.0805537129F, 0.0826868561F, - 0.0848459782F, 0.0870309736F, 0.0892417345F, 0.0914781514F, - 0.0937401128F, 0.0960275056F, 0.0983402145F, 0.1006781223F, - 0.1030411101F, 0.1054290568F, 0.1078418397F, 0.1102793336F, - 0.1127414119F, 0.1152279457F, 0.1177388042F, 0.1202738544F, - 0.1228329618F, 0.1254159892F, 0.1280227980F, 0.1306532471F, - 0.1333071937F, 0.1359844927F, 0.1386849970F, 0.1414085575F, - 0.1441550230F, 0.1469242403F, 0.1497160539F, 0.1525303063F, - 0.1553668381F, 0.1582254875F, 0.1611060909F, 0.1640084822F, - 0.1669324936F, 0.1698779549F, 0.1728446939F, 0.1758325362F, - 0.1788413055F, 0.1818708232F, 0.1849209084F, 0.1879913785F, - 0.1910820485F, 0.1941927312F, 0.1973232376F, 0.2004733764F, - 0.2036429541F, 0.2068317752F, 0.2100396421F, 0.2132663552F, - 0.2165117125F, 0.2197755102F, 0.2230575422F, 0.2263576007F, - 0.2296754753F, 0.2330109540F, 0.2363638225F, 0.2397338646F, - 0.2431208619F, 0.2465245941F, 0.2499448389F, 0.2533813719F, - 0.2568339669F, 0.2603023956F, 0.2637864277F, 0.2672858312F, - 0.2708003718F, 0.2743298135F, 0.2778739186F, 0.2814324472F, - 0.2850051576F, 0.2885918065F, 0.2921921485F, 0.2958059366F, - 0.2994329219F, 0.3030728538F, 0.3067254799F, 0.3103905462F, - 0.3140677969F, 0.3177569747F, 0.3214578205F, 0.3251700736F, - 0.3288934718F, 0.3326277513F, 0.3363726468F, 0.3401278914F, - 0.3438932168F, 0.3476683533F, 0.3514530297F, 0.3552469734F, - 0.3590499106F, 0.3628615659F, 0.3666816630F, 0.3705099239F, - 0.3743460698F, 0.3781898204F, 0.3820408945F, 0.3858990095F, - 0.3897638820F, 0.3936352274F, 0.3975127601F, 0.4013961936F, - 0.4052852405F, 0.4091796123F, 0.4130790198F, 0.4169831732F, - 0.4208917815F, 0.4248045534F, 0.4287211965F, 0.4326414181F, - 0.4365649248F, 0.4404914225F, 0.4444206167F, 0.4483522125F, - 0.4522859146F, 0.4562214270F, 0.4601584538F, 0.4640966984F, - 0.4680358644F, 0.4719756548F, 0.4759157726F, 0.4798559209F, - 0.4837958024F, 0.4877351199F, 0.4916735765F, 0.4956108751F, - 0.4995467188F, 0.5034808109F, 0.5074128550F, 0.5113425550F, - 0.5152696149F, 0.5191937395F, 0.5231146336F, 0.5270320028F, - 0.5309455530F, 0.5348549910F, 0.5387600239F, 0.5426603597F, - 0.5465557070F, 0.5504457754F, 0.5543302752F, 0.5582089175F, - 0.5620814145F, 0.5659474793F, 0.5698068262F, 0.5736591704F, - 0.5775042283F, 0.5813417176F, 0.5851713571F, 0.5889928670F, - 0.5928059689F, 0.5966103856F, 0.6004058415F, 0.6041920626F, - 0.6079687761F, 0.6117357113F, 0.6154925986F, 0.6192391705F, - 0.6229751612F, 0.6267003064F, 0.6304143441F, 0.6341170137F, - 0.6378080569F, 0.6414872173F, 0.6451542405F, 0.6488088741F, - 0.6524508681F, 0.6560799742F, 0.6596959469F, 0.6632985424F, - 0.6668875197F, 0.6704626398F, 0.6740236662F, 0.6775703649F, - 0.6811025043F, 0.6846198554F, 0.6881221916F, 0.6916092892F, - 0.6950809269F, 0.6985368861F, 0.7019769510F, 0.7054009085F, - 0.7088085484F, 0.7121996632F, 0.7155740484F, 0.7189315023F, - 0.7222718263F, 0.7255948245F, 0.7289003043F, 0.7321880760F, - 0.7354579530F, 0.7387097518F, 0.7419432921F, 0.7451583966F, - 0.7483548915F, 0.7515326059F, 0.7546913723F, 0.7578310265F, - 0.7609514077F, 0.7640523581F, 0.7671337237F, 0.7701953535F, - 0.7732371001F, 0.7762588195F, 0.7792603711F, 0.7822416178F, - 0.7852024259F, 0.7881426654F, 0.7910622097F, 0.7939609356F, - 0.7968387237F, 0.7996954579F, 0.8025310261F, 0.8053453193F, - 0.8081382324F, 0.8109096638F, 0.8136595156F, 0.8163876936F, - 0.8190941071F, 0.8217786690F, 0.8244412960F, 0.8270819086F, - 0.8297004305F, 0.8322967896F, 0.8348709171F, 0.8374227481F, - 0.8399522213F, 0.8424592789F, 0.8449438672F, 0.8474059356F, - 0.8498454378F, 0.8522623306F, 0.8546565748F, 0.8570281348F, - 0.8593769787F, 0.8617030779F, 0.8640064080F, 0.8662869477F, - 0.8685446796F, 0.8707795899F, 0.8729916682F, 0.8751809079F, - 0.8773473059F, 0.8794908626F, 0.8816115819F, 0.8837094713F, - 0.8857845418F, 0.8878368079F, 0.8898662874F, 0.8918730019F, - 0.8938569760F, 0.8958182380F, 0.8977568194F, 0.8996727552F, - 0.9015660837F, 0.9034368465F, 0.9052850885F, 0.9071108577F, - 0.9089142057F, 0.9106951869F, 0.9124538591F, 0.9141902832F, - 0.9159045233F, 0.9175966464F, 0.9192667228F, 0.9209148257F, - 0.9225410313F, 0.9241454187F, 0.9257280701F, 0.9272890704F, - 0.9288285075F, 0.9303464720F, 0.9318430576F, 0.9333183603F, - 0.9347724792F, 0.9362055158F, 0.9376175745F, 0.9390087622F, - 0.9403791881F, 0.9417289644F, 0.9430582055F, 0.9443670283F, - 0.9456555521F, 0.9469238986F, 0.9481721917F, 0.9494005577F, - 0.9506091252F, 0.9517980248F, 0.9529673894F, 0.9541173540F, - 0.9552480557F, 0.9563596334F, 0.9574522282F, 0.9585259830F, - 0.9595810428F, 0.9606175542F, 0.9616356656F, 0.9626355274F, - 0.9636172915F, 0.9645811114F, 0.9655271425F, 0.9664555414F, - 0.9673664664F, 0.9682600774F, 0.9691365355F, 0.9699960034F, - 0.9708386448F, 0.9716646250F, 0.9724741103F, 0.9732672685F, - 0.9740442683F, 0.9748052795F, 0.9755504729F, 0.9762800205F, - 0.9769940950F, 0.9776928703F, 0.9783765210F, 0.9790452223F, - 0.9796991504F, 0.9803384823F, 0.9809633954F, 0.9815740679F, - 0.9821706784F, 0.9827534063F, 0.9833224312F, 0.9838779332F, - 0.9844200928F, 0.9849490910F, 0.9854651087F, 0.9859683274F, - 0.9864589286F, 0.9869370940F, 0.9874030054F, 0.9878568447F, - 0.9882987937F, 0.9887290343F, 0.9891477481F, 0.9895551169F, - 0.9899513220F, 0.9903365446F, 0.9907109658F, 0.9910747662F, - 0.9914281260F, 0.9917712252F, 0.9921042433F, 0.9924273593F, - 0.9927407516F, 0.9930445982F, 0.9933390763F, 0.9936243626F, - 0.9939006331F, 0.9941680631F, 0.9944268269F, 0.9946770982F, - 0.9949190498F, 0.9951528537F, 0.9953786808F, 0.9955967011F, - 0.9958070836F, 0.9960099963F, 0.9962056061F, 0.9963940787F, - 0.9965755786F, 0.9967502693F, 0.9969183129F, 0.9970798704F, - 0.9972351013F, 0.9973841640F, 0.9975272151F, 0.9976644103F, - 0.9977959036F, 0.9979218476F, 0.9980423932F, 0.9981576901F, - 0.9982678862F, 0.9983731278F, 0.9984735596F, 0.9985693247F, - 0.9986605645F, 0.9987474186F, 0.9988300248F, 0.9989085193F, - 0.9989830364F, 0.9990537085F, 0.9991206662F, 0.9991840382F, - 0.9992439513F, 0.9993005303F, 0.9993538982F, 0.9994041757F, - 0.9994514817F, 0.9994959330F, 0.9995376444F, 0.9995767286F, - 0.9996132960F, 0.9996474550F, 0.9996793121F, 0.9997089710F, - 0.9997365339F, 0.9997621003F, 0.9997857677F, 0.9998076311F, - 0.9998277836F, 0.9998463156F, 0.9998633155F, 0.9998788692F, - 0.9998930603F, 0.9999059701F, 0.9999176774F, 0.9999282586F, - 0.9999377880F, 0.9999463370F, 0.9999539749F, 0.9999607685F, - 0.9999667820F, 0.9999720773F, 0.9999767136F, 0.9999807479F, - 0.9999842344F, 0.9999872249F, 0.9999897688F, 0.9999919127F, - 0.9999937009F, 0.9999951749F, 0.9999963738F, 0.9999973342F, - 0.9999980900F, 0.9999986724F, 0.9999991103F, 0.9999994297F, - 0.9999996543F, 0.9999998049F, 0.9999999000F, 0.9999999552F, - 0.9999999836F, 0.9999999957F, 0.9999999994F, 1.0000000000F, -}; - -DECLARE_ALIGNED(16, static const float, vwin2048)[1024] = { - 0.0000009241F, 0.0000083165F, 0.0000231014F, 0.0000452785F, - 0.0000748476F, 0.0001118085F, 0.0001561608F, 0.0002079041F, - 0.0002670379F, 0.0003335617F, 0.0004074748F, 0.0004887765F, - 0.0005774661F, 0.0006735427F, 0.0007770054F, 0.0008878533F, - 0.0010060853F, 0.0011317002F, 0.0012646969F, 0.0014050742F, - 0.0015528307F, 0.0017079650F, 0.0018704756F, 0.0020403610F, - 0.0022176196F, 0.0024022497F, 0.0025942495F, 0.0027936173F, - 0.0030003511F, 0.0032144490F, 0.0034359088F, 0.0036647286F, - 0.0039009061F, 0.0041444391F, 0.0043953253F, 0.0046535621F, - 0.0049191472F, 0.0051920781F, 0.0054723520F, 0.0057599664F, - 0.0060549184F, 0.0063572052F, 0.0066668239F, 0.0069837715F, - 0.0073080449F, 0.0076396410F, 0.0079785566F, 0.0083247884F, - 0.0086783330F, 0.0090391871F, 0.0094073470F, 0.0097828092F, - 0.0101655700F, 0.0105556258F, 0.0109529726F, 0.0113576065F, - 0.0117695237F, 0.0121887200F, 0.0126151913F, 0.0130489335F, - 0.0134899422F, 0.0139382130F, 0.0143937415F, 0.0148565233F, - 0.0153265536F, 0.0158038279F, 0.0162883413F, 0.0167800889F, - 0.0172790660F, 0.0177852675F, 0.0182986882F, 0.0188193231F, - 0.0193471668F, 0.0198822141F, 0.0204244594F, 0.0209738974F, - 0.0215305225F, 0.0220943289F, 0.0226653109F, 0.0232434627F, - 0.0238287784F, 0.0244212519F, 0.0250208772F, 0.0256276481F, - 0.0262415582F, 0.0268626014F, 0.0274907711F, 0.0281260608F, - 0.0287684638F, 0.0294179736F, 0.0300745833F, 0.0307382859F, - 0.0314090747F, 0.0320869424F, 0.0327718819F, 0.0334638860F, - 0.0341629474F, 0.0348690586F, 0.0355822122F, 0.0363024004F, - 0.0370296157F, 0.0377638502F, 0.0385050960F, 0.0392533451F, - 0.0400085896F, 0.0407708211F, 0.0415400315F, 0.0423162123F, - 0.0430993552F, 0.0438894515F, 0.0446864926F, 0.0454904698F, - 0.0463013742F, 0.0471191969F, 0.0479439288F, 0.0487755607F, - 0.0496140836F, 0.0504594879F, 0.0513117642F, 0.0521709031F, - 0.0530368949F, 0.0539097297F, 0.0547893979F, 0.0556758894F, - 0.0565691941F, 0.0574693019F, 0.0583762026F, 0.0592898858F, - 0.0602103410F, 0.0611375576F, 0.0620715250F, 0.0630122324F, - 0.0639596688F, 0.0649138234F, 0.0658746848F, 0.0668422421F, - 0.0678164838F, 0.0687973985F, 0.0697849746F, 0.0707792005F, - 0.0717800645F, 0.0727875547F, 0.0738016591F, 0.0748223656F, - 0.0758496620F, 0.0768835359F, 0.0779239751F, 0.0789709668F, - 0.0800244985F, 0.0810845574F, 0.0821511306F, 0.0832242052F, - 0.0843037679F, 0.0853898056F, 0.0864823050F, 0.0875812525F, - 0.0886866347F, 0.0897984378F, 0.0909166480F, 0.0920412513F, - 0.0931722338F, 0.0943095813F, 0.0954532795F, 0.0966033140F, - 0.0977596702F, 0.0989223336F, 0.1000912894F, 0.1012665227F, - 0.1024480185F, 0.1036357616F, 0.1048297369F, 0.1060299290F, - 0.1072363224F, 0.1084489014F, 0.1096676504F, 0.1108925534F, - 0.1121235946F, 0.1133607577F, 0.1146040267F, 0.1158533850F, - 0.1171088163F, 0.1183703040F, 0.1196378312F, 0.1209113812F, - 0.1221909370F, 0.1234764815F, 0.1247679974F, 0.1260654674F, - 0.1273688740F, 0.1286781995F, 0.1299934263F, 0.1313145365F, - 0.1326415121F, 0.1339743349F, 0.1353129866F, 0.1366574490F, - 0.1380077035F, 0.1393637315F, 0.1407255141F, 0.1420930325F, - 0.1434662677F, 0.1448452004F, 0.1462298115F, 0.1476200814F, - 0.1490159906F, 0.1504175195F, 0.1518246482F, 0.1532373569F, - 0.1546556253F, 0.1560794333F, 0.1575087606F, 0.1589435866F, - 0.1603838909F, 0.1618296526F, 0.1632808509F, 0.1647374648F, - 0.1661994731F, 0.1676668546F, 0.1691395880F, 0.1706176516F, - 0.1721010238F, 0.1735896829F, 0.1750836068F, 0.1765827736F, - 0.1780871610F, 0.1795967468F, 0.1811115084F, 0.1826314234F, - 0.1841564689F, 0.1856866221F, 0.1872218600F, 0.1887621595F, - 0.1903074974F, 0.1918578503F, 0.1934131947F, 0.1949735068F, - 0.1965387630F, 0.1981089393F, 0.1996840117F, 0.2012639560F, - 0.2028487479F, 0.2044383630F, 0.2060327766F, 0.2076319642F, - 0.2092359007F, 0.2108445614F, 0.2124579211F, 0.2140759545F, - 0.2156986364F, 0.2173259411F, 0.2189578432F, 0.2205943168F, - 0.2222353361F, 0.2238808751F, 0.2255309076F, 0.2271854073F, - 0.2288443480F, 0.2305077030F, 0.2321754457F, 0.2338475493F, - 0.2355239869F, 0.2372047315F, 0.2388897560F, 0.2405790329F, - 0.2422725350F, 0.2439702347F, 0.2456721043F, 0.2473781159F, - 0.2490882418F, 0.2508024539F, 0.2525207240F, 0.2542430237F, - 0.2559693248F, 0.2576995986F, 0.2594338166F, 0.2611719498F, - 0.2629139695F, 0.2646598466F, 0.2664095520F, 0.2681630564F, - 0.2699203304F, 0.2716813445F, 0.2734460691F, 0.2752144744F, - 0.2769865307F, 0.2787622079F, 0.2805414760F, 0.2823243047F, - 0.2841106637F, 0.2859005227F, 0.2876938509F, 0.2894906179F, - 0.2912907928F, 0.2930943447F, 0.2949012426F, 0.2967114554F, - 0.2985249520F, 0.3003417009F, 0.3021616708F, 0.3039848301F, - 0.3058111471F, 0.3076405901F, 0.3094731273F, 0.3113087266F, - 0.3131473560F, 0.3149889833F, 0.3168335762F, 0.3186811024F, - 0.3205315294F, 0.3223848245F, 0.3242409552F, 0.3260998886F, - 0.3279615918F, 0.3298260319F, 0.3316931758F, 0.3335629903F, - 0.3354354423F, 0.3373104982F, 0.3391881247F, 0.3410682882F, - 0.3429509551F, 0.3448360917F, 0.3467236642F, 0.3486136387F, - 0.3505059811F, 0.3524006575F, 0.3542976336F, 0.3561968753F, - 0.3580983482F, 0.3600020179F, 0.3619078499F, 0.3638158096F, - 0.3657258625F, 0.3676379737F, 0.3695521086F, 0.3714682321F, - 0.3733863094F, 0.3753063055F, 0.3772281852F, 0.3791519134F, - 0.3810774548F, 0.3830047742F, 0.3849338362F, 0.3868646053F, - 0.3887970459F, 0.3907311227F, 0.3926667998F, 0.3946040417F, - 0.3965428125F, 0.3984830765F, 0.4004247978F, 0.4023679403F, - 0.4043124683F, 0.4062583455F, 0.4082055359F, 0.4101540034F, - 0.4121037117F, 0.4140546246F, 0.4160067058F, 0.4179599190F, - 0.4199142277F, 0.4218695956F, 0.4238259861F, 0.4257833627F, - 0.4277416888F, 0.4297009279F, 0.4316610433F, 0.4336219983F, - 0.4355837562F, 0.4375462803F, 0.4395095337F, 0.4414734797F, - 0.4434380815F, 0.4454033021F, 0.4473691046F, 0.4493354521F, - 0.4513023078F, 0.4532696345F, 0.4552373954F, 0.4572055533F, - 0.4591740713F, 0.4611429123F, 0.4631120393F, 0.4650814151F, - 0.4670510028F, 0.4690207650F, 0.4709906649F, 0.4729606651F, - 0.4749307287F, 0.4769008185F, 0.4788708972F, 0.4808409279F, - 0.4828108732F, 0.4847806962F, 0.4867503597F, 0.4887198264F, - 0.4906890593F, 0.4926580213F, 0.4946266753F, 0.4965949840F, - 0.4985629105F, 0.5005304176F, 0.5024974683F, 0.5044640255F, - 0.5064300522F, 0.5083955114F, 0.5103603659F, 0.5123245790F, - 0.5142881136F, 0.5162509328F, 0.5182129997F, 0.5201742774F, - 0.5221347290F, 0.5240943178F, 0.5260530070F, 0.5280107598F, - 0.5299675395F, 0.5319233095F, 0.5338780330F, 0.5358316736F, - 0.5377841946F, 0.5397355596F, 0.5416857320F, 0.5436346755F, - 0.5455823538F, 0.5475287304F, 0.5494737691F, 0.5514174337F, - 0.5533596881F, 0.5553004962F, 0.5572398218F, 0.5591776291F, - 0.5611138821F, 0.5630485449F, 0.5649815818F, 0.5669129570F, - 0.5688426349F, 0.5707705799F, 0.5726967564F, 0.5746211290F, - 0.5765436624F, 0.5784643212F, 0.5803830702F, 0.5822998743F, - 0.5842146984F, 0.5861275076F, 0.5880382669F, 0.5899469416F, - 0.5918534968F, 0.5937578981F, 0.5956601107F, 0.5975601004F, - 0.5994578326F, 0.6013532732F, 0.6032463880F, 0.6051371429F, - 0.6070255039F, 0.6089114372F, 0.6107949090F, 0.6126758856F, - 0.6145543334F, 0.6164302191F, 0.6183035092F, 0.6201741706F, - 0.6220421700F, 0.6239074745F, 0.6257700513F, 0.6276298674F, - 0.6294868903F, 0.6313410873F, 0.6331924262F, 0.6350408745F, - 0.6368864001F, 0.6387289710F, 0.6405685552F, 0.6424051209F, - 0.6442386364F, 0.6460690702F, 0.6478963910F, 0.6497205673F, - 0.6515415682F, 0.6533593625F, 0.6551739194F, 0.6569852082F, - 0.6587931984F, 0.6605978593F, 0.6623991609F, 0.6641970728F, - 0.6659915652F, 0.6677826081F, 0.6695701718F, 0.6713542268F, - 0.6731347437F, 0.6749116932F, 0.6766850461F, 0.6784547736F, - 0.6802208469F, 0.6819832374F, 0.6837419164F, 0.6854968559F, - 0.6872480275F, 0.6889954034F, 0.6907389556F, 0.6924786566F, - 0.6942144788F, 0.6959463950F, 0.6976743780F, 0.6993984008F, - 0.7011184365F, 0.7028344587F, 0.7045464407F, 0.7062543564F, - 0.7079581796F, 0.7096578844F, 0.7113534450F, 0.7130448359F, - 0.7147320316F, 0.7164150070F, 0.7180937371F, 0.7197681970F, - 0.7214383620F, 0.7231042077F, 0.7247657098F, 0.7264228443F, - 0.7280755871F, 0.7297239147F, 0.7313678035F, 0.7330072301F, - 0.7346421715F, 0.7362726046F, 0.7378985069F, 0.7395198556F, - 0.7411366285F, 0.7427488034F, 0.7443563584F, 0.7459592717F, - 0.7475575218F, 0.7491510873F, 0.7507399471F, 0.7523240803F, - 0.7539034661F, 0.7554780839F, 0.7570479136F, 0.7586129349F, - 0.7601731279F, 0.7617284730F, 0.7632789506F, 0.7648245416F, - 0.7663652267F, 0.7679009872F, 0.7694318044F, 0.7709576599F, - 0.7724785354F, 0.7739944130F, 0.7755052749F, 0.7770111035F, - 0.7785118815F, 0.7800075916F, 0.7814982170F, 0.7829837410F, - 0.7844641472F, 0.7859394191F, 0.7874095408F, 0.7888744965F, - 0.7903342706F, 0.7917888476F, 0.7932382124F, 0.7946823501F, - 0.7961212460F, 0.7975548855F, 0.7989832544F, 0.8004063386F, - 0.8018241244F, 0.8032365981F, 0.8046437463F, 0.8060455560F, - 0.8074420141F, 0.8088331080F, 0.8102188253F, 0.8115991536F, - 0.8129740810F, 0.8143435957F, 0.8157076861F, 0.8170663409F, - 0.8184195489F, 0.8197672994F, 0.8211095817F, 0.8224463853F, - 0.8237777001F, 0.8251035161F, 0.8264238235F, 0.8277386129F, - 0.8290478750F, 0.8303516008F, 0.8316497814F, 0.8329424083F, - 0.8342294731F, 0.8355109677F, 0.8367868841F, 0.8380572148F, - 0.8393219523F, 0.8405810893F, 0.8418346190F, 0.8430825345F, - 0.8443248294F, 0.8455614974F, 0.8467925323F, 0.8480179285F, - 0.8492376802F, 0.8504517822F, 0.8516602292F, 0.8528630164F, - 0.8540601391F, 0.8552515928F, 0.8564373733F, 0.8576174766F, - 0.8587918990F, 0.8599606368F, 0.8611236868F, 0.8622810460F, - 0.8634327113F, 0.8645786802F, 0.8657189504F, 0.8668535195F, - 0.8679823857F, 0.8691055472F, 0.8702230025F, 0.8713347503F, - 0.8724407896F, 0.8735411194F, 0.8746357394F, 0.8757246489F, - 0.8768078479F, 0.8778853364F, 0.8789571146F, 0.8800231832F, - 0.8810835427F, 0.8821381942F, 0.8831871387F, 0.8842303777F, - 0.8852679127F, 0.8862997456F, 0.8873258784F, 0.8883463132F, - 0.8893610527F, 0.8903700994F, 0.8913734562F, 0.8923711263F, - 0.8933631129F, 0.8943494196F, 0.8953300500F, 0.8963050083F, - 0.8972742985F, 0.8982379249F, 0.8991958922F, 0.9001482052F, - 0.9010948688F, 0.9020358883F, 0.9029712690F, 0.9039010165F, - 0.9048251367F, 0.9057436357F, 0.9066565195F, 0.9075637946F, - 0.9084654678F, 0.9093615456F, 0.9102520353F, 0.9111369440F, - 0.9120162792F, 0.9128900484F, 0.9137582595F, 0.9146209204F, - 0.9154780394F, 0.9163296248F, 0.9171756853F, 0.9180162296F, - 0.9188512667F, 0.9196808057F, 0.9205048559F, 0.9213234270F, - 0.9221365285F, 0.9229441704F, 0.9237463629F, 0.9245431160F, - 0.9253344404F, 0.9261203465F, 0.9269008453F, 0.9276759477F, - 0.9284456648F, 0.9292100080F, 0.9299689889F, 0.9307226190F, - 0.9314709103F, 0.9322138747F, 0.9329515245F, 0.9336838721F, - 0.9344109300F, 0.9351327108F, 0.9358492275F, 0.9365604931F, - 0.9372665208F, 0.9379673239F, 0.9386629160F, 0.9393533107F, - 0.9400385220F, 0.9407185637F, 0.9413934501F, 0.9420631954F, - 0.9427278141F, 0.9433873208F, 0.9440417304F, 0.9446910576F, - 0.9453353176F, 0.9459745255F, 0.9466086968F, 0.9472378469F, - 0.9478619915F, 0.9484811463F, 0.9490953274F, 0.9497045506F, - 0.9503088323F, 0.9509081888F, 0.9515026365F, 0.9520921921F, - 0.9526768723F, 0.9532566940F, 0.9538316742F, 0.9544018300F, - 0.9549671786F, 0.9555277375F, 0.9560835241F, 0.9566345562F, - 0.9571808513F, 0.9577224275F, 0.9582593027F, 0.9587914949F, - 0.9593190225F, 0.9598419038F, 0.9603601571F, 0.9608738012F, - 0.9613828546F, 0.9618873361F, 0.9623872646F, 0.9628826591F, - 0.9633735388F, 0.9638599227F, 0.9643418303F, 0.9648192808F, - 0.9652922939F, 0.9657608890F, 0.9662250860F, 0.9666849046F, - 0.9671403646F, 0.9675914861F, 0.9680382891F, 0.9684807937F, - 0.9689190202F, 0.9693529890F, 0.9697827203F, 0.9702082347F, - 0.9706295529F, 0.9710466953F, 0.9714596828F, 0.9718685362F, - 0.9722732762F, 0.9726739240F, 0.9730705005F, 0.9734630267F, - 0.9738515239F, 0.9742360134F, 0.9746165163F, 0.9749930540F, - 0.9753656481F, 0.9757343198F, 0.9760990909F, 0.9764599829F, - 0.9768170175F, 0.9771702164F, 0.9775196013F, 0.9778651941F, - 0.9782070167F, 0.9785450909F, 0.9788794388F, 0.9792100824F, - 0.9795370437F, 0.9798603449F, 0.9801800080F, 0.9804960554F, - 0.9808085092F, 0.9811173916F, 0.9814227251F, 0.9817245318F, - 0.9820228343F, 0.9823176549F, 0.9826090160F, 0.9828969402F, - 0.9831814498F, 0.9834625674F, 0.9837403156F, 0.9840147169F, - 0.9842857939F, 0.9845535692F, 0.9848180654F, 0.9850793052F, - 0.9853373113F, 0.9855921062F, 0.9858437127F, 0.9860921535F, - 0.9863374512F, 0.9865796287F, 0.9868187085F, 0.9870547136F, - 0.9872876664F, 0.9875175899F, 0.9877445067F, 0.9879684396F, - 0.9881894112F, 0.9884074444F, 0.9886225619F, 0.9888347863F, - 0.9890441404F, 0.9892506468F, 0.9894543284F, 0.9896552077F, - 0.9898533074F, 0.9900486502F, 0.9902412587F, 0.9904311555F, - 0.9906183633F, 0.9908029045F, 0.9909848019F, 0.9911640779F, - 0.9913407550F, 0.9915148557F, 0.9916864025F, 0.9918554179F, - 0.9920219241F, 0.9921859437F, 0.9923474989F, 0.9925066120F, - 0.9926633054F, 0.9928176012F, 0.9929695218F, 0.9931190891F, - 0.9932663254F, 0.9934112527F, 0.9935538932F, 0.9936942686F, - 0.9938324012F, 0.9939683126F, 0.9941020248F, 0.9942335597F, - 0.9943629388F, 0.9944901841F, 0.9946153170F, 0.9947383593F, - 0.9948593325F, 0.9949782579F, 0.9950951572F, 0.9952100516F, - 0.9953229625F, 0.9954339111F, 0.9955429186F, 0.9956500062F, - 0.9957551948F, 0.9958585056F, 0.9959599593F, 0.9960595769F, - 0.9961573792F, 0.9962533869F, 0.9963476206F, 0.9964401009F, - 0.9965308483F, 0.9966198833F, 0.9967072261F, 0.9967928971F, - 0.9968769164F, 0.9969593041F, 0.9970400804F, 0.9971192651F, - 0.9971968781F, 0.9972729391F, 0.9973474680F, 0.9974204842F, - 0.9974920074F, 0.9975620569F, 0.9976306521F, 0.9976978122F, - 0.9977635565F, 0.9978279039F, 0.9978908736F, 0.9979524842F, - 0.9980127547F, 0.9980717037F, 0.9981293499F, 0.9981857116F, - 0.9982408073F, 0.9982946554F, 0.9983472739F, 0.9983986810F, - 0.9984488947F, 0.9984979328F, 0.9985458132F, 0.9985925534F, - 0.9986381711F, 0.9986826838F, 0.9987261086F, 0.9987684630F, - 0.9988097640F, 0.9988500286F, 0.9988892738F, 0.9989275163F, - 0.9989647727F, 0.9990010597F, 0.9990363938F, 0.9990707911F, - 0.9991042679F, 0.9991368404F, 0.9991685244F, 0.9991993358F, - 0.9992292905F, 0.9992584038F, 0.9992866914F, 0.9993141686F, - 0.9993408506F, 0.9993667526F, 0.9993918895F, 0.9994162761F, - 0.9994399273F, 0.9994628576F, 0.9994850815F, 0.9995066133F, - 0.9995274672F, 0.9995476574F, 0.9995671978F, 0.9995861021F, - 0.9996043841F, 0.9996220573F, 0.9996391352F, 0.9996556310F, - 0.9996715579F, 0.9996869288F, 0.9997017568F, 0.9997160543F, - 0.9997298342F, 0.9997431088F, 0.9997558905F, 0.9997681914F, - 0.9997800236F, 0.9997913990F, 0.9998023292F, 0.9998128261F, - 0.9998229009F, 0.9998325650F, 0.9998418296F, 0.9998507058F, - 0.9998592044F, 0.9998673362F, 0.9998751117F, 0.9998825415F, - 0.9998896358F, 0.9998964047F, 0.9999028584F, 0.9999090066F, - 0.9999148590F, 0.9999204253F, 0.9999257148F, 0.9999307368F, - 0.9999355003F, 0.9999400144F, 0.9999442878F, 0.9999483293F, - 0.9999521472F, 0.9999557499F, 0.9999591457F, 0.9999623426F, - 0.9999653483F, 0.9999681708F, 0.9999708175F, 0.9999732959F, - 0.9999756132F, 0.9999777765F, 0.9999797928F, 0.9999816688F, - 0.9999834113F, 0.9999850266F, 0.9999865211F, 0.9999879009F, - 0.9999891721F, 0.9999903405F, 0.9999914118F, 0.9999923914F, - 0.9999932849F, 0.9999940972F, 0.9999948336F, 0.9999954989F, - 0.9999960978F, 0.9999966349F, 0.9999971146F, 0.9999975411F, - 0.9999979185F, 0.9999982507F, 0.9999985414F, 0.9999987944F, - 0.9999990129F, 0.9999992003F, 0.9999993596F, 0.9999994939F, - 0.9999996059F, 0.9999996981F, 0.9999997732F, 0.9999998333F, - 0.9999998805F, 0.9999999170F, 0.9999999444F, 0.9999999643F, - 0.9999999784F, 0.9999999878F, 0.9999999937F, 0.9999999972F, - 0.9999999990F, 0.9999999997F, 1.0000000000F, 1.0000000000F, -}; - -DECLARE_ALIGNED(16, static const float, vwin4096)[2048] = { - 0.0000002310F, 0.0000020791F, 0.0000057754F, 0.0000113197F, - 0.0000187121F, 0.0000279526F, 0.0000390412F, 0.0000519777F, - 0.0000667623F, 0.0000833949F, 0.0001018753F, 0.0001222036F, - 0.0001443798F, 0.0001684037F, 0.0001942754F, 0.0002219947F, - 0.0002515616F, 0.0002829761F, 0.0003162380F, 0.0003513472F, - 0.0003883038F, 0.0004271076F, 0.0004677584F, 0.0005102563F, - 0.0005546011F, 0.0006007928F, 0.0006488311F, 0.0006987160F, - 0.0007504474F, 0.0008040251F, 0.0008594490F, 0.0009167191F, - 0.0009758351F, 0.0010367969F, 0.0010996044F, 0.0011642574F, - 0.0012307558F, 0.0012990994F, 0.0013692880F, 0.0014413216F, - 0.0015151998F, 0.0015909226F, 0.0016684898F, 0.0017479011F, - 0.0018291565F, 0.0019122556F, 0.0019971983F, 0.0020839845F, - 0.0021726138F, 0.0022630861F, 0.0023554012F, 0.0024495588F, - 0.0025455588F, 0.0026434008F, 0.0027430847F, 0.0028446103F, - 0.0029479772F, 0.0030531853F, 0.0031602342F, 0.0032691238F, - 0.0033798538F, 0.0034924239F, 0.0036068338F, 0.0037230833F, - 0.0038411721F, 0.0039610999F, 0.0040828664F, 0.0042064714F, - 0.0043319145F, 0.0044591954F, 0.0045883139F, 0.0047192696F, - 0.0048520622F, 0.0049866914F, 0.0051231569F, 0.0052614583F, - 0.0054015953F, 0.0055435676F, 0.0056873748F, 0.0058330166F, - 0.0059804926F, 0.0061298026F, 0.0062809460F, 0.0064339226F, - 0.0065887320F, 0.0067453738F, 0.0069038476F, 0.0070641531F, - 0.0072262899F, 0.0073902575F, 0.0075560556F, 0.0077236838F, - 0.0078931417F, 0.0080644288F, 0.0082375447F, 0.0084124891F, - 0.0085892615F, 0.0087678614F, 0.0089482885F, 0.0091305422F, - 0.0093146223F, 0.0095005281F, 0.0096882592F, 0.0098778153F, - 0.0100691958F, 0.0102624002F, 0.0104574281F, 0.0106542791F, - 0.0108529525F, 0.0110534480F, 0.0112557651F, 0.0114599032F, - 0.0116658618F, 0.0118736405F, 0.0120832387F, 0.0122946560F, - 0.0125078917F, 0.0127229454F, 0.0129398166F, 0.0131585046F, - 0.0133790090F, 0.0136013292F, 0.0138254647F, 0.0140514149F, - 0.0142791792F, 0.0145087572F, 0.0147401481F, 0.0149733515F, - 0.0152083667F, 0.0154451932F, 0.0156838304F, 0.0159242777F, - 0.0161665345F, 0.0164106001F, 0.0166564741F, 0.0169041557F, - 0.0171536443F, 0.0174049393F, 0.0176580401F, 0.0179129461F, - 0.0181696565F, 0.0184281708F, 0.0186884883F, 0.0189506084F, - 0.0192145303F, 0.0194802535F, 0.0197477772F, 0.0200171008F, - 0.0202882236F, 0.0205611449F, 0.0208358639F, 0.0211123801F, - 0.0213906927F, 0.0216708011F, 0.0219527043F, 0.0222364019F, - 0.0225218930F, 0.0228091769F, 0.0230982529F, 0.0233891203F, - 0.0236817782F, 0.0239762259F, 0.0242724628F, 0.0245704880F, - 0.0248703007F, 0.0251719002F, 0.0254752858F, 0.0257804565F, - 0.0260874117F, 0.0263961506F, 0.0267066722F, 0.0270189760F, - 0.0273330609F, 0.0276489263F, 0.0279665712F, 0.0282859949F, - 0.0286071966F, 0.0289301753F, 0.0292549303F, 0.0295814607F, - 0.0299097656F, 0.0302398442F, 0.0305716957F, 0.0309053191F, - 0.0312407135F, 0.0315778782F, 0.0319168122F, 0.0322575145F, - 0.0325999844F, 0.0329442209F, 0.0332902231F, 0.0336379900F, - 0.0339875208F, 0.0343388146F, 0.0346918703F, 0.0350466871F, - 0.0354032640F, 0.0357616000F, 0.0361216943F, 0.0364835458F, - 0.0368471535F, 0.0372125166F, 0.0375796339F, 0.0379485046F, - 0.0383191276F, 0.0386915020F, 0.0390656267F, 0.0394415008F, - 0.0398191231F, 0.0401984927F, 0.0405796086F, 0.0409624698F, - 0.0413470751F, 0.0417334235F, 0.0421215141F, 0.0425113457F, - 0.0429029172F, 0.0432962277F, 0.0436912760F, 0.0440880610F, - 0.0444865817F, 0.0448868370F, 0.0452888257F, 0.0456925468F, - 0.0460979992F, 0.0465051816F, 0.0469140931F, 0.0473247325F, - 0.0477370986F, 0.0481511902F, 0.0485670064F, 0.0489845458F, - 0.0494038074F, 0.0498247899F, 0.0502474922F, 0.0506719131F, - 0.0510980514F, 0.0515259060F, 0.0519554756F, 0.0523867590F, - 0.0528197550F, 0.0532544624F, 0.0536908800F, 0.0541290066F, - 0.0545688408F, 0.0550103815F, 0.0554536274F, 0.0558985772F, - 0.0563452297F, 0.0567935837F, 0.0572436377F, 0.0576953907F, - 0.0581488412F, 0.0586039880F, 0.0590608297F, 0.0595193651F, - 0.0599795929F, 0.0604415117F, 0.0609051202F, 0.0613704170F, - 0.0618374009F, 0.0623060704F, 0.0627764243F, 0.0632484611F, - 0.0637221795F, 0.0641975781F, 0.0646746555F, 0.0651534104F, - 0.0656338413F, 0.0661159469F, 0.0665997257F, 0.0670851763F, - 0.0675722973F, 0.0680610873F, 0.0685515448F, 0.0690436684F, - 0.0695374567F, 0.0700329081F, 0.0705300213F, 0.0710287947F, - 0.0715292269F, 0.0720313163F, 0.0725350616F, 0.0730404612F, - 0.0735475136F, 0.0740562172F, 0.0745665707F, 0.0750785723F, - 0.0755922207F, 0.0761075143F, 0.0766244515F, 0.0771430307F, - 0.0776632505F, 0.0781851092F, 0.0787086052F, 0.0792337371F, - 0.0797605032F, 0.0802889018F, 0.0808189315F, 0.0813505905F, - 0.0818838773F, 0.0824187903F, 0.0829553277F, 0.0834934881F, - 0.0840332697F, 0.0845746708F, 0.0851176899F, 0.0856623252F, - 0.0862085751F, 0.0867564379F, 0.0873059119F, 0.0878569954F, - 0.0884096867F, 0.0889639840F, 0.0895198858F, 0.0900773902F, - 0.0906364955F, 0.0911972000F, 0.0917595019F, 0.0923233995F, - 0.0928888909F, 0.0934559745F, 0.0940246485F, 0.0945949110F, - 0.0951667604F, 0.0957401946F, 0.0963152121F, 0.0968918109F, - 0.0974699893F, 0.0980497454F, 0.0986310773F, 0.0992139832F, - 0.0997984614F, 0.1003845098F, 0.1009721267F, 0.1015613101F, - 0.1021520582F, 0.1027443692F, 0.1033382410F, 0.1039336718F, - 0.1045306597F, 0.1051292027F, 0.1057292990F, 0.1063309466F, - 0.1069341435F, 0.1075388878F, 0.1081451776F, 0.1087530108F, - 0.1093623856F, 0.1099732998F, 0.1105857516F, 0.1111997389F, - 0.1118152597F, 0.1124323121F, 0.1130508939F, 0.1136710032F, - 0.1142926379F, 0.1149157960F, 0.1155404755F, 0.1161666742F, - 0.1167943901F, 0.1174236211F, 0.1180543652F, 0.1186866202F, - 0.1193203841F, 0.1199556548F, 0.1205924300F, 0.1212307078F, - 0.1218704860F, 0.1225117624F, 0.1231545349F, 0.1237988013F, - 0.1244445596F, 0.1250918074F, 0.1257405427F, 0.1263907632F, - 0.1270424667F, 0.1276956512F, 0.1283503142F, 0.1290064537F, - 0.1296640674F, 0.1303231530F, 0.1309837084F, 0.1316457312F, - 0.1323092193F, 0.1329741703F, 0.1336405820F, 0.1343084520F, - 0.1349777782F, 0.1356485582F, 0.1363207897F, 0.1369944704F, - 0.1376695979F, 0.1383461700F, 0.1390241842F, 0.1397036384F, - 0.1403845300F, 0.1410668567F, 0.1417506162F, 0.1424358061F, - 0.1431224240F, 0.1438104674F, 0.1444999341F, 0.1451908216F, - 0.1458831274F, 0.1465768492F, 0.1472719844F, 0.1479685308F, - 0.1486664857F, 0.1493658468F, 0.1500666115F, 0.1507687775F, - 0.1514723422F, 0.1521773031F, 0.1528836577F, 0.1535914035F, - 0.1543005380F, 0.1550110587F, 0.1557229631F, 0.1564362485F, - 0.1571509124F, 0.1578669524F, 0.1585843657F, 0.1593031499F, - 0.1600233024F, 0.1607448205F, 0.1614677017F, 0.1621919433F, - 0.1629175428F, 0.1636444975F, 0.1643728047F, 0.1651024619F, - 0.1658334665F, 0.1665658156F, 0.1672995067F, 0.1680345371F, - 0.1687709041F, 0.1695086050F, 0.1702476372F, 0.1709879978F, - 0.1717296843F, 0.1724726938F, 0.1732170237F, 0.1739626711F, - 0.1747096335F, 0.1754579079F, 0.1762074916F, 0.1769583819F, - 0.1777105760F, 0.1784640710F, 0.1792188642F, 0.1799749529F, - 0.1807323340F, 0.1814910049F, 0.1822509628F, 0.1830122046F, - 0.1837747277F, 0.1845385292F, 0.1853036062F, 0.1860699558F, - 0.1868375751F, 0.1876064613F, 0.1883766114F, 0.1891480226F, - 0.1899206919F, 0.1906946164F, 0.1914697932F, 0.1922462194F, - 0.1930238919F, 0.1938028079F, 0.1945829643F, 0.1953643583F, - 0.1961469868F, 0.1969308468F, 0.1977159353F, 0.1985022494F, - 0.1992897859F, 0.2000785420F, 0.2008685145F, 0.2016597005F, - 0.2024520968F, 0.2032457005F, 0.2040405084F, 0.2048365175F, - 0.2056337247F, 0.2064321269F, 0.2072317211F, 0.2080325041F, - 0.2088344727F, 0.2096376240F, 0.2104419547F, 0.2112474618F, - 0.2120541420F, 0.2128619923F, 0.2136710094F, 0.2144811902F, - 0.2152925315F, 0.2161050301F, 0.2169186829F, 0.2177334866F, - 0.2185494381F, 0.2193665340F, 0.2201847712F, 0.2210041465F, - 0.2218246565F, 0.2226462981F, 0.2234690680F, 0.2242929629F, - 0.2251179796F, 0.2259441147F, 0.2267713650F, 0.2275997272F, - 0.2284291979F, 0.2292597739F, 0.2300914518F, 0.2309242283F, - 0.2317581001F, 0.2325930638F, 0.2334291160F, 0.2342662534F, - 0.2351044727F, 0.2359437703F, 0.2367841431F, 0.2376255875F, - 0.2384681001F, 0.2393116776F, 0.2401563165F, 0.2410020134F, - 0.2418487649F, 0.2426965675F, 0.2435454178F, 0.2443953122F, - 0.2452462474F, 0.2460982199F, 0.2469512262F, 0.2478052628F, - 0.2486603262F, 0.2495164129F, 0.2503735194F, 0.2512316421F, - 0.2520907776F, 0.2529509222F, 0.2538120726F, 0.2546742250F, - 0.2555373760F, 0.2564015219F, 0.2572666593F, 0.2581327845F, - 0.2589998939F, 0.2598679840F, 0.2607370510F, 0.2616070916F, - 0.2624781019F, 0.2633500783F, 0.2642230173F, 0.2650969152F, - 0.2659717684F, 0.2668475731F, 0.2677243257F, 0.2686020226F, - 0.2694806601F, 0.2703602344F, 0.2712407419F, 0.2721221789F, - 0.2730045417F, 0.2738878265F, 0.2747720297F, 0.2756571474F, - 0.2765431760F, 0.2774301117F, 0.2783179508F, 0.2792066895F, - 0.2800963240F, 0.2809868505F, 0.2818782654F, 0.2827705647F, - 0.2836637447F, 0.2845578016F, 0.2854527315F, 0.2863485307F, - 0.2872451953F, 0.2881427215F, 0.2890411055F, 0.2899403433F, - 0.2908404312F, 0.2917413654F, 0.2926431418F, 0.2935457567F, - 0.2944492061F, 0.2953534863F, 0.2962585932F, 0.2971645230F, - 0.2980712717F, 0.2989788356F, 0.2998872105F, 0.3007963927F, - 0.3017063781F, 0.3026171629F, 0.3035287430F, 0.3044411145F, - 0.3053542736F, 0.3062682161F, 0.3071829381F, 0.3080984356F, - 0.3090147047F, 0.3099317413F, 0.3108495414F, 0.3117681011F, - 0.3126874163F, 0.3136074830F, 0.3145282972F, 0.3154498548F, - 0.3163721517F, 0.3172951841F, 0.3182189477F, 0.3191434385F, - 0.3200686525F, 0.3209945856F, 0.3219212336F, 0.3228485927F, - 0.3237766585F, 0.3247054271F, 0.3256348943F, 0.3265650560F, - 0.3274959081F, 0.3284274465F, 0.3293596671F, 0.3302925657F, - 0.3312261382F, 0.3321603804F, 0.3330952882F, 0.3340308574F, - 0.3349670838F, 0.3359039634F, 0.3368414919F, 0.3377796651F, - 0.3387184789F, 0.3396579290F, 0.3405980113F, 0.3415387216F, - 0.3424800556F, 0.3434220091F, 0.3443645779F, 0.3453077578F, - 0.3462515446F, 0.3471959340F, 0.3481409217F, 0.3490865036F, - 0.3500326754F, 0.3509794328F, 0.3519267715F, 0.3528746873F, - 0.3538231759F, 0.3547722330F, 0.3557218544F, 0.3566720357F, - 0.3576227727F, 0.3585740610F, 0.3595258964F, 0.3604782745F, - 0.3614311910F, 0.3623846417F, 0.3633386221F, 0.3642931280F, - 0.3652481549F, 0.3662036987F, 0.3671597548F, 0.3681163191F, - 0.3690733870F, 0.3700309544F, 0.3709890167F, 0.3719475696F, - 0.3729066089F, 0.3738661299F, 0.3748261285F, 0.3757866002F, - 0.3767475406F, 0.3777089453F, 0.3786708100F, 0.3796331302F, - 0.3805959014F, 0.3815591194F, 0.3825227796F, 0.3834868777F, - 0.3844514093F, 0.3854163698F, 0.3863817549F, 0.3873475601F, - 0.3883137810F, 0.3892804131F, 0.3902474521F, 0.3912148933F, - 0.3921827325F, 0.3931509650F, 0.3941195865F, 0.3950885925F, - 0.3960579785F, 0.3970277400F, 0.3979978725F, 0.3989683716F, - 0.3999392328F, 0.4009104516F, 0.4018820234F, 0.4028539438F, - 0.4038262084F, 0.4047988125F, 0.4057717516F, 0.4067450214F, - 0.4077186172F, 0.4086925345F, 0.4096667688F, 0.4106413155F, - 0.4116161703F, 0.4125913284F, 0.4135667854F, 0.4145425368F, - 0.4155185780F, 0.4164949044F, 0.4174715116F, 0.4184483949F, - 0.4194255498F, 0.4204029718F, 0.4213806563F, 0.4223585987F, - 0.4233367946F, 0.4243152392F, 0.4252939281F, 0.4262728566F, - 0.4272520202F, 0.4282314144F, 0.4292110345F, 0.4301908760F, - 0.4311709343F, 0.4321512047F, 0.4331316828F, 0.4341123639F, - 0.4350932435F, 0.4360743168F, 0.4370555794F, 0.4380370267F, - 0.4390186540F, 0.4400004567F, 0.4409824303F, 0.4419645701F, - 0.4429468716F, 0.4439293300F, 0.4449119409F, 0.4458946996F, - 0.4468776014F, 0.4478606418F, 0.4488438162F, 0.4498271199F, - 0.4508105483F, 0.4517940967F, 0.4527777607F, 0.4537615355F, - 0.4547454165F, 0.4557293991F, 0.4567134786F, 0.4576976505F, - 0.4586819101F, 0.4596662527F, 0.4606506738F, 0.4616351687F, - 0.4626197328F, 0.4636043614F, 0.4645890499F, 0.4655737936F, - 0.4665585880F, 0.4675434284F, 0.4685283101F, 0.4695132286F, - 0.4704981791F, 0.4714831570F, 0.4724681577F, 0.4734531766F, - 0.4744382089F, 0.4754232501F, 0.4764082956F, 0.4773933406F, - 0.4783783806F, 0.4793634108F, 0.4803484267F, 0.4813334237F, - 0.4823183969F, 0.4833033419F, 0.4842882540F, 0.4852731285F, - 0.4862579608F, 0.4872427462F, 0.4882274802F, 0.4892121580F, - 0.4901967751F, 0.4911813267F, 0.4921658083F, 0.4931502151F, - 0.4941345427F, 0.4951187863F, 0.4961029412F, 0.4970870029F, - 0.4980709667F, 0.4990548280F, 0.5000385822F, 0.5010222245F, - 0.5020057505F, 0.5029891553F, 0.5039724345F, 0.5049555834F, - 0.5059385973F, 0.5069214716F, 0.5079042018F, 0.5088867831F, - 0.5098692110F, 0.5108514808F, 0.5118335879F, 0.5128155277F, - 0.5137972956F, 0.5147788869F, 0.5157602971F, 0.5167415215F, - 0.5177225555F, 0.5187033945F, 0.5196840339F, 0.5206644692F, - 0.5216446956F, 0.5226247086F, 0.5236045035F, 0.5245840759F, - 0.5255634211F, 0.5265425344F, 0.5275214114F, 0.5285000474F, - 0.5294784378F, 0.5304565781F, 0.5314344637F, 0.5324120899F, - 0.5333894522F, 0.5343665461F, 0.5353433670F, 0.5363199102F, - 0.5372961713F, 0.5382721457F, 0.5392478287F, 0.5402232159F, - 0.5411983027F, 0.5421730845F, 0.5431475569F, 0.5441217151F, - 0.5450955548F, 0.5460690714F, 0.5470422602F, 0.5480151169F, - 0.5489876368F, 0.5499598155F, 0.5509316484F, 0.5519031310F, - 0.5528742587F, 0.5538450271F, 0.5548154317F, 0.5557854680F, - 0.5567551314F, 0.5577244174F, 0.5586933216F, 0.5596618395F, - 0.5606299665F, 0.5615976983F, 0.5625650302F, 0.5635319580F, - 0.5644984770F, 0.5654645828F, 0.5664302709F, 0.5673955370F, - 0.5683603765F, 0.5693247850F, 0.5702887580F, 0.5712522912F, - 0.5722153800F, 0.5731780200F, 0.5741402069F, 0.5751019362F, - 0.5760632034F, 0.5770240042F, 0.5779843341F, 0.5789441889F, - 0.5799035639F, 0.5808624549F, 0.5818208575F, 0.5827787673F, - 0.5837361800F, 0.5846930910F, 0.5856494961F, 0.5866053910F, - 0.5875607712F, 0.5885156324F, 0.5894699703F, 0.5904237804F, - 0.5913770586F, 0.5923298004F, 0.5932820016F, 0.5942336578F, - 0.5951847646F, 0.5961353179F, 0.5970853132F, 0.5980347464F, - 0.5989836131F, 0.5999319090F, 0.6008796298F, 0.6018267713F, - 0.6027733292F, 0.6037192993F, 0.6046646773F, 0.6056094589F, - 0.6065536400F, 0.6074972162F, 0.6084401833F, 0.6093825372F, - 0.6103242736F, 0.6112653884F, 0.6122058772F, 0.6131457359F, - 0.6140849604F, 0.6150235464F, 0.6159614897F, 0.6168987862F, - 0.6178354318F, 0.6187714223F, 0.6197067535F, 0.6206414213F, - 0.6215754215F, 0.6225087501F, 0.6234414028F, 0.6243733757F, - 0.6253046646F, 0.6262352654F, 0.6271651739F, 0.6280943862F, - 0.6290228982F, 0.6299507057F, 0.6308778048F, 0.6318041913F, - 0.6327298612F, 0.6336548105F, 0.6345790352F, 0.6355025312F, - 0.6364252945F, 0.6373473211F, 0.6382686070F, 0.6391891483F, - 0.6401089409F, 0.6410279808F, 0.6419462642F, 0.6428637869F, - 0.6437805452F, 0.6446965350F, 0.6456117524F, 0.6465261935F, - 0.6474398544F, 0.6483527311F, 0.6492648197F, 0.6501761165F, - 0.6510866174F, 0.6519963186F, 0.6529052162F, 0.6538133064F, - 0.6547205854F, 0.6556270492F, 0.6565326941F, 0.6574375162F, - 0.6583415117F, 0.6592446769F, 0.6601470079F, 0.6610485009F, - 0.6619491521F, 0.6628489578F, 0.6637479143F, 0.6646460177F, - 0.6655432643F, 0.6664396505F, 0.6673351724F, 0.6682298264F, - 0.6691236087F, 0.6700165157F, 0.6709085436F, 0.6717996889F, - 0.6726899478F, 0.6735793167F, 0.6744677918F, 0.6753553697F, - 0.6762420466F, 0.6771278190F, 0.6780126832F, 0.6788966357F, - 0.6797796728F, 0.6806617909F, 0.6815429866F, 0.6824232562F, - 0.6833025961F, 0.6841810030F, 0.6850584731F, 0.6859350031F, - 0.6868105894F, 0.6876852284F, 0.6885589168F, 0.6894316510F, - 0.6903034275F, 0.6911742430F, 0.6920440939F, 0.6929129769F, - 0.6937808884F, 0.6946478251F, 0.6955137837F, 0.6963787606F, - 0.6972427525F, 0.6981057560F, 0.6989677678F, 0.6998287845F, - 0.7006888028F, 0.7015478194F, 0.7024058309F, 0.7032628340F, - 0.7041188254F, 0.7049738019F, 0.7058277601F, 0.7066806969F, - 0.7075326089F, 0.7083834929F, 0.7092333457F, 0.7100821640F, - 0.7109299447F, 0.7117766846F, 0.7126223804F, 0.7134670291F, - 0.7143106273F, 0.7151531721F, 0.7159946602F, 0.7168350885F, - 0.7176744539F, 0.7185127534F, 0.7193499837F, 0.7201861418F, - 0.7210212247F, 0.7218552293F, 0.7226881526F, 0.7235199914F, - 0.7243507428F, 0.7251804039F, 0.7260089715F, 0.7268364426F, - 0.7276628144F, 0.7284880839F, 0.7293122481F, 0.7301353040F, - 0.7309572487F, 0.7317780794F, 0.7325977930F, 0.7334163868F, - 0.7342338579F, 0.7350502033F, 0.7358654202F, 0.7366795059F, - 0.7374924573F, 0.7383042718F, 0.7391149465F, 0.7399244787F, - 0.7407328655F, 0.7415401041F, 0.7423461920F, 0.7431511261F, - 0.7439549040F, 0.7447575227F, 0.7455589797F, 0.7463592723F, - 0.7471583976F, 0.7479563532F, 0.7487531363F, 0.7495487443F, - 0.7503431745F, 0.7511364244F, 0.7519284913F, 0.7527193726F, - 0.7535090658F, 0.7542975683F, 0.7550848776F, 0.7558709910F, - 0.7566559062F, 0.7574396205F, 0.7582221314F, 0.7590034366F, - 0.7597835334F, 0.7605624194F, 0.7613400923F, 0.7621165495F, - 0.7628917886F, 0.7636658072F, 0.7644386030F, 0.7652101735F, - 0.7659805164F, 0.7667496292F, 0.7675175098F, 0.7682841556F, - 0.7690495645F, 0.7698137341F, 0.7705766622F, 0.7713383463F, - 0.7720987844F, 0.7728579741F, 0.7736159132F, 0.7743725994F, - 0.7751280306F, 0.7758822046F, 0.7766351192F, 0.7773867722F, - 0.7781371614F, 0.7788862848F, 0.7796341401F, 0.7803807253F, - 0.7811260383F, 0.7818700769F, 0.7826128392F, 0.7833543230F, - 0.7840945263F, 0.7848334471F, 0.7855710833F, 0.7863074330F, - 0.7870424941F, 0.7877762647F, 0.7885087428F, 0.7892399264F, - 0.7899698137F, 0.7906984026F, 0.7914256914F, 0.7921516780F, - 0.7928763607F, 0.7935997375F, 0.7943218065F, 0.7950425661F, - 0.7957620142F, 0.7964801492F, 0.7971969692F, 0.7979124724F, - 0.7986266570F, 0.7993395214F, 0.8000510638F, 0.8007612823F, - 0.8014701754F, 0.8021777413F, 0.8028839784F, 0.8035888849F, - 0.8042924592F, 0.8049946997F, 0.8056956048F, 0.8063951727F, - 0.8070934020F, 0.8077902910F, 0.8084858381F, 0.8091800419F, - 0.8098729007F, 0.8105644130F, 0.8112545774F, 0.8119433922F, - 0.8126308561F, 0.8133169676F, 0.8140017251F, 0.8146851272F, - 0.8153671726F, 0.8160478598F, 0.8167271874F, 0.8174051539F, - 0.8180817582F, 0.8187569986F, 0.8194308741F, 0.8201033831F, - 0.8207745244F, 0.8214442966F, 0.8221126986F, 0.8227797290F, - 0.8234453865F, 0.8241096700F, 0.8247725781F, 0.8254341097F, - 0.8260942636F, 0.8267530385F, 0.8274104334F, 0.8280664470F, - 0.8287210782F, 0.8293743259F, 0.8300261889F, 0.8306766662F, - 0.8313257566F, 0.8319734591F, 0.8326197727F, 0.8332646963F, - 0.8339082288F, 0.8345503692F, 0.8351911167F, 0.8358304700F, - 0.8364684284F, 0.8371049907F, 0.8377401562F, 0.8383739238F, - 0.8390062927F, 0.8396372618F, 0.8402668305F, 0.8408949977F, - 0.8415217626F, 0.8421471245F, 0.8427710823F, 0.8433936354F, - 0.8440147830F, 0.8446345242F, 0.8452528582F, 0.8458697844F, - 0.8464853020F, 0.8470994102F, 0.8477121084F, 0.8483233958F, - 0.8489332718F, 0.8495417356F, 0.8501487866F, 0.8507544243F, - 0.8513586479F, 0.8519614568F, 0.8525628505F, 0.8531628283F, - 0.8537613897F, 0.8543585341F, 0.8549542611F, 0.8555485699F, - 0.8561414603F, 0.8567329315F, 0.8573229832F, 0.8579116149F, - 0.8584988262F, 0.8590846165F, 0.8596689855F, 0.8602519327F, - 0.8608334577F, 0.8614135603F, 0.8619922399F, 0.8625694962F, - 0.8631453289F, 0.8637197377F, 0.8642927222F, 0.8648642821F, - 0.8654344172F, 0.8660031272F, 0.8665704118F, 0.8671362708F, - 0.8677007039F, 0.8682637109F, 0.8688252917F, 0.8693854460F, - 0.8699441737F, 0.8705014745F, 0.8710573485F, 0.8716117953F, - 0.8721648150F, 0.8727164073F, 0.8732665723F, 0.8738153098F, - 0.8743626197F, 0.8749085021F, 0.8754529569F, 0.8759959840F, - 0.8765375835F, 0.8770777553F, 0.8776164996F, 0.8781538162F, - 0.8786897054F, 0.8792241670F, 0.8797572013F, 0.8802888082F, - 0.8808189880F, 0.8813477407F, 0.8818750664F, 0.8824009653F, - 0.8829254375F, 0.8834484833F, 0.8839701028F, 0.8844902961F, - 0.8850090636F, 0.8855264054F, 0.8860423218F, 0.8865568131F, - 0.8870698794F, 0.8875815212F, 0.8880917386F, 0.8886005319F, - 0.8891079016F, 0.8896138479F, 0.8901183712F, 0.8906214719F, - 0.8911231503F, 0.8916234067F, 0.8921222417F, 0.8926196556F, - 0.8931156489F, 0.8936102219F, 0.8941033752F, 0.8945951092F, - 0.8950854244F, 0.8955743212F, 0.8960618003F, 0.8965478621F, - 0.8970325071F, 0.8975157359F, 0.8979975490F, 0.8984779471F, - 0.8989569307F, 0.8994345004F, 0.8999106568F, 0.9003854005F, - 0.9008587323F, 0.9013306526F, 0.9018011623F, 0.9022702619F, - 0.9027379521F, 0.9032042337F, 0.9036691074F, 0.9041325739F, - 0.9045946339F, 0.9050552882F, 0.9055145376F, 0.9059723828F, - 0.9064288246F, 0.9068838638F, 0.9073375013F, 0.9077897379F, - 0.9082405743F, 0.9086900115F, 0.9091380503F, 0.9095846917F, - 0.9100299364F, 0.9104737854F, 0.9109162397F, 0.9113573001F, - 0.9117969675F, 0.9122352430F, 0.9126721275F, 0.9131076219F, - 0.9135417273F, 0.9139744447F, 0.9144057750F, 0.9148357194F, - 0.9152642787F, 0.9156914542F, 0.9161172468F, 0.9165416576F, - 0.9169646877F, 0.9173863382F, 0.9178066102F, 0.9182255048F, - 0.9186430232F, 0.9190591665F, 0.9194739359F, 0.9198873324F, - 0.9202993574F, 0.9207100120F, 0.9211192973F, 0.9215272147F, - 0.9219337653F, 0.9223389504F, 0.9227427713F, 0.9231452290F, - 0.9235463251F, 0.9239460607F, 0.9243444371F, 0.9247414557F, - 0.9251371177F, 0.9255314245F, 0.9259243774F, 0.9263159778F, - 0.9267062270F, 0.9270951264F, 0.9274826774F, 0.9278688814F, - 0.9282537398F, 0.9286372540F, 0.9290194254F, 0.9294002555F, - 0.9297797458F, 0.9301578976F, 0.9305347125F, 0.9309101919F, - 0.9312843373F, 0.9316571503F, 0.9320286323F, 0.9323987849F, - 0.9327676097F, 0.9331351080F, 0.9335012816F, 0.9338661320F, - 0.9342296607F, 0.9345918694F, 0.9349527596F, 0.9353123330F, - 0.9356705911F, 0.9360275357F, 0.9363831683F, 0.9367374905F, - 0.9370905042F, 0.9374422108F, 0.9377926122F, 0.9381417099F, - 0.9384895057F, 0.9388360014F, 0.9391811985F, 0.9395250989F, - 0.9398677043F, 0.9402090165F, 0.9405490371F, 0.9408877680F, - 0.9412252110F, 0.9415613678F, 0.9418962402F, 0.9422298301F, - 0.9425621392F, 0.9428931695F, 0.9432229226F, 0.9435514005F, - 0.9438786050F, 0.9442045381F, 0.9445292014F, 0.9448525971F, - 0.9451747268F, 0.9454955926F, 0.9458151963F, 0.9461335399F, - 0.9464506253F, 0.9467664545F, 0.9470810293F, 0.9473943517F, - 0.9477064238F, 0.9480172474F, 0.9483268246F, 0.9486351573F, - 0.9489422475F, 0.9492480973F, 0.9495527087F, 0.9498560837F, - 0.9501582243F, 0.9504591325F, 0.9507588105F, 0.9510572603F, - 0.9513544839F, 0.9516504834F, 0.9519452609F, 0.9522388186F, - 0.9525311584F, 0.9528222826F, 0.9531121932F, 0.9534008923F, - 0.9536883821F, 0.9539746647F, 0.9542597424F, 0.9545436171F, - 0.9548262912F, 0.9551077667F, 0.9553880459F, 0.9556671309F, - 0.9559450239F, 0.9562217272F, 0.9564972429F, 0.9567715733F, - 0.9570447206F, 0.9573166871F, 0.9575874749F, 0.9578570863F, - 0.9581255236F, 0.9583927890F, 0.9586588849F, 0.9589238134F, - 0.9591875769F, 0.9594501777F, 0.9597116180F, 0.9599719003F, - 0.9602310267F, 0.9604889995F, 0.9607458213F, 0.9610014942F, - 0.9612560206F, 0.9615094028F, 0.9617616433F, 0.9620127443F, - 0.9622627083F, 0.9625115376F, 0.9627592345F, 0.9630058016F, - 0.9632512411F, 0.9634955555F, 0.9637387471F, 0.9639808185F, - 0.9642217720F, 0.9644616100F, 0.9647003349F, 0.9649379493F, - 0.9651744556F, 0.9654098561F, 0.9656441534F, 0.9658773499F, - 0.9661094480F, 0.9663404504F, 0.9665703593F, 0.9667991774F, - 0.9670269071F, 0.9672535509F, 0.9674791114F, 0.9677035909F, - 0.9679269921F, 0.9681493174F, 0.9683705694F, 0.9685907506F, - 0.9688098636F, 0.9690279108F, 0.9692448948F, 0.9694608182F, - 0.9696756836F, 0.9698894934F, 0.9701022503F, 0.9703139569F, - 0.9705246156F, 0.9707342291F, 0.9709428000F, 0.9711503309F, - 0.9713568243F, 0.9715622829F, 0.9717667093F, 0.9719701060F, - 0.9721724757F, 0.9723738210F, 0.9725741446F, 0.9727734490F, - 0.9729717369F, 0.9731690109F, 0.9733652737F, 0.9735605279F, - 0.9737547762F, 0.9739480212F, 0.9741402656F, 0.9743315120F, - 0.9745217631F, 0.9747110216F, 0.9748992901F, 0.9750865714F, - 0.9752728681F, 0.9754581829F, 0.9756425184F, 0.9758258775F, - 0.9760082627F, 0.9761896768F, 0.9763701224F, 0.9765496024F, - 0.9767281193F, 0.9769056760F, 0.9770822751F, 0.9772579193F, - 0.9774326114F, 0.9776063542F, 0.9777791502F, 0.9779510023F, - 0.9781219133F, 0.9782918858F, 0.9784609226F, 0.9786290264F, - 0.9787962000F, 0.9789624461F, 0.9791277676F, 0.9792921671F, - 0.9794556474F, 0.9796182113F, 0.9797798615F, 0.9799406009F, - 0.9801004321F, 0.9802593580F, 0.9804173813F, 0.9805745049F, - 0.9807307314F, 0.9808860637F, 0.9810405046F, 0.9811940568F, - 0.9813467232F, 0.9814985065F, 0.9816494095F, 0.9817994351F, - 0.9819485860F, 0.9820968650F, 0.9822442750F, 0.9823908186F, - 0.9825364988F, 0.9826813184F, 0.9828252801F, 0.9829683868F, - 0.9831106413F, 0.9832520463F, 0.9833926048F, 0.9835323195F, - 0.9836711932F, 0.9838092288F, 0.9839464291F, 0.9840827969F, - 0.9842183351F, 0.9843530464F, 0.9844869337F, 0.9846199998F, - 0.9847522475F, 0.9848836798F, 0.9850142993F, 0.9851441090F, - 0.9852731117F, 0.9854013101F, 0.9855287073F, 0.9856553058F, - 0.9857811087F, 0.9859061188F, 0.9860303388F, 0.9861537717F, - 0.9862764202F, 0.9863982872F, 0.9865193756F, 0.9866396882F, - 0.9867592277F, 0.9868779972F, 0.9869959993F, 0.9871132370F, - 0.9872297131F, 0.9873454304F, 0.9874603918F, 0.9875746001F, - 0.9876880581F, 0.9878007688F, 0.9879127348F, 0.9880239592F, - 0.9881344447F, 0.9882441941F, 0.9883532104F, 0.9884614962F, - 0.9885690546F, 0.9886758883F, 0.9887820001F, 0.9888873930F, - 0.9889920697F, 0.9890960331F, 0.9891992859F, 0.9893018312F, - 0.9894036716F, 0.9895048100F, 0.9896052493F, 0.9897049923F, - 0.9898040418F, 0.9899024006F, 0.9900000717F, 0.9900970577F, - 0.9901933616F, 0.9902889862F, 0.9903839343F, 0.9904782087F, - 0.9905718122F, 0.9906647477F, 0.9907570180F, 0.9908486259F, - 0.9909395742F, 0.9910298658F, 0.9911195034F, 0.9912084899F, - 0.9912968281F, 0.9913845208F, 0.9914715708F, 0.9915579810F, - 0.9916437540F, 0.9917288928F, 0.9918134001F, 0.9918972788F, - 0.9919805316F, 0.9920631613F, 0.9921451707F, 0.9922265626F, - 0.9923073399F, 0.9923875052F, 0.9924670615F, 0.9925460114F, - 0.9926243577F, 0.9927021033F, 0.9927792508F, 0.9928558032F, - 0.9929317631F, 0.9930071333F, 0.9930819167F, 0.9931561158F, - 0.9932297337F, 0.9933027728F, 0.9933752362F, 0.9934471264F, - 0.9935184462F, 0.9935891985F, 0.9936593859F, 0.9937290112F, - 0.9937980771F, 0.9938665864F, 0.9939345418F, 0.9940019460F, - 0.9940688018F, 0.9941351118F, 0.9942008789F, 0.9942661057F, - 0.9943307950F, 0.9943949494F, 0.9944585717F, 0.9945216645F, - 0.9945842307F, 0.9946462728F, 0.9947077936F, 0.9947687957F, - 0.9948292820F, 0.9948892550F, 0.9949487174F, 0.9950076719F, - 0.9950661212F, 0.9951240679F, 0.9951815148F, 0.9952384645F, - 0.9952949196F, 0.9953508828F, 0.9954063568F, 0.9954613442F, - 0.9955158476F, 0.9955698697F, 0.9956234132F, 0.9956764806F, - 0.9957290746F, 0.9957811978F, 0.9958328528F, 0.9958840423F, - 0.9959347688F, 0.9959850351F, 0.9960348435F, 0.9960841969F, - 0.9961330977F, 0.9961815486F, 0.9962295521F, 0.9962771108F, - 0.9963242274F, 0.9963709043F, 0.9964171441F, 0.9964629494F, - 0.9965083228F, 0.9965532668F, 0.9965977840F, 0.9966418768F, - 0.9966855479F, 0.9967287998F, 0.9967716350F, 0.9968140559F, - 0.9968560653F, 0.9968976655F, 0.9969388591F, 0.9969796485F, - 0.9970200363F, 0.9970600250F, 0.9970996170F, 0.9971388149F, - 0.9971776211F, 0.9972160380F, 0.9972540683F, 0.9972917142F, - 0.9973289783F, 0.9973658631F, 0.9974023709F, 0.9974385042F, - 0.9974742655F, 0.9975096571F, 0.9975446816F, 0.9975793413F, - 0.9976136386F, 0.9976475759F, 0.9976811557F, 0.9977143803F, - 0.9977472521F, 0.9977797736F, 0.9978119470F, 0.9978437748F, - 0.9978752593F, 0.9979064029F, 0.9979372079F, 0.9979676768F, - 0.9979978117F, 0.9980276151F, 0.9980570893F, 0.9980862367F, - 0.9981150595F, 0.9981435600F, 0.9981717406F, 0.9981996035F, - 0.9982271511F, 0.9982543856F, 0.9982813093F, 0.9983079246F, - 0.9983342336F, 0.9983602386F, 0.9983859418F, 0.9984113456F, - 0.9984364522F, 0.9984612638F, 0.9984857825F, 0.9985100108F, - 0.9985339507F, 0.9985576044F, 0.9985809743F, 0.9986040624F, - 0.9986268710F, 0.9986494022F, 0.9986716583F, 0.9986936413F, - 0.9987153535F, 0.9987367969F, 0.9987579738F, 0.9987788864F, - 0.9987995366F, 0.9988199267F, 0.9988400587F, 0.9988599348F, - 0.9988795572F, 0.9988989278F, 0.9989180487F, 0.9989369222F, - 0.9989555501F, 0.9989739347F, 0.9989920780F, 0.9990099820F, - 0.9990276487F, 0.9990450803F, 0.9990622787F, 0.9990792460F, - 0.9990959841F, 0.9991124952F, 0.9991287812F, 0.9991448440F, - 0.9991606858F, 0.9991763084F, 0.9991917139F, 0.9992069042F, - 0.9992218813F, 0.9992366471F, 0.9992512035F, 0.9992655525F, - 0.9992796961F, 0.9992936361F, 0.9993073744F, 0.9993209131F, - 0.9993342538F, 0.9993473987F, 0.9993603494F, 0.9993731080F, - 0.9993856762F, 0.9993980559F, 0.9994102490F, 0.9994222573F, - 0.9994340827F, 0.9994457269F, 0.9994571918F, 0.9994684793F, - 0.9994795910F, 0.9994905288F, 0.9995012945F, 0.9995118898F, - 0.9995223165F, 0.9995325765F, 0.9995426713F, 0.9995526029F, - 0.9995623728F, 0.9995719829F, 0.9995814349F, 0.9995907304F, - 0.9995998712F, 0.9996088590F, 0.9996176954F, 0.9996263821F, - 0.9996349208F, 0.9996433132F, 0.9996515609F, 0.9996596656F, - 0.9996676288F, 0.9996754522F, 0.9996831375F, 0.9996906862F, - 0.9996981000F, 0.9997053804F, 0.9997125290F, 0.9997195474F, - 0.9997264371F, 0.9997331998F, 0.9997398369F, 0.9997463500F, - 0.9997527406F, 0.9997590103F, 0.9997651606F, 0.9997711930F, - 0.9997771089F, 0.9997829098F, 0.9997885973F, 0.9997941728F, - 0.9997996378F, 0.9998049936F, 0.9998102419F, 0.9998153839F, - 0.9998204211F, 0.9998253550F, 0.9998301868F, 0.9998349182F, - 0.9998395503F, 0.9998440847F, 0.9998485226F, 0.9998528654F, - 0.9998571146F, 0.9998612713F, 0.9998653370F, 0.9998693130F, - 0.9998732007F, 0.9998770012F, 0.9998807159F, 0.9998843461F, - 0.9998878931F, 0.9998913581F, 0.9998947424F, 0.9998980473F, - 0.9999012740F, 0.9999044237F, 0.9999074976F, 0.9999104971F, - 0.9999134231F, 0.9999162771F, 0.9999190601F, 0.9999217733F, - 0.9999244179F, 0.9999269950F, 0.9999295058F, 0.9999319515F, - 0.9999343332F, 0.9999366519F, 0.9999389088F, 0.9999411050F, - 0.9999432416F, 0.9999453196F, 0.9999473402F, 0.9999493044F, - 0.9999512132F, 0.9999530677F, 0.9999548690F, 0.9999566180F, - 0.9999583157F, 0.9999599633F, 0.9999615616F, 0.9999631116F, - 0.9999646144F, 0.9999660709F, 0.9999674820F, 0.9999688487F, - 0.9999701719F, 0.9999714526F, 0.9999726917F, 0.9999738900F, - 0.9999750486F, 0.9999761682F, 0.9999772497F, 0.9999782941F, - 0.9999793021F, 0.9999802747F, 0.9999812126F, 0.9999821167F, - 0.9999829878F, 0.9999838268F, 0.9999846343F, 0.9999854113F, - 0.9999861584F, 0.9999868765F, 0.9999875664F, 0.9999882287F, - 0.9999888642F, 0.9999894736F, 0.9999900577F, 0.9999906172F, - 0.9999911528F, 0.9999916651F, 0.9999921548F, 0.9999926227F, - 0.9999930693F, 0.9999934954F, 0.9999939015F, 0.9999942883F, - 0.9999946564F, 0.9999950064F, 0.9999953390F, 0.9999956547F, - 0.9999959541F, 0.9999962377F, 0.9999965062F, 0.9999967601F, - 0.9999969998F, 0.9999972260F, 0.9999974392F, 0.9999976399F, - 0.9999978285F, 0.9999980056F, 0.9999981716F, 0.9999983271F, - 0.9999984724F, 0.9999986081F, 0.9999987345F, 0.9999988521F, - 0.9999989613F, 0.9999990625F, 0.9999991562F, 0.9999992426F, - 0.9999993223F, 0.9999993954F, 0.9999994625F, 0.9999995239F, - 0.9999995798F, 0.9999996307F, 0.9999996768F, 0.9999997184F, - 0.9999997559F, 0.9999997895F, 0.9999998195F, 0.9999998462F, - 0.9999998698F, 0.9999998906F, 0.9999999088F, 0.9999999246F, - 0.9999999383F, 0.9999999500F, 0.9999999600F, 0.9999999684F, - 0.9999999754F, 0.9999999811F, 0.9999999858F, 0.9999999896F, - 0.9999999925F, 0.9999999948F, 0.9999999965F, 0.9999999978F, - 0.9999999986F, 0.9999999992F, 0.9999999996F, 0.9999999998F, - 0.9999999999F, 1.0000000000F, 1.0000000000F, 1.0000000000F, -}; - -DECLARE_ALIGNED(16, static const float, vwin8192)[4096] = { - 0.0000000578F, 0.0000005198F, 0.0000014438F, 0.0000028299F, - 0.0000046780F, 0.0000069882F, 0.0000097604F, 0.0000129945F, - 0.0000166908F, 0.0000208490F, 0.0000254692F, 0.0000305515F, - 0.0000360958F, 0.0000421021F, 0.0000485704F, 0.0000555006F, - 0.0000628929F, 0.0000707472F, 0.0000790635F, 0.0000878417F, - 0.0000970820F, 0.0001067842F, 0.0001169483F, 0.0001275744F, - 0.0001386625F, 0.0001502126F, 0.0001622245F, 0.0001746984F, - 0.0001876343F, 0.0002010320F, 0.0002148917F, 0.0002292132F, - 0.0002439967F, 0.0002592421F, 0.0002749493F, 0.0002911184F, - 0.0003077493F, 0.0003248421F, 0.0003423967F, 0.0003604132F, - 0.0003788915F, 0.0003978316F, 0.0004172335F, 0.0004370971F, - 0.0004574226F, 0.0004782098F, 0.0004994587F, 0.0005211694F, - 0.0005433418F, 0.0005659759F, 0.0005890717F, 0.0006126292F, - 0.0006366484F, 0.0006611292F, 0.0006860716F, 0.0007114757F, - 0.0007373414F, 0.0007636687F, 0.0007904576F, 0.0008177080F, - 0.0008454200F, 0.0008735935F, 0.0009022285F, 0.0009313250F, - 0.0009608830F, 0.0009909025F, 0.0010213834F, 0.0010523257F, - 0.0010837295F, 0.0011155946F, 0.0011479211F, 0.0011807090F, - 0.0012139582F, 0.0012476687F, 0.0012818405F, 0.0013164736F, - 0.0013515679F, 0.0013871235F, 0.0014231402F, 0.0014596182F, - 0.0014965573F, 0.0015339576F, 0.0015718190F, 0.0016101415F, - 0.0016489251F, 0.0016881698F, 0.0017278754F, 0.0017680421F, - 0.0018086698F, 0.0018497584F, 0.0018913080F, 0.0019333185F, - 0.0019757898F, 0.0020187221F, 0.0020621151F, 0.0021059690F, - 0.0021502837F, 0.0021950591F, 0.0022402953F, 0.0022859921F, - 0.0023321497F, 0.0023787679F, 0.0024258467F, 0.0024733861F, - 0.0025213861F, 0.0025698466F, 0.0026187676F, 0.0026681491F, - 0.0027179911F, 0.0027682935F, 0.0028190562F, 0.0028702794F, - 0.0029219628F, 0.0029741066F, 0.0030267107F, 0.0030797749F, - 0.0031332994F, 0.0031872841F, 0.0032417289F, 0.0032966338F, - 0.0033519988F, 0.0034078238F, 0.0034641089F, 0.0035208539F, - 0.0035780589F, 0.0036357237F, 0.0036938485F, 0.0037524331F, - 0.0038114775F, 0.0038709817F, 0.0039309456F, 0.0039913692F, - 0.0040522524F, 0.0041135953F, 0.0041753978F, 0.0042376599F, - 0.0043003814F, 0.0043635624F, 0.0044272029F, 0.0044913028F, - 0.0045558620F, 0.0046208806F, 0.0046863585F, 0.0047522955F, - 0.0048186919F, 0.0048855473F, 0.0049528619F, 0.0050206356F, - 0.0050888684F, 0.0051575601F, 0.0052267108F, 0.0052963204F, - 0.0053663890F, 0.0054369163F, 0.0055079025F, 0.0055793474F, - 0.0056512510F, 0.0057236133F, 0.0057964342F, 0.0058697137F, - 0.0059434517F, 0.0060176482F, 0.0060923032F, 0.0061674166F, - 0.0062429883F, 0.0063190183F, 0.0063955066F, 0.0064724532F, - 0.0065498579F, 0.0066277207F, 0.0067060416F, 0.0067848205F, - 0.0068640575F, 0.0069437523F, 0.0070239051F, 0.0071045157F, - 0.0071855840F, 0.0072671102F, 0.0073490940F, 0.0074315355F, - 0.0075144345F, 0.0075977911F, 0.0076816052F, 0.0077658768F, - 0.0078506057F, 0.0079357920F, 0.0080214355F, 0.0081075363F, - 0.0081940943F, 0.0082811094F, 0.0083685816F, 0.0084565108F, - 0.0085448970F, 0.0086337401F, 0.0087230401F, 0.0088127969F, - 0.0089030104F, 0.0089936807F, 0.0090848076F, 0.0091763911F, - 0.0092684311F, 0.0093609276F, 0.0094538805F, 0.0095472898F, - 0.0096411554F, 0.0097354772F, 0.0098302552F, 0.0099254894F, - 0.0100211796F, 0.0101173259F, 0.0102139281F, 0.0103109863F, - 0.0104085002F, 0.0105064700F, 0.0106048955F, 0.0107037766F, - 0.0108031133F, 0.0109029056F, 0.0110031534F, 0.0111038565F, - 0.0112050151F, 0.0113066289F, 0.0114086980F, 0.0115112222F, - 0.0116142015F, 0.0117176359F, 0.0118215252F, 0.0119258695F, - 0.0120306686F, 0.0121359225F, 0.0122416312F, 0.0123477944F, - 0.0124544123F, 0.0125614847F, 0.0126690116F, 0.0127769928F, - 0.0128854284F, 0.0129943182F, 0.0131036623F, 0.0132134604F, - 0.0133237126F, 0.0134344188F, 0.0135455790F, 0.0136571929F, - 0.0137692607F, 0.0138817821F, 0.0139947572F, 0.0141081859F, - 0.0142220681F, 0.0143364037F, 0.0144511927F, 0.0145664350F, - 0.0146821304F, 0.0147982791F, 0.0149148808F, 0.0150319355F, - 0.0151494431F, 0.0152674036F, 0.0153858168F, 0.0155046828F, - 0.0156240014F, 0.0157437726F, 0.0158639962F, 0.0159846723F, - 0.0161058007F, 0.0162273814F, 0.0163494142F, 0.0164718991F, - 0.0165948361F, 0.0167182250F, 0.0168420658F, 0.0169663584F, - 0.0170911027F, 0.0172162987F, 0.0173419462F, 0.0174680452F, - 0.0175945956F, 0.0177215974F, 0.0178490504F, 0.0179769545F, - 0.0181053098F, 0.0182341160F, 0.0183633732F, 0.0184930812F, - 0.0186232399F, 0.0187538494F, 0.0188849094F, 0.0190164200F, - 0.0191483809F, 0.0192807923F, 0.0194136539F, 0.0195469656F, - 0.0196807275F, 0.0198149394F, 0.0199496012F, 0.0200847128F, - 0.0202202742F, 0.0203562853F, 0.0204927460F, 0.0206296561F, - 0.0207670157F, 0.0209048245F, 0.0210430826F, 0.0211817899F, - 0.0213209462F, 0.0214605515F, 0.0216006057F, 0.0217411086F, - 0.0218820603F, 0.0220234605F, 0.0221653093F, 0.0223076066F, - 0.0224503521F, 0.0225935459F, 0.0227371879F, 0.0228812779F, - 0.0230258160F, 0.0231708018F, 0.0233162355F, 0.0234621169F, - 0.0236084459F, 0.0237552224F, 0.0239024462F, 0.0240501175F, - 0.0241982359F, 0.0243468015F, 0.0244958141F, 0.0246452736F, - 0.0247951800F, 0.0249455331F, 0.0250963329F, 0.0252475792F, - 0.0253992720F, 0.0255514111F, 0.0257039965F, 0.0258570281F, - 0.0260105057F, 0.0261644293F, 0.0263187987F, 0.0264736139F, - 0.0266288747F, 0.0267845811F, 0.0269407330F, 0.0270973302F, - 0.0272543727F, 0.0274118604F, 0.0275697930F, 0.0277281707F, - 0.0278869932F, 0.0280462604F, 0.0282059723F, 0.0283661287F, - 0.0285267295F, 0.0286877747F, 0.0288492641F, 0.0290111976F, - 0.0291735751F, 0.0293363965F, 0.0294996617F, 0.0296633706F, - 0.0298275231F, 0.0299921190F, 0.0301571583F, 0.0303226409F, - 0.0304885667F, 0.0306549354F, 0.0308217472F, 0.0309890017F, - 0.0311566989F, 0.0313248388F, 0.0314934211F, 0.0316624459F, - 0.0318319128F, 0.0320018220F, 0.0321721732F, 0.0323429663F, - 0.0325142013F, 0.0326858779F, 0.0328579962F, 0.0330305559F, - 0.0332035570F, 0.0333769994F, 0.0335508829F, 0.0337252074F, - 0.0338999728F, 0.0340751790F, 0.0342508259F, 0.0344269134F, - 0.0346034412F, 0.0347804094F, 0.0349578178F, 0.0351356663F, - 0.0353139548F, 0.0354926831F, 0.0356718511F, 0.0358514588F, - 0.0360315059F, 0.0362119924F, 0.0363929182F, 0.0365742831F, - 0.0367560870F, 0.0369383297F, 0.0371210113F, 0.0373041315F, - 0.0374876902F, 0.0376716873F, 0.0378561226F, 0.0380409961F, - 0.0382263077F, 0.0384120571F, 0.0385982443F, 0.0387848691F, - 0.0389719315F, 0.0391594313F, 0.0393473683F, 0.0395357425F, - 0.0397245537F, 0.0399138017F, 0.0401034866F, 0.0402936080F, - 0.0404841660F, 0.0406751603F, 0.0408665909F, 0.0410584576F, - 0.0412507603F, 0.0414434988F, 0.0416366731F, 0.0418302829F, - 0.0420243282F, 0.0422188088F, 0.0424137246F, 0.0426090755F, - 0.0428048613F, 0.0430010819F, 0.0431977371F, 0.0433948269F, - 0.0435923511F, 0.0437903095F, 0.0439887020F, 0.0441875285F, - 0.0443867889F, 0.0445864830F, 0.0447866106F, 0.0449871717F, - 0.0451881661F, 0.0453895936F, 0.0455914542F, 0.0457937477F, - 0.0459964738F, 0.0461996326F, 0.0464032239F, 0.0466072475F, - 0.0468117032F, 0.0470165910F, 0.0472219107F, 0.0474276622F, - 0.0476338452F, 0.0478404597F, 0.0480475056F, 0.0482549827F, - 0.0484628907F, 0.0486712297F, 0.0488799994F, 0.0490891998F, - 0.0492988306F, 0.0495088917F, 0.0497193830F, 0.0499303043F, - 0.0501416554F, 0.0503534363F, 0.0505656468F, 0.0507782867F, - 0.0509913559F, 0.0512048542F, 0.0514187815F, 0.0516331376F, - 0.0518479225F, 0.0520631358F, 0.0522787775F, 0.0524948475F, - 0.0527113455F, 0.0529282715F, 0.0531456252F, 0.0533634066F, - 0.0535816154F, 0.0538002515F, 0.0540193148F, 0.0542388051F, - 0.0544587222F, 0.0546790660F, 0.0548998364F, 0.0551210331F, - 0.0553426561F, 0.0555647051F, 0.0557871801F, 0.0560100807F, - 0.0562334070F, 0.0564571587F, 0.0566813357F, 0.0569059378F, - 0.0571309649F, 0.0573564168F, 0.0575822933F, 0.0578085942F, - 0.0580353195F, 0.0582624689F, 0.0584900423F, 0.0587180396F, - 0.0589464605F, 0.0591753049F, 0.0594045726F, 0.0596342635F, - 0.0598643774F, 0.0600949141F, 0.0603258735F, 0.0605572555F, - 0.0607890597F, 0.0610212862F, 0.0612539346F, 0.0614870049F, - 0.0617204968F, 0.0619544103F, 0.0621887451F, 0.0624235010F, - 0.0626586780F, 0.0628942758F, 0.0631302942F, 0.0633667331F, - 0.0636035923F, 0.0638408717F, 0.0640785710F, 0.0643166901F, - 0.0645552288F, 0.0647941870F, 0.0650335645F, 0.0652733610F, - 0.0655135765F, 0.0657542108F, 0.0659952636F, 0.0662367348F, - 0.0664786242F, 0.0667209316F, 0.0669636570F, 0.0672068000F, - 0.0674503605F, 0.0676943384F, 0.0679387334F, 0.0681835454F, - 0.0684287742F, 0.0686744196F, 0.0689204814F, 0.0691669595F, - 0.0694138536F, 0.0696611637F, 0.0699088894F, 0.0701570307F, - 0.0704055873F, 0.0706545590F, 0.0709039458F, 0.0711537473F, - 0.0714039634F, 0.0716545939F, 0.0719056387F, 0.0721570975F, - 0.0724089702F, 0.0726612565F, 0.0729139563F, 0.0731670694F, - 0.0734205956F, 0.0736745347F, 0.0739288866F, 0.0741836510F, - 0.0744388277F, 0.0746944166F, 0.0749504175F, 0.0752068301F, - 0.0754636543F, 0.0757208899F, 0.0759785367F, 0.0762365946F, - 0.0764950632F, 0.0767539424F, 0.0770132320F, 0.0772729319F, - 0.0775330418F, 0.0777935616F, 0.0780544909F, 0.0783158298F, - 0.0785775778F, 0.0788397349F, 0.0791023009F, 0.0793652755F, - 0.0796286585F, 0.0798924498F, 0.0801566492F, 0.0804212564F, - 0.0806862712F, 0.0809516935F, 0.0812175231F, 0.0814837597F, - 0.0817504031F, 0.0820174532F, 0.0822849097F, 0.0825527724F, - 0.0828210412F, 0.0830897158F, 0.0833587960F, 0.0836282816F, - 0.0838981724F, 0.0841684682F, 0.0844391688F, 0.0847102740F, - 0.0849817835F, 0.0852536973F, 0.0855260150F, 0.0857987364F, - 0.0860718614F, 0.0863453897F, 0.0866193211F, 0.0868936554F, - 0.0871683924F, 0.0874435319F, 0.0877190737F, 0.0879950175F, - 0.0882713632F, 0.0885481105F, 0.0888252592F, 0.0891028091F, - 0.0893807600F, 0.0896591117F, 0.0899378639F, 0.0902170165F, - 0.0904965692F, 0.0907765218F, 0.0910568740F, 0.0913376258F, - 0.0916187767F, 0.0919003268F, 0.0921822756F, 0.0924646230F, - 0.0927473687F, 0.0930305126F, 0.0933140545F, 0.0935979940F, - 0.0938823310F, 0.0941670653F, 0.0944521966F, 0.0947377247F, - 0.0950236494F, 0.0953099704F, 0.0955966876F, 0.0958838007F, - 0.0961713094F, 0.0964592136F, 0.0967475131F, 0.0970362075F, - 0.0973252967F, 0.0976147805F, 0.0979046585F, 0.0981949307F, - 0.0984855967F, 0.0987766563F, 0.0990681093F, 0.0993599555F, - 0.0996521945F, 0.0999448263F, 0.1002378506F, 0.1005312671F, - 0.1008250755F, 0.1011192757F, 0.1014138675F, 0.1017088505F, - 0.1020042246F, 0.1022999895F, 0.1025961450F, 0.1028926909F, - 0.1031896268F, 0.1034869526F, 0.1037846680F, 0.1040827729F, - 0.1043812668F, 0.1046801497F, 0.1049794213F, 0.1052790813F, - 0.1055791294F, 0.1058795656F, 0.1061803894F, 0.1064816006F, - 0.1067831991F, 0.1070851846F, 0.1073875568F, 0.1076903155F, - 0.1079934604F, 0.1082969913F, 0.1086009079F, 0.1089052101F, - 0.1092098975F, 0.1095149699F, 0.1098204270F, 0.1101262687F, - 0.1104324946F, 0.1107391045F, 0.1110460982F, 0.1113534754F, - 0.1116612359F, 0.1119693793F, 0.1122779055F, 0.1125868142F, - 0.1128961052F, 0.1132057781F, 0.1135158328F, 0.1138262690F, - 0.1141370863F, 0.1144482847F, 0.1147598638F, 0.1150718233F, - 0.1153841631F, 0.1156968828F, 0.1160099822F, 0.1163234610F, - 0.1166373190F, 0.1169515559F, 0.1172661714F, 0.1175811654F, - 0.1178965374F, 0.1182122874F, 0.1185284149F, 0.1188449198F, - 0.1191618018F, 0.1194790606F, 0.1197966960F, 0.1201147076F, - 0.1204330953F, 0.1207518587F, 0.1210709976F, 0.1213905118F, - 0.1217104009F, 0.1220306647F, 0.1223513029F, 0.1226723153F, - 0.1229937016F, 0.1233154615F, 0.1236375948F, 0.1239601011F, - 0.1242829803F, 0.1246062319F, 0.1249298559F, 0.1252538518F, - 0.1255782195F, 0.1259029586F, 0.1262280689F, 0.1265535501F, - 0.1268794019F, 0.1272056241F, 0.1275322163F, 0.1278591784F, - 0.1281865099F, 0.1285142108F, 0.1288422805F, 0.1291707190F, - 0.1294995259F, 0.1298287009F, 0.1301582437F, 0.1304881542F, - 0.1308184319F, 0.1311490766F, 0.1314800881F, 0.1318114660F, - 0.1321432100F, 0.1324753200F, 0.1328077955F, 0.1331406364F, - 0.1334738422F, 0.1338074129F, 0.1341413479F, 0.1344756472F, - 0.1348103103F, 0.1351453370F, 0.1354807270F, 0.1358164801F, - 0.1361525959F, 0.1364890741F, 0.1368259145F, 0.1371631167F, - 0.1375006805F, 0.1378386056F, 0.1381768917F, 0.1385155384F, - 0.1388545456F, 0.1391939129F, 0.1395336400F, 0.1398737266F, - 0.1402141724F, 0.1405549772F, 0.1408961406F, 0.1412376623F, - 0.1415795421F, 0.1419217797F, 0.1422643746F, 0.1426073268F, - 0.1429506358F, 0.1432943013F, 0.1436383231F, 0.1439827008F, - 0.1443274342F, 0.1446725229F, 0.1450179667F, 0.1453637652F, - 0.1457099181F, 0.1460564252F, 0.1464032861F, 0.1467505006F, - 0.1470980682F, 0.1474459888F, 0.1477942620F, 0.1481428875F, - 0.1484918651F, 0.1488411942F, 0.1491908748F, 0.1495409065F, - 0.1498912889F, 0.1502420218F, 0.1505931048F, 0.1509445376F, - 0.1512963200F, 0.1516484516F, 0.1520009321F, 0.1523537612F, - 0.1527069385F, 0.1530604638F, 0.1534143368F, 0.1537685571F, - 0.1541231244F, 0.1544780384F, 0.1548332987F, 0.1551889052F, - 0.1555448574F, 0.1559011550F, 0.1562577978F, 0.1566147853F, - 0.1569721173F, 0.1573297935F, 0.1576878135F, 0.1580461771F, - 0.1584048838F, 0.1587639334F, 0.1591233255F, 0.1594830599F, - 0.1598431361F, 0.1602035540F, 0.1605643131F, 0.1609254131F, - 0.1612868537F, 0.1616486346F, 0.1620107555F, 0.1623732160F, - 0.1627360158F, 0.1630991545F, 0.1634626319F, 0.1638264476F, - 0.1641906013F, 0.1645550926F, 0.1649199212F, 0.1652850869F, - 0.1656505892F, 0.1660164278F, 0.1663826024F, 0.1667491127F, - 0.1671159583F, 0.1674831388F, 0.1678506541F, 0.1682185036F, - 0.1685866872F, 0.1689552044F, 0.1693240549F, 0.1696932384F, - 0.1700627545F, 0.1704326029F, 0.1708027833F, 0.1711732952F, - 0.1715441385F, 0.1719153127F, 0.1722868175F, 0.1726586526F, - 0.1730308176F, 0.1734033121F, 0.1737761359F, 0.1741492886F, - 0.1745227698F, 0.1748965792F, 0.1752707164F, 0.1756451812F, - 0.1760199731F, 0.1763950918F, 0.1767705370F, 0.1771463083F, - 0.1775224054F, 0.1778988279F, 0.1782755754F, 0.1786526477F, - 0.1790300444F, 0.1794077651F, 0.1797858094F, 0.1801641771F, - 0.1805428677F, 0.1809218810F, 0.1813012165F, 0.1816808739F, - 0.1820608528F, 0.1824411530F, 0.1828217739F, 0.1832027154F, - 0.1835839770F, 0.1839655584F, 0.1843474592F, 0.1847296790F, - 0.1851122175F, 0.1854950744F, 0.1858782492F, 0.1862617417F, - 0.1866455514F, 0.1870296780F, 0.1874141211F, 0.1877988804F, - 0.1881839555F, 0.1885693461F, 0.1889550517F, 0.1893410721F, - 0.1897274068F, 0.1901140555F, 0.1905010178F, 0.1908882933F, - 0.1912758818F, 0.1916637828F, 0.1920519959F, 0.1924405208F, - 0.1928293571F, 0.1932185044F, 0.1936079625F, 0.1939977308F, - 0.1943878091F, 0.1947781969F, 0.1951688939F, 0.1955598998F, - 0.1959512141F, 0.1963428364F, 0.1967347665F, 0.1971270038F, - 0.1975195482F, 0.1979123990F, 0.1983055561F, 0.1986990190F, - 0.1990927873F, 0.1994868607F, 0.1998812388F, 0.2002759212F, - 0.2006709075F, 0.2010661974F, 0.2014617904F, 0.2018576862F, - 0.2022538844F, 0.2026503847F, 0.2030471865F, 0.2034442897F, - 0.2038416937F, 0.2042393982F, 0.2046374028F, 0.2050357071F, - 0.2054343107F, 0.2058332133F, 0.2062324145F, 0.2066319138F, - 0.2070317110F, 0.2074318055F, 0.2078321970F, 0.2082328852F, - 0.2086338696F, 0.2090351498F, 0.2094367255F, 0.2098385962F, - 0.2102407617F, 0.2106432213F, 0.2110459749F, 0.2114490220F, - 0.2118523621F, 0.2122559950F, 0.2126599202F, 0.2130641373F, - 0.2134686459F, 0.2138734456F, 0.2142785361F, 0.2146839168F, - 0.2150895875F, 0.2154955478F, 0.2159017972F, 0.2163083353F, - 0.2167151617F, 0.2171222761F, 0.2175296780F, 0.2179373670F, - 0.2183453428F, 0.2187536049F, 0.2191621529F, 0.2195709864F, - 0.2199801051F, 0.2203895085F, 0.2207991961F, 0.2212091677F, - 0.2216194228F, 0.2220299610F, 0.2224407818F, 0.2228518850F, - 0.2232632699F, 0.2236749364F, 0.2240868839F, 0.2244991121F, - 0.2249116204F, 0.2253244086F, 0.2257374763F, 0.2261508229F, - 0.2265644481F, 0.2269783514F, 0.2273925326F, 0.2278069911F, - 0.2282217265F, 0.2286367384F, 0.2290520265F, 0.2294675902F, - 0.2298834292F, 0.2302995431F, 0.2307159314F, 0.2311325937F, - 0.2315495297F, 0.2319667388F, 0.2323842207F, 0.2328019749F, - 0.2332200011F, 0.2336382988F, 0.2340568675F, 0.2344757070F, - 0.2348948166F, 0.2353141961F, 0.2357338450F, 0.2361537629F, - 0.2365739493F, 0.2369944038F, 0.2374151261F, 0.2378361156F, - 0.2382573720F, 0.2386788948F, 0.2391006836F, 0.2395227380F, - 0.2399450575F, 0.2403676417F, 0.2407904902F, 0.2412136026F, - 0.2416369783F, 0.2420606171F, 0.2424845185F, 0.2429086820F, - 0.2433331072F, 0.2437577936F, 0.2441827409F, 0.2446079486F, - 0.2450334163F, 0.2454591435F, 0.2458851298F, 0.2463113747F, - 0.2467378779F, 0.2471646389F, 0.2475916573F, 0.2480189325F, - 0.2484464643F, 0.2488742521F, 0.2493022955F, 0.2497305940F, - 0.2501591473F, 0.2505879549F, 0.2510170163F, 0.2514463311F, - 0.2518758989F, 0.2523057193F, 0.2527357916F, 0.2531661157F, - 0.2535966909F, 0.2540275169F, 0.2544585931F, 0.2548899193F, - 0.2553214948F, 0.2557533193F, 0.2561853924F, 0.2566177135F, - 0.2570502822F, 0.2574830981F, 0.2579161608F, 0.2583494697F, - 0.2587830245F, 0.2592168246F, 0.2596508697F, 0.2600851593F, - 0.2605196929F, 0.2609544701F, 0.2613894904F, 0.2618247534F, - 0.2622602586F, 0.2626960055F, 0.2631319938F, 0.2635682230F, - 0.2640046925F, 0.2644414021F, 0.2648783511F, 0.2653155391F, - 0.2657529657F, 0.2661906305F, 0.2666285329F, 0.2670666725F, - 0.2675050489F, 0.2679436616F, 0.2683825101F, 0.2688215940F, - 0.2692609127F, 0.2697004660F, 0.2701402532F, 0.2705802739F, - 0.2710205278F, 0.2714610142F, 0.2719017327F, 0.2723426830F, - 0.2727838644F, 0.2732252766F, 0.2736669191F, 0.2741087914F, - 0.2745508930F, 0.2749932235F, 0.2754357824F, 0.2758785693F, - 0.2763215837F, 0.2767648251F, 0.2772082930F, 0.2776519870F, - 0.2780959066F, 0.2785400513F, 0.2789844207F, 0.2794290143F, - 0.2798738316F, 0.2803188722F, 0.2807641355F, 0.2812096211F, - 0.2816553286F, 0.2821012574F, 0.2825474071F, 0.2829937773F, - 0.2834403673F, 0.2838871768F, 0.2843342053F, 0.2847814523F, - 0.2852289174F, 0.2856765999F, 0.2861244996F, 0.2865726159F, - 0.2870209482F, 0.2874694962F, 0.2879182594F, 0.2883672372F, - 0.2888164293F, 0.2892658350F, 0.2897154540F, 0.2901652858F, - 0.2906153298F, 0.2910655856F, 0.2915160527F, 0.2919667306F, - 0.2924176189F, 0.2928687171F, 0.2933200246F, 0.2937715409F, - 0.2942232657F, 0.2946751984F, 0.2951273386F, 0.2955796856F, - 0.2960322391F, 0.2964849986F, 0.2969379636F, 0.2973911335F, - 0.2978445080F, 0.2982980864F, 0.2987518684F, 0.2992058534F, - 0.2996600409F, 0.3001144305F, 0.3005690217F, 0.3010238139F, - 0.3014788067F, 0.3019339995F, 0.3023893920F, 0.3028449835F, - 0.3033007736F, 0.3037567618F, 0.3042129477F, 0.3046693306F, - 0.3051259102F, 0.3055826859F, 0.3060396572F, 0.3064968236F, - 0.3069541847F, 0.3074117399F, 0.3078694887F, 0.3083274307F, - 0.3087855653F, 0.3092438920F, 0.3097024104F, 0.3101611199F, - 0.3106200200F, 0.3110791103F, 0.3115383902F, 0.3119978592F, - 0.3124575169F, 0.3129173627F, 0.3133773961F, 0.3138376166F, - 0.3142980238F, 0.3147586170F, 0.3152193959F, 0.3156803598F, - 0.3161415084F, 0.3166028410F, 0.3170643573F, 0.3175260566F, - 0.3179879384F, 0.3184500023F, 0.3189122478F, 0.3193746743F, - 0.3198372814F, 0.3203000685F, 0.3207630351F, 0.3212261807F, - 0.3216895048F, 0.3221530069F, 0.3226166865F, 0.3230805430F, - 0.3235445760F, 0.3240087849F, 0.3244731693F, 0.3249377285F, - 0.3254024622F, 0.3258673698F, 0.3263324507F, 0.3267977045F, - 0.3272631306F, 0.3277287286F, 0.3281944978F, 0.3286604379F, - 0.3291265482F, 0.3295928284F, 0.3300592777F, 0.3305258958F, - 0.3309926821F, 0.3314596361F, 0.3319267573F, 0.3323940451F, - 0.3328614990F, 0.3333291186F, 0.3337969033F, 0.3342648525F, - 0.3347329658F, 0.3352012427F, 0.3356696825F, 0.3361382849F, - 0.3366070492F, 0.3370759749F, 0.3375450616F, 0.3380143087F, - 0.3384837156F, 0.3389532819F, 0.3394230071F, 0.3398928905F, - 0.3403629317F, 0.3408331302F, 0.3413034854F, 0.3417739967F, - 0.3422446638F, 0.3427154860F, 0.3431864628F, 0.3436575938F, - 0.3441288782F, 0.3446003158F, 0.3450719058F, 0.3455436478F, - 0.3460155412F, 0.3464875856F, 0.3469597804F, 0.3474321250F, - 0.3479046189F, 0.3483772617F, 0.3488500527F, 0.3493229914F, - 0.3497960774F, 0.3502693100F, 0.3507426887F, 0.3512162131F, - 0.3516898825F, 0.3521636965F, 0.3526376545F, 0.3531117559F, - 0.3535860003F, 0.3540603870F, 0.3545349157F, 0.3550095856F, - 0.3554843964F, 0.3559593474F, 0.3564344381F, 0.3569096680F, - 0.3573850366F, 0.3578605432F, 0.3583361875F, 0.3588119687F, - 0.3592878865F, 0.3597639402F, 0.3602401293F, 0.3607164533F, - 0.3611929117F, 0.3616695038F, 0.3621462292F, 0.3626230873F, - 0.3631000776F, 0.3635771995F, 0.3640544525F, 0.3645318360F, - 0.3650093496F, 0.3654869926F, 0.3659647645F, 0.3664426648F, - 0.3669206930F, 0.3673988484F, 0.3678771306F, 0.3683555390F, - 0.3688340731F, 0.3693127322F, 0.3697915160F, 0.3702704237F, - 0.3707494549F, 0.3712286091F, 0.3717078857F, 0.3721872840F, - 0.3726668037F, 0.3731464441F, 0.3736262047F, 0.3741060850F, - 0.3745860843F, 0.3750662023F, 0.3755464382F, 0.3760267915F, - 0.3765072618F, 0.3769878484F, 0.3774685509F, 0.3779493686F, - 0.3784303010F, 0.3789113475F, 0.3793925076F, 0.3798737809F, - 0.3803551666F, 0.3808366642F, 0.3813182733F, 0.3817999932F, - 0.3822818234F, 0.3827637633F, 0.3832458124F, 0.3837279702F, - 0.3842102360F, 0.3846926093F, 0.3851750897F, 0.3856576764F, - 0.3861403690F, 0.3866231670F, 0.3871060696F, 0.3875890765F, - 0.3880721870F, 0.3885554007F, 0.3890387168F, 0.3895221349F, - 0.3900056544F, 0.3904892748F, 0.3909729955F, 0.3914568160F, - 0.3919407356F, 0.3924247539F, 0.3929088702F, 0.3933930841F, - 0.3938773949F, 0.3943618021F, 0.3948463052F, 0.3953309035F, - 0.3958155966F, 0.3963003838F, 0.3967852646F, 0.3972702385F, - 0.3977553048F, 0.3982404631F, 0.3987257127F, 0.3992110531F, - 0.3996964838F, 0.4001820041F, 0.4006676136F, 0.4011533116F, - 0.4016390976F, 0.4021249710F, 0.4026109313F, 0.4030969779F, - 0.4035831102F, 0.4040693277F, 0.4045556299F, 0.4050420160F, - 0.4055284857F, 0.4060150383F, 0.4065016732F, 0.4069883899F, - 0.4074751879F, 0.4079620665F, 0.4084490252F, 0.4089360635F, - 0.4094231807F, 0.4099103763F, 0.4103976498F, 0.4108850005F, - 0.4113724280F, 0.4118599315F, 0.4123475107F, 0.4128351648F, - 0.4133228934F, 0.4138106959F, 0.4142985716F, 0.4147865201F, - 0.4152745408F, 0.4157626330F, 0.4162507963F, 0.4167390301F, - 0.4172273337F, 0.4177157067F, 0.4182041484F, 0.4186926583F, - 0.4191812359F, 0.4196698805F, 0.4201585915F, 0.4206473685F, - 0.4211362108F, 0.4216251179F, 0.4221140892F, 0.4226031241F, - 0.4230922221F, 0.4235813826F, 0.4240706050F, 0.4245598887F, - 0.4250492332F, 0.4255386379F, 0.4260281022F, 0.4265176256F, - 0.4270072075F, 0.4274968473F, 0.4279865445F, 0.4284762984F, - 0.4289661086F, 0.4294559743F, 0.4299458951F, 0.4304358704F, - 0.4309258996F, 0.4314159822F, 0.4319061175F, 0.4323963050F, - 0.4328865441F, 0.4333768342F, 0.4338671749F, 0.4343575654F, - 0.4348480052F, 0.4353384938F, 0.4358290306F, 0.4363196149F, - 0.4368102463F, 0.4373009241F, 0.4377916478F, 0.4382824168F, - 0.4387732305F, 0.4392640884F, 0.4397549899F, 0.4402459343F, - 0.4407369212F, 0.4412279499F, 0.4417190198F, 0.4422101305F, - 0.4427012813F, 0.4431924717F, 0.4436837010F, 0.4441749686F, - 0.4446662742F, 0.4451576169F, 0.4456489963F, 0.4461404118F, - 0.4466318628F, 0.4471233487F, 0.4476148690F, 0.4481064230F, - 0.4485980103F, 0.4490896302F, 0.4495812821F, 0.4500729654F, - 0.4505646797F, 0.4510564243F, 0.4515481986F, 0.4520400021F, - 0.4525318341F, 0.4530236942F, 0.4535155816F, 0.4540074959F, - 0.4544994365F, 0.4549914028F, 0.4554833941F, 0.4559754100F, - 0.4564674499F, 0.4569595131F, 0.4574515991F, 0.4579437074F, - 0.4584358372F, 0.4589279881F, 0.4594201595F, 0.4599123508F, - 0.4604045615F, 0.4608967908F, 0.4613890383F, 0.4618813034F, - 0.4623735855F, 0.4628658841F, 0.4633581984F, 0.4638505281F, - 0.4643428724F, 0.4648352308F, 0.4653276028F, 0.4658199877F, - 0.4663123849F, 0.4668047940F, 0.4672972143F, 0.4677896451F, - 0.4682820861F, 0.4687745365F, 0.4692669958F, 0.4697594634F, - 0.4702519387F, 0.4707444211F, 0.4712369102F, 0.4717294052F, - 0.4722219056F, 0.4727144109F, 0.4732069204F, 0.4736994336F, - 0.4741919498F, 0.4746844686F, 0.4751769893F, 0.4756695113F, - 0.4761620341F, 0.4766545571F, 0.4771470797F, 0.4776396013F, - 0.4781321213F, 0.4786246392F, 0.4791171544F, 0.4796096663F, - 0.4801021744F, 0.4805946779F, 0.4810871765F, 0.4815796694F, - 0.4820721561F, 0.4825646360F, 0.4830571086F, 0.4835495732F, - 0.4840420293F, 0.4845344763F, 0.4850269136F, 0.4855193407F, - 0.4860117569F, 0.4865041617F, 0.4869965545F, 0.4874889347F, - 0.4879813018F, 0.4884736551F, 0.4889659941F, 0.4894583182F, - 0.4899506268F, 0.4904429193F, 0.4909351952F, 0.4914274538F, - 0.4919196947F, 0.4924119172F, 0.4929041207F, 0.4933963046F, - 0.4938884685F, 0.4943806116F, 0.4948727335F, 0.4953648335F, - 0.4958569110F, 0.4963489656F, 0.4968409965F, 0.4973330032F, - 0.4978249852F, 0.4983169419F, 0.4988088726F, 0.4993007768F, - 0.4997926539F, 0.5002845034F, 0.5007763247F, 0.5012681171F, - 0.5017598801F, 0.5022516132F, 0.5027433157F, 0.5032349871F, - 0.5037266268F, 0.5042182341F, 0.5047098086F, 0.5052013497F, - 0.5056928567F, 0.5061843292F, 0.5066757664F, 0.5071671679F, - 0.5076585330F, 0.5081498613F, 0.5086411520F, 0.5091324047F, - 0.5096236187F, 0.5101147934F, 0.5106059284F, 0.5110970230F, - 0.5115880766F, 0.5120790887F, 0.5125700587F, 0.5130609860F, - 0.5135518700F, 0.5140427102F, 0.5145335059F, 0.5150242566F, - 0.5155149618F, 0.5160056208F, 0.5164962331F, 0.5169867980F, - 0.5174773151F, 0.5179677837F, 0.5184582033F, 0.5189485733F, - 0.5194388931F, 0.5199291621F, 0.5204193798F, 0.5209095455F, - 0.5213996588F, 0.5218897190F, 0.5223797256F, 0.5228696779F, - 0.5233595755F, 0.5238494177F, 0.5243392039F, 0.5248289337F, - 0.5253186063F, 0.5258082213F, 0.5262977781F, 0.5267872760F, - 0.5272767146F, 0.5277660932F, 0.5282554112F, 0.5287446682F, - 0.5292338635F, 0.5297229965F, 0.5302120667F, 0.5307010736F, - 0.5311900164F, 0.5316788947F, 0.5321677079F, 0.5326564554F, - 0.5331451366F, 0.5336337511F, 0.5341222981F, 0.5346107771F, - 0.5350991876F, 0.5355875290F, 0.5360758007F, 0.5365640021F, - 0.5370521327F, 0.5375401920F, 0.5380281792F, 0.5385160939F, - 0.5390039355F, 0.5394917034F, 0.5399793971F, 0.5404670159F, - 0.5409545594F, 0.5414420269F, 0.5419294179F, 0.5424167318F, - 0.5429039680F, 0.5433911261F, 0.5438782053F, 0.5443652051F, - 0.5448521250F, 0.5453389644F, 0.5458257228F, 0.5463123995F, - 0.5467989940F, 0.5472855057F, 0.5477719341F, 0.5482582786F, - 0.5487445387F, 0.5492307137F, 0.5497168031F, 0.5502028063F, - 0.5506887228F, 0.5511745520F, 0.5516602934F, 0.5521459463F, - 0.5526315103F, 0.5531169847F, 0.5536023690F, 0.5540876626F, - 0.5545728649F, 0.5550579755F, 0.5555429937F, 0.5560279189F, - 0.5565127507F, 0.5569974884F, 0.5574821315F, 0.5579666794F, - 0.5584511316F, 0.5589354875F, 0.5594197465F, 0.5599039080F, - 0.5603879716F, 0.5608719367F, 0.5613558026F, 0.5618395689F, - 0.5623232350F, 0.5628068002F, 0.5632902642F, 0.5637736262F, - 0.5642568858F, 0.5647400423F, 0.5652230953F, 0.5657060442F, - 0.5661888883F, 0.5666716272F, 0.5671542603F, 0.5676367870F, - 0.5681192069F, 0.5686015192F, 0.5690837235F, 0.5695658192F, - 0.5700478058F, 0.5705296827F, 0.5710114494F, 0.5714931052F, - 0.5719746497F, 0.5724560822F, 0.5729374023F, 0.5734186094F, - 0.5738997029F, 0.5743806823F, 0.5748615470F, 0.5753422965F, - 0.5758229301F, 0.5763034475F, 0.5767838480F, 0.5772641310F, - 0.5777442960F, 0.5782243426F, 0.5787042700F, 0.5791840778F, - 0.5796637654F, 0.5801433322F, 0.5806227778F, 0.5811021016F, - 0.5815813029F, 0.5820603814F, 0.5825393363F, 0.5830181673F, - 0.5834968737F, 0.5839754549F, 0.5844539105F, 0.5849322399F, - 0.5854104425F, 0.5858885179F, 0.5863664653F, 0.5868442844F, - 0.5873219746F, 0.5877995353F, 0.5882769660F, 0.5887542661F, - 0.5892314351F, 0.5897084724F, 0.5901853776F, 0.5906621500F, - 0.5911387892F, 0.5916152945F, 0.5920916655F, 0.5925679016F, - 0.5930440022F, 0.5935199669F, 0.5939957950F, 0.5944714861F, - 0.5949470396F, 0.5954224550F, 0.5958977317F, 0.5963728692F, - 0.5968478669F, 0.5973227244F, 0.5977974411F, 0.5982720163F, - 0.5987464497F, 0.5992207407F, 0.5996948887F, 0.6001688932F, - 0.6006427537F, 0.6011164696F, 0.6015900405F, 0.6020634657F, - 0.6025367447F, 0.6030098770F, 0.6034828621F, 0.6039556995F, - 0.6044283885F, 0.6049009288F, 0.6053733196F, 0.6058455606F, - 0.6063176512F, 0.6067895909F, 0.6072613790F, 0.6077330152F, - 0.6082044989F, 0.6086758295F, 0.6091470065F, 0.6096180294F, - 0.6100888977F, 0.6105596108F, 0.6110301682F, 0.6115005694F, - 0.6119708139F, 0.6124409011F, 0.6129108305F, 0.6133806017F, - 0.6138502139F, 0.6143196669F, 0.6147889599F, 0.6152580926F, - 0.6157270643F, 0.6161958746F, 0.6166645230F, 0.6171330088F, - 0.6176013317F, 0.6180694910F, 0.6185374863F, 0.6190053171F, - 0.6194729827F, 0.6199404828F, 0.6204078167F, 0.6208749841F, - 0.6213419842F, 0.6218088168F, 0.6222754811F, 0.6227419768F, - 0.6232083032F, 0.6236744600F, 0.6241404465F, 0.6246062622F, - 0.6250719067F, 0.6255373795F, 0.6260026799F, 0.6264678076F, - 0.6269327619F, 0.6273975425F, 0.6278621487F, 0.6283265800F, - 0.6287908361F, 0.6292549163F, 0.6297188201F, 0.6301825471F, - 0.6306460966F, 0.6311094683F, 0.6315726617F, 0.6320356761F, - 0.6324985111F, 0.6329611662F, 0.6334236410F, 0.6338859348F, - 0.6343480472F, 0.6348099777F, 0.6352717257F, 0.6357332909F, - 0.6361946726F, 0.6366558704F, 0.6371168837F, 0.6375777122F, - 0.6380383552F, 0.6384988123F, 0.6389590830F, 0.6394191668F, - 0.6398790631F, 0.6403387716F, 0.6407982916F, 0.6412576228F, - 0.6417167645F, 0.6421757163F, 0.6426344778F, 0.6430930483F, - 0.6435514275F, 0.6440096149F, 0.6444676098F, 0.6449254119F, - 0.6453830207F, 0.6458404356F, 0.6462976562F, 0.6467546820F, - 0.6472115125F, 0.6476681472F, 0.6481245856F, 0.6485808273F, - 0.6490368717F, 0.6494927183F, 0.6499483667F, 0.6504038164F, - 0.6508590670F, 0.6513141178F, 0.6517689684F, 0.6522236185F, - 0.6526780673F, 0.6531323146F, 0.6535863598F, 0.6540402024F, - 0.6544938419F, 0.6549472779F, 0.6554005099F, 0.6558535373F, - 0.6563063598F, 0.6567589769F, 0.6572113880F, 0.6576635927F, - 0.6581155906F, 0.6585673810F, 0.6590189637F, 0.6594703380F, - 0.6599215035F, 0.6603724598F, 0.6608232064F, 0.6612737427F, - 0.6617240684F, 0.6621741829F, 0.6626240859F, 0.6630737767F, - 0.6635232550F, 0.6639725202F, 0.6644215720F, 0.6648704098F, - 0.6653190332F, 0.6657674417F, 0.6662156348F, 0.6666636121F, - 0.6671113731F, 0.6675589174F, 0.6680062445F, 0.6684533538F, - 0.6689002450F, 0.6693469177F, 0.6697933712F, 0.6702396052F, - 0.6706856193F, 0.6711314129F, 0.6715769855F, 0.6720223369F, - 0.6724674664F, 0.6729123736F, 0.6733570581F, 0.6738015194F, - 0.6742457570F, 0.6746897706F, 0.6751335596F, 0.6755771236F, - 0.6760204621F, 0.6764635747F, 0.6769064609F, 0.6773491204F, - 0.6777915525F, 0.6782337570F, 0.6786757332F, 0.6791174809F, - 0.6795589995F, 0.6800002886F, 0.6804413477F, 0.6808821765F, - 0.6813227743F, 0.6817631409F, 0.6822032758F, 0.6826431785F, - 0.6830828485F, 0.6835222855F, 0.6839614890F, 0.6844004585F, - 0.6848391936F, 0.6852776939F, 0.6857159589F, 0.6861539883F, - 0.6865917815F, 0.6870293381F, 0.6874666576F, 0.6879037398F, - 0.6883405840F, 0.6887771899F, 0.6892135571F, 0.6896496850F, - 0.6900855733F, 0.6905212216F, 0.6909566294F, 0.6913917963F, - 0.6918267218F, 0.6922614055F, 0.6926958471F, 0.6931300459F, - 0.6935640018F, 0.6939977141F, 0.6944311825F, 0.6948644066F, - 0.6952973859F, 0.6957301200F, 0.6961626085F, 0.6965948510F, - 0.6970268470F, 0.6974585961F, 0.6978900980F, 0.6983213521F, - 0.6987523580F, 0.6991831154F, 0.6996136238F, 0.7000438828F, - 0.7004738921F, 0.7009036510F, 0.7013331594F, 0.7017624166F, - 0.7021914224F, 0.7026201763F, 0.7030486779F, 0.7034769268F, - 0.7039049226F, 0.7043326648F, 0.7047601531F, 0.7051873870F, - 0.7056143662F, 0.7060410902F, 0.7064675586F, 0.7068937711F, - 0.7073197271F, 0.7077454264F, 0.7081708684F, 0.7085960529F, - 0.7090209793F, 0.7094456474F, 0.7098700566F, 0.7102942066F, - 0.7107180970F, 0.7111417274F, 0.7115650974F, 0.7119882066F, - 0.7124110545F, 0.7128336409F, 0.7132559653F, 0.7136780272F, - 0.7140998264F, 0.7145213624F, 0.7149426348F, 0.7153636433F, - 0.7157843874F, 0.7162048668F, 0.7166250810F, 0.7170450296F, - 0.7174647124F, 0.7178841289F, 0.7183032786F, 0.7187221613F, - 0.7191407765F, 0.7195591239F, 0.7199772030F, 0.7203950135F, - 0.7208125550F, 0.7212298271F, 0.7216468294F, 0.7220635616F, - 0.7224800233F, 0.7228962140F, 0.7233121335F, 0.7237277813F, - 0.7241431571F, 0.7245582604F, 0.7249730910F, 0.7253876484F, - 0.7258019322F, 0.7262159422F, 0.7266296778F, 0.7270431388F, - 0.7274563247F, 0.7278692353F, 0.7282818700F, 0.7286942287F, - 0.7291063108F, 0.7295181160F, 0.7299296440F, 0.7303408944F, - 0.7307518669F, 0.7311625609F, 0.7315729763F, 0.7319831126F, - 0.7323929695F, 0.7328025466F, 0.7332118435F, 0.7336208600F, - 0.7340295955F, 0.7344380499F, 0.7348462226F, 0.7352541134F, - 0.7356617220F, 0.7360690478F, 0.7364760907F, 0.7368828502F, - 0.7372893259F, 0.7376955176F, 0.7381014249F, 0.7385070475F, - 0.7389123849F, 0.7393174368F, 0.7397222029F, 0.7401266829F, - 0.7405308763F, 0.7409347829F, 0.7413384023F, 0.7417417341F, - 0.7421447780F, 0.7425475338F, 0.7429500009F, 0.7433521791F, - 0.7437540681F, 0.7441556674F, 0.7445569769F, 0.7449579960F, - 0.7453587245F, 0.7457591621F, 0.7461593084F, 0.7465591631F, - 0.7469587259F, 0.7473579963F, 0.7477569741F, 0.7481556590F, - 0.7485540506F, 0.7489521486F, 0.7493499526F, 0.7497474623F, - 0.7501446775F, 0.7505415977F, 0.7509382227F, 0.7513345521F, - 0.7517305856F, 0.7521263229F, 0.7525217636F, 0.7529169074F, - 0.7533117541F, 0.7537063032F, 0.7541005545F, 0.7544945076F, - 0.7548881623F, 0.7552815182F, 0.7556745749F, 0.7560673323F, - 0.7564597899F, 0.7568519474F, 0.7572438046F, 0.7576353611F, - 0.7580266166F, 0.7584175708F, 0.7588082235F, 0.7591985741F, - 0.7595886226F, 0.7599783685F, 0.7603678116F, 0.7607569515F, - 0.7611457879F, 0.7615343206F, 0.7619225493F, 0.7623104735F, - 0.7626980931F, 0.7630854078F, 0.7634724171F, 0.7638591209F, - 0.7642455188F, 0.7646316106F, 0.7650173959F, 0.7654028744F, - 0.7657880459F, 0.7661729100F, 0.7665574664F, 0.7669417150F, - 0.7673256553F, 0.7677092871F, 0.7680926100F, 0.7684756239F, - 0.7688583284F, 0.7692407232F, 0.7696228080F, 0.7700045826F, - 0.7703860467F, 0.7707671999F, 0.7711480420F, 0.7715285728F, - 0.7719087918F, 0.7722886989F, 0.7726682938F, 0.7730475762F, - 0.7734265458F, 0.7738052023F, 0.7741835454F, 0.7745615750F, - 0.7749392906F, 0.7753166921F, 0.7756937791F, 0.7760705514F, - 0.7764470087F, 0.7768231508F, 0.7771989773F, 0.7775744880F, - 0.7779496827F, 0.7783245610F, 0.7786991227F, 0.7790733676F, - 0.7794472953F, 0.7798209056F, 0.7801941982F, 0.7805671729F, - 0.7809398294F, 0.7813121675F, 0.7816841869F, 0.7820558873F, - 0.7824272684F, 0.7827983301F, 0.7831690720F, 0.7835394940F, - 0.7839095957F, 0.7842793768F, 0.7846488373F, 0.7850179767F, - 0.7853867948F, 0.7857552914F, 0.7861234663F, 0.7864913191F, - 0.7868588497F, 0.7872260578F, 0.7875929431F, 0.7879595055F, - 0.7883257445F, 0.7886916601F, 0.7890572520F, 0.7894225198F, - 0.7897874635F, 0.7901520827F, 0.7905163772F, 0.7908803468F, - 0.7912439912F, 0.7916073102F, 0.7919703035F, 0.7923329710F, - 0.7926953124F, 0.7930573274F, 0.7934190158F, 0.7937803774F, - 0.7941414120F, 0.7945021193F, 0.7948624991F, 0.7952225511F, - 0.7955822752F, 0.7959416711F, 0.7963007387F, 0.7966594775F, - 0.7970178875F, 0.7973759685F, 0.7977337201F, 0.7980911422F, - 0.7984482346F, 0.7988049970F, 0.7991614292F, 0.7995175310F, - 0.7998733022F, 0.8002287426F, 0.8005838519F, 0.8009386299F, - 0.8012930765F, 0.8016471914F, 0.8020009744F, 0.8023544253F, - 0.8027075438F, 0.8030603298F, 0.8034127831F, 0.8037649035F, - 0.8041166906F, 0.8044681445F, 0.8048192647F, 0.8051700512F, - 0.8055205038F, 0.8058706222F, 0.8062204062F, 0.8065698556F, - 0.8069189702F, 0.8072677499F, 0.8076161944F, 0.8079643036F, - 0.8083120772F, 0.8086595151F, 0.8090066170F, 0.8093533827F, - 0.8096998122F, 0.8100459051F, 0.8103916613F, 0.8107370806F, - 0.8110821628F, 0.8114269077F, 0.8117713151F, 0.8121153849F, - 0.8124591169F, 0.8128025108F, 0.8131455666F, 0.8134882839F, - 0.8138306627F, 0.8141727027F, 0.8145144038F, 0.8148557658F, - 0.8151967886F, 0.8155374718F, 0.8158778154F, 0.8162178192F, - 0.8165574830F, 0.8168968067F, 0.8172357900F, 0.8175744328F, - 0.8179127349F, 0.8182506962F, 0.8185883164F, 0.8189255955F, - 0.8192625332F, 0.8195991295F, 0.8199353840F, 0.8202712967F, - 0.8206068673F, 0.8209420958F, 0.8212769820F, 0.8216115256F, - 0.8219457266F, 0.8222795848F, 0.8226131000F, 0.8229462721F, - 0.8232791009F, 0.8236115863F, 0.8239437280F, 0.8242755260F, - 0.8246069801F, 0.8249380901F, 0.8252688559F, 0.8255992774F, - 0.8259293544F, 0.8262590867F, 0.8265884741F, 0.8269175167F, - 0.8272462141F, 0.8275745663F, 0.8279025732F, 0.8282302344F, - 0.8285575501F, 0.8288845199F, 0.8292111437F, 0.8295374215F, - 0.8298633530F, 0.8301889382F, 0.8305141768F, 0.8308390688F, - 0.8311636141F, 0.8314878124F, 0.8318116637F, 0.8321351678F, - 0.8324583246F, 0.8327811340F, 0.8331035957F, 0.8334257098F, - 0.8337474761F, 0.8340688944F, 0.8343899647F, 0.8347106867F, - 0.8350310605F, 0.8353510857F, 0.8356707624F, 0.8359900904F, - 0.8363090696F, 0.8366276999F, 0.8369459811F, 0.8372639131F, - 0.8375814958F, 0.8378987292F, 0.8382156130F, 0.8385321472F, - 0.8388483316F, 0.8391641662F, 0.8394796508F, 0.8397947853F, - 0.8401095697F, 0.8404240037F, 0.8407380873F, 0.8410518204F, - 0.8413652029F, 0.8416782347F, 0.8419909156F, 0.8423032456F, - 0.8426152245F, 0.8429268523F, 0.8432381289F, 0.8435490541F, - 0.8438596279F, 0.8441698502F, 0.8444797208F, 0.8447892396F, - 0.8450984067F, 0.8454072218F, 0.8457156849F, 0.8460237959F, - 0.8463315547F, 0.8466389612F, 0.8469460154F, 0.8472527170F, - 0.8475590661F, 0.8478650625F, 0.8481707063F, 0.8484759971F, - 0.8487809351F, 0.8490855201F, 0.8493897521F, 0.8496936308F, - 0.8499971564F, 0.8503003286F, 0.8506031474F, 0.8509056128F, - 0.8512077246F, 0.8515094828F, 0.8518108872F, 0.8521119379F, - 0.8524126348F, 0.8527129777F, 0.8530129666F, 0.8533126015F, - 0.8536118822F, 0.8539108087F, 0.8542093809F, 0.8545075988F, - 0.8548054623F, 0.8551029712F, 0.8554001257F, 0.8556969255F, - 0.8559933707F, 0.8562894611F, 0.8565851968F, 0.8568805775F, - 0.8571756034F, 0.8574702743F, 0.8577645902F, 0.8580585509F, - 0.8583521566F, 0.8586454070F, 0.8589383021F, 0.8592308420F, - 0.8595230265F, 0.8598148556F, 0.8601063292F, 0.8603974473F, - 0.8606882098F, 0.8609786167F, 0.8612686680F, 0.8615583636F, - 0.8618477034F, 0.8621366874F, 0.8624253156F, 0.8627135878F, - 0.8630015042F, 0.8632890646F, 0.8635762690F, 0.8638631173F, - 0.8641496096F, 0.8644357457F, 0.8647215257F, 0.8650069495F, - 0.8652920171F, 0.8655767283F, 0.8658610833F, 0.8661450820F, - 0.8664287243F, 0.8667120102F, 0.8669949397F, 0.8672775127F, - 0.8675597293F, 0.8678415894F, 0.8681230929F, 0.8684042398F, - 0.8686850302F, 0.8689654640F, 0.8692455412F, 0.8695252617F, - 0.8698046255F, 0.8700836327F, 0.8703622831F, 0.8706405768F, - 0.8709185138F, 0.8711960940F, 0.8714733174F, 0.8717501840F, - 0.8720266939F, 0.8723028469F, 0.8725786430F, 0.8728540824F, - 0.8731291648F, 0.8734038905F, 0.8736782592F, 0.8739522711F, - 0.8742259261F, 0.8744992242F, 0.8747721653F, 0.8750447496F, - 0.8753169770F, 0.8755888475F, 0.8758603611F, 0.8761315177F, - 0.8764023175F, 0.8766727603F, 0.8769428462F, 0.8772125752F, - 0.8774819474F, 0.8777509626F, 0.8780196209F, 0.8782879224F, - 0.8785558669F, 0.8788234546F, 0.8790906854F, 0.8793575594F, - 0.8796240765F, 0.8798902368F, 0.8801560403F, 0.8804214870F, - 0.8806865768F, 0.8809513099F, 0.8812156863F, 0.8814797059F, - 0.8817433687F, 0.8820066749F, 0.8822696243F, 0.8825322171F, - 0.8827944532F, 0.8830563327F, 0.8833178556F, 0.8835790219F, - 0.8838398316F, 0.8841002848F, 0.8843603815F, 0.8846201217F, - 0.8848795054F, 0.8851385327F, 0.8853972036F, 0.8856555182F, - 0.8859134764F, 0.8861710783F, 0.8864283239F, 0.8866852133F, - 0.8869417464F, 0.8871979234F, 0.8874537443F, 0.8877092090F, - 0.8879643177F, 0.8882190704F, 0.8884734671F, 0.8887275078F, - 0.8889811927F, 0.8892345216F, 0.8894874948F, 0.8897401122F, - 0.8899923738F, 0.8902442798F, 0.8904958301F, 0.8907470248F, - 0.8909978640F, 0.8912483477F, 0.8914984759F, 0.8917482487F, - 0.8919976662F, 0.8922467284F, 0.8924954353F, 0.8927437871F, - 0.8929917837F, 0.8932394252F, 0.8934867118F, 0.8937336433F, - 0.8939802199F, 0.8942264417F, 0.8944723087F, 0.8947178210F, - 0.8949629785F, 0.8952077815F, 0.8954522299F, 0.8956963239F, - 0.8959400634F, 0.8961834486F, 0.8964264795F, 0.8966691561F, - 0.8969114786F, 0.8971534470F, 0.8973950614F, 0.8976363219F, - 0.8978772284F, 0.8981177812F, 0.8983579802F, 0.8985978256F, - 0.8988373174F, 0.8990764556F, 0.8993152405F, 0.8995536720F, - 0.8997917502F, 0.9000294751F, 0.9002668470F, 0.9005038658F, - 0.9007405317F, 0.9009768446F, 0.9012128048F, 0.9014484123F, - 0.9016836671F, 0.9019185693F, 0.9021531191F, 0.9023873165F, - 0.9026211616F, 0.9028546546F, 0.9030877954F, 0.9033205841F, - 0.9035530210F, 0.9037851059F, 0.9040168392F, 0.9042482207F, - 0.9044792507F, 0.9047099293F, 0.9049402564F, 0.9051702323F, - 0.9053998569F, 0.9056291305F, 0.9058580531F, 0.9060866248F, - 0.9063148457F, 0.9065427159F, 0.9067702355F, 0.9069974046F, - 0.9072242233F, 0.9074506917F, 0.9076768100F, 0.9079025782F, - 0.9081279964F, 0.9083530647F, 0.9085777833F, 0.9088021523F, - 0.9090261717F, 0.9092498417F, 0.9094731623F, 0.9096961338F, - 0.9099187561F, 0.9101410295F, 0.9103629540F, 0.9105845297F, - 0.9108057568F, 0.9110266354F, 0.9112471656F, 0.9114673475F, - 0.9116871812F, 0.9119066668F, 0.9121258046F, 0.9123445945F, - 0.9125630367F, 0.9127811314F, 0.9129988786F, 0.9132162785F, - 0.9134333312F, 0.9136500368F, 0.9138663954F, 0.9140824073F, - 0.9142980724F, 0.9145133910F, 0.9147283632F, 0.9149429890F, - 0.9151572687F, 0.9153712023F, 0.9155847900F, 0.9157980319F, - 0.9160109282F, 0.9162234790F, 0.9164356844F, 0.9166475445F, - 0.9168590595F, 0.9170702296F, 0.9172810548F, 0.9174915354F, - 0.9177016714F, 0.9179114629F, 0.9181209102F, 0.9183300134F, - 0.9185387726F, 0.9187471879F, 0.9189552595F, 0.9191629876F, - 0.9193703723F, 0.9195774136F, 0.9197841119F, 0.9199904672F, - 0.9201964797F, 0.9204021495F, 0.9206074767F, 0.9208124616F, - 0.9210171043F, 0.9212214049F, 0.9214253636F, 0.9216289805F, - 0.9218322558F, 0.9220351896F, 0.9222377821F, 0.9224400335F, - 0.9226419439F, 0.9228435134F, 0.9230447423F, 0.9232456307F, - 0.9234461787F, 0.9236463865F, 0.9238462543F, 0.9240457822F, - 0.9242449704F, 0.9244438190F, 0.9246423282F, 0.9248404983F, - 0.9250383293F, 0.9252358214F, 0.9254329747F, 0.9256297896F, - 0.9258262660F, 0.9260224042F, 0.9262182044F, 0.9264136667F, - 0.9266087913F, 0.9268035783F, 0.9269980280F, 0.9271921405F, - 0.9273859160F, 0.9275793546F, 0.9277724566F, 0.9279652221F, - 0.9281576513F, 0.9283497443F, 0.9285415014F, 0.9287329227F, - 0.9289240084F, 0.9291147586F, 0.9293051737F, 0.9294952536F, - 0.9296849987F, 0.9298744091F, 0.9300634850F, 0.9302522266F, - 0.9304406340F, 0.9306287074F, 0.9308164471F, 0.9310038532F, - 0.9311909259F, 0.9313776654F, 0.9315640719F, 0.9317501455F, - 0.9319358865F, 0.9321212951F, 0.9323063713F, 0.9324911155F, - 0.9326755279F, 0.9328596085F, 0.9330433577F, 0.9332267756F, - 0.9334098623F, 0.9335926182F, 0.9337750434F, 0.9339571380F, - 0.9341389023F, 0.9343203366F, 0.9345014409F, 0.9346822155F, - 0.9348626606F, 0.9350427763F, 0.9352225630F, 0.9354020207F, - 0.9355811498F, 0.9357599503F, 0.9359384226F, 0.9361165667F, - 0.9362943830F, 0.9364718716F, 0.9366490327F, 0.9368258666F, - 0.9370023733F, 0.9371785533F, 0.9373544066F, 0.9375299335F, - 0.9377051341F, 0.9378800087F, 0.9380545576F, 0.9382287809F, - 0.9384026787F, 0.9385762515F, 0.9387494993F, 0.9389224223F, - 0.9390950209F, 0.9392672951F, 0.9394392453F, 0.9396108716F, - 0.9397821743F, 0.9399531536F, 0.9401238096F, 0.9402941427F, - 0.9404641530F, 0.9406338407F, 0.9408032061F, 0.9409722495F, - 0.9411409709F, 0.9413093707F, 0.9414774491F, 0.9416452062F, - 0.9418126424F, 0.9419797579F, 0.9421465528F, 0.9423130274F, - 0.9424791819F, 0.9426450166F, 0.9428105317F, 0.9429757274F, - 0.9431406039F, 0.9433051616F, 0.9434694005F, 0.9436333209F, - 0.9437969232F, 0.9439602074F, 0.9441231739F, 0.9442858229F, - 0.9444481545F, 0.9446101691F, 0.9447718669F, 0.9449332481F, - 0.9450943129F, 0.9452550617F, 0.9454154945F, 0.9455756118F, - 0.9457354136F, 0.9458949003F, 0.9460540721F, 0.9462129292F, - 0.9463714719F, 0.9465297003F, 0.9466876149F, 0.9468452157F, - 0.9470025031F, 0.9471594772F, 0.9473161384F, 0.9474724869F, - 0.9476285229F, 0.9477842466F, 0.9479396584F, 0.9480947585F, - 0.9482495470F, 0.9484040243F, 0.9485581906F, 0.9487120462F, - 0.9488655913F, 0.9490188262F, 0.9491717511F, 0.9493243662F, - 0.9494766718F, 0.9496286683F, 0.9497803557F, 0.9499317345F, - 0.9500828047F, 0.9502335668F, 0.9503840209F, 0.9505341673F, - 0.9506840062F, 0.9508335380F, 0.9509827629F, 0.9511316810F, - 0.9512802928F, 0.9514285984F, 0.9515765982F, 0.9517242923F, - 0.9518716810F, 0.9520187646F, 0.9521655434F, 0.9523120176F, - 0.9524581875F, 0.9526040534F, 0.9527496154F, 0.9528948739F, - 0.9530398292F, 0.9531844814F, 0.9533288310F, 0.9534728780F, - 0.9536166229F, 0.9537600659F, 0.9539032071F, 0.9540460470F, - 0.9541885858F, 0.9543308237F, 0.9544727611F, 0.9546143981F, - 0.9547557351F, 0.9548967723F, 0.9550375100F, 0.9551779485F, - 0.9553180881F, 0.9554579290F, 0.9555974714F, 0.9557367158F, - 0.9558756623F, 0.9560143112F, 0.9561526628F, 0.9562907174F, - 0.9564284752F, 0.9565659366F, 0.9567031017F, 0.9568399710F, - 0.9569765446F, 0.9571128229F, 0.9572488061F, 0.9573844944F, - 0.9575198883F, 0.9576549879F, 0.9577897936F, 0.9579243056F, - 0.9580585242F, 0.9581924497F, 0.9583260824F, 0.9584594226F, - 0.9585924705F, 0.9587252264F, 0.9588576906F, 0.9589898634F, - 0.9591217452F, 0.9592533360F, 0.9593846364F, 0.9595156465F, - 0.9596463666F, 0.9597767971F, 0.9599069382F, 0.9600367901F, - 0.9601663533F, 0.9602956279F, 0.9604246143F, 0.9605533128F, - 0.9606817236F, 0.9608098471F, 0.9609376835F, 0.9610652332F, - 0.9611924963F, 0.9613194733F, 0.9614461644F, 0.9615725699F, - 0.9616986901F, 0.9618245253F, 0.9619500757F, 0.9620753418F, - 0.9622003238F, 0.9623250219F, 0.9624494365F, 0.9625735679F, - 0.9626974163F, 0.9628209821F, 0.9629442656F, 0.9630672671F, - 0.9631899868F, 0.9633124251F, 0.9634345822F, 0.9635564585F, - 0.9636780543F, 0.9637993699F, 0.9639204056F, 0.9640411616F, - 0.9641616383F, 0.9642818359F, 0.9644017549F, 0.9645213955F, - 0.9646407579F, 0.9647598426F, 0.9648786497F, 0.9649971797F, - 0.9651154328F, 0.9652334092F, 0.9653511095F, 0.9654685337F, - 0.9655856823F, 0.9657025556F, 0.9658191538F, 0.9659354773F, - 0.9660515263F, 0.9661673013F, 0.9662828024F, 0.9663980300F, - 0.9665129845F, 0.9666276660F, 0.9667420750F, 0.9668562118F, - 0.9669700766F, 0.9670836698F, 0.9671969917F, 0.9673100425F, - 0.9674228227F, 0.9675353325F, 0.9676475722F, 0.9677595422F, - 0.9678712428F, 0.9679826742F, 0.9680938368F, 0.9682047309F, - 0.9683153569F, 0.9684257150F, 0.9685358056F, 0.9686456289F, - 0.9687551853F, 0.9688644752F, 0.9689734987F, 0.9690822564F, - 0.9691907483F, 0.9692989750F, 0.9694069367F, 0.9695146337F, - 0.9696220663F, 0.9697292349F, 0.9698361398F, 0.9699427813F, - 0.9700491597F, 0.9701552754F, 0.9702611286F, 0.9703667197F, - 0.9704720490F, 0.9705771169F, 0.9706819236F, 0.9707864695F, - 0.9708907549F, 0.9709947802F, 0.9710985456F, 0.9712020514F, - 0.9713052981F, 0.9714082859F, 0.9715110151F, 0.9716134862F, - 0.9717156993F, 0.9718176549F, 0.9719193532F, 0.9720207946F, - 0.9721219794F, 0.9722229080F, 0.9723235806F, 0.9724239976F, - 0.9725241593F, 0.9726240661F, 0.9727237183F, 0.9728231161F, - 0.9729222601F, 0.9730211503F, 0.9731197873F, 0.9732181713F, - 0.9733163027F, 0.9734141817F, 0.9735118088F, 0.9736091842F, - 0.9737063083F, 0.9738031814F, 0.9738998039F, 0.9739961760F, - 0.9740922981F, 0.9741881706F, 0.9742837938F, 0.9743791680F, - 0.9744742935F, 0.9745691707F, 0.9746637999F, 0.9747581814F, - 0.9748523157F, 0.9749462029F, 0.9750398435F, 0.9751332378F, - 0.9752263861F, 0.9753192887F, 0.9754119461F, 0.9755043585F, - 0.9755965262F, 0.9756884496F, 0.9757801291F, 0.9758715650F, - 0.9759627575F, 0.9760537071F, 0.9761444141F, 0.9762348789F, - 0.9763251016F, 0.9764150828F, 0.9765048228F, 0.9765943218F, - 0.9766835802F, 0.9767725984F, 0.9768613767F, 0.9769499154F, - 0.9770382149F, 0.9771262755F, 0.9772140976F, 0.9773016815F, - 0.9773890275F, 0.9774761360F, 0.9775630073F, 0.9776496418F, - 0.9777360398F, 0.9778222016F, 0.9779081277F, 0.9779938182F, - 0.9780792736F, 0.9781644943F, 0.9782494805F, 0.9783342326F, - 0.9784187509F, 0.9785030359F, 0.9785870877F, 0.9786709069F, - 0.9787544936F, 0.9788378484F, 0.9789209714F, 0.9790038631F, - 0.9790865238F, 0.9791689538F, 0.9792511535F, 0.9793331232F, - 0.9794148633F, 0.9794963742F, 0.9795776561F, 0.9796587094F, - 0.9797395345F, 0.9798201316F, 0.9799005013F, 0.9799806437F, - 0.9800605593F, 0.9801402483F, 0.9802197112F, 0.9802989483F, - 0.9803779600F, 0.9804567465F, 0.9805353082F, 0.9806136455F, - 0.9806917587F, 0.9807696482F, 0.9808473143F, 0.9809247574F, - 0.9810019778F, 0.9810789759F, 0.9811557519F, 0.9812323064F, - 0.9813086395F, 0.9813847517F, 0.9814606433F, 0.9815363147F, - 0.9816117662F, 0.9816869981F, 0.9817620108F, 0.9818368047F, - 0.9819113801F, 0.9819857374F, 0.9820598769F, 0.9821337989F, - 0.9822075038F, 0.9822809920F, 0.9823542638F, 0.9824273195F, - 0.9825001596F, 0.9825727843F, 0.9826451940F, 0.9827173891F, - 0.9827893700F, 0.9828611368F, 0.9829326901F, 0.9830040302F, - 0.9830751574F, 0.9831460720F, 0.9832167745F, 0.9832872652F, - 0.9833575444F, 0.9834276124F, 0.9834974697F, 0.9835671166F, - 0.9836365535F, 0.9837057806F, 0.9837747983F, 0.9838436071F, - 0.9839122072F, 0.9839805990F, 0.9840487829F, 0.9841167591F, - 0.9841845282F, 0.9842520903F, 0.9843194459F, 0.9843865953F, - 0.9844535389F, 0.9845202771F, 0.9845868101F, 0.9846531383F, - 0.9847192622F, 0.9847851820F, 0.9848508980F, 0.9849164108F, - 0.9849817205F, 0.9850468276F, 0.9851117324F, 0.9851764352F, - 0.9852409365F, 0.9853052366F, 0.9853693358F, 0.9854332344F, - 0.9854969330F, 0.9855604317F, 0.9856237309F, 0.9856868310F, - 0.9857497325F, 0.9858124355F, 0.9858749404F, 0.9859372477F, - 0.9859993577F, 0.9860612707F, 0.9861229871F, 0.9861845072F, - 0.9862458315F, 0.9863069601F, 0.9863678936F, 0.9864286322F, - 0.9864891764F, 0.9865495264F, 0.9866096826F, 0.9866696454F, - 0.9867294152F, 0.9867889922F, 0.9868483769F, 0.9869075695F, - 0.9869665706F, 0.9870253803F, 0.9870839991F, 0.9871424273F, - 0.9872006653F, 0.9872587135F, 0.9873165721F, 0.9873742415F, - 0.9874317222F, 0.9874890144F, 0.9875461185F, 0.9876030348F, - 0.9876597638F, 0.9877163057F, 0.9877726610F, 0.9878288300F, - 0.9878848130F, 0.9879406104F, 0.9879962225F, 0.9880516497F, - 0.9881068924F, 0.9881619509F, 0.9882168256F, 0.9882715168F, - 0.9883260249F, 0.9883803502F, 0.9884344931F, 0.9884884539F, - 0.9885422331F, 0.9885958309F, 0.9886492477F, 0.9887024838F, - 0.9887555397F, 0.9888084157F, 0.9888611120F, 0.9889136292F, - 0.9889659675F, 0.9890181273F, 0.9890701089F, 0.9891219128F, - 0.9891735392F, 0.9892249885F, 0.9892762610F, 0.9893273572F, - 0.9893782774F, 0.9894290219F, 0.9894795911F, 0.9895299853F, - 0.9895802049F, 0.9896302502F, 0.9896801217F, 0.9897298196F, - 0.9897793443F, 0.9898286961F, 0.9898778755F, 0.9899268828F, - 0.9899757183F, 0.9900243823F, 0.9900728753F, 0.9901211976F, - 0.9901693495F, 0.9902173314F, 0.9902651436F, 0.9903127865F, - 0.9903602605F, 0.9904075659F, 0.9904547031F, 0.9905016723F, - 0.9905484740F, 0.9905951086F, 0.9906415763F, 0.9906878775F, - 0.9907340126F, 0.9907799819F, 0.9908257858F, 0.9908714247F, - 0.9909168988F, 0.9909622086F, 0.9910073543F, 0.9910523364F, - 0.9910971552F, 0.9911418110F, 0.9911863042F, 0.9912306351F, - 0.9912748042F, 0.9913188117F, 0.9913626580F, 0.9914063435F, - 0.9914498684F, 0.9914932333F, 0.9915364383F, 0.9915794839F, - 0.9916223703F, 0.9916650981F, 0.9917076674F, 0.9917500787F, - 0.9917923323F, 0.9918344286F, 0.9918763679F, 0.9919181505F, - 0.9919597769F, 0.9920012473F, 0.9920425621F, 0.9920837217F, - 0.9921247263F, 0.9921655765F, 0.9922062724F, 0.9922468145F, - 0.9922872030F, 0.9923274385F, 0.9923675211F, 0.9924074513F, - 0.9924472294F, 0.9924868557F, 0.9925263306F, 0.9925656544F, - 0.9926048275F, 0.9926438503F, 0.9926827230F, 0.9927214461F, - 0.9927600199F, 0.9927984446F, 0.9928367208F, 0.9928748486F, - 0.9929128285F, 0.9929506608F, 0.9929883459F, 0.9930258841F, - 0.9930632757F, 0.9931005211F, 0.9931376207F, 0.9931745747F, - 0.9932113836F, 0.9932480476F, 0.9932845671F, 0.9933209425F, - 0.9933571742F, 0.9933932623F, 0.9934292074F, 0.9934650097F, - 0.9935006696F, 0.9935361874F, 0.9935715635F, 0.9936067982F, - 0.9936418919F, 0.9936768448F, 0.9937116574F, 0.9937463300F, - 0.9937808629F, 0.9938152565F, 0.9938495111F, 0.9938836271F, - 0.9939176047F, 0.9939514444F, 0.9939851465F, 0.9940187112F, - 0.9940521391F, 0.9940854303F, 0.9941185853F, 0.9941516044F, - 0.9941844879F, 0.9942172361F, 0.9942498495F, 0.9942823283F, - 0.9943146729F, 0.9943468836F, 0.9943789608F, 0.9944109047F, - 0.9944427158F, 0.9944743944F, 0.9945059408F, 0.9945373553F, - 0.9945686384F, 0.9945997902F, 0.9946308112F, 0.9946617017F, - 0.9946924621F, 0.9947230926F, 0.9947535937F, 0.9947839656F, - 0.9948142086F, 0.9948443232F, 0.9948743097F, 0.9949041683F, - 0.9949338995F, 0.9949635035F, 0.9949929807F, 0.9950223315F, - 0.9950515561F, 0.9950806549F, 0.9951096282F, 0.9951384764F, - 0.9951671998F, 0.9951957987F, 0.9952242735F, 0.9952526245F, - 0.9952808520F, 0.9953089564F, 0.9953369380F, 0.9953647971F, - 0.9953925340F, 0.9954201491F, 0.9954476428F, 0.9954750153F, - 0.9955022670F, 0.9955293981F, 0.9955564092F, 0.9955833003F, - 0.9956100720F, 0.9956367245F, 0.9956632582F, 0.9956896733F, - 0.9957159703F, 0.9957421494F, 0.9957682110F, 0.9957941553F, - 0.9958199828F, 0.9958456937F, 0.9958712884F, 0.9958967672F, - 0.9959221305F, 0.9959473784F, 0.9959725115F, 0.9959975300F, - 0.9960224342F, 0.9960472244F, 0.9960719011F, 0.9960964644F, - 0.9961209148F, 0.9961452525F, 0.9961694779F, 0.9961935913F, - 0.9962175930F, 0.9962414834F, 0.9962652627F, 0.9962889313F, - 0.9963124895F, 0.9963359377F, 0.9963592761F, 0.9963825051F, - 0.9964056250F, 0.9964286361F, 0.9964515387F, 0.9964743332F, - 0.9964970198F, 0.9965195990F, 0.9965420709F, 0.9965644360F, - 0.9965866946F, 0.9966088469F, 0.9966308932F, 0.9966528340F, - 0.9966746695F, 0.9966964001F, 0.9967180260F, 0.9967395475F, - 0.9967609651F, 0.9967822789F, 0.9968034894F, 0.9968245968F, - 0.9968456014F, 0.9968665036F, 0.9968873037F, 0.9969080019F, - 0.9969285987F, 0.9969490942F, 0.9969694889F, 0.9969897830F, - 0.9970099769F, 0.9970300708F, 0.9970500651F, 0.9970699601F, - 0.9970897561F, 0.9971094533F, 0.9971290522F, 0.9971485531F, - 0.9971679561F, 0.9971872617F, 0.9972064702F, 0.9972255818F, - 0.9972445968F, 0.9972635157F, 0.9972823386F, 0.9973010659F, - 0.9973196980F, 0.9973382350F, 0.9973566773F, 0.9973750253F, - 0.9973932791F, 0.9974114392F, 0.9974295059F, 0.9974474793F, - 0.9974653599F, 0.9974831480F, 0.9975008438F, 0.9975184476F, - 0.9975359598F, 0.9975533806F, 0.9975707104F, 0.9975879495F, - 0.9976050981F, 0.9976221566F, 0.9976391252F, 0.9976560043F, - 0.9976727941F, 0.9976894950F, 0.9977061073F, 0.9977226312F, - 0.9977390671F, 0.9977554152F, 0.9977716759F, 0.9977878495F, - 0.9978039361F, 0.9978199363F, 0.9978358501F, 0.9978516780F, - 0.9978674202F, 0.9978830771F, 0.9978986488F, 0.9979141358F, - 0.9979295383F, 0.9979448566F, 0.9979600909F, 0.9979752417F, - 0.9979903091F, 0.9980052936F, 0.9980201952F, 0.9980350145F, - 0.9980497515F, 0.9980644067F, 0.9980789804F, 0.9980934727F, - 0.9981078841F, 0.9981222147F, 0.9981364649F, 0.9981506350F, - 0.9981647253F, 0.9981787360F, 0.9981926674F, 0.9982065199F, - 0.9982202936F, 0.9982339890F, 0.9982476062F, 0.9982611456F, - 0.9982746074F, 0.9982879920F, 0.9983012996F, 0.9983145304F, - 0.9983276849F, 0.9983407632F, 0.9983537657F, 0.9983666926F, - 0.9983795442F, 0.9983923208F, 0.9984050226F, 0.9984176501F, - 0.9984302033F, 0.9984426827F, 0.9984550884F, 0.9984674208F, - 0.9984796802F, 0.9984918667F, 0.9985039808F, 0.9985160227F, - 0.9985279926F, 0.9985398909F, 0.9985517177F, 0.9985634734F, - 0.9985751583F, 0.9985867727F, 0.9985983167F, 0.9986097907F, - 0.9986211949F, 0.9986325297F, 0.9986437953F, 0.9986549919F, - 0.9986661199F, 0.9986771795F, 0.9986881710F, 0.9986990946F, - 0.9987099507F, 0.9987207394F, 0.9987314611F, 0.9987421161F, - 0.9987527045F, 0.9987632267F, 0.9987736829F, 0.9987840734F, - 0.9987943985F, 0.9988046584F, 0.9988148534F, 0.9988249838F, - 0.9988350498F, 0.9988450516F, 0.9988549897F, 0.9988648641F, - 0.9988746753F, 0.9988844233F, 0.9988941086F, 0.9989037313F, - 0.9989132918F, 0.9989227902F, 0.9989322269F, 0.9989416021F, - 0.9989509160F, 0.9989601690F, 0.9989693613F, 0.9989784931F, - 0.9989875647F, 0.9989965763F, 0.9990055283F, 0.9990144208F, - 0.9990232541F, 0.9990320286F, 0.9990407443F, 0.9990494016F, - 0.9990580008F, 0.9990665421F, 0.9990750257F, 0.9990834519F, - 0.9990918209F, 0.9991001331F, 0.9991083886F, 0.9991165877F, - 0.9991247307F, 0.9991328177F, 0.9991408491F, 0.9991488251F, - 0.9991567460F, 0.9991646119F, 0.9991724232F, 0.9991801801F, - 0.9991878828F, 0.9991955316F, 0.9992031267F, 0.9992106684F, - 0.9992181569F, 0.9992255925F, 0.9992329753F, 0.9992403057F, - 0.9992475839F, 0.9992548101F, 0.9992619846F, 0.9992691076F, - 0.9992761793F, 0.9992832001F, 0.9992901701F, 0.9992970895F, - 0.9993039587F, 0.9993107777F, 0.9993175470F, 0.9993242667F, - 0.9993309371F, 0.9993375583F, 0.9993441307F, 0.9993506545F, - 0.9993571298F, 0.9993635570F, 0.9993699362F, 0.9993762678F, - 0.9993825519F, 0.9993887887F, 0.9993949785F, 0.9994011216F, - 0.9994072181F, 0.9994132683F, 0.9994192725F, 0.9994252307F, - 0.9994311434F, 0.9994370107F, 0.9994428327F, 0.9994486099F, - 0.9994543423F, 0.9994600303F, 0.9994656739F, 0.9994712736F, - 0.9994768294F, 0.9994823417F, 0.9994878105F, 0.9994932363F, - 0.9994986191F, 0.9995039592F, 0.9995092568F, 0.9995145122F, - 0.9995197256F, 0.9995248971F, 0.9995300270F, 0.9995351156F, - 0.9995401630F, 0.9995451695F, 0.9995501352F, 0.9995550604F, - 0.9995599454F, 0.9995647903F, 0.9995695953F, 0.9995743607F, - 0.9995790866F, 0.9995837734F, 0.9995884211F, 0.9995930300F, - 0.9995976004F, 0.9996021324F, 0.9996066263F, 0.9996110822F, - 0.9996155004F, 0.9996198810F, 0.9996242244F, 0.9996285306F, - 0.9996327999F, 0.9996370326F, 0.9996412287F, 0.9996453886F, - 0.9996495125F, 0.9996536004F, 0.9996576527F, 0.9996616696F, - 0.9996656512F, 0.9996695977F, 0.9996735094F, 0.9996773865F, - 0.9996812291F, 0.9996850374F, 0.9996888118F, 0.9996925523F, - 0.9996962591F, 0.9996999325F, 0.9997035727F, 0.9997071798F, - 0.9997107541F, 0.9997142957F, 0.9997178049F, 0.9997212818F, - 0.9997247266F, 0.9997281396F, 0.9997315209F, 0.9997348708F, - 0.9997381893F, 0.9997414767F, 0.9997447333F, 0.9997479591F, - 0.9997511544F, 0.9997543194F, 0.9997574542F, 0.9997605591F, - 0.9997636342F, 0.9997666797F, 0.9997696958F, 0.9997726828F, - 0.9997756407F, 0.9997785698F, 0.9997814703F, 0.9997843423F, - 0.9997871860F, 0.9997900016F, 0.9997927894F, 0.9997955494F, - 0.9997982818F, 0.9998009869F, 0.9998036648F, 0.9998063157F, - 0.9998089398F, 0.9998115373F, 0.9998141082F, 0.9998166529F, - 0.9998191715F, 0.9998216642F, 0.9998241311F, 0.9998265724F, - 0.9998289884F, 0.9998313790F, 0.9998337447F, 0.9998360854F, - 0.9998384015F, 0.9998406930F, 0.9998429602F, 0.9998452031F, - 0.9998474221F, 0.9998496171F, 0.9998517885F, 0.9998539364F, - 0.9998560610F, 0.9998581624F, 0.9998602407F, 0.9998622962F, - 0.9998643291F, 0.9998663394F, 0.9998683274F, 0.9998702932F, - 0.9998722370F, 0.9998741589F, 0.9998760591F, 0.9998779378F, - 0.9998797952F, 0.9998816313F, 0.9998834464F, 0.9998852406F, - 0.9998870141F, 0.9998887670F, 0.9998904995F, 0.9998922117F, - 0.9998939039F, 0.9998955761F, 0.9998972285F, 0.9998988613F, - 0.9999004746F, 0.9999020686F, 0.9999036434F, 0.9999051992F, - 0.9999067362F, 0.9999082544F, 0.9999097541F, 0.9999112354F, - 0.9999126984F, 0.9999141433F, 0.9999155703F, 0.9999169794F, - 0.9999183709F, 0.9999197449F, 0.9999211014F, 0.9999224408F, - 0.9999237631F, 0.9999250684F, 0.9999263570F, 0.9999276289F, - 0.9999288843F, 0.9999301233F, 0.9999313461F, 0.9999325529F, - 0.9999337437F, 0.9999349187F, 0.9999360780F, 0.9999372218F, - 0.9999383503F, 0.9999394635F, 0.9999405616F, 0.9999416447F, - 0.9999427129F, 0.9999437665F, 0.9999448055F, 0.9999458301F, - 0.9999468404F, 0.9999478365F, 0.9999488185F, 0.9999497867F, - 0.9999507411F, 0.9999516819F, 0.9999526091F, 0.9999535230F, - 0.9999544236F, 0.9999553111F, 0.9999561856F, 0.9999570472F, - 0.9999578960F, 0.9999587323F, 0.9999595560F, 0.9999603674F, - 0.9999611666F, 0.9999619536F, 0.9999627286F, 0.9999634917F, - 0.9999642431F, 0.9999649828F, 0.9999657110F, 0.9999664278F, - 0.9999671334F, 0.9999678278F, 0.9999685111F, 0.9999691835F, - 0.9999698451F, 0.9999704960F, 0.9999711364F, 0.9999717662F, - 0.9999723858F, 0.9999729950F, 0.9999735942F, 0.9999741834F, - 0.9999747626F, 0.9999753321F, 0.9999758919F, 0.9999764421F, - 0.9999769828F, 0.9999775143F, 0.9999780364F, 0.9999785495F, - 0.9999790535F, 0.9999795485F, 0.9999800348F, 0.9999805124F, - 0.9999809813F, 0.9999814417F, 0.9999818938F, 0.9999823375F, - 0.9999827731F, 0.9999832005F, 0.9999836200F, 0.9999840316F, - 0.9999844353F, 0.9999848314F, 0.9999852199F, 0.9999856008F, - 0.9999859744F, 0.9999863407F, 0.9999866997F, 0.9999870516F, - 0.9999873965F, 0.9999877345F, 0.9999880656F, 0.9999883900F, - 0.9999887078F, 0.9999890190F, 0.9999893237F, 0.9999896220F, - 0.9999899140F, 0.9999901999F, 0.9999904796F, 0.9999907533F, - 0.9999910211F, 0.9999912830F, 0.9999915391F, 0.9999917896F, - 0.9999920345F, 0.9999922738F, 0.9999925077F, 0.9999927363F, - 0.9999929596F, 0.9999931777F, 0.9999933907F, 0.9999935987F, - 0.9999938018F, 0.9999940000F, 0.9999941934F, 0.9999943820F, - 0.9999945661F, 0.9999947456F, 0.9999949206F, 0.9999950912F, - 0.9999952575F, 0.9999954195F, 0.9999955773F, 0.9999957311F, - 0.9999958807F, 0.9999960265F, 0.9999961683F, 0.9999963063F, - 0.9999964405F, 0.9999965710F, 0.9999966979F, 0.9999968213F, - 0.9999969412F, 0.9999970576F, 0.9999971707F, 0.9999972805F, - 0.9999973871F, 0.9999974905F, 0.9999975909F, 0.9999976881F, - 0.9999977824F, 0.9999978738F, 0.9999979624F, 0.9999980481F, - 0.9999981311F, 0.9999982115F, 0.9999982892F, 0.9999983644F, - 0.9999984370F, 0.9999985072F, 0.9999985750F, 0.9999986405F, - 0.9999987037F, 0.9999987647F, 0.9999988235F, 0.9999988802F, - 0.9999989348F, 0.9999989873F, 0.9999990379F, 0.9999990866F, - 0.9999991334F, 0.9999991784F, 0.9999992217F, 0.9999992632F, - 0.9999993030F, 0.9999993411F, 0.9999993777F, 0.9999994128F, - 0.9999994463F, 0.9999994784F, 0.9999995091F, 0.9999995384F, - 0.9999995663F, 0.9999995930F, 0.9999996184F, 0.9999996426F, - 0.9999996657F, 0.9999996876F, 0.9999997084F, 0.9999997282F, - 0.9999997469F, 0.9999997647F, 0.9999997815F, 0.9999997973F, - 0.9999998123F, 0.9999998265F, 0.9999998398F, 0.9999998524F, - 0.9999998642F, 0.9999998753F, 0.9999998857F, 0.9999998954F, - 0.9999999045F, 0.9999999130F, 0.9999999209F, 0.9999999282F, - 0.9999999351F, 0.9999999414F, 0.9999999472F, 0.9999999526F, - 0.9999999576F, 0.9999999622F, 0.9999999664F, 0.9999999702F, - 0.9999999737F, 0.9999999769F, 0.9999999798F, 0.9999999824F, - 0.9999999847F, 0.9999999868F, 0.9999999887F, 0.9999999904F, - 0.9999999919F, 0.9999999932F, 0.9999999943F, 0.9999999953F, - 0.9999999961F, 0.9999999969F, 0.9999999975F, 0.9999999980F, - 0.9999999985F, 0.9999999988F, 0.9999999991F, 0.9999999993F, - 0.9999999995F, 0.9999999997F, 0.9999999998F, 0.9999999999F, - 0.9999999999F, 1.0000000000F, 1.0000000000F, 1.0000000000F, - 1.0000000000F, 1.0000000000F, 1.0000000000F, 1.0000000000F, -}; - -const float ff_vorbis_floor1_inverse_db_table[256]={ - 1.0649863e-07F, 1.1341951e-07F, 1.2079015e-07F, 1.2863978e-07F, - 1.3699951e-07F, 1.4590251e-07F, 1.5538408e-07F, 1.6548181e-07F, - 1.7623575e-07F, 1.8768855e-07F, 1.9988561e-07F, 2.128753e-07F, - 2.2670913e-07F, 2.4144197e-07F, 2.5713223e-07F, 2.7384213e-07F, - 2.9163793e-07F, 3.1059021e-07F, 3.3077411e-07F, 3.5226968e-07F, - 3.7516214e-07F, 3.9954229e-07F, 4.2550680e-07F, 4.5315863e-07F, - 4.8260743e-07F, 5.1396998e-07F, 5.4737065e-07F, 5.8294187e-07F, - 6.2082472e-07F, 6.6116941e-07F, 7.0413592e-07F, 7.4989464e-07F, - 7.9862701e-07F, 8.5052630e-07F, 9.0579828e-07F, 9.6466216e-07F, - 1.0273513e-06F, 1.0941144e-06F, 1.1652161e-06F, 1.2409384e-06F, - 1.3215816e-06F, 1.4074654e-06F, 1.4989305e-06F, 1.5963394e-06F, - 1.7000785e-06F, 1.8105592e-06F, 1.9282195e-06F, 2.0535261e-06F, - 2.1869758e-06F, 2.3290978e-06F, 2.4804557e-06F, 2.6416497e-06F, - 2.8133190e-06F, 2.9961443e-06F, 3.1908506e-06F, 3.3982101e-06F, - 3.6190449e-06F, 3.8542308e-06F, 4.1047004e-06F, 4.3714470e-06F, - 4.6555282e-06F, 4.9580707e-06F, 5.2802740e-06F, 5.6234160e-06F, - 5.9888572e-06F, 6.3780469e-06F, 6.7925283e-06F, 7.2339451e-06F, - 7.7040476e-06F, 8.2047000e-06F, 8.7378876e-06F, 9.3057248e-06F, - 9.9104632e-06F, 1.0554501e-05F, 1.1240392e-05F, 1.1970856e-05F, - 1.2748789e-05F, 1.3577278e-05F, 1.4459606e-05F, 1.5399272e-05F, - 1.6400004e-05F, 1.7465768e-05F, 1.8600792e-05F, 1.9809576e-05F, - 2.1096914e-05F, 2.2467911e-05F, 2.3928002e-05F, 2.5482978e-05F, - 2.7139006e-05F, 2.8902651e-05F, 3.0780908e-05F, 3.2781225e-05F, - 3.4911534e-05F, 3.7180282e-05F, 3.9596466e-05F, 4.2169667e-05F, - 4.4910090e-05F, 4.7828601e-05F, 5.0936773e-05F, 5.4246931e-05F, - 5.7772202e-05F, 6.1526565e-05F, 6.5524908e-05F, 6.9783085e-05F, - 7.4317983e-05F, 7.9147585e-05F, 8.4291040e-05F, 8.9768747e-05F, - 9.5602426e-05F, 0.00010181521F, 0.00010843174F, 0.00011547824F, - 0.00012298267F, 0.00013097477F, 0.00013948625F, 0.00014855085F, - 0.00015820453F, 0.00016848555F, 0.00017943469F, 0.00019109536F, - 0.00020351382F, 0.00021673929F, 0.00023082423F, 0.00024582449F, - 0.00026179955F, 0.00027881276F, 0.00029693158F, 0.00031622787F, - 0.00033677814F, 0.00035866388F, 0.00038197188F, 0.00040679456F, - 0.00043323036F, 0.00046138411F, 0.00049136745F, 0.00052329927F, - 0.00055730621F, 0.00059352311F, 0.00063209358F, 0.00067317058F, - 0.00071691700F, 0.00076350630F, 0.00081312324F, 0.00086596457F, - 0.00092223983F, 0.00098217216F, 0.0010459992F, 0.0011139742F, - 0.0011863665F, 0.0012634633F, 0.0013455702F, 0.0014330129F, - 0.0015261382F, 0.0016253153F, 0.0017309374F, 0.0018434235F, - 0.0019632195F, 0.0020908006F, 0.0022266726F, 0.0023713743F, - 0.0025254795F, 0.0026895994F, 0.0028643847F, 0.0030505286F, - 0.0032487691F, 0.0034598925F, 0.0036847358F, 0.0039241906F, - 0.0041792066F, 0.0044507950F, 0.0047400328F, 0.0050480668F, - 0.0053761186F, 0.0057254891F, 0.0060975636F, 0.0064938176F, - 0.0069158225F, 0.0073652516F, 0.0078438871F, 0.0083536271F, - 0.0088964928F, 0.009474637F, 0.010090352F, 0.010746080F, - 0.011444421F, 0.012188144F, 0.012980198F, 0.013823725F, - 0.014722068F, 0.015678791F, 0.016697687F, 0.017782797F, - 0.018938423F, 0.020169149F, 0.021479854F, 0.022875735F, - 0.024362330F, 0.025945531F, 0.027631618F, 0.029427276F, - 0.031339626F, 0.033376252F, 0.035545228F, 0.037855157F, - 0.040315199F, 0.042935108F, 0.045725273F, 0.048696758F, - 0.051861348F, 0.055231591F, 0.058820850F, 0.062643361F, - 0.066714279F, 0.071049749F, 0.075666962F, 0.080584227F, - 0.085821044F, 0.091398179F, 0.097337747F, 0.10366330F, - 0.11039993F, 0.11757434F, 0.12521498F, 0.13335215F, - 0.14201813F, 0.15124727F, 0.16107617F, 0.17154380F, - 0.18269168F, 0.19456402F, 0.20720788F, 0.22067342F, - 0.23501402F, 0.25028656F, 0.26655159F, 0.28387361F, - 0.30232132F, 0.32196786F, 0.34289114F, 0.36517414F, - 0.38890521F, 0.41417847F, 0.44109412F, 0.46975890F, - 0.50028648F, 0.53279791F, 0.56742212F, 0.60429640F, - 0.64356699F, 0.68538959F, 0.72993007F, 0.77736504F, - 0.82788260F, 0.88168307F, 0.9389798F, 1.F, -}; - -const float * const ff_vorbis_vwin[8] = { - vwin64, vwin128, vwin256, vwin512, - vwin1024, vwin2048, vwin4096, vwin8192 -}; diff --git a/media/ffvpx/libavcodec/vorbis_data.h b/media/ffvpx/libavcodec/vorbis_data.h deleted file mode 100644 index 0fe19e509f3c..000000000000 --- a/media/ffvpx/libavcodec/vorbis_data.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * This file is part of FFmpeg. - * - * FFmpeg 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. - * - * FFmpeg 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef AVCODEC_VORBIS_DATA_H -#define AVCODEC_VORBIS_DATA_H - -#include - -#include "libavutil/channel_layout.h" - -extern const float ff_vorbis_floor1_inverse_db_table[256]; -extern const float * const ff_vorbis_vwin[8]; -extern const uint8_t ff_vorbis_channel_layout_offsets[8][8]; -#if FF_API_OLD_CHANNEL_LAYOUT -extern const uint64_t ff_vorbis_channel_layouts[9]; -#endif -extern const AVChannelLayout ff_vorbis_ch_layouts[9]; - -#endif /* AVCODEC_VORBIS_DATA_H */ diff --git a/media/ffvpx/libavutil/avutil.symbols b/media/ffvpx/libavutil/avutil.symbols index 376bc3fdeb5b..aefd9b731098 100644 --- a/media/ffvpx/libavutil/avutil.symbols +++ b/media/ffvpx/libavutil/avutil.symbols @@ -31,12 +31,10 @@ av_buffer_ref av_buffer_unref av_calloc av_channel_layout_check -av_channel_layout_compare av_channel_layout_copy -av_channel_layout_default -av_channel_layout_describe +av_channel_layout_compare av_channel_layout_extract_channel -av_channel_layout_from_mask +av_channel_layout_describe av_channel_layout_from_mask av_channel_layout_uninit av_chroma_location_name @@ -69,8 +67,6 @@ av_dict_set av_dict_set_int av_dirname av_div_q -av_dynamic_hdr_plus_from_t35 -av_dynamic_hdr_plus_create_side_data av_dynarray2_add av_dynarray_add av_dynarray_add_nofree @@ -151,6 +147,7 @@ av_get_pix_fmt_name av_get_pix_fmt_string av_get_planar_sample_fmt av_get_sample_fmt +av_get_sample_fmt_name av_get_sample_fmt_string av_get_standard_channel_layout av_get_time_base_q @@ -327,4 +324,3 @@ av_hwdevice_ctx_init av_hwframe_transfer_get_formats av_hwdevice_ctx_create_derived av_malloc_array -av_get_sample_fmt_name diff --git a/media/ffvpx/libavutil/frame.c b/media/ffvpx/libavutil/frame.c index 5c9afb0d036e..9545477acc95 100644 --- a/media/ffvpx/libavutil/frame.c +++ b/media/ffvpx/libavutil/frame.c @@ -48,12 +48,8 @@ FF_DISABLE_DEPRECATION_WARNINGS frame->pkt_duration = 0; FF_ENABLE_DEPRECATION_WARNINGS #endif -#if FF_API_FRAME_PKT -FF_DISABLE_DEPRECATION_WARNINGS frame->pkt_pos = -1; frame->pkt_size = -1; -FF_ENABLE_DEPRECATION_WARNINGS -#endif frame->time_base = (AVRational){ 0, 1 }; frame->key_frame = 1; frame->sample_aspect_ratio = (AVRational){ 0, 1 }; @@ -283,12 +279,8 @@ static int frame_copy_props(AVFrame *dst, const AVFrame *src, int force_copy) dst->sample_rate = src->sample_rate; dst->opaque = src->opaque; dst->pkt_dts = src->pkt_dts; -#if FF_API_FRAME_PKT -FF_DISABLE_DEPRECATION_WARNINGS dst->pkt_pos = src->pkt_pos; dst->pkt_size = src->pkt_size; -FF_ENABLE_DEPRECATION_WARNINGS -#endif #if FF_API_PKT_DURATION FF_DISABLE_DEPRECATION_WARNINGS dst->pkt_duration = src->pkt_duration; diff --git a/media/ffvpx/libavutil/frame.h b/media/ffvpx/libavutil/frame.h index 5b58c14ac32d..25802695493a 100644 --- a/media/ffvpx/libavutil/frame.h +++ b/media/ffvpx/libavutil/frame.h @@ -470,18 +470,7 @@ typedef struct AVFrame { int quality; /** - * Frame owner's private data. - * - * This field may be set by the code that allocates/owns the frame data. - * It is then not touched by any library functions, except: - * - it is copied to other references by av_frame_copy_props() (and hence by - * av_frame_ref()); - * - it is set to NULL when the frame is cleared by av_frame_unref() - * - on the caller's explicit request. E.g. libavcodec encoders/decoders - * will copy this field to/from @ref AVPacket "AVPackets" if the caller sets - * @ref AV_CODEC_FLAG_COPY_OPAQUE. - * - * @see opaque_ref the reference-counted analogue + * for some private data of the user */ void *opaque; @@ -622,17 +611,12 @@ typedef struct AVFrame { */ int64_t best_effort_timestamp; -#if FF_API_FRAME_PKT /** * reordered pos from the last AVPacket that has been input into the decoder * - encoding: unused * - decoding: Read by user. - * @deprecated use AV_CODEC_FLAG_COPY_OPAQUE to pass through arbitrary user - * data from packets to frames */ - attribute_deprecated int64_t pkt_pos; -#endif #if FF_API_PKT_DURATION /** @@ -678,19 +662,14 @@ typedef struct AVFrame { int channels; #endif -#if FF_API_FRAME_PKT /** * size of the corresponding packet containing the compressed * frame. * It is set to a negative value if unknown. * - encoding: unused * - decoding: set by libavcodec, read by user. - * @deprecated use AV_CODEC_FLAG_COPY_OPAQUE to pass through arbitrary user - * data from packets to frames */ - attribute_deprecated int pkt_size; -#endif /** * For hwaccel-format frames, this should be a reference to the @@ -699,18 +678,13 @@ typedef struct AVFrame { AVBufferRef *hw_frames_ctx; /** - * Frame owner's private data. + * AVBufferRef for free use by the API user. FFmpeg will never check the + * contents of the buffer ref. FFmpeg calls av_buffer_unref() on it when + * the frame is unreferenced. av_frame_copy_props() calls create a new + * reference with av_buffer_ref() for the target frame's opaque_ref field. * - * This field may be set by the code that allocates/owns the frame data. - * It is then not touched by any library functions, except: - * - a new reference to the underlying buffer is propagated by - * av_frame_copy_props() (and hence by av_frame_ref()); - * - it is unreferenced in av_frame_unref(); - * - on the caller's explicit request. E.g. libavcodec encoders/decoders - * will propagate a new reference to/from @ref AVPacket "AVPackets" if the - * caller sets @ref AV_CODEC_FLAG_COPY_OPAQUE. - * - * @see opaque the plain pointer analogue + * This is unrelated to the opaque field, although it serves a similar + * purpose. */ AVBufferRef *opaque_ref; diff --git a/media/ffvpx/libavutil/hdr_dynamic_metadata.c b/media/ffvpx/libavutil/hdr_dynamic_metadata.c deleted file mode 100644 index d458788c32ca..000000000000 --- a/media/ffvpx/libavutil/hdr_dynamic_metadata.c +++ /dev/null @@ -1,385 +0,0 @@ -/** - * Copyright (c) 2018 Mohammad Izadi - * - * This file is part of FFmpeg. - * - * FFmpeg 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. - * - * FFmpeg 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "hdr_dynamic_metadata.h" -#include "mem.h" -#include "libavcodec/defs.h" -#include "libavcodec/get_bits.h" -#include "libavcodec/put_bits.h" - -#define T35_PAYLOAD_MAX_SIZE 907 - -static const int64_t luminance_den = 1; -static const int32_t peak_luminance_den = 15; -static const int64_t rgb_den = 100000; -static const int32_t fraction_pixel_den = 1000; -static const int32_t knee_point_den = 4095; -static const int32_t bezier_anchor_den = 1023; -static const int32_t saturation_weight_den = 8; - -AVDynamicHDRPlus *av_dynamic_hdr_plus_alloc(size_t *size) -{ - AVDynamicHDRPlus *hdr_plus = av_mallocz(sizeof(AVDynamicHDRPlus)); - if (!hdr_plus) - return NULL; - - if (size) - *size = sizeof(*hdr_plus); - - return hdr_plus; -} - -AVDynamicHDRPlus *av_dynamic_hdr_plus_create_side_data(AVFrame *frame) -{ - AVFrameSideData *side_data = av_frame_new_side_data(frame, - AV_FRAME_DATA_DYNAMIC_HDR_PLUS, - sizeof(AVDynamicHDRPlus)); - if (!side_data) - return NULL; - - memset(side_data->data, 0, sizeof(AVDynamicHDRPlus)); - - return (AVDynamicHDRPlus *)side_data->data; -} - -int av_dynamic_hdr_plus_from_t35(AVDynamicHDRPlus *s, const uint8_t *data, - size_t size) -{ - uint8_t padded_buf[T35_PAYLOAD_MAX_SIZE + AV_INPUT_BUFFER_PADDING_SIZE]; - GetBitContext gbc, *gb = &gbc; - int ret; - - if (!s) - return AVERROR(ENOMEM); - - if (size > T35_PAYLOAD_MAX_SIZE) - return AVERROR(EINVAL); - - memcpy(padded_buf, data, size); - // Zero-initialize the buffer padding to avoid overreads into uninitialized data. - memset(padded_buf + size, 0, AV_INPUT_BUFFER_PADDING_SIZE); - - ret = init_get_bits8(gb, padded_buf, size); - if (ret < 0) - return ret; - - if (get_bits_left(gb) < 10) - return AVERROR_INVALIDDATA; - - s->application_version = get_bits(gb, 8); - s->num_windows = get_bits(gb, 2); - - if (s->num_windows < 1 || s->num_windows > 3) { - return AVERROR_INVALIDDATA; - } - - if (get_bits_left(gb) < ((19 * 8 + 1) * (s->num_windows - 1))) - return AVERROR_INVALIDDATA; - - for (int w = 1; w < s->num_windows; w++) { - // The corners are set to absolute coordinates here. They should be - // converted to the relative coordinates (in [0, 1]) in the decoder. - AVHDRPlusColorTransformParams *params = &s->params[w]; - params->window_upper_left_corner_x = - (AVRational){get_bits(gb, 16), 1}; - params->window_upper_left_corner_y = - (AVRational){get_bits(gb, 16), 1}; - params->window_lower_right_corner_x = - (AVRational){get_bits(gb, 16), 1}; - params->window_lower_right_corner_y = - (AVRational){get_bits(gb, 16), 1}; - - params->center_of_ellipse_x = get_bits(gb, 16); - params->center_of_ellipse_y = get_bits(gb, 16); - params->rotation_angle = get_bits(gb, 8); - params->semimajor_axis_internal_ellipse = get_bits(gb, 16); - params->semimajor_axis_external_ellipse = get_bits(gb, 16); - params->semiminor_axis_external_ellipse = get_bits(gb, 16); - params->overlap_process_option = get_bits1(gb); - } - - if (get_bits_left(gb) < 28) - return AVERROR_INVALIDDATA; - - s->targeted_system_display_maximum_luminance = - (AVRational){get_bits_long(gb, 27), luminance_den}; - s->targeted_system_display_actual_peak_luminance_flag = get_bits1(gb); - - if (s->targeted_system_display_actual_peak_luminance_flag) { - int rows, cols; - if (get_bits_left(gb) < 10) - return AVERROR_INVALIDDATA; - rows = get_bits(gb, 5); - cols = get_bits(gb, 5); - if (((rows < 2) || (rows > 25)) || ((cols < 2) || (cols > 25))) { - return AVERROR_INVALIDDATA; - } - s->num_rows_targeted_system_display_actual_peak_luminance = rows; - s->num_cols_targeted_system_display_actual_peak_luminance = cols; - - if (get_bits_left(gb) < (rows * cols * 4)) - return AVERROR_INVALIDDATA; - - for (int i = 0; i < rows; i++) { - for (int j = 0; j < cols; j++) { - s->targeted_system_display_actual_peak_luminance[i][j] = - (AVRational){get_bits(gb, 4), peak_luminance_den}; - } - } - } - for (int w = 0; w < s->num_windows; w++) { - AVHDRPlusColorTransformParams *params = &s->params[w]; - if (get_bits_left(gb) < (3 * 17 + 17 + 4)) - return AVERROR_INVALIDDATA; - - for (int i = 0; i < 3; i++) { - params->maxscl[i] = - (AVRational){get_bits(gb, 17), rgb_den}; - } - params->average_maxrgb = - (AVRational){get_bits(gb, 17), rgb_den}; - params->num_distribution_maxrgb_percentiles = get_bits(gb, 4); - - if (get_bits_left(gb) < - (params->num_distribution_maxrgb_percentiles * 24)) - return AVERROR_INVALIDDATA; - - for (int i = 0; i < params->num_distribution_maxrgb_percentiles; i++) { - params->distribution_maxrgb[i].percentage = get_bits(gb, 7); - params->distribution_maxrgb[i].percentile = - (AVRational){get_bits(gb, 17), rgb_den}; - } - - if (get_bits_left(gb) < 10) - return AVERROR_INVALIDDATA; - - params->fraction_bright_pixels = (AVRational){get_bits(gb, 10), fraction_pixel_den}; - } - if (get_bits_left(gb) < 1) - return AVERROR_INVALIDDATA; - s->mastering_display_actual_peak_luminance_flag = get_bits1(gb); - if (s->mastering_display_actual_peak_luminance_flag) { - int rows, cols; - if (get_bits_left(gb) < 10) - return AVERROR_INVALIDDATA; - rows = get_bits(gb, 5); - cols = get_bits(gb, 5); - if (((rows < 2) || (rows > 25)) || ((cols < 2) || (cols > 25))) { - return AVERROR_INVALIDDATA; - } - s->num_rows_mastering_display_actual_peak_luminance = rows; - s->num_cols_mastering_display_actual_peak_luminance = cols; - - if (get_bits_left(gb) < (rows * cols * 4)) - return AVERROR_INVALIDDATA; - - for (int i = 0; i < rows; i++) { - for (int j = 0; j < cols; j++) { - s->mastering_display_actual_peak_luminance[i][j] = - (AVRational){get_bits(gb, 4), peak_luminance_den}; - } - } - } - - for (int w = 0; w < s->num_windows; w++) { - AVHDRPlusColorTransformParams *params = &s->params[w]; - if (get_bits_left(gb) < 1) - return AVERROR_INVALIDDATA; - - params->tone_mapping_flag = get_bits1(gb); - if (params->tone_mapping_flag) { - if (get_bits_left(gb) < 28) - return AVERROR_INVALIDDATA; - - params->knee_point_x = - (AVRational){get_bits(gb, 12), knee_point_den}; - params->knee_point_y = - (AVRational){get_bits(gb, 12), knee_point_den}; - params->num_bezier_curve_anchors = get_bits(gb, 4); - - if (get_bits_left(gb) < (params->num_bezier_curve_anchors * 10)) - return AVERROR_INVALIDDATA; - - for (int i = 0; i < params->num_bezier_curve_anchors; i++) { - params->bezier_curve_anchors[i] = - (AVRational){get_bits(gb, 10), bezier_anchor_den}; - } - } - - if (get_bits_left(gb) < 1) - return AVERROR_INVALIDDATA; - params->color_saturation_mapping_flag = get_bits1(gb); - if (params->color_saturation_mapping_flag) { - if (get_bits_left(gb) < 6) - return AVERROR_INVALIDDATA; - params->color_saturation_weight = - (AVRational){get_bits(gb, 6), saturation_weight_den}; - } - } - - return 0; -} - -int av_dynamic_hdr_plus_to_t35(const AVDynamicHDRPlus *s, uint8_t **data, size_t *size) -{ - uint8_t *buf; - size_t size_bits, size_bytes; - PutBitContext pbc, *pb = &pbc; - - if (!s || !data) - return AVERROR(EINVAL); - - /** - * Buffer size per CTA-861-H p.253-254: - * 48 header bits (excluded from the serialized payload) - * 8 bits for application_mode - * 2 bits for num_windows - * 153 bits for window geometry, for each window above 1 - * 27 bits for targeted_system_display_maximum_luminance - * 1-2511 bits for targeted system display peak luminance information - * 82-442 bits per window for pixel distribution information - * 1-2511 bits for mastering display peak luminance information - * 1-179 bits per window for tonemapping information - * 1-7 bits per window for color saturation mapping information - * Total: 123-7249 bits, excluding trimmed header bits - */ - size_bits = 8; - - size_bits += 2; - - for (int w = 1; w < s->num_windows; w++) - size_bits += 153; - - size_bits += 27; - - size_bits += 1; - if (s->targeted_system_display_actual_peak_luminance_flag) - size_bits += 10 + - s->num_rows_targeted_system_display_actual_peak_luminance * - s->num_cols_targeted_system_display_actual_peak_luminance * 4; - - for (int w = 0; w < s->num_windows; w++) - size_bits += 72 + s->params[w].num_distribution_maxrgb_percentiles * 24 + 10; - - size_bits += 1; - if (s->mastering_display_actual_peak_luminance_flag) - size_bits += 10 + - s->num_rows_mastering_display_actual_peak_luminance * - s->num_cols_mastering_display_actual_peak_luminance * 4; - - for (int w = 0; w < s->num_windows; w++) { - size_bits += 1; - if (s->params[w].tone_mapping_flag) - size_bits += 28 + s->params[w].num_bezier_curve_anchors * 10; - - size_bits += 1; - if (s->params[w].color_saturation_mapping_flag) - size_bits += 6; - } - - size_bytes = (size_bits + 7) / 8; - - buf = av_mallocz(size_bytes); - if (!buf) - return AVERROR(ENOMEM); - - init_put_bits(pb, buf, size_bytes); - - // application_mode is set to Application Version 1 - put_bits(pb, 8, 1); - - // Payload as per CTA-861-H p.253-254 - put_bits(pb, 2, s->num_windows); - - for (int w = 1; w < s->num_windows; w++) { - put_bits(pb, 16, s->params[w].window_upper_left_corner_x.num / s->params[w].window_upper_left_corner_x.den); - put_bits(pb, 16, s->params[w].window_upper_left_corner_y.num / s->params[w].window_upper_left_corner_y.den); - put_bits(pb, 16, s->params[w].window_lower_right_corner_x.num / s->params[w].window_lower_right_corner_x.den); - put_bits(pb, 16, s->params[w].window_lower_right_corner_y.num / s->params[w].window_lower_right_corner_y.den); - put_bits(pb, 16, s->params[w].center_of_ellipse_x); - put_bits(pb, 16, s->params[w].center_of_ellipse_y); - put_bits(pb, 8, s->params[w].rotation_angle); - put_bits(pb, 16, s->params[w].semimajor_axis_internal_ellipse); - put_bits(pb, 16, s->params[w].semimajor_axis_external_ellipse); - put_bits(pb, 16, s->params[w].semiminor_axis_external_ellipse); - put_bits(pb, 1, s->params[w].overlap_process_option); - } - - put_bits(pb, 27, s->targeted_system_display_maximum_luminance.num * luminance_den / - s->targeted_system_display_maximum_luminance.den); - put_bits(pb, 1, s->targeted_system_display_actual_peak_luminance_flag); - if (s->targeted_system_display_actual_peak_luminance_flag) { - put_bits(pb, 5, s->num_rows_targeted_system_display_actual_peak_luminance); - put_bits(pb, 5, s->num_cols_targeted_system_display_actual_peak_luminance); - for (int i = 0; i < s->num_rows_targeted_system_display_actual_peak_luminance; i++) { - for (int j = 0; j < s->num_cols_targeted_system_display_actual_peak_luminance; j++) - put_bits(pb, 4, s->targeted_system_display_actual_peak_luminance[i][j].num * peak_luminance_den / - s->targeted_system_display_actual_peak_luminance[i][j].den); - } - } - - for (int w = 0; w < s->num_windows; w++) { - for (int i = 0; i < 3; i++) - put_bits(pb, 17, s->params[w].maxscl[i].num * rgb_den / s->params[w].maxscl[i].den); - put_bits(pb, 17, s->params[w].average_maxrgb.num * rgb_den / s->params[w].average_maxrgb.den); - put_bits(pb, 4, s->params[w].num_distribution_maxrgb_percentiles); - for (int i = 0; i < s->params[w].num_distribution_maxrgb_percentiles; i++) { - put_bits(pb, 7, s->params[w].distribution_maxrgb[i].percentage); - put_bits(pb, 17, s->params[w].distribution_maxrgb[i].percentile.num * rgb_den / - s->params[w].distribution_maxrgb[i].percentile.den); - } - put_bits(pb, 10, s->params[w].fraction_bright_pixels.num * fraction_pixel_den / - s->params[w].fraction_bright_pixels.den); - } - - put_bits(pb, 1, s->mastering_display_actual_peak_luminance_flag); - if (s->mastering_display_actual_peak_luminance_flag) { - put_bits(pb, 5, s->num_rows_mastering_display_actual_peak_luminance); - put_bits(pb, 5, s->num_cols_mastering_display_actual_peak_luminance); - for (int i = 0; i < s->num_rows_mastering_display_actual_peak_luminance; i++) { - for (int j = 0; j < s->num_cols_mastering_display_actual_peak_luminance; j++) - put_bits(pb, 4, s->mastering_display_actual_peak_luminance[i][j].num * peak_luminance_den / - s->mastering_display_actual_peak_luminance[i][j].den); - } - } - - for (int w = 0; w < s->num_windows; w++) { - put_bits(pb, 1, s->params[w].tone_mapping_flag); - if (s->params[w].tone_mapping_flag) { - put_bits(pb, 12, s->params[w].knee_point_x.num * knee_point_den / s->params[w].knee_point_x.den); - put_bits(pb, 12, s->params[w].knee_point_y.num * knee_point_den / s->params[w].knee_point_y.den); - put_bits(pb, 4, s->params[w].num_bezier_curve_anchors); - for (int i = 0; i < s->params[w].num_bezier_curve_anchors; i++) - put_bits(pb, 10, s->params[w].bezier_curve_anchors[i].num * bezier_anchor_den / - s->params[w].bezier_curve_anchors[i].den); - put_bits(pb, 1, s->params[w].color_saturation_mapping_flag); - if (s->params[w].color_saturation_mapping_flag) - put_bits(pb, 6, s->params[w].color_saturation_weight.num * saturation_weight_den / - s->params[w].color_saturation_weight.den); - } - } - - flush_put_bits(pb); - - *data = buf; - if (size) - *size = size_bytes; - return 0; -} diff --git a/media/ffvpx/libavutil/hdr_dynamic_metadata.h b/media/ffvpx/libavutil/hdr_dynamic_metadata.h deleted file mode 100644 index 771bb8f468db..000000000000 --- a/media/ffvpx/libavutil/hdr_dynamic_metadata.h +++ /dev/null @@ -1,368 +0,0 @@ -/* - * Copyright (c) 2018 Mohammad Izadi - * - * This file is part of FFmpeg. - * - * FFmpeg 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. - * - * FFmpeg 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef AVUTIL_HDR_DYNAMIC_METADATA_H -#define AVUTIL_HDR_DYNAMIC_METADATA_H - -#include "frame.h" -#include "rational.h" - -/** - * Option for overlapping elliptical pixel selectors in an image. - */ -enum AVHDRPlusOverlapProcessOption { - AV_HDR_PLUS_OVERLAP_PROCESS_WEIGHTED_AVERAGING = 0, - AV_HDR_PLUS_OVERLAP_PROCESS_LAYERING = 1, -}; - -/** - * Represents the percentile at a specific percentage in - * a distribution. - */ -typedef struct AVHDRPlusPercentile { - /** - * The percentage value corresponding to a specific percentile linearized - * RGB value in the processing window in the scene. The value shall be in - * the range of 0 to100, inclusive. - */ - uint8_t percentage; - - /** - * The linearized maxRGB value at a specific percentile in the processing - * window in the scene. The value shall be in the range of 0 to 1, inclusive - * and in multiples of 0.00001. - */ - AVRational percentile; -} AVHDRPlusPercentile; - -/** - * Color transform parameters at a processing window in a dynamic metadata for - * SMPTE 2094-40. - */ -typedef struct AVHDRPlusColorTransformParams { - /** - * The relative x coordinate of the top left pixel of the processing - * window. The value shall be in the range of 0 and 1, inclusive and - * in multiples of 1/(width of Picture - 1). The value 1 corresponds - * to the absolute coordinate of width of Picture - 1. The value for - * first processing window shall be 0. - */ - AVRational window_upper_left_corner_x; - - /** - * The relative y coordinate of the top left pixel of the processing - * window. The value shall be in the range of 0 and 1, inclusive and - * in multiples of 1/(height of Picture - 1). The value 1 corresponds - * to the absolute coordinate of height of Picture - 1. The value for - * first processing window shall be 0. - */ - AVRational window_upper_left_corner_y; - - /** - * The relative x coordinate of the bottom right pixel of the processing - * window. The value shall be in the range of 0 and 1, inclusive and - * in multiples of 1/(width of Picture - 1). The value 1 corresponds - * to the absolute coordinate of width of Picture - 1. The value for - * first processing window shall be 1. - */ - AVRational window_lower_right_corner_x; - - /** - * The relative y coordinate of the bottom right pixel of the processing - * window. The value shall be in the range of 0 and 1, inclusive and - * in multiples of 1/(height of Picture - 1). The value 1 corresponds - * to the absolute coordinate of height of Picture - 1. The value for - * first processing window shall be 1. - */ - AVRational window_lower_right_corner_y; - - /** - * The x coordinate of the center position of the concentric internal and - * external ellipses of the elliptical pixel selector in the processing - * window. The value shall be in the range of 0 to (width of Picture - 1), - * inclusive and in multiples of 1 pixel. - */ - uint16_t center_of_ellipse_x; - - /** - * The y coordinate of the center position of the concentric internal and - * external ellipses of the elliptical pixel selector in the processing - * window. The value shall be in the range of 0 to (height of Picture - 1), - * inclusive and in multiples of 1 pixel. - */ - uint16_t center_of_ellipse_y; - - /** - * The clockwise rotation angle in degree of arc with respect to the - * positive direction of the x-axis of the concentric internal and external - * ellipses of the elliptical pixel selector in the processing window. The - * value shall be in the range of 0 to 180, inclusive and in multiples of 1. - */ - uint8_t rotation_angle; - - /** - * The semi-major axis value of the internal ellipse of the elliptical pixel - * selector in amount of pixels in the processing window. The value shall be - * in the range of 1 to 65535, inclusive and in multiples of 1 pixel. - */ - uint16_t semimajor_axis_internal_ellipse; - - /** - * The semi-major axis value of the external ellipse of the elliptical pixel - * selector in amount of pixels in the processing window. The value - * shall not be less than semimajor_axis_internal_ellipse of the current - * processing window. The value shall be in the range of 1 to 65535, - * inclusive and in multiples of 1 pixel. - */ - uint16_t semimajor_axis_external_ellipse; - - /** - * The semi-minor axis value of the external ellipse of the elliptical pixel - * selector in amount of pixels in the processing window. The value shall be - * in the range of 1 to 65535, inclusive and in multiples of 1 pixel. - */ - uint16_t semiminor_axis_external_ellipse; - - /** - * Overlap process option indicates one of the two methods of combining - * rendered pixels in the processing window in an image with at least one - * elliptical pixel selector. For overlapping elliptical pixel selectors - * in an image, overlap_process_option shall have the same value. - */ - enum AVHDRPlusOverlapProcessOption overlap_process_option; - - /** - * The maximum of the color components of linearized RGB values in the - * processing window in the scene. The values should be in the range of 0 to - * 1, inclusive and in multiples of 0.00001. maxscl[ 0 ], maxscl[ 1 ], and - * maxscl[ 2 ] are corresponding to R, G, B color components respectively. - */ - AVRational maxscl[3]; - - /** - * The average of linearized maxRGB values in the processing window in the - * scene. The value should be in the range of 0 to 1, inclusive and in - * multiples of 0.00001. - */ - AVRational average_maxrgb; - - /** - * The number of linearized maxRGB values at given percentiles in the - * processing window in the scene. The maximum value shall be 15. - */ - uint8_t num_distribution_maxrgb_percentiles; - - /** - * The linearized maxRGB values at given percentiles in the - * processing window in the scene. - */ - AVHDRPlusPercentile distribution_maxrgb[15]; - - /** - * The fraction of selected pixels in the image that contains the brightest - * pixel in the scene. The value shall be in the range of 0 to 1, inclusive - * and in multiples of 0.001. - */ - AVRational fraction_bright_pixels; - - /** - * This flag indicates that the metadata for the tone mapping function in - * the processing window is present (for value of 1). - */ - uint8_t tone_mapping_flag; - - /** - * The x coordinate of the separation point between the linear part and the - * curved part of the tone mapping function. The value shall be in the range - * of 0 to 1, excluding 0 and in multiples of 1/4095. - */ - AVRational knee_point_x; - - /** - * The y coordinate of the separation point between the linear part and the - * curved part of the tone mapping function. The value shall be in the range - * of 0 to 1, excluding 0 and in multiples of 1/4095. - */ - AVRational knee_point_y; - - /** - * The number of the intermediate anchor parameters of the tone mapping - * function in the processing window. The maximum value shall be 15. - */ - uint8_t num_bezier_curve_anchors; - - /** - * The intermediate anchor parameters of the tone mapping function in the - * processing window in the scene. The values should be in the range of 0 - * to 1, inclusive and in multiples of 1/1023. - */ - AVRational bezier_curve_anchors[15]; - - /** - * This flag shall be equal to 0 in bitstreams conforming to this version of - * this Specification. Other values are reserved for future use. - */ - uint8_t color_saturation_mapping_flag; - - /** - * The color saturation gain in the processing window in the scene. The - * value shall be in the range of 0 to 63/8, inclusive and in multiples of - * 1/8. The default value shall be 1. - */ - AVRational color_saturation_weight; -} AVHDRPlusColorTransformParams; - -/** - * This struct represents dynamic metadata for color volume transform - - * application 4 of SMPTE 2094-40:2016 standard. - * - * To be used as payload of a AVFrameSideData or AVPacketSideData with the - * appropriate type. - * - * @note The struct should be allocated with - * av_dynamic_hdr_plus_alloc() and its size is not a part of - * the public ABI. - */ -typedef struct AVDynamicHDRPlus { - /** - * Country code by Rec. ITU-T T.35 Annex A. The value shall be 0xB5. - */ - uint8_t itu_t_t35_country_code; - - /** - * Application version in the application defining document in ST-2094 - * suite. The value shall be set to 0. - */ - uint8_t application_version; - - /** - * The number of processing windows. The value shall be in the range - * of 1 to 3, inclusive. - */ - uint8_t num_windows; - - /** - * The color transform parameters for every processing window. - */ - AVHDRPlusColorTransformParams params[3]; - - /** - * The nominal maximum display luminance of the targeted system display, - * in units of 0.0001 candelas per square metre. The value shall be in - * the range of 0 to 10000, inclusive. - */ - AVRational targeted_system_display_maximum_luminance; - - /** - * This flag shall be equal to 0 in bit streams conforming to this version - * of this Specification. The value 1 is reserved for future use. - */ - uint8_t targeted_system_display_actual_peak_luminance_flag; - - /** - * The number of rows in the targeted system_display_actual_peak_luminance - * array. The value shall be in the range of 2 to 25, inclusive. - */ - uint8_t num_rows_targeted_system_display_actual_peak_luminance; - - /** - * The number of columns in the - * targeted_system_display_actual_peak_luminance array. The value shall be - * in the range of 2 to 25, inclusive. - */ - uint8_t num_cols_targeted_system_display_actual_peak_luminance; - - /** - * The normalized actual peak luminance of the targeted system display. The - * values should be in the range of 0 to 1, inclusive and in multiples of - * 1/15. - */ - AVRational targeted_system_display_actual_peak_luminance[25][25]; - - /** - * This flag shall be equal to 0 in bitstreams conforming to this version of - * this Specification. The value 1 is reserved for future use. - */ - uint8_t mastering_display_actual_peak_luminance_flag; - - /** - * The number of rows in the mastering_display_actual_peak_luminance array. - * The value shall be in the range of 2 to 25, inclusive. - */ - uint8_t num_rows_mastering_display_actual_peak_luminance; - - /** - * The number of columns in the mastering_display_actual_peak_luminance - * array. The value shall be in the range of 2 to 25, inclusive. - */ - uint8_t num_cols_mastering_display_actual_peak_luminance; - - /** - * The normalized actual peak luminance of the mastering display used for - * mastering the image essence. The values should be in the range of 0 to 1, - * inclusive and in multiples of 1/15. - */ - AVRational mastering_display_actual_peak_luminance[25][25]; -} AVDynamicHDRPlus; - -/** - * Allocate an AVDynamicHDRPlus structure and set its fields to - * default values. The resulting struct can be freed using av_freep(). - * - * @return An AVDynamicHDRPlus filled with default values or NULL - * on failure. - */ -AVDynamicHDRPlus *av_dynamic_hdr_plus_alloc(size_t *size); - -/** - * Allocate a complete AVDynamicHDRPlus and add it to the frame. - * @param frame The frame which side data is added to. - * - * @return The AVDynamicHDRPlus structure to be filled by caller or NULL - * on failure. - */ -AVDynamicHDRPlus *av_dynamic_hdr_plus_create_side_data(AVFrame *frame); - -/** - * Parse the user data registered ITU-T T.35 to AVbuffer (AVDynamicHDRPlus). - * The T.35 buffer must begin with the application mode, skipping the - * country code, terminal provider codes, and application identifier. - * @param s A pointer containing the decoded AVDynamicHDRPlus structure. - * @param data The byte array containing the raw ITU-T T.35 data. - * @param size Size of the data array in bytes. - * - * @return >= 0 on success. Otherwise, returns the appropriate AVERROR. - */ -int av_dynamic_hdr_plus_from_t35(AVDynamicHDRPlus *s, const uint8_t *data, - size_t size); - -/** - * Serialize dynamic HDR10+ metadata to a user data registered ITU-T T.35 buffer, - * excluding the first 48 bytes of the header, and beginning with the application mode. - * @param s A pointer containing the decoded AVDynamicHDRPlus structure. - * @param data A pointer to a byte buffer to be allocated and filled - * with the serialized metadata. - * @param size A pointer to a size to be set to the returned buffer's size (optional). - * - * @return >= 0 on success. Otherwise, returns the appropriate AVERROR. - */ -int av_dynamic_hdr_plus_to_t35(const AVDynamicHDRPlus *s, uint8_t **data, size_t *size); - -#endif /* AVUTIL_HDR_DYNAMIC_METADATA_H */ diff --git a/media/ffvpx/libavutil/hwcontext_vaapi.c b/media/ffvpx/libavutil/hwcontext_vaapi.c index 90c2c191d908..de30a919ab73 100644 --- a/media/ffvpx/libavutil/hwcontext_vaapi.c +++ b/media/ffvpx/libavutil/hwcontext_vaapi.c @@ -44,7 +44,9 @@ #include "buffer.h" #include "common.h" #include "hwcontext.h" +#if CONFIG_LIBDRM #include "hwcontext_drm.h" +#endif #include "hwcontext_internal.h" #include "hwcontext_vaapi.h" #include "mem.h" diff --git a/media/ffvpx/libavutil/moz.build b/media/ffvpx/libavutil/moz.build index 355871a2ec32..c89020ab0a3c 100644 --- a/media/ffvpx/libavutil/moz.build +++ b/media/ffvpx/libavutil/moz.build @@ -54,7 +54,6 @@ if not CONFIG['MOZ_FFVPX_AUDIOONLY']: 'base64.c', 'color_utils.c', 'film_grain_params.c', - 'hdr_dynamic_metadata.c', 'integer.c', 'intmath.c', 'lls.c', diff --git a/media/ffvpx/libavutil/version.h b/media/ffvpx/libavutil/version.h index a232381ba56b..900b7989718a 100644 --- a/media/ffvpx/libavutil/version.h +++ b/media/ffvpx/libavutil/version.h @@ -79,7 +79,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 58 -#define LIBAVUTIL_VERSION_MINOR 5 +#define LIBAVUTIL_VERSION_MINOR 3 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ @@ -113,8 +113,6 @@ #define FF_API_PKT_DURATION (LIBAVUTIL_VERSION_MAJOR < 59) #define FF_API_REORDERED_OPAQUE (LIBAVUTIL_VERSION_MAJOR < 59) #define FF_API_FRAME_PICTURE_NUMBER (LIBAVUTIL_VERSION_MAJOR < 59) -#define FF_API_HDR_VIVID_THREE_SPLINE (LIBAVUTIL_VERSION_MAJOR < 59) -#define FF_API_FRAME_PKT (LIBAVUTIL_VERSION_MAJOR < 59) /** * @} diff --git a/media/libogg/moz.build b/media/libogg/moz.build index f980b820cbc3..81504bc01055 100644 --- a/media/libogg/moz.build +++ b/media/libogg/moz.build @@ -18,8 +18,7 @@ EXPORTS.ogg += [ UNIFIED_SOURCES += ogg_sources -FINAL_LIBRARY = 'gkcodecs' -NoVisibilityFlags() +FINAL_LIBRARY = 'gkmedias' # Add libFuzzer configuration directives include('/tools/fuzzing/libfuzzer-config.mozbuild') diff --git a/media/libopus/moz.build b/media/libopus/moz.build index 7740bf532816..f139053c0964 100644 --- a/media/libopus/moz.build +++ b/media/libopus/moz.build @@ -17,8 +17,7 @@ EXPORTS.opus += [ # We allow warnings for third-party code that can be updated from upstream. AllowCompilerWarnings() -FINAL_LIBRARY = "gkcodecs" -NoVisibilityFlags() +FINAL_LIBRARY = "gkmedias" DEFINES["OPUS_BUILD"] = True DEFINES["OPUS_VERSION"] = "5023249b5c935545fb02dbfe845cae996ecfc8bb" @@ -60,11 +59,6 @@ if not CONFIG["MOZ_SAMPLE_TYPE_FLOAT32"]: DEFINES["FIXED_POINT"] = 1 DEFINES["DISABLE_FLOAT_API"] = True -if CONFIG["OS_ARCH"] == "Linux": - OS_LIBS += [ - "m", - ] - LOCAL_INCLUDES += [ "celt", "include", diff --git a/media/libspeex_resampler/src/moz.build b/media/libspeex_resampler/src/moz.build index 9121f896fc5c..b99b8d92ce10 100644 --- a/media/libspeex_resampler/src/moz.build +++ b/media/libspeex_resampler/src/moz.build @@ -24,10 +24,14 @@ FINAL_LIBRARY = 'gkmedias' DEFINES['OUTSIDE_SPEEX'] = True DEFINES['EXPORT'] = '' -DEFINES['FLOATING_POINT'] = True + +if CONFIG['MOZ_SAMPLE_TYPE_S16']: + DEFINES['FIXED_POINT'] = True +else: + DEFINES['FLOATING_POINT'] = True # Only use SSE code when using floating point samples, and on x86 -if CONFIG['INTEL_ARCHITECTURE']: +if CONFIG['INTEL_ARCHITECTURE'] and not CONFIG['MOZ_SAMPLE_TYPE_S16']: DEFINES['_USE_SSE'] = True DEFINES['_USE_SSE2'] = True SOURCES += [ diff --git a/media/libtheora/moz.build b/media/libtheora/moz.build index 5e44d36ec8cd..7e76448db9ca 100644 --- a/media/libtheora/moz.build +++ b/media/libtheora/moz.build @@ -15,8 +15,7 @@ EXPORTS.theora += [ # We allow warnings for third-party code that can be updated from upstream. AllowCompilerWarnings() -FINAL_LIBRARY = 'gkcodecs' -NoVisibilityFlags() +FINAL_LIBRARY = 'gkmedias' # The encoder is currently not included. DEFINES['THEORA_DISABLE_ENCODE'] = True diff --git a/media/libtremor/COPYING b/media/libtremor/COPYING new file mode 100644 index 000000000000..6111c6c5a6b9 --- /dev/null +++ b/media/libtremor/COPYING @@ -0,0 +1,28 @@ +Copyright (c) 2002, Xiph.org Foundation + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +- Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +- Neither the name of the Xiph.org Foundation nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/media/libtremor/README b/media/libtremor/README new file mode 100644 index 000000000000..132117532292 --- /dev/null +++ b/media/libtremor/README @@ -0,0 +1,46 @@ +This README covers the Ogg Vorbis 'Tremor' integer playback codec +source as of date 2002 09 02, version 1.0.0. + + ****** + +The C source in this package will build on any ANSI C compiler and +function completely and properly on any platform. The included build +system assumes GNU build system and make tools (m4, automake, +autoconf, libtool and gmake). GCC is not required, although GCC is +the most tested compiler. To build using GNU tools, type in the +source directory: + +./autogen.sh +make + +Currently, the source implements playback in pure C on all platforms +except ARM, where a [currently] small amount of assembly (see +asm_arm.h) is used to implement 64 bit math operations and fast LSP +computation. If building on ARM without the benefit of GNU build +system tools, be sure that '_ARM_ASSEM_' is #defined by the build +system if this assembly is desired, else the resulting library will +use whatever 64 bit math builtins the compiler implements. + +No math library is required by this source. No floating point +operations are used at any point in either setup or decode. This +decoder library will properly decode any past, current or future +Vorbis I file or stream. + + ******** + +The build system produces a static and [when supported by the OS] +dynamic library named 'libvorbisidec'. This library exposes an API +nearly identical to the BSD reference library's 'libvorbisfile', +including all the features familiar to users of vorbisfile. This API +is similar enough that the proper header file to include is named +'ivorbisfile.h' [included in the source build directory]. Lower level +libvorbis-style headers and structures are in 'ivorbiscodec.h' +[included in the source build directory]. A simple example program, +ivorbisfile_example.c, can be built with 'make example'. + + ******** + +Detailed Tremor API Documentation begins at doc/index.html + +Monty +xiph.org diff --git a/media/libtremor/README_MOZILLA b/media/libtremor/README_MOZILLA new file mode 100644 index 000000000000..ee67b53a05c5 --- /dev/null +++ b/media/libtremor/README_MOZILLA @@ -0,0 +1,7 @@ +The source from this directory was copied from the libtremor +subversion repository using the update.sh script. The only changes +made were those applied by update.sh and the addition/upate of +Makefile.in files for the Mozilla build system. + +The upstream release used was http://svn.xiph.org/trunk/Tremor/ +The subversion revision used was r17547. diff --git a/media/libtremor/bug1117571-r19420.patch b/media/libtremor/bug1117571-r19420.patch new file mode 100644 index 000000000000..02de5e68ffdd --- /dev/null +++ b/media/libtremor/bug1117571-r19420.patch @@ -0,0 +1,18 @@ +diff -r 55f3224d7513 media/libtremor/lib/tremor_synthesis.c +--- a/media/libtremor/lib/tremor_synthesis.c Sat Jan 03 20:02:33 2015 -0800 ++++ b/media/libtremor/lib/tremor_synthesis.c Sun Jan 04 11:17:29 2015 -0800 +@@ -119,13 +119,13 @@ long vorbis_packet_blocksize(vorbis_info + while(v>1){ + modebits++; + v>>=1; + } + + /* read our mode and pre/post windowsize */ + mode=oggpack_read(&opb,modebits); + } +- if(mode==-1)return(OV_EBADPACKET); ++ if(mode==-1 || !ci->mode_param[mode])return(OV_EBADPACKET); + return(ci->blocksizes[ci->mode_param[mode]->blockflag]); + } + + diff --git a/media/libtremor/bug719612.patch b/media/libtremor/bug719612.patch new file mode 100644 index 000000000000..36ac84f66cc0 --- /dev/null +++ b/media/libtremor/bug719612.patch @@ -0,0 +1,21 @@ +diff --git a/media/libtremor/lib/tremor_floor1.c b/media/libtremor/lib/tremor_floor1.c +--- a/media/libtremor/lib/tremor_floor1.c ++++ b/media/libtremor/lib/tremor_floor1.c +@@ -103,16 +103,17 @@ static vorbis_info_floor *floor1_unpack + + /* read the post list */ + info->mult=oggpack_read(opb,2)+1; /* only 1,2,3,4 legal now */ + rangebits=oggpack_read(opb,4); + if(rangebits<0)goto err_out; + + for(j=0,k=0;jpartitions;j++){ + count+=info->class_dim[info->partitionclass[j]]; ++ if(count>VIF_POSIT)goto err_out; + for(;kpostlist[k+2]=oggpack_read(opb,rangebits); + if(t<0 || t>=(1<postlist[0]=0; + info->postlist[1]=1< + +typedef struct vorbis_info{ + int version; + int channels; + long rate; + + /* The below bitrate declarations are *hints*. + Combinations of the three values carry the following implications: + + all three set to the same value: + implies a fixed rate bitstream + only nominal set: + implies a VBR stream that averages the nominal bitrate. No hard + upper/lower limit + upper and or lower set: + implies a VBR bitstream that obeys the bitrate limits. nominal + may also be set to give a nominal rate. + none set: + the coder does not care to speculate. + */ + + long bitrate_upper; + long bitrate_nominal; + long bitrate_lower; + long bitrate_window; + + void *codec_setup; +} vorbis_info; + +/* vorbis_dsp_state buffers the current vorbis audio + analysis/synthesis state. The DSP state belongs to a specific + logical bitstream ****************************************************/ +typedef struct vorbis_dsp_state{ + int analysisp; + vorbis_info *vi; + + ogg_int32_t **pcm; + ogg_int32_t **pcmret; + int pcm_storage; + int pcm_current; + int pcm_returned; + + int preextrapolate; + int eofflag; + + long lW; + long W; + long nW; + long centerW; + + ogg_int64_t granulepos; + ogg_int64_t sequence; + + void *backend_state; +} vorbis_dsp_state; + +typedef struct vorbis_block{ + /* necessary stream state for linking to the framing abstraction */ + ogg_int32_t **pcm; /* this is a pointer into local storage */ + oggpack_buffer opb; + + long lW; + long W; + long nW; + int pcmend; + int mode; + + int eofflag; + ogg_int64_t granulepos; + ogg_int64_t sequence; + vorbis_dsp_state *vd; /* For read-only access of configuration */ + + /* local storage to avoid remallocing; it's up to the mapping to + structure it */ + void *localstore; + long localtop; + long localalloc; + long totaluse; + struct alloc_chain *reap; + +} vorbis_block; + +/* vorbis_block is a single block of data to be processed as part of +the analysis/synthesis stream; it belongs to a specific logical +bitstream, but is independant from other vorbis_blocks belonging to +that logical bitstream. *************************************************/ + +struct alloc_chain{ + void *ptr; + struct alloc_chain *next; +}; + +/* vorbis_info contains all the setup information specific to the + specific compression/decompression mode in progress (eg, + psychoacoustic settings, channel setup, options, codebook + etc). vorbis_info and substructures are in backends.h. +*********************************************************************/ + +/* the comments are not part of vorbis_info so that vorbis_info can be + static storage */ +typedef struct vorbis_comment{ + /* unlimited user comment fields. libvorbis writes 'libvorbis' + whatever vendor is set to in encode */ + char **user_comments; + int *comment_lengths; + int comments; + char *vendor; + +} vorbis_comment; + + +/* libvorbis encodes in two abstraction layers; first we perform DSP + and produce a packet (see docs/analysis.txt). The packet is then + coded into a framed OggSquish bitstream by the second layer (see + docs/framing.txt). Decode is the reverse process; we sync/frame + the bitstream and extract individual packets, then decode the + packet back into PCM audio. + + The extra framing/packetizing is used in streaming formats, such as + files. Over the net (such as with UDP), the framing and + packetization aren't necessary as they're provided by the transport + and the streaming layer is not used */ + +/* Vorbis PRIMITIVES: general ***************************************/ + +extern void vorbis_info_init(vorbis_info *vi); +extern void vorbis_info_clear(vorbis_info *vi); +extern int vorbis_info_blocksize(vorbis_info *vi,int zo); +extern void vorbis_comment_init(vorbis_comment *vc); +extern void vorbis_comment_add(vorbis_comment *vc, char *comment); +extern void vorbis_comment_add_tag(vorbis_comment *vc, + char *tag, char *contents); +extern char *vorbis_comment_query(vorbis_comment *vc, char *tag, int count); +extern int vorbis_comment_query_count(vorbis_comment *vc, char *tag); +extern void vorbis_comment_clear(vorbis_comment *vc); + +extern int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb); +extern int vorbis_block_clear(vorbis_block *vb); +extern void vorbis_dsp_clear(vorbis_dsp_state *v); + +/* Vorbis PRIMITIVES: synthesis layer *******************************/ +extern int vorbis_synthesis_idheader(ogg_packet *op); +extern int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc, + ogg_packet *op); + +extern int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi); +extern int vorbis_synthesis_restart(vorbis_dsp_state *v); +extern int vorbis_synthesis(vorbis_block *vb,ogg_packet *op); +extern int vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op); +extern int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb); +extern int vorbis_synthesis_pcmout(vorbis_dsp_state *v,ogg_int32_t ***pcm); +extern int vorbis_synthesis_read(vorbis_dsp_state *v,int samples); +extern long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op); + +/* Vorbis ERRORS and return codes ***********************************/ + +#define OV_FALSE -1 +#define OV_EOF -2 +#define OV_HOLE -3 + +#define OV_EREAD -128 +#define OV_EFAULT -129 +#define OV_EIMPL -130 +#define OV_EINVAL -131 +#define OV_ENOTVORBIS -132 +#define OV_EBADHEADER -133 +#define OV_EVERSION -134 +#define OV_ENOTAUDIO -135 +#define OV_EBADPACKET -136 +#define OV_EBADLINK -137 +#define OV_ENOSEEK -138 + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif + diff --git a/media/libtremor/include/tremor/moz.build b/media/libtremor/include/tremor/moz.build new file mode 100644 index 000000000000..73e4a38c8be5 --- /dev/null +++ b/media/libtremor/include/tremor/moz.build @@ -0,0 +1,10 @@ +# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- +# vim: set filetype=python: +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +EXPORTS.tremor += [ + 'ivorbiscodec.h', +] + diff --git a/media/libtremor/lib/asm_arm.h b/media/libtremor/lib/asm_arm.h new file mode 100644 index 000000000000..c3bda005cd59 --- /dev/null +++ b/media/libtremor/lib/asm_arm.h @@ -0,0 +1,245 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: arm7 and later wide math functions + + ********************************************************************/ + +#ifdef _ARM_ASSEM_ + +#if !defined(_V_WIDE_MATH) && !defined(_LOW_ACCURACY_) +#define _V_WIDE_MATH + +static inline ogg_int32_t MULT32(ogg_int32_t x, ogg_int32_t y) { + int lo,hi; + asm volatile("smull\t%0, %1, %2, %3" + : "=&r"(lo),"=&r"(hi) + : "%r"(x),"r"(y) + : "cc"); + return(hi); +} + +static inline ogg_int32_t MULT31(ogg_int32_t x, ogg_int32_t y) { + return MULT32(x,y)<<1; +} + +static inline ogg_int32_t MULT31_SHIFT15(ogg_int32_t x, ogg_int32_t y) { + int lo,hi; + asm volatile("smull %0, %1, %2, %3\n\t" + "movs %0, %0, lsr #15\n\t" + "adc %1, %0, %1, lsl #17\n\t" + : "=&r"(lo),"=&r"(hi) + : "%r"(x),"r"(y) + : "cc"); + return(hi); +} + +#define MB() asm volatile ("" : : : "memory") + +static inline void XPROD32(ogg_int32_t a, ogg_int32_t b, + ogg_int32_t t, ogg_int32_t v, + ogg_int32_t *x, ogg_int32_t *y) +{ + int x1, y1, l; + 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" (l), "=&r" (x1), "=&r" (y1), "=r" (a) + : "3" (a), "r" (b), "r" (t), "r" (v) + : "cc" ); + *x = x1; + MB(); + *y = y1; +} + +static inline void XPROD31(ogg_int32_t a, ogg_int32_t b, + ogg_int32_t t, ogg_int32_t v, + ogg_int32_t *x, ogg_int32_t *y) +{ + int x1, y1, l; + 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" (l), "=&r" (x1), "=&r" (y1), "=r" (a) + : "3" (a), "r" (b), "r" (t), "r" (v) + : "cc" ); + *x = x1 << 1; + MB(); + *y = y1 << 1; +} + +static inline void XNPROD31(ogg_int32_t a, ogg_int32_t b, + ogg_int32_t t, ogg_int32_t v, + ogg_int32_t *x, ogg_int32_t *y) +{ + int x1, y1, l; + asm( "rsb %2, %4, #0\n\t" + "smull %0, %1, %3, %5\n\t" + "smlal %0, %1, %2, %6\n\t" + "smull %0, %2, %4, %5\n\t" + "smlal %0, %2, %3, %6" + : "=&r" (l), "=&r" (x1), "=&r" (y1) + : "r" (a), "r" (b), "r" (t), "r" (v) + : "cc" ); + *x = x1 << 1; + MB(); + *y = y1 << 1; +} + +#endif + +#ifndef _V_CLIP_MATH +#define _V_CLIP_MATH + +static inline ogg_int32_t CLIP_TO_15(ogg_int32_t x) { + int tmp; + asm volatile("subs %1, %0, #32768\n\t" + "movpl %0, #0x7f00\n\t" + "orrpl %0, %0, #0xff\n" + "adds %1, %0, #32768\n\t" + "movmi %0, #0x8000" + : "+r"(x),"=r"(tmp) + : + : "cc"); + return(x); +} + +#endif + +#ifndef _V_LSP_MATH_ASM +#define _V_LSP_MATH_ASM + +static inline void lsp_loop_asm(ogg_uint32_t *qip,ogg_uint32_t *pip, + ogg_int32_t *qexpp, + ogg_int32_t *ilsp,ogg_int32_t wi, + ogg_int32_t m){ + + ogg_uint32_t qi=*qip,pi=*pip; + ogg_int32_t qexp=*qexpp; + + asm("mov r0,%3;" + "movs r1,%5,asr#1;" + "add r0,r0,r1,lsl#3;" + "beq 2f;\n" + "1:" + + "ldmdb r0!,{r1,r3};" + "subs r1,r1,%4;" //ilsp[j]-wi + "rsbmi r1,r1,#0;" //labs(ilsp[j]-wi) + "umull %0,r2,r1,%0;" //qi*=labs(ilsp[j]-wi) + + "subs r1,r3,%4;" //ilsp[j+1]-wi + "rsbmi r1,r1,#0;" //labs(ilsp[j+1]-wi) + "umull %1,r3,r1,%1;" //pi*=labs(ilsp[j+1]-wi) + + "cmn r2,r3;" // shift down 16? + "beq 0f;" + "add %2,%2,#16;" + "mov %0,%0,lsr #16;" + "orr %0,%0,r2,lsl #16;" + "mov %1,%1,lsr #16;" + "orr %1,%1,r3,lsl #16;" + "0:" + "cmp r0,%3;\n" + "bhi 1b;\n" + + "2:" + // odd filter assymetry + "ands r0,%5,#1;\n" + "beq 3f;\n" + "add r0,%3,%5,lsl#2;\n" + + "ldr r1,[r0,#-4];\n" + "mov r0,#0x4000;\n" + + "subs r1,r1,%4;\n" //ilsp[j]-wi + "rsbmi r1,r1,#0;\n" //labs(ilsp[j]-wi) + "umull %0,r2,r1,%0;\n" //qi*=labs(ilsp[j]-wi) + "umull %1,r3,r0,%1;\n" //pi*=labs(ilsp[j+1]-wi) + + "cmn r2,r3;\n" // shift down 16? + "beq 3f;\n" + "add %2,%2,#16;\n" + "mov %0,%0,lsr #16;\n" + "orr %0,%0,r2,lsl #16;\n" + "mov %1,%1,lsr #16;\n" + "orr %1,%1,r3,lsl #16;\n" + + //qi=(pi>>shift)*labs(ilsp[j]-wi); + //pi=(qi>>shift)*labs(ilsp[j+1]-wi); + //qexp+=shift; + + //} + + /* normalize to max 16 sig figs */ + "3:" + "mov r2,#0;" + "orr r1,%0,%1;" + "tst r1,#0xff000000;" + "addne r2,r2,#8;" + "movne r1,r1,lsr #8;" + "tst r1,#0x00f00000;" + "addne r2,r2,#4;" + "movne r1,r1,lsr #4;" + "tst r1,#0x000c0000;" + "addne r2,r2,#2;" + "movne r1,r1,lsr #2;" + "tst r1,#0x00020000;" + "addne r2,r2,#1;" + "movne r1,r1,lsr #1;" + "tst r1,#0x00010000;" + "addne r2,r2,#1;" + "mov %0,%0,lsr r2;" + "mov %1,%1,lsr r2;" + "add %2,%2,r2;" + + : "+r"(qi),"+r"(pi),"+r"(qexp) + : "r"(ilsp),"r"(wi),"r"(m) + : "r0","r1","r2","r3","cc"); + + *qip=qi; + *pip=pi; + *qexpp=qexp; +} + +static inline void lsp_norm_asm(ogg_uint32_t *qip,ogg_int32_t *qexpp){ + + ogg_uint32_t qi=*qip; + ogg_int32_t qexp=*qexpp; + + asm("tst %0,#0x0000ff00;" + "moveq %0,%0,lsl #8;" + "subeq %1,%1,#8;" + "tst %0,#0x0000f000;" + "moveq %0,%0,lsl #4;" + "subeq %1,%1,#4;" + "tst %0,#0x0000c000;" + "moveq %0,%0,lsl #2;" + "subeq %1,%1,#2;" + "tst %0,#0x00008000;" + "moveq %0,%0,lsl #1;" + "subeq %1,%1,#1;" + : "+r"(qi),"+r"(qexp) + : + : "cc"); + *qip=qi; + *qexpp=qexp; +} + +#endif +#endif + diff --git a/media/libtremor/lib/backends.h b/media/libtremor/lib/backends.h new file mode 100644 index 000000000000..52024219b144 --- /dev/null +++ b/media/libtremor/lib/backends.h @@ -0,0 +1,131 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: backend and mapping structures + + ********************************************************************/ + +/* this is exposed up here because we need it for static modes. + Lookups for each backend aren't exposed because there's no reason + to do so */ + +#ifndef _vorbis_backend_h_ +#define _vorbis_backend_h_ + +#include "codec_internal.h" + +/* this would all be simpler/shorter with templates, but.... */ +/* Transform backend generic *************************************/ + +/* only mdct right now. Flesh it out more if we ever transcend mdct + in the transform domain */ + +/* Floor backend generic *****************************************/ +typedef struct{ + vorbis_info_floor *(*unpack)(vorbis_info *,oggpack_buffer *); + vorbis_look_floor *(*look) (vorbis_dsp_state *,vorbis_info_mode *, + vorbis_info_floor *); + void (*free_info) (vorbis_info_floor *); + void (*free_look) (vorbis_look_floor *); + void *(*inverse1) (struct vorbis_block *,vorbis_look_floor *); + int (*inverse2) (struct vorbis_block *,vorbis_look_floor *, + void *buffer,ogg_int32_t *); +} vorbis_func_floor; + +typedef struct{ + int order; + long rate; + long barkmap; + + int ampbits; + int ampdB; + + int numbooks; /* <= 16 */ + int books[16]; + +} vorbis_info_floor0; + +#define VIF_POSIT 63 +#define VIF_CLASS 16 +#define VIF_PARTS 31 +typedef struct{ + int partitions; /* 0 to 31 */ + int partitionclass[VIF_PARTS]; /* 0 to 15 */ + + int class_dim[VIF_CLASS]; /* 1 to 8 */ + int class_subs[VIF_CLASS]; /* 0,1,2,3 (bits: 1< + +/* This structure encapsulates huffman and VQ style encoding books; it + doesn't do anything specific to either. + + valuelist/quantlist are nonNULL (and q_* significant) only if + there's entry->value mapping to be done. + + If encode-side mapping must be done (and thus the entry needs to be + hunted), the auxiliary encode pointer will point to a decision + tree. This is true of both VQ and huffman, but is mostly useful + with VQ. + +*/ + +typedef struct static_codebook{ + long dim; /* codebook dimensions (elements per vector) */ + long entries; /* codebook entries */ + long *lengthlist; /* codeword lengths in bits */ + + /* mapping ***************************************************************/ + int maptype; /* 0=none + 1=implicitly populated values from map column + 2=listed arbitrary values */ + + /* The below does a linear, single monotonic sequence mapping. */ + long q_min; /* packed 32 bit float; quant value 0 maps to minval */ + long q_delta; /* packed 32 bit float; val 1 - val 0 == delta */ + int q_quant; /* bits: 0 < quant <= 16 */ + int q_sequencep; /* bitflag */ + + long *quantlist; /* map == 1: (int)(entries^(1/dim)) element column map + map == 2: list of dim*entries quantized entry vals + */ +} static_codebook; + +typedef struct codebook{ + long dim; /* codebook dimensions (elements per vector) */ + long entries; /* codebook entries */ + long used_entries; /* populated codebook entries */ + + /* the below are ordered by bitreversed codeword and only used + entries are populated */ + int binarypoint; + ogg_int32_t *valuelist; /* list of dim*entries actual entry values */ + ogg_uint32_t *codelist; /* list of bitstream codewords for each entry */ + + int *dec_index; + char *dec_codelengths; + ogg_uint32_t *dec_firsttable; + int dec_firsttablen; + int dec_maxlength; + + long q_min; /* packed 32 bit float; quant value 0 maps to minval */ + long q_delta; /* packed 32 bit float; val 1 - val 0 == delta */ + +} codebook; + +extern void vorbis_staticbook_destroy(static_codebook *b); +extern int vorbis_book_init_decode(codebook *dest,const static_codebook *source); + +extern void vorbis_book_clear(codebook *b); +extern long _book_maptype1_quantvals(const static_codebook *b); + +extern static_codebook *vorbis_staticbook_unpack(oggpack_buffer *b); + +extern long vorbis_book_decode(codebook *book, oggpack_buffer *b); +extern long vorbis_book_decodevs_add(codebook *book, ogg_int32_t *a, + oggpack_buffer *b,int n,int point); +extern long vorbis_book_decodev_set(codebook *book, ogg_int32_t *a, + oggpack_buffer *b,int n,int point); +extern long vorbis_book_decodev_add(codebook *book, ogg_int32_t *a, + oggpack_buffer *b,int n,int point); +extern long vorbis_book_decodevv_add(codebook *book, ogg_int32_t **a, + long off,int ch, + oggpack_buffer *b,int n,int point); + +extern int _ilog(unsigned int v); + + +#endif diff --git a/media/libtremor/lib/codec_internal.h b/media/libtremor/lib/codec_internal.h new file mode 100644 index 000000000000..3ca7f5472444 --- /dev/null +++ b/media/libtremor/lib/codec_internal.h @@ -0,0 +1,92 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: libvorbis codec headers + + ********************************************************************/ + +#ifndef _V_CODECI_H_ +#define _V_CODECI_H_ + +#include "codebook.h" + +typedef void vorbis_look_mapping; +typedef void vorbis_look_floor; +typedef void vorbis_look_residue; +typedef void vorbis_look_transform; + +/* mode ************************************************************/ +typedef struct { + int blockflag; + int windowtype; + int transformtype; + int mapping; +} vorbis_info_mode; + +typedef void vorbis_info_floor; +typedef void vorbis_info_residue; +typedef void vorbis_info_mapping; + +typedef struct private_state { + /* local lookup storage */ + const void *window[2]; + + /* backend lookups are tied to the mode, not the backend or naked mapping */ + int modebits; + vorbis_look_mapping **mode; + + ogg_int64_t sample_count; + +} private_state; + +/* codec_setup_info contains all the setup information specific to the + specific compression/decompression mode in progress (eg, + psychoacoustic settings, channel setup, options, codebook + etc). +*********************************************************************/ + +typedef struct codec_setup_info { + + /* Vorbis supports only short and long blocks, but allows the + encoder to choose the sizes */ + + long blocksizes[2]; + + /* modes are the primary means of supporting on-the-fly different + blocksizes, different channel mappings (LR or M/A), + different residue backends, etc. Each mode consists of a + blocksize flag and a mapping (along with the mapping setup */ + + int modes; + int maps; + int times; + int floors; + int residues; + int books; + + vorbis_info_mode *mode_param[64]; + int map_type[64]; + vorbis_info_mapping *map_param[64]; + int time_type[64]; + int floor_type[64]; + vorbis_info_floor *floor_param[64]; + int residue_type[64]; + vorbis_info_residue *residue_param[64]; + static_codebook *book_param[256]; + codebook *fullbooks; + + int passlimit[32]; /* iteration limit per couple/quant pass */ + int coupling_passes; +} codec_setup_info; + +#endif diff --git a/media/libtremor/lib/lsp_lookup.h b/media/libtremor/lib/lsp_lookup.h new file mode 100644 index 000000000000..7162392b8b4f --- /dev/null +++ b/media/libtremor/lib/lsp_lookup.h @@ -0,0 +1,136 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: lookup data + + ********************************************************************/ + +#ifndef _V_LOOKUP_DATA_H_ +#define _V_LOOKUP_DATA_H_ + +#include + +#define FROMdB_LOOKUP_SZ 35 +#define FROMdB2_LOOKUP_SZ 32 +#define FROMdB_SHIFT 5 +#define FROMdB2_SHIFT 3 +#define FROMdB2_MASK 31 + +static const ogg_int32_t FROMdB_LOOKUP[FROMdB_LOOKUP_SZ]={ + 0x003fffff, 0x0028619b, 0x00197a96, 0x0010137a, + 0x000a24b0, 0x00066666, 0x000409c3, 0x00028c42, + 0x00019b8c, 0x000103ab, 0x0000a3d7, 0x00006760, + 0x0000413a, 0x00002928, 0x000019f8, 0x00001062, + 0x00000a56, 0x00000686, 0x0000041e, 0x00000299, + 0x000001a3, 0x00000109, 0x000000a7, 0x00000069, + 0x00000042, 0x0000002a, 0x0000001a, 0x00000011, + 0x0000000b, 0x00000007, 0x00000004, 0x00000003, + 0x00000002, 0x00000001, 0x00000001}; + +static const ogg_int32_t FROMdB2_LOOKUP[FROMdB2_LOOKUP_SZ]={ + 0x000001fc, 0x000001f5, 0x000001ee, 0x000001e7, + 0x000001e0, 0x000001d9, 0x000001d2, 0x000001cc, + 0x000001c5, 0x000001bf, 0x000001b8, 0x000001b2, + 0x000001ac, 0x000001a6, 0x000001a0, 0x0000019a, + 0x00000194, 0x0000018e, 0x00000188, 0x00000183, + 0x0000017d, 0x00000178, 0x00000172, 0x0000016d, + 0x00000168, 0x00000163, 0x0000015e, 0x00000159, + 0x00000154, 0x0000014f, 0x0000014a, 0x00000145, +}; + +#define INVSQ_LOOKUP_I_SHIFT 10 +#define INVSQ_LOOKUP_I_MASK 1023 +static const long INVSQ_LOOKUP_I[64+1]={ + 92682, 91966, 91267, 90583, + 89915, 89261, 88621, 87995, + 87381, 86781, 86192, 85616, + 85051, 84497, 83953, 83420, + 82897, 82384, 81880, 81385, + 80899, 80422, 79953, 79492, + 79039, 78594, 78156, 77726, + 77302, 76885, 76475, 76072, + 75674, 75283, 74898, 74519, + 74146, 73778, 73415, 73058, + 72706, 72359, 72016, 71679, + 71347, 71019, 70695, 70376, + 70061, 69750, 69444, 69141, + 68842, 68548, 68256, 67969, + 67685, 67405, 67128, 66855, + 66585, 66318, 66054, 65794, + 65536, +}; + +static const long INVSQ_LOOKUP_IDel[64]={ + 716, 699, 684, 668, + 654, 640, 626, 614, + 600, 589, 576, 565, + 554, 544, 533, 523, + 513, 504, 495, 486, + 477, 469, 461, 453, + 445, 438, 430, 424, + 417, 410, 403, 398, + 391, 385, 379, 373, + 368, 363, 357, 352, + 347, 343, 337, 332, + 328, 324, 319, 315, + 311, 306, 303, 299, + 294, 292, 287, 284, + 280, 277, 273, 270, + 267, 264, 260, 258, +}; + +#define COS_LOOKUP_I_SHIFT 9 +#define COS_LOOKUP_I_MASK 511 +#define COS_LOOKUP_I_SZ 128 +static const ogg_int32_t COS_LOOKUP_I[COS_LOOKUP_I_SZ+1]={ + 16384, 16379, 16364, 16340, + 16305, 16261, 16207, 16143, + 16069, 15986, 15893, 15791, + 15679, 15557, 15426, 15286, + 15137, 14978, 14811, 14635, + 14449, 14256, 14053, 13842, + 13623, 13395, 13160, 12916, + 12665, 12406, 12140, 11866, + 11585, 11297, 11003, 10702, + 10394, 10080, 9760, 9434, + 9102, 8765, 8423, 8076, + 7723, 7366, 7005, 6639, + 6270, 5897, 5520, 5139, + 4756, 4370, 3981, 3590, + 3196, 2801, 2404, 2006, + 1606, 1205, 804, 402, + 0, -401, -803, -1204, + -1605, -2005, -2403, -2800, + -3195, -3589, -3980, -4369, + -4755, -5138, -5519, -5896, + -6269, -6638, -7004, -7365, + -7722, -8075, -8422, -8764, + -9101, -9433, -9759, -10079, + -10393, -10701, -11002, -11296, + -11584, -11865, -12139, -12405, + -12664, -12915, -13159, -13394, + -13622, -13841, -14052, -14255, + -14448, -14634, -14810, -14977, + -15136, -15285, -15425, -15556, + -15678, -15790, -15892, -15985, + -16068, -16142, -16206, -16260, + -16304, -16339, -16363, -16378, + -16383, +}; + +#endif + + + + + diff --git a/media/libtremor/lib/mdct.h b/media/libtremor/lib/mdct.h new file mode 100644 index 000000000000..6d8890720cde --- /dev/null +++ b/media/libtremor/lib/mdct.h @@ -0,0 +1,52 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: modified discrete cosine transform prototypes + + ********************************************************************/ + +#ifndef _OGG_mdct_H_ +#define _OGG_mdct_H_ + +#include "ivorbiscodec.h" +#include "misc.h" + +#define DATA_TYPE ogg_int32_t +#define REG_TYPE register ogg_int32_t + +#ifdef _LOW_ACCURACY_ +#define cPI3_8 (0x0062) +#define cPI2_8 (0x00b5) +#define cPI1_8 (0x00ed) +#else +#define cPI3_8 (0x30fbc54d) +#define cPI2_8 (0x5a82799a) +#define cPI1_8 (0x7641af3d) +#endif + +extern void mdct_forward(int n, DATA_TYPE *in, DATA_TYPE *out); +extern void mdct_backward(int n, DATA_TYPE *in, DATA_TYPE *out); + +#endif + + + + + + + + + + + + diff --git a/media/libtremor/lib/mdct_lookup.h b/media/libtremor/lib/mdct_lookup.h new file mode 100644 index 000000000000..ee4f101c27ef --- /dev/null +++ b/media/libtremor/lib/mdct_lookup.h @@ -0,0 +1,540 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: sin,cos lookup tables + + ********************************************************************/ + +#include "misc.h" + +/* {sin(2*i*PI/4096), cos(2*i*PI/4096)}, with i = 0 to 512 */ +static const LOOKUP_T sincos_lookup0[1026] = { + X(0x00000000), X(0x7fffffff), X(0x003243f5), X(0x7ffff621), + X(0x006487e3), X(0x7fffd886), X(0x0096cbc1), X(0x7fffa72c), + X(0x00c90f88), X(0x7fff6216), X(0x00fb5330), X(0x7fff0943), + X(0x012d96b1), X(0x7ffe9cb2), X(0x015fda03), X(0x7ffe1c65), + X(0x01921d20), X(0x7ffd885a), X(0x01c45ffe), X(0x7ffce093), + X(0x01f6a297), X(0x7ffc250f), X(0x0228e4e2), X(0x7ffb55ce), + X(0x025b26d7), X(0x7ffa72d1), X(0x028d6870), X(0x7ff97c18), + X(0x02bfa9a4), X(0x7ff871a2), X(0x02f1ea6c), X(0x7ff75370), + X(0x03242abf), X(0x7ff62182), X(0x03566a96), X(0x7ff4dbd9), + X(0x0388a9ea), X(0x7ff38274), X(0x03bae8b2), X(0x7ff21553), + X(0x03ed26e6), X(0x7ff09478), X(0x041f6480), X(0x7feeffe1), + X(0x0451a177), X(0x7fed5791), X(0x0483ddc3), X(0x7feb9b85), + X(0x04b6195d), X(0x7fe9cbc0), X(0x04e8543e), X(0x7fe7e841), + X(0x051a8e5c), X(0x7fe5f108), X(0x054cc7b1), X(0x7fe3e616), + X(0x057f0035), X(0x7fe1c76b), X(0x05b137df), X(0x7fdf9508), + X(0x05e36ea9), X(0x7fdd4eec), X(0x0615a48b), X(0x7fdaf519), + X(0x0647d97c), X(0x7fd8878e), X(0x067a0d76), X(0x7fd6064c), + X(0x06ac406f), X(0x7fd37153), X(0x06de7262), X(0x7fd0c8a3), + X(0x0710a345), X(0x7fce0c3e), X(0x0742d311), X(0x7fcb3c23), + X(0x077501be), X(0x7fc85854), X(0x07a72f45), X(0x7fc560cf), + X(0x07d95b9e), X(0x7fc25596), X(0x080b86c2), X(0x7fbf36aa), + X(0x083db0a7), X(0x7fbc040a), X(0x086fd947), X(0x7fb8bdb8), + X(0x08a2009a), X(0x7fb563b3), X(0x08d42699), X(0x7fb1f5fc), + X(0x09064b3a), X(0x7fae7495), X(0x09386e78), X(0x7faadf7c), + X(0x096a9049), X(0x7fa736b4), X(0x099cb0a7), X(0x7fa37a3c), + X(0x09cecf89), X(0x7f9faa15), X(0x0a00ece8), X(0x7f9bc640), + X(0x0a3308bd), X(0x7f97cebd), X(0x0a6522fe), X(0x7f93c38c), + X(0x0a973ba5), X(0x7f8fa4b0), X(0x0ac952aa), X(0x7f8b7227), + X(0x0afb6805), X(0x7f872bf3), X(0x0b2d7baf), X(0x7f82d214), + X(0x0b5f8d9f), X(0x7f7e648c), X(0x0b919dcf), X(0x7f79e35a), + X(0x0bc3ac35), X(0x7f754e80), X(0x0bf5b8cb), X(0x7f70a5fe), + X(0x0c27c389), X(0x7f6be9d4), X(0x0c59cc68), X(0x7f671a05), + X(0x0c8bd35e), X(0x7f62368f), X(0x0cbdd865), X(0x7f5d3f75), + X(0x0cefdb76), X(0x7f5834b7), X(0x0d21dc87), X(0x7f531655), + X(0x0d53db92), X(0x7f4de451), X(0x0d85d88f), X(0x7f489eaa), + X(0x0db7d376), X(0x7f434563), X(0x0de9cc40), X(0x7f3dd87c), + X(0x0e1bc2e4), X(0x7f3857f6), X(0x0e4db75b), X(0x7f32c3d1), + X(0x0e7fa99e), X(0x7f2d1c0e), X(0x0eb199a4), X(0x7f2760af), + X(0x0ee38766), X(0x7f2191b4), X(0x0f1572dc), X(0x7f1baf1e), + X(0x0f475bff), X(0x7f15b8ee), X(0x0f7942c7), X(0x7f0faf25), + X(0x0fab272b), X(0x7f0991c4), X(0x0fdd0926), X(0x7f0360cb), + X(0x100ee8ad), X(0x7efd1c3c), X(0x1040c5bb), X(0x7ef6c418), + X(0x1072a048), X(0x7ef05860), X(0x10a4784b), X(0x7ee9d914), + X(0x10d64dbd), X(0x7ee34636), X(0x11082096), X(0x7edc9fc6), + X(0x1139f0cf), X(0x7ed5e5c6), X(0x116bbe60), X(0x7ecf1837), + X(0x119d8941), X(0x7ec8371a), X(0x11cf516a), X(0x7ec14270), + X(0x120116d5), X(0x7eba3a39), X(0x1232d979), X(0x7eb31e78), + X(0x1264994e), X(0x7eabef2c), X(0x1296564d), X(0x7ea4ac58), + X(0x12c8106f), X(0x7e9d55fc), X(0x12f9c7aa), X(0x7e95ec1a), + X(0x132b7bf9), X(0x7e8e6eb2), X(0x135d2d53), X(0x7e86ddc6), + X(0x138edbb1), X(0x7e7f3957), X(0x13c0870a), X(0x7e778166), + X(0x13f22f58), X(0x7e6fb5f4), X(0x1423d492), X(0x7e67d703), + X(0x145576b1), X(0x7e5fe493), X(0x148715ae), X(0x7e57dea7), + X(0x14b8b17f), X(0x7e4fc53e), X(0x14ea4a1f), X(0x7e47985b), + X(0x151bdf86), X(0x7e3f57ff), X(0x154d71aa), X(0x7e37042a), + X(0x157f0086), X(0x7e2e9cdf), X(0x15b08c12), X(0x7e26221f), + X(0x15e21445), X(0x7e1d93ea), X(0x16139918), X(0x7e14f242), + X(0x16451a83), X(0x7e0c3d29), X(0x1676987f), X(0x7e0374a0), + X(0x16a81305), X(0x7dfa98a8), X(0x16d98a0c), X(0x7df1a942), + X(0x170afd8d), X(0x7de8a670), X(0x173c6d80), X(0x7ddf9034), + X(0x176dd9de), X(0x7dd6668f), X(0x179f429f), X(0x7dcd2981), + X(0x17d0a7bc), X(0x7dc3d90d), X(0x1802092c), X(0x7dba7534), + X(0x183366e9), X(0x7db0fdf8), X(0x1864c0ea), X(0x7da77359), + X(0x18961728), X(0x7d9dd55a), X(0x18c7699b), X(0x7d9423fc), + X(0x18f8b83c), X(0x7d8a5f40), X(0x192a0304), X(0x7d808728), + X(0x195b49ea), X(0x7d769bb5), X(0x198c8ce7), X(0x7d6c9ce9), + X(0x19bdcbf3), X(0x7d628ac6), X(0x19ef0707), X(0x7d58654d), + X(0x1a203e1b), X(0x7d4e2c7f), X(0x1a517128), X(0x7d43e05e), + X(0x1a82a026), X(0x7d3980ec), X(0x1ab3cb0d), X(0x7d2f0e2b), + X(0x1ae4f1d6), X(0x7d24881b), X(0x1b161479), X(0x7d19eebf), + X(0x1b4732ef), X(0x7d0f4218), X(0x1b784d30), X(0x7d048228), + X(0x1ba96335), X(0x7cf9aef0), X(0x1bda74f6), X(0x7ceec873), + X(0x1c0b826a), X(0x7ce3ceb2), X(0x1c3c8b8c), X(0x7cd8c1ae), + X(0x1c6d9053), X(0x7ccda169), X(0x1c9e90b8), X(0x7cc26de5), + X(0x1ccf8cb3), X(0x7cb72724), X(0x1d00843d), X(0x7cabcd28), + X(0x1d31774d), X(0x7ca05ff1), X(0x1d6265dd), X(0x7c94df83), + X(0x1d934fe5), X(0x7c894bde), X(0x1dc4355e), X(0x7c7da505), + X(0x1df5163f), X(0x7c71eaf9), X(0x1e25f282), X(0x7c661dbc), + X(0x1e56ca1e), X(0x7c5a3d50), X(0x1e879d0d), X(0x7c4e49b7), + X(0x1eb86b46), X(0x7c4242f2), X(0x1ee934c3), X(0x7c362904), + X(0x1f19f97b), X(0x7c29fbee), X(0x1f4ab968), X(0x7c1dbbb3), + X(0x1f7b7481), X(0x7c116853), X(0x1fac2abf), X(0x7c0501d2), + X(0x1fdcdc1b), X(0x7bf88830), X(0x200d888d), X(0x7bebfb70), + X(0x203e300d), X(0x7bdf5b94), X(0x206ed295), X(0x7bd2a89e), + X(0x209f701c), X(0x7bc5e290), X(0x20d0089c), X(0x7bb9096b), + X(0x21009c0c), X(0x7bac1d31), X(0x21312a65), X(0x7b9f1de6), + X(0x2161b3a0), X(0x7b920b89), X(0x219237b5), X(0x7b84e61f), + X(0x21c2b69c), X(0x7b77ada8), X(0x21f3304f), X(0x7b6a6227), + X(0x2223a4c5), X(0x7b5d039e), X(0x225413f8), X(0x7b4f920e), + X(0x22847de0), X(0x7b420d7a), X(0x22b4e274), X(0x7b3475e5), + X(0x22e541af), X(0x7b26cb4f), X(0x23159b88), X(0x7b190dbc), + X(0x2345eff8), X(0x7b0b3d2c), X(0x23763ef7), X(0x7afd59a4), + X(0x23a6887f), X(0x7aef6323), X(0x23d6cc87), X(0x7ae159ae), + X(0x24070b08), X(0x7ad33d45), X(0x243743fa), X(0x7ac50dec), + X(0x24677758), X(0x7ab6cba4), X(0x2497a517), X(0x7aa8766f), + X(0x24c7cd33), X(0x7a9a0e50), X(0x24f7efa2), X(0x7a8b9348), + X(0x25280c5e), X(0x7a7d055b), X(0x2558235f), X(0x7a6e648a), + X(0x2588349d), X(0x7a5fb0d8), X(0x25b84012), X(0x7a50ea47), + X(0x25e845b6), X(0x7a4210d8), X(0x26184581), X(0x7a332490), + X(0x26483f6c), X(0x7a24256f), X(0x26783370), X(0x7a151378), + X(0x26a82186), X(0x7a05eead), X(0x26d809a5), X(0x79f6b711), + X(0x2707ebc7), X(0x79e76ca7), X(0x2737c7e3), X(0x79d80f6f), + X(0x27679df4), X(0x79c89f6e), X(0x27976df1), X(0x79b91ca4), + X(0x27c737d3), X(0x79a98715), X(0x27f6fb92), X(0x7999dec4), + X(0x2826b928), X(0x798a23b1), X(0x2856708d), X(0x797a55e0), + X(0x288621b9), X(0x796a7554), X(0x28b5cca5), X(0x795a820e), + X(0x28e5714b), X(0x794a7c12), X(0x29150fa1), X(0x793a6361), + X(0x2944a7a2), X(0x792a37fe), X(0x29743946), X(0x7919f9ec), + X(0x29a3c485), X(0x7909a92d), X(0x29d34958), X(0x78f945c3), + X(0x2a02c7b8), X(0x78e8cfb2), X(0x2a323f9e), X(0x78d846fb), + X(0x2a61b101), X(0x78c7aba2), X(0x2a911bdc), X(0x78b6fda8), + X(0x2ac08026), X(0x78a63d11), X(0x2aefddd8), X(0x789569df), + X(0x2b1f34eb), X(0x78848414), X(0x2b4e8558), X(0x78738bb3), + X(0x2b7dcf17), X(0x786280bf), X(0x2bad1221), X(0x7851633b), + X(0x2bdc4e6f), X(0x78403329), X(0x2c0b83fa), X(0x782ef08b), + X(0x2c3ab2b9), X(0x781d9b65), X(0x2c69daa6), X(0x780c33b8), + X(0x2c98fbba), X(0x77fab989), X(0x2cc815ee), X(0x77e92cd9), + X(0x2cf72939), X(0x77d78daa), X(0x2d263596), X(0x77c5dc01), + X(0x2d553afc), X(0x77b417df), X(0x2d843964), X(0x77a24148), + X(0x2db330c7), X(0x7790583e), X(0x2de2211e), X(0x777e5cc3), + X(0x2e110a62), X(0x776c4edb), X(0x2e3fec8b), X(0x775a2e89), + X(0x2e6ec792), X(0x7747fbce), X(0x2e9d9b70), X(0x7735b6af), + X(0x2ecc681e), X(0x77235f2d), X(0x2efb2d95), X(0x7710f54c), + X(0x2f29ebcc), X(0x76fe790e), X(0x2f58a2be), X(0x76ebea77), + X(0x2f875262), X(0x76d94989), X(0x2fb5fab2), X(0x76c69647), + X(0x2fe49ba7), X(0x76b3d0b4), X(0x30133539), X(0x76a0f8d2), + X(0x3041c761), X(0x768e0ea6), X(0x30705217), X(0x767b1231), + X(0x309ed556), X(0x76680376), X(0x30cd5115), X(0x7654e279), + X(0x30fbc54d), X(0x7641af3d), X(0x312a31f8), X(0x762e69c4), + X(0x3158970e), X(0x761b1211), X(0x3186f487), X(0x7607a828), + X(0x31b54a5e), X(0x75f42c0b), X(0x31e39889), X(0x75e09dbd), + X(0x3211df04), X(0x75ccfd42), X(0x32401dc6), X(0x75b94a9c), + X(0x326e54c7), X(0x75a585cf), X(0x329c8402), X(0x7591aedd), + X(0x32caab6f), X(0x757dc5ca), X(0x32f8cb07), X(0x7569ca99), + X(0x3326e2c3), X(0x7555bd4c), X(0x3354f29b), X(0x75419de7), + X(0x3382fa88), X(0x752d6c6c), X(0x33b0fa84), X(0x751928e0), + X(0x33def287), X(0x7504d345), X(0x340ce28b), X(0x74f06b9e), + X(0x343aca87), X(0x74dbf1ef), X(0x3468aa76), X(0x74c7663a), + X(0x34968250), X(0x74b2c884), X(0x34c4520d), X(0x749e18cd), + X(0x34f219a8), X(0x7489571c), X(0x351fd918), X(0x74748371), + X(0x354d9057), X(0x745f9dd1), X(0x357b3f5d), X(0x744aa63f), + X(0x35a8e625), X(0x74359cbd), X(0x35d684a6), X(0x74208150), + X(0x36041ad9), X(0x740b53fb), X(0x3631a8b8), X(0x73f614c0), + X(0x365f2e3b), X(0x73e0c3a3), X(0x368cab5c), X(0x73cb60a8), + X(0x36ba2014), X(0x73b5ebd1), X(0x36e78c5b), X(0x73a06522), + X(0x3714f02a), X(0x738acc9e), X(0x37424b7b), X(0x73752249), + X(0x376f9e46), X(0x735f6626), X(0x379ce885), X(0x73499838), + X(0x37ca2a30), X(0x7333b883), X(0x37f76341), X(0x731dc70a), + X(0x382493b0), X(0x7307c3d0), X(0x3851bb77), X(0x72f1aed9), + X(0x387eda8e), X(0x72db8828), X(0x38abf0ef), X(0x72c54fc1), + X(0x38d8fe93), X(0x72af05a7), X(0x39060373), X(0x7298a9dd), + X(0x3932ff87), X(0x72823c67), X(0x395ff2c9), X(0x726bbd48), + X(0x398cdd32), X(0x72552c85), X(0x39b9bebc), X(0x723e8a20), + X(0x39e6975e), X(0x7227d61c), X(0x3a136712), X(0x7211107e), + X(0x3a402dd2), X(0x71fa3949), X(0x3a6ceb96), X(0x71e35080), + X(0x3a99a057), X(0x71cc5626), X(0x3ac64c0f), X(0x71b54a41), + X(0x3af2eeb7), X(0x719e2cd2), X(0x3b1f8848), X(0x7186fdde), + X(0x3b4c18ba), X(0x716fbd68), X(0x3b78a007), X(0x71586b74), + X(0x3ba51e29), X(0x71410805), X(0x3bd19318), X(0x7129931f), + X(0x3bfdfecd), X(0x71120cc5), X(0x3c2a6142), X(0x70fa74fc), + X(0x3c56ba70), X(0x70e2cbc6), X(0x3c830a50), X(0x70cb1128), + X(0x3caf50da), X(0x70b34525), X(0x3cdb8e09), X(0x709b67c0), + X(0x3d07c1d6), X(0x708378ff), X(0x3d33ec39), X(0x706b78e3), + X(0x3d600d2c), X(0x70536771), X(0x3d8c24a8), X(0x703b44ad), + X(0x3db832a6), X(0x7023109a), X(0x3de4371f), X(0x700acb3c), + X(0x3e10320d), X(0x6ff27497), X(0x3e3c2369), X(0x6fda0cae), + X(0x3e680b2c), X(0x6fc19385), X(0x3e93e950), X(0x6fa90921), + X(0x3ebfbdcd), X(0x6f906d84), X(0x3eeb889c), X(0x6f77c0b3), + X(0x3f1749b8), X(0x6f5f02b2), X(0x3f430119), X(0x6f463383), + X(0x3f6eaeb8), X(0x6f2d532c), X(0x3f9a5290), X(0x6f1461b0), + X(0x3fc5ec98), X(0x6efb5f12), X(0x3ff17cca), X(0x6ee24b57), + X(0x401d0321), X(0x6ec92683), X(0x40487f94), X(0x6eaff099), + X(0x4073f21d), X(0x6e96a99d), X(0x409f5ab6), X(0x6e7d5193), + X(0x40cab958), X(0x6e63e87f), X(0x40f60dfb), X(0x6e4a6e66), + X(0x4121589b), X(0x6e30e34a), X(0x414c992f), X(0x6e174730), + X(0x4177cfb1), X(0x6dfd9a1c), X(0x41a2fc1a), X(0x6de3dc11), + X(0x41ce1e65), X(0x6dca0d14), X(0x41f93689), X(0x6db02d29), + X(0x42244481), X(0x6d963c54), X(0x424f4845), X(0x6d7c3a98), + X(0x427a41d0), X(0x6d6227fa), X(0x42a5311b), X(0x6d48047e), + X(0x42d0161e), X(0x6d2dd027), X(0x42faf0d4), X(0x6d138afb), + X(0x4325c135), X(0x6cf934fc), X(0x4350873c), X(0x6cdece2f), + X(0x437b42e1), X(0x6cc45698), X(0x43a5f41e), X(0x6ca9ce3b), + X(0x43d09aed), X(0x6c8f351c), X(0x43fb3746), X(0x6c748b3f), + X(0x4425c923), X(0x6c59d0a9), X(0x4450507e), X(0x6c3f055d), + X(0x447acd50), X(0x6c242960), X(0x44a53f93), X(0x6c093cb6), + X(0x44cfa740), X(0x6bee3f62), X(0x44fa0450), X(0x6bd3316a), + X(0x452456bd), X(0x6bb812d1), X(0x454e9e80), X(0x6b9ce39b), + X(0x4578db93), X(0x6b81a3cd), X(0x45a30df0), X(0x6b66536b), + X(0x45cd358f), X(0x6b4af279), X(0x45f7526b), X(0x6b2f80fb), + X(0x4621647d), X(0x6b13fef5), X(0x464b6bbe), X(0x6af86c6c), + X(0x46756828), X(0x6adcc964), X(0x469f59b4), X(0x6ac115e2), + X(0x46c9405c), X(0x6aa551e9), X(0x46f31c1a), X(0x6a897d7d), + X(0x471cece7), X(0x6a6d98a4), X(0x4746b2bc), X(0x6a51a361), + X(0x47706d93), X(0x6a359db9), X(0x479a1d67), X(0x6a1987b0), + X(0x47c3c22f), X(0x69fd614a), X(0x47ed5be6), X(0x69e12a8c), + X(0x4816ea86), X(0x69c4e37a), X(0x48406e08), X(0x69a88c19), + X(0x4869e665), X(0x698c246c), X(0x48935397), X(0x696fac78), + X(0x48bcb599), X(0x69532442), X(0x48e60c62), X(0x69368bce), + X(0x490f57ee), X(0x6919e320), X(0x49389836), X(0x68fd2a3d), + X(0x4961cd33), X(0x68e06129), X(0x498af6df), X(0x68c387e9), + X(0x49b41533), X(0x68a69e81), X(0x49dd282a), X(0x6889a4f6), + X(0x4a062fbd), X(0x686c9b4b), X(0x4a2f2be6), X(0x684f8186), + X(0x4a581c9e), X(0x683257ab), X(0x4a8101de), X(0x68151dbe), + X(0x4aa9dba2), X(0x67f7d3c5), X(0x4ad2a9e2), X(0x67da79c3), + X(0x4afb6c98), X(0x67bd0fbd), X(0x4b2423be), X(0x679f95b7), + X(0x4b4ccf4d), X(0x67820bb7), X(0x4b756f40), X(0x676471c0), + X(0x4b9e0390), X(0x6746c7d8), X(0x4bc68c36), X(0x67290e02), + X(0x4bef092d), X(0x670b4444), X(0x4c177a6e), X(0x66ed6aa1), + X(0x4c3fdff4), X(0x66cf8120), X(0x4c6839b7), X(0x66b187c3), + X(0x4c9087b1), X(0x66937e91), X(0x4cb8c9dd), X(0x6675658c), + X(0x4ce10034), X(0x66573cbb), X(0x4d092ab0), X(0x66390422), + X(0x4d31494b), X(0x661abbc5), X(0x4d595bfe), X(0x65fc63a9), + X(0x4d8162c4), X(0x65ddfbd3), X(0x4da95d96), X(0x65bf8447), + X(0x4dd14c6e), X(0x65a0fd0b), X(0x4df92f46), X(0x65826622), + X(0x4e210617), X(0x6563bf92), X(0x4e48d0dd), X(0x6545095f), + X(0x4e708f8f), X(0x6526438f), X(0x4e984229), X(0x65076e25), + X(0x4ebfe8a5), X(0x64e88926), X(0x4ee782fb), X(0x64c99498), + X(0x4f0f1126), X(0x64aa907f), X(0x4f369320), X(0x648b7ce0), + X(0x4f5e08e3), X(0x646c59bf), X(0x4f857269), X(0x644d2722), + X(0x4faccfab), X(0x642de50d), X(0x4fd420a4), X(0x640e9386), + X(0x4ffb654d), X(0x63ef3290), X(0x50229da1), X(0x63cfc231), + X(0x5049c999), X(0x63b0426d), X(0x5070e92f), X(0x6390b34a), + X(0x5097fc5e), X(0x637114cc), X(0x50bf031f), X(0x635166f9), + X(0x50e5fd6d), X(0x6331a9d4), X(0x510ceb40), X(0x6311dd64), + X(0x5133cc94), X(0x62f201ac), X(0x515aa162), X(0x62d216b3), + X(0x518169a5), X(0x62b21c7b), X(0x51a82555), X(0x6292130c), + X(0x51ced46e), X(0x6271fa69), X(0x51f576ea), X(0x6251d298), + X(0x521c0cc2), X(0x62319b9d), X(0x524295f0), X(0x6211557e), + X(0x5269126e), X(0x61f1003f), X(0x528f8238), X(0x61d09be5), + X(0x52b5e546), X(0x61b02876), X(0x52dc3b92), X(0x618fa5f7), + X(0x53028518), X(0x616f146c), X(0x5328c1d0), X(0x614e73da), + X(0x534ef1b5), X(0x612dc447), X(0x537514c2), X(0x610d05b7), + X(0x539b2af0), X(0x60ec3830), X(0x53c13439), X(0x60cb5bb7), + X(0x53e73097), X(0x60aa7050), X(0x540d2005), X(0x60897601), + X(0x5433027d), X(0x60686ccf), X(0x5458d7f9), X(0x604754bf), + X(0x547ea073), X(0x60262dd6), X(0x54a45be6), X(0x6004f819), + X(0x54ca0a4b), X(0x5fe3b38d), X(0x54efab9c), X(0x5fc26038), + X(0x55153fd4), X(0x5fa0fe1f), X(0x553ac6ee), X(0x5f7f8d46), + X(0x556040e2), X(0x5f5e0db3), X(0x5585adad), X(0x5f3c7f6b), + X(0x55ab0d46), X(0x5f1ae274), X(0x55d05faa), X(0x5ef936d1), + X(0x55f5a4d2), X(0x5ed77c8a), X(0x561adcb9), X(0x5eb5b3a2), + X(0x56400758), X(0x5e93dc1f), X(0x566524aa), X(0x5e71f606), + X(0x568a34a9), X(0x5e50015d), X(0x56af3750), X(0x5e2dfe29), + X(0x56d42c99), X(0x5e0bec6e), X(0x56f9147e), X(0x5de9cc33), + X(0x571deefa), X(0x5dc79d7c), X(0x5742bc06), X(0x5da5604f), + X(0x57677b9d), X(0x5d8314b1), X(0x578c2dba), X(0x5d60baa7), + X(0x57b0d256), X(0x5d3e5237), X(0x57d5696d), X(0x5d1bdb65), + X(0x57f9f2f8), X(0x5cf95638), X(0x581e6ef1), X(0x5cd6c2b5), + X(0x5842dd54), X(0x5cb420e0), X(0x58673e1b), X(0x5c9170bf), + X(0x588b9140), X(0x5c6eb258), X(0x58afd6bd), X(0x5c4be5b0), + X(0x58d40e8c), X(0x5c290acc), X(0x58f838a9), X(0x5c0621b2), + X(0x591c550e), X(0x5be32a67), X(0x594063b5), X(0x5bc024f0), + X(0x59646498), X(0x5b9d1154), X(0x598857b2), X(0x5b79ef96), + X(0x59ac3cfd), X(0x5b56bfbd), X(0x59d01475), X(0x5b3381ce), + X(0x59f3de12), X(0x5b1035cf), X(0x5a1799d1), X(0x5aecdbc5), + X(0x5a3b47ab), X(0x5ac973b5), X(0x5a5ee79a), X(0x5aa5fda5), + X(0x5a82799a), X(0x5a82799a) + }; + + /* {sin((2*i+1)*PI/4096), cos((2*i+1)*PI/4096)}, with i = 0 to 511 */ +static const LOOKUP_T sincos_lookup1[1024] = { + X(0x001921fb), X(0x7ffffd88), X(0x004b65ee), X(0x7fffe9cb), + X(0x007da9d4), X(0x7fffc251), X(0x00afeda8), X(0x7fff8719), + X(0x00e23160), X(0x7fff3824), X(0x011474f6), X(0x7ffed572), + X(0x0146b860), X(0x7ffe5f03), X(0x0178fb99), X(0x7ffdd4d7), + X(0x01ab3e97), X(0x7ffd36ee), X(0x01dd8154), X(0x7ffc8549), + X(0x020fc3c6), X(0x7ffbbfe6), X(0x024205e8), X(0x7ffae6c7), + X(0x027447b0), X(0x7ff9f9ec), X(0x02a68917), X(0x7ff8f954), + X(0x02d8ca16), X(0x7ff7e500), X(0x030b0aa4), X(0x7ff6bcf0), + X(0x033d4abb), X(0x7ff58125), X(0x036f8a51), X(0x7ff4319d), + X(0x03a1c960), X(0x7ff2ce5b), X(0x03d407df), X(0x7ff1575d), + X(0x040645c7), X(0x7fefcca4), X(0x04388310), X(0x7fee2e30), + X(0x046abfb3), X(0x7fec7c02), X(0x049cfba7), X(0x7feab61a), + X(0x04cf36e5), X(0x7fe8dc78), X(0x05017165), X(0x7fe6ef1c), + X(0x0533ab20), X(0x7fe4ee06), X(0x0565e40d), X(0x7fe2d938), + X(0x05981c26), X(0x7fe0b0b1), X(0x05ca5361), X(0x7fde7471), + X(0x05fc89b8), X(0x7fdc247a), X(0x062ebf22), X(0x7fd9c0ca), + X(0x0660f398), X(0x7fd74964), X(0x06932713), X(0x7fd4be46), + X(0x06c5598a), X(0x7fd21f72), X(0x06f78af6), X(0x7fcf6ce8), + X(0x0729bb4e), X(0x7fcca6a7), X(0x075bea8c), X(0x7fc9ccb2), + X(0x078e18a7), X(0x7fc6df08), X(0x07c04598), X(0x7fc3dda9), + X(0x07f27157), X(0x7fc0c896), X(0x08249bdd), X(0x7fbd9fd0), + X(0x0856c520), X(0x7fba6357), X(0x0888ed1b), X(0x7fb7132b), + X(0x08bb13c5), X(0x7fb3af4e), X(0x08ed3916), X(0x7fb037bf), + X(0x091f5d06), X(0x7facac7f), X(0x09517f8f), X(0x7fa90d8e), + X(0x0983a0a7), X(0x7fa55aee), X(0x09b5c048), X(0x7fa1949e), + X(0x09e7de6a), X(0x7f9dbaa0), X(0x0a19fb04), X(0x7f99ccf4), + X(0x0a4c1610), X(0x7f95cb9a), X(0x0a7e2f85), X(0x7f91b694), + X(0x0ab0475c), X(0x7f8d8de1), X(0x0ae25d8d), X(0x7f895182), + X(0x0b147211), X(0x7f850179), X(0x0b4684df), X(0x7f809dc5), + X(0x0b7895f0), X(0x7f7c2668), X(0x0baaa53b), X(0x7f779b62), + X(0x0bdcb2bb), X(0x7f72fcb4), X(0x0c0ebe66), X(0x7f6e4a5e), + X(0x0c40c835), X(0x7f698461), X(0x0c72d020), X(0x7f64aabf), + X(0x0ca4d620), X(0x7f5fbd77), X(0x0cd6da2d), X(0x7f5abc8a), + X(0x0d08dc3f), X(0x7f55a7fa), X(0x0d3adc4e), X(0x7f507fc7), + X(0x0d6cda53), X(0x7f4b43f2), X(0x0d9ed646), X(0x7f45f47b), + X(0x0dd0d01f), X(0x7f409164), X(0x0e02c7d7), X(0x7f3b1aad), + X(0x0e34bd66), X(0x7f359057), X(0x0e66b0c3), X(0x7f2ff263), + X(0x0e98a1e9), X(0x7f2a40d2), X(0x0eca90ce), X(0x7f247ba5), + X(0x0efc7d6b), X(0x7f1ea2dc), X(0x0f2e67b8), X(0x7f18b679), + X(0x0f604faf), X(0x7f12b67c), X(0x0f923546), X(0x7f0ca2e7), + X(0x0fc41876), X(0x7f067bba), X(0x0ff5f938), X(0x7f0040f6), + X(0x1027d784), X(0x7ef9f29d), X(0x1059b352), X(0x7ef390ae), + X(0x108b8c9b), X(0x7eed1b2c), X(0x10bd6356), X(0x7ee69217), + X(0x10ef377d), X(0x7edff570), X(0x11210907), X(0x7ed94538), + X(0x1152d7ed), X(0x7ed28171), X(0x1184a427), X(0x7ecbaa1a), + X(0x11b66dad), X(0x7ec4bf36), X(0x11e83478), X(0x7ebdc0c6), + X(0x1219f880), X(0x7eb6aeca), X(0x124bb9be), X(0x7eaf8943), + X(0x127d7829), X(0x7ea85033), X(0x12af33ba), X(0x7ea1039b), + X(0x12e0ec6a), X(0x7e99a37c), X(0x1312a230), X(0x7e922fd6), + X(0x13445505), X(0x7e8aa8ac), X(0x137604e2), X(0x7e830dff), + X(0x13a7b1bf), X(0x7e7b5fce), X(0x13d95b93), X(0x7e739e1d), + X(0x140b0258), X(0x7e6bc8eb), X(0x143ca605), X(0x7e63e03b), + X(0x146e4694), X(0x7e5be40c), X(0x149fe3fc), X(0x7e53d462), + X(0x14d17e36), X(0x7e4bb13c), X(0x1503153a), X(0x7e437a9c), + X(0x1534a901), X(0x7e3b3083), X(0x15663982), X(0x7e32d2f4), + X(0x1597c6b7), X(0x7e2a61ed), X(0x15c95097), X(0x7e21dd73), + X(0x15fad71b), X(0x7e194584), X(0x162c5a3b), X(0x7e109a24), + X(0x165dd9f0), X(0x7e07db52), X(0x168f5632), X(0x7dff0911), + X(0x16c0cef9), X(0x7df62362), X(0x16f2443e), X(0x7ded2a47), + X(0x1723b5f9), X(0x7de41dc0), X(0x17552422), X(0x7ddafdce), + X(0x17868eb3), X(0x7dd1ca75), X(0x17b7f5a3), X(0x7dc883b4), + X(0x17e958ea), X(0x7dbf298d), X(0x181ab881), X(0x7db5bc02), + X(0x184c1461), X(0x7dac3b15), X(0x187d6c82), X(0x7da2a6c6), + X(0x18aec0db), X(0x7d98ff17), X(0x18e01167), X(0x7d8f4409), + X(0x19115e1c), X(0x7d85759f), X(0x1942a6f3), X(0x7d7b93da), + X(0x1973ebe6), X(0x7d719eba), X(0x19a52ceb), X(0x7d679642), + X(0x19d669fc), X(0x7d5d7a74), X(0x1a07a311), X(0x7d534b50), + X(0x1a38d823), X(0x7d4908d9), X(0x1a6a0929), X(0x7d3eb30f), + X(0x1a9b361d), X(0x7d3449f5), X(0x1acc5ef6), X(0x7d29cd8c), + X(0x1afd83ad), X(0x7d1f3dd6), X(0x1b2ea43a), X(0x7d149ad5), + X(0x1b5fc097), X(0x7d09e489), X(0x1b90d8bb), X(0x7cff1af5), + X(0x1bc1ec9e), X(0x7cf43e1a), X(0x1bf2fc3a), X(0x7ce94dfb), + X(0x1c240786), X(0x7cde4a98), X(0x1c550e7c), X(0x7cd333f3), + X(0x1c861113), X(0x7cc80a0f), X(0x1cb70f43), X(0x7cbcccec), + X(0x1ce80906), X(0x7cb17c8d), X(0x1d18fe54), X(0x7ca618f3), + X(0x1d49ef26), X(0x7c9aa221), X(0x1d7adb73), X(0x7c8f1817), + X(0x1dabc334), X(0x7c837ad8), X(0x1ddca662), X(0x7c77ca65), + X(0x1e0d84f5), X(0x7c6c06c0), X(0x1e3e5ee5), X(0x7c602fec), + X(0x1e6f342c), X(0x7c5445e9), X(0x1ea004c1), X(0x7c4848ba), + X(0x1ed0d09d), X(0x7c3c3860), X(0x1f0197b8), X(0x7c3014de), + X(0x1f325a0b), X(0x7c23de35), X(0x1f63178f), X(0x7c179467), + X(0x1f93d03c), X(0x7c0b3777), X(0x1fc4840a), X(0x7bfec765), + X(0x1ff532f2), X(0x7bf24434), X(0x2025dcec), X(0x7be5ade6), + X(0x205681f1), X(0x7bd9047c), X(0x208721f9), X(0x7bcc47fa), + X(0x20b7bcfe), X(0x7bbf7860), X(0x20e852f6), X(0x7bb295b0), + X(0x2118e3dc), X(0x7ba59fee), X(0x21496fa7), X(0x7b989719), + X(0x2179f64f), X(0x7b8b7b36), X(0x21aa77cf), X(0x7b7e4c45), + X(0x21daf41d), X(0x7b710a49), X(0x220b6b32), X(0x7b63b543), + X(0x223bdd08), X(0x7b564d36), X(0x226c4996), X(0x7b48d225), + X(0x229cb0d5), X(0x7b3b4410), X(0x22cd12bd), X(0x7b2da2fa), + X(0x22fd6f48), X(0x7b1feee5), X(0x232dc66d), X(0x7b1227d3), + X(0x235e1826), X(0x7b044dc7), X(0x238e646a), X(0x7af660c2), + X(0x23beab33), X(0x7ae860c7), X(0x23eeec78), X(0x7ada4dd8), + X(0x241f2833), X(0x7acc27f7), X(0x244f5e5c), X(0x7abdef25), + X(0x247f8eec), X(0x7aafa367), X(0x24afb9da), X(0x7aa144bc), + X(0x24dfdf20), X(0x7a92d329), X(0x250ffeb7), X(0x7a844eae), + X(0x25401896), X(0x7a75b74f), X(0x25702cb7), X(0x7a670d0d), + X(0x25a03b11), X(0x7a584feb), X(0x25d0439f), X(0x7a497feb), + X(0x26004657), X(0x7a3a9d0f), X(0x26304333), X(0x7a2ba75a), + X(0x26603a2c), X(0x7a1c9ece), X(0x26902b39), X(0x7a0d836d), + X(0x26c01655), X(0x79fe5539), X(0x26effb76), X(0x79ef1436), + X(0x271fda96), X(0x79dfc064), X(0x274fb3ae), X(0x79d059c8), + X(0x277f86b5), X(0x79c0e062), X(0x27af53a6), X(0x79b15435), + X(0x27df1a77), X(0x79a1b545), X(0x280edb23), X(0x79920392), + X(0x283e95a1), X(0x79823f20), X(0x286e49ea), X(0x797267f2), + X(0x289df7f8), X(0x79627e08), X(0x28cd9fc1), X(0x79528167), + X(0x28fd4140), X(0x79427210), X(0x292cdc6d), X(0x79325006), + X(0x295c7140), X(0x79221b4b), X(0x298bffb2), X(0x7911d3e2), + X(0x29bb87bc), X(0x790179cd), X(0x29eb0957), X(0x78f10d0f), + X(0x2a1a847b), X(0x78e08dab), X(0x2a49f920), X(0x78cffba3), + X(0x2a796740), X(0x78bf56f9), X(0x2aa8ced3), X(0x78ae9fb0), + X(0x2ad82fd2), X(0x789dd5cb), X(0x2b078a36), X(0x788cf94c), + X(0x2b36ddf7), X(0x787c0a36), X(0x2b662b0e), X(0x786b088c), + X(0x2b957173), X(0x7859f44f), X(0x2bc4b120), X(0x7848cd83), + X(0x2bf3ea0d), X(0x7837942b), X(0x2c231c33), X(0x78264849), + X(0x2c52478a), X(0x7814e9df), X(0x2c816c0c), X(0x780378f1), + X(0x2cb089b1), X(0x77f1f581), X(0x2cdfa071), X(0x77e05f91), + X(0x2d0eb046), X(0x77ceb725), X(0x2d3db928), X(0x77bcfc3f), + X(0x2d6cbb10), X(0x77ab2ee2), X(0x2d9bb5f6), X(0x77994f11), + X(0x2dcaa9d5), X(0x77875cce), X(0x2df996a3), X(0x7775581d), + X(0x2e287c5a), X(0x776340ff), X(0x2e575af3), X(0x77511778), + X(0x2e863267), X(0x773edb8b), X(0x2eb502ae), X(0x772c8d3a), + X(0x2ee3cbc1), X(0x771a2c88), X(0x2f128d99), X(0x7707b979), + X(0x2f41482e), X(0x76f5340e), X(0x2f6ffb7a), X(0x76e29c4b), + X(0x2f9ea775), X(0x76cff232), X(0x2fcd4c19), X(0x76bd35c7), + X(0x2ffbe95d), X(0x76aa670d), X(0x302a7f3a), X(0x76978605), + X(0x30590dab), X(0x768492b4), X(0x308794a6), X(0x76718d1c), + X(0x30b61426), X(0x765e7540), X(0x30e48c22), X(0x764b4b23), + X(0x3112fc95), X(0x76380ec8), X(0x31416576), X(0x7624c031), + X(0x316fc6be), X(0x76115f63), X(0x319e2067), X(0x75fdec60), + X(0x31cc7269), X(0x75ea672a), X(0x31fabcbd), X(0x75d6cfc5), + X(0x3228ff5c), X(0x75c32634), X(0x32573a3f), X(0x75af6a7b), + X(0x32856d5e), X(0x759b9c9b), X(0x32b398b3), X(0x7587bc98), + X(0x32e1bc36), X(0x7573ca75), X(0x330fd7e1), X(0x755fc635), + X(0x333debab), X(0x754bafdc), X(0x336bf78f), X(0x7537876c), + X(0x3399fb85), X(0x75234ce8), X(0x33c7f785), X(0x750f0054), + X(0x33f5eb89), X(0x74faa1b3), X(0x3423d78a), X(0x74e63108), + X(0x3451bb81), X(0x74d1ae55), X(0x347f9766), X(0x74bd199f), + X(0x34ad6b32), X(0x74a872e8), X(0x34db36df), X(0x7493ba34), + X(0x3508fa66), X(0x747eef85), X(0x3536b5be), X(0x746a12df), + X(0x356468e2), X(0x74552446), X(0x359213c9), X(0x744023bc), + X(0x35bfb66e), X(0x742b1144), X(0x35ed50c9), X(0x7415ece2), + X(0x361ae2d3), X(0x7400b69a), X(0x36486c86), X(0x73eb6e6e), + X(0x3675edd9), X(0x73d61461), X(0x36a366c6), X(0x73c0a878), + X(0x36d0d746), X(0x73ab2ab4), X(0x36fe3f52), X(0x73959b1b), + X(0x372b9ee3), X(0x737ff9ae), X(0x3758f5f2), X(0x736a4671), + X(0x37864477), X(0x73548168), X(0x37b38a6d), X(0x733eaa96), + X(0x37e0c7cc), X(0x7328c1ff), X(0x380dfc8d), X(0x7312c7a5), + X(0x383b28a9), X(0x72fcbb8c), X(0x38684c19), X(0x72e69db7), + X(0x389566d6), X(0x72d06e2b), X(0x38c278d9), X(0x72ba2cea), + X(0x38ef821c), X(0x72a3d9f7), X(0x391c8297), X(0x728d7557), + X(0x39497a43), X(0x7276ff0d), X(0x39766919), X(0x7260771b), + X(0x39a34f13), X(0x7249dd86), X(0x39d02c2a), X(0x72333251), + X(0x39fd0056), X(0x721c7580), X(0x3a29cb91), X(0x7205a716), + X(0x3a568dd4), X(0x71eec716), X(0x3a834717), X(0x71d7d585), + X(0x3aaff755), X(0x71c0d265), X(0x3adc9e86), X(0x71a9bdba), + X(0x3b093ca3), X(0x71929789), X(0x3b35d1a5), X(0x717b5fd3), + X(0x3b625d86), X(0x7164169d), X(0x3b8ee03e), X(0x714cbbeb), + X(0x3bbb59c7), X(0x71354fc0), X(0x3be7ca1a), X(0x711dd220), + X(0x3c143130), X(0x7106430e), X(0x3c408f03), X(0x70eea28e), + X(0x3c6ce38a), X(0x70d6f0a4), X(0x3c992ec0), X(0x70bf2d53), + X(0x3cc5709e), X(0x70a7589f), X(0x3cf1a91c), X(0x708f728b), + X(0x3d1dd835), X(0x70777b1c), X(0x3d49fde1), X(0x705f7255), + X(0x3d761a19), X(0x70475839), X(0x3da22cd7), X(0x702f2ccd), + X(0x3dce3614), X(0x7016f014), X(0x3dfa35c8), X(0x6ffea212), + X(0x3e262bee), X(0x6fe642ca), X(0x3e52187f), X(0x6fcdd241), + X(0x3e7dfb73), X(0x6fb5507a), X(0x3ea9d4c3), X(0x6f9cbd79), + X(0x3ed5a46b), X(0x6f841942), X(0x3f016a61), X(0x6f6b63d8), + X(0x3f2d26a0), X(0x6f529d40), X(0x3f58d921), X(0x6f39c57d), + X(0x3f8481dd), X(0x6f20dc92), X(0x3fb020ce), X(0x6f07e285), + X(0x3fdbb5ec), X(0x6eeed758), X(0x40074132), X(0x6ed5bb10), + X(0x4032c297), X(0x6ebc8db0), X(0x405e3a16), X(0x6ea34f3d), + X(0x4089a7a8), X(0x6e89ffb9), X(0x40b50b46), X(0x6e709f2a), + X(0x40e064ea), X(0x6e572d93), X(0x410bb48c), X(0x6e3daaf8), + X(0x4136fa27), X(0x6e24175c), X(0x416235b2), X(0x6e0a72c5), + X(0x418d6729), X(0x6df0bd35), X(0x41b88e84), X(0x6dd6f6b1), + X(0x41e3abbc), X(0x6dbd1f3c), X(0x420ebecb), X(0x6da336dc), + X(0x4239c7aa), X(0x6d893d93), X(0x4264c653), X(0x6d6f3365), + X(0x428fbabe), X(0x6d551858), X(0x42baa4e6), X(0x6d3aec6e), + X(0x42e584c3), X(0x6d20afac), X(0x43105a50), X(0x6d066215), + X(0x433b2585), X(0x6cec03af), X(0x4365e65b), X(0x6cd1947c), + X(0x43909ccd), X(0x6cb71482), X(0x43bb48d4), X(0x6c9c83c3), + X(0x43e5ea68), X(0x6c81e245), X(0x44108184), X(0x6c67300b), + X(0x443b0e21), X(0x6c4c6d1a), X(0x44659039), X(0x6c319975), + X(0x449007c4), X(0x6c16b521), X(0x44ba74bd), X(0x6bfbc021), + X(0x44e4d71c), X(0x6be0ba7b), X(0x450f2edb), X(0x6bc5a431), + X(0x45397bf4), X(0x6baa7d49), X(0x4563be60), X(0x6b8f45c7), + X(0x458df619), X(0x6b73fdae), X(0x45b82318), X(0x6b58a503), + X(0x45e24556), X(0x6b3d3bcb), X(0x460c5cce), X(0x6b21c208), + X(0x46366978), X(0x6b0637c1), X(0x46606b4e), X(0x6aea9cf8), + X(0x468a624a), X(0x6acef1b2), X(0x46b44e65), X(0x6ab335f4), + X(0x46de2f99), X(0x6a9769c1), X(0x470805df), X(0x6a7b8d1e), + X(0x4731d131), X(0x6a5fa010), X(0x475b9188), X(0x6a43a29a), + X(0x478546de), X(0x6a2794c1), X(0x47aef12c), X(0x6a0b7689), + X(0x47d8906d), X(0x69ef47f6), X(0x48022499), X(0x69d3090e), + X(0x482badab), X(0x69b6b9d3), X(0x48552b9b), X(0x699a5a4c), + X(0x487e9e64), X(0x697dea7b), X(0x48a805ff), X(0x69616a65), + X(0x48d16265), X(0x6944da10), X(0x48fab391), X(0x6928397e), + X(0x4923f97b), X(0x690b88b5), X(0x494d341e), X(0x68eec7b9), + X(0x49766373), X(0x68d1f68f), X(0x499f8774), X(0x68b5153a), + X(0x49c8a01b), X(0x689823bf), X(0x49f1ad61), X(0x687b2224), + X(0x4a1aaf3f), X(0x685e106c), X(0x4a43a5b0), X(0x6840ee9b), + X(0x4a6c90ad), X(0x6823bcb7), X(0x4a957030), X(0x68067ac3), + X(0x4abe4433), X(0x67e928c5), X(0x4ae70caf), X(0x67cbc6c0), + X(0x4b0fc99d), X(0x67ae54ba), X(0x4b387af9), X(0x6790d2b6), + X(0x4b6120bb), X(0x677340ba), X(0x4b89badd), X(0x67559eca), + X(0x4bb24958), X(0x6737ecea), X(0x4bdacc28), X(0x671a2b20), + X(0x4c034345), X(0x66fc596f), X(0x4c2baea9), X(0x66de77dc), + X(0x4c540e4e), X(0x66c0866d), X(0x4c7c622d), X(0x66a28524), + X(0x4ca4aa41), X(0x66847408), X(0x4ccce684), X(0x6666531d), + X(0x4cf516ee), X(0x66482267), X(0x4d1d3b7a), X(0x6629e1ec), + X(0x4d455422), X(0x660b91af), X(0x4d6d60df), X(0x65ed31b5), + X(0x4d9561ac), X(0x65cec204), X(0x4dbd5682), X(0x65b0429f), + X(0x4de53f5a), X(0x6591b38c), X(0x4e0d1c30), X(0x657314cf), + X(0x4e34ecfc), X(0x6554666d), X(0x4e5cb1b9), X(0x6535a86b), + X(0x4e846a60), X(0x6516dacd), X(0x4eac16eb), X(0x64f7fd98), + X(0x4ed3b755), X(0x64d910d1), X(0x4efb4b96), X(0x64ba147d), + X(0x4f22d3aa), X(0x649b08a0), X(0x4f4a4f89), X(0x647bed3f), + X(0x4f71bf2e), X(0x645cc260), X(0x4f992293), X(0x643d8806), + X(0x4fc079b1), X(0x641e3e38), X(0x4fe7c483), X(0x63fee4f8), + X(0x500f0302), X(0x63df7c4d), X(0x50363529), X(0x63c0043b), + X(0x505d5af1), X(0x63a07cc7), X(0x50847454), X(0x6380e5f6), + X(0x50ab814d), X(0x63613fcd), X(0x50d281d5), X(0x63418a50), + X(0x50f975e6), X(0x6321c585), X(0x51205d7b), X(0x6301f171), + X(0x5147388c), X(0x62e20e17), X(0x516e0715), X(0x62c21b7e), + X(0x5194c910), X(0x62a219aa), X(0x51bb7e75), X(0x628208a1), + X(0x51e22740), X(0x6261e866), X(0x5208c36a), X(0x6241b8ff), + X(0x522f52ee), X(0x62217a72), X(0x5255d5c5), X(0x62012cc2), + X(0x527c4bea), X(0x61e0cff5), X(0x52a2b556), X(0x61c06410), + X(0x52c91204), X(0x619fe918), X(0x52ef61ee), X(0x617f5f12), + X(0x5315a50e), X(0x615ec603), X(0x533bdb5d), X(0x613e1df0), + X(0x536204d7), X(0x611d66de), X(0x53882175), X(0x60fca0d2), + X(0x53ae3131), X(0x60dbcbd1), X(0x53d43406), X(0x60bae7e1), + X(0x53fa29ed), X(0x6099f505), X(0x542012e1), X(0x6078f344), + X(0x5445eedb), X(0x6057e2a2), X(0x546bbdd7), X(0x6036c325), + X(0x54917fce), X(0x601594d1), X(0x54b734ba), X(0x5ff457ad), + X(0x54dcdc96), X(0x5fd30bbc), X(0x5502775c), X(0x5fb1b104), + X(0x55280505), X(0x5f90478a), X(0x554d858d), X(0x5f6ecf53), + X(0x5572f8ed), X(0x5f4d4865), X(0x55985f20), X(0x5f2bb2c5), + X(0x55bdb81f), X(0x5f0a0e77), X(0x55e303e6), X(0x5ee85b82), + X(0x5608426e), X(0x5ec699e9), X(0x562d73b2), X(0x5ea4c9b3), + X(0x565297ab), X(0x5e82eae5), X(0x5677ae54), X(0x5e60fd84), + X(0x569cb7a8), X(0x5e3f0194), X(0x56c1b3a1), X(0x5e1cf71c), + X(0x56e6a239), X(0x5dfade20), X(0x570b8369), X(0x5dd8b6a7), + X(0x5730572e), X(0x5db680b4), X(0x57551d80), X(0x5d943c4e), + X(0x5779d65b), X(0x5d71e979), X(0x579e81b8), X(0x5d4f883b), + X(0x57c31f92), X(0x5d2d189a), X(0x57e7afe4), X(0x5d0a9a9a), + X(0x580c32a7), X(0x5ce80e41), X(0x5830a7d6), X(0x5cc57394), + X(0x58550f6c), X(0x5ca2ca99), X(0x58796962), X(0x5c801354), + X(0x589db5b3), X(0x5c5d4dcc), X(0x58c1f45b), X(0x5c3a7a05), + X(0x58e62552), X(0x5c179806), X(0x590a4893), X(0x5bf4a7d2), + X(0x592e5e19), X(0x5bd1a971), X(0x595265df), X(0x5bae9ce7), + X(0x59765fde), X(0x5b8b8239), X(0x599a4c12), X(0x5b68596d), + X(0x59be2a74), X(0x5b452288), X(0x59e1faff), X(0x5b21dd90), + X(0x5a05bdae), X(0x5afe8a8b), X(0x5a29727b), X(0x5adb297d), + X(0x5a4d1960), X(0x5ab7ba6c), X(0x5a70b258), X(0x5a943d5e), +}; + diff --git a/media/libtremor/lib/misc.h b/media/libtremor/lib/misc.h new file mode 100644 index 000000000000..2fc521a2440f --- /dev/null +++ b/media/libtremor/lib/misc.h @@ -0,0 +1,250 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: miscellaneous math and prototypes + + ********************************************************************/ + +#ifndef _V_RANDOM_H_ +#define _V_RANDOM_H_ +#include "ivorbiscodec.h" +#include "os.h" + +#ifdef _LOW_ACCURACY_ +# define X(n) (((((n)>>22)+1)>>1) - ((((n)>>22)+1)>>9)) +# define LOOKUP_T const unsigned char +#else +# define X(n) (n) +# define LOOKUP_T const ogg_int32_t +#endif + +#include "asm_arm.h" +#include /* for abs() */ + +#ifndef _V_WIDE_MATH +#define _V_WIDE_MATH + +#ifndef _LOW_ACCURACY_ +/* 64 bit multiply */ + +#if !(defined WIN32 && defined WINCE) +#include +#endif + +#if BYTE_ORDER==LITTLE_ENDIAN +union magic { + struct { + ogg_int32_t lo; + ogg_int32_t hi; + } halves; + ogg_int64_t whole; +}; +#elif BYTE_ORDER==BIG_ENDIAN +union magic { + struct { + ogg_int32_t hi; + ogg_int32_t lo; + } halves; + ogg_int64_t whole; +}; +#endif + +STIN ogg_int32_t MULT32(ogg_int32_t x, ogg_int32_t y) { + union magic magic; + magic.whole = (ogg_int64_t)x * y; + return magic.halves.hi; +} + +STIN ogg_int32_t MULT31(ogg_int32_t x, ogg_int32_t y) { + return MULT32(x,y)<<1; +} + +STIN ogg_int32_t MULT31_SHIFT15(ogg_int32_t x, ogg_int32_t y) { + union magic magic; + magic.whole = (ogg_int64_t)x * y; + return ((ogg_uint32_t)(magic.halves.lo)>>15) | ((magic.halves.hi)<<17); +} + +#else +/* 32 bit multiply, more portable but less accurate */ + +/* + * Note: Precision is biased towards the first argument therefore ordering + * is important. Shift values were chosen for the best sound quality after + * many listening tests. + */ + +/* + * For MULT32 and MULT31: The second argument is always a lookup table + * value already preshifted from 31 to 8 bits. We therefore take the + * opportunity to save on text space and use unsigned char for those + * tables in this case. + */ + +STIN ogg_int32_t MULT32(ogg_int32_t x, ogg_int32_t y) { + return (x >> 9) * y; /* y preshifted >>23 */ +} + +STIN ogg_int32_t MULT31(ogg_int32_t x, ogg_int32_t y) { + return (x >> 8) * y; /* y preshifted >>23 */ +} + +STIN ogg_int32_t MULT31_SHIFT15(ogg_int32_t x, ogg_int32_t y) { + return (x >> 6) * y; /* y preshifted >>9 */ +} + +#endif + +/* + * This should be used as a memory barrier, forcing all cached values in + * registers to wr writen back to memory. Might or might not be beneficial + * depending on the architecture and compiler. + */ +#define MB() + +/* + * The XPROD functions are meant to optimize the cross products found all + * over the place in mdct.c by forcing memory operation ordering to avoid + * unnecessary register reloads as soon as memory is being written to. + * However this is only beneficial on CPUs with a sane number of general + * purpose registers which exclude the Intel x86. On Intel, better let the + * compiler actually reload registers directly from original memory by using + * macros. + */ + +#ifdef __i386__ + +#define XPROD32(_a, _b, _t, _v, _x, _y) \ + { *(_x)=MULT32(_a,_t)+MULT32(_b,_v); \ + *(_y)=MULT32(_b,_t)-MULT32(_a,_v); } +#define XPROD31(_a, _b, _t, _v, _x, _y) \ + { *(_x)=MULT31(_a,_t)+MULT31(_b,_v); \ + *(_y)=MULT31(_b,_t)-MULT31(_a,_v); } +#define XNPROD31(_a, _b, _t, _v, _x, _y) \ + { *(_x)=MULT31(_a,_t)-MULT31(_b,_v); \ + *(_y)=MULT31(_b,_t)+MULT31(_a,_v); } + +#else + +STIN void XPROD32(ogg_int32_t a, ogg_int32_t b, + ogg_int32_t t, ogg_int32_t v, + ogg_int32_t *x, ogg_int32_t *y) +{ + *x = MULT32(a, t) + MULT32(b, v); + *y = MULT32(b, t) - MULT32(a, v); +} + +STIN void XPROD31(ogg_int32_t a, ogg_int32_t b, + ogg_int32_t t, ogg_int32_t v, + ogg_int32_t *x, ogg_int32_t *y) +{ + *x = MULT31(a, t) + MULT31(b, v); + *y = MULT31(b, t) - MULT31(a, v); +} + +STIN void XNPROD31(ogg_int32_t a, ogg_int32_t b, + ogg_int32_t t, ogg_int32_t v, + ogg_int32_t *x, ogg_int32_t *y) +{ + *x = MULT31(a, t) - MULT31(b, v); + *y = MULT31(b, t) + MULT31(a, v); +} + +#endif + +#endif + +#ifndef _V_CLIP_MATH +#define _V_CLIP_MATH + +STIN ogg_int32_t CLIP_TO_15(ogg_int32_t x) { + int ret=x; + ret-= ((x<=32767)-1)&(x-32767); + ret-= ((x>=-32768)-1)&(x+32768); + return(ret); +} + +#endif + +STIN ogg_int32_t VFLOAT_MULT(ogg_int32_t a,ogg_int32_t ap, + ogg_int32_t b,ogg_int32_t bp, + ogg_int32_t *p){ + if(a && b){ +#ifndef _LOW_ACCURACY_ + *p=ap+bp+32; + return MULT32(a,b); +#else + *p=ap+bp+31; + return (a>>15)*(b>>16); +#endif + }else + return 0; +} + +int _ilog(unsigned int); + +STIN ogg_int32_t VFLOAT_MULTI(ogg_int32_t a,ogg_int32_t ap, + ogg_int32_t i, + ogg_int32_t *p){ + + int ip=_ilog(abs(i))-31; + return VFLOAT_MULT(a,ap,i<<-ip,ip,p); +} + +STIN ogg_int32_t VFLOAT_ADD(ogg_int32_t a,ogg_int32_t ap, + ogg_int32_t b,ogg_int32_t bp, + ogg_int32_t *p){ + + if(!a){ + *p=bp; + return b; + }else if(!b){ + *p=ap; + return a; + } + + /* yes, this can leak a bit. */ + if(ap>bp){ + int shift=ap-bp+1; + *p=ap+1; + a>>=1; + if(shift<32){ + b=(b+(1<<(shift-1)))>>shift; + }else{ + b=0; + } + }else{ + int shift=bp-ap+1; + *p=bp+1; + b>>=1; + if(shift<32){ + a=(a+(1<<(shift-1)))>>shift; + }else{ + a=0; + } + } + + a+=b; + if((a&0xc0000000)==0xc0000000 || + (a&0xc0000000)==0){ + a<<=1; + (*p)--; + } + return(a); +} + +#endif + + + + diff --git a/media/libtremor/lib/moz.build b/media/libtremor/lib/moz.build new file mode 100644 index 000000000000..11d49a744aea --- /dev/null +++ b/media/libtremor/lib/moz.build @@ -0,0 +1,35 @@ +# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- +# vim: set filetype=python: +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +SOURCES += [ + 'tremor_block.c', + 'tremor_codebook.c', + 'tremor_floor0.c', + 'tremor_floor1.c', + 'tremor_info.c', + 'tremor_mapping0.c', + 'tremor_mdct.c', + 'tremor_registry.c', + 'tremor_res012.c', + 'tremor_sharedbook.c', + 'tremor_synthesis.c', + 'tremor_window.c', +] + +FINAL_LIBRARY = 'gkmedias' + +if CONFIG['OS_ARCH'] == 'AIX': + DEFINES['alloca'] = '__alloca' + +if CONFIG['CPU_ARCH'] == 'arm' and CONFIG['CC_TYPE'] in ('clang', 'gcc') and not CONFIG['MOZ_THUMB2']: + DEFINES['_ARM_ASSEM_'] = True + +LOCAL_INCLUDES += [ + '/media/libtremor/include/tremor', +] + +# We allow warnings for third-party code that can be updated from upstream. +AllowCompilerWarnings() diff --git a/media/libtremor/lib/os.h b/media/libtremor/lib/os.h new file mode 100644 index 000000000000..130d27de3263 --- /dev/null +++ b/media/libtremor/lib/os.h @@ -0,0 +1,64 @@ +#ifndef _OS_H +#define _OS_H +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: #ifdef jail to whip a few platforms into the UNIX ideal. + + ********************************************************************/ + +#include +#include + +#ifndef _V_IFDEFJAIL_H_ +# define _V_IFDEFJAIL_H_ + +# ifdef __GNUC__ +# define STIN static __inline__ +# elif _WIN32 +# define STIN static __inline +# endif +#else +# define STIN static +#endif + +#ifndef M_PI +# define M_PI (3.1415926536f) +#endif + +#ifdef _WIN32 +# include +# define rint(x) (floor((x)+0.5f)) +# define NO_FLOAT_MATH_LIB +# define FAST_HYPOT(a, b) sqrt((a)*(a) + (b)*(b)) +# define LITTLE_ENDIAN 1 +# define BYTE_ORDER LITTLE_ENDIAN +#endif + +#ifdef HAVE_ALLOCA_H +# include +#endif + +#ifdef USE_MEMORY_H +# include +#endif + +#ifndef min +# define min(x,y) ((x)>(y)?(y):(x)) +#endif + +#ifndef max +# define max(x,y) ((x)<(y)?(y):(x)) +#endif + +#endif /* _OS_H */ diff --git a/media/libtremor/lib/registry.h b/media/libtremor/lib/registry.h new file mode 100644 index 000000000000..2bc8068f6946 --- /dev/null +++ b/media/libtremor/lib/registry.h @@ -0,0 +1,40 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: registry for time, floor, res backends and channel mappings + + ********************************************************************/ + +#ifndef _V_REG_H_ +#define _V_REG_H_ + +#define VI_TRANSFORMB 1 +#define VI_WINDOWB 1 +#define VI_TIMEB 1 +#define VI_FLOORB 2 +#define VI_RESB 3 +#define VI_MAPB 1 + +#include "backends.h" + +#if defined(_WIN32) && defined(VORBISDLL_IMPORT) +# define EXTERN __declspec(dllimport) extern +#else +# define EXTERN extern +#endif + +EXTERN vorbis_func_floor *_floor_P[]; +EXTERN vorbis_func_residue *_residue_P[]; +EXTERN vorbis_func_mapping *_mapping_P[]; + +#endif diff --git a/media/libtremor/lib/tremor_block.c b/media/libtremor/lib/tremor_block.c new file mode 100644 index 000000000000..666bc51a6248 --- /dev/null +++ b/media/libtremor/lib/tremor_block.c @@ -0,0 +1,497 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: PCM data vector blocking, windowing and dis/reassembly + + ********************************************************************/ + +#include +#include +#include +#include +#include "ivorbiscodec.h" +#include "codec_internal.h" + +#include "window.h" +#include "registry.h" +#include "misc.h" + +static int ilog(unsigned int v){ + int ret=0; + if(v)--v; + while(v){ + ret++; + v>>=1; + } + return(ret); +} + +/* pcm accumulator examples (not exhaustive): + + <-------------- lW ----------------> + <--------------- W ----------------> +: .....|..... _______________ | +: .''' | '''_--- | |\ | +:.....''' |_____--- '''......| | \_______| +:.................|__________________|_______|__|______| + |<------ Sl ------>| > Sr < |endW + |beginSl |endSl | |endSr + |beginW |endlW |beginSr + + + |< lW >| + <--------------- W ----------------> + | | .. ______________ | + | | ' `/ | ---_ | + |___.'___/`. | ---_____| + |_______|__|_______|_________________| + | >|Sl|< |<------ Sr ----->|endW + | | |endSl |beginSr |endSr + |beginW | |endlW + mult[0] |beginSl mult[n] + + <-------------- lW -----------------> + |<--W-->| +: .............. ___ | | +: .''' |`/ \ | | +:.....''' |/`....\|...| +:.........................|___|___|___| + |Sl |Sr |endW + | | |endSr + | |beginSr + | |endSl + |beginSl + |beginW +*/ + +/* block abstraction setup *********************************************/ + +#ifndef WORD_ALIGN +#define WORD_ALIGN 8 +#endif + +int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb){ + memset(vb,0,sizeof(*vb)); + vb->vd=v; + vb->localalloc=0; + vb->localstore=NULL; + + return(0); +} + +void *_vorbis_block_alloc(vorbis_block *vb,long bytes){ + bytes=(bytes+(WORD_ALIGN-1)) & ~(WORD_ALIGN-1); + if(bytes+vb->localtop>vb->localalloc){ + /* can't just _ogg_realloc... there are outstanding pointers */ + if(vb->localstore){ + struct alloc_chain *link=(struct alloc_chain *)_ogg_malloc(sizeof(*link)); + vb->totaluse+=vb->localtop; + link->next=vb->reap; + link->ptr=vb->localstore; + vb->reap=link; + } + /* highly conservative */ + vb->localalloc=bytes; + vb->localstore=_ogg_malloc(vb->localalloc); + vb->localtop=0; + } + { + void *ret=(void *)(((char *)vb->localstore)+vb->localtop); + vb->localtop+=bytes; + return ret; + } +} + +/* reap the chain, pull the ripcord */ +void _vorbis_block_ripcord(vorbis_block *vb){ + /* reap the chain */ + struct alloc_chain *reap=vb->reap; + while(reap){ + struct alloc_chain *next=reap->next; + _ogg_free(reap->ptr); + memset(reap,0,sizeof(*reap)); + _ogg_free(reap); + reap=next; + } + /* consolidate storage */ + if(vb->totaluse){ + vb->localstore=_ogg_realloc(vb->localstore,vb->totaluse+vb->localalloc); + vb->localalloc+=vb->totaluse; + vb->totaluse=0; + } + + /* pull the ripcord */ + vb->localtop=0; + vb->reap=NULL; +} + +int vorbis_block_clear(vorbis_block *vb){ + _vorbis_block_ripcord(vb); + if(vb->localstore)_ogg_free(vb->localstore); + + memset(vb,0,sizeof(*vb)); + return(0); +} + +static int _vds_init(vorbis_dsp_state *v,vorbis_info *vi){ + int i; + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + private_state *b=NULL; + + if(ci==NULL) return 1; + + memset(v,0,sizeof(*v)); + b=(private_state *)(v->backend_state=_ogg_calloc(1,sizeof(*b))); + + v->vi=vi; + b->modebits=ilog(ci->modes); + + /* Vorbis I uses only window type 0 */ + b->window[0]=_vorbis_window(0,ci->blocksizes[0]/2); + b->window[1]=_vorbis_window(0,ci->blocksizes[1]/2); + + /* finish the codebooks */ + if(!ci->fullbooks){ + ci->fullbooks=(codebook *)_ogg_calloc(ci->books,sizeof(*ci->fullbooks)); + for(i=0;ibooks;i++){ + if(ci->book_param[i]==NULL) + goto abort_books; + if(vorbis_book_init_decode(ci->fullbooks+i,ci->book_param[i])) + goto abort_books; + /* decode codebooks are now standalone after init */ + vorbis_staticbook_destroy(ci->book_param[i]); + ci->book_param[i]=NULL; + } + } + + v->pcm_storage=ci->blocksizes[1]; + v->pcm=(ogg_int32_t **)_ogg_malloc(vi->channels*sizeof(*v->pcm)); + v->pcmret=(ogg_int32_t **)_ogg_malloc(vi->channels*sizeof(*v->pcmret)); + for(i=0;ichannels;i++) + v->pcm[i]=(ogg_int32_t *)_ogg_calloc(v->pcm_storage,sizeof(*v->pcm[i])); + + /* all 1 (large block) or 0 (small block) */ + /* explicitly set for the sake of clarity */ + v->lW=0; /* previous window size */ + v->W=0; /* current window size */ + + /* initialize all the mapping/backend lookups */ + b->mode=(vorbis_look_mapping **)_ogg_calloc(ci->modes,sizeof(*b->mode)); + for(i=0;imodes;i++){ + int mapnum=ci->mode_param[i]->mapping; + int maptype=ci->map_type[mapnum]; + b->mode[i]=_mapping_P[maptype]->look(v,ci->mode_param[i], + ci->map_param[mapnum]); + } + return 0; +abort_books: + for(i=0;ibooks;i++){ + if(ci->book_param[i]!=NULL){ + vorbis_staticbook_destroy(ci->book_param[i]); + ci->book_param[i]=NULL; + } + } + vorbis_dsp_clear(v); + return -1; +} + +int vorbis_synthesis_restart(vorbis_dsp_state *v){ + vorbis_info *vi=v->vi; + codec_setup_info *ci; + + if(!v->backend_state)return -1; + if(!vi)return -1; + ci=vi->codec_setup; + if(!ci)return -1; + + v->centerW=ci->blocksizes[1]/2; + v->pcm_current=v->centerW; + + v->pcm_returned=-1; + v->granulepos=-1; + v->sequence=-1; + ((private_state *)(v->backend_state))->sample_count=-1; + + return(0); +} + +int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi){ + if(_vds_init(v,vi))return 1; + vorbis_synthesis_restart(v); + + return 0; +} + +void vorbis_dsp_clear(vorbis_dsp_state *v){ + int i; + if(v){ + vorbis_info *vi=v->vi; + codec_setup_info *ci=(codec_setup_info *)(vi?vi->codec_setup:NULL); + private_state *b=(private_state *)v->backend_state; + + if(v->pcm){ + for(i=0;ichannels;i++) + if(v->pcm[i])_ogg_free(v->pcm[i]); + _ogg_free(v->pcm); + if(v->pcmret)_ogg_free(v->pcmret); + } + + /* free mode lookups; these are actually vorbis_look_mapping structs */ + if(ci){ + for(i=0;imodes;i++){ + int mapnum=ci->mode_param[i]->mapping; + int maptype=ci->map_type[mapnum]; + if(b && b->mode)_mapping_P[maptype]->free_look(b->mode[i]); + } + } + + if(b){ + if(b->mode)_ogg_free(b->mode); + _ogg_free(b); + } + + memset(v,0,sizeof(*v)); + } +} + +/* Unlike in analysis, the window is only partially applied for each + block. The time domain envelope is not yet handled at the point of + calling (as it relies on the previous block). */ + +int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb){ + vorbis_info *vi=v->vi; + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + private_state *b=v->backend_state; + int i,j; + + if(v->pcm_current>v->pcm_returned && v->pcm_returned!=-1)return(OV_EINVAL); + + v->lW=v->W; + v->W=vb->W; + v->nW=-1; + + if((v->sequence==-1)|| + (v->sequence+1 != vb->sequence)){ + v->granulepos=-1; /* out of sequence; lose count */ + b->sample_count=-1; + } + + v->sequence=vb->sequence; + + if(vb->pcm){ /* no pcm to process if vorbis_synthesis_trackonly + was called on block */ + int n=ci->blocksizes[v->W]/2; + int n0=ci->blocksizes[0]/2; + int n1=ci->blocksizes[1]/2; + + int thisCenter; + int prevCenter; + + if(v->centerW){ + thisCenter=n1; + prevCenter=0; + }else{ + thisCenter=0; + prevCenter=n1; + } + + /* v->pcm is now used like a two-stage double buffer. We don't want + to have to constantly shift *or* adjust memory usage. Don't + accept a new block until the old is shifted out */ + + /* overlap/add PCM */ + + for(j=0;jchannels;j++){ + /* the overlap/add section */ + if(v->lW){ + if(v->W){ + /* large/large */ + ogg_int32_t *pcm=v->pcm[j]+prevCenter; + ogg_int32_t *p=vb->pcm[j]; + for(i=0;ipcm[j]+prevCenter+n1/2-n0/2; + ogg_int32_t *p=vb->pcm[j]; + for(i=0;iW){ + /* small/large */ + ogg_int32_t *pcm=v->pcm[j]+prevCenter; + ogg_int32_t *p=vb->pcm[j]+n1/2-n0/2; + for(i=0;ipcm[j]+prevCenter; + ogg_int32_t *p=vb->pcm[j]; + for(i=0;ipcm[j]+thisCenter; + ogg_int32_t *p=vb->pcm[j]+n; + for(i=0;icenterW) + v->centerW=0; + else + v->centerW=n1; + + /* deal with initial packet state; we do this using the explicit + pcm_returned==-1 flag otherwise we're sensitive to first block + being short or long */ + + if(v->pcm_returned==-1){ + v->pcm_returned=thisCenter; + v->pcm_current=thisCenter; + }else{ + v->pcm_returned=prevCenter; + v->pcm_current=prevCenter+ + ci->blocksizes[v->lW]/4+ + ci->blocksizes[v->W]/4; + } + + } + + /* track the frame number... This is for convenience, but also + making sure our last packet doesn't end with added padding. If + the last packet is partial, the number of samples we'll have to + return will be past the vb->granulepos. + + This is not foolproof! It will be confused if we begin + decoding at the last page after a seek or hole. In that case, + we don't have a starting point to judge where the last frame + is. For this reason, vorbisfile will always try to make sure + it reads the last two marked pages in proper sequence */ + + if(b->sample_count==-1){ + b->sample_count=0; + }else{ + b->sample_count+=ci->blocksizes[v->lW]/4+ci->blocksizes[v->W]/4; + } + + if(v->granulepos==-1){ + if(vb->granulepos!=-1){ /* only set if we have a position to set to */ + + v->granulepos=vb->granulepos; + + /* is this a short page? */ + if(b->sample_count>v->granulepos){ + /* corner case; if this is both the first and last audio page, + then spec says the end is cut, not beginning */ + long extra=b->sample_count-vb->granulepos; + + /* we use ogg_int64_t for granule positions because a + uint64 isn't universally available. Unfortunately, + that means granposes can be 'negative' and result in + extra being negative */ + if(extra<0) + extra=0; + + if(vb->eofflag){ + /* trim the end */ + /* no preceeding granulepos; assume we started at zero (we'd + have to in a short single-page stream) */ + /* granulepos could be -1 due to a seek, but that would result + in a long coun`t, not short count */ + + /* Guard against corrupt/malicious frames that set EOP and + a backdated granpos; don't rewind more samples than we + actually have */ + if(extra > v->pcm_current - v->pcm_returned) + extra = v->pcm_current - v->pcm_returned; + + v->pcm_current-=extra; + }else{ + /* trim the beginning */ + v->pcm_returned+=extra; + if(v->pcm_returned>v->pcm_current) + v->pcm_returned=v->pcm_current; + } + + } + + } + }else{ + v->granulepos+=ci->blocksizes[v->lW]/4+ci->blocksizes[v->W]/4; + if(vb->granulepos!=-1 && v->granulepos!=vb->granulepos){ + + if(v->granulepos>vb->granulepos){ + long extra=v->granulepos-vb->granulepos; + + if(extra) + if(vb->eofflag){ + /* partial last frame. Strip the extra samples off */ + + /* Guard against corrupt/malicious frames that set EOP and + a backdated granpos; don't rewind more samples than we + actually have */ + if(extra > v->pcm_current - v->pcm_returned) + extra = v->pcm_current - v->pcm_returned; + + /* we use ogg_int64_t for granule positions because a + uint64 isn't universally available. Unfortunately, + that means granposes can be 'negative' and result in + extra being negative */ + if(extra<0) + extra=0; + + v->pcm_current-=extra; + + } /* else {Shouldn't happen *unless* the bitstream is out of + spec. Either way, believe the bitstream } */ + } /* else {Shouldn't happen *unless* the bitstream is out of + spec. Either way, believe the bitstream } */ + v->granulepos=vb->granulepos; + } + } + + /* Update, cleanup */ + + if(vb->eofflag)v->eofflag=1; + return(0); +} + +/* pcm==NULL indicates we just want the pending samples, no more */ +int vorbis_synthesis_pcmout(vorbis_dsp_state *v,ogg_int32_t ***pcm){ + vorbis_info *vi=v->vi; + if(v->pcm_returned>-1 && v->pcm_returnedpcm_current){ + if(pcm){ + int i; + for(i=0;ichannels;i++) + v->pcmret[i]=v->pcm[i]+v->pcm_returned; + *pcm=v->pcmret; + } + return(v->pcm_current-v->pcm_returned); + } + return(0); +} + +int vorbis_synthesis_read(vorbis_dsp_state *v,int bytes){ + if(bytes && v->pcm_returned+bytes>v->pcm_current)return(OV_EINVAL); + v->pcm_returned+=bytes; + return(0); +} + diff --git a/media/libtremor/lib/tremor_codebook.c b/media/libtremor/lib/tremor_codebook.c new file mode 100644 index 000000000000..1e1ae8a916b0 --- /dev/null +++ b/media/libtremor/lib/tremor_codebook.c @@ -0,0 +1,391 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: basic codebook pack/unpack/code/decode operations + + ********************************************************************/ + +#include +#include +#include +#include +#include "ivorbiscodec.h" +#include "codebook.h" +#include "misc.h" + +/* unpacks a codebook from the packet buffer into the codebook struct, + readies the codebook auxiliary structures for decode *************/ +static_codebook *vorbis_staticbook_unpack(oggpack_buffer *opb){ + long i,j; + static_codebook *s=_ogg_calloc(1,sizeof(*s)); + + /* make sure alignment is correct */ + if(oggpack_read(opb,24)!=0x564342)goto _eofout; + + /* first the basic parameters */ + s->dim=oggpack_read(opb,16); + s->entries=oggpack_read(opb,24); + if(s->entries==-1)goto _eofout; + + if(_ilog(s->dim)+_ilog(s->entries)>24)goto _eofout; + + /* codeword ordering.... length ordered or unordered? */ + switch((int)oggpack_read(opb,1)){ + case 0:{ + long unused; + /* allocated but unused entries? */ + unused=oggpack_read(opb,1); + if((s->entries*(unused?1:5)+7)>>3>opb->storage-oggpack_bytes(opb)) + goto _eofout; + /* unordered */ + s->lengthlist=(long *)_ogg_malloc(sizeof(*s->lengthlist)*s->entries); + + /* allocated but unused entries? */ + if(unused){ + /* yes, unused entries */ + + for(i=0;ientries;i++){ + if(oggpack_read(opb,1)){ + long num=oggpack_read(opb,5); + if(num==-1)goto _eofout; + s->lengthlist[i]=num+1; + }else + s->lengthlist[i]=0; + } + }else{ + /* all entries used; no tagging */ + for(i=0;ientries;i++){ + long num=oggpack_read(opb,5); + if(num==-1)goto _eofout; + s->lengthlist[i]=num+1; + } + } + + break; + } + case 1: + /* ordered */ + { + long length=oggpack_read(opb,5)+1; + if(length==0)goto _eofout; + s->lengthlist=(long *)_ogg_malloc(sizeof(*s->lengthlist)*s->entries); + + for(i=0;ientries;){ + long num=oggpack_read(opb,_ilog(s->entries-i)); + if(num==-1)goto _eofout; + if(length>32 || num>s->entries-i || + (num>0 && (num-1)>>(length>>1)>>((length+1)>>1))>0){ + goto _errout; + } + for(j=0;jlengthlist[i]=length; + length++; + } + } + break; + default: + /* EOF */ + goto _eofout; + } + + /* Do we have a mapping to unpack? */ + switch((s->maptype=oggpack_read(opb,4))){ + case 0: + /* no mapping */ + break; + case 1: case 2: + /* implicitly populated value mapping */ + /* explicitly populated value mapping */ + + s->q_min=oggpack_read(opb,32); + s->q_delta=oggpack_read(opb,32); + s->q_quant=oggpack_read(opb,4)+1; + s->q_sequencep=oggpack_read(opb,1); + if(s->q_sequencep==-1)goto _eofout; + + { + int quantvals=0; + switch(s->maptype){ + case 1: + quantvals=(s->dim==0?0:_book_maptype1_quantvals(s)); + break; + case 2: + quantvals=s->entries*s->dim; + break; + } + + /* quantized values */ + if((quantvals*s->q_quant+7)>>3>opb->storage-oggpack_bytes(opb)) + goto _eofout; + s->quantlist=(long *)_ogg_malloc(sizeof(*s->quantlist)*quantvals); + for(i=0;iquantlist[i]=oggpack_read(opb,s->q_quant); + + if(quantvals&&s->quantlist[quantvals-1]==-1)goto _eofout; + } + break; + default: + goto _errout; + } + + /* all set */ + return(s); + + _errout: + _eofout: + vorbis_staticbook_destroy(s); + return(NULL); +} + +/* the 'eliminate the decode tree' optimization actually requires the + codewords to be MSb first, not LSb. This is an annoying inelegancy + (and one of the first places where carefully thought out design + turned out to be wrong; Vorbis II and future Ogg codecs should go + to an MSb bitpacker), but not actually the huge hit it appears to + be. The first-stage decode table catches most words so that + bitreverse is not in the main execution path. */ + +static ogg_uint32_t bitreverse(ogg_uint32_t x){ + x= ((x>>16)&0x0000ffff) | ((x<<16)&0xffff0000); + x= ((x>> 8)&0x00ff00ff) | ((x<< 8)&0xff00ff00); + x= ((x>> 4)&0x0f0f0f0f) | ((x<< 4)&0xf0f0f0f0); + x= ((x>> 2)&0x33333333) | ((x<< 2)&0xcccccccc); + return((x>> 1)&0x55555555) | ((x<< 1)&0xaaaaaaaa); +} + +STIN long decode_packed_entry_number(codebook *book, + oggpack_buffer *b){ + int read=book->dec_maxlength; + long lo,hi; + long lok = oggpack_look(b,book->dec_firsttablen); + + if (lok >= 0) { + long entry = book->dec_firsttable[lok]; + if(entry&0x80000000UL){ + lo=(entry>>15)&0x7fff; + hi=book->used_entries-(entry&0x7fff); + }else{ + oggpack_adv(b, book->dec_codelengths[entry-1]); + return(entry-1); + } + }else{ + lo=0; + hi=book->used_entries; + } + + lok = oggpack_look(b, read); + + while(lok<0 && read>1) + lok = oggpack_look(b, --read); + + if(lok<0){ + oggpack_adv(b,1); /* force eop */ + return -1; + } + + /* bisect search for the codeword in the ordered list */ + { + ogg_uint32_t testword=bitreverse((ogg_uint32_t)lok); + + while(hi-lo>1){ + long p=(hi-lo)>>1; + long test=book->codelist[lo+p]>testword; + lo+=p&(test-1); + hi-=p&(-test); + } + + if(book->dec_codelengths[lo]<=read){ + oggpack_adv(b, book->dec_codelengths[lo]); + return(lo); + } + } + + oggpack_adv(b, read+1); + return(-1); +} + +/* Decode side is specced and easier, because we don't need to find + matches using different criteria; we simply read and map. There are + two things we need to do 'depending': + + We may need to support interleave. We don't really, but it's + convenient to do it here rather than rebuild the vector later. + + Cascades may be additive or multiplicitive; this is not inherent in + the codebook, but set in the code using the codebook. Like + interleaving, it's easiest to do it here. + addmul==0 -> declarative (set the value) + addmul==1 -> additive + addmul==2 -> multiplicitive */ + +/* returns the [original, not compacted] entry number or -1 on eof *********/ +long vorbis_book_decode(codebook *book, oggpack_buffer *b){ + if(book->used_entries>0){ + long packed_entry=decode_packed_entry_number(book,b); + if(packed_entry>=0) + return(book->dec_index[packed_entry]); + } + + /* if there's no dec_index, the codebook unpacking isn't collapsed */ + return(-1); +} + +/* returns 0 on OK or -1 on eof *************************************/ +/* decode vector / dim granularity gaurding is done in the upper layer */ +long vorbis_book_decodevs_add(codebook *book,ogg_int32_t *a, + oggpack_buffer *b,int n,int point){ + if(book->used_entries>0){ + int step=n/book->dim; + long *entry = (long *)alloca(sizeof(*entry)*step); + ogg_int32_t **t = (ogg_int32_t **)alloca(sizeof(*t)*step); + int i,j,o; + int shift=point-book->binarypoint; + + if(shift>=0){ + for (i = 0; i < step; i++) { + entry[i]=decode_packed_entry_number(book,b); + if(entry[i]==-1)return(-1); + t[i] = book->valuelist+entry[i]*book->dim; + } + for(i=0,o=0;idim;i++,o+=step) + for (j=0;o+j>shift; + }else{ + for (i = 0; i < step; i++) { + entry[i]=decode_packed_entry_number(book,b); + if(entry[i]==-1)return(-1); + t[i] = book->valuelist+entry[i]*book->dim; + } + for(i=0,o=0;idim;i++,o+=step) + for (j=0;o+jused_entries>0){ + int i,j,entry; + ogg_int32_t *t; + int shift=point-book->binarypoint; + + if(shift>=0){ + for(i=0;ivaluelist+entry*book->dim; + for (j=0;idim;) + a[i++]+=t[j++]>>shift; + } + }else{ + for(i=0;ivaluelist+entry*book->dim; + for (j=0;idim;) + a[i++]+=t[j++]<<-shift; + } + } + } + return(0); +} + +/* unlike the others, we guard against n not being an integer number + of internally rather than in the upper layer (called only by + floor0) */ +long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a, + oggpack_buffer *b,int n,int point){ + if(book->used_entries>0){ + int i,j,entry; + ogg_int32_t *t; + int shift=point-book->binarypoint; + + if(shift>=0){ + + for(i=0;ivaluelist+entry*book->dim; + for (j=0;idim;){ + a[i++]=t[j++]>>shift; + } + } + }else{ + + for(i=0;ivaluelist+entry*book->dim; + for (j=0;idim;){ + a[i++]=t[j++]<<-shift; + } + } + } + }else{ + + int i,j; + for(i=0;iused_entries>0){ + long i,j,entry; + int chptr=0; + int shift=point-book->binarypoint; + int m=offset+n; + if(shift>=0){ + + for(i=offset;ivaluelist+entry*book->dim; + for (j=0;idim;j++){ + a[chptr++][i]+=t[j]>>shift; + if(chptr==ch){ + chptr=0; + i++; + } + } + } + } + }else{ + + for(i=offset;ivaluelist+entry*book->dim; + for (j=0;idim;j++){ + a[chptr++][i]+=t[j]<<-shift; + if(chptr==ch){ + chptr=0; + i++; + } + } + } + } + } + } + return(0); +} diff --git a/media/libtremor/lib/tremor_floor0.c b/media/libtremor/lib/tremor_floor0.c new file mode 100644 index 000000000000..9f3ef560145e --- /dev/null +++ b/media/libtremor/lib/tremor_floor0.c @@ -0,0 +1,438 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: floor backend 0 implementation + + ********************************************************************/ + +#include +#include +#include +#include +#include "ivorbiscodec.h" +#include "codec_internal.h" +#include "registry.h" +#include "codebook.h" +#include "misc.h" +#include "block.h" + +#define LSP_FRACBITS 14 + +typedef struct { + long n; + int ln; + int m; + int *linearmap; + + vorbis_info_floor0 *vi; + ogg_int32_t *lsp_look; + +} vorbis_look_floor0; + +/*************** LSP decode ********************/ + +#include "lsp_lookup.h" + +/* interpolated 1./sqrt(p) where .5 <= a < 1. (.100000... to .111111...) in + 16.16 format + returns in m.8 format */ + +static long ADJUST_SQRT2[2]={8192,5792}; +STIN ogg_int32_t vorbis_invsqlook_i(long a,long e){ + long i=(a&0x7fff)>>(INVSQ_LOOKUP_I_SHIFT-1); + long d=a&INVSQ_LOOKUP_I_MASK; /* 0.10 */ + long val=INVSQ_LOOKUP_I[i]- /* 1.16 */ + ((INVSQ_LOOKUP_IDel[i]*d)>>INVSQ_LOOKUP_I_SHIFT); /* result 1.16 */ + val*=ADJUST_SQRT2[e&1]; + e=(e>>1)+21; + return(val>>e); +} + +/* interpolated lookup based fromdB function, domain -140dB to 0dB only */ +/* a is in n.12 format */ +STIN ogg_int32_t vorbis_fromdBlook_i(long a){ + int i=(-a)>>(12-FROMdB2_SHIFT); + if(i<0) return 0x7fffffff; + if(i>=(FROMdB_LOOKUP_SZ<>FROMdB_SHIFT] * FROMdB2_LOOKUP[i&FROMdB2_MASK]; +} + +/* interpolated lookup based cos function, domain 0 to PI only */ +/* a is in 0.16 format, where 0==0, 2^^16-1==PI, return 0.14 */ +STIN ogg_int32_t vorbis_coslook_i(long a){ + int i=a>>COS_LOOKUP_I_SHIFT; + int d=a&COS_LOOKUP_I_MASK; + return COS_LOOKUP_I[i]- ((d*(COS_LOOKUP_I[i]-COS_LOOKUP_I[i+1]))>> + COS_LOOKUP_I_SHIFT); +} + +/* interpolated lookup based cos function */ +/* a is in 0.16 format, where 0==0, 2^^16==PI, return .LSP_FRACBITS */ +STIN ogg_int32_t vorbis_coslook2_i(long a){ + a=a&0x1ffff; + + if(a>0x10000)a=0x20000-a; + { + int i=a>>COS_LOOKUP_I_SHIFT; + int d=a&COS_LOOKUP_I_MASK; + a=((COS_LOOKUP_I[i]<> + (COS_LOOKUP_I_SHIFT-LSP_FRACBITS+14); + } + + return(a); +} + +static const int barklook[28]={ + 0,100,200,301, 405,516,635,766, + 912,1077,1263,1476, 1720,2003,2333,2721, + 3184,3742,4428,5285, 6376,7791,9662,12181, + 15624,20397,27087,36554 +}; + +/* used in init only; interpolate the long way */ +STIN ogg_int32_t toBARK(int n){ + int i; + for(i=0;i<27;i++) + if(n>=barklook[i] && n>10)*0x517d)>>14; +#endif + + /* safeguard against a malicious stream */ + if(val<0 || (val>>COS_LOOKUP_I_SHIFT)>=COS_LOOKUP_I_SZ){ + memset(curve,0,sizeof(*curve)*n); + return; + } + + ilsp[i]=vorbis_coslook_i(val); + } + + i=0; + while(i>16); + qi=((qi*qi)>>16); + + if(m&1){ + qexp= qexp*2-28*((m+1)>>1)+m; + pi*=(1<<14)-((wi*wi)>>14); + qi+=pi>>14; + }else{ + qexp= qexp*2-13*m; + + pi*=(1<<14)-wi; + qi*=(1<<14)+wi; + + qi=(qi+pi)>>14; + } + + if(qi&0xffff0000){ /* checks for 1.xxxxxxxxxxxxxxxx */ + qi>>=1; qexp++; + }else + lsp_norm_asm(&qi,&qexp); + +#else + + j=1; + if(m>1){ + qi*=labs(ilsp[0]-wi); + pi*=labs(ilsp[1]-wi); + + for(j+=2;j>25])) + if(!(shift=MLOOP_2[(pi|qi)>>19])) + shift=MLOOP_3[(pi|qi)>>16]; + qi=(qi>>shift)*labs(ilsp[j-1]-wi); + pi=(pi>>shift)*labs(ilsp[j]-wi); + qexp+=shift; + } + } + if(!(shift=MLOOP_1[(pi|qi)>>25])) + if(!(shift=MLOOP_2[(pi|qi)>>19])) + shift=MLOOP_3[(pi|qi)>>16]; + + /* pi,qi normalized collectively, both tracked using qexp */ + + if(m&1){ + /* odd order filter; slightly assymetric */ + /* the last coefficient */ + qi=(qi>>shift)*labs(ilsp[j-1]-wi); + pi=(pi>>shift)<<14; + qexp+=shift; + + if(!(shift=MLOOP_1[(pi|qi)>>25])) + if(!(shift=MLOOP_2[(pi|qi)>>19])) + shift=MLOOP_3[(pi|qi)>>16]; + + pi>>=shift; + qi>>=shift; + qexp+=shift-14*((m+1)>>1); + + pi=((pi*pi)>>16); + qi=((qi*qi)>>16); + qexp=qexp*2+m; + + pi*=(1<<14)-((wi*wi)>>14); + qi+=pi>>14; + + }else{ + /* even order filter; still symmetric */ + + /* p*=p(1-w), q*=q(1+w), let normalization drift because it isn't + worth tracking step by step */ + + pi>>=shift; + qi>>=shift; + qexp+=shift-7*m; + + pi=((pi*pi)>>16); + qi=((qi*qi)>>16); + qexp=qexp*2+m; + + pi*=(1<<14)-wi; + qi*=(1<<14)+wi; + qi=(qi+pi)>>14; + + } + + + /* we've let the normalization drift because it wasn't important; + however, for the lookup, things must be normalized again. We + need at most one right shift or a number of left shifts */ + + if(qi&0xffff0000){ /* checks for 1.xxxxxxxxxxxxxxxx */ + qi>>=1; qexp++; + }else + while(qi && !(qi&0x8000)){ /* checks for 0.0xxxxxxxxxxxxxxx or less*/ + qi<<=1; qexp--; + } + +#endif + + amp=vorbis_fromdBlook_i(ampi* /* n.4 */ + vorbis_invsqlook_i(qi,qexp)- + /* m.8, m+n<=8 */ + ampoffseti); /* 8.12[0] */ + +#ifdef _LOW_ACCURACY_ + amp>>=9; +#endif + curve[i]= MULT31_SHIFT15(curve[i],amp); + while(map[++i]==k) curve[i]= MULT31_SHIFT15(curve[i],amp); + } +} + +/*************** vorbis decode glue ************/ + +static void floor0_free_info(vorbis_info_floor *i){ + vorbis_info_floor0 *info=(vorbis_info_floor0 *)i; + if(info){ + memset(info,0,sizeof(*info)); + _ogg_free(info); + } +} + +static void floor0_free_look(vorbis_look_floor *i){ + vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; + if(look){ + + if(look->linearmap)_ogg_free(look->linearmap); + if(look->lsp_look)_ogg_free(look->lsp_look); + memset(look,0,sizeof(*look)); + _ogg_free(look); + } +} + +static vorbis_info_floor *floor0_unpack (vorbis_info *vi,oggpack_buffer *opb){ + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + int j; + + vorbis_info_floor0 *info=(vorbis_info_floor0 *)_ogg_malloc(sizeof(*info)); + info->order=oggpack_read(opb,8); + info->rate=oggpack_read(opb,16); + info->barkmap=oggpack_read(opb,16); + info->ampbits=oggpack_read(opb,6); + info->ampdB=oggpack_read(opb,8); + info->numbooks=oggpack_read(opb,4)+1; + + if(info->order<1)goto err_out; + if(info->rate<1)goto err_out; + if(info->barkmap<1)goto err_out; + if(info->numbooks<1)goto err_out; + + for(j=0;jnumbooks;j++){ + info->books[j]=oggpack_read(opb,8); + if(info->books[j]<0 || info->books[j]>=ci->books)goto err_out; + if(ci->book_param[info->books[j]]->maptype==0)goto err_out; + } + return(info); + + err_out: + floor0_free_info(info); + return(NULL); +} + +/* initialize Bark scale and normalization lookups. We could do this + with static tables, but Vorbis allows a number of possible + combinations, so it's best to do it computationally. + + The below is authoritative in terms of defining scale mapping. + Note that the scale depends on the sampling rate as well as the + linear block and mapping sizes */ + +static vorbis_look_floor *floor0_look (vorbis_dsp_state *vd,vorbis_info_mode *mi, + vorbis_info_floor *i){ + int j; + vorbis_info *vi=vd->vi; + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + vorbis_info_floor0 *info=(vorbis_info_floor0 *)i; + vorbis_look_floor0 *look=(vorbis_look_floor0 *)_ogg_calloc(1,sizeof(*look)); + look->m=info->order; + look->n=ci->blocksizes[mi->blockflag]/2; + look->ln=info->barkmap; + look->vi=info; + + /* the mapping from a linear scale to a smaller bark scale is + straightforward. We do *not* make sure that the linear mapping + does not skip bark-scale bins; the decoder simply skips them and + the encoder may do what it wishes in filling them. They're + necessary in some mapping combinations to keep the scale spacing + accurate */ + look->linearmap=(int *)_ogg_malloc((look->n+1)*sizeof(*look->linearmap)); + for(j=0;jn;j++){ + + int val=(look->ln* + ((toBARK(info->rate/2*j/look->n)<<11)/toBARK(info->rate/2)))>>11; + + if(val>=look->ln)val=look->ln-1; /* guard against the approximation */ + look->linearmap[j]=val; + } + look->linearmap[j]=-1; + + look->lsp_look=(ogg_int32_t *)_ogg_malloc(look->ln*sizeof(*look->lsp_look)); + for(j=0;jln;j++) + look->lsp_look[j]=vorbis_coslook2_i(0x10000*j/look->ln); + + return look; +} + +static void *floor0_inverse1(vorbis_block *vb,vorbis_look_floor *i){ + vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; + vorbis_info_floor0 *info=look->vi; + int j,k; + + int ampraw=oggpack_read(&vb->opb,info->ampbits); + if(ampraw>0){ /* also handles the -1 out of data case */ + long maxval=(1<ampbits)-1; + int amp=((ampraw*info->ampdB)<<4)/maxval; + int booknum=oggpack_read(&vb->opb,_ilog(info->numbooks)); + + if(booknum!=-1 && booknumnumbooks){ /* be paranoid */ + codec_setup_info *ci=(codec_setup_info *)vb->vd->vi->codec_setup; + codebook *b=ci->fullbooks+info->books[booknum]; + ogg_int32_t last=0; + ogg_int32_t *lsp=(ogg_int32_t *)_vorbis_block_alloc(vb,sizeof(*lsp)*(look->m+1)); + + if(vorbis_book_decodev_set(b,lsp,&vb->opb,look->m,-24)==-1)goto eop; + for(j=0;jm;){ + for(k=0;jm && kdim;k++,j++)lsp[j]+=last; + last=lsp[j-1]; + } + + lsp[look->m]=amp; + return(lsp); + } + } + eop: + return(NULL); +} + +static int floor0_inverse2(vorbis_block *vb,vorbis_look_floor *i, + void *memo,ogg_int32_t *out){ + vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; + vorbis_info_floor0 *info=look->vi; + + if(memo){ + ogg_int32_t *lsp=(ogg_int32_t *)memo; + ogg_int32_t amp=lsp[look->m]; + + /* take the coefficients back to a spectral envelope curve */ + vorbis_lsp_to_curve(out,look->linearmap,look->n,look->ln, + lsp,look->m,amp,info->ampdB,look->lsp_look); + return(1); + } + memset(out,0,sizeof(*out)*look->n); + return(0); +} + +/* export hooks */ +vorbis_func_floor floor0_exportbundle={ + &floor0_unpack,&floor0_look,&floor0_free_info, + &floor0_free_look,&floor0_inverse1,&floor0_inverse2 +}; + + diff --git a/media/libtremor/lib/tremor_floor1.c b/media/libtremor/lib/tremor_floor1.c new file mode 100644 index 000000000000..12a687ec5382 --- /dev/null +++ b/media/libtremor/lib/tremor_floor1.c @@ -0,0 +1,461 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: floor backend 1 implementation + + ********************************************************************/ + +#include +#include +#include +#include +#include "ivorbiscodec.h" +#include "codec_internal.h" +#include "registry.h" +#include "codebook.h" +#include "misc.h" +#include "block.h" + +#define floor1_rangedB 140 /* floor 1 fixed at -140dB to 0dB range */ + +typedef struct { + int forward_index[VIF_POSIT+2]; + + int hineighbor[VIF_POSIT]; + int loneighbor[VIF_POSIT]; + int posts; + + int n; + int quant_q; + vorbis_info_floor1 *vi; + +} vorbis_look_floor1; + +/***********************************************/ + +static void floor1_free_info(vorbis_info_floor *i){ + vorbis_info_floor1 *info=(vorbis_info_floor1 *)i; + if(info){ + memset(info,0,sizeof(*info)); + _ogg_free(info); + } +} + +static void floor1_free_look(vorbis_look_floor *i){ + vorbis_look_floor1 *look=(vorbis_look_floor1 *)i; + if(look){ + memset(look,0,sizeof(*look)); + _ogg_free(look); + } +} + +static int ilog(unsigned int v){ + int ret=0; + while(v){ + ret++; + v>>=1; + } + return(ret); +} + +static int icomp(const void *a,const void *b){ + return(**(int **)a-**(int **)b); +} + +static vorbis_info_floor *floor1_unpack (vorbis_info *vi,oggpack_buffer *opb){ + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + int j,k,count=0,maxclass=-1,rangebits; + + vorbis_info_floor1 *info=(vorbis_info_floor1 *)_ogg_calloc(1,sizeof(*info)); + /* read partitions */ + info->partitions=oggpack_read(opb,5); /* only 0 to 31 legal */ + for(j=0;jpartitions;j++){ + info->partitionclass[j]=oggpack_read(opb,4); /* only 0 to 15 legal */ + if(info->partitionclass[j]<0)goto err_out; + if(maxclasspartitionclass[j])maxclass=info->partitionclass[j]; + } + + /* read partition classes */ + for(j=0;jclass_dim[j]=oggpack_read(opb,3)+1; /* 1 to 8 */ + info->class_subs[j]=oggpack_read(opb,2); /* 0,1,2,3 bits */ + if(info->class_subs[j]<0) + goto err_out; + if(info->class_subs[j])info->class_book[j]=oggpack_read(opb,8); + if(info->class_book[j]<0 || info->class_book[j]>=ci->books) + goto err_out; + for(k=0;k<(1<class_subs[j]);k++){ + info->class_subbook[j][k]=oggpack_read(opb,8)-1; + if(info->class_subbook[j][k]<-1 || info->class_subbook[j][k]>=ci->books) + goto err_out; + } + } + + /* read the post list */ + info->mult=oggpack_read(opb,2)+1; /* only 1,2,3,4 legal now */ + rangebits=oggpack_read(opb,4); + if(rangebits<0)goto err_out; + + for(j=0,k=0;jpartitions;j++){ + count+=info->class_dim[info->partitionclass[j]]; + if(count>VIF_POSIT)goto err_out; + for(;kpostlist[k+2]=oggpack_read(opb,rangebits); + if(t<0 || t>=(1<postlist[0]=0; + info->postlist[1]=1<postlist+j; + qsort(sortpointer,count+2,sizeof(*sortpointer),icomp); + + for(j=1;jvi=info; + look->n=info->postlist[1]; + + /* we drop each position value in-between already decoded values, + and use linear interpolation to predict each new value past the + edges. The positions are read in the order of the position + list... we precompute the bounding positions in the lookup. Of + course, the neighbors can change (if a position is declined), but + this is an initial mapping */ + + for(i=0;ipartitions;i++)n+=info->class_dim[info->partitionclass[i]]; + n+=2; + look->posts=n; + + /* also store a sorted position index */ + for(i=0;ipostlist+i; + qsort(sortpointer,n,sizeof(*sortpointer),icomp); + + /* points from sort order back to range number */ + for(i=0;iforward_index[i]=sortpointer[i]-info->postlist; + + /* quantize values to multiplier spec */ + switch(info->mult){ + case 1: /* 1024 -> 256 */ + look->quant_q=256; + break; + case 2: /* 1024 -> 128 */ + look->quant_q=128; + break; + case 3: /* 1024 -> 86 */ + look->quant_q=86; + break; + case 4: /* 1024 -> 64 */ + look->quant_q=64; + break; + } + + /* discover our neighbors for decode where we don't use fit flags + (that would push the neighbors outward) */ + for(i=0;in; + int currentx=info->postlist[i+2]; + for(j=0;jpostlist[j]; + if(x>lx && xcurrentx){ + hi=j; + hx=x; + } + } + look->loneighbor[i]=lo; + look->hineighbor[i]=hi; + } + + return(look); +} + +static int render_point(int x0,int x1,int y0,int y1,int x){ + y0&=0x7fff; /* mask off flag */ + y1&=0x7fff; + + { + int dy=y1-y0; + int adx=x1-x0; + int ady=abs(dy); + int err=ady*(x-x0); + + int off=err/adx; + if(dy<0)return(y0-off); + return(y0+off); + } +} + +#ifdef _LOW_ACCURACY_ +# define XdB(n) ((((n)>>8)+1)>>1) +#else +# define XdB(n) (n) +#endif + +static const ogg_int32_t FLOOR_fromdB_LOOKUP[256]={ + XdB(0x000000e5), XdB(0x000000f4), XdB(0x00000103), XdB(0x00000114), + XdB(0x00000126), XdB(0x00000139), XdB(0x0000014e), XdB(0x00000163), + XdB(0x0000017a), XdB(0x00000193), XdB(0x000001ad), XdB(0x000001c9), + XdB(0x000001e7), XdB(0x00000206), XdB(0x00000228), XdB(0x0000024c), + XdB(0x00000272), XdB(0x0000029b), XdB(0x000002c6), XdB(0x000002f4), + XdB(0x00000326), XdB(0x0000035a), XdB(0x00000392), XdB(0x000003cd), + XdB(0x0000040c), XdB(0x00000450), XdB(0x00000497), XdB(0x000004e4), + XdB(0x00000535), XdB(0x0000058c), XdB(0x000005e8), XdB(0x0000064a), + XdB(0x000006b3), XdB(0x00000722), XdB(0x00000799), XdB(0x00000818), + XdB(0x0000089e), XdB(0x0000092e), XdB(0x000009c6), XdB(0x00000a69), + XdB(0x00000b16), XdB(0x00000bcf), XdB(0x00000c93), XdB(0x00000d64), + XdB(0x00000e43), XdB(0x00000f30), XdB(0x0000102d), XdB(0x0000113a), + XdB(0x00001258), XdB(0x0000138a), XdB(0x000014cf), XdB(0x00001629), + XdB(0x0000179a), XdB(0x00001922), XdB(0x00001ac4), XdB(0x00001c82), + XdB(0x00001e5c), XdB(0x00002055), XdB(0x0000226f), XdB(0x000024ac), + XdB(0x0000270e), XdB(0x00002997), XdB(0x00002c4b), XdB(0x00002f2c), + XdB(0x0000323d), XdB(0x00003581), XdB(0x000038fb), XdB(0x00003caf), + XdB(0x000040a0), XdB(0x000044d3), XdB(0x0000494c), XdB(0x00004e10), + XdB(0x00005323), XdB(0x0000588a), XdB(0x00005e4b), XdB(0x0000646b), + XdB(0x00006af2), XdB(0x000071e5), XdB(0x0000794c), XdB(0x0000812e), + XdB(0x00008993), XdB(0x00009283), XdB(0x00009c09), XdB(0x0000a62d), + XdB(0x0000b0f9), XdB(0x0000bc79), XdB(0x0000c8b9), XdB(0x0000d5c4), + XdB(0x0000e3a9), XdB(0x0000f274), XdB(0x00010235), XdB(0x000112fd), + XdB(0x000124dc), XdB(0x000137e4), XdB(0x00014c29), XdB(0x000161bf), + XdB(0x000178bc), XdB(0x00019137), XdB(0x0001ab4a), XdB(0x0001c70e), + XdB(0x0001e4a1), XdB(0x0002041f), XdB(0x000225aa), XdB(0x00024962), + XdB(0x00026f6d), XdB(0x000297f0), XdB(0x0002c316), XdB(0x0002f109), + XdB(0x000321f9), XdB(0x00035616), XdB(0x00038d97), XdB(0x0003c8b4), + XdB(0x000407a7), XdB(0x00044ab2), XdB(0x00049218), XdB(0x0004de23), + XdB(0x00052f1e), XdB(0x0005855c), XdB(0x0005e135), XdB(0x00064306), + XdB(0x0006ab33), XdB(0x00071a24), XdB(0x0007904b), XdB(0x00080e20), + XdB(0x00089422), XdB(0x000922da), XdB(0x0009bad8), XdB(0x000a5cb6), + XdB(0x000b091a), XdB(0x000bc0b1), XdB(0x000c8436), XdB(0x000d5471), + XdB(0x000e3233), XdB(0x000f1e5f), XdB(0x001019e4), XdB(0x001125c1), + XdB(0x00124306), XdB(0x001372d5), XdB(0x0014b663), XdB(0x00160ef7), + XdB(0x00177df0), XdB(0x001904c1), XdB(0x001aa4f9), XdB(0x001c603d), + XdB(0x001e384f), XdB(0x00202f0f), XdB(0x0022467a), XdB(0x002480b1), + XdB(0x0026dff7), XdB(0x002966b3), XdB(0x002c1776), XdB(0x002ef4fc), + XdB(0x0032022d), XdB(0x00354222), XdB(0x0038b828), XdB(0x003c67c2), + XdB(0x004054ae), XdB(0x004482e8), XdB(0x0048f6af), XdB(0x004db488), + XdB(0x0052c142), XdB(0x005821ff), XdB(0x005ddc33), XdB(0x0063f5b0), + XdB(0x006a74a7), XdB(0x00715faf), XdB(0x0078bdce), XdB(0x0080967f), + XdB(0x0088f1ba), XdB(0x0091d7f9), XdB(0x009b5247), XdB(0x00a56a41), + XdB(0x00b02a27), XdB(0x00bb9ce2), XdB(0x00c7ce12), XdB(0x00d4ca17), + XdB(0x00e29e20), XdB(0x00f15835), XdB(0x0101074b), XdB(0x0111bb4e), + XdB(0x01238531), XdB(0x01367704), XdB(0x014aa402), XdB(0x016020a7), + XdB(0x017702c3), XdB(0x018f6190), XdB(0x01a955cb), XdB(0x01c4f9cf), + XdB(0x01e269a8), XdB(0x0201c33b), XdB(0x0223265a), XdB(0x0246b4ea), + XdB(0x026c9302), XdB(0x0294e716), XdB(0x02bfda13), XdB(0x02ed9793), + XdB(0x031e4e09), XdB(0x03522ee4), XdB(0x03896ed0), XdB(0x03c445e2), + XdB(0x0402efd6), XdB(0x0445ac4b), XdB(0x048cbefc), XdB(0x04d87013), + XdB(0x05290c67), XdB(0x057ee5ca), XdB(0x05da5364), XdB(0x063bb204), + XdB(0x06a36485), XdB(0x0711d42b), XdB(0x0787710e), XdB(0x0804b299), + XdB(0x088a17ef), XdB(0x0918287e), XdB(0x09af747c), XdB(0x0a50957e), + XdB(0x0afc2f19), XdB(0x0bb2ef7f), XdB(0x0c759034), XdB(0x0d44d6ca), + XdB(0x0e2195bc), XdB(0x0f0cad0d), XdB(0x10070b62), XdB(0x1111aeea), + XdB(0x122da66c), XdB(0x135c120f), XdB(0x149e24d9), XdB(0x15f525b1), + XdB(0x176270e3), XdB(0x18e7794b), XdB(0x1a85c9ae), XdB(0x1c3f06d1), + XdB(0x1e14f07d), XdB(0x200963d7), XdB(0x221e5ccd), XdB(0x2455f870), + XdB(0x26b2770b), XdB(0x29363e2b), XdB(0x2be3db5c), XdB(0x2ebe06b6), + XdB(0x31c7a55b), XdB(0x3503ccd4), XdB(0x3875c5aa), XdB(0x3c210f44), + XdB(0x4009632b), XdB(0x4432b8cf), XdB(0x48a149bc), XdB(0x4d59959e), + XdB(0x52606733), XdB(0x57bad899), XdB(0x5d6e593a), XdB(0x6380b298), + XdB(0x69f80e9a), XdB(0x70dafda8), XdB(0x78307d76), XdB(0x7fffffff), +}; + +static void render_line(int n, int x0,int x1,int y0,int y1,ogg_int32_t *d){ + int dy=y1-y0; + int adx=x1-x0; + int ady=abs(dy); + int base=dy/adx; + int sy=(dy<0?base-1:base+1); + int x=x0; + int y=y0; + int err=0; + + if(n>x1)n=x1; + ady-=abs(base*adx); + + if(x=adx){ + err-=adx; + y+=sy; + }else{ + y+=base; + } + d[x]= MULT31_SHIFT15(d[x],FLOOR_fromdB_LOOKUP[y]); + } +} + +static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){ + vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; + vorbis_info_floor1 *info=look->vi; + codec_setup_info *ci=(codec_setup_info *)vb->vd->vi->codec_setup; + + int i,j,k; + codebook *books=ci->fullbooks; + + /* unpack wrapped/predicted values from stream */ + if(oggpack_read(&vb->opb,1)==1){ + int *fit_value=(int *)_vorbis_block_alloc(vb,(look->posts)*sizeof(*fit_value)); + + fit_value[0]=oggpack_read(&vb->opb,ilog(look->quant_q-1)); + fit_value[1]=oggpack_read(&vb->opb,ilog(look->quant_q-1)); + + /* partition by partition */ + /* partition by partition */ + for(i=0,j=2;ipartitions;i++){ + int classv=info->partitionclass[i]; + int cdim=info->class_dim[classv]; + int csubbits=info->class_subs[classv]; + int csub=1<class_book[classv],&vb->opb); + + if(cval==-1)goto eop; + } + + for(k=0;kclass_subbook[classv][cval&(csub-1)]; + cval>>=csubbits; + if(book>=0){ + if((fit_value[j+k]=vorbis_book_decode(books+book,&vb->opb))==-1) + goto eop; + }else{ + fit_value[j+k]=0; + } + } + j+=cdim; + } + + /* unwrap positive values and reconsitute via linear interpolation */ + for(i=2;iposts;i++){ + int predicted=render_point(info->postlist[look->loneighbor[i-2]], + info->postlist[look->hineighbor[i-2]], + fit_value[look->loneighbor[i-2]], + fit_value[look->hineighbor[i-2]], + info->postlist[i]); + int hiroom=look->quant_q-predicted; + int loroom=predicted; + int room=(hiroom=room){ + if(hiroom>loroom){ + val = val-loroom; + }else{ + val = -1-(val-hiroom); + } + }else{ + if(val&1){ + val= -((val+1)>>1); + }else{ + val>>=1; + } + } + + fit_value[i]=(val+predicted)&0x7fff;; + fit_value[look->loneighbor[i-2]]&=0x7fff; + fit_value[look->hineighbor[i-2]]&=0x7fff; + + }else{ + fit_value[i]=predicted|0x8000; + } + + } + + return(fit_value); + } + eop: + return(NULL); +} + +static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo, + ogg_int32_t *out){ + vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; + vorbis_info_floor1 *info=look->vi; + + codec_setup_info *ci=(codec_setup_info *)vb->vd->vi->codec_setup; + int n=ci->blocksizes[vb->W]/2; + int j; + + if(memo){ + /* render the lines */ + int *fit_value=(int *)memo; + int hx=0; + int lx=0; + int ly=fit_value[0]*info->mult; + /* guard lookup against out-of-rage values */ + ly=(ly<0?0:ly>255?255:ly); + + for(j=1;jposts;j++){ + int current=look->forward_index[j]; + int hy=fit_value[current]&0x7fff; + if(hy==fit_value[current]){ + + hx=info->postlist[current]; + hy*=info->mult; + /* guard lookup against out-of-rage values */ + hy=(hy<0?0:hy>255?255:hy); + + + render_line(n,lx,hx,ly,hy,out); + + lx=hx; + ly=hy; + } + } + for(j=hx;j header packets + + ********************************************************************/ + +/* general handling of the header and the vorbis_info structure (and + substructures) */ + +#include +#include +#include +#include +#include +#include "ivorbiscodec.h" +#include "codec_internal.h" +#include "codebook.h" +#include "registry.h" +#include "window.h" +#include "misc.h" + +/* helpers */ +static void _v_readstring(oggpack_buffer *o,char *buf,int bytes){ + while(bytes--){ + *buf++=oggpack_read(o,8); + } +} + +void vorbis_comment_init(vorbis_comment *vc){ + memset(vc,0,sizeof(*vc)); +} + +/* This is more or less the same as strncasecmp - but that doesn't exist + * everywhere, and this is a fairly trivial function, so we include it */ +static int tagcompare(const char *s1, const char *s2, int n){ + int c=0; + while(c < n){ + if(toupper(s1[c]) != toupper(s2[c])) + return !0; + c++; + } + return 0; +} + +char *vorbis_comment_query(vorbis_comment *vc, char *tag, int count){ + long i; + int found = 0; + int taglen = strlen(tag)+1; /* +1 for the = we append */ + char *fulltag = (char *)alloca(taglen+ 1); + + strcpy(fulltag, tag); + strcat(fulltag, "="); + + for(i=0;icomments;i++){ + if(!tagcompare(vc->user_comments[i], fulltag, taglen)){ + if(count == found) + /* We return a pointer to the data, not a copy */ + return vc->user_comments[i] + taglen; + else + found++; + } + } + return NULL; /* didn't find anything */ +} + +int vorbis_comment_query_count(vorbis_comment *vc, char *tag){ + int i,count=0; + int taglen = strlen(tag)+1; /* +1 for the = we append */ + char *fulltag = (char *)alloca(taglen+1); + strcpy(fulltag,tag); + strcat(fulltag, "="); + + for(i=0;icomments;i++){ + if(!tagcompare(vc->user_comments[i], fulltag, taglen)) + count++; + } + + return count; +} + +void vorbis_comment_clear(vorbis_comment *vc){ + if(vc){ + long i; + if(vc->user_comments){ + for(i=0;icomments;i++) + if(vc->user_comments[i])_ogg_free(vc->user_comments[i]); + _ogg_free(vc->user_comments); + } + if(vc->comment_lengths)_ogg_free(vc->comment_lengths); + if(vc->vendor)_ogg_free(vc->vendor); + memset(vc,0,sizeof(*vc)); + } +} + +/* blocksize 0 is guaranteed to be short, 1 is guarantted to be long. + They may be equal, but short will never ge greater than long */ +int vorbis_info_blocksize(vorbis_info *vi,int zo){ + codec_setup_info *ci = (codec_setup_info *)vi->codec_setup; + return ci ? ci->blocksizes[zo] : -1; +} + +/* used by synthesis, which has a full, alloced vi */ +void vorbis_info_init(vorbis_info *vi){ + memset(vi,0,sizeof(*vi)); + vi->codec_setup=(codec_setup_info *)_ogg_calloc(1,sizeof(codec_setup_info)); +} + +void vorbis_info_clear(vorbis_info *vi){ + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + int i; + + if(ci){ + + for(i=0;imodes;i++) + if(ci->mode_param[i])_ogg_free(ci->mode_param[i]); + + for(i=0;imaps;i++) /* unpack does the range checking */ + if(ci->map_param[i]) + _mapping_P[ci->map_type[i]]->free_info(ci->map_param[i]); + + for(i=0;ifloors;i++) /* unpack does the range checking */ + if(ci->floor_param[i]) + _floor_P[ci->floor_type[i]]->free_info(ci->floor_param[i]); + + for(i=0;iresidues;i++) /* unpack does the range checking */ + if(ci->residue_param[i]) + _residue_P[ci->residue_type[i]]->free_info(ci->residue_param[i]); + + for(i=0;ibooks;i++){ + if(ci->book_param[i]){ + /* knows if the book was not alloced */ + vorbis_staticbook_destroy(ci->book_param[i]); + } + if(ci->fullbooks) + vorbis_book_clear(ci->fullbooks+i); + } + if(ci->fullbooks) + _ogg_free(ci->fullbooks); + + _ogg_free(ci); + } + + memset(vi,0,sizeof(*vi)); +} + +/* Header packing/unpacking ********************************************/ + +static int _vorbis_unpack_info(vorbis_info *vi,oggpack_buffer *opb){ + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + if(!ci)return(OV_EFAULT); + + vi->version=oggpack_read(opb,32); + if(vi->version!=0)return(OV_EVERSION); + + vi->channels=oggpack_read(opb,8); + vi->rate=oggpack_read(opb,32); + + vi->bitrate_upper=oggpack_read(opb,32); + vi->bitrate_nominal=oggpack_read(opb,32); + vi->bitrate_lower=oggpack_read(opb,32); + + ci->blocksizes[0]=1<blocksizes[1]=1<rate<1)goto err_out; + if(vi->channels<1)goto err_out; + if(ci->blocksizes[0]<64)goto err_out; + if(ci->blocksizes[1]blocksizes[0])goto err_out; + if(ci->blocksizes[1]>8192)goto err_out; + + if(oggpack_read(opb,1)!=1)goto err_out; /* EOP check */ + + return(0); + err_out: + vorbis_info_clear(vi); + return(OV_EBADHEADER); +} + +static int _vorbis_unpack_comment(vorbis_comment *vc,oggpack_buffer *opb){ + int i; + int vendorlen; + vendorlen=oggpack_read(opb,32); + if(vendorlen<0)goto err_out; + if(vendorlen>opb->storage-oggpack_bytes(opb))goto err_out; + vc->vendor=(char *)_ogg_calloc(vendorlen+1,1); + if(vc->vendor==NULL)goto err_out; + _v_readstring(opb,vc->vendor,vendorlen); + i=oggpack_read(opb,32); + if(i<0||i>=INT_MAX||i>(opb->storage-oggpack_bytes(opb))>>2)goto err_out; + vc->user_comments=(char **)_ogg_calloc(i+1,sizeof(*vc->user_comments)); + vc->comment_lengths=(int *)_ogg_calloc(i+1, sizeof(*vc->comment_lengths)); + if(vc->user_comments==NULL||vc->comment_lengths==NULL)goto err_out; + vc->comments=i; + + for(i=0;icomments;i++){ + int len=oggpack_read(opb,32); + if(len<0||len>opb->storage-oggpack_bytes(opb))goto err_out; + vc->comment_lengths[i]=len; + vc->user_comments[i]=(char *)_ogg_calloc(len+1,1); + if(vc->user_comments[i]==NULL){ + vc->comments=i; + goto err_out; + } + _v_readstring(opb,vc->user_comments[i],len); + } + if(oggpack_read(opb,1)!=1)goto err_out; /* EOP check */ + + return(0); + err_out: + vorbis_comment_clear(vc); + return(OV_EBADHEADER); +} + +/* all of the real encoding details are here. The modes, books, + everything */ +static int _vorbis_unpack_books(vorbis_info *vi,oggpack_buffer *opb){ + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + int i; + if(!ci)return(OV_EFAULT); + + /* codebooks */ + ci->books=oggpack_read(opb,8)+1; + if(ci->books<=0)goto err_out; + for(i=0;ibooks;i++){ + ci->book_param[i]=vorbis_staticbook_unpack(opb); + if(!ci->book_param[i])goto err_out; + } + + /* time backend settings */ + ci->times=oggpack_read(opb,6)+1; + if(ci->times<=0)goto err_out; + for(i=0;itimes;i++){ + ci->time_type[i]=oggpack_read(opb,16); + if(ci->time_type[i]<0 || ci->time_type[i]>=VI_TIMEB)goto err_out; + /* ci->time_param[i]=_time_P[ci->time_type[i]]->unpack(vi,opb); + Vorbis I has no time backend */ + /*if(!ci->time_param[i])goto err_out;*/ + } + + /* floor backend settings */ + ci->floors=oggpack_read(opb,6)+1; + if(ci->floors<=0)goto err_out; + for(i=0;ifloors;i++){ + ci->floor_type[i]=oggpack_read(opb,16); + if(ci->floor_type[i]<0 || ci->floor_type[i]>=VI_FLOORB)goto err_out; + ci->floor_param[i]=_floor_P[ci->floor_type[i]]->unpack(vi,opb); + if(!ci->floor_param[i])goto err_out; + } + + /* residue backend settings */ + ci->residues=oggpack_read(opb,6)+1; + if(ci->residues<=0)goto err_out; + for(i=0;iresidues;i++){ + ci->residue_type[i]=oggpack_read(opb,16); + if(ci->residue_type[i]<0 || ci->residue_type[i]>=VI_RESB)goto err_out; + ci->residue_param[i]=_residue_P[ci->residue_type[i]]->unpack(vi,opb); + if(!ci->residue_param[i])goto err_out; + } + + /* map backend settings */ + ci->maps=oggpack_read(opb,6)+1; + if(ci->maps<=0)goto err_out; + for(i=0;imaps;i++){ + ci->map_type[i]=oggpack_read(opb,16); + if(ci->map_type[i]<0 || ci->map_type[i]>=VI_MAPB)goto err_out; + ci->map_param[i]=_mapping_P[ci->map_type[i]]->unpack(vi,opb); + if(!ci->map_param[i])goto err_out; + } + + /* mode settings */ + ci->modes=oggpack_read(opb,6)+1; + if(ci->modes<=0)goto err_out; + for(i=0;imodes;i++){ + ci->mode_param[i]=(vorbis_info_mode *)_ogg_calloc(1,sizeof(*ci->mode_param[i])); + ci->mode_param[i]->blockflag=oggpack_read(opb,1); + ci->mode_param[i]->windowtype=oggpack_read(opb,16); + ci->mode_param[i]->transformtype=oggpack_read(opb,16); + ci->mode_param[i]->mapping=oggpack_read(opb,8); + + if(ci->mode_param[i]->windowtype>=VI_WINDOWB)goto err_out; + if(ci->mode_param[i]->transformtype>=VI_WINDOWB)goto err_out; + if(ci->mode_param[i]->mapping>=ci->maps)goto err_out; + if(ci->mode_param[i]->mapping<0)goto err_out; + } + + if(oggpack_read(opb,1)!=1)goto err_out; /* top level EOP check */ + + return(0); + err_out: + vorbis_info_clear(vi); + return(OV_EBADHEADER); +} + +/* Is this packet a vorbis ID header? */ +int vorbis_synthesis_idheader(ogg_packet *op){ + oggpack_buffer opb; + char buffer[6]; + + if(op){ + oggpack_readinit(&opb,op->packet,op->bytes); + + if(!op->b_o_s) + return(0); /* Not the initial packet */ + + if(oggpack_read(&opb,8) != 1) + return 0; /* not an ID header */ + + memset(buffer,0,6); + _v_readstring(&opb,buffer,6); + if(memcmp(buffer,"vorbis",6)) + return 0; /* not vorbis */ + + return 1; + } + + return 0; +} + +/* The Vorbis header is in three packets; the initial small packet in + the first page that identifies basic parameters, a second packet + with bitstream comments and a third packet that holds the + codebook. */ + +int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc,ogg_packet *op){ + oggpack_buffer opb; + + if(op){ + oggpack_readinit(&opb,op->packet,op->bytes); + + /* Which of the three types of header is this? */ + /* Also verify header-ness, vorbis */ + { + char buffer[6]; + int packtype=oggpack_read(&opb,8); + memset(buffer,0,6); + _v_readstring(&opb,buffer,6); + if(memcmp(buffer,"vorbis",6)){ + /* not a vorbis header */ + return(OV_ENOTVORBIS); + } + switch(packtype){ + case 0x01: /* least significant *bit* is read first */ + if(!op->b_o_s){ + /* Not the initial packet */ + return(OV_EBADHEADER); + } + if(vi->rate!=0){ + /* previously initialized info header */ + return(OV_EBADHEADER); + } + + return(_vorbis_unpack_info(vi,&opb)); + + case 0x03: /* least significant *bit* is read first */ + if(vi->rate==0){ + /* um... we didn't get the initial header */ + return(OV_EBADHEADER); + } + + return(_vorbis_unpack_comment(vc,&opb)); + + case 0x05: /* least significant *bit* is read first */ + if(vi->rate==0 || vc->vendor==NULL){ + /* um... we didn;t get the initial header or comments yet */ + return(OV_EBADHEADER); + } + + return(_vorbis_unpack_books(vi,&opb)); + + default: + /* Not a valid vorbis header type */ + return(OV_EBADHEADER); + break; + } + } + } + return(OV_EBADHEADER); +} + diff --git a/media/libtremor/lib/tremor_mapping0.c b/media/libtremor/lib/tremor_mapping0.c new file mode 100644 index 000000000000..aa03e8543f21 --- /dev/null +++ b/media/libtremor/lib/tremor_mapping0.c @@ -0,0 +1,328 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: channel mapping 0 implementation + + ********************************************************************/ + +#include +#include +#include +#include +#include +#include "ivorbiscodec.h" +#include "mdct.h" +#include "codec_internal.h" +#include "codebook.h" +#include "window.h" +#include "registry.h" +#include "misc.h" + +/* simplistic, wasteful way of doing this (unique lookup for each + mode/submapping); there should be a central repository for + identical lookups. That will require minor work, so I'm putting it + off as low priority. + + Why a lookup for each backend in a given mode? Because the + blocksize is set by the mode, and low backend lookups may require + parameters from other areas of the mode/mapping */ + +typedef struct { + vorbis_info_mode *mode; + vorbis_info_mapping0 *map; + + vorbis_look_floor **floor_look; + + vorbis_look_residue **residue_look; + + vorbis_func_floor **floor_func; + vorbis_func_residue **residue_func; + + int ch; + long lastframe; /* if a different mode is called, we need to + invalidate decay */ +} vorbis_look_mapping0; + +static void mapping0_free_info(vorbis_info_mapping *i){ + vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)i; + if(info){ + memset(info,0,sizeof(*info)); + _ogg_free(info); + } +} + +static void mapping0_free_look(vorbis_look_mapping *look){ + int i; + vorbis_look_mapping0 *l=(vorbis_look_mapping0 *)look; + if(l){ + + for(i=0;imap->submaps;i++){ + l->floor_func[i]->free_look(l->floor_look[i]); + l->residue_func[i]->free_look(l->residue_look[i]); + } + + _ogg_free(l->floor_func); + _ogg_free(l->residue_func); + _ogg_free(l->floor_look); + _ogg_free(l->residue_look); + memset(l,0,sizeof(*l)); + _ogg_free(l); + } +} + +static vorbis_look_mapping *mapping0_look(vorbis_dsp_state *vd,vorbis_info_mode *vm, + vorbis_info_mapping *m){ + int i; + vorbis_info *vi=vd->vi; + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + vorbis_look_mapping0 *look=(vorbis_look_mapping0 *)_ogg_calloc(1,sizeof(*look)); + vorbis_info_mapping0 *info=look->map=(vorbis_info_mapping0 *)m; + look->mode=vm; + + look->floor_look=(vorbis_look_floor **)_ogg_calloc(info->submaps,sizeof(*look->floor_look)); + + look->residue_look=(vorbis_look_residue **)_ogg_calloc(info->submaps,sizeof(*look->residue_look)); + + look->floor_func=(vorbis_func_floor **)_ogg_calloc(info->submaps,sizeof(*look->floor_func)); + look->residue_func=(vorbis_func_residue **)_ogg_calloc(info->submaps,sizeof(*look->residue_func)); + + for(i=0;isubmaps;i++){ + int floornum=info->floorsubmap[i]; + int resnum=info->residuesubmap[i]; + + look->floor_func[i]=_floor_P[ci->floor_type[floornum]]; + look->floor_look[i]=look->floor_func[i]-> + look(vd,vm,ci->floor_param[floornum]); + look->residue_func[i]=_residue_P[ci->residue_type[resnum]]; + look->residue_look[i]=look->residue_func[i]-> + look(vd,vm,ci->residue_param[resnum]); + + } + + look->ch=vi->channels; + + return(look); +} + +static int ilog(unsigned int v){ + int ret=0; + if(v)--v; + while(v){ + ret++; + v>>=1; + } + return(ret); +} + +/* also responsible for range checking */ +static vorbis_info_mapping *mapping0_unpack(vorbis_info *vi,oggpack_buffer *opb){ + int i,b; + vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)_ogg_calloc(1,sizeof(*info)); + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + memset(info,0,sizeof(*info)); + + b=oggpack_read(opb,1); + if(b<0)goto err_out; + if(b){ + info->submaps=oggpack_read(opb,4)+1; + if(info->submaps<=0)goto err_out; + }else + info->submaps=1; + + b=oggpack_read(opb,1); + if(b<0)goto err_out; + if(b){ + info->coupling_steps=oggpack_read(opb,8)+1; + if(info->coupling_steps<=0)goto err_out; + for(i=0;icoupling_steps;i++){ + int testM=info->coupling_mag[i]=oggpack_read(opb,ilog(vi->channels)); + int testA=info->coupling_ang[i]=oggpack_read(opb,ilog(vi->channels)); + + if(testM<0 || + testA<0 || + testM==testA || + testM>=vi->channels || + testA>=vi->channels) goto err_out; + } + + } + + if(oggpack_read(opb,2)!=0)goto err_out; /* 2,3:reserved */ + + if(info->submaps>1){ + for(i=0;ichannels;i++){ + info->chmuxlist[i]=oggpack_read(opb,4); + if(info->chmuxlist[i]>=info->submaps || info->chmuxlist[i]<0)goto err_out; + } + } + for(i=0;isubmaps;i++){ + int temp=oggpack_read(opb,8); + if(temp>=ci->times)goto err_out; + info->floorsubmap[i]=oggpack_read(opb,8); + if(info->floorsubmap[i]>=ci->floors || info->floorsubmap[i]<0)goto err_out; + info->residuesubmap[i]=oggpack_read(opb,8); + if(info->residuesubmap[i]>=ci->residues || info->residuesubmap[i]<0) + goto err_out; + } + + return info; + + err_out: + mapping0_free_info(info); + return(NULL); +} + +static int seq=0; +static int mapping0_inverse(vorbis_block *vb,vorbis_look_mapping *l){ + vorbis_dsp_state *vd=vb->vd; + vorbis_info *vi=vd->vi; + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + private_state *b=(private_state *)vd->backend_state; + vorbis_look_mapping0 *look=(vorbis_look_mapping0 *)l; + vorbis_info_mapping0 *info=look->map; + + int i,j; + long n=vb->pcmend=ci->blocksizes[vb->W]; + + ogg_int32_t **pcmbundle=(ogg_int32_t **)alloca(sizeof(*pcmbundle)*vi->channels); + int *zerobundle=(int *)alloca(sizeof(*zerobundle)*vi->channels); + + int *nonzero =(int *)alloca(sizeof(*nonzero)*vi->channels); + void **floormemo=(void **)alloca(sizeof(*floormemo)*vi->channels); + + /* time domain information decode (note that applying the + information would have to happen later; we'll probably add a + function entry to the harness for that later */ + /* NOT IMPLEMENTED */ + + /* recover the spectral envelope; store it in the PCM vector for now */ + for(i=0;ichannels;i++){ + int submap=info->chmuxlist[i]; + floormemo[i]=look->floor_func[submap]-> + inverse1(vb,look->floor_look[submap]); + if(floormemo[i]) + nonzero[i]=1; + else + nonzero[i]=0; + memset(vb->pcm[i],0,sizeof(*vb->pcm[i])*n/2); + } + + /* channel coupling can 'dirty' the nonzero listing */ + for(i=0;icoupling_steps;i++){ + if(nonzero[info->coupling_mag[i]] || + nonzero[info->coupling_ang[i]]){ + nonzero[info->coupling_mag[i]]=1; + nonzero[info->coupling_ang[i]]=1; + } + } + + /* recover the residue into our working vectors */ + for(i=0;isubmaps;i++){ + int ch_in_bundle=0; + for(j=0;jchannels;j++){ + if(info->chmuxlist[j]==i){ + if(nonzero[j]) + zerobundle[ch_in_bundle]=1; + else + zerobundle[ch_in_bundle]=0; + pcmbundle[ch_in_bundle++]=vb->pcm[j]; + } + } + + look->residue_func[i]->inverse(vb,look->residue_look[i], + pcmbundle,zerobundle,ch_in_bundle); + } + + //for(j=0;jchannels;j++) + //_analysis_output("coupled",seq+j,vb->pcm[j],-8,n/2,0,0); + + + /* channel coupling */ + for(i=info->coupling_steps-1;i>=0;i--){ + ogg_int32_t *pcmM=vb->pcm[info->coupling_mag[i]]; + ogg_int32_t *pcmA=vb->pcm[info->coupling_ang[i]]; + + for(j=0;j0) + if(ang>0){ + pcmM[j]=mag; + pcmA[j]=mag-ang; + }else{ + pcmA[j]=mag; + pcmM[j]=mag+ang; + } + else + if(ang>0){ + pcmM[j]=mag; + pcmA[j]=mag+ang; + }else{ + pcmA[j]=mag; + pcmM[j]=mag-ang; + } + } + } + + //for(j=0;jchannels;j++) + //_analysis_output("residue",seq+j,vb->pcm[j],-8,n/2,0,0); + + /* compute and apply spectral envelope */ + for(i=0;ichannels;i++){ + ogg_int32_t *pcm=vb->pcm[i]; + int submap=info->chmuxlist[i]; + look->floor_func[submap]-> + inverse2(vb,look->floor_look[submap],floormemo[i],pcm); + } + + //for(j=0;jchannels;j++) + //_analysis_output("mdct",seq+j,vb->pcm[j],-24,n/2,0,1); + + /* transform the PCM data; takes PCM vector, vb; modifies PCM vector */ + /* only MDCT right now.... */ + for(i=0;ichannels;i++){ + ogg_int32_t *pcm=vb->pcm[i]; + mdct_backward(n,pcm,pcm); + } + + //for(j=0;jchannels;j++) + //_analysis_output("imdct",seq+j,vb->pcm[j],-24,n,0,0); + + /* window the data */ + for(i=0;ichannels;i++){ + ogg_int32_t *pcm=vb->pcm[i]; + if(nonzero[i]) + _vorbis_apply_window(pcm,b->window,ci->blocksizes,vb->lW,vb->W,vb->nW); + else + for(j=0;jchannels;j++) + //_analysis_output("window",seq+j,vb->pcm[j],-24,n,0,0); + + seq+=vi->channels; + /* all done! */ + return(0); +} + +/* export hooks */ +vorbis_func_mapping mapping0_exportbundle={ + &mapping0_unpack, + &mapping0_look, + &mapping0_free_info, + &mapping0_free_look, + &mapping0_inverse +}; diff --git a/media/libtremor/lib/tremor_mdct.c b/media/libtremor/lib/tremor_mdct.c new file mode 100644 index 000000000000..4f39e7d531d4 --- /dev/null +++ b/media/libtremor/lib/tremor_mdct.c @@ -0,0 +1,510 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: normalized modified discrete cosine transform + power of two length transform only [64 <= n ] + last mod: $Id: mdct.c,v 1.9 2002/10/16 09:17:39 xiphmont Exp $ + + Original algorithm adapted long ago from _The use of multirate filter + banks for coding of high quality digital audio_, by T. Sporer, + K. Brandenburg and B. Edler, collection of the European Signal + Processing Conference (EUSIPCO), Amsterdam, June 1992, Vol.1, pp + 211-214 + + The below code implements an algorithm that no longer looks much like + that presented in the paper, but the basic structure remains if you + dig deep enough to see it. + + This module DOES NOT INCLUDE code to generate/apply the window + function. Everybody has their own weird favorite including me... I + happen to like the properties of y=sin(.5PI*sin^2(x)), but others may + vehemently disagree. + + ********************************************************************/ + +#include "ivorbiscodec.h" +#include "codebook.h" +#include "misc.h" +#include "mdct.h" +#include "mdct_lookup.h" + + +/* 8 point butterfly (in place) */ +STIN void mdct_butterfly_8(DATA_TYPE *x){ + + REG_TYPE r0 = x[4] + x[0]; + REG_TYPE r1 = x[4] - x[0]; + REG_TYPE r2 = x[5] + x[1]; + REG_TYPE r3 = x[5] - x[1]; + REG_TYPE r4 = x[6] + x[2]; + REG_TYPE r5 = x[6] - x[2]; + REG_TYPE r6 = x[7] + x[3]; + REG_TYPE r7 = x[7] - x[3]; + + x[0] = r5 + r3; + x[1] = r7 - r1; + x[2] = r5 - r3; + x[3] = r7 + r1; + x[4] = r4 - r0; + x[5] = r6 - r2; + x[6] = r4 + r0; + x[7] = r6 + r2; + MB(); +} + +/* 16 point butterfly (in place, 4 register) */ +STIN void mdct_butterfly_16(DATA_TYPE *x){ + + REG_TYPE r0, r1; + + r0 = x[ 0] - x[ 8]; x[ 8] += x[ 0]; + r1 = x[ 1] - x[ 9]; x[ 9] += x[ 1]; + x[ 0] = MULT31((r0 + r1) , cPI2_8); + x[ 1] = MULT31((r1 - r0) , cPI2_8); + MB(); + + r0 = x[10] - x[ 2]; x[10] += x[ 2]; + r1 = x[ 3] - x[11]; x[11] += x[ 3]; + x[ 2] = r1; x[ 3] = r0; + MB(); + + r0 = x[12] - x[ 4]; x[12] += x[ 4]; + r1 = x[13] - x[ 5]; x[13] += x[ 5]; + x[ 4] = MULT31((r0 - r1) , cPI2_8); + x[ 5] = MULT31((r0 + r1) , cPI2_8); + MB(); + + r0 = x[14] - x[ 6]; x[14] += x[ 6]; + r1 = x[15] - x[ 7]; x[15] += x[ 7]; + x[ 6] = r0; x[ 7] = r1; + MB(); + + mdct_butterfly_8(x); + mdct_butterfly_8(x+8); +} + +/* 32 point butterfly (in place, 4 register) */ +STIN void mdct_butterfly_32(DATA_TYPE *x){ + + REG_TYPE r0, r1; + + r0 = x[30] - x[14]; x[30] += x[14]; + r1 = x[31] - x[15]; x[31] += x[15]; + x[14] = r0; x[15] = r1; + MB(); + + r0 = x[28] - x[12]; x[28] += x[12]; + r1 = x[29] - x[13]; x[29] += x[13]; + XNPROD31( r0, r1, cPI1_8, cPI3_8, &x[12], &x[13] ); + MB(); + + r0 = x[26] - x[10]; x[26] += x[10]; + r1 = x[27] - x[11]; x[27] += x[11]; + x[10] = MULT31((r0 - r1) , cPI2_8); + x[11] = MULT31((r0 + r1) , cPI2_8); + MB(); + + r0 = x[24] - x[ 8]; x[24] += x[ 8]; + r1 = x[25] - x[ 9]; x[25] += x[ 9]; + XNPROD31( r0, r1, cPI3_8, cPI1_8, &x[ 8], &x[ 9] ); + MB(); + + r0 = x[22] - x[ 6]; x[22] += x[ 6]; + r1 = x[ 7] - x[23]; x[23] += x[ 7]; + x[ 6] = r1; x[ 7] = r0; + MB(); + + r0 = x[ 4] - x[20]; x[20] += x[ 4]; + r1 = x[ 5] - x[21]; x[21] += x[ 5]; + XPROD31 ( r0, r1, cPI3_8, cPI1_8, &x[ 4], &x[ 5] ); + MB(); + + r0 = x[ 2] - x[18]; x[18] += x[ 2]; + r1 = x[ 3] - x[19]; x[19] += x[ 3]; + x[ 2] = MULT31((r1 + r0) , cPI2_8); + x[ 3] = MULT31((r1 - r0) , cPI2_8); + MB(); + + r0 = x[ 0] - x[16]; x[16] += x[ 0]; + r1 = x[ 1] - x[17]; x[17] += x[ 1]; + XPROD31 ( r0, r1, cPI1_8, cPI3_8, &x[ 0], &x[ 1] ); + MB(); + + mdct_butterfly_16(x); + mdct_butterfly_16(x+16); +} + +/* N/stage point generic N stage butterfly (in place, 2 register) */ +STIN void mdct_butterfly_generic(DATA_TYPE *x,int points,int step){ + + LOOKUP_T *T = sincos_lookup0; + DATA_TYPE *x1 = x + points - 8; + DATA_TYPE *x2 = x + (points>>1) - 8; + REG_TYPE r0; + REG_TYPE r1; + + do{ + r0 = x1[6] - x2[6]; x1[6] += x2[6]; + r1 = x2[7] - x1[7]; x1[7] += x2[7]; + XPROD31( r1, r0, T[0], T[1], &x2[6], &x2[7] ); T+=step; + + r0 = x1[4] - x2[4]; x1[4] += x2[4]; + r1 = x2[5] - x1[5]; x1[5] += x2[5]; + XPROD31( r1, r0, T[0], T[1], &x2[4], &x2[5] ); T+=step; + + r0 = x1[2] - x2[2]; x1[2] += x2[2]; + r1 = x2[3] - x1[3]; x1[3] += x2[3]; + XPROD31( r1, r0, T[0], T[1], &x2[2], &x2[3] ); T+=step; + + r0 = x1[0] - x2[0]; x1[0] += x2[0]; + r1 = x2[1] - x1[1]; x1[1] += x2[1]; + XPROD31( r1, r0, T[0], T[1], &x2[0], &x2[1] ); T+=step; + + x1-=8; x2-=8; + }while(Tsincos_lookup0); + do{ + r0 = x2[6] - x1[6]; x1[6] += x2[6]; + r1 = x2[7] - x1[7]; x1[7] += x2[7]; + XPROD31( r0, r1, T[0], T[1], &x2[6], &x2[7] ); T+=step; + + r0 = x2[4] - x1[4]; x1[4] += x2[4]; + r1 = x2[5] - x1[5]; x1[5] += x2[5]; + XPROD31( r0, r1, T[0], T[1], &x2[4], &x2[5] ); T+=step; + + r0 = x2[2] - x1[2]; x1[2] += x2[2]; + r1 = x2[3] - x1[3]; x1[3] += x2[3]; + XPROD31( r0, r1, T[0], T[1], &x2[2], &x2[3] ); T+=step; + + r0 = x2[0] - x1[0]; x1[0] += x2[0]; + r1 = x2[1] - x1[1]; x1[1] += x2[1]; + XPROD31( r0, r1, T[0], T[1], &x2[0], &x2[1] ); T+=step; + + x1-=8; x2-=8; + }while(Tsincos_lookup0); +} + +STIN void mdct_butterflies(DATA_TYPE *x,int points,int shift){ + + int stages=8-shift; + int i,j; + + for(i=0;--stages>0;i++){ + for(j=0;j<(1<>i)*j,points>>i,4<<(i+shift)); + } + + for(j=0;j>8]|(bitrev[(x&0x0f0)>>4]<<4)|(((int)bitrev[x&0x00f])<<8); +} + +STIN void mdct_bitreverse(DATA_TYPE *x,int n,int step,int shift){ + + int bit = 0; + DATA_TYPE *w0 = x; + DATA_TYPE *w1 = x = w0+(n>>1); + LOOKUP_T *T = (step>=4)?(sincos_lookup0+(step>>1)):sincos_lookup1; + LOOKUP_T *Ttop = T+1024; + DATA_TYPE r2; + + do{ + DATA_TYPE r3 = bitrev12(bit++); + DATA_TYPE *x0 = x + ((r3 ^ 0xfff)>>shift) -1; + DATA_TYPE *x1 = x + (r3>>shift); + + REG_TYPE r0 = x0[0] + x1[0]; + REG_TYPE r1 = x1[1] - x0[1]; + + XPROD32( r0, r1, T[1], T[0], &r2, &r3 ); T+=step; + + w1 -= 4; + + r0 = (x0[1] + x1[1])>>1; + r1 = (x0[0] - x1[0])>>1; + w0[0] = r0 + r2; + w0[1] = r1 + r3; + w1[2] = r0 - r2; + w1[3] = r3 - r1; + + r3 = bitrev12(bit++); + x0 = x + ((r3 ^ 0xfff)>>shift) -1; + x1 = x + (r3>>shift); + + r0 = x0[0] + x1[0]; + r1 = x1[1] - x0[1]; + + XPROD32( r0, r1, T[1], T[0], &r2, &r3 ); T+=step; + + r0 = (x0[1] + x1[1])>>1; + r1 = (x0[0] - x1[0])>>1; + w0[2] = r0 + r2; + w0[3] = r1 + r3; + w1[0] = r0 - r2; + w1[1] = r3 - r1; + + w0 += 4; + }while(T>shift) -1; + DATA_TYPE *x1 = x + (r3>>shift); + + REG_TYPE r0 = x0[0] + x1[0]; + REG_TYPE r1 = x1[1] - x0[1]; + + T-=step; XPROD32( r0, r1, T[0], T[1], &r2, &r3 ); + + w1 -= 4; + + r0 = (x0[1] + x1[1])>>1; + r1 = (x0[0] - x1[0])>>1; + w0[0] = r0 + r2; + w0[1] = r1 + r3; + w1[2] = r0 - r2; + w1[3] = r3 - r1; + + r3 = bitrev12(bit++); + x0 = x + ((r3 ^ 0xfff)>>shift) -1; + x1 = x + (r3>>shift); + + r0 = x0[0] + x1[0]; + r1 = x1[1] - x0[1]; + + T-=step; XPROD32( r0, r1, T[0], T[1], &r2, &r3 ); + + r0 = (x0[1] + x1[1])>>1; + r1 = (x0[0] - x1[0])>>1; + w0[2] = r0 + r2; + w0[3] = r1 + r3; + w1[0] = r0 - r2; + w1[1] = r3 - r1; + + w0 += 4; + }while(w0>1; + int n4=n>>2; + DATA_TYPE *iX; + DATA_TYPE *oX; + LOOKUP_T *T; + LOOKUP_T *V; + int shift; + int step; + + for (shift=6;!(n&(1<=in+n4); + do{ + oX-=4; + XPROD31( iX[4], iX[6], T[1], T[0], &oX[2], &oX[3] ); T-=step; + XPROD31( iX[0], iX[2], T[1], T[0], &oX[0], &oX[1] ); T-=step; + iX-=8; + }while(iX>=in); + + iX = in+n2-8; + oX = out+n2+n4; + T = sincos_lookup0; + + do{ + T+=step; XNPROD31( iX[6], iX[4], T[0], T[1], &oX[0], &oX[1] ); + T+=step; XNPROD31( iX[2], iX[0], T[0], T[1], &oX[2], &oX[3] ); + iX-=8; + oX+=4; + }while(iX>=in+n4); + do{ + T-=step; XNPROD31( iX[6], iX[4], T[1], T[0], &oX[0], &oX[1] ); + T-=step; XNPROD31( iX[2], iX[0], T[1], T[0], &oX[2], &oX[3] ); + iX-=8; + oX+=4; + }while(iX>=in); + + mdct_butterflies(out+n2,n2,shift); + mdct_bitreverse(out,n,step,shift); + + /* rotate + window */ + + step>>=2; + { + DATA_TYPE *oX1=out+n2+n4; + DATA_TYPE *oX2=out+n2+n4; + DATA_TYPE *iX =out; + + switch(step) { + default: { + T=(step>=4)?(sincos_lookup0+(step>>1)):sincos_lookup1; + do{ + oX1-=4; + XPROD31( iX[0], -iX[1], T[0], T[1], &oX1[3], &oX2[0] ); T+=step; + XPROD31( iX[2], -iX[3], T[0], T[1], &oX1[2], &oX2[1] ); T+=step; + XPROD31( iX[4], -iX[5], T[0], T[1], &oX1[1], &oX2[2] ); T+=step; + XPROD31( iX[6], -iX[7], T[0], T[1], &oX1[0], &oX2[3] ); T+=step; + oX2+=4; + iX+=8; + }while(iX>1; + t1 = (*T++)>>1; + do{ + oX1-=4; + + t0 += (v0 = (*V++)>>1); + t1 += (v1 = (*V++)>>1); + XPROD31( iX[0], -iX[1], t0, t1, &oX1[3], &oX2[0] ); + v0 += (t0 = (*T++)>>1); + v1 += (t1 = (*T++)>>1); + XPROD31( iX[2], -iX[3], v0, v1, &oX1[2], &oX2[1] ); + t0 += (v0 = (*V++)>>1); + t1 += (v1 = (*V++)>>1); + XPROD31( iX[4], -iX[5], t0, t1, &oX1[1], &oX2[2] ); + v0 += (t0 = (*T++)>>1); + v1 += (t1 = (*T++)>>1); + XPROD31( iX[6], -iX[7], v0, v1, &oX1[0], &oX2[3] ); + + oX2+=4; + iX+=8; + }while(iX>2); + t1 += (q1 = (v1-t1)>>2); + XPROD31( iX[0], -iX[1], t0, t1, &oX1[3], &oX2[0] ); + t0 = v0-q0; + t1 = v1-q1; + XPROD31( iX[2], -iX[3], t0, t1, &oX1[2], &oX2[1] ); + + t0 = *T++; + t1 = *T++; + v0 += (q0 = (t0-v0)>>2); + v1 += (q1 = (t1-v1)>>2); + XPROD31( iX[4], -iX[5], v0, v1, &oX1[1], &oX2[2] ); + v0 = t0-q0; + v1 = t1-q1; + XPROD31( iX[6], -iX[7], v0, v1, &oX1[0], &oX2[3] ); + + oX2+=4; + iX+=8; + }while(iXoX2); + } +} + diff --git a/media/libtremor/lib/tremor_registry.c b/media/libtremor/lib/tremor_registry.c new file mode 100644 index 000000000000..c0b5fec0cc32 --- /dev/null +++ b/media/libtremor/lib/tremor_registry.c @@ -0,0 +1,50 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: registry for floor, res backends and channel mappings + + ********************************************************************/ + +#include "ivorbiscodec.h" +#include "codec_internal.h" +#include "registry.h" +#include "misc.h" + + +/* seems like major overkill now; the backend numbers will grow into + the infrastructure soon enough */ + +extern vorbis_func_floor floor0_exportbundle; +extern vorbis_func_floor floor1_exportbundle; +extern vorbis_func_residue residue0_exportbundle; +extern vorbis_func_residue residue1_exportbundle; +extern vorbis_func_residue residue2_exportbundle; +extern vorbis_func_mapping mapping0_exportbundle; + +vorbis_func_floor *_floor_P[]={ + &floor0_exportbundle, + &floor1_exportbundle, +}; + +vorbis_func_residue *_residue_P[]={ + &residue0_exportbundle, + &residue1_exportbundle, + &residue2_exportbundle, +}; + +vorbis_func_mapping *_mapping_P[]={ + &mapping0_exportbundle, +}; + + + diff --git a/media/libtremor/lib/tremor_res012.c b/media/libtremor/lib/tremor_res012.c new file mode 100644 index 000000000000..f036caaa48f6 --- /dev/null +++ b/media/libtremor/lib/tremor_res012.c @@ -0,0 +1,374 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: residue backend 0, 1 and 2 implementation + + ********************************************************************/ + +#include +#include +#include +#include +#include "ivorbiscodec.h" +#include "codec_internal.h" +#include "registry.h" +#include "codebook.h" +#include "misc.h" +#include "os.h" +#include "block.h" + +typedef struct { + vorbis_info_residue0 *info; + int map; + + int parts; + int stages; + codebook *fullbooks; + codebook *phrasebook; + codebook ***partbooks; + + int partvals; + int **decodemap; + +} vorbis_look_residue0; + +void res0_free_info(vorbis_info_residue *i){ + vorbis_info_residue0 *info=(vorbis_info_residue0 *)i; + if(info){ + memset(info,0,sizeof(*info)); + _ogg_free(info); + } +} + +void res0_free_look(vorbis_look_residue *i){ + int j; + if(i){ + + vorbis_look_residue0 *look=(vorbis_look_residue0 *)i; + + for(j=0;jparts;j++) + if(look->partbooks[j])_ogg_free(look->partbooks[j]); + _ogg_free(look->partbooks); + for(j=0;jpartvals;j++) + _ogg_free(look->decodemap[j]); + _ogg_free(look->decodemap); + + memset(look,0,sizeof(*look)); + _ogg_free(look); + } +} + +static int ilog(unsigned int v){ + int ret=0; + while(v){ + ret++; + v>>=1; + } + return(ret); +} + +static int icount(unsigned int v){ + int ret=0; + while(v){ + ret+=v&1; + v>>=1; + } + return(ret); +} + +/* vorbis_info is for range checking */ +vorbis_info_residue *res0_unpack(vorbis_info *vi,oggpack_buffer *opb){ + int j,acc=0; + vorbis_info_residue0 *info=(vorbis_info_residue0 *)_ogg_calloc(1,sizeof(*info)); + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + + info->begin=oggpack_read(opb,24); + info->end=oggpack_read(opb,24); + info->grouping=oggpack_read(opb,24)+1; + info->partitions=oggpack_read(opb,6)+1; + info->groupbook=oggpack_read(opb,8); + + /* check for premature EOP */ + if(info->groupbook<0)goto errout; + + for(j=0;jpartitions;j++){ + int cascade=oggpack_read(opb,3); + int cflag=oggpack_read(opb,1); + if(cflag<0) goto errout; + if(cflag){ + int c=oggpack_read(opb,5); + if(c<0) goto errout; + cascade|=(c<<3); + } + info->secondstages[j]=cascade; + + acc+=icount(cascade); + } + for(j=0;jbooklist[j]=book; + } + + if(info->groupbook>=ci->books)goto errout; + for(j=0;jbooklist[j]>=ci->books)goto errout; + if(ci->book_param[info->booklist[j]]->maptype==0)goto errout; + } + + /* verify the phrasebook is not specifying an impossible or + inconsistent partitioning scheme. */ + /* modify the phrasebook ranging check from r16327; an early beta + encoder had a bug where it used an oversized phrasebook by + accident. These files should continue to be playable, but don't + allow an exploit */ + { + int entries = ci->book_param[info->groupbook]->entries; + int dim = ci->book_param[info->groupbook]->dim; + int partvals = 1; + if (dim<1) goto errout; + while(dim>0){ + partvals *= info->partitions; + if(partvals > entries) goto errout; + dim--; + } + info->partvals = partvals; + } + + return(info); + errout: + res0_free_info(info); + return(NULL); +} + +vorbis_look_residue *res0_look(vorbis_dsp_state *vd,vorbis_info_mode *vm, + vorbis_info_residue *vr){ + vorbis_info_residue0 *info=(vorbis_info_residue0 *)vr; + vorbis_look_residue0 *look=(vorbis_look_residue0 *)_ogg_calloc(1,sizeof(*look)); + codec_setup_info *ci=(codec_setup_info *)vd->vi->codec_setup; + + int j,k,acc=0; + int dim; + int maxstage=0; + look->info=info; + look->map=vm->mapping; + + look->parts=info->partitions; + look->fullbooks=ci->fullbooks; + look->phrasebook=ci->fullbooks+info->groupbook; + dim=look->phrasebook->dim; + + look->partbooks=(codebook ***)_ogg_calloc(look->parts,sizeof(*look->partbooks)); + + for(j=0;jparts;j++){ + int stages=ilog(info->secondstages[j]); + if(stages){ + if(stages>maxstage)maxstage=stages; + look->partbooks[j]=(codebook **)_ogg_calloc(stages,sizeof(*look->partbooks[j])); + for(k=0;ksecondstages[j]&(1<partbooks[j][k]=ci->fullbooks+info->booklist[acc++]; +#ifdef TRAIN_RES + look->training_data[k][j]=calloc(look->partbooks[j][k]->entries, + sizeof(***look->training_data)); +#endif + } + } + } + + look->partvals=look->parts; + for(j=1;jpartvals*=look->parts; + look->stages=maxstage; + look->decodemap=(int **)_ogg_malloc(look->partvals*sizeof(*look->decodemap)); + for(j=0;jpartvals;j++){ + long val=j; + long mult=look->partvals/look->parts; + look->decodemap[j]=(int *)_ogg_malloc(dim*sizeof(*look->decodemap[j])); + for(k=0;kparts; + look->decodemap[j][k]=deco; + } + } + + return(look); +} + + +/* a truncated packet here just means 'stop working'; it's not an error */ +static int _01inverse(vorbis_block *vb,vorbis_look_residue *vl, + ogg_int32_t **in,int ch, + long (*decodepart)(codebook *, ogg_int32_t *, + oggpack_buffer *,int,int)){ + + long i,j,k,l,s; + vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl; + vorbis_info_residue0 *info=look->info; + + /* move all this setup out later */ + int samples_per_partition=info->grouping; + int partitions_per_word=look->phrasebook->dim; + int max=vb->pcmend>>1; + int end=(info->endend:max); + int n=end-info->begin; + + if(n>0){ + int partvals=n/samples_per_partition; + int partwords=(partvals+partitions_per_word-1)/partitions_per_word; + int ***partword=(int ***)alloca(ch*sizeof(*partword)); + + for(j=0;jstages;s++){ + + /* each loop decodes on partition codeword containing + partitions_pre_word partitions */ + for(i=0,l=0;iphrasebook,&vb->opb); + if(temp==-1 || temp>=info->partvals)goto eopbreak; + partword[j][l]=look->decodemap[temp]; + if(partword[j][l]==NULL)goto errout; + } + } + + /* now we decode residual values for the partitions */ + for(k=0;kbegin+i*samples_per_partition; + if(info->secondstages[partword[j][l][k]]&(1<partbooks[partword[j][l][k]][s]; + if(stagebook){ + if(decodepart(stagebook,in[j]+offset,&vb->opb, + samples_per_partition,-8)==-1)goto eopbreak; + } + } + } + } + } + } + errout: + eopbreak: + return(0); +} + +int res0_inverse(vorbis_block *vb,vorbis_look_residue *vl, + ogg_int32_t **in,int *nonzero,int ch){ + int i,used=0; + for(i=0;iinfo; + + /* move all this setup out later */ + int samples_per_partition=info->grouping; + int partitions_per_word=look->phrasebook->dim; + int max=(vb->pcmend*ch)>>1; + int end=(info->endend:max); + int n=end-info->begin; + + if(n>0){ + + int partvals=n/samples_per_partition; + int partwords=(partvals+partitions_per_word-1)/partitions_per_word; + int **partword=(int **)_vorbis_block_alloc(vb,partwords*sizeof(*partword)); + int beginoff=info->begin/ch; + + for(i=0;istages;s++){ + for(i=0,l=0;iphrasebook,&vb->opb); + if(temp==-1 || temp>=info->partvals)goto eopbreak; + partword[l]=look->decodemap[temp]; + if(partword[l]==NULL)goto errout; + } + + /* now we decode residual values for the partitions */ + for(k=0;ksecondstages[partword[l][k]]&(1<partbooks[partword[l][k]][s]; + + if(stagebook){ + if(vorbis_book_decodevv_add(stagebook,in, + i*samples_per_partition+beginoff,ch, + &vb->opb, + samples_per_partition,-8)==-1) + goto eopbreak; + } + } + } + } + } + errout: + eopbreak: + return(0); +} + + +vorbis_func_residue residue0_exportbundle={ + &res0_unpack, + &res0_look, + &res0_free_info, + &res0_free_look, + &res0_inverse +}; + +vorbis_func_residue residue1_exportbundle={ + &res0_unpack, + &res0_look, + &res0_free_info, + &res0_free_look, + &res1_inverse +}; + +vorbis_func_residue residue2_exportbundle={ + &res0_unpack, + &res0_look, + &res0_free_info, + &res0_free_look, + &res2_inverse +}; diff --git a/media/libtremor/lib/tremor_sharedbook.c b/media/libtremor/lib/tremor_sharedbook.c new file mode 100644 index 000000000000..188485e3ffb4 --- /dev/null +++ b/media/libtremor/lib/tremor_sharedbook.c @@ -0,0 +1,447 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: basic shared codebook operations + + ********************************************************************/ + +#include +#include +#include +#include +#include "misc.h" +#include "ivorbiscodec.h" +#include "codebook.h" + +/**** pack/unpack helpers ******************************************/ +int _ilog(unsigned int v){ + int ret=0; + while(v){ + ret++; + v>>=1; + } + return(ret); +} + +/* 32 bit float (not IEEE; nonnormalized mantissa + + biased exponent) : neeeeeee eeemmmmm mmmmmmmm mmmmmmmm + Why not IEEE? It's just not that important here. */ + +#define VQ_FEXP 10 +#define VQ_FMAN 21 +#define VQ_FEXP_BIAS 768 /* bias toward values smaller than 1. */ + +static ogg_int32_t _float32_unpack(long val,int *point){ + long mant=val&0x1fffff; + int sign=val&0x80000000; + long exp =(val&0x7fe00000L)>>VQ_FMAN; + + exp-=(VQ_FMAN-1)+VQ_FEXP_BIAS; + + if(mant){ + while(!(mant&0x40000000)){ + mant<<=1; + exp-=1; + } + + if(sign)mant= -mant; + }else{ + sign=0; + exp=-9999; + } + + *point=exp; + return mant; +} + +/* given a list of word lengths, generate a list of codewords. Works + for length ordered or unordered, always assigns the lowest valued + codewords first. Extended to handle unused entries (length 0) */ +ogg_uint32_t *_make_words(long *l,long n,long sparsecount){ + long i,j,count=0; + ogg_uint32_t marker[33]; + ogg_uint32_t *r=(ogg_uint32_t *)_ogg_malloc((sparsecount?sparsecount:n)*sizeof(*r)); + memset(marker,0,sizeof(marker)); + + for(i=0;i0){ + ogg_uint32_t entry=marker[length]; + + /* when we claim a node for an entry, we also claim the nodes + below it (pruning off the imagined tree that may have dangled + from it) as well as blocking the use of any nodes directly + above for leaves */ + + /* update ourself */ + if(length<32 && (entry>>length)){ + /* error condition; the lengths must specify an overpopulated tree */ + _ogg_free(r); + return(NULL); + } + r[count++]=entry; + + /* Look to see if the next shorter marker points to the node + above. if so, update it and repeat. */ + { + for(j=length;j>0;j--){ + + if(marker[j]&1){ + /* have to jump branches */ + if(j==1) + marker[1]++; + else + marker[j]=marker[j-1]<<1; + break; /* invariant says next upper marker would already + have been moved if it was on the same path */ + } + marker[j]++; + } + } + + /* prune the tree; the implicit invariant says all the longer + markers were dangling from our just-taken node. Dangle them + from our *new* node. */ + for(j=length+1;j<33;j++) + if((marker[j]>>1) == entry){ + entry=marker[j]; + marker[j]=marker[j-1]<<1; + }else + break; + }else + if(sparsecount==0)count++; + } + + /* sanity check the huffman tree; an underpopulated tree must be + rejected. The only exception is the one-node pseudo-nil tree, + which appears to be underpopulated because the tree doesn't + really exist; there's only one possible 'codeword' or zero bits, + but the above tree-gen code doesn't mark that. */ + if(sparsecount != 1){ + for(i=1;i<33;i++) + if(marker[i] & (0xffffffffUL>>(32-i))){ + _ogg_free(r); + return(NULL); + } + } + + /* bitreverse the words because our bitwise packer/unpacker is LSb + endian */ + for(i=0,count=0;i>j)&1; + } + + if(sparsecount){ + if(l[i]) + r[count++]=temp; + }else + r[count++]=temp; + } + + return(r); +} + +/* there might be a straightforward one-line way to do the below + that's portable and totally safe against roundoff, but I haven't + thought of it. Therefore, we opt on the side of caution */ +long _book_maptype1_quantvals(const static_codebook *b){ + /* get us a starting hint, we'll polish it below */ + int bits=_ilog(b->entries); + int vals=b->entries>>((bits-1)*(b->dim-1)/b->dim); + + while(1){ + long acc=1; + long acc1=1; + int i; + for(i=0;idim;i++){ + acc*=vals; + acc1*=vals+1; + } + if(acc<=b->entries && acc1>b->entries){ + return(vals); + }else{ + if(acc>b->entries){ + vals--; + }else{ + vals++; + } + } + } +} + +/* different than what _book_unquantize does for mainline: + we repack the book in a fixed point format that shares the same + binary point. Upon first use, we can shift point if needed */ + +/* we need to deal with two map types: in map type 1, the values are + generated algorithmically (each column of the vector counts through + the values in the quant vector). in map type 2, all the values came + in in an explicit list. Both value lists must be unpacked */ + +ogg_int32_t *_book_unquantize(const static_codebook *b,int n,int *sparsemap, + int *maxpoint){ + long j,k,count=0; + if(b->maptype==1 || b->maptype==2){ + int quantvals; + int minpoint,delpoint; + ogg_int32_t mindel=_float32_unpack(b->q_min,&minpoint); + ogg_int32_t delta=_float32_unpack(b->q_delta,&delpoint); + ogg_int32_t *r=(ogg_int32_t *)_ogg_calloc(n*b->dim,sizeof(*r)); + int *rp=(int *)_ogg_calloc(n*b->dim,sizeof(*rp)); + + *maxpoint=minpoint; + + /* maptype 1 and 2 both use a quantized value vector, but + different sizes */ + switch(b->maptype){ + case 1: + /* most of the time, entries%dimensions == 0, but we need to be + well defined. We define that the possible vales at each + scalar is values == entries/dim. If entries%dim != 0, we'll + have 'too few' values (values*dimentries;j++){ + if((sparsemap && b->lengthlist[j]) || !sparsemap){ + ogg_int32_t last=0; + int lastpoint=0; + int indexdiv=1; + for(k=0;kdim;k++){ + int index= (j/indexdiv)%quantvals; + int point=0; + int val=VFLOAT_MULTI(delta,delpoint, + abs(b->quantlist[index]),&point); + + val=VFLOAT_ADD(mindel,minpoint,val,point,&point); + val=VFLOAT_ADD(last,lastpoint,val,point,&point); + + if(b->q_sequencep){ + last=val; + lastpoint=point; + } + + if(sparsemap){ + r[sparsemap[count]*b->dim+k]=val; + rp[sparsemap[count]*b->dim+k]=point; + }else{ + r[count*b->dim+k]=val; + rp[count*b->dim+k]=point; + } + if(*maxpointentries;j++){ + if((sparsemap && b->lengthlist[j]) || !sparsemap){ + ogg_int32_t last=0; + int lastpoint=0; + + for(k=0;kdim;k++){ + int point=0; + int val=VFLOAT_MULTI(delta,delpoint, + abs(b->quantlist[j*b->dim+k]),&point); + + val=VFLOAT_ADD(mindel,minpoint,val,point,&point); + val=VFLOAT_ADD(last,lastpoint,val,point,&point); + + if(b->q_sequencep){ + last=val; + lastpoint=point; + } + + if(sparsemap){ + r[sparsemap[count]*b->dim+k]=val; + rp[sparsemap[count]*b->dim+k]=point; + }else{ + r[count*b->dim+k]=val; + rp[count*b->dim+k]=point; + } + if(*maxpointdim;j++) + if(rp[j]<*maxpoint) + r[j]>>=*maxpoint-rp[j]; + + _ogg_free(rp); + return(r); + } + return(NULL); +} + +void vorbis_staticbook_destroy(static_codebook *b){ + if(b->quantlist)_ogg_free(b->quantlist); + if(b->lengthlist)_ogg_free(b->lengthlist); + memset(b,0,sizeof(*b)); + _ogg_free(b); +} + +void vorbis_book_clear(codebook *b){ + /* static book is not cleared; we're likely called on the lookup and + the static codebook belongs to the info struct */ + if(b->valuelist)_ogg_free(b->valuelist); + if(b->codelist)_ogg_free(b->codelist); + + if(b->dec_index)_ogg_free(b->dec_index); + if(b->dec_codelengths)_ogg_free(b->dec_codelengths); + if(b->dec_firsttable)_ogg_free(b->dec_firsttable); + + memset(b,0,sizeof(*b)); +} + +static ogg_uint32_t bitreverse(ogg_uint32_t x){ + x= ((x>>16)&0x0000ffffUL) | ((x<<16)&0xffff0000UL); + x= ((x>> 8)&0x00ff00ffUL) | ((x<< 8)&0xff00ff00UL); + x= ((x>> 4)&0x0f0f0f0fUL) | ((x<< 4)&0xf0f0f0f0UL); + x= ((x>> 2)&0x33333333UL) | ((x<< 2)&0xccccccccUL); + return((x>> 1)&0x55555555UL) | ((x<< 1)&0xaaaaaaaaUL); +} + +static int sort32a(const void *a,const void *b){ + return (**(ogg_uint32_t **)a>**(ogg_uint32_t **)b)- + (**(ogg_uint32_t **)a<**(ogg_uint32_t **)b); +} + +/* decode codebook arrangement is more heavily optimized than encode */ +int vorbis_book_init_decode(codebook *c,const static_codebook *s){ + int i,j,n=0,tabn; + int *sortindex; + memset(c,0,sizeof(*c)); + + /* count actually used entries */ + for(i=0;ientries;i++) + if(s->lengthlist[i]>0) + n++; + + c->entries=s->entries; + c->used_entries=n; + c->dim=s->dim; + + if(n>0){ + /* two different remappings go on here. + + First, we collapse the likely sparse codebook down only to + actually represented values/words. This collapsing needs to be + indexed as map-valueless books are used to encode original entry + positions as integers. + + Second, we reorder all vectors, including the entry index above, + by sorted bitreversed codeword to allow treeless decode. */ + + /* perform sort */ + ogg_uint32_t *codes=_make_words(s->lengthlist,s->entries,c->used_entries); + ogg_uint32_t **codep=(ogg_uint32_t **)alloca(sizeof(*codep)*n); + + if(codes==NULL)goto err_out; + + for(i=0;icodelist=(ogg_uint32_t *)_ogg_malloc(n*sizeof(*c->codelist)); + /* the index is a reverse index */ + for(i=0;icodelist[sortindex[i]]=codes[i]; + _ogg_free(codes); + + + + c->valuelist=_book_unquantize(s,n,sortindex,&c->binarypoint); + c->dec_index=(int *)_ogg_malloc(n*sizeof(*c->dec_index)); + + for(n=0,i=0;ientries;i++) + if(s->lengthlist[i]>0) + c->dec_index[sortindex[n++]]=i; + + c->dec_codelengths=(char *)_ogg_malloc(n*sizeof(*c->dec_codelengths)); + for(n=0,i=0;ientries;i++) + if(s->lengthlist[i]>0) + c->dec_codelengths[sortindex[n++]]=s->lengthlist[i]; + + c->dec_firsttablen=_ilog(c->used_entries)-4; /* this is magic */ + if(c->dec_firsttablen<5)c->dec_firsttablen=5; + if(c->dec_firsttablen>8)c->dec_firsttablen=8; + + tabn=1<dec_firsttablen; + c->dec_firsttable=(ogg_uint32_t *)_ogg_calloc(tabn,sizeof(*c->dec_firsttable)); + c->dec_maxlength=0; + + for(i=0;idec_maxlengthdec_codelengths[i]) + c->dec_maxlength=c->dec_codelengths[i]; + if(c->dec_codelengths[i]<=c->dec_firsttablen){ + ogg_uint32_t orig=bitreverse(c->codelist[i]); + for(j=0;j<(1<<(c->dec_firsttablen-c->dec_codelengths[i]));j++) + c->dec_firsttable[orig|(j<dec_codelengths[i])]=i+1; + } + } + + /* now fill in 'unused' entries in the firsttable with hi/lo search + hints for the non-direct-hits */ + { + ogg_uint32_t mask=0xfffffffeUL<<(31-c->dec_firsttablen); + long lo=0,hi=0; + + for(i=0;idec_firsttablen); + if(c->dec_firsttable[bitreverse(word)]==0){ + while((lo+1)codelist[lo+1]<=word)lo++; + while( hi=(c->codelist[hi]&mask))hi++; + + /* we only actually have 15 bits per hint to play with here. + In order to overflow gracefully (nothing breaks, efficiency + just drops), encode as the difference from the extremes. */ + { + unsigned long loval=lo; + unsigned long hival=n-hi; + + if(loval>0x7fff)loval=0x7fff; + if(hival>0x7fff)hival=0x7fff; + c->dec_firsttable[bitreverse(word)]= + 0x80000000UL | (loval<<15) | hival; + } + } + } + } + } + + return(0); + err_out: + vorbis_book_clear(c); + return(-1); +} + diff --git a/media/libtremor/lib/tremor_synthesis.c b/media/libtremor/lib/tremor_synthesis.c new file mode 100644 index 000000000000..c7680f6d02f2 --- /dev/null +++ b/media/libtremor/lib/tremor_synthesis.c @@ -0,0 +1,131 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2003 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: single-block PCM synthesis + last mod: $Id: synthesis.c,v 1.4 2003/03/29 03:07:21 xiphmont Exp $ + + ********************************************************************/ + +#include +#include +#include "ivorbiscodec.h" +#include "codec_internal.h" +#include "registry.h" +#include "misc.h" +#include "block.h" + +static int _vorbis_synthesis1(vorbis_block *vb,ogg_packet *op,int decodep){ + vorbis_dsp_state *vd= vb ? vb->vd : 0; + private_state *b= vd ? (private_state *)vd->backend_state: 0; + vorbis_info *vi= vd ? vd->vi : 0; + codec_setup_info *ci= vi ? (codec_setup_info *)vi->codec_setup : 0; + oggpack_buffer *opb=vb ? &vb->opb : 0; + int type,mode,i; + + if (!vd || !b || !vi || !ci || !opb) { + return OV_EBADPACKET; + } + + /* first things first. Make sure decode is ready */ + _vorbis_block_ripcord(vb); + oggpack_readinit(opb,op->packet,op->bytes); + + /* Check the packet type */ + if(oggpack_read(opb,1)!=0){ + /* Oops. This is not an audio data packet */ + return(OV_ENOTAUDIO); + } + + /* read our mode and pre/post windowsize */ + mode=oggpack_read(opb,b->modebits); + if(mode==-1)return(OV_EBADPACKET); + + vb->mode=mode; + if(!ci->mode_param[mode]){ + return(OV_EBADPACKET); + } + + vb->W=ci->mode_param[mode]->blockflag; + if(vb->W){ + vb->lW=oggpack_read(opb,1); + vb->nW=oggpack_read(opb,1); + if(vb->nW==-1) return(OV_EBADPACKET); + }else{ + vb->lW=0; + vb->nW=0; + } + + /* more setup */ + vb->granulepos=op->granulepos; + vb->sequence=op->packetno-3; /* first block is third packet */ + vb->eofflag=op->e_o_s; + + if(decodep){ + /* alloc pcm passback storage */ + vb->pcmend=ci->blocksizes[vb->W]; + vb->pcm=(ogg_int32_t **)_vorbis_block_alloc(vb,sizeof(*vb->pcm)*vi->channels); + for(i=0;ichannels;i++) + vb->pcm[i]=(ogg_int32_t *)_vorbis_block_alloc(vb,vb->pcmend*sizeof(*vb->pcm[i])); + + /* unpack_header enforces range checking */ + type=ci->map_type[ci->mode_param[mode]->mapping]; + + return(_mapping_P[type]->inverse(vb,b->mode[mode])); + }else{ + /* no pcm */ + vb->pcmend=0; + vb->pcm=NULL; + + return(0); + } +} + +int vorbis_synthesis(vorbis_block *vb,ogg_packet *op){ + return _vorbis_synthesis1(vb,op,1); +} + +/* used to track pcm position without actually performing decode. + Useful for sequential 'fast forward' */ +int vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op){ + return _vorbis_synthesis1(vb,op,0); +} + +long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op){ + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + oggpack_buffer opb; + int mode; + + oggpack_readinit(&opb,op->packet,op->bytes); + + /* Check the packet type */ + if(oggpack_read(&opb,1)!=0){ + /* Oops. This is not an audio data packet */ + return(OV_ENOTAUDIO); + } + + { + int modebits=0; + int v=ci->modes; + while(v>1){ + modebits++; + v>>=1; + } + + /* read our mode and pre/post windowsize */ + mode=oggpack_read(&opb,modebits); + } + if(mode==-1 || !ci->mode_param[mode])return(OV_EBADPACKET); + return(ci->blocksizes[ci->mode_param[mode]->blockflag]); +} + + diff --git a/media/libtremor/lib/tremor_window.c b/media/libtremor/lib/tremor_window.c new file mode 100644 index 000000000000..006a1ee6b51a --- /dev/null +++ b/media/libtremor/lib/tremor_window.c @@ -0,0 +1,83 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: window functions + + ********************************************************************/ + +#include +#include +#include "misc.h" +#include "window.h" +#include "window_lookup.h" + +const void *_vorbis_window(int type, int left){ + + switch(type){ + case 0: + + switch(left){ + case 32: + return vwin64; + case 64: + return vwin128; + case 128: + return vwin256; + case 256: + return vwin512; + case 512: + return vwin1024; + case 1024: + return vwin2048; + case 2048: + return vwin4096; + case 4096: + return vwin8192; + default: + return(0); + } + break; + default: + return(0); + } +} + +void _vorbis_apply_window(ogg_int32_t *d,const void *window_p[2], + long *blocksizes, + int lW,int W,int nW){ + + LOOKUP_T *window[2]={window_p[0],window_p[1]}; + long n=blocksizes[W]; + long ln=blocksizes[lW]; + long rn=blocksizes[nW]; + + long leftbegin=n/4-ln/4; + long leftend=leftbegin+ln/2; + + long rightbegin=n/2+n/4-rn/4; + long rightend=rightbegin+rn/2; + + int i,p; + + for(i=0;i + +static const LOOKUP_T vwin64[32] = { + X(0x001f0003), X(0x01168c98), X(0x030333c8), X(0x05dfe3a4), + X(0x09a49562), X(0x0e45df18), X(0x13b47ef2), X(0x19dcf676), + X(0x20a74d83), X(0x27f7137c), X(0x2fabb05a), X(0x37a1105a), + X(0x3fb0ab28), X(0x47b2dcd1), X(0x4f807bc6), X(0x56f48e70), + X(0x5dedfc79), X(0x64511653), X(0x6a08cfff), X(0x6f079328), + X(0x734796f4), X(0x76cab7f2), X(0x7999d6e8), X(0x7bc3cf9f), + X(0x7d5c20c1), X(0x7e7961df), X(0x7f33a567), X(0x7fa2e1d0), + X(0x7fdd78a5), X(0x7ff6ec6d), X(0x7ffed0e9), X(0x7ffffc3f), +}; + +static const LOOKUP_T vwin128[64] = { + X(0x0007c04d), X(0x0045bb89), X(0x00c18b87), X(0x017ae294), + X(0x02714a4e), X(0x03a4217a), X(0x05129952), X(0x06bbb24f), + X(0x089e38a1), X(0x0ab8c073), X(0x0d09a228), X(0x0f8ef6bd), + X(0x12469488), X(0x152e0c7a), X(0x1842a81c), X(0x1b81686d), + X(0x1ee705d9), X(0x226ff15d), X(0x26185705), X(0x29dc21cc), + X(0x2db700fe), X(0x31a46f08), X(0x359fb9c1), X(0x39a40c0c), + X(0x3dac78b6), X(0x41b40674), X(0x45b5bcb0), X(0x49acb109), + X(0x4d94152b), X(0x516744bd), X(0x5521d320), X(0x58bf98a5), + X(0x5c3cbef4), X(0x5f95cc5d), X(0x62c7add7), X(0x65cfbf64), + X(0x68abd2ba), X(0x6b5a3405), X(0x6dd9acab), X(0x7029840d), + X(0x72497e38), X(0x7439d8ac), X(0x75fb4532), X(0x778ee30a), + X(0x78f6367e), X(0x7a331f1a), X(0x7b47cccd), X(0x7c36b416), + X(0x7d028192), X(0x7dae0d18), X(0x7e3c4caa), X(0x7eb04763), + X(0x7f0d08a7), X(0x7f5593b7), X(0x7f8cd7d5), X(0x7fb5a513), + X(0x7fd2a1fc), X(0x7fe64212), X(0x7ff2bd4c), X(0x7ffa0890), + X(0x7ffdcf39), X(0x7fff6dac), X(0x7fffed01), X(0x7fffffc4), +}; + +static const LOOKUP_T vwin256[128] = { + X(0x0001f018), X(0x00117066), X(0x00306e9e), X(0x005ee5f1), + X(0x009ccf26), X(0x00ea208b), X(0x0146cdea), X(0x01b2c87f), + X(0x022dfedf), X(0x02b85ced), X(0x0351cbbd), X(0x03fa317f), + X(0x04b17167), X(0x05776b90), X(0x064bfcdc), X(0x072efedd), + X(0x082047b4), X(0x091fa9f1), X(0x0a2cf477), X(0x0b47f25d), + X(0x0c706ad2), X(0x0da620ff), X(0x0ee8d3ef), X(0x10383e75), + X(0x11941716), X(0x12fc0ff6), X(0x146fd6c8), X(0x15ef14c2), + X(0x17796e8e), X(0x190e844f), X(0x1aadf196), X(0x1c574d6e), + X(0x1e0a2a62), X(0x1fc61688), X(0x218a9b9c), X(0x23573f12), + X(0x252b823d), X(0x2706e269), X(0x28e8d913), X(0x2ad0dc0e), + X(0x2cbe5dc1), X(0x2eb0cd60), X(0x30a79733), X(0x32a224d5), + X(0x349fdd8b), X(0x36a02690), X(0x38a2636f), X(0x3aa5f65e), + X(0x3caa409e), X(0x3eaea2df), X(0x40b27da6), X(0x42b531b8), + X(0x44b62086), X(0x46b4ac99), X(0x48b03a05), X(0x4aa82ed5), + X(0x4c9bf37d), X(0x4e8af349), X(0x50749ccb), X(0x52586246), + X(0x5435ba1c), X(0x560c1f31), X(0x57db1152), X(0x59a21591), + X(0x5b60b6a3), X(0x5d168535), X(0x5ec31839), X(0x60660d36), + X(0x61ff0886), X(0x638db595), X(0x6511c717), X(0x668af734), + X(0x67f907b0), X(0x695bc207), X(0x6ab2f787), X(0x6bfe815a), + X(0x6d3e4090), X(0x6e721e16), X(0x6f9a0ab5), X(0x70b5fef8), + X(0x71c5fb16), X(0x72ca06cd), X(0x73c2313d), X(0x74ae90b2), + X(0x758f4275), X(0x76646a85), X(0x772e335c), X(0x77eccda0), + X(0x78a06fd7), X(0x79495613), X(0x79e7c19c), X(0x7a7bf894), + X(0x7b064596), X(0x7b86f757), X(0x7bfe6044), X(0x7c6cd615), + X(0x7cd2b16e), X(0x7d304d71), X(0x7d860756), X(0x7dd43e06), + X(0x7e1b51ad), X(0x7e5ba355), X(0x7e95947e), X(0x7ec986bb), + X(0x7ef7db4a), X(0x7f20f2b9), X(0x7f452c7f), X(0x7f64e6a7), + X(0x7f807d71), X(0x7f984aff), X(0x7faca700), X(0x7fbde662), + X(0x7fcc5b04), X(0x7fd85372), X(0x7fe21a99), X(0x7fe9f791), + X(0x7ff02d58), X(0x7ff4fa9e), X(0x7ff89990), X(0x7ffb3faa), + X(0x7ffd1d8b), X(0x7ffe5ecc), X(0x7fff29e0), X(0x7fff9ff3), + X(0x7fffdcd2), X(0x7ffff6d6), X(0x7ffffed0), X(0x7ffffffc), +}; + +static const LOOKUP_T vwin512[256] = { + X(0x00007c06), X(0x00045c32), X(0x000c1c62), X(0x0017bc4c), + X(0x00273b7a), X(0x003a9955), X(0x0051d51c), X(0x006cede7), + X(0x008be2a9), X(0x00aeb22a), X(0x00d55b0d), X(0x00ffdbcc), + X(0x012e32b6), X(0x01605df5), X(0x01965b85), X(0x01d02939), + X(0x020dc4ba), X(0x024f2b83), X(0x02945ae6), X(0x02dd5004), + X(0x032a07d3), X(0x037a7f19), X(0x03ceb26e), X(0x04269e37), + X(0x04823eab), X(0x04e18fcc), X(0x05448d6d), X(0x05ab3329), + X(0x06157c68), X(0x0683645e), X(0x06f4e607), X(0x0769fc25), + X(0x07e2a146), X(0x085ecfbc), X(0x08de819f), X(0x0961b0cc), + X(0x09e856e3), X(0x0a726d46), X(0x0affed1d), X(0x0b90cf4c), + X(0x0c250c79), X(0x0cbc9d0b), X(0x0d577926), X(0x0df598aa), + X(0x0e96f337), X(0x0f3b8026), X(0x0fe3368f), X(0x108e0d42), + X(0x113bfaca), X(0x11ecf56b), X(0x12a0f324), X(0x1357e9ac), + X(0x1411ce70), X(0x14ce9698), X(0x158e3702), X(0x1650a444), + X(0x1715d2aa), X(0x17ddb638), X(0x18a842aa), X(0x19756b72), + X(0x1a4523b9), X(0x1b175e62), X(0x1bec0e04), X(0x1cc324f0), + X(0x1d9c9532), X(0x1e78508a), X(0x1f564876), X(0x20366e2e), + X(0x2118b2a2), X(0x21fd0681), X(0x22e35a37), X(0x23cb9dee), + X(0x24b5c18e), X(0x25a1b4c0), X(0x268f66f1), X(0x277ec74e), + X(0x286fc4cc), X(0x29624e23), X(0x2a5651d7), X(0x2b4bbe34), + X(0x2c428150), X(0x2d3a8913), X(0x2e33c332), X(0x2f2e1d35), + X(0x30298478), X(0x3125e62d), X(0x32232f61), X(0x33214cfc), + X(0x34202bc2), X(0x351fb85a), X(0x361fdf4f), X(0x37208d10), + X(0x3821adf7), X(0x39232e49), X(0x3a24fa3c), X(0x3b26fdf6), + X(0x3c292593), X(0x3d2b5d29), X(0x3e2d90c8), X(0x3f2fac7f), + X(0x40319c5f), X(0x41334c81), X(0x4234a905), X(0x43359e16), + X(0x443617f3), X(0x453602eb), X(0x46354b65), X(0x4733dde1), + X(0x4831a6ff), X(0x492e937f), X(0x4a2a9045), X(0x4b258a5f), + X(0x4c1f6f06), X(0x4d182ba2), X(0x4e0fadce), X(0x4f05e35b), + X(0x4ffaba53), X(0x50ee20fd), X(0x51e005e1), X(0x52d057ca), + X(0x53bf05ca), X(0x54abff3b), X(0x559733c7), X(0x56809365), + X(0x57680e62), X(0x584d955d), X(0x59311952), X(0x5a128b96), + X(0x5af1dddd), X(0x5bcf023a), X(0x5ca9eb27), X(0x5d828b81), + X(0x5e58d68d), X(0x5f2cbffc), X(0x5ffe3be9), X(0x60cd3edf), + X(0x6199bdda), X(0x6263ae45), X(0x632b0602), X(0x63efbb66), + X(0x64b1c53f), X(0x65711ad0), X(0x662db3d7), X(0x66e7888d), + X(0x679e91a5), X(0x6852c84e), X(0x69042635), X(0x69b2a582), + X(0x6a5e40dd), X(0x6b06f36c), X(0x6bacb8d2), X(0x6c4f8d30), + X(0x6cef6d26), X(0x6d8c55d4), X(0x6e2644d4), X(0x6ebd3840), + X(0x6f512ead), X(0x6fe2272e), X(0x7070214f), X(0x70fb1d17), + X(0x71831b06), X(0x72081c16), X(0x728a21b5), X(0x73092dc8), + X(0x738542a6), X(0x73fe631b), X(0x74749261), X(0x74e7d421), + X(0x75582c72), X(0x75c59fd5), X(0x76303333), X(0x7697ebdd), + X(0x76fccf85), X(0x775ee443), X(0x77be308a), X(0x781abb2e), + X(0x78748b59), X(0x78cba88e), X(0x79201aa7), X(0x7971e9cd), + X(0x79c11e79), X(0x7a0dc170), X(0x7a57dbc2), X(0x7a9f76c1), + X(0x7ae49c07), X(0x7b27556b), X(0x7b67ad02), X(0x7ba5ad1b), + X(0x7be1603a), X(0x7c1ad118), X(0x7c520a9e), X(0x7c8717e1), + X(0x7cba0421), X(0x7ceadac3), X(0x7d19a74f), X(0x7d46756e), + X(0x7d7150e5), X(0x7d9a4592), X(0x7dc15f69), X(0x7de6aa71), + X(0x7e0a32c0), X(0x7e2c0479), X(0x7e4c2bc7), X(0x7e6ab4db), + X(0x7e87abe9), X(0x7ea31d24), X(0x7ebd14be), X(0x7ed59edd), + X(0x7eecc7a3), X(0x7f029b21), X(0x7f17255a), X(0x7f2a723f), + X(0x7f3c8daa), X(0x7f4d835d), X(0x7f5d5f00), X(0x7f6c2c1b), + X(0x7f79f617), X(0x7f86c83a), X(0x7f92ada2), X(0x7f9db146), + X(0x7fa7ddf3), X(0x7fb13e46), X(0x7fb9dcb0), X(0x7fc1c36c), + X(0x7fc8fc83), X(0x7fcf91c7), X(0x7fd58cd2), X(0x7fdaf702), + X(0x7fdfd979), X(0x7fe43d1c), X(0x7fe82a8b), X(0x7febaa29), + X(0x7feec412), X(0x7ff1801c), X(0x7ff3e5d6), X(0x7ff5fc86), + X(0x7ff7cb29), X(0x7ff9586f), X(0x7ffaaaba), X(0x7ffbc81e), + X(0x7ffcb660), X(0x7ffd7af3), X(0x7ffe1afa), X(0x7ffe9b42), + X(0x7fff0047), X(0x7fff4e2f), X(0x7fff88c9), X(0x7fffb390), + X(0x7fffd1a6), X(0x7fffe5d7), X(0x7ffff296), X(0x7ffff9fd), + X(0x7ffffdcd), X(0x7fffff6d), X(0x7fffffed), X(0x7fffffff), +}; + +static const LOOKUP_T vwin1024[512] = { + X(0x00001f02), X(0x0001170e), X(0x00030724), X(0x0005ef40), + X(0x0009cf59), X(0x000ea767), X(0x0014775e), X(0x001b3f2e), + X(0x0022fec8), X(0x002bb618), X(0x00356508), X(0x00400b81), + X(0x004ba968), X(0x00583ea0), X(0x0065cb0a), X(0x00744e84), + X(0x0083c8ea), X(0x00943a14), X(0x00a5a1da), X(0x00b80010), + X(0x00cb5488), X(0x00df9f10), X(0x00f4df76), X(0x010b1584), + X(0x01224101), X(0x013a61b2), X(0x01537759), X(0x016d81b6), + X(0x01888087), X(0x01a47385), X(0x01c15a69), X(0x01df34e6), + X(0x01fe02b1), X(0x021dc377), X(0x023e76e7), X(0x02601ca9), + X(0x0282b466), X(0x02a63dc1), X(0x02cab85d), X(0x02f023d6), + X(0x03167fcb), X(0x033dcbd3), X(0x03660783), X(0x038f3270), + X(0x03b94c29), X(0x03e4543a), X(0x04104a2e), X(0x043d2d8b), + X(0x046afdd5), X(0x0499ba8c), X(0x04c9632d), X(0x04f9f734), + X(0x052b7615), X(0x055ddf46), X(0x05913237), X(0x05c56e53), + X(0x05fa9306), X(0x06309fb6), X(0x066793c5), X(0x069f6e93), + X(0x06d82f7c), X(0x0711d5d9), X(0x074c60fe), X(0x0787d03d), + X(0x07c422e4), X(0x0801583e), X(0x083f6f91), X(0x087e681f), + X(0x08be4129), X(0x08fef9ea), X(0x0940919a), X(0x0983076d), + X(0x09c65a92), X(0x0a0a8a38), X(0x0a4f9585), X(0x0a957b9f), + X(0x0adc3ba7), X(0x0b23d4b9), X(0x0b6c45ee), X(0x0bb58e5a), + X(0x0bffad0f), X(0x0c4aa11a), X(0x0c966982), X(0x0ce3054d), + X(0x0d30737b), X(0x0d7eb308), X(0x0dcdc2eb), X(0x0e1da21a), + X(0x0e6e4f83), X(0x0ebfca11), X(0x0f1210ad), X(0x0f652238), + X(0x0fb8fd91), X(0x100da192), X(0x10630d11), X(0x10b93ee0), + X(0x111035cb), X(0x1167f09a), X(0x11c06e13), X(0x1219acf5), + X(0x1273abfb), X(0x12ce69db), X(0x1329e54a), X(0x13861cf3), + X(0x13e30f80), X(0x1440bb97), X(0x149f1fd8), X(0x14fe3ade), + X(0x155e0b40), X(0x15be8f92), X(0x161fc662), X(0x1681ae38), + X(0x16e4459b), X(0x17478b0b), X(0x17ab7d03), X(0x181019fb), + X(0x18756067), X(0x18db4eb3), X(0x1941e34a), X(0x19a91c92), + X(0x1a10f8ea), X(0x1a7976af), X(0x1ae29439), X(0x1b4c4fda), + X(0x1bb6a7e2), X(0x1c219a9a), X(0x1c8d2649), X(0x1cf9492e), + X(0x1d660188), X(0x1dd34d8e), X(0x1e412b74), X(0x1eaf996a), + X(0x1f1e959b), X(0x1f8e1e2f), X(0x1ffe3146), X(0x206ecd01), + X(0x20dfef78), X(0x215196c2), X(0x21c3c0f0), X(0x22366c10), + X(0x22a9962a), X(0x231d3d45), X(0x23915f60), X(0x2405fa7a), + X(0x247b0c8c), X(0x24f09389), X(0x25668d65), X(0x25dcf80c), + X(0x2653d167), X(0x26cb175e), X(0x2742c7d0), X(0x27bae09e), + X(0x28335fa2), X(0x28ac42b3), X(0x292587a5), X(0x299f2c48), + X(0x2a192e69), X(0x2a938bd1), X(0x2b0e4247), X(0x2b894f8d), + X(0x2c04b164), X(0x2c806588), X(0x2cfc69b2), X(0x2d78bb9a), + X(0x2df558f4), X(0x2e723f6f), X(0x2eef6cbb), X(0x2f6cde83), + X(0x2fea9270), X(0x30688627), X(0x30e6b74e), X(0x31652385), + X(0x31e3c86b), X(0x3262a39e), X(0x32e1b2b8), X(0x3360f352), + X(0x33e06303), X(0x345fff5e), X(0x34dfc5f8), X(0x355fb462), + X(0x35dfc82a), X(0x365ffee0), X(0x36e0560f), X(0x3760cb43), + X(0x37e15c05), X(0x386205df), X(0x38e2c657), X(0x39639af5), + X(0x39e4813e), X(0x3a6576b6), X(0x3ae678e3), X(0x3b678547), + X(0x3be89965), X(0x3c69b2c1), X(0x3ceacedc), X(0x3d6beb37), + X(0x3ded0557), X(0x3e6e1abb), X(0x3eef28e6), X(0x3f702d5a), + X(0x3ff1259a), X(0x40720f29), X(0x40f2e789), X(0x4173ac3f), + X(0x41f45ad0), X(0x4274f0c2), X(0x42f56b9a), X(0x4375c8e0), + X(0x43f6061d), X(0x447620db), X(0x44f616a5), X(0x4575e509), + X(0x45f58994), X(0x467501d6), X(0x46f44b62), X(0x477363cb), + X(0x47f248a6), X(0x4870f78e), X(0x48ef6e1a), X(0x496da9e8), + X(0x49eba897), X(0x4a6967c8), X(0x4ae6e521), X(0x4b641e47), + X(0x4be110e5), X(0x4c5dbaa7), X(0x4cda193f), X(0x4d562a5f), + X(0x4dd1ebbd), X(0x4e4d5b15), X(0x4ec87623), X(0x4f433aa9), + X(0x4fbda66c), X(0x5037b734), X(0x50b16acf), X(0x512abf0e), + X(0x51a3b1c5), X(0x521c40ce), X(0x52946a06), X(0x530c2b50), + X(0x53838292), X(0x53fa6db8), X(0x5470eab3), X(0x54e6f776), + X(0x555c91fc), X(0x55d1b844), X(0x56466851), X(0x56baa02f), + X(0x572e5deb), X(0x57a19f98), X(0x58146352), X(0x5886a737), + X(0x58f8696d), X(0x5969a81c), X(0x59da6177), X(0x5a4a93b4), + X(0x5aba3d0f), X(0x5b295bcb), X(0x5b97ee30), X(0x5c05f28d), + X(0x5c736738), X(0x5ce04a8d), X(0x5d4c9aed), X(0x5db856c1), + X(0x5e237c78), X(0x5e8e0a89), X(0x5ef7ff6f), X(0x5f6159b0), + X(0x5fca17d4), X(0x6032386e), X(0x6099ba15), X(0x61009b69), + X(0x6166db11), X(0x61cc77b9), X(0x62317017), X(0x6295c2e7), + X(0x62f96eec), X(0x635c72f1), X(0x63becdc8), X(0x64207e4b), + X(0x6481835a), X(0x64e1dbde), X(0x654186c8), X(0x65a0830e), + X(0x65fecfb1), X(0x665c6bb7), X(0x66b95630), X(0x67158e30), + X(0x677112d7), X(0x67cbe34b), X(0x6825feb9), X(0x687f6456), + X(0x68d81361), X(0x69300b1e), X(0x69874ada), X(0x69ddd1ea), + X(0x6a339fab), X(0x6a88b382), X(0x6add0cdb), X(0x6b30ab2a), + X(0x6b838dec), X(0x6bd5b4a6), X(0x6c271ee2), X(0x6c77cc36), + X(0x6cc7bc3d), X(0x6d16ee9b), X(0x6d6562fb), X(0x6db31911), + X(0x6e001099), X(0x6e4c4955), X(0x6e97c311), X(0x6ee27d9f), + X(0x6f2c78d9), X(0x6f75b4a2), X(0x6fbe30e4), X(0x7005ed91), + X(0x704ceaa1), X(0x70932816), X(0x70d8a5f8), X(0x711d6457), + X(0x7161634b), X(0x71a4a2f3), X(0x71e72375), X(0x7228e500), + X(0x7269e7c8), X(0x72aa2c0a), X(0x72e9b209), X(0x73287a12), + X(0x73668476), X(0x73a3d18f), X(0x73e061bc), X(0x741c3566), + X(0x74574cfa), X(0x7491a8ee), X(0x74cb49be), X(0x75042fec), + X(0x753c5c03), X(0x7573ce92), X(0x75aa882f), X(0x75e08979), + X(0x7615d313), X(0x764a65a7), X(0x767e41e5), X(0x76b16884), + X(0x76e3da40), X(0x771597dc), X(0x7746a221), X(0x7776f9dd), + X(0x77a69fe6), X(0x77d59514), X(0x7803da49), X(0x7831706a), + X(0x785e5861), X(0x788a9320), X(0x78b6219c), X(0x78e104cf), + X(0x790b3dbb), X(0x7934cd64), X(0x795db4d5), X(0x7985f51d), + X(0x79ad8f50), X(0x79d48486), X(0x79fad5de), X(0x7a208478), + X(0x7a45917b), X(0x7a69fe12), X(0x7a8dcb6c), X(0x7ab0fabb), + X(0x7ad38d36), X(0x7af5841a), X(0x7b16e0a3), X(0x7b37a416), + X(0x7b57cfb8), X(0x7b7764d4), X(0x7b9664b6), X(0x7bb4d0b0), + X(0x7bd2aa14), X(0x7beff23b), X(0x7c0caa7f), X(0x7c28d43c), + X(0x7c4470d2), X(0x7c5f81a5), X(0x7c7a081a), X(0x7c940598), + X(0x7cad7b8b), X(0x7cc66b5e), X(0x7cded680), X(0x7cf6be64), + X(0x7d0e247b), X(0x7d250a3c), X(0x7d3b711c), X(0x7d515a95), + X(0x7d66c822), X(0x7d7bbb3c), X(0x7d903563), X(0x7da43814), + X(0x7db7c4d0), X(0x7dcadd16), X(0x7ddd826a), X(0x7defb64d), + X(0x7e017a44), X(0x7e12cfd3), X(0x7e23b87f), X(0x7e3435cc), + X(0x7e444943), X(0x7e53f467), X(0x7e6338c0), X(0x7e7217d5), + X(0x7e80932b), X(0x7e8eac49), X(0x7e9c64b7), X(0x7ea9bdf8), + X(0x7eb6b994), X(0x7ec35910), X(0x7ecf9def), X(0x7edb89b6), + X(0x7ee71de9), X(0x7ef25c09), X(0x7efd4598), X(0x7f07dc16), + X(0x7f122103), X(0x7f1c15dc), X(0x7f25bc1f), X(0x7f2f1547), + X(0x7f3822cd), X(0x7f40e62b), X(0x7f4960d6), X(0x7f519443), + X(0x7f5981e7), X(0x7f612b31), X(0x7f689191), X(0x7f6fb674), + X(0x7f769b45), X(0x7f7d416c), X(0x7f83aa51), X(0x7f89d757), + X(0x7f8fc9df), X(0x7f958348), X(0x7f9b04ef), X(0x7fa0502e), + X(0x7fa56659), X(0x7faa48c7), X(0x7faef8c7), X(0x7fb377a7), + X(0x7fb7c6b3), X(0x7fbbe732), X(0x7fbfda67), X(0x7fc3a196), + X(0x7fc73dfa), X(0x7fcab0ce), X(0x7fcdfb4a), X(0x7fd11ea0), + X(0x7fd41c00), X(0x7fd6f496), X(0x7fd9a989), X(0x7fdc3bff), + X(0x7fdead17), X(0x7fe0fdee), X(0x7fe32f9d), X(0x7fe54337), + X(0x7fe739ce), X(0x7fe9146c), X(0x7fead41b), X(0x7fec79dd), + X(0x7fee06b2), X(0x7fef7b94), X(0x7ff0d97b), X(0x7ff22158), + X(0x7ff35417), X(0x7ff472a3), X(0x7ff57de0), X(0x7ff676ac), + X(0x7ff75de3), X(0x7ff8345a), X(0x7ff8fae4), X(0x7ff9b24b), + X(0x7ffa5b58), X(0x7ffaf6cd), X(0x7ffb8568), X(0x7ffc07e2), + X(0x7ffc7eed), X(0x7ffceb38), X(0x7ffd4d6d), X(0x7ffda631), + X(0x7ffdf621), X(0x7ffe3dd8), X(0x7ffe7dea), X(0x7ffeb6e7), + X(0x7ffee959), X(0x7fff15c4), X(0x7fff3ca9), X(0x7fff5e80), + X(0x7fff7bc0), X(0x7fff94d6), X(0x7fffaa2d), X(0x7fffbc29), + X(0x7fffcb29), X(0x7fffd786), X(0x7fffe195), X(0x7fffe9a3), + X(0x7fffeffa), X(0x7ffff4dd), X(0x7ffff889), X(0x7ffffb37), + X(0x7ffffd1a), X(0x7ffffe5d), X(0x7fffff29), X(0x7fffffa0), + X(0x7fffffdd), X(0x7ffffff7), X(0x7fffffff), X(0x7fffffff), +}; + +static const LOOKUP_T vwin2048[1024] = { + X(0x000007c0), X(0x000045c4), X(0x0000c1ca), X(0x00017bd3), + X(0x000273de), X(0x0003a9eb), X(0x00051df9), X(0x0006d007), + X(0x0008c014), X(0x000aee1e), X(0x000d5a25), X(0x00100428), + X(0x0012ec23), X(0x00161216), X(0x001975fe), X(0x001d17da), + X(0x0020f7a8), X(0x00251564), X(0x0029710c), X(0x002e0a9e), + X(0x0032e217), X(0x0037f773), X(0x003d4ab0), X(0x0042dbca), + X(0x0048aabe), X(0x004eb788), X(0x00550224), X(0x005b8a8f), + X(0x006250c5), X(0x006954c1), X(0x0070967e), X(0x007815f9), + X(0x007fd32c), X(0x0087ce13), X(0x009006a9), X(0x00987ce9), + X(0x00a130cc), X(0x00aa224f), X(0x00b3516b), X(0x00bcbe1a), + X(0x00c66856), X(0x00d0501a), X(0x00da755f), X(0x00e4d81f), + X(0x00ef7853), X(0x00fa55f4), X(0x010570fc), X(0x0110c963), + X(0x011c5f22), X(0x01283232), X(0x0134428c), X(0x01409027), + X(0x014d1afb), X(0x0159e302), X(0x0166e831), X(0x01742a82), + X(0x0181a9ec), X(0x018f6665), X(0x019d5fe5), X(0x01ab9663), + X(0x01ba09d6), X(0x01c8ba34), X(0x01d7a775), X(0x01e6d18d), + X(0x01f63873), X(0x0205dc1e), X(0x0215bc82), X(0x0225d997), + X(0x02363350), X(0x0246c9a3), X(0x02579c86), X(0x0268abed), + X(0x0279f7cc), X(0x028b801a), X(0x029d44c9), X(0x02af45ce), + X(0x02c1831d), X(0x02d3fcaa), X(0x02e6b269), X(0x02f9a44c), + X(0x030cd248), X(0x03203c4f), X(0x0333e255), X(0x0347c44b), + X(0x035be225), X(0x03703bd5), X(0x0384d14d), X(0x0399a280), + X(0x03aeaf5e), X(0x03c3f7d9), X(0x03d97be4), X(0x03ef3b6e), + X(0x0405366a), X(0x041b6cc8), X(0x0431de78), X(0x04488b6c), + X(0x045f7393), X(0x047696dd), X(0x048df53b), X(0x04a58e9b), + X(0x04bd62ee), X(0x04d57223), X(0x04edbc28), X(0x050640ed), + X(0x051f0060), X(0x0537fa70), X(0x05512f0a), X(0x056a9e1e), + X(0x05844798), X(0x059e2b67), X(0x05b84978), X(0x05d2a1b8), + X(0x05ed3414), X(0x06080079), X(0x062306d3), X(0x063e470f), + X(0x0659c119), X(0x067574dd), X(0x06916247), X(0x06ad8941), + X(0x06c9e9b8), X(0x06e68397), X(0x070356c8), X(0x07206336), + X(0x073da8cb), X(0x075b2772), X(0x0778df15), X(0x0796cf9c), + X(0x07b4f8f3), X(0x07d35b01), X(0x07f1f5b1), X(0x0810c8eb), + X(0x082fd497), X(0x084f189e), X(0x086e94e9), X(0x088e495e), + X(0x08ae35e6), X(0x08ce5a68), X(0x08eeb6cc), X(0x090f4af8), + X(0x093016d3), X(0x09511a44), X(0x09725530), X(0x0993c77f), + X(0x09b57115), X(0x09d751d8), X(0x09f969ae), X(0x0a1bb87c), + X(0x0a3e3e26), X(0x0a60fa91), X(0x0a83eda2), X(0x0aa7173c), + X(0x0aca7743), X(0x0aee0d9b), X(0x0b11da28), X(0x0b35dccc), + X(0x0b5a156a), X(0x0b7e83e5), X(0x0ba3281f), X(0x0bc801fa), + X(0x0bed1159), X(0x0c12561c), X(0x0c37d025), X(0x0c5d7f55), + X(0x0c83638d), X(0x0ca97cae), X(0x0ccfca97), X(0x0cf64d2a), + X(0x0d1d0444), X(0x0d43efc7), X(0x0d6b0f92), X(0x0d926383), + X(0x0db9eb79), X(0x0de1a752), X(0x0e0996ee), X(0x0e31ba29), + X(0x0e5a10e2), X(0x0e829af6), X(0x0eab5841), X(0x0ed448a2), + X(0x0efd6bf4), X(0x0f26c214), X(0x0f504ade), X(0x0f7a062e), + X(0x0fa3f3df), X(0x0fce13cd), X(0x0ff865d2), X(0x1022e9ca), + X(0x104d9f8e), X(0x107886f9), X(0x10a39fe5), X(0x10ceea2c), + X(0x10fa65a6), X(0x1126122d), X(0x1151ef9a), X(0x117dfdc5), + X(0x11aa3c87), X(0x11d6abb6), X(0x12034b2c), X(0x12301ac0), + X(0x125d1a48), X(0x128a499b), X(0x12b7a891), X(0x12e536ff), + X(0x1312f4bb), X(0x1340e19c), X(0x136efd75), X(0x139d481e), + X(0x13cbc16a), X(0x13fa692f), X(0x14293f40), X(0x14584371), + X(0x14877597), X(0x14b6d585), X(0x14e6630d), X(0x15161e04), + X(0x1546063b), X(0x15761b85), X(0x15a65db3), X(0x15d6cc99), + X(0x16076806), X(0x16382fcd), X(0x166923bf), X(0x169a43ab), + X(0x16cb8f62), X(0x16fd06b5), X(0x172ea973), X(0x1760776b), + X(0x1792706e), X(0x17c49449), X(0x17f6e2cb), X(0x18295bc3), + X(0x185bfeff), X(0x188ecc4c), X(0x18c1c379), X(0x18f4e452), + X(0x19282ea4), X(0x195ba23c), X(0x198f3ee6), X(0x19c3046e), + X(0x19f6f2a1), X(0x1a2b094a), X(0x1a5f4833), X(0x1a93af28), + X(0x1ac83df3), X(0x1afcf460), X(0x1b31d237), X(0x1b66d744), + X(0x1b9c034e), X(0x1bd15621), X(0x1c06cf84), X(0x1c3c6f40), + X(0x1c72351e), X(0x1ca820e6), X(0x1cde3260), X(0x1d146953), + X(0x1d4ac587), X(0x1d8146c3), X(0x1db7eccd), X(0x1deeb76c), + X(0x1e25a667), X(0x1e5cb982), X(0x1e93f085), X(0x1ecb4b33), + X(0x1f02c953), X(0x1f3a6aaa), X(0x1f722efb), X(0x1faa160b), + X(0x1fe21f9e), X(0x201a4b79), X(0x2052995d), X(0x208b0910), + X(0x20c39a53), X(0x20fc4cea), X(0x21352097), X(0x216e151c), + X(0x21a72a3a), X(0x21e05fb5), X(0x2219b54d), X(0x22532ac3), + X(0x228cbfd8), X(0x22c6744d), X(0x230047e2), X(0x233a3a58), + X(0x23744b6d), X(0x23ae7ae3), X(0x23e8c878), X(0x242333ec), + X(0x245dbcfd), X(0x24986369), X(0x24d326f1), X(0x250e0750), + X(0x25490446), X(0x25841d90), X(0x25bf52ec), X(0x25faa417), + X(0x263610cd), X(0x267198cc), X(0x26ad3bcf), X(0x26e8f994), + X(0x2724d1d6), X(0x2760c451), X(0x279cd0c0), X(0x27d8f6e0), + X(0x2815366a), X(0x28518f1b), X(0x288e00ac), X(0x28ca8ad8), + X(0x29072d5a), X(0x2943e7eb), X(0x2980ba45), X(0x29bda422), + X(0x29faa53c), X(0x2a37bd4a), X(0x2a74ec07), X(0x2ab2312b), + X(0x2aef8c6f), X(0x2b2cfd8b), X(0x2b6a8437), X(0x2ba8202c), + X(0x2be5d120), X(0x2c2396cc), X(0x2c6170e7), X(0x2c9f5f29), + X(0x2cdd6147), X(0x2d1b76fa), X(0x2d599ff7), X(0x2d97dbf5), + X(0x2dd62aab), X(0x2e148bcf), X(0x2e52ff16), X(0x2e918436), + X(0x2ed01ae5), X(0x2f0ec2d9), X(0x2f4d7bc6), X(0x2f8c4562), + X(0x2fcb1f62), X(0x300a097a), X(0x3049035f), X(0x30880cc6), + X(0x30c72563), X(0x31064cea), X(0x3145830f), X(0x3184c786), + X(0x31c41a03), X(0x32037a39), X(0x3242e7dc), X(0x3282629f), + X(0x32c1ea36), X(0x33017e53), X(0x33411ea9), X(0x3380caec), + X(0x33c082ce), X(0x34004602), X(0x34401439), X(0x347fed27), + X(0x34bfd07e), X(0x34ffbdf0), X(0x353fb52e), X(0x357fb5ec), + X(0x35bfbfda), X(0x35ffd2aa), X(0x363fee0f), X(0x368011b9), + X(0x36c03d5a), X(0x370070a4), X(0x3740ab48), X(0x3780ecf7), + X(0x37c13562), X(0x3801843a), X(0x3841d931), X(0x388233f7), + X(0x38c2943d), X(0x3902f9b4), X(0x3943640d), X(0x3983d2f8), + X(0x39c44626), X(0x3a04bd48), X(0x3a45380e), X(0x3a85b62a), + X(0x3ac6374a), X(0x3b06bb20), X(0x3b47415c), X(0x3b87c9ae), + X(0x3bc853c7), X(0x3c08df57), X(0x3c496c0f), X(0x3c89f99f), + X(0x3cca87b6), X(0x3d0b1605), X(0x3d4ba43d), X(0x3d8c320e), + X(0x3dccbf27), X(0x3e0d4b3a), X(0x3e4dd5f6), X(0x3e8e5f0c), + X(0x3ecee62b), X(0x3f0f6b05), X(0x3f4fed49), X(0x3f906ca8), + X(0x3fd0e8d2), X(0x40116177), X(0x4051d648), X(0x409246f6), + X(0x40d2b330), X(0x41131aa7), X(0x41537d0c), X(0x4193da10), + X(0x41d43162), X(0x421482b4), X(0x4254cdb7), X(0x4295121b), + X(0x42d54f91), X(0x431585ca), X(0x4355b477), X(0x4395db49), + X(0x43d5f9f1), X(0x44161021), X(0x44561d8a), X(0x449621dd), + X(0x44d61ccc), X(0x45160e08), X(0x4555f544), X(0x4595d230), + X(0x45d5a47f), X(0x46156be3), X(0x4655280e), X(0x4694d8b2), + X(0x46d47d82), X(0x4714162f), X(0x4753a26d), X(0x479321ef), + X(0x47d29466), X(0x4811f987), X(0x48515104), X(0x48909a91), + X(0x48cfd5e1), X(0x490f02a7), X(0x494e2098), X(0x498d2f66), + X(0x49cc2ec7), X(0x4a0b1e6f), X(0x4a49fe11), X(0x4a88cd62), + X(0x4ac78c18), X(0x4b0639e6), X(0x4b44d683), X(0x4b8361a2), + X(0x4bc1dafa), X(0x4c004241), X(0x4c3e972c), X(0x4c7cd970), + X(0x4cbb08c5), X(0x4cf924e1), X(0x4d372d7a), X(0x4d752247), + X(0x4db30300), X(0x4df0cf5a), X(0x4e2e870f), X(0x4e6c29d6), + X(0x4ea9b766), X(0x4ee72f78), X(0x4f2491c4), X(0x4f61de02), + X(0x4f9f13ec), X(0x4fdc333b), X(0x50193ba8), X(0x50562ced), + X(0x509306c3), X(0x50cfc8e5), X(0x510c730d), X(0x514904f6), + X(0x51857e5a), X(0x51c1def5), X(0x51fe2682), X(0x523a54bc), + X(0x52766961), X(0x52b2642c), X(0x52ee44d9), X(0x532a0b26), + X(0x5365b6d0), X(0x53a14793), X(0x53dcbd2f), X(0x54181760), + X(0x545355e5), X(0x548e787d), X(0x54c97ee6), X(0x550468e1), + X(0x553f362c), X(0x5579e687), X(0x55b479b3), X(0x55eeef70), + X(0x5629477f), X(0x566381a1), X(0x569d9d97), X(0x56d79b24), + X(0x57117a0a), X(0x574b3a0a), X(0x5784dae9), X(0x57be5c69), + X(0x57f7be4d), X(0x5831005a), X(0x586a2254), X(0x58a32400), + X(0x58dc0522), X(0x5914c57f), X(0x594d64de), X(0x5985e305), + X(0x59be3fba), X(0x59f67ac3), X(0x5a2e93e9), X(0x5a668af2), + X(0x5a9e5fa6), X(0x5ad611ce), X(0x5b0da133), X(0x5b450d9d), + X(0x5b7c56d7), X(0x5bb37ca9), X(0x5bea7ede), X(0x5c215d41), + X(0x5c58179d), X(0x5c8eadbe), X(0x5cc51f6f), X(0x5cfb6c7c), + X(0x5d3194b2), X(0x5d6797de), X(0x5d9d75cf), X(0x5dd32e51), + X(0x5e08c132), X(0x5e3e2e43), X(0x5e737551), X(0x5ea8962d), + X(0x5edd90a7), X(0x5f12648e), X(0x5f4711b4), X(0x5f7b97ea), + X(0x5faff702), X(0x5fe42ece), X(0x60183f20), X(0x604c27cc), + X(0x607fe8a6), X(0x60b38180), X(0x60e6f22f), X(0x611a3a89), + X(0x614d5a62), X(0x61805190), X(0x61b31fe9), X(0x61e5c545), + X(0x62184179), X(0x624a945d), X(0x627cbdca), X(0x62aebd98), + X(0x62e0939f), X(0x63123fba), X(0x6343c1c1), X(0x6375198f), + X(0x63a646ff), X(0x63d749ec), X(0x64082232), X(0x6438cfad), + X(0x64695238), X(0x6499a9b3), X(0x64c9d5f9), X(0x64f9d6ea), + X(0x6529ac63), X(0x65595643), X(0x6588d46a), X(0x65b826b8), + X(0x65e74d0e), X(0x6616474b), X(0x66451552), X(0x6673b704), + X(0x66a22c44), X(0x66d074f4), X(0x66fe90f8), X(0x672c8033), + X(0x675a428a), X(0x6787d7e1), X(0x67b5401f), X(0x67e27b27), + X(0x680f88e1), X(0x683c6934), X(0x68691c05), X(0x6895a13e), + X(0x68c1f8c7), X(0x68ee2287), X(0x691a1e68), X(0x6945ec54), + X(0x69718c35), X(0x699cfdf5), X(0x69c8417f), X(0x69f356c0), + X(0x6a1e3da3), X(0x6a48f615), X(0x6a738002), X(0x6a9ddb5a), + X(0x6ac80808), X(0x6af205fd), X(0x6b1bd526), X(0x6b457575), + X(0x6b6ee6d8), X(0x6b982940), X(0x6bc13c9f), X(0x6bea20e5), + X(0x6c12d605), X(0x6c3b5bf1), X(0x6c63b29c), X(0x6c8bd9fb), + X(0x6cb3d200), X(0x6cdb9aa0), X(0x6d0333d0), X(0x6d2a9d86), + X(0x6d51d7b7), X(0x6d78e25a), X(0x6d9fbd67), X(0x6dc668d3), + X(0x6dece498), X(0x6e1330ad), X(0x6e394d0c), X(0x6e5f39ae), + X(0x6e84f68d), X(0x6eaa83a2), X(0x6ecfe0ea), X(0x6ef50e5e), + X(0x6f1a0bfc), X(0x6f3ed9bf), X(0x6f6377a4), X(0x6f87e5a8), + X(0x6fac23c9), X(0x6fd03206), X(0x6ff4105c), X(0x7017becc), + X(0x703b3d54), X(0x705e8bf5), X(0x7081aaaf), X(0x70a49984), + X(0x70c75874), X(0x70e9e783), X(0x710c46b2), X(0x712e7605), + X(0x7150757f), X(0x71724523), X(0x7193e4f6), X(0x71b554fd), + X(0x71d6953e), X(0x71f7a5bd), X(0x72188681), X(0x72393792), + X(0x7259b8f5), X(0x727a0ab2), X(0x729a2cd2), X(0x72ba1f5d), + X(0x72d9e25c), X(0x72f975d8), X(0x7318d9db), X(0x73380e6f), + X(0x735713a0), X(0x7375e978), X(0x73949003), X(0x73b3074c), + X(0x73d14f61), X(0x73ef684f), X(0x740d5222), X(0x742b0ce9), + X(0x744898b1), X(0x7465f589), X(0x74832381), X(0x74a022a8), + X(0x74bcf30e), X(0x74d994c3), X(0x74f607d8), X(0x75124c5f), + X(0x752e6268), X(0x754a4a05), X(0x7566034b), X(0x75818e4a), + X(0x759ceb16), X(0x75b819c4), X(0x75d31a66), X(0x75eded12), + X(0x760891dc), X(0x762308da), X(0x763d5221), X(0x76576dc8), + X(0x76715be4), X(0x768b1c8c), X(0x76a4afd9), X(0x76be15e0), + X(0x76d74ebb), X(0x76f05a82), X(0x7709394d), X(0x7721eb35), + X(0x773a7054), X(0x7752c8c4), X(0x776af49f), X(0x7782f400), + X(0x779ac701), X(0x77b26dbd), X(0x77c9e851), X(0x77e136d8), + X(0x77f8596f), X(0x780f5032), X(0x78261b3f), X(0x783cbab2), + X(0x78532eaa), X(0x78697745), X(0x787f94a0), X(0x789586db), + X(0x78ab4e15), X(0x78c0ea6d), X(0x78d65c03), X(0x78eba2f7), + X(0x7900bf68), X(0x7915b179), X(0x792a7949), X(0x793f16fb), + X(0x79538aaf), X(0x7967d488), X(0x797bf4a8), X(0x798feb31), + X(0x79a3b846), X(0x79b75c0a), X(0x79cad6a1), X(0x79de282e), + X(0x79f150d5), X(0x7a0450bb), X(0x7a172803), X(0x7a29d6d3), + X(0x7a3c5d50), X(0x7a4ebb9f), X(0x7a60f1e6), X(0x7a73004a), + X(0x7a84e6f2), X(0x7a96a604), X(0x7aa83da7), X(0x7ab9ae01), + X(0x7acaf73a), X(0x7adc1979), X(0x7aed14e6), X(0x7afde9a8), + X(0x7b0e97e8), X(0x7b1f1fcd), X(0x7b2f8182), X(0x7b3fbd2d), + X(0x7b4fd2f9), X(0x7b5fc30f), X(0x7b6f8d98), X(0x7b7f32bd), + X(0x7b8eb2a9), X(0x7b9e0d85), X(0x7bad437d), X(0x7bbc54b9), + X(0x7bcb4166), X(0x7bda09ae), X(0x7be8adbc), X(0x7bf72dbc), + X(0x7c0589d8), X(0x7c13c23d), X(0x7c21d716), X(0x7c2fc88f), + X(0x7c3d96d5), X(0x7c4b4214), X(0x7c58ca78), X(0x7c66302d), + X(0x7c737362), X(0x7c809443), X(0x7c8d92fc), X(0x7c9a6fbc), + X(0x7ca72aaf), X(0x7cb3c404), X(0x7cc03be8), X(0x7ccc9288), + X(0x7cd8c814), X(0x7ce4dcb9), X(0x7cf0d0a5), X(0x7cfca406), + X(0x7d08570c), X(0x7d13e9e5), X(0x7d1f5cbf), X(0x7d2aafca), + X(0x7d35e335), X(0x7d40f72e), X(0x7d4bebe4), X(0x7d56c188), + X(0x7d617848), X(0x7d6c1054), X(0x7d7689db), X(0x7d80e50e), + X(0x7d8b221b), X(0x7d954133), X(0x7d9f4286), X(0x7da92643), + X(0x7db2ec9b), X(0x7dbc95bd), X(0x7dc621da), X(0x7dcf9123), + X(0x7dd8e3c6), X(0x7de219f6), X(0x7deb33e2), X(0x7df431ba), + X(0x7dfd13af), X(0x7e05d9f2), X(0x7e0e84b4), X(0x7e171424), + X(0x7e1f8874), X(0x7e27e1d4), X(0x7e302074), X(0x7e384487), + X(0x7e404e3c), X(0x7e483dc4), X(0x7e501350), X(0x7e57cf11), + X(0x7e5f7138), X(0x7e66f9f4), X(0x7e6e6979), X(0x7e75bff5), + X(0x7e7cfd9a), X(0x7e842298), X(0x7e8b2f22), X(0x7e922366), + X(0x7e98ff97), X(0x7e9fc3e4), X(0x7ea6707f), X(0x7ead0598), + X(0x7eb38360), X(0x7eb9ea07), X(0x7ec039bf), X(0x7ec672b7), + X(0x7ecc9521), X(0x7ed2a12c), X(0x7ed8970a), X(0x7ede76ea), + X(0x7ee440fd), X(0x7ee9f573), X(0x7eef947d), X(0x7ef51e4b), + X(0x7efa930d), X(0x7efff2f2), X(0x7f053e2b), X(0x7f0a74e8), + X(0x7f0f9758), X(0x7f14a5ac), X(0x7f19a013), X(0x7f1e86bc), + X(0x7f2359d8), X(0x7f281995), X(0x7f2cc623), X(0x7f315fb1), + X(0x7f35e66e), X(0x7f3a5a8a), X(0x7f3ebc33), X(0x7f430b98), + X(0x7f4748e7), X(0x7f4b7450), X(0x7f4f8e01), X(0x7f539629), + X(0x7f578cf5), X(0x7f5b7293), X(0x7f5f4732), X(0x7f630b00), + X(0x7f66be2b), X(0x7f6a60df), X(0x7f6df34b), X(0x7f71759b), + X(0x7f74e7fe), X(0x7f784aa0), X(0x7f7b9daf), X(0x7f7ee156), + X(0x7f8215c3), X(0x7f853b22), X(0x7f88519f), X(0x7f8b5967), + X(0x7f8e52a6), X(0x7f913d87), X(0x7f941a36), X(0x7f96e8df), + X(0x7f99a9ad), X(0x7f9c5ccb), X(0x7f9f0265), X(0x7fa19aa5), + X(0x7fa425b5), X(0x7fa6a3c1), X(0x7fa914f3), X(0x7fab7974), + X(0x7fadd16f), X(0x7fb01d0d), X(0x7fb25c78), X(0x7fb48fd9), + X(0x7fb6b75a), X(0x7fb8d323), X(0x7fbae35d), X(0x7fbce831), + X(0x7fbee1c7), X(0x7fc0d047), X(0x7fc2b3d9), X(0x7fc48ca5), + X(0x7fc65ad3), X(0x7fc81e88), X(0x7fc9d7ee), X(0x7fcb872a), + X(0x7fcd2c63), X(0x7fcec7bf), X(0x7fd05966), X(0x7fd1e17c), + X(0x7fd36027), X(0x7fd4d58d), X(0x7fd641d3), X(0x7fd7a51e), + X(0x7fd8ff94), X(0x7fda5157), X(0x7fdb9a8e), X(0x7fdcdb5b), + X(0x7fde13e2), X(0x7fdf4448), X(0x7fe06caf), X(0x7fe18d3b), + X(0x7fe2a60e), X(0x7fe3b74b), X(0x7fe4c114), X(0x7fe5c38b), + X(0x7fe6bed2), X(0x7fe7b30a), X(0x7fe8a055), X(0x7fe986d4), + X(0x7fea66a7), X(0x7feb3ff0), X(0x7fec12cd), X(0x7fecdf5f), + X(0x7feda5c5), X(0x7fee6620), X(0x7fef208d), X(0x7fefd52c), + X(0x7ff0841c), X(0x7ff12d7a), X(0x7ff1d164), X(0x7ff26ff9), + X(0x7ff30955), X(0x7ff39d96), X(0x7ff42cd9), X(0x7ff4b739), + X(0x7ff53cd4), X(0x7ff5bdc5), X(0x7ff63a28), X(0x7ff6b217), + X(0x7ff725af), X(0x7ff7950a), X(0x7ff80043), X(0x7ff86773), + X(0x7ff8cab4), X(0x7ff92a21), X(0x7ff985d1), X(0x7ff9dddf), + X(0x7ffa3262), X(0x7ffa8374), X(0x7ffad12c), X(0x7ffb1ba1), + X(0x7ffb62ec), X(0x7ffba723), X(0x7ffbe85c), X(0x7ffc26b0), + X(0x7ffc6233), X(0x7ffc9afb), X(0x7ffcd11e), X(0x7ffd04b1), + X(0x7ffd35c9), X(0x7ffd647b), X(0x7ffd90da), X(0x7ffdbafa), + X(0x7ffde2f0), X(0x7ffe08ce), X(0x7ffe2ca7), X(0x7ffe4e8e), + X(0x7ffe6e95), X(0x7ffe8cce), X(0x7ffea94a), X(0x7ffec41b), + X(0x7ffedd52), X(0x7ffef4ff), X(0x7fff0b33), X(0x7fff1ffd), + X(0x7fff336e), X(0x7fff4593), X(0x7fff567d), X(0x7fff663a), + X(0x7fff74d8), X(0x7fff8265), X(0x7fff8eee), X(0x7fff9a81), + X(0x7fffa52b), X(0x7fffaef8), X(0x7fffb7f5), X(0x7fffc02d), + X(0x7fffc7ab), X(0x7fffce7c), X(0x7fffd4a9), X(0x7fffda3e), + X(0x7fffdf44), X(0x7fffe3c6), X(0x7fffe7cc), X(0x7fffeb60), + X(0x7fffee8a), X(0x7ffff153), X(0x7ffff3c4), X(0x7ffff5e3), + X(0x7ffff7b8), X(0x7ffff94b), X(0x7ffffaa1), X(0x7ffffbc1), + X(0x7ffffcb2), X(0x7ffffd78), X(0x7ffffe19), X(0x7ffffe9a), + X(0x7ffffeff), X(0x7fffff4e), X(0x7fffff89), X(0x7fffffb3), + X(0x7fffffd2), X(0x7fffffe6), X(0x7ffffff3), X(0x7ffffffa), + X(0x7ffffffe), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), +}; + +static const LOOKUP_T vwin4096[2048] = { + X(0x000001f0), X(0x00001171), X(0x00003072), X(0x00005ef5), + X(0x00009cf8), X(0x0000ea7c), X(0x00014780), X(0x0001b405), + X(0x0002300b), X(0x0002bb91), X(0x00035698), X(0x0004011e), + X(0x0004bb25), X(0x000584ac), X(0x00065db3), X(0x0007463a), + X(0x00083e41), X(0x000945c7), X(0x000a5ccc), X(0x000b8350), + X(0x000cb954), X(0x000dfed7), X(0x000f53d8), X(0x0010b857), + X(0x00122c55), X(0x0013afd1), X(0x001542ca), X(0x0016e541), + X(0x00189735), X(0x001a58a7), X(0x001c2995), X(0x001e09ff), + X(0x001ff9e6), X(0x0021f948), X(0x00240826), X(0x00262680), + X(0x00285454), X(0x002a91a3), X(0x002cde6c), X(0x002f3aaf), + X(0x0031a66b), X(0x003421a0), X(0x0036ac4f), X(0x00394675), + X(0x003bf014), X(0x003ea92a), X(0x004171b7), X(0x004449bb), + X(0x00473135), X(0x004a2824), X(0x004d2e8a), X(0x00504463), + X(0x005369b2), X(0x00569e74), X(0x0059e2aa), X(0x005d3652), + X(0x0060996d), X(0x00640bf9), X(0x00678df7), X(0x006b1f66), + X(0x006ec045), X(0x00727093), X(0x00763051), X(0x0079ff7d), + X(0x007dde16), X(0x0081cc1d), X(0x0085c991), X(0x0089d671), + X(0x008df2bc), X(0x00921e71), X(0x00965991), X(0x009aa41a), + X(0x009efe0c), X(0x00a36766), X(0x00a7e028), X(0x00ac6850), + X(0x00b0ffde), X(0x00b5a6d1), X(0x00ba5d28), X(0x00bf22e4), + X(0x00c3f802), X(0x00c8dc83), X(0x00cdd065), X(0x00d2d3a8), + X(0x00d7e64a), X(0x00dd084c), X(0x00e239ac), X(0x00e77a69), + X(0x00ecca83), X(0x00f229f9), X(0x00f798ca), X(0x00fd16f5), + X(0x0102a479), X(0x01084155), X(0x010ded89), X(0x0113a913), + X(0x011973f3), X(0x011f4e27), X(0x012537af), X(0x012b308a), + X(0x013138b7), X(0x01375035), X(0x013d7702), X(0x0143ad1f), + X(0x0149f289), X(0x01504741), X(0x0156ab44), X(0x015d1e92), + X(0x0163a12a), X(0x016a330b), X(0x0170d433), X(0x017784a3), + X(0x017e4458), X(0x01851351), X(0x018bf18e), X(0x0192df0d), + X(0x0199dbcd), X(0x01a0e7cd), X(0x01a8030c), X(0x01af2d89), + X(0x01b66743), X(0x01bdb038), X(0x01c50867), X(0x01cc6fd0), + X(0x01d3e670), X(0x01db6c47), X(0x01e30153), X(0x01eaa593), + X(0x01f25907), X(0x01fa1bac), X(0x0201ed81), X(0x0209ce86), + X(0x0211beb8), X(0x0219be17), X(0x0221cca2), X(0x0229ea56), + X(0x02321733), X(0x023a5337), X(0x02429e60), X(0x024af8af), + X(0x02536220), X(0x025bdab3), X(0x02646267), X(0x026cf93a), + X(0x02759f2a), X(0x027e5436), X(0x0287185d), X(0x028feb9d), + X(0x0298cdf4), X(0x02a1bf62), X(0x02aabfe5), X(0x02b3cf7b), + X(0x02bcee23), X(0x02c61bdb), X(0x02cf58a2), X(0x02d8a475), + X(0x02e1ff55), X(0x02eb693e), X(0x02f4e230), X(0x02fe6a29), + X(0x03080127), X(0x0311a729), X(0x031b5c2d), X(0x03252031), + X(0x032ef334), X(0x0338d534), X(0x0342c630), X(0x034cc625), + X(0x0356d512), X(0x0360f2f6), X(0x036b1fce), X(0x03755b99), + X(0x037fa655), X(0x038a0001), X(0x0394689a), X(0x039ee020), + X(0x03a9668f), X(0x03b3fbe6), X(0x03bea024), X(0x03c95347), + X(0x03d4154d), X(0x03dee633), X(0x03e9c5f9), X(0x03f4b49b), + X(0x03ffb219), X(0x040abe71), X(0x0415d9a0), X(0x042103a5), + X(0x042c3c7d), X(0x04378428), X(0x0442daa2), X(0x044e3fea), + X(0x0459b3fd), X(0x046536db), X(0x0470c880), X(0x047c68eb), + X(0x0488181a), X(0x0493d60b), X(0x049fa2bc), X(0x04ab7e2a), + X(0x04b76854), X(0x04c36137), X(0x04cf68d1), X(0x04db7f21), + X(0x04e7a424), X(0x04f3d7d8), X(0x05001a3b), X(0x050c6b4a), + X(0x0518cb04), X(0x05253966), X(0x0531b66e), X(0x053e421a), + X(0x054adc68), X(0x05578555), X(0x05643cdf), X(0x05710304), + X(0x057dd7c1), X(0x058abb15), X(0x0597acfd), X(0x05a4ad76), + X(0x05b1bc7f), X(0x05beda14), X(0x05cc0635), X(0x05d940dd), + X(0x05e68a0b), X(0x05f3e1bd), X(0x060147f0), X(0x060ebca1), + X(0x061c3fcf), X(0x0629d176), X(0x06377194), X(0x06452027), + X(0x0652dd2c), X(0x0660a8a2), X(0x066e8284), X(0x067c6ad1), + X(0x068a6186), X(0x069866a1), X(0x06a67a1e), X(0x06b49bfc), + X(0x06c2cc38), X(0x06d10acf), X(0x06df57bf), X(0x06edb304), + X(0x06fc1c9d), X(0x070a9487), X(0x07191abe), X(0x0727af40), + X(0x0736520b), X(0x0745031c), X(0x0753c270), X(0x07629004), + X(0x07716bd6), X(0x078055e2), X(0x078f4e26), X(0x079e549f), + X(0x07ad694b), X(0x07bc8c26), X(0x07cbbd2e), X(0x07dafc5f), + X(0x07ea49b7), X(0x07f9a533), X(0x08090ed1), X(0x0818868c), + X(0x08280c62), X(0x0837a051), X(0x08474255), X(0x0856f26b), + X(0x0866b091), X(0x08767cc3), X(0x088656fe), X(0x08963f3f), + X(0x08a63584), X(0x08b639c8), X(0x08c64c0a), X(0x08d66c45), + X(0x08e69a77), X(0x08f6d69d), X(0x090720b3), X(0x091778b7), + X(0x0927dea5), X(0x0938527a), X(0x0948d433), X(0x095963cc), + X(0x096a0143), X(0x097aac94), X(0x098b65bb), X(0x099c2cb6), + X(0x09ad0182), X(0x09bde41a), X(0x09ced47d), X(0x09dfd2a5), + X(0x09f0de90), X(0x0a01f83b), X(0x0a131fa3), X(0x0a2454c3), + X(0x0a359798), X(0x0a46e820), X(0x0a584656), X(0x0a69b237), + X(0x0a7b2bc0), X(0x0a8cb2ec), X(0x0a9e47ba), X(0x0aafea24), + X(0x0ac19a29), X(0x0ad357c3), X(0x0ae522ef), X(0x0af6fbab), + X(0x0b08e1f1), X(0x0b1ad5c0), X(0x0b2cd712), X(0x0b3ee5e5), + X(0x0b510234), X(0x0b632bfd), X(0x0b75633b), X(0x0b87a7eb), + X(0x0b99fa08), X(0x0bac5990), X(0x0bbec67e), X(0x0bd140cf), + X(0x0be3c87e), X(0x0bf65d89), X(0x0c08ffeb), X(0x0c1bafa1), + X(0x0c2e6ca6), X(0x0c4136f6), X(0x0c540e8f), X(0x0c66f36c), + X(0x0c79e588), X(0x0c8ce4e1), X(0x0c9ff172), X(0x0cb30b37), + X(0x0cc6322c), X(0x0cd9664d), X(0x0ceca797), X(0x0cfff605), + X(0x0d135193), X(0x0d26ba3d), X(0x0d3a2fff), X(0x0d4db2d5), + X(0x0d6142ba), X(0x0d74dfac), X(0x0d8889a5), X(0x0d9c40a1), + X(0x0db0049d), X(0x0dc3d593), X(0x0dd7b380), X(0x0deb9e60), + X(0x0dff962f), X(0x0e139ae7), X(0x0e27ac85), X(0x0e3bcb05), + X(0x0e4ff662), X(0x0e642e98), X(0x0e7873a2), X(0x0e8cc57d), + X(0x0ea12423), X(0x0eb58f91), X(0x0eca07c2), X(0x0ede8cb1), + X(0x0ef31e5b), X(0x0f07bcba), X(0x0f1c67cb), X(0x0f311f88), + X(0x0f45e3ee), X(0x0f5ab4f7), X(0x0f6f92a0), X(0x0f847ce3), + X(0x0f9973bc), X(0x0fae7726), X(0x0fc3871e), X(0x0fd8a39d), + X(0x0fedcca1), X(0x10030223), X(0x1018441f), X(0x102d9291), + X(0x1042ed74), X(0x105854c3), X(0x106dc879), X(0x10834892), + X(0x1098d508), X(0x10ae6dd8), X(0x10c412fc), X(0x10d9c46f), + X(0x10ef822d), X(0x11054c30), X(0x111b2274), X(0x113104f5), + X(0x1146f3ac), X(0x115cee95), X(0x1172f5ab), X(0x118908e9), + X(0x119f284a), X(0x11b553ca), X(0x11cb8b62), X(0x11e1cf0f), + X(0x11f81ecb), X(0x120e7a90), X(0x1224e25a), X(0x123b5624), + X(0x1251d5e9), X(0x126861a3), X(0x127ef94e), X(0x12959ce3), + X(0x12ac4c5f), X(0x12c307bb), X(0x12d9cef2), X(0x12f0a200), + X(0x130780df), X(0x131e6b8a), X(0x133561fa), X(0x134c642c), + X(0x1363721a), X(0x137a8bbe), X(0x1391b113), X(0x13a8e214), + X(0x13c01eba), X(0x13d76702), X(0x13eebae5), X(0x14061a5e), + X(0x141d8567), X(0x1434fbfb), X(0x144c7e14), X(0x14640bae), + X(0x147ba4c1), X(0x14934949), X(0x14aaf941), X(0x14c2b4a2), + X(0x14da7b67), X(0x14f24d8a), X(0x150a2b06), X(0x152213d5), + X(0x153a07f1), X(0x15520755), X(0x156a11fb), X(0x158227dd), + X(0x159a48f5), X(0x15b2753d), X(0x15caacb1), X(0x15e2ef49), + X(0x15fb3d01), X(0x161395d2), X(0x162bf9b6), X(0x164468a8), + X(0x165ce2a1), X(0x1675679c), X(0x168df793), X(0x16a69280), + X(0x16bf385c), X(0x16d7e922), X(0x16f0a4cc), X(0x17096b54), + X(0x17223cb4), X(0x173b18e5), X(0x1753ffe2), X(0x176cf1a5), + X(0x1785ee27), X(0x179ef562), X(0x17b80750), X(0x17d123eb), + X(0x17ea4b2d), X(0x18037d10), X(0x181cb98d), X(0x1836009e), + X(0x184f523c), X(0x1868ae63), X(0x1882150a), X(0x189b862c), + X(0x18b501c4), X(0x18ce87c9), X(0x18e81836), X(0x1901b305), + X(0x191b582f), X(0x193507ad), X(0x194ec17a), X(0x1968858f), + X(0x198253e5), X(0x199c2c75), X(0x19b60f3a), X(0x19cffc2d), + X(0x19e9f347), X(0x1a03f482), X(0x1a1dffd7), X(0x1a381540), + X(0x1a5234b5), X(0x1a6c5e31), X(0x1a8691ac), X(0x1aa0cf21), + X(0x1abb1687), X(0x1ad567da), X(0x1aefc311), X(0x1b0a2826), + X(0x1b249712), X(0x1b3f0fd0), X(0x1b599257), X(0x1b741ea1), + X(0x1b8eb4a7), X(0x1ba95462), X(0x1bc3fdcd), X(0x1bdeb0de), + X(0x1bf96d91), X(0x1c1433dd), X(0x1c2f03bc), X(0x1c49dd27), + X(0x1c64c017), X(0x1c7fac85), X(0x1c9aa269), X(0x1cb5a1be), + X(0x1cd0aa7c), X(0x1cebbc9c), X(0x1d06d816), X(0x1d21fce4), + X(0x1d3d2aff), X(0x1d586260), X(0x1d73a2fe), X(0x1d8eecd4), + X(0x1daa3fda), X(0x1dc59c09), X(0x1de1015a), X(0x1dfc6fc5), + X(0x1e17e743), X(0x1e3367cd), X(0x1e4ef15b), X(0x1e6a83e7), + X(0x1e861f6a), X(0x1ea1c3da), X(0x1ebd7133), X(0x1ed9276b), + X(0x1ef4e67c), X(0x1f10ae5e), X(0x1f2c7f0a), X(0x1f485879), + X(0x1f643aa2), X(0x1f80257f), X(0x1f9c1908), X(0x1fb81536), + X(0x1fd41a00), X(0x1ff02761), X(0x200c3d4f), X(0x20285bc3), + X(0x204482b7), X(0x2060b221), X(0x207ce9fb), X(0x20992a3e), + X(0x20b572e0), X(0x20d1c3dc), X(0x20ee1d28), X(0x210a7ebe), + X(0x2126e895), X(0x21435aa6), X(0x215fd4ea), X(0x217c5757), + X(0x2198e1e8), X(0x21b57493), X(0x21d20f51), X(0x21eeb21b), + X(0x220b5ce7), X(0x22280fb0), X(0x2244ca6c), X(0x22618d13), + X(0x227e579f), X(0x229b2a06), X(0x22b80442), X(0x22d4e649), + X(0x22f1d015), X(0x230ec19d), X(0x232bbad9), X(0x2348bbc1), + X(0x2365c44c), X(0x2382d474), X(0x239fec30), X(0x23bd0b78), + X(0x23da3244), X(0x23f7608b), X(0x24149646), X(0x2431d36c), + X(0x244f17f5), X(0x246c63da), X(0x2489b711), X(0x24a71193), + X(0x24c47358), X(0x24e1dc57), X(0x24ff4c88), X(0x251cc3e2), + X(0x253a425e), X(0x2557c7f4), X(0x2575549a), X(0x2592e848), + X(0x25b082f7), X(0x25ce249e), X(0x25ebcd34), X(0x26097cb2), + X(0x2627330e), X(0x2644f040), X(0x2662b441), X(0x26807f07), + X(0x269e5089), X(0x26bc28c1), X(0x26da07a4), X(0x26f7ed2b), + X(0x2715d94d), X(0x2733cc02), X(0x2751c540), X(0x276fc500), + X(0x278dcb39), X(0x27abd7e2), X(0x27c9eaf3), X(0x27e80463), + X(0x28062429), X(0x28244a3e), X(0x28427697), X(0x2860a92d), + X(0x287ee1f7), X(0x289d20eb), X(0x28bb6603), X(0x28d9b134), + X(0x28f80275), X(0x291659c0), X(0x2934b709), X(0x29531a49), + X(0x29718378), X(0x298ff28b), X(0x29ae677b), X(0x29cce23e), + X(0x29eb62cb), X(0x2a09e91b), X(0x2a287523), X(0x2a4706dc), + X(0x2a659e3c), X(0x2a843b39), X(0x2aa2ddcd), X(0x2ac185ec), + X(0x2ae0338f), X(0x2afee6ad), X(0x2b1d9f3c), X(0x2b3c5d33), + X(0x2b5b208b), X(0x2b79e939), X(0x2b98b734), X(0x2bb78a74), + X(0x2bd662ef), X(0x2bf5409d), X(0x2c142374), X(0x2c330b6b), + X(0x2c51f87a), X(0x2c70ea97), X(0x2c8fe1b9), X(0x2caeddd6), + X(0x2ccddee7), X(0x2cece4e1), X(0x2d0befbb), X(0x2d2aff6d), + X(0x2d4a13ec), X(0x2d692d31), X(0x2d884b32), X(0x2da76de4), + X(0x2dc69540), X(0x2de5c13d), X(0x2e04f1d0), X(0x2e2426f0), + X(0x2e436095), X(0x2e629eb4), X(0x2e81e146), X(0x2ea1283f), + X(0x2ec07398), X(0x2edfc347), X(0x2eff1742), X(0x2f1e6f80), + X(0x2f3dcbf8), X(0x2f5d2ca0), X(0x2f7c916f), X(0x2f9bfa5c), + X(0x2fbb675d), X(0x2fdad869), X(0x2ffa4d76), X(0x3019c67b), + X(0x3039436f), X(0x3058c448), X(0x307848fc), X(0x3097d183), + X(0x30b75dd3), X(0x30d6ede2), X(0x30f681a6), X(0x31161917), + X(0x3135b42b), X(0x315552d8), X(0x3174f514), X(0x31949ad7), + X(0x31b44417), X(0x31d3f0ca), X(0x31f3a0e6), X(0x32135462), + X(0x32330b35), X(0x3252c555), X(0x327282b7), X(0x32924354), + X(0x32b20720), X(0x32d1ce13), X(0x32f19823), X(0x33116546), + X(0x33313573), X(0x3351089f), X(0x3370dec2), X(0x3390b7d1), + X(0x33b093c3), X(0x33d0728f), X(0x33f05429), X(0x3410388a), + X(0x34301fa7), X(0x34500977), X(0x346ff5ef), X(0x348fe506), + X(0x34afd6b3), X(0x34cfcaeb), X(0x34efc1a5), X(0x350fbad7), + X(0x352fb678), X(0x354fb47d), X(0x356fb4dd), X(0x358fb78e), + X(0x35afbc86), X(0x35cfc3bc), X(0x35efcd25), X(0x360fd8b8), + X(0x362fe66c), X(0x364ff636), X(0x3670080c), X(0x36901be5), + X(0x36b031b7), X(0x36d04978), X(0x36f0631e), X(0x37107ea0), + X(0x37309bf3), X(0x3750bb0e), X(0x3770dbe6), X(0x3790fe73), + X(0x37b122aa), X(0x37d14881), X(0x37f16fee), X(0x381198e8), + X(0x3831c365), X(0x3851ef5a), X(0x38721cbe), X(0x38924b87), + X(0x38b27bac), X(0x38d2ad21), X(0x38f2dfde), X(0x391313d8), + X(0x39334906), X(0x39537f5d), X(0x3973b6d4), X(0x3993ef60), + X(0x39b428f9), X(0x39d46393), X(0x39f49f25), X(0x3a14dba6), + X(0x3a35190a), X(0x3a555748), X(0x3a759657), X(0x3a95d62c), + X(0x3ab616be), X(0x3ad65801), X(0x3af699ed), X(0x3b16dc78), + X(0x3b371f97), X(0x3b576341), X(0x3b77a76c), X(0x3b97ec0d), + X(0x3bb8311b), X(0x3bd8768b), X(0x3bf8bc55), X(0x3c19026d), + X(0x3c3948ca), X(0x3c598f62), X(0x3c79d62b), X(0x3c9a1d1b), + X(0x3cba6428), X(0x3cdaab48), X(0x3cfaf271), X(0x3d1b3999), + X(0x3d3b80b6), X(0x3d5bc7be), X(0x3d7c0ea8), X(0x3d9c5569), + X(0x3dbc9bf7), X(0x3ddce248), X(0x3dfd2852), X(0x3e1d6e0c), + X(0x3e3db36c), X(0x3e5df866), X(0x3e7e3cf2), X(0x3e9e8106), + X(0x3ebec497), X(0x3edf079b), X(0x3eff4a09), X(0x3f1f8bd7), + X(0x3f3fccfa), X(0x3f600d69), X(0x3f804d1a), X(0x3fa08c02), + X(0x3fc0ca19), X(0x3fe10753), X(0x400143a7), X(0x40217f0a), + X(0x4041b974), X(0x4061f2da), X(0x40822b32), X(0x40a26272), + X(0x40c29891), X(0x40e2cd83), X(0x41030140), X(0x412333bd), + X(0x414364f1), X(0x416394d2), X(0x4183c355), X(0x41a3f070), + X(0x41c41c1b), X(0x41e4464a), X(0x42046ef4), X(0x42249610), + X(0x4244bb92), X(0x4264df72), X(0x428501a5), X(0x42a52222), + X(0x42c540de), X(0x42e55dd0), X(0x430578ed), X(0x4325922d), + X(0x4345a985), X(0x4365beeb), X(0x4385d255), X(0x43a5e3ba), + X(0x43c5f30f), X(0x43e6004b), X(0x44060b65), X(0x44261451), + X(0x44461b07), X(0x44661f7c), X(0x448621a7), X(0x44a6217d), + X(0x44c61ef6), X(0x44e61a07), X(0x450612a6), X(0x452608ca), + X(0x4545fc69), X(0x4565ed79), X(0x4585dbf1), X(0x45a5c7c6), + X(0x45c5b0ef), X(0x45e59761), X(0x46057b15), X(0x46255bfe), + X(0x46453a15), X(0x4665154f), X(0x4684eda2), X(0x46a4c305), + X(0x46c4956e), X(0x46e464d3), X(0x4704312b), X(0x4723fa6c), + X(0x4743c08d), X(0x47638382), X(0x47834344), X(0x47a2ffc9), + X(0x47c2b906), X(0x47e26ef2), X(0x48022183), X(0x4821d0b1), + X(0x48417c71), X(0x486124b9), X(0x4880c981), X(0x48a06abe), + X(0x48c00867), X(0x48dfa272), X(0x48ff38d6), X(0x491ecb8a), + X(0x493e5a84), X(0x495de5b9), X(0x497d6d22), X(0x499cf0b4), + X(0x49bc7066), X(0x49dbec2e), X(0x49fb6402), X(0x4a1ad7db), + X(0x4a3a47ad), X(0x4a59b370), X(0x4a791b1a), X(0x4a987ea1), + X(0x4ab7ddfd), X(0x4ad73924), X(0x4af6900c), X(0x4b15e2ad), + X(0x4b3530fc), X(0x4b547af1), X(0x4b73c082), X(0x4b9301a6), + X(0x4bb23e53), X(0x4bd17681), X(0x4bf0aa25), X(0x4c0fd937), + X(0x4c2f03ae), X(0x4c4e297f), X(0x4c6d4aa3), X(0x4c8c670f), + X(0x4cab7eba), X(0x4cca919c), X(0x4ce99fab), X(0x4d08a8de), + X(0x4d27ad2c), X(0x4d46ac8b), X(0x4d65a6f3), X(0x4d849c5a), + X(0x4da38cb7), X(0x4dc27802), X(0x4de15e31), X(0x4e003f3a), + X(0x4e1f1b16), X(0x4e3df1ba), X(0x4e5cc31e), X(0x4e7b8f3a), + X(0x4e9a5603), X(0x4eb91771), X(0x4ed7d37b), X(0x4ef68a18), + X(0x4f153b3f), X(0x4f33e6e7), X(0x4f528d08), X(0x4f712d97), + X(0x4f8fc88e), X(0x4fae5de1), X(0x4fcced8a), X(0x4feb777f), + X(0x5009fbb6), X(0x50287a28), X(0x5046f2cc), X(0x50656598), + X(0x5083d284), X(0x50a23988), X(0x50c09a9a), X(0x50def5b1), + X(0x50fd4ac7), X(0x511b99d0), X(0x5139e2c5), X(0x5158259e), + X(0x51766251), X(0x519498d6), X(0x51b2c925), X(0x51d0f334), + X(0x51ef16fb), X(0x520d3473), X(0x522b4b91), X(0x52495c4e), + X(0x526766a2), X(0x52856a83), X(0x52a367e9), X(0x52c15ecd), + X(0x52df4f24), X(0x52fd38e8), X(0x531b1c10), X(0x5338f892), + X(0x5356ce68), X(0x53749d89), X(0x539265eb), X(0x53b02788), + X(0x53cde257), X(0x53eb964f), X(0x54094369), X(0x5426e99c), + X(0x544488df), X(0x5462212c), X(0x547fb279), X(0x549d3cbe), + X(0x54babff4), X(0x54d83c12), X(0x54f5b110), X(0x55131ee7), + X(0x5530858d), X(0x554de4fc), X(0x556b3d2a), X(0x55888e11), + X(0x55a5d7a8), X(0x55c319e7), X(0x55e054c7), X(0x55fd883f), + X(0x561ab447), X(0x5637d8d8), X(0x5654f5ea), X(0x56720b75), + X(0x568f1971), X(0x56ac1fd7), X(0x56c91e9e), X(0x56e615c0), + X(0x57030534), X(0x571fecf2), X(0x573cccf3), X(0x5759a530), + X(0x577675a0), X(0x57933e3c), X(0x57affefd), X(0x57ccb7db), + X(0x57e968ce), X(0x580611cf), X(0x5822b2d6), X(0x583f4bdd), + X(0x585bdcdb), X(0x587865c9), X(0x5894e69f), X(0x58b15f57), + X(0x58cdcfe9), X(0x58ea384e), X(0x5906987d), X(0x5922f071), + X(0x593f4022), X(0x595b8788), X(0x5977c69c), X(0x5993fd57), + X(0x59b02bb2), X(0x59cc51a6), X(0x59e86f2c), X(0x5a04843c), + X(0x5a2090d0), X(0x5a3c94e0), X(0x5a589065), X(0x5a748359), + X(0x5a906db4), X(0x5aac4f70), X(0x5ac82884), X(0x5ae3f8ec), + X(0x5affc09f), X(0x5b1b7f97), X(0x5b3735cd), X(0x5b52e33a), + X(0x5b6e87d8), X(0x5b8a239f), X(0x5ba5b689), X(0x5bc1408f), + X(0x5bdcc1aa), X(0x5bf839d5), X(0x5c13a907), X(0x5c2f0f3b), + X(0x5c4a6c6a), X(0x5c65c08d), X(0x5c810b9e), X(0x5c9c4d97), + X(0x5cb78670), X(0x5cd2b623), X(0x5ceddcaa), X(0x5d08f9ff), + X(0x5d240e1b), X(0x5d3f18f8), X(0x5d5a1a8f), X(0x5d7512da), + X(0x5d9001d3), X(0x5daae773), X(0x5dc5c3b5), X(0x5de09692), + X(0x5dfb6004), X(0x5e162004), X(0x5e30d68d), X(0x5e4b8399), + X(0x5e662721), X(0x5e80c11f), X(0x5e9b518e), X(0x5eb5d867), + X(0x5ed055a4), X(0x5eeac940), X(0x5f053334), X(0x5f1f937b), + X(0x5f39ea0f), X(0x5f5436ea), X(0x5f6e7a06), X(0x5f88b35d), + X(0x5fa2e2e9), X(0x5fbd08a6), X(0x5fd7248d), X(0x5ff13698), + X(0x600b3ec2), X(0x60253d05), X(0x603f315b), X(0x60591bc0), + X(0x6072fc2d), X(0x608cd29e), X(0x60a69f0b), X(0x60c06171), + X(0x60da19ca), X(0x60f3c80f), X(0x610d6c3d), X(0x6127064d), + X(0x6140963a), X(0x615a1bff), X(0x61739797), X(0x618d08fc), + X(0x61a67029), X(0x61bfcd1a), X(0x61d91fc8), X(0x61f2682f), + X(0x620ba64a), X(0x6224da13), X(0x623e0386), X(0x6257229d), + X(0x62703754), X(0x628941a6), X(0x62a2418e), X(0x62bb3706), + X(0x62d4220a), X(0x62ed0296), X(0x6305d8a3), X(0x631ea42f), + X(0x63376533), X(0x63501bab), X(0x6368c793), X(0x638168e5), + X(0x6399ff9e), X(0x63b28bb8), X(0x63cb0d2f), X(0x63e383ff), + X(0x63fbf022), X(0x64145195), X(0x642ca853), X(0x6444f457), + X(0x645d359e), X(0x64756c22), X(0x648d97e0), X(0x64a5b8d3), + X(0x64bdcef6), X(0x64d5da47), X(0x64eddabf), X(0x6505d05c), + X(0x651dbb19), X(0x65359af2), X(0x654d6fe3), X(0x656539e7), + X(0x657cf8fb), X(0x6594ad1b), X(0x65ac5643), X(0x65c3f46e), + X(0x65db8799), X(0x65f30fc0), X(0x660a8ce0), X(0x6621fef3), + X(0x663965f7), X(0x6650c1e7), X(0x666812c1), X(0x667f5880), + X(0x66969320), X(0x66adc29e), X(0x66c4e6f7), X(0x66dc0026), + X(0x66f30e28), X(0x670a10fa), X(0x67210898), X(0x6737f4ff), + X(0x674ed62b), X(0x6765ac19), X(0x677c76c5), X(0x6793362c), + X(0x67a9ea4b), X(0x67c0931f), X(0x67d730a3), X(0x67edc2d6), + X(0x680449b3), X(0x681ac538), X(0x68313562), X(0x68479a2d), + X(0x685df396), X(0x6874419b), X(0x688a8438), X(0x68a0bb6a), + X(0x68b6e72e), X(0x68cd0782), X(0x68e31c63), X(0x68f925cd), + X(0x690f23be), X(0x69251633), X(0x693afd29), X(0x6950d89e), + X(0x6966a88f), X(0x697c6cf8), X(0x699225d9), X(0x69a7d32d), + X(0x69bd74f3), X(0x69d30b27), X(0x69e895c8), X(0x69fe14d2), + X(0x6a138844), X(0x6a28f01b), X(0x6a3e4c54), X(0x6a539ced), + X(0x6a68e1e4), X(0x6a7e1b37), X(0x6a9348e3), X(0x6aa86ae6), + X(0x6abd813d), X(0x6ad28be7), X(0x6ae78ae2), X(0x6afc7e2b), + X(0x6b1165c0), X(0x6b26419f), X(0x6b3b11c7), X(0x6b4fd634), + X(0x6b648ee6), X(0x6b793bda), X(0x6b8ddd0e), X(0x6ba27281), + X(0x6bb6fc31), X(0x6bcb7a1b), X(0x6bdfec3e), X(0x6bf45299), + X(0x6c08ad29), X(0x6c1cfbed), X(0x6c313ee4), X(0x6c45760a), + X(0x6c59a160), X(0x6c6dc0e4), X(0x6c81d493), X(0x6c95dc6d), + X(0x6ca9d86f), X(0x6cbdc899), X(0x6cd1acea), X(0x6ce5855f), + X(0x6cf951f7), X(0x6d0d12b1), X(0x6d20c78c), X(0x6d347087), + X(0x6d480da0), X(0x6d5b9ed6), X(0x6d6f2427), X(0x6d829d94), + X(0x6d960b1a), X(0x6da96cb9), X(0x6dbcc270), X(0x6dd00c3c), + X(0x6de34a1f), X(0x6df67c16), X(0x6e09a221), X(0x6e1cbc3f), + X(0x6e2fca6e), X(0x6e42ccaf), X(0x6e55c300), X(0x6e68ad60), + X(0x6e7b8bd0), X(0x6e8e5e4d), X(0x6ea124d8), X(0x6eb3df70), + X(0x6ec68e13), X(0x6ed930c3), X(0x6eebc77d), X(0x6efe5242), + X(0x6f10d111), X(0x6f2343e9), X(0x6f35aacb), X(0x6f4805b5), + X(0x6f5a54a8), X(0x6f6c97a2), X(0x6f7ecea4), X(0x6f90f9ae), + X(0x6fa318be), X(0x6fb52bd6), X(0x6fc732f4), X(0x6fd92e19), + X(0x6feb1d44), X(0x6ffd0076), X(0x700ed7ad), X(0x7020a2eb), + X(0x7032622f), X(0x7044157a), X(0x7055bcca), X(0x70675821), + X(0x7078e77e), X(0x708a6ae2), X(0x709be24c), X(0x70ad4dbd), + X(0x70bead36), X(0x70d000b5), X(0x70e1483d), X(0x70f283cc), + X(0x7103b363), X(0x7114d704), X(0x7125eead), X(0x7136fa60), + X(0x7147fa1c), X(0x7158ede4), X(0x7169d5b6), X(0x717ab193), + X(0x718b817d), X(0x719c4573), X(0x71acfd76), X(0x71bda988), + X(0x71ce49a8), X(0x71deddd7), X(0x71ef6617), X(0x71ffe267), + X(0x721052ca), X(0x7220b73e), X(0x72310fc6), X(0x72415c62), + X(0x72519d14), X(0x7261d1db), X(0x7271faba), X(0x728217b1), + X(0x729228c0), X(0x72a22dea), X(0x72b22730), X(0x72c21491), + X(0x72d1f611), X(0x72e1cbaf), X(0x72f1956c), X(0x7301534c), + X(0x7311054d), X(0x7320ab72), X(0x733045bc), X(0x733fd42d), + X(0x734f56c5), X(0x735ecd86), X(0x736e3872), X(0x737d9789), + X(0x738ceacf), X(0x739c3243), X(0x73ab6de7), X(0x73ba9dbe), + X(0x73c9c1c8), X(0x73d8da08), X(0x73e7e67f), X(0x73f6e72e), + X(0x7405dc17), X(0x7414c53c), X(0x7423a29f), X(0x74327442), + X(0x74413a26), X(0x744ff44d), X(0x745ea2b9), X(0x746d456c), + X(0x747bdc68), X(0x748a67ae), X(0x7498e741), X(0x74a75b23), + X(0x74b5c356), X(0x74c41fdb), X(0x74d270b6), X(0x74e0b5e7), + X(0x74eeef71), X(0x74fd1d57), X(0x750b3f9a), X(0x7519563c), + X(0x75276140), X(0x753560a8), X(0x75435477), X(0x75513cae), + X(0x755f1951), X(0x756cea60), X(0x757aafdf), X(0x758869d1), + X(0x75961837), X(0x75a3bb14), X(0x75b1526a), X(0x75bede3c), + X(0x75cc5e8d), X(0x75d9d35f), X(0x75e73cb5), X(0x75f49a91), + X(0x7601ecf6), X(0x760f33e6), X(0x761c6f65), X(0x76299f74), + X(0x7636c417), X(0x7643dd51), X(0x7650eb24), X(0x765ded93), + X(0x766ae4a0), X(0x7677d050), X(0x7684b0a4), X(0x7691859f), + X(0x769e4f45), X(0x76ab0d98), X(0x76b7c09c), X(0x76c46852), + X(0x76d104bf), X(0x76dd95e6), X(0x76ea1bc9), X(0x76f6966b), + X(0x770305d0), X(0x770f69fb), X(0x771bc2ef), X(0x772810af), + X(0x7734533e), X(0x77408aa0), X(0x774cb6d7), X(0x7758d7e8), + X(0x7764edd5), X(0x7770f8a2), X(0x777cf852), X(0x7788ece8), + X(0x7794d668), X(0x77a0b4d5), X(0x77ac8833), X(0x77b85085), + X(0x77c40dce), X(0x77cfc013), X(0x77db6756), X(0x77e7039b), + X(0x77f294e6), X(0x77fe1b3b), X(0x7809969c), X(0x7815070e), + X(0x78206c93), X(0x782bc731), X(0x783716ea), X(0x78425bc3), + X(0x784d95be), X(0x7858c4e1), X(0x7863e92d), X(0x786f02a8), + X(0x787a1156), X(0x78851539), X(0x78900e56), X(0x789afcb1), + X(0x78a5e04d), X(0x78b0b92f), X(0x78bb875b), X(0x78c64ad4), + X(0x78d1039e), X(0x78dbb1be), X(0x78e65537), X(0x78f0ee0e), + X(0x78fb7c46), X(0x7905ffe4), X(0x791078ec), X(0x791ae762), + X(0x79254b4a), X(0x792fa4a7), X(0x7939f380), X(0x794437d7), + X(0x794e71b0), X(0x7958a111), X(0x7962c5fd), X(0x796ce078), + X(0x7976f087), X(0x7980f62f), X(0x798af173), X(0x7994e258), + X(0x799ec8e2), X(0x79a8a515), X(0x79b276f7), X(0x79bc3e8b), + X(0x79c5fbd6), X(0x79cfaedc), X(0x79d957a2), X(0x79e2f62c), + X(0x79ec8a7f), X(0x79f6149f), X(0x79ff9492), X(0x7a090a5a), + X(0x7a1275fe), X(0x7a1bd781), X(0x7a252ee9), X(0x7a2e7c39), + X(0x7a37bf77), X(0x7a40f8a7), X(0x7a4a27ce), X(0x7a534cf0), + X(0x7a5c6813), X(0x7a65793b), X(0x7a6e806d), X(0x7a777dad), + X(0x7a807100), X(0x7a895a6b), X(0x7a9239f4), X(0x7a9b0f9e), + X(0x7aa3db6f), X(0x7aac9d6b), X(0x7ab55597), X(0x7abe03f9), + X(0x7ac6a895), X(0x7acf4370), X(0x7ad7d48f), X(0x7ae05bf6), + X(0x7ae8d9ac), X(0x7af14db5), X(0x7af9b815), X(0x7b0218d2), + X(0x7b0a6ff2), X(0x7b12bd78), X(0x7b1b016a), X(0x7b233bce), + X(0x7b2b6ca7), X(0x7b3393fc), X(0x7b3bb1d1), X(0x7b43c62c), + X(0x7b4bd111), X(0x7b53d286), X(0x7b5bca90), X(0x7b63b935), + X(0x7b6b9e78), X(0x7b737a61), X(0x7b7b4cf3), X(0x7b831634), + X(0x7b8ad629), X(0x7b928cd8), X(0x7b9a3a45), X(0x7ba1de77), + X(0x7ba97972), X(0x7bb10b3c), X(0x7bb893d9), X(0x7bc01350), + X(0x7bc789a6), X(0x7bcef6e0), X(0x7bd65b03), X(0x7bddb616), + X(0x7be5081c), X(0x7bec511c), X(0x7bf3911b), X(0x7bfac81f), + X(0x7c01f62c), X(0x7c091b49), X(0x7c10377b), X(0x7c174ac7), + X(0x7c1e5532), X(0x7c2556c4), X(0x7c2c4f80), X(0x7c333f6c), + X(0x7c3a268e), X(0x7c4104ec), X(0x7c47da8a), X(0x7c4ea76f), + X(0x7c556ba1), X(0x7c5c2724), X(0x7c62d9fe), X(0x7c698435), + X(0x7c7025cf), X(0x7c76bed0), X(0x7c7d4f40), X(0x7c83d723), + X(0x7c8a567f), X(0x7c90cd5a), X(0x7c973bb9), X(0x7c9da1a2), + X(0x7ca3ff1b), X(0x7caa542a), X(0x7cb0a0d3), X(0x7cb6e51e), + X(0x7cbd210f), X(0x7cc354ac), X(0x7cc97ffc), X(0x7ccfa304), + X(0x7cd5bdc9), X(0x7cdbd051), X(0x7ce1daa3), X(0x7ce7dcc3), + X(0x7cedd6b8), X(0x7cf3c888), X(0x7cf9b238), X(0x7cff93cf), + X(0x7d056d51), X(0x7d0b3ec5), X(0x7d110830), X(0x7d16c99a), + X(0x7d1c8306), X(0x7d22347c), X(0x7d27de00), X(0x7d2d7f9a), + X(0x7d33194f), X(0x7d38ab24), X(0x7d3e351f), X(0x7d43b748), + X(0x7d4931a2), X(0x7d4ea435), X(0x7d540f06), X(0x7d59721b), + X(0x7d5ecd7b), X(0x7d64212a), X(0x7d696d2f), X(0x7d6eb190), + X(0x7d73ee53), X(0x7d79237e), X(0x7d7e5117), X(0x7d837723), + X(0x7d8895a9), X(0x7d8dacae), X(0x7d92bc3a), X(0x7d97c451), + X(0x7d9cc4f9), X(0x7da1be39), X(0x7da6b017), X(0x7dab9a99), + X(0x7db07dc4), X(0x7db5599e), X(0x7dba2e2f), X(0x7dbefb7b), + X(0x7dc3c189), X(0x7dc8805e), X(0x7dcd3802), X(0x7dd1e879), + X(0x7dd691ca), X(0x7ddb33fb), X(0x7ddfcf12), X(0x7de46315), + X(0x7de8f00a), X(0x7ded75f8), X(0x7df1f4e3), X(0x7df66cd3), + X(0x7dfaddcd), X(0x7dff47d7), X(0x7e03aaf8), X(0x7e080735), + X(0x7e0c5c95), X(0x7e10ab1e), X(0x7e14f2d5), X(0x7e1933c1), + X(0x7e1d6de8), X(0x7e21a150), X(0x7e25cdff), X(0x7e29f3fc), + X(0x7e2e134c), X(0x7e322bf5), X(0x7e363dfd), X(0x7e3a496b), + X(0x7e3e4e45), X(0x7e424c90), X(0x7e464454), X(0x7e4a3595), + X(0x7e4e205a), X(0x7e5204aa), X(0x7e55e289), X(0x7e59b9ff), + X(0x7e5d8b12), X(0x7e6155c7), X(0x7e651a24), X(0x7e68d831), + X(0x7e6c8ff2), X(0x7e70416e), X(0x7e73ecac), X(0x7e7791b0), + X(0x7e7b3082), X(0x7e7ec927), X(0x7e825ba6), X(0x7e85e804), + X(0x7e896e48), X(0x7e8cee77), X(0x7e906899), X(0x7e93dcb2), + X(0x7e974aca), X(0x7e9ab2e5), X(0x7e9e150b), X(0x7ea17141), + X(0x7ea4c78e), X(0x7ea817f7), X(0x7eab6283), X(0x7eaea737), + X(0x7eb1e61a), X(0x7eb51f33), X(0x7eb85285), X(0x7ebb8019), + X(0x7ebea7f4), X(0x7ec1ca1d), X(0x7ec4e698), X(0x7ec7fd6d), + X(0x7ecb0ea1), X(0x7ece1a3a), X(0x7ed1203f), X(0x7ed420b6), + X(0x7ed71ba4), X(0x7eda110f), X(0x7edd00ff), X(0x7edfeb78), + X(0x7ee2d081), X(0x7ee5b01f), X(0x7ee88a5a), X(0x7eeb5f36), + X(0x7eee2eba), X(0x7ef0f8ed), X(0x7ef3bdd3), X(0x7ef67d73), + X(0x7ef937d3), X(0x7efbecf9), X(0x7efe9ceb), X(0x7f0147ae), + X(0x7f03ed4a), X(0x7f068dc4), X(0x7f092922), X(0x7f0bbf69), + X(0x7f0e50a1), X(0x7f10dcce), X(0x7f1363f7), X(0x7f15e622), + X(0x7f186355), X(0x7f1adb95), X(0x7f1d4ee9), X(0x7f1fbd57), + X(0x7f2226e4), X(0x7f248b96), X(0x7f26eb74), X(0x7f294683), + X(0x7f2b9cc9), X(0x7f2dee4d), X(0x7f303b13), X(0x7f328322), + X(0x7f34c680), X(0x7f370533), X(0x7f393f40), X(0x7f3b74ad), + X(0x7f3da581), X(0x7f3fd1c1), X(0x7f41f972), X(0x7f441c9c), + X(0x7f463b43), X(0x7f48556d), X(0x7f4a6b21), X(0x7f4c7c64), + X(0x7f4e893c), X(0x7f5091ae), X(0x7f5295c1), X(0x7f54957a), + X(0x7f5690e0), X(0x7f5887f7), X(0x7f5a7ac5), X(0x7f5c6951), + X(0x7f5e53a0), X(0x7f6039b8), X(0x7f621b9e), X(0x7f63f958), + X(0x7f65d2ed), X(0x7f67a861), X(0x7f6979ba), X(0x7f6b46ff), + X(0x7f6d1034), X(0x7f6ed560), X(0x7f709687), X(0x7f7253b1), + X(0x7f740ce1), X(0x7f75c21f), X(0x7f777370), X(0x7f7920d8), + X(0x7f7aca5f), X(0x7f7c7008), X(0x7f7e11db), X(0x7f7fafdd), + X(0x7f814a13), X(0x7f82e082), X(0x7f847331), X(0x7f860224), + X(0x7f878d62), X(0x7f8914f0), X(0x7f8a98d4), X(0x7f8c1912), + X(0x7f8d95b0), X(0x7f8f0eb5), X(0x7f908425), X(0x7f91f605), + X(0x7f93645c), X(0x7f94cf2f), X(0x7f963683), X(0x7f979a5d), + X(0x7f98fac4), X(0x7f9a57bb), X(0x7f9bb14a), X(0x7f9d0775), + X(0x7f9e5a41), X(0x7f9fa9b4), X(0x7fa0f5d3), X(0x7fa23ea4), + X(0x7fa3842b), X(0x7fa4c66f), X(0x7fa60575), X(0x7fa74141), + X(0x7fa879d9), X(0x7fa9af42), X(0x7faae182), X(0x7fac109e), + X(0x7fad3c9a), X(0x7fae657d), X(0x7faf8b4c), X(0x7fb0ae0b), + X(0x7fb1cdc0), X(0x7fb2ea70), X(0x7fb40420), X(0x7fb51ad5), + X(0x7fb62e95), X(0x7fb73f64), X(0x7fb84d48), X(0x7fb95846), + X(0x7fba6062), X(0x7fbb65a2), X(0x7fbc680c), X(0x7fbd67a3), + X(0x7fbe646d), X(0x7fbf5e70), X(0x7fc055af), X(0x7fc14a31), + X(0x7fc23bf9), X(0x7fc32b0d), X(0x7fc41773), X(0x7fc5012e), + X(0x7fc5e844), X(0x7fc6ccba), X(0x7fc7ae94), X(0x7fc88dd8), + X(0x7fc96a8a), X(0x7fca44af), X(0x7fcb1c4c), X(0x7fcbf167), + X(0x7fccc403), X(0x7fcd9425), X(0x7fce61d3), X(0x7fcf2d11), + X(0x7fcff5e3), X(0x7fd0bc4f), X(0x7fd1805a), X(0x7fd24207), + X(0x7fd3015c), X(0x7fd3be5d), X(0x7fd47910), X(0x7fd53178), + X(0x7fd5e79b), X(0x7fd69b7c), X(0x7fd74d21), X(0x7fd7fc8e), + X(0x7fd8a9c8), X(0x7fd954d4), X(0x7fd9fdb5), X(0x7fdaa471), + X(0x7fdb490b), X(0x7fdbeb89), X(0x7fdc8bef), X(0x7fdd2a42), + X(0x7fddc685), X(0x7fde60be), X(0x7fdef8f0), X(0x7fdf8f20), + X(0x7fe02353), X(0x7fe0b58d), X(0x7fe145d3), X(0x7fe1d428), + X(0x7fe26091), X(0x7fe2eb12), X(0x7fe373b0), X(0x7fe3fa6f), + X(0x7fe47f53), X(0x7fe50260), X(0x7fe5839b), X(0x7fe60308), + X(0x7fe680ab), X(0x7fe6fc88), X(0x7fe776a4), X(0x7fe7ef02), + X(0x7fe865a7), X(0x7fe8da97), X(0x7fe94dd6), X(0x7fe9bf68), + X(0x7fea2f51), X(0x7fea9d95), X(0x7feb0a39), X(0x7feb7540), + X(0x7febdeae), X(0x7fec4687), X(0x7fecaccf), X(0x7fed118b), + X(0x7fed74be), X(0x7fedd66c), X(0x7fee3698), X(0x7fee9548), + X(0x7feef27e), X(0x7fef4e3f), X(0x7fefa88e), X(0x7ff0016f), + X(0x7ff058e7), X(0x7ff0aef8), X(0x7ff103a6), X(0x7ff156f6), + X(0x7ff1a8eb), X(0x7ff1f988), X(0x7ff248d2), X(0x7ff296cc), + X(0x7ff2e37a), X(0x7ff32edf), X(0x7ff378ff), X(0x7ff3c1de), + X(0x7ff4097e), X(0x7ff44fe5), X(0x7ff49515), X(0x7ff4d911), + X(0x7ff51bde), X(0x7ff55d7f), X(0x7ff59df7), X(0x7ff5dd4a), + X(0x7ff61b7b), X(0x7ff6588d), X(0x7ff69485), X(0x7ff6cf65), + X(0x7ff70930), X(0x7ff741eb), X(0x7ff77998), X(0x7ff7b03b), + X(0x7ff7e5d7), X(0x7ff81a6f), X(0x7ff84e06), X(0x7ff880a1), + X(0x7ff8b241), X(0x7ff8e2ea), X(0x7ff912a0), X(0x7ff94165), + X(0x7ff96f3d), X(0x7ff99c2b), X(0x7ff9c831), X(0x7ff9f354), + X(0x7ffa1d95), X(0x7ffa46f9), X(0x7ffa6f81), X(0x7ffa9731), + X(0x7ffabe0d), X(0x7ffae416), X(0x7ffb0951), X(0x7ffb2dbf), + X(0x7ffb5164), X(0x7ffb7442), X(0x7ffb965d), X(0x7ffbb7b8), + X(0x7ffbd854), X(0x7ffbf836), X(0x7ffc175f), X(0x7ffc35d3), + X(0x7ffc5394), X(0x7ffc70a5), X(0x7ffc8d09), X(0x7ffca8c2), + X(0x7ffcc3d4), X(0x7ffcde3f), X(0x7ffcf809), X(0x7ffd1132), + X(0x7ffd29be), X(0x7ffd41ae), X(0x7ffd5907), X(0x7ffd6fc9), + X(0x7ffd85f9), X(0x7ffd9b97), X(0x7ffdb0a7), X(0x7ffdc52b), + X(0x7ffdd926), X(0x7ffdec99), X(0x7ffdff88), X(0x7ffe11f4), + X(0x7ffe23e0), X(0x7ffe354f), X(0x7ffe4642), X(0x7ffe56bc), + X(0x7ffe66bf), X(0x7ffe764e), X(0x7ffe856a), X(0x7ffe9416), + X(0x7ffea254), X(0x7ffeb026), X(0x7ffebd8e), X(0x7ffeca8f), + X(0x7ffed72a), X(0x7ffee362), X(0x7ffeef38), X(0x7ffefaaf), + X(0x7fff05c9), X(0x7fff1087), X(0x7fff1aec), X(0x7fff24f9), + X(0x7fff2eb1), X(0x7fff3816), X(0x7fff4128), X(0x7fff49eb), + X(0x7fff5260), X(0x7fff5a88), X(0x7fff6266), X(0x7fff69fc), + X(0x7fff714b), X(0x7fff7854), X(0x7fff7f1a), X(0x7fff859f), + X(0x7fff8be3), X(0x7fff91ea), X(0x7fff97b3), X(0x7fff9d41), + X(0x7fffa296), X(0x7fffa7b3), X(0x7fffac99), X(0x7fffb14b), + X(0x7fffb5c9), X(0x7fffba15), X(0x7fffbe31), X(0x7fffc21d), + X(0x7fffc5dc), X(0x7fffc96f), X(0x7fffccd8), X(0x7fffd016), + X(0x7fffd32d), X(0x7fffd61c), X(0x7fffd8e7), X(0x7fffdb8d), + X(0x7fffde0f), X(0x7fffe071), X(0x7fffe2b1), X(0x7fffe4d2), + X(0x7fffe6d5), X(0x7fffe8bb), X(0x7fffea85), X(0x7fffec34), + X(0x7fffedc9), X(0x7fffef45), X(0x7ffff0aa), X(0x7ffff1f7), + X(0x7ffff330), X(0x7ffff453), X(0x7ffff562), X(0x7ffff65f), + X(0x7ffff749), X(0x7ffff823), X(0x7ffff8ec), X(0x7ffff9a6), + X(0x7ffffa51), X(0x7ffffaee), X(0x7ffffb7e), X(0x7ffffc02), + X(0x7ffffc7a), X(0x7ffffce7), X(0x7ffffd4a), X(0x7ffffda3), + X(0x7ffffdf4), X(0x7ffffe3c), X(0x7ffffe7c), X(0x7ffffeb6), + X(0x7ffffee8), X(0x7fffff15), X(0x7fffff3c), X(0x7fffff5e), + X(0x7fffff7b), X(0x7fffff95), X(0x7fffffaa), X(0x7fffffbc), + X(0x7fffffcb), X(0x7fffffd7), X(0x7fffffe2), X(0x7fffffea), + X(0x7ffffff0), X(0x7ffffff5), X(0x7ffffff9), X(0x7ffffffb), + X(0x7ffffffd), X(0x7ffffffe), X(0x7fffffff), X(0x7fffffff), + X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), +}; + +static const LOOKUP_T vwin8192[4096] = { + X(0x0000007c), X(0x0000045c), X(0x00000c1d), X(0x000017bd), + X(0x0000273e), X(0x00003a9f), X(0x000051e0), X(0x00006d02), + X(0x00008c03), X(0x0000aee5), X(0x0000d5a7), X(0x00010049), + X(0x00012ecb), X(0x0001612d), X(0x00019770), X(0x0001d193), + X(0x00020f96), X(0x00025178), X(0x0002973c), X(0x0002e0df), + X(0x00032e62), X(0x00037fc5), X(0x0003d509), X(0x00042e2c), + X(0x00048b30), X(0x0004ec13), X(0x000550d7), X(0x0005b97a), + X(0x000625fe), X(0x00069661), X(0x00070aa4), X(0x000782c8), + X(0x0007fecb), X(0x00087eae), X(0x00090271), X(0x00098a14), + X(0x000a1597), X(0x000aa4f9), X(0x000b383b), X(0x000bcf5d), + X(0x000c6a5f), X(0x000d0941), X(0x000dac02), X(0x000e52a3), + X(0x000efd23), X(0x000fab84), X(0x00105dc3), X(0x001113e3), + X(0x0011cde2), X(0x00128bc0), X(0x00134d7e), X(0x0014131b), + X(0x0014dc98), X(0x0015a9f4), X(0x00167b30), X(0x0017504a), + X(0x00182945), X(0x0019061e), X(0x0019e6d7), X(0x001acb6f), + X(0x001bb3e6), X(0x001ca03c), X(0x001d9071), X(0x001e8485), + X(0x001f7c79), X(0x0020784b), X(0x002177fc), X(0x00227b8c), + X(0x002382fb), X(0x00248e49), X(0x00259d76), X(0x0026b081), + X(0x0027c76b), X(0x0028e234), X(0x002a00dc), X(0x002b2361), + X(0x002c49c6), X(0x002d7409), X(0x002ea22a), X(0x002fd42a), + X(0x00310a08), X(0x003243c5), X(0x00338160), X(0x0034c2d9), + X(0x00360830), X(0x00375165), X(0x00389e78), X(0x0039ef6a), + X(0x003b4439), X(0x003c9ce6), X(0x003df971), X(0x003f59da), + X(0x0040be20), X(0x00422645), X(0x00439247), X(0x00450226), + X(0x004675e3), X(0x0047ed7e), X(0x004968f5), X(0x004ae84b), + X(0x004c6b7d), X(0x004df28d), X(0x004f7d7a), X(0x00510c44), + X(0x00529eeb), X(0x00543570), X(0x0055cfd1), X(0x00576e0f), + X(0x00591029), X(0x005ab621), X(0x005c5ff5), X(0x005e0da6), + X(0x005fbf33), X(0x0061749d), X(0x00632de4), X(0x0064eb06), + X(0x0066ac05), X(0x006870e0), X(0x006a3998), X(0x006c062b), + X(0x006dd69b), X(0x006faae6), X(0x0071830d), X(0x00735f10), + X(0x00753eef), X(0x007722a9), X(0x00790a3f), X(0x007af5b1), + X(0x007ce4fe), X(0x007ed826), X(0x0080cf29), X(0x0082ca08), + X(0x0084c8c2), X(0x0086cb57), X(0x0088d1c7), X(0x008adc11), + X(0x008cea37), X(0x008efc37), X(0x00911212), X(0x00932bc7), + X(0x00954957), X(0x00976ac2), X(0x00999006), X(0x009bb925), + X(0x009de61e), X(0x00a016f1), X(0x00a24b9e), X(0x00a48425), + X(0x00a6c086), X(0x00a900c0), X(0x00ab44d4), X(0x00ad8cc2), + X(0x00afd889), X(0x00b22829), X(0x00b47ba2), X(0x00b6d2f5), + X(0x00b92e21), X(0x00bb8d26), X(0x00bdf004), X(0x00c056ba), + X(0x00c2c149), X(0x00c52fb1), X(0x00c7a1f1), X(0x00ca180a), + X(0x00cc91fb), X(0x00cf0fc5), X(0x00d19166), X(0x00d416df), + X(0x00d6a031), X(0x00d92d5a), X(0x00dbbe5b), X(0x00de5333), + X(0x00e0ebe3), X(0x00e3886b), X(0x00e628c9), X(0x00e8ccff), + X(0x00eb750c), X(0x00ee20f0), X(0x00f0d0ab), X(0x00f3843d), + X(0x00f63ba5), X(0x00f8f6e4), X(0x00fbb5fa), X(0x00fe78e5), + X(0x01013fa7), X(0x01040a3f), X(0x0106d8ae), X(0x0109aaf2), + X(0x010c810c), X(0x010f5afb), X(0x011238c0), X(0x01151a5b), + X(0x0117ffcb), X(0x011ae910), X(0x011dd62a), X(0x0120c719), + X(0x0123bbdd), X(0x0126b476), X(0x0129b0e4), X(0x012cb126), + X(0x012fb53c), X(0x0132bd27), X(0x0135c8e6), X(0x0138d879), + X(0x013bebdf), X(0x013f031a), X(0x01421e28), X(0x01453d0a), + X(0x01485fbf), X(0x014b8648), X(0x014eb0a4), X(0x0151ded2), + X(0x015510d4), X(0x015846a8), X(0x015b8050), X(0x015ebdc9), + X(0x0161ff15), X(0x01654434), X(0x01688d24), X(0x016bd9e6), + X(0x016f2a7b), X(0x01727ee1), X(0x0175d718), X(0x01793321), + X(0x017c92fc), X(0x017ff6a7), X(0x01835e24), X(0x0186c972), + X(0x018a3890), X(0x018dab7f), X(0x0191223f), X(0x01949ccf), + X(0x01981b2f), X(0x019b9d5f), X(0x019f235f), X(0x01a2ad2f), + X(0x01a63acf), X(0x01a9cc3e), X(0x01ad617c), X(0x01b0fa8a), + X(0x01b49767), X(0x01b83813), X(0x01bbdc8d), X(0x01bf84d6), + X(0x01c330ee), X(0x01c6e0d4), X(0x01ca9488), X(0x01ce4c0b), + X(0x01d2075b), X(0x01d5c679), X(0x01d98964), X(0x01dd501d), + X(0x01e11aa3), X(0x01e4e8f6), X(0x01e8bb17), X(0x01ec9104), + X(0x01f06abd), X(0x01f44844), X(0x01f82996), X(0x01fc0eb5), + X(0x01fff7a0), X(0x0203e456), X(0x0207d4d9), X(0x020bc926), + X(0x020fc140), X(0x0213bd24), X(0x0217bcd4), X(0x021bc04e), + X(0x021fc793), X(0x0223d2a3), X(0x0227e17d), X(0x022bf421), + X(0x02300a90), X(0x023424c8), X(0x023842ca), X(0x023c6495), + X(0x02408a2a), X(0x0244b389), X(0x0248e0b0), X(0x024d11a0), + X(0x02514659), X(0x02557eda), X(0x0259bb24), X(0x025dfb35), + X(0x02623f0f), X(0x026686b1), X(0x026ad21a), X(0x026f214b), + X(0x02737443), X(0x0277cb02), X(0x027c2588), X(0x028083d5), + X(0x0284e5e9), X(0x02894bc2), X(0x028db562), X(0x029222c8), + X(0x029693f4), X(0x029b08e6), X(0x029f819d), X(0x02a3fe19), + X(0x02a87e5b), X(0x02ad0261), X(0x02b18a2c), X(0x02b615bb), + X(0x02baa50f), X(0x02bf3827), X(0x02c3cf03), X(0x02c869a3), + X(0x02cd0807), X(0x02d1aa2d), X(0x02d65017), X(0x02daf9c4), + X(0x02dfa734), X(0x02e45866), X(0x02e90d5b), X(0x02edc612), + X(0x02f2828b), X(0x02f742c6), X(0x02fc06c3), X(0x0300ce80), + X(0x030599ff), X(0x030a6940), X(0x030f3c40), X(0x03141302), + X(0x0318ed84), X(0x031dcbc6), X(0x0322adc8), X(0x0327938a), + X(0x032c7d0c), X(0x03316a4c), X(0x03365b4d), X(0x033b500c), + X(0x03404889), X(0x034544c6), X(0x034a44c0), X(0x034f4879), + X(0x03544ff0), X(0x03595b24), X(0x035e6a16), X(0x03637cc5), + X(0x03689331), X(0x036dad5a), X(0x0372cb40), X(0x0377ece2), + X(0x037d1240), X(0x03823b5a), X(0x03876830), X(0x038c98c1), + X(0x0391cd0e), X(0x03970516), X(0x039c40d8), X(0x03a18055), + X(0x03a6c38d), X(0x03ac0a7f), X(0x03b1552b), X(0x03b6a390), + X(0x03bbf5af), X(0x03c14b88), X(0x03c6a519), X(0x03cc0263), + X(0x03d16366), X(0x03d6c821), X(0x03dc3094), X(0x03e19cc0), + X(0x03e70ca2), X(0x03ec803d), X(0x03f1f78e), X(0x03f77296), + X(0x03fcf155), X(0x040273cb), X(0x0407f9f7), X(0x040d83d9), + X(0x04131170), X(0x0418a2bd), X(0x041e37c0), X(0x0423d077), + X(0x04296ce4), X(0x042f0d04), X(0x0434b0da), X(0x043a5863), + X(0x044003a0), X(0x0445b290), X(0x044b6534), X(0x04511b8b), + X(0x0456d595), X(0x045c9352), X(0x046254c1), X(0x046819e1), + X(0x046de2b4), X(0x0473af39), X(0x04797f6e), X(0x047f5355), + X(0x04852aec), X(0x048b0635), X(0x0490e52d), X(0x0496c7d6), + X(0x049cae2e), X(0x04a29836), X(0x04a885ed), X(0x04ae7753), + X(0x04b46c68), X(0x04ba652b), X(0x04c0619d), X(0x04c661bc), + X(0x04cc658a), X(0x04d26d04), X(0x04d8782c), X(0x04de8701), + X(0x04e49983), X(0x04eaafb0), X(0x04f0c98a), X(0x04f6e710), + X(0x04fd0842), X(0x05032d1e), X(0x050955a6), X(0x050f81d8), + X(0x0515b1b5), X(0x051be53d), X(0x05221c6e), X(0x05285748), + X(0x052e95cd), X(0x0534d7fa), X(0x053b1dd0), X(0x0541674e), + X(0x0547b475), X(0x054e0544), X(0x055459bb), X(0x055ab1d9), + X(0x05610d9e), X(0x05676d0a), X(0x056dd01c), X(0x057436d5), + X(0x057aa134), X(0x05810f38), X(0x058780e2), X(0x058df631), + X(0x05946f25), X(0x059aebbe), X(0x05a16bfa), X(0x05a7efdb), + X(0x05ae775f), X(0x05b50287), X(0x05bb9152), X(0x05c223c0), + X(0x05c8b9d0), X(0x05cf5382), X(0x05d5f0d6), X(0x05dc91cc), + X(0x05e33663), X(0x05e9de9c), X(0x05f08a75), X(0x05f739ee), + X(0x05fded07), X(0x0604a3c0), X(0x060b5e19), X(0x06121c11), + X(0x0618dda8), X(0x061fa2dd), X(0x06266bb1), X(0x062d3822), + X(0x06340831), X(0x063adbde), X(0x0641b328), X(0x06488e0e), + X(0x064f6c91), X(0x06564eaf), X(0x065d346a), X(0x06641dc0), + X(0x066b0ab1), X(0x0671fb3d), X(0x0678ef64), X(0x067fe724), + X(0x0686e27f), X(0x068de173), X(0x0694e400), X(0x069bea27), + X(0x06a2f3e6), X(0x06aa013d), X(0x06b1122c), X(0x06b826b3), + X(0x06bf3ed1), X(0x06c65a86), X(0x06cd79d1), X(0x06d49cb3), + X(0x06dbc32b), X(0x06e2ed38), X(0x06ea1adb), X(0x06f14c13), + X(0x06f880df), X(0x06ffb940), X(0x0706f535), X(0x070e34bd), + X(0x071577d9), X(0x071cbe88), X(0x072408c9), X(0x072b569d), + X(0x0732a802), X(0x0739fcf9), X(0x07415582), X(0x0748b19b), + X(0x07501145), X(0x0757747f), X(0x075edb49), X(0x076645a3), + X(0x076db38c), X(0x07752503), X(0x077c9a09), X(0x0784129e), + X(0x078b8ec0), X(0x07930e70), X(0x079a91ac), X(0x07a21876), + X(0x07a9a2cc), X(0x07b130ad), X(0x07b8c21b), X(0x07c05714), + X(0x07c7ef98), X(0x07cf8ba6), X(0x07d72b3f), X(0x07dece62), + X(0x07e6750e), X(0x07ee1f43), X(0x07f5cd01), X(0x07fd7e48), + X(0x08053316), X(0x080ceb6d), X(0x0814a74a), X(0x081c66af), + X(0x0824299a), X(0x082bf00c), X(0x0833ba03), X(0x083b8780), + X(0x08435882), X(0x084b2d09), X(0x08530514), X(0x085ae0a3), + X(0x0862bfb6), X(0x086aa24c), X(0x08728865), X(0x087a7201), + X(0x08825f1e), X(0x088a4fbe), X(0x089243de), X(0x089a3b80), + X(0x08a236a2), X(0x08aa3545), X(0x08b23767), X(0x08ba3d09), + X(0x08c2462a), X(0x08ca52c9), X(0x08d262e7), X(0x08da7682), + X(0x08e28d9c), X(0x08eaa832), X(0x08f2c645), X(0x08fae7d4), + X(0x09030cdf), X(0x090b3566), X(0x09136168), X(0x091b90e5), + X(0x0923c3dc), X(0x092bfa4d), X(0x09343437), X(0x093c719b), + X(0x0944b277), X(0x094cf6cc), X(0x09553e99), X(0x095d89dd), + X(0x0965d899), X(0x096e2acb), X(0x09768073), X(0x097ed991), + X(0x09873625), X(0x098f962e), X(0x0997f9ac), X(0x09a0609e), + X(0x09a8cb04), X(0x09b138dd), X(0x09b9aa29), X(0x09c21ee8), + X(0x09ca9719), X(0x09d312bc), X(0x09db91d0), X(0x09e41456), + X(0x09ec9a4b), X(0x09f523b1), X(0x09fdb087), X(0x0a0640cc), + X(0x0a0ed47f), X(0x0a176ba2), X(0x0a200632), X(0x0a28a42f), + X(0x0a31459a), X(0x0a39ea72), X(0x0a4292b5), X(0x0a4b3e65), + X(0x0a53ed80), X(0x0a5ca006), X(0x0a6555f7), X(0x0a6e0f51), + X(0x0a76cc16), X(0x0a7f8c44), X(0x0a884fda), X(0x0a9116d9), + X(0x0a99e140), X(0x0aa2af0e), X(0x0aab8043), X(0x0ab454df), + X(0x0abd2ce1), X(0x0ac60849), X(0x0acee716), X(0x0ad7c948), + X(0x0ae0aedf), X(0x0ae997d9), X(0x0af28437), X(0x0afb73f7), + X(0x0b04671b), X(0x0b0d5da0), X(0x0b165788), X(0x0b1f54d0), + X(0x0b285579), X(0x0b315983), X(0x0b3a60ec), X(0x0b436bb5), + X(0x0b4c79dd), X(0x0b558b63), X(0x0b5ea048), X(0x0b67b88a), + X(0x0b70d429), X(0x0b79f324), X(0x0b83157c), X(0x0b8c3b30), + X(0x0b95643f), X(0x0b9e90a8), X(0x0ba7c06c), X(0x0bb0f38a), + X(0x0bba2a01), X(0x0bc363d1), X(0x0bcca0f9), X(0x0bd5e17a), + X(0x0bdf2552), X(0x0be86c81), X(0x0bf1b706), X(0x0bfb04e2), + X(0x0c045613), X(0x0c0daa99), X(0x0c170274), X(0x0c205da3), + X(0x0c29bc25), X(0x0c331dfb), X(0x0c3c8323), X(0x0c45eb9e), + X(0x0c4f576a), X(0x0c58c688), X(0x0c6238f6), X(0x0c6baeb5), + X(0x0c7527c3), X(0x0c7ea421), X(0x0c8823cd), X(0x0c91a6c8), + X(0x0c9b2d10), X(0x0ca4b6a6), X(0x0cae4389), X(0x0cb7d3b8), + X(0x0cc16732), X(0x0ccafdf8), X(0x0cd49809), X(0x0cde3564), + X(0x0ce7d609), X(0x0cf179f7), X(0x0cfb212e), X(0x0d04cbad), + X(0x0d0e7974), X(0x0d182a83), X(0x0d21ded8), X(0x0d2b9673), + X(0x0d355154), X(0x0d3f0f7b), X(0x0d48d0e6), X(0x0d529595), + X(0x0d5c5d88), X(0x0d6628be), X(0x0d6ff737), X(0x0d79c8f2), + X(0x0d839dee), X(0x0d8d762c), X(0x0d9751aa), X(0x0da13068), + X(0x0dab1266), X(0x0db4f7a3), X(0x0dbee01e), X(0x0dc8cbd8), + X(0x0dd2bace), X(0x0ddcad02), X(0x0de6a272), X(0x0df09b1e), + X(0x0dfa9705), X(0x0e049627), X(0x0e0e9883), X(0x0e189e19), + X(0x0e22a6e8), X(0x0e2cb2f0), X(0x0e36c230), X(0x0e40d4a8), + X(0x0e4aea56), X(0x0e55033b), X(0x0e5f1f56), X(0x0e693ea7), + X(0x0e73612c), X(0x0e7d86e5), X(0x0e87afd3), X(0x0e91dbf3), + X(0x0e9c0b47), X(0x0ea63dcc), X(0x0eb07383), X(0x0ebaac6b), + X(0x0ec4e883), X(0x0ecf27cc), X(0x0ed96a44), X(0x0ee3afea), + X(0x0eedf8bf), X(0x0ef844c2), X(0x0f0293f2), X(0x0f0ce64e), + X(0x0f173bd6), X(0x0f21948a), X(0x0f2bf069), X(0x0f364f72), + X(0x0f40b1a5), X(0x0f4b1701), X(0x0f557f86), X(0x0f5feb32), + X(0x0f6a5a07), X(0x0f74cc02), X(0x0f7f4124), X(0x0f89b96b), + X(0x0f9434d8), X(0x0f9eb369), X(0x0fa9351e), X(0x0fb3b9f7), + X(0x0fbe41f3), X(0x0fc8cd11), X(0x0fd35b51), X(0x0fddecb2), + X(0x0fe88134), X(0x0ff318d6), X(0x0ffdb397), X(0x10085177), + X(0x1012f275), X(0x101d9691), X(0x10283dca), X(0x1032e81f), + X(0x103d9591), X(0x1048461e), X(0x1052f9c5), X(0x105db087), + X(0x10686a62), X(0x10732756), X(0x107de763), X(0x1088aa87), + X(0x109370c2), X(0x109e3a14), X(0x10a9067c), X(0x10b3d5f9), + X(0x10bea88b), X(0x10c97e31), X(0x10d456eb), X(0x10df32b8), + X(0x10ea1197), X(0x10f4f387), X(0x10ffd889), X(0x110ac09b), + X(0x1115abbe), X(0x112099ef), X(0x112b8b2f), X(0x11367f7d), + X(0x114176d9), X(0x114c7141), X(0x11576eb6), X(0x11626f36), + X(0x116d72c1), X(0x11787957), X(0x118382f6), X(0x118e8f9e), + X(0x11999f4f), X(0x11a4b208), X(0x11afc7c7), X(0x11bae08e), + X(0x11c5fc5a), X(0x11d11b2c), X(0x11dc3d02), X(0x11e761dd), + X(0x11f289ba), X(0x11fdb49b), X(0x1208e27e), X(0x12141362), + X(0x121f4748), X(0x122a7e2d), X(0x1235b812), X(0x1240f4f6), + X(0x124c34d9), X(0x125777b9), X(0x1262bd96), X(0x126e0670), + X(0x12795245), X(0x1284a115), X(0x128ff2e0), X(0x129b47a5), + X(0x12a69f63), X(0x12b1fa19), X(0x12bd57c7), X(0x12c8b86c), + X(0x12d41c08), X(0x12df829a), X(0x12eaec21), X(0x12f6589d), + X(0x1301c80c), X(0x130d3a6f), X(0x1318afc4), X(0x1324280b), + X(0x132fa344), X(0x133b216d), X(0x1346a286), X(0x1352268e), + X(0x135dad85), X(0x1369376a), X(0x1374c43c), X(0x138053fb), + X(0x138be6a5), X(0x13977c3b), X(0x13a314bc), X(0x13aeb026), + X(0x13ba4e79), X(0x13c5efb5), X(0x13d193d9), X(0x13dd3ae4), + X(0x13e8e4d6), X(0x13f491ad), X(0x1400416a), X(0x140bf40b), + X(0x1417a98f), X(0x142361f7), X(0x142f1d41), X(0x143adb6d), + X(0x14469c7a), X(0x14526067), X(0x145e2734), X(0x1469f0df), + X(0x1475bd69), X(0x14818cd0), X(0x148d5f15), X(0x14993435), + X(0x14a50c31), X(0x14b0e708), X(0x14bcc4b8), X(0x14c8a542), + X(0x14d488a5), X(0x14e06edf), X(0x14ec57f1), X(0x14f843d9), + X(0x15043297), X(0x1510242b), X(0x151c1892), X(0x15280fcd), + X(0x153409dc), X(0x154006bc), X(0x154c066e), X(0x155808f1), + X(0x15640e44), X(0x15701666), X(0x157c2157), X(0x15882f16), + X(0x15943fa2), X(0x15a052fb), X(0x15ac691f), X(0x15b8820f), + X(0x15c49dc8), X(0x15d0bc4c), X(0x15dcdd98), X(0x15e901ad), + X(0x15f52888), X(0x1601522b), X(0x160d7e93), X(0x1619adc1), + X(0x1625dfb3), X(0x16321469), X(0x163e4be2), X(0x164a861d), + X(0x1656c31a), X(0x166302d8), X(0x166f4555), X(0x167b8a92), + X(0x1687d28e), X(0x16941d47), X(0x16a06abe), X(0x16acbaf0), + X(0x16b90ddf), X(0x16c56388), X(0x16d1bbeb), X(0x16de1708), + X(0x16ea74dd), X(0x16f6d56a), X(0x170338ae), X(0x170f9ea8), + X(0x171c0758), X(0x172872bd), X(0x1734e0d6), X(0x174151a2), + X(0x174dc520), X(0x175a3b51), X(0x1766b432), X(0x17732fc4), + X(0x177fae05), X(0x178c2ef4), X(0x1798b292), X(0x17a538dd), + X(0x17b1c1d4), X(0x17be4d77), X(0x17cadbc5), X(0x17d76cbc), + X(0x17e4005e), X(0x17f096a7), X(0x17fd2f98), X(0x1809cb31), + X(0x1816696f), X(0x18230a53), X(0x182faddc), X(0x183c5408), + X(0x1848fcd8), X(0x1855a849), X(0x1862565d), X(0x186f0711), + X(0x187bba64), X(0x18887057), X(0x189528e9), X(0x18a1e418), + X(0x18aea1e3), X(0x18bb624b), X(0x18c8254e), X(0x18d4eaeb), + X(0x18e1b321), X(0x18ee7df1), X(0x18fb4b58), X(0x19081b57), + X(0x1914edec), X(0x1921c317), X(0x192e9ad6), X(0x193b7529), + X(0x19485210), X(0x19553189), X(0x19621393), X(0x196ef82e), + X(0x197bdf59), X(0x1988c913), X(0x1995b55c), X(0x19a2a432), + X(0x19af9595), X(0x19bc8983), X(0x19c97ffd), X(0x19d67900), + X(0x19e3748e), X(0x19f072a3), X(0x19fd7341), X(0x1a0a7665), + X(0x1a177c10), X(0x1a248440), X(0x1a318ef4), X(0x1a3e9c2c), + X(0x1a4babe7), X(0x1a58be24), X(0x1a65d2e2), X(0x1a72ea20), + X(0x1a8003de), X(0x1a8d201a), X(0x1a9a3ed5), X(0x1aa7600c), + X(0x1ab483bf), X(0x1ac1a9ee), X(0x1aced297), X(0x1adbfdba), + X(0x1ae92b56), X(0x1af65b69), X(0x1b038df4), X(0x1b10c2f5), + X(0x1b1dfa6b), X(0x1b2b3456), X(0x1b3870b5), X(0x1b45af87), + X(0x1b52f0ca), X(0x1b60347f), X(0x1b6d7aa4), X(0x1b7ac339), + X(0x1b880e3c), X(0x1b955bad), X(0x1ba2ab8b), X(0x1baffdd5), + X(0x1bbd528a), X(0x1bcaa9a9), X(0x1bd80332), X(0x1be55f24), + X(0x1bf2bd7d), X(0x1c001e3d), X(0x1c0d8164), X(0x1c1ae6ef), + X(0x1c284edf), X(0x1c35b932), X(0x1c4325e7), X(0x1c5094fe), + X(0x1c5e0677), X(0x1c6b7a4f), X(0x1c78f086), X(0x1c86691b), + X(0x1c93e40d), X(0x1ca1615c), X(0x1caee107), X(0x1cbc630c), + X(0x1cc9e76b), X(0x1cd76e23), X(0x1ce4f733), X(0x1cf2829a), + X(0x1d001057), X(0x1d0da06a), X(0x1d1b32d1), X(0x1d28c78c), + X(0x1d365e9a), X(0x1d43f7f9), X(0x1d5193a9), X(0x1d5f31aa), + X(0x1d6cd1f9), X(0x1d7a7497), X(0x1d881982), X(0x1d95c0ba), + X(0x1da36a3d), X(0x1db1160a), X(0x1dbec422), X(0x1dcc7482), + X(0x1dda272b), X(0x1de7dc1a), X(0x1df59350), X(0x1e034ccb), + X(0x1e11088a), X(0x1e1ec68c), X(0x1e2c86d1), X(0x1e3a4958), + X(0x1e480e20), X(0x1e55d527), X(0x1e639e6d), X(0x1e7169f1), + X(0x1e7f37b2), X(0x1e8d07b0), X(0x1e9ad9e8), X(0x1ea8ae5b), + X(0x1eb68507), X(0x1ec45dec), X(0x1ed23908), X(0x1ee0165b), + X(0x1eedf5e4), X(0x1efbd7a1), X(0x1f09bb92), X(0x1f17a1b6), + X(0x1f258a0d), X(0x1f337494), X(0x1f41614b), X(0x1f4f5032), + X(0x1f5d4147), X(0x1f6b3489), X(0x1f7929f7), X(0x1f872192), + X(0x1f951b56), X(0x1fa31744), X(0x1fb1155b), X(0x1fbf159a), + X(0x1fcd17ff), X(0x1fdb1c8b), X(0x1fe9233b), X(0x1ff72c0f), + X(0x20053706), X(0x20134420), X(0x2021535a), X(0x202f64b4), + X(0x203d782e), X(0x204b8dc6), X(0x2059a57c), X(0x2067bf4e), + X(0x2075db3b), X(0x2083f943), X(0x20921964), X(0x20a03b9e), + X(0x20ae5fef), X(0x20bc8657), X(0x20caaed5), X(0x20d8d967), + X(0x20e7060e), X(0x20f534c7), X(0x21036592), X(0x2111986e), + X(0x211fcd59), X(0x212e0454), X(0x213c3d5d), X(0x214a7873), + X(0x2158b594), X(0x2166f4c1), X(0x217535f8), X(0x21837938), + X(0x2191be81), X(0x21a005d0), X(0x21ae4f26), X(0x21bc9a81), + X(0x21cae7e0), X(0x21d93743), X(0x21e788a8), X(0x21f5dc0e), + X(0x22043174), X(0x221288da), X(0x2220e23e), X(0x222f3da0), + X(0x223d9afe), X(0x224bfa58), X(0x225a5bac), X(0x2268bef9), + X(0x2277243f), X(0x22858b7d), X(0x2293f4b0), X(0x22a25fda), + X(0x22b0ccf8), X(0x22bf3c09), X(0x22cdad0d), X(0x22dc2002), + X(0x22ea94e8), X(0x22f90bbe), X(0x23078482), X(0x2315ff33), + X(0x23247bd1), X(0x2332fa5b), X(0x23417acf), X(0x234ffd2c), + X(0x235e8173), X(0x236d07a0), X(0x237b8fb4), X(0x238a19ae), + X(0x2398a58c), X(0x23a7334d), X(0x23b5c2f1), X(0x23c45477), + X(0x23d2e7dd), X(0x23e17d22), X(0x23f01446), X(0x23fead47), + X(0x240d4825), X(0x241be4dd), X(0x242a8371), X(0x243923dd), + X(0x2447c622), X(0x24566a3e), X(0x24651031), X(0x2473b7f8), + X(0x24826194), X(0x24910d03), X(0x249fba44), X(0x24ae6957), + X(0x24bd1a39), X(0x24cbccea), X(0x24da816a), X(0x24e937b7), + X(0x24f7efcf), X(0x2506a9b3), X(0x25156560), X(0x252422d6), + X(0x2532e215), X(0x2541a31a), X(0x255065e4), X(0x255f2a74), + X(0x256df0c7), X(0x257cb8dd), X(0x258b82b4), X(0x259a4e4c), + X(0x25a91ba4), X(0x25b7eaba), X(0x25c6bb8e), X(0x25d58e1e), + X(0x25e46269), X(0x25f3386e), X(0x2602102d), X(0x2610e9a4), + X(0x261fc4d3), X(0x262ea1b7), X(0x263d8050), X(0x264c609e), + X(0x265b429e), X(0x266a2650), X(0x26790bb3), X(0x2687f2c6), + X(0x2696db88), X(0x26a5c5f7), X(0x26b4b213), X(0x26c39fda), + X(0x26d28f4c), X(0x26e18067), X(0x26f0732b), X(0x26ff6796), + X(0x270e5da7), X(0x271d555d), X(0x272c4eb7), X(0x273b49b5), + X(0x274a4654), X(0x27594495), X(0x27684475), X(0x277745f4), + X(0x27864910), X(0x27954dc9), X(0x27a4541e), X(0x27b35c0d), + X(0x27c26596), X(0x27d170b7), X(0x27e07d6f), X(0x27ef8bbd), + X(0x27fe9ba0), X(0x280dad18), X(0x281cc022), X(0x282bd4be), + X(0x283aeaeb), X(0x284a02a7), X(0x28591bf2), X(0x286836cb), + X(0x28775330), X(0x28867120), X(0x2895909b), X(0x28a4b19e), + X(0x28b3d42a), X(0x28c2f83d), X(0x28d21dd5), X(0x28e144f3), + X(0x28f06d94), X(0x28ff97b8), X(0x290ec35d), X(0x291df082), + X(0x292d1f27), X(0x293c4f4a), X(0x294b80eb), X(0x295ab407), + X(0x2969e89e), X(0x29791eaf), X(0x29885639), X(0x29978f3b), + X(0x29a6c9b3), X(0x29b605a0), X(0x29c54302), X(0x29d481d7), + X(0x29e3c21e), X(0x29f303d6), X(0x2a0246fd), X(0x2a118b94), + X(0x2a20d198), X(0x2a301909), X(0x2a3f61e6), X(0x2a4eac2c), + X(0x2a5df7dc), X(0x2a6d44f4), X(0x2a7c9374), X(0x2a8be359), + X(0x2a9b34a2), X(0x2aaa8750), X(0x2ab9db60), X(0x2ac930d1), + X(0x2ad887a3), X(0x2ae7dfd3), X(0x2af73962), X(0x2b06944e), + X(0x2b15f096), X(0x2b254e38), X(0x2b34ad34), X(0x2b440d89), + X(0x2b536f34), X(0x2b62d236), X(0x2b72368d), X(0x2b819c38), + X(0x2b910336), X(0x2ba06b86), X(0x2bafd526), X(0x2bbf4015), + X(0x2bceac53), X(0x2bde19de), X(0x2bed88b5), X(0x2bfcf8d7), + X(0x2c0c6a43), X(0x2c1bdcf7), X(0x2c2b50f3), X(0x2c3ac635), + X(0x2c4a3cbd), X(0x2c59b488), X(0x2c692d97), X(0x2c78a7e7), + X(0x2c882378), X(0x2c97a049), X(0x2ca71e58), X(0x2cb69da4), + X(0x2cc61e2c), X(0x2cd59ff0), X(0x2ce522ed), X(0x2cf4a723), + X(0x2d042c90), X(0x2d13b334), X(0x2d233b0d), X(0x2d32c41a), + X(0x2d424e5a), X(0x2d51d9cc), X(0x2d61666e), X(0x2d70f440), + X(0x2d808340), X(0x2d90136e), X(0x2d9fa4c7), X(0x2daf374c), + X(0x2dbecafa), X(0x2dce5fd1), X(0x2dddf5cf), X(0x2ded8cf4), + X(0x2dfd253d), X(0x2e0cbeab), X(0x2e1c593b), X(0x2e2bf4ed), + X(0x2e3b91c0), X(0x2e4b2fb1), X(0x2e5acec1), X(0x2e6a6eee), + X(0x2e7a1037), X(0x2e89b29b), X(0x2e995618), X(0x2ea8faad), + X(0x2eb8a05a), X(0x2ec8471c), X(0x2ed7eef4), X(0x2ee797df), + X(0x2ef741dc), X(0x2f06eceb), X(0x2f16990a), X(0x2f264639), + X(0x2f35f475), X(0x2f45a3bd), X(0x2f555412), X(0x2f650570), + X(0x2f74b7d8), X(0x2f846b48), X(0x2f941fbe), X(0x2fa3d53a), + X(0x2fb38bbb), X(0x2fc3433f), X(0x2fd2fbc5), X(0x2fe2b54c), + X(0x2ff26fd3), X(0x30022b58), X(0x3011e7db), X(0x3021a55a), + X(0x303163d4), X(0x30412348), X(0x3050e3b5), X(0x3060a519), + X(0x30706773), X(0x30802ac3), X(0x308fef06), X(0x309fb43d), + X(0x30af7a65), X(0x30bf417d), X(0x30cf0985), X(0x30ded27a), + X(0x30ee9c5d), X(0x30fe672b), X(0x310e32e3), X(0x311dff85), + X(0x312dcd0f), X(0x313d9b80), X(0x314d6ad7), X(0x315d3b12), + X(0x316d0c30), X(0x317cde31), X(0x318cb113), X(0x319c84d4), + X(0x31ac5974), X(0x31bc2ef1), X(0x31cc054b), X(0x31dbdc7f), + X(0x31ebb48e), X(0x31fb8d74), X(0x320b6733), X(0x321b41c7), + X(0x322b1d31), X(0x323af96e), X(0x324ad67e), X(0x325ab45f), + X(0x326a9311), X(0x327a7291), X(0x328a52e0), X(0x329a33fb), + X(0x32aa15e1), X(0x32b9f892), X(0x32c9dc0c), X(0x32d9c04d), + X(0x32e9a555), X(0x32f98b22), X(0x330971b4), X(0x33195909), + X(0x3329411f), X(0x333929f6), X(0x3349138c), X(0x3358fde1), + X(0x3368e8f2), X(0x3378d4c0), X(0x3388c147), X(0x3398ae89), + X(0x33a89c82), X(0x33b88b32), X(0x33c87a98), X(0x33d86ab2), + X(0x33e85b80), X(0x33f84d00), X(0x34083f30), X(0x34183210), + X(0x3428259f), X(0x343819db), X(0x34480ec3), X(0x34580455), + X(0x3467fa92), X(0x3477f176), X(0x3487e902), X(0x3497e134), + X(0x34a7da0a), X(0x34b7d384), X(0x34c7cda0), X(0x34d7c85e), + X(0x34e7c3bb), X(0x34f7bfb7), X(0x3507bc50), X(0x3517b985), + X(0x3527b756), X(0x3537b5c0), X(0x3547b4c3), X(0x3557b45d), + X(0x3567b48d), X(0x3577b552), X(0x3587b6aa), X(0x3597b895), + X(0x35a7bb12), X(0x35b7be1e), X(0x35c7c1b9), X(0x35d7c5e1), + X(0x35e7ca96), X(0x35f7cfd6), X(0x3607d5a0), X(0x3617dbf3), + X(0x3627e2cd), X(0x3637ea2d), X(0x3647f212), X(0x3657fa7b), + X(0x36680366), X(0x36780cd2), X(0x368816bf), X(0x3698212b), + X(0x36a82c14), X(0x36b83779), X(0x36c8435a), X(0x36d84fb4), + X(0x36e85c88), X(0x36f869d2), X(0x37087793), X(0x371885c9), + X(0x37289473), X(0x3738a38f), X(0x3748b31d), X(0x3758c31a), + X(0x3768d387), X(0x3778e461), X(0x3788f5a7), X(0x37990759), + X(0x37a91975), X(0x37b92bf9), X(0x37c93ee4), X(0x37d95236), + X(0x37e965ed), X(0x37f97a08), X(0x38098e85), X(0x3819a363), + X(0x3829b8a2), X(0x3839ce3f), X(0x3849e43a), X(0x3859fa91), + X(0x386a1143), X(0x387a284f), X(0x388a3fb4), X(0x389a5770), + X(0x38aa6f83), X(0x38ba87ea), X(0x38caa0a5), X(0x38dab9b2), + X(0x38ead311), X(0x38faecbf), X(0x390b06bc), X(0x391b2107), + X(0x392b3b9e), X(0x393b5680), X(0x394b71ac), X(0x395b8d20), + X(0x396ba8dc), X(0x397bc4dd), X(0x398be124), X(0x399bfdae), + X(0x39ac1a7a), X(0x39bc3788), X(0x39cc54d5), X(0x39dc7261), + X(0x39ec902a), X(0x39fcae2f), X(0x3a0ccc70), X(0x3a1ceaea), + X(0x3a2d099c), X(0x3a3d2885), X(0x3a4d47a5), X(0x3a5d66f9), + X(0x3a6d8680), X(0x3a7da63a), X(0x3a8dc625), X(0x3a9de63f), + X(0x3aae0688), X(0x3abe26fe), X(0x3ace47a0), X(0x3ade686d), + X(0x3aee8963), X(0x3afeaa82), X(0x3b0ecbc7), X(0x3b1eed32), + X(0x3b2f0ec2), X(0x3b3f3075), X(0x3b4f524a), X(0x3b5f7440), + X(0x3b6f9656), X(0x3b7fb889), X(0x3b8fdada), X(0x3b9ffd46), + X(0x3bb01fce), X(0x3bc0426e), X(0x3bd06526), X(0x3be087f6), + X(0x3bf0aada), X(0x3c00cdd4), X(0x3c10f0e0), X(0x3c2113fe), + X(0x3c31372d), X(0x3c415a6b), X(0x3c517db7), X(0x3c61a110), + X(0x3c71c475), X(0x3c81e7e4), X(0x3c920b5c), X(0x3ca22edc), + X(0x3cb25262), X(0x3cc275ee), X(0x3cd2997e), X(0x3ce2bd11), + X(0x3cf2e0a6), X(0x3d03043b), X(0x3d1327cf), X(0x3d234b61), + X(0x3d336ef0), X(0x3d43927a), X(0x3d53b5ff), X(0x3d63d97c), + X(0x3d73fcf1), X(0x3d84205c), X(0x3d9443bd), X(0x3da46711), + X(0x3db48a58), X(0x3dc4ad91), X(0x3dd4d0ba), X(0x3de4f3d1), + X(0x3df516d7), X(0x3e0539c9), X(0x3e155ca6), X(0x3e257f6d), + X(0x3e35a21d), X(0x3e45c4b4), X(0x3e55e731), X(0x3e660994), + X(0x3e762bda), X(0x3e864e03), X(0x3e96700d), X(0x3ea691f7), + X(0x3eb6b3bf), X(0x3ec6d565), X(0x3ed6f6e8), X(0x3ee71845), + X(0x3ef7397c), X(0x3f075a8c), X(0x3f177b73), X(0x3f279c30), + X(0x3f37bcc2), X(0x3f47dd27), X(0x3f57fd5f), X(0x3f681d68), + X(0x3f783d40), X(0x3f885ce7), X(0x3f987c5c), X(0x3fa89b9c), + X(0x3fb8baa7), X(0x3fc8d97c), X(0x3fd8f819), X(0x3fe9167e), + X(0x3ff934a8), X(0x40095296), X(0x40197049), X(0x40298dbd), + X(0x4039aaf2), X(0x4049c7e7), X(0x4059e49a), X(0x406a010a), + X(0x407a1d36), X(0x408a391d), X(0x409a54bd), X(0x40aa7015), + X(0x40ba8b25), X(0x40caa5ea), X(0x40dac063), X(0x40eada90), + X(0x40faf46e), X(0x410b0dfe), X(0x411b273d), X(0x412b402a), + X(0x413b58c4), X(0x414b710a), X(0x415b88fa), X(0x416ba093), + X(0x417bb7d5), X(0x418bcebe), X(0x419be54c), X(0x41abfb7e), + X(0x41bc1153), X(0x41cc26ca), X(0x41dc3be2), X(0x41ec5099), + X(0x41fc64ef), X(0x420c78e1), X(0x421c8c6f), X(0x422c9f97), + X(0x423cb258), X(0x424cc4b2), X(0x425cd6a2), X(0x426ce827), + X(0x427cf941), X(0x428d09ee), X(0x429d1a2c), X(0x42ad29fb), + X(0x42bd3959), X(0x42cd4846), X(0x42dd56bf), X(0x42ed64c3), + X(0x42fd7252), X(0x430d7f6a), X(0x431d8c0a), X(0x432d9831), + X(0x433da3dd), X(0x434daf0d), X(0x435db9c0), X(0x436dc3f5), + X(0x437dcdab), X(0x438dd6df), X(0x439ddf92), X(0x43ade7c1), + X(0x43bdef6c), X(0x43cdf691), X(0x43ddfd2f), X(0x43ee0345), + X(0x43fe08d2), X(0x440e0dd4), X(0x441e124b), X(0x442e1634), + X(0x443e198f), X(0x444e1c5a), X(0x445e1e95), X(0x446e203e), + X(0x447e2153), X(0x448e21d5), X(0x449e21c0), X(0x44ae2115), + X(0x44be1fd1), X(0x44ce1df4), X(0x44de1b7d), X(0x44ee186a), + X(0x44fe14ba), X(0x450e106b), X(0x451e0b7e), X(0x452e05ef), + X(0x453dffbf), X(0x454df8eb), X(0x455df173), X(0x456de956), + X(0x457de092), X(0x458dd726), X(0x459dcd10), X(0x45adc251), + X(0x45bdb6e5), X(0x45cdaacd), X(0x45dd9e06), X(0x45ed9091), + X(0x45fd826a), X(0x460d7392), X(0x461d6407), X(0x462d53c8), + X(0x463d42d4), X(0x464d3129), X(0x465d1ec6), X(0x466d0baa), + X(0x467cf7d3), X(0x468ce342), X(0x469ccdf3), X(0x46acb7e7), + X(0x46bca11c), X(0x46cc8990), X(0x46dc7143), X(0x46ec5833), + X(0x46fc3e5f), X(0x470c23c6), X(0x471c0867), X(0x472bec40), + X(0x473bcf50), X(0x474bb196), X(0x475b9311), X(0x476b73c0), + X(0x477b53a1), X(0x478b32b4), X(0x479b10f6), X(0x47aaee67), + X(0x47bacb06), X(0x47caa6d1), X(0x47da81c7), X(0x47ea5be7), + X(0x47fa3530), X(0x480a0da1), X(0x4819e537), X(0x4829bbf3), + X(0x483991d3), X(0x484966d6), X(0x48593afb), X(0x48690e3f), + X(0x4878e0a3), X(0x4888b225), X(0x489882c4), X(0x48a8527e), + X(0x48b82153), X(0x48c7ef41), X(0x48d7bc47), X(0x48e78863), + X(0x48f75396), X(0x49071ddc), X(0x4916e736), X(0x4926afa2), + X(0x4936771f), X(0x49463dac), X(0x49560347), X(0x4965c7ef), + X(0x49758ba4), X(0x49854e63), X(0x4995102c), X(0x49a4d0fe), + X(0x49b490d7), X(0x49c44fb6), X(0x49d40d9a), X(0x49e3ca82), + X(0x49f3866c), X(0x4a034159), X(0x4a12fb45), X(0x4a22b430), + X(0x4a326c19), X(0x4a4222ff), X(0x4a51d8e1), X(0x4a618dbd), + X(0x4a714192), X(0x4a80f45f), X(0x4a90a623), X(0x4aa056dd), + X(0x4ab0068b), X(0x4abfb52c), X(0x4acf62c0), X(0x4adf0f44), + X(0x4aeebab9), X(0x4afe651c), X(0x4b0e0e6c), X(0x4b1db6a9), + X(0x4b2d5dd1), X(0x4b3d03e2), X(0x4b4ca8dd), X(0x4b5c4cbf), + X(0x4b6bef88), X(0x4b7b9136), X(0x4b8b31c8), X(0x4b9ad13d), + X(0x4baa6f93), X(0x4bba0ccb), X(0x4bc9a8e2), X(0x4bd943d7), + X(0x4be8dda9), X(0x4bf87658), X(0x4c080de1), X(0x4c17a444), + X(0x4c27397f), X(0x4c36cd92), X(0x4c46607b), X(0x4c55f239), + X(0x4c6582cb), X(0x4c75122f), X(0x4c84a065), X(0x4c942d6c), + X(0x4ca3b942), X(0x4cb343e6), X(0x4cc2cd57), X(0x4cd25594), + X(0x4ce1dc9c), X(0x4cf1626d), X(0x4d00e707), X(0x4d106a68), + X(0x4d1fec8f), X(0x4d2f6d7a), X(0x4d3eed2a), X(0x4d4e6b9d), + X(0x4d5de8d1), X(0x4d6d64c5), X(0x4d7cdf79), X(0x4d8c58eb), + X(0x4d9bd11a), X(0x4dab4804), X(0x4dbabdaa), X(0x4dca3209), + X(0x4dd9a520), X(0x4de916ef), X(0x4df88774), X(0x4e07f6ae), + X(0x4e17649c), X(0x4e26d13c), X(0x4e363c8f), X(0x4e45a692), + X(0x4e550f44), X(0x4e6476a4), X(0x4e73dcb2), X(0x4e83416c), + X(0x4e92a4d1), X(0x4ea206df), X(0x4eb16796), X(0x4ec0c6f5), + X(0x4ed024fa), X(0x4edf81a5), X(0x4eeedcf3), X(0x4efe36e5), + X(0x4f0d8f79), X(0x4f1ce6ad), X(0x4f2c3c82), X(0x4f3b90f4), + X(0x4f4ae405), X(0x4f5a35b1), X(0x4f6985fa), X(0x4f78d4dc), + X(0x4f882257), X(0x4f976e6a), X(0x4fa6b914), X(0x4fb60254), + X(0x4fc54a28), X(0x4fd49090), X(0x4fe3d58b), X(0x4ff31917), + X(0x50025b33), X(0x50119bde), X(0x5020db17), X(0x503018dd), + X(0x503f552f), X(0x504e900b), X(0x505dc971), X(0x506d0160), + X(0x507c37d7), X(0x508b6cd3), X(0x509aa055), X(0x50a9d25b), + X(0x50b902e4), X(0x50c831ef), X(0x50d75f7b), X(0x50e68b87), + X(0x50f5b612), X(0x5104df1a), X(0x5114069f), X(0x51232ca0), + X(0x5132511a), X(0x5141740f), X(0x5150957b), X(0x515fb55f), + X(0x516ed3b8), X(0x517df087), X(0x518d0bca), X(0x519c257f), + X(0x51ab3da7), X(0x51ba543f), X(0x51c96947), X(0x51d87cbd), + X(0x51e78ea1), X(0x51f69ef1), X(0x5205adad), X(0x5214bad3), + X(0x5223c662), X(0x5232d05a), X(0x5241d8b9), X(0x5250df7d), + X(0x525fe4a7), X(0x526ee835), X(0x527dea26), X(0x528cea78), + X(0x529be92c), X(0x52aae63f), X(0x52b9e1b0), X(0x52c8db80), + X(0x52d7d3ac), X(0x52e6ca33), X(0x52f5bf15), X(0x5304b251), + X(0x5313a3e5), X(0x532293d0), X(0x53318212), X(0x53406ea8), + X(0x534f5993), X(0x535e42d2), X(0x536d2a62), X(0x537c1043), + X(0x538af475), X(0x5399d6f6), X(0x53a8b7c4), X(0x53b796e0), + X(0x53c67447), X(0x53d54ffa), X(0x53e429f6), X(0x53f3023b), + X(0x5401d8c8), X(0x5410ad9c), X(0x541f80b5), X(0x542e5213), + X(0x543d21b5), X(0x544bef9a), X(0x545abbc0), X(0x54698627), + X(0x54784ece), X(0x548715b3), X(0x5495dad6), X(0x54a49e35), + X(0x54b35fd0), X(0x54c21fa6), X(0x54d0ddb5), X(0x54df99fd), + X(0x54ee547c), X(0x54fd0d32), X(0x550bc41d), X(0x551a793d), + X(0x55292c91), X(0x5537de16), X(0x55468dce), X(0x55553bb6), + X(0x5563e7cd), X(0x55729213), X(0x55813a87), X(0x558fe127), + X(0x559e85f2), X(0x55ad28e9), X(0x55bbca08), X(0x55ca6950), + X(0x55d906c0), X(0x55e7a257), X(0x55f63c13), X(0x5604d3f4), + X(0x561369f8), X(0x5621fe1f), X(0x56309067), X(0x563f20d1), + X(0x564daf5a), X(0x565c3c02), X(0x566ac6c7), X(0x56794faa), + X(0x5687d6a8), X(0x56965bc1), X(0x56a4def4), X(0x56b36040), + X(0x56c1dfa4), X(0x56d05d1f), X(0x56ded8af), X(0x56ed5255), + X(0x56fbca0f), X(0x570a3fdc), X(0x5718b3bc), X(0x572725ac), + X(0x573595ad), X(0x574403bd), X(0x57526fdb), X(0x5760da07), + X(0x576f423f), X(0x577da883), X(0x578c0cd1), X(0x579a6f29), + X(0x57a8cf8a), X(0x57b72df2), X(0x57c58a61), X(0x57d3e4d6), + X(0x57e23d50), X(0x57f093cd), X(0x57fee84e), X(0x580d3ad1), + X(0x581b8b54), X(0x5829d9d8), X(0x5838265c), X(0x584670dd), + X(0x5854b95c), X(0x5862ffd8), X(0x5871444f), X(0x587f86c1), + X(0x588dc72c), X(0x589c0591), X(0x58aa41ed), X(0x58b87c40), + X(0x58c6b489), X(0x58d4eac7), X(0x58e31ef9), X(0x58f1511f), + X(0x58ff8137), X(0x590daf40), X(0x591bdb3a), X(0x592a0524), + X(0x59382cfc), X(0x594652c2), X(0x59547675), X(0x59629815), + X(0x5970b79f), X(0x597ed513), X(0x598cf071), X(0x599b09b7), + X(0x59a920e5), X(0x59b735f9), X(0x59c548f4), X(0x59d359d2), + X(0x59e16895), X(0x59ef753b), X(0x59fd7fc4), X(0x5a0b882d), + X(0x5a198e77), X(0x5a2792a0), X(0x5a3594a9), X(0x5a43948e), + X(0x5a519251), X(0x5a5f8df0), X(0x5a6d876a), X(0x5a7b7ebe), + X(0x5a8973ec), X(0x5a9766f2), X(0x5aa557d0), X(0x5ab34685), + X(0x5ac1330f), X(0x5acf1d6f), X(0x5add05a3), X(0x5aeaebaa), + X(0x5af8cf84), X(0x5b06b12f), X(0x5b1490ab), X(0x5b226df7), + X(0x5b304912), X(0x5b3e21fc), X(0x5b4bf8b2), X(0x5b59cd35), + X(0x5b679f84), X(0x5b756f9e), X(0x5b833d82), X(0x5b91092e), + X(0x5b9ed2a3), X(0x5bac99e0), X(0x5bba5ee3), X(0x5bc821ac), + X(0x5bd5e23a), X(0x5be3a08c), X(0x5bf15ca1), X(0x5bff1679), + X(0x5c0cce12), X(0x5c1a836c), X(0x5c283686), X(0x5c35e760), + X(0x5c4395f7), X(0x5c51424c), X(0x5c5eec5e), X(0x5c6c942b), + X(0x5c7a39b4), X(0x5c87dcf7), X(0x5c957df3), X(0x5ca31ca8), + X(0x5cb0b915), X(0x5cbe5338), X(0x5ccbeb12), X(0x5cd980a1), + X(0x5ce713e5), X(0x5cf4a4dd), X(0x5d023387), X(0x5d0fbfe4), + X(0x5d1d49f2), X(0x5d2ad1b1), X(0x5d38571f), X(0x5d45da3c), + X(0x5d535b08), X(0x5d60d981), X(0x5d6e55a7), X(0x5d7bcf78), + X(0x5d8946f5), X(0x5d96bc1c), X(0x5da42eec), X(0x5db19f65), + X(0x5dbf0d86), X(0x5dcc794e), X(0x5dd9e2bd), X(0x5de749d1), + X(0x5df4ae8a), X(0x5e0210e7), X(0x5e0f70e7), X(0x5e1cce8a), + X(0x5e2a29ce), X(0x5e3782b4), X(0x5e44d93a), X(0x5e522d5f), + X(0x5e5f7f23), X(0x5e6cce85), X(0x5e7a1b85), X(0x5e876620), + X(0x5e94ae58), X(0x5ea1f42a), X(0x5eaf3797), X(0x5ebc789d), + X(0x5ec9b73c), X(0x5ed6f372), X(0x5ee42d41), X(0x5ef164a5), + X(0x5efe999f), X(0x5f0bcc2f), X(0x5f18fc52), X(0x5f262a09), + X(0x5f335553), X(0x5f407e2f), X(0x5f4da49d), X(0x5f5ac89b), + X(0x5f67ea29), X(0x5f750946), X(0x5f8225f2), X(0x5f8f402b), + X(0x5f9c57f2), X(0x5fa96d44), X(0x5fb68023), X(0x5fc3908c), + X(0x5fd09e7f), X(0x5fdda9fc), X(0x5feab302), X(0x5ff7b990), + X(0x6004bda5), X(0x6011bf40), X(0x601ebe62), X(0x602bbb09), + X(0x6038b534), X(0x6045ace4), X(0x6052a216), X(0x605f94cb), + X(0x606c8502), X(0x607972b9), X(0x60865df2), X(0x609346aa), + X(0x60a02ce1), X(0x60ad1096), X(0x60b9f1c9), X(0x60c6d079), + X(0x60d3aca5), X(0x60e0864d), X(0x60ed5d70), X(0x60fa320d), + X(0x61070424), X(0x6113d3b4), X(0x6120a0bc), X(0x612d6b3c), + X(0x613a3332), X(0x6146f89f), X(0x6153bb82), X(0x61607bd9), + X(0x616d39a5), X(0x6179f4e5), X(0x6186ad98), X(0x619363bd), + X(0x61a01753), X(0x61acc85b), X(0x61b976d3), X(0x61c622bc), + X(0x61d2cc13), X(0x61df72d8), X(0x61ec170c), X(0x61f8b8ad), + X(0x620557ba), X(0x6211f434), X(0x621e8e18), X(0x622b2568), + X(0x6237ba21), X(0x62444c44), X(0x6250dbd0), X(0x625d68c4), + X(0x6269f320), X(0x62767ae2), X(0x6283000b), X(0x628f829a), + X(0x629c028e), X(0x62a87fe6), X(0x62b4faa2), X(0x62c172c2), + X(0x62cde844), X(0x62da5b29), X(0x62e6cb6e), X(0x62f33915), + X(0x62ffa41c), X(0x630c0c83), X(0x63187248), X(0x6324d56d), + X(0x633135ef), X(0x633d93ce), X(0x6349ef0b), X(0x635647a3), + X(0x63629d97), X(0x636ef0e6), X(0x637b418f), X(0x63878f92), + X(0x6393daef), X(0x63a023a4), X(0x63ac69b1), X(0x63b8ad15), + X(0x63c4edd1), X(0x63d12be3), X(0x63dd674b), X(0x63e9a008), + X(0x63f5d61a), X(0x64020980), X(0x640e3a39), X(0x641a6846), + X(0x642693a5), X(0x6432bc56), X(0x643ee258), X(0x644b05ab), + X(0x6457264e), X(0x64634441), X(0x646f5f83), X(0x647b7814), + X(0x64878df3), X(0x6493a120), X(0x649fb199), X(0x64abbf5f), + X(0x64b7ca71), X(0x64c3d2ce), X(0x64cfd877), X(0x64dbdb69), + X(0x64e7dba6), X(0x64f3d92b), X(0x64ffd3fa), X(0x650bcc11), + X(0x6517c16f), X(0x6523b415), X(0x652fa402), X(0x653b9134), + X(0x65477bad), X(0x6553636a), X(0x655f486d), X(0x656b2ab3), + X(0x65770a3d), X(0x6582e70a), X(0x658ec11a), X(0x659a986d), + X(0x65a66d00), X(0x65b23ed5), X(0x65be0deb), X(0x65c9da41), + X(0x65d5a3d7), X(0x65e16aac), X(0x65ed2ebf), X(0x65f8f011), + X(0x6604aea1), X(0x66106a6e), X(0x661c2377), X(0x6627d9be), + X(0x66338d40), X(0x663f3dfd), X(0x664aebf5), X(0x66569728), + X(0x66623f95), X(0x666de53b), X(0x6679881b), X(0x66852833), + X(0x6690c583), X(0x669c600b), X(0x66a7f7ca), X(0x66b38cc0), + X(0x66bf1eec), X(0x66caae4f), X(0x66d63ae6), X(0x66e1c4b3), + X(0x66ed4bb4), X(0x66f8cfea), X(0x67045153), X(0x670fcfef), + X(0x671b4bbe), X(0x6726c4bf), X(0x67323af3), X(0x673dae58), + X(0x67491eee), X(0x67548cb5), X(0x675ff7ab), X(0x676b5fd2), + X(0x6776c528), X(0x678227ad), X(0x678d8761), X(0x6798e443), + X(0x67a43e52), X(0x67af958f), X(0x67bae9f9), X(0x67c63b8f), + X(0x67d18a52), X(0x67dcd640), X(0x67e81f59), X(0x67f3659d), + X(0x67fea90c), X(0x6809e9a5), X(0x68152768), X(0x68206254), + X(0x682b9a68), X(0x6836cfa6), X(0x6842020b), X(0x684d3199), + X(0x68585e4d), X(0x68638829), X(0x686eaf2b), X(0x6879d354), + X(0x6884f4a2), X(0x68901316), X(0x689b2eb0), X(0x68a6476d), + X(0x68b15d50), X(0x68bc7056), X(0x68c78080), X(0x68d28dcd), + X(0x68dd983e), X(0x68e89fd0), X(0x68f3a486), X(0x68fea65d), + X(0x6909a555), X(0x6914a16f), X(0x691f9aa9), X(0x692a9104), + X(0x69358480), X(0x6940751b), X(0x694b62d5), X(0x69564daf), + X(0x696135a7), X(0x696c1abe), X(0x6976fcf3), X(0x6981dc46), + X(0x698cb8b6), X(0x69979243), X(0x69a268ed), X(0x69ad3cb4), + X(0x69b80d97), X(0x69c2db96), X(0x69cda6b0), X(0x69d86ee5), + X(0x69e33436), X(0x69edf6a1), X(0x69f8b626), X(0x6a0372c5), + X(0x6a0e2c7e), X(0x6a18e350), X(0x6a23973c), X(0x6a2e4840), + X(0x6a38f65d), X(0x6a43a191), X(0x6a4e49de), X(0x6a58ef42), + X(0x6a6391be), X(0x6a6e3151), X(0x6a78cdfa), X(0x6a8367ba), + X(0x6a8dfe90), X(0x6a98927c), X(0x6aa3237d), X(0x6aadb194), + X(0x6ab83cc0), X(0x6ac2c500), X(0x6acd4a55), X(0x6ad7ccbf), + X(0x6ae24c3c), X(0x6aecc8cd), X(0x6af74271), X(0x6b01b929), + X(0x6b0c2cf4), X(0x6b169dd1), X(0x6b210bc1), X(0x6b2b76c2), + X(0x6b35ded6), X(0x6b4043fc), X(0x6b4aa632), X(0x6b55057a), + X(0x6b5f61d3), X(0x6b69bb3d), X(0x6b7411b7), X(0x6b7e6541), + X(0x6b88b5db), X(0x6b930385), X(0x6b9d4e3f), X(0x6ba79607), + X(0x6bb1dadf), X(0x6bbc1cc6), X(0x6bc65bbb), X(0x6bd097bf), + X(0x6bdad0d0), X(0x6be506f0), X(0x6bef3a1d), X(0x6bf96a58), + X(0x6c0397a0), X(0x6c0dc1f5), X(0x6c17e957), X(0x6c220dc6), + X(0x6c2c2f41), X(0x6c364dc9), X(0x6c40695c), X(0x6c4a81fc), + X(0x6c5497a7), X(0x6c5eaa5d), X(0x6c68ba1f), X(0x6c72c6eb), + X(0x6c7cd0c3), X(0x6c86d7a6), X(0x6c90db92), X(0x6c9adc8a), + X(0x6ca4da8b), X(0x6caed596), X(0x6cb8cdab), X(0x6cc2c2ca), + X(0x6cccb4f2), X(0x6cd6a424), X(0x6ce0905e), X(0x6cea79a1), + X(0x6cf45fee), X(0x6cfe4342), X(0x6d0823a0), X(0x6d120105), + X(0x6d1bdb73), X(0x6d25b2e8), X(0x6d2f8765), X(0x6d3958ea), + X(0x6d432777), X(0x6d4cf30a), X(0x6d56bba5), X(0x6d608147), + X(0x6d6a43f0), X(0x6d7403a0), X(0x6d7dc056), X(0x6d877a13), + X(0x6d9130d6), X(0x6d9ae4a0), X(0x6da4956f), X(0x6dae4345), + X(0x6db7ee20), X(0x6dc19601), X(0x6dcb3ae7), X(0x6dd4dcd3), + X(0x6dde7bc4), X(0x6de817bb), X(0x6df1b0b6), X(0x6dfb46b7), + X(0x6e04d9bc), X(0x6e0e69c7), X(0x6e17f6d5), X(0x6e2180e9), + X(0x6e2b0801), X(0x6e348c1d), X(0x6e3e0d3d), X(0x6e478b62), + X(0x6e51068a), X(0x6e5a7eb7), X(0x6e63f3e7), X(0x6e6d661b), + X(0x6e76d552), X(0x6e80418e), X(0x6e89aacc), X(0x6e93110f), + X(0x6e9c7454), X(0x6ea5d49d), X(0x6eaf31e9), X(0x6eb88c37), + X(0x6ec1e389), X(0x6ecb37de), X(0x6ed48936), X(0x6eddd790), + X(0x6ee722ee), X(0x6ef06b4d), X(0x6ef9b0b0), X(0x6f02f315), + X(0x6f0c327c), X(0x6f156ee6), X(0x6f1ea852), X(0x6f27dec1), + X(0x6f311232), X(0x6f3a42a5), X(0x6f43701a), X(0x6f4c9a91), + X(0x6f55c20a), X(0x6f5ee686), X(0x6f680803), X(0x6f712682), + X(0x6f7a4203), X(0x6f835a86), X(0x6f8c700b), X(0x6f958291), + X(0x6f9e921a), X(0x6fa79ea4), X(0x6fb0a830), X(0x6fb9aebd), + X(0x6fc2b24c), X(0x6fcbb2dd), X(0x6fd4b06f), X(0x6fddab03), + X(0x6fe6a299), X(0x6fef9730), X(0x6ff888c9), X(0x70017763), + X(0x700a62ff), X(0x70134b9c), X(0x701c313b), X(0x702513dc), + X(0x702df37e), X(0x7036d021), X(0x703fa9c6), X(0x7048806d), + X(0x70515415), X(0x705a24bf), X(0x7062f26b), X(0x706bbd17), + X(0x707484c6), X(0x707d4976), X(0x70860b28), X(0x708ec9dc), + X(0x70978591), X(0x70a03e48), X(0x70a8f400), X(0x70b1a6bb), + X(0x70ba5677), X(0x70c30335), X(0x70cbacf5), X(0x70d453b6), + X(0x70dcf77a), X(0x70e59840), X(0x70ee3607), X(0x70f6d0d1), + X(0x70ff689d), X(0x7107fd6b), X(0x71108f3b), X(0x71191e0d), + X(0x7121a9e2), X(0x712a32b9), X(0x7132b892), X(0x713b3b6e), + X(0x7143bb4c), X(0x714c382d), X(0x7154b211), X(0x715d28f7), + X(0x71659ce0), X(0x716e0dcc), X(0x71767bbb), X(0x717ee6ac), + X(0x71874ea1), X(0x718fb399), X(0x71981594), X(0x71a07493), + X(0x71a8d094), X(0x71b1299a), X(0x71b97fa2), X(0x71c1d2af), + X(0x71ca22bf), X(0x71d26fd2), X(0x71dab9ea), X(0x71e30106), + X(0x71eb4526), X(0x71f3864a), X(0x71fbc472), X(0x7203ff9e), + X(0x720c37cf), X(0x72146d05), X(0x721c9f3f), X(0x7224ce7e), + X(0x722cfac2), X(0x7235240b), X(0x723d4a59), X(0x72456dad), + X(0x724d8e05), X(0x7255ab63), X(0x725dc5c7), X(0x7265dd31), + X(0x726df1a0), X(0x72760315), X(0x727e1191), X(0x72861d12), + X(0x728e259a), X(0x72962b28), X(0x729e2dbd), X(0x72a62d59), + X(0x72ae29fc), X(0x72b623a5), X(0x72be1a56), X(0x72c60e0e), + X(0x72cdfece), X(0x72d5ec95), X(0x72ddd764), X(0x72e5bf3b), + X(0x72eda41a), X(0x72f58601), X(0x72fd64f1), X(0x730540e9), + X(0x730d19e9), X(0x7314eff3), X(0x731cc305), X(0x73249321), + X(0x732c6046), X(0x73342a75), X(0x733bf1ad), X(0x7343b5ef), + X(0x734b773b), X(0x73533591), X(0x735af0f2), X(0x7362a95d), + X(0x736a5ed3), X(0x73721153), X(0x7379c0df), X(0x73816d76), + X(0x73891719), X(0x7390bdc7), X(0x73986181), X(0x73a00247), + X(0x73a7a01a), X(0x73af3af8), X(0x73b6d2e4), X(0x73be67dc), + X(0x73c5f9e1), X(0x73cd88f3), X(0x73d51513), X(0x73dc9e40), + X(0x73e4247c), X(0x73eba7c5), X(0x73f3281c), X(0x73faa582), + X(0x74021ff7), X(0x7409977b), X(0x74110c0d), X(0x74187daf), + X(0x741fec61), X(0x74275822), X(0x742ec0f3), X(0x743626d5), + X(0x743d89c7), X(0x7444e9c9), X(0x744c46dd), X(0x7453a101), + X(0x745af837), X(0x74624c7f), X(0x74699dd8), X(0x7470ec44), + X(0x747837c2), X(0x747f8052), X(0x7486c5f5), X(0x748e08ac), + X(0x74954875), X(0x749c8552), X(0x74a3bf43), X(0x74aaf648), + X(0x74b22a62), X(0x74b95b90), X(0x74c089d2), X(0x74c7b52a), + X(0x74cedd97), X(0x74d6031a), X(0x74dd25b2), X(0x74e44561), + X(0x74eb6226), X(0x74f27c02), X(0x74f992f5), X(0x7500a6ff), + X(0x7507b820), X(0x750ec659), X(0x7515d1aa), X(0x751cda14), + X(0x7523df96), X(0x752ae231), X(0x7531e1e5), X(0x7538deb2), + X(0x753fd89a), X(0x7546cf9b), X(0x754dc3b7), X(0x7554b4ed), + X(0x755ba33e), X(0x75628eaa), X(0x75697732), X(0x75705cd5), + X(0x75773f95), X(0x757e1f71), X(0x7584fc6a), X(0x758bd67f), + X(0x7592adb2), X(0x75998203), X(0x75a05371), X(0x75a721fe), + X(0x75adeda9), X(0x75b4b673), X(0x75bb7c5c), X(0x75c23f65), + X(0x75c8ff8d), X(0x75cfbcd6), X(0x75d6773f), X(0x75dd2ec8), + X(0x75e3e373), X(0x75ea953f), X(0x75f1442d), X(0x75f7f03d), + X(0x75fe996f), X(0x76053fc5), X(0x760be33d), X(0x761283d8), + X(0x76192197), X(0x761fbc7b), X(0x76265482), X(0x762ce9af), + X(0x76337c01), X(0x763a0b78), X(0x76409814), X(0x764721d7), + X(0x764da8c1), X(0x76542cd1), X(0x765aae08), X(0x76612c67), + X(0x7667a7ee), X(0x766e209d), X(0x76749675), X(0x767b0975), + X(0x7681799f), X(0x7687e6f3), X(0x768e5170), X(0x7694b918), + X(0x769b1deb), X(0x76a17fe9), X(0x76a7df13), X(0x76ae3b68), + X(0x76b494ea), X(0x76baeb98), X(0x76c13f74), X(0x76c7907c), + X(0x76cddeb3), X(0x76d42a18), X(0x76da72ab), X(0x76e0b86d), + X(0x76e6fb5e), X(0x76ed3b7f), X(0x76f378d0), X(0x76f9b352), + X(0x76ffeb05), X(0x77061fe8), X(0x770c51fe), X(0x77128145), + X(0x7718adbf), X(0x771ed76c), X(0x7724fe4c), X(0x772b225f), + X(0x773143a7), X(0x77376223), X(0x773d7dd3), X(0x774396ba), + X(0x7749acd5), X(0x774fc027), X(0x7755d0af), X(0x775bde6f), + X(0x7761e965), X(0x7767f193), X(0x776df6fa), X(0x7773f998), + X(0x7779f970), X(0x777ff681), X(0x7785f0cd), X(0x778be852), + X(0x7791dd12), X(0x7797cf0d), X(0x779dbe43), X(0x77a3aab6), + X(0x77a99465), X(0x77af7b50), X(0x77b55f79), X(0x77bb40e0), + X(0x77c11f85), X(0x77c6fb68), X(0x77ccd48a), X(0x77d2aaec), + X(0x77d87e8d), X(0x77de4f6f), X(0x77e41d92), X(0x77e9e8f5), + X(0x77efb19b), X(0x77f57782), X(0x77fb3aad), X(0x7800fb1a), + X(0x7806b8ca), X(0x780c73bf), X(0x78122bf7), X(0x7817e175), + X(0x781d9438), X(0x78234440), X(0x7828f18f), X(0x782e9c25), + X(0x78344401), X(0x7839e925), X(0x783f8b92), X(0x78452b46), + X(0x784ac844), X(0x7850628b), X(0x7855fa1c), X(0x785b8ef8), + X(0x7861211e), X(0x7866b090), X(0x786c3d4d), X(0x7871c757), + X(0x78774ead), X(0x787cd351), X(0x78825543), X(0x7887d483), + X(0x788d5111), X(0x7892caef), X(0x7898421c), X(0x789db69a), + X(0x78a32868), X(0x78a89787), X(0x78ae03f8), X(0x78b36dbb), + X(0x78b8d4d1), X(0x78be393a), X(0x78c39af6), X(0x78c8fa06), + X(0x78ce566c), X(0x78d3b026), X(0x78d90736), X(0x78de5b9c), + X(0x78e3ad58), X(0x78e8fc6c), X(0x78ee48d7), X(0x78f3929b), + X(0x78f8d9b7), X(0x78fe1e2c), X(0x79035ffb), X(0x79089f24), + X(0x790ddba8), X(0x79131587), X(0x79184cc2), X(0x791d8159), + X(0x7922b34d), X(0x7927e29e), X(0x792d0f4d), X(0x7932395a), + X(0x793760c6), X(0x793c8591), X(0x7941a7bd), X(0x7946c749), + X(0x794be435), X(0x7950fe84), X(0x79561634), X(0x795b2b47), + X(0x79603dbc), X(0x79654d96), X(0x796a5ad4), X(0x796f6576), + X(0x79746d7e), X(0x797972eb), X(0x797e75bf), X(0x798375f9), + X(0x7988739b), X(0x798d6ea5), X(0x79926717), X(0x79975cf2), + X(0x799c5037), X(0x79a140e6), X(0x79a62f00), X(0x79ab1a85), + X(0x79b00376), X(0x79b4e9d3), X(0x79b9cd9d), X(0x79beaed4), + X(0x79c38d79), X(0x79c8698d), X(0x79cd4310), X(0x79d21a03), + X(0x79d6ee66), X(0x79dbc03a), X(0x79e08f7f), X(0x79e55c36), + X(0x79ea265f), X(0x79eeedfc), X(0x79f3b30c), X(0x79f87590), + X(0x79fd3589), X(0x7a01f2f7), X(0x7a06addc), X(0x7a0b6636), + X(0x7a101c08), X(0x7a14cf52), X(0x7a198013), X(0x7a1e2e4d), + X(0x7a22da01), X(0x7a27832f), X(0x7a2c29d7), X(0x7a30cdfa), + X(0x7a356f99), X(0x7a3a0eb4), X(0x7a3eab4c), X(0x7a434561), + X(0x7a47dcf5), X(0x7a4c7207), X(0x7a510498), X(0x7a5594a9), + X(0x7a5a223a), X(0x7a5ead4d), X(0x7a6335e0), X(0x7a67bbf6), + X(0x7a6c3f8f), X(0x7a70c0ab), X(0x7a753f4b), X(0x7a79bb6f), + X(0x7a7e3519), X(0x7a82ac48), X(0x7a8720fe), X(0x7a8b933b), + X(0x7a9002ff), X(0x7a94704b), X(0x7a98db20), X(0x7a9d437e), + X(0x7aa1a967), X(0x7aa60cd9), X(0x7aaa6dd7), X(0x7aaecc61), + X(0x7ab32877), X(0x7ab7821b), X(0x7abbd94b), X(0x7ac02e0a), + X(0x7ac48058), X(0x7ac8d035), X(0x7acd1da3), X(0x7ad168a1), + X(0x7ad5b130), X(0x7ad9f751), X(0x7ade3b05), X(0x7ae27c4c), + X(0x7ae6bb27), X(0x7aeaf796), X(0x7aef319a), X(0x7af36934), + X(0x7af79e64), X(0x7afbd12c), X(0x7b00018a), X(0x7b042f81), + X(0x7b085b10), X(0x7b0c8439), X(0x7b10aafc), X(0x7b14cf5a), + X(0x7b18f153), X(0x7b1d10e8), X(0x7b212e1a), X(0x7b2548e9), + X(0x7b296155), X(0x7b2d7761), X(0x7b318b0b), X(0x7b359c55), + X(0x7b39ab3f), X(0x7b3db7cb), X(0x7b41c1f8), X(0x7b45c9c8), + X(0x7b49cf3b), X(0x7b4dd251), X(0x7b51d30b), X(0x7b55d16b), + X(0x7b59cd70), X(0x7b5dc71b), X(0x7b61be6d), X(0x7b65b366), + X(0x7b69a608), X(0x7b6d9653), X(0x7b718447), X(0x7b756fe5), + X(0x7b79592e), X(0x7b7d4022), X(0x7b8124c3), X(0x7b850710), + X(0x7b88e70a), X(0x7b8cc4b3), X(0x7b90a00a), X(0x7b947911), + X(0x7b984fc8), X(0x7b9c242f), X(0x7b9ff648), X(0x7ba3c612), + X(0x7ba79390), X(0x7bab5ec1), X(0x7baf27a5), X(0x7bb2ee3f), + X(0x7bb6b28e), X(0x7bba7493), X(0x7bbe344e), X(0x7bc1f1c1), + X(0x7bc5acec), X(0x7bc965cf), X(0x7bcd1c6c), X(0x7bd0d0c3), + X(0x7bd482d4), X(0x7bd832a1), X(0x7bdbe02a), X(0x7bdf8b70), + X(0x7be33473), X(0x7be6db34), X(0x7bea7fb4), X(0x7bee21f4), + X(0x7bf1c1f3), X(0x7bf55fb3), X(0x7bf8fb35), X(0x7bfc9479), + X(0x7c002b7f), X(0x7c03c04a), X(0x7c0752d8), X(0x7c0ae32b), + X(0x7c0e7144), X(0x7c11fd23), X(0x7c1586c9), X(0x7c190e36), + X(0x7c1c936c), X(0x7c20166b), X(0x7c239733), X(0x7c2715c6), + X(0x7c2a9224), X(0x7c2e0c4e), X(0x7c318444), X(0x7c34fa07), + X(0x7c386d98), X(0x7c3bdef8), X(0x7c3f4e26), X(0x7c42bb25), + X(0x7c4625f4), X(0x7c498e95), X(0x7c4cf507), X(0x7c50594c), + X(0x7c53bb65), X(0x7c571b51), X(0x7c5a7913), X(0x7c5dd4aa), + X(0x7c612e17), X(0x7c64855b), X(0x7c67da76), X(0x7c6b2d6a), + X(0x7c6e7e37), X(0x7c71ccdd), X(0x7c75195e), X(0x7c7863ba), + X(0x7c7babf1), X(0x7c7ef206), X(0x7c8235f7), X(0x7c8577c6), + X(0x7c88b774), X(0x7c8bf502), X(0x7c8f306f), X(0x7c9269bd), + X(0x7c95a0ec), X(0x7c98d5fe), X(0x7c9c08f2), X(0x7c9f39cb), + X(0x7ca26887), X(0x7ca59528), X(0x7ca8bfb0), X(0x7cabe81d), + X(0x7caf0e72), X(0x7cb232af), X(0x7cb554d4), X(0x7cb874e2), + X(0x7cbb92db), X(0x7cbeaebe), X(0x7cc1c88d), X(0x7cc4e047), + X(0x7cc7f5ef), X(0x7ccb0984), X(0x7cce1b08), X(0x7cd12a7b), + X(0x7cd437dd), X(0x7cd74330), X(0x7cda4c74), X(0x7cdd53aa), + X(0x7ce058d3), X(0x7ce35bef), X(0x7ce65cff), X(0x7ce95c04), + X(0x7cec58ff), X(0x7cef53f0), X(0x7cf24cd7), X(0x7cf543b7), + X(0x7cf8388f), X(0x7cfb2b60), X(0x7cfe1c2b), X(0x7d010af1), + X(0x7d03f7b2), X(0x7d06e26f), X(0x7d09cb29), X(0x7d0cb1e0), + X(0x7d0f9696), X(0x7d12794b), X(0x7d1559ff), X(0x7d1838b4), + X(0x7d1b156a), X(0x7d1df022), X(0x7d20c8dd), X(0x7d239f9b), + X(0x7d26745e), X(0x7d294725), X(0x7d2c17f1), X(0x7d2ee6c4), + X(0x7d31b39f), X(0x7d347e81), X(0x7d37476b), X(0x7d3a0e5f), + X(0x7d3cd35d), X(0x7d3f9665), X(0x7d425779), X(0x7d451699), + X(0x7d47d3c6), X(0x7d4a8f01), X(0x7d4d484b), X(0x7d4fffa3), + X(0x7d52b50c), X(0x7d556885), X(0x7d581a0f), X(0x7d5ac9ac), + X(0x7d5d775c), X(0x7d60231f), X(0x7d62ccf6), X(0x7d6574e3), + X(0x7d681ae6), X(0x7d6abeff), X(0x7d6d612f), X(0x7d700178), + X(0x7d729fd9), X(0x7d753c54), X(0x7d77d6e9), X(0x7d7a6f9a), + X(0x7d7d0666), X(0x7d7f9b4f), X(0x7d822e55), X(0x7d84bf79), + X(0x7d874ebc), X(0x7d89dc1e), X(0x7d8c67a1), X(0x7d8ef144), + X(0x7d91790a), X(0x7d93fef2), X(0x7d9682fd), X(0x7d99052d), + X(0x7d9b8581), X(0x7d9e03fb), X(0x7da0809b), X(0x7da2fb62), + X(0x7da57451), X(0x7da7eb68), X(0x7daa60a8), X(0x7dacd413), + X(0x7daf45a9), X(0x7db1b56a), X(0x7db42357), X(0x7db68f71), + X(0x7db8f9b9), X(0x7dbb6230), X(0x7dbdc8d6), X(0x7dc02dac), + X(0x7dc290b3), X(0x7dc4f1eb), X(0x7dc75156), X(0x7dc9aef4), + X(0x7dcc0ac5), X(0x7dce64cc), X(0x7dd0bd07), X(0x7dd31379), + X(0x7dd56821), X(0x7dd7bb01), X(0x7dda0c1a), X(0x7ddc5b6b), + X(0x7ddea8f7), X(0x7de0f4bd), X(0x7de33ebe), X(0x7de586fc), + X(0x7de7cd76), X(0x7dea122e), X(0x7dec5525), X(0x7dee965a), + X(0x7df0d5d0), X(0x7df31386), X(0x7df54f7e), X(0x7df789b8), + X(0x7df9c235), X(0x7dfbf8f5), X(0x7dfe2dfa), X(0x7e006145), + X(0x7e0292d5), X(0x7e04c2ac), X(0x7e06f0cb), X(0x7e091d32), + X(0x7e0b47e1), X(0x7e0d70db), X(0x7e0f981f), X(0x7e11bdaf), + X(0x7e13e18a), X(0x7e1603b3), X(0x7e182429), X(0x7e1a42ed), + X(0x7e1c6001), X(0x7e1e7b64), X(0x7e209518), X(0x7e22ad1d), + X(0x7e24c375), X(0x7e26d81f), X(0x7e28eb1d), X(0x7e2afc70), + X(0x7e2d0c17), X(0x7e2f1a15), X(0x7e31266a), X(0x7e333115), + X(0x7e353a1a), X(0x7e374177), X(0x7e39472e), X(0x7e3b4b3f), + X(0x7e3d4dac), X(0x7e3f4e75), X(0x7e414d9a), X(0x7e434b1e), + X(0x7e4546ff), X(0x7e474140), X(0x7e4939e0), X(0x7e4b30e2), + X(0x7e4d2644), X(0x7e4f1a09), X(0x7e510c30), X(0x7e52fcbc), + X(0x7e54ebab), X(0x7e56d900), X(0x7e58c4bb), X(0x7e5aaedd), + X(0x7e5c9766), X(0x7e5e7e57), X(0x7e6063b2), X(0x7e624776), + X(0x7e6429a5), X(0x7e660a3f), X(0x7e67e945), X(0x7e69c6b8), + X(0x7e6ba299), X(0x7e6d7ce7), X(0x7e6f55a5), X(0x7e712cd3), + X(0x7e730272), X(0x7e74d682), X(0x7e76a904), X(0x7e7879f9), + X(0x7e7a4962), X(0x7e7c173f), X(0x7e7de392), X(0x7e7fae5a), + X(0x7e817799), X(0x7e833f50), X(0x7e85057f), X(0x7e86ca27), + X(0x7e888d49), X(0x7e8a4ee5), X(0x7e8c0efd), X(0x7e8dcd91), + X(0x7e8f8aa1), X(0x7e914630), X(0x7e93003c), X(0x7e94b8c8), + X(0x7e966fd4), X(0x7e982560), X(0x7e99d96e), X(0x7e9b8bfe), + X(0x7e9d3d10), X(0x7e9eeca7), X(0x7ea09ac2), X(0x7ea24762), + X(0x7ea3f288), X(0x7ea59c35), X(0x7ea7446a), X(0x7ea8eb27), + X(0x7eaa906c), X(0x7eac343c), X(0x7eadd696), X(0x7eaf777b), + X(0x7eb116ed), X(0x7eb2b4eb), X(0x7eb45177), X(0x7eb5ec91), + X(0x7eb7863b), X(0x7eb91e74), X(0x7ebab53e), X(0x7ebc4a99), + X(0x7ebdde87), X(0x7ebf7107), X(0x7ec1021b), X(0x7ec291c3), + X(0x7ec42001), X(0x7ec5acd5), X(0x7ec7383f), X(0x7ec8c241), + X(0x7eca4adb), X(0x7ecbd20d), X(0x7ecd57da), X(0x7ecedc41), + X(0x7ed05f44), X(0x7ed1e0e2), X(0x7ed3611d), X(0x7ed4dff6), + X(0x7ed65d6d), X(0x7ed7d983), X(0x7ed95438), X(0x7edacd8f), + X(0x7edc4586), X(0x7eddbc20), X(0x7edf315c), X(0x7ee0a53c), + X(0x7ee217c1), X(0x7ee388ea), X(0x7ee4f8b9), X(0x7ee6672f), + X(0x7ee7d44c), X(0x7ee94012), X(0x7eeaaa80), X(0x7eec1397), + X(0x7eed7b59), X(0x7eeee1c6), X(0x7ef046df), X(0x7ef1aaa5), + X(0x7ef30d18), X(0x7ef46e39), X(0x7ef5ce09), X(0x7ef72c88), + X(0x7ef889b8), X(0x7ef9e599), X(0x7efb402c), X(0x7efc9972), + X(0x7efdf16b), X(0x7eff4818), X(0x7f009d79), X(0x7f01f191), + X(0x7f03445f), X(0x7f0495e4), X(0x7f05e620), X(0x7f073516), + X(0x7f0882c5), X(0x7f09cf2d), X(0x7f0b1a51), X(0x7f0c6430), + X(0x7f0daccc), X(0x7f0ef425), X(0x7f103a3b), X(0x7f117f11), + X(0x7f12c2a5), X(0x7f1404fa), X(0x7f15460f), X(0x7f1685e6), + X(0x7f17c47f), X(0x7f1901db), X(0x7f1a3dfb), X(0x7f1b78e0), + X(0x7f1cb28a), X(0x7f1deafa), X(0x7f1f2231), X(0x7f20582f), + X(0x7f218cf5), X(0x7f22c085), X(0x7f23f2de), X(0x7f252401), + X(0x7f2653f0), X(0x7f2782ab), X(0x7f28b032), X(0x7f29dc87), + X(0x7f2b07aa), X(0x7f2c319c), X(0x7f2d5a5e), X(0x7f2e81f0), + X(0x7f2fa853), X(0x7f30cd88), X(0x7f31f18f), X(0x7f33146a), + X(0x7f343619), X(0x7f35569c), X(0x7f3675f6), X(0x7f379425), + X(0x7f38b12c), X(0x7f39cd0a), X(0x7f3ae7c0), X(0x7f3c0150), + X(0x7f3d19ba), X(0x7f3e30fe), X(0x7f3f471e), X(0x7f405c1a), + X(0x7f416ff3), X(0x7f4282a9), X(0x7f43943e), X(0x7f44a4b2), + X(0x7f45b405), X(0x7f46c239), X(0x7f47cf4e), X(0x7f48db45), + X(0x7f49e61f), X(0x7f4aefdc), X(0x7f4bf87e), X(0x7f4d0004), + X(0x7f4e0670), X(0x7f4f0bc2), X(0x7f500ffb), X(0x7f51131c), + X(0x7f521525), X(0x7f531618), X(0x7f5415f4), X(0x7f5514bb), + X(0x7f56126e), X(0x7f570f0c), X(0x7f580a98), X(0x7f590511), + X(0x7f59fe78), X(0x7f5af6ce), X(0x7f5bee14), X(0x7f5ce44a), + X(0x7f5dd972), X(0x7f5ecd8b), X(0x7f5fc097), X(0x7f60b296), + X(0x7f61a389), X(0x7f629370), X(0x7f63824e), X(0x7f647021), + X(0x7f655ceb), X(0x7f6648ad), X(0x7f673367), X(0x7f681d19), + X(0x7f6905c6), X(0x7f69ed6d), X(0x7f6ad40f), X(0x7f6bb9ad), + X(0x7f6c9e48), X(0x7f6d81e0), X(0x7f6e6475), X(0x7f6f460a), + X(0x7f70269d), X(0x7f710631), X(0x7f71e4c6), X(0x7f72c25c), + X(0x7f739ef4), X(0x7f747a8f), X(0x7f75552e), X(0x7f762ed1), + X(0x7f770779), X(0x7f77df27), X(0x7f78b5db), X(0x7f798b97), + X(0x7f7a605a), X(0x7f7b3425), X(0x7f7c06fa), X(0x7f7cd8d9), + X(0x7f7da9c2), X(0x7f7e79b7), X(0x7f7f48b8), X(0x7f8016c5), + X(0x7f80e3e0), X(0x7f81b009), X(0x7f827b40), X(0x7f834588), + X(0x7f840edf), X(0x7f84d747), X(0x7f859ec1), X(0x7f86654d), + X(0x7f872aec), X(0x7f87ef9e), X(0x7f88b365), X(0x7f897641), + X(0x7f8a3832), X(0x7f8af93a), X(0x7f8bb959), X(0x7f8c7890), + X(0x7f8d36df), X(0x7f8df448), X(0x7f8eb0ca), X(0x7f8f6c67), + X(0x7f90271e), X(0x7f90e0f2), X(0x7f9199e2), X(0x7f9251f0), + X(0x7f93091b), X(0x7f93bf65), X(0x7f9474ce), X(0x7f952958), + X(0x7f95dd01), X(0x7f968fcd), X(0x7f9741ba), X(0x7f97f2ca), + X(0x7f98a2fd), X(0x7f995254), X(0x7f9a00d0), X(0x7f9aae71), + X(0x7f9b5b38), X(0x7f9c0726), X(0x7f9cb23b), X(0x7f9d5c78), + X(0x7f9e05de), X(0x7f9eae6e), X(0x7f9f5627), X(0x7f9ffd0b), + X(0x7fa0a31b), X(0x7fa14856), X(0x7fa1ecbf), X(0x7fa29054), + X(0x7fa33318), X(0x7fa3d50b), X(0x7fa4762c), X(0x7fa5167e), + X(0x7fa5b601), X(0x7fa654b5), X(0x7fa6f29b), X(0x7fa78fb3), + X(0x7fa82bff), X(0x7fa8c77f), X(0x7fa96234), X(0x7fa9fc1e), + X(0x7faa953e), X(0x7fab2d94), X(0x7fabc522), X(0x7fac5be8), + X(0x7facf1e6), X(0x7fad871d), X(0x7fae1b8f), X(0x7faeaf3b), + X(0x7faf4222), X(0x7fafd445), X(0x7fb065a4), X(0x7fb0f641), + X(0x7fb1861b), X(0x7fb21534), X(0x7fb2a38c), X(0x7fb33124), + X(0x7fb3bdfb), X(0x7fb44a14), X(0x7fb4d56f), X(0x7fb5600c), + X(0x7fb5e9ec), X(0x7fb6730f), X(0x7fb6fb76), X(0x7fb78323), + X(0x7fb80a15), X(0x7fb8904d), X(0x7fb915cc), X(0x7fb99a92), + X(0x7fba1ea0), X(0x7fbaa1f7), X(0x7fbb2497), X(0x7fbba681), + X(0x7fbc27b5), X(0x7fbca835), X(0x7fbd2801), X(0x7fbda719), + X(0x7fbe257e), X(0x7fbea331), X(0x7fbf2032), X(0x7fbf9c82), + X(0x7fc01821), X(0x7fc09311), X(0x7fc10d52), X(0x7fc186e4), + X(0x7fc1ffc8), X(0x7fc277ff), X(0x7fc2ef89), X(0x7fc36667), + X(0x7fc3dc9a), X(0x7fc45221), X(0x7fc4c6ff), X(0x7fc53b33), + X(0x7fc5aebe), X(0x7fc621a0), X(0x7fc693db), X(0x7fc7056f), + X(0x7fc7765c), X(0x7fc7e6a3), X(0x7fc85645), X(0x7fc8c542), + X(0x7fc9339b), X(0x7fc9a150), X(0x7fca0e63), X(0x7fca7ad3), + X(0x7fcae6a2), X(0x7fcb51cf), X(0x7fcbbc5c), X(0x7fcc2649), + X(0x7fcc8f97), X(0x7fccf846), X(0x7fcd6058), X(0x7fcdc7cb), + X(0x7fce2ea2), X(0x7fce94dd), X(0x7fcefa7b), X(0x7fcf5f7f), + X(0x7fcfc3e8), X(0x7fd027b7), X(0x7fd08aed), X(0x7fd0ed8b), + X(0x7fd14f90), X(0x7fd1b0fd), X(0x7fd211d4), X(0x7fd27214), + X(0x7fd2d1bf), X(0x7fd330d4), X(0x7fd38f55), X(0x7fd3ed41), + X(0x7fd44a9a), X(0x7fd4a761), X(0x7fd50395), X(0x7fd55f37), + X(0x7fd5ba48), X(0x7fd614c9), X(0x7fd66eba), X(0x7fd6c81b), + X(0x7fd720ed), X(0x7fd77932), X(0x7fd7d0e8), X(0x7fd82812), + X(0x7fd87eae), X(0x7fd8d4bf), X(0x7fd92a45), X(0x7fd97f40), + X(0x7fd9d3b0), X(0x7fda2797), X(0x7fda7af5), X(0x7fdacdca), + X(0x7fdb2018), X(0x7fdb71dd), X(0x7fdbc31c), X(0x7fdc13d5), + X(0x7fdc6408), X(0x7fdcb3b6), X(0x7fdd02df), X(0x7fdd5184), + X(0x7fdd9fa5), X(0x7fdded44), X(0x7fde3a60), X(0x7fde86fb), + X(0x7fded314), X(0x7fdf1eac), X(0x7fdf69c4), X(0x7fdfb45d), + X(0x7fdffe76), X(0x7fe04811), X(0x7fe0912e), X(0x7fe0d9ce), + X(0x7fe121f0), X(0x7fe16996), X(0x7fe1b0c1), X(0x7fe1f770), + X(0x7fe23da4), X(0x7fe2835f), X(0x7fe2c89f), X(0x7fe30d67), + X(0x7fe351b5), X(0x7fe3958c), X(0x7fe3d8ec), X(0x7fe41bd4), + X(0x7fe45e46), X(0x7fe4a042), X(0x7fe4e1c8), X(0x7fe522da), + X(0x7fe56378), X(0x7fe5a3a1), X(0x7fe5e358), X(0x7fe6229b), + X(0x7fe6616d), X(0x7fe69fcc), X(0x7fe6ddbb), X(0x7fe71b39), + X(0x7fe75847), X(0x7fe794e5), X(0x7fe7d114), X(0x7fe80cd5), + X(0x7fe84827), X(0x7fe8830c), X(0x7fe8bd84), X(0x7fe8f78f), + X(0x7fe9312f), X(0x7fe96a62), X(0x7fe9a32b), X(0x7fe9db8a), + X(0x7fea137e), X(0x7fea4b09), X(0x7fea822b), X(0x7feab8e5), + X(0x7feaef37), X(0x7feb2521), X(0x7feb5aa4), X(0x7feb8fc1), + X(0x7febc478), X(0x7febf8ca), X(0x7fec2cb6), X(0x7fec603e), + X(0x7fec9363), X(0x7fecc623), X(0x7fecf881), X(0x7fed2a7c), + X(0x7fed5c16), X(0x7fed8d4e), X(0x7fedbe24), X(0x7fedee9b), + X(0x7fee1eb1), X(0x7fee4e68), X(0x7fee7dc0), X(0x7feeacb9), + X(0x7feedb54), X(0x7fef0991), X(0x7fef3771), X(0x7fef64f5), + X(0x7fef921d), X(0x7fefbee8), X(0x7fefeb59), X(0x7ff0176f), + X(0x7ff0432a), X(0x7ff06e8c), X(0x7ff09995), X(0x7ff0c444), + X(0x7ff0ee9c), X(0x7ff1189b), X(0x7ff14243), X(0x7ff16b94), + X(0x7ff1948e), X(0x7ff1bd32), X(0x7ff1e581), X(0x7ff20d7b), + X(0x7ff2351f), X(0x7ff25c70), X(0x7ff2836d), X(0x7ff2aa17), + X(0x7ff2d06d), X(0x7ff2f672), X(0x7ff31c24), X(0x7ff34185), + X(0x7ff36695), X(0x7ff38b55), X(0x7ff3afc4), X(0x7ff3d3e4), + X(0x7ff3f7b4), X(0x7ff41b35), X(0x7ff43e69), X(0x7ff4614e), + X(0x7ff483e6), X(0x7ff4a631), X(0x7ff4c82f), X(0x7ff4e9e1), + X(0x7ff50b47), X(0x7ff52c62), X(0x7ff54d33), X(0x7ff56db9), + X(0x7ff58df5), X(0x7ff5ade7), X(0x7ff5cd90), X(0x7ff5ecf1), + X(0x7ff60c09), X(0x7ff62ada), X(0x7ff64963), X(0x7ff667a5), + X(0x7ff685a1), X(0x7ff6a357), X(0x7ff6c0c7), X(0x7ff6ddf1), + X(0x7ff6fad7), X(0x7ff71778), X(0x7ff733d6), X(0x7ff74fef), + X(0x7ff76bc6), X(0x7ff78759), X(0x7ff7a2ab), X(0x7ff7bdba), + X(0x7ff7d888), X(0x7ff7f315), X(0x7ff80d61), X(0x7ff8276c), + X(0x7ff84138), X(0x7ff85ac4), X(0x7ff87412), X(0x7ff88d20), + X(0x7ff8a5f0), X(0x7ff8be82), X(0x7ff8d6d7), X(0x7ff8eeef), + X(0x7ff906c9), X(0x7ff91e68), X(0x7ff935cb), X(0x7ff94cf2), + X(0x7ff963dd), X(0x7ff97a8f), X(0x7ff99105), X(0x7ff9a742), + X(0x7ff9bd45), X(0x7ff9d30f), X(0x7ff9e8a0), X(0x7ff9fdf9), + X(0x7ffa131a), X(0x7ffa2803), X(0x7ffa3cb4), X(0x7ffa512f), + X(0x7ffa6573), X(0x7ffa7981), X(0x7ffa8d59), X(0x7ffaa0fc), + X(0x7ffab46a), X(0x7ffac7a3), X(0x7ffadaa8), X(0x7ffaed78), + X(0x7ffb0015), X(0x7ffb127f), X(0x7ffb24b6), X(0x7ffb36bb), + X(0x7ffb488d), X(0x7ffb5a2e), X(0x7ffb6b9d), X(0x7ffb7cdb), + X(0x7ffb8de9), X(0x7ffb9ec6), X(0x7ffbaf73), X(0x7ffbbff1), + X(0x7ffbd03f), X(0x7ffbe05e), X(0x7ffbf04f), X(0x7ffc0012), + X(0x7ffc0fa6), X(0x7ffc1f0d), X(0x7ffc2e47), X(0x7ffc3d54), + X(0x7ffc4c35), X(0x7ffc5ae9), X(0x7ffc6971), X(0x7ffc77ce), + X(0x7ffc8600), X(0x7ffc9407), X(0x7ffca1e4), X(0x7ffcaf96), + X(0x7ffcbd1f), X(0x7ffcca7e), X(0x7ffcd7b4), X(0x7ffce4c1), + X(0x7ffcf1a5), X(0x7ffcfe62), X(0x7ffd0af6), X(0x7ffd1763), + X(0x7ffd23a9), X(0x7ffd2fc8), X(0x7ffd3bc1), X(0x7ffd4793), + X(0x7ffd533f), X(0x7ffd5ec5), X(0x7ffd6a27), X(0x7ffd7563), + X(0x7ffd807a), X(0x7ffd8b6e), X(0x7ffd963d), X(0x7ffda0e8), + X(0x7ffdab70), X(0x7ffdb5d5), X(0x7ffdc017), X(0x7ffdca36), + X(0x7ffdd434), X(0x7ffdde0f), X(0x7ffde7c9), X(0x7ffdf161), + X(0x7ffdfad8), X(0x7ffe042f), X(0x7ffe0d65), X(0x7ffe167b), + X(0x7ffe1f71), X(0x7ffe2848), X(0x7ffe30ff), X(0x7ffe3997), + X(0x7ffe4211), X(0x7ffe4a6c), X(0x7ffe52a9), X(0x7ffe5ac8), + X(0x7ffe62c9), X(0x7ffe6aae), X(0x7ffe7275), X(0x7ffe7a1f), + X(0x7ffe81ad), X(0x7ffe891f), X(0x7ffe9075), X(0x7ffe97b0), + X(0x7ffe9ece), X(0x7ffea5d2), X(0x7ffeacbb), X(0x7ffeb38a), + X(0x7ffeba3e), X(0x7ffec0d8), X(0x7ffec758), X(0x7ffecdbf), + X(0x7ffed40d), X(0x7ffeda41), X(0x7ffee05d), X(0x7ffee660), + X(0x7ffeec4b), X(0x7ffef21f), X(0x7ffef7da), X(0x7ffefd7e), + X(0x7fff030b), X(0x7fff0881), X(0x7fff0de0), X(0x7fff1328), + X(0x7fff185b), X(0x7fff1d77), X(0x7fff227e), X(0x7fff276f), + X(0x7fff2c4b), X(0x7fff3112), X(0x7fff35c4), X(0x7fff3a62), + X(0x7fff3eeb), X(0x7fff4360), X(0x7fff47c2), X(0x7fff4c0f), + X(0x7fff504a), X(0x7fff5471), X(0x7fff5885), X(0x7fff5c87), + X(0x7fff6076), X(0x7fff6452), X(0x7fff681d), X(0x7fff6bd6), + X(0x7fff6f7d), X(0x7fff7313), X(0x7fff7698), X(0x7fff7a0c), + X(0x7fff7d6f), X(0x7fff80c2), X(0x7fff8404), X(0x7fff8736), + X(0x7fff8a58), X(0x7fff8d6b), X(0x7fff906e), X(0x7fff9362), + X(0x7fff9646), X(0x7fff991c), X(0x7fff9be3), X(0x7fff9e9c), + X(0x7fffa146), X(0x7fffa3e2), X(0x7fffa671), X(0x7fffa8f1), + X(0x7fffab65), X(0x7fffadca), X(0x7fffb023), X(0x7fffb26f), + X(0x7fffb4ae), X(0x7fffb6e0), X(0x7fffb906), X(0x7fffbb20), + X(0x7fffbd2e), X(0x7fffbf30), X(0x7fffc126), X(0x7fffc311), + X(0x7fffc4f1), X(0x7fffc6c5), X(0x7fffc88f), X(0x7fffca4d), + X(0x7fffcc01), X(0x7fffcdab), X(0x7fffcf4a), X(0x7fffd0e0), + X(0x7fffd26b), X(0x7fffd3ec), X(0x7fffd564), X(0x7fffd6d2), + X(0x7fffd838), X(0x7fffd993), X(0x7fffdae6), X(0x7fffdc31), + X(0x7fffdd72), X(0x7fffdeab), X(0x7fffdfdb), X(0x7fffe104), + X(0x7fffe224), X(0x7fffe33c), X(0x7fffe44d), X(0x7fffe556), + X(0x7fffe657), X(0x7fffe751), X(0x7fffe844), X(0x7fffe930), + X(0x7fffea15), X(0x7fffeaf3), X(0x7fffebca), X(0x7fffec9b), + X(0x7fffed66), X(0x7fffee2a), X(0x7fffeee8), X(0x7fffefa0), + X(0x7ffff053), X(0x7ffff0ff), X(0x7ffff1a6), X(0x7ffff247), + X(0x7ffff2e4), X(0x7ffff37a), X(0x7ffff40c), X(0x7ffff499), + X(0x7ffff520), X(0x7ffff5a3), X(0x7ffff621), X(0x7ffff69b), + X(0x7ffff710), X(0x7ffff781), X(0x7ffff7ee), X(0x7ffff857), + X(0x7ffff8bb), X(0x7ffff91c), X(0x7ffff979), X(0x7ffff9d2), + X(0x7ffffa27), X(0x7ffffa79), X(0x7ffffac8), X(0x7ffffb13), + X(0x7ffffb5b), X(0x7ffffba0), X(0x7ffffbe2), X(0x7ffffc21), + X(0x7ffffc5d), X(0x7ffffc96), X(0x7ffffccd), X(0x7ffffd01), + X(0x7ffffd32), X(0x7ffffd61), X(0x7ffffd8e), X(0x7ffffdb8), + X(0x7ffffde0), X(0x7ffffe07), X(0x7ffffe2b), X(0x7ffffe4d), + X(0x7ffffe6d), X(0x7ffffe8b), X(0x7ffffea8), X(0x7ffffec3), + X(0x7ffffedc), X(0x7ffffef4), X(0x7fffff0a), X(0x7fffff1f), + X(0x7fffff33), X(0x7fffff45), X(0x7fffff56), X(0x7fffff66), + X(0x7fffff75), X(0x7fffff82), X(0x7fffff8f), X(0x7fffff9a), + X(0x7fffffa5), X(0x7fffffaf), X(0x7fffffb8), X(0x7fffffc0), + X(0x7fffffc8), X(0x7fffffce), X(0x7fffffd5), X(0x7fffffda), + X(0x7fffffdf), X(0x7fffffe4), X(0x7fffffe8), X(0x7fffffeb), + X(0x7fffffef), X(0x7ffffff1), X(0x7ffffff4), X(0x7ffffff6), + X(0x7ffffff8), X(0x7ffffff9), X(0x7ffffffb), X(0x7ffffffc), + X(0x7ffffffd), X(0x7ffffffd), X(0x7ffffffe), X(0x7fffffff), + X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), + X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), + X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), X(0x7fffffff), +}; + diff --git a/media/libtremor/moz.build b/media/libtremor/moz.build new file mode 100644 index 000000000000..f0a923592749 --- /dev/null +++ b/media/libtremor/moz.build @@ -0,0 +1,11 @@ +# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- +# vim: set filetype=python: +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +with Files('*'): + BUG_COMPONENT = ('Core', 'Audio/Video') + +DIRS += ['include/tremor', 'lib'] + diff --git a/media/libtremor/update.sh b/media/libtremor/update.sh new file mode 100755 index 000000000000..d27198cfe5b4 --- /dev/null +++ b/media/libtremor/update.sh @@ -0,0 +1,34 @@ +# Usage: cp $1/update.sh +# +# Copies the needed files from a directory containing the original +# libtremor source that we need for the Mozilla HTML5 media support. +cp $1/asm_arm.h ./lib/asm_arm.h +cp $1/backends.h ./lib/backends.h +cp $1/block.c ./lib/tremor_block.c +cp $1/block.h ./lib/block.h +cp $1/codebook.c ./lib/tremor_codebook.c +cp $1/codebook.h ./lib/codebook.h +cp $1/codec_internal.h ./lib/codec_internal.h +cp $1/floor0.c ./lib/tremor_floor0.c +cp $1/floor1.c ./lib/tremor_floor1.c +cp $1/info.c ./lib/tremor_info.c +cp $1/lsp_lookup.h ./lib/lsp_lookup.h +cp $1/mapping0.c ./lib/tremor_mapping0.c +cp $1/mdct_lookup.h ./lib/mdct_lookup.h +cp $1/mdct.c ./lib/tremor_mdct.c +cp $1/mdct.h ./lib/mdct.h +cp $1/misc.h ./lib/misc.h +cp $1/registry.c ./lib/tremor_registry.c +cp $1/registry.h ./lib/registry.h +cp $1/res012.c ./lib/tremor_res012.c +cp $1/sharedbook.c ./lib/tremor_sharedbook.c +cp $1/synthesis.c ./lib/tremor_synthesis.c +cp $1/window_lookup.h ./lib/window_lookup.h +cp $1/window.c ./lib/tremor_window.c +cp $1/window.h ./lib/window.h +cp $1/ivorbiscodec.h ./include/tremor/ivorbiscodec.h +cp $1/os.h ./lib/os.h +cp $1/COPYING ./COPYING +cp $1/README ./README +patch -p3 < ./bug719612.patch +patch -p3 < ./bug1117571-r19420.patch diff --git a/media/libvorbis/moz.build b/media/libvorbis/moz.build index af1ca189b4ec..f7306ae10fb3 100644 --- a/media/libvorbis/moz.build +++ b/media/libvorbis/moz.build @@ -48,16 +48,10 @@ if CONFIG['OS_ARCH'] == 'AIX': if CONFIG['OS_ARCH'] == 'SunOS': DEFINES['HAVE_ALLOCA_H'] = True -if CONFIG["OS_ARCH"] == "Linux": - OS_LIBS += [ - "m", - ] - # We allow warnings for third-party code that can be updated from upstream. AllowCompilerWarnings() -FINAL_LIBRARY = 'gkcodecs' -NoVisibilityFlags() +FINAL_LIBRARY = 'gkmedias' # Suppress warnings in third-party code. if CONFIG['CC_TYPE'] in ('clang', 'gcc'): diff --git a/mobile/android/installer/package-manifest.in b/mobile/android/installer/package-manifest.in index 08361b887064..db524134d855 100644 --- a/mobile/android/installer/package-manifest.in +++ b/mobile/android/installer/package-manifest.in @@ -42,7 +42,6 @@ @BINPATH@/@DLL_PREFIX@nspr4@DLL_SUFFIX@ #endif @BINPATH@/@DLL_PREFIX@lgpllibs@DLL_SUFFIX@ -@BINPATH@/@DLL_PREFIX@gkcodecs@DLL_SUFFIX@ #ifdef MOZ_FFVPX @BINPATH@/@DLL_PREFIX@mozavutil@DLL_SUFFIX@ @BINPATH@/@DLL_PREFIX@mozavcodec@DLL_SUFFIX@ diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml index bee6a060ac5f..30457162d02a 100644 --- a/modules/libpref/init/StaticPrefList.yaml +++ b/modules/libpref/init/StaticPrefList.yaml @@ -10098,33 +10098,6 @@ #endif mirror: always -- name: media.ffvpx.vorbis.enabled - type: RelaxedAtomicBool -#ifdef MOZ_FFVPX - value: true -#else - value: false -#endif - mirror: always - -- name: media.ffvpx.opus.enabled - type: RelaxedAtomicBool -#ifdef MOZ_FFVPX - value: true -#else - value: false -#endif - mirror: always - -- name: media.ffvpx.wav.enabled - type: RelaxedAtomicBool -#ifdef MOZ_FFVPX - value: true -#else - value: false -#endif - mirror: always - # Set to true in marionette tests to disable the sanity test # which would lead to unnecessary start of the RDD process. - name: media.sanity-test.disabled diff --git a/mozglue/build/TsanOptions.cpp b/mozglue/build/TsanOptions.cpp index 99e4a9380700..6b19aad4576b 100644 --- a/mozglue/build/TsanOptions.cpp +++ b/mozglue/build/TsanOptions.cpp @@ -73,7 +73,6 @@ extern "C" const char* __tsan_default_suppressions() { "race:pa_format_info_set_prop_string_array\n" "race:pa_stream_get_index\n" "race:pa_stream_update_timing_info\n" - "race:vorbis_synthesis_init\n" // This is a callback from libglib-2 that is apparently // not fully suppressed through `called_from_lib`. "race:g_main_context_dispatch\n" diff --git a/third_party/libwebrtc/third_party/opus/src/include/opus.h b/third_party/libwebrtc/third_party/opus/src/include/opus.h index 4cfe534e20ef..89078a59e5b7 100644 --- a/third_party/libwebrtc/third_party/opus/src/include/opus.h +++ b/third_party/libwebrtc/third_party/opus/src/include/opus.h @@ -19,5 +19,5 @@ // This is a trampoline header meant to redirect from where libwebrtc code // expects third_party headers to where those headers exist in the Mozilla // Firefox repository. -#include +#include "../../media/libopus/include/opus.h" diff --git a/third_party/libwebrtc/third_party/opus/src/include/opus_multistream.h b/third_party/libwebrtc/third_party/opus/src/include/opus_multistream.h index 2e2c037885d5..0033f9a4493b 100644 --- a/third_party/libwebrtc/third_party/opus/src/include/opus_multistream.h +++ b/third_party/libwebrtc/third_party/opus/src/include/opus_multistream.h @@ -19,5 +19,5 @@ // This is a trampoline header meant to redirect from where libwebrtc code // expects third_party headers to where those headers exist in the Mozilla // Firefox repository. -#include +#include "../../media/libopus/include/opus_multistream.h" diff --git a/toolkit/content/license.html b/toolkit/content/license.html index b47f3d0998bd..49d69cf53996 100644 --- a/toolkit/content/license.html +++ b/toolkit/content/license.html @@ -5470,6 +5470,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

  • media/libogg/, 2002
  • media/libtheora/, 2002-2007
  • media/libvorbis/, 2002-2004
  • +
  • media/libtremor/, 2002-2010
  • media/libspeex_resampler/, 2002-2008
  • diff --git a/toolkit/library/moz.build b/toolkit/library/moz.build index 3faa0370cc1c..939d4f6a4b8d 100644 --- a/toolkit/library/moz.build +++ b/toolkit/library/moz.build @@ -152,7 +152,6 @@ USE_LIBS += [ ] USE_LIBS += [ - "gkcodecs", "lgpllibs", "nspr", "nss", diff --git a/toolkit/moz.configure b/toolkit/moz.configure index 51e9924123be..3c12aa860f5c 100644 --- a/toolkit/moz.configure +++ b/toolkit/moz.configure @@ -799,11 +799,30 @@ set_config("MOZ_FMP4", fmp4) set_define("MOZ_FMP4", fmp4) -set_config("MOZ_SAMPLE_TYPE_FLOAT32", True) -set_define("MOZ_SAMPLE_TYPE_FLOAT32", True) +@depends(target) +def sample_type_is_s16(target): + # Use integers over floats for audio on Android regardless of the CPU + # architecture, because audio backends for Android don't support floats. + # We also use integers on ARM because it's more efficient. + if target.os == "Android" or target.cpu == "arm": + return True -set_define("MOZ_VORBIS", True) -set_config("MOZ_VORBIS", True) + +@depends(sample_type_is_s16) +def sample_type_is_float(t): + if not t: + return True + + +set_config("MOZ_SAMPLE_TYPE_S16", sample_type_is_s16) +set_define("MOZ_SAMPLE_TYPE_S16", sample_type_is_s16) +set_config("MOZ_SAMPLE_TYPE_FLOAT32", sample_type_is_float) +set_define("MOZ_SAMPLE_TYPE_FLOAT32", sample_type_is_float) + +set_define("MOZ_VORBIS", sample_type_is_float) +set_config("MOZ_VORBIS", sample_type_is_float) +set_define("MOZ_TREMOR", sample_type_is_s16) +set_config("MOZ_TREMOR", sample_type_is_s16) option( "--disable-real-time-tracing", diff --git a/tools/rewriting/ThirdPartyPaths.txt b/tools/rewriting/ThirdPartyPaths.txt index 5ca21b3b5de9..24afdbb3b922 100644 --- a/tools/rewriting/ThirdPartyPaths.txt +++ b/tools/rewriting/ThirdPartyPaths.txt @@ -121,6 +121,7 @@ media/libpng/ media/libsoundtouch/ media/libspeex_resampler/ media/libtheora/ +media/libtremor/ media/libvorbis/ media/libvpx/ media/libwebp/ diff --git a/widget/android/bindings/MediaCodec-classes.txt b/widget/android/bindings/MediaCodec-classes.txt index a68b86e148e0..8830c11ccf94 100644 --- a/widget/android/bindings/MediaCodec-classes.txt +++ b/widget/android/bindings/MediaCodec-classes.txt @@ -9,7 +9,5 @@ # We only use constants from KeyStatus [android.media.MediaDrm$KeyStatus = skip:true] = skip:false -[android.media.AudioFormat = skip:true] - = skip:false [android.media.MediaFormat = exceptionMode:nsresult]